claude-mem 13.41.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.qoder-plugin/plugin.json +1 -1
  5. package/README.md +3 -2
  6. package/dist/bug-report/index.js +74 -74
  7. package/dist/npx-cli/index.js +146 -146
  8. package/dsh/package.json +1 -1
  9. package/openclaw/openclaw.plugin.json +1 -1
  10. package/package.json +1 -1
  11. package/plugin/.claude-plugin/plugin.json +1 -1
  12. package/plugin/.codex-plugin/plugin.json +1 -1
  13. package/plugin/.qoder-plugin/plugin.json +1 -1
  14. package/plugin/package.json +1 -1
  15. package/plugin/scripts/mcp-server.cjs +59 -59
  16. package/plugin/scripts/mcp-server.cjs.map +1 -1
  17. package/plugin/scripts/server-service.cjs +3 -3
  18. package/plugin/scripts/server-service.cjs.map +1 -1
  19. package/plugin/scripts/transcript-watcher.cjs +16 -16
  20. package/plugin/scripts/transcript-watcher.cjs.map +2 -2
  21. package/plugin/scripts/worker-service.cjs +724 -703
  22. package/plugin/scripts/worker-service.cjs.map +3 -3
  23. package/plugin/ui/viewer-bundle.js +4 -4
  24. package/plugin/ui/viewer.html +12 -0
  25. package/plugin/ui/work-view/app.js +278 -0
  26. package/plugin/ui/work-view/assets/agents/SOURCE-MANIFEST.json +42 -0
  27. package/plugin/ui/work-view/assets/agents/chatgpt.svg +2 -0
  28. package/plugin/ui/work-view/assets/agents/claude.svg +3 -0
  29. package/plugin/ui/work-view/assets/agents/gemini.svg +1 -0
  30. package/plugin/ui/work-view/assets/agents/hermes.svg +7 -0
  31. package/plugin/ui/work-view/assets/cmem-mark.svg +197 -0
  32. package/plugin/ui/work-view/assets/connect.png +0 -0
  33. package/plugin/ui/work-view/assets/fonts/HankenGrotesk-OFL.txt +94 -0
  34. package/plugin/ui/work-view/assets/fonts/HankenGrotesk.ttf +0 -0
  35. package/plugin/ui/work-view/assets/fonts/SpaceGrotesk-OFL.txt +93 -0
  36. package/plugin/ui/work-view/assets/fonts/SpaceGrotesk.ttf +0 -0
  37. package/plugin/ui/work-view/assets/icons/LICENSE +43 -0
  38. package/plugin/ui/work-view/assets/icons/arrow-left.svg +14 -0
  39. package/plugin/ui/work-view/assets/icons/chevron-down.svg +13 -0
  40. package/plugin/ui/work-view/assets/icons/filter.svg +13 -0
  41. package/plugin/ui/work-view/assets/icons/search.svg +14 -0
  42. package/plugin/ui/work-view/assets/icons/x.svg +14 -0
  43. package/plugin/ui/work-view/index.html +83 -0
  44. package/plugin/ui/work-view/live-status.js +77 -0
  45. package/plugin/ui/work-view/presentation.js +92 -0
  46. package/plugin/ui/work-view/request-views.js +133 -0
  47. package/plugin/ui/work-view/styles.css +767 -0
  48. package/plugin/ui/work-view/team-styles.css +114 -0
  49. package/plugin/ui/work-view/team-view.js +225 -0
  50. package/plugin/ui/work-view/view-model.js +228 -0
@@ -64,9 +64,9 @@ ${s.stack}`:` ${s.message}`:this.getLevel()===0&&typeof s=="object"?u=`
64
64
  `)}catch(f){let m=f instanceof Error?f:new Error(String(f));Eo(`[LOGGER] Failed to write to log file: ${m.message}
65
65
  ${m.stack??""}
66
66
  `)}else Eo(d+`
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(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(`
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_="13.41.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.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
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="13.41.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.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(`
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