claude-mem 14.0.0 → 14.0.1

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.
@@ -66,7 +66,7 @@ ${m.stack??""}
66
66
  `)}else Eo(d+`
67
67
  `)}debug(e,r,n,i){this.log(0,e,r,n,i)}info(e,r,n,i){this.log(1,e,r,n,i)}warn(e,r,n,i){this.log(2,e,r,n,i)}setErrorSink(e){PS=e}error(e,r,n,i){this.log(3,e,r,n,i),this.routeErrorToSink(r,n,i)}routeErrorToSink(e,r,n){try{if(!PS||!(n instanceof Error))return;PS(n)}catch{}}dataIn(e,r,n,i){this.info(e,`\u2192 ${r}`,n,i)}dataOut(e,r,n,i){this.info(e,`\u2190 ${r}`,n,i)}success(e,r,n,i){this.info(e,`\u2713 ${r}`,n,i)}failure(e,r,n,i){this.error(e,`\u2717 ${r}`,n,i)}},S=new DS});function Yf(t){return/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||null}function Qf(t){let e=t.ip||t.socket.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"||e==="localhost"}function kL(t){let e=Xf(t.header("host")??"");return e==="127.0.0.1"||e==="localhost"||e==="::1"}function Xf(t){let e=t.trim().toLowerCase();if(e.startsWith("[")){let n=e.indexOf("]");return n===-1?e:e.slice(1,n)}let r=e.lastIndexOf(":");return r>-1&&/^\d+$/.test(e.slice(r+1))?e.slice(0,r):e}function Zf(t){return!!(t.header("forwarded")||t.header("x-forwarded-for")||t.header("x-forwarded-host")||t.header("x-real-ip"))}var jS=k(()=>{"use strict"});function pae(t=process.platform){return t==="win32"?8e3:5e3}function RL(t=process.platform){return em.SESSION_INIT_HOOK_CAP-pae(t)}function OL(t){return process.platform==="win32"?Math.round(t*em.WINDOWS_MULTIPLIER):t}var em,CL=k(()=>{"use strict";em={HEALTH_CHECK:3e3,API_REQUEST:3e4,SESSION_INIT_HOOK_CAP:15e3,SESSION_INIT_REQUEST:1e4,SESSION_INIT_REQUEST_MAX:14e3,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5}});function hae(t){try{return mae.has(new URL(t).protocol)}catch{return!1}}function yae(t){ML!==t&&(ML=t,S.warn("SDK","CLAUDE_MEM_OPENROUTER_BASE_URL is not an http(s) URL; requests to it will fail until it is fixed",{baseUrl:t}))}function rm(t){let e=(t??"").trim();if(!e)return fae;if(!hae(e)){yae(e);let i=e.replace(PL,"");return i.toLowerCase().endsWith(tm)?i:`${i}${tm}`}let r=new URL(e),n=r.pathname.replace(PL,"");return r.pathname=n.toLowerCase().endsWith(tm)?n:`${n}${tm}`,r.href}function DL(t){try{return new URL(t).hostname.toLowerCase()==="openrouter.ai"}catch{return!1}}var fae,tm,mae,PL,ML,nm=k(()=>{"use strict";se();fae="https://openrouter.ai/api/v1/chat/completions",tm="/chat/completions",mae=new Set(["http:","https:"]),PL=/\/+$/;ML=null});function _ae(t){return typeof t=="boolean"?String(t):t}function xae(t){let e=t.CLAUDE_MEM_OPENROUTER_MODEL;if(typeof e!="string"||!Sae.has(e.trim()))return!1;let r=typeof t.CLAUDE_MEM_OPENROUTER_BASE_URL=="string"?t.CLAUDE_MEM_OPENROUTER_BASE_URL.trim():"";return r===""||DL(r)}function NL(t,e){return(0,ms.join)((0,ms.dirname)(t),`.${(0,ms.basename)(t)}.${e.markerTag}`)}function KS(t,e){try{(0,To.writeFileSync)(NL(t,e),new Date().toISOString(),{encoding:"utf-8",mode:384})}catch{}}function wae(t){if(typeof t!="string")return null;let e=t.trim();if(e.length===0)return null;try{let r=new URL(e).hostname;if(r===bae||r===vae)return Eae}catch{return null}return null}var To,ms,yu,gae,bae,vae,Eae,Sae,jL,KL,LL,Tn,tc=k(()=>{"use strict";To=require("fs"),ms=require("path"),yu=require("os");CL();So();nm();ec();gae="security_alert",bae="sync-hub.black-pond-afbb.workers.dev",vae="ziczmqtpmaxbornfghye.supabase.co",Eae="https://sync.cmem.ai",Sae=new Set(["xiaomi/mimo-v2-flash:free"]);jL=18e4,KL=[{key:"CLAUDE_MEM_LLM_TIMEOUT_MS",legacy:"30000",markerTag:"llm-timeout-migrated-v1"},{key:"CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS",legacy:"30000",markerTag:"field-optimize-timeout-migrated-v1"}];LL=new Set;Tn=class{static DEFAULTS={CLAUDE_MEM_MEMORY_SEARCH_HOOK_ENABLED:"true",CLAUDE_MEM_MEMORY_INSTRUCTIONS_ENABLED:"true",CLAUDE_MEM_MEMORY_WATCH_ROOTS:"",CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_SESSION_START_INCLUDE_ALL_SOURCES:"false",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_WORKER_INGEST_TOKEN:"",CLAUDE_MEM_HOOK_SPOOL_TRANSPORT:"auto",CLAUDE_MEM_ALLOWED_ORIGINS:"",CLAUDE_MEM_PUBLIC_URL:"",CLAUDE_MEM_API_TIMEOUT_MS:String(OL(em.API_REQUEST)),CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS:String(RL()),CLAUDE_MEM_IDLE_EXIT_SEC:"0",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_SKIP_BASH_PATTERNS:"",CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS:"false",CLAUDE_MEM_SKIP_AGENT_TYPES:"",CLAUDE_MEM_CAPTURE_ADVISOR_CALLS:"false",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CODEX_MODEL:"",CLAUDE_MEM_CODEX_PATH:"codex",CLAUDE_MEM_CODEX_REASONING_EFFORT:"low",CLAUDE_MEM_CODEX_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_SIZE:"8",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_MAX_CHARS:"32000",CLAUDE_MEM_CLAUDE_OBSERVATION_BATCH_SIZE:"1",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_API_KEYS:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_API_KEYS:"",CLAUDE_MEM_OPENROUTER_MODEL:"cohere/north-mini-code:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_TEMPERATURE:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_EXTRA_BODY:"",CLAUDE_MEM_OPENROUTER_REASONING_EFFORT:"",CLAUDE_MEM_OPENAI_COMPAT_PRESET:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEY:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEYS:"",CLAUDE_MEM_OPENAI_COMPAT_BASE_URL:"",CLAUDE_MEM_OPENAI_COMPAT_MODEL:"",CLAUDE_MEM_QUOTA_FALLBACK_PROVIDER:"claude",CLAUDE_MEM_QUOTA_FALLBACK_MODEL:"",CLAUDE_MEM_QUOTA_THRESHOLD_FIVE_HOUR:"0.95",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_OPUS:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_SONNET:"0.92",CLAUDE_MEM_QUOTA_THRESHOLD_OVERAGE:"0.95",CLAUDE_MEM_DATA_DIR:(0,ms.join)((0,yu.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_CLAUDE_CONFIG_DIR:"",CLAUDE_MEM_OBSERVER_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_OBSERVATION_TYPES:"",CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:"",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_MAIN_AGENT_ONLY:"true",CLAUDE_MEM_REINFORCE_ALPHA:"0",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_WORK_STATE_ENABLED:"true",CLAUDE_MEM_FILE_READ_GATE_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,ms.join)((0,yu.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_CODEX_SUBAGENT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_OBSERVER_THINKING:"disabled",CLAUDE_MEM_OBSERVER_CONTEXT_WINDOW:"",CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS:"4096",CLAUDE_MEM_OBSERVE_BARE_PROMPTS:"false",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_REDACT_ENABLED:"false",CLAUDE_MEM_REDACT_DISABLED_BUILTINS:"",CLAUDE_MEM_REDACT_CUSTOM_PATTERNS:"[]",CLAUDE_MEM_REDACT_LOG_MATCHES:"false",CLAUDE_MEM_REDACT_GENERIC_ENABLED:"false",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_PROJECT_ENVIRONMENTS:"[]",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_SEMANTIC_INJECT_FORMAT:"narrative",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_MUTATION_TIMEOUT_MS:"600000",CLAUDE_MEM_CHROMA_MAX_PENDING_MUTATIONS:"5000",CLAUDE_MEM_CHROMA_EMBEDDING_FUNCTION:"default",CLAUDE_MEM_CHROMA_UVX_PATH:"",CLAUDE_MEM_SEARCH_RECENCY_DAYS:"90",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,yu.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_TEAMBRAIN_URL:"",CLAUDE_MEM_TEAMBRAIN_TEAM_ID:"",CLAUDE_MEM_LLM_TIMEOUT_MS:String(jL),CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS:String(jL),CLAUDE_MEM_LLM_STREAM_IDLE_TIMEOUT_MS:"90000",CLAUDE_MEM_WORKER_HEARTBEAT_STALE_MS:"120000",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_FALLBACK_MESSAGE:"",CLAUDE_MEM_PRO_FALLBACK_ACTION:"",CLAUDE_MEM_PRO_FALLBACK_URL:"",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_WRAPUPS_ENABLED:"true",CLAUDE_MEM_TELEGRAM_OBSERVATION_ALERTS_ENABLED:"false",CLAUDE_MEM_TELEGRAM_WRAPUP_ROUTES:"{}",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_GROK_BOT_WEBHOOK_URL:"",CLAUDE_MEM_GROK_BOT_WEBHOOK_SECRET:"",CLAUDE_MEM_GROK_BOT_INJECT_ENABLED:"true",CLAUDE_MEM_GROK_BOT_INJECT_AGENT_IDS:"*",CLAUDE_MEM_GROK_BOT_INJECT_TIER:"episode",CLAUDE_MEM_GROK_BOT_INJECT_WINDOW:"80",CLAUDE_MEM_GROK_BOT_INJECT_FALLBACK:"house",CLAUDE_MEM_GROK_BOT_INJECT_PLATFORM_SOURCE:"",CLAUDE_MEM_GROK_BOT_INJECT_PROJECTS_BY_AGENT:"",CLAUDE_MEM_GROK_BOT_INJECT_MAX_LINE_CHARS:"160",CLAUDE_MEM_GROK_BOT_INJECT_DEBOUNCE_MS:"1500",CLAUDE_MEM_GROK_BOT_INJECT_STANDING_LINE:"",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:"",CLAUDE_MEM_DEDUP_ENABLED:"false",CLAUDE_MEM_DEDUP_COSINE_THRESHOLD:"0.80",CLAUDE_MEM_DEDUP_IDF_VETO_DF:"10",CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS:"2",CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS:"10",CLAUDE_MEM_DEDUP_MAX_SCAN:"2000",CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS:"50000",CLAUDE_MEM_TOOL_USES_RETENTION_DAYS:"0",CLAUDE_MEM_WORKER_AUTOSTART:"true",CLAUDE_MEM_PROJECT_NAME_SOURCE:"path"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){let r=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(r):r}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,r){let n=r?this.applyEnvOverrides(e):e;return n.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(n.CLAUDE_MEM_WORKER_HOST),n}static getInt(e){let r=this.get(e);return parseInt(r,10)}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e,r=!0,n={}){try{if(!(0,To.existsSync)(e)){let d=this.getAllDefaults();if(!n.readOnly)try{In(e,d,{mode:384});for(let f of KL)KS(e,f);console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(f){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,f instanceof Error?f.message:String(f))}return this.finalizeSettings(d,r)}let i=(0,To.readFileSync)(e,"utf-8"),s=IS(i),o=xo(s),a=o!==s,c=AS(s),l=a&&Object.keys(c).some(d=>d!=="env");if(a&&!l&&!n.readOnly)try{In(e,o,{mode:384}),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(d){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,d instanceof Error?d.message:String(d))}if(o.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===gae&&(o={...o,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES},!n.readOnly))try{In(e,l?{...c,env:o}:o,{mode:384}),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,d instanceof Error?d.message:String(d))}if(xae(o)){let d=String(o.CLAUDE_MEM_OPENROUTER_MODEL).trim();if(o={...o,CLAUDE_MEM_OPENROUTER_MODEL:this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL},!n.readOnly)try{In(e,l?{...c,env:o}:o,{mode:384}),console.warn(`[SETTINGS] Migrated OpenRouter model off the retired default ${d} to ${this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL}:`,e)}catch(f){console.warn("[SETTINGS] Failed to migrate the retired OpenRouter model:",e,f instanceof Error?f.message:String(f))}}let u=wae(o.CLAUDE_MEM_CLOUD_SYNC_HUB_URL);if(u!==null&&(o={...o,CLAUDE_MEM_CLOUD_SYNC_HUB_URL:u},!n.readOnly))try{In(e,l?{...c,env:o}:o,{mode:384}),console.warn("[SETTINGS] Migrated cloud sync hub URL to",u,"from a retired hub host:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate cloud sync hub URL:",e,d instanceof Error?d.message:String(d))}for(let d of KL)if(!(0,To.existsSync)(NL(e,d))){if(o[d.key]!==d.legacy){n.readOnly||KS(e,d);continue}if(o={...o,[d.key]:this.DEFAULTS[d.key]},!n.readOnly)try{In(e,l?{...c,env:o}:o,{mode:384}),KS(e,d),console.warn(`[SETTINGS] Migrated ${d.key} off the old ${d.legacy}ms default to ${this.DEFAULTS[d.key]}ms:`,e)}catch(f){let m=`${d.key}\0${e}`;LL.has(m)||(LL.add(m),console.warn(`[SETTINGS] Failed to migrate ${d.key}; using the new default in memory (reported once per process):`,e,f instanceof Error?f.message:String(f)))}}let p={...this.DEFAULTS};for(let d of Object.keys(this.DEFAULTS))o[d]!==void 0&&(p[d]=_ae(o[d]));return this.finalizeSettings(p,r)}catch(i){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,i instanceof Error?i.message:String(i));let s=this.getAllDefaults();return this.finalizeSettings(s,r)}}}});function LS(t){return new RegExp(`${t}${Iae}`,"gi")}function qL(t){return`(?<=${t}${sm}${vu}[=:]${vu}${sm})`}function am(t,e){if(!e.enabled||t.length===0)return{redacted:t,counts:{},oversize:!1};if(t.length>kae)return S.warn("REDACT","field exceeds the 1M-char redaction cap; replaced by an oversize marker",void 0,{inputLength:t.length}),{redacted:Rae,counts:{oversize:1},oversize:!0};let r=new Set(e.disabledBuiltinPatterns??[]),n={},i=t,s=[];for(let a of e.customPatterns??[]){if(!a.name||a.name.length===0){S.warn("REDACT","custom pattern skipped: missing name",void 0,{pattern:a});continue}try{s.push({name:a.name,regex:new RegExp(a.regex,"g")})}catch(c){S.warn("REDACT","custom pattern skipped: invalid regex",{name:a.name},c instanceof Error?c:new Error(String(c)))}}let o=[...s,...Tae,...e.genericEnabled?Aae:[]];for(let a of o)r.has(a.name)||(a.regex.lastIndex=0,i=i.replace(a.regex,()=>(n[a.name]=(n[a.name]??0)+1,`<redacted type='${a.name}'/>`)));return e.logMatches&&Object.keys(n).length>0&&S.debug("REDACT","patterns matched",void 0,{counts:n}),{redacted:i,counts:n,oversize:!1}}function JL(t){return t.includes("<redacted type='")||t.includes("&lt;redacted type=")}function Oae(t){if(!t||t.trim()==="")return[];try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(r=>r&&typeof r.name=="string"&&typeof r.regex=="string"):(S.warn("REDACT","CLAUDE_MEM_REDACT_CUSTOM_PATTERNS is not a JSON array, ignoring"),[])}catch(e){return S.warn("REDACT","failed to parse CLAUDE_MEM_REDACT_CUSTOM_PATTERNS as JSON",void 0,e instanceof Error?e:new Error(String(e))),[]}}function Cae(t){return{enabled:t.CLAUDE_MEM_REDACT_ENABLED==="true",disabledBuiltinPatterns:(t.CLAUDE_MEM_REDACT_DISABLED_BUILTINS??"").split(",").map(e=>e.trim()).filter(Boolean),customPatterns:Oae(t.CLAUDE_MEM_REDACT_CUSTOM_PATTERNS??"[]"),logMatches:t.CLAUDE_MEM_REDACT_LOG_MATCHES==="true",genericEnabled:t.CLAUDE_MEM_REDACT_GENERIC_ENABLED==="true"}}function jae(t){if(!(0,om.existsSync)(t))return null;try{return(0,om.readFileSync)(t,"utf-8")}catch{return""}}function Kae(t){if(t===null)return!1;try{let e=JSON.parse(wS(t));return e===null||typeof e!="object"||Array.isArray(e)}catch{return!0}}function Lae(t,e,r){return process.env.CLAUDE_MEM_REDACT_ENABLED==="false"||!(bu?.enabled===!0||Dae.test(e))?r:(FL||(FL=!0,S.warn("REDACT","settings.json could not be read; secret redaction stays on until it is repaired",{settingsPath:t,using:bu?.enabled?"the last configuration that loaded":"the built-in patterns"})),bu?.enabled?bu:Mae)}function cm(t=wo){let e=Date.now();if(gu&&e-UL<Pae)return gu;let r=Tn.loadFromFile(t),n=Cae(r),i=n.enabled?null:jae(t);return Kae(i)?gu=Lae(t,i,n):(gu=n,bu=n),UL=e,gu}function GL(t){return am(t,cm()).redacted}function Uae(t,e,r){if(!r.genericEnabled)return null;let n=Nae.exec(t);if(!n)return null;let i=n[1].toLowerCase().startsWith("passw")?"generic_password":"generic_token";return r.disabledBuiltinPatterns?.includes(i)||!qae.test(e)||!/[A-Za-z]/.test(e)?null:`<redacted type='${i}'/>`}function BL(t,e=cm()){if(!e.enabled)return t;let r=(n,i)=>{if(typeof n=="string"){let s=am(n,e);return i===void 0||Object.keys(s.counts).length>0?s.redacted:Uae(i,n,e)??s.redacted}return Array.isArray(n)?n.map(s=>r(s)):n!==null&&typeof n=="object"?Object.fromEntries(Object.entries(n).map(([s,o])=>[s,r(o,s)])):n};return r(t)}var om,im,Iae,sm,vu,Tae,Aae,kae,Rae,$L,gu,UL,Pae,bu,FL,Mae,Dae,Nae,qae,Eu=k(()=>{"use strict";om=require("fs");se();tc();Cr();So();im=String.raw`[A-Za-z0-9_.\-+/=~@#$%^*!?]`,Iae=`(?=${im}{8})${im}*[A-Za-z]${im}*`,sm=String.raw`(?:\\{0,3}["'])?`,vu=String.raw`\s{0,8}`;Tae=[{name:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{name:"aws_secret_key",regex:/(?<=AWS_SECRET_ACCESS_KEY\s{0,8}[=:]\s{0,8}['"]?)[A-Za-z0-9/+=]{40}/g},{name:"github_pat",regex:/\bgh[oprs]_[A-Za-z0-9]{36}\b|\bgithub_pat_[A-Za-z0-9_]{82}\b/g},{name:"openai_key",regex:/\bsk-(?!ant-)[A-Za-z0-9_-]{20,}\b/g},{name:"anthropic_key",regex:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{name:"slack_token",regex:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g},{name:"jwt",regex:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{name:"private_key_pem",regex:/-----BEGIN (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g},{name:"stripe_key",regex:/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{name:"google_api_key",regex:/\bAIza[0-9A-Za-z_-]{35}\b/g},{name:"claude_mem_key",regex:/\bcmem_[A-Za-z0-9_-]{32,}|\bcm_pro_[A-Za-z0-9_-]{8,}/g}],Aae=[{name:"generic_password",regex:LS(qL(String.raw`\b(?:\w*_?(?:password|passwd)|\w+_pwd)`))},{name:"generic_token",regex:LS(qL(String.raw`\b\w*_(?:token|secret|api_key)`))},{name:"bearer_token",regex:LS(`(?<=\\bAuthorization${sm}${vu}:${vu}${sm}Bearer${vu})`)}],kae=1024*1024,Rae="<redacted type='oversize'/>";$L=`If you see a "<redacted type='...'/>" marker, that field was a recognized secret pattern and was removed before storage. Treat it as a placeholder; do not infer the literal value or copy the marker itself into generated memory content.`;gu=null,UL=0,Pae=5e3,bu=null,FL=!1,Mae={enabled:!0,disabledBuiltinPatterns:[],customPatterns:[],logMatches:!1},Dae=/"CLAUDE_MEM_REDACT_ENABLED"\s*:\s*"true"/;Nae=/(?:^|_)(password|passwd|secret|token|api_key)$/i,qae=new RegExp(`^${im}{8,}$`)});function QL(){let t=[];t.push(NS.default.json({limit:"5mb"})),t.push((n,i,s)=>{let a=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(f=>n.path.endsWith(f)),c=n.path==="/api/logs";if(n.path.startsWith("/health")||n.path==="/"||a||c)return s();let l=Date.now(),u=`${n.method}-${Date.now()}`,p=Zae(n.method,n.path,n.body);S.debug("HTTP",`\u2192 ${n.method} ${n.path}`,{requestId:u},p);let d=i.send.bind(i);i.send=function(f){let m=Date.now()-l;return S.debug("HTTP",`\u2190 ${i.statusCode} ${n.path}`,{requestId:u,duration:`${m}ms`}),d(f)},s()});let e=Io(),r=WL.default.join(e,"plugin","ui");return t.push((n,i,s)=>{n.path.startsWith("/work-view/")&&(i.setHeader("Content-Security-Policy","frame-ancestors 'none'"),i.setHeader("X-Frame-Options","DENY")),s()}),t.push(NS.default.static(r)),t}function Fae(t){return t.startsWith("http://localhost:")||t.startsWith("http://127.0.0.1:")}function XL(t,e){if(!e)return!1;try{return new URL(t).host===e.trim().toLowerCase()}catch{return!1}}function $ae(t,e,r){let n;try{n=new URL(t)}catch{return!1}if(n.protocol!=="http:"&&n.protocol!=="https:")return!1;if(r.allowedOrigins.includes(n.origin))return!0;if(!e)return!1;if(XL(t,e))return!0;let i;try{i=new URL(`${n.protocol}//${e.trim().toLowerCase()}`)}catch{return!1}return zL.has(n.hostname)&&zL.has(i.hostname)&&n.port===i.port}function ZL(t){return(e,r,n)=>{let i=e.headers.origin;if(e.method!=="DELETE"||i===void 0||$ae(i,e.headers.host,t)){n();return}S.warn("SECURITY","Refused a DELETE from a page other than the viewer",{origin:i,method:e.method,path:e.path}),r.status(403).json({error:"Forbidden",message:"Deletes are accepted only from the claude-mem viewer itself (or an origin in CLAUDE_MEM_ALLOWED_ORIGINS), not from other pages."})}}function Gae(t){let e=new Set(Jae),r=t.workerHost.trim().toLowerCase();r&&e.add(r);for(let n of t.allowedOrigins)try{e.add(new URL(n).hostname.toLowerCase())}catch{}return e}function Bae(t,e){if(!t)return!0;let r=Xf(t);return(0,YL.isIP)(r)!==0||r.endsWith(".localhost")?!0:e.has(r)}function eN(t){let e=Gae(t);return(r,n,i)=>{let s=r.headers.host;if(Bae(s,e)){i();return}let o=Xf(s??"");S.warn("SECURITY","Refused a request whose Host is not a trusted name (DNS rebinding check)",{host:o,method:r.method,path:r.path}),n.status(403).json({error:"Forbidden",message:`Host "${o}" is not trusted. To reach the worker by this name, add its origin (for example http://${s}) to CLAUDE_MEM_ALLOWED_ORIGINS and restart the worker.`})}}function tN(t){let e=new Set(t?.allowedOrigins??[]);return(r,n,i)=>{let s=r.headers.origin;if(s){if(!(Fae(s)||e.has(s.toLowerCase())||t!==void 0&&XL(s,r.headers.host))){n.status(403).json({error:"Forbidden",message:"CORS not allowed"});return}n.setHeader("Access-Control-Allow-Origin",s),n.setHeader("Vary","Origin")}if(r.method==="OPTIONS"){n.setHeader("Access-Control-Allow-Methods","GET,HEAD,POST,PUT,PATCH,DELETE"),n.setHeader("Access-Control-Allow-Headers","Content-Type,Authorization,X-Requested-With"),n.status(204).end();return}i()}}function lm(t,e,r){let n=t.ip||t.connection.remoteAddress||"";if(!(n==="127.0.0.1"||n==="::1"||n==="::ffff:127.0.0.1"||n==="localhost")){S.warn("SECURITY","Admin endpoint access denied - not localhost",{endpoint:t.path,clientIp:n,method:t.method}),e.status(403).json({error:"Forbidden",message:"Admin endpoints are only accessible from localhost"});return}r()}function Vae(t,e){let r=(0,rc.createHash)("sha256").update(t,"utf8").digest(),n=(0,rc.createHash)("sha256").update(e,"utf8").digest();if(r.length!==n.length)return!1;try{return(0,rc.timingSafeEqual)(r,n)}catch(i){let s=i instanceof Error?i:new Error(String(i));return S.warn("SECURITY","timing-safe secret comparison failed",{},s),!1}}function Wae(t){return Hae.has(t.method.toUpperCase())?zae.has(t.path)?!t.expectedToken||!t.presentedToken?{allow:!1,status:401,reason:"token"}:Vae(t.presentedToken,t.expectedToken)?{allow:!0}:{allow:!1,status:401,reason:"token"}:{allow:!1,status:404,reason:"path"}:{allow:!1,status:403,reason:"method"}}function Qae(t){let e=Date.now(),r=Ao.get(t.clientIp);if(r&&e-r.windowStart>VL&&(r.count=0,r.windowStart=e),!r){if(Ao.size>=HL){let n=null,i=1/0;for(let[s,o]of Ao)e-o.windowStart>VL?Ao.delete(s):o.windowStart<i&&(i=o.windowStart,n=s);n!==null&&Ao.size>=HL&&Ao.delete(n)}r={count:0,windowStart:e},Ao.set(t.clientIp,r)}r.count+=1,r.count<=Yae?S.warn("SECURITY","Remote request denied",t):S.debug("SECURITY","Remote request denied",t)}function Xae(t){let e=t.query?.token;if(Array.isArray(e)||typeof e!="string")return null;let r=e.trim();return r.length>0?r:null}function rN(t){return(e,r,n)=>{if(Qf(e)&&!Zf(e)){n();return}let i=e.ip||e.socket.remoteAddress||"",s=Yf(e.header("authorization")??"")||e.header("x-api-key")?.trim()||Xae(e)||null,o=Wae({method:e.method,path:e.path,presentedToken:s,expectedToken:t.getToken()});if(!o.allow){Qae({path:e.path,method:e.method,clientIp:i,reason:o.reason}),o.status===404?r.status(404).json({error:"Not found"}):o.status===403?r.status(403).json({error:"Forbidden",message:"Observation TV remote access is read-only"}):r.status(401).json({error:"Unauthorized",message:"Missing or invalid Observation TV token"});return}r.setHeader("Cache-Control","no-store"),n()}}function Zae(t,e,r){if(!r||Object.keys(r).length===0||e.includes("/init"))return"";if(e.includes("/observations")){let n=r.tool_name||"?",i=r.tool_input;return`tool=${GL(S.formatTool(n,i))}`}return e.includes("/summarize")?"requesting summary":""}var NS,WL,YL,rc,zL,Jae,zae,Hae,Yae,HL,VL,Ao,nN=k(()=>{"use strict";NS=Xe(Hf(),1),WL=Xe(require("path"),1),YL=require("net"),rc=require("crypto");Cr();jS();se();Eu();zL=new Set(["localhost","127.0.0.1","[::1]"]);Jae=["localhost","host.docker.internal"];zae=new Set(["/tv","/tv.html","/stream","/api/observations"]),Hae=new Set(["GET","HEAD"]);Yae=10,HL=512,VL=6e4,Ao=new Map});function iN(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}function oN(t,e){e.status(404).json(iN("NotFound",`Cannot ${t.method} ${t.path}`))}var nc,sN,aN=k(()=>{"use strict";se();nc=class extends Error{constructor(r,n=500,i,s){super(r);this.statusCode=n;this.code=i;this.details=s;this.name="AppError"}statusCode;code;details};sN=(t,e,r,n)=>{let i=t instanceof nc?t.statusCode:500;S.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof nc?t.code:void 0},t);let s=iN(t.name||"Error",t.message,t instanceof nc?t.code:void 0,t instanceof nc?t.details:void 0);r.status(i).json(s)}});var ece,tce,kLe,cN=k(()=>{"use strict";ece=new Set([".cmd",".bat"]),tce=new Set([".exe",".com"]),kLe=new Set([...tce,...ece])});function ic(t=process.env){let e={};for(let[r,n]of Object.entries(t))if(n!==void 0){if(nce.has(r)){e[r]=n;continue}US.has(r)||qS.some(i=>r.startsWith(i))||(e[r]=n)}return e}var qS,US,rce,nce,Su=k(()=>{"use strict";qS=["CLAUDECODE_","CLAUDE_CODE_"],US=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID"]),rce=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"]),nce=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_TMPDIR","CLAUDE_CODE_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",...rce])});function dN(t,e,r){if(r.status!==0)return null;if(typeof r.stdout!="string")return S.warn("SYSTEM","captureProcessStartToken: start-token probe returned no stdout",{pid:e,source:t,status:r.status}),null;let n=r.stdout.trim();return n.length>0?n:null}function sce(t){FS+=1;let e=(0,$S.spawnSync)("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${t}").CreationDate.ToString('yyyyMMddHHmmss.ffffff')`],{encoding:"utf-8",timeout:5e3,windowsHide:!0,env:{...ic(process.env),LC_ALL:"C",LANG:"C"}});return dN("powershell-cim",t,e)}function oce(t,e=!1){if(!e){let n=lN.get(t);if(n&&(t===process.pid||Date.now()-n.capturedAtMs<ice))return n.token}let r=null;try{r=sce(t)}catch(n){S.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:t,error:n instanceof Error?n.message:String(n)}),r=null}return(r!==null||t!==process.pid)&&lN.set(t,{token:r,capturedAtMs:Date.now()}),r}function pN(t,e){if(!Number.isInteger(t)||t<=0)return null;if(process.platform==="linux"){FS+=1;try{let r=(0,uN.readFileSync)(`/proc/${t}/stat`,"utf-8"),n=r.lastIndexOf(") ");if(n<0)return null;let s=r.slice(n+2).split(" ")[19];return s&&/^\d+$/.test(s)?s:null}catch(r){return S.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}if(process.platform==="win32")return oce(t,e);FS+=1;try{let r=(0,$S.spawnSync)("ps",["-p",String(t),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...ic(process.env),LC_ALL:"C",LANG:"C"}});return dN("ps-lstart",t,r)}catch(r){return S.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}function Oi(t){return pN(t,!1)}function Ci(t,e){if(e===null)return!0;let r=pN(t,!0);return r===null?!0:r===e}var $S,uN,ice,lN,FS,JS=k(()=>{"use strict";$S=require("child_process"),uN=require("fs");se();Su();ice=5e3,lN=new Map,FS=0});async function Xn(t,e={}){let r=e.signalMode==="immediate",n=e.expectedStartToken!==void 0?e.expectedStartToken:Oi(t),i=()=>Ci(t,n);if(!i()){S.warn("PROCESS","Skipping tree-kill: root PID was reused since it was captured",{pid:t});return}if(S.debug("PROCESS",`Killing process tree rooted at PID ${t}`,{immediate:r}),process.platform==="win32"){try{await GS("taskkill",["/PID",String(t),"/T","/F"],{timeout:5e3,windowsHide:!0})}catch(s){let o=s.code,a=String(s.stderr??""),c=s instanceof Error?s.message:String(s);if(o===ace||cce.test(`${a} ${c}`)){S.debug("PROCESS","taskkill reported the process was already gone",{pid:t});return}throw new um(t,`taskkill failed for PID ${t} (exit ${String(o)}): ${a.trim()||c}`,{cause:s})}return}try{let s=r?"SIGKILL":"SIGTERM",o=await dm(t);for(let l of o){if(!Ci(l.pid,l.startToken)){S.debug("PROCESS",`Skipping ${s}: descendant PID was reused since enumeration`,{pid:l.pid,rootPid:t});continue}try{process.kill(l.pid,s)}catch{}}if(i())try{process.kill(t,s)}catch(l){let u=l instanceof Error?l:new Error(String(l)),p=u.code;p!=="ESRCH"&&S.debug("PROCESS",`Failed to ${s} PID ${t}`,{code:p},u)}else S.warn("PROCESS","Skipping root signal: PID was reused during descendant enumeration",{pid:t,signal:s});r||await new Promise(l=>setTimeout(l,500));let a=i()?await dm(t):[],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(!Ci(l,u)){S.debug("PROCESS","Skipping SIGKILL: descendant PID was reused since the scan",{pid:l,rootPid:t});continue}try{process.kill(l,"SIGKILL")}catch{}}if(!r&&i())try{process.kill(t,"SIGKILL")}catch{}}catch(s){throw new um(t,`tree-kill failed for PID ${t}: ${s instanceof Error?s.message:String(s)}`,{cause:s})}}async function lce(){return process.platform==="win32"?pce():process.platform==="linux"?uce():dce()}function uce(){let t=[],e;try{e=(0,pm.readdirSync)("/proc")}catch(r){return S.warn("PROCESS","Cannot read /proc \u2014 tree-kill degrades to a single-PID kill",{error:r instanceof Error?r.message:String(r)}),t}for(let r of e){if(!/^\d+$/.test(r))continue;let n;try{n=(0,pm.readFileSync)(`/proc/${r}/stat`,"utf-8")}catch{continue}let i=n.lastIndexOf(") ");if(i<0)continue;let s=n.slice(i+2).split(" "),o=Number.parseInt(s[1]??"",10),a=s[19];Number.isFinite(o)&&t.push({pid:Number.parseInt(r,10),ppid:o,startToken:a&&/^\d+$/.test(a)?a:null})}return t}async function dce(){let t;try{t=(await GS("ps",["-eo","pid=,ppid=,lstart="],{timeout:1e4,maxBuffer:33554432,env:{...process.env,LC_ALL:"C",LANG:"C"}})).stdout}catch(r){return S.warn("PROCESS","Cannot enumerate the process table \u2014 tree-kill degrades to a single-PID kill",{error:r instanceof Error?r.message:String(r)}),[]}let e=[];for(let r of t.split(`
68
68
  `)){let n=r.trim().match(/^(\d+)\s+(\d+)\s+(.*)$/);if(!n)continue;let i=n[3].trim();e.push({pid:Number.parseInt(n[1],10),ppid:Number.parseInt(n[2],10),startToken:i.length>0?i:null})}return e}async function pce(){let t;try{t=(await GS("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(r){return S.warn("PROCESS","Cannot enumerate the Windows process table \u2014 tree-kill degrades to a single-PID kill",{error:r instanceof Error?r.message:String(r)}),[]}let e=[];for(let r of t.split(/\r?\n/).slice(1)){let n=r.match(/^"(\d+)","(\d+)","(.*)"$/);if(!n)continue;let i=n[3].trim();e.push({pid:Number.parseInt(n[1],10),ppid:Number.parseInt(n[2],10),startToken:i.length>0?i:null})}return e}async function dm(t){let e=await lce(),r=new Map;for(let o of e){let a=r.get(o.ppid);a?a.push(o):r.set(o.ppid,[o])}let n=new Set([t]),i=[],s=o=>{for(let a of r.get(o)??[])n.has(a.pid)||(n.add(a.pid),s(a.pid),i.push({pid:a.pid,startToken:a.startToken}))};return s(t),i}var fN,pm,mN,GS,ace,cce,um,_u=k(()=>{"use strict";fN=require("child_process"),pm=require("fs"),mN=require("util");se();JS();GS=(0,mN.promisify)(fN.execFile),ace=128,cce=/not found|no running instance|no tasks/i,um=class extends Error{pid;constructor(e,r,n){super(r,n),this.name="ProcessTreeKillError",this.pid=e}}});function St(t){if(!Number.isInteger(t)||t<0||t===0)return!1;try{return process.kill(t,0),!0}catch(e){if(e instanceof Error){let r=e.code;return r==="EPERM"?!0:(S.debug("SYSTEM","PID check failed",{pid:t,code:r}),!1)}return S.warn("SYSTEM","PID check threw non-Error",{pid:t,error:String(e)}),!1}}async function fm(t,e){let r=Date.now()+e;for(;Date.now()<r;){if(t.every(n=>!St(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function ko(t){if(!t||!St(t.pid))return!1;if(!t.startToken)return!0;let e=Oi(t.pid);if(e===null)return!0;let r=e===t.startToken;return r||S.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:t.pid,stored:t.startToken,current:e}),r}function yN(t,e=gce){if(!ko(t))return!1;if(t.startToken||e.platform!=="linux")return!0;let r;try{r=e.readCommandLine(t.pid)}catch(i){return S.debug("SYSTEM","Could not read the command line of a token-less worker PID; trusting the live PID",{pid:t.pid,error:i instanceof Error?i.message:String(i)}),!0}let n=r.split("\0").some(i=>hN.default.basename(i)==="worker-service.cjs");return n||S.debug("SYSTEM","Token-less worker PID now belongs to another program (PID reused)",{pid:t.pid}),n}function mm(){return BS||(BS=new HS),BS}function zS(){let t=bce.shift();t&&t.notify()}var xu,hN,fce,mce,hce,yce,gce,HS,BS,WLe,bce,hs=k(()=>{"use strict";cN();xu=require("fs"),hN=Xe(require("path"),1);se();So();Su();Cr();JS();_u();fce=5e3,mce=1e3,hce=Ke.supervisorRegistry(),yce=null;gce={platform:process.platform,readCommandLine:t=>(0,xu.readFileSync)(`/proc/${t}/cmdline`,"utf-8")};HS=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;persistDegraded=!1;constructor(e=hce){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,!(0,xu.existsSync)(this.registryPath)){this.persist();return}try{let n=JSON.parse((0,xu.readFileSync)(this.registryPath,"utf-8")).processes??{};for(let[i,s]of Object.entries(n))this.entries.set(i,s)}catch(r){r instanceof Error?S.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},r):S.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(r)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&S.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}retainSupersededEntry(e,r){let n=this.entries.get(e);if(!n||n.pid===r||!St(n.pid))return;let i=`${e}#superseded:${n.pid}`;this.entries.set(i,n);let s=this.runtimeProcesses.get(e);s&&(this.runtimeProcesses.set(i,s),this.runtimeProcesses.delete(e)),S.warn("SYSTEM","Registry id reused while the previous process was still alive; kept it for reaping",{id:e,supersededId:i,supersededPid:n.pid,incomingPid:r})}register(e,r,n){this.initialize(),this.retainSupersededEntry(e,r.pid),this.entries.set(e,r),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e,r){this.initialize();let n=e,i=this.entries.get(n);r!==void 0&&i?.pid!==r&&(n=`${e}#superseded:${r}`,i=this.entries.get(n),i?.pid!==r)||i&&(this.entries.delete(n),this.runtimeProcesses.delete(n),this.persist(),i?.type==="sdk"&&zS())}clear(){this.entries.clear(),this.runtimeProcesses.clear(),this.persist()}getAll(){return this.initialize(),Array.from(this.entries.entries()).map(([e,r])=>({id:e,...r})).sort((e,r)=>{let n=Date.parse(e.startedAt),i=Date.parse(r.startedAt);return(Number.isNaN(n)?0:n)-(Number.isNaN(i)?0:i)})}getBySession(e){let r=String(e);return this.getAll().filter(n=>n.sessionId!==void 0&&String(n.sessionId)===r)}getRuntimeProcess(e){return this.runtimeProcesses.get(e)}pruneDeadEntries(){this.initialize();let e=0,r=0;for(let[n,i]of this.entries)St(i.pid)||(this.entries.delete(n),this.runtimeProcesses.delete(n),e+=1,i.type==="sdk"&&(r+=1));e>0&&this.persist();for(let n=0;n<r;n+=1)zS();return e}async reapSession(e){this.initialize();let r=this.getBySession(e);if(r.length===0)return 0;let n=typeof e=="number"?e:Number(e)||void 0;S.info("SYSTEM",`Reaping ${r.length} process(es) for session ${e}`,{sessionId:n,pids:r.map(a=>a.pid)});let i=r.filter(a=>St(a.pid)),s=new Map(i.map(a=>[a.pid,Oi(a.pid)]));for(let a of i)try{process.platform==="win32"?await Xn(a.pid,{expectedStartToken:s.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"&&S.debug("SYSTEM",`Failed to SIGTERM session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},c):S.warn("SYSTEM",`Failed to SIGTERM session process PID ${a.pid} (non-Error)`,{pid:a.pid,pgid:a.pgid,error:String(c)})}await fm(i,fce);let o=i.filter(a=>St(a.pid));for(let a of o){S.warn("SYSTEM",`Session process PID ${a.pid} did not exit after SIGTERM, sending SIGKILL`,{pid:a.pid,pgid:a.pgid,sessionId:n});let c=s.get(a.pid)??null;if(!Ci(a.pid,c)){S.warn("SYSTEM","Skipping SIGKILL: session process PID was reused during the grace window",{pid:a.pid,sessionId:n});continue}try{process.platform==="win32"?await Xn(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"&&S.debug("SYSTEM",`Failed to SIGKILL session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},l):S.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()+mce;for(;Date.now()<a&&o.filter(l=>St(l.pid)).length!==0;)await new Promise(l=>setTimeout(l,100))}for(let a of r)this.entries.delete(a.id),this.runtimeProcesses.delete(a.id);this.persist();for(let a of r)a.type==="sdk"&&zS();return S.info("SYSTEM",`Reaped ${r.length} process(es) for session ${e}`,{sessionId:n,reaped:r.length}),r.length}persist(){let e={processes:Object.fromEntries(this.entries.entries())};try{In(this.registryPath,e),this.persistDegraded=!1}catch(r){this.reportPersistFailure(r)}}reportPersistFailure(e){if(this.persistDegraded)return;this.persistDegraded=!0;let r=e instanceof Error?e:new Error(String(e));S.warn("SYSTEM","Failed to persist supervisor registry; keeping it in memory",{path:this.registryPath},r);try{yce?.({errorCategory:r.code??"unknown"})}catch{}}},BS=null;WLe=180*1e3,bce=[]});async function bN(t){let e=t.currentPid??process.pid,r=t.pidFilePath??vce,n=t.registry.getAll(),i=[...n].filter(c=>c.pid!==e).sort((c,l)=>Date.parse(l.startedAt)-Date.parse(c.startedAt)),s=new Map,o=new Map;for(let c of i){if(!St(c.pid)){t.registry.unregister(c.id);continue}o.set(c.id,Oi(c.pid)),s.set(c.id,await dm(c.pid));try{await gN(c,"SIGTERM")}catch(l){l instanceof Error?S.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:c.pid,pgid:c.pgid,type:c.type},l):S.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(l)})}}await fm(i,5e3);let a=i.filter(c=>St(c.pid)||(s.get(c.id)??[]).some(l=>St(l.pid)));for(let c of a){let l=Ci(c.pid,o.get(c.id)??null);l||S.warn("SYSTEM","Skipping tree-kill: root PID was reused during the grace window",{pid:c.pid,type:c.type});try{l&&await gN(c,"SIGKILL")}catch(u){u instanceof Error?S.debug("SYSTEM","Failed to force kill child process",{pid:c.pid,pgid:c.pgid,type:c.type},u):S.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(u)})}finally{Sce(s.get(c.id)??[],c.pid)}}await fm(a,1e3);for(let c of i)t.registry.unregister(c.id);for(let c of n.filter(l=>l.pid===e))t.registry.unregister(c.id);Ece(r,e),t.registry.pruneDeadEntries()}function Ece(t,e,r=!1){if(!(0,sc.existsSync)(t))return;let n=null;try{let o=JSON.parse((0,sc.readFileSync)(t,"utf-8"));n=typeof o.pid=="number"?o.pid:null}catch(o){S.debug("SYSTEM","PID file unreadable \u2014 leaving it (cannot prove ownership)",{pidFilePath:t,error:o instanceof Error?o.message:String(o)});return}let i=e!==null&&n===e,s=n===null||!St(n);if(!i&&!(r&&s)){S.debug("SYSTEM","PID file not owned by this process \u2014 leaving it for its owner (restart successor?)",{pidFilePath:t,recordedPid:n,currentPid:e});return}try{(0,sc.rmSync)(t,{force:!0})}catch(o){o instanceof Error?S.debug("SYSTEM","Failed to remove PID file",{pidFilePath:t},o):S.warn("SYSTEM","Failed to remove PID file (non-Error)",{pidFilePath:t,error:String(o)})}}function Sce(t,e){for(let{pid:r,startToken:n}of t)if(!(r===e||!St(r))){if(!Ci(r,n)){S.debug("SYSTEM","Skipping reap: PID was recycled during the grace window",{pid:r,rootPid:e});continue}try{process.kill(r,"SIGKILL"),S.debug("SYSTEM","Reaped orphaned descendant during shutdown cascade",{pid:r,rootPid:e})}catch(i){let s=i instanceof Error?i.code:void 0;s!=="ESRCH"&&S.warn("SYSTEM","Failed to reap orphaned descendant during shutdown cascade",{pid:r,rootPid:e,errno:s})}}}async function gN(t,e){let{pid:r,pgid:n}=t;if(process.platform!=="win32"){if(typeof n=="number")try{process.kill(-n,e);return}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}if(e==="SIGKILL"){await Xn(r,{signalMode:"immediate"});return}try{process.kill(r,e)}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}return}await Xn(r)}var sc,vce,vN=k(()=>{"use strict";sc=require("fs");se();hs();Cr();_u();vce=Ke.workerPid()});function _ce(){let e=mm().pruneDeadEntries();e>0&&S.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function SN(){oc===null&&(oc=setInterval(_ce,EN),oc.unref(),S.debug("SYSTEM","Health checker started",{intervalMs:EN}))}function _N(){oc!==null&&(clearInterval(oc),oc=null,S.debug("SYSTEM","Health checker stopped"))}var EN,oc,xN=k(()=>{"use strict";se();hs();EN=3e4,oc=null});function Ice(t){let e=[];for(let r of t.split(`
69
- `)){let n=r.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 Tce(){let t=await xce("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Ice(t.stdout)}function Ace(t,e){let r=t.filter(o=>wce.test(o.command)&&o.pid!==e.selfPid),n=new Set(r.map(o=>o.pid)),i=r.filter(o=>!n.has(o.ppid)),s=i.filter(o=>o.ppid===e.selfPid?!1:o.ppid===1?!0:!e.isAlive(o.ppid));return{matched:r,roots:i,orphans:s}}async function TN(t={}){let e=t.platform??process.platform,r={matched:0,trees:0,orphans:0,killed:0,failed:0,unregistered:0,skipped:null};if(e==="win32")return r.skipped="windows",r;let n=t.readTable??Tce,i=t.isAlive??St,s=t.killTree??(f=>Xn(f,{signalMode:"graceful"})),o=t.selfPid??process.pid,a;try{a=await n()}catch(f){return S.warn("PROCESS","Orphaned chroma-mcp sweep skipped: cannot read the process table",{error:f instanceof Error?f.message:String(f)}),r.skipped="unreadable",r}let{matched:c,roots:l,orphans:u}=Ace(a,{isAlive:i,selfPid:o});if(r.matched=c.length,r.trees=l.length,r.orphans=u.length,u.length===0)return S.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:r.matched,trees:r.trees}),r;S.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(f=>f.pid)});let p=new Set,d=8;for(let f=0;f<u.length;f+=d){let m=u.slice(f,f+d);(await Promise.allSettled(m.map(b=>s(b.pid)))).forEach((b,v)=>{let E=m[v];b.status==="fulfilled"?(r.killed+=1,p.add(E.pid)):(r.failed+=1,S.warn("PROCESS","Failed to reap an orphaned chroma-mcp tree",{pid:E.pid,ppid:E.ppid,error:b.reason instanceof Error?b.reason.message:String(b.reason)}))})}if(t.registry)for(let f of t.registry.getAll())f.type==="chroma"&&p.has(f.pid)&&(t.registry.unregister(f.id),r.unregistered+=1);return S.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:r.orphans,killed:r.killed,failed:r.failed,unregistered:r.unregistered}),r}var wN,IN,xce,wce,AN=k(()=>{"use strict";wN=require("child_process"),IN=require("util");se();_u();hs();xce=(0,IN.promisify)(wN.execFile),wce=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/});function kN(){return Rce}function Oce(t={}){let e=t.pidFilePath??kce;if(!(0,Ro.existsSync)(e))return"missing";let r=null;try{r=JSON.parse((0,Ro.readFileSync)(e,"utf-8"))}catch(i){return i instanceof Error?S.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},i):S.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(i)}),(0,Ro.rmSync)(e,{force:!0}),"invalid"}return yN(r)&&r?((t.logAlive??!0)&&S.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(t.removeStale===!1||(S.info("SYSTEM","Removing stale PID file (worker process is dead or PID has been reused)",{pid:r?.pid,port:r?.port,startedAt:r?.startedAt}),(0,Ro.rmSync)(e,{force:!0})),"stale")}var Ro,kce,VS,Rce,RN=k(()=>{"use strict";Ro=require("fs");se();hs();vN();xN();AN();Cr();hs();kce=Ke.workerPid(),VS=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(),Oce({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,TN({registry:this.registry}).catch(r=>{S.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:r instanceof Error?r.message:String(r)})}),SN()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){S.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,S.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(i){i instanceof Error?S.error("SYSTEM","Error during shutdown",{},i):S.error("SYSTEM","Error during shutdown (non-Error)",{error:String(i)});try{await this.stop()}catch(s){s instanceof Error?S.debug("SYSTEM","Supervisor shutdown fallback failed",{},s):S.debug("SYSTEM","Supervisor shutdown fallback failed",{error:String(s)})}}process.exit(0)};process.on("SIGTERM",()=>{r("SIGTERM")}),process.on("SIGINT",()=>{r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{S.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}_N(),this.stopPromise=bN({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,r,n){this.registry.register(e,r,n)}unregisterProcess(e,r){this.registry.unregister(e,r)}getRegistry(){return this.registry}},Rce=new VS(mm())});function WS(t,e,r){t.on("finish",async()=>{try{await r()}finally{process.exit(0)}}),t.json(e)}var ON=k(()=>{"use strict"});function YS(t,e=Date.now){return Math.max(0,Math.floor((e()-t)/1e3))}var CN=k(()=>{"use strict"});var PN=k(()=>{"use strict"});function QS(){let t=Array.from(Cce.values()).map(e=>({...e})).sort((e,r)=>e.dependency.localeCompare(r.dependency));return{degraded:t.length>0,statuses:t}}var xNe,Cce,MN=k(()=>{"use strict";PN();xNe=5*6e4,Cce=new Map});function XS(t,e){return Oo(t)===Oo(e)}function DN(t,e){let r=Oo(t);return r!==void 0&&r>e}function Mce(t){let e=new Map,r=new Set;if(!t||typeof t!="object")return{windows:e,malformed:r};for(let n of Pce){let i=t[n];if(!i||typeof i!="object")continue;let{utilization:s,resetsAt:o}=i;(!jN(s)||!jN(o))&&r.add(n);let a={};e_(s)&&(a.utilization=s),e_(o)&&(a.resetsAt=Oo(o)),(a.utilization!==void 0||a.resetsAt!==void 0)&&e.set(n,a)}return{windows:e,malformed:r}}function e_(t){return typeof t=="number"&&Number.isFinite(t)}function jN(t){return t===void 0||e_(t)}function Dce(t,e){return e.status!=="rejected"?!1:!t||t.status!=="rejected"?!0:t.resetsAt!==e.resetsAt}function Oo(t){if(!(typeof t!="number"||!Number.isFinite(t)))return t<1e12?t*1e3:t}function jce(t,e){return e!==void 0&&t.profile!==void 0&&t.profile!==e}var Pce,ZS,KN,kNe,LN=k(()=>{"use strict";tc();Cr();se();Pce=["five_hour","seven_day"],ZS=class{entries=new Map;rejections=new Map;set(e){if(!e||typeof e!="object")return!1;let{unifiedWindows:r,...n}=e,i=e.rateLimitType??"default",s=this.rejections.get(i),o=Date.now(),{windows:a,malformed:c}=Mce(r);for(let[d,f]of a){if(d===i||c.has(d))continue;let m=this.entries.get(d),h=m&&!jce(m,e.profile)?m:void 0,b=DN(h?.resetsAt,o)?h?.resetsAt:void 0,v=f.resetsAt??b,E=f.utilization===void 0&&h?.status==="rejected"&&XS(v,h.resetsAt)&&DN(v,o);this.entries.set(d,{rateLimitType:d,...f,resetsAt:v,...E?{status:"rejected"}:{},...e.profile!==void 0?{profile:e.profile}:{},observedAt:o});let _=this.rejections.get(d);_&&f.resetsAt!==void 0&&!XS(f.resetsAt,_.resetsAt)&&this.rejections.delete(d)}let l=e.rateLimitType?a.get(e.rateLimitType):void 0,u={...n,utilization:e.utilization??l?.utilization,resetsAt:Oo(e.resetsAt)??l?.resetsAt,overageResetsAt:Oo(e.overageResetsAt),observedAt:o};this.entries.set(i,u);let p=Dce(s,u);return u.status==="rejected"?this.rejections.set(i,u):(e.status!==void 0||s&&u.resetsAt!==void 0&&!XS(u.resetsAt,s.resetsAt))&&this.rejections.delete(i),p}get(e){return e?this.entries.get(e):this.entries.get("default")}getMostRecentByWindow(e=Date.now()){let r=n=>{let i=this.entries.get(n);if(!i)return;let s=Oo(i.resetsAt);return s!==void 0&&s<=e?{...i,expired:!0}:i};return{five_hour:r("five_hour"),seven_day:r("seven_day"),seven_day_opus:r("seven_day_opus"),seven_day_sonnet:r("seven_day_sonnet"),seven_day_overage_included:r("seven_day_overage_included"),overage:r("overage")}}get size(){return this.entries.size}restoreForTesting(e,r){this.rejections.delete(e),r?(this.entries.set(e,r),r.status==="rejected"&&this.rejections.set(e,r)):this.entries.delete(e)}};KN=new ZS;kNe=900*1e3});function Nce(){try{let{dlopen:t,FFIType:e,ptr:r,suffix:n}=require("bun:ffi"),i=t(`kernel32.${n}`,{SetHandleInformation:{args:[e.ptr,e.u32,e.u32],returns:e.i32}}),s=t(`ws2_32.${n}`,{getsockname:{args:[e.u64,e.ptr,e.ptr],returns:e.i32},ntohs:{args:[e.u16],returns:e.u16}});return{setHandleInformation:i.symbols.SetHandleInformation,getsockname:s.symbols.getsockname,ntohs:s.symbols.ntohs,ptr:r}}catch{return null}}function qce(t){let e=t.address();return!e||typeof e=="string"?null:e.port}function Uce(t,e,r){let i=t._handle?.fd;if(typeof i=="number"&&i>0)return i;let s=new Uint8Array(28),o=new Int32Array([16]);for(let a=4;a<Lce;a+=4){if(o[0]=16,s.fill(0),r.getsockname(a,r.ptr(s),r.ptr(o))!==0)continue;if(r.ntohs(s[2]|s[3]<<8)===e)return a}return null}function NN(t){if(process.platform!=="win32")return!1;let e=qce(t);if(e===null||e<=0)return S.debug("SYSTEM","Windows listen socket inherit clear skipped: no bound port"),!1;let r=Nce();if(!r)return S.warn("SYSTEM","Windows listen socket inherit clear skipped: bun:ffi unavailable"),!1;let n=Uce(t,e,r);if(n===null)return S.warn("SYSTEM","Windows listen socket inherit clear skipped: listen handle not found",{port:e}),!1;try{return r.setHandleInformation(n,Kce,0)?(S.debug("SYSTEM","Cleared HANDLE_FLAG_INHERIT on Windows listen socket",{port:e,socketHandle:n}),!0):(S.warn("SYSTEM","SetHandleInformation failed to clear HANDLE_FLAG_INHERIT on listen socket",{port:e,socketHandle:n}),!1)}catch(i){let s=i instanceof Error?i:new Error(String(i));return S.warn("SYSTEM","Failed to clear Windows listen socket inherit flag",{port:e,socketHandle:n},s),!1}}var Kce,Lce,qN=k(()=>{"use strict";se();Kce=1,Lce=16384});var UN,FN=k(()=>{"use strict";UN=["ready","failed"]});function Jce(){if(r_)return r_.text;let t;try{t=s_.readFileSync(t_,"utf-8"),S.debug("SYSTEM","Cached SKILL.md on first request",{path:t_,bytes:Buffer.byteLength(t,"utf-8")})}catch(e){S.debug("SYSTEM","SKILL.md not present, /api/instructions will 404 for topic queries",{path:t_,message:e instanceof Error?e.message:String(e)}),t=null}return r_={text:t},t}function Gce(){if(n_)return n_;let t=new Map;for(let e of xS){let r=wu.default.join($ce,`${e}.md`);try{t.set(e,s_.readFileSync(r,"utf-8"))}catch(n){S.debug("SYSTEM","Operation instruction file not present",{path:r,message:n instanceof Error?n.message:String(n)})}}return t.size>0&&S.debug("SYSTEM","Cached operation instruction files on first request",{count:t.size,operations:Array.from(t.keys())}),n_=t,t}function Bce(t){t.setHeader("X-Content-Type-Options","nosniff"),t.setHeader("X-Frame-Options","DENY"),t.setHeader("X-DNS-Prefetch-Control","off"),t.setHeader("Referrer-Policy","no-referrer"),t.setHeader("Cross-Origin-Opener-Policy","same-origin"),t.setHeader("Cross-Origin-Resource-Policy","same-origin"),t.setHeader("Origin-Agent-Cluster","?1"),t.removeHeader("X-Powered-By")}var $N,JN,s_,wu,Fce,GN,$ce,t_,r_,n_,i_,hm,BN=k(()=>{"use strict";$N=Xe(Hf(),1),JN=Xe(require("http"),1),s_=Xe(require("fs"),1),wu=Xe(require("path"),1);bL();se();nN();aN();RN();hs();Su();ON();CN();MN();LN();qN();FN();Fce=2e3,GN=wu.default.resolve(__CM_DIRNAME__,"../skills/mem-search"),$ce=wu.default.join(GN,"operations"),t_=wu.default.join(GN,"SKILL.md");i_="14.0.0";hm=class{app;server=null;lastRequestAt=null;inFlightRequests=0;lastResponseFinishedAt=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,$N.default)(),this.app.disable("x-powered-by"),this.setupRemoteReadOnlyGuard(),this.setupSecurityHeaders(),this.setupCors(),this.setupPreBodyParserRoutes(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}getLastRequestAt(){return this.lastRequestAt}getInFlightRequestCount(){return this.inFlightRequests}getLastResponseFinishedAt(){return this.lastResponseFinishedAt}trackRequestActivity(e){this.lastRequestAt=Date.now(),this.inFlightRequests++;let r=e.socket,n=!1,i=()=>{n||(n=!0,e.off("finish",i),e.off("close",i),r?.off("close",i),this.inFlightRequests--,this.lastRequestAt=Date.now())};e.on("finish",i),e.on("close",i),r?.on("close",i),e.once("finish",()=>{this.lastResponseFinishedAt=Date.now()})}async listen(e,r){return new Promise((n,i)=>{let s=JN.default.createServer(this.app),o=c=>{s.off("listening",a),i(c)},a=()=>{s.off("error",o),this.server=s,NN(s),S.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()};s.once("error",o),s.once("listening",a),s.listen(e,r)})}async close(){this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{this.server.close(n=>n?r(n):e())}),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),this.server=null,S.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(oN),this.app.use(sN)}setupMiddleware(){this.app.use((r,n,i)=>{this.trackRequestActivity(n),i()}),QL().forEach(r=>this.app.use(r))}setupRemoteReadOnlyGuard(){this.options.remoteReadOnly&&this.app.use(rN(this.options.remoteReadOnly))}setupSecurityHeaders(){this.options.securityHeaders&&this.app.use((e,r,n)=>{Bce(r),n()})}setupCors(){this.options.originPolicy&&(this.app.use(eN(this.options.originPolicy)),this.app.use(ZL(this.options.originPolicy))),this.app.use(tN(this.options.originPolicy))}setupPreBodyParserRoutes(){this.options.preBodyParserRoutes?.forEach(e=>e.setupRoutes(this.app))}handleReadyStream(e,r){r.setHeader("Content-Type","text/event-stream"),r.setHeader("Cache-Control","no-cache"),r.setHeader("Connection","keep-alive"),r.flushHeaders();let n=this.options.initPhaseSource,i=()=>n?n.getInitPhase():{phase:this.options.getInitializationComplete()?"ready":"starting"},s=!1,o=null,a=null,c=null,l=e.socket,u=()=>{s=!0,c!==null&&(clearInterval(c),c=null),a!==null&&(a(),a=null),r.off("close",u),l.off("close",u)},p=d=>{if(s||d.phase===o)return;o=d.phase;let f={phase:d.phase,...d.message!==void 0?{message:d.message}:{},version:i_,pid:process.pid};r.write(`event: phase
69
+ `)){let n=r.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 Tce(){let t=await xce("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Ice(t.stdout)}function Ace(t,e){let r=t.filter(o=>wce.test(o.command)&&o.pid!==e.selfPid),n=new Set(r.map(o=>o.pid)),i=r.filter(o=>!n.has(o.ppid)),s=i.filter(o=>o.ppid===e.selfPid?!1:o.ppid===1?!0:!e.isAlive(o.ppid));return{matched:r,roots:i,orphans:s}}async function TN(t={}){let e=t.platform??process.platform,r={matched:0,trees:0,orphans:0,killed:0,failed:0,unregistered:0,skipped:null};if(e==="win32")return r.skipped="windows",r;let n=t.readTable??Tce,i=t.isAlive??St,s=t.killTree??(f=>Xn(f,{signalMode:"graceful"})),o=t.selfPid??process.pid,a;try{a=await n()}catch(f){return S.warn("PROCESS","Orphaned chroma-mcp sweep skipped: cannot read the process table",{error:f instanceof Error?f.message:String(f)}),r.skipped="unreadable",r}let{matched:c,roots:l,orphans:u}=Ace(a,{isAlive:i,selfPid:o});if(r.matched=c.length,r.trees=l.length,r.orphans=u.length,u.length===0)return S.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:r.matched,trees:r.trees}),r;S.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(f=>f.pid)});let p=new Set,d=8;for(let f=0;f<u.length;f+=d){let m=u.slice(f,f+d);(await Promise.allSettled(m.map(b=>s(b.pid)))).forEach((b,v)=>{let E=m[v];b.status==="fulfilled"?(r.killed+=1,p.add(E.pid)):(r.failed+=1,S.warn("PROCESS","Failed to reap an orphaned chroma-mcp tree",{pid:E.pid,ppid:E.ppid,error:b.reason instanceof Error?b.reason.message:String(b.reason)}))})}if(t.registry)for(let f of t.registry.getAll())f.type==="chroma"&&p.has(f.pid)&&(t.registry.unregister(f.id),r.unregistered+=1);return S.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:r.orphans,killed:r.killed,failed:r.failed,unregistered:r.unregistered}),r}var wN,IN,xce,wce,AN=k(()=>{"use strict";wN=require("child_process"),IN=require("util");se();_u();hs();xce=(0,IN.promisify)(wN.execFile),wce=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/});function kN(){return Rce}function Oce(t={}){let e=t.pidFilePath??kce;if(!(0,Ro.existsSync)(e))return"missing";let r=null;try{r=JSON.parse((0,Ro.readFileSync)(e,"utf-8"))}catch(i){return i instanceof Error?S.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},i):S.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(i)}),(0,Ro.rmSync)(e,{force:!0}),"invalid"}return yN(r)&&r?((t.logAlive??!0)&&S.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(t.removeStale===!1||(S.info("SYSTEM","Removing stale PID file (worker process is dead or PID has been reused)",{pid:r?.pid,port:r?.port,startedAt:r?.startedAt}),(0,Ro.rmSync)(e,{force:!0})),"stale")}var Ro,kce,VS,Rce,RN=k(()=>{"use strict";Ro=require("fs");se();hs();vN();xN();AN();Cr();hs();kce=Ke.workerPid(),VS=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(),Oce({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,TN({registry:this.registry}).catch(r=>{S.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:r instanceof Error?r.message:String(r)})}),SN()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){S.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,S.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(i){i instanceof Error?S.error("SYSTEM","Error during shutdown",{},i):S.error("SYSTEM","Error during shutdown (non-Error)",{error:String(i)});try{await this.stop()}catch(s){s instanceof Error?S.debug("SYSTEM","Supervisor shutdown fallback failed",{},s):S.debug("SYSTEM","Supervisor shutdown fallback failed",{error:String(s)})}}process.exit(0)};process.on("SIGTERM",()=>{r("SIGTERM")}),process.on("SIGINT",()=>{r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{S.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}_N(),this.stopPromise=bN({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,r,n){this.registry.register(e,r,n)}unregisterProcess(e,r){this.registry.unregister(e,r)}getRegistry(){return this.registry}},Rce=new VS(mm())});function WS(t,e,r){t.on("finish",async()=>{try{await r()}finally{process.exit(0)}}),t.json(e)}var ON=k(()=>{"use strict"});function YS(t,e=Date.now){return Math.max(0,Math.floor((e()-t)/1e3))}var CN=k(()=>{"use strict"});var PN=k(()=>{"use strict"});function QS(){let t=Array.from(Cce.values()).map(e=>({...e})).sort((e,r)=>e.dependency.localeCompare(r.dependency));return{degraded:t.length>0,statuses:t}}var xNe,Cce,MN=k(()=>{"use strict";PN();xNe=5*6e4,Cce=new Map});function XS(t,e){return Oo(t)===Oo(e)}function DN(t,e){let r=Oo(t);return r!==void 0&&r>e}function Mce(t){let e=new Map,r=new Set;if(!t||typeof t!="object")return{windows:e,malformed:r};for(let n of Pce){let i=t[n];if(!i||typeof i!="object")continue;let{utilization:s,resetsAt:o}=i;(!jN(s)||!jN(o))&&r.add(n);let a={};e_(s)&&(a.utilization=s),e_(o)&&(a.resetsAt=Oo(o)),(a.utilization!==void 0||a.resetsAt!==void 0)&&e.set(n,a)}return{windows:e,malformed:r}}function e_(t){return typeof t=="number"&&Number.isFinite(t)}function jN(t){return t===void 0||e_(t)}function Dce(t,e){return e.status!=="rejected"?!1:!t||t.status!=="rejected"?!0:t.resetsAt!==e.resetsAt}function Oo(t){if(!(typeof t!="number"||!Number.isFinite(t)))return t<1e12?t*1e3:t}function jce(t,e){return e!==void 0&&t.profile!==void 0&&t.profile!==e}var Pce,ZS,KN,kNe,LN=k(()=>{"use strict";tc();Cr();se();Pce=["five_hour","seven_day"],ZS=class{entries=new Map;rejections=new Map;set(e){if(!e||typeof e!="object")return!1;let{unifiedWindows:r,...n}=e,i=e.rateLimitType??"default",s=this.rejections.get(i),o=Date.now(),{windows:a,malformed:c}=Mce(r);for(let[d,f]of a){if(d===i||c.has(d))continue;let m=this.entries.get(d),h=m&&!jce(m,e.profile)?m:void 0,b=DN(h?.resetsAt,o)?h?.resetsAt:void 0,v=f.resetsAt??b,E=f.utilization===void 0&&h?.status==="rejected"&&XS(v,h.resetsAt)&&DN(v,o);this.entries.set(d,{rateLimitType:d,...f,resetsAt:v,...E?{status:"rejected"}:{},...e.profile!==void 0?{profile:e.profile}:{},observedAt:o});let _=this.rejections.get(d);_&&f.resetsAt!==void 0&&!XS(f.resetsAt,_.resetsAt)&&this.rejections.delete(d)}let l=e.rateLimitType?a.get(e.rateLimitType):void 0,u={...n,utilization:e.utilization??l?.utilization,resetsAt:Oo(e.resetsAt)??l?.resetsAt,overageResetsAt:Oo(e.overageResetsAt),observedAt:o};this.entries.set(i,u);let p=Dce(s,u);return u.status==="rejected"?this.rejections.set(i,u):(e.status!==void 0||s&&u.resetsAt!==void 0&&!XS(u.resetsAt,s.resetsAt))&&this.rejections.delete(i),p}get(e){return e?this.entries.get(e):this.entries.get("default")}getMostRecentByWindow(e=Date.now()){let r=n=>{let i=this.entries.get(n);if(!i)return;let s=Oo(i.resetsAt);return s!==void 0&&s<=e?{...i,expired:!0}:i};return{five_hour:r("five_hour"),seven_day:r("seven_day"),seven_day_opus:r("seven_day_opus"),seven_day_sonnet:r("seven_day_sonnet"),seven_day_overage_included:r("seven_day_overage_included"),overage:r("overage")}}get size(){return this.entries.size}restoreForTesting(e,r){this.rejections.delete(e),r?(this.entries.set(e,r),r.status==="rejected"&&this.rejections.set(e,r)):this.entries.delete(e)}};KN=new ZS;kNe=900*1e3});function Nce(){try{let{dlopen:t,FFIType:e,ptr:r,suffix:n}=require("bun:ffi"),i=t(`kernel32.${n}`,{SetHandleInformation:{args:[e.ptr,e.u32,e.u32],returns:e.i32}}),s=t(`ws2_32.${n}`,{getsockname:{args:[e.u64,e.ptr,e.ptr],returns:e.i32},ntohs:{args:[e.u16],returns:e.u16}});return{setHandleInformation:i.symbols.SetHandleInformation,getsockname:s.symbols.getsockname,ntohs:s.symbols.ntohs,ptr:r}}catch{return null}}function qce(t){let e=t.address();return!e||typeof e=="string"?null:e.port}function Uce(t,e,r){let i=t._handle?.fd;if(typeof i=="number"&&i>0)return i;let s=new Uint8Array(28),o=new Int32Array([16]);for(let a=4;a<Lce;a+=4){if(o[0]=16,s.fill(0),r.getsockname(a,r.ptr(s),r.ptr(o))!==0)continue;if(r.ntohs(s[2]|s[3]<<8)===e)return a}return null}function NN(t){if(process.platform!=="win32")return!1;let e=qce(t);if(e===null||e<=0)return S.debug("SYSTEM","Windows listen socket inherit clear skipped: no bound port"),!1;let r=Nce();if(!r)return S.warn("SYSTEM","Windows listen socket inherit clear skipped: bun:ffi unavailable"),!1;let n=Uce(t,e,r);if(n===null)return S.warn("SYSTEM","Windows listen socket inherit clear skipped: listen handle not found",{port:e}),!1;try{return r.setHandleInformation(n,Kce,0)?(S.debug("SYSTEM","Cleared HANDLE_FLAG_INHERIT on Windows listen socket",{port:e,socketHandle:n}),!0):(S.warn("SYSTEM","SetHandleInformation failed to clear HANDLE_FLAG_INHERIT on listen socket",{port:e,socketHandle:n}),!1)}catch(i){let s=i instanceof Error?i:new Error(String(i));return S.warn("SYSTEM","Failed to clear Windows listen socket inherit flag",{port:e,socketHandle:n},s),!1}}var Kce,Lce,qN=k(()=>{"use strict";se();Kce=1,Lce=16384});var UN,FN=k(()=>{"use strict";UN=["ready","failed"]});function Jce(){if(r_)return r_.text;let t;try{t=s_.readFileSync(t_,"utf-8"),S.debug("SYSTEM","Cached SKILL.md on first request",{path:t_,bytes:Buffer.byteLength(t,"utf-8")})}catch(e){S.debug("SYSTEM","SKILL.md not present, /api/instructions will 404 for topic queries",{path:t_,message:e instanceof Error?e.message:String(e)}),t=null}return r_={text:t},t}function Gce(){if(n_)return n_;let t=new Map;for(let e of xS){let r=wu.default.join($ce,`${e}.md`);try{t.set(e,s_.readFileSync(r,"utf-8"))}catch(n){S.debug("SYSTEM","Operation instruction file not present",{path:r,message:n instanceof Error?n.message:String(n)})}}return t.size>0&&S.debug("SYSTEM","Cached operation instruction files on first request",{count:t.size,operations:Array.from(t.keys())}),n_=t,t}function Bce(t){t.setHeader("X-Content-Type-Options","nosniff"),t.setHeader("X-Frame-Options","DENY"),t.setHeader("X-DNS-Prefetch-Control","off"),t.setHeader("Referrer-Policy","no-referrer"),t.setHeader("Cross-Origin-Opener-Policy","same-origin"),t.setHeader("Cross-Origin-Resource-Policy","same-origin"),t.setHeader("Origin-Agent-Cluster","?1"),t.removeHeader("X-Powered-By")}var $N,JN,s_,wu,Fce,GN,$ce,t_,r_,n_,i_,hm,BN=k(()=>{"use strict";$N=Xe(Hf(),1),JN=Xe(require("http"),1),s_=Xe(require("fs"),1),wu=Xe(require("path"),1);bL();se();nN();aN();RN();hs();Su();ON();CN();MN();LN();qN();FN();Fce=2e3,GN=wu.default.resolve(__CM_DIRNAME__,"../skills/mem-search"),$ce=wu.default.join(GN,"operations"),t_=wu.default.join(GN,"SKILL.md");i_="14.0.1";hm=class{app;server=null;lastRequestAt=null;inFlightRequests=0;lastResponseFinishedAt=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,$N.default)(),this.app.disable("x-powered-by"),this.setupRemoteReadOnlyGuard(),this.setupSecurityHeaders(),this.setupCors(),this.setupPreBodyParserRoutes(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}getLastRequestAt(){return this.lastRequestAt}getInFlightRequestCount(){return this.inFlightRequests}getLastResponseFinishedAt(){return this.lastResponseFinishedAt}trackRequestActivity(e){this.lastRequestAt=Date.now(),this.inFlightRequests++;let r=e.socket,n=!1,i=()=>{n||(n=!0,e.off("finish",i),e.off("close",i),r?.off("close",i),this.inFlightRequests--,this.lastRequestAt=Date.now())};e.on("finish",i),e.on("close",i),r?.on("close",i),e.once("finish",()=>{this.lastResponseFinishedAt=Date.now()})}async listen(e,r){return new Promise((n,i)=>{let s=JN.default.createServer(this.app),o=c=>{s.off("listening",a),i(c)},a=()=>{s.off("error",o),this.server=s,NN(s),S.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()};s.once("error",o),s.once("listening",a),s.listen(e,r)})}async close(){this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{this.server.close(n=>n?r(n):e())}),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),this.server=null,S.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(oN),this.app.use(sN)}setupMiddleware(){this.app.use((r,n,i)=>{this.trackRequestActivity(n),i()}),QL().forEach(r=>this.app.use(r))}setupRemoteReadOnlyGuard(){this.options.remoteReadOnly&&this.app.use(rN(this.options.remoteReadOnly))}setupSecurityHeaders(){this.options.securityHeaders&&this.app.use((e,r,n)=>{Bce(r),n()})}setupCors(){this.options.originPolicy&&(this.app.use(eN(this.options.originPolicy)),this.app.use(ZL(this.options.originPolicy))),this.app.use(tN(this.options.originPolicy))}setupPreBodyParserRoutes(){this.options.preBodyParserRoutes?.forEach(e=>e.setupRoutes(this.app))}handleReadyStream(e,r){r.setHeader("Content-Type","text/event-stream"),r.setHeader("Cache-Control","no-cache"),r.setHeader("Connection","keep-alive"),r.flushHeaders();let n=this.options.initPhaseSource,i=()=>n?n.getInitPhase():{phase:this.options.getInitializationComplete()?"ready":"starting"},s=!1,o=null,a=null,c=null,l=e.socket,u=()=>{s=!0,c!==null&&(clearInterval(c),c=null),a!==null&&(a(),a=null),r.off("close",u),l.off("close",u)},p=d=>{if(s||d.phase===o)return;o=d.phase;let f={phase:d.phase,...d.message!==void 0?{message:d.message}:{},version:i_,pid:process.pid};r.write(`event: phase
70
70
  data: ${JSON.stringify(f)}
71
71
 
72
72
  `),UN.includes(d.phase)&&(u(),r.end())};r.on("close",u),l.on("close",u),n&&(a=n.subscribeInitPhase(p)),p(i()),!s&&(c=setInterval(()=>{s||(r.write(`: ping
@@ -428,7 +428,7 @@ data:
428
428
  LIMIT $4)
