From c2fbb39fd0549db25c79f36466f00e20518cdc62 Mon Sep 17 00:00:00 2001 From: Alex Newman Date: Thu, 1 Jan 2026 20:46:39 -0500 Subject: [PATCH] Refactor error handling in WorkerService and SDKAgent - Removed unnecessary logging for aborted sessions in WorkerService. - Simplified the finally block in WorkerService by removing crash recovery logging. - Cleaned up the try-catch structure in SDKAgent's startSession method, removing redundant error handling. --- plugin/scripts/worker-service.cjs | 6 +++--- src/services/worker-service.ts | 15 --------------- src/services/worker/SDKAgent.ts | 17 +++++------------ 3 files changed, 8 insertions(+), 30 deletions(-) diff --git a/plugin/scripts/worker-service.cjs b/plugin/scripts/worker-service.cjs index cd827ba4..3f0d1baf 100755 --- a/plugin/scripts/worker-service.cjs +++ b/plugin/scripts/worker-service.cjs @@ -1041,8 +1041,8 @@ ${n.prompts.header_memory_continued}`}yn();rn();ui();var hS=require("path"),H4=r ...iss, path: iss.path ? [${Go(y)}, ...iss.path] : [${Go(y)}] })));`),p.write(`newResult[${Go(y)}] = ${g}.value`)}p.write("payload.value = newResult;"),p.write("return payload;");let m=p.compile();return(y,g)=>m(d,y,g)},i,a=cd,s=!TS.jitless,c=s&&vD.value,u=e.catchall,l;t._zod.parse=(d,p)=>{l??(l=r.value);let f=d.value;if(!a(f))return d.issues.push({expected:"object",code:"invalid_type",input:f,inst:t}),d;let v=[];if(s&&c&&p?.async===!1&&p.jitless!==!0)i||(i=n(e.shape)),d=i(d,p);else{d.value={};let g=l.shape;for(let b of l.keys){let S=g[b],x=S._zod.run({value:f[b],issues:[]},p),$=S._zod.optin==="optional"&&S._zod.optout==="optional";x instanceof Promise?v.push(x.then(E=>$?m4(E,d,b,f):Xm(E,d,b))):$?m4(x,d,b,f):Xm(x,d,b)}}if(!u)return v.length?Promise.all(v).then(()=>d):d;let _=[],h=l.keySet,m=u._zod,y=m.def.type;for(let g of Object.keys(f)){if(h.has(g))continue;if(y==="never"){_.push(g);continue}let b=m.run({value:f[g],issues:[]},p);b instanceof Promise?v.push(b.then(S=>Xm(S,d,g))):Xm(b,d,g)}return _.length&&d.issues.push({code:"unrecognized_keys",keys:_,input:f,inst:t}),v.length?Promise.all(v).then(()=>d):d}});function h4(t,e,r,n){for(let i of t)if(i.issues.length===0)return e.value=i.value,e;return e.issues.push({code:"invalid_union",input:e.value,inst:r,errors:t.map(i=>i.issues.map(a=>Ai(a,n,ji())))}),e}var AD=X("$ZodUnion",(t,e)=>{Ut.init(t,e),Dt(t._zod,"optin",()=>e.options.some(r=>r._zod.optin==="optional")?"optional":void 0),Dt(t._zod,"optout",()=>e.options.some(r=>r._zod.optout==="optional")?"optional":void 0),Dt(t._zod,"values",()=>{if(e.options.every(r=>r._zod.values))return new Set(e.options.flatMap(r=>Array.from(r._zod.values)))}),Dt(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=>Sh(n.source)).join("|")})$`)}}),t._zod.parse=(r,n)=>{let i=!1,a=[];for(let s of e.options){let o=s._zod.run({value:r.value,issues:[]},n);if(o instanceof Promise)a.push(o),i=!0;else{if(o.issues.length===0)return o;a.push(o)}}return i?Promise.all(a).then(s=>h4(s,r,t,n)):h4(a,r,t,n)}}),Vse=X("$ZodDiscriminatedUnion",(t,e)=>{AD.init(t,e);let r=t._zod.parse;Dt(t._zod,"propValues",()=>{let i={};for(let a of e.options){let s=a._zod.propValues;if(!s||Object.keys(s).length===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(a)}"`);for(let[o,c]of Object.entries(s)){i[o]||(i[o]=new Set);for(let u of c)i[o].add(u)}}return i});let n=xh(()=>{let i=e.options,a=new Map;for(let s of i){let o=s._zod.propValues[e.discriminator];if(!o||o.size===0)throw new Error(`Invalid discriminated union option at index "${e.options.indexOf(s)}"`);for(let c of o){if(a.has(c))throw new Error(`Duplicate discriminator value "${String(c)}"`);a.set(c,s)}}return a});t._zod.parse=(i,a)=>{let s=i.value;if(!cd(s))return i.issues.push({code:"invalid_type",expected:"object",input:s,inst:t}),i;let o=n.value.get(s?.[e.discriminator]);return o?o._zod.run(i,a):e.unionFallback?r(i,a):(i.issues.push({code:"invalid_union",errors:[],note:"No matching discriminator",input:s,path:[e.discriminator],inst:t}),i)}}),Bse=X("$ZodIntersection",(t,e)=>{Ut.init(t,e),t._zod.parse=(r,n)=>{let i=r.value,a=e.left._zod.run({value:i,issues:[]},n),s=e.right._zod.run({value:i,issues:[]},n);return a instanceof Promise||s instanceof Promise?Promise.all([a,s]).then(([c,u])=>g4(r,c,u)):g4(r,a,s)}});function RS(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(ud(t)&&ud(e)){let r=Object.keys(e),n=Object.keys(t).filter(a=>r.indexOf(a)!==-1),i={...t,...e};for(let a of n){let s=RS(t[a],e[a]);if(!s.valid)return{valid:!1,mergeErrorPath:[a,...s.mergeErrorPath]};i[a]=s.data}return{valid:!0,data:i}}if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return{valid:!1,mergeErrorPath:[]};let r=[];for(let n=0;n{Ut.init(t,e),t._zod.parse=(r,n)=>{let i=r.value;if(!ud(i))return r.issues.push({expected:"record",code:"invalid_type",input:i,inst:t}),r;let a=[];if(e.keyType._zod.values){let s=e.keyType._zod.values;r.value={};for(let c of s)if(typeof c=="string"||typeof c=="number"||typeof c=="symbol"){let u=e.valueType._zod.run({value:i[c],issues:[]},n);u instanceof Promise?a.push(u.then(l=>{l.issues.length&&r.issues.push(...fa(c,l.issues)),r.value[c]=l.value})):(u.issues.length&&r.issues.push(...fa(c,u.issues)),r.value[c]=u.value)}let o;for(let c in i)s.has(c)||(o=o??[],o.push(c));o&&o.length>0&&r.issues.push({code:"unrecognized_keys",input:i,inst:t,keys:o})}else{r.value={};for(let s of Reflect.ownKeys(i)){if(s==="__proto__")continue;let o=e.keyType._zod.run({value:s,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=>Ai(u,n,ji())),input:s,path:[s],inst:t}),r.value[o.value]=o.value;continue}let c=e.valueType._zod.run({value:i[s],issues:[]},n);c instanceof Promise?a.push(c.then(u=>{u.issues.length&&r.issues.push(...fa(s,u.issues)),r.value[o.value]=u.value})):(c.issues.length&&r.issues.push(...fa(s,c.issues)),r.value[o.value]=c.value)}}return a.length?Promise.all(a).then(()=>r):r}}),Kse=X("$ZodEnum",(t,e)=>{Ut.init(t,e);let r=mD(e.entries);t._zod.values=new Set(r),t._zod.pattern=new RegExp(`^(${r.filter(n=>yD.has(typeof n)).map(n=>typeof n=="string"?fc(n):n.toString()).join("|")})$`),t._zod.parse=(n,i)=>{let a=n.value;return t._zod.values.has(a)||n.issues.push({code:"invalid_value",values:r,input:a,inst:t}),n}}),Wse=X("$ZodLiteral",(t,e)=>{Ut.init(t,e),t._zod.values=new Set(e.values),t._zod.pattern=new RegExp(`^(${e.values.map(r=>typeof r=="string"?fc(r):r?r.toString():String(r)).join("|")})$`),t._zod.parse=(r,n)=>{let i=r.value;return t._zod.values.has(i)||r.issues.push({code:"invalid_value",values:e.values,input:i,inst:t}),r}}),Jse=X("$ZodTransform",(t,e)=>{Ut.init(t,e),t._zod.parse=(r,n)=>{let i=e.transform(r.value,r);if(n.async)return(i instanceof Promise?i:Promise.resolve(i)).then(s=>(r.value=s,r));if(i instanceof Promise)throw new us;return r.value=i,r}}),Xse=X("$ZodOptional",(t,e)=>{Ut.init(t,e),t._zod.optin="optional",t._zod.optout="optional",Dt(t._zod,"values",()=>e.innerType._zod.values?new Set([...e.innerType._zod.values,void 0]):void 0),Dt(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${Sh(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)}),Yse=X("$ZodNullable",(t,e)=>{Ut.init(t,e),Dt(t._zod,"optin",()=>e.innerType._zod.optin),Dt(t._zod,"optout",()=>e.innerType._zod.optout),Dt(t._zod,"pattern",()=>{let r=e.innerType._zod.pattern;return r?new RegExp(`^(${Sh(r.source)}|null)$`):void 0}),Dt(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)}),Qse=X("$ZodDefault",(t,e)=>{Ut.init(t,e),t._zod.optin="optional",Dt(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{if(r.value===void 0)return r.value=e.defaultValue,r;let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(a=>v4(a,e)):v4(i,e)}});function v4(t,e){return t.value===void 0&&(t.value=e.defaultValue),t}var eoe=X("$ZodPrefault",(t,e)=>{Ut.init(t,e),t._zod.optin="optional",Dt(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))}),toe=X("$ZodNonOptional",(t,e)=>{Ut.init(t,e),Dt(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 i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(a=>y4(a,t)):y4(i,t)}});function y4(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 roe=X("$ZodCatch",(t,e)=>{Ut.init(t,e),t._zod.optin="optional",Dt(t._zod,"optout",()=>e.innerType._zod.optout),Dt(t._zod,"values",()=>e.innerType._zod.values),t._zod.parse=(r,n)=>{let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(a=>(r.value=a.value,a.issues.length&&(r.value=e.catchValue({...r,error:{issues:a.issues.map(s=>Ai(s,n,ji()))},input:r.value}),r.issues=[]),r)):(r.value=i.value,i.issues.length&&(r.value=e.catchValue({...r,error:{issues:i.issues.map(a=>Ai(a,n,ji()))},input:r.value}),r.issues=[]),r)}}),noe=X("$ZodPipe",(t,e)=>{Ut.init(t,e),Dt(t._zod,"values",()=>e.in._zod.values),Dt(t._zod,"optin",()=>e.in._zod.optin),Dt(t._zod,"optout",()=>e.out._zod.optout),t._zod.parse=(r,n)=>{let i=e.in._zod.run(r,n);return i instanceof Promise?i.then(a=>_4(a,e,n)):_4(i,e,n)}});function _4(t,e,r){return Ko(t)?t:e.out._zod.run({value:t.value,issues:t.issues},r)}var ioe=X("$ZodReadonly",(t,e)=>{Ut.init(t,e),Dt(t._zod,"propValues",()=>e.innerType._zod.propValues),Dt(t._zod,"values",()=>e.innerType._zod.values),Dt(t._zod,"optin",()=>e.innerType._zod.optin),Dt(t._zod,"optout",()=>e.innerType._zod.optout),t._zod.parse=(r,n)=>{let i=e.innerType._zod.run(r,n);return i instanceof Promise?i.then(b4):b4(i)}});function b4(t){return t.value=Object.freeze(t.value),t}var aoe=X("$ZodCustom",(t,e)=>{Br.init(t,e),Ut.init(t,e),t._zod.parse=(r,n)=>r,t._zod.check=r=>{let n=r.value,i=e.fn(n);if(i instanceof Promise)return i.then(a=>x4(a,r,n,t));x4(i,r,n,t)}});function x4(t,e,r,n){if(!t){let i={code:"custom",input:r,inst:n,path:[...n._zod.def.path??[]],continue:!n._zod.def.abort};n._zod.def.params&&(i.params=n._zod.def.params),e.issues.push(xD(i))}}var soe=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},ooe=()=>{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 ${soe(n.input)}`;case"invalid_value":return n.values.length===1?`Invalid input: expected ${VS(n.values[0])}`:`Invalid option: expected one of ${IS(n.values,"|")}`;case"too_big":{let i=n.inclusive?"<=":"<",a=e(n.origin);return a?`Too big: expected ${n.origin??"value"} to have ${i}${n.maximum.toString()} ${a.unit??"elements"}`:`Too big: expected ${n.origin??"value"} to be ${i}${n.maximum.toString()}`}case"too_small":{let i=n.inclusive?">=":">",a=e(n.origin);return a?`Too small: expected ${n.origin} to have ${i}${n.minimum.toString()} ${a.unit}`:`Too small: expected ${n.origin} to be ${i}${n.minimum.toString()}`}case"invalid_format":{let i=n;return i.format==="starts_with"?`Invalid string: must start with "${i.prefix}"`:i.format==="ends_with"?`Invalid string: must end with "${i.suffix}"`:i.format==="includes"?`Invalid string: must include "${i.includes}"`:i.format==="regex"?`Invalid string: must match pattern ${i.pattern}`:`Invalid ${r[i.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":""}: ${IS(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 coe(){return{localeError:ooe()}}var ZEe=Symbol("ZodOutput"),HEe=Symbol("ZodInput"),CS=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 uoe(){return new CS}var Ym=uoe();function loe(t,e){return new t({type:"string",...Pe(e)})}function doe(t,e){return new t({type:"string",format:"email",check:"string_format",abort:!1,...Pe(e)})}function w4(t,e){return new t({type:"string",format:"guid",check:"string_format",abort:!1,...Pe(e)})}function poe(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,...Pe(e)})}function foe(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v4",...Pe(e)})}function moe(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v6",...Pe(e)})}function hoe(t,e){return new t({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v7",...Pe(e)})}function goe(t,e){return new t({type:"string",format:"url",check:"string_format",abort:!1,...Pe(e)})}function voe(t,e){return new t({type:"string",format:"emoji",check:"string_format",abort:!1,...Pe(e)})}function yoe(t,e){return new t({type:"string",format:"nanoid",check:"string_format",abort:!1,...Pe(e)})}function _oe(t,e){return new t({type:"string",format:"cuid",check:"string_format",abort:!1,...Pe(e)})}function boe(t,e){return new t({type:"string",format:"cuid2",check:"string_format",abort:!1,...Pe(e)})}function xoe(t,e){return new t({type:"string",format:"ulid",check:"string_format",abort:!1,...Pe(e)})}function woe(t,e){return new t({type:"string",format:"xid",check:"string_format",abort:!1,...Pe(e)})}function Soe(t,e){return new t({type:"string",format:"ksuid",check:"string_format",abort:!1,...Pe(e)})}function $oe(t,e){return new t({type:"string",format:"ipv4",check:"string_format",abort:!1,...Pe(e)})}function Eoe(t,e){return new t({type:"string",format:"ipv6",check:"string_format",abort:!1,...Pe(e)})}function koe(t,e){return new t({type:"string",format:"cidrv4",check:"string_format",abort:!1,...Pe(e)})}function Toe(t,e){return new t({type:"string",format:"cidrv6",check:"string_format",abort:!1,...Pe(e)})}function Ioe(t,e){return new t({type:"string",format:"base64",check:"string_format",abort:!1,...Pe(e)})}function Poe(t,e){return new t({type:"string",format:"base64url",check:"string_format",abort:!1,...Pe(e)})}function Ooe(t,e){return new t({type:"string",format:"e164",check:"string_format",abort:!1,...Pe(e)})}function Roe(t,e){return new t({type:"string",format:"jwt",check:"string_format",abort:!1,...Pe(e)})}function Coe(t,e){return new t({type:"string",format:"datetime",check:"string_format",offset:!1,local:!1,precision:null,...Pe(e)})}function Noe(t,e){return new t({type:"string",format:"date",check:"string_format",...Pe(e)})}function joe(t,e){return new t({type:"string",format:"time",check:"string_format",precision:null,...Pe(e)})}function Aoe(t,e){return new t({type:"string",format:"duration",check:"string_format",...Pe(e)})}function Moe(t,e){return new t({type:"number",checks:[],...Pe(e)})}function zoe(t,e){return new t({type:"number",check:"number_format",abort:!1,format:"safeint",...Pe(e)})}function Doe(t,e){return new t({type:"boolean",...Pe(e)})}function Uoe(t,e){return new t({type:"null",...Pe(e)})}function qoe(t){return new t({type:"unknown"})}function Loe(t,e){return new t({type:"never",...Pe(e)})}function S4(t,e){return new RD({check:"less_than",...Pe(e),value:t,inclusive:!1})}function pS(t,e){return new RD({check:"less_than",...Pe(e),value:t,inclusive:!0})}function $4(t,e){return new CD({check:"greater_than",...Pe(e),value:t,inclusive:!1})}function fS(t,e){return new CD({check:"greater_than",...Pe(e),value:t,inclusive:!0})}function E4(t,e){return new ese({check:"multiple_of",...Pe(e),value:t})}function MD(t,e){return new rse({check:"max_length",...Pe(e),maximum:t})}function ch(t,e){return new nse({check:"min_length",...Pe(e),minimum:t})}function zD(t,e){return new ise({check:"length_equals",...Pe(e),length:t})}function Foe(t,e){return new ase({check:"string_format",format:"regex",...Pe(e),pattern:t})}function Zoe(t){return new sse({check:"string_format",format:"lowercase",...Pe(t)})}function Hoe(t){return new ose({check:"string_format",format:"uppercase",...Pe(t)})}function Voe(t,e){return new cse({check:"string_format",format:"includes",...Pe(e),includes:t})}function Boe(t,e){return new use({check:"string_format",format:"starts_with",...Pe(e),prefix:t})}function Goe(t,e){return new lse({check:"string_format",format:"ends_with",...Pe(e),suffix:t})}function dd(t){return new dse({check:"overwrite",tx:t})}function Koe(t){return dd(e=>e.normalize(t))}function Woe(){return dd(t=>t.trim())}function Joe(){return dd(t=>t.toLowerCase())}function Xoe(){return dd(t=>t.toUpperCase())}function Yoe(t,e,r){return new t({type:"array",element:e,...Pe(r)})}function Qoe(t,e,r){let n=Pe(r);return n.abort??(n.abort=!0),new t({type:"custom",check:"custom",fn:e,...n})}function ece(t,e,r){return new t({type:"custom",check:"custom",fn:e,...Pe(r)})}var DD={};C4(DD,{time:()=>HD,duration:()=>BD,datetime:()=>qD,date:()=>FD,ZodISOTime:()=>ZD,ZodISODuration:()=>VD,ZodISODateTime:()=>UD,ZodISODate:()=>LD});var UD=X("ZodISODateTime",(t,e)=>{$se.init(t,e),Vt.init(t,e)});function qD(t){return Coe(UD,t)}var LD=X("ZodISODate",(t,e)=>{Ese.init(t,e),Vt.init(t,e)});function FD(t){return Noe(LD,t)}var ZD=X("ZodISOTime",(t,e)=>{kse.init(t,e),Vt.init(t,e)});function HD(t){return joe(ZD,t)}var VD=X("ZodISODuration",(t,e)=>{Tse.init(t,e),Vt.init(t,e)});function BD(t){return Aoe(VD,t)}var GD=(t,e)=>{SD.init(t,e),t.name="ZodError",Object.defineProperties(t,{format:{value:r=>xae(t,r)},flatten:{value:r=>bae(t,r)},addIssue:{value:r=>t.issues.push(r)},addIssues:{value:r=>t.issues.push(...r)},isEmpty:{get(){return t.issues.length===0}}})},VEe=X("ZodError",GD),kh=X("ZodError",GD,{Parent:Error}),tce=wae(kh),rce=Sae(kh),nce=ED(kh),ice=kD(kh),Ht=X("ZodType",(t,e)=>(Ut.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)=>tce(t,r,n,{callee:t.parse}),t.safeParse=(r,n)=>nce(t,r,n),t.parseAsync=async(r,n)=>rce(t,r,n,{callee:t.parseAsync}),t.safeParseAsync=async(r,n)=>ice(t,r,n),t.spa=t.safeParseAsync,t.refine=(r,n)=>t.check(Kce(r,n)),t.superRefine=r=>t.check(Wce(r)),t.overwrite=r=>t.check(dd(r)),t.optional=()=>xe(t),t.nullable=()=>I4(t),t.nullish=()=>xe(I4(t)),t.nonoptional=r=>qce(t,r),t.array=()=>at(t),t.or=r=>Ft([t,r]),t.and=r=>GS(t,r),t.transform=r=>jS(t,e2(r)),t.default=r=>zce(t,r),t.prefault=r=>Uce(t,r),t.catch=r=>Fce(t,r),t.pipe=r=>jS(t,r),t.readonly=()=>Vce(t),t.describe=r=>{let n=t.clone();return Ym.add(n,{description:r}),n},Object.defineProperty(t,"description",{get(){return Ym.get(t)?.description},configurable:!0}),t.meta=(...r)=>{if(r.length===0)return Ym.get(t);let n=t.clone();return Ym.add(n,r[0]),n},t.isOptional=()=>t.safeParse(void 0).success,t.isNullable=()=>t.safeParse(null).success,t)),KD=X("_ZodString",(t,e)=>{BS.init(t,e),Ht.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(Foe(...n)),t.includes=(...n)=>t.check(Voe(...n)),t.startsWith=(...n)=>t.check(Boe(...n)),t.endsWith=(...n)=>t.check(Goe(...n)),t.min=(...n)=>t.check(ch(...n)),t.max=(...n)=>t.check(MD(...n)),t.length=(...n)=>t.check(zD(...n)),t.nonempty=(...n)=>t.check(ch(1,...n)),t.lowercase=n=>t.check(Zoe(n)),t.uppercase=n=>t.check(Hoe(n)),t.trim=()=>t.check(Woe()),t.normalize=(...n)=>t.check(Koe(...n)),t.toLowerCase=()=>t.check(Joe()),t.toUpperCase=()=>t.check(Xoe())}),ace=X("ZodString",(t,e)=>{BS.init(t,e),KD.init(t,e),t.email=r=>t.check(doe(sce,r)),t.url=r=>t.check(goe(oce,r)),t.jwt=r=>t.check(Roe(wce,r)),t.emoji=r=>t.check(voe(cce,r)),t.guid=r=>t.check(w4(k4,r)),t.uuid=r=>t.check(poe(Qm,r)),t.uuidv4=r=>t.check(foe(Qm,r)),t.uuidv6=r=>t.check(moe(Qm,r)),t.uuidv7=r=>t.check(hoe(Qm,r)),t.nanoid=r=>t.check(yoe(uce,r)),t.guid=r=>t.check(w4(k4,r)),t.cuid=r=>t.check(_oe(lce,r)),t.cuid2=r=>t.check(boe(dce,r)),t.ulid=r=>t.check(xoe(pce,r)),t.base64=r=>t.check(Ioe(_ce,r)),t.base64url=r=>t.check(Poe(bce,r)),t.xid=r=>t.check(woe(fce,r)),t.ksuid=r=>t.check(Soe(mce,r)),t.ipv4=r=>t.check($oe(hce,r)),t.ipv6=r=>t.check(Eoe(gce,r)),t.cidrv4=r=>t.check(koe(vce,r)),t.cidrv6=r=>t.check(Toe(yce,r)),t.e164=r=>t.check(Ooe(xce,r)),t.datetime=r=>t.check(qD(r)),t.date=r=>t.check(FD(r)),t.time=r=>t.check(HD(r)),t.duration=r=>t.check(BD(r))});function K(t){return loe(ace,t)}var Vt=X("ZodStringFormat",(t,e)=>{Lt.init(t,e),KD.init(t,e)}),sce=X("ZodEmail",(t,e)=>{hse.init(t,e),Vt.init(t,e)}),k4=X("ZodGUID",(t,e)=>{fse.init(t,e),Vt.init(t,e)}),Qm=X("ZodUUID",(t,e)=>{mse.init(t,e),Vt.init(t,e)}),oce=X("ZodURL",(t,e)=>{gse.init(t,e),Vt.init(t,e)}),cce=X("ZodEmoji",(t,e)=>{vse.init(t,e),Vt.init(t,e)}),uce=X("ZodNanoID",(t,e)=>{yse.init(t,e),Vt.init(t,e)}),lce=X("ZodCUID",(t,e)=>{_se.init(t,e),Vt.init(t,e)}),dce=X("ZodCUID2",(t,e)=>{bse.init(t,e),Vt.init(t,e)}),pce=X("ZodULID",(t,e)=>{xse.init(t,e),Vt.init(t,e)}),fce=X("ZodXID",(t,e)=>{wse.init(t,e),Vt.init(t,e)}),mce=X("ZodKSUID",(t,e)=>{Sse.init(t,e),Vt.init(t,e)}),hce=X("ZodIPv4",(t,e)=>{Ise.init(t,e),Vt.init(t,e)}),gce=X("ZodIPv6",(t,e)=>{Pse.init(t,e),Vt.init(t,e)}),vce=X("ZodCIDRv4",(t,e)=>{Ose.init(t,e),Vt.init(t,e)}),yce=X("ZodCIDRv6",(t,e)=>{Rse.init(t,e),Vt.init(t,e)}),_ce=X("ZodBase64",(t,e)=>{Cse.init(t,e),Vt.init(t,e)}),bce=X("ZodBase64URL",(t,e)=>{jse.init(t,e),Vt.init(t,e)}),xce=X("ZodE164",(t,e)=>{Ase.init(t,e),Vt.init(t,e)}),wce=X("ZodJWT",(t,e)=>{zse.init(t,e),Vt.init(t,e)}),WD=X("ZodNumber",(t,e)=>{jD.init(t,e),Ht.init(t,e),t.gt=(n,i)=>t.check($4(n,i)),t.gte=(n,i)=>t.check(fS(n,i)),t.min=(n,i)=>t.check(fS(n,i)),t.lt=(n,i)=>t.check(S4(n,i)),t.lte=(n,i)=>t.check(pS(n,i)),t.max=(n,i)=>t.check(pS(n,i)),t.int=n=>t.check(T4(n)),t.safe=n=>t.check(T4(n)),t.positive=n=>t.check($4(0,n)),t.nonnegative=n=>t.check(fS(0,n)),t.negative=n=>t.check(S4(0,n)),t.nonpositive=n=>t.check(pS(0,n)),t.multipleOf=(n,i)=>t.check(E4(n,i)),t.step=(n,i)=>t.check(E4(n,i)),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 Ct(t){return Moe(WD,t)}var Sce=X("ZodNumberFormat",(t,e)=>{Dse.init(t,e),WD.init(t,e)});function T4(t){return zoe(Sce,t)}var $ce=X("ZodBoolean",(t,e)=>{Use.init(t,e),Ht.init(t,e)});function _r(t){return Doe($ce,t)}var Ece=X("ZodNull",(t,e)=>{qse.init(t,e),Ht.init(t,e)});function JD(t){return Uoe(Ece,t)}var kce=X("ZodUnknown",(t,e)=>{Lse.init(t,e),Ht.init(t,e)});function tr(){return qoe(kce)}var Tce=X("ZodNever",(t,e)=>{Fse.init(t,e),Ht.init(t,e)});function Ice(t){return Loe(Tce,t)}var Pce=X("ZodArray",(t,e)=>{Zse.init(t,e),Ht.init(t,e),t.element=e.element,t.min=(r,n)=>t.check(ch(r,n)),t.nonempty=r=>t.check(ch(1,r)),t.max=(r,n)=>t.check(MD(r,n)),t.length=(r,n)=>t.check(zD(r,n)),t.unwrap=()=>t.element});function at(t,e){return Yoe(Pce,t,e)}var XD=X("ZodObject",(t,e)=>{Hse.init(t,e),Ht.init(t,e),zt.defineLazy(t,"shape",()=>e.shape),t.keyof=()=>br(Object.keys(t._zod.def.shape)),t.catchall=r=>t.clone({...t._zod.def,catchall:r}),t.passthrough=()=>t.clone({...t._zod.def,catchall:tr()}),t.loose=()=>t.clone({...t._zod.def,catchall:tr()}),t.strict=()=>t.clone({...t._zod.def,catchall:Ice()}),t.strip=()=>t.clone({...t._zod.def,catchall:void 0}),t.extend=r=>zt.extend(t,r),t.merge=r=>zt.merge(t,r),t.pick=r=>zt.pick(t,r),t.omit=r=>zt.omit(t,r),t.partial=(...r)=>zt.partial(t2,t,r[0]),t.required=(...r)=>zt.required(r2,t,r[0])});function ie(t,e){let r={type:"object",get shape(){return zt.assignProp(this,"shape",{...t}),this.shape},...zt.normalizeParams(e)};return new XD(r)}function Fn(t,e){return new XD({type:"object",get shape(){return zt.assignProp(this,"shape",{...t}),this.shape},catchall:tr(),...zt.normalizeParams(e)})}var YD=X("ZodUnion",(t,e)=>{AD.init(t,e),Ht.init(t,e),t.options=e.options});function Ft(t,e){return new YD({type:"union",options:t,...zt.normalizeParams(e)})}var Oce=X("ZodDiscriminatedUnion",(t,e)=>{YD.init(t,e),Vse.init(t,e)});function QD(t,e,r){return new Oce({type:"union",options:e,discriminator:t,...zt.normalizeParams(r)})}var Rce=X("ZodIntersection",(t,e)=>{Bse.init(t,e),Ht.init(t,e)});function GS(t,e){return new Rce({type:"intersection",left:t,right:e})}var Cce=X("ZodRecord",(t,e)=>{Gse.init(t,e),Ht.init(t,e),t.keyType=e.keyType,t.valueType=e.valueType});function rr(t,e,r){return new Cce({type:"record",keyType:t,valueType:e,...zt.normalizeParams(r)})}var NS=X("ZodEnum",(t,e)=>{Kse.init(t,e),Ht.init(t,e),t.enum=e.entries,t.options=Object.values(e.entries);let r=new Set(Object.keys(e.entries));t.extract=(n,i)=>{let a={};for(let s of n)if(r.has(s))a[s]=e.entries[s];else throw new Error(`Key ${s} not found in enum`);return new NS({...e,checks:[],...zt.normalizeParams(i),entries:a})},t.exclude=(n,i)=>{let a={...e.entries};for(let s of n)if(r.has(s))delete a[s];else throw new Error(`Key ${s} not found in enum`);return new NS({...e,checks:[],...zt.normalizeParams(i),entries:a})}});function br(t,e){let r=Array.isArray(t)?Object.fromEntries(t.map(n=>[n,n])):t;return new NS({type:"enum",entries:r,...zt.normalizeParams(e)})}var Nce=X("ZodLiteral",(t,e)=>{Wse.init(t,e),Ht.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 Nce({type:"literal",values:Array.isArray(t)?t:[t],...zt.normalizeParams(e)})}var jce=X("ZodTransform",(t,e)=>{Jse.init(t,e),Ht.init(t,e),t._zod.parse=(r,n)=>{r.addIssue=a=>{if(typeof a=="string")r.issues.push(zt.issue(a,r.value,e));else{let s=a;s.fatal&&(s.continue=!1),s.code??(s.code="custom"),s.input??(s.input=r.value),s.inst??(s.inst=t),s.continue??(s.continue=!0),r.issues.push(zt.issue(s))}};let i=e.transform(r.value,r);return i instanceof Promise?i.then(a=>(r.value=a,r)):(r.value=i,r)}});function e2(t){return new jce({type:"transform",transform:t})}var t2=X("ZodOptional",(t,e)=>{Xse.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType});function xe(t){return new t2({type:"optional",innerType:t})}var Ace=X("ZodNullable",(t,e)=>{Yse.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType});function I4(t){return new Ace({type:"nullable",innerType:t})}var Mce=X("ZodDefault",(t,e)=>{Qse.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeDefault=t.unwrap});function zce(t,e){return new Mce({type:"default",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var Dce=X("ZodPrefault",(t,e)=>{eoe.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType});function Uce(t,e){return new Dce({type:"prefault",innerType:t,get defaultValue(){return typeof e=="function"?e():e}})}var r2=X("ZodNonOptional",(t,e)=>{toe.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType});function qce(t,e){return new r2({type:"nonoptional",innerType:t,...zt.normalizeParams(e)})}var Lce=X("ZodCatch",(t,e)=>{roe.init(t,e),Ht.init(t,e),t.unwrap=()=>t._zod.def.innerType,t.removeCatch=t.unwrap});function Fce(t,e){return new Lce({type:"catch",innerType:t,catchValue:typeof e=="function"?e:()=>e})}var Zce=X("ZodPipe",(t,e)=>{noe.init(t,e),Ht.init(t,e),t.in=e.in,t.out=e.out});function jS(t,e){return new Zce({type:"pipe",in:t,out:e})}var Hce=X("ZodReadonly",(t,e)=>{ioe.init(t,e),Ht.init(t,e)});function Vce(t){return new Hce({type:"readonly",innerType:t})}var n2=X("ZodCustom",(t,e)=>{aoe.init(t,e),Ht.init(t,e)});function Bce(t,e){let r=new Br({check:"custom",...zt.normalizeParams(e)});return r._zod.check=t,r}function Gce(t,e){return Qoe(n2,t??(()=>!0),e)}function Kce(t,e={}){return ece(n2,t,e)}function Wce(t,e){let r=Bce(n=>(n.addIssue=i=>{if(typeof i=="string")n.issues.push(zt.issue(i,n.value,r._zod.def));else{let a=i;a.fatal&&(a.continue=!1),a.code??(a.code="custom"),a.input??(a.input=n.value),a.inst??(a.inst=r),a.continue??(a.continue=!r._zod.def.abort),n.issues.push(zt.issue(a))}},t(n.value,n)),e);return r}function i2(t,e){return jS(e2(t),e)}ji(coe());var KS="io.modelcontextprotocol/related-task",Th="2.0",di=Gce(t=>t!==null&&(typeof t=="object"||typeof t=="function")),a2=Ft([K(),Ct().int()]),s2=K(),Jce=Fn({ttl:Ft([Ct(),JD()]).optional(),pollInterval:Ct().optional()}),WS=Fn({taskId:K()}),Xce=Fn({progressToken:a2.optional(),[KS]:WS.optional()}),Gr=Fn({task:Jce.optional(),_meta:Xce.optional()}),dr=ie({method:K(),params:Gr.optional()}),ls=Fn({_meta:ie({[KS]:xe(WS)}).passthrough().optional()}),Sn=ie({method:K(),params:ls.optional()}),xr=Fn({_meta:Fn({[KS]:WS.optional()}).optional()}),Ih=Ft([K(),Ct().int()]),Yce=ie({jsonrpc:we(Th),id:Ih,...dr.shape}).strict();var Qce=ie({jsonrpc:we(Th),...Sn.shape}).strict();var eue=ie({jsonrpc:we(Th),id:Ih,result:xr}).strict();var P4;(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"})(P4||(P4={}));var tue=ie({jsonrpc:we(Th),id:Ih,error:ie({code:Ct().int(),message:K(),data:xe(tr())})}).strict();var BEe=Ft([Yce,Qce,eue,tue]),o2=xr.strict(),rue=ls.extend({requestId:Ih,reason:K().optional()}),c2=Sn.extend({method:we("notifications/cancelled"),params:rue}),nue=ie({src:K(),mimeType:K().optional(),sizes:at(K()).optional()}),pd=ie({icons:at(nue).optional()}),cc=ie({name:K(),title:K().optional()}),u2=cc.extend({...cc.shape,...pd.shape,version:K(),websiteUrl:K().optional()}),iue=GS(ie({applyDefaults:_r().optional()}),rr(K(),tr())),aue=i2(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0?{form:{}}:t,GS(ie({form:iue.optional(),url:di.optional()}),rr(K(),tr()).optional())),sue=ie({list:xe(ie({}).passthrough()),cancel:xe(ie({}).passthrough()),requests:xe(ie({sampling:xe(ie({createMessage:xe(ie({}).passthrough())}).passthrough()),elicitation:xe(ie({create:xe(ie({}).passthrough())}).passthrough())}).passthrough())}).passthrough(),oue=ie({list:xe(ie({}).passthrough()),cancel:xe(ie({}).passthrough()),requests:xe(ie({tools:xe(ie({call:xe(ie({}).passthrough())}).passthrough())}).passthrough())}).passthrough(),cue=ie({experimental:rr(K(),di).optional(),sampling:ie({context:di.optional(),tools:di.optional()}).optional(),elicitation:aue.optional(),roots:ie({listChanged:_r().optional()}).optional(),tasks:xe(sue)}),uue=Gr.extend({protocolVersion:K(),capabilities:cue,clientInfo:u2}),lue=dr.extend({method:we("initialize"),params:uue}),due=ie({experimental:rr(K(),di).optional(),logging:di.optional(),completions:di.optional(),prompts:xe(ie({listChanged:xe(_r())})),resources:ie({subscribe:_r().optional(),listChanged:_r().optional()}).optional(),tools:ie({listChanged:_r().optional()}).optional(),tasks:xe(oue)}).passthrough(),pue=xr.extend({protocolVersion:K(),capabilities:due,serverInfo:u2,instructions:K().optional()}),fue=Sn.extend({method:we("notifications/initialized")}),l2=dr.extend({method:we("ping")}),mue=ie({progress:Ct(),total:xe(Ct()),message:xe(K())}),hue=ie({...ls.shape,...mue.shape,progressToken:a2}),d2=Sn.extend({method:we("notifications/progress"),params:hue}),gue=Gr.extend({cursor:s2.optional()}),fd=dr.extend({params:gue.optional()}),md=xr.extend({nextCursor:xe(s2)}),hd=ie({taskId:K(),status:br(["working","input_required","completed","failed","cancelled"]),ttl:Ft([Ct(),JD()]),createdAt:K(),lastUpdatedAt:K(),pollInterval:xe(Ct()),statusMessage:xe(K())}),p2=xr.extend({task:hd}),vue=ls.merge(hd),f2=Sn.extend({method:we("notifications/tasks/status"),params:vue}),m2=dr.extend({method:we("tasks/get"),params:Gr.extend({taskId:K()})}),h2=xr.merge(hd),g2=dr.extend({method:we("tasks/result"),params:Gr.extend({taskId:K()})}),v2=fd.extend({method:we("tasks/list")}),y2=md.extend({tasks:at(hd)}),GEe=dr.extend({method:we("tasks/cancel"),params:Gr.extend({taskId:K()})}),KEe=xr.merge(hd),_2=ie({uri:K(),mimeType:xe(K()),_meta:rr(K(),tr()).optional()}),b2=_2.extend({text:K()}),JS=K().refine(t=>{try{return atob(t),!0}catch{return!1}},{message:"Invalid Base64 string"}),x2=_2.extend({blob:JS}),mc=ie({audience:at(br(["user","assistant"])).optional(),priority:Ct().min(0).max(1).optional(),lastModified:DD.datetime({offset:!0}).optional()}),w2=ie({...cc.shape,...pd.shape,uri:K(),description:xe(K()),mimeType:xe(K()),annotations:mc.optional(),_meta:xe(Fn({}))}),yue=ie({...cc.shape,...pd.shape,uriTemplate:K(),description:xe(K()),mimeType:xe(K()),annotations:mc.optional(),_meta:xe(Fn({}))}),_ue=fd.extend({method:we("resources/list")}),bue=md.extend({resources:at(w2)}),xue=fd.extend({method:we("resources/templates/list")}),wue=md.extend({resourceTemplates:at(yue)}),XS=Gr.extend({uri:K()}),Sue=XS,$ue=dr.extend({method:we("resources/read"),params:Sue}),Eue=xr.extend({contents:at(Ft([b2,x2]))}),kue=Sn.extend({method:we("notifications/resources/list_changed")}),Tue=XS,Iue=dr.extend({method:we("resources/subscribe"),params:Tue}),Pue=XS,Oue=dr.extend({method:we("resources/unsubscribe"),params:Pue}),Rue=ls.extend({uri:K()}),Cue=Sn.extend({method:we("notifications/resources/updated"),params:Rue}),Nue=ie({name:K(),description:xe(K()),required:xe(_r())}),jue=ie({...cc.shape,...pd.shape,description:xe(K()),arguments:xe(at(Nue)),_meta:xe(Fn({}))}),Aue=fd.extend({method:we("prompts/list")}),Mue=md.extend({prompts:at(jue)}),zue=Gr.extend({name:K(),arguments:rr(K(),K()).optional()}),Due=dr.extend({method:we("prompts/get"),params:zue}),YS=ie({type:we("text"),text:K(),annotations:mc.optional(),_meta:rr(K(),tr()).optional()}),QS=ie({type:we("image"),data:JS,mimeType:K(),annotations:mc.optional(),_meta:rr(K(),tr()).optional()}),e$=ie({type:we("audio"),data:JS,mimeType:K(),annotations:mc.optional(),_meta:rr(K(),tr()).optional()}),Uue=ie({type:we("tool_use"),name:K(),id:K(),input:ie({}).passthrough(),_meta:xe(ie({}).passthrough())}).passthrough(),que=ie({type:we("resource"),resource:Ft([b2,x2]),annotations:mc.optional(),_meta:rr(K(),tr()).optional()}),Lue=w2.extend({type:we("resource_link")}),t$=Ft([YS,QS,e$,Lue,que]),Fue=ie({role:br(["user","assistant"]),content:t$}),Zue=xr.extend({description:xe(K()),messages:at(Fue)}),Hue=Sn.extend({method:we("notifications/prompts/list_changed")}),Vue=ie({title:K().optional(),readOnlyHint:_r().optional(),destructiveHint:_r().optional(),idempotentHint:_r().optional(),openWorldHint:_r().optional()}),Bue=ie({taskSupport:br(["required","optional","forbidden"]).optional()}),S2=ie({...cc.shape,...pd.shape,description:K().optional(),inputSchema:ie({type:we("object"),properties:rr(K(),di).optional(),required:at(K()).optional()}).catchall(tr()),outputSchema:ie({type:we("object"),properties:rr(K(),di).optional(),required:at(K()).optional()}).catchall(tr()).optional(),annotations:xe(Vue),execution:xe(Bue),_meta:rr(K(),tr()).optional()}),Gue=fd.extend({method:we("tools/list")}),Kue=md.extend({tools:at(S2)}),$2=xr.extend({content:at(t$).default([]),structuredContent:rr(K(),tr()).optional(),isError:xe(_r())}),WEe=$2.or(xr.extend({toolResult:tr()})),Wue=Gr.extend({name:K(),arguments:xe(rr(K(),tr()))}),Jue=dr.extend({method:we("tools/call"),params:Wue}),Xue=Sn.extend({method:we("notifications/tools/list_changed")}),E2=br(["debug","info","notice","warning","error","critical","alert","emergency"]),Yue=Gr.extend({level:E2}),Que=dr.extend({method:we("logging/setLevel"),params:Yue}),ele=ls.extend({level:E2,logger:K().optional(),data:tr()}),tle=Sn.extend({method:we("notifications/message"),params:ele}),rle=ie({name:K().optional()}),nle=ie({hints:xe(at(rle)),costPriority:xe(Ct().min(0).max(1)),speedPriority:xe(Ct().min(0).max(1)),intelligencePriority:xe(Ct().min(0).max(1))}),ile=ie({mode:xe(br(["auto","required","none"]))}),ale=ie({type:we("tool_result"),toolUseId:K().describe("The unique identifier for the corresponding tool call."),content:at(t$).default([]),structuredContent:ie({}).passthrough().optional(),isError:xe(_r()),_meta:xe(ie({}).passthrough())}).passthrough(),sle=QD("type",[YS,QS,e$]),uh=QD("type",[YS,QS,e$,Uue,ale]),ole=ie({role:br(["user","assistant"]),content:Ft([uh,at(uh)]),_meta:xe(ie({}).passthrough())}).passthrough(),cle=Gr.extend({messages:at(ole),modelPreferences:nle.optional(),systemPrompt:K().optional(),includeContext:br(["none","thisServer","allServers"]).optional(),temperature:Ct().optional(),maxTokens:Ct().int(),stopSequences:at(K()).optional(),metadata:di.optional(),tools:xe(at(S2)),toolChoice:xe(ile)}),ule=dr.extend({method:we("sampling/createMessage"),params:cle}),lle=xr.extend({model:K(),stopReason:xe(br(["endTurn","stopSequence","maxTokens"]).or(K())),role:br(["user","assistant"]),content:sle}),dle=xr.extend({model:K(),stopReason:xe(br(["endTurn","stopSequence","maxTokens","toolUse"]).or(K())),role:br(["user","assistant"]),content:Ft([uh,at(uh)])}),ple=ie({type:we("boolean"),title:K().optional(),description:K().optional(),default:_r().optional()}),fle=ie({type:we("string"),title:K().optional(),description:K().optional(),minLength:Ct().optional(),maxLength:Ct().optional(),format:br(["email","uri","date","date-time"]).optional(),default:K().optional()}),mle=ie({type:br(["number","integer"]),title:K().optional(),description:K().optional(),minimum:Ct().optional(),maximum:Ct().optional(),default:Ct().optional()}),hle=ie({type:we("string"),title:K().optional(),description:K().optional(),enum:at(K()),default:K().optional()}),gle=ie({type:we("string"),title:K().optional(),description:K().optional(),oneOf:at(ie({const:K(),title:K()})),default:K().optional()}),vle=ie({type:we("string"),title:K().optional(),description:K().optional(),enum:at(K()),enumNames:at(K()).optional(),default:K().optional()}),yle=Ft([hle,gle]),_le=ie({type:we("array"),title:K().optional(),description:K().optional(),minItems:Ct().optional(),maxItems:Ct().optional(),items:ie({type:we("string"),enum:at(K())}),default:at(K()).optional()}),ble=ie({type:we("array"),title:K().optional(),description:K().optional(),minItems:Ct().optional(),maxItems:Ct().optional(),items:ie({anyOf:at(ie({const:K(),title:K()}))}),default:at(K()).optional()}),xle=Ft([_le,ble]),wle=Ft([vle,yle,xle]),Sle=Ft([wle,ple,fle,mle]),$le=Gr.extend({mode:we("form").optional(),message:K(),requestedSchema:ie({type:we("object"),properties:rr(K(),Sle),required:at(K()).optional()})}),Ele=Gr.extend({mode:we("url"),message:K(),elicitationId:K(),url:K().url()}),kle=Ft([$le,Ele]),Tle=dr.extend({method:we("elicitation/create"),params:kle}),Ile=ls.extend({elicitationId:K()}),Ple=Sn.extend({method:we("notifications/elicitation/complete"),params:Ile}),Ole=xr.extend({action:br(["accept","decline","cancel"]),content:i2(t=>t===null?void 0:t,rr(K(),Ft([K(),Ct(),_r(),at(K())])).optional())}),Rle=ie({type:we("ref/resource"),uri:K()}),Cle=ie({type:we("ref/prompt"),name:K()}),Nle=Gr.extend({ref:Ft([Cle,Rle]),argument:ie({name:K(),value:K()}),context:ie({arguments:rr(K(),K()).optional()}).optional()}),jle=dr.extend({method:we("completion/complete"),params:Nle});var Ale=xr.extend({completion:Fn({values:at(K()).max(100),total:xe(Ct().int()),hasMore:xe(_r())})}),Mle=ie({uri:K().startsWith("file://"),name:K().optional(),_meta:rr(K(),tr()).optional()}),zle=dr.extend({method:we("roots/list")}),Dle=xr.extend({roots:at(Mle)}),Ule=Sn.extend({method:we("notifications/roots/list_changed")}),JEe=Ft([l2,lue,jle,Que,Due,Aue,_ue,xue,$ue,Iue,Oue,Jue,Gue,m2,g2,v2]),XEe=Ft([c2,d2,fue,Ule,f2]),YEe=Ft([o2,lle,dle,Ole,Dle,h2,y2,p2]),QEe=Ft([l2,ule,Tle,zle,m2,g2,v2]),eke=Ft([c2,d2,tle,Cue,kue,Xue,Hue,f2,Ple]),tke=Ft([o2,pue,Ale,Zue,Mue,bue,wue,Eue,$2,Kue,h2,y2,p2]);var rke=Symbol("Let zodToJsonSchema decide on which parser to use");var nke=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");var ike=R4(Ete(),1),ake=R4(_re(),1);var ske=Symbol.for("mcp.completable");var O4;(function(t){t.Completable="McpCompletable"})(O4||(O4={}));function k2({prompt:t,options:e}){let{systemPrompt:r,settingSources:n,sandbox:i,...a}=e??{},s,o;r===void 0?s="":typeof r=="string"?s=r:r.type==="preset"&&(o=r.append);let c=a.pathToClaudeCodeExecutable;if(!c){let Z=(0,H4.fileURLToPath)(qle.url),J=(0,hS.join)(Z,"..");c=(0,hS.join)(J,"cli.js")}process.env.CLAUDE_AGENT_SDK_VERSION="0.1.76";let{abortController:u=B4(),additionalDirectories:l=[],agents:d,allowedTools:p=[],betas:f,canUseTool:v,continue:_,cwd:h,disallowedTools:m=[],tools:y,env:g,executable:b=cD()?"bun":"node",executableArgs:S=[],extraArgs:x={},fallbackModel:$,enableFileCheckpointing:E,forkSession:O,hooks:A,includePartialMessages:z,persistSession:q,maxThinkingTokens:H,maxTurns:U,maxBudgetUsd:Y,mcpServers:he,model:Qe,outputFormat:oe,permissionMode:re="default",allowDangerouslySkipPermissions:L=!1,permissionPromptToolName:I,plugins:M,resume:C,resumeSessionAt:w,stderr:k,strictMcpConfig:N}=a,G=oe?.type==="json_schema"?oe.schema:void 0,W=g;if(W||(W={...process.env}),W.CLAUDE_CODE_ENTRYPOINT||(W.CLAUDE_CODE_ENTRYPOINT="sdk-ts"),E&&(W.CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING="true"),!c)throw new Error("pathToClaudeCodeExecutable is required");let fe={},se=new Map;if(he)for(let[Z,J]of Object.entries(he))J.type==="sdk"&&"instance"in J?(se.set(Z,J.instance),fe[Z]={type:"sdk",name:Z}):fe[Z]=J;let $e=typeof t=="string",P=new vS({abortController:u,additionalDirectories:l,betas:f,cwd:h,executable:b,executableArgs:S,extraArgs:x,pathToClaudeCodeExecutable:c,env:W,forkSession:O,stderr:k,maxThinkingTokens:H,maxTurns:U,maxBudgetUsd:Y,model:Qe,fallbackModel:$,jsonSchema:G,permissionMode:re,allowDangerouslySkipPermissions:L,permissionPromptToolName:I,continueConversation:_,resume:C,resumeSessionAt:w,settingSources:n??[],allowedTools:p,disallowedTools:m,tools:y,mcpServers:fe,strictMcpConfig:N,canUseTool:!!v,hooks:!!A,includePartialMessages:z,persistSession:q,plugins:M,sandbox:i,spawnClaudeCodeProcess:a.spawnClaudeCodeProcess}),R={systemPrompt:s,appendSystemPrompt:o,agents:d},D=new bS(P,$e,v,A,u,se,G,R);return typeof t=="string"?P.write(JSON.stringify({type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:t}]},parent_tool_use_id:null})+` -`):D.streamInput(t),D}var Ph=class{dbManager;sessionManager;constructor(e,r){this.dbManager=e,this.sessionManager=r}async startSession(e,r){try{let n=this.findClaudeExecutable(),i=this.getModelId(),a=["Bash","Read","Write","Edit","Grep","Glob","WebFetch","WebSearch","Task","NotebookEdit","AskUserQuestion","TodoWrite"],s=this.createMessageGenerator(e),o=e.memorySessionId&&e.memorySessionId!==e.contentSessionId;T.info("SDK","Starting SDK query",{sessionDbId:e.sessionDbId,contentSessionId:e.contentSessionId,memorySessionId:e.memorySessionId,hasRealMemorySessionId:o,resume_parameter:o?e.memorySessionId:"(none - fresh start)",lastPromptNumber:e.lastPromptNumber});let c=k2({prompt:s,options:{model:i,...o&&{resume:e.memorySessionId},disallowedTools:a,abortController:e.abortController,pathToClaudeCodeExecutable:n}});for await(let l of c){if(!e.memorySessionId&&l.session_id&&(e.memorySessionId=l.session_id,this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,l.session_id),T.info("SDK","Captured memory session ID",{sessionDbId:e.sessionDbId,memorySessionId:l.session_id})),l.type==="assistant"){let d=l.message.content,p=Array.isArray(d)?d.filter(y=>y.type==="text").map(y=>y.text).join(` -`):typeof d=="string"?d:"",f=p.length,v=e.cumulativeInputTokens+e.cumulativeOutputTokens,_=l.message.usage;_&&(e.cumulativeInputTokens+=_.input_tokens||0,e.cumulativeOutputTokens+=_.output_tokens||0,_.cache_creation_input_tokens&&(e.cumulativeInputTokens+=_.cache_creation_input_tokens),T.debug("SDK","Token usage captured",{sessionId:e.sessionDbId,inputTokens:_.input_tokens,outputTokens:_.output_tokens,cacheCreation:_.cache_creation_input_tokens||0,cacheRead:_.cache_read_input_tokens||0,cumulativeInput:e.cumulativeInputTokens,cumulativeOutput:e.cumulativeOutputTokens}));let h=e.cumulativeInputTokens+e.cumulativeOutputTokens-v,m=e.earliestPendingTimestamp;if(f>0){let y=f>100?p.substring(0,100)+"...":p;T.dataOut("SDK",`Response received (${f} chars)`,{sessionId:e.sessionDbId,promptNumber:e.lastPromptNumber},y),await this.processSDKResponse(e,p,r,h,m)}else await this.markMessagesProcessed(e,r)}l.type==="result"&&l.subtype}let u=Date.now()-e.startTime;T.success("SDK","Agent completed",{sessionId:e.sessionDbId,duration:`${(u/1e3).toFixed(1)}s`})}catch(n){throw n.name==="AbortError"?T.warn("SDK","Agent aborted",{sessionId:e.sessionDbId}):T.failure("SDK","Agent error",{sessionDbId:e.sessionDbId},n),n}finally{}}async*createMessageGenerator(e){let r=Rt.getInstance().getActiveMode(),n=e.lastPromptNumber===1;T.info("SDK","Creating message generator",{sessionDbId:e.sessionDbId,contentSessionId:e.contentSessionId,lastPromptNumber:e.lastPromptNumber,isInitPrompt:n,promptType:n?"INIT":"CONTINUATION"});let i=n?Fo(e.project,e.contentSessionId,e.userPrompt,r):Vo(e.userPrompt,e.lastPromptNumber,e.contentSessionId,r);e.conversationHistory.push({role:"user",content:i}),yield{type:"user",message:{role:"user",content:i},session_id:e.contentSessionId,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=Zo({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.contentSessionId,parent_tool_use_id:null,isSynthetic:!0}}else if(a.type==="summarize"){let s=Ho({id:e.sessionDbId,memory_session_id:e.memorySessionId,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.contentSessionId,parent_tool_use_id:null,isSynthetic:!0}}}async processSDKResponse(e,r,n,i,a){r&&e.conversationHistory.push({role:"assistant",content:r});let s=qo(r,e.contentSessionId);for(let c of s){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.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(),p=c.type,f=c.title||"(untitled)";this.dbManager.getChromaSync().syncObservation(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).then(()=>{let v=Date.now()-d;T.debug("CHROMA","Observation synced",{obsId:u,duration:`${v}ms`,type:p,title:f})}).catch(v=>{T.warn("CHROMA","Observation sync failed, continuing without vector search",{obsId:u,type:p,title:f},v)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,memory_session_id:e.memorySessionId,session_id:e.contentSessionId,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=Lo(r,e.sessionDbId);if(o){let{id:c,createdAtEpoch:u}=this.dbManager.getSessionStore().storeSummary(e.contentSessionId,e.project,o,e.lastPromptNumber,i,a??void 0);T.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.contentSessionId,e.project,o,e.lastPromptNumber,u,i).then(()=>{let p=Date.now()-l;T.debug("CHROMA","Summary synced",{summaryId:c,duration:`${p}ms`,request:d})}).catch(p=>{T.warn("CHROMA","Summary sync failed, continuing without vector search",{summaryId:c,request:d},p)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:c,session_id:e.contentSessionId,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}}),ds(e.project,Rr()).catch(()=>{})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let a of e.pendingProcessingIds)n.markProcessed(a);T.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 i=n.cleanupProcessed(100);i>0&&T.debug("SDK","Cleaned up old processed messages",{deletedCount:i})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}findClaudeExecutable(){let e=nt.loadFromFile(bn);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,T2.execSync)(process.platform==="win32"?"where claude":"which claude",{encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]}).trim().split(` +`):D.streamInput(t),D}var Ph=class{dbManager;sessionManager;constructor(e,r){this.dbManager=e,this.sessionManager=r}async startSession(e,r){let n=this.findClaudeExecutable(),i=this.getModelId(),a=["Bash","Read","Write","Edit","Grep","Glob","WebFetch","WebSearch","Task","NotebookEdit","AskUserQuestion","TodoWrite"],s=this.createMessageGenerator(e),o=e.memorySessionId&&e.memorySessionId!==e.contentSessionId;T.info("SDK","Starting SDK query",{sessionDbId:e.sessionDbId,contentSessionId:e.contentSessionId,memorySessionId:e.memorySessionId,hasRealMemorySessionId:o,resume_parameter:o?e.memorySessionId:"(none - fresh start)",lastPromptNumber:e.lastPromptNumber});let c=k2({prompt:s,options:{model:i,...o&&{resume:e.memorySessionId},disallowedTools:a,abortController:e.abortController,pathToClaudeCodeExecutable:n}});for await(let l of c){if(!e.memorySessionId&&l.session_id&&(e.memorySessionId=l.session_id,this.dbManager.getSessionStore().updateMemorySessionId(e.sessionDbId,l.session_id),T.info("SDK","Captured memory session ID",{sessionDbId:e.sessionDbId,memorySessionId:l.session_id})),l.type==="assistant"){let d=l.message.content,p=Array.isArray(d)?d.filter(y=>y.type==="text").map(y=>y.text).join(` +`):typeof d=="string"?d:"",f=p.length,v=e.cumulativeInputTokens+e.cumulativeOutputTokens,_=l.message.usage;_&&(e.cumulativeInputTokens+=_.input_tokens||0,e.cumulativeOutputTokens+=_.output_tokens||0,_.cache_creation_input_tokens&&(e.cumulativeInputTokens+=_.cache_creation_input_tokens),T.debug("SDK","Token usage captured",{sessionId:e.sessionDbId,inputTokens:_.input_tokens,outputTokens:_.output_tokens,cacheCreation:_.cache_creation_input_tokens||0,cacheRead:_.cache_read_input_tokens||0,cumulativeInput:e.cumulativeInputTokens,cumulativeOutput:e.cumulativeOutputTokens}));let h=e.cumulativeInputTokens+e.cumulativeOutputTokens-v,m=e.earliestPendingTimestamp;if(f>0){let y=f>100?p.substring(0,100)+"...":p;T.dataOut("SDK",`Response received (${f} chars)`,{sessionId:e.sessionDbId,promptNumber:e.lastPromptNumber},y),await this.processSDKResponse(e,p,r,h,m)}else await this.markMessagesProcessed(e,r)}l.type==="result"&&l.subtype}let u=Date.now()-e.startTime;T.success("SDK","Agent completed",{sessionId:e.sessionDbId,duration:`${(u/1e3).toFixed(1)}s`})}async*createMessageGenerator(e){let r=Rt.getInstance().getActiveMode(),n=e.lastPromptNumber===1;T.info("SDK","Creating message generator",{sessionDbId:e.sessionDbId,contentSessionId:e.contentSessionId,lastPromptNumber:e.lastPromptNumber,isInitPrompt:n,promptType:n?"INIT":"CONTINUATION"});let i=n?Fo(e.project,e.contentSessionId,e.userPrompt,r):Vo(e.userPrompt,e.lastPromptNumber,e.contentSessionId,r);e.conversationHistory.push({role:"user",content:i}),yield{type:"user",message:{role:"user",content:i},session_id:e.contentSessionId,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=Zo({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.contentSessionId,parent_tool_use_id:null,isSynthetic:!0}}else if(a.type==="summarize"){let s=Ho({id:e.sessionDbId,memory_session_id:e.memorySessionId,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.contentSessionId,parent_tool_use_id:null,isSynthetic:!0}}}async processSDKResponse(e,r,n,i,a){r&&e.conversationHistory.push({role:"assistant",content:r});let s=qo(r,e.contentSessionId);for(let c of s){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.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(),p=c.type,f=c.title||"(untitled)";this.dbManager.getChromaSync().syncObservation(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).then(()=>{let v=Date.now()-d;T.debug("CHROMA","Observation synced",{obsId:u,duration:`${v}ms`,type:p,title:f})}).catch(v=>{T.warn("CHROMA","Observation sync failed, continuing without vector search",{obsId:u,type:p,title:f},v)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,memory_session_id:e.memorySessionId,session_id:e.contentSessionId,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=Lo(r,e.sessionDbId);if(o){let{id:c,createdAtEpoch:u}=this.dbManager.getSessionStore().storeSummary(e.contentSessionId,e.project,o,e.lastPromptNumber,i,a??void 0);T.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.contentSessionId,e.project,o,e.lastPromptNumber,u,i).then(()=>{let p=Date.now()-l;T.debug("CHROMA","Summary synced",{summaryId:c,duration:`${p}ms`,request:d})}).catch(p=>{T.warn("CHROMA","Summary sync failed, continuing without vector search",{summaryId:c,request:d},p)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:c,session_id:e.contentSessionId,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}}),ds(e.project,Rr()).catch(()=>{})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let a of e.pendingProcessingIds)n.markProcessed(a);T.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 i=n.cleanupProcessed(100);i>0&&T.debug("SDK","Cleaned up old processed messages",{deletedCount:i})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}findClaudeExecutable(){let e=nt.loadFromFile(bn);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,T2.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){T.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=P2.default.join((0,I2.homedir)(),".claude-mem","settings.json");return nt.loadFromFile(e).CLAUDE_MEM_MODEL}};var Rh=qt(require("path"),1),Ch=require("os");wt();yn();ui();var Lle="https://generativelanguage.googleapis.com/v1beta/models",Fle={"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},O2=0;async function Zle(t,e){if(!e)return;let r=Fle[t]||5,n=Math.ceil(6e4/r)+100,a=Date.now()-O2;if(asetTimeout(o,s))}O2=Date.now()}var Oh=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:i,rateLimitingEnabled:a}=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 s=Rt.getInstance().getActiveMode(),o=e.lastPromptNumber===1?Fo(e.project,e.contentSessionId,e.userPrompt,s):Vo(e.userPrompt,e.lastPromptNumber,e.contentSessionId,s);e.conversationHistory.push({role:"user",content:o});let c=await this.queryGeminiMultiTurn(e.conversationHistory,n,i,a);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 T.warn("SDK","Empty Gemini init response - session may lack context",{sessionId:e.sessionDbId,model:i});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 p=Zo({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:p});let f=await this.queryGeminiMultiTurn(e.conversationHistory,n,i,a);if(f.content){e.conversationHistory.push({role:"assistant",content:f.content});let v=f.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(v*.7),e.cumulativeOutputTokens+=Math.floor(v*.3),await this.processGeminiResponse(e,f.content,r,v,d)}else T.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 p=Ho({id:e.sessionDbId,memory_session_id:e.memorySessionId,project:e.project,user_prompt:e.userPrompt,last_user_message:l.last_user_message||"",last_assistant_message:l.last_assistant_message||""},s);e.conversationHistory.push({role:"user",content:p});let f=await this.queryGeminiMultiTurn(e.conversationHistory,n,i,a);if(f.content){e.conversationHistory.push({role:"assistant",content:f.content});let v=f.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(v*.7),e.cumulativeOutputTokens+=Math.floor(v*.3),await this.processGeminiResponse(e,f.content,r,v,d)}else T.warn("SDK","Empty Gemini response for summary, marking as processed",{sessionId:e.sessionDbId}),await this.markMessagesProcessed(e,r)}}let u=Date.now()-e.startTime;T.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 T.warn("SDK","Gemini agent aborted",{sessionId:e.sessionDbId}),n;if(this.shouldFallbackToClaude(n)&&this.fallbackAgent){T.warn("SDK","Gemini API failed, falling back to Claude SDK",{sessionDbId:e.sessionDbId,error:n.message,historyLength:e.conversationHistory.length});let a=this.sessionManager.getPendingMessageStore().resetStuckMessages(0);return a>0&&T.info("SDK","Reset processing messages for fallback",{sessionDbId:e.sessionDbId,resetCount:a}),this.fallbackAgent.startSession(e,r)}throw T.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,i){let a=this.conversationToGeminiContents(e),s=e.reduce((p,f)=>p+f.content.length,0);T.debug("SDK",`Querying Gemini multi-turn (${n})`,{turns:e.length,totalChars:s});let o=`${Lle}/${n}:generateContent?key=${r}`;await Zle(n,i);let c=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:a,generationConfig:{temperature:.3,maxOutputTokens:4096}})});if(!c.ok){let p=await c.text();throw new Error(`Gemini API error: ${c.status} - ${p}`)}let u=await c.json();if(!u.candidates?.[0]?.content?.parts?.[0]?.text)return T.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,i,a){let s=qo(r,e.contentSessionId);for(let c of s){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.info("SDK","Gemini observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)"}),this.dbManager.getChromaSync().syncObservation(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).catch(d=>{T.warn("SDK","Gemini chroma sync failed",{obsId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,memory_session_id:e.memorySessionId,session_id:e.contentSessionId,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=Lo(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.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.info("SDK","Gemini summary saved",{sessionId:e.sessionDbId,summaryId:u,request:o.request||"(no request)"}),this.dbManager.getChromaSync().syncSummary(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).catch(d=>{T.warn("SDK","Gemini chroma sync failed",{summaryId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:u,session_id:e.contentSessionId,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}}),ds(e.project,Rr()).catch(()=>{})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let a of e.pendingProcessingIds)n.markProcessed(a);T.debug("SDK","Gemini messages marked as processed",{sessionId:e.sessionDbId,count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear();let i=n.cleanupProcessed(100);i>0&&T.debug("SDK","Gemini cleaned up old processed messages",{deletedCount:i})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}getGeminiConfig(){let e=Rh.default.join((0,Ch.homedir)(),".claude-mem","settings.json"),r=nt.loadFromFile(e),n=r.CLAUDE_MEM_GEMINI_API_KEY||process.env.GEMINI_API_KEY||"",i="gemini-2.5-flash",a=r.CLAUDE_MEM_GEMINI_MODEL||i,s=["gemini-2.5-flash-lite","gemini-2.5-flash","gemini-2.5-pro","gemini-2.0-flash","gemini-2.0-flash-lite"],o;s.includes(a)?o=a:(T.warn("SDK",`Invalid Gemini model "${a}", falling back to ${i}`,{configured:a,validModels:s}),o=i);let c=r.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED!=="false";return{apiKey:n,model:o,rateLimitingEnabled:c}}};function r$(){let t=Rh.default.join((0,Ch.homedir)(),".claude-mem","settings.json");return!!(nt.loadFromFile(t).CLAUDE_MEM_GEMINI_API_KEY||process.env.GEMINI_API_KEY)}function n$(){let t=Rh.default.join((0,Ch.homedir)(),".claude-mem","settings.json");return nt.loadFromFile(t).CLAUDE_MEM_PROVIDER==="gemini"}wt();yn();rn();ui();var Hle="https://openrouter.ai/api/v1/chat/completions",Vle=20,Ble=1e5,Gle=4,Nh=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:i,siteUrl:a,appName:s}=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=Rt.getInstance().getActiveMode(),c=e.lastPromptNumber===1?Fo(e.project,e.contentSessionId,e.userPrompt,o):Vo(e.userPrompt,e.lastPromptNumber,e.contentSessionId,o);e.conversationHistory.push({role:"user",content:c});let u=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,i,a,s);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 T.warn("SDK","Empty OpenRouter init response - session may lack context",{sessionId:e.sessionDbId,model:i});for await(let d of this.sessionManager.getMessageIterator(e.sessionDbId)){let p=e.earliestPendingTimestamp;if(d.type==="observation"){d.prompt_number!==void 0&&(e.lastPromptNumber=d.prompt_number);let f=Zo({id:0,tool_name:d.tool_name,tool_input:JSON.stringify(d.tool_input),tool_output:JSON.stringify(d.tool_response),created_at_epoch:p??Date.now(),cwd:d.cwd});e.conversationHistory.push({role:"user",content:f});let v=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,i,a,s);if(v.content){e.conversationHistory.push({role:"assistant",content:v.content});let _=v.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(_*.7),e.cumulativeOutputTokens+=Math.floor(_*.3),await this.processOpenRouterResponse(e,v.content,r,_,p)}else T.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 f=Ho({id:e.sessionDbId,memory_session_id:e.memorySessionId,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:f});let v=await this.queryOpenRouterMultiTurn(e.conversationHistory,n,i,a,s);if(v.content){e.conversationHistory.push({role:"assistant",content:v.content});let _=v.tokensUsed||0;e.cumulativeInputTokens+=Math.floor(_*.7),e.cumulativeOutputTokens+=Math.floor(_*.3),await this.processOpenRouterResponse(e,v.content,r,_,p)}else T.warn("SDK","Empty OpenRouter response for summary, marking as processed",{sessionId:e.sessionDbId}),await this.markMessagesProcessed(e,r)}}let l=Date.now()-e.startTime;T.success("SDK","OpenRouter agent completed",{sessionId:e.sessionDbId,duration:`${(l/1e3).toFixed(1)}s`,historyLength:e.conversationHistory.length,model:i})}catch(n){if(n.name==="AbortError")throw T.warn("SDK","OpenRouter agent aborted",{sessionId:e.sessionDbId}),n;if(this.shouldFallbackToClaude(n)&&this.fallbackAgent){T.warn("SDK","OpenRouter API failed, falling back to Claude SDK",{sessionDbId:e.sessionDbId,error:n.message,historyLength:e.conversationHistory.length});let a=this.sessionManager.getPendingMessageStore().resetStuckMessages(0);return a>0&&T.info("SDK","Reset processing messages for fallback",{sessionDbId:e.sessionDbId,resetCount:a}),this.fallbackAgent.startSession(e,r)}throw T.failure("SDK","OpenRouter agent error",{sessionDbId:e.sessionDbId},n),n}}estimateTokens(e){return Math.ceil(e.length/Gle)}truncateHistory(e){let r=nt.loadFromFile(bn),n=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES)||Vle,i=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS)||Ble;if(e.length<=n&&e.reduce((c,u)=>c+this.estimateTokens(u.content),0)<=i)return e;let a=[],s=0;for(let o=e.length-1;o>=0;o--){let c=e[o],u=this.estimateTokens(c.content);if(a.length>=n||s+u>i){T.warn("SDK","Context window truncated to prevent runaway costs",{originalMessages:e.length,keptMessages:a.length,droppedMessages:o+1,estimatedTokens:s,tokenLimit:i});break}a.unshift(c),s+=u}return a}conversationToOpenAIMessages(e){return e.map(r=>({role:r.role==="assistant"?"assistant":"user",content:r.content}))}async queryOpenRouterMultiTurn(e,r,n,i,a){let s=this.truncateHistory(e),o=this.conversationToOpenAIMessages(s),c=s.reduce((v,_)=>v+_.content.length,0),u=this.estimateTokens(s.map(v=>v.content).join(""));T.debug("SDK",`Querying OpenRouter multi-turn (${n})`,{turns:s.length,totalChars:c,estimatedTokens:u});let l=await fetch(Hle,{method:"POST",headers:{Authorization:`Bearer ${r}`,"HTTP-Referer":i||"https://github.com/thedotmack/claude-mem","X-Title":a||"claude-mem","Content-Type":"application/json"},body:JSON.stringify({model:n,messages:o,temperature:.3,max_tokens:4096})});if(!l.ok){let v=await l.text();throw new Error(`OpenRouter API error: ${l.status} - ${v}`)}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 T.warn("SDK","Empty response from OpenRouter"),{content:""};let p=d.choices[0].message.content,f=d.usage?.total_tokens;if(f){let v=d.usage?.prompt_tokens||0,_=d.usage?.completion_tokens||0,h=v/1e6*3+_/1e6*15;T.info("SDK","OpenRouter API usage",{model:n,inputTokens:v,outputTokens:_,totalTokens:f,estimatedCostUSD:h.toFixed(4),messagesInContext:s.length}),f>5e4&&T.warn("SDK","High token usage detected - consider reducing context",{totalTokens:f,estimatedCost:h.toFixed(4)})}return{content:p,tokensUsed:f}}async processOpenRouterResponse(e,r,n,i,a){let s=qo(r,e.contentSessionId);for(let c of s){let{id:u,createdAtEpoch:l}=this.dbManager.getSessionStore().storeObservation(e.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.info("SDK","OpenRouter observation saved",{sessionId:e.sessionDbId,obsId:u,type:c.type,title:c.title||"(untitled)"}),this.dbManager.getChromaSync().syncObservation(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).catch(d=>{T.warn("SDK","OpenRouter chroma sync failed",{obsId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_observation",observation:{id:u,memory_session_id:e.memorySessionId,session_id:e.contentSessionId,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=Lo(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.contentSessionId,e.project,c,e.lastPromptNumber,i,a??void 0);T.info("SDK","OpenRouter summary saved",{sessionId:e.sessionDbId,summaryId:u,request:o.request||"(no request)"}),this.dbManager.getChromaSync().syncSummary(u,e.contentSessionId,e.project,c,e.lastPromptNumber,l,i).catch(d=>{T.warn("SDK","OpenRouter chroma sync failed",{summaryId:u},d)}),n&&n.sseBroadcaster&&n.sseBroadcaster.broadcast({type:"new_summary",summary:{id:u,session_id:e.contentSessionId,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}}),ds(e.project,Rr()).catch(()=>{})}await this.markMessagesProcessed(e,n)}async markMessagesProcessed(e,r){let n=this.sessionManager.getPendingMessageStore();if(e.pendingProcessingIds.size>0){for(let a of e.pendingProcessingIds)n.markProcessed(a);T.debug("SDK","OpenRouter messages marked as processed",{sessionId:e.sessionDbId,count:e.pendingProcessingIds.size}),e.pendingProcessingIds.clear();let i=n.cleanupProcessed(100);i>0&&T.debug("SDK","OpenRouter cleaned up old processed messages",{deletedCount:i})}r&&typeof r.broadcastProcessingStatus=="function"&&r.broadcastProcessingStatus()}getOpenRouterConfig(){let e=bn,r=nt.loadFromFile(e),n=r.CLAUDE_MEM_OPENROUTER_API_KEY||process.env.OPENROUTER_API_KEY||"",i=r.CLAUDE_MEM_OPENROUTER_MODEL||"xiaomi/mimo-v2-flash:free",a=r.CLAUDE_MEM_OPENROUTER_SITE_URL||"",s=r.CLAUDE_MEM_OPENROUTER_APP_NAME||"claude-mem";return{apiKey:n,model:i,siteUrl:a,appName:s}}};function i$(){let t=bn;return!!(nt.loadFromFile(t).CLAUDE_MEM_OPENROUTER_API_KEY||process.env.OPENROUTER_API_KEY)}function a$(){let t=bn;return nt.loadFromFile(t).CLAUDE_MEM_PROVIDER==="openrouter"}var jh=class{dbManager;constructor(e){this.dbManager=e}stripProjectPath(e,r){let n=`/${r}/`,i=e.indexOf(n);return i!==-1?e.substring(i+n.length):e}stripProjectPaths(e,r){if(!e)return e;try{let i=JSON.parse(e).map(a=>this.stripProjectPath(a,r));return JSON.stringify(i)}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 i=this.paginate("observations","id, memory_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{...i,items:i.items.map(a=>this.sanitizeObservation(a))}}getSummaries(e,r,n){let i=this.dbManager.getSessionStore().db,a=` @@ -1140,7 +1140,7 @@ Tips: ORDER BY MAX(created_at_epoch) DESC `).all().map(o=>o.project);n.json({projects:s})});handleGetProcessingStatus=this.wrapHandler((r,n)=>{let i=this.sessionManager.isAnySessionProcessing(),a=this.sessionManager.getTotalActiveWork();n.json({isProcessing:i,queueDepth:a})});handleSetProcessing=this.wrapHandler((r,n)=>{this.workerService.broadcastProcessingStatus();let i=this.sessionManager.isAnySessionProcessing(),a=this.sessionManager.getTotalQueueDepth(),s=this.sessionManager.getActiveSessionCount();n.json({status:"ok",isProcessing:i,queueDepth:a,activeSessions:s})});parsePaginationParams(r){let n=parseInt(r.query.offset,10)||0,i=Math.min(parseInt(r.query.limit,10)||20,100),a=r.query.project;return{offset:n,limit:i,project:a}}handleImport=this.wrapHandler((r,n)=>{let{sessions:i,summaries:a,observations:s,prompts:o}=r.body,c={sessionsImported:0,sessionsSkipped:0,summariesImported:0,summariesSkipped:0,observationsImported:0,observationsSkipped:0,promptsImported:0,promptsSkipped:0},u=this.dbManager.getSessionStore();if(Array.isArray(i))for(let l of i)u.importSdkSession(l).imported?c.sessionsImported++:c.sessionsSkipped++;if(Array.isArray(a))for(let l of a)u.importSessionSummary(l).imported?c.summariesImported++:c.summariesSkipped++;if(Array.isArray(s))for(let l of s)u.importObservation(l).imported?c.observationsImported++:c.observationsSkipped++;if(Array.isArray(o))for(let l of o)u.importUserPrompt(l).imported?c.promptsImported++:c.promptsSkipped++;n.json({success:!0,stats:c})});handleGetPendingQueue=this.wrapHandler((r,n)=>{let{PendingMessageStore:i}=(Vl(),I$(Zm)),a=new i(this.dbManager.getSessionStore().db,3),s=a.getQueueMessages(),o=a.getRecentlyProcessed(20,30),c=a.getStuckCount(300*1e3),u=a.getSessionsWithPendingMessages();n.json({queue:{messages:s,totalPending:s.filter(l=>l.status==="pending").length,totalProcessing:s.filter(l=>l.status==="processing").length,totalFailed:s.filter(l=>l.status==="failed").length,stuckCount:c},recentlyProcessed:o,sessionsWithPendingWork:u})});handleProcessPendingQueue=this.wrapHandler(async(r,n)=>{let i=Math.min(Math.max(parseInt(r.body.sessionLimit,10)||10,1),100),a=await this.workerService.processPendingQueues(i);n.json({success:!0,...a})})};var Jh=class extends $n{constructor(r){super();this.searchManager=r}setupRoutes(r){r.get("/api/search",this.handleUnifiedSearch.bind(this)),r.get("/api/timeline",this.handleUnifiedTimeline.bind(this)),r.get("/api/decisions",this.handleDecisions.bind(this)),r.get("/api/changes",this.handleChanges.bind(this)),r.get("/api/how-it-works",this.handleHowItWorks.bind(this)),r.get("/api/search/observations",this.handleSearchObservations.bind(this)),r.get("/api/search/sessions",this.handleSearchSessions.bind(this)),r.get("/api/search/prompts",this.handleSearchPrompts.bind(this)),r.get("/api/search/by-concept",this.handleSearchByConcept.bind(this)),r.get("/api/search/by-file",this.handleSearchByFile.bind(this)),r.get("/api/search/by-type",this.handleSearchByType.bind(this)),r.get("/api/context/recent",this.handleGetRecentContext.bind(this)),r.get("/api/context/timeline",this.handleGetContextTimeline.bind(this)),r.get("/api/context/preview",this.handleContextPreview.bind(this)),r.get("/api/context/inject",this.handleContextInject.bind(this)),r.get("/api/timeline/by-query",this.handleGetTimelineByQuery.bind(this)),r.get("/api/search/help",this.handleSearchHelp.bind(this))}handleUnifiedSearch=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.search(r.query);n.json(i)});handleUnifiedTimeline=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.timeline(r.query);n.json(i)});handleDecisions=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.decisions(r.query);n.json(i)});handleChanges=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.changes(r.query);n.json(i)});handleHowItWorks=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.howItWorks(r.query);n.json(i)});handleSearchObservations=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchObservations(r.query);n.json(i)});handleSearchSessions=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchSessions(r.query);n.json(i)});handleSearchPrompts=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.searchUserPrompts(r.query);n.json(i)});handleSearchByConcept=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByConcept(r.query);n.json(i)});handleSearchByFile=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByFile(r.query);n.json(i)});handleSearchByType=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.findByType(r.query);n.json(i)});handleGetRecentContext=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getRecentContext(r.query);n.json(i)});handleGetContextTimeline=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getContextTimeline(r.query);n.json(i)});handleContextPreview=this.wrapHandler(async(r,n)=>{let i=r.query.project;if(!i){this.badRequest(n,"Project parameter is required");return}let{generateContext:a}=await Promise.resolve().then(()=>(m$(),f$)),s=`/preview/${i}`,o=await a({session_id:"preview-"+Date.now(),cwd:s},!0);n.setHeader("Content-Type","text/plain; charset=utf-8"),n.send(o)});handleContextInject=this.wrapHandler(async(r,n)=>{let i=r.query.project,a=r.query.colors==="true";if(!i){this.badRequest(n,"Project parameter is required");return}let{generateContext:s}=await Promise.resolve().then(()=>(m$(),f$)),o=`/context/${i}`,c=await s({session_id:"context-inject-"+Date.now(),cwd:o},a);n.setHeader("Content-Type","text/plain; charset=utf-8"),n.send(c)});handleGetTimelineByQuery=this.wrapHandler(async(r,n)=>{let i=await this.searchManager.getTimelineByQuery(r.query);n.json(i)});handleSearchHelp=this.wrapHandler((r,n)=>{n.json({title:"Claude-Mem Search API",description:"HTTP API for searching persistent memory",endpoints:[{path:"/api/search/observations",method:"GET",description:"Search observations using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)",project:"Filter by project name (optional)"}},{path:"/api/search/sessions",method:"GET",description:"Search session summaries using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)"}},{path:"/api/search/prompts",method:"GET",description:"Search user prompts using full-text search",parameters:{query:"Search query (required)",limit:"Number of results (default: 20)",project:"Filter by project name (optional)"}},{path:"/api/search/by-concept",method:"GET",description:"Find observations by concept tag",parameters:{concept:"Concept tag (required): discovery, decision, bugfix, feature, refactor",limit:"Number of results (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/by-file",method:"GET",description:"Find observations and sessions by file path",parameters:{filePath:"File path or partial path (required)",limit:"Number of results per type (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/by-type",method:"GET",description:"Find observations by type",parameters:{type:"Observation type (required): discovery, decision, bugfix, feature, refactor",limit:"Number of results (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/context/recent",method:"GET",description:"Get recent session context including summaries and observations",parameters:{project:"Project name (default: current directory)",limit:"Number of recent sessions (default: 3)"}},{path:"/api/context/timeline",method:"GET",description:"Get unified timeline around a specific point in time",parameters:{anchor:'Anchor point: observation ID, session ID (e.g., "S123"), or ISO timestamp (required)',depth_before:"Number of records before anchor (default: 10)",depth_after:"Number of records after anchor (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/timeline/by-query",method:"GET",description:"Search for best match, then get timeline around it",parameters:{query:"Search query (required)",mode:'Search mode: "auto", "observations", or "sessions" (default: "auto")',depth_before:"Number of records before match (default: 10)",depth_after:"Number of records after match (default: 10)",project:"Filter by project name (optional)"}},{path:"/api/search/help",method:"GET",description:"Get this help documentation"}],examples:['curl "http://localhost:37777/api/search/observations?query=authentication&limit=5"','curl "http://localhost:37777/api/search/by-type?type=bugfix&limit=10"','curl "http://localhost:37777/api/context/recent?project=claude-mem&limit=3"','curl "http://localhost:37777/api/context/timeline?anchor=123&depth_before=5&depth_after=5"']})})};var hs=qt(require("path"),1),pr=require("fs"),y$=require("os");rn();wt();var g$=require("child_process"),ms=require("fs"),X2=require("os"),vd=require("path");wt();var yd=(0,vd.join)((0,X2.homedir)(),".claude","plugins","marketplaces","thedotmack");function h$(t){return!t||typeof t!="string"?!1:/^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/.test(t)&&!t.includes("..")}var cde=3e5,v$=6e5;function En(t){let e=(0,g$.spawnSync)("git",t,{cwd:yd,encoding:"utf-8",timeout:cde,windowsHide:!0,shell:!1});if(e.error)throw e.error;if(e.status!==0)throw new Error(e.stderr||e.stdout||"Git command failed");return e.stdout.trim()}function Y2(t,e=v$){let n=process.platform==="win32"?"npm.cmd":"npm",i=(0,g$.spawnSync)(n,t,{cwd:yd,encoding:"utf-8",timeout:e,windowsHide:!0,shell:!1});if(i.error)throw i.error;if(i.status!==0)throw new Error(i.stderr||i.stdout||"npm command failed");return i.stdout.trim()}function Xh(){let t=(0,vd.join)(yd,".git");if(!(0,ms.existsSync)(t))return{branch:null,isBeta:!1,isGitRepo:!1,isDirty:!1,canSwitch:!1,error:"Installed plugin is not a git repository"};try{let e=En(["rev-parse","--abbrev-ref","HEAD"]),n=En(["status","--porcelain"]).length>0,i=e.startsWith("beta");return{branch:e,isBeta:i,isGitRepo:!0,isDirty:n,canSwitch:!0}}catch(e){return T.error("BRANCH","Failed to get branch info",{},e),{branch:null,isBeta:!1,isGitRepo:!0,isDirty:!1,canSwitch:!1,error:e.message}}}async function Q2(t){if(!h$(t))return{success:!1,error:`Invalid branch name: ${t}. Branch names must be alphanumeric with hyphens, underscores, slashes, or dots.`};let e=Xh();if(!e.isGitRepo)return{success:!1,error:"Installed plugin is not a git repository. Please reinstall."};if(e.branch===t)return{success:!0,branch:t,message:`Already on branch ${t}`};try{T.info("BRANCH","Starting branch switch",{from:e.branch,to:t}),T.debug("BRANCH","Discarding local changes"),En(["checkout","--","."]),En(["clean","-fd"]),T.debug("BRANCH","Fetching from origin"),En(["fetch","origin"]),T.debug("BRANCH","Checking out branch",{branch:t});try{En(["checkout",t])}catch{En(["checkout","-b",t,`origin/${t}`])}T.debug("BRANCH","Pulling latest"),En(["pull","origin",t]);let r=(0,vd.join)(yd,".install-version");return(0,ms.existsSync)(r)&&(0,ms.unlinkSync)(r),T.debug("BRANCH","Running npm install"),Y2(["install"],v$),T.success("BRANCH","Branch switch complete",{branch:t}),{success:!0,branch:t,message:`Switched to ${t}. Worker will restart automatically.`}}catch(r){T.error("BRANCH","Branch switch failed",{targetBranch:t},r);try{e.branch&&h$(e.branch)&&En(["checkout",e.branch])}catch{}return{success:!1,error:`Branch switch failed: ${r.message}`}}}async function e6(){let t=Xh();if(!t.isGitRepo||!t.branch)return{success:!1,error:"Cannot pull updates: not a git repository"};try{if(!h$(t.branch))return{success:!1,error:`Invalid current branch name: ${t.branch}`};T.info("BRANCH","Pulling updates",{branch:t.branch}),En(["checkout","--","."]),En(["fetch","origin"]),En(["pull","origin",t.branch]);let e=(0,vd.join)(yd,".install-version");return(0,ms.existsSync)(e)&&(0,ms.unlinkSync)(e),Y2(["install"],v$),T.success("BRANCH","Updates pulled",{branch:t.branch}),{success:!0,branch:t.branch,message:`Updated ${t.branch}. Worker will restart automatically.`}}catch(e){return T.error("BRANCH","Pull failed",{},e),{success:!1,error:`Pull failed: ${e.message}`}}}yn();var Yh=class extends $n{constructor(r){super();this.settingsManager=r}setupRoutes(r){r.get("/api/settings",this.handleGetSettings.bind(this)),r.post("/api/settings",this.handleUpdateSettings.bind(this)),r.get("/api/mcp/status",this.handleGetMcpStatus.bind(this)),r.post("/api/mcp/toggle",this.handleToggleMcp.bind(this)),r.get("/api/branch/status",this.handleGetBranchStatus.bind(this)),r.post("/api/branch/switch",this.handleSwitchBranch.bind(this)),r.post("/api/branch/update",this.handleUpdateBranch.bind(this))}handleGetSettings=this.wrapHandler((r,n)=>{let i=hs.default.join((0,y$.homedir)(),".claude-mem","settings.json");this.ensureSettingsFile(i);let a=nt.loadFromFile(i);n.json(a)});handleUpdateSettings=this.wrapHandler((r,n)=>{let i=this.validateSettings(r.body);if(!i.valid){n.status(400).json({success:!1,error:i.error});return}let a=hs.default.join((0,y$.homedir)(),".claude-mem","settings.json");this.ensureSettingsFile(a);let s={};if((0,pr.existsSync)(a)){let c=(0,pr.readFileSync)(a,"utf-8");try{s=JSON.parse(c)}catch(u){T.error("SETTINGS","Failed to parse settings file",{settingsPath:a},u),n.status(500).json({success:!1,error:"Settings file is corrupted. Delete ~/.claude-mem/settings.json to reset."});return}}let o=["CLAUDE_MEM_MODEL","CLAUDE_MEM_CONTEXT_OBSERVATIONS","CLAUDE_MEM_WORKER_PORT","CLAUDE_MEM_WORKER_HOST","CLAUDE_MEM_PROVIDER","CLAUDE_MEM_GEMINI_API_KEY","CLAUDE_MEM_GEMINI_MODEL","CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED","CLAUDE_MEM_OPENROUTER_API_KEY","CLAUDE_MEM_OPENROUTER_MODEL","CLAUDE_MEM_OPENROUTER_SITE_URL","CLAUDE_MEM_OPENROUTER_APP_NAME","CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES","CLAUDE_MEM_OPENROUTER_MAX_TOKENS","CLAUDE_MEM_DATA_DIR","CLAUDE_MEM_LOG_LEVEL","CLAUDE_MEM_PYTHON_VERSION","CLAUDE_CODE_PATH","CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT","CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES","CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS","CLAUDE_MEM_CONTEXT_FULL_COUNT","CLAUDE_MEM_CONTEXT_FULL_FIELD","CLAUDE_MEM_CONTEXT_SESSION_COUNT","CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY","CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE"];for(let c of o)r.body[c]!==void 0&&(s[c]=r.body[c]);(0,pr.writeFileSync)(a,JSON.stringify(s,null,2),"utf-8"),jz(),T.info("WORKER","Settings updated"),n.json({success:!0,message:"Settings updated successfully"})});handleGetMcpStatus=this.wrapHandler((r,n)=>{let i=this.isMcpEnabled();n.json({enabled:i})});handleToggleMcp=this.wrapHandler((r,n)=>{let{enabled:i}=r.body;if(typeof i!="boolean"){this.badRequest(n,"enabled must be a boolean");return}this.toggleMcp(i),n.json({success:!0,enabled:this.isMcpEnabled()})});handleGetBranchStatus=this.wrapHandler((r,n)=>{let i=Xh();n.json(i)});handleSwitchBranch=this.wrapHandler(async(r,n)=>{let{branch:i}=r.body;if(!i){n.status(400).json({success:!1,error:"Missing branch parameter"});return}let a=["main","beta/7.0","feature/bun-executable"];if(!a.includes(i)){n.status(400).json({success:!1,error:`Invalid branch. Allowed: ${a.join(", ")}`});return}T.info("WORKER","Branch switch requested",{branch:i});let s=await Q2(i);s.success&&setTimeout(()=>{T.info("WORKER","Restarting worker after branch switch"),process.exit(0)},1e3),n.json(s)});handleUpdateBranch=this.wrapHandler(async(r,n)=>{T.info("WORKER","Branch update requested");let i=await e6();i.success&&setTimeout(()=>{T.info("WORKER","Restarting worker after branch update"),process.exit(0)},1e3),n.json(i)});validateSettings(r){if(r.CLAUDE_MEM_PROVIDER&&!["claude","gemini","openrouter"].includes(r.CLAUDE_MEM_PROVIDER))return{valid:!1,error:'CLAUDE_MEM_PROVIDER must be "claude", "gemini", or "openrouter"'};if(r.CLAUDE_MEM_GEMINI_MODEL&&!["gemini-2.5-flash-lite","gemini-2.5-flash","gemini-3-flash"].includes(r.CLAUDE_MEM_GEMINI_MODEL))return{valid:!1,error:"CLAUDE_MEM_GEMINI_MODEL must be one of: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash"};if(r.CLAUDE_MEM_CONTEXT_OBSERVATIONS){let i=parseInt(r.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10);if(isNaN(i)||i<1||i>200)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_OBSERVATIONS must be between 1 and 200"}}if(r.CLAUDE_MEM_WORKER_PORT){let i=parseInt(r.CLAUDE_MEM_WORKER_PORT,10);if(isNaN(i)||i<1024||i>65535)return{valid:!1,error:"CLAUDE_MEM_WORKER_PORT must be between 1024 and 65535"}}if(r.CLAUDE_MEM_WORKER_HOST){let i=r.CLAUDE_MEM_WORKER_HOST;if(!/^(127\.0\.0\.1|0\.0\.0\.0|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.test(i))return{valid:!1,error:"CLAUDE_MEM_WORKER_HOST must be a valid IP address (e.g., 127.0.0.1, 0.0.0.0)"}}if(r.CLAUDE_MEM_LOG_LEVEL&&!["DEBUG","INFO","WARN","ERROR","SILENT"].includes(r.CLAUDE_MEM_LOG_LEVEL.toUpperCase()))return{valid:!1,error:"CLAUDE_MEM_LOG_LEVEL must be one of: DEBUG, INFO, WARN, ERROR, SILENT"};if(r.CLAUDE_MEM_PYTHON_VERSION&&!/^3\.\d{1,2}$/.test(r.CLAUDE_MEM_PYTHON_VERSION))return{valid:!1,error:'CLAUDE_MEM_PYTHON_VERSION must be in format "3.X" or "3.XX" (e.g., "3.13")'};let n=["CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT","CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT","CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY","CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE"];for(let i of n)if(r[i]&&!["true","false"].includes(r[i]))return{valid:!1,error:`${i} must be "true" or "false"`};if(r.CLAUDE_MEM_CONTEXT_FULL_COUNT){let i=parseInt(r.CLAUDE_MEM_CONTEXT_FULL_COUNT,10);if(isNaN(i)||i<0||i>20)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_FULL_COUNT must be between 0 and 20"}}if(r.CLAUDE_MEM_CONTEXT_SESSION_COUNT){let i=parseInt(r.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10);if(isNaN(i)||i<1||i>50)return{valid:!1,error:"CLAUDE_MEM_CONTEXT_SESSION_COUNT must be between 1 and 50"}}if(r.CLAUDE_MEM_CONTEXT_FULL_FIELD&&!["narrative","facts"].includes(r.CLAUDE_MEM_CONTEXT_FULL_FIELD))return{valid:!1,error:'CLAUDE_MEM_CONTEXT_FULL_FIELD must be "narrative" or "facts"'};if(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES){let i=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES,10);if(isNaN(i)||i<1||i>100)return{valid:!1,error:"CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES must be between 1 and 100"}}if(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS){let i=parseInt(r.CLAUDE_MEM_OPENROUTER_MAX_TOKENS,10);if(isNaN(i)||i<1e3||i>1e6)return{valid:!1,error:"CLAUDE_MEM_OPENROUTER_MAX_TOKENS must be between 1000 and 1000000"}}if(r.CLAUDE_MEM_OPENROUTER_SITE_URL)try{new URL(r.CLAUDE_MEM_OPENROUTER_SITE_URL)}catch{return{valid:!1,error:"CLAUDE_MEM_OPENROUTER_SITE_URL must be a valid URL"}}return{valid:!0}}isMcpEnabled(){let r=Hr(),n=hs.default.join(r,"plugin",".mcp.json");return(0,pr.existsSync)(n)}toggleMcp(r){let n=Hr(),i=hs.default.join(n,"plugin",".mcp.json"),a=hs.default.join(n,"plugin",".mcp.json.disabled");r&&(0,pr.existsSync)(a)?((0,pr.renameSync)(a,i),T.info("WORKER","MCP search server enabled")):!r&&(0,pr.existsSync)(i)?((0,pr.renameSync)(i,a),T.info("WORKER","MCP search server disabled")):T.debug("WORKER","MCP toggle no-op (already in desired state)",{enabled:r})}ensureSettingsFile(r){if(!(0,pr.existsSync)(r)){let n=nt.getAllDefaults(),i=hs.default.dirname(r);(0,pr.existsSync)(i)||(0,pr.mkdirSync)(i,{recursive:!0}),(0,pr.writeFileSync)(r,JSON.stringify(n,null,2),"utf-8"),T.info("SETTINGS","Created settings file with defaults",{settingsPath:r})}}};var _d=(0,n6.promisify)(ba.exec),ude="8.5.2",$$=be.default.join((0,Vn.homedir)(),".claude-mem"),vs=be.default.join($$,"worker.pid"),i6=be.default.join($$,"cursor-projects.json");function w$(t){(0,je.mkdirSync)($$,{recursive:!0}),(0,je.writeFileSync)(vs,JSON.stringify(t,null,2))}function lde(){try{return(0,je.existsSync)(vs)?JSON.parse((0,je.readFileSync)(vs,"utf-8")):null}catch(t){return T.warn("SYSTEM","Failed to read PID file",{path:vs,error:t.message}),null}}function _a(){try{(0,je.existsSync)(vs)&&(0,je.unlinkSync)(vs)}catch(t){T.warn("SYSTEM","Failed to remove PID file",{path:vs,error:t.message})}}function E$(){return Az(i6)}function a6(t){Mz(i6,t)}function dde(t,e){let r=E$();r[t]={workspacePath:e,installedAt:new Date().toISOString()},a6(r),T.info("CURSOR","Registered project for auto-context updates",{projectName:t,workspacePath:e})}function pde(t){let e=E$();e[t]&&(delete e[t],a6(e),T.info("CURSOR","Unregistered project",{projectName:t}))}async function ds(t,e){let n=E$()[t];if(n)try{let i=await fetch(`http://127.0.0.1:${e}/api/context/inject?project=${encodeURIComponent(t)}`);if(!i.ok)return;let a=await i.text();if(!a||!a.trim())return;zz(n.workspacePath,a),T.debug("CURSOR","Updated context file",{projectName:t,workspacePath:n.workspacePath})}catch(i){T.warn("CURSOR","Failed to update context file",{projectName:t,error:i.message})}}function gs(t){return process.platform==="win32"?Math.round(t*2):t}async function S$(t){try{return(await fetch(`http://127.0.0.1:${t}/api/health`)).ok}catch{return!1}}async function _c(t,e=3e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}async function _$(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/admin/shutdown`,{method:"POST"});return e.ok?!0:(T.warn("SYSTEM","Shutdown request returned error",{port:t,status:e.status}),!1)}catch(e){return e.message?.includes("ECONNREFUSED")||T.warn("SYSTEM","Shutdown request failed",{port:t,error:e.message}),!1}}async function b$(t,e=1e4){let r=Date.now();for(;Date.now()-rsetTimeout(n,500))}return!1}function fde(){let t=be.default.join((0,Vn.homedir)(),".claude","plugins","marketplaces","thedotmack"),e=be.default.join(t,"package.json");return JSON.parse((0,je.readFileSync)(e,"utf-8")).version}async function mde(t){try{let e=await fetch(`http://127.0.0.1:${t}/api/version`);return e.ok?(await e.json()).version:null}catch{return null}}async function hde(t){let e=fde(),r=await mde(t);return r?{matches:e===r,pluginVersion:e,workerVersion:r}:{matches:!0,pluginVersion:e,workerVersion:r}}var Qh=class{app;server=null;startTime=Date.now();mcpClient;mcpReady=!1;initializationCompleteFlag=!1;isShuttingDown=!1;dbManager;sessionManager;sseBroadcaster;sdkAgent;geminiAgent;openRouterAgent;paginationHelper;settingsManager;sessionEventBroadcaster;viewerRoutes;sessionRoutes;dataRoutes;searchRoutes;settingsRoutes;initializationComplete;resolveInitialization;constructor(){this.app=(0,t6.default)(),this.initializationComplete=new Promise(e=>{this.resolveInitialization=e}),this.dbManager=new Fm,this.sessionManager=new Vm(this.dbManager),this.sseBroadcaster=new Bm,this.sdkAgent=new Ph(this.dbManager,this.sessionManager),this.geminiAgent=new Oh(this.dbManager,this.sessionManager),this.geminiAgent.setFallbackAgent(this.sdkAgent),this.openRouterAgent=new Nh(this.dbManager,this.sessionManager),this.openRouterAgent.setFallbackAgent(this.sdkAgent),this.paginationHelper=new jh(this.dbManager),this.settingsManager=new Ah(this.dbManager),this.sessionEventBroadcaster=new qh(this.sseBroadcaster,this),this.sessionManager.setOnSessionDeleted(()=>{this.broadcastProcessingStatus()}),this.mcpClient=new jo({name:"worker-search-proxy",version:"1.0.0"},{capabilities:{}}),this.viewerRoutes=new Fh(this.sseBroadcaster,this.dbManager,this.sessionManager),this.sessionRoutes=new Vh(this.sessionManager,this.dbManager,this.sdkAgent,this.geminiAgent,this.openRouterAgent,this.sessionEventBroadcaster,this),this.dataRoutes=new Bh(this.paginationHelper,this.dbManager,this.sessionManager,this.sseBroadcaster,this,this.startTime),this.searchRoutes=null,this.settingsRoutes=new Yh(this.settingsManager),this.setupMiddleware(),this.setupRoutes(),this.registerSignalHandlers()}registerSignalHandlers(){let e=async r=>{if(this.isShuttingDown){T.warn("SYSTEM",`Received ${r} but shutdown already in progress`);return}this.isShuttingDown=!0,T.info("SYSTEM",`Received ${r}, shutting down...`);try{await this.shutdown(),process.exit(0)}catch(n){T.error("SYSTEM","Error during shutdown",{},n),process.exit(1)}};process.on("SIGTERM",()=>e("SIGTERM")),process.on("SIGINT",()=>e("SIGINT"))}setupMiddleware(){q2(this.summarizeRequestBody.bind(this)).forEach(r=>this.app.use(r))}setupRoutes(){let e="TEST-008-wrapper-ipc";this.app.get("/api/health",(r,n)=>{n.status(200).json({status:"ok",build:e,managed:process.env.CLAUDE_MEM_MANAGED==="true",hasIpc:typeof process.send=="function",platform:process.platform,pid:process.pid,initialized:this.initializationCompleteFlag,mcpReady:this.mcpReady})}),this.app.get("/api/readiness",(r,n)=>{this.initializationCompleteFlag?n.status(200).json({status:"ready",mcpReady:this.mcpReady}):n.status(503).json({status:"initializing",message:"Worker is still initializing, please retry"})}),this.app.get("/api/version",(r,n)=>{n.status(200).json({version:ude})}),this.app.get("/api/instructions",async(r,n)=>{let i=r.query.topic||"all",a=r.query.operation;try{let s;if(a){let o=be.default.join(__dirname,"../skills/mem-search/operations",`${a}.md`);s=await x$.promises.readFile(o,"utf-8")}else{let o=be.default.join(__dirname,"../skills/mem-search/SKILL.md"),c=await x$.promises.readFile(o,"utf-8");s=this.extractInstructionSection(c,i)}n.json({content:[{type:"text",text:s}]})}catch(s){T.error("WORKER","Failed to load instructions",{topic:i,operation:a},s),n.status(500).json({content:[{type:"text",text:`Error loading instructions: ${s instanceof Error?s.message:"Unknown error"}`}],isError:!0})}}),this.app.post("/api/admin/restart",l$,async(r,n)=>{n.json({status:"restarting"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(T.info("SYSTEM","Sending restart request to wrapper"),process.send({type:"restart"})):setTimeout(async()=>{await this.shutdown(),process.exit(0)},100)}),this.app.post("/api/admin/shutdown",l$,async(r,n)=>{n.json({status:"shutting_down"}),process.platform==="win32"&&process.env.CLAUDE_MEM_MANAGED==="true"&&process.send?(T.info("SYSTEM","Sending shutdown request to wrapper"),process.send({type:"shutdown"})):setTimeout(async()=>{await this.shutdown(),process.exit(0)},100)}),this.viewerRoutes.setupRoutes(this.app),this.sessionRoutes.setupRoutes(this.app),this.dataRoutes.setupRoutes(this.app),this.settingsRoutes.setupRoutes(this.app),this.app.get("/api/context/inject",async(r,n,i)=>{try{let s=new Promise((o,c)=>setTimeout(()=>c(new Error("Initialization timeout")),3e5));if(await Promise.race([this.initializationComplete,s]),!this.searchRoutes){n.status(503).json({error:"Search routes not initialized"});return}i()}catch(a){T.error("WORKER","Context inject handler failed",{},a),n.headersSent||n.status(500).json({error:a instanceof Error?a.message:"Internal server error"})}})}async cleanupOrphanedProcesses(){let e=process.platform==="win32",r=[];if(e){let n=`powershell -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -like '*python*' -and $_.CommandLine -like '*chroma-mcp*' } | Select-Object -ExpandProperty ProcessId"`,{stdout:i}=await _d(n,{timeout:6e4});if(!i.trim()){T.debug("SYSTEM","No orphaned chroma-mcp processes found (Windows)");return}let a=i.trim().split(` `);for(let s of a){let o=parseInt(s.trim(),10);!isNaN(o)&&Number.isInteger(o)&&o>0&&r.push(o)}}else{let{stdout:n}=await _d('ps aux | grep "chroma-mcp" | grep -v grep || true');if(!n.trim()){T.debug("SYSTEM","No orphaned chroma-mcp processes found (Unix)");return}let i=n.trim().split(` -`);for(let a of i){let s=a.trim().split(/\s+/);if(s.length>1){let o=parseInt(s[1],10);!isNaN(o)&&Number.isInteger(o)&&o>0&&r.push(o)}}}if(r.length!==0){if(T.info("SYSTEM","Cleaning up orphaned chroma-mcp processes",{platform:e?"Windows":"Unix",count:r.length,pids:r}),e)for(let n of r){if(!Number.isInteger(n)||n<=0){T.warn("SYSTEM","Skipping invalid PID",{pid:n});continue}try{(0,ba.execSync)(`taskkill /PID ${n} /T /F`,{timeout:6e4,stdio:"ignore"})}catch{}}else for(let n of r)try{process.kill(n,"SIGKILL")}catch{}T.info("SYSTEM","Orphaned processes cleaned up",{count:r.length})}}async start(){let e=Rr(),r=Nz();this.server=await new Promise((n,i)=>{let a=this.app.listen(e,r,()=>n(a));a.on("error",i)}),T.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{T.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await this.cleanupOrphanedProcesses();let{ModeManager:e}=await Promise.resolve().then(()=>(ui(),Yz)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(yn(),Oz)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(rn(),Bz)),a=r.loadFromFile(n).CLAUDE_MEM_MODE;e.getInstance().loadMode(a),T.info("SYSTEM",`Mode loaded: ${a}`),await this.dbManager.initialize();let{PendingMessageStore:s}=await Promise.resolve().then(()=>(Vl(),Zm)),o=new s(this.dbManager.getSessionStore().db,3),c=300*1e3,u=o.resetStuckMessages(c);u>0&&T.info("SYSTEM",`Recovered ${u} stuck messages from previous session`,{thresholdMinutes:5});let l=new Dh,d=new Uh,p=new zh(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),l,d);this.searchRoutes=new Jh(p),this.searchRoutes.setupRoutes(this.app),T.info("WORKER","SearchManager initialized and search routes registered");let f=be.default.join(__dirname,"mcp-server.cjs"),v=new zo({command:"node",args:[f],env:process.env}),_=3e5,h=this.mcpClient.connect(v),m=new Promise((y,g)=>setTimeout(()=>g(new Error("MCP connection timeout after 5 minutes")),_));await Promise.race([h,m]),this.mcpReady=!0,T.success("WORKER","Connected to MCP server"),this.initializationCompleteFlag=!0,this.resolveInitialization(),T.info("SYSTEM","Background initialization complete"),this.processPendingQueues(50).then(y=>{y.sessionsStarted>0&&T.info("SYSTEM",`Auto-recovered ${y.sessionsStarted} sessions with pending work`,{totalPending:y.totalPendingSessions,started:y.sessionsStarted,sessionIds:y.startedSessionIds})}).catch(y=>{T.warn("SYSTEM","Auto-recovery of pending queues failed",{},y)})}catch(e){throw T.error("SYSTEM","Background initialization failed",{},e),e}}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId;T.info("SYSTEM",`Starting generator (${r})`,{sessionId:n}),e.generatorPromise=this.sdkAgent.startSession(e,this).catch(i=>{e.abortController.signal.aborted||T.error("SYSTEM",`Generator failed (${r})`,{sessionId:n,error:i.message},i)}).finally(()=>{e.generatorPromise=null,this.broadcastProcessingStatus(),e.abortController.signal.aborted||T.warn("SYSTEM","Session processor exited unexpectedly",{sessionId:n})})}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Vl(),Zm)),n=new r(this.dbManager.getSessionStore().db,3),i=n.getSessionsWithPendingMessages(),a={totalPendingSessions:i.length,sessionsStarted:0,sessionsSkipped:0,startedSessionIds:[]};if(i.length===0)return a;T.info("SYSTEM",`Processing up to ${e} of ${i.length} pending session queues`);for(let s of i){if(a.sessionsStarted>=e)break;try{if(this.sessionManager.getSession(s)?.generatorPromise){a.sessionsSkipped++;continue}let c=this.sessionManager.initializeSession(s);T.info("SYSTEM",`Starting processor for session ${s}`,{project:c.project,pendingCount:n.getPendingCount(s)}),this.startSessionProcessor(c,"startup-recovery"),a.sessionsStarted++,a.startedSessionIds.push(s),await new Promise(u=>setTimeout(u,100))}catch(o){T.warn("SYSTEM",`Failed to process session ${s}`,{},o),a.sessionsSkipped++}}return a}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),a=e.indexOf(n);return i===-1?e:a===-1?e.substring(i):e.substring(i,a).trim()}async shutdown(){T.info("SYSTEM","Shutdown initiated"),_a();let e=await this.getChildProcesses(process.pid);if(T.info("SYSTEM","Found child processes",{count:e.length,pids:e}),this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(r=>setTimeout(r,500)),await new Promise((r,n)=>{this.server.close(i=>i?n(i):r())}),this.server=null,T.info("SYSTEM","HTTP server closed"),process.platform==="win32"&&(await new Promise(r=>setTimeout(r,500)),T.info("SYSTEM","Waited for Windows port cleanup"))),await this.sessionManager.shutdownAll(),this.mcpClient&&(await this.mcpClient.close(),T.info("SYSTEM","MCP client closed")),await this.dbManager.close(),e.length>0){T.info("SYSTEM","Force killing remaining children");for(let r of e)await this.forceKillProcess(r);await this.waitForProcessesExit(e,5e3)}T.info("SYSTEM","Worker shutdown complete")}async getChildProcesses(e){if(process.platform!=="win32")return[];if(!Number.isInteger(e)||e<=0)return T.warn("SYSTEM","Invalid parent PID for child process enumeration",{parentPid:e}),[];try{let r=`powershell -Command "Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq ${e} } | Select-Object -ExpandProperty ProcessId"`,{stdout:n}=await _d(r,{timeout:6e4});return n.trim().split(` +`);for(let a of i){let s=a.trim().split(/\s+/);if(s.length>1){let o=parseInt(s[1],10);!isNaN(o)&&Number.isInteger(o)&&o>0&&r.push(o)}}}if(r.length!==0){if(T.info("SYSTEM","Cleaning up orphaned chroma-mcp processes",{platform:e?"Windows":"Unix",count:r.length,pids:r}),e)for(let n of r){if(!Number.isInteger(n)||n<=0){T.warn("SYSTEM","Skipping invalid PID",{pid:n});continue}try{(0,ba.execSync)(`taskkill /PID ${n} /T /F`,{timeout:6e4,stdio:"ignore"})}catch{}}else for(let n of r)try{process.kill(n,"SIGKILL")}catch{}T.info("SYSTEM","Orphaned processes cleaned up",{count:r.length})}}async start(){let e=Rr(),r=Nz();this.server=await new Promise((n,i)=>{let a=this.app.listen(e,r,()=>n(a));a.on("error",i)}),T.info("SYSTEM","Worker started",{host:r,port:e,pid:process.pid}),this.initializeBackground().catch(n=>{T.error("SYSTEM","Background initialization failed",{},n)})}async initializeBackground(){try{await this.cleanupOrphanedProcesses();let{ModeManager:e}=await Promise.resolve().then(()=>(ui(),Yz)),{SettingsDefaultsManager:r}=await Promise.resolve().then(()=>(yn(),Oz)),{USER_SETTINGS_PATH:n}=await Promise.resolve().then(()=>(rn(),Bz)),a=r.loadFromFile(n).CLAUDE_MEM_MODE;e.getInstance().loadMode(a),T.info("SYSTEM",`Mode loaded: ${a}`),await this.dbManager.initialize();let{PendingMessageStore:s}=await Promise.resolve().then(()=>(Vl(),Zm)),o=new s(this.dbManager.getSessionStore().db,3),c=300*1e3,u=o.resetStuckMessages(c);u>0&&T.info("SYSTEM",`Recovered ${u} stuck messages from previous session`,{thresholdMinutes:5});let l=new Dh,d=new Uh,p=new zh(this.dbManager.getSessionSearch(),this.dbManager.getSessionStore(),this.dbManager.getChromaSync(),l,d);this.searchRoutes=new Jh(p),this.searchRoutes.setupRoutes(this.app),T.info("WORKER","SearchManager initialized and search routes registered");let f=be.default.join(__dirname,"mcp-server.cjs"),v=new zo({command:"node",args:[f],env:process.env}),_=3e5,h=this.mcpClient.connect(v),m=new Promise((y,g)=>setTimeout(()=>g(new Error("MCP connection timeout after 5 minutes")),_));await Promise.race([h,m]),this.mcpReady=!0,T.success("WORKER","Connected to MCP server"),this.initializationCompleteFlag=!0,this.resolveInitialization(),T.info("SYSTEM","Background initialization complete"),this.processPendingQueues(50).then(y=>{y.sessionsStarted>0&&T.info("SYSTEM",`Auto-recovered ${y.sessionsStarted} sessions with pending work`,{totalPending:y.totalPendingSessions,started:y.sessionsStarted,sessionIds:y.startedSessionIds})}).catch(y=>{T.warn("SYSTEM","Auto-recovery of pending queues failed",{},y)})}catch(e){throw T.error("SYSTEM","Background initialization failed",{},e),e}}startSessionProcessor(e,r){if(!e)return;let n=e.sessionDbId;T.info("SYSTEM",`Starting generator (${r})`,{sessionId:n}),e.generatorPromise=this.sdkAgent.startSession(e,this).catch(i=>{}).finally(()=>{e.generatorPromise=null,this.broadcastProcessingStatus()})}async processPendingQueues(e=10){let{PendingMessageStore:r}=await Promise.resolve().then(()=>(Vl(),Zm)),n=new r(this.dbManager.getSessionStore().db,3),i=n.getSessionsWithPendingMessages(),a={totalPendingSessions:i.length,sessionsStarted:0,sessionsSkipped:0,startedSessionIds:[]};if(i.length===0)return a;T.info("SYSTEM",`Processing up to ${e} of ${i.length} pending session queues`);for(let s of i){if(a.sessionsStarted>=e)break;try{if(this.sessionManager.getSession(s)?.generatorPromise){a.sessionsSkipped++;continue}let c=this.sessionManager.initializeSession(s);T.info("SYSTEM",`Starting processor for session ${s}`,{project:c.project,pendingCount:n.getPendingCount(s)}),this.startSessionProcessor(c,"startup-recovery"),a.sessionsStarted++,a.startedSessionIds.push(s),await new Promise(u=>setTimeout(u,100))}catch(o){T.warn("SYSTEM",`Failed to process session ${s}`,{},o),a.sessionsSkipped++}}return a}extractInstructionSection(e,r){let n={workflow:this.extractBetween(e,"## The Workflow","## Search Parameters"),search_params:this.extractBetween(e,"## Search Parameters","## Examples"),examples:this.extractBetween(e,"## Examples","## Why This Workflow"),all:e};return n[r]||n.all}extractBetween(e,r,n){let i=e.indexOf(r),a=e.indexOf(n);return i===-1?e:a===-1?e.substring(i):e.substring(i,a).trim()}async shutdown(){T.info("SYSTEM","Shutdown initiated"),_a();let e=await this.getChildProcesses(process.pid);if(T.info("SYSTEM","Found child processes",{count:e.length,pids:e}),this.server&&(this.server.closeAllConnections(),process.platform==="win32"&&await new Promise(r=>setTimeout(r,500)),await new Promise((r,n)=>{this.server.close(i=>i?n(i):r())}),this.server=null,T.info("SYSTEM","HTTP server closed"),process.platform==="win32"&&(await new Promise(r=>setTimeout(r,500)),T.info("SYSTEM","Waited for Windows port cleanup"))),await this.sessionManager.shutdownAll(),this.mcpClient&&(await this.mcpClient.close(),T.info("SYSTEM","MCP client closed")),await this.dbManager.close(),e.length>0){T.info("SYSTEM","Force killing remaining children");for(let r of e)await this.forceKillProcess(r);await this.waitForProcessesExit(e,5e3)}T.info("SYSTEM","Worker shutdown complete")}async getChildProcesses(e){if(process.platform!=="win32")return[];if(!Number.isInteger(e)||e<=0)return T.warn("SYSTEM","Invalid parent PID for child process enumeration",{parentPid:e}),[];try{let r=`powershell -Command "Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq ${e} } | Select-Object -ExpandProperty ProcessId"`,{stdout:n}=await _d(r,{timeout:6e4});return n.trim().split(` `).map(i=>parseInt(i.trim(),10)).filter(i=>!isNaN(i)&&Number.isInteger(i)&&i>0)}catch(r){return T.warn("SYSTEM","Failed to enumerate child processes",{parentPid:e,error:r.message}),[]}}async forceKillProcess(e){if(!Number.isInteger(e)||e<=0){T.warn("SYSTEM","Invalid PID for force kill",{pid:e});return}try{process.platform==="win32"?await _d(`taskkill /PID ${e} /T /F`,{timeout:6e4}):process.kill(e,"SIGKILL"),T.info("SYSTEM","Killed process",{pid:e})}catch{T.debug("SYSTEM","Process already exited during force kill",{pid:e})}}async waitForProcessesExit(e,r){let n=Date.now();for(;Date.now()-n{try{return process.kill(a,0),!0}catch{return!1}});if(i.length===0){T.info("SYSTEM","All child processes exited");return}T.debug("SYSTEM","Waiting for processes to exit",{stillAlive:i}),await new Promise(a=>setTimeout(a,100))}T.warn("SYSTEM","Timeout waiting for child processes to exit")}summarizeRequestBody(e,r,n){return L2(e,r,n)}broadcastProcessingStatus(){let e=this.sessionManager.isAnySessionProcessing(),r=this.sessionManager.getTotalActiveWork(),n=this.sessionManager.getActiveSessionCount();T.info("WORKER","Broadcasting processing status",{isProcessing:e,queueDepth:r,activeSessions:n}),this.sseBroadcaster.broadcast({type:"processing_status",isProcessing:e,queueDepth:r})}};async function gde(){let t=r6.createInterface({input:process.stdin,output:process.stdout}),e=r=>new Promise(n=>t.question(r,n));console.log(` \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557 \u2551 Claude-Mem Cursor Setup Wizard \u2551 diff --git a/src/services/worker-service.ts b/src/services/worker-service.ts index d8d3839d..342d088d 100644 --- a/src/services/worker-service.ts +++ b/src/services/worker-service.ts @@ -747,25 +747,10 @@ export class WorkerService { session.generatorPromise = this.sdkAgent.startSession(session, this) .catch(error => { - // Only log if not aborted - if (session.abortController.signal.aborted) return; - - logger.error('SYSTEM', `Generator failed (${source})`, { - sessionId: sid, - error: error.message - }, error); }) .finally(() => { session.generatorPromise = null; this.broadcastProcessingStatus(); - - // Crash recovery: if not aborted, check if we should restart - if (!session.abortController.signal.aborted) { - // We can check if there are pending messages to decide if restart is urgent - // But generally, if it crashed, we might want to restart? - // For now, let's just log. The user/system can trigger restart if needed. - logger.warn('SYSTEM', `Session processor exited unexpectedly`, { sessionId: sid }); - } }); } diff --git a/src/services/worker/SDKAgent.ts b/src/services/worker/SDKAgent.ts index 7d5d3ab9..bf34a8bf 100644 --- a/src/services/worker/SDKAgent.ts +++ b/src/services/worker/SDKAgent.ts @@ -41,7 +41,10 @@ export class SDKAgent { * @param worker WorkerService reference for spinner control (optional) */ async startSession(session: ActiveSession, worker?: any): Promise { - try { + + + + // Find Claude executable const claudePath = this.findClaudeExecutable(); @@ -183,18 +186,8 @@ export class SDKAgent { duration: `${(sessionDuration / 1000).toFixed(1)}s` }); - } catch (error: any) { - if (error.name === 'AbortError') { - logger.warn('SDK', 'Agent aborted', { sessionId: session.sessionDbId }); - } else { - logger.failure('SDK', 'Agent error', { sessionDbId: session.sessionDbId }, error); - } - throw error; - } finally { - // NOTE: Do NOT delete session here - SessionRoutes.finally() handles cleanup - // and auto-restart logic. Deleting here races with pending work checks. + } - } /** * Create event-driven message generator (yields messages from SessionManager)