claude-mem 13.24.13 → 13.24.14

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem",
3
- "version": "13.24.13",
3
+ "version": "13.24.14",
4
4
  "description": "Memory compression system for Claude Code - persist context across sessions",
5
5
  "author": {
6
6
  "name": "Alex Newman",
package/README.md CHANGED
@@ -69,7 +69,7 @@
69
69
  <img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License">
70
70
  </a>
71
71
  <a href="package.json">
72
- <img src="https://img.shields.io/badge/version-13.24.13-green.svg" alt="Version">
72
+ <img src="https://img.shields.io/badge/version-13.24.14-green.svg" alt="Version">
73
73
  </a>
74
74
  <a href="package.json">
75
75
  <img src="https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg" alt="Node">
@@ -100,7 +100,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
100
100
  ${m.stack??""}
101
101
  `)}else jn(f+`
102
102
  `)}debug(e,r,i,n){this.log(0,e,r,i,n)}info(e,r,i,n){this.log(1,e,r,i,n)}warn(e,r,i,n){this.log(2,e,r,i,n)}setErrorSink(e){KS=e}error(e,r,i,n){this.log(3,e,r,i,n),this.routeErrorToSink(r,i,n)}routeErrorToSink(e,r,i){try{if(!KS||!(i instanceof Error))return;KS(i)}catch{}}dataIn(e,r,i,n){this.info(e,`\u2192 ${r}`,i,n)}dataOut(e,r,i,n){this.info(e,`\u2190 ${r}`,i,n)}success(e,r,i,n){this.info(e,`\u2713 ${r}`,i,n)}failure(e,r,i,n){this.error(e,`\u2717 ${r}`,i,n)}},w=new jS});import{join as kP}from"path";import{mkdirSync as b8,writeFileSync as v8}from"fs";import{randomUUID as S8}from"crypto";function E8(t){let e=t.DO_NOT_TRACK;return e===void 0||e===""?!1:e!=="0"&&e!=="false"}function NS(t,e){if(E8(t))return{enabled:!1,source:"DO_NOT_TRACK"};let r=t.CLAUDE_MEM_TELEMETRY?.toLowerCase();return r==="0"||r==="false"||r==="off"?{enabled:!1,source:"env"}:r==="1"||r==="true"||r==="on"?{enabled:!0,source:"env"}:e?.enabled===!0?{enabled:!0,source:"config"}:e?.enabled===!1?{enabled:!1,source:"config"}:{enabled:!0,source:"default"}}function xP(t,e){return NS(t,e).enabled}function Yc(){return kP(Nn(),IP)}function uo(){let t;try{t=lr(Yc(),null)}catch(e){let r=e instanceof Error?e:new Error(String(e));return w.warn("SYSTEM","Telemetry: corrupt telemetry.json; treating as no recorded consent",void 0,r),null}return!t||typeof t!="object"||typeof t.installId!="string"||t.enabled!==void 0&&typeof t.enabled!="boolean"?null:{enabled:t.enabled,installId:t.installId,decidedAt:typeof t.decidedAt=="string"?t.decidedAt:""}}function Da(t){let e=Nn();b8(e,{recursive:!0}),v8(kP(e,IP),JSON.stringify(t,null,2)+`
103
- `)}function Hp(){let t=uo();if(t?.installId)return t.installId;let e=S8();return Da({installId:e,decidedAt:""}),e}var IP,Zp=E(()=>{"use strict";He();os();De();IP="telemetry.json"});function _8(t,e){if(!(!t||typeof t!="object"))for(let r of Object.keys(t)){if(!w8.has(r))continue;let i=t[r];typeof i=="string"?e[r]=i.length>TP?i.slice(0,TP):i:(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean")&&(e[r]=i)}}function CP(t){let e={};try{_8(t,e)}catch{}return e}var w8,TP,AP=E(()=>{"use strict";w8=new Set(["version","os","os_version","is_wsl","arch","runtime","runtime_version","node_version","duration_ms","outcome","error_category","locale","is_ci","endpoint","ide","provider","runtime_mode","trigger","count","has_summary","is_update","stage","install_method","interactive","bun_version","uv_version","claude_code_version","trial_days","trial_variant","offer_surface","funnel_source","observation_count","session_count","timeline_depth_days","has_session_summary","obs_type_bugfix","obs_type_discovery","obs_type_decision","obs_type_refactor","obs_type_other","tokens_injected","tokens_saved_vs_naive","mode","search_strategy","observation_type","hook","compression_ms","tokens_input","tokens_output","compression_ratio","model","cost_usd","endpoint_class","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs","result_count","chroma_available","fallback_reason","invalid_output_class","consecutive_invalid_outputs","respawn_triggered","abort_reason","previous_shutdown","previous_uptime_seconds","uptime_seconds","shutdown_reason","process_rss_mb","heap_used_mb","hook_type","error_mode","consecutive_failures","threshold_tripped","limit_window","overage_status","is_using_overage","resets_in_minutes","discovery_tokens","read_tokens","summary_count","prompt_count","project_count","backfilled","first_active_date","session_completed_count","session_failed_count","sessions_claude_count","sessions_codex_count","sessions_gemini_count","sessions_other_platform_count","subagent_obs_count","total_tokens_input","total_tokens_output","total_cost_usd","avg_duration_ms","avg_compression_ms","outcomes_ok","outcomes_error","outcomes_aborted","outcomes_invalid_output","top_model","observed_model","observed_billing","window_start_ts","rollup_reason","window_seq","total_tokens","avg_tokens","skill_id","skill_source","skill_trigger","observations_created","total_observations_injected","total_tokens_saved_vs_naive"]),TP=200});import OP from"os";function RP(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||I8}function DP(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||x8}function PP(t){let e={};for(let r of T8)t[r]!==void 0&&(e[r]=t[r]);return e}function C8(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||OP.release().toLowerCase().includes("microsoft")}catch(t){let e=t instanceof Error?t:new Error(String(t));return w.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function KP(){return{version:k8,os:process.platform,os_version:OP.release(),is_wsl:C8(),arch:process.arch,runtime:process.versions.bun?"bun":"node",runtime_version:process.versions.bun??process.versions.node,node_version:process.versions.node,is_ci:!!process.env.CI,locale:Intl.DateTimeFormat().resolvedOptions().locale}}var k8,I8,x8,T8,MP=E(()=>{"use strict";De();k8="13.24.13",I8="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",x8="https://us.i.posthog.com";T8=["version","os","os_version","is_wsl","arch","runtime","locale","ide","provider","runtime_mode","install_method","claude_code_version","first_active_date","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs"]});async function ri(t,e,r){try{if(!xP(process.env,uo()))return;let i=CP({...KP(),...e??{}});if(r?.person?i.$set=PP(i):i.$process_person_profile=!1,process.env.CLAUDE_MEM_TELEMETRY_DEBUG==="1"){process.stderr.write("[telemetry] "+JSON.stringify({event:t,properties:i})+`
103
+ `)}function Hp(){let t=uo();if(t?.installId)return t.installId;let e=S8();return Da({installId:e,decidedAt:""}),e}var IP,Zp=E(()=>{"use strict";He();os();De();IP="telemetry.json"});function _8(t,e){if(!(!t||typeof t!="object"))for(let r of Object.keys(t)){if(!w8.has(r))continue;let i=t[r];typeof i=="string"?e[r]=i.length>TP?i.slice(0,TP):i:(typeof i=="number"&&Number.isFinite(i)||typeof i=="boolean")&&(e[r]=i)}}function CP(t){let e={};try{_8(t,e)}catch{}return e}var w8,TP,AP=E(()=>{"use strict";w8=new Set(["version","os","os_version","is_wsl","arch","runtime","runtime_version","node_version","duration_ms","outcome","error_category","locale","is_ci","endpoint","ide","provider","runtime_mode","trigger","count","has_summary","is_update","stage","install_method","interactive","bun_version","uv_version","claude_code_version","trial_days","trial_variant","offer_surface","funnel_source","observation_count","session_count","timeline_depth_days","has_session_summary","obs_type_bugfix","obs_type_discovery","obs_type_decision","obs_type_refactor","obs_type_other","tokens_injected","tokens_saved_vs_naive","mode","search_strategy","observation_type","hook","compression_ms","tokens_input","tokens_output","compression_ratio","model","cost_usd","endpoint_class","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs","result_count","chroma_available","fallback_reason","invalid_output_class","consecutive_invalid_outputs","respawn_triggered","abort_reason","previous_shutdown","previous_uptime_seconds","uptime_seconds","shutdown_reason","process_rss_mb","heap_used_mb","hook_type","error_mode","consecutive_failures","threshold_tripped","limit_window","overage_status","is_using_overage","resets_in_minutes","discovery_tokens","read_tokens","summary_count","prompt_count","project_count","backfilled","first_active_date","session_completed_count","session_failed_count","sessions_claude_count","sessions_codex_count","sessions_gemini_count","sessions_other_platform_count","subagent_obs_count","total_tokens_input","total_tokens_output","total_cost_usd","avg_duration_ms","avg_compression_ms","outcomes_ok","outcomes_error","outcomes_aborted","outcomes_invalid_output","top_model","observed_model","observed_billing","window_start_ts","rollup_reason","window_seq","total_tokens","avg_tokens","skill_id","skill_source","skill_trigger","observations_created","total_observations_injected","total_tokens_saved_vs_naive"]),TP=200});import OP from"os";function RP(){return process.env.CLAUDE_MEM_TELEMETRY_KEY||I8}function DP(){return process.env.CLAUDE_MEM_TELEMETRY_HOST||x8}function PP(t){let e={};for(let r of T8)t[r]!==void 0&&(e[r]=t[r]);return e}function C8(){if(process.platform!=="linux")return!1;try{return!!process.env.WSL_DISTRO_NAME||OP.release().toLowerCase().includes("microsoft")}catch(t){let e=t instanceof Error?t:new Error(String(t));return w.warn("SYSTEM","Telemetry: WSL detection failed; reporting is_wsl=false",void 0,e),!1}}function KP(){return{version:k8,os:process.platform,os_version:OP.release(),is_wsl:C8(),arch:process.arch,runtime:process.versions.bun?"bun":"node",runtime_version:process.versions.bun??process.versions.node,node_version:process.versions.node,is_ci:!!process.env.CI,locale:Intl.DateTimeFormat().resolvedOptions().locale}}var k8,I8,x8,T8,MP=E(()=>{"use strict";De();k8="13.24.14",I8="phc_BKJAeNbpj932N9qEiU6qhutZEiu6LLfRpXfTbLM9MLaG",x8="https://us.i.posthog.com";T8=["version","os","os_version","is_wsl","arch","runtime","locale","ide","provider","runtime_mode","install_method","claude_code_version","first_active_date","db_observation_count","db_session_count","db_summary_count","db_project_count","db_size_mb","install_age_days","obs_count_7d","obs_count_30d","days_since_last_obs"]});async function ri(t,e,r){try{if(!xP(process.env,uo()))return;let i=CP({...KP(),...e??{}});if(r?.person?i.$set=PP(i):i.$process_person_profile=!1,process.env.CLAUDE_MEM_TELEMETRY_DEBUG==="1"){process.stderr.write("[telemetry] "+JSON.stringify({event:t,properties:i})+`
104
104
  `);return}let n=RP(),o=new AbortController,s=setTimeout(()=>o.abort(),A8);try{await O8(n,t,i,o.signal)}finally{clearTimeout(s)}}catch{}}async function O8(t,e,r,i){await fetch(`${DP()}/capture/`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:t,event:e,distinct_id:Hp(),properties:r}),signal:i})}var A8,Yp=E(()=>{"use strict";Zp();AP();MP();A8=2e3});import{spawn as R8,spawnSync as jP}from"node:child_process";import{dirname as D8,extname as Xc,join as P8}from"node:path";function ni(t,e,r){return R8(t,e??[],{windowsHide:!0,...r})}function M8(t){return`"${t.replace(/"/g,'""')}"`}function US(t){if(process.platform!=="win32")return[];try{let e=jP("where",[t],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0});return e.status!==0||!e.stdout.trim()?[]:e.stdout.split(/\r?\n/).map(r=>r.trim()).filter(Boolean)}catch{return[]}}function L8(t,e){let r=t.find(n=>LS.has(Xc(n).toLowerCase()));if(r)return r;let i=t.find(n=>$S.has(Xc(n).toLowerCase()));if(i&&e){let n=e(i);if(n&&LS.has(Xc(n).toLowerCase()))return n}return i??t.find(n=>K8.has(Xc(n).toLowerCase()))??t[0]??null}function $8(t,e,r=N8){if(!/[\\/]volta[\\/]bin[\\/]/i.test(e))return null;try{let i=r(P8(D8(e),"volta.exe"),["which",t],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:j8,windowsHide:!0});return i.status!==0||!i.stdout.trim()?null:i.stdout.split(/\r?\n/).map(n=>n.trim()).find(Boolean)??null}catch{return null}}function Pa(t){return L8(US(t),e=>$8(t,e))}function Ka(t,e,r,i=process.platform){let n={...i==="win32"?{windowsHide:!0}:{},...r};if(i==="win32"&&$S.has(Xc(t).toLowerCase())){let o=[t,...e].map(M8).join(" ");return{command:process.env.ComSpec??"cmd.exe",args:["/d","/s","/c",`"${o}"`],options:{...n,windowsVerbatimArguments:!0}}}return{command:t,args:[...e],options:n}}var $S,LS,K8,j8,N8,ii=E(()=>{"use strict";$S=new Set([".cmd",".bat"]),LS=new Set([".exe",".com"]),K8=new Set([...LS,...$S]);j8=5e3,N8=(t,e,r)=>jP(t,e,r)});function Ma(t){return process.platform==="win32"?Math.round(t*Gr.WINDOWS_MULTIPLIER):t}var Gr,Xp=E(()=>{"use strict";Gr={HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5}});var $P={};Re($P,{SettingsDefaultsManager:()=>Ue});import{readFileSync as U8,existsSync as F8}from"fs";import{join as NP}from"path";import{homedir as LP,hostname as J8}from"os";var z8,Ue,Mr=E(()=>{"use strict";Xp();Kr();z8="security_alert",Ue=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_API_TIMEOUT_MS:String(Ma(Gr.API_REQUEST)),CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_DATA_DIR:NP(LP(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_CLAUDE_CONFIG_DIR:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:NP(LP(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database",CLAUDE_MEM_CHROMA_PREWARM_TIMEOUT_MS:"120000",CLAUDE_MEM_CHROMA_MAX_PENDING_MUTATIONS:"5000",CLAUDE_MEM_CLOUD_SYNC_TOKEN:"",CLAUDE_MEM_CLOUD_SYNC_USER_ID:"",CLAUDE_MEM_CLOUD_SYNC_HUB_URL:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME:J8(),CLAUDE_MEM_CLOUD_SYNC_WS:"true",CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE:"40",CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS:"90000",CLAUDE_MEM_TV_TOKEN:"",CLAUDE_MEM_PRO_TRIAL_EMAIL:"",CLAUDE_MEM_PRO_TRIAL_AT:"",CLAUDE_MEM_PRO_TRIAL_STATE:"",CLAUDE_MEM_PRO_TRIAL_ENDS_AT:"",CLAUDE_MEM_PRO_PLAN:"",CLAUDE_MEM_PRO_FALLBACK_AT:"",CLAUDE_MEM_PRO_MEMORY_KEY:"",CLAUDE_MEM_PRO_MEMORY_BASE_URL:"",CLAUDE_MEM_PRO_MEMORY_MODEL:"",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert,sensitive",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_AWARENESS_ENABLED:"true",CLAUDE_MEM_GROK_BOT_AWARENESS_AGENT_IDS:"521e962d-2ec3-4488-bfbc-54d5209ce118,95601360-61f7-4fd9-bb3a-2c976b2b85c0",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_CONCEPTS:"",CLAUDE_MEM_CCS_ALIGN_ENABLED:"true",CLAUDE_MEM_CCS_ALIGN_VIEWER_IDS:"ccs-align",CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS:"false",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:""};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return process.env[e]??this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static applyEnvOverrides(e){let r={...e};for(let i of Object.keys(this.DEFAULTS))process.env[i]!==void 0&&(r[i]=process.env[i]);return r}static loadFromFile(e,r=!0){try{if(!F8(e)){let c=this.getAllDefaults();try{dt(e,c),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(u){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,u instanceof Error?u.message:String(u))}return r?this.applyEnvOverrides(c):c}let i=U8(e,"utf-8"),n=Et(i),o=n,s=n.env&&typeof n.env=="object"&&!Array.isArray(n.env),a=s&&Object.keys(n).some(c=>c!=="env");if(s&&(o=n.env,!a))try{dt(e,o),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(c){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,c instanceof Error?c.message:String(c))}if(o.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===z8){o={...o,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{dt(e,a?{...n,env:o}:o),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(c){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,c instanceof Error?c.message:String(c))}}let l={...this.DEFAULTS};for(let c of Object.keys(this.DEFAULTS))o[c]!==void 0&&(l[c]=o[c]);return r?this.applyEnvOverrides(l):l}catch(i){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,i instanceof Error?i.message:String(i));let n=this.getAllDefaults();return r?this.applyEnvOverrides(n):n}}}});import{execFile as q8}from"child_process";import{promisify as G8}from"util";import{createHash as Vke}from"crypto";import{existsSync as Wke,readFileSync as Hke,writeFileSync as Zke,mkdirSync as Yke,unlinkSync as Xke}from"fs";import{userInfo as eIe}from"os";import{join as rIe}from"path";var sIe,UP=E(()=>{"use strict";He();Mr();De();sIe=G8(q8)});import{existsSync as FS,readFileSync as JP,writeFileSync as V8,mkdirSync as B8,chmodSync as FP}from"fs";import{parseEnv as W8}from"util";import{basename as hIe}from"path";function zP(){return process.env.CLAUDE_MEM_ENV_FILE??We.envFile()}function GP(t){return W8(t)}function H8(t){let e=["# claude-mem credentials","# This file stores keys and gateway settings for the claude-mem memory agent","# Edit this file or use claude-mem settings to configure",""];for(let[r,i]of Object.entries(t))if(i){let n=/[\s#=]/.test(i);e.push(`${r}=${n?`"${i}"`:i}`)}return e.join(`