429
429
  )
430
430
  ORDER BY e.occurred_at ASC, e.id ASC
431
- `,[e.serverSessionId,e.projectId,e.teamId,r])).rows.map(zEe)}}});function AJ(t){let e=WEe.safeParse(t);if(!e.success)throw new Md(e.error.issues);return e.data}var tr,Hc,IJ,TJ,HEe,VEe,WEe,Md,cy=k(()=>{"use strict";tr=require("zod"),Hc={event:"server_beta_generate_event",summary:"server_beta_generate_summary"},IJ={event:"evt",summary:"sum"},TJ=tr.z.object({team_id:tr.z.string().min(1,"team_id is required"),project_id:tr.z.string().min(1,"project_id is required"),source_type:tr.z.enum(["agent_event","session_summary","observation_reindex"]),source_id:tr.z.string().min(1,"source_id is required"),generation_job_id:tr.z.string().min(1,"generation_job_id is required"),api_key_id:tr.z.string().min(1).nullable(),actor_id:tr.z.string().min(1).nullable(),source_adapter:tr.z.string().min(1,"source_adapter is required"),request_id:tr.z.string().min(1).nullable().optional()}),HEe=TJ.extend({kind:tr.z.literal("event"),agent_event_id:tr.z.string().min(1)}),VEe=TJ.extend({kind:tr.z.literal("summary"),server_session_id:tr.z.string().min(1)}),WEe=tr.z.discriminatedUnion("kind",[HEe,VEe]),Md=class extends Error{issues;constructor(e){super(`invalid server generation job payload: ${e.map(r=>r.message).join("; ")}`),this.issues=e}}});function Vc(t){let e=IJ[t.kind],r=JSON.stringify({kind:t.kind,team_id:t.team_id,project_id:t.project_id,source_type:t.source_type,source_id:t.source_id}),n=(0,kJ.createHash)("sha256").update(r).digest("hex");return`${e}_${n}`}var kJ,k1=k(()=>{"use strict";kJ=require("crypto");cy()});function RJ(t){return{kind:"event",team_id:t.event.teamId,project_id:t.event.projectId,source_type:"agent_event",source_id:t.event.id,generation_job_id:t.outboxId,agent_event_id:t.event.id,api_key_id:t.apiKeyId,actor_id:t.actorId,source_adapter:t.sourceAdapter??t.event.sourceAdapter??"api",request_id:t.requestId}}var OJ,ly,CJ=k(()=>{"use strict";cc();Mi();No();se();k1();Rn();OJ="observation_generate_for_event",ly=class{constructor(e){this.options=e}options;async ingestOne(e,r={}){let n=r.generate??!0,i=r.source??"http_post_v1_events",s=await Cn(this.options.pool,async a=>{let l=await new tn(a).create(e);if(!n)return{event:l,outbox:null};let u=new it(a),p=new Ot(a),d=et(),f=RJ({outboxId:d,event:l,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),m=await u.create({id:d,projectId:l.projectId,teamId:l.teamId,sourceType:"agent_event",sourceId:l.id,agentEventId:l.id,serverSessionId:l.serverSessionId,jobType:OJ,bullmqJobId:Vc({kind:"event",team_id:l.teamId,project_id:l.projectId,source_type:"agent_event",source_id:l.id}),payload:f});return await p.append({generationJobId:m.id,projectId:m.projectId,teamId:m.teamId,eventType:"queued",statusAfter:m.status,attempt:m.attempts,details:{source:i}}),{event:l,outbox:m}}),o="skipped";return s.outbox&&(o=await this.publishEventJob(s.event,s.outbox)),{event:s.event,outbox:s.outbox,enqueueState:o}}async ingestBatch(e,r={}){let n=r.generate??!0,i=r.source??"http_post_v1_events_batch",s=await Cn(this.options.pool,async o=>{let a=new tn(o),c=new it(o),l=new Ot(o),u=[];for(let p of e){let d=await a.create(p);if(!n){u.push({event:d,outbox:null});continue}let f=et(),m=RJ({outboxId:f,event:d,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),h=await c.create({id:f,projectId:d.projectId,teamId:d.teamId,sourceType:"agent_event",sourceId:d.id,agentEventId:d.id,serverSessionId:d.serverSessionId,jobType:OJ,bullmqJobId:Vc({kind:"event",team_id:d.teamId,project_id:d.projectId,source_type:"agent_event",source_id:d.id}),payload:m});await l.append({generationJobId:h.id,projectId:h.projectId,teamId:h.teamId,eventType:"queued",statusAfter:h.status,attempt:h.attempts,details:{source:i}}),u.push({event:d,outbox:h})}return u});return Promise.all(s.map(async({event:o,outbox:a})=>{let c=a?await this.publishEventJob(o,a):"skipped";return{event:o,outbox:a,enqueueState:c}}))}async publishEventJob(e,r){let n=this.options.resolveEventQueue();if(!n)return"queued_only";let i=r.bullmqJobId??Vc({kind:"event",team_id:e.teamId,project_id:e.projectId,source_type:"agent_event",source_id:e.id});try{return await n.add(i,r.payload),"enqueued"}catch(s){return S.warn("SYSTEM","failed to publish event generation job to BullMQ",{outboxId:r.id,error:s instanceof Error?s.message:String(s)}),"queued_only"}}}});function R1(t){return Vc({kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId})}function O1(t){return{kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId,generation_job_id:t.generationJobId,server_session_id:t.serverSessionId,api_key_id:t.apiKeyId??null,actor_id:t.actorId??null,source_adapter:t.sourceAdapter??"api",request_id:t.requestId??null}}var PJ=k(()=>{"use strict";k1()});var YEe,uy,MJ=k(()=>{"use strict";Mi();No();Ds();se();PJ();Rn();YEe="observation_generate_session_summary",uy=class{constructor(e){this.options=e}options;async end(e){let r=e.source??"http_post_v1_sessions_end",n=await Cn(this.options.pool,async s=>{let a=await new Bt(s).endSession({id:e.sessionId,projectId:e.projectId,teamId:e.teamId});if(!a)return{session:null,outbox:null};let c=new it(s),l=new Ot(s),u=et(),p=O1({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId,generationJobId:u,apiKeyId:e.apiKeyId??null,actorId:e.actorId??null,sourceAdapter:e.sourceAdapter??null}),d=await c.create({id:u,projectId:a.projectId,teamId:a.teamId,sourceType:"session_summary",sourceId:a.id,serverSessionId:a.id,jobType:YEe,bullmqJobId:R1({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId}),payload:p});return await l.append({generationJobId:d.id,projectId:d.projectId,teamId:d.teamId,eventType:"queued",statusAfter:d.status,attempt:d.attempts,details:{source:r}}),{session:a,outbox:d}});if(!n.session||!n.outbox)return{session:n.session,outbox:null,enqueueState:"skipped"};let i=await this.publishSummaryJob(n.session.id,n.outbox,e);return{session:n.session,outbox:n.outbox,enqueueState:i}}async publishSummaryJob(e,r,n){let i=this.options.resolveSummaryQueue();if(!i)return"queued_only";let s=r.bullmqJobId??R1({serverSessionId:e,teamId:r.teamId,projectId:r.projectId}),o=O1({serverSessionId:e,teamId:r.teamId,projectId:r.projectId,generationJobId:r.id,apiKeyId:n.apiKeyId??null,actorId:n.actorId??null,sourceAdapter:n.sourceAdapter??null});try{return await i.add(s,o),"enqueued"}catch(a){return S.warn("SYSTEM","failed to publish summary generation job to BullMQ",{outboxId:r.id,error:a instanceof Error?a.message:String(a)}),"queued_only"}}}});var DJ=k(()=>{"use strict"});function LJ(t){return`${(process.env.CLAUDE_MEM_PUBLIC_URL??`${t.protocol}://${t.get("host")??"localhost"}`).replace(/\/+$/,"")}/v1/mcp`}function NJ(t,e){return`claude mcp add --transport http claude-mem ${t} --header "Authorization: Bearer ${e}"`}async function FJ(t,e,r=BJ,n=eSe){if(UJ.includes(e.status))return{job:e,timedOut:!1};let i=Date.now()+r,s=e;for(;Date.now()<i;){await new Promise(a=>setTimeout(a,n));let o=await t.getByIdForScope({id:e.id,projectId:e.projectId,teamId:e.teamId});if(!o)return{job:s,timedOut:!1};if(s=o,UJ.includes(o.status))return{job:o,timedOut:!1}}return{job:s,timedOut:!0}}function rSe(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&zJ.has(e)?e:null,n=typeof t.query.source_type=="string"?t.query.source_type.trim():"",i=n&&tSe.has(n)?n:null,s=py(t.query.limit,HJ,1,VJ),o=py(t.query.offset,0,0,Number.MAX_SAFE_INTEGER),a=typeof t.query.since=="string"?t.query.since.trim():"",c=null;if(a){let l=new Date(a);Number.isNaN(l.getTime())||(c=l)}return{status:r,sourceType:i,limit:s,offset:o,since:c}}function $J(t){if(!t||typeof t!="object")return 0;let e=t.retried_count;return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.floor(e):0}function JJ(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&zJ.has(e)?e:null,n=py(t.query.limit,HJ,1,VJ),i=py(t.query.offset,0,0,Number.MAX_SAFE_INTEGER);return{status:r,limit:n,offset:i}}function py(t,e,r,n){if(typeof t!="string")return e;let i=Number.parseInt(t,10);return Number.isFinite(i)?Math.max(r,Math.min(n,i)):e}function C1(t,e={}){let r={id:t.id,projectId:t.project_id,teamId:t.team_id,sourceType:t.source_type,sourceId:t.source_id,status:t.status,attempts:t.attempts,maxAttempts:t.max_attempts,createdAtEpoch:new Date(t.created_at).getTime(),completedAtEpoch:t.completed_at?new Date(t.completed_at).getTime():null,failedAtEpoch:t.failed_at?new Date(t.failed_at).getTime():null,lastError:t.last_error&&typeof t.last_error=="object"?t.last_error:null};return e.includePayload&&t.payload&&typeof t.payload=="object"&&(r.payload=t.payload),r}function nSe(t){let e={"event.received":"agent_event","event.batch_received":"agent_event","event.write":"agent_event","event.batch_write":"agent_event","session.write":"server_session","session.end":"server_session","memory.write":"observation","observation.read":"observation","observation.search":"observation","observation.context":"observation","observation.generated":"observation","session_summary.generated":"observation","generation_job.queued":"observation_generation_job","generation_job.enqueued":"observation_generation_job","generation_job.processing":"observation_generation_job","generation_job.completed":"observation_generation_job","generation_job.failed":"observation_generation_job","generation_job.scope_violation":"observation_generation_job","generation_job.revoked_key":"observation_generation_job","generation_job.retried_by_operator":"observation_generation_job","generation_job.cancelled_by_operator":"observation_generation_job","generation_job.stalled":"observation_generation_job"};return e[t]?e[t]:t.split(".")[0]??"unknown"}function iSe(t,e){let r=t.authContext?.projectId??null;if(!(t.authContext?.teamId??null))return{status:403,body:{error:"Forbidden",message:"API key is not bound to a team"}};if(!r)return null;for(let i of e)if(i.projectId!==r)return{status:403,body:{error:"Forbidden",message:"API key is scoped to a different project"}};return null}function Dd(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,externalSessionId:t.externalSessionId,contentSessionId:t.contentSessionId,agentId:t.agentId,agentType:t.agentType,platformSource:t.platformSource,generationStatus:t.generationStatus,metadata:t.metadata,startedAtEpoch:t.startedAtEpoch,endedAtEpoch:t.endedAtEpoch,lastGeneratedAtEpoch:t.lastGeneratedAtEpoch,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function jd(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,sourceAdapter:t.sourceAdapter,sourceEventId:t.sourceEventId,eventType:t.eventType,platformSource:t.platformSource,payload:t.payload,metadata:t.metadata,occurredAtEpoch:t.occurredAtEpoch,receivedAtEpoch:t.receivedAtEpoch,createdAtEpoch:t.createdAtEpoch}}function ea(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},kind:t.kind,content:t.content,metadata:t.metadata,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function sSe(t){return{id:t.id,projectId:t.project_id,teamId:t.team_id,serverSessionId:t.server_session_id,kind:t.kind,content:t.content,metadata:t.metadata&&typeof t.metadata=="object"?t.metadata:{},generationKey:t.generation_key,createdByJobId:t.created_by_job_id,createdAtEpoch:new Date(t.created_at).getTime(),updatedAtEpoch:new Date(t.updated_at).getTime(),source:{id:t.source_id_pk,sourceType:t.source_type,sourceId:t.source_id,generationJobId:t.generation_job_id,createdAtEpoch:new Date(t.source_created_at).getTime()}}}function P1(t,e){return{id:t.id,status:t.status,bullmqJobId:t.bullmqJobId,sourceType:t.sourceType,sourceId:t.sourceId,transport:e,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function GJ(t,e){return{id:t.id,status:t.status,transport:e,bullmqJobId:t.bullmqJobId,sourceType:t.sourceType,sourceId:t.sourceId,attempts:t.attempts,maxAttempts:t.maxAttempts,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function M1(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,sourceType:t.sourceType,sourceId:t.sourceId,agentEventId:t.agentEventId,serverSessionId:t.serverSessionId,jobType:t.jobType,status:t.status,bullmqJobId:t.bullmqJobId,attempts:t.attempts,maxAttempts:t.maxAttempts,nextAttemptAtEpoch:t.nextAttemptAtEpoch,completedAtEpoch:t.completedAtEpoch,failedAtEpoch:t.failedAtEpoch,cancelledAtEpoch:t.cancelledAtEpoch,lastError:t.lastError,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}var X,Wc,XEe,ZEe,qJ,BJ,eSe,UJ,dy,tSe,zJ,HJ,VJ,WJ=k(()=>{"use strict";X=require("zod");zN();cc();Mi();Di();Ru();uc();se();bm();hx();eU();t4();vJ();SJ();xJ();Zo();Wc=require("node:crypto");Ds();CJ();MJ();Co();DJ();XEe="api",ZEe="14.0.0";qJ=X.z.object({generate:X.z.union([X.z.literal("true"),X.z.literal("false")]).optional(),wait:X.z.union([X.z.literal("true"),X.z.literal("false")]).optional()}),BJ=3e4,eSe=100,UJ=["completed","failed","cancelled"];dy=class{constructor(e){this.options=e;this.ingestEvents=new ly({pool:e.pool,resolveEventQueue:()=>this.resolveQueue("event")}),this.endSession=new uy({pool:e.pool,resolveSummaryQueue:()=>this.resolveQueue("summary")})}options;ingestEvents;endSession;getIngestEventsService(){return this.ingestEvents}getEndSessionService(){return this.endSession}setupRoutes(e){e.use("/v1",Z2());let r=Mo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:write"]}),n=Mo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:read"]}),i=[],s=Number(process.env.CLAUDE_MEM_RATE_LIMIT_PER_MIN??"0");s>0&&i.push(EJ(this.options.pool,{windowSec:60,max:s}));let o=Number(process.env.CLAUDE_MEM_MONTHLY_REQUEST_CAP??"0");o>0&&i.push(A1(this.options.pool,{kind:"request",cap:o})),process.env.CLAUDE_MEM_USAGE_METERING==="1"&&i.push(_J(this.options.pool));let a=[...i],c=Number(process.env.CLAUDE_MEM_MONTHLY_TOKEN_CAP??"0");c>0&&a.push(A1(this.options.pool,{kind:"tokens",cap:c}));let l=[r,...a],u=[n,...i];e.get("/v1/usage",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=new Date(Date.UTC(new Date().getUTCFullYear(),new Date().getUTCMonth(),1)),b=await new Lr(this.options.pool).summarize({teamId:m,since:h});f.status(200).json({since:h.toISOString(),usage:b})})),e.post("/v1/keys",l,this.handleCreate(X.z.object({label:X.z.string().max(120).optional(),expiresInDays:X.z.number().int().positive().max(365).optional()}),async(d,f,m)=>{let h=this.requireTeamId(d,f);if(!h)return;let b=`cm_${(0,Wc.randomBytes)(24).toString("hex")}`,v=(0,Wc.createHash)("sha256").update(b).digest("hex"),E=m.expiresInDays?new Date(Date.now()+m.expiresInDays*864e5):null,_=await new Nt(this.options.pool).createApiKey({keyHash:v,teamId:h,projectId:d.authContext?.projectId??null,actorId:d.authContext?.apiKeyId??"api",scopes:["memories:read"],expiresAt:E});m.label;let I=LJ(d);f.status(201).json({id:_.id,apiKey:b,scopes:["memories:read"],expiresAt:E?.toISOString()??null,mcpUrl:I,connectCommand:NJ(I,b)})})),e.get("/v1/connect",u,this.asyncHandler(async(d,f)=>{if(!this.requireTeamId(d,f))return;let h=LJ(d);f.status(200).json({mcpUrl:h,connectCommand:NJ(h,"<YOUR_API_KEY>"),hint:"POST /v1/keys (write scope) to mint a read-only key for this link."})})),e.post("/v1/events",l,this.asyncHandler(async(d,f)=>{let m=qJ.safeParse(d.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let h=m.data.generate!=="false",b=m.data.wait==="true",v=o_.safeParse(d.body);if(!v.success){f.status(400).json({error:"ValidationError",issues:v.error.issues});return}let E=v.data,_=this.requireTeamId(d,f);if(!_||!this.ensureProjectAllowed(d,f,E.projectId))return;let I=this.toAgentEventInput(E,_);await this.applyContentSessionLinks([I],[d.body],_);let x,O=null,j="skipped",Y={generate:h,source:"http_post_v1_events",apiKeyId:d.authContext?.apiKeyId??null,actorId:await this.resolveActorId(d),sourceAdapter:I.sourceAdapter,requestId:d.requestId??null};try{let N=await this.ingestEvents.ingestOne(I,Y);x=N.event,O=N.outbox,j=N.enqueueState}catch(N){let $=N instanceof Error?N:new Error(String(N));S.warn("SYSTEM","event.write ingest failed",{requestId:d.requestId??null},$),this.handleDbError($,f,"event.write");return}if(await this.auditWrite(d,"event.received",x.id,x.projectId,{sourceAdapter:x.sourceAdapter,sourceEventId:x.sourceEventId,eventType:x.eventType,serverSessionId:x.serverSessionId,generationJobId:O?.id??null}),b){let N=O,$=!1;if(O){let re=new it(this.options.pool),ze=await FJ(re,O);N=ze.job,$=ze.timedOut}f.status(201).json({event:jd(x),generationJob:N?GJ(N,j):null,...$?{waitTimedOut:!0}:{}});return}f.status(201).json({event:jd(x),...O?{generationJob:P1(O,j)}:{}})})),e.post("/v1/events/batch",l,this.asyncHandler(async(d,f)=>{let m=qJ.safeParse(d.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let h=m.data.generate!=="false",b=m.data.wait==="true",E=X.z.array(o_).min(1).max(500).safeParse(d.body);if(!E.success){f.status(400).json({error:"ValidationError",issues:E.error.issues});return}let _=this.requireTeamId(d,f);if(!_)return;let I=iSe(d,E.data);if(I){f.status(I.status).json(I.body);return}let x=E.data.map(N=>this.toAgentEventInput(N,_));await this.applyContentSessionLinks(x,Array.isArray(d.body)?d.body:E.data,_);let O=[],j=[],Y={generate:h,source:"http_post_v1_events_batch",apiKeyId:d.authContext?.apiKeyId??null,actorId:await this.resolveActorId(d),sourceAdapter:null,requestId:d.requestId??null};try{let N=await this.ingestEvents.ingestBatch(x,Y);O=N.map(({event:$,outbox:re})=>({event:$,outbox:re})),j=N.map(({enqueueState:$})=>$)}catch(N){let $=N instanceof Error?N:new Error(String(N));S.warn("SYSTEM","event.batch_write ingest failed",{requestId:d.requestId??null},$),this.handleDbError($,f,"event.batch_write");return}if(await this.auditWrite(d,"event.batch_received",null,null,{eventCount:O.length,generationJobIds:O.map(({outbox:N})=>N?.id??null).filter(Boolean)}),b){let N=new it(this.options.pool),$=Date.now()+BJ,re=[];for(let A of O){if(!A.outbox){re.push({event:A.event,outbox:null,timedOut:!1});continue}let D=Math.max(0,$-Date.now()),M=await FJ(N,A.outbox,D);re.push({event:A.event,outbox:M.job,timedOut:M.timedOut})}let ze=re.some(A=>A.timedOut);f.status(201).json({events:re.map(({event:A,outbox:D,timedOut:M},C)=>({event:jd(A),generationJob:D?GJ(D,j[C]):null,...M?{waitTimedOut:!0}:{}})),...ze?{waitTimedOut:!0}:{}});return}f.status(201).json({events:O.map(({event:N,outbox:$},re)=>({event:jd(N),...$?{generationJob:P1($,j[re])}:{}}))})})),e.get("/v1/events/:id",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=this.routeParam(d.params.id),b=new tn(this.options.pool),v=await this.loadScopedById(d,f,{id:h,teamId:m,table:"agent_events",notFound:"Event not found",load:E=>b.getByIdForScope({id:h,projectId:E,teamId:m})});v&&f.json({event:jd(v)})})),e.get("/v1/events/:id/observations",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=this.routeParam(d.params.id),v=(await this.options.pool.query("SELECT id, project_id FROM agent_events WHERE id = $1 AND team_id = $2",[h,m])).rows[0];if(!v){f.status(404).json({error:"NotFound",message:"Event not found"});return}if(!this.ensureProjectAllowed(d,f,v.project_id))return;let E=await this.options.pool.query(`
431
+ `,[e.serverSessionId,e.projectId,e.teamId,r])).rows.map(zEe)}}});function AJ(t){let e=WEe.safeParse(t);if(!e.success)throw new Md(e.error.issues);return e.data}var tr,Hc,IJ,TJ,HEe,VEe,WEe,Md,cy=k(()=>{"use strict";tr=require("zod"),Hc={event:"server_beta_generate_event",summary:"server_beta_generate_summary"},IJ={event:"evt",summary:"sum"},TJ=tr.z.object({team_id:tr.z.string().min(1,"team_id is required"),project_id:tr.z.string().min(1,"project_id is required"),source_type:tr.z.enum(["agent_event","session_summary","observation_reindex"]),source_id:tr.z.string().min(1,"source_id is required"),generation_job_id:tr.z.string().min(1,"generation_job_id is required"),api_key_id:tr.z.string().min(1).nullable(),actor_id:tr.z.string().min(1).nullable(),source_adapter:tr.z.string().min(1,"source_adapter is required"),request_id:tr.z.string().min(1).nullable().optional()}),HEe=TJ.extend({kind:tr.z.literal("event"),agent_event_id:tr.z.string().min(1)}),VEe=TJ.extend({kind:tr.z.literal("summary"),server_session_id:tr.z.string().min(1)}),WEe=tr.z.discriminatedUnion("kind",[HEe,VEe]),Md=class extends Error{issues;constructor(e){super(`invalid server generation job payload: ${e.map(r=>r.message).join("; ")}`),this.issues=e}}});function Vc(t){let e=IJ[t.kind],r=JSON.stringify({kind:t.kind,team_id:t.team_id,project_id:t.project_id,source_type:t.source_type,source_id:t.source_id}),n=(0,kJ.createHash)("sha256").update(r).digest("hex");return`${e}_${n}`}var kJ,k1=k(()=>{"use strict";kJ=require("crypto");cy()});function RJ(t){return{kind:"event",team_id:t.event.teamId,project_id:t.event.projectId,source_type:"agent_event",source_id:t.event.id,generation_job_id:t.outboxId,agent_event_id:t.event.id,api_key_id:t.apiKeyId,actor_id:t.actorId,source_adapter:t.sourceAdapter??t.event.sourceAdapter??"api",request_id:t.requestId}}var OJ,ly,CJ=k(()=>{"use strict";cc();Mi();No();se();k1();Rn();OJ="observation_generate_for_event",ly=class{constructor(e){this.options=e}options;async ingestOne(e,r={}){let n=r.generate??!0,i=r.source??"http_post_v1_events",s=await Cn(this.options.pool,async a=>{let l=await new tn(a).create(e);if(!n)return{event:l,outbox:null};let u=new it(a),p=new Ot(a),d=et(),f=RJ({outboxId:d,event:l,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),m=await u.create({id:d,projectId:l.projectId,teamId:l.teamId,sourceType:"agent_event",sourceId:l.id,agentEventId:l.id,serverSessionId:l.serverSessionId,jobType:OJ,bullmqJobId:Vc({kind:"event",team_id:l.teamId,project_id:l.projectId,source_type:"agent_event",source_id:l.id}),payload:f});return await p.append({generationJobId:m.id,projectId:m.projectId,teamId:m.teamId,eventType:"queued",statusAfter:m.status,attempt:m.attempts,details:{source:i}}),{event:l,outbox:m}}),o="skipped";return s.outbox&&(o=await this.publishEventJob(s.event,s.outbox)),{event:s.event,outbox:s.outbox,enqueueState:o}}async ingestBatch(e,r={}){let n=r.generate??!0,i=r.source??"http_post_v1_events_batch",s=await Cn(this.options.pool,async o=>{let a=new tn(o),c=new it(o),l=new Ot(o),u=[];for(let p of e){let d=await a.create(p);if(!n){u.push({event:d,outbox:null});continue}let f=et(),m=RJ({outboxId:f,event:d,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),h=await c.create({id:f,projectId:d.projectId,teamId:d.teamId,sourceType:"agent_event",sourceId:d.id,agentEventId:d.id,serverSessionId:d.serverSessionId,jobType:OJ,bullmqJobId:Vc({kind:"event",team_id:d.teamId,project_id:d.projectId,source_type:"agent_event",source_id:d.id}),payload:m});await l.append({generationJobId:h.id,projectId:h.projectId,teamId:h.teamId,eventType:"queued",statusAfter:h.status,attempt:h.attempts,details:{source:i}}),u.push({event:d,outbox:h})}return u});return Promise.all(s.map(async({event:o,outbox:a})=>{let c=a?await this.publishEventJob(o,a):"skipped";return{event:o,outbox:a,enqueueState:c}}))}async publishEventJob(e,r){let n=this.options.resolveEventQueue();if(!n)return"queued_only";let i=r.bullmqJobId??Vc({kind:"event",team_id:e.teamId,project_id:e.projectId,source_type:"agent_event",source_id:e.id});try{return await n.add(i,r.payload),"enqueued"}catch(s){return S.warn("SYSTEM","failed to publish event generation job to BullMQ",{outboxId:r.id,error:s instanceof Error?s.message:String(s)}),"queued_only"}}}});function R1(t){return Vc({kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId})}function O1(t){return{kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId,generation_job_id:t.generationJobId,server_session_id:t.serverSessionId,api_key_id:t.apiKeyId??null,actor_id:t.actorId??null,source_adapter:t.sourceAdapter??"api",request_id:t.requestId??null}}var PJ=k(()=>{"use strict";k1()});var YEe,uy,MJ=k(()=>{"use strict";Mi();No();Ds();se();PJ();Rn();YEe="observation_generate_session_summary",uy=class{constructor(e){this.options=e}options;async end(e){let r=e.source??"http_post_v1_sessions_end",n=await Cn(this.options.pool,async s=>{let a=await new Bt(s).endSession({id:e.sessionId,projectId:e.projectId,teamId:e.teamId});if(!a)return{session:null,outbox:null};let c=new it(s),l=new Ot(s),u=et(),p=O1({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId,generationJobId:u,apiKeyId:e.apiKeyId??null,actorId:e.actorId??null,sourceAdapter:e.sourceAdapter??null}),d=await c.create({id:u,projectId:a.projectId,teamId:a.teamId,sourceType:"session_summary",sourceId:a.id,serverSessionId:a.id,jobType:YEe,bullmqJobId:R1({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId}),payload:p});return await l.append({generationJobId:d.id,projectId:d.projectId,teamId:d.teamId,eventType:"queued",statusAfter:d.status,attempt:d.attempts,details:{source:r}}),{session:a,outbox:d}});if(!n.session||!n.outbox)return{session:n.session,outbox:null,enqueueState:"skipped"};let i=await this.publishSummaryJob(n.session.id,n.outbox,e);return{session:n.session,outbox:n.outbox,enqueueState:i}}async publishSummaryJob(e,r,n){let i=this.options.resolveSummaryQueue();if(!i)return"queued_only";let s=r.bullmqJobId??R1({serverSessionId:e,teamId:r.teamId,projectId:r.projectId}),o=O1({serverSessionId:e,teamId:r.teamId,projectId:r.projectId,generationJobId:r.id,apiKeyId:n.apiKeyId??null,actorId:n.actorId??null,sourceAdapter:n.sourceAdapter??null});try{return await i.add(s,o),"enqueued"}catch(a){return S.warn("SYSTEM","failed to publish summary generation job to BullMQ",{outboxId:r.id,error:a instanceof Error?a.message:String(a)}),"queued_only"}}}});var DJ=k(()=>{"use strict"});function LJ(t){return`${(process.env.CLAUDE_MEM_PUBLIC_URL??`${t.protocol}://${t.get("host")??"localhost"}`).replace(/\/+$/,"")}/v1/mcp`}function NJ(t,e){return`claude mcp add --transport http claude-mem ${t} --header "Authorization: Bearer ${e}"`}async function FJ(t,e,r=BJ,n=eSe){if(UJ.includes(e.status))return{job:e,timedOut:!1};let i=Date.now()+r,s=e;for(;Date.now()<i;){await new Promise(a=>setTimeout(a,n));let o=await t.getByIdForScope({id:e.id,projectId:e.projectId,teamId:e.teamId});if(!o)return{job:s,timedOut:!1};if(s=o,UJ.includes(o.status))return{job:o,timedOut:!1}}return{job:s,timedOut:!0}}function rSe(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&zJ.has(e)?e:null,n=typeof t.query.source_type=="string"?t.query.source_type.trim():"",i=n&&tSe.has(n)?n:null,s=py(t.query.limit,HJ,1,VJ),o=py(t.query.offset,0,0,Number.MAX_SAFE_INTEGER),a=typeof t.query.since=="string"?t.query.since.trim():"",c=null;if(a){let l=new Date(a);Number.isNaN(l.getTime())||(c=l)}return{status:r,sourceType:i,limit:s,offset:o,since:c}}function $J(t){if(!t||typeof t!="object")return 0;let e=t.retried_count;return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.floor(e):0}function JJ(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&zJ.has(e)?e:null,n=py(t.query.limit,HJ,1,VJ),i=py(t.query.offset,0,0,Number.MAX_SAFE_INTEGER);return{status:r,limit:n,offset:i}}function py(t,e,r,n){if(typeof t!="string")return e;let i=Number.parseInt(t,10);return Number.isFinite(i)?Math.max(r,Math.min(n,i)):e}function C1(t,e={}){let r={id:t.id,projectId:t.project_id,teamId:t.team_id,sourceType:t.source_type,sourceId:t.source_id,status:t.status,attempts:t.attempts,maxAttempts:t.max_attempts,createdAtEpoch:new Date(t.created_at).getTime(),completedAtEpoch:t.completed_at?new Date(t.completed_at).getTime():null,failedAtEpoch:t.failed_at?new Date(t.failed_at).getTime():null,lastError:t.last_error&&typeof t.last_error=="object"?t.last_error:null};return e.includePayload&&t.payload&&typeof t.payload=="object"&&(r.payload=t.payload),r}function nSe(t){let e={"event.received":"agent_event","event.batch_received":"agent_event","event.write":"agent_event","event.batch_write":"agent_event","session.write":"server_session","session.end":"server_session","memory.write":"observation","observation.read":"observation","observation.search":"observation","observation.context":"observation","observation.generated":"observation","session_summary.generated":"observation","generation_job.queued":"observation_generation_job","generation_job.enqueued":"observation_generation_job","generation_job.processing":"observation_generation_job","generation_job.completed":"observation_generation_job","generation_job.failed":"observation_generation_job","generation_job.scope_violation":"observation_generation_job","generation_job.revoked_key":"observation_generation_job","generation_job.retried_by_operator":"observation_generation_job","generation_job.cancelled_by_operator":"observation_generation_job","generation_job.stalled":"observation_generation_job"};return e[t]?e[t]:t.split(".")[0]??"unknown"}function iSe(t,e){let r=t.authContext?.projectId??null;if(!(t.authContext?.teamId??null))return{status:403,body:{error:"Forbidden",message:"API key is not bound to a team"}};if(!r)return null;for(let i of e)if(i.projectId!==r)return{status:403,body:{error:"Forbidden",message:"API key is scoped to a different project"}};return null}function Dd(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,externalSessionId:t.externalSessionId,contentSessionId:t.contentSessionId,agentId:t.agentId,agentType:t.agentType,platformSource:t.platformSource,generationStatus:t.generationStatus,metadata:t.metadata,startedAtEpoch:t.startedAtEpoch,endedAtEpoch:t.endedAtEpoch,lastGeneratedAtEpoch:t.lastGeneratedAtEpoch,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function jd(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,sourceAdapter:t.sourceAdapter,sourceEventId:t.sourceEventId,eventType:t.eventType,platformSource:t.platformSource,payload:t.payload,metadata:t.metadata,occurredAtEpoch:t.occurredAtEpoch,receivedAtEpoch:t.receivedAtEpoch,createdAtEpoch:t.createdAtEpoch}}function ea(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},kind:t.kind,content:t.content,metadata:t.metadata,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function sSe(t){return{id:t.id,projectId:t.project_id,teamId:t.team_id,serverSessionId:t.server_session_id,kind:t.kind,content:t.content,metadata:t.metadata&&typeof t.metadata=="object"?t.metadata:{},generationKey:t.generation_key,createdByJobId:t.created_by_job_id,createdAtEpoch:new Date(t.created_at).getTime(),updatedAtEpoch:new Date(t.updated_at).getTime(),source:{id:t.source_id_pk,sourceType:t.source_type,sourceId:t.source_id,generationJobId:t.generation_job_id,createdAtEpoch:new Date(t.source_created_at).getTime()}}}function P1(t,e){return{id:t.id,status:t.status,bullmqJobId:t.bullmqJobId,sourceType:t.sourceType,sourceId:t.sourceId,transport:e,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function GJ(t,e){return{id:t.id,status:t.status,transport:e,bullmqJobId:t.bullmqJobId,sourceType:t.sourceType,sourceId:t.sourceId,attempts:t.attempts,maxAttempts:t.maxAttempts,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function M1(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,sourceType:t.sourceType,sourceId:t.sourceId,agentEventId:t.agentEventId,serverSessionId:t.serverSessionId,jobType:t.jobType,status:t.status,bullmqJobId:t.bullmqJobId,attempts:t.attempts,maxAttempts:t.maxAttempts,nextAttemptAtEpoch:t.nextAttemptAtEpoch,completedAtEpoch:t.completedAtEpoch,failedAtEpoch:t.failedAtEpoch,cancelledAtEpoch:t.cancelledAtEpoch,lastError:t.lastError,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}var X,Wc,XEe,ZEe,qJ,BJ,eSe,UJ,dy,tSe,zJ,HJ,VJ,WJ=k(()=>{"use strict";X=require("zod");zN();cc();Mi();Di();Ru();uc();se();bm();hx();eU();t4();vJ();SJ();xJ();Zo();Wc=require("node:crypto");Ds();CJ();MJ();Co();DJ();XEe="api",ZEe="14.0.1";qJ=X.z.object({generate:X.z.union([X.z.literal("true"),X.z.literal("false")]).optional(),wait:X.z.union([X.z.literal("true"),X.z.literal("false")]).optional()}),BJ=3e4,eSe=100,UJ=["completed","failed","cancelled"];dy=class{constructor(e){this.options=e;this.ingestEvents=new ly({pool:e.pool,resolveEventQueue:()=>this.resolveQueue("event")}),this.endSession=new uy({pool:e.pool,resolveSummaryQueue:()=>this.resolveQueue("summary")})}options;ingestEvents;endSession;getIngestEventsService(){return this.ingestEvents}getEndSessionService(){return this.endSession}setupRoutes(e){e.use("/v1",Z2());let r=Mo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:write"]}),n=Mo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:read"]}),i=[],s=Number(process.env.CLAUDE_MEM_RATE_LIMIT_PER_MIN??"0");s>0&&i.push(EJ(this.options.pool,{windowSec:60,max:s}));let o=Number(process.env.CLAUDE_MEM_MONTHLY_REQUEST_CAP??"0");o>0&&i.push(A1(this.options.pool,{kind:"request",cap:o})),process.env.CLAUDE_MEM_USAGE_METERING==="1"&&i.push(_J(this.options.pool));let a=[...i],c=Number(process.env.CLAUDE_MEM_MONTHLY_TOKEN_CAP??"0");c>0&&a.push(A1(this.options.pool,{kind:"tokens",cap:c}));let l=[r,...a],u=[n,...i];e.get("/v1/usage",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=new Date(Date.UTC(new Date().getUTCFullYear(),new Date().getUTCMonth(),1)),b=await new Lr(this.options.pool).summarize({teamId:m,since:h});f.status(200).json({since:h.toISOString(),usage:b})})),e.post("/v1/keys",l,this.handleCreate(X.z.object({label:X.z.string().max(120).optional(),expiresInDays:X.z.number().int().positive().max(365).optional()}),async(d,f,m)=>{let h=this.requireTeamId(d,f);if(!h)return;let b=`cm_${(0,Wc.randomBytes)(24).toString("hex")}`,v=(0,Wc.createHash)("sha256").update(b).digest("hex"),E=m.expiresInDays?new Date(Date.now()+m.expiresInDays*864e5):null,_=await new Nt(this.options.pool).createApiKey({keyHash:v,teamId:h,projectId:d.authContext?.projectId??null,actorId:d.authContext?.apiKeyId??"api",scopes:["memories:read"],expiresAt:E});m.label;let I=LJ(d);f.status(201).json({id:_.id,apiKey:b,scopes:["memories:read"],expiresAt:E?.toISOString()??null,mcpUrl:I,connectCommand:NJ(I,b)})})),e.get("/v1/connect",u,this.asyncHandler(async(d,f)=>{if(!this.requireTeamId(d,f))return;let h=LJ(d);f.status(200).json({mcpUrl:h,connectCommand:NJ(h,"<YOUR_API_KEY>"),hint:"POST /v1/keys (write scope) to mint a read-only key for this link."})})),e.post("/v1/events",l,this.asyncHandler(async(d,f)=>{let m=qJ.safeParse(d.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let h=m.data.generate!=="false",b=m.data.wait==="true",v=o_.safeParse(d.body);if(!v.success){f.status(400).json({error:"ValidationError",issues:v.error.issues});return}let E=v.data,_=this.requireTeamId(d,f);if(!_||!this.ensureProjectAllowed(d,f,E.projectId))return;let I=this.toAgentEventInput(E,_);await this.applyContentSessionLinks([I],[d.body],_);let x,O=null,j="skipped",Y={generate:h,source:"http_post_v1_events",apiKeyId:d.authContext?.apiKeyId??null,actorId:await this.resolveActorId(d),sourceAdapter:I.sourceAdapter,requestId:d.requestId??null};try{let N=await this.ingestEvents.ingestOne(I,Y);x=N.event,O=N.outbox,j=N.enqueueState}catch(N){let $=N instanceof Error?N:new Error(String(N));S.warn("SYSTEM","event.write ingest failed",{requestId:d.requestId??null},$),this.handleDbError($,f,"event.write");return}if(await this.auditWrite(d,"event.received",x.id,x.projectId,{sourceAdapter:x.sourceAdapter,sourceEventId:x.sourceEventId,eventType:x.eventType,serverSessionId:x.serverSessionId,generationJobId:O?.id??null}),b){let N=O,$=!1;if(O){let re=new it(this.options.pool),ze=await FJ(re,O);N=ze.job,$=ze.timedOut}f.status(201).json({event:jd(x),generationJob:N?GJ(N,j):null,...$?{waitTimedOut:!0}:{}});return}f.status(201).json({event:jd(x),...O?{generationJob:P1(O,j)}:{}})})),e.post("/v1/events/batch",l,this.asyncHandler(async(d,f)=>{let m=qJ.safeParse(d.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let h=m.data.generate!=="false",b=m.data.wait==="true",E=X.z.array(o_).min(1).max(500).safeParse(d.body);if(!E.success){f.status(400).json({error:"ValidationError",issues:E.error.issues});return}let _=this.requireTeamId(d,f);if(!_)return;let I=iSe(d,E.data);if(I){f.status(I.status).json(I.body);return}let x=E.data.map(N=>this.toAgentEventInput(N,_));await this.applyContentSessionLinks(x,Array.isArray(d.body)?d.body:E.data,_);let O=[],j=[],Y={generate:h,source:"http_post_v1_events_batch",apiKeyId:d.authContext?.apiKeyId??null,actorId:await this.resolveActorId(d),sourceAdapter:null,requestId:d.requestId??null};try{let N=await this.ingestEvents.ingestBatch(x,Y);O=N.map(({event:$,outbox:re})=>({event:$,outbox:re})),j=N.map(({enqueueState:$})=>$)}catch(N){let $=N instanceof Error?N:new Error(String(N));S.warn("SYSTEM","event.batch_write ingest failed",{requestId:d.requestId??null},$),this.handleDbError($,f,"event.batch_write");return}if(await this.auditWrite(d,"event.batch_received",null,null,{eventCount:O.length,generationJobIds:O.map(({outbox:N})=>N?.id??null).filter(Boolean)}),b){let N=new it(this.options.pool),$=Date.now()+BJ,re=[];for(let A of O){if(!A.outbox){re.push({event:A.event,outbox:null,timedOut:!1});continue}let D=Math.max(0,$-Date.now()),M=await FJ(N,A.outbox,D);re.push({event:A.event,outbox:M.job,timedOut:M.timedOut})}let ze=re.some(A=>A.timedOut);f.status(201).json({events:re.map(({event:A,outbox:D,timedOut:M},C)=>({event:jd(A),generationJob:D?GJ(D,j[C]):null,...M?{waitTimedOut:!0}:{}})),...ze?{waitTimedOut:!0}:{}});return}f.status(201).json({events:O.map(({event:N,outbox:$},re)=>({event:jd(N),...$?{generationJob:P1($,j[re])}:{}}))})})),e.get("/v1/events/:id",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=this.routeParam(d.params.id),b=new tn(this.options.pool),v=await this.loadScopedById(d,f,{id:h,teamId:m,table:"agent_events",notFound:"Event not found",load:E=>b.getByIdForScope({id:h,projectId:E,teamId:m})});v&&f.json({event:jd(v)})})),e.get("/v1/events/:id/observations",u,this.asyncHandler(async(d,f)=>{let m=this.requireTeamId(d,f);if(!m)return;let h=this.routeParam(d.params.id),v=(await this.options.pool.query("SELECT id, project_id FROM agent_events WHERE id = $1 AND team_id = $2",[h,m])).rows[0];if(!v){f.status(404).json({error:"NotFound",message:"Event not found"});return}if(!this.ensureProjectAllowed(d,f,v.project_id))return;let E=await this.options.pool.query(`
432
432
  SELECT o.id, o.project_id, o.team_id, o.server_session_id, o.kind, o.content,
