open-mem 0.11.0 → 0.12.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +73 -565
  3. package/dist/adapters/http/loopback.d.ts +3 -0
  4. package/dist/adapters/http/loopback.d.ts.map +1 -0
  5. package/dist/adapters/http/server.d.ts.map +1 -1
  6. package/dist/adapters/mcp/server.d.ts +0 -2
  7. package/dist/adapters/mcp/server.d.ts.map +1 -1
  8. package/dist/adapters/opencode/tools.d.ts.map +1 -1
  9. package/dist/ai/fallback-policy.d.ts +18 -0
  10. package/dist/ai/fallback-policy.d.ts.map +1 -0
  11. package/dist/ai/fallback.d.ts +3 -1
  12. package/dist/ai/fallback.d.ts.map +1 -1
  13. package/dist/ai/provider.d.ts +2 -1
  14. package/dist/ai/provider.d.ts.map +1 -1
  15. package/dist/claude-code.js +87 -87
  16. package/dist/config/store.d.ts.map +1 -1
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/contracts/api.d.ts +2 -120
  19. package/dist/contracts/api.d.ts.map +1 -1
  20. package/dist/contracts/schemas.d.ts +134 -0
  21. package/dist/contracts/schemas.d.ts.map +1 -0
  22. package/dist/cursor.js +87 -87
  23. package/dist/daemon.js +70 -70
  24. package/dist/db/observations.d.ts.map +1 -1
  25. package/dist/doctor.d.ts +3 -0
  26. package/dist/doctor.d.ts.map +1 -0
  27. package/dist/doctor.js +5 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +122 -122
  30. package/dist/maintenance.js +43 -43
  31. package/dist/mcp.js +73 -73
  32. package/dist/modes/loader.d.ts.map +1 -1
  33. package/dist/modes/resolver.d.ts +21 -0
  34. package/dist/modes/resolver.d.ts.map +1 -0
  35. package/dist/platform-worker.d.ts.map +1 -1
  36. package/dist/search/orchestrator.d.ts +4 -13
  37. package/dist/search/orchestrator.d.ts.map +1 -1
  38. package/dist/search/registry.d.ts +19 -0
  39. package/dist/search/registry.d.ts.map +1 -0
  40. package/dist/search/strategies/filter-only.d.ts +4 -0
  41. package/dist/search/strategies/filter-only.d.ts.map +1 -0
  42. package/dist/search/strategies/hybrid.d.ts +3 -0
  43. package/dist/search/strategies/hybrid.d.ts.map +1 -0
  44. package/dist/search/strategies/semantic.d.ts +4 -0
  45. package/dist/search/strategies/semantic.d.ts.map +1 -0
  46. package/dist/search/strategies/types.d.ts +22 -0
  47. package/dist/search/strategies/types.d.ts.map +1 -0
  48. package/dist/services/readiness.d.ts +26 -0
  49. package/dist/services/readiness.d.ts.map +1 -0
  50. package/dist/services/setup-diagnostics.d.ts +23 -0
  51. package/dist/services/setup-diagnostics.d.ts.map +1 -0
  52. package/dist/types.d.ts +3 -1
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +8 -9
package/dist/index.js CHANGED
@@ -1,34 +1,34 @@
1
1
  // @bun
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(`
2
+ var Lf=Object.create;var{getPrototypeOf:Cf,defineProperty:JS,getOwnPropertyNames:Gf}=Object;var Hf=Object.prototype.hasOwnProperty;var Ff=(S,M,f)=>{f=S!=null?Lf(Cf(S)):{};let $=M||!S||!S.__esModule?JS(f,"default",{value:S,enumerable:!0}):f;for(let A of Gf(S))if(!Hf.call($,A))JS($,A,{get:()=>S[A],enumerable:!0});return $};var uf=(S,M)=>{for(var f in M)JS(S,f,{get:M[f],enumerable:!0,configurable:!0,set:($)=>M[f]=()=>$})};var G0=(S,M)=>()=>(S&&(M=S(S=0)),M);var w=import.meta.require;import{existsSync as tf,readdirSync as df,readFileSync as sf}from"fs";import{join as af}from"path";function n(S){return{...S,observationTypes:[...S.observationTypes],conceptVocabulary:[...S.conceptVocabulary],entityTypes:[...S.entityTypes],relationshipTypes:[...S.relationshipTypes],promptOverrides:S.promptOverrides?{...S.promptOverrides}:void 0}}function ef(S){if(!S||typeof S!=="object")return!1;let M=S,f=(A)=>Array.isArray(A)&&A.every((O)=>typeof O==="string"),$=(A)=>typeof A==="object"&&A!==null&&!Array.isArray(A)&&Object.values(A).every((O)=>typeof O==="string");return typeof M.id==="string"&&(M.extends===void 0||typeof M.extends==="string")&&(M.locale===void 0||typeof M.locale==="string")&&(M.name===void 0||typeof M.name==="string")&&(M.description===void 0||typeof M.description==="string")&&(M.observationTypes===void 0||f(M.observationTypes))&&(M.conceptVocabulary===void 0||f(M.conceptVocabulary))&&(M.entityTypes===void 0||f(M.entityTypes))&&(M.relationshipTypes===void 0||f(M.relationshipTypes))&&(M.promptOverrides===void 0||$(M.promptOverrides))}function of(S){return typeof S.name==="string"&&typeof S.description==="string"&&Array.isArray(S.observationTypes)&&Array.isArray(S.conceptVocabulary)&&Array.isArray(S.entityTypes)&&Array.isArray(S.relationshipTypes)}function p1(S,M){return{...S,...M,id:M.id,name:M.name??S.name,description:M.description??S.description,observationTypes:M.observationTypes??S.observationTypes,conceptVocabulary:M.conceptVocabulary??S.conceptVocabulary,entityTypes:M.entityTypes??S.entityTypes,relationshipTypes:M.relationshipTypes??S.relationshipTypes,promptOverrides:{...S.promptOverrides??{},...M.promptOverrides??{}}}}class zS{modesDir;constructor(S){this.modesDir=S}loadAllRaw(){let S=new Map;if(!tf(this.modesDir))return S;for(let M of df(this.modesDir)){if(!M.endsWith(".json"))continue;let f=af(this.modesDir,M);try{let $=sf(f,"utf-8"),A=JSON.parse($);if(!ef(A))continue;if(S.has(A.id))console.warn(`[open-mem] Duplicate mode id "${A.id}" in ${f}; overriding previous definition.`);S.set(A.id,A)}catch{}}return S}resolveById(S,M){let f=new Set,$=!1,A=(y)=>{if(f.has(y))return $=!0,n(f0);f.add(y);let E=M.get(y);if(!E)return n(f0);if(!E.extends){if(!of(E))return n(f0);return p1(n(f0),E)}let V=A(E.extends);if($)return n(f0);return p1(V,E)},O=A(S);return $?n(f0):n(O)}}var f0;var b1=G0(()=>{f0={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"]}});import{join as S2}from"path";function r1(){if(m0)return m0;return m0=n1.loadAllRaw(),m0}function i1(S){return n1.resolveById(S,r1())}function h0(){return[...r1().keys()].sort()}var M2,n1,m0=null;var US=G0(()=>{b1();M2=S2(import.meta.dir,"."),n1=new zS(M2)});import{existsSync as f2,readFileSync as $2}from"fs";function A2(){let S={};if(process.env.OPEN_MEM_DB_PATH)S.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)S.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)S.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)S.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")S.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")S.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)S.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((M)=>M.trim());if(process.env.OPEN_MEM_BATCH_SIZE)S.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)S.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)S.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")S.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)S.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((M)=>M.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)S.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)S.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")S.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")S.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")S.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)S.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")S.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")S.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)S.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")S.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")S.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)S.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")S.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")S.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")S.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)S.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)S.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((M)=>M.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)S.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")S.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let M=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(M))S.conflictSimilarityBandLow=M}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let M=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(M))S.conflictSimilarityBandHigh=M}if(process.env.OPEN_MEM_USER_MEMORY==="true")S.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)S.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)S.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")S.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)S.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")S.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)S.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((M)=>M.trim()).filter(Boolean);if(process.env.OPEN_MEM_MODE)S.mode=process.env.OPEN_MEM_MODE;return S}function O2(S){let M=`${S}/.open-mem/config.json`;if(!f2(M))return{};try{let f=$2(M,"utf-8"),$=JSON.parse(f);if(!$||typeof $!=="object"||Array.isArray($))return{};return $}catch{return{}}}function y2(S){switch(S){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(S,M){let f=O2(S),$=A2(),A={...t1,...f,...$,...M};if(!A.dbPath.startsWith("/"))A.dbPath=`${S}/${A.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!M?.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=y2(A.provider);if(A.mode&&!h0().includes(A.mode))A.mode="code";return A}function d1(S){let M=[],f=S.provider!=="bedrock";if(S.compressionEnabled&&f&&!S.apiKey)M.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(S.maxContextTokens<500)M.push("maxContextTokens must be at least 500");if(S.batchSize<1)M.push("batchSize must be at least 1");if(S.minOutputLength<0)M.push("minOutputLength must be non-negative");return M}function DS(){return{...t1}}async function s1(S){let M=S.dbPath.substring(0,S.dbPath.lastIndexOf("/")),{mkdir:f}=await import("fs/promises");await f(M,{recursive:!0})}var t1;var LS=G0(()=>{US();t1={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,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 MM={};uf(MM,{writeProjectConfig:()=>SM,validatePatch:()=>GS,readProjectConfig:()=>i,previewConfig:()=>HS,patchConfig:()=>q0,getEffectiveConfig:()=>r,getConfigSchema:()=>CS});import{existsSync as N2}from"fs";import{mkdir as E2,readFile as V2,writeFile as J2}from"fs/promises";import{dirname as B2,join as Q2}from"path";function e1(S){return Q2(S,".open-mem","config.json")}function o1(S){return a1.find((M)=>M.key===S)}function R2(S,M){let f=o1(S);if(!f)return null;if(f.type==="string"&&typeof M!=="string")return`${String(S)} must be a string`;if(f.type==="number"&&typeof M!=="number")return`${String(S)} must be a number`;if(f.type==="boolean"&&typeof M!=="boolean")return`${String(S)} must be a boolean`;if(f.type==="array"&&!Array.isArray(M))return`${String(S)} must be an array`;if(f.enum&&typeof M==="string"&&!f.enum.includes(M))return`${String(S)} must be one of: ${f.enum.join(", ")}`;if(typeof M==="number"){if(f.min!==void 0&&M<f.min)return`${String(S)} must be >= ${f.min}`;if(f.max!==void 0&&M>f.max)return`${String(S)} must be <= ${f.max}`}return null}function CS(){return a1}async function i(S){let M=e1(S);if(!N2(M))return{};try{let f=await V2(M,"utf-8"),$=JSON.parse(f);if(!$||typeof $!=="object"||Array.isArray($))return{};return $}catch{return{}}}async function SM(S,M){let f=e1(S),A={...await i(S),...M};await E2(B2(f),{recursive:!0}),await J2(f,JSON.stringify(A,null,2),"utf-8")}function GS(S){let M=[];for(let[f,$]of Object.entries(S)){let O=R2(f,$);if(O)M.push(O)}return M}async function r(S){let M=DS(),f=await i(S),$=X0(S),A=[],O={};for(let[y,E]of Object.entries(M)){let V=y,N=o1(V),B=(_2[V]??[]).some((W)=>typeof process.env[W]==="string"),Q=Object.hasOwn(f,V),_="default";if(Q)_="file";if(B)_="env";if(O[V]={source:_,locked:B,restartRequired:N?.restartRequired??!1,liveApply:N?.liveApply??!1},_==="env"&&Q)A.push(`${String(V)} is overridden by environment variable.`);if($[V]===void 0&&E!==void 0)A.push(`${String(V)} resolved to undefined unexpectedly.`)}return{config:$,meta:O,warnings:A}}async function HS(S,M){let f=GS(M);if(f.length>0)return{...await r(S),warnings:f};let $=DS(),A=await i(S),O={...$,...A,...M},E={...X0(S,M),...O},V=(await r(S)).meta;return{config:E,meta:V,warnings:[]}}async function q0(S,M){let f=GS(M);if(f.length>0)return{...await r(S),warnings:f};return await SM(S,M),r(S)}var a1,_2;var FS=G0(()=>{LS();a1=[{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:"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}],_2={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"],mcpProtocolVersion:["OPEN_MEM_MCP_PROTOCOL_VERSION"],mcpSupportedProtocolVersions:["OPEN_MEM_MCP_SUPPORTED_PROTOCOLS"],rerankingEnabled:["OPEN_MEM_RERANKING"],userMemoryEnabled:["OPEN_MEM_USER_MEMORY"]}});import{existsSync as OA}from"fs";import{dirname as yA,join as o}from"path";import{fileURLToPath as NA}from"url";var Tf=new Set(["127.0.0.1","::1","localhost"]);function xf(S){return S.trim().toLowerCase()}function jf(S){return Tf.has(xf(S))}function U1(S,M){if(jf(S))return;throw Error(`[open-mem] ${M} must bind to loopback only (127.0.0.1, ::1, localhost). Received "${S}".`)}import{randomUUID as K0}from"crypto";import{normalize as K2,resolve as jS,sep as fM}from"path";import{fileURLToPath as Z2}from"url";var BS=(S,M,f)=>{return($,A)=>{let O=-1;return y(0);async function y(E){if(E<=O)throw Error("next() called multiple times");O=E;let V,N=!1,J;if(S[E])J=S[E][0][0],$.req.routeIndex=E;else J=E===S.length&&A||void 0;if(J)try{V=await J($,()=>y(E+1))}catch(B){if(B instanceof Error&&M)$.error=B,V=await M(B,$),N=!0;else throw B}else if($.finalized===!1&&f)V=await f($);if(V&&($.finalized===!1||N))$.res=V;return $}}};var D1=Symbol();var L1=async(S,M=Object.create(null))=>{let{all:f=!1,dot:$=!1}=M,O=(S instanceof H0?S.raw.headers:S.headers).get("Content-Type");if(O?.startsWith("multipart/form-data")||O?.startsWith("application/x-www-form-urlencoded"))return kf(S,{all:f,dot:$});return{}};async function kf(S,M){let f=await S.formData();if(f)return If(f,M);return{}}function If(S,M){let f=Object.create(null);if(S.forEach(($,A)=>{if(!(M.all||A.endsWith("[]")))f[A]=$;else gf(f,A,$)}),M.dot)Object.entries(f).forEach(([$,A])=>{if($.includes("."))wf(f,$,A),delete f[$]});return f}var gf=(S,M,f)=>{if(S[M]!==void 0)if(Array.isArray(S[M]))S[M].push(f);else S[M]=[S[M],f];else if(!M.endsWith("[]"))S[M]=f;else S[M]=[f]},wf=(S,M,f)=>{let $=S,A=M.split(".");A.forEach((O,y)=>{if(y===A.length-1)$[O]=f;else{if(!$[O]||typeof $[O]!=="object"||Array.isArray($[O])||$[O]instanceof File)$[O]=Object.create(null);$=$[O]}})};var _S=(S)=>{let M=S.split("/");if(M[0]==="")M.shift();return M},C1=(S)=>{let{groups:M,path:f}=mf(S),$=_S(f);return hf($,M)},mf=(S)=>{let M=[];return S=S.replace(/\{[^}]+\}/g,(f,$)=>{let A=`@${$}`;return M.push([A,f]),A}),{groups:M,path:S}},hf=(S,M)=>{for(let f=M.length-1;f>=0;f--){let[$]=M[f];for(let A=S.length-1;A>=0;A--)if(S[A].includes($)){S[A]=S[A].replace($,M[f][1]);break}}return S},F0={},G1=(S,M)=>{if(S==="*")return"*";let f=S.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(f){let $=`${S}#${M}`;if(!F0[$])if(f[2])F0[$]=M&&M[0]!==":"&&M[0]!=="*"?[$,f[1],new RegExp(`^${f[2]}(?=/${M})`)]:[S,f[1],new RegExp(`^${f[2]}$`)];else F0[$]=[S,f[1],!0];return F0[$]}return null},u0=(S,M)=>{try{return M(S)}catch{return S.replace(/(?:%[0-9A-Fa-f]{2})+/g,(f)=>{try{return M(f)}catch{return f}})}},qf=(S)=>u0(S,decodeURI),RS=(S)=>{let M=S.url,f=M.indexOf("/",M.indexOf(":")+4),$=f;for(;$<M.length;$++){let A=M.charCodeAt($);if(A===37){let O=M.indexOf("?",$),y=M.slice(f,O===-1?void 0:O);return qf(y.includes("%25")?y.replace(/%25/g,"%2525"):y)}else if(A===63)break}return M.slice(f,$)};var H1=(S)=>{let M=RS(S);return M.length>1&&M.at(-1)==="/"?M.slice(0,-1):M},p=(S,M,...f)=>{if(f.length)M=p(M,...f);return`${S?.[0]==="/"?"":"/"}${S}${M==="/"?"":`${S?.at(-1)==="/"?"":"/"}${M?.[0]==="/"?M.slice(1):M}`}`},T0=(S)=>{if(S.charCodeAt(S.length-1)!==63||!S.includes(":"))return null;let M=S.split("/"),f=[],$="";return M.forEach((A)=>{if(A!==""&&!/\:/.test(A))$+="/"+A;else if(/\:/.test(A))if(/\?/.test(A)){if(f.length===0&&$==="")f.push("/");else f.push($);let O=A.replace("?","");$+="/"+O,f.push($)}else $+="/"+A}),f.filter((A,O,y)=>y.indexOf(A)===O)},QS=(S)=>{if(!/[%+]/.test(S))return S;if(S.indexOf("+")!==-1)S=S.replace(/\+/g," ");return S.indexOf("%")!==-1?u0(S,WS):S},F1=(S,M,f)=>{let $;if(!f&&M&&!/[%+]/.test(M)){let y=S.indexOf("?",8);if(y===-1)return;if(!S.startsWith(M,y+1))y=S.indexOf(`&${M}`,y+1);while(y!==-1){let E=S.charCodeAt(y+M.length+1);if(E===61){let V=y+M.length+2,N=S.indexOf("&",V);return QS(S.slice(V,N===-1?void 0:N))}else if(E==38||isNaN(E))return"";y=S.indexOf(`&${M}`,y+1)}if($=/[%+]/.test(S),!$)return}let A={};$??=/[%+]/.test(S);let O=S.indexOf("?",8);while(O!==-1){let y=S.indexOf("&",O+1),E=S.indexOf("=",O);if(E>y&&y!==-1)E=-1;let V=S.slice(O+1,E===-1?y===-1?void 0:y:E);if($)V=QS(V);if(O=y,V==="")continue;let N;if(E===-1)N="";else if(N=S.slice(E+1,y===-1?void 0:y),$)N=QS(N);if(f){if(!(A[V]&&Array.isArray(A[V])))A[V]=[];A[V].push(N)}else A[V]??=N}return M?A[M]:A},u1=F1,T1=(S,M)=>{return F1(S,M,!0)},WS=decodeURIComponent;var x1=(S)=>u0(S,WS),H0=class{raw;#S;#M;routeIndex=0;path;bodyCache={};constructor(S,M="/",f=[[]]){this.raw=S,this.path=M,this.#M=f,this.#S={}}param(S){return S?this.#f(S):this.#O()}#f(S){let M=this.#M[0][this.routeIndex][1][S],f=this.#A(M);return f&&/\%/.test(f)?x1(f):f}#O(){let S={},M=Object.keys(this.#M[0][this.routeIndex][1]);for(let f of M){let $=this.#A(this.#M[0][this.routeIndex][1][f]);if($!==void 0)S[f]=/\%/.test($)?x1($):$}return S}#A(S){return this.#M[1]?this.#M[1][S]:S}query(S){return u1(this.url,S)}queries(S){return T1(this.url,S)}header(S){if(S)return this.raw.headers.get(S)??void 0;let M={};return this.raw.headers.forEach((f,$)=>{M[$]=f}),M}async parseBody(S){return this.bodyCache.parsedBody??=await L1(this,S)}#$=(S)=>{let{bodyCache:M,raw:f}=this,$=M[S];if($)return $;let A=Object.keys(M)[0];if(A)return M[A].then((O)=>{if(A==="json")O=JSON.stringify(O);return new Response(O)[S]()});return M[S]=f[S]()};json(){return this.#$("text").then((S)=>JSON.parse(S))}text(){return this.#$("text")}arrayBuffer(){return this.#$("arrayBuffer")}blob(){return this.#$("blob")}formData(){return this.#$("formData")}addValidatedData(S,M){this.#S[S]=M}valid(S){return this.#S[S]}get url(){return this.raw.url}get method(){return this.raw.method}get[D1](){return this.#M}get matchedRoutes(){return this.#M[0].map(([[,S]])=>S)}get routePath(){return this.#M[0].map(([[,S]])=>S)[this.routeIndex].path}};var x0={Stringify:1,BeforeStream:2,Stream:3},Pf=(S,M)=>{let f=new String(S);return f.isEscaped=!0,f.callbacks=M,f};var B0=async(S,M,f,$,A)=>{if(typeof S==="object"&&!(S instanceof String)){if(!(S instanceof Promise))S=S.toString();if(S instanceof Promise)S=await S}let O=S.callbacks;if(!O?.length)return Promise.resolve(S);if(A)A[0]+=S;else A=[S];let y=Promise.all(O.map((E)=>E({phase:M,buffer:A,context:$}))).then((E)=>Promise.all(E.filter(Boolean).map((V)=>B0(V,M,!1,$,A))).then(()=>A[0]));if(f)return Pf(await y,O);else return y};var j1="text/plain; charset=UTF-8",XS=(S,M)=>{return{"Content-Type":S,...M}},k1=class{#S;#M;env={};#f;finalized=!1;error;#O;#A;#$;#J;#E;#V;#N;#B;#Q;constructor(S,M){if(this.#S=S,M)this.#A=M.executionCtx,this.env=M.env,this.#V=M.notFoundHandler,this.#Q=M.path,this.#B=M.matchResult}get req(){return this.#M??=new H0(this.#S,this.#Q,this.#B),this.#M}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.#$||=new Response(null,{headers:this.#N??=new Headers})}set res(S){if(this.#$&&S){S=new Response(S.body,S);for(let[M,f]of this.#$.headers.entries()){if(M==="content-type")continue;if(M==="set-cookie"){let $=this.#$.headers.getSetCookie();S.headers.delete("set-cookie");for(let A of $)S.headers.append("set-cookie",A)}else S.headers.set(M,f)}}this.#$=S,this.finalized=!0}render=(...S)=>{return this.#E??=(M)=>this.html(M),this.#E(...S)};setLayout=(S)=>this.#J=S;getLayout=()=>this.#J;setRenderer=(S)=>{this.#E=S};header=(S,M,f)=>{if(this.finalized)this.#$=new Response(this.#$.body,this.#$);let $=this.#$?this.#$.headers:this.#N??=new Headers;if(M===void 0)$.delete(S);else if(f?.append)$.append(S,M);else $.set(S,M)};status=(S)=>{this.#O=S};set=(S,M)=>{this.#f??=new Map,this.#f.set(S,M)};get=(S)=>{return this.#f?this.#f.get(S):void 0};get var(){if(!this.#f)return{};return Object.fromEntries(this.#f)}#y(S,M,f){let $=this.#$?new Headers(this.#$.headers):this.#N??new Headers;if(typeof M==="object"&&"headers"in M){let O=M.headers instanceof Headers?M.headers:new Headers(M.headers);for(let[y,E]of O)if(y.toLowerCase()==="set-cookie")$.append(y,E);else $.set(y,E)}if(f)for(let[O,y]of Object.entries(f))if(typeof y==="string")$.set(O,y);else{$.delete(O);for(let E of y)$.append(O,E)}let A=typeof M==="number"?M:M?.status??this.#O;return new Response(S,{status:A,headers:$})}newResponse=(...S)=>this.#y(...S);body=(S,M,f)=>this.#y(S,M,f);text=(S,M,f)=>{return!this.#N&&!this.#O&&!M&&!f&&!this.finalized?new Response(S):this.#y(S,M,XS(j1,f))};json=(S,M,f)=>{return this.#y(JSON.stringify(S),M,XS("application/json",f))};html=(S,M,f)=>{let $=(A)=>this.#y(A,M,XS("text/html; charset=UTF-8",f));return typeof S==="object"?B0(S,x0.Stringify,!1,{}).then($):$(S)};redirect=(S,M)=>{let f=String(S);return this.header("Location",!/[^\x00-\xFF]/.test(f)?f:encodeURI(f)),this.newResponse(null,M??302)};notFound=()=>{return this.#V??=()=>new Response,this.#V(this)}};var G="ALL",I1="all",g1=["get","post","put","delete","options","patch"],j0="Can not add a route since the matcher is already built.",k0=class extends Error{};var w1="__COMPOSED_HANDLER";var vf=(S)=>{return S.text("404 Not Found",404)},m1=(S,M)=>{if("getResponse"in S){let f=S.getResponse();return M.newResponse(f.body,f)}return console.error(S),M.text("Internal Server Error",500)},h1=class S{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#S="/";routes=[];constructor(M={}){[...g1,I1].forEach((O)=>{this[O]=(y,...E)=>{if(typeof y==="string")this.#S=y;else this.#O(O,this.#S,y);return E.forEach((V)=>{this.#O(O,this.#S,V)}),this}}),this.on=(O,y,...E)=>{for(let V of[y].flat()){this.#S=V;for(let N of[O].flat())E.map((J)=>{this.#O(N.toUpperCase(),this.#S,J)})}return this},this.use=(O,...y)=>{if(typeof O==="string")this.#S=O;else this.#S="*",y.unshift(O);return y.forEach((E)=>{this.#O(G,this.#S,E)}),this};let{strict:$,...A}=M;Object.assign(this,A),this.getPath=$??!0?M.getPath??RS:H1}#M(){let M=new S({router:this.router,getPath:this.getPath});return M.errorHandler=this.errorHandler,M.#f=this.#f,M.routes=this.routes,M}#f=vf;errorHandler=m1;route(M,f){let $=this.basePath(M);return f.routes.map((A)=>{let O;if(f.errorHandler===m1)O=A.handler;else O=async(y,E)=>(await BS([],f.errorHandler)(y,()=>A.handler(y,E))).res,O[w1]=A.handler;$.#O(A.method,A.path,O)}),this}basePath(M){let f=this.#M();return f._basePath=p(this._basePath,M),f}onError=(M)=>{return this.errorHandler=M,this};notFound=(M)=>{return this.#f=M,this};mount(M,f,$){let A,O;if($)if(typeof $==="function")O=$;else if(O=$.optionHandler,$.replaceRequest===!1)A=(V)=>V;else A=$.replaceRequest;let y=O?(V)=>{let N=O(V);return Array.isArray(N)?N:[N]}:(V)=>{let N=void 0;try{N=V.executionCtx}catch{}return[V.env,N]};A||=(()=>{let V=p(this._basePath,M),N=V==="/"?0:V.length;return(J)=>{let B=new URL(J.url);return B.pathname=B.pathname.slice(N)||"/",new Request(B,J)}})();let E=async(V,N)=>{let J=await f(A(V.req.raw),...y(V));if(J)return J;await N()};return this.#O(G,p(M,"*"),E),this}#O(M,f,$){M=M.toUpperCase(),f=p(this._basePath,f);let A={basePath:this._basePath,path:f,method:M,handler:$};this.router.add(M,f,[$,A]),this.routes.push(A)}#A(M,f){if(M instanceof Error)return this.errorHandler(M,f);throw M}#$(M,f,$,A){if(A==="HEAD")return(async()=>new Response(null,await this.#$(M,f,$,"GET")))();let O=this.getPath(M,{env:$}),y=this.router.match(A,O),E=new k1(M,{path:O,matchResult:y,env:$,executionCtx:f,notFoundHandler:this.#f});if(y[0].length===1){let N;try{N=y[0][0][0][0](E,async()=>{E.res=await this.#f(E)})}catch(J){return this.#A(J,E)}return N instanceof Promise?N.then((J)=>J||(E.finalized?E.res:this.#f(E))).catch((J)=>this.#A(J,E)):N??this.#f(E)}let V=BS(y[0],this.errorHandler,this.#f);return(async()=>{try{let N=await V(E);if(!N.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return N.res}catch(N){return this.#A(N,E)}})()}fetch=(M,...f)=>{return this.#$(M,f[1],f[0],M.method)};request=(M,f,$,A)=>{if(M instanceof Request)return this.fetch(f?new Request(M,f):M,$,A);return M=M.toString(),this.fetch(new Request(/^https?:\/\//.test(M)?M:`http://localhost${p("/",M)}`,f),$,A)};fire=()=>{addEventListener("fetch",(M)=>{M.respondWith(this.#$(M.request,M,void 0,M.request.method))})}};var Q0=[];function I0(S,M){let f=this.buildAllMatchers(),$=(A,O)=>{let y=f[A]||f[G],E=y[2][O];if(E)return E;let V=O.match(y[0]);if(!V)return[[],Q0];let N=V.indexOf("",1);return[y[1][N],V]};return this.match=$,$(S,M)}var g0="[^/]+",_0=".*",R0="(?:|/.*)",b=Symbol(),cf=new Set(".\\+*[^]$()");function lf(S,M){if(S.length===1)return M.length===1?S<M?-1:1:-1;if(M.length===1)return 1;if(S===_0||S===R0)return 1;else if(M===_0||M===R0)return-1;if(S===g0)return 1;else if(M===g0)return-1;return S.length===M.length?S<M?-1:1:M.length-S.length}var q1=class S{#S;#M;#f=Object.create(null);insert(M,f,$,A,O){if(M.length===0){if(this.#S!==void 0)throw b;if(O)return;this.#S=f;return}let[y,...E]=M,V=y==="*"?E.length===0?["","",_0]:["","",g0]:y==="/*"?["","",R0]:y.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),N;if(V){let J=V[1],B=V[2]||g0;if(J&&V[2]){if(B===".*")throw b;if(B=B.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(B))throw b}if(N=this.#f[B],!N){if(Object.keys(this.#f).some((Q)=>Q!==_0&&Q!==R0))throw b;if(O)return;if(N=this.#f[B]=new S,J!=="")N.#M=A.varIndex++}if(!O&&J!=="")$.push([J,N.#M])}else if(N=this.#f[y],!N){if(Object.keys(this.#f).some((J)=>J.length>1&&J!==_0&&J!==R0))throw b;if(O)return;N=this.#f[y]=new S}N.insert(E,f,$,A,O)}buildRegExpStr(){let f=Object.keys(this.#f).sort(lf).map(($)=>{let A=this.#f[$];return(typeof A.#M==="number"?`(${$})@${A.#M}`:cf.has($)?`\\${$}`:$)+A.buildRegExpStr()});if(typeof this.#S==="number")f.unshift(`#${this.#S}`);if(f.length===0)return"";if(f.length===1)return f[0];return"(?:"+f.join("|")+")"}};var P1=class{#S={varIndex:0};#M=new q1;insert(S,M,f){let $=[],A=[];for(let y=0;;){let E=!1;if(S=S.replace(/\{[^}]+\}/g,(V)=>{let N=`@\\${y}`;return A[y]=[N,V],y++,E=!0,N}),!E)break}let O=S.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let y=A.length-1;y>=0;y--){let[E]=A[y];for(let V=O.length-1;V>=0;V--)if(O[V].indexOf(E)!==-1){O[V]=O[V].replace(E,A[y][1]);break}}return this.#M.insert(O,M,$,this.#S,f),$}buildRegExp(){let S=this.#M.buildRegExpStr();if(S==="")return[/^$/,[],[]];let M=0,f=[],$=[];return S=S.replace(/#(\d+)|@(\d+)|\.\*\$/g,(A,O,y)=>{if(O!==void 0)return f[++M]=Number(O),"$()";if(y!==void 0)return $[Number(y)]=++M,"";return""}),[new RegExp(`^${S}`),f,$]}};var pf=[/^$/,[],Object.create(null)],v1=Object.create(null);function c1(S){return v1[S]??=new RegExp(S==="*"?"":`^${S.replace(/\/\*$|([.\\+*[^\]$()])/g,(M,f)=>f?`\\${f}`:"(?:|/.*)")}$`)}function bf(){v1=Object.create(null)}function nf(S){let M=new P1,f=[];if(S.length===0)return pf;let $=S.map((N)=>[!/\*|\/:/.test(N[0]),...N]).sort(([N,J],[B,Q])=>N?1:B?-1:J.length-Q.length),A=Object.create(null);for(let N=0,J=-1,B=$.length;N<B;N++){let[Q,_,W]=$[N];if(Q)A[_]=[W.map(([X])=>[X,Object.create(null)]),Q0];else J++;let R;try{R=M.insert(_,J,Q)}catch(X){throw X===b?new k0(_):X}if(Q)continue;f[J]=W.map(([X,z])=>{let L=Object.create(null);z-=1;for(;z>=0;z--){let[C,U]=R[z];L[C]=U}return[X,L]})}let[O,y,E]=M.buildRegExp();for(let N=0,J=f.length;N<J;N++)for(let B=0,Q=f[N].length;B<Q;B++){let _=f[N][B]?.[1];if(!_)continue;let W=Object.keys(_);for(let R=0,X=W.length;R<X;R++)_[W[R]]=E[_[W[R]]]}let V=[];for(let N in y)V[N]=f[y[N]];return[O,V,A]}function M0(S,M){if(!S)return;for(let f of Object.keys(S).sort(($,A)=>A.length-$.length))if(c1(f).test(M))return[...S[f]];return}var w0=class{name="RegExpRouter";#S;#M;constructor(){this.#S={[G]:Object.create(null)},this.#M={[G]:Object.create(null)}}add(S,M,f){let $=this.#S,A=this.#M;if(!$||!A)throw Error(j0);if(!$[S])[$,A].forEach((E)=>{E[S]=Object.create(null),Object.keys(E[G]).forEach((V)=>{E[S][V]=[...E[G][V]]})});if(M==="/*")M="*";let O=(M.match(/\/:/g)||[]).length;if(/\*$/.test(M)){let E=c1(M);if(S===G)Object.keys($).forEach((V)=>{$[V][M]||=M0($[V],M)||M0($[G],M)||[]});else $[S][M]||=M0($[S],M)||M0($[G],M)||[];Object.keys($).forEach((V)=>{if(S===G||S===V)Object.keys($[V]).forEach((N)=>{E.test(N)&&$[V][N].push([f,O])})}),Object.keys(A).forEach((V)=>{if(S===G||S===V)Object.keys(A[V]).forEach((N)=>E.test(N)&&A[V][N].push([f,O]))});return}let y=T0(M)||[M];for(let E=0,V=y.length;E<V;E++){let N=y[E];Object.keys(A).forEach((J)=>{if(S===G||S===J)A[J][N]||=[...M0($[J],N)||M0($[G],N)||[]],A[J][N].push([f,O-V+E+1])})}}match=I0;buildAllMatchers(){let S=Object.create(null);return Object.keys(this.#M).concat(Object.keys(this.#S)).forEach((M)=>{S[M]||=this.#f(M)}),this.#S=this.#M=void 0,bf(),S}#f(S){let M=[],f=S===G;if([this.#S,this.#M].forEach(($)=>{let A=$[S]?Object.keys($[S]).map((O)=>[O,$[S][O]]):[];if(A.length!==0)f||=!0,M.push(...A);else if(S!==G)M.push(...Object.keys($[G]).map((O)=>[O,$[G][O]]))}),!f)return null;else return nf(M)}};var rf=class{name="PreparedRegExpRouter";#S;#M;constructor(S,M){this.#S=S,this.#M=M}#f(S,M){let f=this.#S[S];f[1].forEach(($)=>$&&$.push(M)),Object.values(f[2]).forEach(($)=>$[0].push(M))}#O(S,M,f,$,A){let O=this.#S[S];if(!A)O[2][M][0].push([f,{}]);else $.forEach((y)=>{if(typeof y==="number")O[1][y].push([f,A]);else O[2][y||M][0].push([f,A])})}add(S,M,f){if(!this.#S[S]){let A=this.#S[G],O={};for(let y in A[2])O[y]=[A[2][y][0].slice(),Q0];this.#S[S]=[A[0],A[1].map((y)=>Array.isArray(y)?y.slice():0),O]}if(M==="/*"||M==="*"){let A=[f,{}];if(S===G)for(let O in this.#S)this.#f(O,A);else this.#f(S,A);return}let $=this.#M[M];if(!$)throw Error(`Path ${M} is not registered`);for(let[A,O]of $)if(S===G)for(let y in this.#S)this.#O(y,M,f,A,O);else this.#O(S,M,f,A,O)}buildAllMatchers(){return this.#S}match=I0};var KS=class{name="SmartRouter";#S=[];#M=[];constructor(S){this.#S=S.routers}add(S,M,f){if(!this.#M)throw Error(j0);this.#M.push([S,M,f])}match(S,M){if(!this.#M)throw Error("Fatal error");let f=this.#S,$=this.#M,A=f.length,O=0,y;for(;O<A;O++){let E=f[O];try{for(let V=0,N=$.length;V<N;V++)E.add(...$[V]);y=E.match(S,M)}catch(V){if(V instanceof k0)continue;throw V}this.match=E.match.bind(E),this.#S=[E],this.#M=void 0;break}if(O===A)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,y}get activeRouter(){if(this.#M||this.#S.length!==1)throw Error("No active router has been determined yet.");return this.#S[0]}};var W0=Object.create(null),l1=class S{#S;#M;#f;#O=0;#A=W0;constructor(M,f,$){if(this.#M=$||Object.create(null),this.#S=[],M&&f){let A=Object.create(null);A[M]={handler:f,possibleKeys:[],score:0},this.#S=[A]}this.#f=[]}insert(M,f,$){this.#O=++this.#O;let A=this,O=C1(f),y=[];for(let E=0,V=O.length;E<V;E++){let N=O[E],J=O[E+1],B=G1(N,J),Q=Array.isArray(B)?B[0]:N;if(Q in A.#M){if(A=A.#M[Q],B)y.push(B[1]);continue}if(A.#M[Q]=new S,B)A.#f.push(B),y.push(B[1]);A=A.#M[Q]}return A.#S.push({[M]:{handler:$,possibleKeys:y.filter((E,V,N)=>N.indexOf(E)===V),score:this.#O}}),A}#$(M,f,$,A){let O=[];for(let y=0,E=M.#S.length;y<E;y++){let V=M.#S[y],N=V[f]||V[G],J={};if(N!==void 0){if(N.params=Object.create(null),O.push(N),$!==W0||A&&A!==W0)for(let B=0,Q=N.possibleKeys.length;B<Q;B++){let _=N.possibleKeys[B],W=J[N.score];N.params[_]=A?.[_]&&!W?A[_]:$[_]??A?.[_],J[N.score]=!0}}}return O}search(M,f){let $=[];this.#A=W0;let O=[this],y=_S(f),E=[];for(let V=0,N=y.length;V<N;V++){let J=y[V],B=V===N-1,Q=[];for(let _=0,W=O.length;_<W;_++){let R=O[_],X=R.#M[J];if(X)if(X.#A=R.#A,B){if(X.#M["*"])$.push(...this.#$(X.#M["*"],M,R.#A));$.push(...this.#$(X,M,R.#A))}else Q.push(X);for(let z=0,L=R.#f.length;z<L;z++){let C=R.#f[z],U=R.#A===W0?{}:{...R.#A};if(C==="*"){let I=R.#M["*"];if(I)$.push(...this.#$(I,M,R.#A)),I.#A=U,Q.push(I);continue}let[j,x,k]=C;if(!J&&!(k instanceof RegExp))continue;let T=R.#M[j],OS=y.slice(V).join("/");if(k instanceof RegExp){let I=k.exec(OS);if(I){if(U[x]=I[0],$.push(...this.#$(T,M,R.#A,U)),Object.keys(T.#M).length){T.#A=U;let L0=I[0].match(/\//)?.length??0;(E[L0]||=[]).push(T)}continue}}if(k===!0||k.test(J))if(U[x]=J,B){if($.push(...this.#$(T,M,U,R.#A)),T.#M["*"])$.push(...this.#$(T.#M["*"],M,U,R.#A))}else T.#A=U,Q.push(T)}}O=Q.concat(E.shift()??[])}if($.length>1)$.sort((V,N)=>{return V.score-N.score});return[$.map(({handler:V,params:N})=>[V,N])]}};var ZS=class{name="TrieRouter";#S;constructor(){this.#S=new l1}add(S,M,f){let $=T0(M);if($){for(let A=0,O=$.length;A<O;A++)this.#S.insert(S,$[A],f);return}this.#S.insert(S,M,f)}match(S,M){return this.#S.search(S,M)}};var YS=class extends h1{constructor(S={}){super(S);this.router=S.router??new KS({routers:[new w0,new ZS]})}};FS();import{z as K}from"zod";var P0="1.0.0",t=K.enum(["decision","bugfix","feature","refactor","discovery","change"]),F={find:K.object({query:K.string().min(1),scope:K.enum(["project","user","all"]).optional().default("project"),types:K.array(t).optional(),limit:K.number().int().min(1).max(50).optional().default(10),cursor:K.string().optional(),include:K.object({snippets:K.boolean().optional(),scores:K.boolean().optional(),relations:K.boolean().optional()}).optional()}),history:K.object({limit:K.number().int().min(1).max(20).optional().default(5),cursor:K.string().optional(),sessionId:K.string().optional(),anchor:K.string().optional().describe("Observation ID to center the timeline around"),depthBefore:K.number().int().min(0).max(20).optional().default(5),depthAfter:K.number().int().min(0).max(20).optional().default(5)}),get:K.object({ids:K.array(K.string()).min(1),includeHistory:K.boolean().optional().default(!1),limit:K.number().int().min(1).max(50).optional().default(10)}),create:K.object({title:K.string(),type:t,narrative:K.string(),concepts:K.array(K.string()).optional(),files:K.array(K.string()).optional(),importance:K.number().int().min(1).max(5).optional(),scope:K.enum(["project","user"]).optional().default("project")}),revise:K.object({id:K.string(),title:K.string().optional(),narrative:K.string().optional(),type:t.optional(),concepts:K.array(K.string()).optional(),importance:K.number().int().min(1).max(5).optional(),reason:K.string().optional()}),remove:K.object({id:K.string(),reason:K.string().optional()}),transferExport:K.object({scope:K.enum(["project"]).optional().default("project"),type:t.optional(),limit:K.number().int().min(1).optional(),format:K.enum(["json"]).optional().default("json")}),transferImport:K.object({payload:K.string(),mode:K.enum(["skip","merge","replace"]).optional().default("skip")}),maintenance:K.object({action:K.enum(["folderContextDryRun","folderContextClean","folderContextRebuild","folderContextPurge"])}),help:K.object({})},v0=[{name:"mem-find",schema:"find",description:"Search past memories \u2014 decisions, discoveries, gotchas, and session history. Use to recall context from previous sessions before starting work."},{name:"mem-history",schema:"history",description:"Browse session timeline and summaries. Use to understand what happened in recent sessions or drill into a specific session."},{name:"mem-get",schema:"get",description:"Fetch full memory details by ID. Use after mem-find or mem-history to get complete narratives, facts, and file lists."},{name:"mem-create",schema:"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."},{name:"mem-revise",schema:"revise",description:"Update an existing memory with a new revision. Use when a previous decision changed, a gotcha was resolved, or information became outdated."},{name:"mem-remove",schema:"remove",description:"Tombstone an obsolete or incorrect memory. Use to clean up memories that are no longer accurate or relevant."},{name:"mem-export",schema:"transferExport",description:"Export project memories as portable JSON for backup or transfer between machines."},{name:"mem-import",schema:"transferImport",description:"Import memories from a JSON export. Skips duplicates by default."},{name:"mem-maintenance",schema:"maintenance",description:"Run folder context maintenance \u2014 clean, rebuild, purge, or dry-run AGENTS.md files."},{name:"mem-help",schema:"help",description:"Show detailed memory workflow guidance including when to save, what to save, and memory type reference."}];function uS(S){return v0.find((M)=>M.name===S)??null}function Z(S,M={}){return{data:S,error:null,meta:M}}function Y(S,M,f){return{data:null,error:{code:S,message:M,details:f},meta:{}}}US();class TS{evaluate(S){let M=[];if(!S.adapterStatuses.some((f)=>f.enabled))M.push("No platform adapters are enabled.");if(S.config.compressionEnabled&&S.config.provider!=="bedrock"&&!S.config.apiKey)M.push("Compression is enabled but no provider API key is configured.");if(S.runtime.status==="degraded")M.push("Runtime status is degraded.");if(S.runtime.queue.lastError)M.push(`Queue reported an error: ${S.runtime.queue.lastError}`);if(M.length===0)return{ready:!0,status:"ready",reasons:[]};return{ready:!1,status:S.runtime.status==="degraded"?"degraded":"initializing",reasons:M}}}import{existsSync as W2}from"fs";import{dirname as X2}from"path";class xS{run(S){let M=[];return M.push(this.checkDbDir(S)),M.push(this.checkProviderConfig(S)),M.push(this.checkVectorSupport(S)),M.push(this.checkAdapters(S)),M.push(this.checkDashboardPort(S)),{ok:M.every(($)=>$.status!=="fail"),checks:M}}checkDbDir(S){let M=X2(S.dbPath);return W2(M)?{id:"db-dir",status:"pass",message:"Database directory exists.",details:{dir:M}}:{id:"db-dir",status:"warn",message:"Database directory does not exist yet. It will be created on first run.",details:{dir:M}}}checkProviderConfig(S){if(!S.compressionEnabled)return{id:"provider-config",status:"pass",message:"Compression is disabled; provider API key is optional."};if(S.provider==="bedrock")return{id:"provider-config",status:"pass",message:"Bedrock provider selected; API key is not required."};if(!S.apiKey)return{id:"provider-config",status:"fail",message:"Compression is enabled but no provider API key is configured.",details:{provider:S.provider}};return{id:"provider-config",status:"pass",message:"Provider API key is configured.",details:{provider:S.provider}}}checkVectorSupport(S){if(!(S.provider==="google"||S.provider==="openai"||S.provider==="bedrock"))return{id:"vector-support",status:"warn",message:"Provider does not support embeddings; search will use FTS-only fallback.",details:{provider:S.provider}};return{id:"vector-support",status:"pass",message:"Provider supports embeddings.",details:{provider:S.provider,dimension:S.embeddingDimension}}}checkAdapters(S){let M=[["opencode",S.platformOpenCodeEnabled!==!1],["claude-code",S.platformClaudeCodeEnabled===!0],["cursor",S.platformCursorEnabled===!0]].filter(([,f])=>f);if(M.length===0)return{id:"adapters",status:"fail",message:"No platform adapters are enabled."};return{id:"adapters",status:"pass",message:`Enabled adapters: ${M.map(([f])=>f).join(", ")}`}}checkDashboardPort(S){if(!S.dashboardEnabled)return{id:"dashboard",status:"pass",message:"Dashboard is disabled."};if(S.dashboardPort<1||S.dashboardPort>65535)return{id:"dashboard",status:"fail",message:"Dashboard port is outside the valid range (1-65535).",details:{dashboardPort:S.dashboardPort}};return{id:"dashboard",status:"pass",message:"Dashboard port configuration looks valid.",details:{dashboardPort:S.dashboardPort}}}}var Y2=new Set(t.options);function kS(S,M,f=100){if(!S)return M;let $=Number.parseInt(S,10);if(Number.isNaN($))return M;return Math.max(1,Math.min($,f))}function z2(S){if(!S)return 0;let M=Number.parseInt(S,10);if(Number.isNaN(M))return 0;return Math.max(0,M)}function $M(S){if(!S)return;if(Y2.has(S))return S;return}function c0(S){let M={};for(let[f,$]of Object.entries(S)){let A=f.toLowerCase();M[f]=typeof $==="string"&&(A.includes("key")||A.includes("api"))?"***REDACTED***":$}return M}function l0(S){return{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}}function AM(S){let{projectPath:M,memoryEngine:f,runtimeStatusProvider:$,dashboardDir:A}=S,O=new YS,y=new TS,E=new xS;O.get("/v1/memory/observations",(N)=>{let J=kS(N.req.query("limit"),50),B=z2(N.req.query("offset")),Q=$M(N.req.query("type")),_=N.req.query("sessionId"),W=N.req.query("state"),R=W==="current"||W==="superseded"||W==="tombstoned"?W:void 0,X=f.listObservations({limit:J,offset:B,type:Q,sessionId:_,state:R});return N.json(Z(X,{limit:J,offset:B}))}),O.post("/v1/memory/observations",async(N)=>{try{let J=await N.req.json(),B=await f.save({...J,sessionId:J.sessionId??`http-${Date.now()}`});if(!B)return N.json(Y("CONFLICT","Unable to create observation"),409);return N.json(Z(B),201)}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.get("/v1/memory/observations/:id",(N)=>{let J=N.req.param("id"),B=f.getObservation(J);if(!B)return N.json(Y("NOT_FOUND","Observation not found"),404);return N.json(Z(B))}),O.get("/v1/memory/observations/:id/lineage",(N)=>{let J=N.req.param("id"),B=f.getLineage(J);if(!B)return N.json(Y("NOT_FOUND","Observation not found"),404);return N.json(Z({observationId:J,lineage:B}))}),O.get("/v1/memory/observations/:id/revision-diff",(N)=>{let J=N.req.param("id"),B=N.req.query("against");if(!B)return N.json(Y("VALIDATION_ERROR","Query parameter 'against' is required"),400);let Q=f.getRevisionDiff(J,B);if(!Q)return N.json(Y("NOT_FOUND","One or both observations not found"),404);return N.json(Z(Q))}),O.post("/v1/memory/observations/:id/revisions",async(N)=>{let J=N.req.param("id");try{let B=await N.req.json(),Q=await f.update({id:J,...B});if(!Q)return N.json(Y("NOT_FOUND","Observation not found"),404);return N.json(Z({previousId:J,newId:Q.id,observation:Q}))}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.post("/v1/memory/observations/:id/tombstone",async(N)=>{let J=N.req.param("id");if(await f.delete([J])===0)return N.json(Y("NOT_FOUND","Observation not found"),404);return N.json(Z({id:J,tombstoned:!0}))}),O.get("/v1/memory/sessions",(N)=>{let J=kS(N.req.query("limit"),20),B=N.req.query("projectPath")||M;return N.json(Z(f.listSessions({limit:J,projectPath:B}),{limit:J}))}),O.get("/v1/memory/sessions/:id",(N)=>{let J=N.req.param("id"),B=f.getSession(J);if(!B)return N.json(Y("NOT_FOUND","Session not found"),404);return N.json(Z({...B.session,observations:B.observations,summary:B.summary}))}),O.get("/v1/memory/search",async(N)=>{let J=N.req.query("q");if(!J)return N.json(Y("VALIDATION_ERROR","Query parameter 'q' is required"),400);let B=$M(N.req.query("type")),Q=kS(N.req.query("limit"),20);try{let _=await f.search(J,{type:B,limit:Q});return N.json(Z(_,{limit:Q}))}catch{return N.json(Z([],{limit:Q}))}}),O.post("/v1/memory/recall",async(N)=>{try{let J=await N.req.json(),B=await f.recall(J.ids??[],J.limit??10);return N.json(Z(B))}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.post("/v1/memory/export",async(N)=>{try{let J=await N.req.json().catch(()=>({})),B=await f.export("project",{type:J.type,limit:J.limit});return N.json(Z(B))}catch(J){return N.json(Y("INTERNAL_ERROR",String(J)),500)}}),O.post("/v1/memory/import",async(N)=>{try{let J=await N.req.json(),B=J.mode==="replace"?"overwrite":"skip-duplicates",Q=await f.import(J.payload,{mode:B});return N.json(Z(Q))}catch{return N.json(Y("VALIDATION_ERROR","Invalid import payload"),400)}}),O.get("/v1/memory/stats",(N)=>{return N.json(Z(f.stats()))}),O.get("/v1/health",(N)=>{let J=f.getHealth(),B=f.getMetrics(),_=$?.()??l0(J);return N.json(Z({status:_.status,timestamp:_.timestamp,uptimeMs:_.uptimeMs,queue:_.queue,memory:{totalObservations:B.memory.totalObservations,totalSessions:B.memory.totalSessions}}))}),O.get("/v1/readiness",(N)=>{let J=f.getHealth(),B=$?.()??l0(J),Q=y.evaluate({config:S.config,adapterStatuses:f.getAdapterStatuses().map((_)=>({name:_.name,enabled:_.enabled})),runtime:{status:B.status,queue:{lastError:B.queue.lastError}}});return N.json(Z(Q),Q.ready?200:503)}),O.get("/v1/diagnostics",(N)=>{let J=E.run(S.config);return N.json(Z(J),J.ok?200:503)}),O.get("/v1/tools/guide",(N)=>{return N.json(Z({contractVersion:P0,workflow:{recommended:["mem-find","mem-history","mem-get"],description:"Start with compact discovery, then timeline context, then full detail fetch by IDs."},tools:v0}))}),O.get("/v1/queue",(N)=>{let J=f.getHealth(),B=$?.()??l0(J);return N.json(Z({contractVersion:P0,queue:B.queue,batches:B.batches,enqueueCount:B.enqueueCount}))}),O.post("/v1/queue/process",async(N)=>{let J=await f.processPending();return N.json(Z({processed:J}))}),O.get("/v1/metrics",(N)=>{let J=f.getHealth(),Q=$?.()??l0(J);return N.json(Z(Q))}),O.get("/v1/platforms",(N)=>{let J=f.getAdapterStatuses();return N.json(Z({platforms:J.map((B)=>({name:B.name,version:B.version,enabled:B.enabled,capabilities:B.capabilities}))}))}),O.get("/v1/adapters/status",(N)=>{return N.json(Z(f.getAdapterStatuses()))}),O.get("/v1/config/schema",(N)=>N.json(Z(CS()))),O.get("/v1/config/effective",async(N)=>{let J=await r(M);return N.json(Z({config:c0(J.config),meta:J.meta,warnings:J.warnings}))}),O.post("/v1/config/preview",async(N)=>{try{let J=await N.req.json(),B=await HS(M,J);return N.json(Z({config:c0(B.config),meta:B.meta,warnings:B.warnings}))}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}}),O.patch("/v1/config",async(N)=>{let J;try{J=await N.req.json()}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}try{let B=await i(M),Q=await q0(M,J),_={};for(let W of Object.keys(J))if(Object.hasOwn(B,W))_[W]=B[W];return f.trackConfigAudit({id:K0(),timestamp:new Date().toISOString(),patch:J,previousValues:_,source:"api"}),N.json(Z({config:c0(Q.config),meta:Q.meta,warnings:Q.warnings}))}catch(B){return N.json(Y("INTERNAL_ERROR",String(B)),500)}}),O.get("/v1/config/audit",(N)=>{return N.json(Z(f.getConfigAuditTimeline()))}),O.post("/v1/config/rollback",async(N)=>{let J;try{J=await N.req.json()}catch{return N.json(Y("VALIDATION_ERROR","Invalid JSON body"),400)}if(!J.eventId)return N.json(Y("VALIDATION_ERROR","eventId is required"),400);try{let B=await f.rollbackConfig(J.eventId);if(!B)return N.json(Y("NOT_FOUND","Audit event not found"),404);return N.json(Z(B))}catch(B){return N.json(Y("INTERNAL_ERROR",String(B)),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(O.get("/v1/modes",(N)=>N.json(Z({modes:Object.entries(V).map(([J,B])=>({id:J,patch:B}))}))),O.post("/v1/modes/:id/apply",async(N)=>{let J=N.req.param("id"),B=V[J];if(!B)return N.json(Y("NOT_FOUND","Unknown mode"),404);try{let Q=await i(M),_=await q0(M,B),W={};for(let R of Object.keys(B))if(Object.hasOwn(Q,R))W[R]=Q[R];return f.trackConfigAudit({id:K0(),timestamp:new Date().toISOString(),patch:B,previousValues:W,source:"mode"}),N.json(Z({applied:J,config:c0(_.config),meta:_.meta,warnings:_.warnings}))}catch(Q){return N.json(Y("INTERNAL_ERROR",String(Q)),500)}}),O.get("/v1/workflow-modes",(N)=>N.json(Z({modes:h0().map((J)=>i1(J))}))),O.post("/v1/maintenance/folder-context/dry-run",async(N)=>{try{let B=(await N.req.json().catch(()=>({}))).action??"clean",Q=await f.maintainFolderContext(B,!0);return f.trackMaintenanceResult({id:K0(),timestamp:new Date().toISOString(),action:`folder-context-${B}-dry-run`,dryRun:!0,result:Q}),N.json(Z(Q))}catch(J){return N.json(Y("INTERNAL_ERROR",String(J)),500)}}),O.post("/v1/maintenance/folder-context/clean",async(N)=>{try{let J=await f.maintainFolderContext("clean",!1);return f.trackMaintenanceResult({id:K0(),timestamp:new Date().toISOString(),action:"folder-context-clean",dryRun:!1,result:J}),N.json(Z(J))}catch(J){return N.json(Y("INTERNAL_ERROR",String(J)),500)}}),O.post("/v1/maintenance/folder-context/rebuild",async(N)=>{try{let J=await f.maintainFolderContext("rebuild",!1);return f.trackMaintenanceResult({id:K0(),timestamp:new Date().toISOString(),action:"folder-context-rebuild",dryRun:!1,result:J}),N.json(Z(J))}catch(J){return N.json(Y("INTERNAL_ERROR",String(J)),500)}}),O.get("/v1/maintenance/history",(N)=>{return N.json(Z(f.getMaintenanceHistory()))}),S.sseHandler)O.get("/v1/events",S.sseHandler);return O.get("*",async(N)=>{let J=N.req.path;if(J.startsWith("/v1/"))return N.json(Y("NOT_FOUND","Not found"),404);let B=A??jS(Z2(import.meta.url),"../../dist/dashboard"),Q=K2(B),_=Q.endsWith(fM)?Q:`${Q}${fM}`,W=J==="/"?"index.html":J.replace(/^\//,""),R=jS(B,W);if(!R.startsWith(_))return N.json(Y("NOT_FOUND","Not found"),404);try{let z=Bun.file(R);if(await z.exists())return new Response(z)}catch{}let X=jS(B,"index.html");if(!X.startsWith(_))return N.json(Y("NOT_FOUND","Not found"),404);try{let z=Bun.file(X);if(await z.exists())return new Response(z,{headers:{"Content-Type":"text/html; charset=utf-8"}})}catch{}return N.json(Y("NOT_FOUND","Dashboard not found. Run the dashboard build first."),404)}),O}var IS=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(S,M){this.writable=S,this.writer=S.getWriter(),this.encoder=new TextEncoder;let f=M.getReader();this.abortSubscribers.push(async()=>{await f.cancel()}),this.responseReadable=new ReadableStream({async pull($){let{done:A,value:O}=await f.read();A?$.close():$.enqueue(O)},cancel:()=>{this.abort()}})}async write(S){try{if(typeof S==="string")S=this.encoder.encode(S);await this.writer.write(S)}catch{}return this}async writeln(S){return await this.write(S+`
3
+ `),this}sleep(S){return new Promise((M)=>setTimeout(M,S))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(S){this.writer.releaseLock(),await S.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(S){this.abortSubscribers.push(S)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((S)=>S())}};var p0=()=>{let S=typeof Bun<"u"?Bun.version:void 0;if(S===void 0)return!1;let M=S.startsWith("1.1")||S.startsWith("1.0")||S.startsWith("0.");return p0=()=>M,M};var OM=class extends IS{constructor(S,M){super(S,M)}async writeSSE(S){let f=(await B0(S.data,x0.Stringify,!1,{})).split(/\r\n|\r|\n/).map((A)=>{return`data: ${A}`}).join(`
4
+ `),$=[S.event&&`event: ${S.event}`,f,S.id&&`id: ${S.id}`,S.retry&&`retry: ${S.retry}`].filter(Boolean).join(`
5
5
  `)+`
6
6
 
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}
7
+ `;await this.write($)}},U2=async(S,M,f)=>{try{await M(S)}catch($){if($ instanceof Error&&f)await f($,S),await S.writeSSE({event:"error",data:$.message});else console.error($)}finally{S.close()}},D2=new WeakMap,gS=(S,M,f)=>{let{readable:$,writable:A}=new TransformStream,O=new OM(A,$);if(p0())S.req.raw.signal.addEventListener("abort",()=>{if(!O.closed)O.abort()});return D2.set(O.responseReadable,S),S.header("Transfer-Encoding","chunked"),S.header("Content-Type","text/event-stream"),S.header("Cache-Control","no-cache"),S.header("Connection","keep-alive"),U2(O,M,f),S.newResponse(O.responseReadable)};class wS{eventBus;clients=new Set;cleanups=[];constructor(S){this.eventBus=S;this.subscribeToAll()}addClient(S){this.clients.add(S)}removeClient(S){this.clients.delete(S)}get clientCount(){return this.clients.size}destroy(){for(let S of this.cleanups)S();this.cleanups=[],this.clients.clear()}subscribeToAll(){let S=["observation:created","observation:updated","session:started","session:ended","summary:created","pending:enqueued","pending:processed"];for(let M of S){let f=($)=>this.broadcast(M,$);this.eventBus.on(M,f),this.cleanups.push(()=>this.eventBus.off(M,f))}}broadcast(S,M){let f=JSON.stringify(M);for(let $ of this.clients)try{let A=$(S,f);if(A&&typeof A.catch==="function")A.catch(()=>this.clients.delete($))}catch{this.clients.delete($)}}}var C2=30000;function yM(S){return(M)=>{return gS(M,async(f)=>{let $=(O,y)=>{f.writeSSE({event:O,data:y,id:Date.now().toString()})};S.addClient($);let A=setInterval(()=>{f.writeSSE({event:"heartbeat",data:"",id:Date.now().toString()})},C2);f.onAbort(()=>{S.removeClient($),clearInterval(A)});while(!f.aborted)await f.sleep(1000)})}}function H(S){return JSON.stringify(S,null,2)}function G2(S,M){return S.filter((f)=>M==="all"?!0:M==="user"?f.source==="user":f.source!=="user").map((f)=>({id:f.observation.id,title:f.observation.title,type:f.observation.type,summary:f.observation.narrative,snippet:f.snippet,score:f.rank,source:f.source??"project",createdAt:f.observation.createdAt}))}function NM(S){let M=(f)=>{let $=uS(f);if(!$)throw Error(`Missing tool contract metadata for ${f}`);return $.description};return{"mem-find":{description:M("mem-find"),args:F.find.shape,execute:async(f)=>{try{let $=F.find.parse(f),A=await S.search($.query,{limit:$.limit,type:$.types?.[0]}),O=Z({results:G2(A,$.scope),nextCursor:null});return H(O)}catch($){return H(Y("VALIDATION_ERROR","Invalid find arguments",String($)))}}},"mem-history":{description:M("mem-history"),args:F.history.shape,execute:async(f)=>{try{let $=F.history.parse(f),A=await S.timeline({limit:$.limit,sessionId:$.sessionId,anchor:$.anchor,depthBefore:$.depthBefore,depthAfter:$.depthAfter});return H(Z({items:A,nextCursor:null}))}catch($){return H(Y("VALIDATION_ERROR","Invalid history arguments",String($)))}}},"mem-get":{description:M("mem-get"),args:F.get.shape,execute:async(f)=>{try{let $=F.get.parse(f),A=await S.recall($.ids,$.limit);return H(Z({observations:A}))}catch($){return H(Y("VALIDATION_ERROR","Invalid get arguments",String($)))}}},"mem-create":{description:M("mem-create"),args:F.create.shape,execute:async(f,$)=>{try{let A=F.create.parse(f),O=await S.save({...A,sessionId:$.sessionID});if(!O)return H(Y("CONFLICT","Unable to create memory"));return H(Z({observation:O}))}catch(A){return H(Y("VALIDATION_ERROR","Invalid create arguments",String(A)))}}},"mem-revise":{description:M("mem-revise"),args:F.revise.shape,execute:async(f)=>{try{let $=F.revise.parse(f),A=await S.update($);if(!A)return H(Y("NOT_FOUND",`Observation ${$.id} not found`));return H(Z({previousId:$.id,newId:A.id,observation:A}))}catch($){return H(Y("VALIDATION_ERROR","Invalid revise arguments",String($)))}}},"mem-remove":{description:M("mem-remove"),args:F.remove.shape,execute:async(f)=>{try{let $=F.remove.parse(f);if(await S.delete([$.id])===0)return H(Y("NOT_FOUND",`Observation ${$.id} not found`));return H(Z({id:$.id,tombstoned:!0}))}catch($){return H(Y("VALIDATION_ERROR","Invalid remove arguments",String($)))}}},"mem-export":{description:M("mem-export"),args:F.transferExport.shape,execute:async(f)=>{try{let $=F.transferExport.parse(f),A=await S.export("project",{type:$.type,limit:$.limit});return H(Z({payload:A,format:$.format}))}catch($){return H(Y("VALIDATION_ERROR","Invalid export arguments",String($)))}}},"mem-import":{description:M("mem-import"),args:F.transferImport.shape,execute:async(f)=>{try{let $=F.transferImport.parse(f),A=$.mode==="replace"?"overwrite":"skip-duplicates",O=await S.import($.payload,{mode:A});return H(Z({imported:O.imported,skipped:O.skipped,mode:$.mode}))}catch($){return H(Y("VALIDATION_ERROR","Invalid import arguments",String($)))}}},"mem-maintenance":{description:M("mem-maintenance"),args:F.maintenance.shape,execute:async(f)=>{try{let $=F.maintenance.parse(f);if($.action==="folderContextDryRun")return H(Z(await S.maintainFolderContext("clean",!0)));if($.action==="folderContextClean")return H(Z(await S.maintainFolderContext("clean",!1)));if($.action==="folderContextPurge")return H(Z(await S.maintainFolderContext("purge",!1)));return H(Z(await S.maintainFolderContext("rebuild",!1)))}catch($){return H(Y("VALIDATION_ERROR","Invalid maintenance arguments",String($)))}}},"mem-help":{description:M("mem-help"),args:F.help.shape,execute:async()=>H(Z({guide:S.guide()}))}}}import{generateText as w2}from"ai";function l(S){if(typeof S!=="object"||S===null)return!1;let M=S,f=M.status;if(f===429||f===500||f===503)return!0;let $=M.error;if(typeof $==="object"&&$!==null&&$.type==="overloaded_error")return!0;return!1}function Z0(S){if(S&&typeof S==="object"){let M=S.status;if(typeof M==="number")return M===400||M===401||M===403}return!1}function d(S){return new Promise((M)=>setTimeout(M,S))}var H2=new Set(["decision","bugfix","feature","refactor","discovery","change"]);function D(S,M){let f=new RegExp(`<${M}[^>]*>([\\s\\S]*?)</${M}>`,"i"),$=S.match(f);return $?$[1].trim():""}function m(S,M){let f=new RegExp(`<${M}[^>]*>([\\s\\S]*?)</${M}>`,"gi"),$=[];for(let A of S.matchAll(f)){let O=A[1].trim();if(O)$.push(O)}return $}function EM(S){let M=D(S,"observation");if(!M)return null;let f=D(M,"type").toLowerCase(),$=H2.has(f)?f:"discovery",A=D(M,"title")||"Untitled observation",O=D(M,"subtitle"),y=D(M,"narrative"),E=m(D(M,"facts"),"fact"),V=m(D(M,"concepts"),"concept"),N=m(D(M,"files_read"),"file"),J=m(D(M,"files_modified"),"file"),B=D(M,"importance"),Q=Number.parseInt(B,10),_=Number.isNaN(Q)?3:Math.max(1,Math.min(5,Q));return{type:$,title:A,subtitle:O,facts:E,narrative:y,concepts:V,filesRead:N,filesModified:J,importance:_}}function VM(S){let M=D(S,"session_summary");if(!M)return null;let f=D(M,"summary")||"No summary available",$=m(D(M,"key_decisions"),"decision"),A=m(D(M,"files_modified"),"file"),O=m(D(M,"concepts"),"concept"),y=D(M,"request")||void 0,E=D(M,"investigated")||void 0,V=D(M,"learned")||void 0,N=D(M,"completed")||void 0,J=D(M,"next_steps")||void 0;return{summary:f,keyDecisions:$,filesModified:A,concepts:O,request:y,investigated:E,learned:V,completed:N,nextSteps:J}}function JM(S){let M=D(S,"reranked");if(!M)return null;let f=m(M,"index");if(f.length===0)return null;let $=[];for(let A of f){let O=Number.parseInt(A,10);if(Number.isNaN(O)||O<0)return null;$.push(O)}return $}var F2=new Set(["new_fact","update","duplicate"]);function BM(S){let M=D(S,"evaluation");if(!M)return null;let f=D(M,"outcome").toLowerCase().trim();if(!F2.has(f))return null;let $=f,A=D(M,"reason");if(!A)return null;let O=D(M,"supersedes"),y={outcome:$,reason:A};if($==="update"&&O)y.supersedesId=O;if($==="update"&&!y.supersedesId)return null;return y}var u2=new Set(["technology","library","pattern","concept","file","person","project","other"]),T2=new Set(["uses","depends_on","implements","extends","related_to","replaces","configures"]);function QM(S){let M=D(S,"extraction");if(!M)return null;let f=D(M,"entities"),$=D(M,"relations"),A=m(f,"entity"),O=[];for(let V of A){let N=D(V,"name");if(!N)continue;let J=D(V,"type").toLowerCase(),B=u2.has(J)?J:"other";O.push({name:N,entityType:B})}let y=m($,"relation"),E=[];for(let V of y){let N=D(V,"source"),J=D(V,"target"),B=D(V,"relationship").toLowerCase();if(!N||!J||!B)continue;if(!T2.has(B))continue;E.push({sourceName:N,targetName:J,relationship:B})}return{entities:O,relations:E}}function u(S){return Math.ceil(S.length/4)}function _M(S,M,f,$){let A=f?`<session_context>
8
+ ${f}
9
9
  </session_context>
10
10
 
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(`
11
+ `:"",O=$?$.observationTypes.join("|"):"decision|bugfix|feature|refactor|discovery|change",E=($?$.conceptVocabulary:["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"]).map((V)=>{let J={"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"}[V];return J?`- ${V}: ${J}`:`- ${V}`}).join(`
12
12
  `);return`<task>
13
13
  Analyze the following tool output and extract a structured observation.
14
14
  </task>
15
15
 
16
- <tool_name>${N}</tool_name>
16
+ <tool_name>${S}</tool_name>
17
17
 
18
18
  <tool_output>
19
- ${E}
19
+ ${M}
20
20
  </tool_output>
21
21
 
22
- ${O}<instructions>
22
+ ${A}<instructions>
23
23
  Extract a structured observation from the tool output. Determine the most appropriate type and provide a concise but informative summary.
24
24
 
25
25
  When extracting concepts, prefer established vocabulary where appropriate:
26
- ${_}
26
+ ${E}
27
27
  You may also use any domain-specific concepts relevant to the observation.
28
28
 
29
29
  Respond with EXACTLY this XML format:
30
30
  <observation>
31
- <type>${$}</type>
31
+ <type>${O}</type>
32
32
  <title>Brief descriptive title (max 80 chars)</title>
33
33
  <subtitle>One-line elaboration</subtitle>
34
34
  <importance>1-5 (1=trivial/routine, 2=low, 3=normal, 4=significant, 5=critical decision or discovery)</importance>
@@ -48,18 +48,18 @@ Respond with EXACTLY this XML format:
48
48
  <file>path/to/file/modified</file>
49
49
  </files_modified>
50
50
  </observation>
51
- </instructions>`}function oN(N,E){let A=N.map((M,O)=>` <obs index="${O+1}" type="${M.type}">
52
- <title>${M.title}</title>
53
- <narrative>${M.narrative}</narrative>
51
+ </instructions>`}function RM(S,M){let f=S.map(($,A)=>` <obs index="${A+1}" type="${$.type}">
52
+ <title>${$.title}</title>
53
+ <narrative>${$.narrative}</narrative>
54
54
  </obs>`).join(`
55
55
  `);return`<task>
56
56
  Summarize the following coding session based on its observations.
57
57
  </task>
58
58
 
59
- <session_id>${E}</session_id>
59
+ <session_id>${M}</session_id>
60
60
 
61
61
  <observations>
62
- ${A}
62
+ ${f}
63
63
  </observations>
64
64
 
65
65
  <instructions>
@@ -83,21 +83,21 @@ Respond with EXACTLY this XML format:
83
83
  <concept>key-concept</concept>
84
84
  </concepts>
85
85
  </session_summary>
86
- </instructions>`}function eN(N,E){let A=E.map((M)=>` <candidate id="${M.id}">
87
- <title>${M.title}</title>
88
- <narrative>${M.narrative}</narrative>
89
- <concepts>${M.concepts.join(", ")}</concepts>
90
- <type>${M.type}</type>
86
+ </instructions>`}function WM(S,M){let f=M.map(($)=>` <candidate id="${$.id}">
87
+ <title>${$.title}</title>
88
+ <narrative>${$.narrative}</narrative>
89
+ <concepts>${$.concepts.join(", ")}</concepts>
90
+ <type>${$.type}</type>
91
91
  </candidate>`).join(`
92
92
  `);return`<conflict_evaluation>
93
93
  <new_observation>
94
- <title>${N.title}</title>
95
- <narrative>${N.narrative}</narrative>
96
- <concepts>${N.concepts.join(", ")}</concepts>
97
- <type>${N.type}</type>
94
+ <title>${S.title}</title>
95
+ <narrative>${S.narrative}</narrative>
96
+ <concepts>${S.concepts.join(", ")}</concepts>
97
+ <type>${S.type}</type>
98
98
  </new_observation>
99
99
  <existing_candidates>
100
- ${A}
100
+ ${f}
101
101
  </existing_candidates>
102
102
  <instructions>
103
103
  Evaluate whether the new observation represents:
@@ -112,22 +112,22 @@ Respond with EXACTLY this XML format:
112
112
  <reason>Brief explanation</reason>
113
113
  </evaluation>
114
114
  </instructions>
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>
115
+ </conflict_evaluation>`}function XM(S,M){let f=[...S.filesRead,...S.filesModified],$=M?M.entityTypes.join(", "):"technology, library, pattern, concept, file, person, project, other",A=M?M.relationshipTypes.join(", "):"uses, depends_on, implements, extends, related_to, replaces, configures";return`<entity_extraction>
116
116
  <observation>
117
- <title>${N.title}</title>
118
- <type>${N.type}</type>
119
- <narrative>${N.narrative}</narrative>
120
- <facts>${N.facts.join(`
117
+ <title>${S.title}</title>
118
+ <type>${S.type}</type>
119
+ <narrative>${S.narrative}</narrative>
120
+ <facts>${S.facts.join(`
121
121
  `)}</facts>
122
- <files>${A.join(`
122
+ <files>${f.join(`
123
123
  `)}</files>
124
- <concepts>${N.concepts.join(", ")}</concepts>
124
+ <concepts>${S.concepts.join(", ")}</concepts>
125
125
  </observation>
126
126
  <instructions>
127
127
  Extract entities and relationships from this observation.
128
128
 
129
- Entity types: ${M}
130
- Relationship types: ${O}
129
+ Entity types: ${$}
130
+ Relationship types: ${A}
131
131
 
132
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.
133
133
  Respond with EXACTLY this XML format:
@@ -141,11 +141,11 @@ Respond with EXACTLY this XML format:
141
141
  </relations>
142
142
  </extraction>
143
143
  </instructions>
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(`
144
+ </entity_extraction>`}function KM(S,M){let f=M.map(($,A)=>` <candidate index="${A}"><title>${$.title}</title><narrative>${$.narrative}</narrative></candidate>`).join(`
145
145
  `);return`<rerank_request>
146
- <query>${N}</query>
146
+ <query>${S}</query>
147
147
  <candidates>
148
- ${A}
148
+ ${f}
149
149
  </candidates>
150
150
  <instructions>Reorder the candidates by relevance to the query. Return indices from most to least relevant.
151
151
 
@@ -156,133 +156,133 @@ Respond with EXACTLY this XML format:
156
156
  <index>0</index>
157
157
  </reranked>
158
158
  </instructions>
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}
172
- ${E}
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}
175
- ${E}
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}
159
+ </rerank_request>`}class mS{shouldFailover(S){let{error:M,attemptIndex:f,totalProviders:$}=S;if(Z0(M))return!1;if(f>=$-1)return!1;return l(M)}onFailover(S){let M=S.error?.status??"unknown";if(!S.nextProvider)return;console.error(`[open-mem] Provider ${S.provider} failed (${M}), falling over to ${S.nextProvider}`)}}class hS{specificationVersion;provider;modelId;supportedUrls;providers;policy;constructor(S,M=new mS){if(S.length===0)throw Error("At least one provider required");let f=S[0].model;this.specificationVersion=f.specificationVersion,this.provider=f.provider,this.modelId=f.modelId,this.supportedUrls=f.supportedUrls,this.providers=S,this.policy=M}async doGenerate(S){let M;for(let f=0;f<this.providers.length;f++){let $=this.providers[f];try{return this.policy.onAttempt?.({error:null,provider:$.name,nextProvider:this.providers[f+1]?.name,attemptIndex:f,totalProviders:this.providers.length}),await $.model.doGenerate(S)}catch(A){if(M=A,Z0(A))throw A;let O=this.providers[f+1]?.name,y={error:A,provider:$.name,nextProvider:O,attemptIndex:f,totalProviders:this.providers.length};if(this.policy.shouldFailover(y)){this.policy.onFailover(y);continue}throw this.policy.onFinalFailure?.(y),A}}throw M}async doStream(S){let M;for(let f=0;f<this.providers.length;f++){let $=this.providers[f];try{return this.policy.onAttempt?.({error:null,provider:$.name,nextProvider:this.providers[f+1]?.name,attemptIndex:f,totalProviders:this.providers.length}),await $.model.doStream(S)}catch(A){if(M=A,Z0(A))throw A;let O=this.providers[f+1]?.name,y={error:A,provider:$.name,nextProvider:O,attemptIndex:f,totalProviders:this.providers.length};if(this.policy.shouldFailover(y)){this.policy.onFailover(y);continue}throw this.policy.onFinalFailure?.(y),A}}throw M}}var x2={"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 j2(S){if(S.includes("."))return S;return x2[S]||`us.anthropic.${S}-v1:0`}function ZM(S){switch(S.provider){case"anthropic":{let{createAnthropic:M}=w("@ai-sdk/anthropic");return M({apiKey:S.apiKey})(S.model)}case"bedrock":{let{createAmazonBedrock:M}=w("@ai-sdk/amazon-bedrock");return M()(j2(S.model))}case"openai":{let{createOpenAI:M}=w("@ai-sdk/openai");return M({apiKey:S.apiKey})(S.model)}case"google":{let{createGoogleGenerativeAI:M}=w("@ai-sdk/google");return M({apiKey:S.apiKey})(S.model)}case"openrouter":{let{createOpenRouter:M}=w("@openrouter/ai-sdk-provider");return M({apiKey:S.apiKey})(S.model)}default:throw Error(`Unknown provider: ${S.provider}. Supported: anthropic, bedrock, openai, google, openrouter`)}}function YM(S){try{switch(S.provider){case"google":{let{createGoogleGenerativeAI:M}=w("@ai-sdk/google");return M({apiKey:S.apiKey}).embedding("text-embedding-004")}case"openai":{let{createOpenAI:M}=w("@ai-sdk/openai");return M({apiKey:S.apiKey}).embedding("text-embedding-3-small")}case"bedrock":{let{createAmazonBedrock:M}=w("@ai-sdk/amazon-bedrock");return M().embedding("amazon.titan-embed-text-v2:0")}case"anthropic":return null;case"openrouter":return null;default:return null}}catch{return null}}var k2={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 I2(S){switch(S){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 h(S){if(!S.fallbackProviders||S.fallbackProviders.length===0)return[];return S.fallbackProviders.map((M)=>({provider:M,model:k2[M]??"gemini-2.5-flash-lite",apiKey:I2(M)}))}function q(S,M=[],f){let $=ZM(S);if(M.length===0)return $;let A=[{name:S.provider,model:$},...M.map((O)=>({name:O.provider,model:ZM(O)}))];return new hS(A,f)}var g2={"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},zM=0;async function P(S,M){if(!M)return;let f=g2[S]||5,$=Math.ceil(60000/f)+100,O=Date.now()-zM;if(O<$){let y=$-O;await new Promise((E)=>setTimeout(E,y))}zM=Date.now()}class Y0{model;config;_generate=w2;constructor(S){this.config=S,this.model=null;let M=S.provider!=="bedrock";if(S.compressionEnabled&&(!M||S.apiKey))try{this.model=q({provider:S.provider,model:S.model,apiKey:S.apiKey},h(S))}catch{}}static MAX_INPUT_LENGTH=50000;async compress(S,M,f){if(!this.config.compressionEnabled||!this.model)return null;if(M.length<this.config.minOutputLength)return null;let $=u(M),A=M.length>Y0.MAX_INPUT_LENGTH?`${M.substring(0,Y0.MAX_INPUT_LENGTH)}
160
+
161
+ [... truncated ...]`:M,O=_M(S,A,f),y=2;for(let E=0;E<=y;E++)try{if(this.config.provider==="google")await P(this.config.model,this.config.rateLimitingEnabled);let{text:V}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:O}),N=EM(V);if(N)N.discoveryTokens=$;return N}catch(V){if(l(V)&&E<y){let N=2**E*1000;await d(N);continue}return null}return null}async compressBatch(S){let M=new Map;for(let f=0;f<S.length;f++){let $=S[f],A=await this.compress($.toolName,$.toolOutput,$.sessionContext);if(M.set($.callId,A),f<S.length-1)await d(200)}return M}createFallbackObservation(S,M){let f=q2(M),$=m2[S]??"discovery";return{type:$,title:`${S} execution`,subtitle:M.substring(0,100).replace(/\n/g," "),facts:[],narrative:`Tool ${S} was executed. Output length: ${M.length} chars.`,concepts:[],filesRead:$==="discovery"?f:[],filesModified:$==="change"?f:[],discoveryTokens:u(M),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 m2={Read:"discovery",Write:"change",Edit:"change",Bash:"change",Glob:"discovery",Grep:"discovery"},h2=/(?:^|\s)((?:\.\/|\/|src\/|tests\/|lib\/)\S+\.\w+)/gm;function q2(S){let M=[];for(let f of S.matchAll(h2))M.push(f[1]);return[...new Set(M)]}import{generateText as P2}from"ai";class qS{model;config;_generate=P2;constructor(S){if(this.config=S,this.model=null,S.provider==="bedrock"||S.apiKey)try{this.model=q({provider:S.provider,model:S.model,apiKey:S.apiKey},h(S))}catch{}}async evaluate(S,M){if(!this.model||M.length===0)return null;let f=WM(S,M),$=2;for(let A=0;A<=$;A++)try{if(this.config.provider==="google")await P(this.config.model,this.config.rateLimitingEnabled);let{text:O}=await this._generate({model:this.model,maxOutputTokens:512,prompt:f});return BM(O)}catch(O){if(l(O)&&A<$){let y=2**A*1000;await d(y);continue}return null}return null}}import{generateText as v2}from"ai";class PS{model;config;_generate=v2;constructor(S){if(this.config=S,this.model=null,S.provider==="bedrock"||S.apiKey)try{this.model=q({provider:S.provider,model:S.model,apiKey:S.apiKey},h(S))}catch{}}async extract(S){if(!this.model)return null;let M=XM(S),f=2;for(let $=0;$<=f;$++)try{if(this.config.provider==="google")await P(this.config.model,this.config.rateLimitingEnabled);let{text:A}=await this._generate({model:this.model,maxOutputTokens:1024,prompt:M});return QM(A)}catch(A){if(l(A)&&$<f){let O=2**$*1000;await d(O);continue}return null}return null}}import{generateText as c2}from"ai";class vS{model;config;_generate=c2;constructor(S){this.config=S,this.model=null;let M=S.provider!=="bedrock";if(S.compressionEnabled&&(!M||S.apiKey))try{this.model=q({provider:S.provider,model:S.model,apiKey:S.apiKey},h(S))}catch{}}async summarize(S,M){if(M.length===0)return null;if(!this.config.compressionEnabled||!this.model)return this.createFallbackSummary(M);let f=RM(M.map(($)=>({type:$.type,title:$.title,narrative:$.narrative})),S);try{if(this.config.provider==="google")await P(this.config.model,this.config.rateLimitingEnabled);let{text:$}=await this._generate({model:this.model,maxOutputTokens:this.config.maxTokensPerCompression,prompt:f}),A=VM($);if(!A)return this.createFallbackSummary(M);return A}catch{return this.createFallbackSummary(M)}}createFallbackSummary(S){let M=new Set,f=new Set,$=[];for(let E of S){for(let V of E.filesModified)M.add(V);for(let V of E.concepts)f.add(V);if(E.type==="decision")$.push(E.title)}let A=new Map;for(let E of S)A.set(E.type,(A.get(E.type)??0)+1);let O=Array.from(A.entries()).map(([E,V])=>`${V} ${E}${V>1?"s":""}`).join(", "),y=Array.from(f).slice(0,5).join(", ");return{summary:`Session with ${S.length} observations: ${O}. Files modified: ${M.size}. Key concepts: ${y}.`,keyDecisions:$.slice(0,5),filesModified:Array.from(M),concepts:Array.from(f)}}shouldSummarize(S){return S>=2}}LS();import{randomUUID as wM}from"crypto";var l2={showTokenCosts:!0,observationTypes:"all",fullObservationCount:3,showLastSummary:!0},z0={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function b0(S,M=l2){let f=[];if(f.push("## open-mem: Past Session Memory"),f.push(""),f.push("**\uD83D\uDCA1 Progressive Disclosure:** This is a compact index showing WHAT was observed and retrieval COST."),f.push("Use `mem-find` to find observations by query, then `mem-get` with IDs to fetch full details."),f.push(""),f.push("**3-Layer Memory Access:**"),f.push("- **Layer 1** `mem-find` \u2014 Find observations by query (returns IDs + summaries)"),f.push("- **Layer 2** `mem-history` \u2014 Browse session history and drill into sessions"),f.push("- **Layer 3** `mem-get` \u2014 Get full details by ID (use IDs from search results or the index below)"),f.push(""),f.push("**\uD83D\uDCDD When to Save (`mem-create`):** Proactively save decisions + rationale, non-obvious gotchas/workarounds, user preferences, and cross-session plans. Auto-capture handles tool executions \u2014 use `mem-create` for insights auto-capture can't understand the significance of. Wrap sensitive content in `<private>` tags to exclude from memory. Call `mem-help` for detailed guidance."),M.showLastSummary&&S.recentSummaries.length>0){f.push(""),f.push("### Recent Sessions"),f.push("| Session | Summary | Decisions |"),f.push("|---------|---------|-----------|");for(let y of S.recentSummaries){let E=y.keyDecisions.length>0?y.keyDecisions.join("; "):"\u2014";f.push(`| ${y.sessionId} | ${y.summary} | ${E} |`)}}let $=M.observationTypes==="all"?S.observationIndex:S.observationIndex.filter((y)=>M.observationTypes.includes(y.type));if($.length>0){f.push(""),f.push(`### Recent Observations (${$.length} entries)`);let y=b2($,S.fullObservations);for(let[E,V]of y){if(f.push(""),f.push(`**${E}**`),M.showTokenCosts)f.push("| ID | Type | Title | ~Tokens |"),f.push("|----|------|-------|---------|");else f.push("| ID | Type | Title |"),f.push("|----|------|-------|");for(let N of V){let J=z0[N.type]||"\uD83D\uDCDD";if(M.showTokenCosts)f.push(`| ${N.id} | ${J} | ${N.title} | ~${N.tokenCount} |`);else f.push(`| ${N.id} | ${J} | ${N.title} |`)}}}let A=S.fullObservations.slice(0,M.fullObservationCount);if(A.length>0){f.push(""),f.push("### Full Details (most recent)");for(let y of A){let E=z0[y.type]||"\uD83D\uDCDD";if(f.push(""),f.push(`#### ${E} ${y.title} (${y.id})`),f.push(y.narrative),y.facts.length>0)f.push(`**Facts:** ${y.facts.map((N)=>`- ${N}`).join(" ")}`);if(y.concepts.length>0)f.push(`**Concepts:** ${y.concepts.join(", ")}`);let V=[...y.filesRead,...y.filesModified];if(V.length>0)f.push(`**Files:** ${V.join(", ")}`)}}let O=p2(S);if(O)f.push(""),f.push(O);return f.join(`
162
+ `)}function p2(S){let M=0,f=0,$=new Set(S.observationIndex.map((y)=>y.id));for(let y of S.observationIndex)M+=y.tokenCount,f+=y.discoveryTokens;for(let y of S.fullObservations)if(!$.has(y.id))M+=y.tokenCount,f+=y.discoveryTokens;if(f===0)return null;let A=f-M,O=Math.max(0,Math.round(A/f*100));return`### \uD83D\uDCB0 Memory Economics
163
+ **Read cost:** ~${M}t | **Discovery cost:** ~${f}t | **Savings:** ${O}% (${A}t saved)`}function b2(S,M){let f=new Map;for(let A of M){let O=A.filesModified[0]||A.filesRead[0];if(O)f.set(A.id,O)}let $=new Map;for(let A of S){let O=f.get(A.id)??"General",y=$.get(O)??[];y.push(A),$.set(O,y)}return $}function n0(S){let M=[];if(M.push("[open-mem] Memory context:"),S.recentSummaries.length>0){M.push(`
164
+ Recent sessions:`);for(let f of S.recentSummaries)M.push(`- ${f.summary}`)}if(S.observationIndex.length>0){M.push(`
165
+ Recent observations (${S.observationIndex.length} entries):`);for(let f of S.observationIndex)M.push(`- ${z0[f.type]||"\uD83D\uDCDD"} ${f.title}`)}return M.join(`
166
+ `)}function r0(S,M){if(S.length===0)return"";let f=M,$=[];for(let O of S){let y=O.tokenCount||u(O.title);if(f-y<0)break;$.push(O),f-=y}if($.length===0)return"";let A=[];A.push("### Cross-Project Memory"),A.push(""),A.push("| ID | Type | Title | ~Tokens |"),A.push("|----|------|-------|---------|");for(let O of $){let y=z0[O.type]||"\uD83D\uDCDD";A.push(`| ${O.id} | ${y} | ${O.title} | ~${O.tokenCount} |`)}return A.join(`
167
+ `)}function i0(S,M){if(S.length===0)return"";let f=M,$=[];for(let O of S){let y=O.tokenCount||u(O.title);if(f-y<0)break;$.push(O),f-=y}if($.length===0)return"";let A=[];A.push(`
168
+ Cross-project observations (${$.length} entries):`);for(let O of $)A.push(`- ${z0[O.type]||"\uD83D\uDCDD"} ${O.title}`);return A.join(`
169
+ `)}var t0={recency:0.4,typeImportance:0.3,sessionAffinity:0.2,tokenEfficiency:0.1},n2={decision:1,bugfix:0.9,feature:0.8,refactor:0.6,discovery:0.5,change:0.4};function r2(S,M){let f=new Date(S),A=(M.getTime()-f.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 i2(S){return n2[S]??0.3}function t2(S,M){if(!M)return 0.5;return S===M?1:0.3}function d2(S){if(S<=10)return 1;if(S>=200)return 0.2;return 1-(S-10)/190*0.8}function s2(S,M){let f=r2(S.createdAt,M.now),$=i2(S.type),A=t2(S.sessionId,M.currentSessionId),O=d2(S.tokenCount);return f*t0.recency+$*t0.typeImportance+A*t0.sessionAffinity+O*t0.tokenEfficiency}function UM(S,M){let f=new Map;for(let $ of S)f.set($.id,s2($,M));return[...S].sort(($,A)=>{let O=f.get($.id)??0,y=f.get(A.id)??0;if(y!==O)return y-O;return new Date(A.createdAt).getTime()-new Date($.createdAt).getTime()})}function $0(S,M,f,$,A=[],O){let y=$,E=[],V=[];for(let J of M){let B=J.tokenCount||u(J.summary);if(y-B<0)break;E.push(J),y-=B}let N=O?UM(f,O):f;for(let J of N){let B=J.tokenCount||u(J.title);if(y-B<0)break;V.push(J),y-=B}return{recentSummaries:E,observationIndex:V,fullObservations:[...A],totalTokens:$-y}}import{existsSync as iS}from"fs";import{readdir as N$,readFile as uM,unlink as rS,writeFile as TM}from"fs/promises";import{join as tS,resolve as dS}from"path";import{existsSync as LM}from"fs";import{mkdir as a2,readFile as e2,rename as o2,unlink as S$,writeFile as M$}from"fs/promises";import{dirname as d0,isAbsolute as pS,join as U0,normalize as f$,relative as bS,resolve as O0,sep as cS}from"path";var A0="<!-- open-mem-context -->",s="<!-- /open-mem-context -->",CM={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"},DM=new Map,$$=new Set(["node_modules",".git","dist","coverage",".open-mem","build","__pycache__",".next",".nuxt"]);async function s0(S,M,f){if(M.length===0)return;if(f.mode==="single")return A$(S,M,f);let{maxDepth:$,filename:A}=f,O=[];for(let V of M){for(let N of V.filesModified)O.push(N);for(let N of V.filesRead)O.push(N)}let y=HM(O,S,$);if(y.size===0)return;let E=FM(M,y,S);for(let[V,N]of E)try{let J=O$(V,N,S);await GM(V,J,A)}catch(J){console.error(`[open-mem] Failed to update AGENTS.md in ${V}:`,J)}}async function A$(S,M,f){let{maxDepth:$,filename:A}=f,O=M.filter(lS);if(O.length===0)return;let y=[];for(let _ of O){for(let W of _.filesModified)y.push(W);for(let W of _.filesRead)y.push(W)}let E=HM(y,S,$),V=FM(O,E,S),N=O.filter((_)=>{return[..._.filesModified,..._.filesRead].some((R)=>{if(!R)return!1;let X=pS(R)?R:U0(S,R);return O0(d0(X))===O0(S)})});if(N.length>0)V.set(O0(S),N);if(V.size===0)return;let J=[];J.push("## Project Activity (auto-generated by open-mem)"),J.push("");let B=[...V.entries()].map(([_,W])=>({relPath:bS(S,_)||".",observations:W})).sort((_,W)=>_.relPath.localeCompare(W.relPath));for(let{relPath:_,observations:W}of B){let R=W.filter(lS).sort((L,C)=>C.createdAt.localeCompare(L.createdAt)).slice(0,10);if(R.length===0)continue;J.push(`### ${_}/`),J.push("| ID | Type | Title | Date |"),J.push("|----|------|-------|------|");for(let L of R){let C=CM[L.type]||"\uD83D\uDCDD",U=L.createdAt.split("T")[0],j=L.title.replace(/\|/g,"\\|");J.push(`| ${L.id} | ${C} ${L.type} | ${j} | ${U} |`)}let X=new Set;for(let L of R)for(let C of L.concepts)X.add(C);if(X.size>0){let L=[...X].slice(0,10).join(", ");J.push(""),J.push(`**Key concepts:** ${L}`)}let z=R.filter((L)=>L.type==="decision").map((L)=>L.title);if(z.length>0)J.push(""),J.push(`**Recent decisions:** ${z.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 Q=J.join(`
170
+ `);await GM(S,Q,A)}function lS(S){return!/^\w[\w-]*\s+execution$/i.test(S.title)}function O$(S,M,f){let $=[...M].filter(lS).sort((N,J)=>J.createdAt.localeCompare(N.createdAt)).slice(0,10),A=bS(f,S)||".",O=[];O.push(`## Recent Activity in \`${A}/\` (auto-generated by open-mem)`),O.push(""),O.push("| ID | Type | Title | Date |"),O.push("|----|------|-------|------|");for(let N of $){let J=CM[N.type]||"\uD83D\uDCDD",B=N.createdAt.split("T")[0],Q=N.title.replace(/\|/g,"\\|");O.push(`| ${N.id} | ${J} ${N.type} | ${Q} | ${B} |`)}let y=new Set;for(let N of $)for(let J of N.concepts)y.add(J);if(y.size>0){let N=[...y].slice(0,10).join(", ");O.push(""),O.push(`**Key concepts:** ${N}`)}let E=$.filter((N)=>N.type==="decision").map((N)=>N.title);if(E.length>0)O.push(""),O.push(`**Recent decisions:** ${E.slice(0,5).join("; ")}`);let V=$.filter((N)=>N.type==="decision"&&N.narrative).slice(0,3);if(V.length>0){O.push(""),O.push("**Decision details:**");for(let N of V){let J=N.narrative.split(/[.!?]\s/)[0],B=J.length>120?`${J.slice(0,117)}...`:J;O.push(`- \u2696\uFE0F ${N.title}: ${B}`)}}return O.push(""),O.push("\uD83D\uDCA1 *Use `mem-find` to search full details across all sessions. Use `mem-create` to save important decisions.*"),O.join(`
171
+ `)}async function GM(S,M,f){if(!LM(S))return;let A=(DM.get(S)??Promise.resolve()).then(async()=>{let O=U0(S,f),y=U0(S,`.${f}.tmp`),E="";try{E=await e2(O,"utf-8")}catch{}let V=y$(E,M);try{await a2(d0(y),{recursive:!0}),await M$(y,V,"utf-8"),await o2(y,O)}catch(N){try{await S$(y)}catch{}throw N}});return DM.set(S,A.catch(()=>{})),A}function y$(S,M){if(!S)return`${A0}
172
+ ${M}
173
+ ${s}
174
+ `;let f=S.indexOf(A0),$=S.indexOf(s);if(f!==-1&&$!==-1&&$>f){let O=S.substring(0,f),y=S.substring($+s.length);return`${O}${A0}
175
+ ${M}
176
+ ${s}${y}`}let A=S;if(f!==-1&&$===-1)A=A.replace(A0,"").trim();else if(f===-1&&$!==-1)A=A.replace(s,"").trim();else if(f!==-1&&$!==-1&&$<=f)A=A.replace(s,"").replace(A0,"").trim();return`${A}
177
+
178
+ ${A0}
179
+ ${M}
180
+ ${s}
181
+ `}function HM(S,M,f){let $=new Set,A=O0(M);for(let O of S){if(!O||!O.trim())continue;if(O.startsWith("~")||O.startsWith("http"))continue;let y=pS(O)?O:U0(M,O),E=d0(y),V=O0(E);if(!V.startsWith(A+cS)&&V!==A)continue;if(V===A)continue;let N=bS(A,V);if(N.split(cS).length>f)continue;if(f$(N).split(cS).some((Q)=>$$.has(Q)))continue;if(!LM(V))continue;$.add(V)}return $}function FM(S,M,f){let $=new Map;for(let A of S){let O=[...A.filesModified,...A.filesRead],y=new Set;for(let E of O){if(!E)continue;let V=pS(E)?E:U0(f,E),N=O0(d0(V));if(M.has(N))y.add(N)}for(let E of y){let V=$.get(E)??[];V.push(A),$.set(E,V)}}return $}var nS="<!-- open-mem-context -->",a0="<!-- /open-mem-context -->";async function jM(S,M,f){let $;try{$=await N$(S,{withFileTypes:!0,encoding:"utf8"})}catch{return}for(let A of $){let O=String(A.name);if(O===".git"||O==="node_modules"||O===".open-mem"||O==="dist")continue;let y=tS(S,O);if(A.isDirectory())await jM(y,M,f);else if(A.isFile()&&O===M)f.push(y)}}async function sS(S,M){let f=dS(S),$=[];return await jM(f,M,$),$}function xM(S){let M=S.indexOf(nS),f=S.indexOf(a0);if(M===-1&&f===-1)return S;if(M!==-1&&f===-1){let O=S.replace(nS,"").trim();return O?`${O}
182
+ `:""}if(M===-1&&f!==-1){let O=S.replace(a0,"").trim();return O?`${O}
183
+ `:""}if(f<=M){let O=S.replace(nS,"").replace(a0,"").trim();return O?`${O}
184
+ `:""}let $=S.slice(0,M).trimEnd(),A=S.slice(f+a0.length).trimStart();if(!$&&!A)return"";if(!$)return`${A}
185
+ `;if(!A)return`${$}
186
+ `;return`${$}
177
187
 
178
- ${M0}
179
- ${E}
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}
186
- `;return`${M}
187
-
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+=`
190
-
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(`
188
+ ${A}
189
+ `}async function kM(S,M,f=!1){let $=await sS(S,M),A=0;for(let O of $){let y=await uM(O,"utf-8"),E=xM(y);if(E!==y){if(A+=1,!f)if(E==="")await rS(O);else await TM(O,E,"utf-8")}}if(M){let O=tS(dS(S),M);if(iS(O))try{let y=await uM(O,"utf-8"),E=xM(y);if(E!==y){if(A+=1,!f)if(E==="")await rS(O);else await TM(O,E,"utf-8")}if(!$.includes(O))$.push(O)}catch{}}return{files:$,changed:A}}async function IM(S,M){let f=await sS(S,M);if(M){let A=tS(dS(S),M);if(iS(A)&&!f.includes(A))f.push(A)}let $=0;for(let A of f)try{await rS(A),$++}catch{}return{deleted:$,files:f}}async function gM(S,M,f,$,A=!1){let y=M.getAll(S).flatMap((V)=>f.getBySession(V.id));if(A){let V=new Set;for(let N of y)for(let J of[...N.filesRead,...N.filesModified])V.add(J);return{observations:y.length,filesTouched:V.size}}if(!iS(S))return{observations:0,filesTouched:0};await s0(S,y,{maxDepth:$.maxDepth,mode:$.mode,filename:$.filename});let E=await sS(S,$.filename);return{observations:y.length,filesTouched:E.length}}class aS{observations;sessions;summaries;searchOrchestrator;projectPath;config;userObservationRepo;runtimeSnapshotProvider;configAuditStore;maintenanceHistoryStore;configAuditLogFallback=[];maintenanceLogFallback=[];constructor(S){this.observations=S.observations,this.sessions=S.sessions,this.summaries=S.summaries,this.searchOrchestrator=S.searchOrchestrator,this.projectPath=S.projectPath,this.config=S.config,this.userObservationRepo=S.userObservationRepo??null,this.runtimeSnapshotProvider=S.runtimeSnapshotProvider??null,this.configAuditStore=S.configAuditStore??null,this.maintenanceHistoryStore=S.maintenanceHistoryStore??null}getByIdIncludingArchived(S){let M=this.observations;return M.getByIdIncludingArchived?M.getByIdIncludingArchived(S):this.observations.getById(S)}listByProjectWithState(S){let M=this.observations;if(M.listByProject)return M.listByProject(this.projectPath,S);if(S.state!=="current")return[];return this.listObservations({limit:S.limit,offset:S.offset,type:S.type,sessionId:S.sessionId})}async ingest(S){}async processPending(S){return 0}async search(S,M={}){return this.searchOrchestrator.search(S,{type:M.type,limit:M.limit??10,projectPath:this.projectPath,importanceMin:M.importanceMin,importanceMax:M.importanceMax,createdAfter:M.after,createdBefore:M.before,concepts:M.concepts,files:M.files})}async timeline(S={}){if(S.anchor){let f=this.observations.getById(S.anchor);if(!f)return[];let $=S.depthBefore??5,A=S.depthAfter??5,O=this.observations.getAroundTimestamp(f.createdAt,$,A,this.projectPath),y=[...O.filter((V)=>V.createdAt<f.createdAt),f,...O.filter((V)=>V.createdAt>f.createdAt)];return[{session:this.sessions.getById(f.sessionId)??{id:f.sessionId,projectPath:this.projectPath,startedAt:f.createdAt,endedAt:null,status:"completed",observationCount:0,summaryId:null},summary:null,observations:y}]}if(S.sessionId){let f=this.sessions.getById(S.sessionId);if(!f)return[];return[{session:f,summary:this.summaries.getBySessionId(f.id),observations:this.observations.getBySession(f.id)}]}return this.sessions.getRecent(this.projectPath,S.limit??5).map((f)=>({session:f,summary:this.summaries.getBySessionId(f.id),observations:[]}))}async recall(S,M=10){let f=[];for(let $ of S.slice(0,M)){let A=this.observations.getById($);if(A){f.push(A);continue}if(!this.userObservationRepo)continue;let O=this.userObservationRepo.getById($);if(!O)continue;f.push({...O,sessionId:"",rawToolOutput:"",discoveryTokens:0})}return f}async save(S){if(S.scope==="user"){if(!this.userObservationRepo)return null;return{...this.userObservationRepo.create({type:S.type,title:S.title,subtitle:"",facts:[],narrative:S.narrative,concepts:S.concepts??[],filesRead:[],filesModified:S.files??[],toolName:"mem-create",tokenCount:u(`${S.title} ${S.narrative}`),importance:S.importance??3,sourceProject:this.projectPath}),sessionId:"",rawToolOutput:"",discoveryTokens:0}}this.sessions.getOrCreate(S.sessionId,this.projectPath);let M=this.observations.create({sessionId:S.sessionId,type:S.type,title:S.title,subtitle:"",facts:[],narrative:S.narrative,concepts:S.concepts??[],filesRead:[],filesModified:S.files??[],rawToolOutput:`[Manual save] ${S.narrative}`,toolName:"mem-create",tokenCount:u(`${S.title} ${S.narrative}`),discoveryTokens:0,importance:S.importance??3});return this.sessions.incrementObservationCount(S.sessionId),M}async update(S){let M=this.observations.getById(S.id);if(!M)return null;let f=this.sessions.getById(M.sessionId);if(!f||f.projectPath!==this.projectPath)return null;let{id:$,...A}=S;return this.observations.update(S.id,A)??null}async delete(S){let M=0;for(let f of S){let $=this.observations.getById(f);if(!$)continue;let A=this.sessions.getById($.sessionId);if(!A||A.projectPath!==this.projectPath)continue;if(this.observations.delete(f))M+=1}return M}async export(S,M={}){if(S!=="project")throw Error("Only project scope export is supported.");let f=this.sessions.getAll(this.projectPath),$=[];for(let E of f)$.push(...this.observations.getBySession(E.id));if(M.type)$=$.filter((E)=>E.type===M.type);if($.sort((E,V)=>new Date(E.createdAt).getTime()-new Date(V.createdAt).getTime()),M.limit&&M.limit<$.length)$=$.slice(0,M.limit);let A=$.map(({rawToolOutput:E,...V})=>V),O=f.map((E)=>this.summaries.getBySessionId(E.id)).filter((E)=>E!==null);return{version:1,exportedAt:new Date().toISOString(),project:this.projectPath,observations:A,summaries:O}}async import(S,M={}){let f;try{f=JSON.parse(S)}catch{throw Error("Invalid JSON payload.")}if(typeof f!=="object"||f===null)throw Error("Invalid import payload.");let $=f;if($.version!==1||!Array.isArray($.observations))throw Error("Unsupported export format.");let A=M.mode??"skip-duplicates",O=0,y=0;for(let E of $.observations){let V=this.observations.getById(E.id);if(V&&A==="skip-duplicates"){y+=1;continue}if(V&&A==="overwrite")this.observations.delete(E.id);this.sessions.getOrCreate(E.sessionId,this.projectPath),this.observations.importObservation({id:E.id,sessionId:E.sessionId,type:E.type,title:E.title,subtitle:E.subtitle??"",facts:E.facts??[],narrative:E.narrative??"",concepts:E.concepts??[],filesRead:E.filesRead??[],filesModified:E.filesModified??[],rawToolOutput:E.rawToolOutput??"",toolName:E.toolName??"unknown",createdAt:E.createdAt,tokenCount:E.tokenCount??0,discoveryTokens:E.discoveryTokens??0,importance:E.importance??3,supersededBy:E.supersededBy??null,supersededAt:E.supersededAt??null}),this.sessions.incrementObservationCount(E.sessionId),O+=1}for(let E of $.summaries??[]){let V=this.summaries.getBySessionId(E.sessionId);if(V&&A==="skip-duplicates")continue;if(V&&A==="overwrite")continue;this.sessions.getOrCreate(E.sessionId,this.projectPath),this.summaries.importSummary(E),this.sessions.setSummary(E.sessionId,E.id)}return{imported:O,skipped:y}}async buildContext(S,M="normal"){let f=this.sessions.getRecent(this.projectPath,5),$=f.map((J)=>J.summaryId?this.summaries.getBySessionId(J.id):null).filter((J)=>J!==null),A=this.observations.getIndex(this.projectPath,this.config.maxObservations),y=A.slice(0,this.config.contextFullObservationCount).map((J)=>J.id).map((J)=>this.observations.getById(J)).filter((J)=>J!==null),E=$0(f,$,A,this.config.maxContextTokens,y);if(M==="compaction"){let J=n0(E);if(this.config.userMemoryEnabled&&this.userObservationRepo)J+=i0(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},N=b0(E,V);if(this.config.userMemoryEnabled&&this.userObservationRepo){let J=r0(this.userObservationRepo.getIndex(this.config.maxObservations),this.config.userMemoryMaxContextTokens);if(J)N+=`
190
+
191
+ ${J}`}return N}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(S){let{limit:M=50,offset:f=0,type:$,sessionId:A,state:O}=S;if(O)return this.listByProjectWithState({limit:M,offset:f,type:$,state:O,sessionId:A});if(A){let V=this.observations.getBySession(A);if($)V=V.filter((N)=>N.type===$);return V.slice(f,f+M)}let E=this.observations.getIndex(this.projectPath,f+M).slice(f);if($)E=E.filter((V)=>V.type===$);return E.map((V)=>this.observations.getById(V.id)).filter((V)=>V!==null)}getObservation(S){return this.observations.getById(S)}getLineage(S){let f=this.getByIdIncludingArchived(S);if(!f)return null;let $=f,A=0,O=new Set([f.id]);while($.revisionOf&&A<256){let J=this.getByIdIncludingArchived($.revisionOf);if(!J||O.has(J.id))break;$=J,O.add(J.id),A+=1}let y=[],E=$,V=new Set,N=0;while(E&&!V.has(E.id)&&N<256){V.add(E.id);let J=E.deletedAt?"tombstoned":E.supersededBy?"superseded":"current";y.push({id:E.id,revisionOf:E.revisionOf??null,supersededBy:E.supersededBy??null,supersededAt:E.supersededAt??null,deletedAt:E.deletedAt??null,state:J,observation:E}),E=E.supersededBy?this.getByIdIncludingArchived(E.supersededBy):null,N+=1}return y}listSessions(S){return this.sessions.getRecent(S.projectPath??this.projectPath,S.limit??20)}getSession(S){let M=this.sessions.getById(S);if(!M)return null;return{session:M,summary:this.summaries.getBySessionId(S),observations:this.observations.getBySession(S)}}stats(){let S=this.observations.getCount(),f=this.sessions.getAll(this.projectPath).length,$=this.observations.getIndex(this.projectPath,1e4),A=0,O=0,y={};for(let N of $)A+=N.tokenCount,O+=N.discoveryTokens,y[N.type]=(y[N.type]||0)+1;let E=O-A,V=$.length>0?Math.round(A/$.length):0;return{totalObservations:S,totalSessions:f,totalTokensSaved:E,averageObservationSize:V,typeBreakdown:y}}async maintainFolderContext(S,M){if(S==="purge")return{action:"purge",dryRun:!1,...await IM(this.projectPath,this.config.folderContextFilename)};if(S==="rebuild"){let $=await gM(this.projectPath,this.sessions,this.observations,{maxDepth:this.config.folderContextMaxDepth,mode:this.config.folderContextMode,filename:this.config.folderContextFilename},M);return{action:S,dryRun:M,...$}}let f=await kM(this.projectPath,this.config.folderContextFilename,M);return{action:"clean",dryRun:M,...f}}getRevisionDiff(S,M){let f=this.getByIdIncludingArchived(S),$=this.getByIdIncludingArchived(M);if(!f||!$)return null;let A=[],O=(E,V,N)=>{if(JSON.stringify(V)!==JSON.stringify(N))A.push({field:E,before:V,after:N})};O("title",$.title,f.title),O("subtitle",$.subtitle,f.subtitle),O("narrative",$.narrative,f.narrative),O("type",$.type,f.type),O("facts",$.facts,f.facts),O("concepts",$.concepts,f.concepts),O("filesRead",$.filesRead,f.filesRead),O("filesModified",$.filesModified,f.filesModified),O("importance",$.importance,f.importance);let y=A.length===0?"No material changes between revisions.":`Changed ${A.length} field${A.length===1?"":"s"}: ${A.map((E)=>E.field).join(", ")}.`;return{fromId:M,toId:S,summary:y,changedFields:A}}getHealth(){let S=this.runtimeSnapshotProvider?.(),M=S?.queue.lastError?"degraded":"ok";return{status:S?.status??"ok",timestamp:S?.timestamp??new Date().toISOString(),components:{database:{status:"ok"},search:{status:"ok"},config:{status:"ok"},queue:{status:M,detail:S?.queue.lastError??void 0}}}}getMetrics(){let S=this.stats();return{timestamp:this.runtimeSnapshotProvider?.()?.timestamp??new Date().toISOString(),memory:{totalObservations:S.totalObservations,totalSessions:S.totalSessions,totalTokensSaved:S.totalTokensSaved,averageObservationSize:S.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 S={opencode:this.config.platformOpenCodeEnabled??!0,"claude-code":this.config.platformClaudeCodeEnabled??!1,cursor:this.config.platformCursorEnabled??!1};return[{name:"opencode",version:"1.0",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!1}},{name:"claude-code",version:"0.1",capabilities:{nativeSessionLifecycle:!0,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}},{name:"cursor",version:"0.1",capabilities:{nativeSessionLifecycle:!1,nativeToolCapture:!0,nativeChatCapture:!0,emulatedIdleFlush:!0}}].map((f)=>({name:f.name,version:f.version,enabled:S[f.name]??!1,capabilities:f.capabilities}))}getConfigAuditTimeline(){if(this.configAuditStore)return this.configAuditStore.list();return[...this.configAuditLogFallback].reverse()}trackConfigAudit(S){if(this.configAuditStore){this.configAuditStore.append(S);return}this.configAuditLogFallback.push(S)}async rollbackConfig(S){let M=this.configAuditStore?this.configAuditStore.getById(S):this.configAuditLogFallback.find((O)=>O.id===S)??null;if(!M)return null;if(!M.previousValues||typeof M.previousValues!=="object")return null;let{patchConfig:f}=await Promise.resolve().then(() => (FS(),MM)),$=M.previousValues;try{await f(this.projectPath,$)}catch(O){let y={id:`rollback-failed-${wM()}`,timestamp:new Date().toISOString(),patch:M.previousValues,previousValues:M.patch,source:"rollback-failed"};throw this.trackConfigAudit(y),O}let A={id:`rollback-${wM()}`,timestamp:new Date().toISOString(),patch:M.previousValues,previousValues:M.patch,source:"rollback"};return this.trackConfigAudit(A),A}getMaintenanceHistory(){if(this.maintenanceHistoryStore)return this.maintenanceHistoryStore.list();return[...this.maintenanceLogFallback].reverse()}trackMaintenanceResult(S){if(this.maintenanceHistoryStore){this.maintenanceHistoryStore.append(S);return}this.maintenanceLogFallback.push(S)}}import{existsSync as W$}from"fs";import{existsSync as E$}from"fs";import{homedir as V$}from"os";import{join as mM}from"path";function J$(){let S=[],M=process.env.BUN_INSTALL;if(M)S.push(mM(M,"bin","bun"));let f=V$();return S.push(mM(f,".bun","bin","bun")),S.push("/usr/local/bin/bun"),S.push("/opt/homebrew/bin/bun"),S.push("/home/linuxbrew/.linuxbrew/bin/bun"),S}function B$(){let S=Bun.which("bun");if(S)return S;for(let M of J$())if(E$(M))return console.debug(`[open-mem] Resolved bun path via candidate scan: ${M}`),M;return"bun"}var eS=null;function hM(){if(eS===null)eS=B$();return eS}import{existsSync as Q$,mkdirSync as vN,readFileSync as _$,unlinkSync as R$,writeFileSync as cN}from"fs";function a(S){if(!Q$(S))return null;let M=_$(S,"utf-8").trim(),f=Number.parseInt(M,10);if(Number.isNaN(f))return null;return f}function y0(S){try{return process.kill(S,0),!0}catch(M){if(M instanceof Error&&"code"in M&&M.code==="EPERM")return!0;return!1}}function D0(S){try{R$(S)}catch{}}function e0(S){let M=S.lastIndexOf("/");if(M>=0)return`${S.substring(0,M)}/worker.pid`;return"worker.pid"}var X$=100,K$=2000;class oS{pidPath;projectPath;daemonScript;subprocess=null;constructor(S){this.pidPath=e0(S.dbPath),this.projectPath=S.projectPath,this.daemonScript=S.daemonScript}start(){if(this.isRunning())return!1;this.subprocess=Bun.spawn([hM(),"run",this.daemonScript,"--project",this.projectPath],{detached:!0,stdio:["ignore","ignore","ignore"],ipc(M){}}),this.subprocess.unref();let S=Date.now()+K$;while(Date.now()<S)if(Bun.sleepSync(X$),W$(this.pidPath)){let M=a(this.pidPath);if(M!==null&&y0(M))return!0}return!1}signal(S){try{this.subprocess?.send(S)}catch{}}stop(){let S=a(this.pidPath);if(S!==null)try{process.kill(S,"SIGTERM")}catch{}this.subprocess=null,D0(this.pidPath)}isRunning(){let S=a(this.pidPath);if(S===null)return!1;return y0(S)}getStatus(){let S=a(this.pidPath);if(S===null)return{running:!1,pid:null};if(!y0(S))return{running:!1,pid:null};return{running:!0,pid:S}}}import{existsSync as S1}from"fs";function qM(S){let M={reaped:0,errors:[]};try{let f=e0(S),$=a(f);if($===null){try{if(S1(f))if(D0(f),!S1(f))M.reaped++,console.log("[open-mem] Reaped corrupt daemon PID file");else M.errors.push("Failed to remove corrupt PID file: file still exists after removal")}catch(A){M.errors.push(`Failed to check/remove corrupt PID file: ${A instanceof Error?A.message:String(A)}`)}return M}if(y0($))return M;if(D0(f),!S1(f))M.reaped++,console.log(`[open-mem] Reaped stale daemon PID file (pid=${$})`);else M.errors.push(`Failed to remove stale PID file (pid=${$}): file still exists after removal`)}catch(f){M.errors.push(`Reaper error: ${f instanceof Error?f.message:String(f)}`)}return M}function o0(S){try{let M=JSON.parse(S);return M&&typeof M==="object"?M:{}}catch{return{}}}class M1{db;constructor(S){this.db=S}list(){return this.db.all("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events ORDER BY timestamp DESC").map((S)=>({id:S.id,timestamp:S.timestamp,patch:o0(S.patch),previousValues:o0(S.previous_values),source:S.source}))}getById(S){let M=this.db.get("SELECT id, timestamp, patch, previous_values, source FROM config_audit_events WHERE id = ?",[S]);if(!M)return null;return{id:M.id,timestamp:M.timestamp,patch:o0(M.patch),previousValues:o0(M.previous_values),source:M.source}}append(S){this.db.run("INSERT INTO config_audit_events (id, timestamp, patch, previous_values, source) VALUES (?, ?, ?, ?, ?)",[S.id,S.timestamp,JSON.stringify(S.patch??{}),JSON.stringify(S.previousValues??{}),S.source])}}import{Database as PM}from"bun:sqlite";import{existsSync as f1,mkdirSync as Z$,unlinkSync as vM}from"fs";import*as cM from"sqlite-vec";class SS{db;dbPath;_hasVectorExtension=!1;static enableExtensionSupport(){let S=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite/lib/libsqlite3.dylib"];for(let M of S)try{if(f1(M))return PM.setCustomSQLite(M),!0}catch{return!1}return!1}constructor(S){this.dbPath=S,this.db=this.open(S),this.configure()}open(S){let M=S.lastIndexOf("/");if(M>0){let f=S.substring(0,M);Z$(f,{recursive:!0})}return new PM(S,{create:!0})}configure(){try{this.applyPragmas(),this.loadExtensions()}catch(S){console.warn("[open-mem] Database configure failed, attempting recovery by removing WAL/SHM files:",S.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(M){console.warn("[open-mem] WAL/SHM cleanup insufficient, recreating database from scratch:",M.message);try{this.db.close()}catch{}this.deleteDatabaseFiles();try{this.db=this.open(this.dbPath),this.applyPragmas(),this.loadExtensions(),console.warn("[open-mem] Recovery successful after full database recreation");return}catch(f){throw console.warn("[open-mem] All recovery attempts failed, filesystem may be broken:",f.message),S}}}}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{cM.load(this.db),this._hasVectorExtension=!0}catch{this._hasVectorExtension=!1}}get hasVectorExtension(){return this._hasVectorExtension}deleteSidecarFiles(){for(let S of["-wal","-shm"]){let M=this.dbPath+S;try{if(f1(M))vM(M)}catch{}}}deleteDatabaseFiles(){this.deleteSidecarFiles();try{if(f1(this.dbPath))vM(this.dbPath)}catch{}}ensureMigrationTable(){this.db.exec(`
193
193
  CREATE TABLE IF NOT EXISTS _migrations (
194
194
  version INTEGER PRIMARY KEY,
195
195
  name TEXT NOT NULL,
196
196
  applied_at TEXT NOT NULL DEFAULT (datetime('now'))
197
197
  )
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)
198
+ `)}migrate(S){this.ensureMigrationTable();let M=this.db.query("SELECT version FROM _migrations ORDER BY version").all(),f=new Set(M.map((A)=>A.version)),$=S.filter((A)=>!f.has(A.version)).sort((A,O)=>A.version-O.version);for(let A of $)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(S,M){let f=this.db.query(S);if(M)f.run(...M);else f.run()}get(S,M){let f=this.db.query(S);return M?f.get(...M):f.get()}all(S,M){let f=this.db.query(S);return M?f.all(...M):f.all()}exec(S){this.db.exec(S)}transaction(S){return this.db.transaction(S)()}close(){this.db.close()}get isOpen(){try{return this.db.query("SELECT 1").get(),!0}catch{return!1}}get raw(){return this.db}}function MS(S){return new SS(S)}import{randomUUID as lM}from"crypto";class $1{db;constructor(S){this.db=S}upsertEntity(S,M){let f=lM(),$=new Date().toISOString();this.db.run(`INSERT INTO entities (id, name, entity_type, first_seen_at, last_seen_at, mention_count)
199
199
  VALUES (?, ?, ?, ?, ?, 1)
200
200
  ON CONFLICT(name, entity_type) DO UPDATE SET
201
201
  mention_count = mention_count + 1,
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
202
+ last_seen_at = ?`,[f,S,M,$,$,$]);let A=this.db.get("SELECT * FROM entities WHERE name = ? AND entity_type = ?",[S,M]);if(!A)throw Error(`Failed to upsert entity: ${S} (${M})`);return this.mapEntityRow(A)}createRelation(S,M,f,$){let A=lM(),O=new Date().toISOString();try{this.db.run(`INSERT OR IGNORE INTO entity_relations
203
203
  (id, source_entity_id, target_entity_id, relationship, observation_id, created_at)
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.*
204
+ VALUES (?, ?, ?, ?, ?, ?)`,[A,S,M,f,$,O])}catch{return null}let y=this.db.get(`SELECT * FROM entity_relations
205
+ WHERE source_entity_id = ? AND target_entity_id = ? AND relationship = ?`,[S,M,f]);return y?this.mapRelationRow(y):null}linkObservation(S,M){this.db.run("INSERT OR IGNORE INTO entity_observations (entity_id, observation_id) VALUES (?, ?)",[S,M])}findByName(S){try{return this.db.all(`SELECT e.*
206
206
  FROM entities e
207
207
  JOIN entities_fts fts ON e._rowid = fts.rowid
208
208
  WHERE entities_fts MATCH ?
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
209
+ ORDER BY rank`,[S]).map((f)=>this.mapEntityRow(f))}catch{return[]}}getRelationsFor(S){return this.db.all(`SELECT * FROM entity_relations
210
+ WHERE source_entity_id = ? OR target_entity_id = ?`,[S,S]).map((f)=>this.mapRelationRow(f))}traverseRelations(S,M=1){let f=Math.min(M,2),$=100,A=new Set,O=[{id:S,currentDepth:0}];A.add(S);while(O.length>0){if(A.size>=100)break;let y=O.shift();if(!y)continue;if(y.currentDepth>=f)continue;let E=this.getRelationsFor(y.id);for(let V of E){let N=V.sourceEntityId===y.id?V.targetEntityId:V.sourceEntityId;if(!A.has(N))A.add(N),O.push({id:N,currentDepth:y.currentDepth+1})}}return A}getObservationsForEntity(S){return this.db.all("SELECT observation_id FROM entity_observations WHERE entity_id = ?",[S]).map((f)=>f.observation_id)}getById(S){let M=this.db.get("SELECT * FROM entities WHERE id = ?",[S]);return M?this.mapEntityRow(M):null}mapEntityRow(S){return{id:S.id,name:S.name,entityType:S.entity_type,firstSeenAt:S.first_seen_at,lastSeenAt:S.last_seen_at,mentionCount:S.mention_count}}mapRelationRow(S){return{id:S.id,sourceEntityId:S.source_entity_id,targetEntityId:S.target_entity_id,relationship:S.relationship,observationId:S.observation_id,createdAt:S.created_at}}}function Y$(S){try{let M=JSON.parse(S);return M&&typeof M==="object"?M:{}}catch{return{}}}class A1{db;constructor(S){this.db=S}list(){return this.db.all("SELECT id, timestamp, action, dry_run, result FROM maintenance_history ORDER BY timestamp DESC").map((S)=>({id:S.id,timestamp:S.timestamp,action:S.action,dryRun:S.dry_run===1,result:Y$(S.result)}))}append(S){this.db.run("INSERT INTO maintenance_history (id, timestamp, action, dry_run, result) VALUES (?, ?, ?, ?, ?)",[S.id,S.timestamp,S.action,S.dryRun?1:0,JSON.stringify(S.result??{})])}}import{randomUUID as U$}from"crypto";import{embed as z$}from"ai";async function e(S,M){try{let{embedding:f}=await z$({model:S,value:M});return f}catch{return null}}function N0(S,M){if(S.length!==M.length||S.length===0)return 0;let f=0,$=0,A=0;for(let y=0;y<S.length;y++)f+=S[y]*M[y],$+=S[y]*S[y],A+=M[y]*M[y];let O=Math.sqrt($)*Math.sqrt(A);if(O===0)return 0;return f/O}function O1(S){let M=[S.title,S.narrative];if(S.concepts.length>0)M.push(S.concepts.join(", "));return M.join(`
211
+ `)}function D$(S){return S.replace(/[%_\\]/g,"\\$&")}class y1{db;constructor(S){this.db=S}create(S){let M=U$(),f=new Date().toISOString(),$=S.discoveryTokens??0,A=S.importance??3,O=S.scope??"project";return this.db.run(`INSERT INTO observations
212
212
  (id, session_id, scope, type, title, subtitle, facts, narrative,
213
213
  concepts, files_read, files_modified, raw_tool_output,
214
214
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
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
215
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[M,S.sessionId,O,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.filesRead),JSON.stringify(S.filesModified),S.rawToolOutput,S.toolName,f,S.tokenCount,$,A,null,null]),{...S,id:M,scope:O,createdAt:f,discoveryTokens:$,importance:A,revisionOf:null,deletedAt:null,supersededBy:null,supersededAt:null}}importObservation(S){this.db.run(`INSERT INTO observations
216
216
  (id, session_id, scope, type, title, subtitle, facts, narrative,
217
217
  concepts, files_read, files_modified, raw_tool_output,
218
218
  tool_name, created_at, token_count, discovery_tokens, importance, revision_of, deleted_at)
219
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N.id,N.sessionId,N.scope??"project",N.type,N.title,N.subtitle,JSON.stringify(N.facts),N.narrative,JSON.stringify(N.concepts),JSON.stringify(N.filesRead),JSON.stringify(N.filesModified),N.rawToolOutput,N.toolName,N.createdAt,N.tokenCount,N.discoveryTokens??0,N.importance??3,N.revisionOf??null,N.deletedAt??null])}getById(N){let E=this.db.get("SELECT * FROM observations WHERE id = ? AND superseded_by IS NULL AND deleted_at IS NULL",[N]);return E?this.mapRow(E):null}getByIdIncludingArchived(N){let E=this.db.get("SELECT * FROM observations WHERE id = ?",[N]);return E?this.mapRow(E):null}getBySession(N){return this.db.all("SELECT * FROM observations WHERE session_id = ? AND superseded_by IS NULL AND deleted_at IS NULL ORDER BY created_at ASC",[N]).map((E)=>this.mapRow(E))}getCount(N){if(N)return this.db.get("SELECT COUNT(*) as count FROM observations WHERE session_id = ?",[N])?.count??0;return this.db.get("SELECT COUNT(*) as count FROM observations")?.count??0}getIndex(N,E=20){return this.db.all(`SELECT o.id, o.session_id, o.type, o.title, o.token_count, o.discovery_tokens, o.created_at, o.importance
219
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[S.id,S.sessionId,S.scope??"project",S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.filesRead),JSON.stringify(S.filesModified),S.rawToolOutput,S.toolName,S.createdAt,S.tokenCount,S.discoveryTokens??0,S.importance??3,S.revisionOf??null,S.deletedAt??null])}getById(S){let M=this.db.get("SELECT * FROM observations WHERE id = ? AND superseded_by IS NULL AND deleted_at IS NULL",[S]);return M?this.mapRow(M):null}getByIdIncludingArchived(S){let M=this.db.get("SELECT * FROM observations WHERE id = ?",[S]);return M?this.mapRow(M):null}getBySession(S){return this.db.all("SELECT * FROM observations WHERE session_id = ? AND superseded_by IS NULL AND deleted_at IS NULL ORDER BY created_at ASC",[S]).map((M)=>this.mapRow(M))}getCount(S){if(S)return this.db.get("SELECT COUNT(*) as count FROM observations WHERE session_id = ?",[S])?.count??0;return this.db.get("SELECT COUNT(*) as count FROM observations")?.count??0}getIndex(S,M=20){return this.db.all(`SELECT o.id, o.session_id, o.type, o.title, o.token_count, o.discovery_tokens, o.created_at, o.importance
220
220
  FROM observations o
221
221
  JOIN sessions s ON o.session_id = s.id
222
222
  WHERE s.project_path = ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
223
223
  ORDER BY o.created_at DESC
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.*
224
+ LIMIT ?`,[S,M]).map((f)=>({id:f.id,sessionId:f.session_id,type:f.type,title:f.title,tokenCount:f.token_count,discoveryTokens:f.discovery_tokens??0,createdAt:f.created_at,importance:f.importance??3}))}getAroundTimestamp(S,M,f,$){let A=M>0?this.db.all(`SELECT o.*
225
225
  FROM observations o
226
226
  JOIN sessions s ON o.session_id = s.id
227
227
  WHERE s.project_path = ? AND o.created_at < ?
228
228
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
229
229
  ORDER BY o.created_at DESC
230
- LIMIT ?`,[M,N,E]).reverse():[],$=A>0?this.db.all(`SELECT o.*
230
+ LIMIT ?`,[$,S,M]).reverse():[],O=f>0?this.db.all(`SELECT o.*
231
231
  FROM observations o
232
232
  JOIN sessions s ON o.session_id = s.id
233
233
  WHERE s.project_path = ? AND o.created_at > ?
234
234
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
235
235
  ORDER BY o.created_at ASC
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.*
236
+ LIMIT ?`,[$,S,f]):[];return[...A,...O].map((y)=>this.mapRow(y))}listByProject(S,M={}){let{limit:f=50,offset:$=0,type:A,state:O,sessionId:y}=M,E=`SELECT o.*
237
237
  FROM observations o
238
238
  JOIN sessions s ON o.session_id = s.id
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=`
239
+ WHERE s.project_path = ?`,V=[S];if(y)E+=" AND o.session_id = ?",V.push(y);if(A)E+=" AND o.type = ?",V.push(A);if(O==="current")E+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";else if(O==="superseded")E+=" AND o.superseded_by IS NOT NULL AND o.deleted_at IS NULL";else if(O==="tombstoned")E+=" AND o.deleted_at IS NOT NULL";else E+=" AND o.superseded_by IS NULL AND o.deleted_at IS NULL";return E+=" ORDER BY o.created_at DESC LIMIT ? OFFSET ?",V.push(f,$),this.db.all(E,V).map((N)=>this.mapRow(N))}search(S){let M=!!S.projectPath,f=`
240
240
  SELECT o.*, rank
241
241
  FROM observations o
242
242
  JOIN observations_fts fts ON o._rowid = fts.rowid
243
- ${E?"JOIN sessions s ON o.session_id = s.id":""}
243
+ ${M?"JOIN sessions s ON o.session_id = s.id":""}
244
244
  WHERE observations_fts MATCH ? AND o.superseded_by IS NULL AND o.deleted_at IS NULL
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.*
245
+ `,$=[S.query];if(M&&S.projectPath)f+=" AND s.project_path = ?",$.push(S.projectPath);if(S.sessionId)f+=" AND o.session_id = ?",$.push(S.sessionId);if(S.type)f+=" AND o.type = ?",$.push(S.type);if(S.importanceMin!==void 0)f+=" AND o.importance >= ?",$.push(S.importanceMin);if(S.importanceMax!==void 0)f+=" AND o.importance <= ?",$.push(S.importanceMax);if(S.createdAfter)f+=" AND o.created_at >= ?",$.push(S.createdAfter);if(S.createdBefore)f+=" AND o.created_at <= ?",$.push(S.createdBefore);if(S.concepts&&S.concepts.length>0){let A=S.concepts.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE LOWER(value) = LOWER(?))");f+=` AND (${A.join(" OR ")})`;for(let O of S.concepts)$.push(O)}if(S.files&&S.files.length>0){let A=S.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 '\\'))`);f+=` AND (${A.join(" OR ")})`;for(let O of S.files){let y=`%${D$(O)}%`;$.push(y,y)}}return f+=" ORDER BY rank LIMIT ? OFFSET ?",$.push(S.limit??10),$.push(S.offset??0),this.db.all(f,$).map((A)=>({observation:this.mapRow(A),rank:A.rank,snippet:A.title}))}searchByConcept(S,M=10,f){let $=!!f,A=`SELECT o.*
247
247
  FROM observations o
248
248
  JOIN observations_fts fts ON o._rowid = fts.rowid
249
- ${M?"JOIN sessions s ON o.session_id = s.id":""}
249
+ ${$?"JOIN sessions s ON o.session_id = s.id":""}
250
250
  WHERE observations_fts MATCH ?
251
251
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
252
- ${M?"AND s.project_path = ?":""}
252
+ ${$?"AND s.project_path = ?":""}
253
253
  ORDER BY rank
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.*
254
+ LIMIT ?`,y=[`concepts:"${S.replace(/"/g,'""')}"`];if($&&f)y.push(f);return y.push(M),this.db.all(A,y).map((E)=>this.mapRow(E))}searchByFile(S,M=10,f){let $=!!f,A=`SELECT o.*
255
255
  FROM observations o
256
256
  JOIN observations_fts fts ON o._rowid = fts.rowid
257
- ${M?"JOIN sessions s ON o.session_id = s.id":""}
257
+ ${$?"JOIN sessions s ON o.session_id = s.id":""}
258
258
  WHERE observations_fts MATCH ?
259
259
  AND o.superseded_by IS NULL AND o.deleted_at IS NULL
260
- ${M?"AND s.project_path = ?":""}
260
+ ${$?"AND s.project_path = ?":""}
261
261
  ORDER BY rank
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
262
+ LIMIT ?`,O=[`files_read:"${S.replace(/"/g,'""')}" OR files_modified:"${S.replace(/"/g,'""')}"`];if($&&f)O.push(f);return O.push(M),this.db.all(A,O).map((y)=>this.mapRow(y))}setEmbedding(S,M){this.db.run("UPDATE observations SET embedding = ? WHERE id = ?",[JSON.stringify(M),S])}getWithEmbeddings(S,M){return this.db.all(`SELECT o.id, o.embedding, o.title
263
263
  FROM observations o
264
264
  JOIN sessions s ON o.session_id = s.id
265
265
  WHERE s.project_path = ? AND o.embedding IS NOT NULL AND o.superseded_by IS NULL AND o.deleted_at IS NULL
266
266
  ORDER BY o.created_at DESC
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
267
+ LIMIT ?`,[S,M]).map((f)=>{try{return{id:f.id,embedding:JSON.parse(f.embedding),title:f.title}}catch{return null}}).filter((f)=>f!==null)}findSimilar(S,M,f,$){let A=this.db.all(`SELECT id, embedding FROM observations
268
268
  WHERE embedding IS NOT NULL AND type = ? AND superseded_by IS NULL AND deleted_at IS NULL
269
269
  ORDER BY created_at DESC
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
270
+ LIMIT 200`,[M]),O=[];for(let y of A)try{let E=JSON.parse(y.embedding);if(!Array.isArray(E)||E.length!==S.length)continue;let V=N0(S,E);if(V>=f)O.push({id:y.id,similarity:V})}catch{}return O.sort((y,E)=>E.similarity-y.similarity).slice(0,$)}insertVecEmbedding(S,M){let f=new Float32Array(M);this.db.run("BEGIN");try{this.db.run("DELETE FROM observation_embeddings WHERE observation_id = ?",[S]),this.db.run("INSERT INTO observation_embeddings (observation_id, embedding) VALUES (?, ?)",[S,f]),this.db.run("COMMIT")}catch($){throw this.db.run("ROLLBACK"),$}}migrateExistingEmbeddings(S){let M=this.db.all("SELECT id, embedding FROM observations WHERE embedding IS NOT NULL"),f=0,$=0;for(let A of M)try{let O=JSON.parse(A.embedding);if(!Array.isArray(O)||O.length!==S){$++;continue}this.insertVecEmbedding(A.id,O),f++}catch{$++}return{migrated:f,skipped:$}}getVecEmbeddingMatches(S,M){try{let f=new Float32Array(S);return this.db.all(`SELECT observation_id, distance
271
271
  FROM observation_embeddings
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
272
+ WHERE embedding MATCH ? AND k = ?`,[f,M]).map(($)=>({observationId:$.observation_id,distance:$.distance}))}catch{return[]}}searchVecSubset(S,M,f){if(M.length===0)return[];try{let $=new Float32Array(S),A=Math.max(f*5,M.length),O=this.db.all(`SELECT observation_id, distance
273
273
  FROM observation_embeddings
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
274
+ WHERE embedding MATCH ? AND k = ?`,[$,A]),y=new Set(M);return O.filter((E)=>y.has(E.observation_id)).slice(0,f).map((E)=>({observationId:E.observation_id,distance:E.distance}))}catch{return[]}}update(S,M){let f=this.getById(S);if(!f)return null;if(Object.keys(M).length===0)return f;let $=this.create({sessionId:f.sessionId,scope:f.scope??"project",type:M.type??f.type,title:M.title??f.title,subtitle:M.subtitle??f.subtitle,facts:M.facts??f.facts,narrative:M.narrative??f.narrative,concepts:M.concepts??f.concepts,filesRead:M.filesRead??f.filesRead,filesModified:M.filesModified??f.filesModified,rawToolOutput:f.rawToolOutput,toolName:"mem-revise",tokenCount:f.tokenCount,discoveryTokens:f.discoveryTokens,importance:M.importance??f.importance});return this.db.run("UPDATE observations SET revision_of = ? WHERE id = ?",[S,$.id]),this.supersede(S,$.id),this.getById($.id)}supersede(S,M){let f=new Date().toISOString();this.db.run("UPDATE observations SET superseded_by = ?, superseded_at = ? WHERE id = ?",[M,f,S])}delete(S){if(this.db.all("SELECT id FROM observations WHERE id = ?",[S]).length===0)return!1;let f=new Date().toISOString();return this.db.run("UPDATE observations SET deleted_at = ? WHERE id = ?",[f,S]),this.deleteEmbeddingsForObservations([S]),!0}getLineage(S){let M=this.getByIdIncludingArchived(S);if(!M)return[];let f=new Set([M.id]),$=[M];while($[0].revisionOf){let A=this.getByIdIncludingArchived($[0].revisionOf);if(!A||f.has(A.id))break;$.unshift(A),f.add(A.id)}while($[$.length-1].supersededBy){let A=$[$.length-1].supersededBy;if(!A)break;let O=this.getByIdIncludingArchived(A);if(!O||f.has(O.id))break;$.push(O),f.add(O.id)}return $}deleteOlderThan(S){return this.db.all(`DELETE FROM observations
275
275
  WHERE (created_at < datetime('now', '-' || ? || ' days') OR deleted_at IS NOT NULL)
276
276
  AND session_id NOT IN (SELECT id FROM sessions WHERE status != 'completed')
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
277
+ RETURNING id`,[S]).length}deleteEmbeddingsForObservations(S){if(S.length===0)return;let M=S.map(()=>"?").join(",");try{this.db.run(`DELETE FROM observation_embeddings WHERE observation_id IN (${M})`,S)}catch{}this.db.run(`UPDATE observations SET embedding = NULL WHERE id IN (${M})`,S)}mapRow(S){return{id:S.id,sessionId:S.session_id,scope:S.scope??"project",type:S.type,title:S.title,subtitle:S.subtitle,facts:JSON.parse(S.facts),narrative:S.narrative,concepts:JSON.parse(S.concepts),filesRead:JSON.parse(S.files_read),filesModified:JSON.parse(S.files_modified),rawToolOutput:S.raw_tool_output,toolName:S.tool_name,createdAt:S.created_at,tokenCount:S.token_count,discoveryTokens:S.discovery_tokens??0,importance:S.importance??3,revisionOf:S.revision_of??null,deletedAt:S.deleted_at??null,supersededBy:S.superseded_by??null,supersededAt:S.superseded_at??null}}}import{randomUUID as L$}from"crypto";class N1{db;constructor(S){this.db=S}create(S){let M=L$(),f=new Date().toISOString();return this.db.run(`INSERT INTO pending_messages
278
278
  (id, session_id, tool_name, tool_output, call_id, created_at)
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'
279
+ VALUES (?, ?, ?, ?, ?, ?)`,[M,S.sessionId,S.toolName,S.toolOutput,S.callId,f]),{...S,id:M,createdAt:f,status:"pending",retryCount:0,error:null}}getPending(S=10){return this.db.all("SELECT * FROM pending_messages WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?",[S]).map((M)=>this.mapRow(M))}getByStatus(S){return this.db.all("SELECT * FROM pending_messages WHERE status = ? ORDER BY created_at ASC",[S]).map((M)=>this.mapRow(M))}markProcessing(S){this.db.run("UPDATE pending_messages SET status = 'processing' WHERE id = ?",[S])}markCompleted(S){this.db.run("UPDATE pending_messages SET status = 'completed' WHERE id = ?",[S])}markFailed(S,M){this.db.run("UPDATE pending_messages SET status = 'failed', error = ?, retry_count = retry_count + 1 WHERE id = ?",[M,S])}resetStale(S=5){return this.db.all(`UPDATE pending_messages SET status = 'pending'
280
280
  WHERE status = 'processing'
281
281
  AND created_at < datetime('now', ? || ' minutes')
282
- RETURNING id`,[`-${N}`]).length}deleteCompletedOlderThan(N){return this.db.all(`DELETE FROM pending_messages
282
+ RETURNING id`,[`-${S}`]).length}deleteCompletedOlderThan(S){return this.db.all(`DELETE FROM pending_messages
283
283
  WHERE status = 'completed'
284
284
  AND created_at < datetime('now', '-' || ? || ' days')
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:`
285
+ RETURNING id`,[S]).length}mapRow(S){return{id:S.id,sessionId:S.session_id,toolName:S.tool_name,toolOutput:S.tool_output,callId:S.call_id,createdAt:S.created_at,status:S.status,retryCount:S.retry_count,error:S.error??null}}}var C$=[{version:1,name:"create-schema",up:`
286
286
  -- Sessions table
287
287
  CREATE TABLE IF NOT EXISTS sessions (
288
288
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -576,24 +576,24 @@ ${Q}`}return J}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
576
576
  INSERT INTO entities_fts(rowid, name, entity_type)
577
577
  VALUES (new._rowid, new.name, new.entity_type);
578
578
  END;
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(
579
+ `}];function pM(S,M){if(S.migrate(C$),M?.hasVectorExtension&&M?.embeddingDimension&&M.embeddingDimension>0)G$(S,M.embeddingDimension)}function G$(S,M){if(S.get("SELECT name FROM sqlite_master WHERE type='table' AND name='observation_embeddings'")){let $=S.get("SELECT value FROM _embedding_meta WHERE key = 'dimension'");if($&&Number($.value)!==M){console.warn(`[open-mem] vec0 table exists with dimension ${$.value}, but config specifies ${M}. Drop observation_embeddings to re-create with new dimension.`);return}}else S.exec(`CREATE VIRTUAL TABLE observation_embeddings USING vec0(
580
580
  observation_id TEXT PRIMARY KEY,
581
- embedding float[${E}] distance_metric=cosine
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
581
+ embedding float[${M}] distance_metric=cosine
582
+ )`);S.run("INSERT OR REPLACE INTO _embedding_meta (key, value) VALUES (?, ?)",["dimension",String(M)])}class E1{db;constructor(S){this.db=S}create(S,M){let f=new Date().toISOString();return this.db.run(`INSERT INTO sessions (id, project_path, started_at, status)
583
+ VALUES (?, ?, ?, 'active')`,[S,M,f]),this.getById(S)}getOrCreate(S,M){let f=this.getById(S);if(f)return f;return this.create(S,M)}getById(S){let M=this.db.get("SELECT * FROM sessions WHERE id = ?",[S]);return M?this.mapRow(M):null}getRecent(S,M=10){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC LIMIT ?",[S,M]).map((f)=>this.mapRow(f))}getAll(S){return this.db.all("SELECT * FROM sessions WHERE project_path = ? ORDER BY started_at DESC",[S]).map((M)=>this.mapRow(M))}getActive(){return this.db.all("SELECT * FROM sessions WHERE status = 'active' ORDER BY started_at DESC").map((S)=>this.mapRow(S))}updateStatus(S,M){this.db.run("UPDATE sessions SET status = ? WHERE id = ?",[M,S])}markCompleted(S){this.db.run("UPDATE sessions SET status = 'completed', ended_at = datetime('now') WHERE id = ?",[S])}incrementObservationCount(S){this.db.run("UPDATE sessions SET observation_count = observation_count + 1 WHERE id = ?",[S])}setSummary(S,M){this.db.run("UPDATE sessions SET summary_id = ? WHERE id = ?",[M,S])}mapRow(S){return{id:S.id,projectPath:S.project_path,startedAt:S.started_at,endedAt:S.ended_at??null,status:S.status,observationCount:S.observation_count,summaryId:S.summary_id??null}}}import{randomUUID as H$}from"crypto";class V1{db;constructor(S){this.db=S}create(S){let M=H$(),f=new Date().toISOString();return this.db.run(`INSERT INTO session_summaries
584
584
  (id, session_id, summary, key_decisions, files_modified,
585
585
  concepts, created_at, token_count,
586
586
  request, investigated, learned, completed, next_steps)
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
587
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[M,S.sessionId,S.summary,JSON.stringify(S.keyDecisions),JSON.stringify(S.filesModified),JSON.stringify(S.concepts),f,S.tokenCount,S.request??"",S.investigated??"",S.learned??"",S.completed??"",S.nextSteps??""]),{...S,id:M,createdAt:f}}importSummary(S){this.db.run(`INSERT INTO session_summaries
588
588
  (id, session_id, summary, key_decisions, files_modified,
589
589
  concepts, created_at, token_count,
590
590
  request, investigated, learned, completed, next_steps)
591
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[N.id,N.sessionId,N.summary,JSON.stringify(N.keyDecisions),JSON.stringify(N.filesModified),JSON.stringify(N.concepts),N.createdAt,N.tokenCount,N.request??"",N.investigated??"",N.learned??"",N.completed??"",N.nextSteps??""])}getBySessionId(N){let E=this.db.get("SELECT * FROM session_summaries WHERE session_id = ?",[N]);return E?this.mapRow(E):null}getRecent(N=10){return this.db.all("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?",[N]).map((E)=>this.mapRow(E))}search(N,E=10){return this.db.all(`SELECT ss.*
591
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[S.id,S.sessionId,S.summary,JSON.stringify(S.keyDecisions),JSON.stringify(S.filesModified),JSON.stringify(S.concepts),S.createdAt,S.tokenCount,S.request??"",S.investigated??"",S.learned??"",S.completed??"",S.nextSteps??""])}getBySessionId(S){let M=this.db.get("SELECT * FROM session_summaries WHERE session_id = ?",[S]);return M?this.mapRow(M):null}getRecent(S=10){return this.db.all("SELECT * FROM session_summaries ORDER BY created_at DESC LIMIT ?",[S]).map((M)=>this.mapRow(M))}search(S,M=10){return this.db.all(`SELECT ss.*
592
592
  FROM session_summaries ss
593
593
  JOIN summaries_fts fts ON ss._rowid = fts.rowid
594
594
  WHERE summaries_fts MATCH ?
595
595
  ORDER BY rank
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:`
596
+ LIMIT ?`,[S,M]).map((f)=>this.mapRow(f))}mapRow(S){return{id:S.id,sessionId:S.session_id,summary:S.summary,keyDecisions:JSON.parse(S.key_decisions),filesModified:JSON.parse(S.files_modified),concepts:JSON.parse(S.concepts),createdAt:S.created_at,tokenCount:S.token_count,request:S.request||void 0,investigated:S.investigated||void 0,learned:S.learned||void 0,completed:S.completed||void 0,nextSteps:S.next_steps||void 0}}}import{randomUUID as F$}from"crypto";var u$=[{version:1,name:"create-user-observations",up:`
597
597
  CREATE TABLE IF NOT EXISTS user_observations (
598
598
  _rowid INTEGER PRIMARY KEY AUTOINCREMENT,
599
599
  id TEXT UNIQUE NOT NULL,
@@ -664,27 +664,27 @@ ${Q}`}return J}guide(){return["# open-mem Workflow Guide","","## Reading Memorie
664
664
  new.facts, new.concepts, new.files_read, new.files_modified
665
665
  );
666
666
  END;
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
667
+ `}];class J1{db;constructor(S){let M=T$(S);this.db=MS(M),this.initializeUserSchema()}initializeUserSchema(){this.db.migrate(u$)}get database(){return this.db}close(){this.db.close()}}class B1{db;constructor(S){this.db=S}create(S){let M=F$(),f=new Date().toISOString();return this.db.run(`INSERT INTO user_observations
668
668
  (id, type, title, subtitle, facts, narrative,
669
669
  concepts, files_read, files_modified, tool_name,
670
670
  created_at, token_count, importance, source_project)
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=`
671
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[M,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.filesRead),JSON.stringify(S.filesModified),S.toolName,f,S.tokenCount,S.importance??3,S.sourceProject]),{...S,id:M,createdAt:f,importance:S.importance??3}}search(S){try{let M=`
672
672
  SELECT o.*, rank
673
673
  FROM user_observations o
674
674
  JOIN user_observations_fts fts ON o._rowid = fts.rowid
675
675
  WHERE user_observations_fts MATCH ?
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=`
676
+ `,f=[S.query];if(S.sourceProject)M+=" AND o.source_project = ?",f.push(S.sourceProject);return M+=" ORDER BY rank LIMIT ?",f.push(S.limit??10),this.db.all(M,f).map(($)=>({observation:this.mapRow($),rank:$.rank}))}catch{return[]}}getIndex(S,M){let f=`SELECT id, type, title, token_count, created_at, importance, source_project
677
+ FROM user_observations`,$=[];if(M)f+=" WHERE source_project = ?",$.push(M);return f+=" ORDER BY created_at DESC LIMIT ?",$.push(S??20),this.db.all(f,$).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(S){let M=this.db.get("SELECT * FROM user_observations WHERE id = ?",[S]);return M?this.mapRow(M):null}delete(S){return this.db.all("DELETE FROM user_observations WHERE id = ? RETURNING id",[S]).length>0}mapRow(S){return{id:S.id,type:S.type,title:S.title,subtitle:S.subtitle,facts:JSON.parse(S.facts),narrative:S.narrative,concepts:JSON.parse(S.concepts),filesRead:JSON.parse(S.files_read),filesModified:JSON.parse(S.files_modified),toolName:S.tool_name,createdAt:S.created_at,tokenCount:S.token_count,importance:S.importance??3,sourceProject:S.source_project}}}function T$(S){if(S.startsWith("~/")){let M=process.env.HOME||process.env.USERPROFILE||"";if(!M)throw Error("Cannot resolve user DB path: HOME environment variable is not set");let f=`${M}${S.slice(1)}`,$=f.substring(0,f.lastIndexOf("/"));return w("fs").mkdirSync($,{recursive:!0}),f}return S}import{EventEmitter as x$}from"events";function bM(){return new x$}function fS(S,M=""){if(!S)return S;return S.replace(/<private>[\s\S]*?<\/private>/gi,M)}var nM=200,j$=/(\([\s\S]*[+*]\)\s*[+*?])|(\(\.\*\)\+)|(\(\.\+\)\+)/;function $S(S,M,f="[REDACTED]"){if(!S||M.length===0)return S;let $=S;for(let A of M){if(A.length>nM){console.warn(`[open-mem] Skipping oversized redaction pattern (${A.length} chars, max ${nM})`);continue}if(j$.test(A)){console.warn("[open-mem] Skipping potentially dangerous redaction pattern (nested quantifiers detected)");continue}try{$=$.replace(new RegExp(A,"g"),f)}catch{}}return $}var k$=20,rM=2000,iM=60;function I$(S){return typeof S==="object"&&S!==null&&"text"in S&&typeof S.text==="string"}function g$(S){let M=[];for(let f of S)if(typeof f==="string")M.push(f);else if(I$(f))M.push(f.text);return M.join(`
678
+ `).trim()}function w$(S){let M=S.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter((f)=>f.length>4);return[...new Set(M)].slice(0,5)}function m$(S){let{observations:M,sessions:f,projectPath:$,sessionId:A,text:O,agent:y,sensitivePatterns:E=[]}=S;if(y!==void 0&&y!=="user")return!1;let V=$S(fS(O),E);if(V.length<k$)return!1;f.getOrCreate(A,$);let J=`User request: ${V.length>iM?`${V.slice(0,iM)}...`:V}`,B=V.length>rM?`${V.slice(0,rM)}...`:V;return M.create({sessionId:A,type:"discovery",title:J,subtitle:"",facts:[],narrative:B,concepts:w$(V),filesRead:[],filesModified:[],rawToolOutput:"",toolName:"chat.message",tokenCount:Math.ceil(B.length/4),discoveryTokens:0,importance:3}),!0}function tM(S,M,f,$=[]){return async(A,O)=>{try{let{sessionID:y,agent:E}=A;if(E!==void 0&&E!=="user")return;let V=g$(O.parts);m$({observations:S,sessions:M,projectPath:f,sessionId:y,text:V,agent:E,sensitivePatterns:$})}catch(y){console.error("[open-mem] Chat capture error:",y)}}}var Q1={bugfix:"\uD83D\uDD34",feature:"\uD83D\uDFE3",refactor:"\uD83D\uDD04",change:"\u2705",discovery:"\uD83D\uDD35",decision:"\u2696\uFE0F"};function h$(S){if(S.length===0)return"";let M=[];M.push(`
679
+ Key decisions:`);for(let f of S)M.push(`- ${Q1[f.type]||"\uD83D\uDCDD"} ${f.title}: ${f.narrative}`);return M.join(`
680
+ `)}function dM(S){if(S.length===0)return"";let M=[];M.push(`
681
+ Recent observation details:`);for(let f of S){let $=Q1[f.type]||"\uD83D\uDCDD";if(M.push(`- ${$} ${f.title}: ${f.narrative}`),f.facts.length>0)M.push(` Facts: ${f.facts.join("; ")}`)}return M.join(`
682
+ `)}function sM(S,M,f,$,A,O){return async(y,E)=>{try{if(!S.contextInjectionEnabled)return;let V=Math.floor(S.maxContextTokens/2),N=f.getRecent(A,3),J=N.map((U)=>U.summaryId?$.getBySessionId(U.id):null).filter((U)=>U!==null),B=M.getIndex(A,20),Q=[];try{Q=M.listByProject(A,{limit:5,state:"current"})}catch{}if(J.length===0&&B.length===0&&Q.length===0)return;let _=Math.floor(V*0.4),W=$0(N,J,B,_,Q),R=n0(W),X=Math.floor(V*0.4),z=dM(Q);if(z&&u(z)<=X)R+=z;else if(z){let U=[],j=0;for(let x of Q){let k=`- ${Q1[x.type]||"\uD83D\uDCDD"} ${x.title}: ${x.narrative}`,T=u(k);if(j+T>X)break;U.push(x),j+=T}if(U.length>0)R+=dM(U)}let L=Math.floor(V*0.2),C=Q.filter((U)=>U.type==="decision");if(C.length>0){let U=h$(C);if(u(U)<=L)R+=U}if(S.userMemoryEnabled&&O){let U=O.getIndex(10),j=i0(U,Math.floor(S.userMemoryMaxContextTokens/2));if(j)R+=j}E.context.push(R)}catch(V){console.error("[open-mem] Compaction hook error:",V)}}}function aM(S,M,f,$,A,O){return async(y,E)=>{try{if(!S.contextInjectionEnabled)return;let V=f.getRecent(A,5);if(V.length===0)return;let N=V.map((X)=>X.summaryId?$.getBySessionId(X.id):null).filter((X)=>X!==null),J=M.getIndex(A,S.maxObservations);if(N.length===0&&J.length===0)return;let Q=J.slice(0,S.contextFullObservationCount).map((X)=>X.id).map((X)=>M.getById(X)).filter((X)=>X!==null),_=$0(V,N,J,S.maxContextTokens,Q),W={showTokenCosts:S.contextShowTokenCosts,observationTypes:S.contextObservationTypes,fullObservationCount:S.contextFullObservationCount,showLastSummary:S.contextShowLastSummary},R=b0(_,W);if(S.userMemoryEnabled&&O){let X=O.getIndex(S.maxObservations),z=r0(X,S.userMemoryMaxContextTokens);if(z)R+=`
683
+
684
+ ${z}`}E.system.push(R)}catch(V){console.error("[open-mem] Context injection error:",V)}}}import{existsSync as q$}from"fs";import{readFile as P$,writeFile as v$}from"fs/promises";import{join as c$}from"path";function eM(S,M,f){if(S.retentionDays===0)return;try{let $=M.deleteOlderThan(S.retentionDays),A=f.deleteCompletedOlderThan(S.retentionDays);if($>0||A>0)console.log(`[open-mem] Retention: deleted ${$} observations, ${A} pending messages`)}catch($){console.error("[open-mem] Retention enforcement error:",$)}}async function l$(S,M,f){let{queue:$,sessions:A,projectPath:O,config:y,observations:E,pendingMessages:V}=S;switch(M){case"session.created":{if(f)A.getOrCreate(f,O);try{eM(y,E,V)}catch(N){console.error("[open-mem] Retention enforcement error:",N)}try{await p$(O)}catch(N){console.error("[open-mem] Gitignore entry error:",N)}break}case"session.idle":{if($.processBatch().catch((N)=>{console.error("[open-mem] Background processing error:",N)}),f)A.updateStatus(f,"idle"),oM(f,O,y,E).catch((N)=>{console.error("[open-mem] Folder context error:",N)});break}case"session.completed":case"session.ended":{if(f)await $.processBatch(),await $.summarizeSession(f),A.markCompleted(f),await oM(f,O,y,E);break}}}function Sf(S,M,f,$,A,O){return async(y)=>{try{let{event:E}=y,V=E.properties.sessionID,N=typeof V==="string"?V:void 0;if(E.type==="session.created"||E.type==="session.idle"||E.type==="session.completed"||E.type==="session.ended")await l$({queue:S,sessions:M,projectPath:f,config:$,observations:A,pendingMessages:O},E.type,N)}catch(E){console.error("[open-mem] Event handler error:",E)}}}async function oM(S,M,f,$){if(!f.folderContextEnabled)return;try{let A=$.getBySession(S);if(A.length>0)await s0(M,A,{mode:f.folderContextMode,filename:f.folderContextFilename,maxDepth:f.folderContextMaxDepth})}catch(A){console.error("[open-mem] Folder context update error:",A)}}async function p$(S){let M=c$(S,".gitignore");if(!q$(M))return;let f=await P$(M,"utf-8");if(f.includes("AGENTS.md"))return;let $=`
685
685
  # open-mem: Auto-generated folder context files.
686
686
  # Uncomment to exclude from version control (recommended for large projects):
687
687
  # **/AGENTS.md
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};
688
+ `;await v$(M,f.endsWith(`
689
+ `)?f+$:`${f}
690
+ ${$}`,"utf-8")}function b$(S){let{config:M,queue:f,sessions:$,projectPath:A,tool:O,sessionId:y,callId:E,toolOutput:V}=S;if(M.ignoredTools.includes(O))return!1;if(!V||V.length<M.minOutputLength)return!1;let N=$S(V,M.sensitivePatterns);return N=fS(N,"[PRIVATE]"),$.getOrCreate(y,A),f.enqueue(y,O,N,E),!0}function Mf(S,M,f,$){return async(A,O)=>{try{let{tool:y,sessionID:E,callID:V}=A,{output:N}=O;b$({config:S,queue:M,sessions:f,projectPath:$,tool:y,sessionId:E,callId:V,toolOutput:N})}catch(y){console.error("[open-mem] Tool capture error:",y)}}}class _1{config;compressor;summarizer;pendingRepo;observationRepo;sessionRepo;summaryRepo;embeddingModel;conflictEvaluator;entityExtractor;entityRepo;observer;processing=!1;timer=null;mode="in-process";onEnqueue=null;constructor(S,M,f,$,A,O,y,E=null,V=null,N=null,J=null,B=null){this.config=S;this.compressor=M;this.summarizer=f;this.pendingRepo=$;this.observationRepo=A;this.sessionRepo=O;this.summaryRepo=y;this.embeddingModel=E;this.conflictEvaluator=V;this.entityExtractor=N;this.entityRepo=J;this.observer=B}setMode(S){if(this.mode=S,S==="enqueue-only")this.stop()}getMode(){return this.mode}setOnEnqueue(S){this.onEnqueue=S}enqueue(S,M,f,$){if(this.pendingRepo.create({sessionId:S,toolName:M,toolOutput:f,callId:$}),this.observer?.onEnqueue?.({sessionId:S,toolName:M,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 S=0,M=0,f=Date.now();try{this.pendingRepo.resetStale(5);let $=this.pendingRepo.getPending(this.config.batchSize);if(this.observer?.onBatchStart?.({pending:$.length,mode:this.mode,startedAt:new Date(f).toISOString()}),$.length===0)return 0;for(let A of $)try{this.pendingRepo.markProcessing(A.id);let y=await this.compressor.compress(A.toolName,A.toolOutput)??this.compressor.createFallbackObservation(A.toolName,A.toolOutput),E=!1,V=null;if(this.embeddingModel)try{let J=O1({title:y.title,narrative:y.narrative,concepts:y.concepts}),B=await e(this.embeddingModel,J);if(B){let Q=this.config.conflictResolutionEnabled&&this.conflictEvaluator,_=this.config.conflictSimilarityBandLow??0.7,W=this.config.conflictSimilarityBandHigh??0.92;if(Q){let R=this.observationRepo.findSimilar(B,y.type,_,5),X=R.find((z)=>z.similarity>W);if(X)console.log(`[open-mem] Dedup: skipping duplicate of ${X.id} (similarity: ${X.similarity.toFixed(3)})`),E=!0;else{let z=R.filter((L)=>L.similarity>=_&&L.similarity<=W);if(z.length>0)try{let L=z.map((C)=>{let U=this.observationRepo.getById(C.id);return U?{id:U.id,title:U.title,narrative:U.narrative,concepts:U.concepts,type:U.type}:null}).filter((C)=>C!==null);if(L.length>0&&this.conflictEvaluator){let C=await this.conflictEvaluator.evaluate({title:y.title,narrative:y.narrative,concepts:y.concepts,type:y.type},L);if(C&&C.outcome==="duplicate")console.log(`[open-mem] Conflict eval: duplicate (${C.reason})`),E=!0;else if(C&&C.outcome==="update"&&C.supersedesId)console.log(`[open-mem] Conflict eval: update supersedes ${C.supersedesId} (${C.reason})`),V=C.supersedesId}}catch{}}}else{let R=this.observationRepo.findSimilar(B,y.type,0.92,1);if(R.length>0)console.log(`[open-mem] Dedup: skipping duplicate of ${R[0].id} (similarity: ${R[0].similarity.toFixed(3)})`),E=!0}}}catch{}if(E){this.pendingRepo.markCompleted(A.id);continue}let N=this.observationRepo.create({sessionId:A.sessionId,type:y.type,title:y.title,subtitle:y.subtitle,facts:y.facts,narrative:y.narrative,concepts:y.concepts,filesRead:y.filesRead,filesModified:y.filesModified,rawToolOutput:A.toolOutput,toolName:A.toolName,tokenCount:u(`${y.title} ${y.narrative} ${y.facts.join(" ")}`),discoveryTokens:y.discoveryTokens??u(A.toolOutput),importance:y.importance??3});if(this.embeddingModel)try{let J=O1({title:N.title,narrative:N.narrative,concepts:N.concepts}),B=await e(this.embeddingModel,J);if(B)this.observationRepo.setEmbedding(N.id,B)}catch{}if(V)try{this.observationRepo.supersede(V,N.id),console.log(`[open-mem] Superseded observation ${V} with ${N.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:N.title,narrative:N.narrative,concepts:N.concepts,facts:N.facts,filesRead:N.filesRead,filesModified:N.filesModified,type:N.type});if(J){let B=new Map;for(let Q of J.entities){let _=this.entityRepo.upsertEntity(Q.name,Q.entityType);B.set(Q.name,_.id),this.entityRepo.linkObservation(_.id,N.id)}for(let Q of J.relations){let _=B.get(Q.sourceName),W=B.get(Q.targetName);if(_&&W)this.entityRepo.createRelation(_,W,Q.relationship,N.id)}}}catch{}this.sessionRepo.incrementObservationCount(A.sessionId),this.pendingRepo.markCompleted(A.id),S++}catch(O){this.pendingRepo.markFailed(A.id,String(O)),M++,this.observer?.onItemFailed?.({pendingId:A.id,error:String(O),failedAt:new Date().toISOString()})}return S}finally{this.observer?.onBatchEnd?.({processed:S,failed:M,durationMs:Date.now()-f,finishedAt:new Date().toISOString()}),this.processing=!1}}async summarizeSession(S){let M=this.observationRepo.getBySession(S);if(!this.summarizer.shouldSummarize(M.length))return;if(this.summaryRepo.getBySessionId(S))return;let $=await this.summarizer.summarize(S,M);if(!$)return;let A=this.summaryRepo.create({sessionId:S,summary:$.summary,keyDecisions:$.keyDecisions,filesModified:$.filesModified,concepts:$.concepts,tokenCount:u($.summary)});this.sessionRepo.setSummary(S,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 R1{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:(S)=>{if(this.totalBatches+=1,this.processedItems+=S.processed,this.failedItems+=S.failed,this.totalBatchDurationMs+=S.durationMs,this.lastBatchDurationMs=S.durationMs,S.processed>0)this.lastProcessedAt=S.finishedAt},onItemFailed:(S)=>{this.lastFailedAt=S.failedAt,this.lastError=S.error}}}snapshot(S){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:{...S,lastBatchDurationMs:this.lastBatchDurationMs,lastProcessedAt:this.lastProcessedAt,lastFailedAt:this.lastFailedAt,lastError:this.lastError}}}}function ff(S){return{start:()=>S.start(),stop:()=>{S.setOnEnqueue(null),S.stop()},setInProcess:()=>{S.setMode("in-process"),S.start()},setEnqueueOnly:(M)=>{S.setMode("enqueue-only"),S.setOnEnqueue(M)}}}async function $f(S,M,f,$,A){if(!S.trim())return M;let O=n$(S),y=new Set;for(let N of O){let J=f.findByName(N);for(let B of J){let Q=f.traverseRelations(B.id,1);for(let _ of Q){let W=f.getObservationsForEntity(_);for(let R of W)y.add(R)}}}if(y.size===0)return M;let E=new Set(M.map((N)=>N.observation.id)),V=[];for(let N of y){if(E.has(N))continue;let J=$.getById(N);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[...M,...V].slice(0,A)}function n$(S){let M=S.split(/\s+/).filter(($)=>$.length>=2),f=[];for(let $ of M)f.push($);for(let $=0;$<M.length-1;$++)f.push(`${M[$]} ${M[$+1]}`);return f}class W1{strategies=new Map;register(S,M){this.strategies.set(S,M)}get(S){return this.strategies.get(S)??null}list(){return[...this.strategies.keys()]}}function AS(S){return Array.from(new Set(S))}function Af(S,M){let f=[],$=new Set;for(let A of S){if($.has(A.observation.id))continue;if($.add(A.observation.id),f.push(A),f.length>=M)break}return f}function r$(S,M){let f=M.toLowerCase();return S.some(($)=>$.toLowerCase()===f)}function i$(S,M){let f=M.toLowerCase();return S.some(($)=>$.toLowerCase().includes(f))}function Of(S,M){let f=AS([...M.concept?[M.concept]:[],...M.concepts??[]]),$=AS([...M.file?[M.file]:[],...M.files??[]]);return S.filter((A)=>{let O=A.observation;if(M.type&&O.type!==M.type)return!1;if(M.importanceMin!==void 0&&O.importance<M.importanceMin)return!1;if(M.importanceMax!==void 0&&O.importance>M.importanceMax)return!1;if(M.createdAfter&&O.createdAt<M.createdAfter)return!1;if(M.createdBefore&&O.createdAt>M.createdBefore)return!1;if(f.length>0&&!f.some((y)=>r$(O.concepts,y)))return!1;if($.length>0){let y=[...O.filesRead,...O.filesModified];if(!$.some((E)=>i$(y,E)))return!1}return!0})}function E0(S,M,f,$){let A=AS([...f.concept?[f.concept]:[],...f.concepts??[]]);if(A.length>0){let y=A.flatMap((V)=>S.observations.searchByConcept(V,$,f.projectPath)),E=Af(y.map((V)=>({observation:V,rank:0,snippet:V.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["concept-filter"]}})),$);return Of(E,f).slice(0,$)}let O=AS([...f.file?[f.file]:[],...f.files??[]]);if(O.length>0){let y=O.flatMap((V)=>S.observations.searchByFile(V,$,f.projectPath)),E=Af(y.map((V)=>({observation:V,rank:0,snippet:V.title,rankingSource:"graph",explain:{strategy:"filter-only",matchedBy:["file-filter"]}})),$);return Of(E,f).slice(0,$)}return S.observations.search({query:M,type:f.type,limit:$,projectPath:f.projectPath,importanceMin:f.importanceMin,importanceMax:f.importanceMax,createdAfter:f.createdAfter,createdBefore:f.createdBefore,concepts:f.concepts,files:f.files})}function V0(S,M){if(M.type&&S.type!==M.type)return!1;if(M.importanceMin!==void 0&&S.importance<M.importanceMin)return!1;if(M.importanceMax!==void 0&&S.importance>M.importanceMax)return!1;if(M.createdAfter&&S.createdAt<M.createdAfter)return!1;if(M.createdBefore&&S.createdAt>M.createdBefore)return!1;if(M.concepts&&M.concepts.length>0){if(!M.concepts.some(($)=>S.concepts.some((A)=>A.toLowerCase().includes($.toLowerCase()))))return!1}if(M.files&&M.files.length>0){let f=[...S.filesRead,...S.filesModified];if(!M.files.some((A)=>f.some((O)=>O.toLowerCase().includes(A.toLowerCase()))))return!1}return!0}var yf=60;async function Nf(S,M,f,$){let A=$.limit??10,O=t$(M,S,$,A);if(!f)return O;let y=await e(f,S);if(!y)return O;let E=O.map((N)=>N.observation.id),V=d$(M,y,$.projectPath,$,A,$.hasVectorExtension??!1,E);if(V.length===0)return O;return e$(O,V,A)}function t$(S,M,f,$){try{return S.search({query:M,type:f.type,limit:$,projectPath:f.projectPath,importanceMin:f.importanceMin,importanceMax:f.importanceMax,createdAfter:f.createdAfter,createdBefore:f.createdBefore,concepts:f.concepts,files:f.files})}catch{return[]}}function d$(S,M,f,$,A,O,y){if(O)return s$(S,M,$,A,y);return a$(S,M,f,$,A)}function s$(S,M,f,$,A){try{let O;if(A.length>0){if(O=S.searchVecSubset(M,A,$*3),O.length===0)O=S.getVecEmbeddingMatches(M,$*3)}else O=S.getVecEmbeddingMatches(M,$*3);if(O.length===0)return[];let y=[];for(let{observationId:E,distance:V}of O){if(y.length>=$)break;let N=S.getById(E);if(!N)continue;if(!V0(N,f))continue;y.push({observation:N,rank:V-1,snippet:N.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:V}})}return y}catch{return[]}}function a$(S,M,f,$,A){let O=S.getWithEmbeddings(f,A*10);if(O.length===0)return[];let y=O.map((V)=>({id:V.id,similarity:N0(M,V.embedding)})).filter(({similarity:V})=>V>=0.3).sort((V,N)=>N.similarity-V.similarity),E=[];for(let{id:V,similarity:N}of y){if(E.length>=A)break;let J=S.getById(V);if(!J)continue;if(!V0(J,$))continue;E.push({observation:J,rank:-N,snippet:J.title,rankingSource:"vector",explain:{strategy:"hybrid",matchedBy:["vector"],vectorSimilarity:N}})}return E}function e$(S,M,f){let $=new Map;for(let A=0;A<S.length;A++){let O=S[A],y=1/(yf+A+1);$.set(O.observation.id,{score:y,result:{...O,rankingSource:"fts",explain:{strategy:"hybrid",matchedBy:["fts"],ftsRank:O.rank}}})}for(let A=0;A<M.length;A++){let O=M[A],y=1/(yf+A+1),E=$.get(O.observation.id);if(E)E.score+=y,E.result={...E.result,explain:{strategy:"hybrid",matchedBy:["fts","vector"],ftsRank:E.result.explain?.ftsRank??E.result.rank,vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}};else $.set(O.observation.id,{score:y,result:{...O,explain:{strategy:"hybrid",matchedBy:["vector"],vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}}})}return[...$.values()].sort((A,O)=>O.score-A.score).slice(0,f).map(({score:A,result:O})=>({...O,explain:{...O.explain??{strategy:"hybrid",matchedBy:[]},strategy:"hybrid",matchedBy:O.explain?.matchedBy??[],rrfScore:A,ftsRank:O.explain?.ftsRank,vectorDistance:O.explain?.vectorDistance,vectorSimilarity:O.explain?.vectorSimilarity}}))}async function Ef(S,M,f,$){return Nf(M,S.observations,S.embeddingModel,{type:f.type,limit:$,projectPath:f.projectPath,hasVectorExtension:S.hasVectorExtension,importanceMin:f.importanceMin,importanceMax:f.importanceMax,createdAfter:f.createdAfter,createdBefore:f.createdBefore,concepts:f.concepts,files:f.files})}async function Vf(S,M,f,$){if(!S.embeddingModel)return E0(S,M,f,$);let A=await e(S.embeddingModel,M);if(!A)return E0(S,M,f,$);if(S.hasVectorExtension)try{let V=S.observations.getVecEmbeddingMatches(A,$*3);if(V.length===0)return[];let N=[];for(let{observationId:J,distance:B}of V){if(N.length>=$)break;let Q=S.observations.getById(J);if(!Q)continue;if(!V0(Q,f))continue;N.push({observation:Q,rank:B-1,snippet:Q.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorDistance:B}})}return N}catch{return E0(S,M,f,$)}let O=S.observations.getWithEmbeddings(f.projectPath,$*10);if(O.length===0)return[];let y=O.map((V)=>({id:V.id,similarity:N0(A,V.embedding)})).filter(({similarity:V})=>V>=0.3).sort((V,N)=>N.similarity-V.similarity),E=[];for(let{id:V,similarity:N}of y){if(E.length>=$)break;let J=S.observations.getById(V);if(!J)continue;if(!V0(J,f))continue;E.push({observation:J,rank:-N,snippet:J.title,rankingSource:"vector",explain:{strategy:"semantic",matchedBy:["vector"],vectorSimilarity:N}})}return E}class X1{observations;embeddingModel;hasVectorExtension;reranker;userObservationRepo;entityRepo;strategyRegistry;constructor(S,M,f,$=null,A=null,O=null,y=null){this.observations=S;this.embeddingModel=M;this.hasVectorExtension=f;this.reranker=$;this.userObservationRepo=A;this.entityRepo=O;if(this.strategyRegistry=y??new W1,!this.strategyRegistry.get("filter-only"))this.strategyRegistry.register("filter-only",(E,V)=>E0({observations:this.observations,embeddingModel:this.embeddingModel,hasVectorExtension:this.hasVectorExtension},V.query,E,V.limit));if(!this.strategyRegistry.get("semantic"))this.strategyRegistry.register("semantic",(E,V)=>Vf({observations:this.observations,embeddingModel:this.embeddingModel,hasVectorExtension:this.hasVectorExtension},V.query,E,V.limit));if(!this.strategyRegistry.get("hybrid"))this.strategyRegistry.register("hybrid",(E,V)=>Ef({observations:this.observations,embeddingModel:this.embeddingModel,hasVectorExtension:this.hasVectorExtension},V.query,E,V.limit))}async search(S,M){let f=M.strategy??"hybrid",$=M.limit??10,A=this.normalizeOptions(M),O=this.strategyRegistry.get(f);if(!O)throw Error(`Unknown search strategy: ${f}`);let y=await O(A,{query:S,limit:$});if(y=y.map((E)=>({...E,source:"project"})),this.entityRepo&&S.trim())y=await $f(S,y,this.entityRepo,this.observations,$);if(this.userObservationRepo){let E=this.searchUserMemory(S,$);y=this.mergeResults(y,E,$)}if(this.reranker&&y.length>1)return this.reranker.rerank(S,y,$);return y}normalizeOptions(S){let M=S.concept?Array.from(new Set([S.concept,...S.concepts??[]])):S.concepts,f=S.file?Array.from(new Set([S.file,...S.files??[]])):S.files;return{...S,concepts:M,files:f}}searchUserMemory(S,M){if(!this.userObservationRepo)return[];try{return this.userObservationRepo.search({query:S,limit:M}).map(({observation:$,rank:A})=>({observation:o$($),rank:A,snippet:$.title,source:"user",rankingSource:"user-memory",explain:{strategy:"filter-only",matchedBy:["user-memory"]}}))}catch{return[]}}mergeResults(S,M,f){let $=new Set(S.map((y)=>y.observation.id)),A=new Set(S.map((y)=>`${y.observation.title}::${y.observation.narrative}`)),O=M.filter((y)=>{if($.has(y.observation.id))return!1;let E=`${y.observation.title}::${y.observation.narrative}`;if(A.has(E))return!1;return A.add(E),!0});return[...S,...O].slice(0,f)}}function o$(S){return{id:S.id,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:"",toolName:S.toolName,createdAt:S.createdAt,tokenCount:S.tokenCount,discoveryTokens:0,importance:S.importance}}import{generateText as SA}from"ai";class Jf{languageModel;maxCandidates;provider;modelName;rateLimitingEnabled;_generate=SA;constructor(S,M){this.languageModel=S,this.maxCandidates=M.rerankingMaxCandidates,this.provider=M.provider??"",this.modelName=M.model??"",this.rateLimitingEnabled=M.rateLimitingEnabled??!0}async rerank(S,M,f){if(M.length<=1)return M;let $=M.slice(0,this.maxCandidates),A=M.slice(this.maxCandidates),O=KM(S,$.map((E)=>({title:E.observation.title,narrative:E.observation.narrative}))),y=2;for(let E=0;E<=y;E++)try{if(this.provider==="google")await P(this.modelName,this.rateLimitingEnabled);let{text:V}=await this._generate({model:this.languageModel,maxOutputTokens:512,prompt:O}),N=JM(V);if(!N)return M.slice(0,f);let J=this.applyReranking($,N,f);for(let B of A){if(J.length>=f)break;J.push(B)}return J}catch(V){if(MA(V)&&E<y){await fA(2**E*1000);continue}return M.slice(0,f)}return M.slice(0,f)}applyReranking(S,M,f){let $=[],A=new Set;for(let O of M)if(O>=0&&O<S.length&&!A.has(O)){if(A.add(O),$.push(S[O]),$.length>=f)break}if($.length<f){for(let O=0;O<S.length&&$.length<f;O++)if(!A.has(O))$.push(S[O])}return $}}class Bf{async rerank(S,M,f){if(M.length<=1)return M.slice(0,f);let $=K1(S),A=M.map((O)=>({result:O,score:this.scoreCandidate(O,$)}));return A.sort((O,y)=>y.score-O.score),A.slice(0,f).map((O)=>O.result)}scoreCandidate(S,M){let f=S.observation,$=K1(f.title),A=K1(f.narrative),O=new Set(f.concepts.map((z)=>z.toLowerCase())),y=0,E=0,V=0;for(let z of M){if($.has(z))y++;if(A.has(z))E++;if(O.has(z))V++}let N=M.size||1,J=y/N*0.4,B=E/N*0.3,Q=V/N*0.15,W=(Date.now()-new Date(f.createdAt).getTime())/86400000,R=W<1?0.1:W<7?0.05:0,X=f.importance/5*0.05;return J+B+Q+R+X}}function Qf(S,M){if(!S.rerankingEnabled)return null;if(M)return new Jf(M,S);return new Bf}function K1(S){return new Set(S.toLowerCase().split(/[\s\-_./\\,;:!?()[\]{}'"]+/).filter((M)=>M.length>1))}function MA(S){if(typeof S!=="object"||S===null)return!1;let M=S,f=M.status;if(f===429||f===500||f===503)return!0;let $=M.error;if(typeof $==="object"&&$!==null&&$.type==="overloaded_error")return!0;return!1}function fA(S){return new Promise((M)=>setTimeout(M,S))}function _f(S){return S}function Rf(S){return S}function Wf(S){return S}function Xf(S){if(!S)return null;return S}import{spawnSync as Kf}from"child_process";import{dirname as $A,resolve as Zf}from"path";function AA(S){try{let M=Kf("git",["rev-parse","--git-common-dir"],{cwd:S,encoding:"utf-8",timeout:5000});if(M.status!==0||!M.stdout)return null;let f=M.stdout.trim();if(f===".git")return null;let $=Kf("git",["rev-parse","--git-dir"],{cwd:S,encoding:"utf-8",timeout:5000});if($.status!==0||!$.stdout)return null;let A=$.stdout.trim(),O=Zf(S,f),y=Zf(S,A);if(O===y)return null;let E=$A(O);if(E===O||E==="/")return null;return E}catch{return null}}function Yf(S){return AA(S)??S}function EA(){try{let M=import.meta.url;if(M&&!M.includes("[eval]")){let f=yA(NA(M));return f.endsWith("dist")||f.endsWith("dist/")||f.endsWith("dist\\")?f:o(f,"..","dist")}}catch{}let S=[o(process.env.HOME||"",".config","opencode","node_modules","open-mem","dist"),o(process.cwd(),"node_modules","open-mem","dist")];for(let M of S)if(OA(o(M,"daemon.js")))return M;return o(process.cwd(),"node_modules","open-mem","dist")}async function VA(S){let M=EA(),f=Yf(S.directory),$=X0(f),A=d1($);for(let v of A)console.warn(`[open-mem] ${v}`);await s1($),SS.enableExtensionSupport();let O=MS($.dbPath);pM(O,{hasVectorExtension:O.hasVectorExtension,embeddingDimension:$.embeddingDimension});let y=new E1(O),E=new y1(O),V=new V1(O),N=new N1(O),J=new M1(O),B=new A1(O),Q=null,_=null;if($.userMemoryEnabled)try{Q=new J1($.userMemoryDbPath),_=new B1(Q.database)}catch(v){console.warn(`[open-mem] Failed to initialize user-level memory: ${v}`)}let W=new Y0($),R=new vS($),X=$.provider!=="bedrock",z=$.compressionEnabled&&(!X||$.apiKey)?YM({provider:$.provider,model:$.model,apiKey:$.apiKey}):null,L=new R1,C=$.conflictResolutionEnabled&&(!X||$.apiKey)?new qS({provider:$.provider,apiKey:$.apiKey,model:$.model,rateLimitingEnabled:$.rateLimitingEnabled}):null,U=$.entityExtractionEnabled&&(!X||$.apiKey)?new PS({provider:$.provider,apiKey:$.apiKey,model:$.model,rateLimitingEnabled:$.rateLimitingEnabled}):null,j=new $1(O),x=new _1($,W,R,N,E,y,V,z,C,U,j,L.createQueueObserver()),k=ff(x);k.start();let T=()=>{let v=x.getStats(),g=L.snapshot({mode:x.getMode(),running:x.isRunning,processing:v.processing,pending:v.pending});return{status:g.queue.lastError?"degraded":"ok",timestamp:new Date().toISOString(),uptimeMs:g.uptimeMs,queue:g.queue,batches:g.batches,enqueueCount:g.enqueueCount}},OS=Qf($,$.rerankingEnabled&&(!X||$.apiKey)?q({provider:$.provider,model:$.model,apiKey:$.apiKey},h($)):null),I=new X1(E,z,O.hasVectorExtension,OS,_,j),L0=new aS({observations:_f(E),sessions:Rf(y),summaries:Wf(V),searchOrchestrator:I,projectPath:f,config:$,userObservationRepo:Xf(_),runtimeSnapshotProvider:T,configAuditStore:J,maintenanceHistoryStore:B}),Z1=NM(L0),c=null,S0=null;if($.daemonEnabled)if(qM($.dbPath),c=new oS({dbPath:$.dbPath,projectPath:f,daemonScript:o(M,"daemon.js")}),c.start())k.setEnqueueOnly(()=>c?.signal("PROCESS_NOW")),console.log("[open-mem] Background daemon started \u2014 processing delegated"),S0=setInterval(()=>{if(c&&!c.isRunning()){if(console.warn("[open-mem] Daemon died, falling back to in-process processing"),k.setInProcess(),S0)clearInterval(S0),S0=null}},30000);else console.warn("[open-mem] Daemon failed to start \u2014 using in-process processing"),c=null;let yS=null,NS=null,C0=null;if($.dashboardEnabled){NS=bM(),C0=new wS(NS);let v=AM({config:$,projectPath:f,embeddingModel:z,memoryEngine:L0,runtimeStatusProvider:T,sseHandler:yM(C0),dashboardDir:o(M,"dashboard")}),g=$.dashboardPort,ES="127.0.0.1";U1(ES,"Dashboard server");let VS=g,Y1=!1;for(let J0=0;J0<10;J0++){VS=g+J0;try{yS=Bun.serve({port:VS,hostname:ES,idleTimeout:0,fetch:v.fetch}),Y1=!0;break}catch{}}if(Y1)console.log(`[open-mem] Dashboard available at http://${ES}:${VS}`);else console.warn(`[open-mem] Could not start dashboard \u2014 ports ${g}-${g+9} all busy`);let Uf=NS,Df=E.create.bind(E);E.create=(...J0)=>{let z1=Df(...J0);return Uf.emit("observation:created",z1),z1}}let zf=()=>{if(S0)clearInterval(S0);if(c)c.stop();if(k.stop(),yS)yS.stop();if(C0)C0.destroy();if(Q)Q.close();O.close()};return process.on("beforeExit",zf),{"tool.execute.after":Mf($,x,y,f),"chat.message":tM(E,y,f,$.sensitivePatterns),event:Sf(x,y,f,$,E,N),"experimental.chat.system.transform":aM($,E,y,V,f,_),"experimental.session.compacting":sM($,E,y,V,f,_),tool:{...Z1}}}export{VA as default};