105
105
  `)+`
106
106
  `}function VP(){let t=zP();if(!FS(t))return{};try{let e=JP(t,"utf-8"),r=GP(e),i={};for(let n of qP)r[n]&&(i[n]=r[n]);return i}catch(e){return w.warn("ENV","Failed to load .env file",{path:t},e instanceof Error?e:new Error(String(e))),{}}}function BP(t){let e=zP(),r={};try{FS(We.dataDir())||B8(We.dataDir(),{recursive:!0,mode:448}),FP(We.dataDir(),448),r=FS(e)?GP(JP(e,"utf-8")):{}}catch(n){let o=n instanceof Error?n:new Error(String(n));throw w.error("ENV","Failed to set up env directory or read existing env",{},o),o}let i={...r};for(let n of qP){let o=t[n];o!==void 0&&(o?i[n]=o:delete i[n])}try{V8(e,H8(i),{encoding:"utf-8",mode:384}),FP(e,384)}catch(n){throw w.error("ENV","Failed to save .env file",{path:e},n instanceof Error?n:new Error(String(n))),n}}var qP,WP=E(()=>{"use strict";De();He();Mr();UP();qP=["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","GEMINI_API_KEY","OPENROUTER_API_KEY"]});function Ln(t=process.env){let e={};for(let[r,i]of Object.entries(t))if(i!==void 0){if(Q8.has(r)){e[r]=i;continue}Y8.has(r)||Z8.some(n=>r.startsWith(n))||(e[r]=i)}return e}var Z8,Y8,X8,Q8,Qc=E(()=>{"use strict";Z8=["CLAUDECODE_","CLAUDE_CODE_"],Y8=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID"]),X8=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"]),Q8=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY","CLAUDE_CODE_SKIP_BEDROCK_AUTH","CLAUDE_CODE_SKIP_VERTEX_AUTH","CLAUDE_CODE_SKIP_FOUNDRY_AUTH","ANTHROPIC_BEDROCK_BASE_URL","AWS_REGION","AWS_PROFILE","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","ANTHROPIC_VERTEX_PROJECT_ID","CLOUD_ML_REGION","GOOGLE_APPLICATION_CREDENTIALS",...X8])});import{spawnSync as ZP}from"child_process";import{readFileSync as eX}from"fs";function rX(t){JS+=1;let e=ZP("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${t}").CreationDate.ToString('yyyyMMddHHmmss.ffffff')`],{encoding:"utf-8",timeout:5e3,windowsHide:!0,env:{...Ln(process.env),LC_ALL:"C",LANG:"C"}});if(e.status===0){let r=e.stdout.trim();return r.length>0?r:null}return null}function nX(t,e=!1){if(!e){let i=HP.get(t);if(i&&Date.now()-i.capturedAtMs<tX)return i.token}let r=null;try{r=rX(t)}catch(i){w.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:t,error:i instanceof Error?i.message:String(i)}),r=null}return HP.set(t,{token:r,capturedAtMs:Date.now()}),r}function YP(t,e){if(!Number.isInteger(t)||t<=0)return null;if(process.platform==="linux"){JS+=1;try{let r=eX(`/proc/${t}/stat`,"utf-8"),i=r.lastIndexOf(") ");if(i<0)return null;let o=r.slice(i+2).split(" ")[19];return o&&/^\d+$/.test(o)?o:null}catch(r){return w.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}if(process.platform==="win32")return nX(t,e);JS+=1;try{let r=ZP("ps",["-p",String(t),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...Ln(process.env),LC_ALL:"C",LANG:"C"}});if(r.status!==0)return null;let i=r.stdout.trim();return i.length>0?i:null}catch(r){return w.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}function po(t){return YP(t,!1)}function Ri(t,e){if(e===null)return!0;let r=YP(t,!0);return r===null?!0:r===e}var tX,HP,JS,zS=E(()=>{"use strict";De();Qc();tX=5e3,HP=new Map,JS=0});import{execFile as iX}from"child_process";import{readdirSync as oX,readFileSync as sX}from"fs";import{promisify as aX}from"util";async function $n(t,e={}){let r=e.signalMode==="immediate",i=e.expectedStartToken!==void 0?e.expectedStartToken:po(t),n=()=>Ri(t,i);if(!n()){w.warn("PROCESS","Skipping tree-kill: root PID was reused since it was captured",{pid:t});return}if(w.debug("PROCESS",`Killing process tree rooted at PID ${t}`,{immediate:r}),process.platform==="win32"){try{await qS("taskkill",["/PID",String(t),"/T","/F"],{timeout:5e3,windowsHide:!0})}catch(o){let s=o.code,a=String(o.stderr??""),l=o instanceof Error?o.message:String(o);if(s===lX||cX.test(`${a} ${l}`)){w.debug("PROCESS","taskkill reported the process was already gone",{pid:t});return}throw new Qp(t,`taskkill failed for PID ${t} (exit ${String(s)}): ${a.trim()||l}`,{cause:o})}return}try{let o=r?"SIGKILL":"SIGTERM",s=await ef(t);for(let c of s){if(!Ri(c.pid,c.startToken)){w.debug("PROCESS",`Skipping ${o}: descendant PID was reused since enumeration`,{pid:c.pid,rootPid:t});continue}try{process.kill(c.pid,o)}catch{}}if(n())try{process.kill(t,o)}catch(c){let u=c instanceof Error?c:new Error(String(c)),d=u.code;d!=="ESRCH"&&w.debug("PROCESS",`Failed to ${o} PID ${t}`,{code:d},u)}else w.warn("PROCESS","Skipping root signal: PID was reused during descendant enumeration",{pid:t,signal:o});r||await new Promise(c=>setTimeout(c,500));let a=n()?await ef(t):[],l=new Map;for(let c of s)l.set(c.pid,c.startToken);for(let c of a)l.set(c.pid,c.startToken);for(let[c,u]of l){if(!Ri(c,u)){w.debug("PROCESS","Skipping SIGKILL: descendant PID was reused since the scan",{pid:c,rootPid:t});continue}try{process.kill(c,"SIGKILL")}catch{}}if(!r&&n())try{process.kill(t,"SIGKILL")}catch{}}catch(o){throw new Qp(t,`tree-kill failed for PID ${t}: ${o instanceof Error?o.message:String(o)}`,{cause:o})}}async function uX(){return process.platform==="win32"?fX():process.platform==="linux"?dX():pX()}function dX(){let t=[],e;try{e=oX("/proc")}catch(r){return w.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 i;try{i=sX(`/proc/${r}/stat`,"utf-8")}catch{continue}let n=i.lastIndexOf(") ");if(n<0)continue;let o=i.slice(n+2).split(" "),s=Number.parseInt(o[1]??"",10),a=o[19];Number.isFinite(s)&&t.push({pid:Number.parseInt(r,10),ppid:s,startToken:a&&/^\d+$/.test(a)?a:null})}return t}async function pX(){let t;try{t=(await qS("ps",["-eo","pid=,ppid=,lstart="],{timeout:1e4,maxBuffer:33554432,env:{...process.env,LC_ALL:"C",LANG:"C"}})).stdout}catch(r){return w.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(`
@@ -3,7 +3,7 @@
3
3
  "name": "Claude-Mem (Persistent Memory)",
4
4
  "description": "OpenClaw plugin for Claude-Mem. Records observations from embedded runner sessions and streams them to messaging channels.",
5
5
  "kind": "memory",
6
- "version": "13.24.13",
6
+ "version": "13.24.14",
7
7
  "license": "Apache-2.0",
8
8
  "author": "thedotmack",
9
9
  "homepage": "https://claude-mem.ai",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem",
3
- "version": "13.24.13",
3
+ "version": "13.24.14",
4
4
  "description": "Memory compression system for Claude Code - persist context across sessions",
5
5
  "keywords": [
6
6
  "claude",
@@ -139,7 +139,7 @@
139
139
  "posthog-node": "^5.36.15",
140
140
  "react": "^19.2.6",
141
141
  "react-dom": "^19.2.6",
142
- "shell-quote": "^1.8.3",
142
+ "shell-quote": "1.9.0",
143
143
  "zod": "^4.4.3",
144
144
  "@derekstride/tree-sitter-sql": "^0.3.11",
145
145
  "@tree-sitter-grammars/tree-sitter-lua": "^0.4.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem",
3
- "version": "13.24.13",
3
+ "version": "13.24.14",
4
4
  "description": "Memory compression system for Claude Code - persist context across sessions",
5
5
  "author": {
6
6
  "name": "Alex Newman"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem",
3
- "version": "13.24.13",
3
+ "version": "13.24.14",
4
4
  "description": "Memory compression system for Claude Code - persist context across sessions",
5
5
  "author": {
6
6
  "name": "Alex Newman",
package/plugin/bun.lock CHANGED
@@ -11,7 +11,7 @@
11
11
  "@tree-sitter-grammars/tree-sitter-toml": "^0.7.0",
12
12
  "@tree-sitter-grammars/tree-sitter-yaml": "^0.7.1",
13
13
  "@tree-sitter-grammars/tree-sitter-zig": "^1.1.2",
14
- "shell-quote": "^1.8.3",
14
+ "shell-quote": "1.9.0",
15
15
  "tree-sitter-bash": "^0.25.1",
16
16
  "tree-sitter-c": "^0.24.1",
17
17
  "tree-sitter-cli": "^0.26.5",
@@ -61,7 +61,7 @@
61
61
 
62
62
  "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
63
63
 
64
- "shell-quote": ["shell-quote@1.8.4", "", {}, "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ=="],
64
+ "shell-quote": ["shell-quote@1.9.0", "", {}, "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA=="],
65
65
 
66
66
  "tree-sitter": ["tree-sitter@0.25.0", "", { "dependencies": { "node-addon-api": "^8.3.0", "node-gyp-build": "^4.8.4" } }, "sha512-PGZZzFW63eElZJDe/b/R/LbsjDDYJa5UEjLZJB59RQsMX+fo0j54fqBPn1MGKav/QNa0JR0zBiVaikYDWCj5KQ=="],
67
67
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem-plugin",
3
- "version": "13.24.13",
3
+ "version": "13.24.14",
4
4
  "private": true,
5
5
  "description": "Runtime dependencies for claude-mem bundled hooks",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  "@tree-sitter-grammars/tree-sitter-yaml": "^0.7.1",
31
31
  "@derekstride/tree-sitter-sql": "^0.3.11",
32
32
  "@tree-sitter-grammars/tree-sitter-markdown": "^0.3.2",
33
- "shell-quote": "^1.8.3"
33
+ "shell-quote": "1.9.0"
34
34
  },
35
35
  "overrides": {
36
36
  "tree-sitter": "^0.25.0"
@@ -219,7 +219,7 @@ ${f}`}let a=s.lineStart;for(let u=s.lineStart-1;u>=0;u--){let l=i[u].trim();if(l
219
219
  ${c}`}ne();var $I=new Set([".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".pyw",".go",".rs",".rb",".java",".cs",".cpp",".cc",".cxx",".c",".h",".hpp",".hh",".swift",".kt",".kts",".php",".vue",".svelte",".lua",".scala",".sc",".sh",".bash",".zsh",".hs",".zig",".css",".scss",".toml",".yml",".yaml",".sql",".md",".mdx"]),TI=new Set(["node_modules",".git","dist","build",".next","__pycache__",".venv","venv","env",".env","target","vendor",".cache",".turbo","coverage",".nyc_output",".claude",".smart-file-read"]),RI=512*1024;async function*ab(e,t,r=20){if(r<=0)return;let n;try{n=await(0,cn.readdir)(e,{withFileTypes:!0})}catch(o){_.debug("WORKER",`walkDir: failed to read directory ${e}`,void 0,o instanceof Error?o:void 0);return}for(let o of n){if(o.name.startsWith(".")&&o.name!=="."||TI.has(o.name))continue;let s=(0,Po.join)(e,o.name);if(o.isDirectory())yield*ab(s,t,r-1);else if(o.isFile()){let i=o.name.slice(o.name.lastIndexOf("."));$I.has(i)&&(yield s)}}}async function OI(e){try{let t=await(0,cn.stat)(e);if(t.size>RI||t.size===0)return null;let r=await(0,cn.readFile)(e,"utf-8");return r.slice(0,1e3).includes("\0")?null:r}catch(t){return _.debug("WORKER",`safeReadFile: failed to read ${e}`,void 0,t instanceof Error?t:void 0),null}}async function cb(e,t,r={}){let n=r.maxResults||20,o=t.toLowerCase(),s=o.split(/[\s_\-./]+/).filter(h=>h.length>0),i=[];for await(let h of ab(e,e,20)){if(r.filePattern&&!(0,Po.relative)(e,h).toLowerCase().includes(r.filePattern.toLowerCase()))continue;let g=await OI(h);g&&i.push({absolutePath:h,relativePath:(0,Po.relative)(e,h),content:g})}let a=ob(i),c=[],u=[],l=0;for(let[h,g]of a){l+=II(g);let E=Wi(h.toLowerCase(),s)>0,v=[],I=(x,z)=>{for(let j of x){let Ve=0,Pe="",Be=Wi(j.name.toLowerCase(),s);Be>0&&(Ve+=Be*3,Pe="name match"),j.signature.toLowerCase().includes(o)&&(Ve+=2,Pe=Pe?`${Pe} + signature`:"signature match"),j.jsdoc&&j.jsdoc.toLowerCase().includes(o)&&(Ve+=1,Pe=Pe?`${Pe} + jsdoc`:"jsdoc match"),Ve>0&&(E=!0,v.push({filePath:h,symbolName:z?`${z}.${j.name}`:j.name,kind:j.kind,signature:j.signature,jsdoc:j.jsdoc,lineStart:j.lineStart,lineEnd:j.lineEnd,matchReason:Pe})),j.children&&I(j.children,j.name)}};I(g.symbols),E&&(c.push(g),u.push(...v))}u.sort((h,g)=>{let y=Wi(h.symbolName.toLowerCase(),s);return Wi(g.symbolName.toLowerCase(),s)-y});let d=u.slice(0,n),p=new Set(d.map(h=>h.filePath)),f=c.filter(h=>p.has(h.filePath)).slice(0,n),m=f.reduce((h,g)=>h+g.foldedTokenEstimate,0);return{foldedFiles:f,matchingSymbols:d,totalFilesScanned:i.length,totalSymbolsFound:l,tokenEstimate:m}}function Wi(e,t){let r=0;for(let n of t)if(e===n)r+=10;else if(e.includes(n))r+=5;else{let o=0,s=0;for(let i of n){let a=e.indexOf(i,o);a!==-1&&(s++,o=a+1)}s===n.length&&(r+=1)}return r}function II(e){let t=e.symbols.length;for(let r of e.symbols)r.children&&(t+=r.children.length);return t}function ub(e,t){let r=[];if(r.push(`\u{1F50D} Smart Search: "${t}"`),r.push(` Scanned ${e.totalFilesScanned} files, found ${e.totalSymbolsFound} symbols`),r.push(` ${e.matchingSymbols.length} matches across ${e.foldedFiles.length} files (~${e.tokenEstimate} tokens for folded view)`),r.push(""),e.matchingSymbols.length===0)return r.push(" No matching symbols found."),r.join(`
220
220
  `);r.push("\u2500\u2500 Matching Symbols \u2500\u2500"),r.push("");for(let n of e.matchingSymbols){if(r.push(` ${n.kind} ${n.symbolName} (${n.filePath}:${n.lineStart+1})`),r.push(` ${n.signature}`),n.jsdoc){let o=n.jsdoc.split(`
221
221
  `).find(s=>s.replace(/^[\s*/]+/,"").trim().length>0);o&&r.push(` \u{1F4AC} ${o.replace(/^[\s*/]+/,"").trim()}`)}r.push("")}r.push("\u2500\u2500 Folded File Views \u2500\u2500"),r.push("");for(let n of e.foldedFiles)r.push(an(n)),r.push("");return r.push("\u2500\u2500 Actions \u2500\u2500"),r.push(" To see full implementation: use smart_unfold with file path and symbol name"),r.join(`
222
- `)}var nd=require("node:fs/promises"),od=require("node:os"),kr=require("node:path");function AI(e){return e==="~"?(0,od.homedir)():e.startsWith("~/")||e.startsWith("~\\")?(0,kr.join)((0,od.homedir)(),e.slice(2)):e}async function Vi(e,t=process.cwd()){if(typeof e!="string"||e.trim().length===0)throw new Error("file_path is required");let r=await(0,nd.realpath)((0,kr.resolve)(t)),n=(0,kr.resolve)(r,AI(e.trim())),o;try{o=await(0,nd.realpath)(n)}catch{o=n}if(o!==r&&!o.startsWith(r+kr.sep))throw new Error(`Access denied: "${e}" resolves outside the workspace (${r}). MCP file tools can only read files within the current project.`);return o}var id=require("node:fs/promises"),Yi=require("node:fs"),rr=require("node:path"),gb=require("node:os"),_b=require("node:url");var lb="claude";function CI(e){return e.trim().toLowerCase().replace(/\s+/g,"-")}function Bi(e){if(!e)return lb;let t=CI(e);return t?t==="transcript"||t.includes("codex")?"codex":t.includes("cursor")?"cursor":t.includes("claude")?"claude":t:lb}var MI=er(Oe.API_REQUEST),st=class extends Error{kind;status;cause;constructor(t,r,n={}){super(r),this.name="ServerClientError",this.kind=t,this.status=n.status??null,this.cause=n.cause}isFallbackEligible(){return this.kind==="transport"||this.kind==="timeout"||this.kind==="missing_api_key"||this.kind==="http_error"&&(this.status!==null&&this.status>=500||this.status===429)}},Ki=class{baseUrl;apiKey;timeoutMs;constructor(t){this.baseUrl=zI(t.serverBaseUrl),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??MI}async startSession(t){let r=this.buildStartSessionPayload(t);return this.request("POST","/v1/sessions/start",r)}async recordEvent(t){let r=this.buildEventPayload(t),n=t.generate===!1?"/v1/events?generate=false":"/v1/events";return this.request("POST",n,r)}async endSession(t){if(!t.sessionId)throw new st("invalid_response","sessionId is required for endSession");return this.request("POST",`/v1/sessions/${encodeURIComponent(t.sessionId)}/end`,{})}async addObservation(t){return this.request("POST","/v1/memories",this.buildAddObservationPayload(t))}async searchObservations(t){return this.request("POST","/v1/search",this.buildSearchPayload(t))}async contextObservations(t){return this.request("POST","/v1/context",this.buildSearchPayload(t))}async getJobStatus(t){if(!t)throw new st("invalid_response","jobId is required for getJobStatus");return this.request("GET",`/v1/jobs/${encodeURIComponent(t)}`)}buildAddObservationPayload(t){let r=t.content,n=t.kind??"manual",o=typeof t.metadata?.title=="string"?t.metadata.title:void 0;return{projectId:t.projectId,kind:n,type:n,narrative:r,...o?{title:o}:{},...t.serverSessionId!==void 0?{serverSessionId:t.serverSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.platformSource!==void 0?{platformSource:t.platformSource}:{},...t.metadata!==void 0?{metadata:t.metadata}:{}}}buildSearchPayload(t){return{projectId:t.projectId,query:t.query,...t.limit!==void 0?{limit:t.limit}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{}}}buildStartSessionPayload(t){return{projectId:t.projectId,...t.externalSessionId!==void 0?{externalSessionId:t.externalSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.agentId!==void 0?{agentId:t.agentId}:{},...t.agentType!==void 0?{agentType:t.agentType}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{},...t.metadata!==void 0?{metadata:t.metadata}:{}}}buildEventPayload(t){return{projectId:t.projectId,sourceType:t.sourceType,eventType:t.eventType,occurredAtEpoch:t.occurredAtEpoch,...t.serverSessionId!==void 0?{serverSessionId:t.serverSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.memorySessionId!==void 0?{memorySessionId:t.memorySessionId}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{},...t.payload!==void 0?{payload:t.payload}:{}}}async request(t,r,n){if(!this.apiKey||!this.apiKey.trim())throw new st("missing_api_key","Server API key is not configured (CLAUDE_MEM_SERVER_API_KEY).");let o=`${this.baseUrl}${r}`,s={method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}};n!==void 0&&(s.body=JSON.stringify(n));let i;try{i=await Wl(o,s,this.timeoutMs)}catch(c){let u=c instanceof Error?c.message:String(c),l=/timed out|timeout/i.test(u);throw new st(l?"timeout":"transport",`Server ${t} ${r} failed: ${u}`,{cause:c})}if(!i.ok){let c=await i.text().catch(()=>"");throw new st("http_error",`Server ${t} ${r} returned ${i.status}: ${DI(c,200)}`,{status:i.status})}let a=await i.text();if(!a||a.length===0)return{};try{return JSON.parse(a)}catch(c){let u=c instanceof Error?c:new Error(String(c));throw new st("invalid_response",`Server ${t} ${r} returned non-JSON response`,{cause:u})}}};function db(e){return e instanceof st}function zI(e){return e.replace(/\/+$/,"")}function sd(e){return typeof e=="string"?Bi(e):null}function DI(e,t){return e.length<=t?e:`${e.slice(0,t)}\u2026`}ne();function Gi(){let t=(Ti().CLAUDE_MEM_RUNTIME??"worker").trim().toLowerCase();return t==="server"||t==="server-beta"?"server":"worker"}function fb(){let e=Ti(),t=(...i)=>{for(let a of i){let c=(a??"").trim();if(c.length>0)return c}return""},r=t(e.CLAUDE_MEM_SERVER_URL,e.CLAUDE_MEM_SERVER_BETA_URL),n=t(e.CLAUDE_MEM_SERVER_API_KEY,e.CLAUDE_MEM_SERVER_BETA_API_KEY),o=t(e.CLAUDE_MEM_SERVER_PROJECT_ID,e.CLAUDE_MEM_SERVER_BETA_PROJECT_ID);if(!r)return _.warn("HOOK","[server-fallback] reason=missing_base_url"),null;if(!n)return _.warn("HOOK","[server-fallback] reason=missing_api_key"),null;if(!o)return _.warn("HOOK","[server-fallback] reason=missing_project_id"),null;let s={serverBaseUrl:r,apiKey:n};return{runtime:"server",client:new Ki(s),projectId:o,serverBaseUrl:r}}ne();var pb=["observation_add","observation_record_event","observation_search","observation_context","observation_generation_status","memory_add","memory_search","memory_context"],NI=new Set(pb);function mb(e,t){return t==="server"?[...e]:(_.debug("SYSTEM","Filtering server-beta-only MCP tools from worker runtime advertisement",{runtime:t,hiddenToolCount:pb.length}),e.filter(r=>!NI.has(r.name)))}var nA={},LI="13.24.13";console.log=(...e)=>{_.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:e})};var yb=!1,Sb=(()=>{if(typeof __dirname<"u")return __dirname;try{return(0,rr.dirname)((0,_b.fileURLToPath)(nA.url))}catch(e){return yb=!0,_.warn("SYSTEM","mcp-server: failed to resolve module directory from import.meta.url, falling back to process.cwd()",void 0,e instanceof Error?e:new Error(String(e))),process.cwd()}})(),ad=jS()??(0,rr.resolve)(Sb,"worker-service.cjs");function jI(){yb&&((0,Yi.existsSync)(ad)||_.error("SYSTEM","mcp-server: dirname resolution failed (both __dirname and import.meta.url are unavailable). Fell back to process.cwd() and the resolved WORKER_SCRIPT_PATH does not exist. This is the actual problem \u2014 the worker bundle is fine, but mcp-server cannot locate it. Worker auto-start will fail until the dirname-resolution path is fixed.",{workerScriptPath:ad,mcpServerDir:Sb}))}async function _t(e,t={}){_.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:e});try{let r;if(t.body)r=await Fi(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.body)});else{let n=new URLSearchParams;for(let[o,s]of Object.entries(t.query??{}))s!=null&&n.append(o,String(s));r=await Fi(`${e}?${n}`)}if(!r.ok){let n=await r.text();throw new Error(`Worker API error (${r.status}): ${n}`)}return _.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:e}),t.text?{content:[{type:"text",text:await r.text()}]}:t.body?{content:[{type:"text",text:JSON.stringify(await r.json(),null,2)}]}:await r.json()}catch(r){return _.error("SYSTEM","\u2190 Worker API error",{endpoint:e},r instanceof Error?r:new Error(String(r))),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function UI(){try{return(await Fi("/api/health")).ok}catch(e){return _.debug("SYSTEM","Worker health check failed",{},e instanceof Error?e:new Error(String(e))),!1}}function bb(){if(Gi()!=="server")return null;let t=fb();return t?{...t,available:!0}:{runtime:"server",available:!1,reason:"server runtime is selected but configuration is incomplete (missing url, api key, or project id)"}}function FI(e){return db(e)?{content:[{type:"text",text:`Server error (${e.kind}${e.status?` ${e.status}`:""}): ${e.message}`}],isError:!0}:{content:[{type:"text",text:`Tool error: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}function un(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function To(e){let t=bb();if(!t)throw new st("transport",`${e} requires CLAUDE_MEM_RUNTIME=server. Current runtime is "worker"; use the existing search/timeline/get_observations tools for worker-mode memory access.`);if(!t.available)throw new st("missing_api_key",`${e}: ${t.reason}`);return t}function Ro(e,t){return async r=>{try{return await t(r)}catch(n){let o=n instanceof Error?n:new Error(String(n));return _.warn("SYSTEM",`${e} failed`,void 0,o),FI(n)}}}var qI=Ro("observation_add",async e=>{let t=To("observation_add");if(typeof e?.content!="string"||e.content.trim().length===0)throw new Error('observation_add: "content" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,content:e.content,...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.platformSource!==void 0?{platformSource:e.platformSource}:{},...e.kind!==void 0?{kind:e.kind}:{},...e.metadata!==void 0?{metadata:e.metadata}:{}},o=await t.client.addObservation(n);return un(o)});function Xi(e){return typeof e=="string"?Bi(e):null}var ZI=Ro("observation_record_event",async e=>{let t=To("observation_record_event");if(typeof e?.eventType!="string"||e.eventType.trim().length===0)throw new Error('observation_record_event: "eventType" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,sourceType:e.sourceType??"api",eventType:e.eventType,occurredAtEpoch:typeof e.occurredAtEpoch=="number"?e.occurredAtEpoch:Date.now(),...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.memorySessionId!==void 0?{memorySessionId:e.memorySessionId}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{},...e.payload!==void 0?{payload:e.payload}:{},...e.generate!==void 0?{generate:e.generate}:{}},o=await t.client.recordEvent(n);return un(o)}),HI=Ro("observation_search",async e=>{let t=To("observation_search");if(typeof e?.query!="string"||e.query.trim().length===0)throw new Error('observation_search: "query" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,query:e.query,...e.limit!==void 0?{limit:e.limit}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{}},o=await t.client.searchObservations(n);return un(o)}),WI=Ro("observation_context",async e=>{let t=To("observation_context");if(typeof e?.query!="string"||e.query.trim().length===0)throw new Error('observation_context: "query" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,query:e.query,...e.limit!==void 0?{limit:e.limit}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{}},o=await t.client.contextObservations(n);return un(o)});function VI(e){return Array.isArray(e.projects)?e.projects.map(t=>typeof t=="string"?t.trim():"").filter(Boolean):typeof e.projects=="string"?e.projects.split(",").map(t=>t.trim()).filter(Boolean):typeof e.project=="string"&&e.project.trim().length>0?[e.project.trim()]:[]}async function BI(e){let t=VI(e);return t.length===0?{content:[{type:"text",text:'session_start_context: "project" or "projects" is required'}],isError:!0}:_t("/api/context/inject",{query:{projects:t.join(","),...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{},...e.full!==void 0?{full:e.full}:{},...e.colors!==void 0?{colors:e.colors}:{}},text:!0})}var KI=Ro("observation_generation_status",async e=>{let t=To("observation_generation_status"),r=(e?.jobId??e?.job_id??"").trim();if(!r)throw new Error('observation_generation_status: "jobId" is required');let n=await t.client.getJobStatus(r);return un(n)});async function GI(){if(await UI())return!0;_.warn("SYSTEM","Worker not available, attempting auto-start for MCP client"),jI();try{let e=Bl(),t=await WS(e,ad);return t==="dead"&&_.error("SYSTEM","Worker auto-start failed \u2014 MCP tools that require the worker (search, timeline, get_observations) will fail until the worker is running. Check earlier log lines for the specific failure reason (Bun not found, missing worker bundle, port conflict, etc.)."),t!=="dead"}catch(e){return _.error("SYSTEM","Worker auto-start threw \u2014 MCP tools that require the worker (search, timeline, get_observations) will fail until the worker is running.",void 0,e instanceof Error?e:new Error(String(e))),!1}}var Eb=[{name:"important_workflow",description:`LAYERED WORKFLOW (ALWAYS FOLLOW):
222
+ `)}var nd=require("node:fs/promises"),od=require("node:os"),kr=require("node:path");function AI(e){return e==="~"?(0,od.homedir)():e.startsWith("~/")||e.startsWith("~\\")?(0,kr.join)((0,od.homedir)(),e.slice(2)):e}async function Vi(e,t=process.cwd()){if(typeof e!="string"||e.trim().length===0)throw new Error("file_path is required");let r=await(0,nd.realpath)((0,kr.resolve)(t)),n=(0,kr.resolve)(r,AI(e.trim())),o;try{o=await(0,nd.realpath)(n)}catch{o=n}if(o!==r&&!o.startsWith(r+kr.sep))throw new Error(`Access denied: "${e}" resolves outside the workspace (${r}). MCP file tools can only read files within the current project.`);return o}var id=require("node:fs/promises"),Yi=require("node:fs"),rr=require("node:path"),gb=require("node:os"),_b=require("node:url");var lb="claude";function CI(e){return e.trim().toLowerCase().replace(/\s+/g,"-")}function Bi(e){if(!e)return lb;let t=CI(e);return t?t==="transcript"||t.includes("codex")?"codex":t.includes("cursor")?"cursor":t.includes("claude")?"claude":t:lb}var MI=er(Oe.API_REQUEST),st=class extends Error{kind;status;cause;constructor(t,r,n={}){super(r),this.name="ServerClientError",this.kind=t,this.status=n.status??null,this.cause=n.cause}isFallbackEligible(){return this.kind==="transport"||this.kind==="timeout"||this.kind==="missing_api_key"||this.kind==="http_error"&&(this.status!==null&&this.status>=500||this.status===429)}},Ki=class{baseUrl;apiKey;timeoutMs;constructor(t){this.baseUrl=zI(t.serverBaseUrl),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??MI}async startSession(t){let r=this.buildStartSessionPayload(t);return this.request("POST","/v1/sessions/start",r)}async recordEvent(t){let r=this.buildEventPayload(t),n=t.generate===!1?"/v1/events?generate=false":"/v1/events";return this.request("POST",n,r)}async endSession(t){if(!t.sessionId)throw new st("invalid_response","sessionId is required for endSession");return this.request("POST",`/v1/sessions/${encodeURIComponent(t.sessionId)}/end`,{})}async addObservation(t){return this.request("POST","/v1/memories",this.buildAddObservationPayload(t))}async searchObservations(t){return this.request("POST","/v1/search",this.buildSearchPayload(t))}async contextObservations(t){return this.request("POST","/v1/context",this.buildSearchPayload(t))}async getJobStatus(t){if(!t)throw new st("invalid_response","jobId is required for getJobStatus");return this.request("GET",`/v1/jobs/${encodeURIComponent(t)}`)}buildAddObservationPayload(t){let r=t.content,n=t.kind??"manual",o=typeof t.metadata?.title=="string"?t.metadata.title:void 0;return{projectId:t.projectId,kind:n,type:n,narrative:r,...o?{title:o}:{},...t.serverSessionId!==void 0?{serverSessionId:t.serverSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.platformSource!==void 0?{platformSource:t.platformSource}:{},...t.metadata!==void 0?{metadata:t.metadata}:{}}}buildSearchPayload(t){return{projectId:t.projectId,query:t.query,...t.limit!==void 0?{limit:t.limit}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{}}}buildStartSessionPayload(t){return{projectId:t.projectId,...t.externalSessionId!==void 0?{externalSessionId:t.externalSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.agentId!==void 0?{agentId:t.agentId}:{},...t.agentType!==void 0?{agentType:t.agentType}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{},...t.metadata!==void 0?{metadata:t.metadata}:{}}}buildEventPayload(t){return{projectId:t.projectId,sourceType:t.sourceType,eventType:t.eventType,occurredAtEpoch:t.occurredAtEpoch,...t.serverSessionId!==void 0?{serverSessionId:t.serverSessionId}:{},...t.contentSessionId!==void 0?{contentSessionId:t.contentSessionId}:{},...t.memorySessionId!==void 0?{memorySessionId:t.memorySessionId}:{},...t.platformSource!==void 0?{platformSource:sd(t.platformSource)}:{},...t.payload!==void 0?{payload:t.payload}:{}}}async request(t,r,n){if(!this.apiKey||!this.apiKey.trim())throw new st("missing_api_key","Server API key is not configured (CLAUDE_MEM_SERVER_API_KEY).");let o=`${this.baseUrl}${r}`,s={method:t,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`}};n!==void 0&&(s.body=JSON.stringify(n));let i;try{i=await Wl(o,s,this.timeoutMs)}catch(c){let u=c instanceof Error?c.message:String(c),l=/timed out|timeout/i.test(u);throw new st(l?"timeout":"transport",`Server ${t} ${r} failed: ${u}`,{cause:c})}if(!i.ok){let c=await i.text().catch(()=>"");throw new st("http_error",`Server ${t} ${r} returned ${i.status}: ${DI(c,200)}`,{status:i.status})}let a=await i.text();if(!a||a.length===0)return{};try{return JSON.parse(a)}catch(c){let u=c instanceof Error?c:new Error(String(c));throw new st("invalid_response",`Server ${t} ${r} returned non-JSON response`,{cause:u})}}};function db(e){return e instanceof st}function zI(e){return e.replace(/\/+$/,"")}function sd(e){return typeof e=="string"?Bi(e):null}function DI(e,t){return e.length<=t?e:`${e.slice(0,t)}\u2026`}ne();function Gi(){let t=(Ti().CLAUDE_MEM_RUNTIME??"worker").trim().toLowerCase();return t==="server"||t==="server-beta"?"server":"worker"}function fb(){let e=Ti(),t=(...i)=>{for(let a of i){let c=(a??"").trim();if(c.length>0)return c}return""},r=t(e.CLAUDE_MEM_SERVER_URL,e.CLAUDE_MEM_SERVER_BETA_URL),n=t(e.CLAUDE_MEM_SERVER_API_KEY,e.CLAUDE_MEM_SERVER_BETA_API_KEY),o=t(e.CLAUDE_MEM_SERVER_PROJECT_ID,e.CLAUDE_MEM_SERVER_BETA_PROJECT_ID);if(!r)return _.warn("HOOK","[server-fallback] reason=missing_base_url"),null;if(!n)return _.warn("HOOK","[server-fallback] reason=missing_api_key"),null;if(!o)return _.warn("HOOK","[server-fallback] reason=missing_project_id"),null;let s={serverBaseUrl:r,apiKey:n};return{runtime:"server",client:new Ki(s),projectId:o,serverBaseUrl:r}}ne();var pb=["observation_add","observation_record_event","observation_search","observation_context","observation_generation_status","memory_add","memory_search","memory_context"],NI=new Set(pb);function mb(e,t){return t==="server"?[...e]:(_.debug("SYSTEM","Filtering server-beta-only MCP tools from worker runtime advertisement",{runtime:t,hiddenToolCount:pb.length}),e.filter(r=>!NI.has(r.name)))}var nA={},LI="13.24.14";console.log=(...e)=>{_.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:e})};var yb=!1,Sb=(()=>{if(typeof __dirname<"u")return __dirname;try{return(0,rr.dirname)((0,_b.fileURLToPath)(nA.url))}catch(e){return yb=!0,_.warn("SYSTEM","mcp-server: failed to resolve module directory from import.meta.url, falling back to process.cwd()",void 0,e instanceof Error?e:new Error(String(e))),process.cwd()}})(),ad=jS()??(0,rr.resolve)(Sb,"worker-service.cjs");function jI(){yb&&((0,Yi.existsSync)(ad)||_.error("SYSTEM","mcp-server: dirname resolution failed (both __dirname and import.meta.url are unavailable). Fell back to process.cwd() and the resolved WORKER_SCRIPT_PATH does not exist. This is the actual problem \u2014 the worker bundle is fine, but mcp-server cannot locate it. Worker auto-start will fail until the dirname-resolution path is fixed.",{workerScriptPath:ad,mcpServerDir:Sb}))}async function _t(e,t={}){_.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:e});try{let r;if(t.body)r=await Fi(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.body)});else{let n=new URLSearchParams;for(let[o,s]of Object.entries(t.query??{}))s!=null&&n.append(o,String(s));r=await Fi(`${e}?${n}`)}if(!r.ok){let n=await r.text();throw new Error(`Worker API error (${r.status}): ${n}`)}return _.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:e}),t.text?{content:[{type:"text",text:await r.text()}]}:t.body?{content:[{type:"text",text:JSON.stringify(await r.json(),null,2)}]}:await r.json()}catch(r){return _.error("SYSTEM","\u2190 Worker API error",{endpoint:e},r instanceof Error?r:new Error(String(r))),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function UI(){try{return(await Fi("/api/health")).ok}catch(e){return _.debug("SYSTEM","Worker health check failed",{},e instanceof Error?e:new Error(String(e))),!1}}function bb(){if(Gi()!=="server")return null;let t=fb();return t?{...t,available:!0}:{runtime:"server",available:!1,reason:"server runtime is selected but configuration is incomplete (missing url, api key, or project id)"}}function FI(e){return db(e)?{content:[{type:"text",text:`Server error (${e.kind}${e.status?` ${e.status}`:""}): ${e.message}`}],isError:!0}:{content:[{type:"text",text:`Tool error: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}function un(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}function To(e){let t=bb();if(!t)throw new st("transport",`${e} requires CLAUDE_MEM_RUNTIME=server. Current runtime is "worker"; use the existing search/timeline/get_observations tools for worker-mode memory access.`);if(!t.available)throw new st("missing_api_key",`${e}: ${t.reason}`);return t}function Ro(e,t){return async r=>{try{return await t(r)}catch(n){let o=n instanceof Error?n:new Error(String(n));return _.warn("SYSTEM",`${e} failed`,void 0,o),FI(n)}}}var qI=Ro("observation_add",async e=>{let t=To("observation_add");if(typeof e?.content!="string"||e.content.trim().length===0)throw new Error('observation_add: "content" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,content:e.content,...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.platformSource!==void 0?{platformSource:e.platformSource}:{},...e.kind!==void 0?{kind:e.kind}:{},...e.metadata!==void 0?{metadata:e.metadata}:{}},o=await t.client.addObservation(n);return un(o)});function Xi(e){return typeof e=="string"?Bi(e):null}var ZI=Ro("observation_record_event",async e=>{let t=To("observation_record_event");if(typeof e?.eventType!="string"||e.eventType.trim().length===0)throw new Error('observation_record_event: "eventType" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,sourceType:e.sourceType??"api",eventType:e.eventType,occurredAtEpoch:typeof e.occurredAtEpoch=="number"?e.occurredAtEpoch:Date.now(),...e.serverSessionId!==void 0?{serverSessionId:e.serverSessionId}:{},...e.contentSessionId!==void 0?{contentSessionId:e.contentSessionId}:{},...e.memorySessionId!==void 0?{memorySessionId:e.memorySessionId}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{},...e.payload!==void 0?{payload:e.payload}:{},...e.generate!==void 0?{generate:e.generate}:{}},o=await t.client.recordEvent(n);return un(o)}),HI=Ro("observation_search",async e=>{let t=To("observation_search");if(typeof e?.query!="string"||e.query.trim().length===0)throw new Error('observation_search: "query" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,query:e.query,...e.limit!==void 0?{limit:e.limit}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{}},o=await t.client.searchObservations(n);return un(o)}),WI=Ro("observation_context",async e=>{let t=To("observation_context");if(typeof e?.query!="string"||e.query.trim().length===0)throw new Error('observation_context: "query" is required');let n={projectId:e.projectId&&e.projectId.trim().length>0?e.projectId:t.projectId,query:e.query,...e.limit!==void 0?{limit:e.limit}:{},...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{}},o=await t.client.contextObservations(n);return un(o)});function VI(e){return Array.isArray(e.projects)?e.projects.map(t=>typeof t=="string"?t.trim():"").filter(Boolean):typeof e.projects=="string"?e.projects.split(",").map(t=>t.trim()).filter(Boolean):typeof e.project=="string"&&e.project.trim().length>0?[e.project.trim()]:[]}async function BI(e){let t=VI(e);return t.length===0?{content:[{type:"text",text:'session_start_context: "project" or "projects" is required'}],isError:!0}:_t("/api/context/inject",{query:{projects:t.join(","),...e.platformSource!==void 0?{platformSource:Xi(e.platformSource)}:{},...e.full!==void 0?{full:e.full}:{},...e.colors!==void 0?{colors:e.colors}:{}},text:!0})}var KI=Ro("observation_generation_status",async e=>{let t=To("observation_generation_status"),r=(e?.jobId??e?.job_id??"").trim();if(!r)throw new Error('observation_generation_status: "jobId" is required');let n=await t.client.getJobStatus(r);return un(n)});async function GI(){if(await UI())return!0;_.warn("SYSTEM","Worker not available, attempting auto-start for MCP client"),jI();try{let e=Bl(),t=await WS(e,ad);return t==="dead"&&_.error("SYSTEM","Worker auto-start failed \u2014 MCP tools that require the worker (search, timeline, get_observations) will fail until the worker is running. Check earlier log lines for the specific failure reason (Bun not found, missing worker bundle, port conflict, etc.)."),t!=="dead"}catch(e){return _.error("SYSTEM","Worker auto-start threw \u2014 MCP tools that require the worker (search, timeline, get_observations) will fail until the worker is running.",void 0,e instanceof Error?e:new Error(String(e))),!1}}var Eb=[{name:"important_workflow",description:`LAYERED WORKFLOW (ALWAYS FOLLOW):
223
223
  1. search(query) \u2192 Get index with IDs (~50-100 tokens/result)
224
224
  2. timeline(anchor=ID) \u2192 Get context around interesting results
225
225
  3. get_observations([IDs]) \u2192 Fetch full details ONLY for filtered IDs
@@ -64,7 +64,7 @@ ${m.stack??""}
64
64
  `)}else Ja(p+`
65
65
  `)}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){UE=e}error(e,r,n,i){this.log(3,e,r,n,i),this.routeErrorToSink(r,n,i)}routeErrorToSink(e,r,n){try{if(!UE||!(n instanceof Error))return;UE(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)}},x=new zE});function Sf(t){return/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||null}function xf(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 aM(t){let e=bie(t.header("host")??"");return e==="127.0.0.1"||e==="localhost"||e==="::1"}function bie(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 wf(t){return!!(t.header("forwarded")||t.header("x-forwarded-for")||t.header("x-forwarded-host")||t.header("x-real-ip"))}var GE=R(()=>{"use strict"});function dM(){let t=[];t.push(BE.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()}`,d=Tie(n.method,n.path,n.body);x.debug("HTTP",`\u2192 ${n.method} ${n.path}`,{requestId:u},d);let p=i.send.bind(i);i.send=function(f){let m=Date.now()-l;return x.debug("HTTP",`\u2190 ${i.statusCode} ${n.path}`,{requestId:u,duration:`${m}ms`}),p(f)},s()});let e=go(),r=uM.default.join(e,"plugin","ui");return t.push(BE.default.static(r)),t}function pM(){return(t,e,r)=>{let n=t.headers.origin;if(n){if(!n.startsWith("http://localhost:")&&!n.startsWith("http://127.0.0.1:")){e.status(403).json({error:"Forbidden",message:"CORS not allowed"});return}e.setHeader("Access-Control-Allow-Origin",n),e.setHeader("Vary","Origin")}if(t.method==="OPTIONS"){e.setHeader("Access-Control-Allow-Methods","GET,HEAD,POST,PUT,PATCH,DELETE"),e.setHeader("Access-Control-Allow-Headers","Content-Type,Authorization,X-Requested-With"),e.status(204).end();return}r()}}function _f(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")){x.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 Sie(t,e){let r=(0,Ga.createHash)("sha256").update(t,"utf8").digest(),n=(0,Ga.createHash)("sha256").update(e,"utf8").digest();if(r.length!==n.length)return!1;try{return(0,Ga.timingSafeEqual)(r,n)}catch(i){let s=i instanceof Error?i:new Error(String(i));return x.warn("SECURITY","timing-safe secret comparison failed",{},s),!1}}function xie(t){return Eie.has(t.method.toUpperCase())?vie.has(t.path)?!t.expectedToken||!t.presentedToken?{allow:!1,status:401,reason:"token"}:Sie(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 _ie(t){let e=Date.now(),r=bo.get(t.clientIp);if(r&&e-r.windowStart>lM&&(r.count=0,r.windowStart=e),!r){if(bo.size>=cM){let n=null,i=1/0;for(let[s,o]of bo)e-o.windowStart>lM?bo.delete(s):o.windowStart<i&&(i=o.windowStart,n=s);n!==null&&bo.size>=cM&&bo.delete(n)}r={count:0,windowStart:e},bo.set(t.clientIp,r)}r.count+=1,r.count<=wie?x.warn("SECURITY","Remote request denied",t):x.debug("SECURITY","Remote request denied",t)}function Iie(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 fM(t){return(e,r,n)=>{if(xf(e)&&!wf(e)){n();return}let i=e.ip||e.socket.remoteAddress||"",s=Sf(e.header("authorization")??"")||e.header("x-api-key")?.trim()||Iie(e)||null,o=xie({method:e.method,path:e.path,presentedToken:s,expectedToken:t.getToken()});if(!o.allow){_ie({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 Tie(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=${x.formatTool(n,i)}`}return e.includes("/summarize")?"requesting summary":""}var BE,uM,Ga,vie,Eie,wie,cM,lM,bo,mM=R(()=>{"use strict";BE=tt(vf(),1),uM=tt(require("path"),1),Ga=require("crypto");Hn();GE();fe();vie=new Set(["/tv","/tv.html","/stream","/api/observations"]),Eie=new Set(["GET","HEAD"]);wie=10,cM=512,lM=6e4,bo=new Map});function hM(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}function gM(t,e){e.status(404).json(hM("NotFound",`Cannot ${t.method} ${t.path}`))}var Ba,yM,bM=R(()=>{"use strict";fe();Ba=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};yM=(t,e,r,n)=>{let i=t instanceof Ba?t.statusCode:500;x.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof Ba?t.code:void 0},t);let s=hM(t.name||"Error",t.message,t instanceof Ba?t.code:void 0,t instanceof Ba?t.details:void 0);r.status(i).json(s)}});var kie,Aie,Hje,vM=R(()=>{"use strict";kie=new Set([".cmd",".bat"]),Aie=new Set([".exe",".com"]),Hje=new Set([...Aie,...kie])});function Ha(t=process.env){let e={};for(let[r,n]of Object.entries(t))if(n!==void 0){if(Oie.has(r)){e[r]=n;continue}VE.has(r)||HE.some(i=>r.startsWith(i))||(e[r]=n)}return e}var HE,VE,Rie,Oie,eu=R(()=>{"use strict";HE=["CLAUDECODE_","CLAUDE_CODE_"],VE=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID"]),Rie=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"]),Oie=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY","CLAUDE_CODE_SKIP_BEDROCK_AUTH","CLAUDE_CODE_SKIP_VERTEX_AUTH","CLAUDE_CODE_SKIP_FOUNDRY_AUTH","ANTHROPIC_BEDROCK_BASE_URL","AWS_REGION","AWS_PROFILE","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","ANTHROPIC_VERTEX_PROJECT_ID","CLOUD_ML_REGION","GOOGLE_APPLICATION_CREDENTIALS",...Rie])});function jie(t){WE+=1;let e=(0,YE.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:{...Ha(process.env),LC_ALL:"C",LANG:"C"}});if(e.status===0){let r=e.stdout.trim();return r.length>0?r:null}return null}function Pie(t,e=!1){if(!e){let n=EM.get(t);if(n&&Date.now()-n.capturedAtMs<Cie)return n.token}let r=null;try{r=jie(t)}catch(n){x.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:t,error:n instanceof Error?n.message:String(n)}),r=null}return EM.set(t,{token:r,capturedAtMs:Date.now()}),r}function xM(t,e){if(!Number.isInteger(t)||t<=0)return null;if(process.platform==="linux"){WE+=1;try{let r=(0,SM.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 x.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}if(process.platform==="win32")return Pie(t,e);WE+=1;try{let r=(0,YE.spawnSync)("ps",["-p",String(t),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...Ha(process.env),LC_ALL:"C",LANG:"C"}});if(r.status!==0)return null;let n=r.stdout.trim();return n.length>0?n:null}catch(r){return x.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:t,error:r instanceof Error?r.message:String(r)}),null}}function Ti(t){return xM(t,!1)}function ki(t,e){if(e===null)return!0;let r=xM(t,!0);return r===null?!0:r===e}var YE,SM,Cie,EM,WE,QE=R(()=>{"use strict";YE=require("child_process"),SM=require("fs");fe();eu();Cie=5e3,EM=new Map,WE=0});async function Vn(t,e={}){let r=e.signalMode==="immediate",n=e.expectedStartToken!==void 0?e.expectedStartToken:Ti(t),i=()=>ki(t,n);if(!i()){x.warn("PROCESS","Skipping tree-kill: root PID was reused since it was captured",{pid:t});return}if(x.debug("PROCESS",`Killing process tree rooted at PID ${t}`,{immediate:r}),process.platform==="win32"){try{await XE("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===Kie||Die.test(`${a} ${c}`)){x.debug("PROCESS","taskkill reported the process was already gone",{pid:t});return}throw new If(t,`taskkill failed for PID ${t} (exit ${String(o)}): ${a.trim()||c}`,{cause:s})}return}try{let s=r?"SIGKILL":"SIGTERM",o=await Tf(t);for(let l of o){if(!ki(l.pid,l.startToken)){x.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)),d=u.code;d!=="ESRCH"&&x.debug("PROCESS",`Failed to ${s} PID ${t}`,{code:d},u)}else x.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 Tf(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(!ki(l,u)){x.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 If(t,`tree-kill failed for PID ${t}: ${s instanceof Error?s.message:String(s)}`,{cause:s})}}async function Mie(){return process.platform==="win32"?qie():process.platform==="linux"?Nie():Lie()}function Nie(){let t=[],e;try{e=(0,kf.readdirSync)("/proc")}catch(r){return x.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,kf.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 Lie(){let t;try{t=(await XE("ps",["-eo","pid=,ppid=,lstart="],{timeout:1e4,maxBuffer:33554432,env:{...process.env,LC_ALL:"C",LANG:"C"}})).stdout}catch(r){return x.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(`
66
66
  `)){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 qie(){let t;try{t=(await XE("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 x.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 Tf(t){let e=await Mie(),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 wM,kf,_M,XE,Kie,Die,If,tu=R(()=>{"use strict";wM=require("child_process"),kf=require("fs"),_M=require("util");fe();QE();XE=(0,_M.promisify)(wM.execFile),Kie=128,Die=/not found|no running instance|no tasks/i,If=class extends Error{pid;constructor(e,r,n){super(r,n),this.name="ProcessTreeKillError",this.pid=e}}});function Rt(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:(x.debug("SYSTEM","PID check failed",{pid:t,code:r}),!1)}return x.warn("SYSTEM","PID check threw non-Error",{pid:t,error:String(e)}),!1}}async function Af(t,e){let r=Date.now()+e;for(;Date.now()<r;){if(t.every(n=>!Rt(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function ds(t){if(!t||!Rt(t.pid))return!1;if(!t.startToken)return!0;let e=Ti(t.pid);if(e===null)return!0;let r=e===t.startToken;return r||x.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:t.pid,stored:t.startToken,current:e}),r}function Rf(){return ZE||(ZE=new rS),ZE}function eS(){let t=Jie.shift();t&&t.notify()}var Ai,tS,Fie,$ie,Uie,rS,ZE,lPe,Jie,vo=R(()=>{"use strict";vM();Ai=require("fs"),tS=tt(require("path"),1);fe();eu();Hn();QE();tu();Fie=5e3,$ie=1e3,Uie=Ge.supervisorRegistry();rS=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;constructor(e=Uie){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,(0,Ai.mkdirSync)(tS.default.dirname(this.registryPath),{recursive:!0}),!(0,Ai.existsSync)(this.registryPath)){this.persist();return}try{let n=JSON.parse((0,Ai.readFileSync)(this.registryPath,"utf-8")).processes??{};for(let[i,s]of Object.entries(n))this.entries.set(i,s)}catch(r){r instanceof Error?x.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},r):x.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(r)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&x.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}register(e,r,n){this.initialize(),this.entries.set(e,r),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e){this.initialize();let r=this.entries.get(e);this.entries.delete(e),this.runtimeProcesses.delete(e),this.persist(),r?.type==="sdk"&&eS()}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)Rt(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)eS();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;x.info("SYSTEM",`Reaping ${r.length} process(es) for session ${e}`,{sessionId:n,pids:r.map(a=>a.pid)});let i=r.filter(a=>Rt(a.pid)),s=new Map(i.map(a=>[a.pid,Ti(a.pid)]));for(let a of i)try{process.platform==="win32"?await Vn(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"&&x.debug("SYSTEM",`Failed to SIGTERM session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},c):x.warn("SYSTEM",`Failed to SIGTERM session process PID ${a.pid} (non-Error)`,{pid:a.pid,pgid:a.pgid,error:String(c)})}await Af(i,Fie);let o=i.filter(a=>Rt(a.pid));for(let a of o){x.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(!ki(a.pid,c)){x.warn("SYSTEM","Skipping SIGKILL: session process PID was reused during the grace window",{pid:a.pid,sessionId:n});continue}try{process.platform==="win32"?await Vn(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"&&x.debug("SYSTEM",`Failed to SIGKILL session process PID ${a.pid}`,{pid:a.pid,pgid:a.pgid},l):x.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()+$ie;for(;Date.now()<a&&o.filter(l=>Rt(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"&&eS();return x.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())};(0,Ai.mkdirSync)(tS.default.dirname(this.registryPath),{recursive:!0}),(0,Ai.writeFileSync)(this.registryPath,JSON.stringify(e,null,2))}},ZE=null;lPe=180*1e3,Jie=[]});async function TM(t){let e=t.currentPid??process.pid,r=t.pidFilePath??zie,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(!Rt(c.pid)){t.registry.unregister(c.id);continue}o.set(c.id,Ti(c.pid)),s.set(c.id,await Tf(c.pid));try{await IM(c,"SIGTERM")}catch(l){l instanceof Error?x.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:c.pid,pgid:c.pgid,type:c.type},l):x.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(l)})}}await Af(i,5e3);let a=i.filter(c=>Rt(c.pid)||(s.get(c.id)??[]).some(l=>Rt(l.pid)));for(let c of a){let l=ki(c.pid,o.get(c.id)??null);l||x.warn("SYSTEM","Skipping tree-kill: root PID was reused during the grace window",{pid:c.pid,type:c.type});try{l&&await IM(c,"SIGKILL")}catch(u){u instanceof Error?x.debug("SYSTEM","Failed to force kill child process",{pid:c.pid,pgid:c.pgid,type:c.type},u):x.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:c.pid,pgid:c.pgid,type:c.type,error:String(u)})}finally{Bie(s.get(c.id)??[],c.pid)}}await Af(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);Gie(r,e),t.registry.pruneDeadEntries()}function Gie(t,e,r=!1){if(!(0,Va.existsSync)(t))return;let n=null;try{let o=JSON.parse((0,Va.readFileSync)(t,"utf-8"));n=typeof o.pid=="number"?o.pid:null}catch(o){x.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||!Rt(n);if(!i&&!(r&&s)){x.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,Va.rmSync)(t,{force:!0})}catch(o){o instanceof Error?x.debug("SYSTEM","Failed to remove PID file",{pidFilePath:t},o):x.warn("SYSTEM","Failed to remove PID file (non-Error)",{pidFilePath:t,error:String(o)})}}function Bie(t,e){for(let{pid:r,startToken:n}of t)if(!(r===e||!Rt(r))){if(!ki(r,n)){x.debug("SYSTEM","Skipping reap: PID was recycled during the grace window",{pid:r,rootPid:e});continue}try{process.kill(r,"SIGKILL"),x.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"&&x.warn("SYSTEM","Failed to reap orphaned descendant during shutdown cascade",{pid:r,rootPid:e,errno:s})}}}async function IM(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 Vn(r,{signalMode:"immediate"});return}try{process.kill(r,e)}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}return}await Vn(r)}var Va,zie,kM=R(()=>{"use strict";Va=require("fs");fe();vo();Hn();tu();zie=Ge.workerPid()});function Hie(){let e=Rf().pruneDeadEntries();e>0&&x.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function RM(){Wa===null&&(Wa=setInterval(Hie,AM),Wa.unref(),x.debug("SYSTEM","Health checker started",{intervalMs:AM}))}function OM(){Wa!==null&&(clearInterval(Wa),Wa=null,x.debug("SYSTEM","Health checker stopped"))}var AM,Wa,CM=R(()=>{"use strict";fe();vo();AM=3e4,Wa=null});function Yie(t){let e=[];for(let r of t.split(`
67
- `)){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 Qie(){let t=await Vie("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Yie(t.stdout)}function Xie(t,e){let r=t.filter(o=>Wie.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 KM(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??Qie,i=t.isAlive??Rt,s=t.killTree??(f=>Vn(f,{signalMode:"graceful"})),o=t.selfPid??process.pid,a;try{a=await n()}catch(f){return x.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}=Xie(a,{isAlive:i,selfPid:o});if(r.matched=c.length,r.trees=l.length,r.orphans=u.length,u.length===0)return x.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:r.matched,trees:r.trees}),r;x.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(f=>f.pid)});let d=new Set,p=8;for(let f=0;f<u.length;f+=p){let m=u.slice(f,f+p);(await Promise.allSettled(m.map(b=>s(b.pid)))).forEach((b,v)=>{let E=m[v];b.status==="fulfilled"?(r.killed+=1,d.add(E.pid)):(r.failed+=1,x.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"&&d.has(f.pid)&&(t.registry.unregister(f.id),r.unregistered+=1);return x.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:r.orphans,killed:r.killed,failed:r.failed,unregistered:r.unregistered}),r}var jM,PM,Vie,Wie,DM=R(()=>{"use strict";jM=require("child_process"),PM=require("util");fe();tu();vo();Vie=(0,PM.promisify)(jM.execFile),Wie=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/});function MM(){return ese}function tse(t={}){let e=t.pidFilePath??Zie;if(!(0,Eo.existsSync)(e))return"missing";let r=null;try{r=JSON.parse((0,Eo.readFileSync)(e,"utf-8"))}catch(i){return i instanceof Error?x.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},i):x.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(i)}),(0,Eo.rmSync)(e,{force:!0}),"invalid"}return ds(r)&&r?((t.logAlive??!0)&&x.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(x.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,Eo.rmSync)(e,{force:!0}),"stale")}var Eo,Zie,nS,ese,NM=R(()=>{"use strict";Eo=require("fs");fe();vo();kM();CM();DM();Hn();Zie=Ge.workerPid(),nS=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(),tse({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,KM({registry:this.registry}).catch(r=>{x.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:r instanceof Error?r.message:String(r)})}),RM()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){x.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,x.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(i){i instanceof Error?x.error("SYSTEM","Error during shutdown",{},i):x.error("SYSTEM","Error during shutdown (non-Error)",{error:String(i)});try{await this.stop()}catch(s){s instanceof Error?x.debug("SYSTEM","Supervisor shutdown fallback failed",{},s):x.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",()=>{x.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}OM(),this.stopPromise=TM({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){this.registry.unregister(e)}getRegistry(){return this.registry}},ese=new nS(Rf())});function iS(t,e,r){t.on("finish",async()=>{try{await r()}finally{process.exit(0)}}),t.json(e)}var LM=R(()=>{"use strict"});function sS(t,e=Date.now){return Math.max(0,Math.floor((e()-t)/1e3))}var qM=R(()=>{"use strict"});function oS(){let t=Array.from(rse.values()).map(e=>({...e})).sort((e,r)=>e.dependency.localeCompare(r.dependency));return{degraded:t.length>0,statuses:t}}var rse,FM=R(()=>{"use strict";rse=new Map});function nse(t,e){return e.status!=="rejected"?!1:!t||t.status!=="rejected"?!0:t.resetsAt!==e.resetsAt}var aS,$M,PPe,UM=R(()=>{"use strict";aS=class{entries=new Map;set(e){if(!e||typeof e!="object")return!1;let r=e.rateLimitType??"default",n=this.entries.get(r);return this.entries.set(r,{...e,observedAt:Date.now()}),nse(n,e)}get(e){return e?this.entries.get(e):this.entries.get("default")}getMostRecentByWindow(){return{five_hour:this.entries.get("five_hour"),seven_day:this.entries.get("seven_day"),seven_day_opus:this.entries.get("seven_day_opus"),seven_day_sonnet:this.entries.get("seven_day_sonnet"),overage:this.entries.get("overage")}}get size(){return this.entries.size}},$M=new aS;PPe=900*1e3});function ose(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 GM,BM,lS,ru,HM,ise,cS,JM,sse,zM,Of,VM=R(()=>{"use strict";GM=tt(vf(),1),BM=tt(require("http"),1),lS=tt(require("fs"),1),ru=tt(require("path"),1);ZD();fe();mM();bM();NM();vo();eu();LM();qM();FM();UM();HM=ru.default.resolve(__dirname,"../skills/mem-search"),ise=ru.default.join(HM,"operations"),cS=ru.default.join(HM,"SKILL.md"),JM=(()=>{try{let t=lS.readFileSync(cS,"utf-8");return x.info("SYSTEM","Cached SKILL.md at boot",{path:cS,bytes:Buffer.byteLength(t,"utf-8")}),t}catch(t){return x.debug("SYSTEM","SKILL.md not present at boot, /api/instructions will 404 for topic queries",{path:cS,message:t instanceof Error?t.message:String(t)}),null}})(),sse=(()=>{let t=new Map;for(let e of NE){let r=ru.default.join(ise,`${e}.md`);try{t.set(e,lS.readFileSync(r,"utf-8"))}catch(n){x.debug("SYSTEM","Operation instruction file not present at boot",{path:r,message:n instanceof Error?n.message:String(n)})}}return t.size>0&&x.info("SYSTEM","Cached operation instruction files at boot",{count:t.size,operations:Array.from(t.keys())}),t})(),zM="13.24.13";Of=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,GM.default)(),this.app.disable("x-powered-by"),this.setupRemoteReadOnlyGuard(),this.setupSecurityHeaders(),this.setupCors(),this.setupPreBodyParserRoutes(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{let s=BM.default.createServer(this.app),o=c=>{s.off("listening",a),i(c)},a=()=>{s.off("error",o),this.server=s,x.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,x.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(gM),this.app.use(yM)}setupMiddleware(){dM().forEach(r=>this.app.use(r))}setupRemoteReadOnlyGuard(){this.options.remoteReadOnly&&this.app.use(fM(this.options.remoteReadOnly))}setupSecurityHeaders(){this.options.securityHeaders&&this.app.use((e,r,n)=>{ose(r),n()})}setupCors(){this.app.use(pM())}setupPreBodyParserRoutes(){this.options.preBodyParserRoutes?.forEach(e=>e.setupRoutes(this.app))}setupCoreRoutes(){this.app.get("/api/health",async(e,r)=>{let n=this.options.getQueueHealth?await this.options.getQueueHealth():null,i=n?.engine==="bullmq"&&n.redis.status==="error",s=this.options.getDependencyHealth?this.options.getDependencyHealth():oS();r.status(i?503:200).json({status:i?"degraded":"ok",...this.options.runtime?{runtime:this.options.runtime}:{},version:zM,workerPath:this.options.workerPath,uptime:sS(this.startTime),managed:process.env.CLAUDE_MEM_MANAGED==="true",hasIpc:typeof process.send=="function",platform:process.platform,pid:process.pid,initialized:this.options.getInitializationComplete(),mcpReady:this.options.getMcpReady(),ai:this.options.getAiStatus(),dependencies:s,rateLimits:$M.getMostRecentByWindow(),...n?{queue:n}:{}})}),this.app.get("/api/readiness",(e,r)=>{this.options.getInitializationComplete()?r.status(200).json({status:"ready",mcpReady:this.options.getMcpReady()}):r.status(503).json({status:"initializing",message:"Worker is still initializing, please retry"})}),this.app.get("/api/version",(e,r)=>{r.status(200).json({version:zM})}),this.app.get("/api/instructions",(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!XD.includes(n))return r.status(400).json({error:"Invalid topic"});if(i&&!NE.includes(i))return r.status(400).json({error:"Invalid operation"});if(i){let o=sse.get(i);return o===void 0?(x.debug("HTTP","Instruction file not cached at boot",{operation:i}),r.status(404).json({error:"Instruction not found"})):r.json({content:[{type:"text",text:o}]})}if(JM===null)return x.debug("HTTP","SKILL.md not cached at boot",{topic:n}),r.status(404).json({error:"Instruction not found"});let s=this.extractInstructionSection(JM,n);r.json({content:[{type:"text",text:s}]})}),this.app.post("/api/admin/restart",_f,async(e,r)=>{process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(r.json({status:"restarting"}),x.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):iS(r,{status:"restarting"},()=>this.options.onRestart())}),this.app.post("/api/admin/shutdown",_f,async(e,r)=>{let n=e.query.reason==="restart"?"restart":"stop";process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(r.json({status:"shutting_down"}),x.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown",reason:n})):iS(r,{status:"shutting_down"},()=>this.options.onShutdown(n))}),this.app.get("/api/admin/doctor",_f,(e,r)=>{let o=MM().getRegistry().getAll().map(f=>({id:f.id,pid:f.pid,type:f.type,status:Rt(f.pid)?"alive":"dead",startedAt:f.startedAt})),a=o.filter(f=>f.status==="dead").map(f=>f.pid),c=!Object.keys(process.env).some(f=>VE.has(f)||HE.some(m=>f.startsWith(m))),l=sS(this.startTime),u=Math.floor(l/3600),d=Math.floor(l%3600/60),p=u>0?`${u}h ${d}m`:`${d}m`;r.json({supervisor:{running:!0,pid:process.pid,uptime:p},processes:o,health:{deadProcessPids:a,envClean:c,dependencies:this.options.getDependencyHealth?this.options.getDependencyHealth():oS()}})})}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),s=e.indexOf(n);return i===-1?e:s===-1?e.substring(i):e.substring(i,s).trim()}}});var Rr,ase,cse,uS,WM=R(()=>{"use strict";Rr=require("zod"),ase=Rr.z.enum(["hook","worker","provider","server","api"]),cse=Rr.z.object({id:Rr.z.string().min(1),projectId:Rr.z.string().min(1),serverSessionId:Rr.z.string().min(1).nullable().default(null),sourceType:ase,eventType:Rr.z.string().min(1),platformSource:Rr.z.string().min(1).nullable().default(null),payload:Rr.z.unknown().default({}),contentSessionId:Rr.z.string().min(1).nullable().default(null),memorySessionId:Rr.z.string().min(1).nullable().default(null),occurredAtEpoch:Rr.z.number().int().nonnegative(),createdAtEpoch:Rr.z.number().int().nonnegative()}),uS=cse.omit({id:!0,createdAtEpoch:!0}).partial({serverSessionId:!0,platformSource:!0,payload:!0,contentSessionId:!0,memorySessionId:!0})});function Ze(){return(0,Cf.randomUUID)()}function ht(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function YM(t){return Array.isArray(t)?t:[]}function De(t){return typeof t=="number"?t:new Date(t).getTime()}function Qr(t){return t==null?null:t instanceof Date?t:new Date(t)}async function se(t,e,r=[]){return(await t.query(e,r)).rows[0]??null}async function Sn(t,e,r){if(!await se(t,"SELECT id FROM projects WHERE id = $1 AND team_id = $2",[e,r]))throw new Error("project_id must belong to team_id")}async function Ri(t,e,r,n){if(!await se(t,"SELECT id FROM server_sessions WHERE id = $1 AND project_id = $2 AND team_id = $3",[e,r,n]))throw new Error("server_session_id must belong to project_id and team_id")}function nu(t){return JSON.stringify(dS(t))}function xn(t){return(0,Cf.createHash)("sha256").update(nu(t)).digest("hex")}function dS(t){if(Array.isArray(t))return t.map(dS);if(t&&typeof t=="object"){let e=t;return Object.keys(e).sort().reduce((r,n)=>(r[n]=dS(e[n]),r),{})}return t}var Cf,wn=R(()=>{"use strict";Cf=require("crypto")});function lse(t){return t.trim().toLowerCase().replace(/\s+/g,"-")}function ps(t){if(!t)return Ya;let e=lse(t);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:Ya}function cr(t){return typeof t!="string"?null:ps(t)}var Ya,So=R(()=>{"use strict";Ya="claude"});function QM(t){let e=cr(t.platformSource),r=e?[e]:[];return t.sourceEventId?`agent_event:v1:${xn([t.teamId,t.projectId,t.sourceAdapter,...r,t.sourceEventId])}`:`agent_event:v1:${xn([t.teamId,t.projectId,t.sourceAdapter,...r,t.contentSessionId??t.serverSessionId??null,t.eventType,new Date(t.occurredAt).toISOString(),nu(t.payload??{})])}`}function pS(t){return{id:t.id,projectId:t.project_id,teamId:t.team_id,serverSessionId:t.server_session_id,sourceAdapter:t.source_adapter,sourceEventId:t.source_event_id,idempotencyKey:t.idempotency_key,eventType:t.event_type,platformSource:t.platform_source,payload:t.payload,metadata:ht(t.metadata),occurredAtEpoch:De(t.occurred_at),receivedAtEpoch:De(t.received_at),createdAtEpoch:De(t.created_at)}}var Xr,Qa=R(()=>{"use strict";wn();So();Xr=class{constructor(e){this.client=e}client;async create(e){await Sn(this.client,e.projectId,e.teamId),e.serverSessionId&&await Ri(this.client,e.serverSessionId,e.projectId,e.teamId);let r=QM(e),n=cr(e.platformSource),i=await se(this.client,`
67
+ `)){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 Qie(){let t=await Vie("ps",["-eo","pid=,ppid=,command="],{timeout:1e4,maxBuffer:33554432});return Yie(t.stdout)}function Xie(t,e){let r=t.filter(o=>Wie.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 KM(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??Qie,i=t.isAlive??Rt,s=t.killTree??(f=>Vn(f,{signalMode:"graceful"})),o=t.selfPid??process.pid,a;try{a=await n()}catch(f){return x.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}=Xie(a,{isAlive:i,selfPid:o});if(r.matched=c.length,r.trees=l.length,r.orphans=u.length,u.length===0)return x.debug("PROCESS","No orphaned chroma-mcp trees found",{matched:r.matched,trees:r.trees}),r;x.warn("PROCESS","Reaping orphaned chroma-mcp trees left by dead workers",{orphans:u.length,roots:u.map(f=>f.pid)});let d=new Set,p=8;for(let f=0;f<u.length;f+=p){let m=u.slice(f,f+p);(await Promise.allSettled(m.map(b=>s(b.pid)))).forEach((b,v)=>{let E=m[v];b.status==="fulfilled"?(r.killed+=1,d.add(E.pid)):(r.failed+=1,x.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"&&d.has(f.pid)&&(t.registry.unregister(f.id),r.unregistered+=1);return x.info("PROCESS","Orphaned chroma-mcp sweep finished",{orphans:r.orphans,killed:r.killed,failed:r.failed,unregistered:r.unregistered}),r}var jM,PM,Vie,Wie,DM=R(()=>{"use strict";jM=require("child_process"),PM=require("util");fe();tu();vo();Vie=(0,PM.promisify)(jM.execFile),Wie=/(?:^|\/)(?:uvx|uv|python[\d.]*)(?:\s|$).*chroma-mcp/});function MM(){return ese}function tse(t={}){let e=t.pidFilePath??Zie;if(!(0,Eo.existsSync)(e))return"missing";let r=null;try{r=JSON.parse((0,Eo.readFileSync)(e,"utf-8"))}catch(i){return i instanceof Error?x.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},i):x.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(i)}),(0,Eo.rmSync)(e,{force:!0}),"invalid"}return ds(r)&&r?((t.logAlive??!0)&&x.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(x.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,Eo.rmSync)(e,{force:!0}),"stale")}var Eo,Zie,nS,ese,NM=R(()=>{"use strict";Eo=require("fs");fe();vo();kM();CM();DM();Hn();Zie=Ge.workerPid(),nS=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(),tse({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,KM({registry:this.registry}).catch(r=>{x.warn("PROCESS","Orphaned chroma-mcp sweep failed",{error:r instanceof Error?r.message:String(r)})}),RM()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){x.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,x.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(i){i instanceof Error?x.error("SYSTEM","Error during shutdown",{},i):x.error("SYSTEM","Error during shutdown (non-Error)",{error:String(i)});try{await this.stop()}catch(s){s instanceof Error?x.debug("SYSTEM","Supervisor shutdown fallback failed",{},s):x.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",()=>{x.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}OM(),this.stopPromise=TM({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){this.registry.unregister(e)}getRegistry(){return this.registry}},ese=new nS(Rf())});function iS(t,e,r){t.on("finish",async()=>{try{await r()}finally{process.exit(0)}}),t.json(e)}var LM=R(()=>{"use strict"});function sS(t,e=Date.now){return Math.max(0,Math.floor((e()-t)/1e3))}var qM=R(()=>{"use strict"});function oS(){let t=Array.from(rse.values()).map(e=>({...e})).sort((e,r)=>e.dependency.localeCompare(r.dependency));return{degraded:t.length>0,statuses:t}}var rse,FM=R(()=>{"use strict";rse=new Map});function nse(t,e){return e.status!=="rejected"?!1:!t||t.status!=="rejected"?!0:t.resetsAt!==e.resetsAt}var aS,$M,PPe,UM=R(()=>{"use strict";aS=class{entries=new Map;set(e){if(!e||typeof e!="object")return!1;let r=e.rateLimitType??"default",n=this.entries.get(r);return this.entries.set(r,{...e,observedAt:Date.now()}),nse(n,e)}get(e){return e?this.entries.get(e):this.entries.get("default")}getMostRecentByWindow(){return{five_hour:this.entries.get("five_hour"),seven_day:this.entries.get("seven_day"),seven_day_opus:this.entries.get("seven_day_opus"),seven_day_sonnet:this.entries.get("seven_day_sonnet"),overage:this.entries.get("overage")}}get size(){return this.entries.size}},$M=new aS;PPe=900*1e3});function ose(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 GM,BM,lS,ru,HM,ise,cS,JM,sse,zM,Of,VM=R(()=>{"use strict";GM=tt(vf(),1),BM=tt(require("http"),1),lS=tt(require("fs"),1),ru=tt(require("path"),1);ZD();fe();mM();bM();NM();vo();eu();LM();qM();FM();UM();HM=ru.default.resolve(__dirname,"../skills/mem-search"),ise=ru.default.join(HM,"operations"),cS=ru.default.join(HM,"SKILL.md"),JM=(()=>{try{let t=lS.readFileSync(cS,"utf-8");return x.info("SYSTEM","Cached SKILL.md at boot",{path:cS,bytes:Buffer.byteLength(t,"utf-8")}),t}catch(t){return x.debug("SYSTEM","SKILL.md not present at boot, /api/instructions will 404 for topic queries",{path:cS,message:t instanceof Error?t.message:String(t)}),null}})(),sse=(()=>{let t=new Map;for(let e of NE){let r=ru.default.join(ise,`${e}.md`);try{t.set(e,lS.readFileSync(r,"utf-8"))}catch(n){x.debug("SYSTEM","Operation instruction file not present at boot",{path:r,message:n instanceof Error?n.message:String(n)})}}return t.size>0&&x.info("SYSTEM","Cached operation instruction files at boot",{count:t.size,operations:Array.from(t.keys())}),t})(),zM="13.24.14";Of=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,GM.default)(),this.app.disable("x-powered-by"),this.setupRemoteReadOnlyGuard(),this.setupSecurityHeaders(),this.setupCors(),this.setupPreBodyParserRoutes(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{let s=BM.default.createServer(this.app),o=c=>{s.off("listening",a),i(c)},a=()=>{s.off("error",o),this.server=s,x.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,x.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(gM),this.app.use(yM)}setupMiddleware(){dM().forEach(r=>this.app.use(r))}setupRemoteReadOnlyGuard(){this.options.remoteReadOnly&&this.app.use(fM(this.options.remoteReadOnly))}setupSecurityHeaders(){this.options.securityHeaders&&this.app.use((e,r,n)=>{ose(r),n()})}setupCors(){this.app.use(pM())}setupPreBodyParserRoutes(){this.options.preBodyParserRoutes?.forEach(e=>e.setupRoutes(this.app))}setupCoreRoutes(){this.app.get("/api/health",async(e,r)=>{let n=this.options.getQueueHealth?await this.options.getQueueHealth():null,i=n?.engine==="bullmq"&&n.redis.status==="error",s=this.options.getDependencyHealth?this.options.getDependencyHealth():oS();r.status(i?503:200).json({status:i?"degraded":"ok",...this.options.runtime?{runtime:this.options.runtime}:{},version:zM,workerPath:this.options.workerPath,uptime:sS(this.startTime),managed:process.env.CLAUDE_MEM_MANAGED==="true",hasIpc:typeof process.send=="function",platform:process.platform,pid:process.pid,initialized:this.options.getInitializationComplete(),mcpReady:this.options.getMcpReady(),ai:this.options.getAiStatus(),dependencies:s,rateLimits:$M.getMostRecentByWindow(),...n?{queue:n}:{}})}),this.app.get("/api/readiness",(e,r)=>{this.options.getInitializationComplete()?r.status(200).json({status:"ready",mcpReady:this.options.getMcpReady()}):r.status(503).json({status:"initializing",message:"Worker is still initializing, please retry"})}),this.app.get("/api/version",(e,r)=>{r.status(200).json({version:zM})}),this.app.get("/api/instructions",(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!XD.includes(n))return r.status(400).json({error:"Invalid topic"});if(i&&!NE.includes(i))return r.status(400).json({error:"Invalid operation"});if(i){let o=sse.get(i);return o===void 0?(x.debug("HTTP","Instruction file not cached at boot",{operation:i}),r.status(404).json({error:"Instruction not found"})):r.json({content:[{type:"text",text:o}]})}if(JM===null)return x.debug("HTTP","SKILL.md not cached at boot",{topic:n}),r.status(404).json({error:"Instruction not found"});let s=this.extractInstructionSection(JM,n);r.json({content:[{type:"text",text:s}]})}),this.app.post("/api/admin/restart",_f,async(e,r)=>{process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(r.json({status:"restarting"}),x.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):iS(r,{status:"restarting"},()=>this.options.onRestart())}),this.app.post("/api/admin/shutdown",_f,async(e,r)=>{let n=e.query.reason==="restart"?"restart":"stop";process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(r.json({status:"shutting_down"}),x.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown",reason:n})):iS(r,{status:"shutting_down"},()=>this.options.onShutdown(n))}),this.app.get("/api/admin/doctor",_f,(e,r)=>{let o=MM().getRegistry().getAll().map(f=>({id:f.id,pid:f.pid,type:f.type,status:Rt(f.pid)?"alive":"dead",startedAt:f.startedAt})),a=o.filter(f=>f.status==="dead").map(f=>f.pid),c=!Object.keys(process.env).some(f=>VE.has(f)||HE.some(m=>f.startsWith(m))),l=sS(this.startTime),u=Math.floor(l/3600),d=Math.floor(l%3600/60),p=u>0?`${u}h ${d}m`:`${d}m`;r.json({supervisor:{running:!0,pid:process.pid,uptime:p},processes:o,health:{deadProcessPids:a,envClean:c,dependencies:this.options.getDependencyHealth?this.options.getDependencyHealth():oS()}})})}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),s=e.indexOf(n);return i===-1?e:s===-1?e.substring(i):e.substring(i,s).trim()}}});var Rr,ase,cse,uS,WM=R(()=>{"use strict";Rr=require("zod"),ase=Rr.z.enum(["hook","worker","provider","server","api"]),cse=Rr.z.object({id:Rr.z.string().min(1),projectId:Rr.z.string().min(1),serverSessionId:Rr.z.string().min(1).nullable().default(null),sourceType:ase,eventType:Rr.z.string().min(1),platformSource:Rr.z.string().min(1).nullable().default(null),payload:Rr.z.unknown().default({}),contentSessionId:Rr.z.string().min(1).nullable().default(null),memorySessionId:Rr.z.string().min(1).nullable().default(null),occurredAtEpoch:Rr.z.number().int().nonnegative(),createdAtEpoch:Rr.z.number().int().nonnegative()}),uS=cse.omit({id:!0,createdAtEpoch:!0}).partial({serverSessionId:!0,platformSource:!0,payload:!0,contentSessionId:!0,memorySessionId:!0})});function Ze(){return(0,Cf.randomUUID)()}function ht(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function YM(t){return Array.isArray(t)?t:[]}function De(t){return typeof t=="number"?t:new Date(t).getTime()}function Qr(t){return t==null?null:t instanceof Date?t:new Date(t)}async function se(t,e,r=[]){return(await t.query(e,r)).rows[0]??null}async function Sn(t,e,r){if(!await se(t,"SELECT id FROM projects WHERE id = $1 AND team_id = $2",[e,r]))throw new Error("project_id must belong to team_id")}async function Ri(t,e,r,n){if(!await se(t,"SELECT id FROM server_sessions WHERE id = $1 AND project_id = $2 AND team_id = $3",[e,r,n]))throw new Error("server_session_id must belong to project_id and team_id")}function nu(t){return JSON.stringify(dS(t))}function xn(t){return(0,Cf.createHash)("sha256").update(nu(t)).digest("hex")}function dS(t){if(Array.isArray(t))return t.map(dS);if(t&&typeof t=="object"){let e=t;return Object.keys(e).sort().reduce((r,n)=>(r[n]=dS(e[n]),r),{})}return t}var Cf,wn=R(()=>{"use strict";Cf=require("crypto")});function lse(t){return t.trim().toLowerCase().replace(/\s+/g,"-")}function ps(t){if(!t)return Ya;let e=lse(t);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:Ya}function cr(t){return typeof t!="string"?null:ps(t)}var Ya,So=R(()=>{"use strict";Ya="claude"});function QM(t){let e=cr(t.platformSource),r=e?[e]:[];return t.sourceEventId?`agent_event:v1:${xn([t.teamId,t.projectId,t.sourceAdapter,...r,t.sourceEventId])}`:`agent_event:v1:${xn([t.teamId,t.projectId,t.sourceAdapter,...r,t.contentSessionId??t.serverSessionId??null,t.eventType,new Date(t.occurredAt).toISOString(),nu(t.payload??{})])}`}function pS(t){return{id:t.id,projectId:t.project_id,teamId:t.team_id,serverSessionId:t.server_session_id,sourceAdapter:t.source_adapter,sourceEventId:t.source_event_id,idempotencyKey:t.idempotency_key,eventType:t.event_type,platformSource:t.platform_source,payload:t.payload,metadata:ht(t.metadata),occurredAtEpoch:De(t.occurred_at),receivedAtEpoch:De(t.received_at),createdAtEpoch:De(t.created_at)}}var Xr,Qa=R(()=>{"use strict";wn();So();Xr=class{constructor(e){this.client=e}client;async create(e){await Sn(this.client,e.projectId,e.teamId),e.serverSessionId&&await Ri(this.client,e.serverSessionId,e.projectId,e.teamId);let r=QM(e),n=cr(e.platformSource),i=await se(this.client,`
68
68
  INSERT INTO agent_events (
69
69
  id, project_id, team_id, server_session_id, source_adapter,
70
70
  source_event_id, idempotency_key, event_type, platform_source, payload, metadata, occurred_at
@@ -358,7 +358,7 @@ data:
358
358
  )
359
359
  ORDER BY e.occurred_at ASC
360
360
  LIMIT $4
361
- `,[e.serverSessionId,e.projectId,e.teamId,r])).rows.map(Gge)}}});function v$(t){let e=Vge.safeParse(t);if(!e.success)throw new ld(e.error.issues);return e.data}var er,Mc,g$,b$,Bge,Hge,Vge,ld,xh=R(()=>{"use strict";er=require("zod"),Mc={event:"server_beta_generate_event",summary:"server_beta_generate_summary"},g$={event:"evt",summary:"sum"},b$=er.z.object({team_id:er.z.string().min(1,"team_id is required"),project_id:er.z.string().min(1,"project_id is required"),source_type:er.z.enum(["agent_event","session_summary","observation_reindex"]),source_id:er.z.string().min(1,"source_id is required"),generation_job_id:er.z.string().min(1,"generation_job_id is required"),api_key_id:er.z.string().min(1).nullable(),actor_id:er.z.string().min(1).nullable(),source_adapter:er.z.string().min(1,"source_adapter is required"),request_id:er.z.string().min(1).nullable().optional()}),Bge=b$.extend({kind:er.z.literal("event"),agent_event_id:er.z.string().min(1)}),Hge=b$.extend({kind:er.z.literal("summary"),server_session_id:er.z.string().min(1)}),Vge=er.z.discriminatedUnion("kind",[Bge,Hge]),ld=class extends Error{issues;constructor(e){super(`invalid server generation job payload: ${e.map(r=>r.message).join("; ")}`),this.issues=e}}});function Nc(t){let e=g$[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,E$.createHash)("sha256").update(r).digest("hex");return`${e}_${n}`}var E$,kI=R(()=>{"use strict";E$=require("crypto");xh()});function S$(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 x$,wh,w$=R(()=>{"use strict";Qa();fs();Ao();fe();kI();wn();x$="observation_generate_for_event",wh=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 In(this.options.pool,async a=>{let l=await new Xr(a).create(e);if(!n)return{event:l,outbox:null};let u=new dt(a),d=new Vt(a),p=Ze(),f=S$({outboxId:p,event:l,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),m=await u.create({id:p,projectId:l.projectId,teamId:l.teamId,sourceType:"agent_event",sourceId:l.id,agentEventId:l.id,serverSessionId:l.serverSessionId,jobType:x$,bullmqJobId:Nc({kind:"event",team_id:l.teamId,project_id:l.projectId,source_type:"agent_event",source_id:l.id}),payload:f});return await d.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 In(this.options.pool,async o=>{let a=new Xr(o),c=new dt(o),l=new Vt(o),u=[];for(let d of e){let p=await a.create(d);if(!n){u.push({event:p,outbox:null});continue}let f=Ze(),m=S$({outboxId:f,event:p,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),y=await c.create({id:f,projectId:p.projectId,teamId:p.teamId,sourceType:"agent_event",sourceId:p.id,agentEventId:p.id,serverSessionId:p.serverSessionId,jobType:x$,bullmqJobId:Nc({kind:"event",team_id:p.teamId,project_id:p.projectId,source_type:"agent_event",source_id:p.id}),payload:m});await l.append({generationJobId:y.id,projectId:y.projectId,teamId:y.teamId,eventType:"queued",statusAfter:y.status,attempt:y.attempts,details:{source:i}}),u.push({event:p,outbox:y})}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??Nc({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 x.warn("SYSTEM","failed to publish event generation job to BullMQ",{outboxId:r.id,error:s instanceof Error?s.message:String(s)}),"queued_only"}}}});function AI(t){return Nc({kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId})}function RI(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 _$=R(()=>{"use strict";kI()});var Wge,_h,I$=R(()=>{"use strict";fs();Ao();js();fe();_$();wn();Wge="observation_generate_session_summary",_h=class{constructor(e){this.options=e}options;async end(e){let r=e.source??"http_post_v1_sessions_end",n=await In(this.options.pool,async s=>{let a=await new zt(s).endSession({id:e.sessionId,projectId:e.projectId,teamId:e.teamId});if(!a)return{session:null,outbox:null};let c=new dt(s),l=new Vt(s),u=Ze(),d=RI({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId,generationJobId:u,apiKeyId:e.apiKeyId??null,actorId:e.actorId??null,sourceAdapter:e.sourceAdapter??null}),p=await c.create({id:u,projectId:a.projectId,teamId:a.teamId,sourceType:"session_summary",sourceId:a.id,serverSessionId:a.id,jobType:Wge,bullmqJobId:AI({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId}),payload:d});return await l.append({generationJobId:p.id,projectId:p.projectId,teamId:p.teamId,eventType:"queued",statusAfter:p.status,attempt:p.attempts,details:{source:r}}),{session:a,outbox:p}});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??AI({serverSessionId:e,teamId:r.teamId,projectId:r.projectId}),o=RI({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 x.warn("SYSTEM","failed to publish summary generation job to BullMQ",{outboxId:r.id,error:a instanceof Error?a.message:String(a)}),"queued_only"}}}});function T$(t){return`${(process.env.CLAUDE_MEM_PUBLIC_URL??`${t.protocol}://${t.get("host")??"localhost"}`).replace(/\/+$/,"")}/v1/mcp`}function k$(t,e){return`claude mcp add --transport http claude-mem ${t} --header "Authorization: Bearer ${e}"`}async function O$(t,e,r=K$,n=Xge){if(R$.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,R$.includes(o.status))return{job:o,timedOut:!1}}return{job:s,timedOut:!0}}function ebe(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&D$.has(e)?e:null,n=typeof t.query.source_type=="string"?t.query.source_type.trim():"",i=n&&Zge.has(n)?n:null,s=Th(t.query.limit,M$,1,N$),o=Th(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 C$(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 j$(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&D$.has(e)?e:null,n=Th(t.query.limit,M$,1,N$),i=Th(t.query.offset,0,0,Number.MAX_SAFE_INTEGER);return{status:r,limit:n,offset:i}}function Th(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 OI(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 tbe(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 rbe(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 ud(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 dd(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 Lc(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,kind:t.kind,content:t.content,metadata:t.metadata,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function nbe(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 CI(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 P$(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 jI(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 oe,kh,Yge,Qge,A$,K$,Xge,R$,Ih,Zge,D$,M$,N$,L$=R(()=>{"use strict";oe=require("zod");WM();Qa();fs();Oi();su();Xa();fe();Pf();bx();eq();Bq();d$();f$();h$();Uo();kh=require("node:crypto");js();w$();I$();So();Yge="api",Qge="13.24.13";A$=oe.z.object({generate:oe.z.union([oe.z.literal("true"),oe.z.literal("false")]).optional(),wait:oe.z.union([oe.z.literal("true"),oe.z.literal("false")]).optional()}),K$=3e4,Xge=100,R$=["completed","failed","cancelled"];Ih=class{constructor(e){this.options=e;this.ingestEvents=new wh({pool:e.pool,resolveEventQueue:()=>this.resolveQueue("event")}),this.endSession=new _h({pool:e.pool,resolveSummaryQueue:()=>this.resolveQueue("summary")})}options;ingestEvents;endSession;getIngestEventsService(){return this.ingestEvents}getEndSessionService(){return this.endSession}setupRoutes(e){e.use("/v1",ZL());let r=wo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:write"]}),n=wo(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(p$(this.options.pool,{windowSec:60,max:s}));let o=Number(process.env.CLAUDE_MEM_MONTHLY_REQUEST_CAP??"0");o>0&&i.push(TI(this.options.pool,{kind:"request",cap:o})),process.env.CLAUDE_MEM_USAGE_METERING==="1"&&i.push(m$(this.options.pool));let a=[...i],c=Number(process.env.CLAUDE_MEM_MONTHLY_TOKEN_CAP??"0");c>0&&a.push(TI(this.options.pool,{kind:"tokens",cap:c}));let l=[r,...a],u=[n,...i];e.get("/v1/usage",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=new Date(Date.UTC(new Date().getUTCFullYear(),new Date().getUTCMonth(),1)),b=await new Kr(this.options.pool).summarize({teamId:m,since:y});f.status(200).json({since:y.toISOString(),usage:b})})),e.post("/v1/keys",l,this.handleCreate(oe.z.object({label:oe.z.string().max(120).optional(),expiresInDays:oe.z.number().int().positive().max(365).optional()}),async(p,f,m)=>{let y=this.requireTeamId(p,f);if(!y)return;let b=`cm_${(0,kh.randomBytes)(24).toString("hex")}`,v=(0,kh.createHash)("sha256").update(b).digest("hex"),E=m.expiresInDays?new Date(Date.now()+m.expiresInDays*864e5):null,S=await new Nt(this.options.pool).createApiKey({keyHash:v,teamId:y,projectId:p.authContext?.projectId??null,actorId:p.authContext?.apiKeyId??"api",scopes:["memories:read"],expiresAt:E});m.label;let k=T$(p);f.status(201).json({id:S.id,apiKey:b,scopes:["memories:read"],expiresAt:E?.toISOString()??null,mcpUrl:k,connectCommand:k$(k,b)})})),e.get("/v1/connect",u,this.asyncHandler(async(p,f)=>{if(!this.requireTeamId(p,f))return;let y=T$(p);f.status(200).json({mcpUrl:y,connectCommand:k$(y,"<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(p,f)=>{let m=A$.safeParse(p.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let y=m.data.generate!=="false",b=m.data.wait==="true",v=uS.safeParse(p.body);if(!v.success){f.status(400).json({error:"ValidationError",issues:v.error.issues});return}let E=v.data,S=this.requireTeamId(p,f);if(!S||!this.ensureProjectAllowed(p,f,E.projectId))return;let k=this.toAgentEventInput(E,S);await this.applyContentSessionLinks([k],[p.body],S);let _,O=null,N="skipped",ee={generate:y,source:"http_post_v1_events",apiKeyId:p.authContext?.apiKeyId??null,actorId:await this.resolveActorId(p),sourceAdapter:k.sourceAdapter,requestId:p.requestId??null};try{let q=await this.ingestEvents.ingestOne(k,ee);_=q.event,O=q.outbox,N=q.enqueueState}catch(q){let U=q instanceof Error?q:new Error(String(q));x.warn("SYSTEM","event.write ingest failed",{requestId:p.requestId??null},U),this.handleDbError(U,f,"event.write");return}if(await this.auditWrite(p,"event.received",_.id,_.projectId,{sourceAdapter:_.sourceAdapter,sourceEventId:_.sourceEventId,eventType:_.eventType,serverSessionId:_.serverSessionId,generationJobId:O?.id??null}),b){let q=O,U=!1;if(O){let te=new dt(this.options.pool),ze=await O$(te,O);q=ze.job,U=ze.timedOut}f.status(201).json({event:dd(_),generationJob:q?P$(q,N):null,...U?{waitTimedOut:!0}:{}});return}f.status(201).json({event:dd(_),...O?{generationJob:CI(O,N)}:{}})})),e.post("/v1/events/batch",l,this.asyncHandler(async(p,f)=>{let m=A$.safeParse(p.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let y=m.data.generate!=="false",b=m.data.wait==="true",E=oe.z.array(uS).min(1).max(500).safeParse(p.body);if(!E.success){f.status(400).json({error:"ValidationError",issues:E.error.issues});return}let S=this.requireTeamId(p,f);if(!S)return;let k=rbe(p,E.data);if(k){f.status(k.status).json(k.body);return}let _=E.data.map(q=>this.toAgentEventInput(q,S));await this.applyContentSessionLinks(_,Array.isArray(p.body)?p.body:E.data,S);let O=[],N=[],ee={generate:y,source:"http_post_v1_events_batch",apiKeyId:p.authContext?.apiKeyId??null,actorId:await this.resolveActorId(p),sourceAdapter:null,requestId:p.requestId??null};try{let q=await this.ingestEvents.ingestBatch(_,ee);O=q.map(({event:U,outbox:te})=>({event:U,outbox:te})),N=q.map(({enqueueState:U})=>U)}catch(q){let U=q instanceof Error?q:new Error(String(q));x.warn("SYSTEM","event.batch_write ingest failed",{requestId:p.requestId??null},U),this.handleDbError(U,f,"event.batch_write");return}if(await this.auditWrite(p,"event.batch_received",null,null,{eventCount:O.length,generationJobIds:O.map(({outbox:q})=>q?.id??null).filter(Boolean)}),b){let q=new dt(this.options.pool),U=Date.now()+K$,te=[];for(let T of O){if(!T.outbox){te.push({event:T.event,outbox:null,timedOut:!1});continue}let K=Math.max(0,U-Date.now()),P=await O$(q,T.outbox,K);te.push({event:T.event,outbox:P.job,timedOut:P.timedOut})}let ze=te.some(T=>T.timedOut);f.status(201).json({events:te.map(({event:T,outbox:K,timedOut:P},C)=>({event:dd(T),generationJob:K?P$(K,N[C]):null,...P?{waitTimedOut:!0}:{}})),...ze?{waitTimedOut:!0}:{}});return}f.status(201).json({events:O.map(({event:q,outbox:U},te)=>({event:dd(q),...U?{generationJob:CI(U,N[te])}:{}}))})})),e.get("/v1/events/:id",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=this.routeParam(p.params.id),b=new Xr(this.options.pool),v=await this.loadScopedById(p,f,{id:y,teamId:m,table:"agent_events",notFound:"Event not found",load:E=>b.getByIdForScope({id:y,projectId:E,teamId:m})});v&&f.json({event:dd(v)})})),e.get("/v1/events/:id/observations",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=this.routeParam(p.params.id),v=(await this.options.pool.query("SELECT id, project_id FROM agent_events WHERE id = $1 AND team_id = $2",[y,m])).rows[0];if(!v){f.status(404).json({error:"NotFound",message:"Event not found"});return}if(!this.ensureProjectAllowed(p,f,v.project_id))return;let E=await this.options.pool.query(`
361
+ `,[e.serverSessionId,e.projectId,e.teamId,r])).rows.map(Gge)}}});function v$(t){let e=Vge.safeParse(t);if(!e.success)throw new ld(e.error.issues);return e.data}var er,Mc,g$,b$,Bge,Hge,Vge,ld,xh=R(()=>{"use strict";er=require("zod"),Mc={event:"server_beta_generate_event",summary:"server_beta_generate_summary"},g$={event:"evt",summary:"sum"},b$=er.z.object({team_id:er.z.string().min(1,"team_id is required"),project_id:er.z.string().min(1,"project_id is required"),source_type:er.z.enum(["agent_event","session_summary","observation_reindex"]),source_id:er.z.string().min(1,"source_id is required"),generation_job_id:er.z.string().min(1,"generation_job_id is required"),api_key_id:er.z.string().min(1).nullable(),actor_id:er.z.string().min(1).nullable(),source_adapter:er.z.string().min(1,"source_adapter is required"),request_id:er.z.string().min(1).nullable().optional()}),Bge=b$.extend({kind:er.z.literal("event"),agent_event_id:er.z.string().min(1)}),Hge=b$.extend({kind:er.z.literal("summary"),server_session_id:er.z.string().min(1)}),Vge=er.z.discriminatedUnion("kind",[Bge,Hge]),ld=class extends Error{issues;constructor(e){super(`invalid server generation job payload: ${e.map(r=>r.message).join("; ")}`),this.issues=e}}});function Nc(t){let e=g$[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,E$.createHash)("sha256").update(r).digest("hex");return`${e}_${n}`}var E$,kI=R(()=>{"use strict";E$=require("crypto");xh()});function S$(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 x$,wh,w$=R(()=>{"use strict";Qa();fs();Ao();fe();kI();wn();x$="observation_generate_for_event",wh=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 In(this.options.pool,async a=>{let l=await new Xr(a).create(e);if(!n)return{event:l,outbox:null};let u=new dt(a),d=new Vt(a),p=Ze(),f=S$({outboxId:p,event:l,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),m=await u.create({id:p,projectId:l.projectId,teamId:l.teamId,sourceType:"agent_event",sourceId:l.id,agentEventId:l.id,serverSessionId:l.serverSessionId,jobType:x$,bullmqJobId:Nc({kind:"event",team_id:l.teamId,project_id:l.projectId,source_type:"agent_event",source_id:l.id}),payload:f});return await d.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 In(this.options.pool,async o=>{let a=new Xr(o),c=new dt(o),l=new Vt(o),u=[];for(let d of e){let p=await a.create(d);if(!n){u.push({event:p,outbox:null});continue}let f=Ze(),m=S$({outboxId:f,event:p,apiKeyId:r.apiKeyId??null,actorId:r.actorId??null,sourceAdapter:r.sourceAdapter??null,requestId:r.requestId??null}),y=await c.create({id:f,projectId:p.projectId,teamId:p.teamId,sourceType:"agent_event",sourceId:p.id,agentEventId:p.id,serverSessionId:p.serverSessionId,jobType:x$,bullmqJobId:Nc({kind:"event",team_id:p.teamId,project_id:p.projectId,source_type:"agent_event",source_id:p.id}),payload:m});await l.append({generationJobId:y.id,projectId:y.projectId,teamId:y.teamId,eventType:"queued",statusAfter:y.status,attempt:y.attempts,details:{source:i}}),u.push({event:p,outbox:y})}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??Nc({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 x.warn("SYSTEM","failed to publish event generation job to BullMQ",{outboxId:r.id,error:s instanceof Error?s.message:String(s)}),"queued_only"}}}});function AI(t){return Nc({kind:"summary",team_id:t.teamId,project_id:t.projectId,source_type:"session_summary",source_id:t.serverSessionId})}function RI(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 _$=R(()=>{"use strict";kI()});var Wge,_h,I$=R(()=>{"use strict";fs();Ao();js();fe();_$();wn();Wge="observation_generate_session_summary",_h=class{constructor(e){this.options=e}options;async end(e){let r=e.source??"http_post_v1_sessions_end",n=await In(this.options.pool,async s=>{let a=await new zt(s).endSession({id:e.sessionId,projectId:e.projectId,teamId:e.teamId});if(!a)return{session:null,outbox:null};let c=new dt(s),l=new Vt(s),u=Ze(),d=RI({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId,generationJobId:u,apiKeyId:e.apiKeyId??null,actorId:e.actorId??null,sourceAdapter:e.sourceAdapter??null}),p=await c.create({id:u,projectId:a.projectId,teamId:a.teamId,sourceType:"session_summary",sourceId:a.id,serverSessionId:a.id,jobType:Wge,bullmqJobId:AI({serverSessionId:a.id,teamId:a.teamId,projectId:a.projectId}),payload:d});return await l.append({generationJobId:p.id,projectId:p.projectId,teamId:p.teamId,eventType:"queued",statusAfter:p.status,attempt:p.attempts,details:{source:r}}),{session:a,outbox:p}});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??AI({serverSessionId:e,teamId:r.teamId,projectId:r.projectId}),o=RI({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 x.warn("SYSTEM","failed to publish summary generation job to BullMQ",{outboxId:r.id,error:a instanceof Error?a.message:String(a)}),"queued_only"}}}});function T$(t){return`${(process.env.CLAUDE_MEM_PUBLIC_URL??`${t.protocol}://${t.get("host")??"localhost"}`).replace(/\/+$/,"")}/v1/mcp`}function k$(t,e){return`claude mcp add --transport http claude-mem ${t} --header "Authorization: Bearer ${e}"`}async function O$(t,e,r=K$,n=Xge){if(R$.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,R$.includes(o.status))return{job:o,timedOut:!1}}return{job:s,timedOut:!0}}function ebe(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&D$.has(e)?e:null,n=typeof t.query.source_type=="string"?t.query.source_type.trim():"",i=n&&Zge.has(n)?n:null,s=Th(t.query.limit,M$,1,N$),o=Th(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 C$(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 j$(t){let e=typeof t.query.status=="string"?t.query.status.trim():"",r=e&&D$.has(e)?e:null,n=Th(t.query.limit,M$,1,N$),i=Th(t.query.offset,0,0,Number.MAX_SAFE_INTEGER);return{status:r,limit:n,offset:i}}function Th(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 OI(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 tbe(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 rbe(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 ud(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 dd(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 Lc(t){return{id:t.id,projectId:t.projectId,teamId:t.teamId,serverSessionId:t.serverSessionId,kind:t.kind,content:t.content,metadata:t.metadata,createdAtEpoch:t.createdAtEpoch,updatedAtEpoch:t.updatedAtEpoch}}function nbe(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 CI(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 P$(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 jI(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 oe,kh,Yge,Qge,A$,K$,Xge,R$,Ih,Zge,D$,M$,N$,L$=R(()=>{"use strict";oe=require("zod");WM();Qa();fs();Oi();su();Xa();fe();Pf();bx();eq();Bq();d$();f$();h$();Uo();kh=require("node:crypto");js();w$();I$();So();Yge="api",Qge="13.24.14";A$=oe.z.object({generate:oe.z.union([oe.z.literal("true"),oe.z.literal("false")]).optional(),wait:oe.z.union([oe.z.literal("true"),oe.z.literal("false")]).optional()}),K$=3e4,Xge=100,R$=["completed","failed","cancelled"];Ih=class{constructor(e){this.options=e;this.ingestEvents=new wh({pool:e.pool,resolveEventQueue:()=>this.resolveQueue("event")}),this.endSession=new _h({pool:e.pool,resolveSummaryQueue:()=>this.resolveQueue("summary")})}options;ingestEvents;endSession;getIngestEventsService(){return this.ingestEvents}getEndSessionService(){return this.endSession}setupRoutes(e){e.use("/v1",ZL());let r=wo(this.options.pool,{authMode:this.options.authMode,allowLocalDevBypass:this.options.allowLocalDevBypass,requiredScopes:["memories:write"]}),n=wo(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(p$(this.options.pool,{windowSec:60,max:s}));let o=Number(process.env.CLAUDE_MEM_MONTHLY_REQUEST_CAP??"0");o>0&&i.push(TI(this.options.pool,{kind:"request",cap:o})),process.env.CLAUDE_MEM_USAGE_METERING==="1"&&i.push(m$(this.options.pool));let a=[...i],c=Number(process.env.CLAUDE_MEM_MONTHLY_TOKEN_CAP??"0");c>0&&a.push(TI(this.options.pool,{kind:"tokens",cap:c}));let l=[r,...a],u=[n,...i];e.get("/v1/usage",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=new Date(Date.UTC(new Date().getUTCFullYear(),new Date().getUTCMonth(),1)),b=await new Kr(this.options.pool).summarize({teamId:m,since:y});f.status(200).json({since:y.toISOString(),usage:b})})),e.post("/v1/keys",l,this.handleCreate(oe.z.object({label:oe.z.string().max(120).optional(),expiresInDays:oe.z.number().int().positive().max(365).optional()}),async(p,f,m)=>{let y=this.requireTeamId(p,f);if(!y)return;let b=`cm_${(0,kh.randomBytes)(24).toString("hex")}`,v=(0,kh.createHash)("sha256").update(b).digest("hex"),E=m.expiresInDays?new Date(Date.now()+m.expiresInDays*864e5):null,S=await new Nt(this.options.pool).createApiKey({keyHash:v,teamId:y,projectId:p.authContext?.projectId??null,actorId:p.authContext?.apiKeyId??"api",scopes:["memories:read"],expiresAt:E});m.label;let k=T$(p);f.status(201).json({id:S.id,apiKey:b,scopes:["memories:read"],expiresAt:E?.toISOString()??null,mcpUrl:k,connectCommand:k$(k,b)})})),e.get("/v1/connect",u,this.asyncHandler(async(p,f)=>{if(!this.requireTeamId(p,f))return;let y=T$(p);f.status(200).json({mcpUrl:y,connectCommand:k$(y,"<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(p,f)=>{let m=A$.safeParse(p.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let y=m.data.generate!=="false",b=m.data.wait==="true",v=uS.safeParse(p.body);if(!v.success){f.status(400).json({error:"ValidationError",issues:v.error.issues});return}let E=v.data,S=this.requireTeamId(p,f);if(!S||!this.ensureProjectAllowed(p,f,E.projectId))return;let k=this.toAgentEventInput(E,S);await this.applyContentSessionLinks([k],[p.body],S);let _,O=null,N="skipped",ee={generate:y,source:"http_post_v1_events",apiKeyId:p.authContext?.apiKeyId??null,actorId:await this.resolveActorId(p),sourceAdapter:k.sourceAdapter,requestId:p.requestId??null};try{let q=await this.ingestEvents.ingestOne(k,ee);_=q.event,O=q.outbox,N=q.enqueueState}catch(q){let U=q instanceof Error?q:new Error(String(q));x.warn("SYSTEM","event.write ingest failed",{requestId:p.requestId??null},U),this.handleDbError(U,f,"event.write");return}if(await this.auditWrite(p,"event.received",_.id,_.projectId,{sourceAdapter:_.sourceAdapter,sourceEventId:_.sourceEventId,eventType:_.eventType,serverSessionId:_.serverSessionId,generationJobId:O?.id??null}),b){let q=O,U=!1;if(O){let te=new dt(this.options.pool),ze=await O$(te,O);q=ze.job,U=ze.timedOut}f.status(201).json({event:dd(_),generationJob:q?P$(q,N):null,...U?{waitTimedOut:!0}:{}});return}f.status(201).json({event:dd(_),...O?{generationJob:CI(O,N)}:{}})})),e.post("/v1/events/batch",l,this.asyncHandler(async(p,f)=>{let m=A$.safeParse(p.query);if(!m.success){f.status(400).json({error:"ValidationError",issues:m.error.issues});return}let y=m.data.generate!=="false",b=m.data.wait==="true",E=oe.z.array(uS).min(1).max(500).safeParse(p.body);if(!E.success){f.status(400).json({error:"ValidationError",issues:E.error.issues});return}let S=this.requireTeamId(p,f);if(!S)return;let k=rbe(p,E.data);if(k){f.status(k.status).json(k.body);return}let _=E.data.map(q=>this.toAgentEventInput(q,S));await this.applyContentSessionLinks(_,Array.isArray(p.body)?p.body:E.data,S);let O=[],N=[],ee={generate:y,source:"http_post_v1_events_batch",apiKeyId:p.authContext?.apiKeyId??null,actorId:await this.resolveActorId(p),sourceAdapter:null,requestId:p.requestId??null};try{let q=await this.ingestEvents.ingestBatch(_,ee);O=q.map(({event:U,outbox:te})=>({event:U,outbox:te})),N=q.map(({enqueueState:U})=>U)}catch(q){let U=q instanceof Error?q:new Error(String(q));x.warn("SYSTEM","event.batch_write ingest failed",{requestId:p.requestId??null},U),this.handleDbError(U,f,"event.batch_write");return}if(await this.auditWrite(p,"event.batch_received",null,null,{eventCount:O.length,generationJobIds:O.map(({outbox:q})=>q?.id??null).filter(Boolean)}),b){let q=new dt(this.options.pool),U=Date.now()+K$,te=[];for(let T of O){if(!T.outbox){te.push({event:T.event,outbox:null,timedOut:!1});continue}let K=Math.max(0,U-Date.now()),P=await O$(q,T.outbox,K);te.push({event:T.event,outbox:P.job,timedOut:P.timedOut})}let ze=te.some(T=>T.timedOut);f.status(201).json({events:te.map(({event:T,outbox:K,timedOut:P},C)=>({event:dd(T),generationJob:K?P$(K,N[C]):null,...P?{waitTimedOut:!0}:{}})),...ze?{waitTimedOut:!0}:{}});return}f.status(201).json({events:O.map(({event:q,outbox:U},te)=>({event:dd(q),...U?{generationJob:CI(U,N[te])}:{}}))})})),e.get("/v1/events/:id",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=this.routeParam(p.params.id),b=new Xr(this.options.pool),v=await this.loadScopedById(p,f,{id:y,teamId:m,table:"agent_events",notFound:"Event not found",load:E=>b.getByIdForScope({id:y,projectId:E,teamId:m})});v&&f.json({event:dd(v)})})),e.get("/v1/events/:id/observations",u,this.asyncHandler(async(p,f)=>{let m=this.requireTeamId(p,f);if(!m)return;let y=this.routeParam(p.params.id),v=(await this.options.pool.query("SELECT id, project_id FROM agent_events WHERE id = $1 AND team_id = $2",[y,m])).rows[0];if(!v){f.status(404).json({error:"NotFound",message:"Event not found"});return}if(!this.ensureProjectAllowed(p,f,v.project_id))return;let E=await this.options.pool.query(`
362
362
  SELECT o.id, o.project_id, o.team_id, o.server_session_id, o.kind, o.content,
363
363
  o.metadata, o.generation_key, o.created_by_job_id, o.created_at, o.updated_at,
364
364
  os.id AS source_id_pk, os.source_type, os.source_id, os.generation_job_id, os.created_at AS source_created_at