433
433
  o.metadata, o.generation_key, o.created_by_job_id, o.created_at, o.updated_at,
434
434
  os.id AS source_id_pk, os.source_type, os.source_id, os.generation_job_id, os.created_at AS source_created_at
@@ -17,7 +17,7 @@ ${m.stack??""}
17
17
  `)){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 gm(){let r;try{r=(await qi("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 f.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 Cn(r){let e=await dm(),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 hm=5e3,_m=1e3,Em=j.supervisorRegistry(),Sm=null;function J(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:(f.debug("SYSTEM","PID check failed",{pid:r,code:t}),!1)}return f.warn("SYSTEM","PID check threw non-Error",{pid:r,error:String(e)}),!1}}async function Pn(r,e){let t=Date.now()+e;for(;Date.now()<t;){if(r.every(n=>!J(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function Xc(r){if(!r||!J(r.pid))return!1;if(!r.startToken)return!0;let e=Ne(r.pid);if(e===null)return!0;let t=e===r.startToken;return t||f.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:r.pid,stored:r.startToken,current:e}),t}var ym={platform:process.platform,readCommandLine:r=>(0,pt.readFileSync)(`/proc/${r}/cmdline`,"utf-8")};function kn(r,e=ym){if(!Xc(r))return!1;if(r.startToken||e.platform!=="linux")return!0;let t;try{t=e.readCommandLine(r.pid)}catch(s){return f.debug("SYSTEM","Could not read the command line of a token-less worker PID; trusting the live PID",{pid:r.pid,error:s instanceof Error?s.message:String(s)}),!0}let n=t.split("\0").some(s=>Jc.default.basename(s)==="worker-service.cjs");return n||f.debug("SYSTEM","Token-less worker PID now belongs to another program (PID reused)",{pid:r.pid}),n}function Qe(r=j.workerPid()){if(!(0,pt.existsSync)(r))return null;let e;try{e=JSON.parse((0,pt.readFileSync)(r,"utf-8"))}catch{return null}return e!==null&&kn(e)?e:null}var Xi=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;persistDegraded=!1;constructor(e=Em){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,!(0,pt.existsSync)(this.registryPath)){this.persist();return}try{let n=JSON.parse((0,pt.readFileSync)(this.registryPath,"utf-8")).processes??{};for(let[s,i]of Object.entries(n))this.entries.set(s,i)}catch(t){t instanceof Error?f.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},t):f.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(t)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&f.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}retainSupersededEntry(e,t){let n=this.entries.get(e);if(!n||n.pid===t||!J(n.pid))return;let s=`${e}#superseded:${n.pid}`;this.entries.set(s,n);let i=this.runtimeProcesses.get(e);i&&(this.runtimeProcesses.set(s,i),this.runtimeProcesses.delete(e)),f.warn("SYSTEM","Registry id reused while the previous process was still alive; kept it for reaping",{id:e,supersededId:s,supersededPid:n.pid,incomingPid:t})}register(e,t,n){this.initialize(),this.retainSupersededEntry(e,t.pid),this.entries.set(e,t),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e,t){this.initialize();let n=e,s=this.entries.get(n);t!==void 0&&s?.pid!==t&&(n=`${e}#superseded:${t}`,s=this.entries.get(n),s?.pid!==t)||s&&(this.entries.delete(n),this.runtimeProcesses.delete(n),this.persist(),s?.type==="sdk"&&Ji())}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)J(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)Ji();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;f.info("SYSTEM",`Reaping ${t.length} process(es) for session ${e}`,{sessionId:n,pids:t.map(a=>a.pid)});let s=t.filter(a=>J(a.pid)),i=new Map(s.map(a=>[a.pid,Ne(a.pid)]));for(let a of s)try{process.platform==="win32"?await he(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"&&f.debug("SYSTEM",`Failed to SIGTERM session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},c):f.warn("SYSTEM",`Failed to SIGTERM session process PID ${a.pid} (non-Error)`,{pid:a.pid,pgid:a.pgid,error:String(c)})}await Pn(s,hm);let o=s.filter(a=>J(a.pid));for(let a of o){f.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(!Re(a.pid,c)){f.warn("SYSTEM","Skipping SIGKILL: session process PID was reused during the grace window",{pid:a.pid,sessionId:n});continue}try{process.platform==="win32"?await he(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"&&f.debug("SYSTEM",`Failed to SIGKILL session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},l):f.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()+_m;for(;Date.now()<a&&o.filter(l=>J(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"&&Ji();return f.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())};try{K(this.registryPath,e),this.persistDegraded=!1}catch(t){this.reportPersistFailure(t)}}reportPersistFailure(e){if(this.persistDegraded)return;this.persistDegraded=!0;let t=e instanceof Error?e:new Error(String(e));f.warn("SYSTEM","Failed to persist supervisor registry; keeping it in memory",{path:this.registryPath},t);try{Sm?.({errorCategory:t.code??"unknown"})}catch{}}},Yi=null;function xn(){return Yi||(Yi=new Xi),Yi}var rA=180*1e3,bm=[];function Ji(){let r=bm.shift();r&&r.notify()}var Nt=require("fs");M();W();var wm=j.workerPid();async function Zc(r){let e=r.currentPid??process.pid,t=r.pidFilePath??wm,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(!J(c.pid)){r.registry.unregister(c.id);continue}o.set(c.id,Ne(c.pid)),i.set(c.id,await Cn(c.pid));try{await Qc(c,"SIGTERM")}catch(l){l instanceof Error?f.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:c.pid,pgid:c.pgid,type:c.type},l):f.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(l)})}}await Pn(s,5e3);let a=s.filter(c=>J(c.pid)||(i.get(c.id)??[]).some(l=>J(l.pid)));for(let c of a){let l=Re(c.pid,o.get(c.id)??null);l||f.warn("SYSTEM","Skipping tree-kill: root PID was reused during the grace window",{pid:c.pid,type:c.type});try{l&&await Qc(c,"SIGKILL")}catch(u){u instanceof Error?f.debug("SYSTEM","Failed to force kill child process",{pid:c.pid,pgid:c.pgid,type:c.type},u):f.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(u)})}finally{Tm(i.get(c.id)??[],c.pid)}}await Pn(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);el(t,e),r.registry.pruneDeadEntries()}function el(r,e,t=!1){if(!(0,Nt.existsSync)(r))return;let n=null;try{let o=JSON.parse((0,Nt.readFileSync)(r,"utf-8"));n=typeof o.pid=="number"?o.pid:null}catch(o){f.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||!J(n);if(!s&&!(t&&i)){f.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,Nt.rmSync)(r,{force:!0})}catch(o){o instanceof Error?f.debug("SYSTEM","Failed to remove PID file",{pidFilePath:r},o):f.warn("SYSTEM","Failed to remove PID file (non-Error)",{pidFilePath:r,error:String(o)})}}function Tm(r,e){for(let{pid:t,startToken:n}of r)if(!(t===e||!J(t))){if(!Re(t,n)){f.debug("SYSTEM","Skipping reap: PID was recycled during the grace window",{pid:t,rootPid:e});continue}try{process.kill(t,"SIGKILL"),f.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"&&f.warn("SYSTEM","Failed to reap orphaned descendant during shutdown cascade",{pid:t,rootPid:e,errno:i})}}}async function Qc(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 he(t,{signalMode:"immediate"});return}try{process.kill(t,e)}catch(s){if((s instanceof Error?s.code:void 0)!=="ESRCH")throw s}return}await he(t)}M();var tl=3e4,Ft=null;function Am(){let e=xn().pruneDeadEntries();e>0&&f.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function rl(){Ft===null&&(Ft=setInterval(Am,tl),Ft.unref(),f.debug("SYSTEM","Health checker started",{intervalMs:tl}))}function nl(){Ft!==null&&(clearInterval(Ft),Ft=null,f.debug("SYSTEM","Health checker stopped"))}var sl=require("child_process"),il=require("util");M();var Rm=(0,il.promisify)(sl.execFile),vm=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/;function Mm(r){let e=[];for(let t of r.split(`
