diff --git a/plugin/scripts/new-hook.js b/plugin/scripts/new-hook.js index d2a429f7..7a67fc67 100755 --- a/plugin/scripts/new-hook.js +++ b/plugin/scripts/new-hook.js @@ -1,8 +1,8 @@ #!/usr/bin/env bun -import{stdin as P}from"process";var T=JSON.stringify({continue:!0,suppressOutput:!0});import A from"path";import{homedir as H}from"os";import{readFileSync as x}from"fs";import{readFileSync as $,writeFileSync as v,existsSync as w}from"fs";import{join as b}from"path";import{homedir as W}from"os";var D="bugfix,feature,refactor,discovery,decision,change",R="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var g=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_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:b(W(),".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:"true",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:D,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:R,CLAUDE_MEM_CONTEXT_FULL_COUNT:"5",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(t){return this.DEFAULTS[t]}static getInt(t){let r=this.get(t);return parseInt(r,10)}static getBool(t){return this.get(t)==="true"}static loadFromFile(t){try{if(!w(t))return this.getAllDefaults();let r=$(t,"utf-8"),e=JSON.parse(r),n=e;if(e.env&&typeof e.env=="object"){n=e.env;try{v(t,JSON.stringify(n,null,2),"utf-8"),a.info("SETTINGS","Migrated settings file from nested to flat schema",{settingsPath:t})}catch(E){a.warn("SETTINGS","Failed to auto-migrate settings file",{settingsPath:t},E)}}let s={...this.DEFAULTS};for(let E of Object.keys(this.DEFAULTS))n[E]!==void 0&&(s[E]=n[E]);return s}catch(r){return a.warn("SETTINGS","Failed to load settings, using defaults",{settingsPath:t},r),this.getAllDefaults()}}};var O=(s=>(s[s.DEBUG=0]="DEBUG",s[s.INFO=1]="INFO",s[s.WARN=2]="WARN",s[s.ERROR=3]="ERROR",s[s.SILENT=4]="SILENT",s))(O||{}),M=class{level=null;useColor;constructor(){this.useColor=process.stdout.isTTY??!1}getLevel(){if(this.level===null){let t=g.get("CLAUDE_MEM_LOG_LEVEL").toUpperCase();this.level=O[t]??1}return this.level}correlationId(t,r){return`obs-${t}-${r}`}sessionId(t){return`session-${t}`}formatData(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return t.toString();if(typeof t=="object"){if(t instanceof Error)return this.getLevel()===0?`${t.message} -${t.stack}`:t.message;if(Array.isArray(t))return`[${t.length} items]`;let r=Object.keys(t);return r.length===0?"{}":r.length<=3?JSON.stringify(t):`{${r.length} keys: ${r.slice(0,3).join(", ")}...}`}return String(t)}formatTool(t,r){if(!r)return t;let e=typeof r=="string"?JSON.parse(r):r;if(t==="Bash"&&e.command)return`${t}(${e.command})`;if(e.file_path)return`${t}(${e.file_path})`;if(e.notebook_path)return`${t}(${e.notebook_path})`;if(t==="Glob"&&e.pattern)return`${t}(${e.pattern})`;if(t==="Grep"&&e.pattern)return`${t}(${e.pattern})`;if(e.url)return`${t}(${e.url})`;if(e.query)return`${t}(${e.query})`;if(t==="Task"){if(e.subagent_type)return`${t}(${e.subagent_type})`;if(e.description)return`${t}(${e.description})`}return t==="Skill"&&e.skill?`${t}(${e.skill})`:t==="LSP"&&e.operation?`${t}(${e.operation})`:t}formatTimestamp(t){let r=t.getFullYear(),e=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),E=String(t.getMinutes()).padStart(2,"0"),i=String(t.getSeconds()).padStart(2,"0"),c=String(t.getMilliseconds()).padStart(3,"0");return`${r}-${e}-${n} ${s}:${E}:${i}.${c}`}log(t,r,e,n,s){if(t0&&(u=` {${Object.entries(m).map(([k,y])=>`${k}=${y}`).join(", ")}}`)}let L=`[${E}] [${i}] [${c}] ${_}${e}${u}${l}`;t===3?console.error(L):console.log(L)}debug(t,r,e,n){this.log(0,t,r,e,n)}info(t,r,e,n){this.log(1,t,r,e,n)}warn(t,r,e,n){this.log(2,t,r,e,n)}error(t,r,e,n){this.log(3,t,r,e,n)}dataIn(t,r,e,n){this.info(t,`\u2192 ${r}`,e,n)}dataOut(t,r,e,n){this.info(t,`\u2190 ${r}`,e,n)}success(t,r,e,n){this.info(t,`\u2713 ${r}`,e,n)}failure(t,r,e,n){this.error(t,`\u2717 ${r}`,e,n)}timing(t,r,e,n){this.info(t,`\u23F1 ${r}`,n,{duration:`${e}ms`})}happyPathError(t,r,e,n,s=""){let _=((new Error().stack||"").split(` -`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),l=_?`${_[1].split("/").pop()}:${_[2]}`:"unknown",u={...e,location:l};return this.warn(t,`[HAPPY-PATH] ${r}`,u,n),s}},a=new M;var f={DEFAULT:3e5,HEALTH_CHECK:3e4,WORKER_STARTUP_WAIT:1e3,WORKER_STARTUP_RETRIES:300,PRE_RESTART_SETTLE_DELAY:2e3,WINDOWS_MULTIPLIER:1.5};function U(o){return process.platform==="win32"?Math.round(o*f.WINDOWS_MULTIPLIER):o}function d(o={}){let{port:t,includeSkillFallback:r=!1,customPrefix:e,actualError:n}=o,s=e||"Worker service connection failed.",E=t?` (port ${t})`:"",i=`${s}${E} +import{stdin as k}from"process";var S=JSON.stringify({continue:!0,suppressOutput:!0});import A from"path";import{homedir as H}from"os";import{readFileSync as x}from"fs";import{readFileSync as $,writeFileSync as v,existsSync as b}from"fs";import{join as w}from"path";import{homedir as W}from"os";var D="bugfix,feature,refactor,discovery,decision,change",d="how-it-works,why-it-exists,what-changed,problem-solution,gotcha,pattern,trade-off";var u=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_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:w(W(),".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:"true",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"true",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:D,CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:d,CLAUDE_MEM_CONTEXT_FULL_COUNT:"5",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"};static getAllDefaults(){return{...this.DEFAULTS}}static get(t){return this.DEFAULTS[t]}static getInt(t){let r=this.get(t);return parseInt(r,10)}static getBool(t){return this.get(t)==="true"}static loadFromFile(t){try{if(!b(t))return this.getAllDefaults();let r=$(t,"utf-8"),e=JSON.parse(r),n=e;if(e.env&&typeof e.env=="object"){n=e.env;try{v(t,JSON.stringify(n,null,2),"utf-8"),l.info("SETTINGS","Migrated settings file from nested to flat schema",{settingsPath:t})}catch(E){l.warn("SETTINGS","Failed to auto-migrate settings file",{settingsPath:t},E)}}let s={...this.DEFAULTS};for(let E of Object.keys(this.DEFAULTS))n[E]!==void 0&&(s[E]=n[E]);return s}catch(r){return l.warn("SETTINGS","Failed to load settings, using defaults",{settingsPath:t},r),this.getAllDefaults()}}};var T=(s=>(s[s.DEBUG=0]="DEBUG",s[s.INFO=1]="INFO",s[s.WARN=2]="WARN",s[s.ERROR=3]="ERROR",s[s.SILENT=4]="SILENT",s))(T||{}),M=class{level=null;useColor;constructor(){this.useColor=process.stdout.isTTY??!1}getLevel(){if(this.level===null){let t=u.get("CLAUDE_MEM_LOG_LEVEL").toUpperCase();this.level=T[t]??1}return this.level}correlationId(t,r){return`obs-${t}-${r}`}sessionId(t){return`session-${t}`}formatData(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return t.toString();if(typeof t=="object"){if(t instanceof Error)return this.getLevel()===0?`${t.message} +${t.stack}`:t.message;if(Array.isArray(t))return`[${t.length} items]`;let r=Object.keys(t);return r.length===0?"{}":r.length<=3?JSON.stringify(t):`{${r.length} keys: ${r.slice(0,3).join(", ")}...}`}return String(t)}formatTool(t,r){if(!r)return t;let e=typeof r=="string"?JSON.parse(r):r;if(t==="Bash"&&e.command)return`${t}(${e.command})`;if(e.file_path)return`${t}(${e.file_path})`;if(e.notebook_path)return`${t}(${e.notebook_path})`;if(t==="Glob"&&e.pattern)return`${t}(${e.pattern})`;if(t==="Grep"&&e.pattern)return`${t}(${e.pattern})`;if(e.url)return`${t}(${e.url})`;if(e.query)return`${t}(${e.query})`;if(t==="Task"){if(e.subagent_type)return`${t}(${e.subagent_type})`;if(e.description)return`${t}(${e.description})`}return t==="Skill"&&e.skill?`${t}(${e.skill})`:t==="LSP"&&e.operation?`${t}(${e.operation})`:t}formatTimestamp(t){let r=t.getFullYear(),e=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),E=String(t.getMinutes()).padStart(2,"0"),i=String(t.getSeconds()).padStart(2,"0"),a=String(t.getMilliseconds()).padStart(3,"0");return`${r}-${e}-${n} ${s}:${E}:${i}.${a}`}log(t,r,e,n,s){if(t0&&(g=` {${Object.entries(m).map(([P,y])=>`${P}=${y}`).join(", ")}}`)}let L=`[${E}] [${i}] [${a}] ${_}${e}${g}${c}`;t===3?console.error(L):console.log(L)}debug(t,r,e,n){this.log(0,t,r,e,n)}info(t,r,e,n){this.log(1,t,r,e,n)}warn(t,r,e,n){this.log(2,t,r,e,n)}error(t,r,e,n){this.log(3,t,r,e,n)}dataIn(t,r,e,n){this.info(t,`\u2192 ${r}`,e,n)}dataOut(t,r,e,n){this.info(t,`\u2190 ${r}`,e,n)}success(t,r,e,n){this.info(t,`\u2713 ${r}`,e,n)}failure(t,r,e,n){this.error(t,`\u2717 ${r}`,e,n)}timing(t,r,e,n){this.info(t,`\u23F1 ${r}`,n,{duration:`${e}ms`})}happyPathError(t,r,e,n,s=""){let _=((new Error().stack||"").split(` +`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),c=_?`${_[1].split("/").pop()}:${_[2]}`:"unknown",g={...e,location:c};return this.warn(t,`[HAPPY-PATH] ${r}`,g,n),s}},l=new M;var f={DEFAULT:3e5,HEALTH_CHECK:3e4,WORKER_STARTUP_WAIT:1e3,WORKER_STARTUP_RETRIES:300,PRE_RESTART_SETTLE_DELAY:2e3,WINDOWS_MULTIPLIER:1.5};function R(o){return process.platform==="win32"?Math.round(o*f.WINDOWS_MULTIPLIER):o}function U(o={}){let{port:t,includeSkillFallback:r=!1,customPrefix:e,actualError:n}=o,s=e||"Worker service connection failed.",E=t?` (port ${t})`:"",i=`${s}${E} `;return i+=`To restart the worker: `,i+=`1. Exit Claude Code completely @@ -11,4 +11,4 @@ ${t.stack}`:t.message;if(Array.isArray(t))return`[${t.length} items]`;let r=Obje If that doesn't work, try: /troubleshoot`),n&&(i=`Worker Error: ${n} -${i}`),i}var F=A.join(H(),".claude","plugins","marketplaces","thedotmack"),N=U(f.HEALTH_CHECK),S=null;function p(){if(S!==null)return S;let o=A.join(g.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),t=g.loadFromFile(o);return S=parseInt(t.CLAUDE_MEM_WORKER_PORT,10),S}async function K(){let o=p();return(await fetch(`http://127.0.0.1:${o}/api/readiness`,{signal:AbortSignal.timeout(N)})).ok}function G(){let o=A.join(F,"package.json");return JSON.parse(x(o,"utf-8")).version}async function X(){let o=p(),t=await fetch(`http://127.0.0.1:${o}/api/version`,{signal:AbortSignal.timeout(N)});if(!t.ok)throw new Error(`Failed to get worker version: ${t.status}`);return(await t.json()).version}async function j(){let o=G(),t=await X();o!==t&&a.warn("SYSTEM","Worker version mismatch",{pluginVersion:o,workerVersion:t,hint:"Restart worker with: claude-mem worker restart"})}async function I(){for(let r=0;r<25;r++){try{if(await K()){await j();return}}catch{}await new Promise(e=>setTimeout(e,200))}throw new Error(d({port:p(),customPrefix:"Worker did not become ready within 5 seconds."}))}import V from"path";function h(o){if(!o||o.trim()==="")return a.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:o}),"unknown-project";let t=V.basename(o);if(t===""){if(process.platform==="win32"){let e=o.match(/^([A-Z]):\\/i);if(e){let s=`drive-${e[1].toUpperCase()}`;return a.info("PROJECT_NAME","Drive root detected",{cwd:o,projectName:s}),s}}return a.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:o}),"unknown-project"}return t}async function B(o){if(await I(),!o)throw new Error("newHook requires input");let{session_id:t,cwd:r,prompt:e}=o,n=h(r),s=p(),E=await fetch(`http://127.0.0.1:${s}/api/sessions/init`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({claudeSessionId:t,project:n,prompt:e}),signal:AbortSignal.timeout(5e3)});if(!E.ok)throw new Error(`Session initialization failed: ${E.status}`);let i=await E.json(),c=i.sessionDbId,_=i.promptNumber;if(i.skipped&&i.reason==="private"){console.error(`[new-hook] Session ${c}, prompt #${_} (fully private - skipped)`),console.log(T);return}console.error(`[new-hook] Session ${c}, prompt #${_}`);let l=e.startsWith("/")?e.substring(1):e,u=await fetch(`http://127.0.0.1:${s}/sessions/${c}/init`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({userPrompt:l,promptNumber:_}),signal:AbortSignal.timeout(5e3)});if(!u.ok)throw new Error(`SDK agent start failed: ${u.status}`);console.log(T)}var C="";P.on("data",o=>C+=o);P.on("end",async()=>{let o;try{o=C?JSON.parse(C):void 0}catch(t){throw new Error(`Failed to parse hook input: ${t instanceof Error?t.message:String(t)}`)}await B(o)}); +${i}`),i}var K=A.join(H(),".claude","plugins","marketplaces","thedotmack"),N=R(f.HEALTH_CHECK),O=null;function p(){if(O!==null)return O;let o=A.join(u.get("CLAUDE_MEM_DATA_DIR"),"settings.json"),t=u.loadFromFile(o);return O=parseInt(t.CLAUDE_MEM_WORKER_PORT,10),O}async function F(){let o=p();return(await fetch(`http://127.0.0.1:${o}/api/readiness`,{signal:AbortSignal.timeout(N)})).ok}function G(){let o=A.join(K,"package.json");return JSON.parse(x(o,"utf-8")).version}async function X(){let o=p(),t=await fetch(`http://127.0.0.1:${o}/api/version`,{signal:AbortSignal.timeout(N)});if(!t.ok)throw new Error(`Failed to get worker version: ${t.status}`);return(await t.json()).version}async function j(){let o=G(),t=await X();o!==t&&l.warn("SYSTEM","Worker version mismatch",{pluginVersion:o,workerVersion:t,hint:"Restart worker with: claude-mem worker restart"})}async function I(){for(let r=0;r<25;r++){try{if(await F()){await j();return}}catch{}await new Promise(e=>setTimeout(e,200))}throw new Error(U({port:p(),customPrefix:"Worker did not become ready within 5 seconds."}))}import V from"path";function h(o){if(!o||o.trim()==="")return l.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:o}),"unknown-project";let t=V.basename(o);if(t===""){if(process.platform==="win32"){let e=o.match(/^([A-Z]):\\/i);if(e){let s=`drive-${e[1].toUpperCase()}`;return l.info("PROJECT_NAME","Drive root detected",{cwd:o,projectName:s}),s}}return l.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:o}),"unknown-project"}return t}async function B(o){if(await I(),!o)throw new Error("newHook requires input");let{session_id:t,cwd:r,prompt:e}=o,n=h(r);console.log("[NEW-HOOK] Received hook input:",{session_id:t,has_prompt:!!e,cwd:r});let s=p();console.log("[NEW-HOOK] Calling /api/sessions/init:",{claudeSessionId:t,project:n,prompt_length:e?.length});let E=await fetch(`http://127.0.0.1:${s}/api/sessions/init`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({claudeSessionId:t,project:n,prompt:e}),signal:AbortSignal.timeout(5e3)});if(!E.ok)throw new Error(`Session initialization failed: ${E.status}`);let i=await E.json(),a=i.sessionDbId,_=i.promptNumber;if(console.log("[NEW-HOOK] Received from /api/sessions/init:",{sessionDbId:a,promptNumber:_,skipped:i.skipped}),i.skipped&&i.reason==="private"){console.error(`[new-hook] Session ${a}, prompt #${_} (fully private - skipped)`),console.log(S);return}console.error(`[new-hook] Session ${a}, prompt #${_}`);let c=e.startsWith("/")?e.substring(1):e;console.log("[NEW-HOOK] Calling /sessions/{sessionDbId}/init:",{sessionDbId:a,promptNumber:_,userPrompt_length:c?.length});let g=await fetch(`http://127.0.0.1:${s}/sessions/${a}/init`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({userPrompt:c,promptNumber:_}),signal:AbortSignal.timeout(5e3)});if(!g.ok)throw new Error(`SDK agent start failed: ${g.status}`);console.log(S)}var C="";k.on("data",o=>C+=o);k.on("end",async()=>{let o;try{o=C?JSON.parse(C):void 0}catch(t){throw new Error(`Failed to parse hook input: ${t instanceof Error?t.message:String(t)}`)}await B(o)}); diff --git a/plugin/scripts/worker-service.cjs b/plugin/scripts/worker-service.cjs index d89c55d7..f0a5107b 100755 --- a/plugin/scripts/worker-service.cjs +++ b/plugin/scripts/worker-service.cjs @@ -781,7 +781,7 @@ No previous sessions found for this project yet.`;let g=d.slice(0,r.sessionCount FROM user_prompts up JOIN sdk_sessions s ON up.claude_session_id = s.claude_session_id WHERE s.project = ? - `).get(this.project);A.info("CHROMA_SYNC","Backfilling user prompts",{project:this.project,missing:_.length,existing:e.prompts.size,total:p.count});let h=[];for(let y of _)h.push(this.formatUserPromptDoc(y));for(let y=0;y{A.error("DB","Chroma backfill failed (non-fatal)",{},e)}),A.info("DB","Database initialized")}async close(){this.chromaSync&&(await this.chromaSync.close(),this.chromaSync=null),this.sessionStore&&(this.sessionStore.close(),this.sessionStore=null),this.sessionSearch&&(this.sessionSearch.close(),this.sessionSearch=null),A.info("DB","Database closed")}getSessionStore(){if(!this.sessionStore)throw new Error("Database not initialized");return this.sessionStore}getSessionSearch(){if(!this.sessionSearch)throw new Error("Database not initialized");return this.sessionSearch}getChromaSync(){if(!this.chromaSync)throw new Error("ChromaSync not initialized");return this.chromaSync}getSessionById(e){let r=this.getSessionStore().getSessionById(e);if(!r)throw new Error(`Session ${e} not found`);return r}};var O1=require("events");lt();Po();var Yu=class{dbManager;sessions=new Map;sessionQueues=new Map;onSessionDeletedCallback;pendingStore=null;constructor(e){this.dbManager=e}getPendingStore(){if(!this.pendingStore){let e=this.dbManager.getSessionStore();this.pendingStore=new Ro(e.db,3)}return this.pendingStore}setOnSessionDeleted(e){this.onSessionDeletedCallback=e}initializeSession(e,r,n){let a=this.sessions.get(e);if(a){let c=this.dbManager.getSessionById(e);return c.project&&c.project!==a.project&&(A.debug("SESSION","Updating project from database",{sessionDbId:e,oldProject:a.project,newProject:c.project}),a.project=c.project),r?(A.debug("SESSION","Updating userPrompt for continuation",{sessionDbId:e,promptNumber:n,oldPrompt:a.userPrompt.substring(0,80),newPrompt:r.substring(0,80)}),a.userPrompt=r,a.lastPromptNumber=n||a.lastPromptNumber):A.debug("SESSION","No currentUserPrompt provided for existing session",{sessionDbId:e,promptNumber:n,usingCachedPrompt:a.userPrompt.substring(0,80)}),a}let s=this.dbManager.getSessionById(e),i=r||s.user_prompt;r?A.debug("SESSION","Initializing session with fresh userPrompt",{sessionDbId:e,promptNumber:n,userPrompt:r.substring(0,80)}):A.debug("SESSION","No currentUserPrompt provided for new session, using database",{sessionDbId:e,promptNumber:n,dbPrompt:s.user_prompt.substring(0,80)}),a={sessionDbId:e,claudeSessionId:s.claude_session_id,sdkSessionId:null,project:s.project,userPrompt:i,pendingMessages:[],abortController:new AbortController,generatorPromise:null,lastPromptNumber:n||this.dbManager.getSessionStore().getPromptNumberFromUserPrompts(s.claude_session_id),startTime:Date.now(),cumulativeInputTokens:0,cumulativeOutputTokens:0,pendingProcessingIds:new Set,earliestPendingTimestamp:null,conversationHistory:[],currentProvider:null},this.sessions.set(e,a);let o=new O1.EventEmitter;return this.sessionQueues.set(e,o),A.info("SESSION","Session initialized",{sessionId:e,project:a.project,claudeSessionId:a.claudeSessionId,queueDepth:0,hasGenerator:!1}),a}getSession(e){return this.sessions.get(e)}queueObservation(e,r){let n=this.sessions.get(e);n||(n=this.initializeSession(e));let a=n.pendingMessages.length,s={type:"observation",tool_name:r.tool_name,tool_input:r.tool_input,tool_response:r.tool_response,prompt_number:r.prompt_number,cwd:r.cwd};try{let u=this.getPendingStore().enqueue(e,n.claudeSessionId,s);A.debug("SESSION","Observation persisted to DB",{sessionId:e,messageId:u,tool:r.tool_name})}catch(u){throw A.error("SESSION","Failed to persist observation to DB",{sessionId:e,tool:r.tool_name},u),u}n.pendingMessages.push(s);let i=n.pendingMessages.length;this.sessionQueues.get(e)?.emit("message");let c=A.formatTool(r.tool_name,r.tool_input);A.info("SESSION",`Observation queued (${a}\u2192${i})`,{sessionId:e,tool:c,hasGenerator:!!n.generatorPromise})}queueSummarize(e,r,n){let a=this.sessions.get(e);a||(a=this.initializeSession(e));let s=a.pendingMessages.length,i={type:"summarize",last_user_message:r,last_assistant_message:n};try{let u=this.getPendingStore().enqueue(e,a.claudeSessionId,i);A.debug("SESSION","Summarize persisted to DB",{sessionId:e,messageId:u})}catch(u){throw A.error("SESSION","Failed to persist summarize to DB",{sessionId:e},u),u}a.pendingMessages.push(i);let o=a.pendingMessages.length;this.sessionQueues.get(e)?.emit("message"),A.info("SESSION",`Summarize queued (${s}\u2192${o})`,{sessionId:e,hasGenerator:!!a.generatorPromise})}async deleteSession(e){let r=this.sessions.get(e);if(!r)return;let n=Date.now()-r.startTime;r.abortController.abort(),r.generatorPromise&&await r.generatorPromise.catch(()=>{}),this.sessions.delete(e),this.sessionQueues.delete(e),A.info("SESSION","Session deleted",{sessionId:e,duration:`${(n/1e3).toFixed(1)}s`,project:r.project}),this.onSessionDeletedCallback&&this.onSessionDeletedCallback()}async shutdownAll(){let e=Array.from(this.sessions.keys());await Promise.all(e.map(r=>this.deleteSession(r)))}hasPendingMessages(){return Array.from(this.sessions.values()).some(e=>e.pendingMessages.length>0)}getActiveSessionCount(){return this.sessions.size}getTotalQueueDepth(){let e=0;for(let r of this.sessions.values())e+=r.pendingMessages.length;return e}getTotalActiveWork(){let e=0;for(let r of this.sessions.values())e+=r.pendingMessages.length,r.generatorPromise!==null&&(e+=1);return e}isAnySessionProcessing(){for(let e of this.sessions.values())if(e.pendingMessages.length>0||e.generatorPromise!==null)return!0;return!1}async*getMessageIterator(e){let r=this.sessions.get(e);r||(r=this.initializeSession(e));let n=this.sessionQueues.get(e);if(!n)throw new Error(`No emitter for session ${e}`);let a=5e3;for(;!r.abortController.signal.aborted;){let s=this.getPendingStore().peekPending(e);if(!s){let o=await new Promise(u=>{let l=!1,d=()=>{l||(l=!0,clearTimeout(m),u(!0))},m=setTimeout(()=>{l||(l=!0,n.off("message",d),u(!1))},a);n.once("message",d),r.abortController.signal.addEventListener("abort",()=>{l||(l=!0,clearTimeout(m),n.off("message",d),u(!1))},{once:!0})});if(this.getPendingStore().peekPending(e))continue;if(!o){A.info("SESSION","Generator exiting after linger timeout",{sessionId:e});return}continue}this.getPendingStore().markProcessing(s.id),r.pendingProcessingIds.add(s.id),r.earliestPendingTimestamp===null?r.earliestPendingTimestamp=s.created_at_epoch:r.earliestPendingTimestamp=Math.min(r.earliestPendingTimestamp,s.created_at_epoch);let i={_persistentId:s.id,_originalTimestamp:s.created_at_epoch,...this.getPendingStore().toPendingMessage(s)};if(r.pendingMessages.push(i),yield i,r.pendingMessages.shift(),i.type==="summarize"){A.info("SESSION","Summary yielded - ending generator",{sessionId:e});return}}}getPendingMessageStore(){return this.getPendingStore()}};lt();var Qu=class{sseClients=new Set;addClient(e){this.sseClients.add(e),A.debug("WORKER","Client connected",{total:this.sseClients.size}),e.on("close",()=>{this.removeClient(e)}),this.sendToClient(e,{type:"connected",timestamp:Date.now()})}removeClient(e){this.sseClients.delete(e),A.debug("WORKER","Client disconnected",{total:this.sseClients.size})}broadcast(e){if(this.sseClients.size===0){A.debug("WORKER","SSE broadcast skipped (no clients)",{eventType:e.type});return}let r={...e,timestamp:Date.now()},n=`data: ${JSON.stringify(r)} + `).get(this.project);A.info("CHROMA_SYNC","Backfilling user prompts",{project:this.project,missing:_.length,existing:e.prompts.size,total:p.count});let h=[];for(let y of _)h.push(this.formatUserPromptDoc(y));for(let y=0;y{A.error("DB","Chroma backfill failed (non-fatal)",{},e)}),A.info("DB","Database initialized")}async close(){this.chromaSync&&(await this.chromaSync.close(),this.chromaSync=null),this.sessionStore&&(this.sessionStore.close(),this.sessionStore=null),this.sessionSearch&&(this.sessionSearch.close(),this.sessionSearch=null),A.info("DB","Database closed")}getSessionStore(){if(!this.sessionStore)throw new Error("Database not initialized");return this.sessionStore}getSessionSearch(){if(!this.sessionSearch)throw new Error("Database not initialized");return this.sessionSearch}getChromaSync(){if(!this.chromaSync)throw new Error("ChromaSync not initialized");return this.chromaSync}getSessionById(e){let r=this.getSessionStore().getSessionById(e);if(!r)throw new Error(`Session ${e} not found`);return r}};var O1=require("events");lt();Po();var Yu=class{dbManager;sessions=new Map;sessionQueues=new Map;onSessionDeletedCallback;pendingStore=null;constructor(e){this.dbManager=e}getPendingStore(){if(!this.pendingStore){let e=this.dbManager.getSessionStore();this.pendingStore=new Ro(e.db,3)}return this.pendingStore}setOnSessionDeleted(e){this.onSessionDeletedCallback=e}initializeSession(e,r,n){console.log("[SESSION-MANAGER] initializeSession called:",{sessionDbId:e,promptNumber:n,has_currentUserPrompt:!!r});let a=this.sessions.get(e);if(a){console.log("[SESSION-MANAGER] Returning cached session:",{sessionDbId:e,claudeSessionId:a.claudeSessionId,lastPromptNumber:a.lastPromptNumber});let c=this.dbManager.getSessionById(e);return c.project&&c.project!==a.project&&(A.debug("SESSION","Updating project from database",{sessionDbId:e,oldProject:a.project,newProject:c.project}),a.project=c.project),r?(A.debug("SESSION","Updating userPrompt for continuation",{sessionDbId:e,promptNumber:n,oldPrompt:a.userPrompt.substring(0,80),newPrompt:r.substring(0,80)}),a.userPrompt=r,a.lastPromptNumber=n||a.lastPromptNumber):A.debug("SESSION","No currentUserPrompt provided for existing session",{sessionDbId:e,promptNumber:n,usingCachedPrompt:a.userPrompt.substring(0,80)}),a}let s=this.dbManager.getSessionById(e);console.log("[SESSION-MANAGER] Fetched session from database:",{sessionDbId:e,claude_session_id:s.claude_session_id,sdk_session_id:s.sdk_session_id});let i=r||s.user_prompt;r?A.debug("SESSION","Initializing session with fresh userPrompt",{sessionDbId:e,promptNumber:n,userPrompt:r.substring(0,80)}):A.debug("SESSION","No currentUserPrompt provided for new session, using database",{sessionDbId:e,promptNumber:n,dbPrompt:s.user_prompt.substring(0,80)}),a={sessionDbId:e,claudeSessionId:s.claude_session_id,sdkSessionId:null,project:s.project,userPrompt:i,pendingMessages:[],abortController:new AbortController,generatorPromise:null,lastPromptNumber:n||this.dbManager.getSessionStore().getPromptNumberFromUserPrompts(s.claude_session_id),startTime:Date.now(),cumulativeInputTokens:0,cumulativeOutputTokens:0,pendingProcessingIds:new Set,earliestPendingTimestamp:null,conversationHistory:[],currentProvider:null},console.log("[SESSION-MANAGER] Creating new session object:",{sessionDbId:e,claudeSessionId:s.claude_session_id,lastPromptNumber:n||this.dbManager.getSessionStore().getPromptNumberFromUserPrompts(s.claude_session_id)}),this.sessions.set(e,a);let o=new O1.EventEmitter;return this.sessionQueues.set(e,o),A.info("SESSION","Session initialized",{sessionId:e,project:a.project,claudeSessionId:a.claudeSessionId,queueDepth:0,hasGenerator:!1}),a}getSession(e){return this.sessions.get(e)}queueObservation(e,r){let n=this.sessions.get(e);n||(n=this.initializeSession(e));let a=n.pendingMessages.length,s={type:"observation",tool_name:r.tool_name,tool_input:r.tool_input,tool_response:r.tool_response,prompt_number:r.prompt_number,cwd:r.cwd};try{let u=this.getPendingStore().enqueue(e,n.claudeSessionId,s);A.debug("SESSION","Observation persisted to DB",{sessionId:e,messageId:u,tool:r.tool_name})}catch(u){throw A.error("SESSION","Failed to persist observation to DB",{sessionId:e,tool:r.tool_name},u),u}n.pendingMessages.push(s);let i=n.pendingMessages.length;this.sessionQueues.get(e)?.emit("message");let c=A.formatTool(r.tool_name,r.tool_input);A.info("SESSION",`Observation queued (${a}\u2192${i})`,{sessionId:e,tool:c,hasGenerator:!!n.generatorPromise})}queueSummarize(e,r,n){let a=this.sessions.get(e);a||(a=this.initializeSession(e));let s=a.pendingMessages.length,i={type:"summarize",last_user_message:r,last_assistant_message:n};try{let u=this.getPendingStore().enqueue(e,a.claudeSessionId,i);A.debug("SESSION","Summarize persisted to DB",{sessionId:e,messageId:u})}catch(u){throw A.error("SESSION","Failed to persist summarize to DB",{sessionId:e},u),u}a.pendingMessages.push(i);let o=a.pendingMessages.length;this.sessionQueues.get(e)?.emit("message"),A.info("SESSION",`Summarize queued (${s}\u2192${o})`,{sessionId:e,hasGenerator:!!a.generatorPromise})}async deleteSession(e){let r=this.sessions.get(e);if(!r)return;let n=Date.now()-r.startTime;r.abortController.abort(),r.generatorPromise&&await r.generatorPromise.catch(()=>{}),this.sessions.delete(e),this.sessionQueues.delete(e),A.info("SESSION","Session deleted",{sessionId:e,duration:`${(n/1e3).toFixed(1)}s`,project:r.project}),this.onSessionDeletedCallback&&this.onSessionDeletedCallback()}async shutdownAll(){let e=Array.from(this.sessions.keys());await Promise.all(e.map(r=>this.deleteSession(r)))}hasPendingMessages(){return Array.from(this.sessions.values()).some(e=>e.pendingMessages.length>0)}getActiveSessionCount(){return this.sessions.size}getTotalQueueDepth(){let e=0;for(let r of this.sessions.values())e+=r.pendingMessages.length;return e}getTotalActiveWork(){let e=0;for(let r of this.sessions.values())e+=r.pendingMessages.length,r.generatorPromise!==null&&(e+=1);return e}isAnySessionProcessing(){for(let e of this.sessions.values())if(e.pendingMessages.length>0||e.generatorPromise!==null)return!0;return!1}async*getMessageIterator(e){let r=this.sessions.get(e);r||(r=this.initializeSession(e));let n=this.sessionQueues.get(e);if(!n)throw new Error(`No emitter for session ${e}`);let a=5e3;for(;!r.abortController.signal.aborted;){let s=this.getPendingStore().peekPending(e);if(!s){let o=await new Promise(u=>{let l=!1,d=()=>{l||(l=!0,clearTimeout(m),u(!0))},m=setTimeout(()=>{l||(l=!0,n.off("message",d),u(!1))},a);n.once("message",d),r.abortController.signal.addEventListener("abort",()=>{l||(l=!0,clearTimeout(m),n.off("message",d),u(!1))},{once:!0})});if(this.getPendingStore().peekPending(e))continue;if(!o){A.info("SESSION","Generator exiting after linger timeout",{sessionId:e});return}continue}this.getPendingStore().markProcessing(s.id),r.pendingProcessingIds.add(s.id),r.earliestPendingTimestamp===null?r.earliestPendingTimestamp=s.created_at_epoch:r.earliestPendingTimestamp=Math.min(r.earliestPendingTimestamp,s.created_at_epoch);let i={_persistentId:s.id,_originalTimestamp:s.created_at_epoch,...this.getPendingStore().toPendingMessage(s)};if(r.pendingMessages.push(i),yield i,r.pendingMessages.shift(),i.type==="summarize"){A.info("SESSION","Summary yielded - ending generator",{sessionId:e});return}}}getPendingMessageStore(){return this.getPendingStore()}};lt();var Qu=class{sseClients=new Set;addClient(e){this.sseClients.add(e),A.debug("WORKER","Client connected",{total:this.sseClients.size}),e.on("close",()=>{this.removeClient(e)}),this.sendToClient(e,{type:"connected",timestamp:Date.now()})}removeClient(e){this.sseClients.delete(e),A.debug("WORKER","Client disconnected",{total:this.sseClients.size})}broadcast(e){if(this.sseClients.size===0){A.debug("WORKER","SSE broadcast skipped (no clients)",{eventType:e.type});return}let r={...e,timestamp:Date.now()},n=`data: ${JSON.stringify(r)} `;A.debug("WORKER","SSE broadcast sent",{eventType:e.type,clients:this.sseClients.size});for(let a of this.sseClients)a.write(n)}getClientCount(){return this.sseClients.size}sendToClient(e,r){let n=`data: ${JSON.stringify(r)} @@ -970,8 +970,8 @@ ${n.prompts.header_memory_continued}`}$r();pr();ia();var wm=require("path"),wT=r ...iss, path: iss.path ? [${ei(y)}, ...iss.path] : [${ei(y)}] })));`),f.write(`newResult[${ei(y)}] = ${v}.value`)}f.write("payload.value = newResult;"),f.write("return payload;");let h=f.compile();return(y,v)=>h(d,y,v)},a,s=Vo,i=!Mm.jitless,c=i&&XT.value,u=e.catchall,l;t._zod.parse=(d,f)=>{l??(l=r.value);let m=d.value;if(!s(m))return d.issues.push({expected:"object",code:"invalid_type",input:m,inst:t}),d;let g=[];if(i&&c&&f?.async===!1&&f.jitless!==!0)a||(a=n(e.shape)),d=a(d,f);else{d.value={};let v=l.shape;for(let b of l.keys){let w=v[b],x=w._zod.run({value:m[b],issues:[]},f),E=w._zod.optin==="optional"&&w._zod.optout==="optional";x instanceof Promise?g.push(x.then(T=>E?Z1(T,d,b,m):nl(T,d,b))):E?Z1(x,d,b,m):nl(x,d,b)}}if(!u)return g.length?Promise.all(g).then(()=>d):d;let _=[],p=l.keySet,h=u._zod,y=h.def.type;for(let v of Object.keys(m)){if(p.has(v))continue;if(y==="never"){_.push(v);continue}let b=h.run({value:m[v],issues:[]},f);b instanceof Promise?g.push(b.then(w=>nl(w,d,v))):nl(b,d,v)}return _.length&&d.issues.push({code:"unrecognized_keys",keys:_,input:m,inst:t}),g.length?Promise.all(g).then(()=>d):d}});function W1(t,e,r,n){for(let a of t)if(a.issues.length===0)return e.value=a.value,e;return e.issues.push({code:"invalid_union",input:e.value,inst:r,errors:t.map(a=>a.issues.map(s=>Ea(s,n,wa())))}),e}var mk=ae("$ZodUnion",(t,e)=>{ft.init(t,e),pt(t._zod,"optin",()=>e.options.some(r=>r._zod.optin==="optional")?"optional":void 0),pt(t._zod,"optout",()=>e.options.some(r=>r._zod.optout==="optional")?"optional":void 0),pt(t._zod,"values",()=>{if(e.options.every(r=>r._zod.values))return new Set(e.options.flatMap(r=>Array.from(r._zod.values)))}),pt(t._zod,"pattern",()=>{if(e.options.every(r=>r._zod.pattern)){let r=e.options.map(n=>n._zod.pattern);return new RegExp(`^(${r.map(n=>Ol(n.source)).join("|")})$`)}}),t._zod.parse=(r,n)=>{let a=!1,s=[];for(let i of e.options){let o=i._zod.run({value:r.value,issues:[]},n);if(o instanceof Promise)s.push(o),a=!0;else{if(o.issues.length===0)return o;s.push(o)}}return a?Promise.all(s).then(i=>W1(i,r,t,n)):W1(s,r,t,n)}}),Yz=ae("$ZodDiscriminatedUnion",(t,e)=>{mk.init(t,e);let r=t._zod.parse;pt(t._zod,"propValues",()=>{let a={};for(let s of e.options){let i=s._zod.propValues;if(!i||Object.keys(i).length===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(s)}"`);for(let[o,c]of Object.entries(i)){a[o]||(a[o]=new Set);for(let u of c)a[o].add(u)}}return a});let n=Pl(()=>{let a=e.options,s=new Map;for(let i of a){let o=i._zod.propValues[e.discriminator];if(!o||o.size===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(i)}"`);for(let c of o){if(s.has(c))throw new Error(`Duplicate discriminator value "${String(c)}"`);s.set(c,i)}}return s});t._zod.parse=(a,s)=>{let i=a.value;if(!Vo(i))return a.issues.push({code:"invalid_type",expected:"object",input:i,inst:t}),a;let o=n.value.get(i?.[e.discriminator]);return o?o._zod.run(a,s):e.unionFallback?r(a,s):(a.issues.push({code:"invalid_union",errors:[],note:"No matching discriminator",input:i,path:[e.discriminator],inst:t}),a)}}),Qz=ae("$ZodIntersection",(t,e)=>{ft.init(t,e),t._zod.parse=(r,n)=>{let a=r.value,s=e.left._zod.run({value:a,issues:[]},n),i=e.right._zod.run({value:a,issues:[]},n);return s instanceof Promise||i instanceof Promise?Promise.all([s,i]).then(([c,u])=>K1(r,c,u)):K1(r,s,i)}});function Lm(t,e){if(t===e)return{valid:!0,data:t};if(t instanceof Date&&e instanceof Date&&+t==+e)return{valid:!0,data:t};if(Go(t)&&Go(e)){let r=Object.keys(e),n=Object.keys(t).filter(s=>r.indexOf(s)!==-1),a={...t,...e};for(let s of n){let i=Lm(t[s],e[s]);if(!i.valid)return{valid:!1,mergeErrorPath:[s,...i.mergeErrorPath]};a[s]=i.data}return{valid:!0,data:a}}if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return{valid:!1,mergeErrorPath:[]};let r=[];for(let n=0;n{ft.init(t,e),t._zod.parse=(r,n)=>{let a=r.value;if(!Go(a))return r.issues.push({expected:"record",code:"invalid_type",input:a,inst:t}),r;let s=[];if(e.keyType._zod.values){let i=e.keyType._zod.values;r.value={};for(let c of i)if(typeof c=="string"||typeof c=="number"||typeof c=="symbol"){let u=e.valueType._zod.run({value:a[c],issues:[]},n);u instanceof Promise?s.push(u.then(l=>{l.issues.length&&r.issues.push(...Za(c,l.issues)),r.value[c]=l.value})):(u.issues.length&&r.issues.push(...Za(c,u.issues)),r.value[c]=u.value)}let o;for(let c in a)i.has(c)||(o=o??[],o.push(c));o&&o.length>0&&r.issues.push({code:"unrecognized_keys",input:a,inst:t,keys:o})}else{r.value={};for(let i of Reflect.ownKeys(a)){if(i==="__proto__")continue;let o=e.keyType._zod.run({value:i,issues:[]},n);if(o instanceof Promise)throw new Error("Async schemas not supported in object keys currently");if(o.issues.length){r.issues.push({origin:"record",code:"invalid_key",issues:o.issues.map(u=>Ea(u,n,wa())),input:i,path:[i],inst:t}),r.value[o.value]=o.value;continue}let c=e.valueType._zod.run({value:a[i],issues:[]},n);c instanceof Promise?s.push(c.then(u=>{u.issues.length&&r.issues.push(...Za(i,u.issues)),r.value[o.value]=u.value})):(c.issues.length&&r.issues.push(...Za(i,c.issues)),r.value[o.value]=c.value)}}return s.length?Promise.all(s).then(()=>r):r}}),t3=ae("$ZodEnum",(t,e)=>{ft.init(t,e);let r=ZT(e.entries);t._zod.values=new Set(r),t._zod.pattern=new RegExp(`^(${r.filter(n=>JT.has(typeof n)).map(n=>typeof n=="string"?bi(n):n.toString()).join("|")})$`),t._zod.parse=(n,a)=>{let s=n.value;return t._zod.values.has(s)||n.issues.push({code:"invalid_value",values:r,input:s,inst:t}),n}}),r3=ae("$ZodLiteral",(t,e)=>{ft.init(t,e),t._zod.values=new Set(e.values),t._zod.pattern=new RegExp(`^(${e.values.map(r=>typeof r=="string"?bi(r):r?r.toString():String(r)).join("|")})$`),t._zod.parse=(r,n)=>{let a=r.value;return t._zod.values.has(a)||r.issues.push({code:"invalid_value",values:e.values,input:a,inst:t}),r}}),a3=ae("$ZodTransform",(t,e)=>{ft.init(t,e),t._zod.parse=(r,n)=>{let a=e.transform(r.value,r);if(n.async)return(a instanceof Promise?a:Promise.resolve(a)).then(i=>(r.value=i,r));if(a instanceof Promise)throw new Hn;return r.value=a,r}}),n3=ae("$ZodOptional",(t,e)=>{ft.init(t,e),t._zod.optin="optional",t._zod.optout="optional",pt(t._zod,"values",()=>e.innerType._zod.values?new Set([...e.innerType._zod.values,void 0]):void 0),pt(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${Ol(r.source)})?$`):void 0}),t._zod.parse=(r,n)=>e.innerType._zod.optin==="optional"?e.innerType._zod.run(r,n):r.value===void 0?r:e.innerType._zod.run(r,n)}),s3=ae("$ZodNullable",(t,e)=>{ft.init(t,e),pt(t._zod,"optin",()=>e.innerType._zod.optin),pt(t._zod,"optout",()=>e.innerType._zod.optout),pt(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${Ol(r.source)}|null)$`):void 0}),pt(t._zod,"values",()=>e.innerType._zod.values?new Set([...e.innerType._zod.values,null]):void 0),t._zod.parse=(r,n)=>r.value===null?r:e.innerType._zod.run(r,n)}),i3=ae("$ZodDefault",(t,e)=>{ft.init(t,e),t._zod.optin="optional",pt(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{if(r.value===void 0)return r.value=e.defaultValue,r;let a=e.innerType._zod.run(r,n);return a instanceof Promise?a.then(s=>X1(s,e)):X1(a,e)}});function X1(t,e){return t.value===void 0&&(t.value=e.defaultValue),t}var o3=ae("$ZodPrefault",(t,e)=>{ft.init(t,e),t._zod.optin="optional",pt(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>(r.value===void 0&&(r.value=e.defaultValue),e.innerType._zod.run(r,n))}),c3=ae("$ZodNonOptional",(t,e)=>{ft.init(t,e),pt(t._zod,"values",()=>{let r=e.innerType._zod.values;return r?new Set([...r].filter(n=>n!==void 0)):void 0}),t._zod.parse=(r,n)=>{let a=e.innerType._zod.run(r,n);return a instanceof Promise?a.then(s=>J1(s,t)):J1(a,t)}});function J1(t,e){return!t.issues.length&&t.value===void 0&&t.issues.push({code:"invalid_type",expected:"nonoptional",input:t.value,inst:e}),t}var u3=ae("$ZodCatch",(t,e)=>{ft.init(t,e),t._zod.optin="optional",pt(t._zod,"optout",()=>e.innerType._zod.optout),pt(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{let a=e.innerType._zod.run(r,n);return a instanceof Promise?a.then(s=>(r.value=s.value,s.issues.length&&(r.value=e.catchValue({...r,error:{issues:s.issues.map(i=>Ea(i,n,wa()))},input:r.value}),r.issues=[]),r)):(r.value=a.value,a.issues.length&&(r.value=e.catchValue({...r,error:{issues:a.issues.map(s=>Ea(s,n,wa()))},input:r.value}),r.issues=[]),r)}}),l3=ae("$ZodPipe",(t,e)=>{ft.init(t,e),pt(t._zod,"values",()=>e.in._zod.values),pt(t._zod,"optin",()=>e.in._zod.optin),pt(t._zod,"optout",()=>e.out._zod.optout),t._zod.parse=(r,n)=>{let a=e.in._zod.run(r,n);return a instanceof Promise?a.then(s=>Y1(s,e,n)):Y1(a,e,n)}});function Y1(t,e,r){return ti(t)?t:e.out._zod.run({value:t.value,issues:t.issues},r)}var d3=ae("$ZodReadonly",(t,e)=>{ft.init(t,e),pt(t._zod,"propValues",()=>e.innerType._zod.propValues),pt(t._zod,"values",()=>e.innerType._zod.values),pt(t._zod,"optin",()=>e.innerType._zod.optin),pt(t._zod,"optout",()=>e.innerType._zod.optout),t._zod.parse=(r,n)=>{let a=e.innerType._zod.run(r,n);return a instanceof Promise?a.then(Q1):Q1(a)}});function Q1(t){return t.value=Object.freeze(t.value),t}var p3=ae("$ZodCustom",(t,e)=>{or.init(t,e),ft.init(t,e),t._zod.parse=(r,n)=>r,t._zod.check=r=>{let n=r.value,a=e.fn(n);if(a instanceof Promise)return a.then(s=>eT(s,r,n,t));eT(a,r,n,t)}});function eT(t,e,r,n){if(!t){let a={code:"custom",input:r,inst:n,path:[...n._zod.def.path??[]],continue:!n._zod.def.abort};n._zod.def.params&&(a.params=n._zod.def.params),e.issues.push(ek(a))}}var f3=t=>{let e=typeof t;switch(e){case"number":return Number.isNaN(t)?"NaN":"number";case"object":{if(Array.isArray(t))return"array";if(t===null)return"null";if(Object.getPrototypeOf(t)!==Object.prototype&&t.constructor)return t.constructor.name}}return e},m3=()=>{let t={string:{unit:"characters",verb:"to have"},file:{unit:"bytes",verb:"to have"},array:{unit:"items",verb:"to have"},set:{unit:"items",verb:"to have"}};function e(n){return t[n]??null}let r={regex:"input",email:"email address",url:"URL",emoji:"emoji",uuid:"UUID",uuidv4:"UUIDv4",uuidv6:"UUIDv6",nanoid:"nanoid",guid:"GUID",cuid:"cuid",cuid2:"cuid2",ulid:"ULID",xid:"XID",ksuid:"KSUID",datetime:"ISO datetime",date:"ISO date",time:"ISO time",duration:"ISO duration",ipv4:"IPv4 address",ipv6:"IPv6 address",cidrv4:"IPv4 range",cidrv6:"IPv6 range",base64:"base64-encoded string",base64url:"base64url-encoded string",json_string:"JSON string",e164:"E.164 number",jwt:"JWT",template_literal:"input"};return n=>{switch(n.code){case"invalid_type":return`Invalid input: expected ${n.expected}, received ${f3(n.input)}`;case"invalid_value":return n.values.length===1?`Invalid input: expected ${Qm(n.values[0])}`:`Invalid option: expected one of ${jm(n.values,"|")}`;case"too_big":{let a=n.inclusive?"<=":"<",s=e(n.origin);return s?`Too big: expected ${n.origin??"value"} to have ${a}${n.maximum.toString()} ${s.unit??"elements"}`:`Too big: expected ${n.origin??"value"} to be ${a}${n.maximum.toString()}`}case"too_small":{let a=n.inclusive?">=":">",s=e(n.origin);return s?`Too small: expected ${n.origin} to have ${a}${n.minimum.toString()} ${s.unit}`:`Too small: expected ${n.origin} to be ${a}${n.minimum.toString()}`}case"invalid_format":{let a=n;return a.format==="starts_with"?`Invalid string: must start with "${a.prefix}"`:a.format==="ends_with"?`Invalid string: must end with "${a.suffix}"`:a.format==="includes"?`Invalid string: must include "${a.includes}"`:a.format==="regex"?`Invalid string: must match pattern ${a.pattern}`:`Invalid ${r[a.format]??n.format}`}case"not_multiple_of":return`Invalid number: must be a multiple of ${n.divisor}`;case"unrecognized_keys":return`Unrecognized key${n.keys.length>1?"s":""}: ${jm(n.keys,", ")}`;case"invalid_key":return`Invalid key in ${n.origin}`;case"invalid_union":return"Invalid input";case"invalid_element":return`Invalid value in ${n.origin}`;default:return"Invalid input"}}};function h3(){return{localeError:m3()}}var $J=Symbol("ZodOutput"),OJ=Symbol("ZodInput"),Fm=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...r){let n=r[0];if(this._map.set(e,n),n&&typeof n=="object"&&"id"in n){if(this._idmap.has(n.id))throw new Error(`ID ${n.id} already exists in the registry`);this._idmap.set(n.id,e)}return this}remove(e){return this._map.delete(e),this}get(e){let r=e._zod.parent;if(r){let n={...this.get(r)??{}};return delete n.id,{...n,...this._map.get(e)}}return this._map.get(e)}has(e){return this._map.has(e)}};function v3(){return new Fm}var sl=v3();function g3(t,e){return new t({type:"string",...Pe(e)})}function y3(t,e){return new t({type:"string",format:"email",check:"string_format",abort:!1,...Pe(e)})}function tT(t,e){return new t({type:"string",format:"guid",check:"string_format",abort:!1,...Pe(e)})}function _3(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,...Pe(e)})}function b3(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v4",...Pe(e)})}function x3(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v6",...Pe(e)})}function S3(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v7",...Pe(e)})}function w3(t,e){return new t({type:"string",format:"url",check:"string_format",abort:!1,...Pe(e)})}function E3(t,e){return new t({type:"string",format:"emoji",check:"string_format",abort:!1,...Pe(e)})}function T3(t,e){return new t({type:"string",format:"nanoid",check:"string_format",abort:!1,...Pe(e)})}function k3(t,e){return new t({type:"string",format:"cuid",check:"string_format",abort:!1,...Pe(e)})}function R3(t,e){return new t({type:"string",format:"cuid2",check:"string_format",abort:!1,...Pe(e)})}function P3(t,e){return new t({type:"string",format:"ulid",check:"string_format",abort:!1,...Pe(e)})}function $3(t,e){return new t({type:"string",format:"xid",check:"string_format",abort:!1,...Pe(e)})}function O3(t,e){return new t({type:"string",format:"ksuid",check:"string_format",abort:!1,...Pe(e)})}function C3(t,e){return new t({type:"string",format:"ipv4",check:"string_format",abort:!1,...Pe(e)})}function I3(t,e){return new t({type:"string",format:"ipv6",check:"string_format",abort:!1,...Pe(e)})}function A3(t,e){return new t({type:"string",format:"cidrv4",check:"string_format",abort:!1,...Pe(e)})}function N3(t,e){return new t({type:"string",format:"cidrv6",check:"string_format",abort:!1,...Pe(e)})}function M3(t,e){return new t({type:"string",format:"base64",check:"string_format",abort:!1,...Pe(e)})}function j3(t,e){return new t({type:"string",format:"base64url",check:"string_format",abort:!1,...Pe(e)})}function D3(t,e){return new t({type:"string",format:"e164",check:"string_format",abort:!1,...Pe(e)})}function q3(t,e){return new t({type:"string",format:"jwt",check:"string_format",abort:!1,...Pe(e)})}function L3(t,e){return new t({type:"string",format:"datetime",check:"string_format",offset:!1,local:!1,precision:null,...Pe(e)})}function F3(t,e){return new t({type:"string",format:"date",check:"string_format",...Pe(e)})}function U3(t,e){return new t({type:"string",format:"time",check:"string_format",precision:null,...Pe(e)})}function z3(t,e){return new t({type:"string",format:"duration",check:"string_format",...Pe(e)})}function H3(t,e){return new t({type:"number",checks:[],...Pe(e)})}function B3(t,e){return new t({type:"number",check:"number_format",abort:!1,format:"safeint",...Pe(e)})}function V3(t,e){return new t({type:"boolean",...Pe(e)})}function G3(t,e){return new t({type:"null",...Pe(e)})}function Z3(t){return new t({type:"unknown"})}function W3(t,e){return new t({type:"never",...Pe(e)})}function rT(t,e){return new lk({check:"less_than",...Pe(e),value:t,inclusive:!1})}function bm(t,e){return new lk({check:"less_than",...Pe(e),value:t,inclusive:!0})}function aT(t,e){return new dk({check:"greater_than",...Pe(e),value:t,inclusive:!1})}function xm(t,e){return new dk({check:"greater_than",...Pe(e),value:t,inclusive:!0})}function nT(t,e){return new oz({check:"multiple_of",...Pe(e),value:t})}function hk(t,e){return new uz({check:"max_length",...Pe(e),maximum:t})}function hl(t,e){return new lz({check:"min_length",...Pe(e),minimum:t})}function vk(t,e){return new dz({check:"length_equals",...Pe(e),length:t})}function K3(t,e){return new pz({check:"string_format",format:"regex",...Pe(e),pattern:t})}function X3(t){return new fz({check:"string_format",format:"lowercase",...Pe(t)})}function J3(t){return new mz({check:"string_format",format:"uppercase",...Pe(t)})}function Y3(t,e){return new hz({check:"string_format",format:"includes",...Pe(e),includes:t})}function Q3(t,e){return new vz({check:"string_format",format:"starts_with",...Pe(e),prefix:t})}function eH(t,e){return new gz({check:"string_format",format:"ends_with",...Pe(e),suffix:t})}function Wo(t){return new yz({check:"overwrite",tx:t})}function tH(t){return Wo(e=>e.normalize(t))}function rH(){return Wo(t=>t.trim())}function aH(){return Wo(t=>t.toLowerCase())}function nH(){return Wo(t=>t.toUpperCase())}function sH(t,e,r){return new t({type:"array",element:e,...Pe(r)})}function iH(t,e,r){let n=Pe(r);return n.abort??(n.abort=!0),new t({type:"custom",check:"custom",fn:e,...n})}function oH(t,e,r){return new t({type:"custom",check:"custom",fn:e,...Pe(r)})}var gk={};dT(gk,{time:()=>wk,duration:()=>Tk,datetime:()=>_k,date:()=>xk,ZodISOTime:()=>Sk,ZodISODuration:()=>Ek,ZodISODateTime:()=>yk,ZodISODate:()=>bk});var yk=ae("ZodISODateTime",(t,e)=>{Cz.init(t,e),St.init(t,e)});function _k(t){return L3(yk,t)}var bk=ae("ZodISODate",(t,e)=>{Iz.init(t,e),St.init(t,e)});function xk(t){return F3(bk,t)}var Sk=ae("ZodISOTime",(t,e)=>{Az.init(t,e),St.init(t,e)});function wk(t){return U3(Sk,t)}var Ek=ae("ZodISODuration",(t,e)=>{Nz.init(t,e),St.init(t,e)});function Tk(t){return z3(Ek,t)}var kk=(t,e)=>{rk.init(t,e),t.name="ZodError",Object.defineProperties(t,{format:{value:r=>PU(t,r)},flatten:{value:r=>RU(t,r)},addIssue:{value:r=>t.issues.push(r)},addIssues:{value:r=>t.issues.push(...r)},isEmpty:{get(){return t.issues.length===0}}})},CJ=ae("ZodError",kk),Al=ae("ZodError",kk,{Parent:Error}),cH=$U(Al),uH=OU(Al),lH=nk(Al),dH=sk(Al),xt=ae("ZodType",(t,e)=>(ft.init(t,e),t.def=e,Object.defineProperty(t,"_def",{value:e}),t.check=(...r)=>t.clone({...e,checks:[...e.checks??[],...r.map(n=>typeof n=="function"?{_zod:{check:n,def:{check:"custom"},onattach:[]}}:n)]}),t.clone=(r,n)=>Ya(t,r,n),t.brand=()=>t,t.register=(r,n)=>(r.add(t,n),t),t.parse=(r,n)=>cH(t,r,n,{callee:t.parse}),t.safeParse=(r,n)=>lH(t,r,n),t.parseAsync=async(r,n)=>uH(t,r,n,{callee:t.parseAsync}),t.safeParseAsync=async(r,n)=>dH(t,r,n),t.spa=t.safeParseAsync,t.refine=(r,n)=>t.check(tB(r,n)),t.superRefine=r=>t.check(rB(r)),t.overwrite=r=>t.check(Wo(r)),t.optional=()=>Se(t),t.nullable=()=>oT(t),t.nullish=()=>Se(oT(t)),t.nonoptional=r=>ZH(t,r),t.array=()=>Ge(t),t.or=r=>gt([t,r]),t.and=r=>th(t,r),t.transform=r=>zm(t,Ak(r)),t.default=r=>BH(t,r),t.prefault=r=>GH(t,r),t.catch=r=>KH(t,r),t.pipe=r=>zm(t,r),t.readonly=()=>YH(t),t.describe=r=>{let n=t.clone();return sl.add(n,{description:r}),n},Object.defineProperty(t,"description",{get(){return sl.get(t)?.description},configurable:!0}),t.meta=(...r)=>{if(r.length===0)return sl.get(t);let n=t.clone();return sl.add(n,r[0]),n},t.isOptional=()=>t.safeParse(void 0).success,t.isNullable=()=>t.safeParse(null).success,t)),Rk=ae("_ZodString",(t,e)=>{eh.init(t,e),xt.init(t,e);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(K3(...n)),t.includes=(...n)=>t.check(Y3(...n)),t.startsWith=(...n)=>t.check(Q3(...n)),t.endsWith=(...n)=>t.check(eH(...n)),t.min=(...n)=>t.check(hl(...n)),t.max=(...n)=>t.check(hk(...n)),t.length=(...n)=>t.check(vk(...n)),t.nonempty=(...n)=>t.check(hl(1,...n)),t.lowercase=n=>t.check(X3(n)),t.uppercase=n=>t.check(J3(n)),t.trim=()=>t.check(rH()),t.normalize=(...n)=>t.check(tH(...n)),t.toLowerCase=()=>t.check(aH()),t.toUpperCase=()=>t.check(nH())}),pH=ae("ZodString",(t,e)=>{eh.init(t,e),Rk.init(t,e),t.email=r=>t.check(y3(fH,r)),t.url=r=>t.check(w3(mH,r)),t.jwt=r=>t.check(q3($H,r)),t.emoji=r=>t.check(E3(hH,r)),t.guid=r=>t.check(tT(sT,r)),t.uuid=r=>t.check(_3(il,r)),t.uuidv4=r=>t.check(b3(il,r)),t.uuidv6=r=>t.check(x3(il,r)),t.uuidv7=r=>t.check(S3(il,r)),t.nanoid=r=>t.check(T3(vH,r)),t.guid=r=>t.check(tT(sT,r)),t.cuid=r=>t.check(k3(gH,r)),t.cuid2=r=>t.check(R3(yH,r)),t.ulid=r=>t.check(P3(_H,r)),t.base64=r=>t.check(M3(kH,r)),t.base64url=r=>t.check(j3(RH,r)),t.xid=r=>t.check($3(bH,r)),t.ksuid=r=>t.check(O3(xH,r)),t.ipv4=r=>t.check(C3(SH,r)),t.ipv6=r=>t.check(I3(wH,r)),t.cidrv4=r=>t.check(A3(EH,r)),t.cidrv6=r=>t.check(N3(TH,r)),t.e164=r=>t.check(D3(PH,r)),t.datetime=r=>t.check(_k(r)),t.date=r=>t.check(xk(r)),t.time=r=>t.check(wk(r)),t.duration=r=>t.check(Tk(r))});function te(t){return g3(pH,t)}var St=ae("ZodStringFormat",(t,e)=>{vt.init(t,e),Rk.init(t,e)}),fH=ae("ZodEmail",(t,e)=>{Sz.init(t,e),St.init(t,e)}),sT=ae("ZodGUID",(t,e)=>{bz.init(t,e),St.init(t,e)}),il=ae("ZodUUID",(t,e)=>{xz.init(t,e),St.init(t,e)}),mH=ae("ZodURL",(t,e)=>{wz.init(t,e),St.init(t,e)}),hH=ae("ZodEmoji",(t,e)=>{Ez.init(t,e),St.init(t,e)}),vH=ae("ZodNanoID",(t,e)=>{Tz.init(t,e),St.init(t,e)}),gH=ae("ZodCUID",(t,e)=>{kz.init(t,e),St.init(t,e)}),yH=ae("ZodCUID2",(t,e)=>{Rz.init(t,e),St.init(t,e)}),_H=ae("ZodULID",(t,e)=>{Pz.init(t,e),St.init(t,e)}),bH=ae("ZodXID",(t,e)=>{$z.init(t,e),St.init(t,e)}),xH=ae("ZodKSUID",(t,e)=>{Oz.init(t,e),St.init(t,e)}),SH=ae("ZodIPv4",(t,e)=>{Mz.init(t,e),St.init(t,e)}),wH=ae("ZodIPv6",(t,e)=>{jz.init(t,e),St.init(t,e)}),EH=ae("ZodCIDRv4",(t,e)=>{Dz.init(t,e),St.init(t,e)}),TH=ae("ZodCIDRv6",(t,e)=>{qz.init(t,e),St.init(t,e)}),kH=ae("ZodBase64",(t,e)=>{Lz.init(t,e),St.init(t,e)}),RH=ae("ZodBase64URL",(t,e)=>{Uz.init(t,e),St.init(t,e)}),PH=ae("ZodE164",(t,e)=>{zz.init(t,e),St.init(t,e)}),$H=ae("ZodJWT",(t,e)=>{Bz.init(t,e),St.init(t,e)}),Pk=ae("ZodNumber",(t,e)=>{fk.init(t,e),xt.init(t,e),t.gt=(n,a)=>t.check(aT(n,a)),t.gte=(n,a)=>t.check(xm(n,a)),t.min=(n,a)=>t.check(xm(n,a)),t.lt=(n,a)=>t.check(rT(n,a)),t.lte=(n,a)=>t.check(bm(n,a)),t.max=(n,a)=>t.check(bm(n,a)),t.int=n=>t.check(iT(n)),t.safe=n=>t.check(iT(n)),t.positive=n=>t.check(aT(0,n)),t.nonnegative=n=>t.check(xm(0,n)),t.negative=n=>t.check(rT(0,n)),t.nonpositive=n=>t.check(bm(0,n)),t.multipleOf=(n,a)=>t.check(nT(n,a)),t.step=(n,a)=>t.check(nT(n,a)),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 ut(t){return H3(Pk,t)}var OH=ae("ZodNumberFormat",(t,e)=>{Vz.init(t,e),Pk.init(t,e)});function iT(t){return B3(OH,t)}var CH=ae("ZodBoolean",(t,e)=>{Gz.init(t,e),xt.init(t,e)});function Ht(t){return V3(CH,t)}var IH=ae("ZodNull",(t,e)=>{Zz.init(t,e),xt.init(t,e)});function $k(t){return G3(IH,t)}var AH=ae("ZodUnknown",(t,e)=>{Wz.init(t,e),xt.init(t,e)});function Nt(){return Z3(AH)}var NH=ae("ZodNever",(t,e)=>{Kz.init(t,e),xt.init(t,e)});function MH(t){return W3(NH,t)}var jH=ae("ZodArray",(t,e)=>{Xz.init(t,e),xt.init(t,e),t.element=e.element,t.min=(r,n)=>t.check(hl(r,n)),t.nonempty=r=>t.check(hl(1,r)),t.max=(r,n)=>t.check(hk(r,n)),t.length=(r,n)=>t.check(vk(r,n)),t.unwrap=()=>t.element});function Ge(t,e){return sH(jH,t,e)}var Ok=ae("ZodObject",(t,e)=>{Jz.init(t,e),xt.init(t,e),dt.defineLazy(t,"shape",()=>e.shape),t.keyof=()=>Bt(Object.keys(t._zod.def.shape)),t.catchall=r=>t.clone({...t._zod.def,catchall:r}),t.passthrough=()=>t.clone({...t._zod.def,catchall:Nt()}),t.loose=()=>t.clone({...t._zod.def,catchall:Nt()}),t.strict=()=>t.clone({...t._zod.def,catchall:MH()}),t.strip=()=>t.clone({...t._zod.def,catchall:void 0}),t.extend=r=>dt.extend(t,r),t.merge=r=>dt.merge(t,r),t.pick=r=>dt.pick(t,r),t.omit=r=>dt.omit(t,r),t.partial=(...r)=>dt.partial(Nk,t,r[0]),t.required=(...r)=>dt.required(Mk,t,r[0])});function le(t,e){let r={type:"object",get shape(){return dt.assignProp(this,"shape",{...t}),this.shape},...dt.normalizeParams(e)};return new Ok(r)}function Hr(t,e){return new Ok({type:"object",get shape(){return dt.assignProp(this,"shape",{...t}),this.shape},catchall:Nt(),...dt.normalizeParams(e)})}var Ck=ae("ZodUnion",(t,e)=>{mk.init(t,e),xt.init(t,e),t.options=e.options});function gt(t,e){return new Ck({type:"union",options:t,...dt.normalizeParams(e)})}var DH=ae("ZodDiscriminatedUnion",(t,e)=>{Ck.init(t,e),Yz.init(t,e)});function Ik(t,e,r){return new DH({type:"union",options:e,discriminator:t,...dt.normalizeParams(r)})}var qH=ae("ZodIntersection",(t,e)=>{Qz.init(t,e),xt.init(t,e)});function th(t,e){return new qH({type:"intersection",left:t,right:e})}var LH=ae("ZodRecord",(t,e)=>{e3.init(t,e),xt.init(t,e),t.keyType=e.keyType,t.valueType=e.valueType});function Mt(t,e,r){return new LH({type:"record",keyType:t,valueType:e,...dt.normalizeParams(r)})}var Um=ae("ZodEnum",(t,e)=>{t3.init(t,e),xt.init(t,e),t.enum=e.entries,t.options=Object.values(e.entries);let r=new Set(Object.keys(e.entries));t.extract=(n,a)=>{let s={};for(let i of n)if(r.has(i))s[i]=e.entries[i];else throw new Error(`Key ${i} not found in enum`);return new Um({...e,checks:[],...dt.normalizeParams(a),entries:s})},t.exclude=(n,a)=>{let s={...e.entries};for(let i of n)if(r.has(i))delete s[i];else throw new Error(`Key ${i} not found in enum`);return new Um({...e,checks:[],...dt.normalizeParams(a),entries:s})}});function Bt(t,e){let r=Array.isArray(t)?Object.fromEntries(t.map(n=>[n,n])):t;return new Um({type:"enum",entries:r,...dt.normalizeParams(e)})}var FH=ae("ZodLiteral",(t,e)=>{r3.init(t,e),xt.init(t,e),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 we(t,e){return new FH({type:"literal",values:Array.isArray(t)?t:[t],...dt.normalizeParams(e)})}var UH=ae("ZodTransform",(t,e)=>{a3.init(t,e),xt.init(t,e),t._zod.parse=(r,n)=>{r.addIssue=s=>{if(typeof s=="string")r.issues.push(dt.issue(s,r.value,e));else{let i=s;i.fatal&&(i.continue=!1),i.code??(i.code="custom"),i.input??(i.input=r.value),i.inst??(i.inst=t),i.continue??(i.continue=!0),r.issues.push(dt.issue(i))}};let a=e.transform(r.value,r);return a instanceof Promise?a.then(s=>(r.value=s,r)):(r.value=a,r)}});function Ak(t){return new UH({type:"transform",transform:t})}var Nk=ae("ZodOptional",(t,e)=>{n3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType});function Se(t){return new Nk({type:"optional",innerType:t})}var zH=ae("ZodNullable",(t,e)=>{s3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType});function oT(t){return new zH({type:"nullable",innerType:t})}var HH=ae("ZodDefault",(t,e)=>{i3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeDefault=t.unwrap});function BH(t,e){return new HH({type:"default",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var VH=ae("ZodPrefault",(t,e)=>{o3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType});function GH(t,e){return new VH({type:"prefault",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var Mk=ae("ZodNonOptional",(t,e)=>{c3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType});function ZH(t,e){return new Mk({type:"nonoptional",innerType:t,...dt.normalizeParams(e)})}var WH=ae("ZodCatch",(t,e)=>{u3.init(t,e),xt.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeCatch=t.unwrap});function KH(t,e){return new WH({type:"catch",innerType:t,catchValue:typeof e=="function"?e:()=>e})}var XH=ae("ZodPipe",(t,e)=>{l3.init(t,e),xt.init(t,e),t.in=e.in,t.out=e.out});function zm(t,e){return new XH({type:"pipe",in:t,out:e})}var JH=ae("ZodReadonly",(t,e)=>{d3.init(t,e),xt.init(t,e)});function YH(t){return new JH({type:"readonly",innerType:t})}var jk=ae("ZodCustom",(t,e)=>{p3.init(t,e),xt.init(t,e)});function QH(t,e){let r=new or({check:"custom",...dt.normalizeParams(e)});return r._zod.check=t,r}function eB(t,e){return iH(jk,t??(()=>!0),e)}function tB(t,e={}){return oH(jk,t,e)}function rB(t,e){let r=QH(n=>(n.addIssue=a=>{if(typeof a=="string")n.issues.push(dt.issue(a,n.value,r._zod.def));else{let s=a;s.fatal&&(s.continue=!1),s.code??(s.code="custom"),s.input??(s.input=n.value),s.inst??(s.inst=r),s.continue??(s.continue=!r._zod.def.abort),n.issues.push(dt.issue(s))}},t(n.value,n)),e);return r}function Dk(t,e){return zm(Ak(t),e)}wa(h3());var rh="io.modelcontextprotocol/related-task",Nl="2.0",ca=eB(t=>t!==null&&(typeof t=="object"||typeof t=="function")),qk=gt([te(),ut().int()]),Lk=te(),aB=Hr({ttl:gt([ut(),$k()]).optional(),pollInterval:ut().optional()}),ah=Hr({taskId:te()}),nB=Hr({progressToken:qk.optional(),[rh]:ah.optional()}),cr=Hr({task:aB.optional(),_meta:nB.optional()}),Ft=le({method:te(),params:cr.optional()}),Bn=Hr({_meta:le({[rh]:Se(ah)}).passthrough().optional()}),Ar=le({method:te(),params:Bn.optional()}),Vt=Hr({_meta:Hr({[rh]:ah.optional()}).optional()}),Ml=gt([te(),ut().int()]),sB=le({jsonrpc:we(Nl),id:Ml,...Ft.shape}).strict();var iB=le({jsonrpc:we(Nl),...Ar.shape}).strict();var oB=le({jsonrpc:we(Nl),id:Ml,result:Vt}).strict();var cT;(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"})(cT||(cT={}));var cB=le({jsonrpc:we(Nl),id:Ml,error:le({code:ut().int(),message:te(),data:Se(Nt())})}).strict();var IJ=gt([sB,iB,oB,cB]),Fk=Vt.strict(),uB=Bn.extend({requestId:Ml,reason:te().optional()}),Uk=Ar.extend({method:we("notifications/cancelled"),params:uB}),lB=le({src:te(),mimeType:te().optional(),sizes:Ge(te()).optional()}),Ko=le({icons:Ge(lB).optional()}),hi=le({name:te(),title:te().optional()}),zk=hi.extend({...hi.shape,...Ko.shape,version:te(),websiteUrl:te().optional()}),dB=th(le({applyDefaults:Ht().optional()}),Mt(te(),Nt())),pB=Dk(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0?{form:{}}:t,th(le({form:dB.optional(),url:ca.optional()}),Mt(te(),Nt()).optional())),fB=le({list:Se(le({}).passthrough()),cancel:Se(le({}).passthrough()),requests:Se(le({sampling:Se(le({createMessage:Se(le({}).passthrough())}).passthrough()),elicitation:Se(le({create:Se(le({}).passthrough())}).passthrough())}).passthrough())}).passthrough(),mB=le({list:Se(le({}).passthrough()),cancel:Se(le({}).passthrough()),requests:Se(le({tools:Se(le({call:Se(le({}).passthrough())}).passthrough())}).passthrough())}).passthrough(),hB=le({experimental:Mt(te(),ca).optional(),sampling:le({context:ca.optional(),tools:ca.optional()}).optional(),elicitation:pB.optional(),roots:le({listChanged:Ht().optional()}).optional(),tasks:Se(fB)}),vB=cr.extend({protocolVersion:te(),capabilities:hB,clientInfo:zk}),gB=Ft.extend({method:we("initialize"),params:vB}),yB=le({experimental:Mt(te(),ca).optional(),logging:ca.optional(),completions:ca.optional(),prompts:Se(le({listChanged:Se(Ht())})),resources:le({subscribe:Ht().optional(),listChanged:Ht().optional()}).optional(),tools:le({listChanged:Ht().optional()}).optional(),tasks:Se(mB)}).passthrough(),_B=Vt.extend({protocolVersion:te(),capabilities:yB,serverInfo:zk,instructions:te().optional()}),bB=Ar.extend({method:we("notifications/initialized")}),Hk=Ft.extend({method:we("ping")}),xB=le({progress:ut(),total:Se(ut()),message:Se(te())}),SB=le({...Bn.shape,...xB.shape,progressToken:qk}),Bk=Ar.extend({method:we("notifications/progress"),params:SB}),wB=cr.extend({cursor:Lk.optional()}),Xo=Ft.extend({params:wB.optional()}),Jo=Vt.extend({nextCursor:Se(Lk)}),Yo=le({taskId:te(),status:Bt(["working","input_required","completed","failed","cancelled"]),ttl:gt([ut(),$k()]),createdAt:te(),lastUpdatedAt:te(),pollInterval:Se(ut()),statusMessage:Se(te())}),Vk=Vt.extend({task:Yo}),EB=Bn.merge(Yo),Gk=Ar.extend({method:we("notifications/tasks/status"),params:EB}),Zk=Ft.extend({method:we("tasks/get"),params:cr.extend({taskId:te()})}),Wk=Vt.merge(Yo),Kk=Ft.extend({method:we("tasks/result"),params:cr.extend({taskId:te()})}),Xk=Xo.extend({method:we("tasks/list")}),Jk=Jo.extend({tasks:Ge(Yo)}),AJ=Ft.extend({method:we("tasks/cancel"),params:cr.extend({taskId:te()})}),NJ=Vt.merge(Yo),Yk=le({uri:te(),mimeType:Se(te()),_meta:Mt(te(),Nt()).optional()}),Qk=Yk.extend({text:te()}),nh=te().refine(t=>{try{return atob(t),!0}catch{return!1}},{message:"Invalid Base64 string"}),eR=Yk.extend({blob:nh}),xi=le({audience:Ge(Bt(["user","assistant"])).optional(),priority:ut().min(0).max(1).optional(),lastModified:gk.datetime({offset:!0}).optional()}),tR=le({...hi.shape,...Ko.shape,uri:te(),description:Se(te()),mimeType:Se(te()),annotations:xi.optional(),_meta:Se(Hr({}))}),TB=le({...hi.shape,...Ko.shape,uriTemplate:te(),description:Se(te()),mimeType:Se(te()),annotations:xi.optional(),_meta:Se(Hr({}))}),kB=Xo.extend({method:we("resources/list")}),RB=Jo.extend({resources:Ge(tR)}),PB=Xo.extend({method:we("resources/templates/list")}),$B=Jo.extend({resourceTemplates:Ge(TB)}),sh=cr.extend({uri:te()}),OB=sh,CB=Ft.extend({method:we("resources/read"),params:OB}),IB=Vt.extend({contents:Ge(gt([Qk,eR]))}),AB=Ar.extend({method:we("notifications/resources/list_changed")}),NB=sh,MB=Ft.extend({method:we("resources/subscribe"),params:NB}),jB=sh,DB=Ft.extend({method:we("resources/unsubscribe"),params:jB}),qB=Bn.extend({uri:te()}),LB=Ar.extend({method:we("notifications/resources/updated"),params:qB}),FB=le({name:te(),description:Se(te()),required:Se(Ht())}),UB=le({...hi.shape,...Ko.shape,description:Se(te()),arguments:Se(Ge(FB)),_meta:Se(Hr({}))}),zB=Xo.extend({method:we("prompts/list")}),HB=Jo.extend({prompts:Ge(UB)}),BB=cr.extend({name:te(),arguments:Mt(te(),te()).optional()}),VB=Ft.extend({method:we("prompts/get"),params:BB}),ih=le({type:we("text"),text:te(),annotations:xi.optional(),_meta:Mt(te(),Nt()).optional()}),oh=le({type:we("image"),data:nh,mimeType:te(),annotations:xi.optional(),_meta:Mt(te(),Nt()).optional()}),ch=le({type:we("audio"),data:nh,mimeType:te(),annotations:xi.optional(),_meta:Mt(te(),Nt()).optional()}),GB=le({type:we("tool_use"),name:te(),id:te(),input:le({}).passthrough(),_meta:Se(le({}).passthrough())}).passthrough(),ZB=le({type:we("resource"),resource:gt([Qk,eR]),annotations:xi.optional(),_meta:Mt(te(),Nt()).optional()}),WB=tR.extend({type:we("resource_link")}),uh=gt([ih,oh,ch,WB,ZB]),KB=le({role:Bt(["user","assistant"]),content:uh}),XB=Vt.extend({description:Se(te()),messages:Ge(KB)}),JB=Ar.extend({method:we("notifications/prompts/list_changed")}),YB=le({title:te().optional(),readOnlyHint:Ht().optional(),destructiveHint:Ht().optional(),idempotentHint:Ht().optional(),openWorldHint:Ht().optional()}),QB=le({taskSupport:Bt(["required","optional","forbidden"]).optional()}),rR=le({...hi.shape,...Ko.shape,description:te().optional(),inputSchema:le({type:we("object"),properties:Mt(te(),ca).optional(),required:Ge(te()).optional()}).catchall(Nt()),outputSchema:le({type:we("object"),properties:Mt(te(),ca).optional(),required:Ge(te()).optional()}).catchall(Nt()).optional(),annotations:Se(YB),execution:Se(QB),_meta:Mt(te(),Nt()).optional()}),e7=Xo.extend({method:we("tools/list")}),t7=Jo.extend({tools:Ge(rR)}),aR=Vt.extend({content:Ge(uh).default([]),structuredContent:Mt(te(),Nt()).optional(),isError:Se(Ht())}),MJ=aR.or(Vt.extend({toolResult:Nt()})),r7=cr.extend({name:te(),arguments:Se(Mt(te(),Nt()))}),a7=Ft.extend({method:we("tools/call"),params:r7}),n7=Ar.extend({method:we("notifications/tools/list_changed")}),nR=Bt(["debug","info","notice","warning","error","critical","alert","emergency"]),s7=cr.extend({level:nR}),i7=Ft.extend({method:we("logging/setLevel"),params:s7}),o7=Bn.extend({level:nR,logger:te().optional(),data:Nt()}),c7=Ar.extend({method:we("notifications/message"),params:o7}),u7=le({name:te().optional()}),l7=le({hints:Se(Ge(u7)),costPriority:Se(ut().min(0).max(1)),speedPriority:Se(ut().min(0).max(1)),intelligencePriority:Se(ut().min(0).max(1))}),d7=le({mode:Se(Bt(["auto","required","none"]))}),p7=le({type:we("tool_result"),toolUseId:te().describe("The unique identifier for the corresponding tool call."),content:Ge(uh).default([]),structuredContent:le({}).passthrough().optional(),isError:Se(Ht()),_meta:Se(le({}).passthrough())}).passthrough(),f7=Ik("type",[ih,oh,ch]),vl=Ik("type",[ih,oh,ch,GB,p7]),m7=le({role:Bt(["user","assistant"]),content:gt([vl,Ge(vl)]),_meta:Se(le({}).passthrough())}).passthrough(),h7=cr.extend({messages:Ge(m7),modelPreferences:l7.optional(),systemPrompt:te().optional(),includeContext:Bt(["none","thisServer","allServers"]).optional(),temperature:ut().optional(),maxTokens:ut().int(),stopSequences:Ge(te()).optional(),metadata:ca.optional(),tools:Se(Ge(rR)),toolChoice:Se(d7)}),v7=Ft.extend({method:we("sampling/createMessage"),params:h7}),g7=Vt.extend({model:te(),stopReason:Se(Bt(["endTurn","stopSequence","maxTokens"]).or(te())),role:Bt(["user","assistant"]),content:f7}),y7=Vt.extend({model:te(),stopReason:Se(Bt(["endTurn","stopSequence","maxTokens","toolUse"]).or(te())),role:Bt(["user","assistant"]),content:gt([vl,Ge(vl)])}),_7=le({type:we("boolean"),title:te().optional(),description:te().optional(),default:Ht().optional()}),b7=le({type:we("string"),title:te().optional(),description:te().optional(),minLength:ut().optional(),maxLength:ut().optional(),format:Bt(["email","uri","date","date-time"]).optional(),default:te().optional()}),x7=le({type:Bt(["number","integer"]),title:te().optional(),description:te().optional(),minimum:ut().optional(),maximum:ut().optional(),default:ut().optional()}),S7=le({type:we("string"),title:te().optional(),description:te().optional(),enum:Ge(te()),default:te().optional()}),w7=le({type:we("string"),title:te().optional(),description:te().optional(),oneOf:Ge(le({const:te(),title:te()})),default:te().optional()}),E7=le({type:we("string"),title:te().optional(),description:te().optional(),enum:Ge(te()),enumNames:Ge(te()).optional(),default:te().optional()}),T7=gt([S7,w7]),k7=le({type:we("array"),title:te().optional(),description:te().optional(),minItems:ut().optional(),maxItems:ut().optional(),items:le({type:we("string"),enum:Ge(te())}),default:Ge(te()).optional()}),R7=le({type:we("array"),title:te().optional(),description:te().optional(),minItems:ut().optional(),maxItems:ut().optional(),items:le({anyOf:Ge(le({const:te(),title:te()}))}),default:Ge(te()).optional()}),P7=gt([k7,R7]),$7=gt([E7,T7,P7]),O7=gt([$7,_7,b7,x7]),C7=cr.extend({mode:we("form").optional(),message:te(),requestedSchema:le({type:we("object"),properties:Mt(te(),O7),required:Ge(te()).optional()})}),I7=cr.extend({mode:we("url"),message:te(),elicitationId:te(),url:te().url()}),A7=gt([C7,I7]),N7=Ft.extend({method:we("elicitation/create"),params:A7}),M7=Bn.extend({elicitationId:te()}),j7=Ar.extend({method:we("notifications/elicitation/complete"),params:M7}),D7=Vt.extend({action:Bt(["accept","decline","cancel"]),content:Dk(t=>t===null?void 0:t,Mt(te(),gt([te(),ut(),Ht(),Ge(te())])).optional())}),q7=le({type:we("ref/resource"),uri:te()}),L7=le({type:we("ref/prompt"),name:te()}),F7=cr.extend({ref:gt([L7,q7]),argument:le({name:te(),value:te()}),context:le({arguments:Mt(te(),te()).optional()}).optional()}),U7=Ft.extend({method:we("completion/complete"),params:F7});var z7=Vt.extend({completion:Hr({values:Ge(te()).max(100),total:Se(ut().int()),hasMore:Se(Ht())})}),H7=le({uri:te().startsWith("file://"),name:te().optional(),_meta:Mt(te(),Nt()).optional()}),B7=Ft.extend({method:we("roots/list")}),V7=Vt.extend({roots:Ge(H7)}),G7=Ar.extend({method:we("notifications/roots/list_changed")}),jJ=gt([Hk,gB,U7,i7,VB,zB,kB,PB,CB,MB,DB,a7,e7,Zk,Kk,Xk]),DJ=gt([Uk,Bk,bB,G7,Gk]),qJ=gt([Fk,g7,y7,D7,V7,Wk,Jk,Vk]),LJ=gt([Hk,v7,N7,B7,Zk,Kk,Xk]),FJ=gt([Uk,Bk,c7,LB,AB,n7,JB,Gk,j7]),UJ=gt([Fk,_B,z7,XB,HB,RB,$B,IB,aR,t7,Wk,Jk,Vk]);var zJ=Symbol("Let zodToJsonSchema decide on which parser to use");var HJ=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");var BJ=lT(IL(),1),VJ=lT(k6(),1);var GJ=Symbol.for("mcp.completable");var uT;(function(t){t.Completable="McpCompletable"})(uT||(uT={}));function sR({prompt:t,options:e}){let{systemPrompt:r,settingSources:n,sandbox:a,...s}=e??{},i,o;r===void 0?i="":typeof r=="string"?i=r:r.type==="preset"&&(o=r.append);let c=s.pathToClaudeCodeExecutable;if(!c){let Z=(0,wT.fileURLToPath)(Z7.url),ee=(0,wm.join)(Z,"..");c=(0,wm.join)(ee,"cli.js")}process.env.CLAUDE_AGENT_SDK_VERSION="0.1.76";let{abortController:u=TT(),additionalDirectories:l=[],agents:d,allowedTools:f=[],betas:m,canUseTool:g,continue:_,cwd:p,disallowedTools:h=[],tools:y,env:v,executable:b=UT()?"bun":"node",executableArgs:w=[],extraArgs:x={},fallbackModel:E,enableFileCheckpointing:T,forkSession:R,hooks:M,includePartialMessages:j,persistSession:L,maxThinkingTokens:H,maxTurns:N,maxBudgetUsd:W,mcpServers:oe,model:he,outputFormat:ne,permissionMode:re="default",allowDangerouslySkipPermissions:U=!1,permissionPromptToolName:P,plugins:z,resume:I,resumeSessionAt:S,stderr:k,strictMcpConfig:D}=s,K=ne?.type==="json_schema"?ne.schema:void 0,J=v;if(J||(J={...process.env}),J.CLAUDE_CODE_ENTRYPOINT||(J.CLAUDE_CODE_ENTRYPOINT="sdk-ts"),T&&(J.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING="true"),!c)throw new Error("pathToClaudeCodeExecutable is required");let de={},se=new Map;if(oe)for(let[Z,ee]of Object.entries(oe))ee.type==="sdk"&&"instance"in ee?(se.set(Z,ee.instance),de[Z]={type:"sdk",name:Z}):de[Z]=ee;let me=typeof t=="string",O=new Tm({abortController:u,additionalDirectories:l,betas:m,cwd:p,executable:b,executableArgs:w,extraArgs:x,pathToClaudeCodeExecutable:c,env:J,forkSession:R,stderr:k,maxThinkingTokens:H,maxTurns:N,maxBudgetUsd:W,model:he,fallbackModel:E,jsonSchema:K,permissionMode:re,allowDangerouslySkipPermissions:U,permissionPromptToolName:P,continueConversation:_,resume:I,resumeSessionAt:S,settingSources:n??[],allowedTools:f,disallowedTools:h,tools:y,mcpServers:de,strictMcpConfig:D,canUseTool:!!g,hooks:!!M,includePartialMessages:j,persistSession:L,plugins:z,sandbox:a,spawnClaudeCodeProcess:s.spawnClaudeCodeProcess}),C={systemPrompt:i,appendSystemPrompt:o,agents:d},F=new Pm(O,me,g,M,u,se,K,C);return typeof t=="string"?O.write(JSON.stringify({type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:t}]},parent_tool_use_id:null})+` -`):F.streamInput(t),F}var jl=class{dbManager;sessionManager;constructor(e,r){this.dbManager=e,this.sessionManager=r}async startSession(e,r){try{let n=this.findClaudeExecutable(),a=this.getModelId(),s=["Bash","Read","Write","Edit","Grep","Glob","WebFetch","WebSearch","Task","NotebookEdit","AskUserQuestion","TodoWrite"],i=this.createMessageGenerator(e),o=sR({prompt:i,options:{model:a,resume:e.claudeSessionId,disallowedTools:s,abortController:e.abortController,pathToClaudeCodeExecutable:n}});for await(let u of o){if(u.type==="assistant"){let l=u.message.content,d=Array.isArray(l)?l.filter(h=>h.type==="text").map(h=>h.text).join(` -`):typeof l=="string"?l:"",f=d.length,m=e.cumulativeInputTokens+e.cumulativeOutputTokens,g=u.message.usage;g&&(e.cumulativeInputTokens+=g.input_tokens||0,e.cumulativeOutputTokens+=g.output_tokens||0,g.cache_creation_input_tokens&&(e.cumulativeInputTokens+=g.cache_creation_input_tokens),A.debug("SDK","Token usage captured",{sessionId:e.sessionDbId,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cacheCreation:g.cache_creation_input_tokens||0,cacheRead:g.cache_read_input_tokens||0,cumulativeInput:e.cumulativeInputTokens,cumulativeOutput:e.cumulativeOutputTokens}));let _=e.cumulativeInputTokens+e.cumulativeOutputTokens-m,p=e.earliestPendingTimestamp;if(f>0){let h=f>100?d.substring(0,100)+"...":d;A.dataOut("SDK",`Response received (${f} chars)`,{sessionId:e.sessionDbId,promptNumber:e.lastPromptNumber},h),await this.processSDKResponse(e,d,r,_,p)}else await this.markMessagesProcessed(e,r)}u.type==="result"&&u.subtype}let c=Date.now()-e.startTime;A.success("SDK","Agent completed",{sessionId:e.sessionDbId,duration:`${(c/1e3).toFixed(1)}s`})}catch(n){throw n.name==="AbortError"?A.warn("SDK","Agent aborted",{sessionId:e.sessionDbId}):A.failure("SDK","Agent error",{sessionDbId:e.sessionDbId},n),n}finally{this.sessionManager.deleteSession(e.sessionDbId).catch(()=>{})}}async*createMessageGenerator(e){let r=ct.getInstance().getActiveMode(),n=e.lastPromptNumber===1?Ks(e.project,e.claudeSessionId,e.userPrompt,r):Ys(e.userPrompt,e.lastPromptNumber,e.claudeSessionId,r);e.conversationHistory.push({role:"user",content:n}),yield{type:"user",message:{role:"user",content:n},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0};for await(let a of this.sessionManager.getMessageIterator(e.sessionDbId))if(a.type==="observation"){a.prompt_number!==void 0&&(e.lastPromptNumber=a.prompt_number);let s=Xs({id:0,tool_name:a.tool_name,tool_input:JSON.stringify(a.tool_input),tool_output:JSON.stringify(a.tool_response),created_at_epoch:Date.now(),cwd:a.cwd});e.conversationHistory.push({role:"user",content:s}),yield{type:"user",message:{role:"user",content:s},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0}}else if(a.type==="summarize"){let s=Js({id:e.sessionDbId,sdk_session_id:e.sdkSessionId,project:e.project,user_prompt:e.userPrompt,last_user_message:a.last_user_message||"",last_assistant_message:a.last_assistant_message||""},r);e.conversationHistory.push({role:"user",content:s}),yield{type:"user",message:{role:"user",content:s},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0}}}async processSDKResponse(e,r,n,a,s){r&&e.conversationHistory.push({role:"assistant",content:r});let i=Zs(r,e.claudeSessionId);for(let c of i){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","Observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)",filesRead:c.files_read?.length??0,filesModified:c.files_modified?.length??0,concepts:c.concepts?.length??0});let d=Date.now(),f=c.type,m=c.title||"(untitled)";this.dbManager.getChromaSync().syncObservation(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).then(()=>{let g=Date.now()-d;A.debug("CHROMA","Observation synced",{obsId:u,duration:`${g}ms`,type:f,title:m})}).catch(g=>{A.warn("CHROMA","Observation sync failed, continuing without vector search",{obsId:u,type:f,title:m},g)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,sdk_session_id:e.sdkSessionId,session_id:e.claudeSessionId,type:c.type,title:c.title,subtitle:c.subtitle,text:c.text||null,narrative:c.narrative||null,facts:JSON.stringify(c.facts||[]),concepts:JSON.stringify(c.concepts||[]),files_read:JSON.stringify(c.files||[]),files_modified:JSON.stringify([]),project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}let o=Ws(r,e.sessionDbId);if(o){let{id:c,createdAtEpoch:u}=this.dbManager.getSessionStore().storeSummary(e.claudeSessionId,e.project,o,e.lastPromptNumber,a,s??void 0);A.info("SDK","Summary saved",{sessionId:e.sessionDbId,summaryId:c,request:o.request||"(no request)",hasCompleted:!!o.completed,hasNextSteps:!!o.next_steps});let l=Date.now(),d=o.request||"(no request)";this.dbManager.getChromaSync().syncSummary(c,e.claudeSessionId,e.project,o,e.lastPromptNumber,u,a).then(()=>{let f=Date.now()-l;A.debug("CHROMA","Summary synced",{summaryId:c,duration:`${f}ms`,request:d})}).catch(f=>{A.warn("CHROMA","Summary sync failed, continuing without vector search",{summaryId:c,request:d},f)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:c,session_id:e.claudeSessionId,request:o.request,investigated:o.investigated,learned:o.learned,completed:o.completed,next_steps:o.next_steps,notes:o.notes,project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:u}})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let s of e.pendingProcessingIds)n.markProcessed(s);A.debug("SDK","Messages marked as processed",{sessionId:e.sessionDbId,messageIds:Array.from(e.pendingProcessingIds),count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear(),e.earliestPendingTimestamp=null;let a=n.cleanupProcessed(100);a>0&&A.debug("SDK","Cleaned up old processed messages",{deletedCount:a})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}findClaudeExecutable(){let e=We.loadFromFile(Or);if(e.CLAUDE_CODE_PATH){let{existsSync:r}=require("fs");if(!r(e.CLAUDE_CODE_PATH))throw new Error(`CLAUDE_CODE_PATH is set to "${e.CLAUDE_CODE_PATH}" but the file does not exist.`);return e.CLAUDE_CODE_PATH}try{let r=(0,iR.execSync)(process.platform==="win32"?"where claude":"which claude",{encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]}).trim().split(` +`):F.streamInput(t),F}var jl=class{dbManager;sessionManager;constructor(e,r){this.dbManager=e,this.sessionManager=r}async startSession(e,r){try{let n=this.findClaudeExecutable(),a=this.getModelId(),s=["Bash","Read","Write","Edit","Grep","Glob","WebFetch","WebSearch","Task","NotebookEdit","AskUserQuestion","TodoWrite"],i=this.createMessageGenerator(e);console.log("[SDK-AGENT] Starting SDK query with:",{sessionDbId:e.sessionDbId,claudeSessionId:e.claudeSessionId,resume_parameter:e.claudeSessionId,lastPromptNumber:e.lastPromptNumber});let o=sR({prompt:i,options:{model:a,resume:e.claudeSessionId,disallowedTools:s,abortController:e.abortController,pathToClaudeCodeExecutable:n}});for await(let u of o){if(u.type==="assistant"){let l=u.message.content,d=Array.isArray(l)?l.filter(h=>h.type==="text").map(h=>h.text).join(` +`):typeof l=="string"?l:"",f=d.length,m=e.cumulativeInputTokens+e.cumulativeOutputTokens,g=u.message.usage;g&&(e.cumulativeInputTokens+=g.input_tokens||0,e.cumulativeOutputTokens+=g.output_tokens||0,g.cache_creation_input_tokens&&(e.cumulativeInputTokens+=g.cache_creation_input_tokens),A.debug("SDK","Token usage captured",{sessionId:e.sessionDbId,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cacheCreation:g.cache_creation_input_tokens||0,cacheRead:g.cache_read_input_tokens||0,cumulativeInput:e.cumulativeInputTokens,cumulativeOutput:e.cumulativeOutputTokens}));let _=e.cumulativeInputTokens+e.cumulativeOutputTokens-m,p=e.earliestPendingTimestamp;if(f>0){let h=f>100?d.substring(0,100)+"...":d;A.dataOut("SDK",`Response received (${f} chars)`,{sessionId:e.sessionDbId,promptNumber:e.lastPromptNumber},h),await this.processSDKResponse(e,d,r,_,p)}else await this.markMessagesProcessed(e,r)}u.type==="result"&&u.subtype}let c=Date.now()-e.startTime;A.success("SDK","Agent completed",{sessionId:e.sessionDbId,duration:`${(c/1e3).toFixed(1)}s`})}catch(n){throw n.name==="AbortError"?A.warn("SDK","Agent aborted",{sessionId:e.sessionDbId}):A.failure("SDK","Agent error",{sessionDbId:e.sessionDbId},n),n}finally{this.sessionManager.deleteSession(e.sessionDbId).catch(()=>{})}}async*createMessageGenerator(e){let r=ct.getInstance().getActiveMode(),n=e.lastPromptNumber===1;console.log("[SDK-AGENT] Creating message generator:",{sessionDbId:e.sessionDbId,claudeSessionId:e.claudeSessionId,lastPromptNumber:e.lastPromptNumber,isInitPrompt:n,promptType:n?"INIT":"CONTINUATION"});let a=n?Ks(e.project,e.claudeSessionId,e.userPrompt,r):Ys(e.userPrompt,e.lastPromptNumber,e.claudeSessionId,r);e.conversationHistory.push({role:"user",content:a}),yield{type:"user",message:{role:"user",content:a},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0};for await(let s of this.sessionManager.getMessageIterator(e.sessionDbId))if(s.type==="observation"){s.prompt_number!==void 0&&(e.lastPromptNumber=s.prompt_number);let i=Xs({id:0,tool_name:s.tool_name,tool_input:JSON.stringify(s.tool_input),tool_output:JSON.stringify(s.tool_response),created_at_epoch:Date.now(),cwd:s.cwd});e.conversationHistory.push({role:"user",content:i}),yield{type:"user",message:{role:"user",content:i},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0}}else if(s.type==="summarize"){let i=Js({id:e.sessionDbId,sdk_session_id:e.sdkSessionId,project:e.project,user_prompt:e.userPrompt,last_user_message:s.last_user_message||"",last_assistant_message:s.last_assistant_message||""},r);e.conversationHistory.push({role:"user",content:i}),yield{type:"user",message:{role:"user",content:i},session_id:e.claudeSessionId,parent_tool_use_id:null,isSynthetic:!0}}}async processSDKResponse(e,r,n,a,s){r&&e.conversationHistory.push({role:"assistant",content:r});let i=Zs(r,e.claudeSessionId);for(let c of i){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","Observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)",filesRead:c.files_read?.length??0,filesModified:c.files_modified?.length??0,concepts:c.concepts?.length??0});let d=Date.now(),f=c.type,m=c.title||"(untitled)";this.dbManager.getChromaSync().syncObservation(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).then(()=>{let g=Date.now()-d;A.debug("CHROMA","Observation synced",{obsId:u,duration:`${g}ms`,type:f,title:m})}).catch(g=>{A.warn("CHROMA","Observation sync failed, continuing without vector search",{obsId:u,type:f,title:m},g)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,sdk_session_id:e.sdkSessionId,session_id:e.claudeSessionId,type:c.type,title:c.title,subtitle:c.subtitle,text:c.text||null,narrative:c.narrative||null,facts:JSON.stringify(c.facts||[]),concepts:JSON.stringify(c.concepts||[]),files_read:JSON.stringify(c.files||[]),files_modified:JSON.stringify([]),project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}let o=Ws(r,e.sessionDbId);if(o){let{id:c,createdAtEpoch:u}=this.dbManager.getSessionStore().storeSummary(e.claudeSessionId,e.project,o,e.lastPromptNumber,a,s??void 0);A.info("SDK","Summary saved",{sessionId:e.sessionDbId,summaryId:c,request:o.request||"(no request)",hasCompleted:!!o.completed,hasNextSteps:!!o.next_steps});let l=Date.now(),d=o.request||"(no request)";this.dbManager.getChromaSync().syncSummary(c,e.claudeSessionId,e.project,o,e.lastPromptNumber,u,a).then(()=>{let f=Date.now()-l;A.debug("CHROMA","Summary synced",{summaryId:c,duration:`${f}ms`,request:d})}).catch(f=>{A.warn("CHROMA","Summary sync failed, continuing without vector search",{summaryId:c,request:d},f)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:c,session_id:e.claudeSessionId,request:o.request,investigated:o.investigated,learned:o.learned,completed:o.completed,next_steps:o.next_steps,notes:o.notes,project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:u}})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let s of e.pendingProcessingIds)n.markProcessed(s);A.debug("SDK","Messages marked as processed",{sessionId:e.sessionDbId,messageIds:Array.from(e.pendingProcessingIds),count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear(),e.earliestPendingTimestamp=null;let a=n.cleanupProcessed(100);a>0&&A.debug("SDK","Cleaned up old processed messages",{deletedCount:a})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}findClaudeExecutable(){let e=We.loadFromFile(Or);if(e.CLAUDE_CODE_PATH){let{existsSync:r}=require("fs");if(!r(e.CLAUDE_CODE_PATH))throw new Error(`CLAUDE_CODE_PATH is set to "${e.CLAUDE_CODE_PATH}" but the file does not exist.`);return e.CLAUDE_CODE_PATH}try{let r=(0,iR.execSync)(process.platform==="win32"?"where claude":"which claude",{encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]}).trim().split(` `)[0].trim();if(r)return r}catch(r){A.debug("SDK","Claude executable auto-detection failed",r)}throw new Error(`Claude executable not found. Please either: 1. Add "claude" to your system PATH, or 2. Set CLAUDE_CODE_PATH in ~/.claude-mem/settings.json`)}getModelId(){let e=cR.default.join((0,oR.homedir)(),".claude-mem","settings.json");return We.loadFromFile(e).CLAUDE_MEM_MODEL}};var ql=wt(require("path"),1),Ll=require("os");lt();$r();ia();var W7="https://generativelanguage.googleapis.com/v1beta/models",K7={"gemini-2.5-flash-lite":10,"gemini-2.5-flash":10,"gemini-2.5-pro":5,"gemini-2.0-flash":15,"gemini-2.0-flash-lite":30},uR=0;async function X7(t,e){if(!e)return;let r=K7[t]||5,n=Math.ceil(6e4/r)+100,s=Date.now()-uR;if(ssetTimeout(o,i))}uR=Date.now()}var Dl=class{dbManager;sessionManager;fallbackAgent=null;constructor(e,r){this.dbManager=e,this.sessionManager=r}setFallbackAgent(e){this.fallbackAgent=e}shouldFallbackToClaude(e){let r=e?.message||"";return r.includes("429")||r.includes("500")||r.includes("502")||r.includes("503")||r.includes("ECONNREFUSED")||r.includes("ETIMEDOUT")||r.includes("fetch failed")}async startSession(e,r){try{let{apiKey:n,model:a,rateLimitingEnabled:s}=this.getGeminiConfig();if(!n)throw new Error("Gemini API key not configured. Set CLAUDE_MEM_GEMINI_API_KEY in settings or GEMINI_API_KEY environment variable.");let i=ct.getInstance().getActiveMode(),o=e.lastPromptNumber===1?Ks(e.project,e.claudeSessionId,e.userPrompt,i):Ys(e.userPrompt,e.lastPromptNumber,e.claudeSessionId,i);e.conversationHistory.push({role:"user",content:o});let c=await this.queryGeminiMultiTurn(e.conversationHistory,n,a,s);if(c.content){e.conversationHistory.push({role:"assistant",content:c.content});let l=c.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(l*.7),e.cumulativeOutputTokens+=Math.floor(l*.3),await this.processGeminiResponse(e,c.content,r,l,null)}else A.warn("SDK","Empty Gemini init response - session may lack context",{sessionId:e.sessionDbId,model:a});for await(let l of this.sessionManager.getMessageIterator(e.sessionDbId)){let d=e.earliestPendingTimestamp;if(l.type==="observation"){l.prompt_number!==void 0&&(e.lastPromptNumber=l.prompt_number);let f=Xs({id:0,tool_name:l.tool_name,tool_input:JSON.stringify(l.tool_input),tool_output:JSON.stringify(l.tool_response),created_at_epoch:d??Date.now(),cwd:l.cwd});e.conversationHistory.push({role:"user",content:f});let m=await this.queryGeminiMultiTurn(e.conversationHistory,n,a,s);if(m.content){e.conversationHistory.push({role:"assistant",content:m.content});let g=m.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(g*.7),e.cumulativeOutputTokens+=Math.floor(g*.3),await this.processGeminiResponse(e,m.content,r,g,d)}else A.warn("SDK","Empty Gemini response for observation, marking as processed",{sessionId:e.sessionDbId,toolName:l.tool_name}),await this.markMessagesProcessed(e,r)}else if(l.type==="summarize"){let f=Js({id:e.sessionDbId,sdk_session_id:e.sdkSessionId,project:e.project,user_prompt:e.userPrompt,last_user_message:l.last_user_message||"",last_assistant_message:l.last_assistant_message||""},i);e.conversationHistory.push({role:"user",content:f});let m=await this.queryGeminiMultiTurn(e.conversationHistory,n,a,s);if(m.content){e.conversationHistory.push({role:"assistant",content:m.content});let g=m.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(g*.7),e.cumulativeOutputTokens+=Math.floor(g*.3),await this.processGeminiResponse(e,m.content,r,g,d)}else A.warn("SDK","Empty Gemini response for summary, marking as processed",{sessionId:e.sessionDbId}),await this.markMessagesProcessed(e,r)}}let u=Date.now()-e.startTime;A.success("SDK","Gemini agent completed",{sessionId:e.sessionDbId,duration:`${(u/1e3).toFixed(1)}s`,historyLength:e.conversationHistory.length})}catch(n){if(n.name==="AbortError")throw A.warn("SDK","Gemini agent aborted",{sessionId:e.sessionDbId}),n;if(this.shouldFallbackToClaude(n)&&this.fallbackAgent){A.warn("SDK","Gemini API failed, falling back to Claude SDK",{sessionDbId:e.sessionDbId,error:n.message,historyLength:e.conversationHistory.length});let s=this.sessionManager.getPendingMessageStore().resetStuckMessages(0);return s>0&&A.info("SDK","Reset processing messages for fallback",{sessionDbId:e.sessionDbId,resetCount:s}),this.fallbackAgent.startSession(e,r)}throw A.failure("SDK","Gemini agent error",{sessionDbId:e.sessionDbId},n),n}}conversationToGeminiContents(e){return e.map(r=>({role:r.role==="assistant"?"model":"user",parts:[{text:r.content}]}))}async queryGeminiMultiTurn(e,r,n,a){let s=this.conversationToGeminiContents(e),i=e.reduce((f,m)=>f+m.content.length,0);A.debug("SDK",`Querying Gemini multi-turn (${n})`,{turns:e.length,totalChars:i});let o=`${W7}/${n}:generateContent?key=${r}`;await X7(n,a);let c=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:s,generationConfig:{temperature:.3,maxOutputTokens:4096}})});if(!c.ok){let f=await c.text();throw new Error(`Gemini API error: ${c.status} - ${f}`)}let u=await c.json();if(!u.candidates?.[0]?.content?.parts?.[0]?.text)return A.warn("SDK","Empty response from Gemini"),{content:""};let l=u.candidates[0].content.parts[0].text,d=u.usageMetadata?.totalTokenCount;return{content:l,tokensUsed:d}}async processGeminiResponse(e,r,n,a,s){let i=Zs(r,e.claudeSessionId);for(let c of i){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","Gemini observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)"}),this.dbManager.getChromaSync().syncObservation(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).catch(d=>{A.warn("SDK","Gemini chroma sync failed",{obsId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,sdk_session_id:e.sdkSessionId,session_id:e.claudeSessionId,type:c.type,title:c.title,subtitle:c.subtitle,text:null,narrative:c.narrative||null,facts:JSON.stringify(c.facts||[]),concepts:JSON.stringify(c.concepts||[]),files_read:JSON.stringify(c.files_read||[]),files_modified:JSON.stringify(c.files_modified||[]),project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}let o=Ws(r,e.sessionDbId);if(o){let c={request:o.request||"",investigated:o.investigated||"",learned:o.learned||"",completed:o.completed||"",next_steps:o.next_steps||"",notes:o.notes},{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeSummary(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","Gemini summary saved",{sessionId:e.sessionDbId,summaryId:u,request:o.request||"(no request)"}),this.dbManager.getChromaSync().syncSummary(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).catch(d=>{A.warn("SDK","Gemini chroma sync failed",{summaryId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:u,session_id:e.claudeSessionId,request:o.request,investigated:o.investigated,learned:o.learned,completed:o.completed,next_steps:o.next_steps,notes:o.notes,project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let s of e.pendingProcessingIds)n.markProcessed(s);A.debug("SDK","Gemini messages marked as processed",{sessionId:e.sessionDbId,count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear();let a=n.cleanupProcessed(100);a>0&&A.debug("SDK","Gemini cleaned up old processed messages",{deletedCount:a})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}getGeminiConfig(){let e=ql.default.join((0,Ll.homedir)(),".claude-mem","settings.json"),r=We.loadFromFile(e),n=r.CLAUDE_MEM_GEMINI_API_KEY||process.env.GEMINI_API_KEY||"",a="gemini-2.5-flash",s=r.CLAUDE_MEM_GEMINI_MODEL||a,i=["gemini-2.5-flash-lite","gemini-2.5-flash","gemini-2.5-pro","gemini-2.0-flash","gemini-2.0-flash-lite"],o;i.includes(s)?o=s:(A.warn("SDK",`Invalid Gemini model "${s}", falling back to ${a}`,{configured:s,validModels:i}),o=a);let c=r.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED!=="false";return{apiKey:n,model:o,rateLimitingEnabled:c}}};function lh(){let t=ql.default.join((0,Ll.homedir)(),".claude-mem","settings.json");return!!(We.loadFromFile(t).CLAUDE_MEM_GEMINI_API_KEY||process.env.GEMINI_API_KEY)}function dh(){let t=ql.default.join((0,Ll.homedir)(),".claude-mem","settings.json");return We.loadFromFile(t).CLAUDE_MEM_PROVIDER==="gemini"}lt();$r();pr();ia();var J7="https://openrouter.ai/api/v1/chat/completions",Y7=20,Q7=1e5,eV=4,Fl=class{dbManager;sessionManager;fallbackAgent=null;constructor(e,r){this.dbManager=e,this.sessionManager=r}setFallbackAgent(e){this.fallbackAgent=e}shouldFallbackToClaude(e){let r=e?.message||"";return r.includes("429")||r.includes("500")||r.includes("502")||r.includes("503")||r.includes("ECONNREFUSED")||r.includes("ETIMEDOUT")||r.includes("fetch failed")}async startSession(e,r){try{let{apiKey:n,model:a,siteUrl:s,appName:i}=this.getOpenRouterConfig();if(!n)throw new Error("OpenRouter API key not configured. Set CLAUDE_MEM_OPENROUTER_API_KEY in settings or OPENROUTER_API_KEY environment variable.");let o=ct.getInstance().getActiveMode(),c=e.lastPromptNumber===1?Ks(e.project,e.claudeSessionId,e.userPrompt,o):Ys(e.userPrompt,e.lastPromptNumber,e.claudeSessionId,o);e.conversationHistory.push({role:"user",content:c});let u=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,a,s,i);if(u.content){e.conversationHistory.push({role:"assistant",content:u.content});let d=u.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(d*.7),e.cumulativeOutputTokens+=Math.floor(d*.3),await this.processOpenRouterResponse(e,u.content,r,d,null)}else A.warn("SDK","Empty OpenRouter init response - session may lack context",{sessionId:e.sessionDbId,model:a});for await(let d of this.sessionManager.getMessageIterator(e.sessionDbId)){let f=e.earliestPendingTimestamp;if(d.type==="observation"){d.prompt_number!==void 0&&(e.lastPromptNumber=d.prompt_number);let m=Xs({id:0,tool_name:d.tool_name,tool_input:JSON.stringify(d.tool_input),tool_output:JSON.stringify(d.tool_response),created_at_epoch:f??Date.now(),cwd:d.cwd});e.conversationHistory.push({role:"user",content:m});let g=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,a,s,i);if(g.content){e.conversationHistory.push({role:"assistant",content:g.content});let _=g.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(_*.7),e.cumulativeOutputTokens+=Math.floor(_*.3),await this.processOpenRouterResponse(e,g.content,r,_,f)}else A.warn("SDK","Empty OpenRouter response for observation, marking as processed",{sessionId:e.sessionDbId,toolName:d.tool_name}),await this.markMessagesProcessed(e,r)}else if(d.type==="summarize"){let m=Js({id:e.sessionDbId,sdk_session_id:e.sdkSessionId,project:e.project,user_prompt:e.userPrompt,last_user_message:d.last_user_message||"",last_assistant_message:d.last_assistant_message||""},o);e.conversationHistory.push({role:"user",content:m});let g=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,a,s,i);if(g.content){e.conversationHistory.push({role:"assistant",content:g.content});let _=g.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(_*.7),e.cumulativeOutputTokens+=Math.floor(_*.3),await this.processOpenRouterResponse(e,g.content,r,_,f)}else A.warn("SDK","Empty OpenRouter response for summary, marking as processed",{sessionId:e.sessionDbId}),await this.markMessagesProcessed(e,r)}}let l=Date.now()-e.startTime;A.success("SDK","OpenRouter agent completed",{sessionId:e.sessionDbId,duration:`${(l/1e3).toFixed(1)}s`,historyLength:e.conversationHistory.length,model:a})}catch(n){if(n.name==="AbortError")throw A.warn("SDK","OpenRouter agent aborted",{sessionId:e.sessionDbId}),n;if(this.shouldFallbackToClaude(n)&&this.fallbackAgent){A.warn("SDK","OpenRouter API failed, falling back to Claude SDK",{sessionDbId:e.sessionDbId,error:n.message,historyLength:e.conversationHistory.length});let s=this.sessionManager.getPendingMessageStore().resetStuckMessages(0);return s>0&&A.info("SDK","Reset processing messages for fallback",{sessionDbId:e.sessionDbId,resetCount:s}),this.fallbackAgent.startSession(e,r)}throw A.failure("SDK","OpenRouter agent error",{sessionDbId:e.sessionDbId},n),n}}estimateTokens(e){return Math.ceil(e.length/eV)}truncateHistory(e){let r=We.loadFromFile(Or),n=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES)||Y7,a=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS)||Q7;if(e.length<=n&&e.reduce((c,u)=>c+this.estimateTokens(u.content),0)<=a)return e;let s=[],i=0;for(let o=e.length-1;o>=0;o--){let c=e[o],u=this.estimateTokens(c.content);if(s.length>=n||i+u>a){A.warn("SDK","Context window truncated to prevent runaway costs",{originalMessages:e.length,keptMessages:s.length,droppedMessages:o+1,estimatedTokens:i,tokenLimit:a});break}s.unshift(c),i+=u}return s}conversationToOpenAIMessages(e){return e.map(r=>({role:r.role==="assistant"?"assistant":"user",content:r.content}))}async queryOpenRouterMultiTurn(e,r,n,a,s){let i=this.truncateHistory(e),o=this.conversationToOpenAIMessages(i),c=i.reduce((g,_)=>g+_.content.length,0),u=this.estimateTokens(i.map(g=>g.content).join(""));A.debug("SDK",`Querying OpenRouter multi-turn (${n})`,{turns:i.length,totalChars:c,estimatedTokens:u});let l=await fetch(J7,{method:"POST",headers:{Authorization:`Bearer ${r}`,"HTTP-Referer":a||"https://github.com/thedotmack/claude-mem","X-Title":s||"claude-mem","Content-Type":"application/json"},body:JSON.stringify({model:n,messages:o,temperature:.3,max_tokens:4096})});if(!l.ok){let g=await l.text();throw new Error(`OpenRouter API error: ${l.status} - ${g}`)}let d=await l.json();if(d.error)throw new Error(`OpenRouter API error: ${d.error.code} - ${d.error.message}`);if(!d.choices?.[0]?.message?.content)return A.warn("SDK","Empty response from OpenRouter"),{content:""};let f=d.choices[0].message.content,m=d.usage?.total_tokens;if(m){let g=d.usage?.prompt_tokens||0,_=d.usage?.completion_tokens||0,p=g/1e6*3+_/1e6*15;A.info("SDK","OpenRouter API usage",{model:n,inputTokens:g,outputTokens:_,totalTokens:m,estimatedCostUSD:p.toFixed(4),messagesInContext:i.length}),m>5e4&&A.warn("SDK","High token usage detected - consider reducing context",{totalTokens:m,estimatedCost:p.toFixed(4)})}return{content:f,tokensUsed:m}}async processOpenRouterResponse(e,r,n,a,s){let i=Zs(r,e.claudeSessionId);for(let c of i){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","OpenRouter observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)"}),this.dbManager.getChromaSync().syncObservation(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).catch(d=>{A.warn("SDK","OpenRouter chroma sync failed",{obsId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,sdk_session_id:e.sdkSessionId,session_id:e.claudeSessionId,type:c.type,title:c.title,subtitle:c.subtitle,text:null,narrative:c.narrative||null,facts:JSON.stringify(c.facts||[]),concepts:JSON.stringify(c.concepts||[]),files_read:JSON.stringify(c.files_read||[]),files_modified:JSON.stringify(c.files_modified||[]),project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}let o=Ws(r,e.sessionDbId);if(o){let c={request:o.request||"",investigated:o.investigated||"",learned:o.learned||"",completed:o.completed||"",next_steps:o.next_steps||"",notes:o.notes},{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeSummary(e.claudeSessionId,e.project,c,e.lastPromptNumber,a,s??void 0);A.info("SDK","OpenRouter summary saved",{sessionId:e.sessionDbId,summaryId:u,request:o.request||"(no request)"}),this.dbManager.getChromaSync().syncSummary(u,e.claudeSessionId,e.project,c,e.lastPromptNumber,l,a).catch(d=>{A.warn("SDK","OpenRouter chroma sync failed",{summaryId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:u,session_id:e.claudeSessionId,request:o.request,investigated:o.investigated,learned:o.learned,completed:o.completed,next_steps:o.next_steps,notes:o.notes,project:e.project,prompt_number:e.lastPromptNumber,created_at_epoch:l}})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let s of e.pendingProcessingIds)n.markProcessed(s);A.debug("SDK","OpenRouter messages marked as processed",{sessionId:e.sessionDbId,count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear();let a=n.cleanupProcessed(100);a>0&&A.debug("SDK","OpenRouter cleaned up old processed messages",{deletedCount:a})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}getOpenRouterConfig(){let e=Or,r=We.loadFromFile(e),n=r.CLAUDE_MEM_OPENROUTER_API_KEY||process.env.OPENROUTER_API_KEY||"",a=r.CLAUDE_MEM_OPENROUTER_MODEL||"xiaomi/mimo-v2-flash:free",s=r.CLAUDE_MEM_OPENROUTER_SITE_URL||"",i=r.CLAUDE_MEM_OPENROUTER_APP_NAME||"claude-mem";return{apiKey:n,model:a,siteUrl:s,appName:i}}};function ph(){let t=Or;return!!(We.loadFromFile(t).CLAUDE_MEM_OPENROUTER_API_KEY||process.env.OPENROUTER_API_KEY)}function fh(){let t=Or;return We.loadFromFile(t).CLAUDE_MEM_PROVIDER==="openrouter"}var Ul=class{dbManager;constructor(e){this.dbManager=e}stripProjectPath(e,r){let n=`/${r}/`,a=e.indexOf(n);return a!==-1?e.substring(a+n.length):e}stripProjectPaths(e,r){if(!e)return e;try{let a=JSON.parse(e).map(s=>this.stripProjectPath(s,r));return JSON.stringify(a)}catch{return e}}sanitizeObservation(e){return{...e,files_read:this.stripProjectPaths(e.files_read,e.project),files_modified:this.stripProjectPaths(e.files_modified,e.project)}}getObservations(e,r,n){let a=this.paginate("observations","id, sdk_session_id, project, type, title, subtitle, narrative, text, facts, concepts, files_read, files_modified, prompt_number, created_at, created_at_epoch",e,r,n);return{...a,items:a.items.map(s=>this.sanitizeObservation(s))}}getSummaries(e,r,n){let a=this.dbManager.getSessionStore().db,s=` @@ -1058,7 +1058,7 @@ Tips: \u2022 Sort: orderBy="date_desc" or "date_asc"`}formatTime(e){return new Date(e).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}estimateReadTokens(e){let r=(e.title?.length||0)+(e.subtitle?.length||0)+(e.narrative?.length||0)+(e.facts?.length||0);return Math.ceil(r/aV)}formatObservationIndex(e,r){let n=`#${e.id}`,a=this.formatTime(e.created_at_epoch),s=ct.getInstance().getTypeIcon(e.type),i=e.title||"Untitled",o=this.estimateReadTokens(e),c=ct.getInstance().getWorkEmoji(e.type),u=e.discovery_tokens||0,l=u>0?`${c} ${u}`:"-";return`| ${n} | ${a} | ${s} | ${i} | ~${o} | ${l} |`}formatSessionIndex(e,r){let n=`#S${e.id}`,a=this.formatTime(e.created_at_epoch),s="\u{1F3AF}",i=e.request||`Session ${e.sdk_session_id?.substring(0,8)||"unknown"}`;return`| ${n} | ${a} | ${s} | ${i} | - | - |`}formatUserPromptIndex(e,r){let n=`#P${e.id}`,a=this.formatTime(e.created_at_epoch),s="\u{1F4AC}",i=e.prompt_text.length>60?e.prompt_text.substring(0,57)+"...":e.prompt_text;return`| ${n} | ${a} | ${s} | ${i} | - | - |`}formatTableHeader(){return`| ID | Time | T | Title | Read | Work | |-----|------|---|-------|------|------|`}formatSearchTableHeader(){return`| ID | Time | T | Title | Read | |----|------|---|-------|------|`}formatObservationSearchRow(e,r){let n=`#${e.id}`,a=this.formatTime(e.created_at_epoch),s=ct.getInstance().getTypeIcon(e.type),i=e.title||"Untitled",o=this.estimateReadTokens(e);return{row:`| ${n} | ${a===r?"\u2033":a} | ${s} | ${i} | ~${o} |`,time:a}}formatSessionSearchRow(e,r){let n=`#S${e.id}`,a=this.formatTime(e.created_at_epoch),s="\u{1F3AF}",i=e.request||`Session ${e.sdk_session_id?.substring(0,8)||"unknown"}`;return{row:`| ${n} | ${a===r?"\u2033":a} | ${s} | ${i} | - |`,time:a}}formatUserPromptSearchRow(e,r){let n=`#P${e.id}`,a=this.formatTime(e.created_at_epoch),s="\u{1F4AC}",i=e.prompt_text.length>60?e.prompt_text.substring(0,57)+"...":e.prompt_text;return{row:`| ${n} | ${a===r?"\u2033":a} | ${s} | ${i} | - |`,time:a}}};ia();var Gl=class{buildTimeline(e){let r=[...e.observations.map(n=>({type:"observation",data:n,epoch:n.created_at_epoch})),...e.sessions.map(n=>({type:"session",data:n,epoch:n.created_at_epoch})),...e.prompts.map(n=>({type:"prompt",data:n,epoch:n.created_at_epoch}))];return r.sort((n,a)=>n.epoch-a.epoch),r}filterByDepth(e,r,n,a,s){if(e.length===0)return e;let i=-1;if(typeof r=="number")i=e.findIndex(u=>u.type==="observation"&&u.data.id===r);else if(typeof r=="string"&&r.startsWith("S")){let u=parseInt(r.slice(1),10);i=e.findIndex(l=>l.type==="session"&&l.data.id===u)}else i=e.findIndex(u=>u.epoch>=n),i===-1&&(i=e.length-1);if(i===-1)return e;let o=Math.max(0,i-a),c=Math.min(e.length,i+s+1);return e.slice(o,c)}formatTimeline(e,r,n,a,s){if(e.length===0)return n?`Found observation matching "${n}", but no timeline context available.`:"No timeline items found";let i=[];if(n&&r){let u=e.find(d=>d.type==="observation"&&d.data.id===r),l=u?u.data.title||"Untitled":"Unknown";i.push(`# Timeline for query: "${n}"`),i.push(`**Anchor:** Observation #${r} - ${l}`)}else r?i.push(`# Timeline around anchor: ${r}`):i.push("# Timeline");a!==void 0&&s!==void 0?i.push(`**Window:** ${a} records before \u2192 ${s} records after | **Items:** ${e.length}`):i.push(`**Items:** ${e.length}`),i.push(""),i.push("**Legend:** \u{1F3AF} session-request | \u{1F534} bugfix | \u{1F7E3} feature | \u{1F504} refactor | \u2705 change | \u{1F535} discovery | \u{1F9E0} decision"),i.push("");let o=new Map;for(let u of e){let l=this.formatDate(u.epoch);o.has(l)||o.set(l,[]),o.get(l).push(u)}let c=Array.from(o.entries()).sort((u,l)=>{let d=new Date(u[0]).getTime(),f=new Date(l[0]).getTime();return d-f});for(let[u,l]of c){i.push(`### ${u}`),i.push("");let d=null,f="",m=!1;for(let g of l){let _=typeof r=="number"&&g.type==="observation"&&g.data.id===r||typeof r=="string"&&r.startsWith("S")&&g.type==="session"&&`S${g.data.id}`===r;if(g.type==="session"){m&&(i.push(""),m=!1,d=null,f="");let p=g.data,h=p.request||"Session summary",y=_?" \u2190 **ANCHOR**":"";i.push(`**\u{1F3AF} #S${p.id}** ${h} (${this.formatDateTime(g.epoch)})${y}`),i.push("")}else if(g.type==="prompt"){m&&(i.push(""),m=!1,d=null,f="");let p=g.data,h=p.prompt_text.length>100?p.prompt_text.substring(0,100)+"...":p.prompt_text;i.push(`**\u{1F4AC} User Prompt #${p.prompt_number}** (${this.formatDateTime(g.epoch)})`),i.push(`> ${h}`),i.push("")}else if(g.type==="observation"){let p=g.data,h="General";h!==d&&(m&&i.push(""),i.push(`**${h}**`),i.push("| ID | Time | T | Title | Tokens |"),i.push("|----|------|---|-------|--------|"),d=h,m=!0,f="");let y=this.getTypeIcon(p.type),v=this.formatTime(g.epoch),b=p.title||"Untitled",w=this.estimateTokens(p.narrative),E=v!==f?v:"\u2033";f=v;let T=_?" \u2190 **ANCHOR**":"";i.push(`| #${p.id} | ${E} | ${y} | ${b}${T} | ~${w} |`)}}m&&i.push("")}return i.join(` -`)}getTypeIcon(e){return ct.getInstance().getTypeIcon(e)}formatDate(e){return new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}formatTime(e){return new Date(e).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}formatDateTime(e){return new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}estimateTokens(e){return e?Math.ceil(e.length/4):0}};var Zl=class{constructor(e,r){this.sseBroadcaster=e;this.workerService=r}broadcastNewPrompt(e){this.sseBroadcaster.broadcast({type:"new_prompt",prompt:e}),this.sseBroadcaster.broadcast({type:"processing_status",isProcessing:!0}),this.workerService.broadcastProcessingStatus()}broadcastSessionStarted(e,r){this.sseBroadcaster.broadcast({type:"session_started",sessionDbId:e,project:r}),this.workerService.broadcastProcessingStatus()}broadcastObservationQueued(e){this.sseBroadcaster.broadcast({type:"observation_queued",sessionDbId:e}),this.workerService.broadcastProcessingStatus()}broadcastSessionCompleted(e){this.sseBroadcaster.broadcast({type:"session_completed",timestamp:Date.now(),sessionDbId:e}),this.workerService.broadcastProcessingStatus()}broadcastSummarizeQueued(){this.workerService.broadcastProcessingStatus()}};var gh=wt(du(),1),gR=wt(vR(),1),yR=wt(require("path"),1);pr();lt();function _R(t){let e=[];e.push(gh.default.json({limit:"50mb"})),e.push((0,gR.default)()),e.push((a,s,i)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(m=>a.path.endsWith(m));if(a.path.startsWith("/health")||a.path==="/"||c)return i();let u=Date.now(),l=`${a.method}-${Date.now()}`,d=t(a.method,a.path,a.body);A.info("HTTP",`\u2192 ${a.method} ${a.path}`,{requestId:l},d);let f=s.send.bind(s);s.send=function(m){let g=Date.now()-u;return A.info("HTTP",`\u2190 ${s.statusCode} ${a.path}`,{requestId:l,duration:`${g}ms`}),f(m)},i()});let r=sr(),n=yR.default.join(r,"plugin","ui");return e.push(gh.default.static(n)),e}function yh(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")){A.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 bR(t,e,r){if(!r||Object.keys(r).length===0||e.includes("/init"))return"";if(e.includes("/observations")){let n=r.tool_name||"?",a=r.tool_input;return`tool=${A.formatTool(n,a)}`}return e.includes("/summarize")?"requesting summary":""}var xR=wt(du(),1),Wl=wt(require("path"),1),Xl=require("fs");pr();lt();var Nr=class{wrapHandler(e){return(r,n)=>{try{let a=e(r,n);a instanceof Promise&&a.catch(s=>this.handleError(n,s))}catch(a){this.handleError(n,a)}}}parseIntParam(e,r,n){let a=parseInt(e.params[n],10);return isNaN(a)?(this.badRequest(r,`Invalid ${n}`),null):a}validateRequired(e,r,n){for(let a of n)if(e.body[a]===void 0||e.body[a]===null)return this.badRequest(r,`Missing ${a}`),!1;return!0}badRequest(e,r){e.status(400).json({error:r})}notFound(e,r){e.status(404).json({error:r})}handleError(e,r,n){A.failure("WORKER",n||"Request failed",{},r),e.status(500).json({error:r.message})}};var Kl=class extends Nr{constructor(r,n,a){super();this.sseBroadcaster=r;this.dbManager=n;this.sessionManager=a}setupRoutes(r){let n=sr();r.use(xR.default.static(Wl.default.join(n,"ui"))),r.get("/health",this.handleHealth.bind(this)),r.get("/",this.handleViewerUI.bind(this)),r.get("/stream",this.handleSSEStream.bind(this))}handleHealth=this.wrapHandler((r,n)=>{n.json({status:"ok",timestamp:Date.now()})});handleViewerUI=this.wrapHandler((r,n)=>{let a=sr(),i=[Wl.default.join(a,"ui","viewer.html"),Wl.default.join(a,"plugin","ui","viewer.html")].find(c=>(0,Xl.existsSync)(c));if(!i)throw new Error("Viewer UI not found at any expected location");let o=(0,Xl.readFileSync)(i,"utf-8");n.setHeader("Content-Type","text/html"),n.send(o)});handleSSEStream=this.wrapHandler((r,n)=>{n.setHeader("Content-Type","text/event-stream"),n.setHeader("Cache-Control","no-cache"),n.setHeader("Connection","keep-alive"),this.sseBroadcaster.addClient(n);let a=this.dbManager.getSessionStore().getAllProjects();this.sseBroadcaster.broadcast({type:"initial_load",projects:a,timestamp:Date.now()});let s=this.sessionManager.isAnySessionProcessing(),i=this.sessionManager.getTotalActiveWork();this.sseBroadcaster.broadcast({type:"processing_status",isProcessing:s,queueDepth:i})})};lt();lt();var SR=100;function cV(t){let e=(t.match(//g)||[]).length,r=(t.match(//g)||[]).length;return e+r}function wR(t){let e=cV(t);return e>SR&&A.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:e,maxAllowed:SR,contentLength:t.length}),t.replace(/[\s\S]*?<\/claude-mem-context>/g,"").replace(/[\s\S]*?<\/private>/g,"").trim()}function _h(t){return wR(t)}function ER(t){return wR(t)}var Jl=class{constructor(e,r){this.sessionManager=e;this.eventBroadcaster=r}async completeByDbId(e){await this.sessionManager.deleteSession(e),this.eventBroadcaster.broadcastSessionCompleted(e)}};lt();var Qo=class{static checkUserPromptPrivacy(e,r,n,a,s,i){let o=e.getUserPrompt(r,n);return!o||o.trim()===""?(A.debug("HOOK",`Skipping ${a} - user prompt was entirely private`,{sessionId:s,promptNumber:n,...i}),null):o}};$r();pr();var Yl=class extends Nr{constructor(r,n,a,s,i,o,c){super();this.sessionManager=r;this.dbManager=n;this.sdkAgent=a;this.geminiAgent=s;this.openRouterAgent=i;this.eventBroadcaster=o;this.workerService=c;this.completionHandler=new Jl(r,o)}completionHandler;getActiveAgent(){if(fh()){if(ph())return A.debug("SESSION","Using OpenRouter agent"),this.openRouterAgent;throw new Error("OpenRouter provider selected but no API key configured. Set CLAUDE_MEM_OPENROUTER_API_KEY in settings or OPENROUTER_API_KEY environment variable.")}if(dh()){if(lh())return A.debug("SESSION","Using Gemini agent"),this.geminiAgent;throw new Error("Gemini provider selected but no API key configured. Set CLAUDE_MEM_GEMINI_API_KEY in settings or GEMINI_API_KEY environment variable.")}return this.sdkAgent}getSelectedProvider(){return fh()&&ph()?"openrouter":dh()&&lh()?"gemini":"claude"}ensureGeneratorRunning(r,n){let a=this.sessionManager.getSession(r);if(!a)return;let s=this.getSelectedProvider();if(!a.generatorPromise){this.startGeneratorWithProvider(a,s,n);return}a.currentProvider&&a.currentProvider!==s&&A.info("SESSION","Provider changed, will switch after current generator finishes",{sessionId:r,currentProvider:a.currentProvider,selectedProvider:s,historyLength:a.conversationHistory.length})}startGeneratorWithProvider(r,n,a){if(!r)return;let s=n==="openrouter"?this.openRouterAgent:n==="gemini"?this.geminiAgent:this.sdkAgent,i=n==="openrouter"?"OpenRouter":n==="gemini"?"Gemini":"Claude SDK";A.info("SESSION",`Generator auto-starting (${a}) using ${i}`,{sessionId:r.sessionDbId,queueDepth:r.pendingMessages.length,historyLength:r.conversationHistory.length}),r.currentProvider=n,r.generatorPromise=s.startSession(r,this.workerService).catch(o=>{A.error("SESSION","Generator failed",{sessionId:r.sessionDbId,provider:n,error:o.message},o)}).finally(()=>{A.info("SESSION","Generator finished",{sessionId:r.sessionDbId}),r.generatorPromise=null,r.currentProvider=null,this.workerService.broadcastProcessingStatus()})}setupRoutes(r){r.post("/sessions/:sessionDbId/init",this.handleSessionInit.bind(this)),r.post("/sessions/:sessionDbId/observations",this.handleObservations.bind(this)),r.post("/sessions/:sessionDbId/summarize",this.handleSummarize.bind(this)),r.get("/sessions/:sessionDbId/status",this.handleSessionStatus.bind(this)),r.delete("/sessions/:sessionDbId",this.handleSessionDelete.bind(this)),r.post("/sessions/:sessionDbId/complete",this.handleSessionComplete.bind(this)),r.post("/api/sessions/init",this.handleSessionInitByClaudeId.bind(this)),r.post("/api/sessions/observations",this.handleObservationsByClaudeId.bind(this)),r.post("/api/sessions/summarize",this.handleSummarizeByClaudeId.bind(this))}handleSessionInit=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{userPrompt:s,promptNumber:i}=r.body,o=this.sessionManager.initializeSession(a,s,i),c=this.dbManager.getSessionStore().getLatestUserPrompt(o.claudeSessionId);if(c){this.eventBroadcaster.broadcastNewPrompt({id:c.id,claude_session_id:c.claude_session_id,project:c.project,prompt_number:c.prompt_number,prompt_text:c.prompt_text,created_at_epoch:c.created_at_epoch});let u=Date.now(),l=c.prompt_text;this.dbManager.getChromaSync().syncUserPrompt(c.id,c.sdk_session_id,c.project,l,c.prompt_number,c.created_at_epoch).then(()=>{let d=Date.now()-u,f=l.length>60?l.substring(0,60)+"...":l;A.debug("CHROMA","User prompt synced",{promptId:c.id,duration:`${d}ms`,prompt:f})}).catch(d=>{A.warn("CHROMA","User prompt sync failed, continuing without vector search",{promptId:c.id,prompt:l.length>60?l.substring(0,60)+"...":l},d)})}this.startGeneratorWithProvider(o,this.getSelectedProvider(),"init"),this.eventBroadcaster.broadcastSessionStarted(a,o.project),n.json({status:"initialized",sessionDbId:a,port:qn()})});handleObservations=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{tool_name:s,tool_input:i,tool_response:o,prompt_number:c,cwd:u}=r.body;this.sessionManager.queueObservation(a,{tool_name:s,tool_input:i,tool_response:o,prompt_number:c,cwd:u}),this.ensureGeneratorRunning(a,"observation"),this.eventBroadcaster.broadcastObservationQueued(a),n.json({status:"queued"})});handleSummarize=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{last_user_message:s,last_assistant_message:i}=r.body;this.sessionManager.queueSummarize(a,s,i),this.ensureGeneratorRunning(a,"summarize"),this.eventBroadcaster.broadcastSummarizeQueued(),n.json({status:"queued"})});handleSessionStatus=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let s=this.sessionManager.getSession(a);if(!s){n.json({status:"not_found"});return}n.json({status:"active",sessionDbId:a,project:s.project,queueLength:s.pendingMessages.length,uptime:Date.now()-s.startTime})});handleSessionDelete=this.wrapHandler(async(r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");a!==null&&(await this.completionHandler.completeByDbId(a),n.json({status:"deleted"}))});handleSessionComplete=this.wrapHandler(async(r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");a!==null&&(await this.completionHandler.completeByDbId(a),n.json({success:!0}))});handleObservationsByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,tool_name:s,tool_input:i,tool_response:o,cwd:c}=r.body;if(!a)return this.badRequest(n,"Missing claudeSessionId");let u=We.loadFromFile(Or);if(new Set(u.CLAUDE_MEM_SKIP_TOOLS.split(",").map(y=>y.trim()).filter(Boolean)).has(s)){A.debug("SESSION","Skipping observation for tool",{tool_name:s}),n.json({status:"skipped",reason:"tool_excluded"});return}if(new Set(["Edit","Write","Read","NotebookEdit"]).has(s)&&i){let y=i.file_path||i.notebook_path;if(y&&y.includes("session-memory")){A.debug("SESSION","Skipping meta-observation for session-memory file",{tool_name:s,file_path:y}),n.json({status:"skipped",reason:"session_memory_meta"});return}}let f=this.dbManager.getSessionStore(),m=f.createSDKSession(a,"",""),g=f.getPromptNumberFromUserPrompts(a);if(!Qo.checkUserPromptPrivacy(f,a,g,"observation",m,{tool_name:s})){n.json({status:"skipped",reason:"private"});return}let p=i!==void 0?_h(JSON.stringify(i)):"{}",h=o!==void 0?_h(JSON.stringify(o)):"{}";this.sessionManager.queueObservation(m,{tool_name:s,tool_input:p,tool_response:h,prompt_number:g,cwd:c||A.happyPathError("SESSION","Missing cwd when queueing observation in SessionRoutes",{sessionId:m},{tool_name:s},"")}),this.ensureGeneratorRunning(m,"observation"),this.eventBroadcaster.broadcastObservationQueued(m),n.json({status:"queued"})});handleSummarizeByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,last_user_message:s,last_assistant_message:i}=r.body;if(!a)return this.badRequest(n,"Missing claudeSessionId");let o=this.dbManager.getSessionStore(),c=o.createSDKSession(a,"",""),u=o.getPromptNumberFromUserPrompts(a);if(!Qo.checkUserPromptPrivacy(o,a,u,"summarize",c)){n.json({status:"skipped",reason:"private"});return}this.sessionManager.queueSummarize(c,s||A.happyPathError("SESSION","Missing last_user_message when queueing summary in SessionRoutes",{sessionId:c},void 0,""),i),this.ensureGeneratorRunning(c,"summarize"),this.eventBroadcaster.broadcastSummarizeQueued(),n.json({status:"queued"})});handleSessionInitByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,project:s,prompt:i}=r.body;if(!this.validateRequired(r,n,["claudeSessionId","project","prompt"]))return;let o=this.dbManager.getSessionStore(),c=o.createSDKSession(a,s,i),l=o.getPromptNumberFromUserPrompts(a)+1,d=ER(i);if(!d||d.trim()===""){A.debug("HOOK","Session init - prompt entirely private",{sessionId:c,promptNumber:l,originalLength:i.length}),n.json({sessionDbId:c,promptNumber:l,skipped:!0,reason:"private"});return}o.saveUserPrompt(a,l,d),A.info("SESSION","Session initialized via HTTP",{sessionId:c,promptNumber:l,project:s}),n.json({sessionDbId:c,promptNumber:l,skipped:!1})})};var bh=wt(require("path"),1),Ei=require("fs"),TR=require("os");pr();var Ql=class extends Nr{constructor(r,n,a,s,i,o){super();this.paginationHelper=r;this.dbManager=n;this.sessionManager=a;this.sseBroadcaster=s;this.workerService=i;this.startTime=o}setupRoutes(r){r.get("/api/observations",this.handleGetObservations.bind(this)),r.get("/api/summaries",this.handleGetSummaries.bind(this)),r.get("/api/prompts",this.handleGetPrompts.bind(this)),r.get("/api/observation/:id",this.handleGetObservationById.bind(this)),r.post("/api/observations/batch",this.handleGetObservationsByIds.bind(this)),r.get("/api/session/:id",this.handleGetSessionById.bind(this)),r.post("/api/sdk-sessions/batch",this.handleGetSdkSessionsByIds.bind(this)),r.get("/api/prompt/:id",this.handleGetPromptById.bind(this)),r.get("/api/stats",this.handleGetStats.bind(this)),r.get("/api/projects",this.handleGetProjects.bind(this)),r.get("/api/processing-status",this.handleGetProcessingStatus.bind(this)),r.post("/api/processing",this.handleSetProcessing.bind(this)),r.get("/api/pending-queue",this.handleGetPendingQueue.bind(this)),r.post("/api/pending-queue/process",this.handleProcessPendingQueue.bind(this)),r.post("/api/import",this.handleImport.bind(this))}handleGetObservations=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getObservations(a,s,i);n.json(o)});handleGetSummaries=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getSummaries(a,s,i);n.json(o)});handleGetPrompts=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getPrompts(a,s,i);n.json(o)});handleGetObservationById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getObservationById(a);if(!i){this.notFound(n,`Observation #${a} not found`);return}n.json(i)});handleGetObservationsByIds=this.wrapHandler((r,n)=>{let{ids:a,orderBy:s,limit:i,project:o}=r.body;if(!a||!Array.isArray(a)){this.badRequest(n,"ids must be an array of numbers");return}if(a.length===0){n.json([]);return}if(!a.every(l=>typeof l=="number"&&Number.isInteger(l))){this.badRequest(n,"All ids must be integers");return}let u=this.dbManager.getSessionStore().getObservationsByIds(a,{orderBy:s,limit:i,project:o});n.json(u)});handleGetSessionById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getSessionSummariesByIds([a]);if(i.length===0){this.notFound(n,`Session #${a} not found`);return}n.json(i[0])});handleGetSdkSessionsByIds=this.wrapHandler((r,n)=>{let{sdkSessionIds:a}=r.body;if(!Array.isArray(a)){this.badRequest(n,"sdkSessionIds must be an array");return}let i=this.dbManager.getSessionStore().getSdkSessionsBySessionIds(a);n.json(i)});handleGetPromptById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getUserPromptsByIds([a]);if(i.length===0){this.notFound(n,`Prompt #${a} not found`);return}n.json(i[0])});handleGetStats=this.wrapHandler((r,n)=>{let a=this.dbManager.getSessionStore().db,s=sr(),i=bh.default.join(s,"package.json"),c=JSON.parse((0,Ei.readFileSync)(i,"utf-8")).version,u=a.prepare("SELECT COUNT(*) as count FROM observations").get(),l=a.prepare("SELECT COUNT(*) as count FROM sdk_sessions").get(),d=a.prepare("SELECT COUNT(*) as count FROM session_summaries").get(),f=bh.default.join((0,TR.homedir)(),".claude-mem","claude-mem.db"),m=0;(0,Ei.existsSync)(f)&&(m=(0,Ei.statSync)(f).size);let g=Math.floor((Date.now()-this.startTime)/1e3),_=this.sessionManager.getActiveSessionCount(),p=this.sseBroadcaster.getClientCount();n.json({worker:{version:c,uptime:g,activeSessions:_,sseClients:p,port:qn()},database:{path:f,size:m,observations:u.count,sessions:l.count,summaries:d.count}})});handleGetProjects=this.wrapHandler((r,n)=>{let i=this.dbManager.getSessionStore().db.prepare(` +`)}getTypeIcon(e){return ct.getInstance().getTypeIcon(e)}formatDate(e){return new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}formatTime(e){return new Date(e).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}formatDateTime(e){return new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}estimateTokens(e){return e?Math.ceil(e.length/4):0}};var Zl=class{constructor(e,r){this.sseBroadcaster=e;this.workerService=r}broadcastNewPrompt(e){this.sseBroadcaster.broadcast({type:"new_prompt",prompt:e}),this.sseBroadcaster.broadcast({type:"processing_status",isProcessing:!0}),this.workerService.broadcastProcessingStatus()}broadcastSessionStarted(e,r){this.sseBroadcaster.broadcast({type:"session_started",sessionDbId:e,project:r}),this.workerService.broadcastProcessingStatus()}broadcastObservationQueued(e){this.sseBroadcaster.broadcast({type:"observation_queued",sessionDbId:e}),this.workerService.broadcastProcessingStatus()}broadcastSessionCompleted(e){this.sseBroadcaster.broadcast({type:"session_completed",timestamp:Date.now(),sessionDbId:e}),this.workerService.broadcastProcessingStatus()}broadcastSummarizeQueued(){this.workerService.broadcastProcessingStatus()}};var gh=wt(du(),1),gR=wt(vR(),1),yR=wt(require("path"),1);pr();lt();function _R(t){let e=[];e.push(gh.default.json({limit:"50mb"})),e.push((0,gR.default)()),e.push((a,s,i)=>{let c=[".html",".js",".css",".svg",".png",".jpg",".jpeg",".webp",".woff",".woff2",".ttf",".eot"].some(m=>a.path.endsWith(m));if(a.path.startsWith("/health")||a.path==="/"||c)return i();let u=Date.now(),l=`${a.method}-${Date.now()}`,d=t(a.method,a.path,a.body);A.info("HTTP",`\u2192 ${a.method} ${a.path}`,{requestId:l},d);let f=s.send.bind(s);s.send=function(m){let g=Date.now()-u;return A.info("HTTP",`\u2190 ${s.statusCode} ${a.path}`,{requestId:l,duration:`${g}ms`}),f(m)},i()});let r=sr(),n=yR.default.join(r,"plugin","ui");return e.push(gh.default.static(n)),e}function yh(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")){A.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 bR(t,e,r){if(!r||Object.keys(r).length===0||e.includes("/init"))return"";if(e.includes("/observations")){let n=r.tool_name||"?",a=r.tool_input;return`tool=${A.formatTool(n,a)}`}return e.includes("/summarize")?"requesting summary":""}var xR=wt(du(),1),Wl=wt(require("path"),1),Xl=require("fs");pr();lt();var Nr=class{wrapHandler(e){return(r,n)=>{try{let a=e(r,n);a instanceof Promise&&a.catch(s=>this.handleError(n,s))}catch(a){this.handleError(n,a)}}}parseIntParam(e,r,n){let a=parseInt(e.params[n],10);return isNaN(a)?(this.badRequest(r,`Invalid ${n}`),null):a}validateRequired(e,r,n){for(let a of n)if(e.body[a]===void 0||e.body[a]===null)return this.badRequest(r,`Missing ${a}`),!1;return!0}badRequest(e,r){e.status(400).json({error:r})}notFound(e,r){e.status(404).json({error:r})}handleError(e,r,n){A.failure("WORKER",n||"Request failed",{},r),e.status(500).json({error:r.message})}};var Kl=class extends Nr{constructor(r,n,a){super();this.sseBroadcaster=r;this.dbManager=n;this.sessionManager=a}setupRoutes(r){let n=sr();r.use(xR.default.static(Wl.default.join(n,"ui"))),r.get("/health",this.handleHealth.bind(this)),r.get("/",this.handleViewerUI.bind(this)),r.get("/stream",this.handleSSEStream.bind(this))}handleHealth=this.wrapHandler((r,n)=>{n.json({status:"ok",timestamp:Date.now()})});handleViewerUI=this.wrapHandler((r,n)=>{let a=sr(),i=[Wl.default.join(a,"ui","viewer.html"),Wl.default.join(a,"plugin","ui","viewer.html")].find(c=>(0,Xl.existsSync)(c));if(!i)throw new Error("Viewer UI not found at any expected location");let o=(0,Xl.readFileSync)(i,"utf-8");n.setHeader("Content-Type","text/html"),n.send(o)});handleSSEStream=this.wrapHandler((r,n)=>{n.setHeader("Content-Type","text/event-stream"),n.setHeader("Cache-Control","no-cache"),n.setHeader("Connection","keep-alive"),this.sseBroadcaster.addClient(n);let a=this.dbManager.getSessionStore().getAllProjects();this.sseBroadcaster.broadcast({type:"initial_load",projects:a,timestamp:Date.now()});let s=this.sessionManager.isAnySessionProcessing(),i=this.sessionManager.getTotalActiveWork();this.sseBroadcaster.broadcast({type:"processing_status",isProcessing:s,queueDepth:i})})};lt();lt();var SR=100;function cV(t){let e=(t.match(//g)||[]).length,r=(t.match(//g)||[]).length;return e+r}function wR(t){let e=cV(t);return e>SR&&A.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:e,maxAllowed:SR,contentLength:t.length}),t.replace(/[\s\S]*?<\/claude-mem-context>/g,"").replace(/[\s\S]*?<\/private>/g,"").trim()}function _h(t){return wR(t)}function ER(t){return wR(t)}var Jl=class{constructor(e,r){this.sessionManager=e;this.eventBroadcaster=r}async completeByDbId(e){await this.sessionManager.deleteSession(e),this.eventBroadcaster.broadcastSessionCompleted(e)}};lt();var Qo=class{static checkUserPromptPrivacy(e,r,n,a,s,i){let o=e.getUserPrompt(r,n);return!o||o.trim()===""?(A.debug("HOOK",`Skipping ${a} - user prompt was entirely private`,{sessionId:s,promptNumber:n,...i}),null):o}};$r();pr();var Yl=class extends Nr{constructor(r,n,a,s,i,o,c){super();this.sessionManager=r;this.dbManager=n;this.sdkAgent=a;this.geminiAgent=s;this.openRouterAgent=i;this.eventBroadcaster=o;this.workerService=c;this.completionHandler=new Jl(r,o)}completionHandler;getActiveAgent(){if(fh()){if(ph())return A.debug("SESSION","Using OpenRouter agent"),this.openRouterAgent;throw new Error("OpenRouter provider selected but no API key configured. Set CLAUDE_MEM_OPENROUTER_API_KEY in settings or OPENROUTER_API_KEY environment variable.")}if(dh()){if(lh())return A.debug("SESSION","Using Gemini agent"),this.geminiAgent;throw new Error("Gemini provider selected but no API key configured. Set CLAUDE_MEM_GEMINI_API_KEY in settings or GEMINI_API_KEY environment variable.")}return this.sdkAgent}getSelectedProvider(){return fh()&&ph()?"openrouter":dh()&&lh()?"gemini":"claude"}ensureGeneratorRunning(r,n){let a=this.sessionManager.getSession(r);if(!a)return;let s=this.getSelectedProvider();if(!a.generatorPromise){this.startGeneratorWithProvider(a,s,n);return}a.currentProvider&&a.currentProvider!==s&&A.info("SESSION","Provider changed, will switch after current generator finishes",{sessionId:r,currentProvider:a.currentProvider,selectedProvider:s,historyLength:a.conversationHistory.length})}startGeneratorWithProvider(r,n,a){if(!r)return;let s=n==="openrouter"?this.openRouterAgent:n==="gemini"?this.geminiAgent:this.sdkAgent,i=n==="openrouter"?"OpenRouter":n==="gemini"?"Gemini":"Claude SDK";A.info("SESSION",`Generator auto-starting (${a}) using ${i}`,{sessionId:r.sessionDbId,queueDepth:r.pendingMessages.length,historyLength:r.conversationHistory.length}),r.currentProvider=n,r.generatorPromise=s.startSession(r,this.workerService).catch(o=>{A.error("SESSION","Generator failed",{sessionId:r.sessionDbId,provider:n,error:o.message},o)}).finally(()=>{A.info("SESSION","Generator finished",{sessionId:r.sessionDbId}),r.generatorPromise=null,r.currentProvider=null,this.workerService.broadcastProcessingStatus()})}setupRoutes(r){r.post("/sessions/:sessionDbId/init",this.handleSessionInit.bind(this)),r.post("/sessions/:sessionDbId/observations",this.handleObservations.bind(this)),r.post("/sessions/:sessionDbId/summarize",this.handleSummarize.bind(this)),r.get("/sessions/:sessionDbId/status",this.handleSessionStatus.bind(this)),r.delete("/sessions/:sessionDbId",this.handleSessionDelete.bind(this)),r.post("/sessions/:sessionDbId/complete",this.handleSessionComplete.bind(this)),r.post("/api/sessions/init",this.handleSessionInitByClaudeId.bind(this)),r.post("/api/sessions/observations",this.handleObservationsByClaudeId.bind(this)),r.post("/api/sessions/summarize",this.handleSummarizeByClaudeId.bind(this))}handleSessionInit=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{userPrompt:s,promptNumber:i}=r.body;console.log("[SESSION-ROUTES] handleSessionInit called:",{sessionDbId:a,promptNumber:i,has_userPrompt:!!s});let o=this.sessionManager.initializeSession(a,s,i),c=this.dbManager.getSessionStore().getLatestUserPrompt(o.claudeSessionId);if(c){this.eventBroadcaster.broadcastNewPrompt({id:c.id,claude_session_id:c.claude_session_id,project:c.project,prompt_number:c.prompt_number,prompt_text:c.prompt_text,created_at_epoch:c.created_at_epoch});let u=Date.now(),l=c.prompt_text;this.dbManager.getChromaSync().syncUserPrompt(c.id,c.sdk_session_id,c.project,l,c.prompt_number,c.created_at_epoch).then(()=>{let d=Date.now()-u,f=l.length>60?l.substring(0,60)+"...":l;A.debug("CHROMA","User prompt synced",{promptId:c.id,duration:`${d}ms`,prompt:f})}).catch(d=>{A.warn("CHROMA","User prompt sync failed, continuing without vector search",{promptId:c.id,prompt:l.length>60?l.substring(0,60)+"...":l},d)})}this.startGeneratorWithProvider(o,this.getSelectedProvider(),"init"),this.eventBroadcaster.broadcastSessionStarted(a,o.project),n.json({status:"initialized",sessionDbId:a,port:qn()})});handleObservations=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{tool_name:s,tool_input:i,tool_response:o,prompt_number:c,cwd:u}=r.body;this.sessionManager.queueObservation(a,{tool_name:s,tool_input:i,tool_response:o,prompt_number:c,cwd:u}),this.ensureGeneratorRunning(a,"observation"),this.eventBroadcaster.broadcastObservationQueued(a),n.json({status:"queued"})});handleSummarize=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let{last_user_message:s,last_assistant_message:i}=r.body;this.sessionManager.queueSummarize(a,s,i),this.ensureGeneratorRunning(a,"summarize"),this.eventBroadcaster.broadcastSummarizeQueued(),n.json({status:"queued"})});handleSessionStatus=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");if(a===null)return;let s=this.sessionManager.getSession(a);if(!s){n.json({status:"not_found"});return}n.json({status:"active",sessionDbId:a,project:s.project,queueLength:s.pendingMessages.length,uptime:Date.now()-s.startTime})});handleSessionDelete=this.wrapHandler(async(r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");a!==null&&(await this.completionHandler.completeByDbId(a),n.json({status:"deleted"}))});handleSessionComplete=this.wrapHandler(async(r,n)=>{let a=this.parseIntParam(r,n,"sessionDbId");a!==null&&(await this.completionHandler.completeByDbId(a),n.json({success:!0}))});handleObservationsByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,tool_name:s,tool_input:i,tool_response:o,cwd:c}=r.body;if(!a)return this.badRequest(n,"Missing claudeSessionId");let u=We.loadFromFile(Or);if(new Set(u.CLAUDE_MEM_SKIP_TOOLS.split(",").map(y=>y.trim()).filter(Boolean)).has(s)){A.debug("SESSION","Skipping observation for tool",{tool_name:s}),n.json({status:"skipped",reason:"tool_excluded"});return}if(new Set(["Edit","Write","Read","NotebookEdit"]).has(s)&&i){let y=i.file_path||i.notebook_path;if(y&&y.includes("session-memory")){A.debug("SESSION","Skipping meta-observation for session-memory file",{tool_name:s,file_path:y}),n.json({status:"skipped",reason:"session_memory_meta"});return}}let f=this.dbManager.getSessionStore(),m=f.createSDKSession(a,"",""),g=f.getPromptNumberFromUserPrompts(a);if(!Qo.checkUserPromptPrivacy(f,a,g,"observation",m,{tool_name:s})){n.json({status:"skipped",reason:"private"});return}let p=i!==void 0?_h(JSON.stringify(i)):"{}",h=o!==void 0?_h(JSON.stringify(o)):"{}";this.sessionManager.queueObservation(m,{tool_name:s,tool_input:p,tool_response:h,prompt_number:g,cwd:c||A.happyPathError("SESSION","Missing cwd when queueing observation in SessionRoutes",{sessionId:m},{tool_name:s},"")}),this.ensureGeneratorRunning(m,"observation"),this.eventBroadcaster.broadcastObservationQueued(m),n.json({status:"queued"})});handleSummarizeByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,last_user_message:s,last_assistant_message:i}=r.body;if(!a)return this.badRequest(n,"Missing claudeSessionId");let o=this.dbManager.getSessionStore(),c=o.createSDKSession(a,"",""),u=o.getPromptNumberFromUserPrompts(a);if(!Qo.checkUserPromptPrivacy(o,a,u,"summarize",c)){n.json({status:"skipped",reason:"private"});return}this.sessionManager.queueSummarize(c,s||A.happyPathError("SESSION","Missing last_user_message when queueing summary in SessionRoutes",{sessionId:c},void 0,""),i),this.ensureGeneratorRunning(c,"summarize"),this.eventBroadcaster.broadcastSummarizeQueued(),n.json({status:"queued"})});handleSessionInitByClaudeId=this.wrapHandler((r,n)=>{let{claudeSessionId:a,project:s,prompt:i}=r.body;if(console.log("[SESSION-ROUTES] handleSessionInitByClaudeId called:",{claudeSessionId:a,project:s,prompt_length:i?.length}),!this.validateRequired(r,n,["claudeSessionId","project","prompt"]))return;let o=this.dbManager.getSessionStore(),c=o.createSDKSession(a,s,i);console.log("[SESSION-ROUTES] createSDKSession returned:",{sessionDbId:c,claudeSessionId:a});let u=o.getPromptNumberFromUserPrompts(a),l=u+1;console.log("[SESSION-ROUTES] Calculated promptNumber:",{sessionDbId:c,promptNumber:l,currentCount:u});let d=ER(i);if(!d||d.trim()===""){A.debug("HOOK","Session init - prompt entirely private",{sessionId:c,promptNumber:l,originalLength:i.length}),n.json({sessionDbId:c,promptNumber:l,skipped:!0,reason:"private"});return}o.saveUserPrompt(a,l,d),A.info("SESSION","Session initialized via HTTP",{sessionId:c,promptNumber:l,project:s}),n.json({sessionDbId:c,promptNumber:l,skipped:!1})})};var bh=wt(require("path"),1),Ei=require("fs"),TR=require("os");pr();var Ql=class extends Nr{constructor(r,n,a,s,i,o){super();this.paginationHelper=r;this.dbManager=n;this.sessionManager=a;this.sseBroadcaster=s;this.workerService=i;this.startTime=o}setupRoutes(r){r.get("/api/observations",this.handleGetObservations.bind(this)),r.get("/api/summaries",this.handleGetSummaries.bind(this)),r.get("/api/prompts",this.handleGetPrompts.bind(this)),r.get("/api/observation/:id",this.handleGetObservationById.bind(this)),r.post("/api/observations/batch",this.handleGetObservationsByIds.bind(this)),r.get("/api/session/:id",this.handleGetSessionById.bind(this)),r.post("/api/sdk-sessions/batch",this.handleGetSdkSessionsByIds.bind(this)),r.get("/api/prompt/:id",this.handleGetPromptById.bind(this)),r.get("/api/stats",this.handleGetStats.bind(this)),r.get("/api/projects",this.handleGetProjects.bind(this)),r.get("/api/processing-status",this.handleGetProcessingStatus.bind(this)),r.post("/api/processing",this.handleSetProcessing.bind(this)),r.get("/api/pending-queue",this.handleGetPendingQueue.bind(this)),r.post("/api/pending-queue/process",this.handleProcessPendingQueue.bind(this)),r.post("/api/import",this.handleImport.bind(this))}handleGetObservations=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getObservations(a,s,i);n.json(o)});handleGetSummaries=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getSummaries(a,s,i);n.json(o)});handleGetPrompts=this.wrapHandler((r,n)=>{let{offset:a,limit:s,project:i}=this.parsePaginationParams(r),o=this.paginationHelper.getPrompts(a,s,i);n.json(o)});handleGetObservationById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getObservationById(a);if(!i){this.notFound(n,`Observation #${a} not found`);return}n.json(i)});handleGetObservationsByIds=this.wrapHandler((r,n)=>{let{ids:a,orderBy:s,limit:i,project:o}=r.body;if(!a||!Array.isArray(a)){this.badRequest(n,"ids must be an array of numbers");return}if(a.length===0){n.json([]);return}if(!a.every(l=>typeof l=="number"&&Number.isInteger(l))){this.badRequest(n,"All ids must be integers");return}let u=this.dbManager.getSessionStore().getObservationsByIds(a,{orderBy:s,limit:i,project:o});n.json(u)});handleGetSessionById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getSessionSummariesByIds([a]);if(i.length===0){this.notFound(n,`Session #${a} not found`);return}n.json(i[0])});handleGetSdkSessionsByIds=this.wrapHandler((r,n)=>{let{sdkSessionIds:a}=r.body;if(!Array.isArray(a)){this.badRequest(n,"sdkSessionIds must be an array");return}let i=this.dbManager.getSessionStore().getSdkSessionsBySessionIds(a);n.json(i)});handleGetPromptById=this.wrapHandler((r,n)=>{let a=this.parseIntParam(r,n,"id");if(a===null)return;let i=this.dbManager.getSessionStore().getUserPromptsByIds([a]);if(i.length===0){this.notFound(n,`Prompt #${a} not found`);return}n.json(i[0])});handleGetStats=this.wrapHandler((r,n)=>{let a=this.dbManager.getSessionStore().db,s=sr(),i=bh.default.join(s,"package.json"),c=JSON.parse((0,Ei.readFileSync)(i,"utf-8")).version,u=a.prepare("SELECT COUNT(*) as count FROM observations").get(),l=a.prepare("SELECT COUNT(*) as count FROM sdk_sessions").get(),d=a.prepare("SELECT COUNT(*) as count FROM session_summaries").get(),f=bh.default.join((0,TR.homedir)(),".claude-mem","claude-mem.db"),m=0;(0,Ei.existsSync)(f)&&(m=(0,Ei.statSync)(f).size);let g=Math.floor((Date.now()-this.startTime)/1e3),_=this.sessionManager.getActiveSessionCount(),p=this.sseBroadcaster.getClientCount();n.json({worker:{version:c,uptime:g,activeSessions:_,sseClients:p,port:qn()},database:{path:f,size:m,observations:u.count,sessions:l.count,summaries:d.count}})});handleGetProjects=this.wrapHandler((r,n)=>{let i=this.dbManager.getSessionStore().db.prepare(` SELECT DISTINCT project FROM observations WHERE project IS NOT NULL diff --git a/src/hooks/new-hook.ts b/src/hooks/new-hook.ts index 0f991df6..54f1b8e6 100644 --- a/src/hooks/new-hook.ts +++ b/src/hooks/new-hook.ts @@ -24,8 +24,20 @@ async function newHook(input?: UserPromptSubmitInput): Promise { const { session_id, cwd, prompt } = input; const project = getProjectName(cwd); + console.log('[NEW-HOOK] Received hook input:', { + session_id: session_id, + has_prompt: !!prompt, + cwd: cwd + }); + const port = getWorkerPort(); + console.log('[NEW-HOOK] Calling /api/sessions/init:', { + claudeSessionId: session_id, + project, + prompt_length: prompt?.length + }); + // Initialize session via HTTP - handles DB operations and privacy checks const initResponse = await fetch(`http://127.0.0.1:${port}/api/sessions/init`, { method: 'POST', @@ -46,6 +58,12 @@ async function newHook(input?: UserPromptSubmitInput): Promise { const sessionDbId = initResult.sessionDbId; const promptNumber = initResult.promptNumber; + console.log('[NEW-HOOK] Received from /api/sessions/init:', { + sessionDbId: sessionDbId, + promptNumber: promptNumber, + skipped: initResult.skipped + }); + // Check if prompt was entirely private (worker performs privacy check) if (initResult.skipped && initResult.reason === 'private') { console.error(`[new-hook] Session ${sessionDbId}, prompt #${promptNumber} (fully private - skipped)`); @@ -59,6 +77,12 @@ async function newHook(input?: UserPromptSubmitInput): Promise { // /review 101 → review 101 (more semantic for observations) const cleanedPrompt = prompt.startsWith('/') ? prompt.substring(1) : prompt; + console.log('[NEW-HOOK] Calling /sessions/{sessionDbId}/init:', { + sessionDbId: sessionDbId, + promptNumber: promptNumber, + userPrompt_length: cleanedPrompt?.length + }); + // Initialize SDK agent session via HTTP (starts the agent!) const response = await fetch(`http://127.0.0.1:${port}/sessions/${sessionDbId}/init`, { method: 'POST', diff --git a/src/services/worker/SDKAgent.ts b/src/services/worker/SDKAgent.ts index 6a903828..d30fd832 100644 --- a/src/services/worker/SDKAgent.ts +++ b/src/services/worker/SDKAgent.ts @@ -64,6 +64,13 @@ export class SDKAgent { // Create message generator (event-driven) const messageGenerator = this.createMessageGenerator(session); + console.log('[SDK-AGENT] Starting SDK query with:', { + sessionDbId: session.sessionDbId, + claudeSessionId: session.claudeSessionId, + resume_parameter: session.claudeSessionId, + lastPromptNumber: session.lastPromptNumber + }); + // Run Agent SDK query loop const queryResult = query({ prompt: messageGenerator, @@ -197,7 +204,16 @@ export class SDKAgent { const mode = ModeManager.getInstance().getActiveMode(); // Build initial prompt - const initPrompt = session.lastPromptNumber === 1 + const isInitPrompt = session.lastPromptNumber === 1; + console.log('[SDK-AGENT] Creating message generator:', { + sessionDbId: session.sessionDbId, + claudeSessionId: session.claudeSessionId, + lastPromptNumber: session.lastPromptNumber, + isInitPrompt, + promptType: isInitPrompt ? 'INIT' : 'CONTINUATION' + }); + + const initPrompt = isInitPrompt ? buildInitPrompt(session.project, session.claudeSessionId, session.userPrompt, mode) : buildContinuationPrompt(session.userPrompt, session.lastPromptNumber, session.claudeSessionId, mode); diff --git a/src/services/worker/SessionManager.ts b/src/services/worker/SessionManager.ts index 9c16d32c..1bbda733 100644 --- a/src/services/worker/SessionManager.ts +++ b/src/services/worker/SessionManager.ts @@ -47,9 +47,21 @@ export class SessionManager { * Initialize a new session or return existing one */ initializeSession(sessionDbId: number, currentUserPrompt?: string, promptNumber?: number): ActiveSession { + console.log('[SESSION-MANAGER] initializeSession called:', { + sessionDbId, + promptNumber, + has_currentUserPrompt: !!currentUserPrompt + }); + // Check if already active let session = this.sessions.get(sessionDbId); if (session) { + console.log('[SESSION-MANAGER] Returning cached session:', { + sessionDbId, + claudeSessionId: session.claudeSessionId, + lastPromptNumber: session.lastPromptNumber + }); + // Refresh project from database in case it was updated by new-hook // This fixes the bug where sessions created with empty project get updated // in the database but the in-memory session still has the stale empty value @@ -86,6 +98,12 @@ export class SessionManager { // Fetch from database const dbSession = this.dbManager.getSessionById(sessionDbId); + console.log('[SESSION-MANAGER] Fetched session from database:', { + sessionDbId, + claude_session_id: dbSession.claude_session_id, + sdk_session_id: dbSession.sdk_session_id + }); + // Use currentUserPrompt if provided, otherwise fall back to database (first prompt) const userPrompt = currentUserPrompt || dbSession.user_prompt; @@ -123,6 +141,12 @@ export class SessionManager { currentProvider: null // Will be set when generator starts }; + console.log('[SESSION-MANAGER] Creating new session object:', { + sessionDbId, + claudeSessionId: dbSession.claude_session_id, + lastPromptNumber: promptNumber || this.dbManager.getSessionStore().getPromptNumberFromUserPrompts(dbSession.claude_session_id) + }); + this.sessions.set(sessionDbId, session); // Create event emitter for queue notifications diff --git a/src/services/worker/http/routes/SessionRoutes.ts b/src/services/worker/http/routes/SessionRoutes.ts index 6ebb4586..7691e0a8 100644 --- a/src/services/worker/http/routes/SessionRoutes.ts +++ b/src/services/worker/http/routes/SessionRoutes.ts @@ -173,6 +173,12 @@ export class SessionRoutes extends BaseRouteHandler { if (sessionDbId === null) return; const { userPrompt, promptNumber } = req.body; + console.log('[SESSION-ROUTES] handleSessionInit called:', { + sessionDbId, + promptNumber, + has_userPrompt: !!userPrompt + }); + const session = this.sessionManager.initializeSession(sessionDbId, userPrompt, promptNumber); // Get the latest user_prompt for this session to sync to Chroma @@ -482,6 +488,12 @@ export class SessionRoutes extends BaseRouteHandler { private handleSessionInitByClaudeId = this.wrapHandler((req: Request, res: Response): void => { const { claudeSessionId, project, prompt } = req.body; + console.log('[SESSION-ROUTES] handleSessionInitByClaudeId called:', { + claudeSessionId, + project, + prompt_length: prompt?.length + }); + // Validate required parameters if (!this.validateRequired(req, res, ['claudeSessionId', 'project', 'prompt'])) { return; @@ -492,10 +504,21 @@ export class SessionRoutes extends BaseRouteHandler { // Step 1: Create/get SDK session (idempotent INSERT OR IGNORE) const sessionDbId = store.createSDKSession(claudeSessionId, project, prompt); + console.log('[SESSION-ROUTES] createSDKSession returned:', { + sessionDbId, + claudeSessionId + }); + // Step 2: Get next prompt number from user_prompts count const currentCount = store.getPromptNumberFromUserPrompts(claudeSessionId); const promptNumber = currentCount + 1; + console.log('[SESSION-ROUTES] Calculated promptNumber:', { + sessionDbId, + promptNumber, + currentCount + }); + // Step 3: Strip privacy tags from prompt const cleanedPrompt = stripMemoryTagsFromPrompt(prompt);