claude-mem 13.24.21 → 13.24.22

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.
@@ -17,7 +17,7 @@ ${h.stack??""}
17
17
  `)}debug(e,t,n,s){this.log(0,e,t,n,s)}info(e,t,n,s){this.log(1,e,t,n,s)}warn(e,t,n,s){this.log(2,e,t,n,s)}setErrorSink(e){es=e}error(e,t,n,s){this.log(3,e,t,n,s),this.routeErrorToSink(t,n,s)}routeErrorToSink(e,t,n){try{if(!es||!(n instanceof Error))return;es(n)}catch{}}dataIn(e,t,n,s){this.info(e,`\u2192 ${t}`,n,s)}dataOut(e,t,n,s){this.info(e,`\u2190 ${t}`,n,s)}success(e,t,n,s){this.info(e,`\u2713 ${t}`,n,s)}failure(e,t,n,s){this.error(e,`\u2717 ${t}`,n,s)}},d=new rs});var me=require("fs"),qi=require("os"),fr=require("path");U();var nt=L.transcriptsConfig(),pr=L.transcriptsState(),iu={version:1,schemas:{},watches:[],stateFile:pr};function ou(r){let e=typeof r.schema=="string"?r.schema:r.schema?.name;if(!(r.name==="codex"||e==="codex")||!r.path)return!1;let n=K(r.path).replace(/\\/g,"/"),s=(0,fr.join)((0,qi.homedir)(),".codex","sessions").replace(/\\/g,"/");return n===`${s}/**/*.jsonl`}function zi(r){let e=typeof r.schema=="string"?r.schema:r.schema?.name,t=r.name==="codex"&&(!e||e==="codex");return r.context?.mode==="agents"&&t&&ou(r)}function K(r){return r&&Vi(r)}function Tt(r=nt){let e=K(r);if(!(0,me.existsSync)(e))throw new Error(`Transcript watch config not found: ${e}`);let t=(0,me.readFileSync)(e,"utf-8"),n=JSON.parse(t);if(!n.version||!n.watches)throw new Error(`Invalid transcript watch config: ${e}`);return n.stateFile||(n.stateFile=pr),n}function gr(r=nt){let e=K(r),t=(0,fr.dirname)(e);(0,me.existsSync)(t)||(0,me.mkdirSync)(t,{recursive:!0}),(0,me.writeFileSync)(e,JSON.stringify(iu,null,2))}var W=require("fs"),se=require("path");A();var Ee=require("fs"),Ji=require("path");A();function Xi(r){try{if(!(0,Ee.existsSync)(r))return{offsets:{}};let e=(0,Ee.readFileSync)(r,"utf-8"),t=JSON.parse(e);return t.offsets?t:{offsets:{}}}catch(e){return d.warn("TRANSCRIPT","Failed to load watch state, starting fresh",{statePath:r,error:e instanceof Error?e.message:String(e)}),{offsets:{}}}}function Qi(r,e){try{let t=(0,Ji.dirname)(r);(0,Ee.existsSync)(t)||(0,Ee.mkdirSync)(t,{recursive:!0}),(0,Ee.writeFileSync)(r,JSON.stringify(e,null,2))}catch(t){d.warn("TRANSCRIPT","Failed to save watch state",{statePath:r,error:t instanceof Error?t.message:String(t)})}}var cr=he(require("path"),1);var F=he(require("path"),1),Fo=require("crypto"),P=require("fs");var ns=require("node:child_process");function Pt(r,e,t){return(0,ns.spawn)(r,e??[],{windowsHide:!0,...t})}var au=new Set([".cmd",".bat"]),cu=new Set([".exe",".com"]),pm=new Set([...cu,...au]);A();var V={HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5},Oe={SUCCESS:0,BLOCKING_ERROR:2};function ke(r){return process.platform==="win32"?Math.round(r*V.WINDOWS_MULTIPLIER):r}var hr=require("fs"),ss=require("path"),It=require("os");et();var lu="security_alert",q=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_API_TIMEOUT_MS:String(ke(V.API_REQUEST)),CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_DATA_DIR:(0,ss.join)((0,It.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_CLAUDE_CONFIG_DIR:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:(0,ss.join)((0,It.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database",CLAUDE_MEM_CHROMA_PREWARM_TIMEOUT_MS:"120000",CLAUDE_MEM_CHROMA_MAX_PENDING_MUTATIONS:"5000",CLAUDE_MEM_CLOUD_SYNC_TOKEN:"",CLAUDE_MEM_CLOUD_SYNC_USER_ID:"",CLAUDE_MEM_CLOUD_SYNC_HUB_URL:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME:(0,It.hostname)(),CLAUDE_MEM_CLOUD_SYNC_WS:"true",CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE:"40",CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS:"90000",CLAUDE_MEM_TV_TOKEN:"",CLAUDE_MEM_PRO_TRIAL_EMAIL:"",CLAUDE_MEM_PRO_TRIAL_AT:"",CLAUDE_MEM_PRO_TRIAL_STATE:"",CLAUDE_MEM_PRO_TRIAL_ENDS_AT:"",CLAUDE_MEM_PRO_PLAN:"",CLAUDE_MEM_PRO_FALLBACK_AT:"",CLAUDE_MEM_PRO_MEMORY_KEY:"",CLAUDE_MEM_PRO_MEMORY_BASE_URL:"",CLAUDE_MEM_PRO_MEMORY_MODEL:"",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert,sensitive",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_AWARENESS_ENABLED:"true",CLAUDE_MEM_GROK_BOT_AWARENESS_AGENT_IDS:"521e962d-2ec3-4488-bfbc-54d5209ce118,95601360-61f7-4fd9-bb3a-2c976b2b85c0",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_CONCEPTS:"",CLAUDE_MEM_CCS_ALIGN_ENABLED:"true",CLAUDE_MEM_CCS_ALIGN_VIEWER_IDS:"ccs-align",CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS:"false",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:""};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){let t=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(t):t}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,t){let n=t?this.applyEnvOverrides(e):e;return n.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(n.CLAUDE_MEM_WORKER_HOST),n}static getInt(e){let t=this.get(e);return parseInt(t,10)}static applyEnvOverrides(e){let t={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(t[n]=process.env[n]);return t}static loadFromFile(e,t=!0){try{if(!(0,hr.existsSync)(e)){let l=this.getAllDefaults();try{Ze(e,l),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(u){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,u instanceof Error?u.message:String(u))}return this.finalizeSettings(l,t)}let n=(0,hr.readFileSync)(e,"utf-8"),s=xe(n),i=s,o=s.env&&typeof s.env=="object"&&!Array.isArray(s.env),a=o&&Object.keys(s).some(l=>l!=="env");if(o&&(i=s.env,!a))try{Ze(e,i),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(l){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,l instanceof Error?l.message:String(l))}if(i.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===lu){i={...i,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{Ze(e,a?{...s,env:i}:i),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(l){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,l instanceof Error?l.message:String(l))}}let c={...this.DEFAULTS};for(let l of Object.keys(this.DEFAULTS))i[l]!==void 0&&(c[l]=i[l]);return this.finalizeSettings(c,t)}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let s=this.getAllDefaults();return this.finalizeSettings(s,t)}}};U();U();var mr=null;function ye(){return mr!==null||(mr=q.loadFromFile(rt)),mr}var we=require("fs");A();var be=require("fs"),us=he(require("path"),1);A();var uu=["CLAUDECODE_","CLAUDE_CODE_"],du=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID"]),fu=new Set(["HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","NO_PROXY","http_proxy","https_proxy","all_proxy","no_proxy","npm_config_proxy","npm_config_https_proxy","npm_config_noproxy"]),pu=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY","CLAUDE_CODE_SKIP_BEDROCK_AUTH","CLAUDE_CODE_SKIP_VERTEX_AUTH","CLAUDE_CODE_SKIP_FOUNDRY_AUTH","ANTHROPIC_BEDROCK_BASE_URL","AWS_REGION","AWS_PROFILE","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","ANTHROPIC_VERTEX_PROJECT_ID","CLOUD_ML_REGION","GOOGLE_APPLICATION_CREDENTIALS",...fu]);function Rt(r=process.env){let e={};for(let[t,n]of Object.entries(r))if(n!==void 0){if(pu.has(t)){e[t]=n;continue}du.has(t)||uu.some(s=>t.startsWith(s))||(e[t]=n)}return e}U();var os=require("child_process"),eo=require("fs");A();var gu=5e3,Zi=new Map,is=0;function hu(r){is+=1;let e=(0,os.spawnSync)("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${r}").CreationDate.ToString('yyyyMMddHHmmss.ffffff')`],{encoding:"utf-8",timeout:5e3,windowsHide:!0,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(e.status===0){let t=e.stdout.trim();return t.length>0?t:null}return null}function mu(r,e=!1){if(!e){let n=Zi.get(r);if(n&&Date.now()-n.capturedAtMs<gu)return n.token}let t=null;try{t=hu(r)}catch(n){d.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:r,error:n instanceof Error?n.message:String(n)}),t=null}return Zi.set(r,{token:t,capturedAtMs:Date.now()}),t}function to(r,e){if(!Number.isInteger(r)||r<=0)return null;if(process.platform==="linux"){is+=1;try{let t=(0,eo.readFileSync)(`/proc/${r}/stat`,"utf-8"),n=t.lastIndexOf(") ");if(n<0)return null;let i=t.slice(n+2).split(" ")[19];return i&&/^\d+$/.test(i)?i:null}catch(t){return d.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:r,error:t instanceof Error?t.message:String(t)}),null}}if(process.platform==="win32")return mu(r,e);is+=1;try{let t=(0,os.spawnSync)("ps",["-p",String(r),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(t.status!==0)return null;let n=t.stdout.trim();return n.length>0?n:null}catch(t){return d.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:r,error:t instanceof Error?t.message:String(t)}),null}}function De(r){return to(r,!1)}function Se(r,e){if(e===null)return!0;let t=to(r,!0);return t===null?!0:t===e}var ro=require("child_process"),yr=require("fs"),no=require("util");A();var as=(0,no.promisify)(ro.execFile),_u=128,Eu=/not found|no running instance|no tasks/i,_r=class extends Error{pid;constructor(e,t,n){super(t,n),this.name="ProcessTreeKillError",this.pid=e}};async function ae(r,e={}){let t=e.signalMode==="immediate",n=e.expectedStartToken!==void 0?e.expectedStartToken:De(r),s=()=>Se(r,n);if(!s()){d.warn("PROCESS","Skipping tree-kill: root PID was reused since it was captured",{pid:r});return}if(d.debug("PROCESS",`Killing process tree rooted at PID ${r}`,{immediate:t}),process.platform==="win32"){try{await as("taskkill",["/PID",String(r),"/T","/F"],{timeout:5e3,windowsHide:!0})}catch(i){let o=i.code,a=String(i.stderr??""),c=i instanceof Error?i.message:String(i);if(o===_u||Eu.test(`${a} ${c}`)){d.debug("PROCESS","taskkill reported the process was already gone",{pid:r});return}throw new _r(r,`taskkill failed for PID ${r} (exit ${String(o)}): ${a.trim()||c}`,{cause:i})}return}try{let i=t?"SIGKILL":"SIGTERM",o=await Er(r);for(let l of o){if(!Se(l.pid,l.startToken)){d.debug("PROCESS",`Skipping ${i}: descendant PID was reused since enumeration`,{pid:l.pid,rootPid:r});continue}try{process.kill(l.pid,i)}catch{}}if(s())try{process.kill(r,i)}catch(l){let u=l instanceof Error?l:new Error(String(l)),f=u.code;f!=="ESRCH"&&d.debug("PROCESS",`Failed to ${i} PID ${r}`,{code:f},u)}else d.warn("PROCESS","Skipping root signal: PID was reused during descendant enumeration",{pid:r,signal:i});t||await new Promise(l=>setTimeout(l,500));let a=s()?await Er(r):[],c=new Map;for(let l of o)c.set(l.pid,l.startToken);for(let l of a)c.set(l.pid,l.startToken);for(let[l,u]of c){if(!Se(l,u)){d.debug("PROCESS","Skipping SIGKILL: descendant PID was reused since the scan",{pid:l,rootPid:r});continue}try{process.kill(l,"SIGKILL")}catch{}}if(!t&&s())try{process.kill(r,"SIGKILL")}catch{}}catch(i){throw new _r(r,`tree-kill failed for PID ${r}: ${i instanceof Error?i.message:String(i)}`,{cause:i})}}async function yu(){return process.platform==="win32"?wu():process.platform==="linux"?Su():bu()}function Su(){let r=[],e;try{e=(0,yr.readdirSync)("/proc")}catch(t){return d.warn("PROCESS","Cannot read /proc \u2014 tree-kill degrades to a single-PID kill",{error:t instanceof Error?t.message:String(t)}),r}for(let t of e){if(!/^\d+$/.test(t))continue;let n;try{n=(0,yr.readFileSync)(`/proc/${t}/stat`,"utf-8")}catch{continue}let s=n.lastIndexOf(") ");if(s<0)continue;let i=n.slice(s+2).split(" "),o=Number.parseInt(i[1]??"",10),a=i[19];Number.isFinite(o)&&r.push({pid:Number.parseInt(t,10),ppid:o,startToken:a&&/^\d+$/.test(a)?a:null})}return r}async function bu(){let r;try{r=(await as("ps",["-eo","pid=,ppid=,lstart="],{timeout:1e4,maxBuffer:33554432,env:{...process.env,LC_ALL:"C",LANG:"C"}})).stdout}catch(t){return d.warn("PROCESS","Cannot enumerate the process table \u2014 tree-kill degrades to a single-PID kill",{error:t instanceof Error?t.message:String(t)}),[]}let e=[];for(let t of r.split(`
18
18
  `)){let n=t.trim().match(/^(\d+)\s+(\d+)\s+(.*)$/);if(!n)continue;let s=n[3].trim();e.push({pid:Number.parseInt(n[1],10),ppid:Number.parseInt(n[2],10),startToken:s.length>0?s:null})}return e}async function wu(){let r;try{r=(await as("powershell.exe",["-NoProfile","-NonInteractive","-Command","Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,@{Name='StartToken';Expression={$_.CreationDate.ToString('yyyyMMddHHmmss.ffffff')}} | ConvertTo-Csv -NoTypeInformation"],{timeout:3e4,windowsHide:!0,maxBuffer:33554432})).stdout}catch(t){return d.warn("PROCESS","Cannot enumerate the Windows process table \u2014 tree-kill degrades to a single-PID kill",{error:t instanceof Error?t.message:String(t)}),[]}let e=[];for(let t of r.split(/\r?\n/).slice(1)){let n=t.match(/^"(\d+)","(\d+)","(.*)"$/);if(!n)continue;let s=n[3].trim();e.push({pid:Number.parseInt(n[1],10),ppid:Number.parseInt(n[2],10),startToken:s.length>0?s:null})}return e}async function Er(r){let e=await yu(),t=new Map;for(let o of e){let a=t.get(o.ppid);a?a.push(o):t.set(o.ppid,[o])}let n=new Set([r]),s=[],i=o=>{for(let a of t.get(o)??[])n.has(a.pid)||(n.add(a.pid),i(a.pid),s.push({pid:a.pid,startToken:a.startToken}))};return i(r),s}var vu=5e3,Au=1e3,Tu=L.supervisorRegistry();function H(r){if(!Number.isInteger(r)||r<0||r===0)return!1;try{return process.kill(r,0),!0}catch(e){if(e instanceof Error){let t=e.code;return t==="EPERM"?!0:(d.debug("SYSTEM","PID check failed",{pid:r,code:t}),!1)}return d.warn("SYSTEM","PID check threw non-Error",{pid:r,error:String(e)}),!1}}async function Sr(r,e){let t=Date.now()+e;for(;Date.now()<t;){if(r.every(n=>!H(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function br(r){if(!r||!H(r.pid))return!1;if(!r.startToken)return!0;let e=De(r.pid);if(e===null)return!0;let t=e===r.startToken;return t||d.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:r.pid,stored:r.startToken,current:e}),t}var ds=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;constructor(e=Tu){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,(0,be.mkdirSync)(us.default.dirname(this.registryPath),{recursive:!0}),!(0,be.existsSync)(this.registryPath)){this.persist();return}try{let n=JSON.parse((0,be.readFileSync)(this.registryPath,"utf-8")).processes??{};for(let[s,i]of Object.entries(n))this.entries.set(s,i)}catch(t){t instanceof Error?d.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},t):d.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(t)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&d.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}register(e,t,n){this.initialize(),this.entries.set(e,t),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e){this.initialize();let t=this.entries.get(e);this.entries.delete(e),this.runtimeProcesses.delete(e),this.persist(),t?.type==="sdk"&&ls()}clear(){this.entries.clear(),this.runtimeProcesses.clear(),this.persist()}getAll(){return this.initialize(),Array.from(this.entries.entries()).map(([e,t])=>({id:e,...t})).sort((e,t)=>{let n=Date.parse(e.startedAt),s=Date.parse(t.startedAt);return(Number.isNaN(n)?0:n)-(Number.isNaN(s)?0:s)})}getBySession(e){let t=String(e);return this.getAll().filter(n=>n.sessionId!==void 0&&String(n.sessionId)===t)}getRuntimeProcess(e){return this.runtimeProcesses.get(e)}pruneDeadEntries(){this.initialize();let e=0,t=0;for(let[n,s]of this.entries)H(s.pid)||(this.entries.delete(n),this.runtimeProcesses.delete(n),e+=1,s.type==="sdk"&&(t+=1));e>0&&this.persist();for(let n=0;n<t;n+=1)ls();return e}async reapSession(e){this.initialize();let t=this.getBySession(e);if(t.length===0)return 0;let n=typeof e=="number"?e:Number(e)||void 0;d.info("SYSTEM",`Reaping ${t.length} process(es) for session ${e}`,{sessionId:n,pids:t.map(a=>a.pid)});let s=t.filter(a=>H(a.pid)),i=new Map(s.map(a=>[a.pid,De(a.pid)]));for(let a of s)try{process.platform==="win32"?await ae(a.pid,{expectedStartToken:i.get(a.pid)??null}):typeof a.pgid=="number"?process.kill(-a.pgid,"SIGTERM"):process.kill(a.pid,"SIGTERM")}catch(c){c instanceof Error?c.code!=="ESRCH"&&d.debug("SYSTEM",`Failed to SIGTERM session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},c):d.warn("SYSTEM",`Failed to SIGTERM session process PID ${a.pid} (non-Error)`,{pid:a.pid,pgid:a.pgid,error:String(c)})}await Sr(s,vu);let o=s.filter(a=>H(a.pid));for(let a of o){d.warn("SYSTEM",`Session process PID ${a.pid} did not exit after SIGTERM, sending SIGKILL`,{pid:a.pid,pgid:a.pgid,sessionId:n});let c=i.get(a.pid)??null;if(!Se(a.pid,c)){d.warn("SYSTEM","Skipping SIGKILL: session process PID was reused during the grace window",{pid:a.pid,sessionId:n});continue}try{process.platform==="win32"?await ae(a.pid,{expectedStartToken:c}):typeof a.pgid=="number"?process.kill(-a.pgid,"SIGKILL"):process.kill(a.pid,"SIGKILL")}catch(l){l instanceof Error?l.code!=="ESRCH"&&d.debug("SYSTEM",`Failed to SIGKILL session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},l):d.warn("SYSTEM",`Failed to SIGKILL session process PID ${a.pid} (non-Error)`,{pid:a.pid,pgid:a.pgid,error:String(l)})}}if(o.length>0){let a=Date.now()+Au;for(;Date.now()<a&&o.filter(l=>H(l.pid)).length!==0;)await new Promise(l=>setTimeout(l,100))}for(let a of t)this.entries.delete(a.id),this.runtimeProcesses.delete(a.id);this.persist();for(let a of t)a.type==="sdk"&&ls();return d.info("SYSTEM",`Reaped ${t.length} process(es) for session ${e}`,{sessionId:n,reaped:t.length}),t.length}persist(){let e={processes:Object.fromEntries(this.entries.entries())};(0,be.mkdirSync)(us.default.dirname(this.registryPath),{recursive:!0}),(0,be.writeFileSync)(this.registryPath,JSON.stringify(e,null,2))}},cs=null;function wr(){return cs||(cs=new ds),cs}var Dm=180*1e3,Pu=[];function ls(){let r=Pu.shift();r&&r.notify()}var st=require("fs");A();U();var Iu=L.workerPid();async function io(r){let e=r.currentPid??process.pid,t=r.pidFilePath??Iu,n=r.registry.getAll(),s=[...n].filter(c=>c.pid!==e).sort((c,l)=>Date.parse(l.startedAt)-Date.parse(c.startedAt)),i=new Map,o=new Map;for(let c of s){if(!H(c.pid)){r.registry.unregister(c.id);continue}o.set(c.id,De(c.pid)),i.set(c.id,await Er(c.pid));try{await so(c,"SIGTERM")}catch(l){l instanceof Error?d.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:c.pid,pgid:c.pgid,type:c.type},l):d.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(l)})}}await Sr(s,5e3);let a=s.filter(c=>H(c.pid)||(i.get(c.id)??[]).some(l=>H(l.pid)));for(let c of a){let l=Se(c.pid,o.get(c.id)??null);l||d.warn("SYSTEM","Skipping tree-kill: root PID was reused during the grace window",{pid:c.pid,type:c.type});try{l&&await so(c,"SIGKILL")}catch(u){u instanceof Error?d.debug("SYSTEM","Failed to force kill child process",{pid:c.pid,pgid:c.pgid,type:c.type},u):d.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(u)})}finally{Ru(i.get(c.id)??[],c.pid)}}await Sr(a,1e3);for(let c of s)r.registry.unregister(c.id);for(let c of n.filter(l=>l.pid===e))r.registry.unregister(c.id);oo(t,e),r.registry.pruneDeadEntries()}function oo(r,e,t=!1){if(!(0,st.existsSync)(r))return;let n=null;try{let o=JSON.parse((0,st.readFileSync)(r,"utf-8"));n=typeof o.pid=="number"?o.pid:null}catch(o){d.debug("SYSTEM","PID file unreadable \u2014 leaving it (cannot prove ownership)",{pidFilePath:r,error:o instanceof Error?o.message:String(o)});return}let s=e!==null&&n===e,i=n===null||!H(n);if(!s&&!(t&&i)){d.debug("SYSTEM","PID file not owned by this process \u2014 leaving it for its owner (restart successor?)",{pidFilePath:r,recordedPid:n,currentPid:e});return}try{(0,st.rmSync)(r,{force:!0})}catch(o){o instanceof Error?d.debug("SYSTEM","Failed to remove PID file",{pidFilePath:r},o):d.warn("SYSTEM","Failed to remove PID file (non-Error)",{pidFilePath:r,error:String(o)})}}function Ru(r,e){for(let{pid:t,startToken:n}of r)if(!(t===e||!H(t))){if(!Se(t,n)){d.debug("SYSTEM","Skipping reap: PID was recycled during the grace window",{pid:t,rootPid:e});continue}try{process.kill(t,"SIGKILL"),d.debug("SYSTEM","Reaped orphaned descendant during shutdown cascade",{pid:t,rootPid:e})}catch(s){let i=s instanceof Error?s.code:void 0;i!=="ESRCH"&&d.warn("SYSTEM","Failed to reap orphaned descendant during shutdown cascade",{pid:t,rootPid:e,errno:i})}}}async function so(r,e){let{pid:t,pgid:n}=r;if(process.platform!=="win32"){if(typeof n=="number")try{process.kill(-n,e);return}catch(s){if((s instanceof Error?s.code:void 0)!=="ESRCH")throw s}if(e==="SIGKILL"){await ae(t,{signalMode:"immediate"});return}try{process.kill(t,e)}catch(s){if((s instanceof Error?s.code:void 0)!=="ESRCH")throw s}return}await ae(t)}A();var ao=3e4,it=null;function Cu(){let e=wr().pruneDeadEntries();e>0&&d.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function co(){it===null&&(it=setInterval(Cu,ao),it.unref(),d.debug("SYSTEM","Health checker started",{intervalMs:ao}))}function lo(){it!==null&&(clearInterval(it),it=null,d.debug("SYSTEM","Health checker stopped"))}var uo=require("child_process"),fo=require("util");A();var Mu=(0,fo.promisify)(uo.execFile),xu=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/;function Fu(r){let e=[];for(let t of r.split(`
19
19
  `)){let n=t.trim().match(/^(\d+)\s+(\d+)\s+(.*)$/);n&&e.push({pid:Number.parseInt(n[1],10),ppid:Number.parseInt(n[2],10),command:n[3].trim()})}return e}async function Ou(){let r=await Mu("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Fu(r.stdout)}function ku(r,e){let t=r.filter(o=>xu.test(o.command)&&o.pid!==e.selfPid),n=new Set(t.map(o=>o.pid)),s=t.filter(o=>!n.has(o.ppid)),i=s.filter(o=>o.ppid===e.selfPid?!1:o.ppid===1?!0:!e.isAlive(o.ppid));return{matched:t,roots:s,orphans:i}}async function po(r={}){let e=r.platform??process.platform,t={matched:0,trees:0,orphans:0,killed:0,failed:0,unregistered:0,skipped:null};if(e==="win32")return t.skipped="windows",t;let n=r.readTable??Ou,s=r.isAlive??H,i=r.killTree??(g=>ae(g,{signalMode:"graceful"})),o=r.selfPid??process.pid,a;try{a=await n()}catch(g){return d.warn("PROCESS","Orphaned chroma-mcp sweep skipped: cannot read the process table",{error:g instanceof Error?g.message:String(g)}),t.skipped="unreadable",t}let{matched:c,roots:l,orphans:u}=ku(a,{isAlive:s,selfPid:o});if(t.matched=c.length,t.trees=l.length,t.orphans=u.length,u.length===0)return d.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:t.matched,trees:t.trees}),t;d.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(g=>g.pid)});let f=new Set,p=8;for(let g=0;g<u.length;g+=p){let h=u.slice(g,g+p);(await Promise.allSettled(h.map(E=>i(E.pid)))).forEach((E,_)=>{let b=h[_];E.status==="fulfilled"?(t.killed+=1,f.add(b.pid)):(t.failed+=1,d.warn("PROCESS","Failed to reap an orphaned chroma-mcp tree",{pid:b.pid,ppid:b.ppid,error:E.reason instanceof Error?E.reason.message:String(E.reason)}))})}if(r.registry)for(let g of r.registry.getAll())g.type==="chroma"&&f.has(g.pid)&&(r.registry.unregister(g.id),t.unregistered+=1);return d.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:t.orphans,killed:t.killed,failed:t.failed,unregistered:t.unregistered}),t}U();var fs=L.workerPid(),ps=class{registry;started=!1;stopPromise=null;signalHandlersRegistered=!1;shutdownInitiated=!1;shutdownHandler=null;constructor(e){this.registry=e}async start(){if(this.started)return;if(this.registry.initialize(),vr({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,po({registry:this.registry}).catch(t=>{d.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:t instanceof Error?t.message:String(t)})}),co()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let t=async n=>{if(this.shutdownInitiated){d.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,d.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(s){s instanceof Error?d.error("SYSTEM","Error during shutdown",{},s):d.error("SYSTEM","Error during shutdown (non-Error)",{error:String(s)});try{await this.stop()}catch(i){i instanceof Error?d.debug("SYSTEM","Supervisor shutdown fallback failed",{},i):d.debug("SYSTEM","Supervisor shutdown fallback failed",{error:String(i)})}}process.exit(0)};process.on("SIGTERM",()=>{t("SIGTERM")}),process.on("SIGINT",()=>{t("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{d.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{t("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}lo(),this.stopPromise=io({registry:this.registry,currentPid:process.pid}).finally(()=>{this.started=!1,this.stopPromise=null}),await this.stopPromise}assertCanSpawn(e){if(this.stopPromise!==null)throw new Error(`Supervisor is shutting down, refusing to spawn ${e}`)}registerProcess(e,t,n){this.registry.register(e,t,n)}unregisterProcess(e){this.registry.unregister(e)}getRegistry(){return this.registry}},t_=new ps(wr());function gs(){if(!(0,we.existsSync)(fs))return null;let r;try{r=JSON.parse((0,we.readFileSync)(fs,"utf-8"))}catch{return null}return r!==null&&br(r)?r:null}function vr(r={}){let e=r.pidFilePath??fs;if(!(0,we.existsSync)(e))return"missing";let t=null;try{t=JSON.parse((0,we.readFileSync)(e,"utf-8"))}catch(s){return s instanceof Error?d.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},s):d.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(s)}),(0,we.rmSync)(e,{force:!0}),"invalid"}return br(t)&&t?((r.logAlive??!0)&&d.info("SYSTEM","Worker already running (PID alive)",{existingPid:t.pid,existingPort:t.port,startedAt:t.startedAt}),"alive"):(d.info("SYSTEM","Removing stale PID file (worker process is dead or PID has been reused)",{pid:t?.pid,port:t?.port,startedAt:t?.startedAt}),(0,we.rmSync)(e,{force:!0}),"stale")}ur();var hs=require("path"),Tr=require("fs"),ho=require("crypto");U();var Ar=require("fs");et();function go(r,e){if(!(0,Ar.existsSync)(r))return e;try{return xe((0,Ar.readFileSync)(r,"utf-8"))}catch(t){throw new Error(`Corrupt JSON file, refusing to overwrite: ${r}: ${t instanceof Error?t.message:String(t)}`)}}A();var mo="telemetry.json";function Du(r){let e=r.DO_NOT_TRACK;return e===void 0||e===""?!1:e!=="0"&&e!=="false"}function Lu(r,e){if(Du(r))return{enabled:!1,source:"DO_NOT_TRACK"};let t=r.CLAUDE_MEM_TELEMETRY?.toLowerCase();return t==="0"||t==="false"||t==="off"?{enabled:!1,source:"env"}:t==="1"||t==="true"||t==="on"?{enabled:!0,source:"env"}:e?.enabled===!0?{enabled:!0,source:"config"}:e?.enabled===!1?{enabled:!1,source:"config"}:{enabled:!0,source:"default"}}function Pr(r,e){return Lu(r,e).enabled}function _o(r){let e=r.CLAUDE_MEM_TELEMETRY_ERRORS?.toLowerCase();return!(e==="0"||e==="false"||e==="off")}function Nu(){return(0,hs.join)(Fe(),mo)}function Ct(){let r;try{r=go(Nu(),null)}catch(e){let t=e instanceof Error?e:new Error(String(e));return d.warn("SYSTEM","Telemetry: corrupt telemetry.json; treating as no recorded consent",void 0,t),null}return!r||typeof r!="object"||typeof r.installId!="string"||r.enabled!==void 0&&typeof r.enabled!="boolean"?null:{enabled:r.enabled,installId:r.installId,decidedAt:typeof r.decidedAt=="string"?r.decidedAt:""}}function Uu(r){let e=Fe();(0,Tr.mkdirSync)(e,{recursive:!0}),(0,Tr.writeFileSync)((0,hs.join)(e,mo),JSON.stringify(r,null,2)+`
20
- `)}function Ir(){let r=Ct();if(r?.installId)return r.installId;let e=(0,ho.randomUUID)();return Uu({installId:e,decidedAt:""}),e}var $u=new Set(["version","os","os_version","is_wsl","arch","runtime","runtime_version","node_version","duration_ms","outcome","error_category","locale","is_ci","endpoint","ide","provider","runtime_mode","trigger","count","has_summary","is_update","stage","install_method","interactive","bun_version","uv_version","claude_code_version","trial_days","trial_variant","offer_surface","funnel_source","observation_count","session_count","timeline_depth_days","has_session_summary","obs_type_bugfix","obs_type_discovery","obs_type_decision","obs_type_refactor","obs_type_other","tokens_injected","tokens_saved_vs_naive","mode","search_strategy","observation_type","hook","compression_ms","tokens_input","tokens_output","compression_ratio","model","cost_usd","endpoint_class","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs","result_count","chroma_available","fallback_reason","invalid_output_class","consecutive_invalid_outputs","respawn_triggered","abort_reason","previous_shutdown","previous_uptime_seconds","uptime_seconds","shutdown_reason","process_rss_mb","heap_used_mb","hook_type","error_mode","consecutive_failures","threshold_tripped","limit_window","overage_status","is_using_overage","resets_in_minutes","discovery_tokens","read_tokens","summary_count","prompt_count","project_count","backfilled","first_active_date","session_completed_count","session_failed_count","sessions_claude_count","sessions_codex_count","sessions_gemini_count","sessions_other_platform_count","subagent_obs_count","total_tokens_input","total_tokens_output","total_cost_usd","avg_duration_ms","avg_compression_ms","outcomes_ok","outcomes_error","outcomes_aborted","outcomes_invalid_output","top_model","observed_model","observed_billing","window_start_ts","rollup_reason","window_seq","total_tokens","avg_tokens","skill_id","skill_source","skill_trigger","observations_created","total_observations_injected","total_tokens_saved_vs_naive"]),Eo=200;function ju(r,e){if(!(!r||typeof r!="object"))for(let t of Object.keys(r)){if(!$u.has(t))continue;let n=r[t];typeof n=="string"?e[t]=n.length>Eo?n.slice(0,Eo):n:(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean")&&(e[t]=n)}}function Rr(r){let e={};try{ju(r,e)}catch{}return e}var ms=he(require("os"),1);A();var Bu="13.24.21",Wu="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",Hu="https://us.i.posthog.com";function Cr(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||Wu}function Mr(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||Hu}var Gu=["version","os","os_version","is_wsl","arch","runtime","locale","ide","provider","runtime_mode","install_method","claude_code_version","first_active_date","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs"];function xr(r){let e={};for(let t of Gu)r[t]!==void 0&&(e[t]=r[t]);return e}function Ku(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||ms.default.release().toLowerCase().includes("microsoft")}catch(r){let e=r instanceof Error?r:new Error(String(r));return d.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function Fr(){return{version:Bu,os:process.platform,os_version:ms.default.release(),is_wsl:Ku(),arch:process.arch,runtime:process.versions.bun?"bun":"node",runtime_version:process.versions.bun??process.versions.node,node_version:process.versions.node,is_ci:!!process.env.CI,locale:Intl.DateTimeFormat().resolvedOptions().locale}}var Vu=2e3;async function yo(r,e,t){try{if(!Pr(process.env,Ct()))return;let n=Rr({...Fr(),...e??{}});if(t?.person?n.$set=xr(n):n.$process_person_profile=!1,process.env.CLAUDE_MEM_TELEMETRY_DEBUG==="1"){process.stderr.write("[telemetry] "+JSON.stringify({event:r,properties:n})+`
20
+ `)}function Ir(){let r=Ct();if(r?.installId)return r.installId;let e=(0,ho.randomUUID)();return Uu({installId:e,decidedAt:""}),e}var $u=new Set(["version","os","os_version","is_wsl","arch","runtime","runtime_version","node_version","duration_ms","outcome","error_category","locale","is_ci","endpoint","ide","provider","runtime_mode","trigger","count","has_summary","is_update","stage","install_method","interactive","bun_version","uv_version","claude_code_version","trial_days","trial_variant","offer_surface","funnel_source","observation_count","session_count","timeline_depth_days","has_session_summary","obs_type_bugfix","obs_type_discovery","obs_type_decision","obs_type_refactor","obs_type_other","tokens_injected","tokens_saved_vs_naive","mode","search_strategy","observation_type","hook","compression_ms","tokens_input","tokens_output","compression_ratio","model","cost_usd","endpoint_class","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs","result_count","chroma_available","fallback_reason","invalid_output_class","consecutive_invalid_outputs","respawn_triggered","abort_reason","previous_shutdown","previous_uptime_seconds","uptime_seconds","shutdown_reason","process_rss_mb","heap_used_mb","hook_type","error_mode","consecutive_failures","threshold_tripped","limit_window","overage_status","is_using_overage","resets_in_minutes","discovery_tokens","read_tokens","summary_count","prompt_count","project_count","backfilled","first_active_date","session_completed_count","session_failed_count","sessions_claude_count","sessions_codex_count","sessions_gemini_count","sessions_other_platform_count","subagent_obs_count","total_tokens_input","total_tokens_output","total_cost_usd","avg_duration_ms","avg_compression_ms","outcomes_ok","outcomes_error","outcomes_aborted","outcomes_invalid_output","top_model","observed_model","observed_billing","window_start_ts","rollup_reason","window_seq","total_tokens","avg_tokens","skill_id","skill_source","skill_trigger","observations_created","total_observations_injected","total_tokens_saved_vs_naive"]),Eo=200;function ju(r,e){if(!(!r||typeof r!="object"))for(let t of Object.keys(r)){if(!$u.has(t))continue;let n=r[t];typeof n=="string"?e[t]=n.length>Eo?n.slice(0,Eo):n:(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean")&&(e[t]=n)}}function Rr(r){let e={};try{ju(r,e)}catch{}return e}var ms=he(require("os"),1);A();var Bu="13.24.22",Wu="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",Hu="https://us.i.posthog.com";function Cr(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||Wu}function Mr(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||Hu}var Gu=["version","os","os_version","is_wsl","arch","runtime","locale","ide","provider","runtime_mode","install_method","claude_code_version","first_active_date","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs"];function xr(r){let e={};for(let t of Gu)r[t]!==void 0&&(e[t]=r[t]);return e}function Ku(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||ms.default.release().toLowerCase().includes("microsoft")}catch(r){let e=r instanceof Error?r:new Error(String(r));return d.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function Fr(){return{version:Bu,os:process.platform,os_version:ms.default.release(),is_wsl:Ku(),arch:process.arch,runtime:process.versions.bun?"bun":"node",runtime_version:process.versions.bun??process.versions.node,node_version:process.versions.node,is_ci:!!process.env.CI,locale:Intl.DateTimeFormat().resolvedOptions().locale}}var Vu=2e3;async function yo(r,e,t){try{if(!Pr(process.env,Ct()))return;let n=Rr({...Fr(),...e??{}});if(t?.person?n.$set=xr(n):n.$process_person_profile=!1,process.env.CLAUDE_MEM_TELEMETRY_DEBUG==="1"){process.stderr.write("[telemetry] "+JSON.stringify({event:r,properties:n})+`
21
21
  `);return}let s=Cr(),i=new AbortController,o=setTimeout(()=>i.abort(),Vu);try{await qu(s,r,n,i.signal)}finally{clearTimeout(o)}}catch{}}async function qu(r,e,t,n){await fetch(`${Mr()}/capture/`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:r,event:e,distinct_id:Ir(),properties:t}),signal:n})}var ve=he(require("path"),1),So=require("os"),te=require("fs"),ys=require("child_process");A();A();A();U();var O_=L.dataDir(),k_=L.workerPid();function Yu(r){try{return(0,te.realpathSync)(r)}catch{return null}}function _s(r){return r?/(^|[\\/])bun(\.exe)?$/i.test(r.trim()):!1}function Ju(r,e){let t=e==="win32"?`where ${r}`:`which ${r}`,n;try{n=(0,ys.execSync)(t,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",windowsHide:!0})}catch(i){return i instanceof Error?d.debug("SYSTEM",`Binary lookup failed for ${r}`,{command:t},i):d.debug("SYSTEM",`Binary lookup failed for ${r}`,{command:t},new Error(String(i))),null}return n.split(/\r?\n/).map(i=>i.trim()).find(i=>i.length>0)||null}var Es;function Ss(r={}){let e=Object.keys(r).length===0;if(e&&Es!==void 0)return Es;let t=Xu(r);return e&&t!==null&&(Es=t),t}function Xu(r){let e=r.platform??process.platform,t=r.execPath??process.execPath;if(_s(t))return t;let n=r.env??process.env,s=r.homeDirectory??(0,So.homedir)(),i=r.pathExists??te.existsSync,o=r.lookupInPath??Ju,a=r.realpath??Yu,c=e==="win32"?[n.BUN,n.BUN_PATH,ve.default.join(s,".bun","bin","bun.exe"),ve.default.join(s,".bun","bin","bun"),n.USERPROFILE?ve.default.join(n.USERPROFILE,".bun","bin","bun.exe"):void 0,n.LOCALAPPDATA?ve.default.join(n.LOCALAPPDATA,"bun","bun.exe"):void 0,n.LOCALAPPDATA?ve.default.join(n.LOCALAPPDATA,"bun","bin","bun.exe"):void 0,n.npm_config_prefix?ve.default.join(n.npm_config_prefix,"bun.exe"):void 0]:[n.BUN,n.BUN_PATH,ve.default.join(s,".bun","bin","bun"),"/usr/local/bin/bun","/opt/homebrew/bin/bun","/home/linuxbrew/.linuxbrew/bin/bun","/usr/bin/bun","/snap/bin/bun",n.npm_config_prefix?ve.default.join(n.npm_config_prefix,"bin","bun"):void 0];for(let f of c){let p=f?.trim();if(p&&(_s(p)&&i(p)||p.toLowerCase()==="bun"))return p}let l=o("bun",e)?.trim();if(!l||!_s(l))return null;let u=a(l)??l;return i(u)?u:null}var bo=he(require("net"),1);A();U();function bs(){return q.loadFromFile(rt).CLAUDE_MEM_WORKER_HOST}function wo(r){return r.startsWith("[")&&r.endsWith("]")?r:r.includes(":")?`[${r}]`:r}var vo=5e3;async function Qu(r,e,t="GET",n=vo){let s=await fetch(`http://${wo(bs())}:${r}${e}`,{method:t,signal:AbortSignal.timeout(Math.max(1,n))}),i="";try{i=await s.text()}catch{}return{ok:s.ok,statusCode:s.status,body:i}}async function Ao(r,e=vo){if(process.platform==="win32")try{let t=await fetch(`http://${wo(bs())}:${r}/api/health`,{signal:AbortSignal.timeout(Math.max(1,e))});if(t.ok)return!0;d.debug("SYSTEM","Windows health check returned non-ok; falling through to socket probe",{port:r,status:t.status})}catch(t){t instanceof Error?d.debug("SYSTEM","Windows health check threw; falling through to socket probe",{port:r,message:t.message}):d.debug("SYSTEM","Windows health check threw; falling through to socket probe",{port:r,error:String(t)})}return new Promise(t=>{let n=bo.default.createServer(),s=bs();n.once("error",i=>{i.code==="EADDRINUSE"?t(!0):t(!1)}),n.once("listening",()=>{n.close(()=>t(!1))}),n.listen(r,s)})}async function Zu(r){try{let e=await Qu(r,"/api/health");return e.ok?JSON.parse(e.body).version:null}catch{return d.debug("SYSTEM","Could not fetch worker version",{}),null}}async function To(r,e){let t=e??"unknown",n=await Zu(r);return!n||t==="unknown"?{matches:!0,pluginVersion:t,workerVersion:n}:{matches:t===n,pluginVersion:t,workerVersion:n}}A();var Or=require("path"),z=require("fs");U();A();var ed=9e4;function Po(){return(0,Or.join)(Fe(),"spawn.lock")}function ws(){let r=Po(),e=JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()});for(let t=0;t<2;t++)try{return(0,z.mkdirSync)((0,Or.dirname)(r),{recursive:!0}),(0,z.writeFileSync)(r,e,{flag:"wx"}),!0}catch(n){let s=n instanceof Error?n:new Error(String(n)),i=s.code;if(i!=="EEXIST")return d.warn("SYSTEM","Spawn lock write failed for a non-contention reason; failing open (spawning unlocked)",{lockPath:r,code:i},s),!0;if(t>0)return!1;let o;try{o=(0,z.statSync)(r).mtimeMs}catch{continue}if(Date.now()-o<=ed)return!1;let a;try{a=(0,z.statSync)(r).mtimeMs}catch{continue}if(a!==o)return!1;try{(0,z.unlinkSync)(r)}catch{return!1}}return!1}function vs(){let r=Po();try{if(JSON.parse((0,z.readFileSync)(r,"utf-8")).pid!==process.pid)return;(0,z.unlinkSync)(r)}catch{}}et();function Oo(r,e,t){let n=process.env[r];if(n){let s=parseInt(n,10);if(Number.isFinite(s)&&s>=t.min&&s<=t.max)return s;d.warn("SYSTEM",`Invalid ${r}, using default`,{value:n,min:t.min,max:t.max})}return e}var Br=Oo("CLAUDE_MEM_HEALTH_TIMEOUT_MS",ke(V.HEALTH_CHECK),{min:500,max:3e5}),td=Oo("CLAUDE_MEM_HOOK_READINESS_TIMEOUT_MS",ke(V.HOOK_READINESS_WAIT),{min:0,max:3e5}),rd={min:500,max:3e5};function ko(r=process.env){let e=r.CLAUDE_MEM_FETCH_VERBOSE;if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="on"||t==="yes"}function nd(r){return ko()?{...r,verbose:!0}:r}function sd(r){let e={},t=r;for(let n=0;t&&n<4;n++){let s=n===0?"error":`cause${n}`;if(t instanceof Error){let i=t;e[s]={name:t.name,message:t.message,...i.code!==void 0?{code:i.code}:{}},t=t.cause;continue}e[s]=String(t);break}return e}function id(r,e,t){let n=typeof e.method=="string"?e.method:"GET",s=sd(t),i=JSON.stringify(s);d.warn("SYSTEM","Worker IPC fetch failed",{url:r,method:n},i),Me(`[claude-mem] fetch verbose: ${n} ${r} ${i}
22
22
  `)}async function Do(r,e={}){let t=nd(e);try{return await fetch(r,t)}catch(n){throw ko()&&id(r,e,n),n}}async function Is(r,e={},t){try{return await Do(r,{...e,signal:AbortSignal.timeout(t)})}catch(n){throw n instanceof DOMException&&n.name==="TimeoutError"?new Error(`Request timed out after ${t}ms`):n}}var kr=null,Dr=null,Lr=null,Nr=null;function od(){return F.default.join(q.get("CLAUDE_MEM_DATA_DIR"),"settings.json")}function Rs(){return Lr!==null||(Lr=q.loadFromFile(od())),Lr}function Io(r,e){if(!r)return null;let t=parseInt(r,10);return Number.isFinite(t)&&t>=e.min&&t<=e.max?t:null}function ad(r,e,t){let n=process.env[r];if(n!==void 0){let o=Io(n,t);return o!==null?o:(d.warn("SYSTEM",`Invalid ${r}, using default`,{value:n,min:t.min,max:t.max}),e)}let s=Rs()[r],i=Io(s,t);return i!==null?i:(d.warn("SYSTEM",`Invalid ${r} in settings.json, using default`,{value:s,min:t.min,max:t.max}),e)}function He(){if(kr!==null)return kr;let r=Rs();return kr=parseInt(r.CLAUDE_MEM_WORKER_PORT,10),kr}function cd(){return Dr!==null||(Dr=Rs().CLAUDE_MEM_WORKER_HOST),Dr}function ld(){return Nr!==null||(Nr=ad("CLAUDE_MEM_API_TIMEOUT_MS",ke(V.API_REQUEST),rd)),Nr}function ud(r){return r.startsWith("[")&&r.endsWith("]")?r:r.includes(":")?`[${r}]`:r}function dd(r){return`http://${ud(cd())}:${He()}${r}`}function Ae(r,e={}){let t=e.method??"GET",n=e.timeoutMs??ld(),s=dd(r),i={method:t};return e.headers&&(i.headers=e.headers),e.body&&(i.body=e.body),n>0?Is(s,i,n):Do(s,i)}async function fd(){return(await Ae("/api/health",{timeoutMs:Br})).ok}async function Ts(r=Br){return(await Ae("/api/readiness",{timeoutMs:r})).ok}function Lo(r){let e=(0,P.existsSync)(F.default.join(r,"plugin","scripts"))?F.default.join(r,"plugin"):r;return F.default.join(e,"scripts","worker-service.cjs")}function pd(r,e){let t=f=>{let p=f.split("-")[0].split(".");return[parseInt(p[0],10)||0,parseInt(p[1],10)||0,parseInt(p[2],10)||0]},[n,s,i]=t(r),[o,a,c]=t(e);if(o!==n)return o-n;if(a!==s)return a-s;if(c!==i)return c-i;let l=r.includes("-")?1:0,u=e.includes("-")?1:0;return l!==u?l-u:r<e?1:r>e?-1:0}function gd(r=F.default.join(F.default.dirname(F.default.dirname(tt)),"cache","thedotmack","claude-mem")){try{return(0,P.readdirSync)(r).filter(e=>/^\d/.test(e)).map(e=>F.default.join(r,e)).filter(e=>{try{if(!(0,P.statSync)(e).isDirectory())return!1}catch{return!1}return!(0,P.existsSync)(F.default.join(e,".orphaned_at"))}).map(e=>({scriptPath:Lo(e),version:F.default.basename(e)}))}catch{return[]}}function Ro(r){try{let e=JSON.parse((0,P.readFileSync)(r,"utf-8"));return typeof e.version=="string"?e.version:null}catch(e){let t=e.code;return t!=="ENOENT"&&d.debug("SYSTEM","Could not read package version for worker resolution",{packageJsonPath:r,code:t}),null}}function No(){let r=process.env.CLAUDE_MEM_WORKER_SCRIPT_PATH?.trim();if(r){if((0,P.existsSync)(r))return{scriptPath:r,version:null};d.debug("SYSTEM","Ignoring missing CLAUDE_MEM_WORKER_SCRIPT_PATH override",{override:r})}let e=[...gd(),{scriptPath:Lo(F.default.join(tt,"plugin")),version:Ro(F.default.join(tt,"package.json"))},{scriptPath:F.default.join(process.cwd(),"plugin","scripts","worker-service.cjs"),version:Ro(F.default.join(process.cwd(),"package.json"))}];return hd(e)}function hd(r){let e=r.filter(t=>(0,P.existsSync)(t.scriptPath));return e.length===0?null:(e.sort((t,n)=>t.version===null&&n.version===null?0:t.version===null?1:n.version===null?-1:pd(t.version,n.version)),e[0])}function md(){return No()?.scriptPath??null}async function _d(r){let e=r.backoffMs;for(let t=1;t<=r.attempts;t++){if(await $o())return!0;t<r.attempts&&(await new Promise(n=>setTimeout(n,e)),e*=2)}return!1}async function As(r=td){if(r<=0)try{return await Ts()}catch(t){let n=t instanceof Error?t:new Error(String(t));return d.debug("SYSTEM","Worker readiness check threw",{},n),!1}let e=Date.now();for(;Date.now()-e<r;){try{if(await Ts())return!0}catch(n){d.debug("SYSTEM","Worker readiness check threw",{error:n instanceof Error?n.message:String(n)})}let t=r-(Date.now()-e);if(t<=0)break;await new Promise(n=>setTimeout(n,Math.min(250,t)))}return!1}async function Ed(){try{let e=await(await Ae("/api/health",{timeoutMs:Br})).json();return typeof e.version=="string"?e.version:null}catch(r){let e=r instanceof Error?r:new Error(String(r));return d.debug("SYSTEM","Worker health-version fetch failed",{},e),null}}async function yd(r=5e3){let e=Date.now();for(;;){try{await Ae("/api/health",{timeoutMs:Br})}catch{return!0}if(Date.now()-e>=r)return!1;await new Promise(t=>setTimeout(t,200))}}function Sd(r,e){if(!r)return null;try{let t=(0,P.statSync)(r.scriptPath);return JSON.stringify([r.scriptPath,e,t.size,t.mtimeMs,t.ctimeMs])}catch{return null}}function Uo(){return F.default.join(Fe(),"worker-version-recycle.json")}function bd(r,e){if(r===null||e===null)return!1;try{let t=JSON.parse((0,P.readFileSync)(Uo(),"utf-8"));return t?.buildKey===r&&t?.workerVersion===e}catch{return!1}}async function Co(r,e=null){let t=await Ed();if(t!==null&&t!==r){if(e!==null)try{Ze(Uo(),{buildKey:e,workerVersion:t})}catch(n){d.warn("SYSTEM","Could not persist the failed worker version recycle",{error:n instanceof Error?n.message:String(n)})}d.warn("SYSTEM","Worker is ready but still reports a stale version; rebuild or reinstall the worker bundle before retrying",{pluginVersion:r,workerVersion:t})}}async function $o(){let r;try{r=await fd()}catch(t){return d.debug("SYSTEM","Worker health check threw",{error:t instanceof Error?t.message:String(t)}),!1}if(!r)return!1;let e=vr({logAlive:!1});return e==="missing"||e==="alive"}async function Wr(){let r=No(),e=null,t=null;if(await $o()){let{matches:a,pluginVersion:c,workerVersion:l}=await To(He(),r?.version??null);if(c!=="unknown"&&(e=c),a)return await As()?(e!==null&&await Co(e),!0):(d.warn("SYSTEM","Worker is healthy but not ready; skipping hook API call"),!1);if(t=Sd(r,c),bd(t,l))return d.warn("SYSTEM","Skipping repeated worker recycle: the unchanged bundle still reports a stale version; rebuild or reinstall it",{pluginVersion:c,workerVersion:l,scriptPath:r?.scriptPath}),As();d.info("SYSTEM","Worker version mismatch \u2014 killing stale worker",{pluginVersion:c,workerVersion:l});let u=gs();if(u===null||u.port!==He())return d.error("SYSTEM","Stale worker is serving the port but the PID file does not identify it; kill the claude-mem worker process manually",{port:He(),pidFilePid:u?.pid??null,pidFilePort:u?.port??null}),!1;try{await ae(u.pid,{signalMode:"immediate"})}catch(f){return d.error("SYSTEM","Could not kill stale worker",{pid:u.pid,port:u.port},f instanceof Error?f:new Error(String(f))),!1}if(!await yd())return d.error("SYSTEM","Stale worker port still open after SIGKILL; skipping spawn this hook event",{pid:u.pid,port:He()}),!1}let n=Ss(),s=r?.scriptPath??null;if(!n)return d.warn("SYSTEM","Cannot lazy-spawn worker: Bun runtime not found on PATH"),!1;if(!s)return d.warn("SYSTEM","Cannot lazy-spawn worker: worker-service.cjs not found in plugin/scripts"),!1;let i=ws();try{if(i){d.info("SYSTEM","Worker not running \u2014 lazy-spawning",{runtimePath:n,scriptPath:s});try{(0,P.mkdirSync)(x,{recursive:!0});let c=Pt(n,[s,"--daemon"],{detached:!0,stdio:["ignore","ignore","ignore"],cwd:x});c.on("error",l=>{d.error("SYSTEM","Lazy-spawn of worker failed",{runtimePath:n,scriptPath:s},l)}),c.unref()}catch(c){return c instanceof Error?d.error("SYSTEM","Lazy-spawn of worker failed",{runtimePath:n,scriptPath:s},c):d.error("SYSTEM","Lazy-spawn of worker failed (non-Error)",{runtimePath:n,scriptPath:s,error:String(c)}),!1}}else d.info("SYSTEM","Another launcher holds the spawn lock \u2014 skipping lazy-spawn and waiting for its worker");if(!await _d({attempts:6,backoffMs:500}))return d.warn("SYSTEM",i?"Worker port did not open after lazy-spawn within the cold-boot wait (~15s)":"Spawn-lock holder's worker port did not open within the cold-boot wait (~15s)"),gs()===null&&await Ao(He())&&(jr=He(),d.error("SYSTEM","Worker port is occupied by an unreachable process that no PID file claims (likely an orphaned OS socket); every lazy-spawn on this port will be silently refused",{port:jr,fix:jo})),!1}finally{i&&vs()}return await As()?(e!==null&&await Co(e,t),!0):(d.warn("SYSTEM","Worker lazy-spawned but did not become ready before hook readiness timeout"),!1)}var jo="Set CLAUDE_MEM_WORKER_PORT to a different port in claude-mem settings, or reboot to release the stuck port",jr=null,Ur=null;async function wd(){return Ur!==null||(Ur=await Wr()),Ur}async function vd(r){let e=Date.now()+r,t=async()=>{let o=e-Date.now();if(o<=0)return!1;try{return await Ts(Math.min(500,o))}catch{return!1}};if(await t())return!0;let n=Ss(),s=md();if(!n||!s)return!1;let i=ws();try{if(i){let o=Pt(n,[s,"--daemon"],{detached:!0,stdio:["ignore","ignore","ignore"]});o.on("error",a=>{d.error("SYSTEM","Bounded worker startup spawn failed",{runtimePath:n,scriptPath:s},a)}),o.unref()}for(;Date.now()<e;){if(await t())return!0;let o=e-Date.now();o>0&&await new Promise(a=>setTimeout(a,Math.min(100,o)))}return!1}catch(o){return d.debug("SYSTEM","Bounded worker startup failed",{error:o instanceof Error?o.message:String(o)}),!1}finally{i&&vs()}}var Ad=3,Bo=1e3,Td=10,Wo=5e3,Pd=Wo+Bo;function Hr(){return F.default.join(x,"state")}function Ho(){return F.default.join(Hr(),"hook-failures.json")}function Go(){return F.default.join(Hr(),"hook-failures.lock")}async function Ko(r=Bo){let e=Hr(),t=Go(),n=(0,Fo.randomUUID)(),s=JSON.stringify({pid:process.pid,token:n}),i=Date.now()+r;for(;Date.now()<=i;)try{return(0,P.mkdirSync)(e,{recursive:!0}),(0,P.writeFileSync)(t,s,{flag:"wx"}),n}catch(o){let a=o instanceof Error?o:new Error(String(o)),c=a.code;if(c!=="EEXIST")return d.warn("SYSTEM","Hook-failure lock unavailable; skipping failure-state update",{lockPath:t,code:c},a),null;let l;try{l=(0,P.statSync)(t).mtimeMs}catch{continue}if(Date.now()-l>Wo){let u;try{u=(0,P.statSync)(t).mtimeMs}catch{continue}if(u===l)try{(0,P.unlinkSync)(t);continue}catch{}}await new Promise(u=>setTimeout(u,Td))}return d.warn("SYSTEM","Timed out waiting for hook-failure lock; skipping failure-state update",{lockPath:t,waitMs:r}),null}function Vo(r){let e=Go();try{if(JSON.parse((0,P.readFileSync)(e,"utf-8")).token!==r)return;(0,P.unlinkSync)(e)}catch{}}function Id(r){let e=JSON.parse(r);return{consecutiveFailures:typeof e.consecutiveFailures=="number"&&Number.isFinite(e.consecutiveFailures)?Math.max(0,Math.floor(e.consecutiveFailures)):0,lastFailureAt:typeof e.lastFailureAt=="number"&&Number.isFinite(e.lastFailureAt)?e.lastFailureAt:0,thresholdTripped:e.thresholdTripped===!0}}function Ps(){try{return Id((0,P.readFileSync)(Ho(),"utf-8"))}catch{return{consecutiveFailures:0,lastFailureAt:0,thresholdTripped:!1}}}function qo(r){let e=Hr(),t=Ho(),n=`${t}.tmp`;try{return(0,P.existsSync)(e)||(0,P.mkdirSync)(e,{recursive:!0}),(0,P.writeFileSync)(n,JSON.stringify(r),"utf-8"),(0,P.renameSync)(n,t),!0}catch(s){return d.debug("SYSTEM","Failed to persist hook-failure counter",{error:s instanceof Error?s.message:String(s)}),!1}}function Rd(){try{let e=ye().CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD,t=parseInt(e,10);if(Number.isFinite(t)&&t>=1)return t}catch{}return Ad}var Mo=null;async function Cd(){let r=await Ko();if(r===null)return Ps().consecutiveFailures;let e,t=!1;try{let n=Ps();e={consecutiveFailures:n.consecutiveFailures+1,lastFailureAt:Date.now(),thresholdTripped:n.thresholdTripped};let s=Rd();t=e.consecutiveFailures>=s&&!e.thresholdTripped,t&&(e.thresholdTripped=!0);let i=qo(e);t=t&&i}finally{Vo(r)}return t&&(await yo("hook_failed",{...Mo!==null?{hook_type:Mo}:{},error_mode:"worker_unavailable",consecutive_failures:e.consecutiveFailures,threshold_tripped:!0}),ji(jr!==null?`claude-mem worker unreachable for ${e.consecutiveFailures} consecutive hooks: port ${jr} is held by an unreachable process that no PID file claims, so the worker cannot bind it. ${jo}.`:`claude-mem worker unreachable for ${e.consecutiveFailures} consecutive hooks.`)),e.consecutiveFailures}async function xo(){let r=await Ko(Pd);if(r!==null)try{let e=Ps();if(e.consecutiveFailures===0&&!e.thresholdTripped)return;qo({consecutiveFailures:0,lastFailureAt:0,thresholdTripped:!1})}finally{Vo(r)}}var $r=Symbol.for("claude-mem/worker-fallback");function Gr(r){return typeof r=="object"&&r!==null&&r[$r]===!0}async function Kr(r,e,t,n={}){let s=n.workerStartupTimeoutMs!==void 0;if(!(s?await vd(n.workerStartupTimeoutMs):await wd()))return s||await Cd(),{continue:!0,reason:"worker_unreachable",[$r]:!0};let o={method:e};t!==void 0&&(o.headers={"Content-Type":"application/json"},o.body=JSON.stringify(t)),n.timeoutMs!==void 0&&(o.timeoutMs=n.timeoutMs);let a;try{a=await Ae(r,o)}catch(l){if(!s)throw l;return d.debug("SYSTEM","Worker unavailable for best-effort hook call",{error:l instanceof Error?l.message:String(l)}),{continue:!0,reason:"worker_unreachable",[$r]:!0}}if(!a.ok){let l=await a.text().catch(()=>"");if(await xo(),a.status===429||a.status>=500)return d.warn("SYSTEM",`Worker API ${e} ${r} returned ${a.status}; skipping hook API call`,{body:l.substring(0,200)}),{continue:!0,reason:`worker_api_${a.status}`,[$r]:!0};let u=l;try{u=JSON.parse(l)}catch{}return u}await xo();let c=await a.text();if(c.length!==0)try{return JSON.parse(c)}catch{return c}}var Yo=he(require("path"),1),Jo=require("child_process");vt();A();var Vr=require("fs"),ot=he(require("path"),1);A();var Mt={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function zo(r){let e=ot.default.join(r,".git"),t;try{t=(0,Vr.statSync)(e)}catch(u){return u instanceof Error&&u.code!=="ENOENT"&&d.warn("GIT","Unexpected error checking .git",{error:u instanceof Error?u.message:String(u)}),Mt}if(!t.isFile())return Mt;let n;try{n=(0,Vr.readFileSync)(e,"utf-8").trim()}catch(u){return d.warn("GIT","Failed to read .git file",{error:u instanceof Error?u.message:String(u)}),Mt}let s=n.match(/^gitdir:\s*(.+)$/);if(!s)return Mt;let o=ot.default.resolve(ot.default.dirname(e),s[1]).match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!o)return Mt;let a=o[1],c=ot.default.basename(r),l=ot.default.basename(a);return{isWorktree:!0,worktreeName:c,parentRepoPath:a,parentProjectName:l}}function Xo(r){try{return(0,Jo.execFileSync)("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim()||null}catch(e){let t=e instanceof Error?e:new Error(String(e));return d.debug("PROJECT_NAME","git rev-parse failed, falling back to basename",{dir:r},t),null}}function Md(r,e=process.platform){if(!r||r.trim()==="")return d.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),"unknown-project";let t=oe(r,e),s=Xo(t)??t,i=Yo.default.basename(s);if(i===""){if(process.platform==="win32"){let a=r.match(/^([A-Z]):\\/i);if(a){let l=`drive-${a[1].toUpperCase()}`;return d.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:l}),l}}return d.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),"unknown-project"}return i}function Ge(r,e=process.platform){let t=Md(r,e);if(!r)return{primary:t,parent:null,isWorktree:!1,allProjects:[t]};let n=oe(r,e),s=zo(Xo(n)??n);if(s.isWorktree&&s.parentProjectName){let i=`${s.parentProjectName}/${t}`;return{primary:i,parent:s.parentProjectName,isWorktree:!0,allProjects:[s.parentProjectName,i]}}return{primary:t,parent:null,isWorktree:!1,allProjects:[t]}}A();var ce=require("path");var Qo=require("path");vt();A();function xd(r){let e=oe(r.replace(/\\/g,"/"));e=e.replace(/\\/g,"/");let t=e.replace(/[.+^${}()|[\]\\]/g,"\\$&");return t=t.replace(/\*\*/g,"<<<GLOBSTAR>>>").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]").replace(/<<<GLOBSTAR>>>/g,".*"),new RegExp(`^${t}$`)}function qr(r,e){if(!e||!e.trim())return!1;let t=r.replace(/\\/g,"/"),n=(0,Qo.basename)(t),s=e.split(",").map(i=>i.trim()).filter(Boolean);for(let i of s)try{let o=xd(i);if(o.test(t)||o.test(n))return!0}catch(o){d.warn("PROJECT_NAME","Invalid exclusion pattern",{pattern:i,error:o instanceof Error?o.message:String(o)});continue}return!1}U();var Fd="plugins",Od="cache",kd="thedotmack",Dd="claude-mem",Ld="plugin",Nd=(0,ce.join)(Qn,Fd,Od,kd,Dd),Ud=(0,ce.join)(tt,Ld);function Cs(r,e){let t=(0,ce.normalize)(r),n=(0,ce.normalize)(e);if(t===n)return!0;let s=(0,ce.relative)(n,t);return s.length>0&&!s.startsWith("..")&&!(0,ce.isAbsolute)(s)}function zr(r){if(process.env.CLAUDE_MEM_INTERNAL==="1")return!1;if(!r)return!0;if(Cs(r,Zn)||Cs(r,Nd)||Cs(r,Ud))return!1;let e=ye();return!qr(r,e.CLAUDE_MEM_EXCLUDED_PROJECTS)}var Zo="claude";function $d(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function le(r){if(!r)return Zo;let e=$d(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:Zo}A();var ra=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],ea=new RegExp(`<(${ra.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g");var ta=100;function jd(r){let e=Object.fromEntries(ra.map(s=>[s,0]));ea.lastIndex=0;let t=0,n=r.replace(ea,(s,i)=>(e[i]=(e[i]??0)+1,t+=1,""));return t>ta&&d.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:t,maxAllowed:ta,contentLength:r.length}),{stripped:n.trim(),counts:e}}function Ms(r){return jd(r).stripped}var Bd=["task-notification"],Wd=new RegExp(`^\\s*<(${Bd.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),Hd=256*1024;function na(r){return!r||r.length>Hd?!1:Wd.test(r)}A();var Gd=ke(V.API_REQUEST),Te=class extends Error{kind;status;cause;constructor(e,t,n={}){super(t),this.name="ServerClientError",this.kind=e,this.status=n.status??null,this.cause=n.cause}isFallbackEligible(){return this.kind==="transport"||this.kind==="timeout"||this.kind==="missing_api_key"||this.kind==="http_error"&&(this.status!==null&&this.status>=500||this.status===429)}},Yr=class{baseUrl;apiKey;timeoutMs;constructor(e){this.baseUrl=Kd(e.serverBaseUrl),this.apiKey=e.apiKey,this.timeoutMs=e.timeoutMs??Gd}async startSession(e){let t=this.buildStartSessionPayload(e);return this.request("POST","/v1/sessions/start",t)}async recordEvent(e){let t=this.buildEventPayload(e),n=e.generate===!1?"/v1/events?generate=false":"/v1/events";return this.request("POST",n,t)}async endSession(e){if(!e.sessionId)throw new Te("invalid_response","sessionId is required for endSession");return this.request("POST",`/v1/sessions/${encodeURIComponent(e.sessionId)}/end`,{})}async addObservation(e){return this.request("POST","/v1/memories",this.buildAddObservationPayload(e))}async searchObservations(e){return this.request("POST","/v1/search",this.buildSearchPayload(e))}async contextObservations(e){return this.request("POST","/v1/context",this.buildSearchPayload(e))}async getJobStatus(e){if(!e)throw new Te("invalid_response","jobId is required for getJobStatus");return this.request("GET",`/v1/jobs/${encodeURIComponent(e)}`)}buildAddObservationPayload(e){let t=e.content,n=e.kind??"manual",s=typeof e.metadata?.title=="string"?e.metadata.title:void 0;return{projectId:e.projectId,kind:n,type:n,narrative:t,...s?{title:s}:{},...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.platformSource!==void 0?{platformSource:e.platformSource}:{},...e.metadata!==void 0?{metadata:e.metadata}:{}}}buildSearchPayload(e){return{projectId:e.projectId,query:e.query,...e.limit!==void 0?{limit:e.limit}:{},...e.platformSource!==void 0?{platformSource:xs(e.platformSource)}:{}}}buildStartSessionPayload(e){return{projectId:e.projectId,...e.externalSessionId!==void 0?{externalSessionId:e.externalSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.agentId!==void 0?{agentId:e.agentId}:{},...e.agentType!==void 0?{agentType:e.agentType}:{},...e.platformSource!==void 0?{platformSource:xs(e.platformSource)}:{},...e.metadata!==void 0?{metadata:e.metadata}:{}}}buildEventPayload(e){return{projectId:e.projectId,sourceType:e.sourceType,eventType:e.eventType,occurredAtEpoch:e.occurredAtEpoch,...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.memorySessionId!==void 0?{memorySessionId:e.memorySessionId}:{},...e.platformSource!==void 0?{platformSource:xs(e.platformSource)}:{},...e.payload!==void 0?{payload:e.payload}:{}}}async request(e,t,n){if(!this.apiKey||!this.apiKey.trim())throw new Te("missing_api_key","Server API key is not configured (CLAUDE_MEM_SERVER_API_KEY).");let s=`${this.baseUrl}${t}`,i={method:e,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}};n!==void 0&&(i.body=JSON.stringify(n));let o;try{o=await Is(s,i,this.timeoutMs)}catch(c){let l=c instanceof Error?c.message:String(c),u=/timed out|timeout/i.test(l);throw new Te(u?"timeout":"transport",`Server ${e} ${t} failed: ${l}`,{cause:c})}if(!o.ok){let c=await o.text().catch(()=>"");throw new Te("http_error",`Server ${e} ${t} returned ${o.status}: ${Vd(c,200)}`,{status:o.status})}let a=await o.text();if(!a||a.length===0)return{};try{return JSON.parse(a)}catch(c){let l=c instanceof Error?c:new Error(String(c));throw new Te("invalid_response",`Server ${e} ${t} returned non-JSON response`,{cause:l})}}};function sa(r){return r instanceof Te}function Kd(r){return r.replace(/\/+$/,"")}function xs(r){return typeof r=="string"?le(r):null}function Vd(r,e){return r.length<=e?r:`${r.slice(0,e)}\u2026`}function qd(){let e=(ye().CLAUDE_MEM_RUNTIME??"worker").trim().toLowerCase();return e==="server"||e==="server-beta"?"server":"worker"}function zd(){let r=ye(),e=(...o)=>{for(let a of o){let c=(a??"").trim();if(c.length>0)return c}return""},t=e(r.CLAUDE_MEM_SERVER_URL,r.CLAUDE_MEM_SERVER_BETA_URL),n=e(r.CLAUDE_MEM_SERVER_API_KEY,r.CLAUDE_MEM_SERVER_BETA_API_KEY),s=e(r.CLAUDE_MEM_SERVER_PROJECT_ID,r.CLAUDE_MEM_SERVER_BETA_PROJECT_ID);if(!t)return d.warn("HOOK","[server-fallback] reason=missing_base_url"),null;if(!n)return d.warn("HOOK","[server-fallback] reason=missing_api_key"),null;if(!s)return d.warn("HOOK","[server-fallback] reason=missing_project_id"),null;let i={serverBaseUrl:t,apiKey:n};return{runtime:"server",client:new Yr(i),projectId:s,serverBaseUrl:t}}function ia(){if(qd()!=="server")return{runtime:"worker"};let r=zd();return r||{runtime:"worker"}}function oa(r,e){d.warn("HOOK",`[server-fallback] reason=${r}`,e??{})}var Yd={executeWithWorkerFallback:Kr,isWorkerFallback:Gr,loadFromFileOnce:ye,resolveRuntimeContext:ia,logServerFallback:oa,shouldTrackProject:zr},Le=Yd;var aa={async execute(r){let{sessionId:e,prompt:t}=r,n=r.cwd??process.cwd();if(!e)return d.warn("HOOK","session-init: No sessionId provided, skipping (Codex CLI or unknown platform)"),{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS};if(!Le.shouldTrackProject(n))return d.info("HOOK","Project excluded from tracking",{cwd:n}),{continue:!0,suppressOutput:!0};if(t&&na(t))return d.debug("HOOK","session-init: skipping internal protocol payload",{preview:t.slice(0,80)}),{continue:!0,suppressOutput:!0};let s=!t||!t.trim()?"[media prompt]":t,i=Ge(n).primary,o=le(r.platform),a=Le.loadFromFileOnce(),c=String(a.CLAUDE_MEM_SEMANTIC_INJECT).toLowerCase()==="true",l=Le.resolveRuntimeContext();if(l.runtime==="server")try{return await Jd(l,r,e,o,i,s),{continue:!0,suppressOutput:!0}}catch(h){if(sa(h)&&h.isFallbackEligible())Le.logServerFallback(h.kind,{status:h.status,message:h.message,route:"/v1/sessions/start"});else return d.error("HOOK","Server session-start failed (non-recoverable)",{error:h instanceof Error?h.message:String(h)}),{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS}}d.debug("HOOK","session-init: Calling /api/sessions/init",{contentSessionId:e,project:i});let u=await Le.executeWithWorkerFallback("/api/sessions/init","POST",{contentSessionId:e,project:i,prompt:s,platformSource:o},o==="codex"?{workerStartupTimeoutMs:V.POST_SPAWN_WAIT,timeoutMs:2e3}:void 0);if(Le.isWorkerFallback(u))return{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS};if(typeof u?.sessionDbId!="number")return d.failure("HOOK","Session initialization returned malformed response",{contentSessionId:e,project:i}),{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS};let f=u.sessionDbId,p=u.promptNumber;if(d.debug("HOOK","session-init: Received from /api/sessions/init",{sessionDbId:f,promptNumber:p,skipped:u.skipped,contextInjected:u.contextInjected}),d.debug("HOOK",`[ALIGNMENT] Hook Entry | contentSessionId=${e} | prompt#=${p} | sessionDbId=${f}`),u.skipped&&u.reason==="private")return d.info("HOOK",`INIT_COMPLETE | sessionDbId=${f} | promptNumber=${p} | skipped=true | reason=private`,{sessionId:f}),{continue:!0,suppressOutput:!0};let g="";if(c&&s&&s.length>=20&&s!=="[media prompt]"){let h=a.CLAUDE_MEM_SEMANTIC_INJECT_LIMIT||"5",m=await Le.executeWithWorkerFallback("/api/context/semantic","POST",{q:s,project:i,limit:h,platformSource:o},o==="codex"?{workerStartupTimeoutMs:V.POST_SPAWN_WAIT,timeoutMs:2e3}:void 0);!Le.isWorkerFallback(m)&&m?.context&&(d.debug("HOOK",`Semantic injection: ${m.count} observations for prompt`,{sessionId:f,count:m.count}),g=m.context)}return d.info("HOOK",`INIT_COMPLETE | sessionDbId=${f} | promptNumber=${p} | project=${i}`,{sessionId:f}),g?{continue:!0,suppressOutput:!0,hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:g}}:{continue:!0,suppressOutput:!0}}};async function Jd(r,e,t,n,s,i){await r.client.startSession({projectId:r.projectId,externalSessionId:t,contentSessionId:t,agentId:e.agentId??null,agentType:e.agentType??null,platformSource:n,metadata:{project:s,prompt:i}}),d.info("HOOK","session-init: server session started",{contentSessionId:t,project:s})}A();var ca={async execute(r){let{sessionId:e,cwd:t,filePath:n,edits:s}=r,i=le(r.platform);if(!n)throw new Error("fileEditHandler requires filePath");if(d.dataIn("HOOK",`FileEdit: ${n}`,{editCount:s?.length??0}),!t)throw new Error(`Missing cwd in FileEdit hook input for session ${e}, file ${n}`);if(!zr(t))return d.debug("HOOK","Project excluded from tracking, skipping file edit observation",{cwd:t,filePath:n}),{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS};let o=await Kr("/api/sessions/observations","POST",{contentSessionId:e,platformSource:i,tool_name:"write_file",tool_input:{filePath:n,edits:s},tool_response:{success:!0},cwd:t});return Gr(o)?{continue:!0,suppressOutput:!0,exitCode:Oe.SUCCESS}:(d.debug("HOOK","File edit observation sent successfully",{filePath:n}),{continue:!0,suppressOutput:!0})}};U();A();var re=require("fs"),Jr=require("path");A();A();U();var py=L.settings();function la(r,e){let t="<claude-mem-context>",n="</claude-mem-context>";if(!r)return`${t}
23
23
  ${e}