18
18
  `)){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 Om(){let r=await Rm("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Mm(r.stdout)}function Cm(r,e){let t=r.filter(o=>vm.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 ol(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??Om,s=r.isAlive??J,i=r.killTree??(p=>he(p,{signalMode:"graceful"})),o=r.selfPid??process.pid,a;try{a=await n()}catch(p){return f.warn("PROCESS","Orphaned chroma-mcp sweep skipped: cannot read the process table",{error:p instanceof Error?p.message:String(p)}),t.skipped="unreadable",t}let{matched:c,roots:l,orphans:u}=Cm(a,{isAlive:s,selfPid:o});if(t.matched=c.length,t.trees=l.length,t.orphans=u.length,u.length===0)return f.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:t.matched,trees:t.trees}),t;f.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(p=>p.pid)});let d=new Set,g=8;for(let p=0;p<u.length;p+=g){let m=u.slice(p,p+g);(await Promise.allSettled(m.map(_=>i(_.pid)))).forEach((_,E)=>{let y=m[E];_.status==="fulfilled"?(t.killed+=1,d.add(y.pid)):(t.failed+=1,f.warn("PROCESS","Failed to reap an orphaned chroma-mcp tree",{pid:y.pid,ppid:y.ppid,error:_.reason instanceof Error?_.reason.message:String(_.reason)}))})}if(r.registry)for(let p of r.registry.getAll())p.type==="chroma"&&d.has(p.pid)&&(r.registry.unregister(p.id),t.unregistered+=1);return f.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:t.orphans,killed:t.killed,failed:t.failed,unregistered:t.unregistered}),t}W();var Im=j.workerPid(),Qi=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(),al({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,ol({registry:this.registry}).catch(t=>{f.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:t instanceof Error?t.message:String(t)})}),rl()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let t=async n=>{if(this.shutdownInitiated){f.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,f.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(s){s instanceof Error?f.error("SYSTEM","Error during shutdown",{},s):f.error("SYSTEM","Error during shutdown (non-Error)",{error:String(s)});try{await this.stop()}catch(i){i instanceof Error?f.debug("SYSTEM","Supervisor shutdown fallback failed",{},i):f.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",()=>{f.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{t("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}nl(),this.stopPromise=Zc({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,t){this.registry.unregister(e,t)}getRegistry(){return this.registry}},wA=new Qi(xn());function al(r={}){let e=r.pidFilePath??Im;if(!(0,gt.existsSync)(e))return"missing";let t=null;try{t=JSON.parse((0,gt.readFileSync)(e,"utf-8"))}catch(s){return s instanceof Error?f.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},s):f.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(s)}),(0,gt.rmSync)(e,{force:!0}),"invalid"}return kn(t)&&t?((r.logAlive??!0)&&f.info("SYSTEM","Worker already running (PID alive)",{existingPid:t.pid,existingPort:t.port,startedAt:t.startedAt}),"alive"):(r.removeStale===!1||(f.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,gt.rmSync)(e,{force:!0})),"stale")}_n();var Zi=require("path"),Ln=require("fs"),ll=require("crypto");W();var Dn=require("fs");le();function cl(r,e){if(!(0,Dn.existsSync)(r))return e;try{return cr((0,Dn.readFileSync)(r,"utf-8"))}catch(t){throw new Error(`Corrupt JSON file, refusing to overwrite: ${r}: ${t instanceof Error?t.message:String(t)}`)}}M();var ul="telemetry.json";function Pm(r){let e=r.DO_NOT_TRACK;return e===void 0||e===""?!1:e!=="0"&&e!=="false"}function km(r,e){if(Pm(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 Nn(r,e){return km(r,e).enabled}function dl(r){let e=r.CLAUDE_MEM_TELEMETRY_ERRORS?.toLowerCase();return!(e==="0"||e==="false"||e==="off")}function xm(){return(0,Zi.join)(re(),ul)}function hr(){let r;try{r=cl(xm(),null)}catch(e){let t=e instanceof Error?e:new Error(String(e));return f.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 Dm(r){let e=re();(0,Ln.mkdirSync)(e,{recursive:!0}),(0,Ln.writeFileSync)((0,Zi.join)(e,ul),JSON.stringify(r,null,2)+`
