diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 428ef486..0f9a54f7 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,7 @@ "plugins": [ { "name": "claude-mem", - "version": "10.3.2", + "version": "10.3.3", "source": "./plugin", "description": "Persistent memory system for Claude Code - context compression across sessions" } diff --git a/package.json b/package.json index a9351f7f..5856b71c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "10.3.2", + "version": "10.3.3", "description": "Memory compression system for Claude Code - persist context across sessions", "keywords": [ "claude", diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 778c86e9..e85fad20 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "10.3.2", + "version": "10.3.3", "description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions", "author": { "name": "Alex Newman" diff --git a/plugin/package.json b/plugin/package.json index 2d309598..50ca64f3 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -1,6 +1,6 @@ { "name": "claude-mem-plugin", - "version": "10.3.2", + "version": "10.3.3", "private": true, "description": "Runtime dependencies for claude-mem bundled hooks", "type": "module", diff --git a/plugin/scripts/context-generator.cjs b/plugin/scripts/context-generator.cjs index 708ff5b2..a2c680c9 100644 --- a/plugin/scripts/context-generator.cjs +++ b/plugin/scripts/context-generator.cjs @@ -1,18 +1,18 @@ -"use strict";var lt=Object.create;var k=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Tt=Object.getPrototypeOf,gt=Object.prototype.hasOwnProperty;var ft=(r,e)=>{for(var t in e)k(r,t,{get:e[t],enumerable:!0})},se=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Et(e))!gt.call(r,n)&&n!==t&&k(r,n,{get:()=>e[n],enumerable:!(s=ut(e,n))||s.enumerable});return r};var L=(r,e,t)=>(t=r!=null?lt(Tt(r)):{},se(e||!r||!r.__esModule?k(t,"default",{value:r,enumerable:!0}):t,r)),St=r=>se(k({},"__esModule",{value:!0}),r);var xt={};ft(xt,{generateContext:()=>te});module.exports=St(xt);var ct=L(require("path"),1),_t=require("os"),mt=require("fs");var ue=require("bun:sqlite");var b=require("path"),de=require("os"),pe=require("fs");var ce=require("url");var C=require("fs"),w=require("path"),oe=require("os");var re="bugfix,feature,refactor,discovery,decision,change",ne="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var I=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,w.join)((0,oe.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:re,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:ne,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_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e){try{if(!(0,C.existsSync)(e)){let i=this.getAllDefaults();try{let a=(0,w.dirname)(e);(0,C.existsSync)(a)||(0,C.mkdirSync)(a,{recursive:!0}),(0,C.writeFileSync)(e,JSON.stringify(i,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(a){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,a)}return this.applyEnvOverrides(i)}let t=(0,C.readFileSync)(e,"utf-8"),s=JSON.parse(t),n=s;if(s.env&&typeof s.env=="object"){n=s.env;try{(0,C.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(i){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,i)}}let o={...this.DEFAULTS};for(let i of Object.keys(this.DEFAULTS))n[i]!==void 0&&(o[i]=n[i]);return this.applyEnvOverrides(o)}catch(t){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,t),this.applyEnvOverrides(this.getAllDefaults())}}};var A=require("fs"),v=require("path"),ae=require("os"),H=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.WARN=2]="WARN",o[o.ERROR=3]="ERROR",o[o.SILENT=4]="SILENT",o))(H||{}),ie=(0,v.join)((0,ae.homedir)(),".claude-mem"),W=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=(0,v.join)(ie,"logs");(0,A.existsSync)(e)||(0,A.mkdirSync)(e,{recursive:!0});let t=new Date().toISOString().split("T")[0];this.logFilePath=(0,v.join)(e,`claude-mem-${t}.log`)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=(0,v.join)(ie,"settings.json");if((0,A.existsSync)(e)){let t=(0,A.readFileSync)(e,"utf-8"),n=(JSON.parse(t).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=H[n]??1}else this.level=1}catch{this.level=1}return this.level}correlationId(e,t){return`obs-${e}-${t}`}sessionId(e){return`session-${e}`}formatData(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="object"){if(e instanceof Error)return this.getLevel()===0?`${e.message} -${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let t=Object.keys(e);return t.length===0?"{}":t.length<=3?JSON.stringify(e):`{${t.length} keys: ${t.slice(0,3).join(", ")}...}`}return String(e)}formatTool(e,t){if(!t)return e;let s=t;if(typeof t=="string")try{s=JSON.parse(t)}catch{s=t}if(e==="Bash"&&s.command)return`${e}(${s.command})`;if(s.file_path)return`${e}(${s.file_path})`;if(s.notebook_path)return`${e}(${s.notebook_path})`;if(e==="Glob"&&s.pattern)return`${e}(${s.pattern})`;if(e==="Grep"&&s.pattern)return`${e}(${s.pattern})`;if(s.url)return`${e}(${s.url})`;if(s.query)return`${e}(${s.query})`;if(e==="Task"){if(s.subagent_type)return`${e}(${s.subagent_type})`;if(s.description)return`${e}(${s.description})`}return e==="Skill"&&s.skill?`${e}(${s.skill})`:e==="LSP"&&s.operation?`${e}(${s.operation})`:e}formatTimestamp(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),d=String(e.getMilliseconds()).padStart(3,"0");return`${t}-${s}-${n} ${o}:${i}:${a}.${d}`}log(e,t,s,n,o){if(e{for(var t in e)U(r,t,{get:e[t],enumerable:!0})},se=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Et(e))!gt.call(r,n)&&n!==t&&U(r,n,{get:()=>e[n],enumerable:!(s=ut(e,n))||s.enumerable});return r};var M=(r,e,t)=>(t=r!=null?lt(Tt(r)):{},se(e||!r||!r.__esModule?U(t,"default",{value:r,enumerable:!0}):t,r)),St=r=>se(U({},"__esModule",{value:!0}),r);var xt={};ft(xt,{generateContext:()=>te});module.exports=St(xt);var ct=M(require("path"),1),mt=require("os"),_t=require("fs");var ue=require("bun:sqlite");var b=require("path"),de=require("os"),pe=require("fs");var ce=require("url");var C=require("fs"),w=require("path"),oe=require("os");var re="bugfix,feature,refactor,discovery,decision,change",ne="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var I=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,w.join)((0,oe.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:re,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:ne,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_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e){try{if(!(0,C.existsSync)(e)){let i=this.getAllDefaults();try{let a=(0,w.dirname)(e);(0,C.existsSync)(a)||(0,C.mkdirSync)(a,{recursive:!0}),(0,C.writeFileSync)(e,JSON.stringify(i,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(a){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,a)}return this.applyEnvOverrides(i)}let t=(0,C.readFileSync)(e,"utf-8"),s=JSON.parse(t),n=s;if(s.env&&typeof s.env=="object"){n=s.env;try{(0,C.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(i){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,i)}}let o={...this.DEFAULTS};for(let i of Object.keys(this.DEFAULTS))n[i]!==void 0&&(o[i]=n[i]);return this.applyEnvOverrides(o)}catch(t){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,t),this.applyEnvOverrides(this.getAllDefaults())}}};var A=require("fs"),v=require("path"),ae=require("os"),H=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.WARN=2]="WARN",o[o.ERROR=3]="ERROR",o[o.SILENT=4]="SILENT",o))(H||{}),ie=(0,v.join)((0,ae.homedir)(),".claude-mem"),W=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=(0,v.join)(ie,"logs");(0,A.existsSync)(e)||(0,A.mkdirSync)(e,{recursive:!0});let t=new Date().toISOString().split("T")[0];this.logFilePath=(0,v.join)(e,`claude-mem-${t}.log`)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=(0,v.join)(ie,"settings.json");if((0,A.existsSync)(e)){let t=(0,A.readFileSync)(e,"utf-8"),n=(JSON.parse(t).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=H[n]??1}else this.level=1}catch{this.level=1}return this.level}correlationId(e,t){return`obs-${e}-${t}`}sessionId(e){return`session-${e}`}formatData(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="object"){if(e instanceof Error)return this.getLevel()===0?`${e.message} +${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let t=Object.keys(e);return t.length===0?"{}":t.length<=3?JSON.stringify(e):`{${t.length} keys: ${t.slice(0,3).join(", ")}...}`}return String(e)}formatTool(e,t){if(!t)return e;let s=t;if(typeof t=="string")try{s=JSON.parse(t)}catch{s=t}if(e==="Bash"&&s.command)return`${e}(${s.command})`;if(s.file_path)return`${e}(${s.file_path})`;if(s.notebook_path)return`${e}(${s.notebook_path})`;if(e==="Glob"&&s.pattern)return`${e}(${s.pattern})`;if(e==="Grep"&&s.pattern)return`${e}(${s.pattern})`;if(s.url)return`${e}(${s.url})`;if(s.query)return`${e}(${s.query})`;if(e==="Task"){if(s.subagent_type)return`${e}(${s.subagent_type})`;if(s.description)return`${e}(${s.description})`}return e==="Skill"&&s.skill?`${e}(${s.skill})`:e==="LSP"&&s.operation?`${e}(${s.operation})`:e}formatTimestamp(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),d=String(e.getMilliseconds()).padStart(3,"0");return`${t}-${s}-${n} ${o}:${i}:${a}.${d}`}log(e,t,s,n,o){if(e0&&(l=` {${Object.entries(u).map(([f,R])=>`${f}=${R}`).join(", ")}}`)}let T=`[${i}] [${a}] [${d}] ${c}${s}${l}${m}`;if(this.logFilePath)try{(0,A.appendFileSync)(this.logFilePath,T+` +${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?_=` +`+JSON.stringify(o,null,2):_=" "+this.formatData(o));let l="";if(n){let{sessionId:E,memorySessionId:g,correlationId:h,...u}=n;Object.keys(u).length>0&&(l=` {${Object.entries(u).map(([f,R])=>`${f}=${R}`).join(", ")}}`)}let T=`[${i}] [${a}] [${d}] ${c}${s}${l}${_}`;if(this.logFilePath)try{(0,A.appendFileSync)(this.logFilePath,T+` `,"utf8")}catch(E){process.stderr.write(`[LOGGER] Failed to write to log file: ${E} `)}else process.stderr.write(T+` `)}debug(e,t,s,n){this.log(0,e,t,s,n)}info(e,t,s,n){this.log(1,e,t,s,n)}warn(e,t,s,n){this.log(2,e,t,s,n)}error(e,t,s,n){this.log(3,e,t,s,n)}dataIn(e,t,s,n){this.info(e,`\u2192 ${t}`,s,n)}dataOut(e,t,s,n){this.info(e,`\u2190 ${t}`,s,n)}success(e,t,s,n){this.info(e,`\u2713 ${t}`,s,n)}failure(e,t,s,n){this.error(e,`\u2717 ${t}`,s,n)}timing(e,t,s,n){this.info(e,`\u23F1 ${t}`,n,{duration:`${s}ms`})}happyPathError(e,t,s,n,o=""){let c=((new Error().stack||"").split(` -`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),m=c?`${c[1].split("/").pop()}:${c[2]}`:"unknown",l={...s,location:m};return this.warn(e,`[HAPPY-PATH] ${t}`,l,n),o}},_=new W;var Ot={};function bt(){return typeof __dirname<"u"?__dirname:(0,b.dirname)((0,ce.fileURLToPath)(Ot.url))}var ht=bt(),N=I.get("CLAUDE_MEM_DATA_DIR"),y=process.env.CLAUDE_CONFIG_DIR||(0,b.join)((0,de.homedir)(),".claude"),Bt=(0,b.join)(y,"plugins","marketplaces","thedotmack"),Ht=(0,b.join)(N,"archives"),Wt=(0,b.join)(N,"logs"),Yt=(0,b.join)(N,"trash"),Vt=(0,b.join)(N,"backups"),qt=(0,b.join)(N,"modes"),Kt=(0,b.join)(N,"settings.json"),_e=(0,b.join)(N,"claude-mem.db"),Jt=(0,b.join)(N,"vector-db"),Qt=(0,b.join)(N,"observer-sessions"),zt=(0,b.join)(y,"settings.json"),Zt=(0,b.join)(y,"commands"),es=(0,b.join)(y,"CLAUDE.md");function me(r){(0,pe.mkdirSync)(r,{recursive:!0})}function le(){return(0,b.join)(ht,"..")}var $=class{db;constructor(e=_e){e!==":memory:"&&me(N),this.db=new ue.Database(e),this.db.run("PRAGMA journal_mode = WAL"),this.db.run("PRAGMA synchronous = NORMAL"),this.db.run("PRAGMA foreign_keys = ON"),this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),this.repairSessionIdColumnRename(),this.addFailedAtEpochColumn(),this.addOnUpdateCascadeToForeignKeys()}initializeSchema(){this.db.run(` +`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),_=c?`${c[1].split("/").pop()}:${c[2]}`:"unknown",l={...s,location:_};return this.warn(e,`[HAPPY-PATH] ${t}`,l,n),o}},m=new W;var Ot={};function bt(){return typeof __dirname<"u"?__dirname:(0,b.dirname)((0,ce.fileURLToPath)(Ot.url))}var ht=bt(),N=I.get("CLAUDE_MEM_DATA_DIR"),y=process.env.CLAUDE_CONFIG_DIR||(0,b.join)((0,de.homedir)(),".claude"),Bt=(0,b.join)(y,"plugins","marketplaces","thedotmack"),Ht=(0,b.join)(N,"archives"),Wt=(0,b.join)(N,"logs"),Yt=(0,b.join)(N,"trash"),Vt=(0,b.join)(N,"backups"),qt=(0,b.join)(N,"modes"),Kt=(0,b.join)(N,"settings.json"),me=(0,b.join)(N,"claude-mem.db"),Jt=(0,b.join)(N,"vector-db"),Qt=(0,b.join)(N,"observer-sessions"),zt=(0,b.join)(y,"settings.json"),Zt=(0,b.join)(y,"commands"),es=(0,b.join)(y,"CLAUDE.md");function _e(r){(0,pe.mkdirSync)(r,{recursive:!0})}function le(){return(0,b.join)(ht,"..")}var $=class{db;constructor(e=me){e!==":memory:"&&_e(N),this.db=new ue.Database(e),this.db.run("PRAGMA journal_mode = WAL"),this.db.run("PRAGMA synchronous = NORMAL"),this.db.run("PRAGMA foreign_keys = ON"),this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),this.repairSessionIdColumnRename(),this.addFailedAtEpochColumn(),this.addOnUpdateCascadeToForeignKeys()}initializeSchema(){this.db.run(` CREATE TABLE IF NOT EXISTS schema_versions ( id INTEGER PRIMARY KEY, version INTEGER UNIQUE NOT NULL, applied_at TEXT NOT NULL ) - `);let e=this.db.prepare("SELECT version FROM schema_versions ORDER BY version").all();(e.length>0?Math.max(...e.map(s=>s.version)):0)===0&&(_.info("DB","Initializing fresh database with migration004"),this.db.run(` + `);let e=this.db.prepare("SELECT version FROM schema_versions ORDER BY version").all();(e.length>0?Math.max(...e.map(s=>s.version)):0)===0&&(m.info("DB","Initializing fresh database with migration004"),this.db.run(` CREATE TABLE IF NOT EXISTS sdk_sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, content_session_id TEXT UNIQUE NOT NULL, @@ -68,7 +68,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` CREATE INDEX IF NOT EXISTS idx_session_summaries_sdk_session ON session_summaries(memory_session_id); CREATE INDEX IF NOT EXISTS idx_session_summaries_project ON session_summaries(project); CREATE INDEX IF NOT EXISTS idx_session_summaries_created ON session_summaries(created_at_epoch DESC); - `),this.db.prepare("INSERT INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString()),_.info("DB","Migration004 applied successfully"))}ensureWorkerPortColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(5))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),_.debug("DB","Added worker_port column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(5,new Date().toISOString())}ensurePromptTrackingColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(6))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(d=>d.name==="prompt_counter")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN prompt_counter INTEGER DEFAULT 0"),_.debug("DB","Added prompt_counter column to sdk_sessions table")),this.db.query("PRAGMA table_info(observations)").all().some(d=>d.name==="prompt_number")||(this.db.run("ALTER TABLE observations ADD COLUMN prompt_number INTEGER"),_.debug("DB","Added prompt_number column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(d=>d.name==="prompt_number")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN prompt_number INTEGER"),_.debug("DB","Added prompt_number column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(6,new Date().toISOString())}removeSessionSummariesUniqueConstraint(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(7))return;if(!this.db.query("PRAGMA index_list(session_summaries)").all().some(n=>n.unique===1)){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString());return}_.debug("DB","Removing UNIQUE constraint from session_summaries.memory_session_id"),this.db.run("BEGIN TRANSACTION"),this.db.run(` + `),this.db.prepare("INSERT INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString()),m.info("DB","Migration004 applied successfully"))}ensureWorkerPortColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(5))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),m.debug("DB","Added worker_port column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(5,new Date().toISOString())}ensurePromptTrackingColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(6))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(d=>d.name==="prompt_counter")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN prompt_counter INTEGER DEFAULT 0"),m.debug("DB","Added prompt_counter column to sdk_sessions table")),this.db.query("PRAGMA table_info(observations)").all().some(d=>d.name==="prompt_number")||(this.db.run("ALTER TABLE observations ADD COLUMN prompt_number INTEGER"),m.debug("DB","Added prompt_number column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(d=>d.name==="prompt_number")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN prompt_number INTEGER"),m.debug("DB","Added prompt_number column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(6,new Date().toISOString())}removeSessionSummariesUniqueConstraint(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(7))return;if(!this.db.query("PRAGMA index_list(session_summaries)").all().some(n=>n.unique===1)){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString());return}m.debug("DB","Removing UNIQUE constraint from session_summaries.memory_session_id"),this.db.run("BEGIN TRANSACTION"),this.db.run(` CREATE TABLE session_summaries_new ( id INTEGER PRIMARY KEY AUTOINCREMENT, memory_session_id TEXT NOT NULL, @@ -96,7 +96,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` CREATE INDEX idx_session_summaries_sdk_session ON session_summaries(memory_session_id); CREATE INDEX idx_session_summaries_project ON session_summaries(project); CREATE INDEX idx_session_summaries_created ON session_summaries(created_at_epoch DESC); - `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),_.debug("DB","Successfully removed UNIQUE constraint from session_summaries.memory_session_id")}addObservationHierarchicalFields(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(8))return;if(this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="title")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString());return}_.debug("DB","Adding hierarchical fields to observations table"),this.db.run(` + `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),m.debug("DB","Successfully removed UNIQUE constraint from session_summaries.memory_session_id")}addObservationHierarchicalFields(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(8))return;if(this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="title")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString());return}m.debug("DB","Adding hierarchical fields to observations table"),this.db.run(` ALTER TABLE observations ADD COLUMN title TEXT; ALTER TABLE observations ADD COLUMN subtitle TEXT; ALTER TABLE observations ADD COLUMN facts TEXT; @@ -104,7 +104,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` ALTER TABLE observations ADD COLUMN concepts TEXT; ALTER TABLE observations ADD COLUMN files_read TEXT; ALTER TABLE observations ADD COLUMN files_modified TEXT; - `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),_.debug("DB","Successfully added hierarchical fields to observations table")}makeObservationsTextNullable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(9))return;let s=this.db.query("PRAGMA table_info(observations)").all().find(n=>n.name==="text");if(!s||s.notnull===0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString());return}_.debug("DB","Making observations.text nullable"),this.db.run("BEGIN TRANSACTION"),this.db.run(` + `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),m.debug("DB","Successfully added hierarchical fields to observations table")}makeObservationsTextNullable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(9))return;let s=this.db.query("PRAGMA table_info(observations)").all().find(n=>n.name==="text");if(!s||s.notnull===0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString());return}m.debug("DB","Making observations.text nullable"),this.db.run("BEGIN TRANSACTION"),this.db.run(` CREATE TABLE observations_new ( id INTEGER PRIMARY KEY AUTOINCREMENT, memory_session_id TEXT NOT NULL, @@ -134,7 +134,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` CREATE INDEX idx_observations_project ON observations(project); CREATE INDEX idx_observations_type ON observations(type); CREATE INDEX idx_observations_created ON observations(created_at_epoch DESC); - `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),_.debug("DB","Successfully made observations.text nullable")}createUserPromptsTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(10))return;if(this.db.query("PRAGMA table_info(user_prompts)").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString());return}_.debug("DB","Creating user_prompts table with FTS5 support"),this.db.run("BEGIN TRANSACTION"),this.db.run(` + `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),m.debug("DB","Successfully made observations.text nullable")}createUserPromptsTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(10))return;if(this.db.query("PRAGMA table_info(user_prompts)").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString());return}m.debug("DB","Creating user_prompts table with FTS5 support"),this.db.run("BEGIN TRANSACTION"),this.db.run(` CREATE TABLE user_prompts ( id INTEGER PRIMARY KEY AUTOINCREMENT, content_session_id TEXT NOT NULL, @@ -172,7 +172,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` INSERT INTO user_prompts_fts(rowid, prompt_text) VALUES (new.id, new.prompt_text); END; - `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),_.debug("DB","Successfully created user_prompts table with FTS5 support")}ensureDiscoveryTokensColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(11))return;this.db.query("PRAGMA table_info(observations)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE observations ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),_.debug("DB","Added discovery_tokens column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),_.debug("DB","Added discovery_tokens column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(11,new Date().toISOString())}createPendingMessagesTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(16))return;if(this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_messages'").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString());return}_.debug("DB","Creating pending_messages table"),this.db.run(` + `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),m.debug("DB","Successfully created user_prompts table with FTS5 support")}ensureDiscoveryTokensColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(11))return;this.db.query("PRAGMA table_info(observations)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE observations ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),m.debug("DB","Added discovery_tokens column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),m.debug("DB","Added discovery_tokens column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(11,new Date().toISOString())}createPendingMessagesTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(16))return;if(this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_messages'").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString());return}m.debug("DB","Creating pending_messages table"),this.db.run(` CREATE TABLE pending_messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_db_id INTEGER NOT NULL, @@ -192,7 +192,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` completed_at_epoch INTEGER, FOREIGN KEY (session_db_id) REFERENCES sdk_sessions(id) ON DELETE CASCADE ) - `),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),_.debug("DB","pending_messages table created successfully")}renameSessionIdColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(17))return;_.debug("DB","Checking session ID columns for semantic clarity rename");let t=0,s=(n,o,i)=>{let a=this.db.query(`PRAGMA table_info(${n})`).all(),d=a.some(m=>m.name===o);return a.some(m=>m.name===i)?!1:d?(this.db.run(`ALTER TABLE ${n} RENAME COLUMN ${o} TO ${i}`),_.debug("DB",`Renamed ${n}.${o} to ${i}`),!0):(_.warn("DB",`Column ${o} not found in ${n}, skipping rename`),!1)};s("sdk_sessions","claude_session_id","content_session_id")&&t++,s("sdk_sessions","sdk_session_id","memory_session_id")&&t++,s("pending_messages","claude_session_id","content_session_id")&&t++,s("observations","sdk_session_id","memory_session_id")&&t++,s("session_summaries","sdk_session_id","memory_session_id")&&t++,s("user_prompts","claude_session_id","content_session_id")&&t++,this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(17,new Date().toISOString()),t>0?_.debug("DB",`Successfully renamed ${t} session ID columns`):_.debug("DB","No session ID column renames needed (already up to date)")}repairSessionIdColumnRename(){this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(19)||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(19,new Date().toISOString())}addFailedAtEpochColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(20))return;this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="failed_at_epoch")||(this.db.run("ALTER TABLE pending_messages ADD COLUMN failed_at_epoch INTEGER"),_.debug("DB","Added failed_at_epoch column to pending_messages table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(20,new Date().toISOString())}addOnUpdateCascadeToForeignKeys(){if(!this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(21)){_.debug("DB","Adding ON UPDATE CASCADE to FK constraints on observations and session_summaries"),this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("BEGIN TRANSACTION");try{this.db.run("DROP TRIGGER IF EXISTS observations_ai"),this.db.run("DROP TRIGGER IF EXISTS observations_ad"),this.db.run("DROP TRIGGER IF EXISTS observations_au"),this.db.run(` + `),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),m.debug("DB","pending_messages table created successfully")}renameSessionIdColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(17))return;m.debug("DB","Checking session ID columns for semantic clarity rename");let t=0,s=(n,o,i)=>{let a=this.db.query(`PRAGMA table_info(${n})`).all(),d=a.some(_=>_.name===o);return a.some(_=>_.name===i)?!1:d?(this.db.run(`ALTER TABLE ${n} RENAME COLUMN ${o} TO ${i}`),m.debug("DB",`Renamed ${n}.${o} to ${i}`),!0):(m.warn("DB",`Column ${o} not found in ${n}, skipping rename`),!1)};s("sdk_sessions","claude_session_id","content_session_id")&&t++,s("sdk_sessions","sdk_session_id","memory_session_id")&&t++,s("pending_messages","claude_session_id","content_session_id")&&t++,s("observations","sdk_session_id","memory_session_id")&&t++,s("session_summaries","sdk_session_id","memory_session_id")&&t++,s("user_prompts","claude_session_id","content_session_id")&&t++,this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(17,new Date().toISOString()),t>0?m.debug("DB",`Successfully renamed ${t} session ID columns`):m.debug("DB","No session ID column renames needed (already up to date)")}repairSessionIdColumnRename(){this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(19)||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(19,new Date().toISOString())}addFailedAtEpochColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(20))return;this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="failed_at_epoch")||(this.db.run("ALTER TABLE pending_messages ADD COLUMN failed_at_epoch INTEGER"),m.debug("DB","Added failed_at_epoch column to pending_messages table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(20,new Date().toISOString())}addOnUpdateCascadeToForeignKeys(){if(!this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(21)){m.debug("DB","Adding ON UPDATE CASCADE to FK constraints on observations and session_summaries"),this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("BEGIN TRANSACTION");try{this.db.run("DROP TRIGGER IF EXISTS observations_ai"),this.db.run("DROP TRIGGER IF EXISTS observations_ad"),this.db.run("DROP TRIGGER IF EXISTS observations_au"),this.db.run(` CREATE TABLE observations_new ( id INTEGER PRIMARY KEY AUTOINCREMENT, memory_session_id TEXT NOT NULL, @@ -286,7 +286,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` INSERT INTO session_summaries_fts(rowid, request, investigated, learned, completed, next_steps, notes) VALUES (new.id, new.request, new.investigated, new.learned, new.completed, new.next_steps, new.notes); END; - `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(21,new Date().toISOString()),this.db.run("COMMIT"),this.db.run("PRAGMA foreign_keys = ON"),_.debug("DB","Successfully added ON UPDATE CASCADE to FK constraints")}catch(t){throw this.db.run("ROLLBACK"),this.db.run("PRAGMA foreign_keys = ON"),t}}}updateMemorySessionId(e,t){this.db.prepare(` + `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(21,new Date().toISOString()),this.db.run("COMMIT"),this.db.run("PRAGMA foreign_keys = ON"),m.debug("DB","Successfully added ON UPDATE CASCADE to FK constraints")}catch(t){throw this.db.run("ROLLBACK"),this.db.run("PRAGMA foreign_keys = ON"),t}}}updateMemorySessionId(e,t){this.db.prepare(` UPDATE sdk_sessions SET memory_session_id = ? WHERE id = ? @@ -294,7 +294,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` SELECT id, memory_session_id FROM sdk_sessions WHERE id = ? `).get(e);if(!s)throw new Error(`Session ${e} not found in sdk_sessions`);s.memory_session_id!==t&&(this.db.prepare(` UPDATE sdk_sessions SET memory_session_id = ? WHERE id = ? - `).run(t,e),_.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,oldId:s.memory_session_id,newId:t}))}getRecentSummaries(e,t=10){return this.db.prepare(` + `).run(t,e),m.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,oldId:s.memory_session_id,newId:t}))}getRecentSummaries(e,t=10){return this.db.prepare(` SELECT request, investigated, learned, completed, next_steps, files_read, files_edited, notes, prompt_number, created_at @@ -382,12 +382,12 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` SELECT * FROM observations WHERE id = ? - `).get(e)||null}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,type:i,concepts:a,files:d}=t,c=s==="date_asc"?"ASC":"DESC",m=n?`LIMIT ${n}`:"",l=e.map(()=>"?").join(","),T=[...e],E=[];if(o&&(E.push("project = ?"),T.push(o)),i)if(Array.isArray(i)){let u=i.map(()=>"?").join(",");E.push(`type IN (${u})`),T.push(...i)}else E.push("type = ?"),T.push(i);if(a){let u=Array.isArray(a)?a:[a],S=u.map(()=>"EXISTS (SELECT 1 FROM json_each(concepts) WHERE value = ?)");T.push(...u),E.push(`(${S.join(" OR ")})`)}if(d){let u=Array.isArray(d)?d:[d],S=u.map(()=>"(EXISTS (SELECT 1 FROM json_each(files_read) WHERE value LIKE ?) OR EXISTS (SELECT 1 FROM json_each(files_modified) WHERE value LIKE ?))");u.forEach(f=>{T.push(`%${f}%`,`%${f}%`)}),E.push(`(${S.join(" OR ")})`)}let g=E.length>0?`WHERE id IN (${l}) AND ${E.join(" AND ")}`:`WHERE id IN (${l})`;return this.db.prepare(` + `).get(e)||null}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,type:i,concepts:a,files:d}=t,c=s==="date_asc"?"ASC":"DESC",_=n?`LIMIT ${n}`:"",l=e.map(()=>"?").join(","),T=[...e],E=[];if(o&&(E.push("project = ?"),T.push(o)),i)if(Array.isArray(i)){let u=i.map(()=>"?").join(",");E.push(`type IN (${u})`),T.push(...i)}else E.push("type = ?"),T.push(i);if(a){let u=Array.isArray(a)?a:[a],S=u.map(()=>"EXISTS (SELECT 1 FROM json_each(concepts) WHERE value = ?)");T.push(...u),E.push(`(${S.join(" OR ")})`)}if(d){let u=Array.isArray(d)?d:[d],S=u.map(()=>"(EXISTS (SELECT 1 FROM json_each(files_read) WHERE value LIKE ?) OR EXISTS (SELECT 1 FROM json_each(files_modified) WHERE value LIKE ?))");u.forEach(f=>{T.push(`%${f}%`,`%${f}%`)}),E.push(`(${S.join(" OR ")})`)}let g=E.length>0?`WHERE id IN (${l}) AND ${E.join(" AND ")}`:`WHERE id IN (${l})`;return this.db.prepare(` SELECT * FROM observations ${g} ORDER BY created_at_epoch ${c} - ${m} + ${_} `).all(...T)}getSummaryForSession(e){return this.db.prepare(` SELECT request, investigated, learned, completed, next_steps, @@ -432,17 +432,17 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` FROM user_prompts WHERE content_session_id = ? AND prompt_number = ? LIMIT 1 - `).get(e,t)?.prompt_text??null}storeObservation(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),m=this.db.prepare(` + `).get(e,t)?.prompt_text??null}storeObservation(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),_=this.db.prepare(` INSERT INTO observations (memory_session_id, project, type, title, subtitle, facts, narrative, concepts, files_read, files_modified, prompt_number, discovery_tokens, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `).run(e,t,s.type,s.title,s.subtitle,JSON.stringify(s.facts),s.narrative,JSON.stringify(s.concepts),JSON.stringify(s.files_read),JSON.stringify(s.files_modified),n||null,o,d,a);return{id:Number(m.lastInsertRowid),createdAtEpoch:a}}storeSummary(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),m=this.db.prepare(` + `).run(e,t,s.type,s.title,s.subtitle,JSON.stringify(s.facts),s.narrative,JSON.stringify(s.concepts),JSON.stringify(s.files_read),JSON.stringify(s.files_modified),n||null,o,d,a);return{id:Number(_.lastInsertRowid),createdAtEpoch:a}}storeSummary(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),_=this.db.prepare(` INSERT INTO session_summaries (memory_session_id, project, request, investigated, learned, completed, next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `).run(e,t,s.request,s.investigated,s.learned,s.completed,s.next_steps,s.notes,n||null,o,d,a);return{id:Number(m.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,o,i=0,a){let d=a??Date.now(),c=new Date(d).toISOString();return this.db.transaction(()=>{let l=[],T=this.db.prepare(` + `).run(e,t,s.request,s.investigated,s.learned,s.completed,s.next_steps,s.notes,n||null,o,d,a);return{id:Number(_.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,o,i=0,a){let d=a??Date.now(),c=new Date(d).toISOString();return this.db.transaction(()=>{let l=[],T=this.db.prepare(` INSERT INTO observations (memory_session_id, project, type, title, subtitle, facts, narrative, concepts, files_read, files_modified, prompt_number, discovery_tokens, created_at, created_at_epoch) @@ -452,17 +452,17 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` (memory_session_id, project, request, investigated, learned, completed, next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,n.notes,o||null,i,c,d);E=Number(h.lastInsertRowid)}return{observationIds:l,summaryId:E,createdAtEpoch:d}})()}storeObservationsAndMarkComplete(e,t,s,n,o,i,a,d=0,c){let m=c??Date.now(),l=new Date(m).toISOString();return this.db.transaction(()=>{let E=[],g=this.db.prepare(` + `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,n.notes,o||null,i,c,d);E=Number(h.lastInsertRowid)}return{observationIds:l,summaryId:E,createdAtEpoch:d}})()}storeObservationsAndMarkComplete(e,t,s,n,o,i,a,d=0,c){let _=c??Date.now(),l=new Date(_).toISOString();return this.db.transaction(()=>{let E=[],g=this.db.prepare(` INSERT INTO observations (memory_session_id, project, type, title, subtitle, facts, narrative, concepts, files_read, files_modified, prompt_number, discovery_tokens, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `);for(let S of s){let f=g.run(e,t,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.files_read),JSON.stringify(S.files_modified),a||null,d,l,m);E.push(Number(f.lastInsertRowid))}let h;if(n){let f=this.db.prepare(` + `);for(let S of s){let f=g.run(e,t,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.files_read),JSON.stringify(S.files_modified),a||null,d,l,_);E.push(Number(f.lastInsertRowid))}let h;if(n){let f=this.db.prepare(` INSERT INTO session_summaries (memory_session_id, project, request, investigated, learned, completed, next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,n.notes,a||null,d,l,m);h=Number(f.lastInsertRowid)}return this.db.prepare(` + `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,n.notes,a||null,d,l,_);h=Number(f.lastInsertRowid)}return this.db.prepare(` UPDATE pending_messages SET status = 'processed', @@ -470,19 +470,19 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` tool_input = NULL, tool_response = NULL WHERE id = ? AND status = 'processing' - `).run(m,o),{observationIds:E,summaryId:h,createdAtEpoch:m}})()}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o}=t,i=s==="date_asc"?"ASC":"DESC",a=n?`LIMIT ${n}`:"",d=e.map(()=>"?").join(","),c=[...e],m=o?`WHERE id IN (${d}) AND project = ?`:`WHERE id IN (${d})`;return o&&c.push(o),this.db.prepare(` + `).run(_,o),{observationIds:E,summaryId:h,createdAtEpoch:_}})()}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o}=t,i=s==="date_asc"?"ASC":"DESC",a=n?`LIMIT ${n}`:"",d=e.map(()=>"?").join(","),c=[...e],_=o?`WHERE id IN (${d}) AND project = ?`:`WHERE id IN (${d})`;return o&&c.push(o),this.db.prepare(` SELECT * FROM session_summaries - ${m} + ${_} ORDER BY created_at_epoch ${i} ${a} - `).all(...c)}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o}=t,i=s==="date_asc"?"ASC":"DESC",a=n?`LIMIT ${n}`:"",d=e.map(()=>"?").join(","),c=[...e],m=o?"AND s.project = ?":"";return o&&c.push(o),this.db.prepare(` + `).all(...c)}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o}=t,i=s==="date_asc"?"ASC":"DESC",a=n?`LIMIT ${n}`:"",d=e.map(()=>"?").join(","),c=[...e],_=o?"AND s.project = ?":"";return o&&c.push(o),this.db.prepare(` SELECT up.*, s.project, s.memory_session_id FROM user_prompts up JOIN sdk_sessions s ON up.content_session_id = s.content_session_id - WHERE up.id IN (${d}) ${m} + WHERE up.id IN (${d}) ${_} ORDER BY up.created_at_epoch ${i} ${a} `).all(...c)}getTimelineAroundTimestamp(e,t=10,s=10,n){return this.getTimelineAroundObservation(null,e,t,s,n)}getTimelineAroundObservation(e,t,s=10,n=10,o){let i=o?"AND project = ?":"",a=o?[o]:[],d,c;if(e!==null){let u=` @@ -497,7 +497,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` WHERE id >= ? ${i} ORDER BY id ASC LIMIT ? - `;try{let f=this.db.prepare(u).all(e,...a,s+1),R=this.db.prepare(S).all(e,...a,n+1);if(f.length===0&&R.length===0)return{observations:[],sessions:[],prompts:[]};d=f.length>0?f[f.length-1].created_at_epoch:t,c=R.length>0?R[R.length-1].created_at_epoch:t}catch(f){return _.error("DB","Error getting boundary observations",void 0,{error:f,project:o}),{observations:[],sessions:[],prompts:[]}}}else{let u=` + `;try{let f=this.db.prepare(u).all(e,...a,s+1),R=this.db.prepare(S).all(e,...a,n+1);if(f.length===0&&R.length===0)return{observations:[],sessions:[],prompts:[]};d=f.length>0?f[f.length-1].created_at_epoch:t,c=R.length>0?R[R.length-1].created_at_epoch:t}catch(f){return m.error("DB","Error getting boundary observations",void 0,{error:f,project:o}),{observations:[],sessions:[],prompts:[]}}}else{let u=` SELECT created_at_epoch FROM observations WHERE created_at_epoch <= ? ${i} @@ -509,7 +509,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` WHERE created_at_epoch >= ? ${i} ORDER BY created_at_epoch ASC LIMIT ? - `;try{let f=this.db.prepare(u).all(t,...a,s),R=this.db.prepare(S).all(t,...a,n+1);if(f.length===0&&R.length===0)return{observations:[],sessions:[],prompts:[]};d=f.length>0?f[f.length-1].created_at_epoch:t,c=R.length>0?R[R.length-1].created_at_epoch:t}catch(f){return _.error("DB","Error getting boundary timestamps",void 0,{error:f,project:o}),{observations:[],sessions:[],prompts:[]}}}let m=` + `;try{let f=this.db.prepare(u).all(t,...a,s),R=this.db.prepare(S).all(t,...a,n+1);if(f.length===0&&R.length===0)return{observations:[],sessions:[],prompts:[]};d=f.length>0?f[f.length-1].created_at_epoch:t,c=R.length>0?R[R.length-1].created_at_epoch:t}catch(f){return m.error("DB","Error getting boundary timestamps",void 0,{error:f,project:o}),{observations:[],sessions:[],prompts:[]}}}let _=` SELECT * FROM observations WHERE created_at_epoch >= ? AND created_at_epoch <= ? ${i} @@ -525,7 +525,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` JOIN sdk_sessions s ON up.content_session_id = s.content_session_id WHERE up.created_at_epoch >= ? AND up.created_at_epoch <= ? ${i.replace("project","s.project")} ORDER BY up.created_at_epoch ASC - `,E=this.db.prepare(m).all(d,c,...a),g=this.db.prepare(l).all(d,c,...a),h=this.db.prepare(T).all(d,c,...a);return{observations:E,sessions:g.map(u=>({id:u.id,memory_session_id:u.memory_session_id,project:u.project,request:u.request,completed:u.completed,next_steps:u.next_steps,created_at:u.created_at,created_at_epoch:u.created_at_epoch})),prompts:h.map(u=>({id:u.id,content_session_id:u.content_session_id,prompt_number:u.prompt_number,prompt_text:u.prompt_text,project:u.project,created_at:u.created_at,created_at_epoch:u.created_at_epoch}))}}getPromptById(e){return this.db.prepare(` + `,E=this.db.prepare(_).all(d,c,...a),g=this.db.prepare(l).all(d,c,...a),h=this.db.prepare(T).all(d,c,...a);return{observations:E,sessions:g.map(u=>({id:u.id,memory_session_id:u.memory_session_id,project:u.project,request:u.request,completed:u.completed,next_steps:u.next_steps,created_at:u.created_at,created_at_epoch:u.created_at_epoch})),prompts:h.map(u=>({id:u.id,content_session_id:u.content_session_id,prompt_number:u.prompt_number,prompt_text:u.prompt_text,project:u.project,created_at:u.created_at,created_at_epoch:u.created_at_epoch}))}}getPromptById(e){return this.db.prepare(` SELECT p.id, p.content_session_id, @@ -569,7 +569,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` `).get(e)||null}getOrCreateManualSession(e){let t=`manual-${e}`,s=`manual-content-${e}`;if(this.db.prepare("SELECT memory_session_id FROM sdk_sessions WHERE memory_session_id = ?").get(t))return t;let o=new Date;return this.db.prepare(` INSERT INTO sdk_sessions (memory_session_id, content_session_id, project, started_at, started_at_epoch, status) VALUES (?, ?, ?, ?, ?, 'active') - `).run(t,s,e,o.toISOString(),o.getTime()),_.info("SESSION","Created manual session",{memorySessionId:t,project:e}),t}close(){this.db.close()}importSdkSession(e){let t=this.db.prepare("SELECT id FROM sdk_sessions WHERE content_session_id = ?").get(e.content_session_id);return t?{imported:!1,id:t.id}:{imported:!0,id:this.db.prepare(` + `).run(t,s,e,o.toISOString(),o.getTime()),m.info("SESSION","Created manual session",{memorySessionId:t,project:e}),t}close(){this.db.close()}importSdkSession(e){let t=this.db.prepare("SELECT id FROM sdk_sessions WHERE content_session_id = ?").get(e.content_session_id);return t?{imported:!1,id:t.id}:{imported:!0,id:this.db.prepare(` INSERT INTO sdk_sessions ( content_session_id, memory_session_id, project, user_prompt, started_at, started_at_epoch, completed_at, completed_at_epoch, status @@ -597,7 +597,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` content_session_id, prompt_number, prompt_text, created_at, created_at_epoch ) VALUES (?, ?, ?, ?, ?) - `).run(e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var Ee=L(require("path"),1);function Te(r){if(!r||r.trim()==="")return _.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),"unknown-project";let e=Ee.default.basename(r);if(e===""){if(process.platform==="win32"){let s=r.match(/^([A-Z]):\\/i);if(s){let o=`drive-${s[1].toUpperCase()}`;return _.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:o}),o}}return _.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),"unknown-project"}return e}var ge=L(require("path"),1),fe=require("os");var D=require("fs"),F=require("path");var O=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=le(),t=[(0,F.join)(e,"modes"),(0,F.join)(e,"..","plugin","modes")],s=t.find(n=>(0,D.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,F.join)(this.modesDir,`${e}.json`);if(!(0,D.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,D.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,_.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(c=>c.id),concepts:d.observation_concepts.map(c=>c.id)}),d}catch{if(_.warn("SYSTEM",`Mode file not found: ${e}, falling back to 'code'`),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch{_.warn("SYSTEM",`Parent mode '${s}' not found for ${e}, falling back to 'code'`),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),_.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch{return _.warn("SYSTEM",`Override file '${n}' not found, using parent mode '${s}' only`),this.activeMode=o,o}if(!i)return _.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,_.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getObservationConcepts(){return this.getActiveMode().observation_concepts}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}validateType(e){return this.getObservationTypes().some(t=>t.id===e)}getTypeLabel(e){return this.getObservationTypes().find(s=>s.id===e)?.label||e}};function Y(){let r=ge.default.join((0,fe.homedir)(),".claude-mem","settings.json"),e=I.loadFromFile(r),t=e.CLAUDE_MEM_MODE,s=t==="code"||t.startsWith("code--"),n,o;if(s)n=new Set(e.CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES.split(",").map(i=>i.trim()).filter(Boolean)),o=new Set(e.CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS.split(",").map(i=>i.trim()).filter(Boolean));else{let i=O.getInstance().getActiveMode();n=new Set(i.observation_types.map(a=>a.id)),o=new Set(i.observation_concepts.map(a=>a.id))}return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:n,observationConcepts:o,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var p={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},Se=4,V=1;function q(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/Se)}function K(r){let e=r.length,t=r.reduce((i,a)=>i+q(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function Rt(r){return O.getInstance().getWorkEmoji(r)}function M(r,e){let t=q(r),s=r.discovery_tokens||0,n=Rt(r.type),o=s>0?`${n} ${s.toLocaleString()}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function P(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}var be=L(require("path"),1),X=require("fs");function J(r,e,t){let s=Array.from(t.observationTypes),n=s.map(()=>"?").join(","),o=Array.from(t.observationConcepts),i=o.map(()=>"?").join(",");return r.db.prepare(` + `).run(e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var Ee=M(require("path"),1);function Te(r){if(!r||r.trim()==="")return m.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),"unknown-project";let e=Ee.default.basename(r);if(e===""){if(process.platform==="win32"){let s=r.match(/^([A-Z]):\\/i);if(s){let o=`drive-${s[1].toUpperCase()}`;return m.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:o}),o}}return m.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),"unknown-project"}return e}var ge=M(require("path"),1),fe=require("os");var D=require("fs"),F=require("path");var O=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=le(),t=[(0,F.join)(e,"modes"),(0,F.join)(e,"..","plugin","modes")],s=t.find(n=>(0,D.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,F.join)(this.modesDir,`${e}.json`);if(!(0,D.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,D.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,m.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(c=>c.id),concepts:d.observation_concepts.map(c=>c.id)}),d}catch{if(m.warn("SYSTEM",`Mode file not found: ${e}, falling back to 'code'`),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch{m.warn("SYSTEM",`Parent mode '${s}' not found for ${e}, falling back to 'code'`),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),m.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch{return m.warn("SYSTEM",`Override file '${n}' not found, using parent mode '${s}' only`),this.activeMode=o,o}if(!i)return m.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,m.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getObservationConcepts(){return this.getActiveMode().observation_concepts}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}validateType(e){return this.getObservationTypes().some(t=>t.id===e)}getTypeLabel(e){return this.getObservationTypes().find(s=>s.id===e)?.label||e}};function Y(){let r=ge.default.join((0,fe.homedir)(),".claude-mem","settings.json"),e=I.loadFromFile(r),t=e.CLAUDE_MEM_MODE,s=t==="code"||t.startsWith("code--"),n,o;if(s)n=new Set(e.CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES.split(",").map(i=>i.trim()).filter(Boolean)),o=new Set(e.CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS.split(",").map(i=>i.trim()).filter(Boolean));else{let i=O.getInstance().getActiveMode();n=new Set(i.observation_types.map(a=>a.id)),o=new Set(i.observation_concepts.map(a=>a.id))}return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:n,observationConcepts:o,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var p={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},Se=4,V=1;function q(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/Se)}function K(r){let e=r.length,t=r.reduce((i,a)=>i+q(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function Rt(r){return O.getInstance().getWorkEmoji(r)}function L(r,e){let t=q(r),s=r.discovery_tokens||0,n=Rt(r.type),o=s>0?`${n} ${s.toLocaleString()}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function P(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}var be=M(require("path"),1),X=require("fs");function J(r,e,t){let s=Array.from(t.observationTypes),n=s.map(()=>"?").join(","),o=Array.from(t.observationConcepts),i=o.map(()=>"?").join(",");return r.db.prepare(` SELECT id, memory_session_id, type, title, subtitle, narrative, facts, concepts, files_read, files_modified, discovery_tokens, @@ -638,13 +638,13 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?m=` ORDER BY created_at_epoch DESC LIMIT ? `).all(...e,t.sessionCount+V)}function Nt(r){return r.replace(/\//g,"-")}function Ct(r){try{if(!(0,X.existsSync)(r))return{userMessage:"",assistantMessage:""};let e=(0,X.readFileSync)(r,"utf-8").trim();if(!e)return{userMessage:"",assistantMessage:""};let t=e.split(` -`).filter(n=>n.trim()),s="";for(let n=t.length-1;n>=0;n--)try{let o=t[n];if(!o.includes('"type":"assistant"'))continue;let i=JSON.parse(o);if(i.type==="assistant"&&i.message?.content&&Array.isArray(i.message.content)){let a="";for(let d of i.message.content)d.type==="text"&&(a+=d.text);if(a=a.replace(/[\s\S]*?<\/system-reminder>/g,"").trim(),a){s=a;break}}}catch(o){_.debug("PARSER","Skipping malformed transcript line",{lineIndex:n},o);continue}return{userMessage:"",assistantMessage:s}}catch(e){return _.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r},e),{userMessage:"",assistantMessage:""}}}function z(r,e,t,s){if(!e.showLastMessage||r.length===0)return{userMessage:"",assistantMessage:""};let n=r.find(d=>d.memory_session_id!==t);if(!n)return{userMessage:"",assistantMessage:""};let o=n.memory_session_id,i=Nt(s),a=be.default.join(y,"projects",i,`${o}.jsonl`);return Ct(a)}function Re(r,e){let t=e[0]?.id;return r.map((s,n)=>{let o=n===0?null:e[n+1];return{...s,displayEpoch:o?o.created_at_epoch:s.created_at_epoch,displayTime:o?o.created_at:s.created_at,shouldShowLink:s.id!==t}})}function Z(r,e){let t=[...r.map(s=>({type:"observation",data:s})),...e.map(s=>({type:"summary",data:s}))];return t.sort((s,n)=>{let o=s.type==="observation"?s.data.created_at_epoch:s.data.displayEpoch,i=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch;return o-i}),t}function Ne(r,e){return new Set(r.slice(0,e).map(t=>t.id))}function Ce(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Ae(r){return[`# [${r}] recent context, ${Ce()}`,""]}function Ie(){return[`**Legend:** session-request | ${O.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ")}`,""]}function ye(){return["**Column Key**:","- **Read**: Tokens to read this observation (cost to learn it now)","- **Work**: Tokens spent on work that produced this record ( research, building, deciding)",""]}function Me(){return["**Context Index:** This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.","","When you need implementation details, rationale, or debugging context:","- Fetch by ID: get_observations([IDs]) for observations visible in this index","- Search history: Use the mem-search skill for past decisions, bugs, and deeper research","- Trust this index over re-reading code for past decisions and learnings",""]}function Le(r,e){let t=[];if(t.push("**Context Economics**:"),t.push(`- Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)`),t.push(`- Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s="- Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(s)}return t.push(""),t}function ve(r){return[`### ${r}`,""]}function De(r){return[`**${r}**`,"| ID | Time | T | Title | Read | Work |","|----|------|---|-------|------|------|"]}function xe(r,e,t){let s=r.title||"Untitled",n=O.getInstance().getTypeIcon(r.type),{readTokens:o,discoveryDisplay:i}=M(r,t),a=t.showReadTokens?`~${o}`:"",d=t.showWorkTokens?i:"";return`| #${r.id} | ${e||'"'} | ${n} | ${s} | ${a} | ${d} |`}function Ue(r,e,t,s){let n=[],o=r.title||"Untitled",i=O.getInstance().getTypeIcon(r.type),{readTokens:a,discoveryDisplay:d}=M(r,s);n.push(`**#${r.id}** ${e||'"'} ${i} **${o}**`),t&&(n.push(""),n.push(t),n.push(""));let c=[];return s.showReadTokens&&c.push(`Read: ~${a}`),s.showWorkTokens&&c.push(`Work: ${d}`),c.length>0&&n.push(c.join(", ")),n.push(""),n}function ke(r,e){let t=`${r.request||"Session started"} (${e})`;return[`**#S${r.id}** ${t}`,""]}function x(r,e){return e?[`**${r}**: ${e}`,""]:[]}function we(r){return r.assistantMessage?["","---","","**Previously**","",`A: ${r.assistantMessage}`,""]:[]}function $e(r,e){return["",`Access ${Math.round(r/1e3)}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use MCP search tools to access memories by ID.`]}function Fe(r){return`# [${r}] recent context, ${Ce()} +`).filter(n=>n.trim()),s="";for(let n=t.length-1;n>=0;n--)try{let o=t[n];if(!o.includes('"type":"assistant"'))continue;let i=JSON.parse(o);if(i.type==="assistant"&&i.message?.content&&Array.isArray(i.message.content)){let a="";for(let d of i.message.content)d.type==="text"&&(a+=d.text);if(a=a.replace(/[\s\S]*?<\/system-reminder>/g,"").trim(),a){s=a;break}}}catch(o){m.debug("PARSER","Skipping malformed transcript line",{lineIndex:n},o);continue}return{userMessage:"",assistantMessage:s}}catch(e){return m.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r},e),{userMessage:"",assistantMessage:""}}}function z(r,e,t,s){if(!e.showLastMessage||r.length===0)return{userMessage:"",assistantMessage:""};let n=r.find(d=>d.memory_session_id!==t);if(!n)return{userMessage:"",assistantMessage:""};let o=n.memory_session_id,i=Nt(s),a=be.default.join(y,"projects",i,`${o}.jsonl`);return Ct(a)}function Re(r,e){let t=e[0]?.id;return r.map((s,n)=>{let o=n===0?null:e[n+1];return{...s,displayEpoch:o?o.created_at_epoch:s.created_at_epoch,displayTime:o?o.created_at:s.created_at,shouldShowLink:s.id!==t}})}function Z(r,e){let t=[...r.map(s=>({type:"observation",data:s})),...e.map(s=>({type:"summary",data:s}))];return t.sort((s,n)=>{let o=s.type==="observation"?s.data.created_at_epoch:s.data.displayEpoch,i=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch;return o-i}),t}function Ne(r,e){return new Set(r.slice(0,e).map(t=>t.id))}function Ce(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Ae(r){return[`# [${r}] recent context, ${Ce()}`,""]}function Ie(){return[`**Legend:** session-request | ${O.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ")}`,""]}function ye(){return["**Column Key**:","- **Read**: Tokens to read this observation (cost to learn it now)","- **Work**: Tokens spent on work that produced this record ( research, building, deciding)",""]}function Le(){return["**Context Index:** This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.","","When you need implementation details, rationale, or debugging context:","- Fetch by ID: get_observations([IDs]) for observations visible in this index","- Search history: Use the mem-search skill for past decisions, bugs, and deeper research","- Trust this index over re-reading code for past decisions and learnings",""]}function Me(r,e){let t=[];if(t.push("**Context Economics**:"),t.push(`- Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)`),t.push(`- Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s="- Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(s)}return t.push(""),t}function ve(r){return[`### ${r}`,""]}function De(r){return[`**${r}**`,"| ID | Time | T | Title | Read | Work |","|----|------|---|-------|------|------|"]}function xe(r,e,t){let s=r.title||"Untitled",n=O.getInstance().getTypeIcon(r.type),{readTokens:o,discoveryDisplay:i}=L(r,t),a=t.showReadTokens?`~${o}`:"",d=t.showWorkTokens?i:"";return`| #${r.id} | ${e||'"'} | ${n} | ${s} | ${a} | ${d} |`}function ke(r,e,t,s){let n=[],o=r.title||"Untitled",i=O.getInstance().getTypeIcon(r.type),{readTokens:a,discoveryDisplay:d}=L(r,s);n.push(`**#${r.id}** ${e||'"'} ${i} **${o}**`),t&&(n.push(""),n.push(t),n.push(""));let c=[];return s.showReadTokens&&c.push(`Read: ~${a}`),s.showWorkTokens&&c.push(`Work: ${d}`),c.length>0&&n.push(c.join(", ")),n.push(""),n}function Ue(r,e){let t=`${r.request||"Session started"} (${e})`;return[`**#S${r.id}** ${t}`,""]}function x(r,e){return e?[`**${r}**: ${e}`,""]:[]}function we(r){return r.assistantMessage?["","---","","**Previously**","",`A: ${r.assistantMessage}`,""]:[]}function $e(r,e){return["",`Access ${Math.round(r/1e3)}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.`]}function Fe(r){return`# [${r}] recent context, ${Ce()} -No previous sessions found for this project yet.`}function Pe(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Xe(r){return["",`${p.bright}${p.cyan}[${r}] recent context, ${Pe()}${p.reset}`,`${p.gray}${"\u2500".repeat(60)}${p.reset}`,""]}function je(){let e=O.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ");return[`${p.dim}Legend: session-request | ${e}${p.reset}`,""]}function Ge(){return[`${p.bright}Column Key${p.reset}`,`${p.dim} Read: Tokens to read this observation (cost to learn it now)${p.reset}`,`${p.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${p.reset}`,""]}function Be(){return[`${p.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${p.reset}`,"",`${p.dim}When you need implementation details, rationale, or debugging context:${p.reset}`,`${p.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${p.reset}`,`${p.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${p.reset}`,`${p.dim} - Trust this index over re-reading code for past decisions and learnings${p.reset}`,""]}function He(r,e){let t=[];if(t.push(`${p.bright}${p.cyan}Context Economics${p.reset}`),t.push(`${p.dim} Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)${p.reset}`),t.push(`${p.dim} Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${p.reset}`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(`${p.green}${s}${p.reset}`)}return t.push(""),t}function We(r){return[`${p.bright}${p.cyan}${r}${p.reset}`,""]}function Ye(r){return[`${p.dim}${r}${p.reset}`]}function Ve(r,e,t,s){let n=r.title||"Untitled",o=O.getInstance().getTypeIcon(r.type),{readTokens:i,discoveryTokens:a,workEmoji:d}=M(r,s),c=t?`${p.dim}${e}${p.reset}`:" ".repeat(e.length),m=s.showReadTokens&&i>0?`${p.dim}(~${i}t)${p.reset}`:"",l=s.showWorkTokens&&a>0?`${p.dim}(${d} ${a.toLocaleString()}t)${p.reset}`:"";return` ${p.dim}#${r.id}${p.reset} ${c} ${o} ${n} ${m} ${l}`}function qe(r,e,t,s,n){let o=[],i=r.title||"Untitled",a=O.getInstance().getTypeIcon(r.type),{readTokens:d,discoveryTokens:c,workEmoji:m}=M(r,n),l=t?`${p.dim}${e}${p.reset}`:" ".repeat(e.length),T=n.showReadTokens&&d>0?`${p.dim}(~${d}t)${p.reset}`:"",E=n.showWorkTokens&&c>0?`${p.dim}(${m} ${c.toLocaleString()}t)${p.reset}`:"";return o.push(` ${p.dim}#${r.id}${p.reset} ${l} ${a} ${p.bright}${i}${p.reset}`),s&&o.push(` ${p.dim}${s}${p.reset}`),(T||E)&&o.push(` ${T} ${E}`),o.push(""),o}function Ke(r,e){let t=`${r.request||"Session started"} (${e})`;return[`${p.yellow}#S${r.id}${p.reset} ${t}`,""]}function U(r,e,t){return e?[`${t}${r}:${p.reset} ${e}`,""]:[]}function Je(r){return r.assistantMessage?["","---","",`${p.bright}${p.magenta}Previously${p.reset}`,"",`${p.dim}A: ${r.assistantMessage}${p.reset}`,""]:[]}function Qe(r,e){let t=Math.round(r/1e3);return["",`${p.dim}Access ${t}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use MCP search tools to access memories by ID.${p.reset}`]}function ze(r){return` +No previous sessions found for this project yet.`}function Pe(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Xe(r){return["",`${p.bright}${p.cyan}[${r}] recent context, ${Pe()}${p.reset}`,`${p.gray}${"\u2500".repeat(60)}${p.reset}`,""]}function je(){let e=O.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ");return[`${p.dim}Legend: session-request | ${e}${p.reset}`,""]}function Ge(){return[`${p.bright}Column Key${p.reset}`,`${p.dim} Read: Tokens to read this observation (cost to learn it now)${p.reset}`,`${p.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${p.reset}`,""]}function Be(){return[`${p.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${p.reset}`,"",`${p.dim}When you need implementation details, rationale, or debugging context:${p.reset}`,`${p.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${p.reset}`,`${p.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${p.reset}`,`${p.dim} - Trust this index over re-reading code for past decisions and learnings${p.reset}`,""]}function He(r,e){let t=[];if(t.push(`${p.bright}${p.cyan}Context Economics${p.reset}`),t.push(`${p.dim} Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)${p.reset}`),t.push(`${p.dim} Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${p.reset}`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(`${p.green}${s}${p.reset}`)}return t.push(""),t}function We(r){return[`${p.bright}${p.cyan}${r}${p.reset}`,""]}function Ye(r){return[`${p.dim}${r}${p.reset}`]}function Ve(r,e,t,s){let n=r.title||"Untitled",o=O.getInstance().getTypeIcon(r.type),{readTokens:i,discoveryTokens:a,workEmoji:d}=L(r,s),c=t?`${p.dim}${e}${p.reset}`:" ".repeat(e.length),_=s.showReadTokens&&i>0?`${p.dim}(~${i}t)${p.reset}`:"",l=s.showWorkTokens&&a>0?`${p.dim}(${d} ${a.toLocaleString()}t)${p.reset}`:"";return` ${p.dim}#${r.id}${p.reset} ${c} ${o} ${n} ${_} ${l}`}function qe(r,e,t,s,n){let o=[],i=r.title||"Untitled",a=O.getInstance().getTypeIcon(r.type),{readTokens:d,discoveryTokens:c,workEmoji:_}=L(r,n),l=t?`${p.dim}${e}${p.reset}`:" ".repeat(e.length),T=n.showReadTokens&&d>0?`${p.dim}(~${d}t)${p.reset}`:"",E=n.showWorkTokens&&c>0?`${p.dim}(${_} ${c.toLocaleString()}t)${p.reset}`:"";return o.push(` ${p.dim}#${r.id}${p.reset} ${l} ${a} ${p.bright}${i}${p.reset}`),s&&o.push(` ${p.dim}${s}${p.reset}`),(T||E)&&o.push(` ${T} ${E}`),o.push(""),o}function Ke(r,e){let t=`${r.request||"Session started"} (${e})`;return[`${p.yellow}#S${r.id}${p.reset} ${t}`,""]}function k(r,e,t){return e?[`${t}${r}:${p.reset} ${e}`,""]:[]}function Je(r){return r.assistantMessage?["","---","",`${p.bright}${p.magenta}Previously${p.reset}`,"",`${p.dim}A: ${r.assistantMessage}${p.reset}`,""]:[]}function Qe(r,e){let t=Math.round(r/1e3);return["",`${p.dim}Access ${t}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${p.reset}`]}function ze(r){return` ${p.bright}${p.cyan}[${r}] recent context, ${Pe()}${p.reset} ${p.gray}${"\u2500".repeat(60)}${p.reset} ${p.dim}No previous sessions found for this project yet.${p.reset} -`}function Ze(r,e,t,s){let n=[];return s?n.push(...Xe(r)):n.push(...Ae(r)),s?n.push(...je()):n.push(...Ie()),s?n.push(...Ge()):n.push(...ye()),s?n.push(...Be()):n.push(...Me()),P(t)&&(s?n.push(...He(e,t)):n.push(...Le(e,t))),n}var ee=L(require("path"),1);function B(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch(e){return _.debug("PARSER","Failed to parse JSON array, using empty fallback",{preview:r?.substring(0,50)},e),[]}}function tt(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function st(r){return new Date(r).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function rt(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function et(r,e){return ee.default.isAbsolute(r)?ee.default.relative(e,r):r}function nt(r,e,t){let s=B(r);if(s.length>0)return et(s[0],e);if(t){let n=B(t);if(n.length>0)return et(n[0],e)}return"General"}function At(r){let e=new Map;for(let s of r){let n=s.type==="observation"?s.data.created_at:s.data.displayTime,o=rt(n);e.has(o)||e.set(o,[]),e.get(o).push(s)}let t=Array.from(e.entries()).sort((s,n)=>{let o=new Date(s[0]).getTime(),i=new Date(n[0]).getTime();return o-i});return new Map(t)}function It(r,e){return e.fullObservationField==="narrative"?r.narrative:r.facts?B(r.facts).join(` -`):null}function yt(r,e,t,s,n,o){let i=[];o?i.push(...We(r)):i.push(...ve(r));let a=null,d="",c=!1;for(let m of e)if(m.type==="summary"){c&&(i.push(""),c=!1,a=null,d="");let l=m.data,T=tt(l.displayTime);o?i.push(...Ke(l,T)):i.push(...ke(l,T))}else{let l=m.data,T=nt(l.files_modified,n,l.files_read),E=st(l.created_at),g=E!==d,h=g?E:"";d=E;let u=t.has(l.id);if(T!==a&&(c&&i.push(""),o?i.push(...Ye(T)):i.push(...De(T)),a=T,c=!0),u){let S=It(l,s);o?i.push(...qe(l,E,g,S,s)):(c&&!o&&(i.push(""),c=!1),i.push(...Ue(l,h,S,s)),a=null)}else o?i.push(Ve(l,E,g,s)):i.push(xe(l,h,s))}return c&&i.push(""),i}function ot(r,e,t,s,n){let o=[],i=At(r);for(let[a,d]of i)o.push(...yt(a,d,e,t,s,n));return o}function it(r,e,t){return!(!r.showLastSummary||!e||!!!(e.investigated||e.learned||e.completed||e.next_steps)||t&&e.created_at_epoch<=t.created_at_epoch)}function at(r,e){let t=[];return e?(t.push(...U("Investigated",r.investigated,p.blue)),t.push(...U("Learned",r.learned,p.yellow)),t.push(...U("Completed",r.completed,p.green)),t.push(...U("Next Steps",r.next_steps,p.magenta))):(t.push(...x("Investigated",r.investigated)),t.push(...x("Learned",r.learned)),t.push(...x("Completed",r.completed)),t.push(...x("Next Steps",r.next_steps))),t}function dt(r,e){return e?Je(r):we(r)}function pt(r,e,t){return!P(e)||r.totalDiscoveryTokens<=0||r.savings<=0?[]:t?Qe(r.totalDiscoveryTokens,r.totalReadTokens):$e(r.totalDiscoveryTokens,r.totalReadTokens)}var Mt=ct.default.join((0,_t.homedir)(),".claude","plugins","marketplaces","thedotmack","plugin",".install-version");function Lt(){try{return new $}catch(r){if(r.code==="ERR_DLOPEN_FAILED"){try{(0,mt.unlinkSync)(Mt)}catch(e){_.debug("SYSTEM","Marker file cleanup failed (may not exist)",{},e)}return _.error("SYSTEM","Native module rebuild needed - restart Claude Code to auto-fix"),null}throw r}}function vt(r,e){return e?ze(r):Fe(r)}function Dt(r,e,t,s,n,o,i){let a=[],d=K(e);a.push(...Ze(r,d,s,i));let c=t.slice(0,s.sessionCount),m=Re(c,t),l=Z(e,m),T=Ne(e,s.fullObservationCount);a.push(...ot(l,T,s,n,i));let E=t[0],g=e[0];it(s,E,g)&&a.push(...at(E,i));let h=z(e,s,o,n);return a.push(...dt(h,i)),a.push(...pt(d,s,i)),a.join(` -`).trimEnd()}async function te(r,e=!1){let t=Y(),s=r?.cwd??process.cwd(),n=Te(s),o=r?.projects||[n],i=Lt();if(!i)return"";try{let a=o.length>1?he(i,o,t):J(i,n,t),d=o.length>1?Oe(i,o,t):Q(i,n,t);return a.length===0&&d.length===0?vt(n,e):Dt(n,a,d,t,s,r?.session_id,e)}finally{i.close()}}0&&(module.exports={generateContext}); +`}function Ze(r,e,t,s){let n=[];return s?n.push(...Xe(r)):n.push(...Ae(r)),s?n.push(...je()):n.push(...Ie()),s?n.push(...Ge()):n.push(...ye()),s?n.push(...Be()):n.push(...Le()),P(t)&&(s?n.push(...He(e,t)):n.push(...Me(e,t))),n}var ee=M(require("path"),1);function B(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch(e){return m.debug("PARSER","Failed to parse JSON array, using empty fallback",{preview:r?.substring(0,50)},e),[]}}function tt(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function st(r){return new Date(r).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function rt(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function et(r,e){return ee.default.isAbsolute(r)?ee.default.relative(e,r):r}function nt(r,e,t){let s=B(r);if(s.length>0)return et(s[0],e);if(t){let n=B(t);if(n.length>0)return et(n[0],e)}return"General"}function At(r){let e=new Map;for(let s of r){let n=s.type==="observation"?s.data.created_at:s.data.displayTime,o=rt(n);e.has(o)||e.set(o,[]),e.get(o).push(s)}let t=Array.from(e.entries()).sort((s,n)=>{let o=new Date(s[0]).getTime(),i=new Date(n[0]).getTime();return o-i});return new Map(t)}function It(r,e){return e.fullObservationField==="narrative"?r.narrative:r.facts?B(r.facts).join(` +`):null}function yt(r,e,t,s,n,o){let i=[];o?i.push(...We(r)):i.push(...ve(r));let a=null,d="",c=!1;for(let _ of e)if(_.type==="summary"){c&&(i.push(""),c=!1,a=null,d="");let l=_.data,T=tt(l.displayTime);o?i.push(...Ke(l,T)):i.push(...Ue(l,T))}else{let l=_.data,T=nt(l.files_modified,n,l.files_read),E=st(l.created_at),g=E!==d,h=g?E:"";d=E;let u=t.has(l.id);if(T!==a&&(c&&i.push(""),o?i.push(...Ye(T)):i.push(...De(T)),a=T,c=!0),u){let S=It(l,s);o?i.push(...qe(l,E,g,S,s)):(c&&!o&&(i.push(""),c=!1),i.push(...ke(l,h,S,s)),a=null)}else o?i.push(Ve(l,E,g,s)):i.push(xe(l,h,s))}return c&&i.push(""),i}function ot(r,e,t,s,n){let o=[],i=At(r);for(let[a,d]of i)o.push(...yt(a,d,e,t,s,n));return o}function it(r,e,t){return!(!r.showLastSummary||!e||!!!(e.investigated||e.learned||e.completed||e.next_steps)||t&&e.created_at_epoch<=t.created_at_epoch)}function at(r,e){let t=[];return e?(t.push(...k("Investigated",r.investigated,p.blue)),t.push(...k("Learned",r.learned,p.yellow)),t.push(...k("Completed",r.completed,p.green)),t.push(...k("Next Steps",r.next_steps,p.magenta))):(t.push(...x("Investigated",r.investigated)),t.push(...x("Learned",r.learned)),t.push(...x("Completed",r.completed)),t.push(...x("Next Steps",r.next_steps))),t}function dt(r,e){return e?Je(r):we(r)}function pt(r,e,t){return!P(e)||r.totalDiscoveryTokens<=0||r.savings<=0?[]:t?Qe(r.totalDiscoveryTokens,r.totalReadTokens):$e(r.totalDiscoveryTokens,r.totalReadTokens)}var Lt=ct.default.join((0,mt.homedir)(),".claude","plugins","marketplaces","thedotmack","plugin",".install-version");function Mt(){try{return new $}catch(r){if(r.code==="ERR_DLOPEN_FAILED"){try{(0,_t.unlinkSync)(Lt)}catch(e){m.debug("SYSTEM","Marker file cleanup failed (may not exist)",{},e)}return m.error("SYSTEM","Native module rebuild needed - restart Claude Code to auto-fix"),null}throw r}}function vt(r,e){return e?ze(r):Fe(r)}function Dt(r,e,t,s,n,o,i){let a=[],d=K(e);a.push(...Ze(r,d,s,i));let c=t.slice(0,s.sessionCount),_=Re(c,t),l=Z(e,_),T=Ne(e,s.fullObservationCount);a.push(...ot(l,T,s,n,i));let E=t[0],g=e[0];it(s,E,g)&&a.push(...at(E,i));let h=z(e,s,o,n);return a.push(...dt(h,i)),a.push(...pt(d,s,i)),a.join(` +`).trimEnd()}async function te(r,e=!1){let t=Y(),s=r?.cwd??process.cwd(),n=Te(s),o=r?.projects||[n],i=Mt();if(!i)return"";try{let a=o.length>1?he(i,o,t):J(i,n,t),d=o.length>1?Oe(i,o,t):Q(i,n,t);return a.length===0&&d.length===0?vt(n,e):Dt(n,a,d,t,s,r?.session_id,e)}finally{i.close()}}0&&(module.exports={generateContext}); diff --git a/plugin/scripts/mcp-server.cjs b/plugin/scripts/mcp-server.cjs index c430eb52..a23aab61 100755 --- a/plugin/scripts/mcp-server.cjs +++ b/plugin/scripts/mcp-server.cjs @@ -54,7 +54,7 @@ ${i.stack}`:` ${i.message}`:this.getLevel()===0&&typeof i=="object"?l=` Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let a of t.seen.entries()){let s=a[1];if(e===a[0]){i(a);continue}if(t.external){let u=t.external.registry.get(a[0])?.id;if(e!==a[0]&&u){i(a);continue}}if(t.metadataRegistry.get(a[0])?.id){i(a);continue}if(s.cycle){i(a);continue}if(s.count>1&&t.reused==="ref"){i(a);continue}}}function Yi(t,e){let r=t.seen.get(e);if(!r)throw new Error("Unprocessed schema. This is a bug in Zod.");let n=a=>{let s=t.seen.get(a);if(s.ref===null)return;let c=s.def??s.schema,u={...c},l=s.ref;if(s.ref=null,l){n(l);let m=t.seen.get(l),f=m.schema;if(f.$ref&&(t.target==="draft-07"||t.target==="draft-04"||t.target==="openapi-3.0")?(c.allOf=c.allOf??[],c.allOf.push(f)):Object.assign(c,f),Object.assign(c,u),a._zod.parent===l)for(let v in c)v==="$ref"||v==="allOf"||v in u||delete c[v];if(f.$ref)for(let v in c)v==="$ref"||v==="allOf"||v in m.def&&JSON.stringify(c[v])===JSON.stringify(m.def[v])&&delete c[v]}let d=a._zod.parent;if(d&&d!==l){n(d);let m=t.seen.get(d);if(m?.schema.$ref&&(c.$ref=m.schema.$ref,m.def))for(let f in c)f==="$ref"||f==="allOf"||f in m.def&&JSON.stringify(c[f])===JSON.stringify(m.def[f])&&delete c[f]}t.override({zodSchema:a,jsonSchema:c,path:s.path??[]})};for(let a of[...t.seen.entries()].reverse())n(a[0]);let o={};if(t.target==="draft-2020-12"?o.$schema="https://json-schema.org/draft/2020-12/schema":t.target==="draft-07"?o.$schema="http://json-schema.org/draft-07/schema#":t.target==="draft-04"?o.$schema="http://json-schema.org/draft-04/schema#":t.target,t.external?.uri){let a=t.external.registry.get(e)?.id;if(!a)throw new Error("Schema is missing an `id` property");o.$id=t.external.uri(a)}Object.assign(o,r.def??r.schema);let i=t.external?.defs??{};for(let a of t.seen.entries()){let s=a[1];s.def&&s.defId&&(i[s.defId]=s.def)}t.external||Object.keys(i).length>0&&(t.target==="draft-2020-12"?o.$defs=i:o.definitions=i);try{let a=JSON.parse(JSON.stringify(o));return Object.defineProperty(a,"~standard",{value:{...e["~standard"],jsonSchema:{input:fo(e,"input",t.processors),output:fo(e,"output",t.processors)}},enumerable:!1,writable:!1}),a}catch{throw new Error("Error converting schema to JSON.")}}function Ue(t,e){let r=e??{seen:new Set};if(r.seen.has(t))return!1;r.seen.add(t);let n=t._zod.def;if(n.type==="transform")return!0;if(n.type==="array")return Ue(n.element,r);if(n.type==="set")return Ue(n.valueType,r);if(n.type==="lazy")return Ue(n.getter(),r);if(n.type==="promise"||n.type==="optional"||n.type==="nonoptional"||n.type==="nullable"||n.type==="readonly"||n.type==="default"||n.type==="prefault")return Ue(n.innerType,r);if(n.type==="intersection")return Ue(n.left,r)||Ue(n.right,r);if(n.type==="record"||n.type==="map")return Ue(n.keyType,r)||Ue(n.valueType,r);if(n.type==="pipe")return Ue(n.in,r)||Ue(n.out,r);if(n.type==="object"){for(let o in n.shape)if(Ue(n.shape[o],r))return!0;return!1}if(n.type==="union"){for(let o of n.options)if(Ue(o,r))return!0;return!1}if(n.type==="tuple"){for(let o of n.items)if(Ue(o,r))return!0;return!!(n.rest&&Ue(n.rest,r))}return!1}var Pm=(t,e={})=>r=>{let n=Bi({...r,processors:e});return de(t,n),Xi(n,t),Yi(n,t)},fo=(t,e,r={})=>n=>{let{libraryOptions:o,target:i}=n??{},a=Bi({...o??{},target:i,io:e,processors:r});return de(t,a),Xi(a,t),Yi(a,t)};var wb={guid:"uuid",url:"uri",datetime:"date-time",json_string:"json-string",regex:""},Om=(t,e,r,n)=>{let o=r;o.type="string";let{minimum:i,maximum:a,format:s,patterns:c,contentEncoding:u}=t._zod.bag;if(typeof i=="number"&&(o.minLength=i),typeof a=="number"&&(o.maxLength=a),s&&(o.format=wb[s]??s,o.format===""&&delete o.format,s==="time"&&delete o.format),u&&(o.contentEncoding=u),c&&c.size>0){let l=[...c];l.length===1?o.pattern=l[0].source:l.length>1&&(o.allOf=[...l.map(d=>({...e.target==="draft-07"||e.target==="draft-04"||e.target==="openapi-3.0"?{type:"string"}:{},pattern:d.source}))])}},jm=(t,e,r,n)=>{let o=r,{minimum:i,maximum:a,format:s,multipleOf:c,exclusiveMaximum:u,exclusiveMinimum:l}=t._zod.bag;typeof s=="string"&&s.includes("int")?o.type="integer":o.type="number",typeof l=="number"&&(e.target==="draft-04"||e.target==="openapi-3.0"?(o.minimum=l,o.exclusiveMinimum=!0):o.exclusiveMinimum=l),typeof i=="number"&&(o.minimum=i,typeof l=="number"&&e.target!=="draft-04"&&(l>=i?delete o.minimum:delete o.exclusiveMinimum)),typeof u=="number"&&(e.target==="draft-04"||e.target==="openapi-3.0"?(o.maximum=u,o.exclusiveMaximum=!0):o.exclusiveMaximum=u),typeof a=="number"&&(o.maximum=a,typeof u=="number"&&e.target!=="draft-04"&&(u<=a?delete o.maximum:delete o.exclusiveMaximum)),typeof c=="number"&&(o.multipleOf=c)},Dm=(t,e,r,n)=>{r.type="boolean"},Nm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("BigInt cannot be represented in JSON Schema")},Rm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Symbols cannot be represented in JSON Schema")},Am=(t,e,r,n)=>{e.target==="openapi-3.0"?(r.type="string",r.nullable=!0,r.enum=[null]):r.type="null"},Um=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Undefined cannot be represented in JSON Schema")},Mm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Void cannot be represented in JSON Schema")},Cm=(t,e,r,n)=>{r.not={}},Zm=(t,e,r,n)=>{},Lm=(t,e,r,n)=>{},qm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Date cannot be represented in JSON Schema")},Fm=(t,e,r,n)=>{let o=t._zod.def,i=Nn(o.entries);i.every(a=>typeof a=="number")&&(r.type="number"),i.every(a=>typeof a=="string")&&(r.type="string"),r.enum=i},Vm=(t,e,r,n)=>{let o=t._zod.def,i=[];for(let a of o.values)if(a===void 0){if(e.unrepresentable==="throw")throw new Error("Literal `undefined` cannot be represented in JSON Schema")}else if(typeof a=="bigint"){if(e.unrepresentable==="throw")throw new Error("BigInt literals cannot be represented in JSON Schema");i.push(Number(a))}else i.push(a);if(i.length!==0)if(i.length===1){let a=i[0];r.type=a===null?"null":typeof a,e.target==="draft-04"||e.target==="openapi-3.0"?r.enum=[a]:r.const=a}else i.every(a=>typeof a=="number")&&(r.type="number"),i.every(a=>typeof a=="string")&&(r.type="string"),i.every(a=>typeof a=="boolean")&&(r.type="boolean"),i.every(a=>a===null)&&(r.type="null"),r.enum=i},Jm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("NaN cannot be represented in JSON Schema")},Km=(t,e,r,n)=>{let o=r,i=t._zod.pattern;if(!i)throw new Error("Pattern not found in template literal");o.type="string",o.pattern=i.source},Hm=(t,e,r,n)=>{let o=r,i={type:"string",format:"binary",contentEncoding:"binary"},{minimum:a,maximum:s,mime:c}=t._zod.bag;a!==void 0&&(i.minLength=a),s!==void 0&&(i.maxLength=s),c?c.length===1?(i.contentMediaType=c[0],Object.assign(o,i)):(Object.assign(o,i),o.anyOf=c.map(u=>({contentMediaType:u}))):Object.assign(o,i)},Wm=(t,e,r,n)=>{r.type="boolean"},Gm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Custom types cannot be represented in JSON Schema")},Bm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Function types cannot be represented in JSON Schema")},Xm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Transforms cannot be represented in JSON Schema")},Ym=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Map cannot be represented in JSON Schema")},Qm=(t,e,r,n)=>{if(e.unrepresentable==="throw")throw new Error("Set cannot be represented in JSON Schema")},eh=(t,e,r,n)=>{let o=r,i=t._zod.def,{minimum:a,maximum:s}=t._zod.bag;typeof a=="number"&&(o.minItems=a),typeof s=="number"&&(o.maxItems=s),o.type="array",o.items=de(i.element,e,{...n,path:[...n.path,"items"]})},th=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="object",o.properties={};let a=i.shape;for(let u in a)o.properties[u]=de(a[u],e,{...n,path:[...n.path,"properties",u]});let s=new Set(Object.keys(a)),c=new Set([...s].filter(u=>{let l=i.shape[u]._zod;return e.io==="input"?l.optin===void 0:l.optout===void 0}));c.size>0&&(o.required=Array.from(c)),i.catchall?._zod.def.type==="never"?o.additionalProperties=!1:i.catchall?i.catchall&&(o.additionalProperties=de(i.catchall,e,{...n,path:[...n.path,"additionalProperties"]})):e.io==="output"&&(o.additionalProperties=!1)},hl=(t,e,r,n)=>{let o=t._zod.def,i=o.inclusive===!1,a=o.options.map((s,c)=>de(s,e,{...n,path:[...n.path,i?"oneOf":"anyOf",c]}));i?r.oneOf=a:r.anyOf=a},rh=(t,e,r,n)=>{let o=t._zod.def,i=de(o.left,e,{...n,path:[...n.path,"allOf",0]}),a=de(o.right,e,{...n,path:[...n.path,"allOf",1]}),s=u=>"allOf"in u&&Object.keys(u).length===1,c=[...s(i)?i.allOf:[i],...s(a)?a.allOf:[a]];r.allOf=c},nh=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="array";let a=e.target==="draft-2020-12"?"prefixItems":"items",s=e.target==="draft-2020-12"||e.target==="openapi-3.0"?"items":"additionalItems",c=i.items.map((m,f)=>de(m,e,{...n,path:[...n.path,a,f]})),u=i.rest?de(i.rest,e,{...n,path:[...n.path,s,...e.target==="openapi-3.0"?[i.items.length]:[]]}):null;e.target==="draft-2020-12"?(o.prefixItems=c,u&&(o.items=u)):e.target==="openapi-3.0"?(o.items={anyOf:c},u&&o.items.anyOf.push(u),o.minItems=c.length,u||(o.maxItems=c.length)):(o.items=c,u&&(o.additionalItems=u));let{minimum:l,maximum:d}=t._zod.bag;typeof l=="number"&&(o.minItems=l),typeof d=="number"&&(o.maxItems=d)},oh=(t,e,r,n)=>{let o=r,i=t._zod.def;o.type="object";let a=i.keyType,c=a._zod.bag?.patterns;if(i.mode==="loose"&&c&&c.size>0){let l=de(i.valueType,e,{...n,path:[...n.path,"patternProperties","*"]});o.patternProperties={};for(let d of c)o.patternProperties[d.source]=l}else(e.target==="draft-07"||e.target==="draft-2020-12")&&(o.propertyNames=de(i.keyType,e,{...n,path:[...n.path,"propertyNames"]})),o.additionalProperties=de(i.valueType,e,{...n,path:[...n.path,"additionalProperties"]});let u=a._zod.values;if(u){let l=[...u].filter(d=>typeof d=="string"||typeof d=="number");l.length>0&&(o.required=l)}},ih=(t,e,r,n)=>{let o=t._zod.def,i=de(o.innerType,e,n),a=e.seen.get(t);e.target==="openapi-3.0"?(a.ref=o.innerType,r.nullable=!0):r.anyOf=[i,{type:"null"}]},ah=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},sh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,r.default=JSON.parse(JSON.stringify(o.defaultValue))},ch=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,e.io==="input"&&(r._prefault=JSON.parse(JSON.stringify(o.defaultValue)))},uh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType;let a;try{a=o.catchValue(void 0)}catch{throw new Error("Dynamic catch values are not supported in JSON Schema")}r.default=a},lh=(t,e,r,n)=>{let o=t._zod.def,i=e.io==="input"?o.in._zod.def.type==="transform"?o.out:o.in:o.out;de(i,e,n);let a=e.seen.get(t);a.ref=i},dh=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType,r.readOnly=!0},ph=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},gl=(t,e,r,n)=>{let o=t._zod.def;de(o.innerType,e,n);let i=e.seen.get(t);i.ref=o.innerType},fh=(t,e,r,n)=>{let o=t._zod.innerType;de(o,e,n);let i=e.seen.get(t);i.ref=o};function Br(t){return!!t._zod}function Yt(t,e){return Br(t)?Jr(t,e):t.safeParse(e)}function Qi(t){if(!t)return;let e;if(Br(t)?e=t._zod?.def?.shape:e=t.shape,!!e){if(typeof e=="function")try{return e()}catch{return}return e}}function vh(t){if(Br(t)){let i=t._zod?.def;if(i){if(i.value!==void 0)return i.value;if(Array.isArray(i.values)&&i.values.length>0)return i.values[0]}}let r=t._def;if(r){if(r.value!==void 0)return r.value;if(Array.isArray(r.values)&&r.values.length>0)return r.values[0]}let n=t.value;if(n!==void 0)return n}var mo={};yn(mo,{ZodAny:()=>Rh,ZodArray:()=>Ch,ZodBase64:()=>Zl,ZodBase64URL:()=>Ll,ZodBigInt:()=>ca,ZodBigIntFormat:()=>Vl,ZodBoolean:()=>sa,ZodCIDRv4:()=>Ml,ZodCIDRv6:()=>Cl,ZodCUID:()=>Ol,ZodCUID2:()=>jl,ZodCatch:()=>ig,ZodCodec:()=>Xl,ZodCustom:()=>fa,ZodCustomStringFormat:()=>go,ZodDate:()=>Kl,ZodDefault:()=>Qh,ZodDiscriminatedUnion:()=>Lh,ZodE164:()=>ql,ZodEmail:()=>El,ZodEmoji:()=>Tl,ZodEnum:()=>ho,ZodExactOptional:()=>Bh,ZodFile:()=>Wh,ZodFunction:()=>mg,ZodGUID:()=>ta,ZodIPv4:()=>Al,ZodIPv6:()=>Ul,ZodIntersection:()=>qh,ZodJWT:()=>Fl,ZodKSUID:()=>Rl,ZodLazy:()=>dg,ZodLiteral:()=>Hh,ZodMAC:()=>Oh,ZodMap:()=>Jh,ZodNaN:()=>sg,ZodNanoID:()=>Pl,ZodNever:()=>Uh,ZodNonOptional:()=>Gl,ZodNull:()=>Nh,ZodNullable:()=>Yh,ZodNumber:()=>aa,ZodNumberFormat:()=>Xr,ZodObject:()=>ua,ZodOptional:()=>Wl,ZodPipe:()=>Bl,ZodPrefault:()=>tg,ZodPromise:()=>fg,ZodReadonly:()=>cg,ZodRecord:()=>pa,ZodSet:()=>Kh,ZodString:()=>oa,ZodStringFormat:()=>ce,ZodSuccess:()=>og,ZodSymbol:()=>jh,ZodTemplateLiteral:()=>lg,ZodTransform:()=>Gh,ZodTuple:()=>Fh,ZodType:()=>q,ZodULID:()=>Dl,ZodURL:()=>ia,ZodUUID:()=>Rt,ZodUndefined:()=>Dh,ZodUnion:()=>la,ZodUnknown:()=>Ah,ZodVoid:()=>Mh,ZodXID:()=>Nl,ZodXor:()=>Zh,_ZodString:()=>Il,_default:()=>eg,_function:()=>Fx,any:()=>wx,array:()=>G,base64:()=>cx,base64url:()=>ux,bigint:()=>$x,boolean:()=>_e,catch:()=>ag,check:()=>Vx,cidrv4:()=>ax,cidrv6:()=>sx,codec:()=>Zx,cuid:()=>Yb,cuid2:()=>Qb,custom:()=>Yl,date:()=>Ix,describe:()=>Jx,discriminatedUnion:()=>da,e164:()=>lx,email:()=>qb,emoji:()=>Bb,enum:()=>Te,exactOptional:()=>Xh,file:()=>Ax,float32:()=>gx,float64:()=>vx,function:()=>Fx,guid:()=>Fb,hash:()=>hx,hex:()=>mx,hostname:()=>fx,httpUrl:()=>Gb,instanceof:()=>Hx,int:()=>zl,int32:()=>_x,int64:()=>bx,intersection:()=>_o,ipv4:()=>nx,ipv6:()=>ix,json:()=>Gx,jwt:()=>dx,keyof:()=>Ex,ksuid:()=>rx,lazy:()=>pg,literal:()=>T,looseObject:()=>Ee,looseRecord:()=>jx,mac:()=>ox,map:()=>Dx,meta:()=>Kx,nan:()=>Cx,nanoid:()=>Xb,nativeEnum:()=>Rx,never:()=>Jl,nonoptional:()=>ng,null:()=>vo,nullable:()=>ra,nullish:()=>Ux,number:()=>ne,object:()=>z,optional:()=>fe,partialRecord:()=>Ox,pipe:()=>na,prefault:()=>rg,preprocess:()=>ma,promise:()=>qx,readonly:()=>ug,record:()=>pe,refine:()=>hg,set:()=>Nx,strictObject:()=>Tx,string:()=>h,stringFormat:()=>px,stringbool:()=>Wx,success:()=>Mx,superRefine:()=>gg,symbol:()=>kx,templateLiteral:()=>Lx,transform:()=>Hl,tuple:()=>Vh,uint32:()=>yx,uint64:()=>xx,ulid:()=>ex,undefined:()=>Sx,union:()=>ie,unknown:()=>ue,url:()=>Wb,uuid:()=>Vb,uuidv4:()=>Jb,uuidv6:()=>Kb,uuidv7:()=>Hb,void:()=>zx,xid:()=>tx,xor:()=>Px});var ea={};yn(ea,{endsWith:()=>ao,gt:()=>Dt,gte:()=>Ae,includes:()=>oo,length:()=>Wr,lowercase:()=>ro,lt:()=>jt,lte:()=>We,maxLength:()=>Hr,maxSize:()=>gr,mime:()=>so,minLength:()=>Xt,minSize:()=>Nt,multipleOf:()=>hr,negative:()=>ol,nonnegative:()=>al,nonpositive:()=>il,normalize:()=>co,overwrite:()=>_t,positive:()=>nl,property:()=>sl,regex:()=>to,size:()=>Kr,slugify:()=>Gi,startsWith:()=>io,toLowerCase:()=>lo,toUpperCase:()=>po,trim:()=>uo,uppercase:()=>no});var vr={};yn(vr,{ZodISODate:()=>$l,ZodISODateTime:()=>_l,ZodISODuration:()=>Sl,ZodISOTime:()=>xl,date:()=>bl,datetime:()=>yl,duration:()=>wl,time:()=>kl});var _l=p("ZodISODateTime",(t,e)=>{jc.init(t,e),ce.init(t,e)});function yl(t){return Nu(_l,t)}var $l=p("ZodISODate",(t,e)=>{Dc.init(t,e),ce.init(t,e)});function bl(t){return Ru($l,t)}var xl=p("ZodISOTime",(t,e)=>{Nc.init(t,e),ce.init(t,e)});function kl(t){return Au(xl,t)}var Sl=p("ZodISODuration",(t,e)=>{Rc.init(t,e),ce.init(t,e)});function wl(t){return Uu(Sl,t)}var _h=(t,e)=>{mi.init(t,e),t.name="ZodError",Object.defineProperties(t,{format:{value:r=>gi(t,r)},flatten:{value:r=>hi(t,r)},addIssue:{value:r=>{t.issues.push(r),t.message=JSON.stringify(t.issues,qr,2)}},addIssues:{value:r=>{t.issues.push(...r),t.message=JSON.stringify(t.issues,qr,2)}},isEmpty:{get(){return t.issues.length===0}}})},LN=p("ZodError",_h),Ge=p("ZodError",_h,{Parent:Error});var yh=Zn(Ge),$h=qn(Ge),bh=Vn(Ge),xh=Jn(Ge),kh=Df(Ge),Sh=Nf(Ge),wh=Rf(Ge),zh=Af(Ge),Ih=Uf(Ge),Eh=Mf(Ge),Th=Cf(Ge),Ph=Zf(Ge);var q=p("ZodType",(t,e)=>(Z.init(t,e),Object.assign(t["~standard"],{jsonSchema:{input:fo(t,"input"),output:fo(t,"output")}}),t.toJSONSchema=Pm(t,{}),t.def=e,t.type=e.type,Object.defineProperty(t,"_def",{value:e}),t.check=(...r)=>t.clone(y.mergeDefs(e,{checks:[...e.checks??[],...r.map(n=>typeof n=="function"?{_zod:{check:n,def:{check:"custom"},onattach:[]}}:n)]}),{parent:!0}),t.with=t.check,t.clone=(r,n)=>Ne(t,r,n),t.brand=()=>t,t.register=((r,n)=>(r.add(t,n),t)),t.parse=(r,n)=>yh(t,r,n,{callee:t.parse}),t.safeParse=(r,n)=>bh(t,r,n),t.parseAsync=async(r,n)=>$h(t,r,n,{callee:t.parseAsync}),t.safeParseAsync=async(r,n)=>xh(t,r,n),t.spa=t.safeParseAsync,t.encode=(r,n)=>kh(t,r,n),t.decode=(r,n)=>Sh(t,r,n),t.encodeAsync=async(r,n)=>wh(t,r,n),t.decodeAsync=async(r,n)=>zh(t,r,n),t.safeEncode=(r,n)=>Ih(t,r,n),t.safeDecode=(r,n)=>Eh(t,r,n),t.safeEncodeAsync=async(r,n)=>Th(t,r,n),t.safeDecodeAsync=async(r,n)=>Ph(t,r,n),t.refine=(r,n)=>t.check(hg(r,n)),t.superRefine=r=>t.check(gg(r)),t.overwrite=r=>t.check(_t(r)),t.optional=()=>fe(t),t.exactOptional=()=>Xh(t),t.nullable=()=>ra(t),t.nullish=()=>fe(ra(t)),t.nonoptional=r=>ng(t,r),t.array=()=>G(t),t.or=r=>ie([t,r]),t.and=r=>_o(t,r),t.transform=r=>na(t,Hl(r)),t.default=r=>eg(t,r),t.prefault=r=>rg(t,r),t.catch=r=>ag(t,r),t.pipe=r=>na(t,r),t.readonly=()=>ug(t),t.describe=r=>{let n=t.clone();return Re.add(n,{description:r}),n},Object.defineProperty(t,"description",{get(){return Re.get(t)?.description},configurable:!0}),t.meta=(...r)=>{if(r.length===0)return Re.get(t);let n=t.clone();return Re.add(n,r[0]),n},t.isOptional=()=>t.safeParse(void 0).success,t.isNullable=()=>t.safeParse(null).success,t.apply=r=>r(t),t)),Il=p("_ZodString",(t,e)=>{mr.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Om(t,n,o,i);let r=t._zod.bag;t.format=r.format??null,t.minLength=r.minimum??null,t.maxLength=r.maximum??null,t.regex=(...n)=>t.check(to(...n)),t.includes=(...n)=>t.check(oo(...n)),t.startsWith=(...n)=>t.check(io(...n)),t.endsWith=(...n)=>t.check(ao(...n)),t.min=(...n)=>t.check(Xt(...n)),t.max=(...n)=>t.check(Hr(...n)),t.length=(...n)=>t.check(Wr(...n)),t.nonempty=(...n)=>t.check(Xt(1,...n)),t.lowercase=n=>t.check(ro(n)),t.uppercase=n=>t.check(no(n)),t.trim=()=>t.check(uo()),t.normalize=(...n)=>t.check(co(...n)),t.toLowerCase=()=>t.check(lo()),t.toUpperCase=()=>t.check(po()),t.slugify=()=>t.check(Gi())}),oa=p("ZodString",(t,e)=>{mr.init(t,e),Il.init(t,e),t.email=r=>t.check(Ti(El,r)),t.url=r=>t.check(eo(ia,r)),t.jwt=r=>t.check(Wi(Fl,r)),t.emoji=r=>t.check(Ni(Tl,r)),t.guid=r=>t.check(Qn(ta,r)),t.uuid=r=>t.check(Pi(Rt,r)),t.uuidv4=r=>t.check(Oi(Rt,r)),t.uuidv6=r=>t.check(ji(Rt,r)),t.uuidv7=r=>t.check(Di(Rt,r)),t.nanoid=r=>t.check(Ri(Pl,r)),t.guid=r=>t.check(Qn(ta,r)),t.cuid=r=>t.check(Ai(Ol,r)),t.cuid2=r=>t.check(Ui(jl,r)),t.ulid=r=>t.check(Mi(Dl,r)),t.base64=r=>t.check(Ji(Zl,r)),t.base64url=r=>t.check(Ki(Ll,r)),t.xid=r=>t.check(Ci(Nl,r)),t.ksuid=r=>t.check(Zi(Rl,r)),t.ipv4=r=>t.check(Li(Al,r)),t.ipv6=r=>t.check(qi(Ul,r)),t.cidrv4=r=>t.check(Fi(Ml,r)),t.cidrv6=r=>t.check(Vi(Cl,r)),t.e164=r=>t.check(Hi(ql,r)),t.datetime=r=>t.check(yl(r)),t.date=r=>t.check(bl(r)),t.time=r=>t.check(kl(r)),t.duration=r=>t.check(wl(r))});function h(t){return ju(oa,t)}var ce=p("ZodStringFormat",(t,e)=>{oe.init(t,e),Il.init(t,e)}),El=p("ZodEmail",(t,e)=>{kc.init(t,e),ce.init(t,e)});function qb(t){return Ti(El,t)}var ta=p("ZodGUID",(t,e)=>{bc.init(t,e),ce.init(t,e)});function Fb(t){return Qn(ta,t)}var Rt=p("ZodUUID",(t,e)=>{xc.init(t,e),ce.init(t,e)});function Vb(t){return Pi(Rt,t)}function Jb(t){return Oi(Rt,t)}function Kb(t){return ji(Rt,t)}function Hb(t){return Di(Rt,t)}var ia=p("ZodURL",(t,e)=>{Sc.init(t,e),ce.init(t,e)});function Wb(t){return eo(ia,t)}function Gb(t){return eo(ia,{protocol:/^https?$/,hostname:Qe.domain,...y.normalizeParams(t)})}var Tl=p("ZodEmoji",(t,e)=>{wc.init(t,e),ce.init(t,e)});function Bb(t){return Ni(Tl,t)}var Pl=p("ZodNanoID",(t,e)=>{zc.init(t,e),ce.init(t,e)});function Xb(t){return Ri(Pl,t)}var Ol=p("ZodCUID",(t,e)=>{Ic.init(t,e),ce.init(t,e)});function Yb(t){return Ai(Ol,t)}var jl=p("ZodCUID2",(t,e)=>{Ec.init(t,e),ce.init(t,e)});function Qb(t){return Ui(jl,t)}var Dl=p("ZodULID",(t,e)=>{Tc.init(t,e),ce.init(t,e)});function ex(t){return Mi(Dl,t)}var Nl=p("ZodXID",(t,e)=>{Pc.init(t,e),ce.init(t,e)});function tx(t){return Ci(Nl,t)}var Rl=p("ZodKSUID",(t,e)=>{Oc.init(t,e),ce.init(t,e)});function rx(t){return Zi(Rl,t)}var Al=p("ZodIPv4",(t,e)=>{Ac.init(t,e),ce.init(t,e)});function nx(t){return Li(Al,t)}var Oh=p("ZodMAC",(t,e)=>{Mc.init(t,e),ce.init(t,e)});function ox(t){return Du(Oh,t)}var Ul=p("ZodIPv6",(t,e)=>{Uc.init(t,e),ce.init(t,e)});function ix(t){return qi(Ul,t)}var Ml=p("ZodCIDRv4",(t,e)=>{Cc.init(t,e),ce.init(t,e)});function ax(t){return Fi(Ml,t)}var Cl=p("ZodCIDRv6",(t,e)=>{Zc.init(t,e),ce.init(t,e)});function sx(t){return Vi(Cl,t)}var Zl=p("ZodBase64",(t,e)=>{Lc.init(t,e),ce.init(t,e)});function cx(t){return Ji(Zl,t)}var Ll=p("ZodBase64URL",(t,e)=>{qc.init(t,e),ce.init(t,e)});function ux(t){return Ki(Ll,t)}var ql=p("ZodE164",(t,e)=>{Fc.init(t,e),ce.init(t,e)});function lx(t){return Hi(ql,t)}var Fl=p("ZodJWT",(t,e)=>{Vc.init(t,e),ce.init(t,e)});function dx(t){return Wi(Fl,t)}var go=p("ZodCustomStringFormat",(t,e)=>{Jc.init(t,e),ce.init(t,e)});function px(t,e,r={}){return Gr(go,t,e,r)}function fx(t){return Gr(go,"hostname",Qe.hostname,t)}function mx(t){return Gr(go,"hex",Qe.hex,t)}function hx(t,e){let r=e?.enc??"hex",n=`${t}_${r}`,o=Qe[n];if(!o)throw new Error(`Unrecognized hash format: ${n}`);return Gr(go,n,o,e)}var aa=p("ZodNumber",(t,e)=>{wi.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>jm(t,n,o,i),t.gt=(n,o)=>t.check(Dt(n,o)),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.lt=(n,o)=>t.check(jt(n,o)),t.lte=(n,o)=>t.check(We(n,o)),t.max=(n,o)=>t.check(We(n,o)),t.int=n=>t.check(zl(n)),t.safe=n=>t.check(zl(n)),t.positive=n=>t.check(Dt(0,n)),t.nonnegative=n=>t.check(Ae(0,n)),t.negative=n=>t.check(jt(0,n)),t.nonpositive=n=>t.check(We(0,n)),t.multipleOf=(n,o)=>t.check(hr(n,o)),t.step=(n,o)=>t.check(hr(n,o)),t.finite=()=>t;let r=t._zod.bag;t.minValue=Math.max(r.minimum??Number.NEGATIVE_INFINITY,r.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,t.maxValue=Math.min(r.maximum??Number.POSITIVE_INFINITY,r.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,t.isInt=(r.format??"").includes("int")||Number.isSafeInteger(r.multipleOf??.5),t.isFinite=!0,t.format=r.format??null});function ne(t){return Mu(aa,t)}var Xr=p("ZodNumberFormat",(t,e)=>{Kc.init(t,e),aa.init(t,e)});function zl(t){return Cu(Xr,t)}function gx(t){return Zu(Xr,t)}function vx(t){return Lu(Xr,t)}function _x(t){return qu(Xr,t)}function yx(t){return Fu(Xr,t)}var sa=p("ZodBoolean",(t,e)=>{Bn.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Dm(t,r,n,o)});function _e(t){return Vu(sa,t)}var ca=p("ZodBigInt",(t,e)=>{zi.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Nm(t,n,o,i),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.gt=(n,o)=>t.check(Dt(n,o)),t.gte=(n,o)=>t.check(Ae(n,o)),t.min=(n,o)=>t.check(Ae(n,o)),t.lt=(n,o)=>t.check(jt(n,o)),t.lte=(n,o)=>t.check(We(n,o)),t.max=(n,o)=>t.check(We(n,o)),t.positive=n=>t.check(Dt(BigInt(0),n)),t.negative=n=>t.check(jt(BigInt(0),n)),t.nonpositive=n=>t.check(We(BigInt(0),n)),t.nonnegative=n=>t.check(Ae(BigInt(0),n)),t.multipleOf=(n,o)=>t.check(hr(n,o));let r=t._zod.bag;t.minValue=r.minimum??null,t.maxValue=r.maximum??null,t.format=r.format??null});function $x(t){return Ju(ca,t)}var Vl=p("ZodBigIntFormat",(t,e)=>{Hc.init(t,e),ca.init(t,e)});function bx(t){return Ku(Vl,t)}function xx(t){return Hu(Vl,t)}var jh=p("ZodSymbol",(t,e)=>{Wc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Rm(t,r,n,o)});function kx(t){return Wu(jh,t)}var Dh=p("ZodUndefined",(t,e)=>{Gc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Um(t,r,n,o)});function Sx(t){return Gu(Dh,t)}var Nh=p("ZodNull",(t,e)=>{Bc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Am(t,r,n,o)});function vo(t){return Bu(Nh,t)}var Rh=p("ZodAny",(t,e)=>{Xc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Zm(t,r,n,o)});function wx(){return Xu(Rh)}var Ah=p("ZodUnknown",(t,e)=>{Yc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Lm(t,r,n,o)});function ue(){return Yu(Ah)}var Uh=p("ZodNever",(t,e)=>{Qc.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Cm(t,r,n,o)});function Jl(t){return Qu(Uh,t)}var Mh=p("ZodVoid",(t,e)=>{eu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Mm(t,r,n,o)});function zx(t){return el(Mh,t)}var Kl=p("ZodDate",(t,e)=>{tu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>qm(t,n,o,i),t.min=(n,o)=>t.check(Ae(n,o)),t.max=(n,o)=>t.check(We(n,o));let r=t._zod.bag;t.minDate=r.minimum?new Date(r.minimum):null,t.maxDate=r.maximum?new Date(r.maximum):null});function Ix(t){return tl(Kl,t)}var Ch=p("ZodArray",(t,e)=>{ru.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>eh(t,r,n,o),t.element=e.element,t.min=(r,n)=>t.check(Xt(r,n)),t.nonempty=r=>t.check(Xt(1,r)),t.max=(r,n)=>t.check(Hr(r,n)),t.length=(r,n)=>t.check(Wr(r,n)),t.unwrap=()=>t.element});function G(t,e){return Tm(Ch,t,e)}function Ex(t){let e=t._zod.def.shape;return Te(Object.keys(e))}var ua=p("ZodObject",(t,e)=>{Im.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>th(t,r,n,o),y.defineLazy(t,"shape",()=>e.shape),t.keyof=()=>Te(Object.keys(t._zod.def.shape)),t.catchall=r=>t.clone({...t._zod.def,catchall:r}),t.passthrough=()=>t.clone({...t._zod.def,catchall:ue()}),t.loose=()=>t.clone({...t._zod.def,catchall:ue()}),t.strict=()=>t.clone({...t._zod.def,catchall:Jl()}),t.strip=()=>t.clone({...t._zod.def,catchall:void 0}),t.extend=r=>y.extend(t,r),t.safeExtend=r=>y.safeExtend(t,r),t.merge=r=>y.merge(t,r),t.pick=r=>y.pick(t,r),t.omit=r=>y.omit(t,r),t.partial=(...r)=>y.partial(Wl,t,r[0]),t.required=(...r)=>y.required(Gl,t,r[0])});function z(t,e){let r={type:"object",shape:t??{},...y.normalizeParams(e)};return new ua(r)}function Tx(t,e){return new ua({type:"object",shape:t,catchall:Jl(),...y.normalizeParams(e)})}function Ee(t,e){return new ua({type:"object",shape:t,catchall:ue(),...y.normalizeParams(e)})}var la=p("ZodUnion",(t,e)=>{Xn.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>hl(t,r,n,o),t.options=e.options});function ie(t,e){return new la({type:"union",options:t,...y.normalizeParams(e)})}var Zh=p("ZodXor",(t,e)=>{la.init(t,e),nu.init(t,e),t._zod.processJSONSchema=(r,n,o)=>hl(t,r,n,o),t.options=e.options});function Px(t,e){return new Zh({type:"union",options:t,inclusive:!1,...y.normalizeParams(e)})}var Lh=p("ZodDiscriminatedUnion",(t,e)=>{la.init(t,e),ou.init(t,e)});function da(t,e,r){return new Lh({type:"union",options:e,discriminator:t,...y.normalizeParams(r)})}var qh=p("ZodIntersection",(t,e)=>{iu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>rh(t,r,n,o)});function _o(t,e){return new qh({type:"intersection",left:t,right:e})}var Fh=p("ZodTuple",(t,e)=>{Ii.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>nh(t,r,n,o),t.rest=r=>t.clone({...t._zod.def,rest:r})});function Vh(t,e,r){let n=e instanceof Z,o=n?r:e,i=n?e:null;return new Fh({type:"tuple",items:t,rest:i,...y.normalizeParams(o)})}var pa=p("ZodRecord",(t,e)=>{au.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>oh(t,r,n,o),t.keyType=e.keyType,t.valueType=e.valueType});function pe(t,e,r){return new pa({type:"record",keyType:t,valueType:e,...y.normalizeParams(r)})}function Ox(t,e,r){let n=Ne(t);return n._zod.values=void 0,new pa({type:"record",keyType:n,valueType:e,...y.normalizeParams(r)})}function jx(t,e,r){return new pa({type:"record",keyType:t,valueType:e,mode:"loose",...y.normalizeParams(r)})}var Jh=p("ZodMap",(t,e)=>{su.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Ym(t,r,n,o),t.keyType=e.keyType,t.valueType=e.valueType,t.min=(...r)=>t.check(Nt(...r)),t.nonempty=r=>t.check(Nt(1,r)),t.max=(...r)=>t.check(gr(...r)),t.size=(...r)=>t.check(Kr(...r))});function Dx(t,e,r){return new Jh({type:"map",keyType:t,valueType:e,...y.normalizeParams(r)})}var Kh=p("ZodSet",(t,e)=>{cu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Qm(t,r,n,o),t.min=(...r)=>t.check(Nt(...r)),t.nonempty=r=>t.check(Nt(1,r)),t.max=(...r)=>t.check(gr(...r)),t.size=(...r)=>t.check(Kr(...r))});function Nx(t,e){return new Kh({type:"set",valueType:t,...y.normalizeParams(e)})}var ho=p("ZodEnum",(t,e)=>{uu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(n,o,i)=>Fm(t,n,o,i),t.enum=e.entries,t.options=Object.values(e.entries);let r=new Set(Object.keys(e.entries));t.extract=(n,o)=>{let i={};for(let a of n)if(r.has(a))i[a]=e.entries[a];else throw new Error(`Key ${a} not found in enum`);return new ho({...e,checks:[],...y.normalizeParams(o),entries:i})},t.exclude=(n,o)=>{let i={...e.entries};for(let a of n)if(r.has(a))delete i[a];else throw new Error(`Key ${a} not found in enum`);return new ho({...e,checks:[],...y.normalizeParams(o),entries:i})}});function Te(t,e){let r=Array.isArray(t)?Object.fromEntries(t.map(n=>[n,n])):t;return new ho({type:"enum",entries:r,...y.normalizeParams(e)})}function Rx(t,e){return new ho({type:"enum",entries:t,...y.normalizeParams(e)})}var Hh=p("ZodLiteral",(t,e)=>{lu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Vm(t,r,n,o),t.values=new Set(e.values),Object.defineProperty(t,"value",{get(){if(e.values.length>1)throw new Error("This schema contains multiple valid literal values. Use `.values` instead.");return e.values[0]}})});function T(t,e){return new Hh({type:"literal",values:Array.isArray(t)?t:[t],...y.normalizeParams(e)})}var Wh=p("ZodFile",(t,e)=>{du.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Hm(t,r,n,o),t.min=(r,n)=>t.check(Nt(r,n)),t.max=(r,n)=>t.check(gr(r,n)),t.mime=(r,n)=>t.check(so(Array.isArray(r)?r:[r],n))});function Ax(t){return cl(Wh,t)}var Gh=p("ZodTransform",(t,e)=>{pu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Xm(t,r,n,o),t._zod.parse=(r,n)=>{if(n.direction==="backward")throw new dr(t.constructor.name);r.addIssue=i=>{if(typeof i=="string")r.issues.push(y.issue(i,r.value,e));else{let a=i;a.fatal&&(a.continue=!1),a.code??(a.code="custom"),a.input??(a.input=r.value),a.inst??(a.inst=t),r.issues.push(y.issue(a))}};let o=e.transform(r.value,r);return o instanceof Promise?o.then(i=>(r.value=i,r)):(r.value=o,r)}});function Hl(t){return new Gh({type:"transform",transform:t})}var Wl=p("ZodOptional",(t,e)=>{Ei.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>gl(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function fe(t){return new Wl({type:"optional",innerType:t})}var Bh=p("ZodExactOptional",(t,e)=>{fu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>gl(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function Xh(t){return new Bh({type:"optional",innerType:t})}var Yh=p("ZodNullable",(t,e)=>{mu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ih(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ra(t){return new Yh({type:"nullable",innerType:t})}function Ux(t){return fe(ra(t))}var Qh=p("ZodDefault",(t,e)=>{hu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>sh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType,t.removeDefault=t.unwrap});function eg(t,e){return new Qh({type:"default",innerType:t,get defaultValue(){return typeof e=="function"?e():y.shallowClone(e)}})}var tg=p("ZodPrefault",(t,e)=>{gu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ch(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function rg(t,e){return new tg({type:"prefault",innerType:t,get defaultValue(){return typeof e=="function"?e():y.shallowClone(e)}})}var Gl=p("ZodNonOptional",(t,e)=>{vu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ah(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ng(t,e){return new Gl({type:"nonoptional",innerType:t,...y.normalizeParams(e)})}var og=p("ZodSuccess",(t,e)=>{_u.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Wm(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function Mx(t){return new og({type:"success",innerType:t})}var ig=p("ZodCatch",(t,e)=>{yu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>uh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType,t.removeCatch=t.unwrap});function ag(t,e){return new ig({type:"catch",innerType:t,catchValue:typeof e=="function"?e:()=>e})}var sg=p("ZodNaN",(t,e)=>{$u.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Jm(t,r,n,o)});function Cx(t){return rl(sg,t)}var Bl=p("ZodPipe",(t,e)=>{bu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>lh(t,r,n,o),t.in=e.in,t.out=e.out});function na(t,e){return new Bl({type:"pipe",in:t,out:e})}var Xl=p("ZodCodec",(t,e)=>{Bl.init(t,e),Yn.init(t,e)});function Zx(t,e,r){return new Xl({type:"pipe",in:t,out:e,transform:r.decode,reverseTransform:r.encode})}var cg=p("ZodReadonly",(t,e)=>{xu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>dh(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function ug(t){return new cg({type:"readonly",innerType:t})}var lg=p("ZodTemplateLiteral",(t,e)=>{ku.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Km(t,r,n,o)});function Lx(t,e){return new lg({type:"template_literal",parts:t,...y.normalizeParams(e)})}var dg=p("ZodLazy",(t,e)=>{zu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>fh(t,r,n,o),t.unwrap=()=>t._zod.def.getter()});function pg(t){return new dg({type:"lazy",getter:t})}var fg=p("ZodPromise",(t,e)=>{wu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>ph(t,r,n,o),t.unwrap=()=>t._zod.def.innerType});function qx(t){return new fg({type:"promise",innerType:t})}var mg=p("ZodFunction",(t,e)=>{Su.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Bm(t,r,n,o)});function Fx(t){return new mg({type:"function",input:Array.isArray(t?.input)?Vh(t?.input):t?.input??G(ue()),output:t?.output??ue()})}var fa=p("ZodCustom",(t,e)=>{Iu.init(t,e),q.init(t,e),t._zod.processJSONSchema=(r,n,o)=>Gm(t,r,n,o)});function Vx(t){let e=new se({check:"custom"});return e._zod.check=t,e}function Yl(t,e){return ul(fa,t??(()=>!0),e)}function hg(t,e={}){return ll(fa,t,e)}function gg(t){return dl(t)}var Jx=pl,Kx=fl;function Hx(t,e={}){let r=new fa({type:"custom",check:"custom",fn:n=>n instanceof t,abort:!0,...y.normalizeParams(e)});return r._zod.bag.Class=t,r._zod.check=n=>{n.value instanceof t||n.issues.push({code:"invalid_type",expected:t.name,input:n.value,inst:r,path:[...r._zod.def.path??[]]})},r}var Wx=(...t)=>ml({Codec:Xl,Boolean:sa,String:oa},...t);function Gx(t){let e=pg(()=>ie([h(t),ne(),_e(),vo(),G(e),pe(h(),e)]));return e}function ma(t,e){return na(Hl(t),e)}var vg;vg||(vg={});var GN={...mo,...ea,iso:vr};ye(Eu());var ed="2025-11-25";var _g=[ed,"2025-06-18","2025-03-26","2024-11-05","2024-10-07"],Qt="io.modelcontextprotocol/related-task",ga="2.0",be=Yl(t=>t!==null&&(typeof t=="object"||typeof t=="function")),yg=ie([h(),ne().int()]),$g=h(),m4=Ee({ttl:ie([ne(),vo()]).optional(),pollInterval:ne().optional()}),Qx=z({ttl:ne().optional()}),ek=z({taskId:h()}),td=Ee({progressToken:yg.optional(),[Qt]:ek.optional()}),Be=z({_meta:td.optional()}),yo=Be.extend({task:Qx.optional()}),bg=t=>yo.safeParse(t).success,xe=z({method:h(),params:Be.loose().optional()}),et=z({_meta:td.optional()}),tt=z({method:h(),params:et.loose().optional()}),ke=Ee({_meta:td.optional()}),va=ie([h(),ne().int()]),xg=z({jsonrpc:T(ga),id:va,...xe.shape}).strict(),rd=t=>xg.safeParse(t).success,kg=z({jsonrpc:T(ga),...tt.shape}).strict(),Sg=t=>kg.safeParse(t).success,nd=z({jsonrpc:T(ga),id:va,result:ke}).strict(),$o=t=>nd.safeParse(t).success;var Y;(function(t){t[t.ConnectionClosed=-32e3]="ConnectionClosed",t[t.RequestTimeout=-32001]="RequestTimeout",t[t.ParseError=-32700]="ParseError",t[t.InvalidRequest=-32600]="InvalidRequest",t[t.MethodNotFound=-32601]="MethodNotFound",t[t.InvalidParams=-32602]="InvalidParams",t[t.InternalError=-32603]="InternalError",t[t.UrlElicitationRequired=-32042]="UrlElicitationRequired"})(Y||(Y={}));var od=z({jsonrpc:T(ga),id:va.optional(),error:z({code:ne().int(),message:h(),data:ue().optional()})}).strict();var wg=t=>od.safeParse(t).success;var zg=ie([xg,kg,nd,od]),h4=ie([nd,od]),_a=ke.strict(),tk=et.extend({requestId:va.optional(),reason:h().optional()}),ya=tt.extend({method:T("notifications/cancelled"),params:tk}),rk=z({src:h(),mimeType:h().optional(),sizes:G(h()).optional(),theme:Te(["light","dark"]).optional()}),bo=z({icons:G(rk).optional()}),Yr=z({name:h(),title:h().optional()}),Ig=Yr.extend({...Yr.shape,...bo.shape,version:h(),websiteUrl:h().optional(),description:h().optional()}),nk=_o(z({applyDefaults:_e().optional()}),pe(h(),ue())),ok=ma(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0?{form:{}}:t,_o(z({form:nk.optional(),url:be.optional()}),pe(h(),ue()).optional())),ik=Ee({list:be.optional(),cancel:be.optional(),requests:Ee({sampling:Ee({createMessage:be.optional()}).optional(),elicitation:Ee({create:be.optional()}).optional()}).optional()}),ak=Ee({list:be.optional(),cancel:be.optional(),requests:Ee({tools:Ee({call:be.optional()}).optional()}).optional()}),sk=z({experimental:pe(h(),be).optional(),sampling:z({context:be.optional(),tools:be.optional()}).optional(),elicitation:ok.optional(),roots:z({listChanged:_e().optional()}).optional(),tasks:ik.optional()}),ck=Be.extend({protocolVersion:h(),capabilities:sk,clientInfo:Ig}),id=xe.extend({method:T("initialize"),params:ck});var uk=z({experimental:pe(h(),be).optional(),logging:be.optional(),completions:be.optional(),prompts:z({listChanged:_e().optional()}).optional(),resources:z({subscribe:_e().optional(),listChanged:_e().optional()}).optional(),tools:z({listChanged:_e().optional()}).optional(),tasks:ak.optional()}),lk=ke.extend({protocolVersion:h(),capabilities:uk,serverInfo:Ig,instructions:h().optional()}),ad=tt.extend({method:T("notifications/initialized"),params:et.optional()});var $a=xe.extend({method:T("ping"),params:Be.optional()}),dk=z({progress:ne(),total:fe(ne()),message:fe(h())}),pk=z({...et.shape,...dk.shape,progressToken:yg}),ba=tt.extend({method:T("notifications/progress"),params:pk}),fk=Be.extend({cursor:$g.optional()}),xo=xe.extend({params:fk.optional()}),ko=ke.extend({nextCursor:$g.optional()}),mk=Te(["working","input_required","completed","failed","cancelled"]),So=z({taskId:h(),status:mk,ttl:ie([ne(),vo()]),createdAt:h(),lastUpdatedAt:h(),pollInterval:fe(ne()),statusMessage:fe(h())}),Qr=ke.extend({task:So}),hk=et.merge(So),wo=tt.extend({method:T("notifications/tasks/status"),params:hk}),xa=xe.extend({method:T("tasks/get"),params:Be.extend({taskId:h()})}),ka=ke.merge(So),Sa=xe.extend({method:T("tasks/result"),params:Be.extend({taskId:h()})}),g4=ke.loose(),wa=xo.extend({method:T("tasks/list")}),za=ko.extend({tasks:G(So)}),Ia=xe.extend({method:T("tasks/cancel"),params:Be.extend({taskId:h()})}),Eg=ke.merge(So),Tg=z({uri:h(),mimeType:fe(h()),_meta:pe(h(),ue()).optional()}),Pg=Tg.extend({text:h()}),sd=h().refine(t=>{try{return atob(t),!0}catch{return!1}},{message:"Invalid Base64 string"}),Og=Tg.extend({blob:sd}),zo=Te(["user","assistant"]),en=z({audience:G(zo).optional(),priority:ne().min(0).max(1).optional(),lastModified:vr.datetime({offset:!0}).optional()}),jg=z({...Yr.shape,...bo.shape,uri:h(),description:fe(h()),mimeType:fe(h()),annotations:en.optional(),_meta:fe(Ee({}))}),gk=z({...Yr.shape,...bo.shape,uriTemplate:h(),description:fe(h()),mimeType:fe(h()),annotations:en.optional(),_meta:fe(Ee({}))}),vk=xo.extend({method:T("resources/list")}),_k=ko.extend({resources:G(jg)}),yk=xo.extend({method:T("resources/templates/list")}),$k=ko.extend({resourceTemplates:G(gk)}),cd=Be.extend({uri:h()}),bk=cd,xk=xe.extend({method:T("resources/read"),params:bk}),kk=ke.extend({contents:G(ie([Pg,Og]))}),Sk=tt.extend({method:T("notifications/resources/list_changed"),params:et.optional()}),wk=cd,zk=xe.extend({method:T("resources/subscribe"),params:wk}),Ik=cd,Ek=xe.extend({method:T("resources/unsubscribe"),params:Ik}),Tk=et.extend({uri:h()}),Pk=tt.extend({method:T("notifications/resources/updated"),params:Tk}),Ok=z({name:h(),description:fe(h()),required:fe(_e())}),jk=z({...Yr.shape,...bo.shape,description:fe(h()),arguments:fe(G(Ok)),_meta:fe(Ee({}))}),Dk=xo.extend({method:T("prompts/list")}),Nk=ko.extend({prompts:G(jk)}),Rk=Be.extend({name:h(),arguments:pe(h(),h()).optional()}),Ak=xe.extend({method:T("prompts/get"),params:Rk}),ud=z({type:T("text"),text:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),ld=z({type:T("image"),data:sd,mimeType:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),dd=z({type:T("audio"),data:sd,mimeType:h(),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),Uk=z({type:T("tool_use"),name:h(),id:h(),input:pe(h(),ue()),_meta:pe(h(),ue()).optional()}),Mk=z({type:T("resource"),resource:ie([Pg,Og]),annotations:en.optional(),_meta:pe(h(),ue()).optional()}),Ck=jg.extend({type:T("resource_link")}),pd=ie([ud,ld,dd,Ck,Mk]),Zk=z({role:zo,content:pd}),Lk=ke.extend({description:h().optional(),messages:G(Zk)}),qk=tt.extend({method:T("notifications/prompts/list_changed"),params:et.optional()}),Fk=z({title:h().optional(),readOnlyHint:_e().optional(),destructiveHint:_e().optional(),idempotentHint:_e().optional(),openWorldHint:_e().optional()}),Vk=z({taskSupport:Te(["required","optional","forbidden"]).optional()}),Dg=z({...Yr.shape,...bo.shape,description:h().optional(),inputSchema:z({type:T("object"),properties:pe(h(),be).optional(),required:G(h()).optional()}).catchall(ue()),outputSchema:z({type:T("object"),properties:pe(h(),be).optional(),required:G(h()).optional()}).catchall(ue()).optional(),annotations:Fk.optional(),execution:Vk.optional(),_meta:pe(h(),ue()).optional()}),fd=xo.extend({method:T("tools/list")}),Jk=ko.extend({tools:G(Dg)}),Ea=ke.extend({content:G(pd).default([]),structuredContent:pe(h(),ue()).optional(),isError:_e().optional()}),v4=Ea.or(ke.extend({toolResult:ue()})),Kk=yo.extend({name:h(),arguments:pe(h(),ue()).optional()}),Io=xe.extend({method:T("tools/call"),params:Kk}),Hk=tt.extend({method:T("notifications/tools/list_changed"),params:et.optional()}),_4=z({autoRefresh:_e().default(!0),debounceMs:ne().int().nonnegative().default(300)}),Eo=Te(["debug","info","notice","warning","error","critical","alert","emergency"]),Wk=Be.extend({level:Eo}),md=xe.extend({method:T("logging/setLevel"),params:Wk}),Gk=et.extend({level:Eo,logger:h().optional(),data:ue()}),Bk=tt.extend({method:T("notifications/message"),params:Gk}),Xk=z({name:h().optional()}),Yk=z({hints:G(Xk).optional(),costPriority:ne().min(0).max(1).optional(),speedPriority:ne().min(0).max(1).optional(),intelligencePriority:ne().min(0).max(1).optional()}),Qk=z({mode:Te(["auto","required","none"]).optional()}),eS=z({type:T("tool_result"),toolUseId:h().describe("The unique identifier for the corresponding tool call."),content:G(pd).default([]),structuredContent:z({}).loose().optional(),isError:_e().optional(),_meta:pe(h(),ue()).optional()}),tS=da("type",[ud,ld,dd]),ha=da("type",[ud,ld,dd,Uk,eS]),rS=z({role:zo,content:ie([ha,G(ha)]),_meta:pe(h(),ue()).optional()}),nS=yo.extend({messages:G(rS),modelPreferences:Yk.optional(),systemPrompt:h().optional(),includeContext:Te(["none","thisServer","allServers"]).optional(),temperature:ne().optional(),maxTokens:ne().int(),stopSequences:G(h()).optional(),metadata:be.optional(),tools:G(Dg).optional(),toolChoice:Qk.optional()}),oS=xe.extend({method:T("sampling/createMessage"),params:nS}),hd=ke.extend({model:h(),stopReason:fe(Te(["endTurn","stopSequence","maxTokens"]).or(h())),role:zo,content:tS}),gd=ke.extend({model:h(),stopReason:fe(Te(["endTurn","stopSequence","maxTokens","toolUse"]).or(h())),role:zo,content:ie([ha,G(ha)])}),iS=z({type:T("boolean"),title:h().optional(),description:h().optional(),default:_e().optional()}),aS=z({type:T("string"),title:h().optional(),description:h().optional(),minLength:ne().optional(),maxLength:ne().optional(),format:Te(["email","uri","date","date-time"]).optional(),default:h().optional()}),sS=z({type:Te(["number","integer"]),title:h().optional(),description:h().optional(),minimum:ne().optional(),maximum:ne().optional(),default:ne().optional()}),cS=z({type:T("string"),title:h().optional(),description:h().optional(),enum:G(h()),default:h().optional()}),uS=z({type:T("string"),title:h().optional(),description:h().optional(),oneOf:G(z({const:h(),title:h()})),default:h().optional()}),lS=z({type:T("string"),title:h().optional(),description:h().optional(),enum:G(h()),enumNames:G(h()).optional(),default:h().optional()}),dS=ie([cS,uS]),pS=z({type:T("array"),title:h().optional(),description:h().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:z({type:T("string"),enum:G(h())}),default:G(h()).optional()}),fS=z({type:T("array"),title:h().optional(),description:h().optional(),minItems:ne().optional(),maxItems:ne().optional(),items:z({anyOf:G(z({const:h(),title:h()}))}),default:G(h()).optional()}),mS=ie([pS,fS]),hS=ie([lS,dS,mS]),gS=ie([hS,iS,aS,sS]),vS=yo.extend({mode:T("form").optional(),message:h(),requestedSchema:z({type:T("object"),properties:pe(h(),gS),required:G(h()).optional()})}),_S=yo.extend({mode:T("url"),message:h(),elicitationId:h(),url:h().url()}),yS=ie([vS,_S]),$S=xe.extend({method:T("elicitation/create"),params:yS}),bS=et.extend({elicitationId:h()}),xS=tt.extend({method:T("notifications/elicitation/complete"),params:bS}),Ta=ke.extend({action:Te(["accept","decline","cancel"]),content:ma(t=>t===null?void 0:t,pe(h(),ie([h(),ne(),_e(),G(h())])).optional())}),kS=z({type:T("ref/resource"),uri:h()});var SS=z({type:T("ref/prompt"),name:h()}),wS=Be.extend({ref:ie([SS,kS]),argument:z({name:h(),value:h()}),context:z({arguments:pe(h(),h()).optional()}).optional()}),zS=xe.extend({method:T("completion/complete"),params:wS});var IS=ke.extend({completion:Ee({values:G(h()).max(100),total:fe(ne().int()),hasMore:fe(_e())})}),ES=z({uri:h().startsWith("file://"),name:h().optional(),_meta:pe(h(),ue()).optional()}),TS=xe.extend({method:T("roots/list"),params:Be.optional()}),vd=ke.extend({roots:G(ES)}),PS=tt.extend({method:T("notifications/roots/list_changed"),params:et.optional()}),y4=ie([$a,id,zS,md,Ak,Dk,vk,yk,xk,zk,Ek,Io,fd,xa,Sa,wa,Ia]),$4=ie([ya,ba,ad,PS,wo]),b4=ie([_a,hd,gd,Ta,vd,ka,za,Qr]),x4=ie([$a,oS,$S,TS,xa,Sa,wa,Ia]),k4=ie([ya,ba,Bk,Pk,Sk,Hk,qk,wo,xS]),S4=ie([_a,lk,IS,Lk,Nk,_k,$k,kk,Ea,Jk,ka,za,Qr]),J=class t extends Error{constructor(e,r,n){super(`MCP error ${e}: ${r}`),this.code=e,this.data=n,this.name="McpError"}static fromError(e,r,n){if(e===Y.UrlElicitationRequired&&n){let o=n;if(o.elicitations)return new Ql(o.elicitations,r)}return new t(e,r,n)}},Ql=class extends J{constructor(e,r=`URL elicitation${e.length>1?"s":""} required`){super(Y.UrlElicitationRequired,r,{elicitations:e})}get elicitations(){return this.data?.elicitations??[]}};function er(t){return t==="completed"||t==="failed"||t==="cancelled"}var o1=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function _d(t){let r=Qi(t)?.method;if(!r)throw new Error("Schema is missing a method literal");let n=vh(r);if(typeof n!="string")throw new Error("Schema method literal must be a string");return n}function yd(t,e){let r=Yt(t,e);if(!r.success)throw r.error;return r.data}var AS=6e4,Pa=class{constructor(e){this._options=e,this._requestMessageId=0,this._requestHandlers=new Map,this._requestHandlerAbortControllers=new Map,this._notificationHandlers=new Map,this._responseHandlers=new Map,this._progressHandlers=new Map,this._timeoutInfo=new Map,this._pendingDebouncedNotifications=new Set,this._taskProgressTokens=new Map,this._requestResolvers=new Map,this.setNotificationHandler(ya,r=>{this._oncancel(r)}),this.setNotificationHandler(ba,r=>{this._onprogress(r)}),this.setRequestHandler($a,r=>({})),this._taskStore=e?.taskStore,this._taskMessageQueue=e?.taskMessageQueue,this._taskStore&&(this.setRequestHandler(xa,async(r,n)=>{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new J(Y.InvalidParams,"Failed to retrieve task: Task not found");return{...o}}),this.setRequestHandler(Sa,async(r,n)=>{let o=async()=>{let i=r.params.taskId;if(this._taskMessageQueue){let s;for(;s=await this._taskMessageQueue.dequeue(i,n.sessionId);){if(s.type==="response"||s.type==="error"){let c=s.message,u=c.id,l=this._requestResolvers.get(u);if(l)if(this._requestResolvers.delete(u),s.type==="response")l(c);else{let d=c,m=new J(d.error.code,d.error.message,d.error.data);l(m)}else{let d=s.type==="response"?"Response":"Error";this._onerror(new Error(`${d} handler missing for request ${u}`))}continue}await this._transport?.send(s.message,{relatedRequestId:n.requestId})}}let a=await this._taskStore.getTask(i,n.sessionId);if(!a)throw new J(Y.InvalidParams,`Task not found: ${i}`);if(!er(a.status))return await this._waitForTaskUpdate(i,n.signal),await o();if(er(a.status)){let s=await this._taskStore.getTaskResult(i,n.sessionId);return this._clearTaskQueue(i),{...s,_meta:{...s._meta,[Qt]:{taskId:i}}}}return await o()};return await o()}),this.setRequestHandler(wa,async(r,n)=>{try{let{tasks:o,nextCursor:i}=await this._taskStore.listTasks(r.params?.cursor,n.sessionId);return{tasks:o,nextCursor:i,_meta:{}}}catch(o){throw new J(Y.InvalidParams,`Failed to list tasks: ${o instanceof Error?o.message:String(o)}`)}}),this.setRequestHandler(Ia,async(r,n)=>{try{let o=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!o)throw new J(Y.InvalidParams,`Task not found: ${r.params.taskId}`);if(er(o.status))throw new J(Y.InvalidParams,`Cannot cancel task in terminal status: ${o.status}`);await this._taskStore.updateTaskStatus(r.params.taskId,"cancelled","Client cancelled task execution.",n.sessionId),this._clearTaskQueue(r.params.taskId);let i=await this._taskStore.getTask(r.params.taskId,n.sessionId);if(!i)throw new J(Y.InvalidParams,`Task not found after cancellation: ${r.params.taskId}`);return{_meta:{},...i}}catch(o){throw o instanceof J?o:new J(Y.InvalidRequest,`Failed to cancel task: ${o instanceof Error?o.message:String(o)}`)}}))}async _oncancel(e){if(!e.params.requestId)return;this._requestHandlerAbortControllers.get(e.params.requestId)?.abort(e.params.reason)}_setupTimeout(e,r,n,o,i=!1){this._timeoutInfo.set(e,{timeoutId:setTimeout(o,r),startTime:Date.now(),timeout:r,maxTotalTimeout:n,resetTimeoutOnProgress:i,onTimeout:o})}_resetTimeout(e){let r=this._timeoutInfo.get(e);if(!r)return!1;let n=Date.now()-r.startTime;if(r.maxTotalTimeout&&n>=r.maxTotalTimeout)throw this._timeoutInfo.delete(e),J.fromError(Y.RequestTimeout,"Maximum total timeout exceeded",{maxTotalTimeout:r.maxTotalTimeout,totalElapsed:n});return clearTimeout(r.timeoutId),r.timeoutId=setTimeout(r.onTimeout,r.timeout),!0}_cleanupTimeout(e){let r=this._timeoutInfo.get(e);r&&(clearTimeout(r.timeoutId),this._timeoutInfo.delete(e))}async connect(e){this._transport=e;let r=this.transport?.onclose;this._transport.onclose=()=>{r?.(),this._onclose()};let n=this.transport?.onerror;this._transport.onerror=i=>{n?.(i),this._onerror(i)};let o=this._transport?.onmessage;this._transport.onmessage=(i,a)=>{o?.(i,a),$o(i)||wg(i)?this._onresponse(i):rd(i)?this._onrequest(i,a):Sg(i)?this._onnotification(i):this._onerror(new Error(`Unknown message type: ${JSON.stringify(i)}`))},await this._transport.start()}_onclose(){let e=this._responseHandlers;this._responseHandlers=new Map,this._progressHandlers.clear(),this._taskProgressTokens.clear(),this._pendingDebouncedNotifications.clear();let r=J.fromError(Y.ConnectionClosed,"Connection closed");this._transport=void 0,this.onclose?.();for(let n of e.values())n(r)}_onerror(e){this.onerror?.(e)}_onnotification(e){let r=this._notificationHandlers.get(e.method)??this.fallbackNotificationHandler;r!==void 0&&Promise.resolve().then(()=>r(e)).catch(n=>this._onerror(new Error(`Uncaught error in notification handler: ${n}`)))}_onrequest(e,r){let n=this._requestHandlers.get(e.method)??this.fallbackRequestHandler,o=this._transport,i=e.params?._meta?.[Qt]?.taskId;if(n===void 0){let l={jsonrpc:"2.0",id:e.id,error:{code:Y.MethodNotFound,message:"Method not found"}};i&&this._taskMessageQueue?this._enqueueTaskMessage(i,{type:"error",message:l,timestamp:Date.now()},o?.sessionId).catch(d=>this._onerror(new Error(`Failed to enqueue error response: ${d}`))):o?.send(l).catch(d=>this._onerror(new Error(`Failed to send an error response: ${d}`)));return}let a=new AbortController;this._requestHandlerAbortControllers.set(e.id,a);let s=bg(e.params)?e.params.task:void 0,c=this._taskStore?this.requestTaskStore(e,o?.sessionId):void 0,u={signal:a.signal,sessionId:o?.sessionId,_meta:e.params?._meta,sendNotification:async l=>{let d={relatedRequestId:e.id};i&&(d.relatedTask={taskId:i}),await this.notification(l,d)},sendRequest:async(l,d,m)=>{let f={...m,relatedRequestId:e.id};i&&!f.relatedTask&&(f.relatedTask={taskId:i});let g=f.relatedTask?.taskId??i;return g&&c&&await c.updateTaskStatus(g,"input_required"),await this.request(l,d,f)},authInfo:r?.authInfo,requestId:e.id,requestInfo:r?.requestInfo,taskId:i,taskStore:c,taskRequestedTtl:s?.ttl,closeSSEStream:r?.closeSSEStream,closeStandaloneSSEStream:r?.closeStandaloneSSEStream};Promise.resolve().then(()=>{s&&this.assertTaskHandlerCapability(e.method)}).then(()=>n(e,u)).then(async l=>{if(a.signal.aborted)return;let d={result:l,jsonrpc:"2.0",id:e.id};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"response",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)},async l=>{if(a.signal.aborted)return;let d={jsonrpc:"2.0",id:e.id,error:{code:Number.isSafeInteger(l.code)?l.code:Y.InternalError,message:l.message??"Internal error",...l.data!==void 0&&{data:l.data}}};i&&this._taskMessageQueue?await this._enqueueTaskMessage(i,{type:"error",message:d,timestamp:Date.now()},o?.sessionId):await o?.send(d)}).catch(l=>this._onerror(new Error(`Failed to send response: ${l}`))).finally(()=>{this._requestHandlerAbortControllers.delete(e.id)})}_onprogress(e){let{progressToken:r,...n}=e.params,o=Number(r),i=this._progressHandlers.get(o);if(!i){this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(e)}`));return}let a=this._responseHandlers.get(o),s=this._timeoutInfo.get(o);if(s&&a&&s.resetTimeoutOnProgress)try{this._resetTimeout(o)}catch(c){this._responseHandlers.delete(o),this._progressHandlers.delete(o),this._cleanupTimeout(o),a(c);return}i(n)}_onresponse(e){let r=Number(e.id),n=this._requestResolvers.get(r);if(n){if(this._requestResolvers.delete(r),$o(e))n(e);else{let a=new J(e.error.code,e.error.message,e.error.data);n(a)}return}let o=this._responseHandlers.get(r);if(o===void 0){this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(e)}`));return}this._responseHandlers.delete(r),this._cleanupTimeout(r);let i=!1;if($o(e)&&e.result&&typeof e.result=="object"){let a=e.result;if(a.task&&typeof a.task=="object"){let s=a.task;typeof s.taskId=="string"&&(i=!0,this._taskProgressTokens.set(s.taskId,r))}}if(i||this._progressHandlers.delete(r),$o(e))o(e);else{let a=J.fromError(e.error.code,e.error.message,e.error.data);o(a)}}get transport(){return this._transport}async close(){await this._transport?.close()}async*requestStream(e,r,n){let{task:o}=n??{};if(!o){try{yield{type:"result",result:await this.request(e,r,n)}}catch(a){yield{type:"error",error:a instanceof J?a:new J(Y.InternalError,String(a))}}return}let i;try{let a=await this.request(e,Qr,n);if(a.task)i=a.task.taskId,yield{type:"taskCreated",task:a.task};else throw new J(Y.InternalError,"Task creation did not return a task");for(;;){let s=await this.getTask({taskId:i},n);if(yield{type:"taskStatus",task:s},er(s.status)){s.status==="completed"?yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)}:s.status==="failed"?yield{type:"error",error:new J(Y.InternalError,`Task ${i} failed`)}:s.status==="cancelled"&&(yield{type:"error",error:new J(Y.InternalError,`Task ${i} was cancelled`)});return}if(s.status==="input_required"){yield{type:"result",result:await this.getTaskResult({taskId:i},r,n)};return}let c=s.pollInterval??this._options?.defaultTaskPollInterval??1e3;await new Promise(u=>setTimeout(u,c)),n?.signal?.throwIfAborted()}}catch(a){yield{type:"error",error:a instanceof J?a:new J(Y.InternalError,String(a))}}}request(e,r,n){let{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a,task:s,relatedTask:c}=n??{};return new Promise((u,l)=>{let d=O=>{l(O)};if(!this._transport){d(new Error("Not connected"));return}if(this._options?.enforceStrictCapabilities===!0)try{this.assertCapabilityForMethod(e.method),s&&this.assertTaskCapability(e.method)}catch(O){d(O);return}n?.signal?.throwIfAborted();let m=this._requestMessageId++,f={...e,jsonrpc:"2.0",id:m};n?.onprogress&&(this._progressHandlers.set(m,n.onprogress),f.params={...e.params,_meta:{...e.params?._meta||{},progressToken:m}}),s&&(f.params={...f.params,task:s}),c&&(f.params={...f.params,_meta:{...f.params?._meta||{},[Qt]:c}});let g=O=>{this._responseHandlers.delete(m),this._progressHandlers.delete(m),this._cleanupTimeout(m),this._transport?.send({jsonrpc:"2.0",method:"notifications/cancelled",params:{requestId:m,reason:String(O)}},{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a}).catch(M=>this._onerror(new Error(`Failed to send cancellation: ${M}`)));let I=O instanceof J?O:new J(Y.RequestTimeout,String(O));l(I)};this._responseHandlers.set(m,O=>{if(!n?.signal?.aborted){if(O instanceof Error)return l(O);try{let I=Yt(r,O.result);I.success?u(I.data):l(I.error)}catch(I){l(I)}}}),n?.signal?.addEventListener("abort",()=>{g(n?.signal?.reason)});let v=n?.timeout??AS,$=()=>g(J.fromError(Y.RequestTimeout,"Request timed out",{timeout:v}));this._setupTimeout(m,v,n?.maxTotalTimeout,$,n?.resetTimeoutOnProgress??!1);let x=c?.taskId;if(x){let O=I=>{let M=this._responseHandlers.get(m);M?M(I):this._onerror(new Error(`Response handler missing for side-channeled request ${m}`))};this._requestResolvers.set(m,O),this._enqueueTaskMessage(x,{type:"request",message:f,timestamp:Date.now()}).catch(I=>{this._cleanupTimeout(m),l(I)})}else this._transport.send(f,{relatedRequestId:o,resumptionToken:i,onresumptiontoken:a}).catch(O=>{this._cleanupTimeout(m),l(O)})})}async getTask(e,r){return this.request({method:"tasks/get",params:e},ka,r)}async getTaskResult(e,r,n){return this.request({method:"tasks/result",params:e},r,n)}async listTasks(e,r){return this.request({method:"tasks/list",params:e},za,r)}async cancelTask(e,r){return this.request({method:"tasks/cancel",params:e},Eg,r)}async notification(e,r){if(!this._transport)throw new Error("Not connected");this.assertNotificationCapability(e.method);let n=r?.relatedTask?.taskId;if(n){let s={...e,jsonrpc:"2.0",params:{...e.params,_meta:{...e.params?._meta||{},[Qt]:r.relatedTask}}};await this._enqueueTaskMessage(n,{type:"notification",message:s,timestamp:Date.now()});return}if((this._options?.debouncedNotificationMethods??[]).includes(e.method)&&!e.params&&!r?.relatedRequestId&&!r?.relatedTask){if(this._pendingDebouncedNotifications.has(e.method))return;this._pendingDebouncedNotifications.add(e.method),Promise.resolve().then(()=>{if(this._pendingDebouncedNotifications.delete(e.method),!this._transport)return;let s={...e,jsonrpc:"2.0"};r?.relatedTask&&(s={...s,params:{...s.params,_meta:{...s.params?._meta||{},[Qt]:r.relatedTask}}}),this._transport?.send(s,r).catch(c=>this._onerror(c))});return}let a={...e,jsonrpc:"2.0"};r?.relatedTask&&(a={...a,params:{...a.params,_meta:{...a.params?._meta||{},[Qt]:r.relatedTask}}}),await this._transport.send(a,r)}setRequestHandler(e,r){let n=_d(e);this.assertRequestHandlerCapability(n),this._requestHandlers.set(n,(o,i)=>{let a=yd(e,o);return Promise.resolve(r(a,i))})}removeRequestHandler(e){this._requestHandlers.delete(e)}assertCanSetRequestHandler(e){if(this._requestHandlers.has(e))throw new Error(`A request handler for ${e} already exists, which would be overridden`)}setNotificationHandler(e,r){let n=_d(e);this._notificationHandlers.set(n,o=>{let i=yd(e,o);return Promise.resolve(r(i))})}removeNotificationHandler(e){this._notificationHandlers.delete(e)}_cleanupTaskProgressHandler(e){let r=this._taskProgressTokens.get(e);r!==void 0&&(this._progressHandlers.delete(r),this._taskProgressTokens.delete(e))}async _enqueueTaskMessage(e,r,n){if(!this._taskStore||!this._taskMessageQueue)throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");let o=this._options?.maxTaskQueueSize;await this._taskMessageQueue.enqueue(e,r,n,o)}async _clearTaskQueue(e,r){if(this._taskMessageQueue){let n=await this._taskMessageQueue.dequeueAll(e,r);for(let o of n)if(o.type==="request"&&rd(o.message)){let i=o.message.id,a=this._requestResolvers.get(i);a?(a(new J(Y.InternalError,"Task cancelled or completed")),this._requestResolvers.delete(i)):this._onerror(new Error(`Resolver missing for request ${i} during task ${e} cleanup`))}}}async _waitForTaskUpdate(e,r){let n=this._options?.defaultTaskPollInterval??1e3;try{let o=await this._taskStore?.getTask(e);o?.pollInterval&&(n=o.pollInterval)}catch{}return new Promise((o,i)=>{if(r.aborted){i(new J(Y.InvalidRequest,"Request cancelled"));return}let a=setTimeout(o,n);r.addEventListener("abort",()=>{clearTimeout(a),i(new J(Y.InvalidRequest,"Request cancelled"))},{once:!0})})}requestTaskStore(e,r){let n=this._taskStore;if(!n)throw new Error("No task store configured");return{createTask:async o=>{if(!e)throw new Error("No request provided");return await n.createTask(o,e.id,{method:e.method,params:e.params},r)},getTask:async o=>{let i=await n.getTask(o,r);if(!i)throw new J(Y.InvalidParams,"Failed to retrieve task: Task not found");return i},storeTaskResult:async(o,i,a)=>{await n.storeTaskResult(o,i,a,r);let s=await n.getTask(o,r);if(s){let c=wo.parse({method:"notifications/tasks/status",params:s});await this.notification(c),er(s.status)&&this._cleanupTaskProgressHandler(o)}},getTaskResult:o=>n.getTaskResult(o,r),updateTaskStatus:async(o,i,a)=>{let s=await n.getTask(o,r);if(!s)throw new J(Y.InvalidParams,`Task "${o}" not found - it may have been cleaned up`);if(er(s.status))throw new J(Y.InvalidParams,`Cannot update task "${o}" from terminal status "${s.status}" to "${i}". Terminal states (completed, failed, cancelled) cannot transition to other states.`);await n.updateTaskStatus(o,i,a,r);let c=await n.getTask(o,r);if(c){let u=wo.parse({method:"notifications/tasks/status",params:c});await this.notification(u),er(c.status)&&this._cleanupTaskProgressHandler(o)}},listTasks:o=>n.listTasks(o,r)}}};function Ng(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Rg(t,e){let r={...t};for(let n in e){let o=n,i=e[o];if(i===void 0)continue;let a=r[o];Ng(a)&&Ng(i)?r[o]={...a,...i}:r[o]=i}return r}var by=si(of(),1),xy=si($y(),1);function zT(){let t=new by.default({strict:!1,validateFormats:!0,validateSchema:!1,allErrors:!0});return(0,xy.default)(t),t}var fs=class{constructor(e){this._ajv=e??zT()}getValidator(e){let r="$id"in e&&typeof e.$id=="string"?this._ajv.getSchema(e.$id)??this._ajv.compile(e):this._ajv.compile(e);return n=>r(n)?{valid:!0,data:n,errorMessage:void 0}:{valid:!1,data:void 0,errorMessage:this._ajv.errorsText(r.errors)}}};var ms=class{constructor(e){this._server=e}requestStream(e,r,n){return this._server.requestStream(e,r,n)}async getTask(e,r){return this._server.getTask({taskId:e},r)}async getTaskResult(e,r,n){return this._server.getTaskResult({taskId:e},r,n)}async listTasks(e,r){return this._server.listTasks(e?{cursor:e}:void 0,r)}async cancelTask(e,r){return this._server.cancelTask({taskId:e},r)}};function ky(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"tools/call":if(!t.tools?.call)throw new Error(`${r} does not support task creation for tools/call (required for ${e})`);break;default:break}}function Sy(t,e,r){if(!t)throw new Error(`${r} does not support task creation (required for ${e})`);switch(e){case"sampling/createMessage":if(!t.sampling?.createMessage)throw new Error(`${r} does not support task creation for sampling/createMessage (required for ${e})`);break;case"elicitation/create":if(!t.elicitation?.create)throw new Error(`${r} does not support task creation for elicitation/create (required for ${e})`);break;default:break}}var hs=class extends Pa{constructor(e,r){super(r),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(Eo.options.map((n,o)=>[n,o])),this.isMessageIgnored=(n,o)=>{let i=this._loggingLevels.get(o);return i?this.LOG_LEVEL_SEVERITY.get(n)this._oninitialize(n)),this.setNotificationHandler(ad,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(md,async(n,o)=>{let i=o.sessionId||o.requestInfo?.headers["mcp-session-id"]||void 0,{level:a}=n.params,s=Eo.safeParse(a);return s.success&&this._loggingLevels.set(i,s.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new ms(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=Rg(this._capabilities,e)}setRequestHandler(e,r){let o=Qi(e)?.method;if(!o)throw new Error("Schema is missing a method literal");let i;if(Br(o)){let s=o;i=s._zod?.def?.value??s.value}else{let s=o;i=s._def?.value??s.value}if(typeof i!="string")throw new Error("Schema method literal must be a string");if(i==="tools/call"){let s=async(c,u)=>{let l=Yt(Io,c);if(!l.success){let g=l.error instanceof Error?l.error.message:String(l.error);throw new J(Y.InvalidParams,`Invalid tools/call request: ${g}`)}let{params:d}=l.data,m=await Promise.resolve(r(c,u));if(d.task){let g=Yt(Qr,m);if(!g.success){let v=g.error instanceof Error?g.error.message:String(g.error);throw new J(Y.InvalidParams,`Invalid task creation result: ${v}`)}return g.data}let f=Yt(Ea,m);if(!f.success){let g=f.error instanceof Error?f.error.message:String(f.error);throw new J(Y.InvalidParams,`Invalid tools/call result: ${g}`)}return f.data};return super.setRequestHandler(e,s)}return super.setRequestHandler(e,r)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${e})`);break;case"ping":break}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${e})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${e})`);break;case"ping":case"initialize":break}}assertTaskCapability(e){Sy(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&ky(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let r=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:_g.includes(r)?r:ed,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},_a)}async createMessage(e,r){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(e.messages.length>0){let n=e.messages[e.messages.length-1],o=Array.isArray(n.content)?n.content:[n.content],i=o.some(u=>u.type==="tool_result"),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,s=a?Array.isArray(a.content)?a.content:[a.content]:[],c=s.some(u=>u.type==="tool_use");if(i){if(o.some(u=>u.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!c)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(c){let u=new Set(s.filter(d=>d.type==="tool_use").map(d=>d.id)),l=new Set(o.filter(d=>d.type==="tool_result").map(d=>d.toolUseId));if(u.size!==l.size||![...u].every(d=>l.has(d)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},gd,r):this.request({method:"sampling/createMessage",params:e},hd,r)}async elicitInput(e,r){switch(e.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let o=e;return this.request({method:"elicitation/create",params:o},Ta,r)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let o=e.mode==="form"?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:o},Ta,r);if(i.action==="accept"&&i.content&&o.requestedSchema)try{let s=this._jsonSchemaValidator.getValidator(o.requestedSchema)(i.content);if(!s.valid)throw new J(Y.InvalidParams,`Elicitation response content does not match requested schema: ${s.errorMessage}`)}catch(a){throw a instanceof J?a:new J(Y.InternalError,`Error validating elicitation response: ${a instanceof Error?a.message:String(a)}`)}return i}}}createElicitationCompletionNotifier(e,r){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},r)}async listRoots(e,r){return this.request({method:"roots/list",params:e},vd,r)}async sendLoggingMessage(e,r){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,r))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}};var ff=si(require("node:process"),1);var gs=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(` `);if(e===-1)return null;let r=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),IT(r)}clear(){this._buffer=void 0}};function IT(t){return zg.parse(JSON.parse(t))}function wy(t){return JSON.stringify(t)+` -`}var vs=class{constructor(e=ff.default.stdin,r=ff.default.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new gs,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=wy(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};var hf=si(require("path"),1);var mf={DEFAULT:3e5,HEALTH_CHECK:3e3,POST_SPAWN_WAIT:5e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function zy(t){return process.platform==="win32"?Math.round(t*mf.WINDOWS_MULTIPLIER):t}var wt=require("fs"),_s=require("path"),Ty=require("os");var Iy="bugfix,feature,refactor,discovery,decision,change",Ey="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var qt=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,_s.join)((0,Ty.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:Iy,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:Ey,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_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e){try{if(!(0,wt.existsSync)(e)){let a=this.getAllDefaults();try{let s=(0,_s.dirname)(e);(0,wt.existsSync)(s)||(0,wt.mkdirSync)(s,{recursive:!0}),(0,wt.writeFileSync)(e,JSON.stringify(a,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(s){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,s)}return this.applyEnvOverrides(a)}let r=(0,wt.readFileSync)(e,"utf-8"),n=JSON.parse(r),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{(0,wt.writeFileSync)(e,JSON.stringify(o,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a)}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return this.applyEnvOverrides(i)}catch(r){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,r),this.applyEnvOverrides(this.getAllDefaults())}}};var $e=require("path"),Py=require("os");var Oy=require("url");var PT={};function ET(){return typeof __dirname<"u"?__dirname:(0,$e.dirname)((0,Oy.fileURLToPath)(PT.url))}var LM=ET(),Ft=qt.get("CLAUDE_MEM_DATA_DIR"),ys=process.env.CLAUDE_CONFIG_DIR||(0,$e.join)((0,Py.homedir)(),".claude"),TT=(0,$e.join)(ys,"plugins","marketplaces","thedotmack"),qM=(0,$e.join)(Ft,"archives"),FM=(0,$e.join)(Ft,"logs"),VM=(0,$e.join)(Ft,"trash"),JM=(0,$e.join)(Ft,"backups"),KM=(0,$e.join)(Ft,"modes"),HM=(0,$e.join)(Ft,"settings.json"),WM=(0,$e.join)(Ft,"claude-mem.db"),GM=(0,$e.join)(Ft,"vector-db"),BM=(0,$e.join)(Ft,"observer-sessions"),XM=(0,$e.join)(ys,"settings.json"),YM=(0,$e.join)(ys,"commands"),QM=(0,$e.join)(ys,"CLAUDE.md");var iC=(()=>{let t=process.env.CLAUDE_MEM_HEALTH_TIMEOUT_MS;if(t){let e=parseInt(t,10);if(Number.isFinite(e)&&e>=500&&e<=3e5)return e;ge.warn("SYSTEM","Invalid CLAUDE_MEM_HEALTH_TIMEOUT_MS, using default",{value:t,min:500,max:3e5})}return zy(mf.HEALTH_CHECK)})();var $s=null,bs=null;function jy(){if($s!==null)return $s;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),e=qt.loadFromFile(t);return $s=parseInt(e.CLAUDE_MEM_WORKER_PORT,10),$s}function Dy(){if(bs!==null)return bs;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json");return bs=qt.loadFromFile(t).CLAUDE_MEM_WORKER_HOST,bs}var OT="10.3.2";console.log=(...t)=>{ge.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:t})};var jT=jy(),DT=Dy(),ai=`http://${DT}:${jT}`,Ny={search:"/api/search",timeline:"/api/timeline"};async function Ry(t,e){ge.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:t,params:e});try{let r=new URLSearchParams;for(let[a,s]of Object.entries(e))s!=null&&r.append(a,String(s));let n=`${ai}${t}?${r}`,o=await fetch(n);if(!o.ok){let a=await o.text();throw new Error(`Worker API error (${o.status}): ${a}`)}let i=await o.json();return ge.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:t}),i}catch(r){return ge.error("SYSTEM","\u2190 Worker API error",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function Ay(t,e){ge.debug("HTTP","Worker API request (POST)",void 0,{endpoint:t});try{let r=`${ai}${t}`,n=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok){let i=await n.text();throw new Error(`Worker API error (${n.status}): ${i}`)}let o=await n.json();return ge.debug("HTTP","Worker API success (POST)",void 0,{endpoint:t}),{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(r){return ge.error("HTTP","Worker API error (POST)",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function NT(){try{return(await fetch(`${ai}/api/health`)).ok}catch(t){return ge.debug("SYSTEM","Worker health check failed",{},t),!1}}var Uy=[{name:"__IMPORTANT",description:`3-LAYER WORKFLOW (ALWAYS FOLLOW): +`}var vs=class{constructor(e=ff.default.stdin,r=ff.default.stdout){this._stdin=e,this._stdout=r,this._readBuffer=new gs,this._started=!1,this._ondata=n=>{this._readBuffer.append(n),this.processReadBuffer()},this._onerror=n=>{this.onerror?.(n)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(r=>{let n=wy(e);this._stdout.write(n)?r():this._stdout.once("drain",r)})}};var hf=si(require("path"),1);var mf={DEFAULT:3e5,HEALTH_CHECK:3e3,POST_SPAWN_WAIT:5e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function zy(t){return process.platform==="win32"?Math.round(t*mf.WINDOWS_MULTIPLIER):t}var wt=require("fs"),_s=require("path"),Ty=require("os");var Iy="bugfix,feature,refactor,discovery,decision,change",Ey="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var qt=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-5",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,_s.join)((0,Ty.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:Iy,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:Ey,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_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e){try{if(!(0,wt.existsSync)(e)){let a=this.getAllDefaults();try{let s=(0,_s.dirname)(e);(0,wt.existsSync)(s)||(0,wt.mkdirSync)(s,{recursive:!0}),(0,wt.writeFileSync)(e,JSON.stringify(a,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(s){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,s)}return this.applyEnvOverrides(a)}let r=(0,wt.readFileSync)(e,"utf-8"),n=JSON.parse(r),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{(0,wt.writeFileSync)(e,JSON.stringify(o,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a)}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return this.applyEnvOverrides(i)}catch(r){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,r),this.applyEnvOverrides(this.getAllDefaults())}}};var $e=require("path"),Py=require("os");var Oy=require("url");var PT={};function ET(){return typeof __dirname<"u"?__dirname:(0,$e.dirname)((0,Oy.fileURLToPath)(PT.url))}var LM=ET(),Ft=qt.get("CLAUDE_MEM_DATA_DIR"),ys=process.env.CLAUDE_CONFIG_DIR||(0,$e.join)((0,Py.homedir)(),".claude"),TT=(0,$e.join)(ys,"plugins","marketplaces","thedotmack"),qM=(0,$e.join)(Ft,"archives"),FM=(0,$e.join)(Ft,"logs"),VM=(0,$e.join)(Ft,"trash"),JM=(0,$e.join)(Ft,"backups"),KM=(0,$e.join)(Ft,"modes"),HM=(0,$e.join)(Ft,"settings.json"),WM=(0,$e.join)(Ft,"claude-mem.db"),GM=(0,$e.join)(Ft,"vector-db"),BM=(0,$e.join)(Ft,"observer-sessions"),XM=(0,$e.join)(ys,"settings.json"),YM=(0,$e.join)(ys,"commands"),QM=(0,$e.join)(ys,"CLAUDE.md");var iC=(()=>{let t=process.env.CLAUDE_MEM_HEALTH_TIMEOUT_MS;if(t){let e=parseInt(t,10);if(Number.isFinite(e)&&e>=500&&e<=3e5)return e;ge.warn("SYSTEM","Invalid CLAUDE_MEM_HEALTH_TIMEOUT_MS, using default",{value:t,min:500,max:3e5})}return zy(mf.HEALTH_CHECK)})();var $s=null,bs=null;function jy(){if($s!==null)return $s;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),e=qt.loadFromFile(t);return $s=parseInt(e.CLAUDE_MEM_WORKER_PORT,10),$s}function Dy(){if(bs!==null)return bs;let t=hf.default.join(qt.get("CLAUDE_MEM_DATA_DIR"),"settings.json");return bs=qt.loadFromFile(t).CLAUDE_MEM_WORKER_HOST,bs}var OT="10.3.3";console.log=(...t)=>{ge.error("CONSOLE","Intercepted console output (MCP protocol protection)",void 0,{args:t})};var jT=jy(),DT=Dy(),ai=`http://${DT}:${jT}`,Ny={search:"/api/search",timeline:"/api/timeline"};async function Ry(t,e){ge.debug("SYSTEM","\u2192 Worker API",void 0,{endpoint:t,params:e});try{let r=new URLSearchParams;for(let[a,s]of Object.entries(e))s!=null&&r.append(a,String(s));let n=`${ai}${t}?${r}`,o=await fetch(n);if(!o.ok){let a=await o.text();throw new Error(`Worker API error (${o.status}): ${a}`)}let i=await o.json();return ge.debug("SYSTEM","\u2190 Worker API success",void 0,{endpoint:t}),i}catch(r){return ge.error("SYSTEM","\u2190 Worker API error",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function Ay(t,e){ge.debug("HTTP","Worker API request (POST)",void 0,{endpoint:t});try{let r=`${ai}${t}`,n=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!n.ok){let i=await n.text();throw new Error(`Worker API error (${n.status}): ${i}`)}let o=await n.json();return ge.debug("HTTP","Worker API success (POST)",void 0,{endpoint:t}),{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(r){return ge.error("HTTP","Worker API error (POST)",{endpoint:t},r),{content:[{type:"text",text:`Error calling Worker API: ${r instanceof Error?r.message:String(r)}`}],isError:!0}}}async function NT(){try{return(await fetch(`${ai}/api/health`)).ok}catch(t){return ge.debug("SYSTEM","Worker health check failed",{},t),!1}}var Uy=[{name:"__IMPORTANT",description:`3-LAYER WORKFLOW (ALWAYS FOLLOW): 1. search(query) \u2192 Get index with IDs (~50-100 tokens/result) 2. timeline(anchor=ID) \u2192 Get context around interesting results 3. get_observations([IDs]) \u2192 Fetch full details ONLY for filtered IDs diff --git a/plugin/scripts/worker-service.cjs b/plugin/scripts/worker-service.cjs index 8d489ee3..e6c0c6d0 100755 --- a/plugin/scripts/worker-service.cjs +++ b/plugin/scripts/worker-service.cjs @@ -800,9 +800,9 @@ Please see the 3.x to 4.x migration guide for details on how to update your app. ORDER BY created_at_epoch DESC LIMIT ? `).all(...e,r.sessionCount+V$)}function Whe(t){return t.replace(/\//g,"-")}function Khe(t){try{if(!(0,av.existsSync)(t))return{userMessage:"",assistantMessage:""};let e=(0,av.readFileSync)(t,"utf-8").trim();if(!e)return{userMessage:"",assistantMessage:""};let r=e.split(` -`).filter(i=>i.trim()),n="";for(let i=r.length-1;i>=0;i--)try{let s=r[i];if(!s.includes('"type":"assistant"'))continue;let a=JSON.parse(s);if(a.type==="assistant"&&a.message?.content&&Array.isArray(a.message.content)){let o="";for(let c of a.message.content)c.type==="text"&&(o+=c.text);if(o=o.replace(/[\s\S]*?<\/system-reminder>/g,"").trim(),o){n=o;break}}}catch(s){E.debug("PARSER","Skipping malformed transcript line",{lineIndex:i},s);continue}return{userMessage:"",assistantMessage:n}}catch(e){return E.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:t},e),{userMessage:"",assistantMessage:""}}}function X$(t,e,r,n){if(!e.showLastMessage||t.length===0)return{userMessage:"",assistantMessage:""};let i=t.find(c=>c.memory_session_id!==r);if(!i)return{userMessage:"",assistantMessage:""};let s=i.memory_session_id,a=Whe(n),o=D6.default.join(Vi,"projects",a,`${s}.jsonl`);return Khe(o)}function L6(t,e){let r=e[0]?.id;return t.map((n,i)=>{let s=i===0?null:e[i+1];return{...n,displayEpoch:s?s.created_at_epoch:n.created_at_epoch,displayTime:s?s.created_at:n.created_at,shouldShowLink:n.id!==r}})}function Y$(t,e){let r=[...t.map(n=>({type:"observation",data:n})),...e.map(n=>({type:"summary",data:n}))];return r.sort((n,i)=>{let s=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch,a=i.type==="observation"?i.data.created_at_epoch:i.data.displayEpoch;return s-a}),r}function q6(t,e){return new Set(t.slice(0,e).map(r=>r.id))}var D6,av,Q$=De(()=>{"use strict";D6=nt(require("path"),1),av=require("fs");_e();tr();mp()});function F6(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function Z6(t){return[`# [${t}] recent context, ${F6()}`,""]}function H6(){return[`**Legend:** session-request | ${Ve.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ")}`,""]}function B6(){return["**Column Key**:","- **Read**: Tokens to read this observation (cost to learn it now)","- **Work**: Tokens spent on work that produced this record ( research, building, deciding)",""]}function V6(){return["**Context Index:** This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.","","When you need implementation details, rationale, or debugging context:","- Fetch by ID: get_observations([IDs]) for observations visible in this index","- Search history: Use the mem-search skill for past decisions, bugs, and deeper research","- Trust this index over re-reading code for past decisions and learnings",""]}function G6(t,e){let r=[];if(r.push("**Context Economics**:"),r.push(`- Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)`),r.push(`- Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions`),t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let n="- Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?n+=`${t.savings.toLocaleString()} tokens (${t.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?n+=`${t.savings.toLocaleString()} tokens`:n+=`${t.savingsPercent}% reduction from reuse`,r.push(n)}return r.push(""),r}function W6(t){return[`### ${t}`,""]}function K6(t){return[`**${t}**`,"| ID | Time | T | Title | Read | Work |","|----|------|---|-------|------|------|"]}function J6(t,e,r){let n=t.title||"Untitled",i=Ve.getInstance().getTypeIcon(t.type),{readTokens:s,discoveryDisplay:a}=Qc(t,r),o=r.showReadTokens?`~${s}`:"",c=r.showWorkTokens?a:"";return`| #${t.id} | ${e||'"'} | ${i} | ${n} | ${o} | ${c} |`}function X6(t,e,r,n){let i=[],s=t.title||"Untitled",a=Ve.getInstance().getTypeIcon(t.type),{readTokens:o,discoveryDisplay:c}=Qc(t,n);i.push(`**#${t.id}** ${e||'"'} ${a} **${s}**`),r&&(i.push(""),i.push(r),i.push(""));let u=[];return n.showReadTokens&&u.push(`Read: ~${o}`),n.showWorkTokens&&u.push(`Work: ${c}`),u.length>0&&i.push(u.join(", ")),i.push(""),i}function Y6(t,e){let r=`${t.request||"Session started"} (${e})`;return[`**#S${t.id}** ${r}`,""]}function hp(t,e){return e?[`**${t}**: ${e}`,""]:[]}function Q6(t){return t.assistantMessage?["","---","","**Previously**","",`A: ${t.assistantMessage}`,""]:[]}function eq(t,e){return["",`Access ${Math.round(t/1e3)}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use MCP search tools to access memories by ID.`]}function tq(t){return`# [${t}] recent context, ${F6()} +`).filter(i=>i.trim()),n="";for(let i=r.length-1;i>=0;i--)try{let s=r[i];if(!s.includes('"type":"assistant"'))continue;let a=JSON.parse(s);if(a.type==="assistant"&&a.message?.content&&Array.isArray(a.message.content)){let o="";for(let c of a.message.content)c.type==="text"&&(o+=c.text);if(o=o.replace(/[\s\S]*?<\/system-reminder>/g,"").trim(),o){n=o;break}}}catch(s){E.debug("PARSER","Skipping malformed transcript line",{lineIndex:i},s);continue}return{userMessage:"",assistantMessage:n}}catch(e){return E.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:t},e),{userMessage:"",assistantMessage:""}}}function X$(t,e,r,n){if(!e.showLastMessage||t.length===0)return{userMessage:"",assistantMessage:""};let i=t.find(c=>c.memory_session_id!==r);if(!i)return{userMessage:"",assistantMessage:""};let s=i.memory_session_id,a=Whe(n),o=D6.default.join(Vi,"projects",a,`${s}.jsonl`);return Khe(o)}function L6(t,e){let r=e[0]?.id;return t.map((n,i)=>{let s=i===0?null:e[i+1];return{...n,displayEpoch:s?s.created_at_epoch:n.created_at_epoch,displayTime:s?s.created_at:n.created_at,shouldShowLink:n.id!==r}})}function Y$(t,e){let r=[...t.map(n=>({type:"observation",data:n})),...e.map(n=>({type:"summary",data:n}))];return r.sort((n,i)=>{let s=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch,a=i.type==="observation"?i.data.created_at_epoch:i.data.displayEpoch;return s-a}),r}function q6(t,e){return new Set(t.slice(0,e).map(r=>r.id))}var D6,av,Q$=De(()=>{"use strict";D6=nt(require("path"),1),av=require("fs");_e();tr();mp()});function F6(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function Z6(t){return[`# [${t}] recent context, ${F6()}`,""]}function H6(){return[`**Legend:** session-request | ${Ve.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ")}`,""]}function B6(){return["**Column Key**:","- **Read**: Tokens to read this observation (cost to learn it now)","- **Work**: Tokens spent on work that produced this record ( research, building, deciding)",""]}function V6(){return["**Context Index:** This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.","","When you need implementation details, rationale, or debugging context:","- Fetch by ID: get_observations([IDs]) for observations visible in this index","- Search history: Use the mem-search skill for past decisions, bugs, and deeper research","- Trust this index over re-reading code for past decisions and learnings",""]}function G6(t,e){let r=[];if(r.push("**Context Economics**:"),r.push(`- Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)`),r.push(`- Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions`),t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let n="- Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?n+=`${t.savings.toLocaleString()} tokens (${t.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?n+=`${t.savings.toLocaleString()} tokens`:n+=`${t.savingsPercent}% reduction from reuse`,r.push(n)}return r.push(""),r}function W6(t){return[`### ${t}`,""]}function K6(t){return[`**${t}**`,"| ID | Time | T | Title | Read | Work |","|----|------|---|-------|------|------|"]}function J6(t,e,r){let n=t.title||"Untitled",i=Ve.getInstance().getTypeIcon(t.type),{readTokens:s,discoveryDisplay:a}=Qc(t,r),o=r.showReadTokens?`~${s}`:"",c=r.showWorkTokens?a:"";return`| #${t.id} | ${e||'"'} | ${i} | ${n} | ${o} | ${c} |`}function X6(t,e,r,n){let i=[],s=t.title||"Untitled",a=Ve.getInstance().getTypeIcon(t.type),{readTokens:o,discoveryDisplay:c}=Qc(t,n);i.push(`**#${t.id}** ${e||'"'} ${a} **${s}**`),r&&(i.push(""),i.push(r),i.push(""));let u=[];return n.showReadTokens&&u.push(`Read: ~${o}`),n.showWorkTokens&&u.push(`Work: ${c}`),u.length>0&&i.push(u.join(", ")),i.push(""),i}function Y6(t,e){let r=`${t.request||"Session started"} (${e})`;return[`**#S${t.id}** ${r}`,""]}function hp(t,e){return e?[`**${t}**: ${e}`,""]:[]}function Q6(t){return t.assistantMessage?["","---","","**Previously**","",`A: ${t.assistantMessage}`,""]:[]}function eq(t,e){return["",`Access ${Math.round(t/1e3)}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.`]}function tq(t){return`# [${t}] recent context, ${F6()} -No previous sessions found for this project yet.`}var eu=De(()=>{"use strict";Wr();Ga()});function rq(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function nq(t){return["",`${ne.bright}${ne.cyan}[${t}] recent context, ${rq()}${ne.reset}`,`${ne.gray}${"\u2500".repeat(60)}${ne.reset}`,""]}function iq(){let e=Ve.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ");return[`${ne.dim}Legend: session-request | ${e}${ne.reset}`,""]}function sq(){return[`${ne.bright}Column Key${ne.reset}`,`${ne.dim} Read: Tokens to read this observation (cost to learn it now)${ne.reset}`,`${ne.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${ne.reset}`,""]}function aq(){return[`${ne.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${ne.reset}`,"",`${ne.dim}When you need implementation details, rationale, or debugging context:${ne.reset}`,`${ne.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${ne.reset}`,`${ne.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${ne.reset}`,`${ne.dim} - Trust this index over re-reading code for past decisions and learnings${ne.reset}`,""]}function oq(t,e){let r=[];if(r.push(`${ne.bright}${ne.cyan}Context Economics${ne.reset}`),r.push(`${ne.dim} Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)${ne.reset}`),r.push(`${ne.dim} Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${ne.reset}`),t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let n=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?n+=`${t.savings.toLocaleString()} tokens (${t.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?n+=`${t.savings.toLocaleString()} tokens`:n+=`${t.savingsPercent}% reduction from reuse`,r.push(`${ne.green}${n}${ne.reset}`)}return r.push(""),r}function cq(t){return[`${ne.bright}${ne.cyan}${t}${ne.reset}`,""]}function uq(t){return[`${ne.dim}${t}${ne.reset}`]}function lq(t,e,r,n){let i=t.title||"Untitled",s=Ve.getInstance().getTypeIcon(t.type),{readTokens:a,discoveryTokens:o,workEmoji:c}=Qc(t,n),u=r?`${ne.dim}${e}${ne.reset}`:" ".repeat(e.length),l=n.showReadTokens&&a>0?`${ne.dim}(~${a}t)${ne.reset}`:"",d=n.showWorkTokens&&o>0?`${ne.dim}(${c} ${o.toLocaleString()}t)${ne.reset}`:"";return` ${ne.dim}#${t.id}${ne.reset} ${u} ${s} ${i} ${l} ${d}`}function dq(t,e,r,n,i){let s=[],a=t.title||"Untitled",o=Ve.getInstance().getTypeIcon(t.type),{readTokens:c,discoveryTokens:u,workEmoji:l}=Qc(t,i),d=r?`${ne.dim}${e}${ne.reset}`:" ".repeat(e.length),p=i.showReadTokens&&c>0?`${ne.dim}(~${c}t)${ne.reset}`:"",f=i.showWorkTokens&&u>0?`${ne.dim}(${l} ${u.toLocaleString()}t)${ne.reset}`:"";return s.push(` ${ne.dim}#${t.id}${ne.reset} ${d} ${o} ${ne.bright}${a}${ne.reset}`),n&&s.push(` ${ne.dim}${n}${ne.reset}`),(p||f)&&s.push(` ${p} ${f}`),s.push(""),s}function pq(t,e){let r=`${t.request||"Session started"} (${e})`;return[`${ne.yellow}#S${t.id}${ne.reset} ${r}`,""]}function gp(t,e,r){return e?[`${r}${t}:${ne.reset} ${e}`,""]:[]}function fq(t){return t.assistantMessage?["","---","",`${ne.bright}${ne.magenta}Previously${ne.reset}`,"",`${ne.dim}A: ${t.assistantMessage}${ne.reset}`,""]:[]}function mq(t,e){let r=Math.round(t/1e3);return["",`${ne.dim}Access ${r}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use MCP search tools to access memories by ID.${ne.reset}`]}function hq(t){return` +No previous sessions found for this project yet.`}var eu=De(()=>{"use strict";Wr();Ga()});function rq(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function nq(t){return["",`${ne.bright}${ne.cyan}[${t}] recent context, ${rq()}${ne.reset}`,`${ne.gray}${"\u2500".repeat(60)}${ne.reset}`,""]}function iq(){let e=Ve.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ");return[`${ne.dim}Legend: session-request | ${e}${ne.reset}`,""]}function sq(){return[`${ne.bright}Column Key${ne.reset}`,`${ne.dim} Read: Tokens to read this observation (cost to learn it now)${ne.reset}`,`${ne.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${ne.reset}`,""]}function aq(){return[`${ne.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${ne.reset}`,"",`${ne.dim}When you need implementation details, rationale, or debugging context:${ne.reset}`,`${ne.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${ne.reset}`,`${ne.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${ne.reset}`,`${ne.dim} - Trust this index over re-reading code for past decisions and learnings${ne.reset}`,""]}function oq(t,e){let r=[];if(r.push(`${ne.bright}${ne.cyan}Context Economics${ne.reset}`),r.push(`${ne.dim} Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)${ne.reset}`),r.push(`${ne.dim} Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${ne.reset}`),t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let n=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?n+=`${t.savings.toLocaleString()} tokens (${t.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?n+=`${t.savings.toLocaleString()} tokens`:n+=`${t.savingsPercent}% reduction from reuse`,r.push(`${ne.green}${n}${ne.reset}`)}return r.push(""),r}function cq(t){return[`${ne.bright}${ne.cyan}${t}${ne.reset}`,""]}function uq(t){return[`${ne.dim}${t}${ne.reset}`]}function lq(t,e,r,n){let i=t.title||"Untitled",s=Ve.getInstance().getTypeIcon(t.type),{readTokens:a,discoveryTokens:o,workEmoji:c}=Qc(t,n),u=r?`${ne.dim}${e}${ne.reset}`:" ".repeat(e.length),l=n.showReadTokens&&a>0?`${ne.dim}(~${a}t)${ne.reset}`:"",d=n.showWorkTokens&&o>0?`${ne.dim}(${c} ${o.toLocaleString()}t)${ne.reset}`:"";return` ${ne.dim}#${t.id}${ne.reset} ${u} ${s} ${i} ${l} ${d}`}function dq(t,e,r,n,i){let s=[],a=t.title||"Untitled",o=Ve.getInstance().getTypeIcon(t.type),{readTokens:c,discoveryTokens:u,workEmoji:l}=Qc(t,i),d=r?`${ne.dim}${e}${ne.reset}`:" ".repeat(e.length),p=i.showReadTokens&&c>0?`${ne.dim}(~${c}t)${ne.reset}`:"",f=i.showWorkTokens&&u>0?`${ne.dim}(${l} ${u.toLocaleString()}t)${ne.reset}`:"";return s.push(` ${ne.dim}#${t.id}${ne.reset} ${d} ${o} ${ne.bright}${a}${ne.reset}`),n&&s.push(` ${ne.dim}${n}${ne.reset}`),(p||f)&&s.push(` ${p} ${f}`),s.push(""),s}function pq(t,e){let r=`${t.request||"Session started"} (${e})`;return[`${ne.yellow}#S${t.id}${ne.reset} ${r}`,""]}function gp(t,e,r){return e?[`${r}${t}:${ne.reset} ${e}`,""]:[]}function fq(t){return t.assistantMessage?["","---","",`${ne.bright}${ne.magenta}Previously${ne.reset}`,"",`${ne.dim}A: ${t.assistantMessage}${ne.reset}`,""]:[]}function mq(t,e){let r=Math.round(t/1e3);return["",`${ne.dim}Access ${r}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${ne.reset}`]}function hq(t){return` ${ne.bright}${ne.cyan}[${t}] recent context, ${rq()}${ne.reset} ${ne.gray}${"\u2500".repeat(60)}${ne.reset} @@ -913,7 +913,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs. WHERE s.project = ? `).get(r);E.info("CHROMA_SYNC","Backfilling user prompts",{project:r,missing:m.length,existing:n.prompts.size,total:y.count});let v=[];for(let b of m)v.push(this.formatUserPromptDoc(b));for(let b=0;bs.trim()).find(s=>s.length>0)||null}catch{return null}}function HW(t={}){let e=t.platform??process.platform,r=t.execPath??process.execPath;if(e!=="win32"||KC(r))return r;let n=t.env??process.env,i=t.homeDirectory??(0,R0.homedir)(),s=t.pathExists??or.existsSync,a=t.lookupInPath??ZW,o=[n.BUN,n.BUN_PATH,_i.default.join(i,".bun","bin","bun.exe"),_i.default.join(i,".bun","bin","bun"),n.USERPROFILE?_i.default.join(n.USERPROFILE,".bun","bin","bun.exe"):void 0,n.LOCALAPPDATA?_i.default.join(n.LOCALAPPDATA,"bun","bun.exe"):void 0,n.LOCALAPPDATA?_i.default.join(n.LOCALAPPDATA,"bun","bin","bun.exe"):void 0];for(let c of o){let u=c?.trim();if(u&&(KC(u)&&s(u)||u.toLowerCase()==="bun"))return u}return a("bun",e)}function XC(t){(0,or.mkdirSync)(C0,{recursive:!0}),(0,or.writeFileSync)(ya,JSON.stringify(t,null,2))}function Dm(){if(!(0,or.existsSync)(ya))return null;try{return JSON.parse((0,or.readFileSync)(ya,"utf-8"))}catch(t){return E.warn("SYSTEM","Failed to parse PID file",{path:ya},t),null}}function Xn(){if((0,or.existsSync)(ya))try{(0,or.unlinkSync)(ya)}catch(t){E.warn("SYSTEM","Failed to remove PID file",{path:ya},t)}}function Ts(t){return process.platform==="win32"?Math.round(t*2):t}async function YC(t){if(process.platform!=="win32")return[];if(!Number.isInteger(t)||t<=0)return E.warn("SYSTEM","Invalid parent PID for child process enumeration",{parentPid:t}),[];try{let e=`powershell -NoProfile -NonInteractive -Command "Get-Process | Where-Object { $_.ParentProcessId -eq ${t} } | Select-Object -ExpandProperty Id"`,{stdout:r}=await jm(e,{timeout:Cr.POWERSHELL_COMMAND});return r.split(` `).map(n=>n.trim()).filter(n=>n.length>0&&/^\d+$/.test(n)).map(n=>parseInt(n,10)).filter(n=>n>0)}catch(e){return E.error("SYSTEM","Failed to enumerate child processes",{parentPid:t},e),[]}}async function QC(t){if(!Number.isInteger(t)||t<=0){E.warn("SYSTEM","Invalid PID for force kill",{pid:t});return}try{process.platform==="win32"?await jm(`taskkill /PID ${t} /T /F`,{timeout:Cr.POWERSHELL_COMMAND}):process.kill(t,"SIGKILL"),E.info("SYSTEM","Killed process",{pid:t})}catch(e){E.debug("SYSTEM","Process already exited during force kill",{pid:t},e)}}async function eA(t,e){let r=Date.now();for(;Date.now()-r{try{return process.kill(i,0),!0}catch{return!1}});if(n.length===0){E.info("SYSTEM","All child processes exited");return}E.debug("SYSTEM","Waiting for processes to exit",{stillAlive:n}),await new Promise(i=>setTimeout(i,100))}E.warn("SYSTEM","Timeout waiting for child processes to exit")}function BW(t){if(!t||t.trim()==="")return-1;let e=t.trim(),r=0,n=e.match(/^(\d+)-(\d+):(\d+):(\d+)$/);if(n)return r=parseInt(n[1],10)*24*60+parseInt(n[2],10)*60+parseInt(n[3],10),r;let i=e.match(/^(\d+):(\d+):(\d+)$/);if(i)return r=parseInt(i[1],10)*60+parseInt(i[2],10),r;let s=e.match(/^(\d+):(\d+)$/);return s?parseInt(s[1],10):-1}var P0=["worker-service.cjs","chroma-mcp"],VW=["mcp-server.cjs"];async function tA(){let t=process.platform==="win32",e=process.pid,r=[],n=[...P0,...VW];try{if(t){let s=`powershell -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process | Where-Object { (${n.map(l=>`$_.CommandLine -like '*${l}*'`).join(" -or ")}) -and $_.ProcessId -ne ${e} } | Select-Object ProcessId, CommandLine, CreationDate | ConvertTo-Json"`,{stdout:a}=await jm(s,{timeout:Cr.POWERSHELL_COMMAND});if(!a.trim()||a.trim()==="null"){E.debug("SYSTEM","No orphaned claude-mem processes found (Windows)");return}let o=JSON.parse(a),c=Array.isArray(o)?o:[o],u=Date.now();for(let l of c){let d=l.ProcessId;if(!Number.isInteger(d)||d<=0||d===e)continue;let p=l.CommandLine||"";if(P0.some(h=>p.includes(h)))r.push(d),E.debug("SYSTEM","Found orphaned process (aggressive)",{pid:d,commandLine:p.substring(0,80)});else{let h=l.CreationDate?.match(/\/Date\((\d+)\)\//);if(h){let _=parseInt(h[1],10),g=(u-_)/(1e3*60);g>=WC&&(r.push(d),E.debug("SYSTEM","Found orphaned process (age-gated)",{pid:d,ageMinutes:Math.round(g)}))}}}}else{let i=n.join("|"),{stdout:s}=await jm(`ps -eo pid,etime,command | grep -E "${i}" | grep -v grep || true`);if(!s.trim()){E.debug("SYSTEM","No orphaned claude-mem processes found (Unix)");return}let a=s.trim().split(` -`);for(let o of a){let c=o.trim().match(/^(\d+)\s+(\S+)\s+(.*)$/);if(!c)continue;let u=parseInt(c[1],10),l=c[2],d=c[3];if(!Number.isInteger(u)||u<=0||u===e)continue;if(P0.some(f=>d.includes(f)))r.push(u),E.debug("SYSTEM","Found orphaned process (aggressive)",{pid:u,command:d.substring(0,80)});else{let f=BW(l);f>=WC&&(r.push(u),E.debug("SYSTEM","Found orphaned process (age-gated)",{pid:u,ageMinutes:f,command:d.substring(0,80)}))}}}}catch(i){E.error("SYSTEM","Failed to enumerate orphaned processes during aggressive cleanup",{},i);return}if(r.length!==0){if(E.info("SYSTEM","Aggressive startup cleanup: killing orphaned processes",{platform:t?"Windows":"Unix",count:r.length,pids:r}),t){for(let i of r)if(!(!Number.isInteger(i)||i<=0))try{(0,Ji.execSync)(`taskkill /PID ${i} /T /F`,{timeout:Cr.POWERSHELL_COMMAND,stdio:"ignore"})}catch(s){E.debug("SYSTEM","Failed to kill process, may have already exited",{pid:i},s)}}else for(let i of r)try{process.kill(i,"SIGKILL")}catch(s){E.debug("SYSTEM","Process already exited",{pid:i},s)}E.info("SYSTEM","Aggressive startup cleanup complete",{count:r.length})}}var GW=".chroma-cleaned-v10.3";function rA(t){let e=t??C0,r=_i.default.join(e,GW),n=_i.default.join(e,"chroma");if((0,or.existsSync)(r)){E.debug("SYSTEM","Chroma migration marker exists, skipping wipe");return}E.warn("SYSTEM","Running one-time chroma data wipe (upgrade from pre-v10.3)",{chromaDir:n}),(0,or.existsSync)(n)&&((0,or.rmSync)(n,{recursive:!0,force:!0}),E.info("SYSTEM","Chroma data directory removed",{chromaDir:n})),(0,or.mkdirSync)(e,{recursive:!0}),(0,or.writeFileSync)(r,new Date().toISOString()),E.info("SYSTEM","Chroma migration marker written",{markerPath:r})}function A0(t,e,r={}){let n=process.platform==="win32",i={...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r};if(n){let o=HW();if(!o){E.error("SYSTEM","Failed to locate Bun runtime for Windows worker spawn");return}let c=o.replace(/'/g,"''"),u=t.replace(/'/g,"''"),l=`Start-Process -FilePath '${c}' -ArgumentList '${u}','--daemon' -WindowStyle Hidden`;try{return(0,Ji.execSync)(`powershell -NoProfile -Command "${l}"`,{stdio:"ignore",windowsHide:!0,env:i}),0}catch(d){E.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:o},d);return}}let s="/usr/bin/setsid";if((0,or.existsSync)(s)){let o=(0,Ji.spawn)(s,[process.execPath,t,"--daemon"],{detached:!0,stdio:"ignore",env:i});return o.pid===void 0?void 0:(o.unref(),o.pid)}let a=(0,Ji.spawn)(process.execPath,[t,"--daemon"],{detached:!0,stdio:"ignore",env:i});if(a.pid!==void 0)return a.unref(),a.pid}function N0(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}function nA(){let t=Dm();t&&(N0(t.pid)||(E.info("SYSTEM","Removing stale PID file (worker process is dead)",{pid:t.pid,port:t.port,startedAt:t.startedAt}),Xn()))}function iA(t,e){return async r=>{if(e.value){E.warn("SYSTEM",`Received ${r} but shutdown already in progress`);return}e.value=!0,E.info("SYSTEM",`Received ${r}, shutting down...`);try{await t(),process.exit(0)}catch(n){E.error("SYSTEM","Error during shutdown",{},n),process.exit(0)}}}var sA=nt(require("path"),1),aA=require("fs");_e();tr();async function Wo(t){try{return(await fetch(`http://127.0.0.1:${t}/api/health`)).ok}catch{return!1}}async function oA(t,e,r,n){let i=Date.now();for(;Date.now()-isetTimeout(s,500))}return!1}function Bl(t,e=3e4){return oA(t,"/api/health",e,"Service not ready yet, will retry")}function cA(t,e=3e4){return oA(t,"/api/readiness",e,"Worker not ready yet, will retry")}async function zm(t,e=1e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}async function Um(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/admin/shutdown`,{method:"POST"});return e.ok?!0:(E.warn("SYSTEM","Shutdown request returned error",{port:t,status:e.status}),!1)}catch(e){return e instanceof Error&&e.message?.includes("ECONNREFUSED")?(E.debug("SYSTEM","Worker already stopped",{port:t},e),!1):(E.error("SYSTEM","Shutdown request failed unexpectedly",{port:t},e),!1)}}function WW(){let t=sA.default.join(Gi,"package.json");return JSON.parse((0,aA.readFileSync)(t,"utf-8")).version}async function KW(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/version`);return e.ok?(await e.json()).version:null}catch{return E.debug("SYSTEM","Could not fetch worker version",{port:t}),null}}async function uA(t){let e=WW(),r=await KW(t);return r?{matches:e===r,pluginVersion:e,workerVersion:r}:{matches:!0,pluginVersion:e,workerVersion:r}}_e();async function lA(t){E.info("SYSTEM","Shutdown initiated"),Xn();let e=await YC(process.pid);if(E.info("SYSTEM","Found child processes",{count:e.length,pids:e}),t.server&&(await JW(t.server),E.info("SYSTEM","HTTP server closed")),await t.sessionManager.shutdownAll(),t.mcpClient&&(await t.mcpClient.close(),E.info("SYSTEM","MCP client closed")),t.chromaMcpManager&&(E.info("SHUTDOWN","Stopping Chroma MCP connection..."),await t.chromaMcpManager.stop(),E.info("SHUTDOWN","Chroma MCP connection stopped")),t.dbManager&&await t.dbManager.close(),e.length>0){E.info("SYSTEM","Force killing remaining children");for(let r of e)await QC(r);await eA(e,5e3)}E.info("SYSTEM","Worker shutdown complete")}async function JW(t){t.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{t.close(n=>n?r(n):e())}),process.platform==="win32"&&(await new Promise(e=>setTimeout(e,500)),E.info("SYSTEM","Waited for Windows port cleanup"))}var w2=nt(Gh(),1),LE=nt(require("fs"),1),Td=nt(require("path"),1);var l2=["search","context","summarize","import","export"],d2=["workflow","search_params","examples","all"];_e();var DE=nt(Gh(),1),v2=nt(g2(),1),y2=nt(require("path"),1);tr();_e();function zE(t){let e=[];e.push(DE.default.json({limit:"50mb"})),e.push((0,v2.default)({origin:(i,s)=>{!i||i.startsWith("http://localhost:")||i.startsWith("http://127.0.0.1:")?s(null,!0):s(new Error("CORS not allowed"))},credentials:!1})),e.push((i,s,a)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(h=>i.path.endsWith(h)),u=i.path==="/api/logs";if(i.path.startsWith("/health")||i.path==="/"||c||u)return a();let l=Date.now(),d=`${i.method}-${Date.now()}`,p=t(i.method,i.path,i.body);E.info("HTTP",`\u2192 ${i.method} ${i.path}`,{requestId:d},p);let f=s.send.bind(s);s.send=function(h){let _=Date.now()-l;return E.info("HTTP",`\u2190 ${s.statusCode} ${i.path}`,{requestId:d,duration:`${_}ms`}),f(h)},a()});let r=tn(),n=y2.default.join(r,"plugin","ui");return e.push(DE.default.static(n)),e}function Wh(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")){E.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 UE(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=${E.formatTool(n,i)}`}return e.includes("/summarize")?"requesting summary":""}_e();var Sc=class extends Error{constructor(r,n=500,i,s){super(r);this.statusCode=n;this.code=i;this.details=s;this.name="AppError"}};function _2(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}var b2=(t,e,r,n)=>{let i=t instanceof Sc?t.statusCode:500;E.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof Sc?t.code:void 0},t);let s=_2(t.name||"Error",t.message,t instanceof Sc?t.code:void 0,t instanceof Sc?t.details:void 0);r.status(i).json(s)};function S2(t,e){e.status(404).json(_2("NotFound",`Cannot ${t.method} ${t.path}`))}var x2="10.3.2",Kh=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,w2.default)(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{this.server=this.app.listen(e,r,()=>{E.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()}),this.server.on("error",i)})}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,E.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(S2),this.app.use(b2)}setupMiddleware(){zE(UE).forEach(r=>this.app.use(r))}setupCoreRoutes(){this.app.get("/api/health",(e,r)=>{r.status(200).json({status:"ok",version:x2,workerPath:this.options.workerPath,uptime:Date.now()-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()})}),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:x2})}),this.app.get("/api/instructions",async(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!d2.includes(n))return r.status(400).json({error:"Invalid topic"});try{let s;if(i){if(!l2.includes(i))return r.status(400).json({error:"Invalid operation"});let a=Td.default.resolve(__dirname,"../skills/mem-search/operations"),o=Td.default.resolve(a,`${i}.md`);if(!o.startsWith(a+Td.default.sep))return r.status(400).json({error:"Invalid request"});s=await LE.promises.readFile(o,"utf-8")}else{let a=Td.default.join(__dirname,"../skills/mem-search/SKILL.md"),o=await LE.promises.readFile(a,"utf-8");s=this.extractInstructionSection(o,n)}r.json({content:[{type:"text",text:s}]})}catch{r.status(404).json({error:"Instruction not found"})}}),this.app.post("/api/admin/restart",Wh,async(e,r)=>{r.json({status:"restarting"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(E.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):setTimeout(async()=>{try{await this.options.onRestart()}finally{process.exit(0)}},100)}),this.app.post("/api/admin/shutdown",Wh,async(e,r)=>{r.json({status:"shutting_down"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(E.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown"})):setTimeout(async()=>{try{await this.options.onShutdown()}finally{process.exit(0)}},100)})}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 $t=nt(require("path"),1),Od=require("os"),Yt=require("fs"),k2=require("child_process"),T2=require("util");_e();Br();tr();var Mn=require("fs"),Id=require("path");_e();function E2(t){try{return(0,Mn.existsSync)(t)?JSON.parse((0,Mn.readFileSync)(t,"utf-8")):{}}catch(e){return E.error("CONFIG","Failed to read Cursor registry, using empty registry",{file:t,error:e instanceof Error?e.message:String(e)}),{}}}function $2(t,e){let r=(0,Id.join)(t,"..");(0,Mn.mkdirSync)(r,{recursive:!0}),(0,Mn.writeFileSync)(t,JSON.stringify(e,null,2))}function qE(t,e){let r=(0,Id.join)(t,".cursor","rules"),n=(0,Id.join)(r,"claude-mem-context.mdc"),i=`${n}.tmp`;(0,Mn.mkdirSync)(r,{recursive:!0});let s=`--- +`);for(let o of a){let c=o.trim().match(/^(\d+)\s+(\S+)\s+(.*)$/);if(!c)continue;let u=parseInt(c[1],10),l=c[2],d=c[3];if(!Number.isInteger(u)||u<=0||u===e)continue;if(P0.some(f=>d.includes(f)))r.push(u),E.debug("SYSTEM","Found orphaned process (aggressive)",{pid:u,command:d.substring(0,80)});else{let f=BW(l);f>=WC&&(r.push(u),E.debug("SYSTEM","Found orphaned process (age-gated)",{pid:u,ageMinutes:f,command:d.substring(0,80)}))}}}}catch(i){E.error("SYSTEM","Failed to enumerate orphaned processes during aggressive cleanup",{},i);return}if(r.length!==0){if(E.info("SYSTEM","Aggressive startup cleanup: killing orphaned processes",{platform:t?"Windows":"Unix",count:r.length,pids:r}),t){for(let i of r)if(!(!Number.isInteger(i)||i<=0))try{(0,Ji.execSync)(`taskkill /PID ${i} /T /F`,{timeout:Cr.POWERSHELL_COMMAND,stdio:"ignore"})}catch(s){E.debug("SYSTEM","Failed to kill process, may have already exited",{pid:i},s)}}else for(let i of r)try{process.kill(i,"SIGKILL")}catch(s){E.debug("SYSTEM","Process already exited",{pid:i},s)}E.info("SYSTEM","Aggressive startup cleanup complete",{count:r.length})}}var GW=".chroma-cleaned-v10.3";function rA(t){let e=t??C0,r=_i.default.join(e,GW),n=_i.default.join(e,"chroma");if((0,or.existsSync)(r)){E.debug("SYSTEM","Chroma migration marker exists, skipping wipe");return}E.warn("SYSTEM","Running one-time chroma data wipe (upgrade from pre-v10.3)",{chromaDir:n}),(0,or.existsSync)(n)&&((0,or.rmSync)(n,{recursive:!0,force:!0}),E.info("SYSTEM","Chroma data directory removed",{chromaDir:n})),(0,or.mkdirSync)(e,{recursive:!0}),(0,or.writeFileSync)(r,new Date().toISOString()),E.info("SYSTEM","Chroma migration marker written",{markerPath:r})}function A0(t,e,r={}){let n=process.platform==="win32",i={...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r};if(n){let o=HW();if(!o){E.error("SYSTEM","Failed to locate Bun runtime for Windows worker spawn");return}let c=o.replace(/'/g,"''"),u=t.replace(/'/g,"''"),l=`Start-Process -FilePath '${c}' -ArgumentList '${u}','--daemon' -WindowStyle Hidden`;try{return(0,Ji.execSync)(`powershell -NoProfile -Command "${l}"`,{stdio:"ignore",windowsHide:!0,env:i}),0}catch(d){E.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:o},d);return}}let s="/usr/bin/setsid";if((0,or.existsSync)(s)){let o=(0,Ji.spawn)(s,[process.execPath,t,"--daemon"],{detached:!0,stdio:"ignore",env:i});return o.pid===void 0?void 0:(o.unref(),o.pid)}let a=(0,Ji.spawn)(process.execPath,[t,"--daemon"],{detached:!0,stdio:"ignore",env:i});if(a.pid!==void 0)return a.unref(),a.pid}function N0(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}function nA(){let t=Dm();t&&(N0(t.pid)||(E.info("SYSTEM","Removing stale PID file (worker process is dead)",{pid:t.pid,port:t.port,startedAt:t.startedAt}),Xn()))}function iA(t,e){return async r=>{if(e.value){E.warn("SYSTEM",`Received ${r} but shutdown already in progress`);return}e.value=!0,E.info("SYSTEM",`Received ${r}, shutting down...`);try{await t(),process.exit(0)}catch(n){E.error("SYSTEM","Error during shutdown",{},n),process.exit(0)}}}var sA=nt(require("path"),1),aA=require("fs");_e();tr();async function Wo(t){try{return(await fetch(`http://127.0.0.1:${t}/api/health`)).ok}catch{return!1}}async function oA(t,e,r,n){let i=Date.now();for(;Date.now()-isetTimeout(s,500))}return!1}function Bl(t,e=3e4){return oA(t,"/api/health",e,"Service not ready yet, will retry")}function cA(t,e=3e4){return oA(t,"/api/readiness",e,"Worker not ready yet, will retry")}async function zm(t,e=1e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}async function Um(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/admin/shutdown`,{method:"POST"});return e.ok?!0:(E.warn("SYSTEM","Shutdown request returned error",{port:t,status:e.status}),!1)}catch(e){return e instanceof Error&&e.message?.includes("ECONNREFUSED")?(E.debug("SYSTEM","Worker already stopped",{port:t},e),!1):(E.error("SYSTEM","Shutdown request failed unexpectedly",{port:t},e),!1)}}function WW(){let t=sA.default.join(Gi,"package.json");return JSON.parse((0,aA.readFileSync)(t,"utf-8")).version}async function KW(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/version`);return e.ok?(await e.json()).version:null}catch{return E.debug("SYSTEM","Could not fetch worker version",{port:t}),null}}async function uA(t){let e=WW(),r=await KW(t);return r?{matches:e===r,pluginVersion:e,workerVersion:r}:{matches:!0,pluginVersion:e,workerVersion:r}}_e();async function lA(t){E.info("SYSTEM","Shutdown initiated"),Xn();let e=await YC(process.pid);if(E.info("SYSTEM","Found child processes",{count:e.length,pids:e}),t.server&&(await JW(t.server),E.info("SYSTEM","HTTP server closed")),await t.sessionManager.shutdownAll(),t.mcpClient&&(await t.mcpClient.close(),E.info("SYSTEM","MCP client closed")),t.chromaMcpManager&&(E.info("SHUTDOWN","Stopping Chroma MCP connection..."),await t.chromaMcpManager.stop(),E.info("SHUTDOWN","Chroma MCP connection stopped")),t.dbManager&&await t.dbManager.close(),e.length>0){E.info("SYSTEM","Force killing remaining children");for(let r of e)await QC(r);await eA(e,5e3)}E.info("SYSTEM","Worker shutdown complete")}async function JW(t){t.closeAllConnections(),process.platform==="win32"&&await new Promise(e=>setTimeout(e,500)),await new Promise((e,r)=>{t.close(n=>n?r(n):e())}),process.platform==="win32"&&(await new Promise(e=>setTimeout(e,500)),E.info("SYSTEM","Waited for Windows port cleanup"))}var w2=nt(Gh(),1),LE=nt(require("fs"),1),Td=nt(require("path"),1);var l2=["search","context","summarize","import","export"],d2=["workflow","search_params","examples","all"];_e();var DE=nt(Gh(),1),v2=nt(g2(),1),y2=nt(require("path"),1);tr();_e();function zE(t){let e=[];e.push(DE.default.json({limit:"50mb"})),e.push((0,v2.default)({origin:(i,s)=>{!i||i.startsWith("http://localhost:")||i.startsWith("http://127.0.0.1:")?s(null,!0):s(new Error("CORS not allowed"))},credentials:!1})),e.push((i,s,a)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(h=>i.path.endsWith(h)),u=i.path==="/api/logs";if(i.path.startsWith("/health")||i.path==="/"||c||u)return a();let l=Date.now(),d=`${i.method}-${Date.now()}`,p=t(i.method,i.path,i.body);E.info("HTTP",`\u2192 ${i.method} ${i.path}`,{requestId:d},p);let f=s.send.bind(s);s.send=function(h){let _=Date.now()-l;return E.info("HTTP",`\u2190 ${s.statusCode} ${i.path}`,{requestId:d,duration:`${_}ms`}),f(h)},a()});let r=tn(),n=y2.default.join(r,"plugin","ui");return e.push(DE.default.static(n)),e}function Wh(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")){E.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 UE(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=${E.formatTool(n,i)}`}return e.includes("/summarize")?"requesting summary":""}_e();var Sc=class extends Error{constructor(r,n=500,i,s){super(r);this.statusCode=n;this.code=i;this.details=s;this.name="AppError"}};function _2(t,e,r,n){let i={error:t,message:e};return r&&(i.code=r),n&&(i.details=n),i}var b2=(t,e,r,n)=>{let i=t instanceof Sc?t.statusCode:500;E.error("HTTP",`Error handling ${e.method} ${e.path}`,{statusCode:i,error:t.message,code:t instanceof Sc?t.code:void 0},t);let s=_2(t.name||"Error",t.message,t instanceof Sc?t.code:void 0,t instanceof Sc?t.details:void 0);r.status(i).json(s)};function S2(t,e){e.status(404).json(_2("NotFound",`Cannot ${t.method} ${t.path}`))}var x2="10.3.3",Kh=class{app;server=null;options;startTime=Date.now();constructor(e){this.options=e,this.app=(0,w2.default)(),this.setupMiddleware(),this.setupCoreRoutes()}getHttpServer(){return this.server}async listen(e,r){return new Promise((n,i)=>{this.server=this.app.listen(e,r,()=>{E.info("SYSTEM","HTTP server started",{host:r,port:e,pid:process.pid}),n()}),this.server.on("error",i)})}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,E.info("SYSTEM","HTTP server closed"))}registerRoutes(e){e.setupRoutes(this.app)}finalizeRoutes(){this.app.use(S2),this.app.use(b2)}setupMiddleware(){zE(UE).forEach(r=>this.app.use(r))}setupCoreRoutes(){this.app.get("/api/health",(e,r)=>{r.status(200).json({status:"ok",version:x2,workerPath:this.options.workerPath,uptime:Date.now()-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()})}),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:x2})}),this.app.get("/api/instructions",async(e,r)=>{let n=e.query.topic||"all",i=e.query.operation;if(n&&!d2.includes(n))return r.status(400).json({error:"Invalid topic"});try{let s;if(i){if(!l2.includes(i))return r.status(400).json({error:"Invalid operation"});let a=Td.default.resolve(__dirname,"../skills/mem-search/operations"),o=Td.default.resolve(a,`${i}.md`);if(!o.startsWith(a+Td.default.sep))return r.status(400).json({error:"Invalid request"});s=await LE.promises.readFile(o,"utf-8")}else{let a=Td.default.join(__dirname,"../skills/mem-search/SKILL.md"),o=await LE.promises.readFile(a,"utf-8");s=this.extractInstructionSection(o,n)}r.json({content:[{type:"text",text:s}]})}catch{r.status(404).json({error:"Instruction not found"})}}),this.app.post("/api/admin/restart",Wh,async(e,r)=>{r.json({status:"restarting"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(E.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):setTimeout(async()=>{try{await this.options.onRestart()}finally{process.exit(0)}},100)}),this.app.post("/api/admin/shutdown",Wh,async(e,r)=>{r.json({status:"shutting_down"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(E.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown"})):setTimeout(async()=>{try{await this.options.onShutdown()}finally{process.exit(0)}},100)})}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 $t=nt(require("path"),1),Od=require("os"),Yt=require("fs"),k2=require("child_process"),T2=require("util");_e();Br();tr();var Mn=require("fs"),Id=require("path");_e();function E2(t){try{return(0,Mn.existsSync)(t)?JSON.parse((0,Mn.readFileSync)(t,"utf-8")):{}}catch(e){return E.error("CONFIG","Failed to read Cursor registry, using empty registry",{file:t,error:e instanceof Error?e.message:String(e)}),{}}}function $2(t,e){let r=(0,Id.join)(t,"..");(0,Mn.mkdirSync)(r,{recursive:!0}),(0,Mn.writeFileSync)(t,JSON.stringify(e,null,2))}function qE(t,e){let r=(0,Id.join)(t,".cursor","rules"),n=(0,Id.join)(r,"claude-mem-context.mdc"),i=`${n}.tmp`;(0,Mn.mkdirSync)(r,{recursive:!0});let s=`--- alwaysApply: true description: "Claude-mem context from past sessions (auto-updated)" --- @@ -1423,7 +1423,7 @@ Tips: ORDER BY MAX(created_at_epoch) DESC `).all().map(o=>o.project);n.json({projects:a})});handleGetProcessingStatus=this.wrapHandler((r,n)=>{let i=this.sessionManager.isAnySessionProcessing(),s=this.sessionManager.getTotalActiveWork();n.json({isProcessing:i,queueDepth:s})});handleSetProcessing=this.wrapHandler((r,n)=>{this.workerService.broadcastProcessingStatus();let i=this.sessionManager.isAnySessionProcessing(),s=this.sessionManager.getTotalQueueDepth(),a=this.sessionManager.getActiveSessionCount();n.json({status:"ok",isProcessing:i,queueDepth:s,activeSessions:a})});parsePaginationParams(r){let n=parseInt(r.query.offset,10)||0,i=Math.min(parseInt(r.query.limit,10)||20,100),s=r.query.project;return{offset:n,limit:i,project:s}}handleImport=this.wrapHandler((r,n)=>{let{sessions:i,summaries:s,observations:a,prompts:o}=r.body,c={sessionsImported:0,sessionsSkipped:0,summariesImported:0,summariesSkipped:0,observationsImported:0,observationsSkipped:0,promptsImported:0,promptsSkipped:0},u=this.dbManager.getSessionStore();if(Array.isArray(i))for(let l of i)u.importSdkSession(l).imported?c.sessionsImported++:c.sessionsSkipped++;if(Array.isArray(s))for(let l of s)u.importSessionSummary(l).imported?c.summariesImported++:c.summariesSkipped++;if(Array.isArray(a))for(let l of a)u.importObservation(l).imported?c.observationsImported++:c.observationsSkipped++;if(Array.isArray(o))for(let l of o)u.importUserPrompt(l).imported?c.promptsImported++:c.promptsSkipped++;n.json({success:!0,stats:c})});handleGetPendingQueue=this.wrapHandler((r,n)=>{let{PendingMessageStore:i}=(Ds(),iu(Ma)),s=new i(this.dbManager.getSessionStore().db,3),a=s.getQueueMessages(),o=s.getRecentlyProcessed(20,30),c=s.getStuckCount(300*1e3),u=s.getSessionsWithPendingMessages();n.json({queue:{messages:a,totalPending:a.filter(l=>l.status==="pending").length,totalProcessing:a.filter(l=>l.status==="processing").length,totalFailed:a.filter(l=>l.status==="failed").length,stuckCount:c},recentlyProcessed:o,sessionsWithPendingWork:u})});handleProcessPendingQueue=this.wrapHandler(async(r,n)=>{let i=Math.min(Math.max(parseInt(r.body.sessionLimit,10)||10,1),100),s=await this.workerService.processPendingQueues(i);n.json({success:!0,...s})});handleClearFailedQueue=this.wrapHandler((r,n)=>{let{PendingMessageStore:i}=(Ds(),iu(Ma)),a=new i(this.dbManager.getSessionStore().db,3).clearFailed();E.info("QUEUE","Cleared failed queue messages",{clearedCount:a}),n.json({success:!0,clearedCount:a})});handleClearAllQueue=this.wrapHandler((r,n)=>{let{PendingMessageStore:i}=(Ds(),iu(Ma)),a=new i(this.dbManager.getSessionStore().db,3).clearAll();E.warn("QUEUE","Cleared ALL queue messages (pending, processing, failed)",{clearedCount:a}),n.json({success:!0,clearedCount:a})})};var uv=class extends Dr{constructor(r){super();this.searchManager=r}setupRoutes(r){r.get("/api/search",this.handleUnifiedSearch.bind(this)),r.get("/api/timeline",this.handleUnifiedTimeline.bind(this)),r.get("/api/decisions",this.handleDecisions.bind(this)),r.get("/api/changes",this.handleChanges.bind(this)),r.get("/api/how-it-works",this.handleHowItWorks.bind(this)),r.get("/api/search/observations",this.handleSearchObservations.bind(this)),r.get("/api/search/sessions",this.handleSearchSessions.bind(this)),r.get("/api/search/prompts",this.handleSearchPrompts.bind(this)),r.get("/api/search/by-concept",this.handleSearchByConcept.bind(this)),r.get("/api/search/by-file",this.handleSearchByFile.bind(this)),r.get("/api/search/by-type",this.handleSearchByType.bind(this)),r.get("/api/context/recent",this.handleGetRecentContext.bind(this)),r.get("/api/context/timeline",this.handleGetContextTimeline.bind(this)),r.get("/api/context/preview",this.handleContextPreview.bind(this)),r.get("/api/context/inject",this.handleContextInject.bind(this)),r.get("/api/timeline/by-query",this.handleGetTimelineByQuery.bind(this)),r.get("/api/search/help",this.handleSearchHelp.bind(this))}handleUnifiedSearch=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.search(r.query);n.json(i)});handleUnifiedTimeline=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.timeline(r.query);n.json(i)});handleDecisions=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.decisions(r.query);n.json(i)});handleChanges=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.changes(r.query);n.json(i)});handleHowItWorks=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.howItWorks(r.query);n.json(i)});handleSearchObservations=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchObservations(r.query);n.json(i)});handleSearchSessions=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchSessions(r.query);n.json(i)});handleSearchPrompts=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchUserPrompts(r.query);n.json(i)});handleSearchByConcept=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByConcept(r.query);n.json(i)});handleSearchByFile=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByFile(r.query);n.json(i)});handleSearchByType=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByType(r.query);n.json(i)});handleGetRecentContext=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getRecentContext(r.query);n.json(i)});handleGetContextTimeline=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getContextTimeline(r.query);n.json(i)});handleContextPreview=this.wrapHandler(async(r,n)=>{let i=r.query.project;if(!i){this.badRequest(n,"Project parameter is required");return}let{generateContext:s}=await Promise.resolve().then(()=>(rk(),tk)),a=`/preview/${i}`,o=await s({session_id:"preview-"+Date.now(),cwd:a},!0);n.setHeader("Content-Type","text/plain; charset=utf-8"),n.send(o)});handleContextInject=this.wrapHandler(async(r,n)=>{let i=r.query.projects||r.query.project,s=r.query.colors==="true";if(!i){this.badRequest(n,"Project(s) parameter is required");return}let a=i.split(",").map(d=>d.trim()).filter(Boolean);if(a.length===0){this.badRequest(n,"At least one project is required");return}let{generateContext:o}=await Promise.resolve().then(()=>(rk(),tk)),u=`/context/${a[a.length-1]}`,l=await o({session_id:"context-inject-"+Date.now(),cwd:u,projects:a},s);n.setHeader("Content-Type","text/plain; charset=utf-8"),n.send(l)});handleGetTimelineByQuery=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getTimelineByQuery(r.query);n.json(i)});handleSearchHelp=this.wrapHandler((r,n)=>{n.json({title:"Claude-Mem Search API",description:"HTTP API for searching persistent memory",endpoints:[{path:"/api/search/observations",method:"GET",description:"Search observations using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)",project:"Filter by project name (optional)"}},{path:"/api/search/sessions",method:"GET",description:"Search session summaries using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)"}},{path:"/api/search/prompts",method:"GET",description:"Search user prompts using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)",project:"Filter by project name (optional)"}},{path:"/api/search/by-concept",method:"GET",description:"Find observations by concept tag",parameters:{concept:"Concept tag (required): discovery, decision, bugfix, feature, refactor",limit:"Number of results (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/by-file",method:"GET",description:"Find observations and sessions by file path",parameters:{filePath:"File path or partial path (required)",limit:"Number of results per type (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/by-type",method:"GET",description:"Find observations by type",parameters:{type:"Observation type (required): discovery, decision, bugfix, feature, refactor",limit:"Number of results (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/context/recent",method:"GET",description:"Get recent session context including summaries and observations",parameters:{project:"Project name (default: current directory)",limit:"Number of recent sessions (default: 3)"}},{path:"/api/context/timeline",method:"GET",description:"Get unified timeline around a specific point in time",parameters:{anchor:'Anchor point: observation ID, session ID (e.g., "S123"), or ISO timestamp (required)',depth_before:"Number of records before anchor (default: 10)",depth_after:"Number of records after anchor (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/timeline/by-query",method:"GET",description:"Search for best match, then get timeline around it",parameters:{query:"Search query (required)",mode:'Search mode: "auto", "observations", or "sessions" (default: "auto")',depth_before:"Number of records before match (default: 10)",depth_after:"Number of records after match (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/help",method:"GET",description:"Get this help documentation"}],examples:['curl "http://localhost:37777/api/search/observations?query=authentication&limit=5"','curl "http://localhost:37777/api/search/by-type?type=bugfix&limit=10"','curl "http://localhost:37777/api/context/recent?project=claude-mem&limit=3"','curl "http://localhost:37777/api/context/timeline?anchor=123&depth_before=5&depth_after=5"']})})};var Ka=nt(require("path"),1),$r=require("fs"),ak=require("os");tr();_e();var ik=require("child_process"),Wa=require("fs"),lv=require("path");_e();tr();var vp=Gi;function nk(t){return!t||typeof t!="string"?!1:/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/.test(t)&&!t.includes("..")}var nge=3e5,sk=6e5;function Ln(t){let e=(0,ik.spawnSync)("git",t,{cwd:vp,encoding:"utf-8",timeout:nge,windowsHide:!0,shell:!1});if(e.error)throw e.error;if(e.status!==0)throw new Error(e.stderr||e.stdout||"Git command failed");return e.stdout.trim()}function Rq(t,e=sk){let n=process.platform==="win32"?"npm.cmd":"npm",i=(0,ik.spawnSync)(n,t,{cwd:vp,encoding:"utf-8",timeout:e,windowsHide:!0,shell:!1});if(i.error)throw i.error;if(i.status!==0)throw new Error(i.stderr||i.stdout||"npm command failed");return i.stdout.trim()}function dv(){let t=(0,lv.join)(vp,".git");if(!(0,Wa.existsSync)(t))return{branch:null,isBeta:!1,isGitRepo:!1,isDirty:!1,canSwitch:!1,error:"Installed plugin is not a git repository"};try{let e=Ln(["rev-parse","--abbrev-ref","HEAD"]),n=Ln(["status","--porcelain"]).length>0,i=e.startsWith("beta");return{branch:e,isBeta:i,isGitRepo:!0,isDirty:n,canSwitch:!0}}catch(e){return E.error("BRANCH","Failed to get branch info",{},e),{branch:null,isBeta:!1,isGitRepo:!0,isDirty:!1,canSwitch:!1,error:e.message}}}async function Cq(t){if(!nk(t))return{success:!1,error:`Invalid branch name: ${t}. Branch names must be alphanumeric with hyphens, underscores, slashes, or dots.`};let e=dv();if(!e.isGitRepo)return{success:!1,error:"Installed plugin is not a git repository. Please reinstall."};if(e.branch===t)return{success:!0,branch:t,message:`Already on branch ${t}`};try{E.info("BRANCH","Starting branch switch",{from:e.branch,to:t}),E.debug("BRANCH","Discarding local changes"),Ln(["checkout","--","."]),Ln(["clean","-fd"]),E.debug("BRANCH","Fetching from origin"),Ln(["fetch","origin"]),E.debug("BRANCH","Checking out branch",{branch:t});try{Ln(["checkout",t])}catch(n){E.debug("BRANCH","Branch not local, tracking remote",{branch:t,error:n instanceof Error?n.message:String(n)}),Ln(["checkout","-b",t,`origin/${t}`])}E.debug("BRANCH","Pulling latest"),Ln(["pull","origin",t]);let r=(0,lv.join)(vp,".install-version");return(0,Wa.existsSync)(r)&&(0,Wa.unlinkSync)(r),E.debug("BRANCH","Running npm install"),Rq(["install"],sk),E.success("BRANCH","Branch switch complete",{branch:t}),{success:!0,branch:t,message:`Switched to ${t}. Worker will restart automatically.`}}catch(r){E.error("BRANCH","Branch switch failed",{targetBranch:t},r);try{e.branch&&nk(e.branch)&&Ln(["checkout",e.branch])}catch(n){E.error("BRANCH","Recovery checkout also failed",{originalBranch:e.branch},n)}return{success:!1,error:`Branch switch failed: ${r.message}`}}}async function Aq(){let t=dv();if(!t.isGitRepo||!t.branch)return{success:!1,error:"Cannot pull updates: not a git repository"};try{if(!nk(t.branch))return{success:!1,error:`Invalid current branch name: ${t.branch}`};E.info("BRANCH","Pulling updates",{branch:t.branch}),Ln(["checkout","--","."]),Ln(["fetch","origin"]),Ln(["pull","origin",t.branch]);let e=(0,lv.join)(vp,".install-version");return(0,Wa.existsSync)(e)&&(0,Wa.unlinkSync)(e),Rq(["install"],sk),E.success("BRANCH","Updates pulled",{branch:t.branch}),{success:!0,branch:t.branch,message:`Updated ${t.branch}. Worker will restart automatically.`}}catch(e){return E.error("BRANCH","Pull failed",{},e),{success:!1,error:`Pull failed: ${e.message}`}}}pr();Br();var pv=class extends Dr{constructor(r){super();this.settingsManager=r}setupRoutes(r){r.get("/api/settings",this.handleGetSettings.bind(this)),r.post("/api/settings",this.handleUpdateSettings.bind(this)),r.get("/api/mcp/status",this.handleGetMcpStatus.bind(this)),r.post("/api/mcp/toggle",this.handleToggleMcp.bind(this)),r.get("/api/branch/status",this.handleGetBranchStatus.bind(this)),r.post("/api/branch/switch",this.handleSwitchBranch.bind(this)),r.post("/api/branch/update",this.handleUpdateBranch.bind(this))}handleGetSettings=this.wrapHandler((r,n)=>{let i=Ka.default.join((0,ak.homedir)(),".claude-mem","settings.json");this.ensureSettingsFile(i);let s=Ce.loadFromFile(i);n.json(s)});handleUpdateSettings=this.wrapHandler((r,n)=>{let i=this.validateSettings(r.body);if(!i.valid){n.status(400).json({success:!1,error:i.error});return}let s=Ka.default.join((0,ak.homedir)(),".claude-mem","settings.json");this.ensureSettingsFile(s);let a={};if((0,$r.existsSync)(s)){let c=(0,$r.readFileSync)(s,"utf-8");try{a=JSON.parse(c)}catch(u){E.error("SETTINGS","Failed to parse settings file",{settingsPath:s},u),n.status(500).json({success:!1,error:"Settings file is corrupted. Delete ~/.claude-mem/settings.json to reset."});return}}let o=["CLAUDE_MEM_MODEL","CLAUDE_MEM_CONTEXT_OBSERVATIONS","CLAUDE_MEM_WORKER_PORT","CLAUDE_MEM_WORKER_HOST","CLAUDE_MEM_PROVIDER","CLAUDE_MEM_GEMINI_API_KEY","CLAUDE_MEM_GEMINI_MODEL","CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED","CLAUDE_MEM_OPENROUTER_API_KEY","CLAUDE_MEM_OPENROUTER_MODEL","CLAUDE_MEM_OPENROUTER_SITE_URL","CLAUDE_MEM_OPENROUTER_APP_NAME","CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES","CLAUDE_MEM_OPENROUTER_MAX_TOKENS","CLAUDE_MEM_DATA_DIR","CLAUDE_MEM_LOG_LEVEL","CLAUDE_MEM_PYTHON_VERSION","CLAUDE_CODE_PATH","CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT","CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES","CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS","CLAUDE_MEM_CONTEXT_FULL_COUNT","CLAUDE_MEM_CONTEXT_FULL_FIELD","CLAUDE_MEM_CONTEXT_SESSION_COUNT","CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY","CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE","CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED"];for(let c of o)r.body[c]!==void 0&&(a[c]=r.body[c]);(0,$r.writeFileSync)(s,JSON.stringify(a,null,2),"utf-8"),FC(),E.info("WORKER","Settings updated"),n.json({success:!0,message:"Settings updated successfully"})});handleGetMcpStatus=this.wrapHandler((r,n)=>{let i=this.isMcpEnabled();n.json({enabled:i})});handleToggleMcp=this.wrapHandler((r,n)=>{let{enabled:i}=r.body;if(typeof i!="boolean"){this.badRequest(n,"enabled must be a boolean");return}this.toggleMcp(i),n.json({success:!0,enabled:this.isMcpEnabled()})});handleGetBranchStatus=this.wrapHandler((r,n)=>{let i=dv();n.json(i)});handleSwitchBranch=this.wrapHandler(async(r,n)=>{let{branch:i}=r.body;if(!i){n.status(400).json({success:!1,error:"Missing branch parameter"});return}let s=["main","beta/7.0","feature/bun-executable"];if(!s.includes(i)){n.status(400).json({success:!1,error:`Invalid branch. Allowed: ${s.join(", ")}`});return}E.info("WORKER","Branch switch requested",{branch:i});let a=await Cq(i);a.success&&setTimeout(()=>{E.info("WORKER","Restarting worker after branch switch"),process.exit(0)},1e3),n.json(a)});handleUpdateBranch=this.wrapHandler(async(r,n)=>{E.info("WORKER","Branch update requested");let i=await Aq();i.success&&setTimeout(()=>{E.info("WORKER","Restarting worker after branch update"),process.exit(0)},1e3),n.json(i)});validateSettings(r){if(r.CLAUDE_MEM_PROVIDER&&!["claude","gemini","openrouter"].includes(r.CLAUDE_MEM_PROVIDER))return{valid:!1,error:'CLAUDE_MEM_PROVIDER must be "claude", "gemini", or "openrouter"'};if(r.CLAUDE_MEM_GEMINI_MODEL&&!["gemini-2.5-flash-lite","gemini-2.5-flash","gemini-3-flash-preview"].includes(r.CLAUDE_MEM_GEMINI_MODEL))return{valid:!1,error:"CLAUDE_MEM_GEMINI_MODEL must be one of: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview"};if(r.CLAUDE_MEM_CONTEXT_OBSERVATIONS){let i=parseInt(r.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10);if(isNaN(i)||i<1||i>200)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_OBSERVATIONS must be between 1 and 200"}}if(r.CLAUDE_MEM_WORKER_PORT){let i=parseInt(r.CLAUDE_MEM_WORKER_PORT,10);if(isNaN(i)||i<1024||i>65535)return{valid:!1,error:"CLAUDE_MEM_WORKER_PORT must be between 1024 and 65535"}}if(r.CLAUDE_MEM_WORKER_HOST){let i=r.CLAUDE_MEM_WORKER_HOST;if(!/^(127\.0\.0\.1|0\.0\.0\.0|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.test(i))return{valid:!1,error:"CLAUDE_MEM_WORKER_HOST must be a valid IP address (e.g., 127.0.0.1, 0.0.0.0)"}}if(r.CLAUDE_MEM_LOG_LEVEL&&!["DEBUG","INFO","WARN","ERROR","SILENT"].includes(r.CLAUDE_MEM_LOG_LEVEL.toUpperCase()))return{valid:!1,error:"CLAUDE_MEM_LOG_LEVEL must be one of: DEBUG, INFO, WARN, ERROR, SILENT"};if(r.CLAUDE_MEM_PYTHON_VERSION&&!/^3\.\d{1,2}$/.test(r.CLAUDE_MEM_PYTHON_VERSION))return{valid:!1,error:'CLAUDE_MEM_PYTHON_VERSION must be in format "3.X" or "3.XX" (e.g., "3.13")'};let n=["CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT","CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY","CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE"];for(let i of n)if(r[i]&&!["true","false"].includes(r[i]))return{valid:!1,error:`${i} must be "true" or "false"`};if(r.CLAUDE_MEM_CONTEXT_FULL_COUNT){let i=parseInt(r.CLAUDE_MEM_CONTEXT_FULL_COUNT,10);if(isNaN(i)||i<0||i>20)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_FULL_COUNT must be between 0 and 20"}}if(r.CLAUDE_MEM_CONTEXT_SESSION_COUNT){let i=parseInt(r.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10);if(isNaN(i)||i<1||i>50)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_SESSION_COUNT must be between 1 and 50"}}if(r.CLAUDE_MEM_CONTEXT_FULL_FIELD&&!["narrative","facts"].includes(r.CLAUDE_MEM_CONTEXT_FULL_FIELD))return{valid:!1,error:'CLAUDE_MEM_CONTEXT_FULL_FIELD must be "narrative" or "facts"'};if(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES){let i=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES,10);if(isNaN(i)||i<1||i>100)return{valid:!1,error:"CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES must be between 1 and 100"}}if(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS){let i=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS,10);if(isNaN(i)||i<1e3||i>1e6)return{valid:!1,error:"CLAUDE_MEM_OPENROUTER_MAX_TOKENS must be between 1000 and 1000000"}}if(r.CLAUDE_MEM_OPENROUTER_SITE_URL)try{new URL(r.CLAUDE_MEM_OPENROUTER_SITE_URL)}catch(i){return E.debug("SETTINGS","Invalid URL format",{url:r.CLAUDE_MEM_OPENROUTER_SITE_URL,error:i instanceof Error?i.message:String(i)}),{valid:!1,error:"CLAUDE_MEM_OPENROUTER_SITE_URL must be a valid URL"}}return{valid:!0}}isMcpEnabled(){let r=tn(),n=Ka.default.join(r,"plugin",".mcp.json");return(0,$r.existsSync)(n)}toggleMcp(r){let n=tn(),i=Ka.default.join(n,"plugin",".mcp.json"),s=Ka.default.join(n,"plugin",".mcp.json.disabled");r&&(0,$r.existsSync)(s)?((0,$r.renameSync)(s,i),E.info("WORKER","MCP search server enabled")):!r&&(0,$r.existsSync)(i)?((0,$r.renameSync)(i,s),E.info("WORKER","MCP search server disabled")):E.debug("WORKER","MCP toggle no-op (already in desired state)",{enabled:r})}ensureSettingsFile(r){if(!(0,$r.existsSync)(r)){let n=Ce.getAllDefaults(),i=Ka.default.dirname(r);(0,$r.existsSync)(i)||(0,$r.mkdirSync)(i,{recursive:!0}),(0,$r.writeFileSync)(r,JSON.stringify(n,null,2),"utf-8"),E.info("SETTINGS","Created settings file with defaults",{settingsPath:r})}}};var Ja=require("fs"),fv=require("path");_e();pr();var mv=class extends Dr{getLogFilePath(){let e=Ce.get("CLAUDE_MEM_DATA_DIR"),r=(0,fv.join)(e,"logs"),n=new Date().toISOString().split("T")[0];return(0,fv.join)(r,`claude-mem-${n}.log`)}getLogsDir(){let e=Ce.get("CLAUDE_MEM_DATA_DIR");return(0,fv.join)(e,"logs")}setupRoutes(e){e.get("/api/logs",this.handleGetLogs.bind(this)),e.post("/api/logs/clear",this.handleClearLogs.bind(this))}handleGetLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Ja.existsSync)(n)){r.json({logs:"",path:n,exists:!1});return}let i=parseInt(e.query.lines||"1000",10),s=Math.min(i,1e4),o=(0,Ja.readFileSync)(n,"utf-8").split(` `),c=Math.max(0,o.length-s),u=o.slice(c).join(` -`);r.json({logs:u,path:n,exists:!0,totalLines:o.length,returnedLines:o.length-c})});handleClearLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Ja.existsSync)(n)){r.json({success:!0,message:"Log file does not exist",path:n});return}(0,Ja.writeFileSync)(n,"","utf-8"),E.info("SYSTEM","Log file cleared via UI",{path:n}),r.json({success:!0,message:"Log file cleared",path:n})})};_e();var hv=class extends Dr{constructor(r,n){super();this.dbManager=r;this.defaultProject=n}setupRoutes(r){r.post("/api/memory/save",this.handleSaveMemory.bind(this))}handleSaveMemory=this.wrapHandler(async(r,n)=>{let{text:i,title:s,project:a}=r.body,o=a||this.defaultProject;if(!i||typeof i!="string"||i.trim().length===0){this.badRequest(n,"text is required and must be non-empty");return}let c=this.dbManager.getSessionStore(),u=this.dbManager.getChromaSync(),l=c.getOrCreateManualSession(o),d={type:"discovery",title:s||i.substring(0,60).trim()+(i.length>60?"...":""),subtitle:"Manual memory",facts:[],narrative:i,concepts:[],files_read:[],files_modified:[]},p=c.storeObservation(l,o,d,0,0);E.info("HTTP","Manual observation saved",{id:p.id,project:o,title:d.title}),u.syncObservation(p.id,l,o,d,0,p.createdAtEpoch,0).catch(f=>{E.error("CHROMA","ChromaDB sync failed",{id:p.id},f)}),n.json({success:!0,id:p.id,title:d.title,project:o,message:`Memory saved as observation #${p.id}`})})};var Cge={},Ege=120*1e3;function kk(){return $k.default.join(Ce.get("CLAUDE_MEM_DATA_DIR"),".worker-start-attempted")}function $ge(){if(process.platform!=="win32")return!1;let t=kk();if(!(0,cs.existsSync)(t))return!1;try{let e=(0,cs.statSync)(t).mtimeMs;return Date.now()-e{this.resolveInitialization=e}),this.dbManager=new Xh,this.sessionManager=new eg(this.dbManager),this.sseBroadcaster=new tg,this.sdkAgent=new Ug(this.dbManager,this.sessionManager),this.geminiAgent=new Lg(this.dbManager,this.sessionManager),this.openRouterAgent=new Zg(this.dbManager,this.sessionManager),this.paginationHelper=new Hg(this.dbManager),this.settingsManager=new Bg(this.dbManager),this.sessionEventBroadcaster=new Kg(this.sseBroadcaster,this),this.sessionManager.setOnSessionDeleted(()=>{this.broadcastProcessingStatus()}),this.mcpClient=new qo({name:"worker-search-proxy",version:Ige},{capabilities:{}}),this.server=new Kh({getInitializationComplete:()=>this.initializationCompleteFlag,getMcpReady:()=>this.mcpReady,onShutdown:()=>this.shutdown(),onRestart:()=>this.shutdown(),workerPath:__filename,getAiStatus:()=>{let e="claude";return Xc()&&Ba()?e="openrouter":Jc()&&Ha()&&(e="gemini"),{provider:e,authMethod:Nm(),lastInteraction:this.lastAiInteraction?{timestamp:this.lastAiInteraction.timestamp,success:this.lastAiInteraction.success,...this.lastAiInteraction.error&&{error:this.lastAiInteraction.error}}:null}}}),this.registerRoutes(),this.registerSignalHandlers()}registerSignalHandlers(){let e={value:this.isShuttingDown},r=iA(()=>this.shutdown(),e);process.on("SIGTERM",()=>{this.isShuttingDown=e.value,r("SIGTERM")}),process.on("SIGINT",()=>{this.isShuttingDown=e.value,r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{E.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{this.isShuttingDown=e.value,r("SIGHUP")}))}registerRoutes(){this.server.app.get("/api/context/inject",async(e,r,n)=>{if(!this.initializationCompleteFlag||!this.searchRoutes){E.warn("SYSTEM","Context requested before initialization complete, returning empty"),r.status(200).json({content:[{type:"text",text:""}]});return}n()}),this.server.app.use("/api",async(e,r,n)=>{if(this.initializationCompleteFlag){n();return}let i=3e4,s=new Promise((a,o)=>setTimeout(()=>o(new Error("Database initialization timeout")),i));try{await Promise.race([this.initializationComplete,s]),n()}catch(a){E.error("HTTP",`Request to ${e.method} ${e.path} rejected \u2014 DB not initialized`,{},a),r.status(503).json({error:"Service initializing",message:"Database is still initializing, please retry"})}}),this.server.registerRoutes(new Xg(this.sseBroadcaster,this.dbManager,this.sessionManager)),this.server.registerRoutes(new ev(this.sessionManager,this.dbManager,this.sdkAgent,this.geminiAgent,this.openRouterAgent,this.sessionEventBroadcaster,this)),this.server.registerRoutes(new tv(this.paginationHelper,this.dbManager,this.sessionManager,this.sseBroadcaster,this,this.startTime)),this.server.registerRoutes(new pv(this.settingsManager)),this.server.registerRoutes(new mv),this.server.registerRoutes(new hv(this.dbManager,"claude-mem"))}async start(){let e=wt(),r=Am();await this.server.listen(e,r),XC({pid:process.pid,port:e,startedAt:new Date().toISOString()}),E.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{E.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await tA();let{ModeManager:e}=await Promise.resolve().then(()=>(Wr(),q2)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(pr(),PC)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(tr(),UC)),i=r.loadFromFile(n);(i.CLAUDE_MEM_MODE==="local"||!i.CLAUDE_MEM_MODE)&&rA(),this.chromaMcpManager=Wi.getInstance(),E.info("SYSTEM","ChromaMcpManager initialized (lazy - connects on first use)");let s=i.CLAUDE_MEM_MODE;e.getInstance().loadMode(s),E.info("SYSTEM",`Mode loaded: ${s}`),await this.dbManager.initialize();let{PendingMessageStore:a}=await Promise.resolve().then(()=>(Ds(),Ma)),c=new a(this.dbManager.getSessionStore().db,3).resetStaleProcessingMessages(0);c>0&&E.info("SYSTEM",`Reset ${c} stale processing messages to pending`);let u=new Gg,l=new Wg,d=new Vg(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),u,l);this.searchRoutes=new uv(d),this.server.registerRoutes(this.searchRoutes),E.info("WORKER","SearchManager initialized and search routes registered"),this.initializationCompleteFlag=!0,this.resolveInitialization(),E.info("SYSTEM","Core initialization complete (DB + search ready)"),this.chromaMcpManager&&Go.backfillAllProjects().then(()=>{E.info("CHROMA_SYNC","Backfill check complete for all projects")}).catch(m=>{E.error("CHROMA_SYNC","Backfill failed (non-blocking)",{},m)});let p=$k.default.join(__dirname,"mcp-server.cjs"),f=new Ho({command:"node",args:[p],env:process.env}),h=3e5,_=this.mcpClient.connect(f),g=new Promise((m,y)=>setTimeout(()=>y(new Error("MCP connection timeout after 5 minutes")),h));await Promise.race([_,g]),this.mcpReady=!0,E.success("WORKER","MCP server connected"),this.stopOrphanReaper=U2(()=>{let m=new Set;for(let[y]of this.sessionManager.sessions)m.add(y);return m}),E.info("SYSTEM","Started orphan reaper (runs every 5 minutes)"),this.staleSessionReaperInterval=setInterval(async()=>{try{let m=await this.sessionManager.reapStaleSessions();m>0&&E.info("SYSTEM",`Reaped ${m} stale sessions`)}catch(m){E.error("SYSTEM","Stale session reaper error",{error:m instanceof Error?m.message:String(m)})}},120*1e3),this.processPendingQueues(50).then(m=>{m.sessionsStarted>0&&E.info("SYSTEM",`Auto-recovered ${m.sessionsStarted} sessions with pending work`,{totalPending:m.totalPendingSessions,started:m.sessionsStarted,sessionIds:m.startedSessionIds})}).catch(m=>{E.error("SYSTEM","Auto-recovery of pending queues failed",{},m)})}catch(e){throw E.error("SYSTEM","Background initialization failed",{},e),e}}getActiveAgent(){return Xc()&&Ba()?this.openRouterAgent:Jc()&&Ha()?this.geminiAgent:this.sdkAgent}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId,i=this.getActiveAgent(),s=i.constructor.name;e.abortController.signal.aborted&&(E.debug("SYSTEM","Replacing aborted AbortController before starting generator",{sessionId:e.sessionDbId}),e.abortController=new AbortController);let a=!1,o=!1;E.info("SYSTEM",`Starting generator (${r}) using ${s}`,{sessionId:n}),e.generatorPromise=i.startSession(e,this).catch(async c=>{let u=c?.message||"";if(["Claude executable not found","CLAUDE_CODE_PATH","ENOENT","spawn","Invalid API key"].some(d=>u.includes(d))){a=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},E.error("SDK","Unrecoverable generator error - will NOT restart",{sessionId:e.sessionDbId,project:e.project,errorMessage:u});return}if(this.isSessionTerminatedError(c))return E.warn("SDK","SDK resume failed, falling back to standalone processing",{sessionId:e.sessionDbId,project:e.project,reason:c instanceof Error?c.message:String(c)}),this.runFallbackForTerminatedSession(e,c);throw(u.includes("aborted by user")||u.includes("No conversation found"))&&e.memorySessionId&&(E.warn("SDK","Detected stale resume failure, clearing memorySessionId for fresh start",{sessionId:e.sessionDbId,memorySessionId:e.memorySessionId,errorMessage:u}),this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,null),e.memorySessionId=null,e.forceInit=!0),E.error("SDK","Session generator failed",{sessionId:e.sessionDbId,project:e.project,provider:s},c),o=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},c}).finally(async()=>{let c=zs(e.sessionDbId);if(c&&!c.process.killed&&c.process.exitCode===null&&await Us(c,5e3),e.generatorPromise=null,!o&&!a&&(this.lastAiInteraction={timestamp:Date.now(),success:!0,provider:s}),a){E.warn("SYSTEM","Skipping restart due to unrecoverable error",{sessionId:e.sessionDbId}),this.broadcastProcessingStatus();return}let{PendingMessageStore:u}=(Ds(),iu(Ma)),l=new u(this.dbManager.getSessionStore().db,3);if(e.idleTimedOut){E.info("SYSTEM","Generator exited due to idle timeout, not restarting",{sessionId:e.sessionDbId}),e.idleTimedOut=!1,this.broadcastProcessingStatus();return}let d=l.getPendingCount(e.sessionDbId);d>0&&(E.info("SYSTEM","Pending work remains after generator exit, restarting with fresh AbortController",{sessionId:e.sessionDbId,pendingCount:d}),e.abortController=new AbortController,this.startSessionProcessor(e,"pending-work-restart")),this.broadcastProcessingStatus()})}isSessionTerminatedError(e){let n=(e instanceof Error?e.message:String(e)).toLowerCase();return n.includes("process aborted by user")||n.includes("processtransport")||n.includes("not ready for writing")||n.includes("session generator failed")||n.includes("claude code process")}async runFallbackForTerminatedSession(e,r){if(!e)return;let n=e.sessionDbId;if(!e.memorySessionId){let a=`fallback-${n}-${Date.now()}`;e.memorySessionId=a,this.dbManager.getSessionStore().updateMemorySessionId(n,a)}if(Ha())try{await this.geminiAgent.startSession(e,this);return}catch(a){E.warn("SDK","Fallback Gemini failed, trying OpenRouter",{sessionId:n,error:a instanceof Error?a.message:String(a)})}if(Ba())try{await this.openRouterAgent.startSession(e,this);return}catch(a){E.warn("SDK","Fallback OpenRouter failed",{sessionId:n,error:a instanceof Error?a.message:String(a)})}let s=this.sessionManager.getPendingMessageStore().markAllSessionMessagesAbandoned(n);s>0&&E.warn("SDK","No fallback available; marked pending messages abandoned",{sessionId:n,abandoned:s}),this.sessionManager.removeSessionImmediate(n),this.sessionEventBroadcaster.broadcastSessionCompleted(n)}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Ds(),Ma)),n=new r(this.dbManager.getSessionStore().db,3),i=this.dbManager.getSessionStore(),s=360*60*1e3,a=Date.now()-s;try{let u=i.db.prepare(` +`);r.json({logs:u,path:n,exists:!0,totalLines:o.length,returnedLines:o.length-c})});handleClearLogs=this.wrapHandler((e,r)=>{let n=this.getLogFilePath();if(!(0,Ja.existsSync)(n)){r.json({success:!0,message:"Log file does not exist",path:n});return}(0,Ja.writeFileSync)(n,"","utf-8"),E.info("SYSTEM","Log file cleared via UI",{path:n}),r.json({success:!0,message:"Log file cleared",path:n})})};_e();var hv=class extends Dr{constructor(r,n){super();this.dbManager=r;this.defaultProject=n}setupRoutes(r){r.post("/api/memory/save",this.handleSaveMemory.bind(this))}handleSaveMemory=this.wrapHandler(async(r,n)=>{let{text:i,title:s,project:a}=r.body,o=a||this.defaultProject;if(!i||typeof i!="string"||i.trim().length===0){this.badRequest(n,"text is required and must be non-empty");return}let c=this.dbManager.getSessionStore(),u=this.dbManager.getChromaSync(),l=c.getOrCreateManualSession(o),d={type:"discovery",title:s||i.substring(0,60).trim()+(i.length>60?"...":""),subtitle:"Manual memory",facts:[],narrative:i,concepts:[],files_read:[],files_modified:[]},p=c.storeObservation(l,o,d,0,0);E.info("HTTP","Manual observation saved",{id:p.id,project:o,title:d.title}),u.syncObservation(p.id,l,o,d,0,p.createdAtEpoch,0).catch(f=>{E.error("CHROMA","ChromaDB sync failed",{id:p.id},f)}),n.json({success:!0,id:p.id,title:d.title,project:o,message:`Memory saved as observation #${p.id}`})})};var Cge={},Ege=120*1e3;function kk(){return $k.default.join(Ce.get("CLAUDE_MEM_DATA_DIR"),".worker-start-attempted")}function $ge(){if(process.platform!=="win32")return!1;let t=kk();if(!(0,cs.existsSync)(t))return!1;try{let e=(0,cs.statSync)(t).mtimeMs;return Date.now()-e{this.resolveInitialization=e}),this.dbManager=new Xh,this.sessionManager=new eg(this.dbManager),this.sseBroadcaster=new tg,this.sdkAgent=new Ug(this.dbManager,this.sessionManager),this.geminiAgent=new Lg(this.dbManager,this.sessionManager),this.openRouterAgent=new Zg(this.dbManager,this.sessionManager),this.paginationHelper=new Hg(this.dbManager),this.settingsManager=new Bg(this.dbManager),this.sessionEventBroadcaster=new Kg(this.sseBroadcaster,this),this.sessionManager.setOnSessionDeleted(()=>{this.broadcastProcessingStatus()}),this.mcpClient=new qo({name:"worker-search-proxy",version:Ige},{capabilities:{}}),this.server=new Kh({getInitializationComplete:()=>this.initializationCompleteFlag,getMcpReady:()=>this.mcpReady,onShutdown:()=>this.shutdown(),onRestart:()=>this.shutdown(),workerPath:__filename,getAiStatus:()=>{let e="claude";return Xc()&&Ba()?e="openrouter":Jc()&&Ha()&&(e="gemini"),{provider:e,authMethod:Nm(),lastInteraction:this.lastAiInteraction?{timestamp:this.lastAiInteraction.timestamp,success:this.lastAiInteraction.success,...this.lastAiInteraction.error&&{error:this.lastAiInteraction.error}}:null}}}),this.registerRoutes(),this.registerSignalHandlers()}registerSignalHandlers(){let e={value:this.isShuttingDown},r=iA(()=>this.shutdown(),e);process.on("SIGTERM",()=>{this.isShuttingDown=e.value,r("SIGTERM")}),process.on("SIGINT",()=>{this.isShuttingDown=e.value,r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{E.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{this.isShuttingDown=e.value,r("SIGHUP")}))}registerRoutes(){this.server.app.get("/api/context/inject",async(e,r,n)=>{if(!this.initializationCompleteFlag||!this.searchRoutes){E.warn("SYSTEM","Context requested before initialization complete, returning empty"),r.status(200).json({content:[{type:"text",text:""}]});return}n()}),this.server.app.use("/api",async(e,r,n)=>{if(this.initializationCompleteFlag){n();return}let i=3e4,s=new Promise((a,o)=>setTimeout(()=>o(new Error("Database initialization timeout")),i));try{await Promise.race([this.initializationComplete,s]),n()}catch(a){E.error("HTTP",`Request to ${e.method} ${e.path} rejected \u2014 DB not initialized`,{},a),r.status(503).json({error:"Service initializing",message:"Database is still initializing, please retry"})}}),this.server.registerRoutes(new Xg(this.sseBroadcaster,this.dbManager,this.sessionManager)),this.server.registerRoutes(new ev(this.sessionManager,this.dbManager,this.sdkAgent,this.geminiAgent,this.openRouterAgent,this.sessionEventBroadcaster,this)),this.server.registerRoutes(new tv(this.paginationHelper,this.dbManager,this.sessionManager,this.sseBroadcaster,this,this.startTime)),this.server.registerRoutes(new pv(this.settingsManager)),this.server.registerRoutes(new mv),this.server.registerRoutes(new hv(this.dbManager,"claude-mem"))}async start(){let e=wt(),r=Am();await this.server.listen(e,r),XC({pid:process.pid,port:e,startedAt:new Date().toISOString()}),E.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{E.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await tA();let{ModeManager:e}=await Promise.resolve().then(()=>(Wr(),q2)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(pr(),PC)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(tr(),UC)),i=r.loadFromFile(n);(i.CLAUDE_MEM_MODE==="local"||!i.CLAUDE_MEM_MODE)&&rA(),this.chromaMcpManager=Wi.getInstance(),E.info("SYSTEM","ChromaMcpManager initialized (lazy - connects on first use)");let s=i.CLAUDE_MEM_MODE;e.getInstance().loadMode(s),E.info("SYSTEM",`Mode loaded: ${s}`),await this.dbManager.initialize();let{PendingMessageStore:a}=await Promise.resolve().then(()=>(Ds(),Ma)),c=new a(this.dbManager.getSessionStore().db,3).resetStaleProcessingMessages(0);c>0&&E.info("SYSTEM",`Reset ${c} stale processing messages to pending`);let u=new Gg,l=new Wg,d=new Vg(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),u,l);this.searchRoutes=new uv(d),this.server.registerRoutes(this.searchRoutes),E.info("WORKER","SearchManager initialized and search routes registered"),this.initializationCompleteFlag=!0,this.resolveInitialization(),E.info("SYSTEM","Core initialization complete (DB + search ready)"),this.chromaMcpManager&&Go.backfillAllProjects().then(()=>{E.info("CHROMA_SYNC","Backfill check complete for all projects")}).catch(m=>{E.error("CHROMA_SYNC","Backfill failed (non-blocking)",{},m)});let p=$k.default.join(__dirname,"mcp-server.cjs"),f=new Ho({command:"node",args:[p],env:process.env}),h=3e5,_=this.mcpClient.connect(f),g=new Promise((m,y)=>setTimeout(()=>y(new Error("MCP connection timeout after 5 minutes")),h));await Promise.race([_,g]),this.mcpReady=!0,E.success("WORKER","MCP server connected"),this.stopOrphanReaper=U2(()=>{let m=new Set;for(let[y]of this.sessionManager.sessions)m.add(y);return m}),E.info("SYSTEM","Started orphan reaper (runs every 5 minutes)"),this.staleSessionReaperInterval=setInterval(async()=>{try{let m=await this.sessionManager.reapStaleSessions();m>0&&E.info("SYSTEM",`Reaped ${m} stale sessions`)}catch(m){E.error("SYSTEM","Stale session reaper error",{error:m instanceof Error?m.message:String(m)})}},120*1e3),this.processPendingQueues(50).then(m=>{m.sessionsStarted>0&&E.info("SYSTEM",`Auto-recovered ${m.sessionsStarted} sessions with pending work`,{totalPending:m.totalPendingSessions,started:m.sessionsStarted,sessionIds:m.startedSessionIds})}).catch(m=>{E.error("SYSTEM","Auto-recovery of pending queues failed",{},m)})}catch(e){throw E.error("SYSTEM","Background initialization failed",{},e),e}}getActiveAgent(){return Xc()&&Ba()?this.openRouterAgent:Jc()&&Ha()?this.geminiAgent:this.sdkAgent}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId,i=this.getActiveAgent(),s=i.constructor.name;e.abortController.signal.aborted&&(E.debug("SYSTEM","Replacing aborted AbortController before starting generator",{sessionId:e.sessionDbId}),e.abortController=new AbortController);let a=!1,o=!1;E.info("SYSTEM",`Starting generator (${r}) using ${s}`,{sessionId:n}),e.generatorPromise=i.startSession(e,this).catch(async c=>{let u=c?.message||"";if(["Claude executable not found","CLAUDE_CODE_PATH","ENOENT","spawn","Invalid API key"].some(d=>u.includes(d))){a=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},E.error("SDK","Unrecoverable generator error - will NOT restart",{sessionId:e.sessionDbId,project:e.project,errorMessage:u});return}if(this.isSessionTerminatedError(c))return E.warn("SDK","SDK resume failed, falling back to standalone processing",{sessionId:e.sessionDbId,project:e.project,reason:c instanceof Error?c.message:String(c)}),this.runFallbackForTerminatedSession(e,c);throw(u.includes("aborted by user")||u.includes("No conversation found"))&&e.memorySessionId&&(E.warn("SDK","Detected stale resume failure, clearing memorySessionId for fresh start",{sessionId:e.sessionDbId,memorySessionId:e.memorySessionId,errorMessage:u}),this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,null),e.memorySessionId=null,e.forceInit=!0),E.error("SDK","Session generator failed",{sessionId:e.sessionDbId,project:e.project,provider:s},c),o=!0,this.lastAiInteraction={timestamp:Date.now(),success:!1,provider:s,error:u},c}).finally(async()=>{let c=zs(e.sessionDbId);if(c&&!c.process.killed&&c.process.exitCode===null&&await Us(c,5e3),e.generatorPromise=null,!o&&!a&&(this.lastAiInteraction={timestamp:Date.now(),success:!0,provider:s}),a){E.warn("SYSTEM","Skipping restart due to unrecoverable error",{sessionId:e.sessionDbId}),this.broadcastProcessingStatus();return}let{PendingMessageStore:u}=(Ds(),iu(Ma)),l=new u(this.dbManager.getSessionStore().db,3);if(e.idleTimedOut){E.info("SYSTEM","Generator exited due to idle timeout, not restarting",{sessionId:e.sessionDbId}),e.idleTimedOut=!1,this.broadcastProcessingStatus();return}let d=l.getPendingCount(e.sessionDbId);d>0&&(E.info("SYSTEM","Pending work remains after generator exit, restarting with fresh AbortController",{sessionId:e.sessionDbId,pendingCount:d}),e.abortController=new AbortController,this.startSessionProcessor(e,"pending-work-restart")),this.broadcastProcessingStatus()})}isSessionTerminatedError(e){let n=(e instanceof Error?e.message:String(e)).toLowerCase();return n.includes("process aborted by user")||n.includes("processtransport")||n.includes("not ready for writing")||n.includes("session generator failed")||n.includes("claude code process")}async runFallbackForTerminatedSession(e,r){if(!e)return;let n=e.sessionDbId;if(!e.memorySessionId){let a=`fallback-${n}-${Date.now()}`;e.memorySessionId=a,this.dbManager.getSessionStore().updateMemorySessionId(n,a)}if(Ha())try{await this.geminiAgent.startSession(e,this);return}catch(a){E.warn("SDK","Fallback Gemini failed, trying OpenRouter",{sessionId:n,error:a instanceof Error?a.message:String(a)})}if(Ba())try{await this.openRouterAgent.startSession(e,this);return}catch(a){E.warn("SDK","Fallback OpenRouter failed",{sessionId:n,error:a instanceof Error?a.message:String(a)})}let s=this.sessionManager.getPendingMessageStore().markAllSessionMessagesAbandoned(n);s>0&&E.warn("SDK","No fallback available; marked pending messages abandoned",{sessionId:n,abandoned:s}),this.sessionManager.removeSessionImmediate(n),this.sessionEventBroadcaster.broadcastSessionCompleted(n)}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Ds(),Ma)),n=new r(this.dbManager.getSessionStore().db,3),i=this.dbManager.getSessionStore(),s=360*60*1e3,a=Date.now()-s;try{let u=i.db.prepare(` SELECT id FROM sdk_sessions WHERE status = 'active' AND started_at_epoch < ? `).all(a);if(u.length>0){let l=u.map(f=>f.id),d=l.map(()=>"?").join(",");i.db.prepare(`