19
19
  `)}function Fn(){let r=hr();if(r?.installId)return r.installId;let e=(0,ll.randomUUID)();return Dm({installId:e,decidedAt:""}),e}var gl=me(require("os"),1);M();var fl=500;var pl=8192,_e="[REDACTED]";function ml(r){try{if(typeof r!="string"){if(r==null)return"";try{r=String(r)}catch(t){let n=t instanceof Error?t:new Error(String(t));return f.warn("SYSTEM","error-scrub: String() coercion of non-string input failed",void 0,n),""}}let e=r;return e.length>pl?e.slice(0,pl):e}catch{return""}}function eo(r){if(typeof r!="string"||r.length===0)return r??"";let e="";try{e=gl.default.homedir()||""}catch(n){let s=n instanceof Error?n:new Error(String(n));f.warn("SYSTEM","error-scrub: os.homedir() failed; skipping home-dir redaction",void 0,s),e=""}if(!e)return r;let t=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");try{return r.replace(new RegExp(t,"g"),"~")}catch(n){let s=n instanceof Error?n:new Error(String(n));return f.warn("SYSTEM","error-scrub: home-dir RegExp replace failed; using split/join fallback",void 0,s),r.split(e).join("~")}}function to(r){return typeof r!="string"||r.length===0?r??"":r.replace(/(?<![~\w])\/(?:[^\s/:"'()]+\/)+([^\s/:"'()]+)/g,"$1").replace(/[A-Za-z]:\\(?:[^\s\\:"'()]+\\)*([^\s\\:"'()]+)/g,"$1").replace(/\\\\[^\s\\:"'()]+(?:\\[^\s\\:"'()]+)*\\([^\s\\:"'()]+)/g,"$1")}function Lm(r){return typeof r!="string"||r.length===0?r??"":r.replace(/\b[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s"'()]+/g,e=>/^https?:\/\/hooks\.slack\.com\/services\//i.test(e)?e.replace(/^(https?:\/\/hooks\.slack\.com\/services\/)[^\s"'()]+/i,`$1${_e}`):e.replace(/[?#].*$/,"").replace(/^([A-Za-z][A-Za-z0-9+.-]*:\/\/)[^/@\s]+@/,`$1${_e}@`))}function Nm(r){return typeof r!="string"||r.length===0?r??"":r.replace(/\?[^\s"'()]*/g,"")}function Fm(r){return typeof r!="string"||r.length===0?r??"":r.replace(/\b(?:access[_-]?token|api[_-]?key|auth(?:orization)?|secret|password|passwd|jwt|session[_-]?id|token)=[^\s"'&]+/gi,e=>{let t=e.indexOf("=");return`${e.slice(0,t+1)}${_e}`})}function Um(r){if(typeof r!="string"||r.length===0)return r??"";let e=r;return e=e.replace(/[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{1,255}\.[A-Za-z]{2,24}/g,_e),e=e.replace(/\b[A-Za-z0-9_-]{10,512}\.[A-Za-z0-9_-]{10,512}\.[A-Za-z0-9_-]{10,512}\b/g,_e),e=e.replace(/\b(?:sk|pk|rk|ak|phc|phx|ph|ghp|gho|ghs|xox[bpasr])[-_][A-Za-z0-9_-]{8,512}\b/gi,_e),e=e.replace(/\bBearer\s+[A-Za-z0-9._-]{8,512}\b/gi,_e),e=e.replace(/\b(?:AKIA|ASIA|AGPA|AIDA|AROA|ANPA|ANVA|AIPA)[0-9A-Z]{16}\b/g,_e),e=e.replace(/\b[0-9a-fA-F]{24,4096}\b/g,_e),e=e.replace(/\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b/g,_e),e=e.replace(/\b(?=[A-Za-z0-9+/_-]{0,4096}\d)[A-Za-z0-9+/_-]{32,4096}={0,2}\b/g,_e),e=e.replace(/\b(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}\b/g,_e),e}function $m(r){return typeof r!="string"||r.length===0?r??"":r.replace(/[ \t\f\v]+/g," ").replace(/ *\n */g,`
20
- `).trim()}function ro(r){let e=ml(r);return e.length===0?"":(e=eo(e),e=Lm(e),e=to(e),e=Nm(e),e=Fm(e),e=Um(e),e)}function hl(r){try{let e=$m(ro(ml(r)));return e.length>fl?e.slice(0,fl):e}catch(e){let t=e instanceof Error?e:new Error(String(e));return f.warn("SYSTEM","error-scrub: message scrub failed; emitting empty message",void 0,t),""}}function _l(r){return(typeof r=="string"?r:"").replace(/\[REDACTED\]/g,"\xA7").replace(/'[^']*'/g,"'\xA7'").replace(/"[^"]*"/g,'"\xA7"').replace(/\b\d+\b/g,"\xA7").replace(/[ \t]+/g," ").trim().slice(0,200)}var Bm=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","phase","install_method","interactive","provider_source","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_aborted_deadline_exceeded","outcomes_invalid_output","top_model","top_abort_reason","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","platform","agent_role","instruction_state","instruction_returned_count","instruction_disabled_count","instruction_excluded_count","instruction_missing_count","instruction_unknown_count","captured_prompt_count","captured_session_count","captured_tool_count","unidentified_tool_event_count","native_todo_count",...["captured","mcp"].flatMap(r=>["read","write"].flatMap(e=>[`${r}_${e}_count`,...["ok","error","excluded","disabled","unknown"].map(t=>`${r}_${e}_${t}_count`)]))]),El=200;function Wm(r,e){if(!(!r||typeof r!="object"))for(let t of Object.keys(r)){if(!Bm.has(t))continue;let n=r[t];if(typeof n=="string"){let s=n.length>El?n.slice(0,El):n;e[t]=ro(s)}else(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean")&&(e[t]=n)}}function Un(r){let e={};try{Wm(r,e)}catch{}return e}var no=me(require("os"),1);M();var Hm="14.0.0",jm="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",Km="https://us.i.posthog.com";function $n(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||jm}function Bn(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||Km}var Gm=["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 Wn(r){let e={};for(let t of Gm)r[t]!==void 0&&(e[t]=r[t]);return e}function zm(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||no.default.release().toLowerCase().includes("microsoft")}catch(r){let e=r instanceof Error?r:new Error(String(r));return f.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function Hn(){return{version:Hm,os:process.platform,os_version:no.default.release(),is_wsl:zm(),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 Vm=2e3;async function Sl(r,e,t){try{if(!Nn(process.env,hr()))return;let n=Un({...Hn(),...e??{}});if(t?.person?n.$set=Wn(n):n.$process_person_profile=!1,process.env.CLAUDE_MEM_TELEMETRY_DEBUG==="1"){process.stderr.write("[telemetry] "+JSON.stringify({event:r,properties:n})+`
20
+ `).trim()}function ro(r){let e=ml(r);return e.length===0?"":(e=eo(e),e=Lm(e),e=to(e),e=Nm(e),e=Fm(e),e=Um(e),e)}function hl(r){try{let e=$m(ro(ml(r)));return e.length>fl?e.slice(0,fl):e}catch(e){let t=e instanceof Error?e:new Error(String(e));return f.warn("SYSTEM","error-scrub: message scrub failed; emitting empty message",void 0,t),""}}function _l(r){return(typeof r=="string"?r:"").replace(/\[REDACTED\]/g,"\xA7").replace(/'[^']*'/g,"'\xA7'").replace(/"[^"]*"/g,'"\xA7"').replace(/\b\d+\b/g,"\xA7").replace(/[ \t]+/g," ").trim().slice(0,200)}var Bm=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","phase","install_method","interactive","provider_source","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_aborted_deadline_exceeded","outcomes_invalid_output","top_model","top_abort_reason","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","platform","agent_role","instruction_state","instruction_returned_count","instruction_disabled_count","instruction_excluded_count","instruction_missing_count","instruction_unknown_count","captured_prompt_count","captured_session_count","captured_tool_count","unidentified_tool_event_count","native_todo_count",...["captured","mcp"].flatMap(r=>["read","write"].flatMap(e=>[`${r}_${e}_count`,...["ok","error","excluded","disabled","unknown"].map(t=>`${r}_${e}_${t}_count`)]))]),El=200;function Wm(r,e){if(!(!r||typeof r!="object"))for(let t of Object.keys(r)){if(!Bm.has(t))continue;let n=r[t];if(typeof n=="string"){let s=n.length>El?n.slice(0,El):n;e[t]=ro(s)}else(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean")&&(e[t]=n)}}function Un(r){let e={};try{Wm(r,e)}catch{}return e}var no=me(require("os"),1);M();var Hm="14.0.1",jm="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",Km="https://us.i.posthog.com";function $n(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||jm}function Bn(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||Km}var Gm=["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 Wn(r){let e={};for(let t of Gm)r[t]!==void 0&&(e[t]=r[t]);return e}function zm(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||no.default.release().toLowerCase().includes("microsoft")}catch(r){let e=r instanceof Error?r:new Error(String(r));return f.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function Hn(){return{version:Hm,os:process.platform,os_version:no.default.release(),is_wsl:zm(),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 Vm=2e3;async function Sl(r,e,t){try{if(!Nn(process.env,hr()))return;let n=Un({...Hn(),...e??{}});if(t?.person?n.$set=Wn(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=$n(),i=new AbortController,o=setTimeout(()=>i.abort(),Vm);try{await qm(s,r,n,i.signal)}finally{clearTimeout(o)}}catch{}}async function qm(r,e,t,n){await fetch(`${Bn()}/capture/`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:r,event:e,distinct_id:Fn(),properties:t}),signal:n})}var ue=me(require("path"),1),go=require("os"),fe=require("fs"),qn=require("child_process");M();M();M();var oe=me(require("path"),1),Ut=require("fs"),Vn=require("os"),lo=require("child_process");lr();W();M();var jn=require("fs"),Ze=me(require("path"),1);M();var _r={isWorktree:!1,isSubmodule:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function yl(r){let e=Ze.default.join(r,".git"),t;try{t=(0,jn.statSync)(e)}catch(c){return c instanceof Error&&c.code!=="ENOENT"&&f.warn("GIT","Unexpected error checking .git",{error:c instanceof Error?c.message:String(c)}),_r}if(!t.isFile())return _r;let n;try{n=(0,jn.readFileSync)(e,"utf-8").trim()}catch(c){return f.warn("GIT","Failed to read .git file",{error:c instanceof Error?c.message:String(c)}),_r}let s=n.match(/^gitdir:\s*(.+)$/);if(!s)return _r;let i=Ze.default.resolve(Ze.default.dirname(e),s[1]),o=i.match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(o){let c=o[1];return{isWorktree:!0,isSubmodule:!1,worktreeName:Ze.default.basename(r),parentRepoPath:c,parentProjectName:Ze.default.basename(c)}}let a=i.match(/^(.+)[/\\]\.git[/\\]modules[/\\](.+)$/);if(a){let c=a[1];return{isWorktree:!1,isSubmodule:!0,worktreeName:Ze.default.basename(r),parentRepoPath:c,parentProjectName:Ze.default.basename(c)}}return _r}var Tl=require("fs");var so=require("path");lr();M();function bl(r){let e=Pe(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 wl(r,e,t){let n=bl(r);return n.test(e)||n.test(t)?!0:r.replace(/\\/g,"/").endsWith("/**")?bl(r.slice(0,-3)).test(e.replace(/\/+$/,"")):!1}function io(r,e){if(!e.length)return!1;let t=r.replace(/\\/g,"/"),n=(0,so.basename)(t);for(let s of e){let i=s.trim();if(i)try{if(wl(i,t,n))return!0}catch(o){f.warn("PROJECT_NAME","Invalid glob pattern",{pattern:i,error:o instanceof Error?o.message:String(o)});continue}}return!1}function Kn(r,e){if(!e||!e.trim())return!1;let t=r.replace(/\\/g,"/"),n=(0,so.basename)(t),s=e.split(",").map(i=>i.trim()).filter(Boolean);for(let i of s)try{if(wl(i,t,n))return!0}catch(o){f.warn("PROJECT_NAME","Invalid exclusion pattern",{pattern:i,error:o instanceof Error?o.message:String(o)});continue}return!1}M();function Al(r){let e=r;if(typeof e=="string"){if(!e.trim())return[];try{e=JSON.parse(e)}catch(n){return f.warn("PROJECT_NAME","CLAUDE_MEM_PROJECT_ENVIRONMENTS is not valid JSON; ignoring it",{error:n instanceof Error?n.message:String(n)}),[]}}if(!Array.isArray(e))return e!=null&&f.warn("PROJECT_NAME","CLAUDE_MEM_PROJECT_ENVIRONMENTS must be an array; ignoring it",{}),[];let t=[];for(let n of e){let s=typeof n?.name=="string"?n.name.trim():"",i=Array.isArray(n?.patterns)?n.patterns.filter(o=>typeof o=="string"&&o.trim()!==""):[];if(!s||i.length===0){f.warn("PROJECT_NAME","Ignoring a project environment without a name or patterns",{name:s});continue}t.push({name:s,patterns:i})}return t}function Ym(r){try{return(0,Tl.realpathSync)(r)}catch{return r}}function oo(r,e){if(e.length===0)return null;let t=[...new Set([r,Ym(r)])].flatMap(n=>[n,`${n.replace(/[\\/]+$/,"")}/`]);for(let n of e)if(t.some(s=>io(s,n.patterns)))return n.name;return null}var uo="unknown-project";function Ml(r){try{return(0,lo.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 f.debug("PROJECT_NAME","git rev-parse failed, falling back to non-git root",{dir:r},t),null}}var Jm=[".claude-mem-project",".claude-mem.json"],Xm=64;function Ol(r){try{return(0,Ut.realpathSync)(r)}catch{return r}}function Qm(r,e){let t=oe.default.relative(e,r);return t===""||!t.startsWith("..")&&!oe.default.isAbsolute(t)}function Zm(){return[(0,Vn.homedir)(),(0,Vn.tmpdir)(),ut].flatMap(r=>{let e=oe.default.resolve(r);return[e,Ol(e)]})}function Cl(r){let e=Zm(),t=oe.default.resolve(r);if([oe.default.resolve(ut),Ol(oe.default.resolve(ut))].some(s=>Qm(t,s)))return null;for(let s=0;s<Xm;s++){if(e.includes(t))return null;let i=oe.default.dirname(t);if(i===t)return null;if(Jm.some(o=>(0,Ut.existsSync)(oe.default.join(t,o))))return t;t=i}return null}function co(r,e){let t=oe.default.basename(e);if(t===""){if(process.platform==="win32"){let s=r.match(/^([A-Z]):\\/i);if(s){let o=`drive-${s[1].toUpperCase()}`;return f.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:o}),o}}return f.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),uo}return t}var eh="CLAUDE_MEM_PROJECT_NAME_SOURCE",Gn=null;function Rl(){try{return(0,Ut.statSync)(ne).mtimeMs}catch{return-1}}function Il(){let r=Rl();if(r===-1)return H.getAllDefaults();if(Gn&&Gn.mtimeMs===r)return Gn.settings;let e=H.loadFromFile(ne);return Gn={mtimeMs:Rl(),settings:e},e}function th(){let r=process.env[eh]??Il().CLAUDE_MEM_PROJECT_NAME_SOURCE;return String(r??"path").trim().toLowerCase()==="git-remote"}var rh="CLAUDE_MEM_PROJECT_ENVIRONMENTS",zn=null;function Pl(){let r=process.env[rh]??Il().CLAUDE_MEM_PROJECT_ENVIRONMENTS;return(!zn||zn.raw!==r)&&(zn={raw:r,environments:Al(r)}),zn.environments}function nh(r){let e=(r??"").trim();if(!e||/^file:/i.test(e)||e.startsWith("/")||e.startsWith(".")||e.startsWith("~")||e.startsWith("\\\\")||/^[a-z]:[\\/]/i.test(e))return null;let n=e.replace(/\/+$/,"").replace(/\.git$/i,""),s=n.match(/^[a-z][a-z0-9+.-]*:\/\/[^/]+\/(.+)$/i),i=s?null:n.match(/^(?:[^/@\s]+@)?[^:/\s]+:(?!\/\/)(.+)$/),o=s?.[1]??i?.[1];if(!o)return null;let a=o.split("/").filter(c=>c&&c!=="_git");return a.length>=2?a.slice(-2).join("/"):a.length===1?a[0]:null}function sh(r){try{let e=(0,lo.execFileSync)("git",["remote","get-url","origin"],{cwd:r,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim();return nh(e)}catch(e){let t=e instanceof Error?e:new Error(String(e));return f.debug("PROJECT_NAME","No usable origin remote, keeping the path-based name",{repoRoot:r},t),null}}var ao=new Map;function kl(r){return th()?(ao.has(r)||ao.set(r,sh(r)),ao.get(r)??null):null}function ih(r,e=process.platform){if(!r||r.trim()==="")return f.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),uo;let t=Pe(r,e),n=oo(t,Pl());if(n)return n;let s=Ml(t),i=s?kl(s):null;if(i)return i;let o=s??Cl(t)??t;return co(r,o)}function xl(r,e){return e===r?r:`${r}/${e}`}function oh(r,e){if(!r.isSubmodule||!r.parentRepoPath)return null;let t=oe.default.relative(r.parentRepoPath,e);return!t||t.startsWith("..")||oe.default.isAbsolute(t)?null:t.split(oe.default.sep).join("/")}function mt(r,e=process.platform){if(!r||r.trim()===""){let c=ih(r,e);return{primary:c,parent:null,isWorktree:!1,isSubmodule:!1,allProjects:[c],keySource:"path"}}let t=Pe(r,e),n=Ml(t),s=ah(r,t,n),i=n?kl(n):null,o=i?vl(s,i,"git-remote"):s,a=oo(t,Pl());return a?vl(o,a,"environment"):o}function vl(r,e,t){return{primary:e,parent:null,isWorktree:r.isWorktree,isSubmodule:r.isSubmodule,allProjects:[...r.allProjects.filter(n=>n!==e),e],keySource:t}}function ah(r,e,t){let n=t?null:Cl(e),s=co(r,t??n??e),i=t??e,o=yl(i);if((o.isWorktree||o.isSubmodule)&&o.parentProjectName){let a=o.parentProjectName,c,l;return o.isSubmodule?(c=`${a}/${oh(o,i)??s}`,l=s!==a?[s]:[]):(c=xl(a,s),l=c===a?[`${a}/${s}`]:[]),{primary:c,parent:a,isWorktree:o.isWorktree,isSubmodule:o.isSubmodule,allProjects:[...new Set([a,...l,c])].filter(u=>u!==c).concat(c),keySource:"path"}}if(n&&oe.default.resolve(n)!==oe.default.resolve(e)){let a=co(r,e);if(a!==s&&a!==uo)return{primary:s,parent:null,isWorktree:!1,isSubmodule:!1,allProjects:[a,s],keySource:"path"}}return{primary:s,parent:null,isWorktree:!1,isSubmodule:!1,allProjects:[s],keySource:"path"}}W();var Dl=xe(Q.POWERSHELL_COMMAND);function lh(r){return r===void 0?Dl:Math.max(1,Math.min(Dl,r))}var wR=j.dataDir(),TR=j.workerPid(),uh="Bun runtime not found \u2014 install from https://bun.sh and ensure it is on PATH, under ~/.bun/bin, or set BUN / BUN_PATH / BUN_INSTALL. The worker daemon requires Bun because it uses bun:sqlite.";function dh(r){try{return(0,fe.realpathSync)(r)}catch{return null}}function fo(r){return r?/(^|[\\/])bun(\.exe)?$/i.test(r.trim()):!1}function fh(r,e){let t=e==="win32"?"where.exe":"which",n=[r],s;try{s=(0,qn.execFileSync)(t,n,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",windowsHide:!0})}catch(o){return o instanceof Error?f.debug("SYSTEM",`Binary lookup failed for ${r}`,{command:t,args:n},o):f.debug("SYSTEM",`Binary lookup failed for ${r}`,{command:t,args:n},new Error(String(o))),null}return s.split(/\r?\n/).map(o=>o.trim()).find(o=>o.length>0)||null}var po;function mo(r={}){let e=Object.keys(r).length===0;if(e&&po!==void 0)return po;let t=ph(r);return e&&t!==null&&(po=t),t}function Ll(r,e){let t=r?.trim();return t?e==="win32"?[ue.default.join(t,"bin","bun.exe"),ue.default.join(t,"bin","bun"),ue.default.join(t,"bun.exe")]:[ue.default.join(t,"bin","bun"),ue.default.join(t,"bun")]:[]}function ph(r){let e=r.platform??process.platform,t=r.execPath??process.execPath;if(fo(t))return t;let n=r.env??process.env,s=r.homeDirectory??(0,go.homedir)(),i=r.pathExists??fe.existsSync,o=r.lookupInPath??fh,a=r.realpath??dh,c=e==="win32"?[n.BUN,n.BUN_PATH,...Ll(n.BUN_INSTALL,e),ue.default.join(s,".bun","bin","bun.exe"),ue.default.join(s,".bun","bin","bun"),n.USERPROFILE?ue.default.join(n.USERPROFILE,".bun","bin","bun.exe"):void 0,n.LOCALAPPDATA?ue.default.join(n.LOCALAPPDATA,"bun","bun.exe"):void 0,n.LOCALAPPDATA?ue.default.join(n.LOCALAPPDATA,"bun","bin","bun.exe"):void 0,n.npm_config_prefix?ue.default.join(n.npm_config_prefix,"bun.exe"):void 0]:[n.BUN,n.BUN_PATH,...Ll(n.BUN_INSTALL,e),ue.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?ue.default.join(n.npm_config_prefix,"bin","bun"):void 0];for(let d of c){let g=d?.trim();if(g&&(fo(g)&&i(g)||g.toLowerCase()==="bun"))return g}let l=o("bun",e)?.trim();if(!l||!fo(l))return null;let u=a(l)??l;return i(u)?u:null}function ho(){let r=j.dataDir();return(0,fe.mkdirSync)(r,{recursive:!0}),r}function gh(r,e,t=ho()){let n=s=>s.replace(/'/g,"''");return`Start-Process -FilePath '${n(r)}' -ArgumentList @('"${n(e)}"','--daemon') -WorkingDirectory '${n(t)}' -WindowStyle Hidden`}function mh(r=process.env){let e=r.SystemRoot||r.SYSTEMROOT;return e?`${e}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`:"powershell.exe"}function hh(r,e,t=ho()){return["-NoProfile","-WindowStyle","Hidden","-EncodedCommand",Buffer.from(gh(r,e,t),"utf16le").toString("base64")]}function _o(r,e,t,n=process.platform,s){if(n==="win32"){let u=mh(t),d=hh(r,e),g=lh(s);try{let p=(0,qn.spawnSync)(u,d,{stdio:"ignore",windowsHide:!0,env:t,timeout:g,killSignal:"SIGTERM"});if(p.error)throw p.error;if(p.signal)throw new Error(`powershell Start-Process killed by signal=${p.signal} after ${g}ms`);if(p.status!==0)throw new Error(`powershell Start-Process exited ${p.status??"null"}`);return 0}catch(p){let m=p instanceof Error?p:new Error(String(p));f.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:r,powershell:u},m);return}}let i="/usr/bin/setsid",o=(0,fe.existsSync)(i),a=o?i:r,l=Gi(a,o?[r,e,"--daemon"]:[e,"--daemon"],{detached:!0,stdio:"ignore",cwd:ho(),env:t});if(l.on("error",u=>{f.error("SYSTEM",uh,{runtimePath:r,execPath:a},u)}),l.pid!==void 0)return l.unref(),l.pid}var Fl=me(require("net"),1);M();W();function Nl(r){let e=r?.code;return e==="EACCES"||e==="EADDRNOTAVAIL"}var Eo="Set CLAUDE_MEM_WORKER_PORT to a port between 1024 and 65535 and CLAUDE_MEM_WORKER_HOST to an address of this machine (127.0.0.1 by default) in claude-mem settings";function So(){return H.loadFromFile(ne).CLAUDE_MEM_WORKER_HOST}function Ul(r){return r.startsWith("[")&&r.endsWith("]")?r:r.includes(":")?`[${r}]`:r}var ht=5e3;async function $l(r,e,t="GET",n=ht){let s=await fetch(`http://${Ul(So())}:${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 Bl(r,e=ht){let t=Date.now()+e;if(process.platform==="win32")try{let s=await fetch(`http://${Ul(So())}:${r}/api/health`,{signal:AbortSignal.timeout(Math.max(1,t-Date.now()))});if(s.ok)return!0;f.debug("SYSTEM","Windows health check returned non-ok; falling through to socket probe",{port:r,status:s.status})}catch(s){s instanceof Error?f.debug("SYSTEM","Windows health check threw; falling through to socket probe",{port:r,message:s.message}):f.debug("SYSTEM","Windows health check threw; falling through to socket probe",{port:r,error:String(s)})}let n=await Yn(r,Math.max(1,t-Date.now()));return n==="occupied"||n==="indeterminate"}async function Yn(r,e=ht){return(await _h(r,e)).occupancy}function _h(r,e=ht){return e<=0?Promise.resolve({occupancy:"indeterminate"}):new Promise(t=>{let n=!1,s=!1,i=!1,o;try{o=Fl.default.createServer()}catch{t({occupancy:"indeterminate"});return}let a=u=>{if(i){u?.();return}i=!0;try{o.close(u)}catch(d){u?.(d instanceof Error?d:new Error(String(d)))}},c=setTimeout(()=>{if(s)a();else try{o.close()}catch{}l({occupancy:"indeterminate"})},e),l=u=>{n||(n=!0,clearTimeout(c),t(u))};o.once("error",u=>{if(s)a();else try{o.close()}catch{}u.code==="EADDRINUSE"?l({occupancy:"occupied"}):Nl(u)?l({occupancy:"unbindable",bindErrorCode:u.code}):l({occupancy:"indeterminate"})}),o.once("listening",()=>{if(s=!0,n){a();return}try{a(u=>l({occupancy:u?"indeterminate":"free"}))}catch{l({occupancy:"indeterminate"})}});try{o.listen(r,So())}catch{try{o.close()}catch{}l({occupancy:"indeterminate"})}})}async function Eh(r,e,t,n){let s=Date.now()+t;for(;Date.now()<s;){try{let o=s-Date.now();if((await $l(r,e,"GET",Math.min(ht,o))).ok)return!0}catch(o){o instanceof Error?f.debug("SYSTEM",n,{},o):f.debug("SYSTEM",n,{error:String(o)})}let i=Math.min(500,s-Date.now());i>0&&await new Promise(o=>setTimeout(o,i))}return!1}function Wl(r,e=3e4){return Eh(r,"/api/health",e,"Service not ready yet, will retry")}async function Sh(r,e=ht){try{let t=await $l(r,"/api/health","GET",e);return t.ok?JSON.parse(t.body).version:null}catch{return f.debug("SYSTEM","Could not fetch worker version",{}),null}}async function Hl(r,e,t=ht){let n=e??"unknown",s=await Sh(r,t);return!s||n==="unknown"?{matches:!0,pluginVersion:n,workerVersion:s}:{matches:n===s,pluginVersion:n,workerVersion:s}}M();var Jn=require("path"),Z=require("fs");W();M();var Kl=9e4,HR=Kl/3;function Gl(){return(0,Jn.join)(re(),"spawn.lock")}function jl(r){try{let e=JSON.parse((0,Z.readFileSync)(r,"utf-8"));return typeof e.pid!="number"||!Number.isInteger(e.pid)||e.pid<=0?null:e.pid}catch{return null}}function yh(r){if(r===null)return null;try{return process.kill(r,0),!0}catch(e){return e?.code==="EPERM"}}function yo(){let r=Gl(),e=JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()});for(let t=0;t<2;t++)try{return(0,Z.mkdirSync)((0,Jn.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 f.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}let a=jl(r),c=null;if(a===null)try{c=(0,Z.readFileSync)(r,"utf-8")}catch{continue}if(Date.now()-o<=Kl&&yh(a)!==!1)return!1;let u;try{u=(0,Z.statSync)(r).mtimeMs}catch{continue}if(u!==o)return!1;if(a!==null){if(jl(r)!==a)return!1}else try{if((0,Z.readFileSync)(r,"utf-8")!==c)return!1}catch{continue}try{(0,Z.unlinkSync)(r)}catch{return!1}}return!1}function bo(){let r=Gl();try{if(JSON.parse((0,Z.readFileSync)(r,"utf-8")).pid!==process.pid)return;(0,Z.unlinkSync)(r)}catch{}}var Yl=require("node:child_process"),Er=require("node:fs"),Jl=require("node:util");M();W();var Xn=(0,Jl.promisify)(Yl.execFile),bh=/^(uv|uvx|python|chroma-mcp)(\.exe)?$/i;function zl(r){return bh.test(r.trim())}function wh(r,e){if(!r)return!1;let t=r.toLowerCase().replace(/\\/g,"/"),n=t.indexOf("--data-dir");if(n<0)return!1;let s=t.slice(n+10).trim();if(s.startsWith('"')){let o=s.indexOf('"',1);s=o<0?s.slice(1):s.slice(1,o)}let i=e.toLowerCase().replace(/\\/g,"/");return s===i||s.startsWith(i)&&s[i.length]==="/"}function Qn(r,e){return e===void 0?r:Math.max(1,Math.min(r,e))}async function Th(r){try{let e=await Xn("powershell.exe",["-NoProfile","-NonInteractive","-Command","Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,@{Name='StartToken';Expression={$_.CreationDate.ToString('yyyyMMddHHmmss.ffffff')}} | ConvertTo-Json -Compress"],{timeout:Qn(3e4,r),windowsHide:!0,maxBuffer:33554432}),t=JSON.parse(e.stdout),n=Array.isArray(t)?t:t===null?[]:[t],s=[];for(let i of n){let o=typeof i.Name=="string"?i.Name.trim():"";if(!o)continue;let a=typeof i.ProcessId=="number"?i.ProcessId:Number.parseInt(String(i.ProcessId),10),c=typeof i.ParentProcessId=="number"?i.ParentProcessId:Number.parseInt(String(i.ParentProcessId),10);!Number.isInteger(a)||!Number.isInteger(c)||s.push({pid:a,ppid:c,name:o,cmdline:typeof i.CommandLine=="string"?i.CommandLine:null,startToken:typeof i.StartToken=="string"&&i.StartToken.length>0?i.StartToken:null})}return s}catch(e){return f.warn("PROCESS","Cannot enumerate the Windows process table with names \u2014 ghost-port reclaim disabled",{error:e instanceof Error?e.message:String(e)}),null}}async function Ah(r,e){try{let t=await Xn("netstat",["-ano"],{timeout:Qn(15e3,e),windowsHide:!0,maxBuffer:16777216});return Oh(t.stdout,r)}catch(t){return f.warn("PROCESS","netstat failed \u2014 ghost-port reclaim disabled for this attempt",{port:r,error:t instanceof Error?t.message:String(t)}),null}}async function Rh(r,e){try{let t=await Xn("lsof",["-nP",`-iTCP:${r}`,"-sTCP:LISTEN","-t"],{timeout:Qn(1e4,e),maxBuffer:1048576});return vh(t.stdout)}catch(t){let n=t;return n.code===1&&typeof n.stdout=="string"&&n.stdout.trim()===""?[]:(f.warn("PROCESS","lsof failed \u2014 cannot verify the worker port owner",{port:r,error:t instanceof Error?t.message:String(t)}),null)}}function vh(r){let e=new Set;for(let t of r.split(/\r?\n/)){let n=Number.parseInt(t.trim(),10);Number.isInteger(n)&&n>0&&e.add(n)}return[...e]}async function Mh(r,e){try{let n=(await Xn("ps",["-p",String(r),"-o","command="],{timeout:Qn(5e3,e)})).stdout.trim();return n.length>0?n:null}catch{return null}}function Oh(r,e){let t=new Set,n=`:${e}`;for(let s of r.split(/\r?\n/)){let i=s.trim();if(!/^TCP\b/i.test(i))continue;let o=i.split(/\s+/);if(!o[1]?.endsWith(n)||o[3]!=="LISTENING")continue;let c=Number.parseInt(o[4]??"",10);Number.isInteger(c)&&c>0&&t.add(c)}return[...t]}var Ch=/worker-service/i,Xl=1500,Ql=1e3,wo=5500,Vl=2*Xl+Ql+wo;async function Ih(r,e){let t=e.readOwnedWorker();if(t===null||t.port!==r)return null;let n=(u,d={})=>(f.info("PROCESS","Wedged-worker reclaim declined",{port:r,pid:t.pid,reason:u,...d}),{reclaimed:!1,reason:u,killedPids:[]}),s=(e.now()-Date.parse(t.startedAt))/1e3;if(!Number.isFinite(s)||s<e.minOwnerAgeSeconds)return n("owner-booting",{ageSeconds:s,minOwnerAgeSeconds:e.minOwnerAgeSeconds});for(let u=0;u<2;u++)if(u>0&&await e.sleep(Ql),await e.probeHealth(r))return n("owner-responding");let i=await e.listOwners(r);if(i===null)return n("netstat-unreadable");if(!i.includes(t.pid))return f.info("PROCESS","Wedged-worker reclaim: our worker does not own the port \u2014 deferring to the ghost-listener check",{port:r,pid:t.pid,listeners:i}),null;let o=e.readHeartbeat();if(o!==null&&o.pid===t.pid){let u=e.now(),d=Math.max(0,u-o.beatAtMs),g=Math.max(0,u-o.lastResponseAtMs);if(d<e.heartbeatStaleMs){if(g<e.maxSilentProtectionMs)return n("owner-progressing",{heartbeatAgeMs:Math.round(d),sinceLastResponseMs:Math.round(g)});f.warn("PROCESS","Worker finished no response within the protection window despite a fresh liveness heartbeat",{port:r,pid:t.pid,sinceLastResponseMs:Math.round(g),maxSilentProtectionMs:e.maxSilentProtectionMs})}}let a=await e.readIdentity(t.pid),c=t.startToken!==void 0&&a.startToken!==null&&a.startToken!==t.startToken;if(c||a.cmdline===null||!Ch.test(a.cmdline))return n("owner-identity-mismatch",{tokenMismatch:c,hasCmdline:a.cmdline!==null});if(!e.hasKillBudget())return n("out-of-budget");f.warn("PROCESS","Reclaiming wedged worker: past its boot grace, silent on two health probes, and still holding the port",{port:r,pid:t.pid,ageSeconds:Math.round(s)});try{await e.killTree(t.pid,{expectedStartToken:a.startToken??t.startToken??void 0,signalMode:"graceful"})}catch(u){return f.error("PROCESS","Wedged-worker reclaim tree-kill failed",{port:r,pid:t.pid},u instanceof Error?u:new Error(String(u))),{reclaimed:!1,reason:"kill-failed",killedPids:[]}}let l=await e.listOwners(r);return l!==null&&l.length===0?(f.info("PROCESS","Wedged worker reclaimed \u2014 port is free again",{port:r,killedPids:[t.pid]}),{reclaimed:!0,killedPids:[t.pid]}):(f.warn("PROCESS","Wedged-worker reclaim killed the worker but the port is still bound",{port:r,pid:t.pid,stillOwnedBy:l}),{reclaimed:!1,reason:"still-bound",killedPids:[t.pid]})}async function Ph(r,e,t,n){let s=Ne(r),i=e?(await t(n))?.find(o=>o.pid===r)?.cmdline??null:await Mh(r,n);return Re(r,s)?{startToken:s,cmdline:i}:{startToken:null,cmdline:null}}async function Zl(r,e={}){let t=e.isWin32??(()=>process.platform==="win32"),n=e.now??Date.now,s=e.deadlineAt??null,i=b=>s!==null&&s-n()<b,o=()=>s===null?void 0:Math.max(1,s-n());if(i(Vl))return f.info("PROCESS","Port reclaim skipped: not enough of the hook budget is left to finish one",{port:r,remainingMs:o(),neededMs:Vl}),{reclaimed:!1,reason:"out-of-budget",killedPids:[]};let a=e.listOwners??((b,C)=>t()?Ah(b,C):Rh(b,C)),c=b=>a(b,o()),l=e.readTable??Th,u=()=>l(o()),d=e.killTree??((b,C)=>he(b,C)),g=e.dataDir??(()=>U),p=e.readIdentity??((b,C)=>Ph(b,t(),l,C)),m=await Ih(r,{listOwners:c,killTree:d,readOwnedWorker:e.readOwnedWorker??Qe,probeHealth:e.probeHealth??(b=>Wl(b,Xl)),readIdentity:b=>p(b,o()),minOwnerAgeSeconds:e.minOwnerAgeSeconds??wc(),readHeartbeat:e.readHeartbeat??(()=>Lh()),heartbeatStaleMs:e.heartbeatStaleMs??xh(),maxSilentProtectionMs:e.maxSilentProtectionMs??Dh,now:n,sleep:e.sleep??(b=>new Promise(C=>setTimeout(C,b))),hasKillBudget:()=>!i(wo)});if(m!==null)return m;if(!t())return{reclaimed:!1,reason:"not-supported",killedPids:[]};let h=await c(r);if(h===null)return{reclaimed:!1,reason:"netstat-unreadable",killedPids:[]};if(h.length===0)return{reclaimed:!1,reason:"no-listener",killedPids:[]};let _=await u();if(_===null)return{reclaimed:!1,reason:"table-unreadable",killedPids:[]};if(h.filter(b=>J(b)).length>0)return{reclaimed:!1,reason:"owner-alive",killedPids:[]};let y=new Map;for(let b of _){let C=y.get(b.ppid);C?C.push(b):y.set(b.ppid,[b])}let w=new Map,R=new Set,P=b=>{for(let C of y.get(b)??[])R.has(C.pid)||(R.add(C.pid),P(C.pid),zl(C.name)&&w.set(C.pid,C))};for(let b of h)P(b);let O=g();if(O)for(let b of _)w.has(b.pid)||zl(b.name)&&wh(b.cmdline,O)&&w.set(b.pid,b);if(w.size===0)return f.info("PROCESS","Ghost listener owner is dead but no chroma-sidecar descendants found",{port:r,deadOwners:h,processTableRows:_.length,dataDir:O??"(unresolved)"}),{reclaimed:!1,reason:"no-chroma-descendants",killedPids:[]};f.warn("PROCESS","Reclaiming ghost listener: killing dead worker's surviving chroma sidecar chain",{port:r,deadOwners:h,targets:[...w.values()].map(b=>({pid:b.pid,name:b.name}))});let S=[];for(let b of w.values()){if(i(wo))return f.info("PROCESS","Ghost-listener reclaim stopped before a kill: the hook budget is spent",{port:r,killedPids:S}),{reclaimed:!1,reason:"out-of-budget",killedPids:S};try{await d(b.pid,{expectedStartToken:b.startToken,signalMode:"immediate"}),S.push(b.pid)}catch(C){return f.error("PROCESS","Ghost-port reclaim tree-kill failed",{port:r,pid:b.pid},C instanceof Error?C:new Error(String(C))),{reclaimed:!1,reason:"kill-failed",killedPids:S}}}let T=await c(r);return T!==null&&T.length===0?(f.info("PROCESS","Ghost listener reclaimed \u2014 port is free again",{port:r,killedPids:S}),{reclaimed:!0,killedPids:S}):(f.warn("PROCESS","Ghost-port reclaim killed the sidecar chain but the port is still bound",{port:r,killedPids:S,stillOwnedBy:T}),{reclaimed:!1,reason:"still-bound",killedPids:S})}var kh=12e4,ql={min:1e4,max:36e5};function xh(r=process.env,e=ne){let t=r.CLAUDE_MEM_WORKER_HEARTBEAT_STALE_MS??H.loadFromFile(e,!1,{readOnly:!0}).CLAUDE_MEM_WORKER_HEARTBEAT_STALE_MS,n=Number(t);return Number.isSafeInteger(n)&&n>=ql.min&&n<=ql.max?n:kh}var Dh=6e5;function Lh(r=j.workerHeartbeat()){try{let e=JSON.parse((0,Er.readFileSync)(r,"utf8"));if(e&&Number.isSafeInteger(e.pid)&&Number.isFinite(e.beatAtMs)&&Number.isFinite(e.lastResponseAtMs))return{pid:e.pid,beatAtMs:e.beatAtMs,lastResponseAtMs:e.lastResponseAtMs}}catch{}return null}le();var $t=require("fs"),tu=require("module"),et=me(require("path"),1),Nh=["zod/v3","zod/v4","zod/v4-mini"];function eu(r){try{return(0,$t.realpathSync)(r)}catch{return r}}function Fh(r,e){let t=et.default.relative(e,r);return t!==""&&!t.startsWith("..")&&!et.default.isAbsolute(t)}function ru(r){let e;try{let s=JSON.parse((0,$t.readFileSync)(et.default.join(r,"package.json"),"utf-8"));e=Object.keys(s?.dependencies??{})}catch{return[]}if(e.length===0)return[];let t=et.default.join(r,"node_modules"),n=e.filter(s=>!(0,$t.existsSync)(et.default.join(t,...s.split("/"),"package.json")));if(e.includes("zod")&&!n.includes("zod")){let s=(0,tu.createRequire)(et.default.join(t,"noop.js")),i=eu(et.default.join(t,"zod"));for(let o of Nh)try{let a=s.resolve(o,{paths:[t]});Fh(eu(a),i)||n.push(o)}catch{n.push(o)}}return n}function mu(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;f.warn("SYSTEM",`Invalid ${r}, using default`,{value:n,min:t.min,max:t.max})}return e}var St=mu("CLAUDE_MEM_HEALTH_TIMEOUT_MS",xe(Q.HEALTH_CHECK),{min:500,max:3e5}),Sr=mu("CLAUDE_MEM_HOOK_READINESS_TIMEOUT_MS",xe(Q.HOOK_READINESS_WAIT),{min:0,max:3e5}),Uh=5e3,$h={min:500,max:3e5},Bh={min:500,max:Q.SESSION_INIT_REQUEST_MAX},Mo=100;function hu(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 Wh(r){return hu()?{...r,verbose:!0}:r}function Hh(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 jh(r,e,t){let n=typeof e.method=="string"?e.method:"GET",s=Hh(t),i=JSON.stringify(s);f.warn("SYSTEM","Worker IPC fetch failed",{url:r,method:n},i),je(`[claude-mem] fetch verbose: ${n} ${r} ${i}
22
22
  `)}async function Oo(r,e={}){let t=Wh(e);try{return await fetch(r,t)}catch(n){throw hu()&&jh(r,e,n),n}}async function Co(r,e={},t){try{return await Oo(r,{...e,signal:AbortSignal.timeout(t)})}catch(n){throw n instanceof DOMException&&n.name==="TimeoutError"?new Error(`Request timed out after ${t}ms`):n}}function Kh(r,e){let t=new AbortController,n=null,s=null,i=null,o=!1,a=()=>{s!==null&&(clearTimeout(s),s=null)},c=()=>{o=!0,a(),i!==null&&(clearTimeout(i),i=null)},l=d=>{o||(n=d,c(),t.abort(d))},u=()=>{o||(a(),s=setTimeout(()=>l(new Error(`Request timed out after ${r.idleTimeoutMs}ms idle`)),r.idleTimeoutMs))};if(r.absoluteCapMs!==void 0&&r.absoluteCapMs>0){let d=r.absoluteCapMs;i=setTimeout(()=>l(new Error(`Request timed out after ${d}ms`)),d)}return u(),{signal:e?AbortSignal.any([e,t.signal]):t.signal,touch:u,pause:a,dispose:c,translate:d=>n??d}}async function _u(r,e,t){let n=Kh(t,e.signal),s;try{s=await Oo(r,{...e,signal:n.signal})}catch(l){throw n.dispose(),n.translate(l)}n.touch();let i=s.body,o=i?i.getReader():null,a=!1;async function*c(){if(!o){a=!0,n.dispose();return}try{for(;;){n.touch();let l;try{l=await o.read()}catch(u){throw a=!0,n.translate(u)}if(l.done){a=!0;return}n.pause(),t.onChunk?.(l.value),yield l.value}}finally{n.dispose(),a||await o.cancel()}}return{status:s.status,statusText:s.statusText,ok:s.ok,headers:s.headers,chunks:c(),cancel:async()=>{n.dispose(),o&&!a&&(a=!0,await o.cancel())}}}async function Gh(r,e,t){let n=await _u(r,e,t),s=new TextDecoder,i="";for await(let o of n.chunks)i+=s.decode(o,{stream:!0});return i+=s.decode(),{status:n.status,statusText:n.statusText,ok:n.ok,headers:n.headers,text:i}}var To=null,Ao=null,Zn=null,es=null,ts=null;function nu(){return F.default.join(H.get("CLAUDE_MEM_DATA_DIR"),"settings.json")}function Io(r={}){return r.readOnly?H.loadFromFile(nu(),!0,r):(Zn!==null||(Zn=H.loadFromFile(nu())),Zn)}function su(r,e){if(!r)return null;let t=parseInt(r,10);return Number.isFinite(t)&&t>=e.min&&t<=e.max?t:null}function Eu(r,e,t){let n=process.env[r];if(n!==void 0){let o=su(n,t);return o!==null?o:(f.warn("SYSTEM",`Invalid ${r}, using default`,{value:n,min:t.min,max:t.max}),e)}let s=Io()[r],i=su(s,t);return i!==null?i:(f.warn("SYSTEM",`Invalid ${r} in settings.json, using default`,{value:s,min:t.min,max:t.max}),e)}function Ee(r={}){if(!r.readOnly&&To!==null)return To;let e=parseInt(Io(r).CLAUDE_MEM_WORKER_PORT,10);return r.readOnly||(To=e),e}function br(r={}){if(!r.readOnly&&Ao!==null)return Ao;let e=Io(r).CLAUDE_MEM_WORKER_HOST;return r.readOnly||(Ao=e),e}function zh(){return es!==null||(es=Eu("CLAUDE_MEM_API_TIMEOUT_MS",xe(Q.API_REQUEST),$h)),es}function Su(){return ts!==null||(ts=Math.min(Eu("CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS",ur(),Bh),Tc())),ts}function Po(r){return r===null?null:Math.max(0,r-Date.now())}function ns(r){let e=Po(r);return e!==null&&e<Mo}function tt(r,e){let t=Po(e);return t===null?r:Math.max(1,Math.min(r,t))}function yu(r){return`http://${mr(br())}:${Ee()}${r}`}function Fe(r,e={}){let t=e.method??"GET",n=yu(r),s={method:t};if(e.headers&&(s.headers=e.headers),e.body&&(s.body=e.body),e.idleTimeoutMs!==void 0&&e.idleTimeoutMs>0)return Gh(n,s,{idleTimeoutMs:e.idleTimeoutMs,absoluteCapMs:e.timeoutMs}).then(o=>new Response(o.text.length>0?o.text:null,{status:o.status,statusText:o.statusText,headers:o.headers}));let i=e.timeoutMs??zh();return i>0?Co(n,s,i):Oo(n,s)}async function Vh(r){return(await Fe("/api/health",{timeoutMs:r})).ok}async function iu(r=St){return(await Fe("/api/readiness",{timeoutMs:r})).ok}function bu(r){let e=(0,k.existsSync)(F.default.join(r,"plugin","scripts"))?F.default.join(r,"plugin"):r;return F.default.join(e,"scripts","worker-service.cjs")}function qh(r,e){let t=d=>{let g=d.split("-")[0].split(".");return[parseInt(g[0],10)||0,parseInt(g[1],10)||0,parseInt(g[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 Yh(r=F.default.join(F.default.dirname(F.default.dirname(Dt)),"cache","thedotmack","claude-mem")){try{return(0,k.readdirSync)(r).filter(e=>/^\d/.test(e)).map(e=>F.default.join(r,e)).filter(e=>{try{if(!(0,k.statSync)(e).isDirectory())return!1}catch{return!1}return!(0,k.existsSync)(F.default.join(e,".orphaned_at"))}).map(e=>({scriptPath:bu(e),version:F.default.basename(e)}))}catch{return[]}}function ou(r){try{let e=JSON.parse((0,k.readFileSync)(r,"utf-8"));return typeof e.version=="string"?e.version:null}catch(e){let t=e.code;return t!=="ENOENT"&&f.debug("SYSTEM","Could not read package version for worker resolution",{packageJsonPath:r,code:t}),null}}function Jh(){return{cacheRoot:F.default.join(F.default.dirname(F.default.dirname(Dt)),"cache","thedotmack","claude-mem"),marketplaceRoot:Dt,cwd:process.cwd()}}function ko(r=Jh()){let e=process.env.CLAUDE_MEM_WORKER_SCRIPT_PATH?.trim();if(e){if((0,k.existsSync)(e))return{scriptPath:e,version:null};f.debug("SYSTEM","Ignoring missing CLAUDE_MEM_WORKER_SCRIPT_PATH override",{override:e})}let t=[...Yh(r.cacheRoot),{scriptPath:bu(F.default.join(r.marketplaceRoot,"plugin")),version:ou(F.default.join(r.marketplaceRoot,"package.json"))},{scriptPath:F.default.join(r.cwd,"plugin","scripts","worker-service.cjs"),version:ou(F.default.join(r.cwd,"package.json"))}];return Zh(t)}function Xh(r){return F.default.dirname(F.default.dirname(r))}function Qh(r){return ru(Xh(r.scriptPath)).length===0}function Zh(r,e=Qh){let t=r.filter(n=>(0,k.existsSync)(n.scriptPath));return t.length===0?null:(t.sort((n,s)=>n.version===null&&s.version===null?0:n.version===null?1:s.version===null?-1:qh(n.version,s.version)),t.find(e)??t[0])}function xo(){return ko()?.scriptPath??null}async function e_(r){let e=r.deadlineAt??null,t=r.backoffMs;for(let n=1;n<=r.attempts;n++){if(ns(e))return!1;if(await Iu(e??Number.POSITIVE_INFINITY))return!0;n<r.attempts&&(await new Promise(s=>setTimeout(s,tt(t,e))),t*=2)}return!1}function au(r){return r instanceof Error&&/^Request timed out after \d+ms idle$/.test(r.message)}function cu(r){return r instanceof Error&&/^Request timed out after \d+ms$/.test(r.message)}async function t_(r){let e;try{e=await _u(yu("/api/ready"),{method:"GET"},{idleTimeoutMs:Uh,absoluteCapMs:Math.max(1,r)})}catch(i){return au(i)?{outcome:"unresponsive",detail:"no response headers within the idle window"}:cu(i)?{outcome:"still_booting",detail:"budget spent before response headers"}:(f.debug("SYSTEM","Worker /api/ready connection failed",{error:i instanceof Error?i.message:String(i)}),{outcome:"not_running"})}let t=()=>e.cancel().catch(i=>{f.debug("SYSTEM","Releasing the /api/ready body failed",{error:i instanceof Error?i.message:String(i)})}),n=e.headers?.get("content-type")??"";if(!e.ok||!n.includes("text/event-stream"))return ss(),await t(),{outcome:"unsupported"};let s=null;try{for await(let i of jc(e.chunks)){if(i.event!=="phase")continue;let o=JSON.parse(i.data);if(s=typeof o.phase=="string"?o.phase:null,s==="ready")return ss(),await t(),{outcome:"ready"};if(s==="failed")return await t(),{outcome:"failed",detail:typeof o.message=="string"?o.message:"unknown init failure"}}}catch(i){return cu(i)?(ss(),{outcome:"still_booting",detail:`last phase ${s??"none"}`}):au(i)?{outcome:"unresponsive",detail:`silent past the idle window after response headers (last phase ${s??"none"})`}:{outcome:"wedged",detail:`stream error: ${i instanceof Error?i.message:String(i)} (last phase ${s??"none"})`}}return{outcome:"wedged",detail:`stream closed before ready/failed (last phase ${s??"none"})`}}async function r_(r){if(r<=0)try{return await iu()?{outcome:"ready"}:{outcome:"still_booting"}}catch(t){return f.debug("SYSTEM","Worker readiness check threw",{},t instanceof Error?t:new Error(String(t))),{outcome:"still_booting"}}let e=Date.now();do{let t=r-(Date.now()-e);try{if(await iu(Math.max(1,Math.min(St,t))))return{outcome:"ready"}}catch(s){f.debug("SYSTEM","Worker readiness check threw",{error:s instanceof Error?s.message:String(s)})}let n=r-(Date.now()-e);if(n<=0)break;await new Promise(s=>setTimeout(s,Math.min(250,n)))}while(Date.now()-e<r);return{outcome:"still_booting",detail:"legacy /api/readiness never reported ready"}}async function Bt(r=Sr){let e=r>0?r:St,t=await t_(e);return t.outcome==="ready"&&l_(),t.outcome!=="unsupported"?t:(f.debug("SYSTEM","Worker has no /api/ready stream; falling back to /api/readiness"),r_(r))}async function n_(r=St){try{let t=await(await Fe("/api/health",{timeoutMs:r})).json();return typeof t.version=="string"?t.version:null}catch(e){let t=e instanceof Error?e:new Error(String(e));return f.debug("SYSTEM","Worker health-version fetch failed",{},t),null}}async function s_(r=5e3){let e=Date.now()+r;for(;;){let t=e-Date.now();if(t<=0)return!1;if(await Yn(Ee(),Math.min(1e3,t))==="free")return!0;let n=Math.min(200,e-Date.now());n>0&&await new Promise(s=>setTimeout(s,n))}}function wu(r,e){if(!r)return null;try{let t=(0,k.statSync)(r.scriptPath);return JSON.stringify([r.scriptPath,e,t.size,t.mtimeMs,t.ctimeMs])}catch{return null}}function Tu(){return F.default.join(re(),"worker-version-recycle.json")}function i_(r,e){if(r===null||e===null)return!1;try{let t=JSON.parse((0,k.readFileSync)(Tu(),"utf-8"));return t?.buildKey===r&&t?.workerVersion===e}catch{return!1}}async function lu(r,e=null,t=St){let n=await n_(t);if(n!==null&&n!==r){if(e!==null)try{K(Tu(),{buildKey:e,workerVersion:n})}catch(s){f.warn("SYSTEM","Could not persist the failed worker version recycle",{error:s instanceof Error?s.message:String(s)})}f.warn("SYSTEM","Worker is ready but still reports a stale version; rebuild or reinstall the worker bundle before retrying",{pluginVersion:r,workerVersion:n})}}var Au=3e4;function Do(){return F.default.join(re(),"worker-unresponsive.json")}function o_(){try{let r=JSON.parse((0,k.readFileSync)(Do(),"utf-8"));return typeof r?.pid!="number"||typeof r?.firstUnresponsiveAtEpochMs!="number"?null:{pid:r.pid,firstUnresponsiveAtEpochMs:r.firstUnresponsiveAtEpochMs}}catch{return null}}function ss(){let r=Do();if((0,k.existsSync)(r))try{(0,k.unlinkSync)(r)}catch(e){f.debug("SYSTEM","Could not clear the unresponsive-worker record",{error:e instanceof Error?e.message:String(e)})}}function a_(r=Date.now()){let e=Qe()?.pid??null;if(e===null)return!1;let t=o_();if(t!==null&&t.pid===e)return r-t.firstUnresponsiveAtEpochMs>=Au;try{K(Do(),{pid:e,firstUnresponsiveAtEpochMs:r})}catch(n){f.warn("SYSTEM","Could not persist the unresponsive-worker record",{error:n instanceof Error?n.message:String(n)})}return!1}function Lo(){return F.default.join(re(),"worker-never-ready-recycle.json")}function c_(){try{let r=JSON.parse((0,k.readFileSync)(Lo(),"utf-8"));return typeof r?.buildKey!="string"||typeof r?.failureMessage!="string"?null:{buildKey:r.buildKey,failureMessage:r.failureMessage,refusalLogged:r.refusalLogged===!0}}catch{return null}}function Ru(r){try{K(Lo(),r)}catch(e){f.warn("SYSTEM","Could not persist the never-ready worker recycle",{error:e instanceof Error?e.message:String(e)})}}function l_(){let r=Lo();if((0,k.existsSync)(r))try{(0,k.unlinkSync)(r)}catch(e){f.debug("SYSTEM","Could not clear the never-ready worker recycle record",{error:e instanceof Error?e.message:String(e)})}}function vu(r){return wu(r,r?.version??"unknown")??"unresolved-worker-bundle"}function Mu(r){return r.outcome==="failed"?r.detail??"unknown init failure":r.outcome}function Ou(r,e){if(r.outcome==="unresponsive"&&!a_())return f.warn("SYSTEM","Worker went silent on /api/ready; skipping this hook without killing it",{detail:r.detail,wedgedAfterMs:Au}),!1;let t=Mu(r),n=c_();return n!==null&&n.buildKey===e&&n.failureMessage===t?(n.refusalLogged?f.debug("SYSTEM","Never-ready worker recycle already refused for this bundle and failure",{failureMessage:t}):(f.error("SYSTEM","Worker keeps failing to start the same way after a recycle; not recycling again. Run `npx claude-mem doctor` and check the worker logs",{outcome:r.outcome,failureMessage:t,logsDir:F.default.join(re(),"logs")}),Ru({...n,refusalLogged:!0})),!1):!0}function Cu(r,e){Ru({buildKey:e,failureMessage:Mu(r)}),ss()}async function Iu(r=Number.POSITIVE_INFINITY){let e=r-Date.now();if(e<=0)return!1;let t;try{t=await Vh(Math.min(St,e))}catch(n){return f.debug("SYSTEM","Worker health check threw",{error:n instanceof Error?n.message:String(n)}),!1}return t}async function Pu(r,e){let t=Qe();if(t===null||t.port!==Ee())return f.error("SYSTEM","Stale worker is serving the port but the PID file does not identify it; kill the claude-mem worker process manually",{port:Ee(),pidFilePid:t?.pid??null,pidFilePort:t?.port??null}),!1;if(e("stale-worker recycle"))return!1;try{await he(t.pid,{signalMode:"immediate"})}catch(n){return f.error("SYSTEM","Could not kill stale worker",{pid:t.pid,port:t.port},n instanceof Error?n:new Error(String(n))),!1}return await s_(tt(5e3,r))?!0:(e("stale port release")||(Et=Ee(),f.error("SYSTEM","Stale worker port still open after SIGKILL; skipping spawn this hook event",{pid:t.pid,port:Ee(),fix:os})),!1)}async function is(r){let e=r===void 0?null:Date.now()+r,t=h=>ns(e)?(f.warn("SYSTEM","Worker check ran out of the hook budget; skipping the rest this hook event",{step:h,budgetMs:r}),!0):!1,n=()=>e===null?void 0:tt(St,e),s=Math.min(Date.now()+5e3,e??Number.POSITIVE_INFINITY),i=ko(),o=null,a=null,c=!1,l=null,u=null,d=Mn(Y());if(t("health probe"))return!1;if(await Iu(s)){if(t("version probe"))return!1;let{matches:h,pluginVersion:_,workerVersion:E}=await Hl(Ee(),i?.version??null,n());if(_!=="unknown"&&(o=_),h){if(t("readiness wait"))return!1;let y=await Bt(tt(Sr,e));if(y.outcome==="ready")return o!==null&&!ns(e)&&await lu(o,null,n()),!0;if(y.outcome==="still_booting"||y.outcome==="not_running")return f.warn("SYSTEM","Worker is healthy but not ready yet; skipping hook API call",{outcome:y.outcome,detail:y.detail}),!1;if(d)return f.warn("SYSTEM","Worker will never become ready; CLAUDE_MEM_WORKER_AUTOSTART=false, so leaving it to whatever manages it",{outcome:y.outcome,detail:y.detail}),!1;if(u=vu(i),!Ou(y,u))return!1;l=y,f.info("SYSTEM","Worker will never become ready \u2014 recycling wedged worker",{outcome:y.outcome,detail:y.detail,version:E})}else{if(d)return f.warn("SYSTEM","Worker version differs from the installed plugin; CLAUDE_MEM_WORKER_AUTOSTART=false, so using it as is",{pluginVersion:_,workerVersion:E}),t("readiness wait")?!1:(await Bt(tt(Sr,e))).outcome==="ready";if(a=wu(i,_),i_(a,E))return f.warn("SYSTEM","Skipping repeated worker recycle: the unchanged bundle still reports a stale version; rebuild or reinstall it",{pluginVersion:_,workerVersion:E,scriptPath:i?.scriptPath}),t("readiness wait")?!1:(await Bt(tt(Sr,e))).outcome==="ready";f.info("SYSTEM","Worker version mismatch \u2014 killing stale worker",{pluginVersion:_,workerVersion:E})}if(!await Pu(e,t))return!1;l!==null&&u!==null&&Cu(l,u),c=!0}if(d)return f.debug("SYSTEM","Worker not running and CLAUDE_MEM_WORKER_AUTOSTART=false \u2014 not lazy-spawning"),!1;let g=i?.scriptPath??null;if(t("lazy spawn"))return!1;let p=yo();try{if(p){if(!c&&!await u_(s,e))return!1;let _=mo();if(!_)return f.warn("SYSTEM","Cannot lazy-spawn worker: Bun runtime not found (PATH, BUN / BUN_PATH / BUN_INSTALL, or ~/.bun/bin)"),!1;if(!g)return f.warn("SYSTEM","Cannot lazy-spawn worker: worker-service.cjs not found in plugin/scripts"),!1;f.info("SYSTEM","Worker not running \u2014 lazy-spawning",{runtimePath:_,scriptPath:g});try{if(_o(_,g,Le({...process.env,CLAUDE_MEM_WORKER_PORT:String(Ee())}),process.platform,Po(e)??void 0)===void 0)return!1}catch(E){return E instanceof Error?f.error("SYSTEM","Lazy-spawn of worker failed",{runtimePath:_,scriptPath:g},E):f.error("SYSTEM","Lazy-spawn of worker failed (non-Error)",{runtimePath:_,scriptPath:g,error:String(E)}),!1}}else f.info("SYSTEM","Another launcher holds the spawn lock \u2014 skipping lazy-spawn and waiting for its worker");if(!await e_({attempts:6,backoffMs:500,deadlineAt:e}))return t("cold-boot port wait")||(f.warn("SYSTEM",p?"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)"),Qe()===null&&await Bl(Ee(),e===null?void 0:tt(5e3,e))&&(Et=Ee(),f.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:Et,fix:os}))),!1}finally{p&&bo()}if(t("readiness wait"))return!1;let m=await Bt(tt(Sr,e));return m.outcome!=="ready"?(f.warn("SYSTEM","Worker lazy-spawned but did not become ready before hook readiness timeout",{outcome:m.outcome,detail:m.detail}),!1):(o!==null&&!ns(e)&&await lu(o,a,n()),!0)}var os="Set CLAUDE_MEM_WORKER_PORT to a different port in claude-mem settings, or reboot to release the stuck port",Et=null,vo=null;async function u_(r,e){let t=Ee(),n=r-Date.now();if(n<=0)return!1;let s=await Yn(t,n);if(s==="free")return!0;if(s==="unbindable")return vo=t,f.error("SYSTEM","Worker port cannot be bound (EACCES or EADDRNOTAVAIL) \u2014 skipping lazy-spawn",{port:t,host:br(),fix:Eo}),!1;if(s==="indeterminate")return f.warn("SYSTEM","Worker port state could not be determined in time \u2014 skipping lazy-spawn",{port:t}),!1;let i=await Zl(t,{deadlineAt:e});return i.reclaimed?(f.info("SYSTEM","Reclaimed the worker port before lazy-spawn",{port:t,killedPids:i.killedPids}),!0):(Qe()===null&&(Et=t),f.warn("SYSTEM","Worker port is held by a listener that does not answer health \u2014 skipping lazy-spawn",{port:t,reclaimReason:i.reason,...Et===t?{fix:os}:{}}),!1)}var rs=null;async function d_(r){return rs!==null||(rs=await is(r)),rs}async function f_(r){let e=Date.now()+r,t=()=>e-Date.now(),n=l=>t()>=Mo?!1:(f.debug("SYSTEM","Bounded worker startup ran out of budget",{step:l,budgetMs:r}),!0),s=await Bt(Math.max(1,t()));if(s.outcome==="ready")return!0;if(s.outcome==="still_booting")return f.warn("SYSTEM","Worker is still booting; bounded startup budget spent, skipping this call",{detail:s.detail,budgetMs:r}),!1;if(!!Mn(Y()))return uu(e);let o=mo(),a=xo();if(!o||!a)return!1;if(s.outcome==="failed"||s.outcome==="wedged"||s.outcome==="unresponsive"){let l=vu(ko());if(!Ou(s,l)||(f.info("SYSTEM","Worker will never become ready \u2014 recycling wedged worker",{outcome:s.outcome,detail:s.detail}),!await Pu(e,n)))return!1;Cu(s,l)}let c=yo();try{return c&&_o(o,a,Le({...process.env,CLAUDE_MEM_WORKER_PORT:String(Ee())}),process.platform,Math.max(1,t()))===void 0?!1:await uu(e)}catch(l){return f.debug("SYSTEM","Bounded worker startup failed",{error:l instanceof Error?l.message:String(l)}),!1}finally{c&&bo()}}async function uu(r){for(;r-Date.now()>0;){let e=await Bt(Math.max(1,r-Date.now()));if(e.outcome==="ready")return!0;if(e.outcome!=="not_running")return f.debug("SYSTEM","Bounded worker startup did not reach ready",{outcome:e.outcome,detail:e.detail}),!1;let t=Math.min(100,r-Date.now());t>0&&await new Promise(n=>setTimeout(n,t))}return!1}var p_=3,ku=20,xu=1e3,g_=10,Du=5e3,m_=Du+xu;function as(){return F.default.join(U,"state")}function Lu(){return F.default.join(as(),"hook-failures.json")}function Nu(){return F.default.join(as(),"hook-failures.lock")}async function No(r=xu){let e=as(),t=Nu(),n=(0,gu.randomUUID)(),s=JSON.stringify({pid:process.pid,token:n}),i=Date.now()+r;for(;Date.now()<=i;)try{return(0,k.mkdirSync)(e,{recursive:!0}),(0,k.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 f.warn("SYSTEM","Hook-failure lock unavailable; skipping failure-state update",{lockPath:t,code:c},a),null;let l;try{l=(0,k.statSync)(t).mtimeMs}catch{continue}if(Date.now()-l>Du){let u;try{u=(0,k.statSync)(t).mtimeMs}catch{continue}if(u===l)try{(0,k.unlinkSync)(t);continue}catch{}}await new Promise(u=>setTimeout(u,g_))}return f.warn("SYSTEM","Timed out waiting for hook-failure lock; skipping failure-state update",{lockPath:t,waitMs:r}),null}function Fo(r){let e=Nu();try{if(JSON.parse((0,k.readFileSync)(e,"utf-8")).token!==r)return;(0,k.unlinkSync)(e)}catch{}}function h_(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,notifiedSessionIds:Array.isArray(e.notifiedSessionIds)?e.notifiedSessionIds.filter(t=>typeof t=="string").slice(-ku):void 0}}function yr(){try{return h_((0,k.readFileSync)(Lu(),"utf-8"))}catch{return{consecutiveFailures:0,lastFailureAt:0,thresholdTripped:!1}}}function Uo(r){let e=as(),t=Lu(),n=`${t}.tmp`;try{return(0,k.existsSync)(e)||(0,k.mkdirSync)(e,{recursive:!0}),(0,k.writeFileSync)(n,JSON.stringify(r),"utf-8"),(0,k.renameSync)(n,t),!0}catch(s){return f.debug("SYSTEM","Failed to persist hook-failure counter",{error:s instanceof Error?s.message:String(s)}),!1}}function __(){try{let e=Y().CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD,t=parseInt(e,10);if(Number.isFinite(t)&&t>=1)return t}catch{}return p_}var du=null;function Fu(r){let e=vo!==null?`The worker cannot bind port ${vo} on ${br()}: the system refuses it (EACCES or EADDRNOTAVAIL). ${Eo}.`:Et!==null?`Port ${Et} is held by an unreachable process that no PID file claims, so the worker cannot bind it. ${os}.`:"Run `npx claude-mem restart`; if it keeps failing, run `npx claude-mem doctor`.";return`claude-mem worker unreachable for ${r} consecutive hooks \u2014 memory features are degraded, but your prompts are not blocked. ${e}`}var E_=!1,fu=!1;async function Ro(){if(E_){if(fu)return yr().consecutiveFailures;fu=!0}let r=await No();if(r===null)return yr().consecutiveFailures;let e,t=!1;try{let n=yr();e={consecutiveFailures:n.consecutiveFailures+1,lastFailureAt:Date.now(),thresholdTripped:n.thresholdTripped,notifiedSessionIds:n.notifiedSessionIds};let s=__();t=e.consecutiveFailures>=s&&!e.thresholdTripped,t&&(e.thresholdTripped=!0);let i=Uo(e);t=t&&i}finally{Fo(r)}return t&&(await Sl("hook_failed",{...du!==null?{hook_type:du}:{},error_mode:"worker_unavailable",consecutive_failures:e.consecutiveFailures,threshold_tripped:!0}),je(`${Fu(e.consecutiveFailures)}
23
23
  `)),e.consecutiveFailures}async function Uu(r){if(!r)return null;let e=await No();if(e===null)return null;try{let t=yr(),n=t.notifiedSessionIds??[];return!t.thresholdTripped||n.includes(r)?null:Uo({...t,notifiedSessionIds:[...n,r].slice(-ku)})?Fu(t.consecutiveFailures):null}finally{Fo(e)}}async function pu(){let r=await No(m_);if(r!==null)try{let e=yr();if(e.consecutiveFailures===0&&!e.thresholdTripped)return;Uo({consecutiveFailures:0,lastFailureAt:0,thresholdTripped:!1})}finally{Fo(r)}}var _t=Symbol.for("claude-mem/worker-fallback");function $u(r){return typeof r=="object"&&r!==null&&r[_t]===!0}async function Bu(r,e,t,n={}){let s=Date.now(),i=n.workerStartupTimeoutMs!==void 0;if(!(i?await f_(n.workerStartupTimeoutMs):await d_(n.timeoutMs)))return Mn(Y())?{continue:!0,reason:"worker_autostart_disabled",[_t]:!0}:(i||await Ro(),{continue:!0,reason:"worker_unreachable",[_t]:!0});let a={method:e};if(t!==void 0&&(a.headers={"Content-Type":"application/json"},a.body=JSON.stringify(t)),n.timeoutMs!==void 0){let u=i?n.timeoutMs:n.timeoutMs-(Date.now()-s);if(u<Mo)return f.debug("SYSTEM","Hook budget spent before the worker request; skipping it",{url:r}),i||await Ro(),{continue:!0,reason:"worker_budget_exhausted",[_t]:!0};a.timeoutMs=u}let c;try{c=await Fe(r,a)}catch(u){if(!i)throw u;return f.debug("SYSTEM","Worker unavailable for best-effort hook call",{error:u instanceof Error?u.message:String(u)}),{continue:!0,reason:"worker_unreachable",[_t]:!0}}if(!c.ok){let u=await c.text().catch(()=>"");if(await pu(),c.status===429||c.status>=500)return f.warn("SYSTEM",`Worker API ${e} ${r} returned ${c.status}; skipping hook API call`,{body:u.substring(0,200)}),{continue:!0,reason:`worker_api_${c.status}`,[_t]:!0};let d=u;try{d=JSON.parse(u)}catch{}return d}let l;try{l=await c.text()}catch(u){return f.debug("SYSTEM","Worker response body could not be read; treating the worker as unreachable",{error:u instanceof Error?u.message:String(u)}),i||await Ro(),{continue:!0,reason:"worker_body_read_failed",[_t]:!0}}if(await pu(),l.length!==0)try{return JSON.parse(l)}catch{return l}}M();var Ue=require("path");W();var S_="plugins",y_="cache",b_="thedotmack",w_="claude-mem",T_="plugin",A_=(0,Ue.join)(ut,S_,y_,b_,w_),R_=(0,Ue.join)(Dt,T_);function $o(r,e){let t=(0,Ue.normalize)(r),n=(0,Ue.normalize)(e);if(t===n)return!0;let s=(0,Ue.relative)(n,t);return s.length>0&&!s.startsWith("..")&&!(0,Ue.isAbsolute)(s)}function cs(r){if(process.env.CLAUDE_MEM_INTERNAL==="1")return!1;if(!r)return!0;if($o(r,wn)||$o(r,A_)||$o(r,R_))return!1;let e=Y();return!Kn(r,e.CLAUDE_MEM_EXCLUDED_PROJECTS)}var Wu="claude";function v_(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function V(r){if(!r)return Wu;let e=v_(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e.includes("kimi")?"kimi":e==="pi-mono"?"pi":e==="agy"||e==="antigravity"||e.startsWith("antigravity-")?"antigravity-cli":e:Wu}var M_=new Set(["claude","codex","cursor","kimi","antigravity-cli","gemini","opencode","openclaw","omp","pi","qwen","windsurf"]);function wr(r){if(!r||r==="unknown")return"unknown";let e=V(r);return M_.has(e)?e:"other"}function ls(r){if(r==="TodoWrite"||r==="SetTodoList"||r==="update_plan"||r==="functions.update_plan")return"native_todo";let e=r.replace(/^mcp__[^_].*?__/,"");return e==="work_state_write"?"write":e==="work_state_read"?"read":null}function Bo(r,e){if(typeof e=="string"){if(e.length<=32768&&e.trimStart().startsWith("{"))try{return Bo(r,JSON.parse(e))}catch{}return Hu(r,e.slice(0,1500),!1)}if(!e||typeof e!="object")return"unknown";let t=e,n=typeof t.error=="string"?t.error.slice(0,1500):Array.isArray(t.content)?t.content.slice(0,5).filter(s=>s&&s.type==="text"&&typeof s.text=="string").map(s=>s.text.slice(0,300)).join(`