keepmind 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
- "use strict";var ms=Object.create;var q=Object.defineProperty;var Es=Object.getOwnPropertyDescriptor;var gs=Object.getOwnPropertyNames;var Ts=Object.getPrototypeOf,fs=Object.prototype.hasOwnProperty;var bs=(r,e)=>{for(var t in e)q(r,t,{get:e[t],enumerable:!0})},He=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of gs(e))!fs.call(r,n)&&n!==t&&q(r,n,{get:()=>e[n],enumerable:!(s=Es(e,n))||s.enumerable});return r};var G=(r,e,t)=>(t=r!=null?ms(Ts(r)):{},He(e||!r||!r.__esModule?q(t,"default",{value:r,enumerable:!0}):t,r)),Ss=r=>He(q({},"__esModule",{value:!0}),r);var Rr={};bs(Rr,{generateContext:()=>ps,generateContextWithStats:()=>Ge});module.exports=Ss(Rr);var cs=G(require("path"),1),_s=require("os"),ls=require("fs");var je=require("node:sqlite");function Be(r){return typeof r=="bigint"?Number(r):r}function hs(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)&&!(r instanceof Uint8Array)&&!(typeof Buffer<"u"&&Buffer.isBuffer(r))}function Xe(r){return r===void 0?null:typeof r=="boolean"?r?1:0:r}function J(r){let e=r;if(e.length===1&&Array.isArray(e[0])&&(e=e[0]),e.length===1&&hs(e[0])){let t=e[0],s={};for(let n of Object.keys(t))s[n]=Xe(t[n]);return[s]}return e.map(Xe)}var ge=class{constructor(e){this.stmt=e}stmt;all(...e){return this.stmt.all(...J(e))}get(...e){return this.stmt.get(...J(e))??null}run(...e){let t=this.stmt.run(...J(e));return{changes:Be(t.changes),lastInsertRowid:Be(t.lastInsertRowid)}}values(...e){return this.stmt.all(...J(e)).map(s=>Object.values(s))}finalize(){}},H=class{db;queryCache=new Map;safeIntegers;txDepth=0;filename;constructor(e,t={}){let s=t.readonly===!0;this.safeIntegers=t.safeIntegers===!0;let n=e&&e.length>0?e:":memory:";if(this.filename=n,this.db=new je.DatabaseSync(n,{readOnly:s,allowExtension:!0}),!s&&n!==":memory:")try{this.db.exec("PRAGMA journal_mode=WAL")}catch{}}wrap(e){return this.safeIntegers&&e.setReadBigInts(!0),new ge(e)}prepare(e){return this.wrap(this.db.prepare(e))}query(e){let t=this.queryCache.get(e);if(t)return t;let s=this.prepare(e);return this.queryCache.set(e,s),s}run(e,...t){return t.length===0?(this.db.exec(e),{changes:0,lastInsertRowid:0}):this.prepare(e).run(...t)}exec(e){this.db.exec(e)}loadExtension(e,t){this.db.loadExtension(e)}transaction(e){return(...t)=>{let s=this.txDepth===0,n=`__cm_sp_${this.txDepth}`;s?this.db.exec("BEGIN"):this.db.exec(`SAVEPOINT ${n}`),this.txDepth++;try{let o=e(...t);return this.txDepth--,s?this.db.exec("COMMIT"):this.db.exec(`RELEASE ${n}`),o}catch(o){throw this.txDepth--,s?this.db.exec("ROLLBACK"):(this.db.exec(`ROLLBACK TO ${n}`),this.db.exec(`RELEASE ${n}`)),o}}}close(){this.db.close()}};var T=require("path"),Re=require("os"),v=require("fs");var We=require("url");var U=require("fs"),be=require("path");var Rs=null;function Os(r){return(Rs??process.stderr.write.bind(process.stderr))(r)}function Te(r){Os(r)}var As=14,Se=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.WARN=2]="WARN",o[o.ERROR=3]="ERROR",o[o.SILENT=4]="SILENT",o))(Se||{}),fe=null,he=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=F.logsDir();(0,U.existsSync)(e)||(0,U.mkdirSync)(e,{recursive:!0});let t=new Date().toISOString().split("T")[0];this.logFilePath=(0,be.join)(e,`keepmind-${t}.log`),this.pruneOldLogs(e)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e instanceof Error?e.message:String(e)),this.logFilePath=null}}}pruneOldLogs(e){try{let t=Date.now()-As*24*60*60*1e3;for(let s of(0,U.readdirSync)(e)){let n=/^keepmind-(\d{4}-\d{2}-\d{2})\.log$/.exec(s);if(!n)continue;let o=Date.parse(n[1]);if(Number.isFinite(o)&&o<t)try{(0,U.unlinkSync)((0,be.join)(e,s))}catch{}}}catch{}}getLevel(){if(this.level===null)try{let e=F.settings();if((0,U.existsSync)(e)){let t=(0,U.readFileSync)(e,"utf-8"),n=(JSON.parse(t).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=Se[n]??1}else this.level=1}catch(e){console.error("[LOGGER] Failed to load log level from settings:",e instanceof Error?e.message:String(e)),this.level=1}return this.level}formatData(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="object"){if(e instanceof Error)return this.getLevel()===0?`${e.message}
2
- ${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let t=Object.keys(e);return t.length===0?"{}":t.length<=3?JSON.stringify(e):`{${t.length} keys: ${t.slice(0,3).join(", ")}...}`}return String(e)}formatTool(e,t){if(!t)return e;let s=t;if(typeof t=="string")try{s=JSON.parse(t)}catch{s=t}if(e==="Bash"&&s.command)return`${e}(${s.command})`;if(s.file_path)return`${e}(${s.file_path})`;if(s.notebook_path)return`${e}(${s.notebook_path})`;if(e==="Glob"&&s.pattern)return`${e}(${s.pattern})`;if(e==="Grep"&&s.pattern)return`${e}(${s.pattern})`;if(s.url)return`${e}(${s.url})`;if(s.query)return`${e}(${s.query})`;if(e==="Task"){if(s.subagent_type)return`${e}(${s.subagent_type})`;if(s.description)return`${e}(${s.description})`}return e==="Skill"&&s.skill?`${e}(${s.skill})`:e==="LSP"&&s.operation?`${e}(${s.operation})`:e}formatTimestamp(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),d=String(e.getMilliseconds()).padStart(3,"0");return`${t}-${s}-${n} ${o}:${i}:${a}.${d}`}log(e,t,s,n,o){if(e<this.getLevel())return;this.ensureLogFileInitialized();let i=this.formatTimestamp(new Date),a=Se[e].padEnd(5),d=t.padEnd(6),u="";n?.correlationId?u=`[${n.correlationId}] `:n?.sessionId&&(u=`[session-${n.sessionId}] `);let c="";if(o!=null)if(o instanceof Error)c=this.getLevel()===0?`
1
+ "use strict";var ms=Object.create;var q=Object.defineProperty;var Es=Object.getOwnPropertyDescriptor;var gs=Object.getOwnPropertyNames;var Ts=Object.getPrototypeOf,fs=Object.prototype.hasOwnProperty;var bs=(r,e)=>{for(var t in e)q(r,t,{get:e[t],enumerable:!0})},He=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of gs(e))!fs.call(r,n)&&n!==t&&q(r,n,{get:()=>e[n],enumerable:!(s=Es(e,n))||s.enumerable});return r};var G=(r,e,t)=>(t=r!=null?ms(Ts(r)):{},He(e||!r||!r.__esModule?q(t,"default",{value:r,enumerable:!0}):t,r)),Ss=r=>He(q({},"__esModule",{value:!0}),r);var Rr={};bs(Rr,{generateContext:()=>ps,generateContextWithStats:()=>Ge});module.exports=Ss(Rr);var cs=G(require("path"),1),ls=require("os"),_s=require("fs");var je=require("node:sqlite");function Be(r){return typeof r=="bigint"?Number(r):r}function hs(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)&&!(r instanceof Uint8Array)&&!(typeof Buffer<"u"&&Buffer.isBuffer(r))}function Xe(r){return r===void 0?null:typeof r=="boolean"?r?1:0:r}function J(r){let e=r;if(e.length===1&&Array.isArray(e[0])&&(e=e[0]),e.length===1&&hs(e[0])){let t=e[0],s={};for(let n of Object.keys(t))s[n]=Xe(t[n]);return[s]}return e.map(Xe)}var ge=class{constructor(e){this.stmt=e}stmt;all(...e){return this.stmt.all(...J(e))}get(...e){return this.stmt.get(...J(e))??null}run(...e){let t=this.stmt.run(...J(e));return{changes:Be(t.changes),lastInsertRowid:Be(t.lastInsertRowid)}}values(...e){return this.stmt.all(...J(e)).map(s=>Object.values(s))}finalize(){}},H=class{db;queryCache=new Map;safeIntegers;txDepth=0;filename;constructor(e,t={}){let s=t.readonly===!0;this.safeIntegers=t.safeIntegers===!0;let n=e&&e.length>0?e:":memory:";if(this.filename=n,this.db=new je.DatabaseSync(n,{readOnly:s,allowExtension:!0}),!s&&n!==":memory:")try{this.db.exec("PRAGMA journal_mode=WAL")}catch{}}wrap(e){return this.safeIntegers&&e.setReadBigInts(!0),new ge(e)}prepare(e){return this.wrap(this.db.prepare(e))}query(e){let t=this.queryCache.get(e);if(t)return t;let s=this.prepare(e);return this.queryCache.set(e,s),s}run(e,...t){return t.length===0?(this.db.exec(e),{changes:0,lastInsertRowid:0}):this.prepare(e).run(...t)}exec(e){this.db.exec(e)}loadExtension(e,t){this.db.loadExtension(e)}transaction(e){return(...t)=>{let s=this.txDepth===0,n=`__cm_sp_${this.txDepth}`;s?this.db.exec("BEGIN"):this.db.exec(`SAVEPOINT ${n}`),this.txDepth++;try{let o=e(...t);return this.txDepth--,s?this.db.exec("COMMIT"):this.db.exec(`RELEASE ${n}`),o}catch(o){throw this.txDepth--,s?this.db.exec("ROLLBACK"):(this.db.exec(`ROLLBACK TO ${n}`),this.db.exec(`RELEASE ${n}`)),o}}}close(){this.db.close()}};var T=require("path"),Re=require("os"),v=require("fs");var We=require("url");var U=require("fs"),be=require("path");var Rs=null;function Os(r){return(Rs??process.stderr.write.bind(process.stderr))(r)}function Te(r){Os(r)}var As=14,Se=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.WARN=2]="WARN",o[o.ERROR=3]="ERROR",o[o.SILENT=4]="SILENT",o))(Se||{}),fe=null,he=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=F.logsDir();(0,U.existsSync)(e)||(0,U.mkdirSync)(e,{recursive:!0});let t=new Date().toISOString().split("T")[0];this.logFilePath=(0,be.join)(e,`keepmind-${t}.log`),this.pruneOldLogs(e)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e instanceof Error?e.message:String(e)),this.logFilePath=null}}}pruneOldLogs(e){try{let t=Date.now()-As*24*60*60*1e3;for(let s of(0,U.readdirSync)(e)){let n=/^keepmind-(\d{4}-\d{2}-\d{2})\.log$/.exec(s);if(!n)continue;let o=Date.parse(n[1]);if(Number.isFinite(o)&&o<t)try{(0,U.unlinkSync)((0,be.join)(e,s))}catch{}}}catch{}}getLevel(){if(this.level===null)try{let e=F.settings();if((0,U.existsSync)(e)){let t=(0,U.readFileSync)(e,"utf-8"),n=(JSON.parse(t).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=Se[n]??1}else this.level=1}catch(e){console.error("[LOGGER] Failed to load log level from settings:",e instanceof Error?e.message:String(e)),this.level=1}return this.level}formatData(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="object"){if(e instanceof Error)return this.getLevel()===0?`${e.message}
2
+ ${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let t=Object.keys(e);return t.length===0?"{}":t.length<=3?JSON.stringify(e):`{${t.length} keys: ${t.slice(0,3).join(", ")}...}`}return String(e)}formatTool(e,t){if(!t)return e;let s=t;if(typeof t=="string")try{s=JSON.parse(t)}catch{s=t}if(e==="Bash"&&s.command)return`${e}(${s.command})`;if(s.file_path)return`${e}(${s.file_path})`;if(s.notebook_path)return`${e}(${s.notebook_path})`;if(e==="Glob"&&s.pattern)return`${e}(${s.pattern})`;if(e==="Grep"&&s.pattern)return`${e}(${s.pattern})`;if(s.url)return`${e}(${s.url})`;if(s.query)return`${e}(${s.query})`;if(e==="Task"){if(s.subagent_type)return`${e}(${s.subagent_type})`;if(s.description)return`${e}(${s.description})`}return e==="Skill"&&s.skill?`${e}(${s.skill})`:e==="LSP"&&s.operation?`${e}(${s.operation})`:e}formatTimestamp(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),d=String(e.getMilliseconds()).padStart(3,"0");return`${t}-${s}-${n} ${o}:${i}:${a}.${d}`}log(e,t,s,n,o){if(e<this.getLevel())return;this.ensureLogFileInitialized();let i=this.formatTimestamp(new Date),a=Se[e].padEnd(5),d=t.padEnd(6),u="";n?.correlationId?u=`[${n.correlationId}] `:n?.sessionId&&(u=`[session-${n.sessionId}] `);let l="";if(o!=null)if(o instanceof Error)l=this.getLevel()===0?`
3
3
  ${o.message}
4
- ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{c=`
5
- `+JSON.stringify(o,null,2)}catch{c=" "+this.formatData(o)}else c=" "+this.formatData(o);let m="";if(n){let{sessionId:g,memorySessionId:I,correlationId:A,...h}=n;Object.keys(h).length>0&&(m=` {${Object.entries(h).map(([y,D])=>`${y}=${D}`).join(", ")}}`)}let p=`[${i}] [${a}] [${d}] ${u}${s}${m}${c}`;if(this.logFilePath)try{(0,U.appendFileSync)(this.logFilePath,p+`
4
+ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{l=`
5
+ `+JSON.stringify(o,null,2)}catch{l=" "+this.formatData(o)}else l=" "+this.formatData(o);let m="";if(n){let{sessionId:g,memorySessionId:I,correlationId:A,...h}=n;Object.keys(h).length>0&&(m=` {${Object.entries(h).map(([y,D])=>`${y}=${D}`).join(", ")}}`)}let p=`[${i}] [${a}] [${d}] ${u}${s}${m}${l}`;if(this.logFilePath)try{(0,U.appendFileSync)(this.logFilePath,p+`
6
6
  `,"utf8")}catch(g){Te(`[LOGGER] Failed to write to log file: ${g instanceof Error?g.message:String(g)}
7
7
  `)}else Te(p+`
8
8
  `)}debug(e,t,s,n){this.log(0,e,t,s,n)}info(e,t,s,n){this.log(1,e,t,s,n)}warn(e,t,s,n){this.log(2,e,t,s,n)}setErrorSink(e){fe=e}error(e,t,s,n){this.log(3,e,t,s,n),this.routeErrorToSink(t,s,n)}routeErrorToSink(e,t,s){try{if(!fe||!(s instanceof Error))return;fe(s)}catch{}}dataIn(e,t,s,n){this.info(e,`\u2192 ${t}`,s,n)}dataOut(e,t,s,n){this.info(e,`\u2190 ${t}`,s,n)}success(e,t,s,n){this.info(e,`\u2713 ${t}`,s,n)}failure(e,t,s,n){this.error(e,`\u2717 ${t}`,s,n)}happyPathError(e,t,s,n,o=""){let u=((new Error().stack||"").split(`
9
- `)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),c=u?`${u[1].split("/").pop()}:${u[2]}`:"unknown",m={...s,location:c};return this.warn(e,`[HAPPY-PATH] ${t}`,m,n),o}},_=new he;var ws={};function Is(){return typeof __dirname<"u"?__dirname:(0,T.dirname)((0,We.fileURLToPath)(ws.url))}var Ns=Is();function Cs(){let r=process.env.KEEPMIND_DATA_DIR??process.env.CLAUDE_MEM_DATA_DIR;if(r)return r;let e=(0,T.join)((0,Re.homedir)(),".keepmind"),t=(0,T.join)(e,"settings.json");try{if((0,v.existsSync)(t)){let s=JSON.parse((0,v.readFileSync)(t,"utf-8")),n=s.env??s,o=n.KEEPMIND_DATA_DIR??n.CLAUDE_MEM_DATA_DIR;if(o)return o}}catch{}return e}var N=Cs(),$=process.env.CLAUDE_CONFIG_DIR||(0,T.join)((0,Re.homedir)(),".claude"),vr=(0,T.join)($,"plugins","marketplaces","keepmind"),Ls=(0,T.join)(N,"archives"),ys=(0,T.join)(N,"logs"),Ds=(0,T.join)(N,"trash"),vs=(0,T.join)(N,"backups"),Ms=(0,T.join)(N,"modes"),Mr=(0,T.join)(N,"settings.json"),k=(0,T.join)(N,"keepmind.db"),B=(0,T.join)(N,"claude-mem.db"),Us=(0,T.join)(N,"vector-db"),Ve=(0,T.join)(N,"observer-sessions"),Oe=(0,T.basename)(Ve),Ur=(0,T.join)($,"settings.json"),xr=(0,T.join)($,"commands"),wr=(0,T.join)($,"CLAUDE.md");function Ke(r){(0,v.mkdirSync)(r,{recursive:!0})}function xs(){try{if((0,v.existsSync)(k)||!(0,v.existsSync)(B))return(0,v.existsSync)(k);for(let r of["","-wal","-shm"]){let e=B+r,t=k+r;(0,v.existsSync)(e)&&!(0,v.existsSync)(t)&&(0,v.renameSync)(e,t)}return _.info("DB","Migrated legacy claude-mem.db to keepmind.db",{from:B,to:k}),!0}catch(r){return _.warn("DB","Could not rename legacy claude-mem.db to keepmind.db (file may be locked) \u2014 falling back to legacy path",{},r instanceof Error?r:new Error(String(r))),!1}}function Ae(){return xs(),!(0,v.existsSync)(k)&&(0,v.existsSync)(B)?B:k}function Ye(){return(0,T.join)(Ns,"..")}var F={dataDir:()=>N,workerPid:()=>(0,T.join)(N,"worker.pid"),workerPort:()=>(0,T.join)(N,"worker.port"),serverPid:()=>(0,T.join)(N,".server-beta.pid"),serverPort:()=>(0,T.join)(N,".server-beta.port"),serverRuntime:()=>(0,T.join)(N,".server-beta.runtime.json"),settings:()=>(0,T.join)(N,"settings.json"),database:()=>Ae(),chroma:()=>(0,T.join)(N,"chroma"),combinedCerts:()=>(0,T.join)(N,"combined_certs.pem"),transcriptsConfig:()=>(0,T.join)(N,"transcript-watch.json"),transcriptsState:()=>(0,T.join)(N,"transcript-watch-state.json"),corpora:()=>(0,T.join)(N,"corpora"),supervisorRegistry:()=>(0,T.join)(N,"supervisor.json"),envFile:()=>(0,T.join)(N,".env"),logsDir:()=>ys,archives:()=>Ls,trash:()=>Ds,backups:()=>vs,modes:()=>Ms,vectorDb:()=>Us,observerSessions:()=>Ve};var qe=require("crypto");function Ie(r,e,t){return(0,qe.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function Ne(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[String(e)]}catch{return[r]}}var Ce=r=>`\xABredacted:${r}\xBB`,ks=[{type:"PRIVATE_KEY",re:/-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,4000}?-----END[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----/g},{type:"CONNECTION_STRING",re:/\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|https?):\/\/[^\s/@]+:[^\s/@]+@[^\s]{1,200}/gi},{type:"AWS_KEY",re:/\b((?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16})\b/g},{type:"GITHUB_FINE_PAT",re:/\bgithub_pat_\w{82}\b/g},{type:"GITHUB_PAT",re:/\bghp_[0-9A-Za-z]{36}\b/g},{type:"GITLAB_PAT",re:/\bglpat-[\w-]{20}\b/g},{type:"SLACK_TOKEN",re:/\bxox[baprs]-[0-9A-Za-z-]{10,200}\b/g},{type:"GOOGLE_API_KEY",re:/\bAIza[\w-]{35}\b/g},{type:"STRIPE_KEY",re:/\b(?:sk|rk|pk)_(?:test|live|prod)_[A-Za-z0-9]{10,99}\b/g},{type:"JWT",re:/\bey[A-Za-z0-9_-]{17,500}\.ey[A-Za-z0-9_/\\-]{17,500}\.[A-Za-z0-9_/\\-]{10,500}={0,2}/g},{type:"BEARER",re:/\b[Bb]earer\s+[A-Za-z0-9._~+/=-]{12,500}/g},{type:"BCRYPT",re:/\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}/g},{type:"GENERIC_SECRET",re:/(?:pass(?:word)?|secret|token|api[_-]?key|client[_-]?secret|auth)\b['"\s]{0,3}[:=>]{1,2}['"\s]{0,3}([\w./+=-]{10,150})/gi,group:1}];function Ps(r,e){if(e.re.lastIndex=0,e.group===void 0)return r.replace(e.re,Ce(e.type));let t=e.group;return r.replace(e.re,(s,...n)=>{let o=n[t-1];return typeof o!="string"||o.length===0?s:s.replace(o,Ce(e.type))})}function Fs(r){if(r.length===0)return 0;let e=new Map;for(let s of r)e.set(s,(e.get(s)??0)+1);let t=0;for(let s of e.values()){let n=s/r.length;t-=n*Math.log2(n)}return t}var $s=/^[0-9a-f]+$/i;function Gs(r,e){return r.length<20||r.length>200||/[\s]/.test(r)||!/\d/.test(r)||!/[A-Za-z]/.test(r)||r.includes("/")||r.includes("\\")||r.length<=64&&$s.test(r)||r.includes("redacted:")?!1:Fs(r)>=e}var Hs=/([\s"'`,;(){}\[\]<>]+)/;function Bs(r,e){let t=r.split(Hs);for(let s=0;s<t.length;s++){let n=t[s];n&&Gs(n,e)&&(t[s]=Ce("HIGH_ENTROPY"))}return t.join("")}function Le(r,e={}){if(typeof r!="string"||r.length===0)return r;try{let t=r;for(let s of ks)t=Ps(t,s);return e.entropySweep!==!1&&(t=Bs(t,e.entropyThreshold??4)),t}catch{return r}}function Q(r,e={}){if(typeof r=="string")return Le(r,e);if(Array.isArray(r))return r.map(t=>Q(t,e));if(r&&typeof r=="object"){let t={};for(let[s,n]of Object.entries(r))t[s]=Q(n,e);return t}return r}var Z=require("fs");var De={redactSecrets:{enabled:!0,entropyThreshold:4,entropySweep:!0},scoping:{enabled:!0,includeGlobal:!0,defaultSearchScope:"project"},importance:{enabled:!0,halfLifeDays:14,llmRefine:!1},injection:{tokenBudget:4e3,candidateMultiplier:3},reconcile:{enabled:!1,noopThreshold:.92,updateBand:.75,llmAdjudicate:!1,allowHardDelete:!1},supersession:{enabled:!1},expiry:{enabled:!1,ttlDays:28,importanceFloor:7,hardDelete:!1},optimizer:{enabled:!0,tickMinutes:5,vacuumHours:24}};function z(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function P(r,e){if(!z(e))return{...r};let t={...r};for(let s of Object.keys(r))e[s]!==void 0&&typeof e[s]==typeof r[s]&&(t[s]=e[s]);return t}var ye=null;function ee(r=!1){if(ye&&!r)return ye;let e=De,t;try{let o=F.settings();if((0,Z.existsSync)(o)){let i=JSON.parse((0,Z.readFileSync)(o,"utf-8").replace(/^/,"")),a=z(i)?i.memoryQuality??(z(i.env)?i.env.memoryQuality:void 0):void 0;z(a)&&(t=a)}}catch(o){_.debug("CONFIG","memoryQuality config load failed; using defaults",{},o instanceof Error?o:new Error(String(o)))}let s={redactSecrets:P(e.redactSecrets,t?.redactSecrets),scoping:P(e.scoping,t?.scoping),importance:P(e.importance,t?.importance),injection:P(e.injection,t?.injection),reconcile:P(e.reconcile,t?.reconcile),supersession:P(e.supersession,t?.supersession),expiry:P(e.expiry,t?.expiry),optimizer:P(e.optimizer,t?.optimizer)},n=process.env.CLAUDE_MEM_REDACT_SECRETS;return(n==="0"||n==="false")&&(s.redactSecrets.enabled=!1),ye=s,s}var Xs={decision:9,bugfix:8,refactor:6,discovery:5,global:7,other:3,trivial:1};function js(r){if(Array.isArray(r))return r.length;if(typeof r=="string")try{let e=JSON.parse(r);return Array.isArray(e)?e.length:0}catch{return 0}return 0}function ve(r){let e=Xs[r.type??"other"]??4;return js(r.files_modified)>0&&(e+=1),(r.narrative?.length??0)<40&&(e-=1),/\b(TODO|FIXME|WIP)\b/i.test(r.narrative??"")&&(e-=1),Math.max(1,Math.min(10,e))}var Ws=14,Vs=864e5;function Je(r,e={}){let t=e.now??Date.now(),s=(e.halfLifeDays??Ws)*Vs,n=(r.importance??5)/10,o=Math.max(0,t-(r.created_at_epoch??t)),i=Math.pow(.5,o/s);return n*i}var Ks=new Set(["the","a","an","and","or","but","to","of","in","on","for","with","is","are","was","were","be","been","it","this","that","we","i","as","at","by","from","into","over","so","then","than","will"]);function te(r){return r?r.toLowerCase().replace(/[^a-z0-9\s]+/g," ").split(/\s+/).filter(e=>e.length>0&&!Ks.has(e)).join(" ").trim():""}function Qe(r){let e=new Set,t=r.replace(/\s+/g," ");for(let s=0;s+3<=t.length;s++)e.add(t.slice(s,s+3));return e}function Ys(r,e){let t=Qe(r),s=Qe(e);if(t.size===0&&s.size===0)return 1;if(t.size===0||s.size===0)return 0;let n=0;for(let o of t)s.has(o)&&n++;return n/(t.size+s.size-n)}function qs(r,e){let t=new Map,s=new Map;for(let a of r.split(" "))a&&t.set(a,(t.get(a)??0)+1);for(let a of e.split(" "))a&&s.set(a,(s.get(a)??0)+1);if(t.size===0||s.size===0)return 0;let n=0;for(let[a,d]of t)n+=d*(s.get(a)??0);let o=0;for(let a of t.values())o+=a*a;let i=0;for(let a of s.values())i+=a*a;return n/(Math.sqrt(o)*Math.sqrt(i)||1)}function Js(r,e){let t=te(`${r??""}`),s=te(`${e??""}`);return Math.max(Ys(t,s),qs(t,s))}function ze(r,e,t){let s=`${r.title??""} ${r.narrative??""}`,n={action:"ADD"},o=-1;for(let i of e){let a=Js(s,`${i.title??""} ${i.narrative??""}`);a<=o||(o=a,a>=t.noopThreshold?n={action:"NOOP",candidateId:i.id,score:a}:a>=t.updateBand&&t.supersessionEnabled?n={action:"UPDATE",candidateId:i.id,score:a}:n={action:"ADD",score:a})}return n}var Ze=require("crypto");function Me(r){let e=r.title??"";if(!e){if(Array.isArray(r.facts)&&r.facts.length>0)e=r.facts[0];else if(typeof r.facts=="string")try{let s=JSON.parse(r.facts);Array.isArray(s)&&s.length>0&&(e=String(s[0]))}catch{}}e||(e=(r.narrative??"").slice(0,80));let t=te(e);return(0,Ze.createHash)("sha1").update(t).digest("hex").slice(0,16)}var E="claude";function Qs(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function L(r){if(!r)return E;let e=Qs(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:E}function et(r){let e=["claude","codex","cursor"];return[...r].sort((t,s)=>{let n=e.indexOf(t),o=e.indexOf(s);return n!==-1||o!==-1?n===-1?1:o===-1?-1:n-o:t.localeCompare(s)})}function tt(r,e,t,s,n){let o=Date.now()-s,i=n!==void 0?"up.session_db_id = ?":"up.content_session_id = ?",a=n??e;return r.prepare(`
9
+ `)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),l=u?`${u[1].split("/").pop()}:${u[2]}`:"unknown",m={...s,location:l};return this.warn(e,`[HAPPY-PATH] ${t}`,m,n),o}},c=new he;var ws={};function Is(){return typeof __dirname<"u"?__dirname:(0,T.dirname)((0,We.fileURLToPath)(ws.url))}var Ns=Is();function Cs(){let r=process.env.KEEPMIND_DATA_DIR??process.env.CLAUDE_MEM_DATA_DIR;if(r)return r;let e=(0,T.join)((0,Re.homedir)(),".keepmind"),t=(0,T.join)(e,"settings.json");try{if((0,v.existsSync)(t)){let s=JSON.parse((0,v.readFileSync)(t,"utf-8")),n=s.env??s,o=n.KEEPMIND_DATA_DIR??n.CLAUDE_MEM_DATA_DIR;if(o)return o}}catch{}return e}var N=Cs(),$=process.env.CLAUDE_CONFIG_DIR||(0,T.join)((0,Re.homedir)(),".claude"),vr=(0,T.join)($,"plugins","marketplaces","keepmind"),Ls=(0,T.join)(N,"archives"),ys=(0,T.join)(N,"logs"),Ds=(0,T.join)(N,"trash"),vs=(0,T.join)(N,"backups"),Ms=(0,T.join)(N,"modes"),Mr=(0,T.join)(N,"settings.json"),k=(0,T.join)(N,"keepmind.db"),B=(0,T.join)(N,"claude-mem.db"),Us=(0,T.join)(N,"vector-db"),Ve=(0,T.join)(N,"observer-sessions"),Oe=(0,T.basename)(Ve),Ur=(0,T.join)($,"settings.json"),xr=(0,T.join)($,"commands"),wr=(0,T.join)($,"CLAUDE.md");function Ke(r){(0,v.mkdirSync)(r,{recursive:!0})}function xs(){try{if((0,v.existsSync)(k)||!(0,v.existsSync)(B))return(0,v.existsSync)(k);for(let r of["","-wal","-shm"]){let e=B+r,t=k+r;(0,v.existsSync)(e)&&!(0,v.existsSync)(t)&&(0,v.renameSync)(e,t)}return c.info("DB","Migrated legacy claude-mem.db to keepmind.db",{from:B,to:k}),!0}catch(r){return c.warn("DB","Could not rename legacy claude-mem.db to keepmind.db (file may be locked) \u2014 falling back to legacy path",{},r instanceof Error?r:new Error(String(r))),!1}}function Ae(){return xs(),!(0,v.existsSync)(k)&&(0,v.existsSync)(B)?B:k}function Ye(){return(0,T.join)(Ns,"..")}var F={dataDir:()=>N,workerPid:()=>(0,T.join)(N,"worker.pid"),workerPort:()=>(0,T.join)(N,"worker.port"),serverPid:()=>(0,T.join)(N,".server-beta.pid"),serverPort:()=>(0,T.join)(N,".server-beta.port"),serverRuntime:()=>(0,T.join)(N,".server-beta.runtime.json"),settings:()=>(0,T.join)(N,"settings.json"),database:()=>Ae(),chroma:()=>(0,T.join)(N,"chroma"),combinedCerts:()=>(0,T.join)(N,"combined_certs.pem"),transcriptsConfig:()=>(0,T.join)(N,"transcript-watch.json"),transcriptsState:()=>(0,T.join)(N,"transcript-watch-state.json"),corpora:()=>(0,T.join)(N,"corpora"),supervisorRegistry:()=>(0,T.join)(N,"supervisor.json"),envFile:()=>(0,T.join)(N,".env"),logsDir:()=>ys,archives:()=>Ls,trash:()=>Ds,backups:()=>vs,modes:()=>Ms,vectorDb:()=>Us,observerSessions:()=>Ve};var qe=require("crypto");function Ie(r,e,t){return(0,qe.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function Ne(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[String(e)]}catch{return[r]}}var Ce=r=>`\xABredacted:${r}\xBB`,ks=[{type:"PRIVATE_KEY",re:/-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,4000}?-----END[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----/g},{type:"CONNECTION_STRING",re:/\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|https?):\/\/[^\s/@]+:[^\s/@]+@[^\s]{1,200}/gi},{type:"AWS_KEY",re:/\b((?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16})\b/g},{type:"GITHUB_FINE_PAT",re:/\bgithub_pat_\w{82}\b/g},{type:"GITHUB_PAT",re:/\bghp_[0-9A-Za-z]{36}\b/g},{type:"GITLAB_PAT",re:/\bglpat-[\w-]{20}\b/g},{type:"SLACK_TOKEN",re:/\bxox[baprs]-[0-9A-Za-z-]{10,200}\b/g},{type:"GOOGLE_API_KEY",re:/\bAIza[\w-]{35}\b/g},{type:"STRIPE_KEY",re:/\b(?:sk|rk|pk)_(?:test|live|prod)_[A-Za-z0-9]{10,99}\b/g},{type:"JWT",re:/\bey[A-Za-z0-9_-]{17,500}\.ey[A-Za-z0-9_/\\-]{17,500}\.[A-Za-z0-9_/\\-]{10,500}={0,2}/g},{type:"BEARER",re:/\b[Bb]earer\s+[A-Za-z0-9._~+/=-]{12,500}/g},{type:"BCRYPT",re:/\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}/g},{type:"GENERIC_SECRET",re:/(?:pass(?:word)?|secret|token|api[_-]?key|client[_-]?secret|auth)\b['"\s]{0,3}[:=>]{1,2}['"\s]{0,3}([\w./+=-]{10,150})/gi,group:1}];function Ps(r,e){if(e.re.lastIndex=0,e.group===void 0)return r.replace(e.re,Ce(e.type));let t=e.group;return r.replace(e.re,(s,...n)=>{let o=n[t-1];return typeof o!="string"||o.length===0?s:s.replace(o,Ce(e.type))})}function Fs(r){if(r.length===0)return 0;let e=new Map;for(let s of r)e.set(s,(e.get(s)??0)+1);let t=0;for(let s of e.values()){let n=s/r.length;t-=n*Math.log2(n)}return t}var $s=/^[0-9a-f]+$/i;function Gs(r,e){return r.length<20||r.length>200||/[\s]/.test(r)||!/\d/.test(r)||!/[A-Za-z]/.test(r)||r.includes("/")||r.includes("\\")||r.length<=64&&$s.test(r)||r.includes("redacted:")?!1:Fs(r)>=e}var Hs=/([\s"'`,;(){}\[\]<>]+)/;function Bs(r,e){let t=r.split(Hs);for(let s=0;s<t.length;s++){let n=t[s];n&&Gs(n,e)&&(t[s]=Ce("HIGH_ENTROPY"))}return t.join("")}function Le(r,e={}){if(typeof r!="string"||r.length===0)return r;try{let t=r;for(let s of ks)t=Ps(t,s);return e.entropySweep!==!1&&(t=Bs(t,e.entropyThreshold??4)),t}catch{return r}}function Q(r,e={}){if(typeof r=="string")return Le(r,e);if(Array.isArray(r))return r.map(t=>Q(t,e));if(r&&typeof r=="object"){let t={};for(let[s,n]of Object.entries(r))t[s]=Q(n,e);return t}return r}var Z=require("fs");var De={redactSecrets:{enabled:!0,entropyThreshold:4,entropySweep:!0},scoping:{enabled:!0,includeGlobal:!0,defaultSearchScope:"project"},importance:{enabled:!0,halfLifeDays:14,llmRefine:!1},injection:{tokenBudget:4e3,candidateMultiplier:3},reconcile:{enabled:!1,noopThreshold:.92,updateBand:.75,llmAdjudicate:!1,allowHardDelete:!1},supersession:{enabled:!1},expiry:{enabled:!1,ttlDays:28,importanceFloor:7,hardDelete:!1},optimizer:{enabled:!0,tickMinutes:5,vacuumHours:24}};function z(r){return!!r&&typeof r=="object"&&!Array.isArray(r)}function P(r,e){if(!z(e))return{...r};let t={...r};for(let s of Object.keys(r))e[s]!==void 0&&typeof e[s]==typeof r[s]&&(t[s]=e[s]);return t}var ye=null;function ee(r=!1){if(ye&&!r)return ye;let e=De,t;try{let o=F.settings();if((0,Z.existsSync)(o)){let i=JSON.parse((0,Z.readFileSync)(o,"utf-8").replace(/^/,"")),a=z(i)?i.memoryQuality??(z(i.env)?i.env.memoryQuality:void 0):void 0;z(a)&&(t=a)}}catch(o){c.debug("CONFIG","memoryQuality config load failed; using defaults",{},o instanceof Error?o:new Error(String(o)))}let s={redactSecrets:P(e.redactSecrets,t?.redactSecrets),scoping:P(e.scoping,t?.scoping),importance:P(e.importance,t?.importance),injection:P(e.injection,t?.injection),reconcile:P(e.reconcile,t?.reconcile),supersession:P(e.supersession,t?.supersession),expiry:P(e.expiry,t?.expiry),optimizer:P(e.optimizer,t?.optimizer)},n=process.env.CLAUDE_MEM_REDACT_SECRETS;return(n==="0"||n==="false")&&(s.redactSecrets.enabled=!1),ye=s,s}var Xs={decision:9,bugfix:8,refactor:6,discovery:5,global:7,other:3,trivial:1};function js(r){if(Array.isArray(r))return r.length;if(typeof r=="string")try{let e=JSON.parse(r);return Array.isArray(e)?e.length:0}catch{return 0}return 0}function ve(r){let e=Xs[r.type??"other"]??4;return js(r.files_modified)>0&&(e+=1),(r.narrative?.length??0)<40&&(e-=1),/\b(TODO|FIXME|WIP)\b/i.test(r.narrative??"")&&(e-=1),Math.max(1,Math.min(10,e))}var Ws=14,Vs=864e5;function Je(r,e={}){let t=e.now??Date.now(),s=(e.halfLifeDays??Ws)*Vs,n=(r.importance??5)/10,o=Math.max(0,t-(r.created_at_epoch??t)),i=Math.pow(.5,o/s);return n*i}var Ks=new Set(["the","a","an","and","or","but","to","of","in","on","for","with","is","are","was","were","be","been","it","this","that","we","i","as","at","by","from","into","over","so","then","than","will"]);function te(r){return r?r.toLowerCase().replace(/[^a-z0-9\s]+/g," ").split(/\s+/).filter(e=>e.length>0&&!Ks.has(e)).join(" ").trim():""}function Qe(r){let e=new Set,t=r.replace(/\s+/g," ");for(let s=0;s+3<=t.length;s++)e.add(t.slice(s,s+3));return e}function Ys(r,e){let t=Qe(r),s=Qe(e);if(t.size===0&&s.size===0)return 1;if(t.size===0||s.size===0)return 0;let n=0;for(let o of t)s.has(o)&&n++;return n/(t.size+s.size-n)}function qs(r,e){let t=new Map,s=new Map;for(let a of r.split(" "))a&&t.set(a,(t.get(a)??0)+1);for(let a of e.split(" "))a&&s.set(a,(s.get(a)??0)+1);if(t.size===0||s.size===0)return 0;let n=0;for(let[a,d]of t)n+=d*(s.get(a)??0);let o=0;for(let a of t.values())o+=a*a;let i=0;for(let a of s.values())i+=a*a;return n/(Math.sqrt(o)*Math.sqrt(i)||1)}function Js(r,e){let t=te(`${r??""}`),s=te(`${e??""}`);return Math.max(Ys(t,s),qs(t,s))}function ze(r,e,t){let s=`${r.title??""} ${r.narrative??""}`,n={action:"ADD"},o=-1;for(let i of e){let a=Js(s,`${i.title??""} ${i.narrative??""}`);a<=o||(o=a,a>=t.noopThreshold?n={action:"NOOP",candidateId:i.id,score:a}:a>=t.updateBand&&t.supersessionEnabled?n={action:"UPDATE",candidateId:i.id,score:a}:n={action:"ADD",score:a})}return n}var Ze=require("crypto");function Me(r){let e=r.title??"";if(!e){if(Array.isArray(r.facts)&&r.facts.length>0)e=r.facts[0];else if(typeof r.facts=="string")try{let s=JSON.parse(r.facts);Array.isArray(s)&&s.length>0&&(e=String(s[0]))}catch{}}e||(e=(r.narrative??"").slice(0,80));let t=te(e);return(0,Ze.createHash)("sha1").update(t).digest("hex").slice(0,16)}var E="claude";function Qs(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function L(r){if(!r)return E;let e=Qs(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:E}function et(r){let e=["claude","codex","cursor"];return[...r].sort((t,s)=>{let n=e.indexOf(t),o=e.indexOf(s);return n!==-1||o!==-1?n===-1?1:o===-1?-1:n-o:t.localeCompare(s)})}function tt(r,e,t,s,n){let o=Date.now()-s,i=n!==void 0?"up.session_db_id = ?":"up.content_session_id = ?",a=n??e;return r.prepare(`
10
10
  SELECT
11
11
  up.*,
12
12
  s.memory_session_id,
@@ -19,7 +19,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
19
19
  AND up.created_at_epoch >= ?
20
20
  ORDER BY up.created_at_epoch DESC
21
21
  LIMIT 1
22
- `).get(a,t,o)??void 0}var nt=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],st=new RegExp(`<(${nt.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),ot=/<system-reminder>[\s\S]*?<\/system-reminder>/g,rt=100;function zs(r){let e=Object.fromEntries(nt.map(n=>[n,0]));st.lastIndex=0;let t=0,s=r.replace(st,(n,o)=>(e[o]=(e[o]??0)+1,t+=1,""));return t>rt&&_.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:t,maxAllowed:rt,contentLength:r.length}),{stripped:s.trim(),counts:e}}function it(r){return zs(r).stripped}var Zs=["task-notification"],Qr=new RegExp(`^\\s*<(${Zs.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),zr=256*1024;var Ue=4e3;function se(r){let e=r.trim(),s=it(r).trim()||e;return s.length<=Ue?s:(_.debug("DB","Truncated stored prompt text to the configured cap",{originalLength:s.length,storedLength:Ue}),`${s.slice(0,Ue-1)}\u2026`)}function er(r,e){return{customTitle:r,platformSource:e?L(e):void 0}}var re=class{db;redactEnabled;redactOpts;mq;rt(e){return this.redactEnabled?Le(e,this.redactOpts):e}rl(e){return this.redactEnabled?Q(e,this.redactOpts):e}constructor(e=k){try{this.mq=ee();let t=this.mq.redactSecrets;this.redactEnabled=t.enabled,this.redactOpts={entropySweep:t.entropySweep,entropyThreshold:t.entropyThreshold}}catch{this.mq=De,this.redactEnabled=process.env.CLAUDE_MEM_REDACT_SECRETS!=="0"&&process.env.CLAUDE_MEM_REDACT_SECRETS!=="false",this.redactOpts={entropySweep:!0,entropyThreshold:4}}if(e instanceof H)this.db=e;else{e!==":memory:"&&Ke(N);let t=e===k?Ae():e;this.db=new H(t),this.db.run("PRAGMA journal_mode = WAL"),this.db.run("PRAGMA synchronous = NORMAL"),this.db.run("PRAGMA foreign_keys = ON"),this.db.run("PRAGMA journal_size_limit = 4194304")}this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),this.repairSessionIdColumnRename(),this.addFailedAtEpochColumn(),this.addOnUpdateCascadeToForeignKeys(),this.addObservationContentHashColumn(),this.addSessionCustomTitleColumn(),this.addSessionPlatformSourceColumn(),this.addObservationModelColumns(),this.ensureMergedIntoProjectColumns(),this.addObservationSubagentColumns(),this.addObservationsUniqueContentHashIndex(),this.addObservationsMetadataColumn(),this.dropDeadPendingMessagesColumns(),this.ensurePendingMessagesToolUseIdColumn(),this.dropWorkerPidColumn(),this.ensureSDKSessionsPlatformContentIdentity(),this.ensureUserPromptsSessionDbId(),this.ensurePendingMessagesSessionToolUniqueIndex(),this.addObservationImportanceColumn(),this.addObservationBitemporalColumns(),this.addObservationLastUsedColumn()}addObservationBitemporalColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(37),t=this.db.query("PRAGMA table_info(observations)").all(),s=n=>t.some(o=>o.name===n);e&&s("valid_from")&&s("valid_to")&&s("subject_key")||(s("valid_from")||this.db.run("ALTER TABLE observations ADD COLUMN valid_from INTEGER"),s("valid_to")||this.db.run("ALTER TABLE observations ADD COLUMN valid_to INTEGER"),s("subject_key")||this.db.run("ALTER TABLE observations ADD COLUMN subject_key TEXT"),this.db.run("UPDATE observations SET valid_from = created_at_epoch WHERE valid_from IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_subject_valid ON observations(project, subject_key, valid_to)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(37,new Date().toISOString()))}addObservationLastUsedColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(38),s=this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="last_used_at");e&&s||(s||this.db.run("ALTER TABLE observations ADD COLUMN last_used_at INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_last_used ON observations(last_used_at)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(38,new Date().toISOString()))}addObservationImportanceColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(36),s=this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="importance");e&&s||(s||this.db.run("ALTER TABLE observations ADD COLUMN importance INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_importance ON observations(importance)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(36,new Date().toISOString()))}getIndexColumns(e){return this.db.query(`PRAGMA index_info(${JSON.stringify(e)})`).all().map(t=>t.name)}hasUniqueIndexOnColumns(e,t){return this.db.query(`PRAGMA index_list(${e})`).all().some(n=>{if(n.unique!==1)return!1;let o=this.getIndexColumns(n.name);return o.length===t.length&&o.every((i,a)=>i===t[a])})}resolvePromptSessionDbId(e,t,s){if(t!==void 0)return t;let n=s?L(s):void 0;return n?this.db.prepare(`
22
+ `).get(a,t,o)??void 0}var nt=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],st=new RegExp(`<(${nt.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),ot=/<system-reminder>[\s\S]*?<\/system-reminder>/g,rt=100;function zs(r){let e=Object.fromEntries(nt.map(n=>[n,0]));st.lastIndex=0;let t=0,s=r.replace(st,(n,o)=>(e[o]=(e[o]??0)+1,t+=1,""));return t>rt&&c.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:t,maxAllowed:rt,contentLength:r.length}),{stripped:s.trim(),counts:e}}function it(r){return zs(r).stripped}var Zs=["task-notification"],Qr=new RegExp(`^\\s*<(${Zs.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),zr=256*1024;var Ue=4e3;function se(r){let e=r.trim(),s=it(r).trim()||e;return s.length<=Ue?s:(c.debug("DB","Truncated stored prompt text to the configured cap",{originalLength:s.length,storedLength:Ue}),`${s.slice(0,Ue-1)}\u2026`)}function er(r,e){return{customTitle:r,platformSource:e?L(e):void 0}}var re=class{db;redactEnabled;redactOpts;mq;rt(e){return this.redactEnabled?Le(e,this.redactOpts):e}rl(e){return this.redactEnabled?Q(e,this.redactOpts):e}constructor(e=k){try{this.mq=ee();let t=this.mq.redactSecrets;this.redactEnabled=t.enabled,this.redactOpts={entropySweep:t.entropySweep,entropyThreshold:t.entropyThreshold}}catch{this.mq=De,this.redactEnabled=process.env.CLAUDE_MEM_REDACT_SECRETS!=="0"&&process.env.CLAUDE_MEM_REDACT_SECRETS!=="false",this.redactOpts={entropySweep:!0,entropyThreshold:4}}if(e instanceof H)this.db=e;else{e!==":memory:"&&Ke(N);let t=e===k?Ae():e;this.db=new H(t),this.db.run("PRAGMA journal_mode = WAL"),this.db.run("PRAGMA synchronous = NORMAL"),this.db.run("PRAGMA foreign_keys = ON"),this.db.run("PRAGMA journal_size_limit = 4194304")}this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),this.repairSessionIdColumnRename(),this.addFailedAtEpochColumn(),this.addOnUpdateCascadeToForeignKeys(),this.addObservationContentHashColumn(),this.addSessionCustomTitleColumn(),this.addSessionPlatformSourceColumn(),this.addObservationModelColumns(),this.ensureMergedIntoProjectColumns(),this.addObservationSubagentColumns(),this.addObservationsUniqueContentHashIndex(),this.addObservationsMetadataColumn(),this.dropDeadPendingMessagesColumns(),this.ensurePendingMessagesToolUseIdColumn(),this.dropWorkerPidColumn(),this.ensureSDKSessionsPlatformContentIdentity(),this.ensureUserPromptsSessionDbId(),this.ensurePendingMessagesSessionToolUniqueIndex(),this.addObservationImportanceColumn(),this.addObservationBitemporalColumns(),this.addObservationLastUsedColumn()}addObservationBitemporalColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(37),t=this.db.query("PRAGMA table_info(observations)").all(),s=n=>t.some(o=>o.name===n);e&&s("valid_from")&&s("valid_to")&&s("subject_key")||(s("valid_from")||this.db.run("ALTER TABLE observations ADD COLUMN valid_from INTEGER"),s("valid_to")||this.db.run("ALTER TABLE observations ADD COLUMN valid_to INTEGER"),s("subject_key")||this.db.run("ALTER TABLE observations ADD COLUMN subject_key TEXT"),this.db.run("UPDATE observations SET valid_from = created_at_epoch WHERE valid_from IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_subject_valid ON observations(project, subject_key, valid_to)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(37,new Date().toISOString()))}addObservationLastUsedColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(38),s=this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="last_used_at");e&&s||(s||this.db.run("ALTER TABLE observations ADD COLUMN last_used_at INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_last_used ON observations(last_used_at)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(38,new Date().toISOString()))}addObservationImportanceColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(36),s=this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="importance");e&&s||(s||this.db.run("ALTER TABLE observations ADD COLUMN importance INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_importance ON observations(importance)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(36,new Date().toISOString()))}getIndexColumns(e){return this.db.query(`PRAGMA index_info(${JSON.stringify(e)})`).all().map(t=>t.name)}hasUniqueIndexOnColumns(e,t){return this.db.query(`PRAGMA index_list(${e})`).all().some(n=>{if(n.unique!==1)return!1;let o=this.getIndexColumns(n.name);return o.length===t.length&&o.every((i,a)=>i===t[a])})}resolvePromptSessionDbId(e,t,s){if(t!==void 0)return t;let n=s?L(s):void 0;return n?this.db.prepare(`
23
23
  SELECT id
24
24
  FROM sdk_sessions
25
25
  WHERE COALESCE(NULLIF(platform_source, ''), ?) = ?
@@ -34,7 +34,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
34
34
  ELSE 1
35
35
  END, id
36
36
  LIMIT 1
37
- `).get(e)?.id??null}dropWorkerPidColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(32),s=this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="worker_pid");if(!(e&&!s)){if(s)try{this.db.run("DROP INDEX IF EXISTS idx_pending_messages_worker_pid"),this.db.run("ALTER TABLE pending_messages DROP COLUMN worker_pid"),_.debug("DB","Dropped worker_pid column and its index from pending_messages")}catch(n){_.warn("DB","Failed to drop worker_pid column from pending_messages",{},n instanceof Error?n:new Error(String(n)));return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(32,new Date().toISOString())}}ensureSDKSessionsPlatformContentIdentity(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(33),t=this.hasUniqueIndexOnColumns("sdk_sessions",["content_session_id"]),s=this.hasUniqueIndexOnColumns("sdk_sessions",["platform_source","content_session_id"]),o=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source");if(!(e&&!t&&s&&o)){if(o||this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${E}'`),this.db.run(`
37
+ `).get(e)?.id??null}dropWorkerPidColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(32),s=this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="worker_pid");if(!(e&&!s)){if(s)try{this.db.run("DROP INDEX IF EXISTS idx_pending_messages_worker_pid"),this.db.run("ALTER TABLE pending_messages DROP COLUMN worker_pid"),c.debug("DB","Dropped worker_pid column and its index from pending_messages")}catch(n){c.warn("DB","Failed to drop worker_pid column from pending_messages",{},n instanceof Error?n:new Error(String(n)));return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(32,new Date().toISOString())}}ensureSDKSessionsPlatformContentIdentity(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(33),t=this.hasUniqueIndexOnColumns("sdk_sessions",["content_session_id"]),s=this.hasUniqueIndexOnColumns("sdk_sessions",["platform_source","content_session_id"]),o=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source");if(!(e&&!t&&s&&o)){if(o||this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${E}'`),this.db.run(`
38
38
  UPDATE sdk_sessions
39
39
  SET platform_source = '${E}'
40
40
  WHERE platform_source IS NULL OR platform_source = ''
@@ -148,7 +148,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
148
148
  CREATE UNIQUE INDEX IF NOT EXISTS ux_pending_session_tool
149
149
  ON pending_messages(session_db_id, tool_use_id)
150
150
  WHERE tool_use_id IS NOT NULL
151
- `),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(35,new Date().toISOString()),this.db.run("COMMIT")}catch(n){throw this.db.run("ROLLBACK"),n}}}dropDeadPendingMessagesColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(31),t=this.db.query("PRAGMA table_info(pending_messages)").all(),s=new Set(t.map(i=>i.name)),o=["retry_count","failed_at_epoch","completed_at_epoch"].filter(i=>s.has(i));if(!(e&&o.length===0)){if(o.length>0){this.db.run("BEGIN TRANSACTION");try{this.db.run("DELETE FROM pending_messages WHERE status NOT IN ('pending', 'processing')");for(let i of o)this.db.run(`ALTER TABLE pending_messages DROP COLUMN ${i}`),_.debug("DB",`Dropped dead column ${i} from pending_messages`);e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString()),this.db.run("COMMIT")}catch(i){this.db.run("ROLLBACK"),_.warn("DB","Failed to drop dead columns from pending_messages",{},i instanceof Error?i:new Error(String(i)));return}return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString())}}initializeSchema(){this.db.run(`
151
+ `),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(35,new Date().toISOString()),this.db.run("COMMIT")}catch(n){throw this.db.run("ROLLBACK"),n}}}dropDeadPendingMessagesColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(31),t=this.db.query("PRAGMA table_info(pending_messages)").all(),s=new Set(t.map(i=>i.name)),o=["retry_count","failed_at_epoch","completed_at_epoch"].filter(i=>s.has(i));if(!(e&&o.length===0)){if(o.length>0){this.db.run("BEGIN TRANSACTION");try{this.db.run("DELETE FROM pending_messages WHERE status NOT IN ('pending', 'processing')");for(let i of o)this.db.run(`ALTER TABLE pending_messages DROP COLUMN ${i}`),c.debug("DB",`Dropped dead column ${i} from pending_messages`);e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString()),this.db.run("COMMIT")}catch(i){this.db.run("ROLLBACK"),c.warn("DB","Failed to drop dead columns from pending_messages",{},i instanceof Error?i:new Error(String(i)));return}return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString())}}initializeSchema(){this.db.run(`
152
152
  CREATE TABLE IF NOT EXISTS schema_versions (
153
153
  id INTEGER PRIMARY KEY,
154
154
  version INTEGER UNIQUE NOT NULL,
@@ -213,7 +213,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
213
213
  CREATE INDEX IF NOT EXISTS idx_session_summaries_sdk_session ON session_summaries(memory_session_id);
214
214
  CREATE INDEX IF NOT EXISTS idx_session_summaries_project ON session_summaries(project);
215
215
  CREATE INDEX IF NOT EXISTS idx_session_summaries_created ON session_summaries(created_at_epoch DESC);
216
- `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString())}ensureWorkerPortColumn(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(s=>s.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),_.debug("DB","Added worker_port column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(5,new Date().toISOString())}ensurePromptTrackingColumns(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(a=>a.name==="prompt_counter")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN prompt_counter INTEGER DEFAULT 0"),_.debug("DB","Added prompt_counter column to sdk_sessions table")),this.db.query("PRAGMA table_info(observations)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE observations ADD COLUMN prompt_number INTEGER"),_.debug("DB","Added prompt_number column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN prompt_number INTEGER"),_.debug("DB","Added prompt_number column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(6,new Date().toISOString())}removeSessionSummariesUniqueConstraint(){if(!this.db.query("PRAGMA index_list(session_summaries)").all().some(s=>s.unique===1&&s.origin!=="pk")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString());return}_.debug("DB","Removing UNIQUE constraint from session_summaries.memory_session_id"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS session_summaries_new"),this.db.run(`
216
+ `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString())}ensureWorkerPortColumn(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(s=>s.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),c.debug("DB","Added worker_port column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(5,new Date().toISOString())}ensurePromptTrackingColumns(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(a=>a.name==="prompt_counter")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN prompt_counter INTEGER DEFAULT 0"),c.debug("DB","Added prompt_counter column to sdk_sessions table")),this.db.query("PRAGMA table_info(observations)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE observations ADD COLUMN prompt_number INTEGER"),c.debug("DB","Added prompt_number column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN prompt_number INTEGER"),c.debug("DB","Added prompt_number column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(6,new Date().toISOString())}removeSessionSummariesUniqueConstraint(){if(!this.db.query("PRAGMA index_list(session_summaries)").all().some(s=>s.unique===1&&s.origin!=="pk")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString());return}c.debug("DB","Removing UNIQUE constraint from session_summaries.memory_session_id"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS session_summaries_new"),this.db.run(`
217
217
  CREATE TABLE session_summaries_new (
218
218
  id INTEGER PRIMARY KEY AUTOINCREMENT,
219
219
  memory_session_id TEXT NOT NULL,
@@ -241,7 +241,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
241
241
  CREATE INDEX idx_session_summaries_sdk_session ON session_summaries(memory_session_id);
242
242
  CREATE INDEX idx_session_summaries_project ON session_summaries(project);
243
243
  CREATE INDEX idx_session_summaries_created ON session_summaries(created_at_epoch DESC);
244
- `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),_.debug("DB","Successfully removed UNIQUE constraint from session_summaries.memory_session_id")}addObservationHierarchicalFields(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(8))return;if(this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="title")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString());return}_.debug("DB","Adding hierarchical fields to observations table"),this.db.run(`
244
+ `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),c.debug("DB","Successfully removed UNIQUE constraint from session_summaries.memory_session_id")}addObservationHierarchicalFields(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(8))return;if(this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="title")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString());return}c.debug("DB","Adding hierarchical fields to observations table"),this.db.run(`
245
245
  ALTER TABLE observations ADD COLUMN title TEXT;
246
246
  ALTER TABLE observations ADD COLUMN subtitle TEXT;
247
247
  ALTER TABLE observations ADD COLUMN facts TEXT;
@@ -249,7 +249,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
249
249
  ALTER TABLE observations ADD COLUMN concepts TEXT;
250
250
  ALTER TABLE observations ADD COLUMN files_read TEXT;
251
251
  ALTER TABLE observations ADD COLUMN files_modified TEXT;
252
- `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),_.debug("DB","Successfully added hierarchical fields to observations table")}makeObservationsTextNullable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(9))return;let s=this.db.query("PRAGMA table_info(observations)").all().find(n=>n.name==="text");if(!s||s.notnull===0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString());return}_.debug("DB","Making observations.text nullable"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS observations_new"),this.db.run(`
252
+ `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),c.debug("DB","Successfully added hierarchical fields to observations table")}makeObservationsTextNullable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(9))return;let s=this.db.query("PRAGMA table_info(observations)").all().find(n=>n.name==="text");if(!s||s.notnull===0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString());return}c.debug("DB","Making observations.text nullable"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS observations_new"),this.db.run(`
253
253
  CREATE TABLE observations_new (
254
254
  id INTEGER PRIMARY KEY AUTOINCREMENT,
255
255
  memory_session_id TEXT NOT NULL,
@@ -279,7 +279,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
279
279
  CREATE INDEX idx_observations_project ON observations(project);
280
280
  CREATE INDEX idx_observations_type ON observations(type);
281
281
  CREATE INDEX idx_observations_created ON observations(created_at_epoch DESC);
282
- `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),_.debug("DB","Successfully made observations.text nullable")}createUserPromptsTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(10))return;if(this.db.query("PRAGMA table_info(user_prompts)").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString());return}_.debug("DB","Creating user_prompts table with FTS5 support"),this.db.run("BEGIN TRANSACTION"),this.db.run(`
282
+ `),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),c.debug("DB","Successfully made observations.text nullable")}createUserPromptsTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(10))return;if(this.db.query("PRAGMA table_info(user_prompts)").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString());return}c.debug("DB","Creating user_prompts table with FTS5 support"),this.db.run("BEGIN TRANSACTION"),this.db.run(`
283
283
  CREATE TABLE user_prompts (
284
284
  id INTEGER PRIMARY KEY AUTOINCREMENT,
285
285
  session_db_id INTEGER,
@@ -320,7 +320,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
320
320
  INSERT INTO user_prompts_fts(rowid, prompt_text)
321
321
  VALUES (new.id, new.prompt_text);
322
322
  END;
323
- `;try{this.db.run(s),this.db.run(n)}catch(o){o instanceof Error?_.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},o):_.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},new Error(String(o))),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),_.debug("DB","Created user_prompts table (without FTS5)");return}this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),_.debug("DB","Successfully created user_prompts table")}ensureDiscoveryTokensColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(11))return;this.db.query("PRAGMA table_info(observations)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE observations ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),_.debug("DB","Added discovery_tokens column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),_.debug("DB","Added discovery_tokens column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(11,new Date().toISOString())}createPendingMessagesTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(16))return;if(this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_messages'").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString());return}_.debug("DB","Creating pending_messages table"),this.db.run(`
323
+ `;try{this.db.run(s),this.db.run(n)}catch(o){o instanceof Error?c.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},o):c.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},new Error(String(o))),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),c.debug("DB","Created user_prompts table (without FTS5)");return}this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),c.debug("DB","Successfully created user_prompts table")}ensureDiscoveryTokensColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(11))return;this.db.query("PRAGMA table_info(observations)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE observations ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),c.debug("DB","Added discovery_tokens column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),c.debug("DB","Added discovery_tokens column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(11,new Date().toISOString())}createPendingMessagesTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(16))return;if(this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_messages'").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString());return}c.debug("DB","Creating pending_messages table"),this.db.run(`
324
324
  CREATE TABLE pending_messages (
325
325
  id INTEGER PRIMARY KEY AUTOINCREMENT,
326
326
  session_db_id INTEGER NOT NULL,
@@ -337,7 +337,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
337
337
  created_at_epoch INTEGER NOT NULL,
338
338
  FOREIGN KEY (session_db_id) REFERENCES sdk_sessions(id) ON DELETE CASCADE
339
339
  )
340
- `),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),_.debug("DB","pending_messages table created successfully")}renameSessionIdColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(17))return;_.debug("DB","Checking session ID columns for semantic clarity rename");let t=0,s=(n,o,i)=>{let a=this.db.query(`PRAGMA table_info(${n})`).all(),d=a.some(c=>c.name===o);return a.some(c=>c.name===i)?!1:d?(this.db.run(`ALTER TABLE ${n} RENAME COLUMN ${o} TO ${i}`),_.debug("DB",`Renamed ${n}.${o} to ${i}`),!0):(_.warn("DB",`Column ${o} not found in ${n}, skipping rename`),!1)};s("sdk_sessions","claude_session_id","content_session_id")&&t++,s("sdk_sessions","sdk_session_id","memory_session_id")&&t++,s("pending_messages","claude_session_id","content_session_id")&&t++,s("observations","sdk_session_id","memory_session_id")&&t++,s("session_summaries","sdk_session_id","memory_session_id")&&t++,s("user_prompts","claude_session_id","content_session_id")&&t++,this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(17,new Date().toISOString()),t>0?_.debug("DB",`Successfully renamed ${t} session ID columns`):_.debug("DB","No session ID column renames needed (already up to date)")}repairSessionIdColumnRename(){this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(19)||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(19,new Date().toISOString())}addFailedAtEpochColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(20))return;this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="failed_at_epoch")||(this.db.run("ALTER TABLE pending_messages ADD COLUMN failed_at_epoch INTEGER"),_.debug("DB","Added failed_at_epoch column to pending_messages table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(20,new Date().toISOString())}addOnUpdateCascadeToForeignKeys(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(21))return;_.debug("DB","Adding ON UPDATE CASCADE to FK constraints on observations and session_summaries"),this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TRIGGER IF EXISTS observations_ai"),this.db.run("DROP TRIGGER IF EXISTS observations_ad"),this.db.run("DROP TRIGGER IF EXISTS observations_au"),this.db.run("DROP TABLE IF EXISTS observations_new");let t=this.db.query("PRAGMA table_info(observations)").all(),s=t.some(S=>S.name==="metadata"),n=t.some(S=>S.name==="content_hash"),o=s?`,
340
+ `),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),c.debug("DB","pending_messages table created successfully")}renameSessionIdColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(17))return;c.debug("DB","Checking session ID columns for semantic clarity rename");let t=0,s=(n,o,i)=>{let a=this.db.query(`PRAGMA table_info(${n})`).all(),d=a.some(l=>l.name===o);return a.some(l=>l.name===i)?!1:d?(this.db.run(`ALTER TABLE ${n} RENAME COLUMN ${o} TO ${i}`),c.debug("DB",`Renamed ${n}.${o} to ${i}`),!0):(c.warn("DB",`Column ${o} not found in ${n}, skipping rename`),!1)};s("sdk_sessions","claude_session_id","content_session_id")&&t++,s("sdk_sessions","sdk_session_id","memory_session_id")&&t++,s("pending_messages","claude_session_id","content_session_id")&&t++,s("observations","sdk_session_id","memory_session_id")&&t++,s("session_summaries","sdk_session_id","memory_session_id")&&t++,s("user_prompts","claude_session_id","content_session_id")&&t++,this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(17,new Date().toISOString()),t>0?c.debug("DB",`Successfully renamed ${t} session ID columns`):c.debug("DB","No session ID column renames needed (already up to date)")}repairSessionIdColumnRename(){this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(19)||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(19,new Date().toISOString())}addFailedAtEpochColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(20))return;this.db.query("PRAGMA table_info(pending_messages)").all().some(n=>n.name==="failed_at_epoch")||(this.db.run("ALTER TABLE pending_messages ADD COLUMN failed_at_epoch INTEGER"),c.debug("DB","Added failed_at_epoch column to pending_messages table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(20,new Date().toISOString())}addOnUpdateCascadeToForeignKeys(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(21))return;c.debug("DB","Adding ON UPDATE CASCADE to FK constraints on observations and session_summaries"),this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TRIGGER IF EXISTS observations_ai"),this.db.run("DROP TRIGGER IF EXISTS observations_ad"),this.db.run("DROP TRIGGER IF EXISTS observations_au"),this.db.run("DROP TABLE IF EXISTS observations_new");let t=this.db.query("PRAGMA table_info(observations)").all(),s=t.some(S=>S.name==="metadata"),n=t.some(S=>S.name==="content_hash"),o=s?`,
341
341
  metadata TEXT`:"",i=s?", metadata":"",a=n?`,
342
342
  content_hash TEXT`:"",d=n?", content_hash":"",u=`
343
343
  CREATE TABLE observations_new (
@@ -359,7 +359,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
359
359
  created_at_epoch INTEGER NOT NULL${o}${a},
360
360
  FOREIGN KEY(memory_session_id) REFERENCES sdk_sessions(memory_session_id) ON DELETE CASCADE ON UPDATE CASCADE
361
361
  )
362
- `,c=`
362
+ `,l=`
363
363
  INSERT INTO observations_new
364
364
  SELECT id, memory_session_id, project, text, type, title, subtitle, facts,
365
365
  narrative, concepts, files_read, files_modified, prompt_number,
@@ -433,7 +433,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
433
433
  INSERT INTO session_summaries_fts(rowid, request, investigated, learned, completed, next_steps, notes)
434
434
  VALUES (new.id, new.request, new.investigated, new.learned, new.completed, new.next_steps, new.notes);
435
435
  END;
436
- `;try{this.recreateObservationsWithCascade(u,c,m,p),this.recreateSessionSummariesWithCascade(g,I,A,h),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(21,new Date().toISOString()),this.db.run("COMMIT"),this.db.run("PRAGMA foreign_keys = ON"),_.debug("DB","Successfully added ON UPDATE CASCADE to FK constraints")}catch(S){throw this.db.run("ROLLBACK"),this.db.run("PRAGMA foreign_keys = ON"),S instanceof Error?S:new Error(String(S))}}recreateObservationsWithCascade(e,t,s,n){this.db.run(e),this.db.run(t),this.db.run("DROP TABLE observations"),this.db.run("ALTER TABLE observations_new RENAME TO observations"),this.db.run(s),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run(n)}recreateSessionSummariesWithCascade(e,t,s,n){this.db.run(e),this.db.run(t),this.db.run("DROP TABLE session_summaries"),this.db.run("ALTER TABLE session_summaries_new RENAME TO session_summaries"),this.db.run(s),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='session_summaries_fts'").all().length>0&&this.db.run(n)}addObservationContentHashColumn(){if(this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="content_hash")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString());return}this.db.run("ALTER TABLE observations ADD COLUMN content_hash TEXT"),this.db.run("UPDATE observations SET content_hash = substr(hex(randomblob(8)), 1, 16) WHERE content_hash IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_content_hash ON observations(content_hash, created_at_epoch)"),_.debug("DB","Added content_hash column to observations table with backfill and index"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString())}addSessionCustomTitleColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(23))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="custom_title")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN custom_title TEXT"),_.debug("DB","Added custom_title column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(23,new Date().toISOString())}addSessionPlatformSourceColumn(){let t=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source"),n=this.db.query("PRAGMA index_list(sdk_sessions)").all().some(i=>i.name==="idx_sdk_sessions_platform_source");this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(24)&&t&&n||(t||(this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${E}'`),_.debug("DB","Added platform_source column to sdk_sessions table")),this.db.run(`
436
+ `;try{this.recreateObservationsWithCascade(u,l,m,p),this.recreateSessionSummariesWithCascade(g,I,A,h),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(21,new Date().toISOString()),this.db.run("COMMIT"),this.db.run("PRAGMA foreign_keys = ON"),c.debug("DB","Successfully added ON UPDATE CASCADE to FK constraints")}catch(S){throw this.db.run("ROLLBACK"),this.db.run("PRAGMA foreign_keys = ON"),S instanceof Error?S:new Error(String(S))}}recreateObservationsWithCascade(e,t,s,n){this.db.run(e),this.db.run(t),this.db.run("DROP TABLE observations"),this.db.run("ALTER TABLE observations_new RENAME TO observations"),this.db.run(s),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run(n)}recreateSessionSummariesWithCascade(e,t,s,n){this.db.run(e),this.db.run(t),this.db.run("DROP TABLE session_summaries"),this.db.run("ALTER TABLE session_summaries_new RENAME TO session_summaries"),this.db.run(s),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='session_summaries_fts'").all().length>0&&this.db.run(n)}addObservationContentHashColumn(){if(this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="content_hash")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString());return}this.db.run("ALTER TABLE observations ADD COLUMN content_hash TEXT"),this.db.run("UPDATE observations SET content_hash = substr(hex(randomblob(8)), 1, 16) WHERE content_hash IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_content_hash ON observations(content_hash, created_at_epoch)"),c.debug("DB","Added content_hash column to observations table with backfill and index"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString())}addSessionCustomTitleColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(23))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="custom_title")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN custom_title TEXT"),c.debug("DB","Added custom_title column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(23,new Date().toISOString())}addSessionPlatformSourceColumn(){let t=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source"),n=this.db.query("PRAGMA index_list(sdk_sessions)").all().some(i=>i.name==="idx_sdk_sessions_platform_source");this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(24)&&t&&n||(t||(this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${E}'`),c.debug("DB","Added platform_source column to sdk_sessions table")),this.db.run(`
437
437
  UPDATE sdk_sessions
438
438
  SET platform_source = '${E}'
439
439
  WHERE platform_source IS NULL OR platform_source = ''
@@ -483,7 +483,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
483
483
  `),this.db.run(`
484
484
  CREATE UNIQUE INDEX IF NOT EXISTS ux_observations_session_hash
485
485
  ON observations(memory_session_id, content_hash)
486
- `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(29,new Date().toISOString()),this.db.run("COMMIT")}catch(o){throw this.db.run("ROLLBACK"),o}}addObservationsMetadataColumn(){this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="metadata")||(this.db.run("ALTER TABLE observations ADD COLUMN metadata TEXT"),_.debug("DB","Added metadata column to observations table (#2116)")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(30,new Date().toISOString())}updateMemorySessionId(e,t){this.db.prepare(`
486
+ `),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(29,new Date().toISOString()),this.db.run("COMMIT")}catch(o){throw this.db.run("ROLLBACK"),o}}addObservationsMetadataColumn(){this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="metadata")||(this.db.run("ALTER TABLE observations ADD COLUMN metadata TEXT"),c.debug("DB","Added metadata column to observations table (#2116)")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(30,new Date().toISOString())}updateMemorySessionId(e,t){this.db.prepare(`
487
487
  UPDATE sdk_sessions
488
488
  SET memory_session_id = ?
489
489
  WHERE id = ?
@@ -495,7 +495,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
495
495
  SELECT id, memory_session_id, worker_port FROM sdk_sessions WHERE id = ?
496
496
  `).get(e);if(!n)throw new Error(`Session ${e} not found in sdk_sessions`);n.memory_session_id!==t&&(this.db.prepare(`
497
497
  UPDATE sdk_sessions SET memory_session_id = ? WHERE id = ?
498
- `).run(t,e),_.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,oldId:n.memory_session_id,newId:t})),typeof s=="number"&&n.worker_port!==s&&this.db.prepare(`
498
+ `).run(t,e),c.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,oldId:n.memory_session_id,newId:t})),typeof s=="number"&&n.worker_port!==s&&this.db.prepare(`
499
499
  UPDATE sdk_sessions SET worker_port = ? WHERE id = ?
500
500
  `).run(s,e)}getRecentSummaries(e,t=10){return this.db.prepare(`
501
501
  SELECT
@@ -636,14 +636,14 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
636
636
  SELECT *
637
637
  FROM observations
638
638
  WHERE id = ?
639
- `).get(e)||null}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i,type:a,concepts:d,files:u}=t,c=s==="relevance",m=c?"":`ORDER BY o.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,p=n&&!c?`LIMIT ${n}`:"",g=e.map(()=>"?").join(","),I=[...e],A=[];if(o&&(A.push("o.project = ?"),I.push(o)),i&&(A.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),I.push(L(i))),a)if(Array.isArray(a)){let R=a.map(()=>"?").join(",");A.push(`o.type IN (${R})`),I.push(...a)}else A.push("o.type = ?"),I.push(a);if(d){let R=Array.isArray(d)?d:[d],b=R.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE value = ?)");I.push(...R),A.push(`(${b.join(" OR ")})`)}if(u){let R=Array.isArray(u)?u:[u],b=R.map(()=>"(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE value LIKE ?) OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE value LIKE ?))");R.forEach(C=>{I.push(`%${C}%`,`%${C}%`)}),A.push(`(${b.join(" OR ")})`)}let h=A.length>0?`WHERE o.id IN (${g}) AND ${A.join(" AND ")}`:`WHERE o.id IN (${g})`,y=this.db.prepare(`
639
+ `).get(e)||null}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i,type:a,concepts:d,files:u}=t,l=s==="relevance",m=l?"":`ORDER BY o.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,p=n&&!l?`LIMIT ${n}`:"",g=e.map(()=>"?").join(","),I=[...e],A=[];if(o&&(A.push("o.project = ?"),I.push(o)),i&&(A.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),I.push(L(i))),a)if(Array.isArray(a)){let R=a.map(()=>"?").join(",");A.push(`o.type IN (${R})`),I.push(...a)}else A.push("o.type = ?"),I.push(a);if(d){let R=Array.isArray(d)?d:[d],b=R.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE value = ?)");I.push(...R),A.push(`(${b.join(" OR ")})`)}if(u){let R=Array.isArray(u)?u:[u],b=R.map(()=>"(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE value LIKE ?) OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE value LIKE ?))");R.forEach(C=>{I.push(`%${C}%`,`%${C}%`)}),A.push(`(${b.join(" OR ")})`)}let h=A.length>0?`WHERE o.id IN (${g}) AND ${A.join(" AND ")}`:`WHERE o.id IN (${g})`,y=this.db.prepare(`
640
640
  SELECT o.*
641
641
  FROM observations o
642
642
  LEFT JOIN sdk_sessions s ON s.memory_session_id = o.memory_session_id
643
643
  ${h}
644
644
  ${m}
645
645
  ${p}
646
- `).all(...I);if(!c)return y;let D=new Map(y.map(R=>[R.id,R])),f=e.map(R=>D.get(R)).filter(R=>!!R);return n?f.slice(0,n):f}getSummaryForSession(e,t){let s=[e],n="";return t&&(n=`
646
+ `).all(...I);if(!l)return y;let D=new Map(y.map(R=>[R.id,R])),f=e.map(R=>D.get(R)).filter(R=>!!R);return n?f.slice(0,n):f}getSummaryForSession(e,t){let s=[e],n="";return t&&(n=`
647
647
  AND EXISTS (
648
648
  SELECT 1
649
649
  FROM sdk_sessions sdk
@@ -683,7 +683,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
683
683
  SELECT COUNT(*) as count FROM user_prompts WHERE session_db_id = ?
684
684
  `).get(s).count:this.db.prepare(`
685
685
  SELECT COUNT(*) as count FROM user_prompts WHERE content_session_id = ?
686
- `).get(e).count}createSDKSession(e,t,s,n,o){let i=new Date,a=i.getTime(),d=er(n,o),u=d.platformSource??E,c=this.rt(se(s)),m=this.db.prepare(`
686
+ `).get(e).count}createSDKSession(e,t,s,n,o){let i=new Date,a=i.getTime(),d=er(n,o),u=d.platformSource??E,l=this.rt(se(s)),m=this.db.prepare(`
687
687
  SELECT id, platform_source
688
688
  FROM sdk_sessions
689
689
  WHERE COALESCE(NULLIF(platform_source, ''), ?) = ?
@@ -698,7 +698,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
698
698
  INSERT INTO sdk_sessions
699
699
  (content_session_id, memory_session_id, project, platform_source, user_prompt, custom_title, started_at, started_at_epoch, status)
700
700
  VALUES (?, NULL, ?, ?, ?, ?, ?, ?, 'active')
701
- `).run(e,t,u,c,d.customTitle||null,i.toISOString(),a);return Number(p.lastInsertRowid)}saveUserPrompt(e,t,s,n){let o=new Date,i=o.getTime(),a=this.rt(se(s)),d=this.resolvePromptSessionDbId(e,n);return this.db.prepare(`
701
+ `).run(e,t,u,l,d.customTitle||null,i.toISOString(),a);return Number(p.lastInsertRowid)}saveUserPrompt(e,t,s,n){let o=new Date,i=o.getTime(),a=this.rt(se(s)),d=this.resolvePromptSessionDbId(e,n);return this.db.prepare(`
702
702
  INSERT INTO user_prompts
703
703
  (session_db_id, content_session_id, prompt_number, prompt_text, created_at, created_at_epoch)
704
704
  VALUES (?, ?, ?, ?, ?, ?)
@@ -712,7 +712,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
712
712
  FROM user_prompts
713
713
  WHERE content_session_id = ? AND prompt_number = ?
714
714
  LIMIT 1
715
- `).get(e,t)?.prompt_text??null}storeObservation(e,t,s,n,o=0,i,a){let d=i??Date.now(),u=new Date(d).toISOString(),c=this.rt(s.title),m=this.rt(s.subtitle),p=this.rt(s.narrative),g=this.rl(s.facts),I=this.rt(s.metadata??null),A=Ie(e,c??null,p??null),h=ve({type:s.type,narrative:p,files_modified:s.files_modified}),S;if(this.mq.reconcile.enabled){let R=this.reconcileBeforeInsert(t,s.type,c??null,p??null);if(R.action==="NOOP"&&R.candidateId){let b=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE id = ?").get(R.candidateId);if(b)return{id:b.id,createdAtEpoch:b.created_at_epoch}}else R.action==="UPDATE"&&(S=R.candidateId)}let D=this.db.prepare(`
715
+ `).get(e,t)?.prompt_text??null}storeObservation(e,t,s,n,o=0,i,a){let d=i??Date.now(),u=new Date(d).toISOString(),l=this.rt(s.title),m=this.rt(s.subtitle),p=this.rt(s.narrative),g=this.rl(s.facts),I=this.rt(s.metadata??null),A=Ie(e,l??null,p??null),h=ve({type:s.type,narrative:p,files_modified:s.files_modified}),S;if(this.mq.reconcile.enabled){let R=this.reconcileBeforeInsert(t,s.type,l??null,p??null);if(R.action==="NOOP"&&R.candidateId){let b=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE id = ?").get(R.candidateId);if(b)return{id:b.id,createdAtEpoch:b.created_at_epoch}}else R.action==="UPDATE"&&(S=R.candidateId)}let D=this.db.prepare(`
716
716
  INSERT INTO observations
717
717
  (memory_session_id, project, type, title, subtitle, facts, narrative, concepts,
718
718
  files_read, files_modified, prompt_number, discovery_tokens, agent_type, agent_id, content_hash, created_at, created_at_epoch,
@@ -720,12 +720,12 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
720
720
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
721
721
  ON CONFLICT(memory_session_id, content_hash) DO NOTHING
722
722
  RETURNING id, created_at_epoch
723
- `).get(e,t,s.type,c,m,JSON.stringify(g),p,JSON.stringify(s.concepts),JSON.stringify(s.files_read),JSON.stringify(s.files_modified),n||null,o,s.agent_type??null,s.agent_id??null,A,u,d,a||null,I,h,d,Me({title:c??null,facts:g,narrative:p??null}));if(D)return S!==void 0&&this.mq.supersession.enabled&&this.supersedeObservation(S,D.id,d),{id:D.id,createdAtEpoch:D.created_at_epoch};let f=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE memory_session_id = ? AND content_hash = ?").get(e,A);if(!f)throw new Error(`storeObservation: ON CONFLICT without existing row for content_hash=${A}`);return{id:f.id,createdAtEpoch:f.created_at_epoch}}storeSummary(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),c=this.db.prepare(`
723
+ `).get(e,t,s.type,l,m,JSON.stringify(g),p,JSON.stringify(s.concepts),JSON.stringify(s.files_read),JSON.stringify(s.files_modified),n||null,o,s.agent_type??null,s.agent_id??null,A,u,d,a||null,I,h,d,Me({title:l??null,facts:g,narrative:p??null}));if(D)return S!==void 0&&this.mq.supersession.enabled&&this.supersedeObservation(S,D.id,d),{id:D.id,createdAtEpoch:D.created_at_epoch};let f=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE memory_session_id = ? AND content_hash = ?").get(e,A);if(!f)throw new Error(`storeObservation: ON CONFLICT without existing row for content_hash=${A}`);return{id:f.id,createdAtEpoch:f.created_at_epoch}}storeSummary(e,t,s,n,o=0,i){let a=i??Date.now(),d=new Date(a).toISOString(),l=this.db.prepare(`
724
724
  INSERT INTO session_summaries
725
725
  (memory_session_id, project, request, investigated, learned, completed,
726
726
  next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
727
727
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
728
- `).run(e,t,this.rt(s.request),this.rt(s.investigated),this.rt(s.learned),this.rt(s.completed),this.rt(s.next_steps),this.rt(s.notes),n||null,o,d,a);return{id:Number(c.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,o,i=0,a,d){let u=a??Date.now(),c=new Date(u).toISOString();return this.db.transaction(()=>{let p=[],g=this.db.prepare(`
728
+ `).run(e,t,this.rt(s.request),this.rt(s.investigated),this.rt(s.learned),this.rt(s.completed),this.rt(s.next_steps),this.rt(s.notes),n||null,o,d,a);return{id:Number(l.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,o,i=0,a,d){let u=a??Date.now(),l=new Date(u).toISOString();return this.db.transaction(()=>{let p=[],g=this.db.prepare(`
729
729
  INSERT INTO observations
730
730
  (memory_session_id, project, type, title, subtitle, facts, narrative, concepts,
731
731
  files_read, files_modified, prompt_number, discovery_tokens, agent_type, agent_id, content_hash, created_at, created_at_epoch,
@@ -733,35 +733,35 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
733
733
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
734
734
  ON CONFLICT(memory_session_id, content_hash) DO NOTHING
735
735
  RETURNING id
736
- `),I=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let h of s){let S=this.rt(h.title),y=this.rt(h.subtitle),D=this.rt(h.narrative),f=this.rl(h.facts),R=Ie(e,S??null,D??null),b=g.get(e,t,h.type,S,y,JSON.stringify(f),D,JSON.stringify(h.concepts),JSON.stringify(h.files_read),JSON.stringify(h.files_modified),o||null,i,h.agent_type??null,h.agent_id??null,R,c,u,d||null,ve({type:h.type,narrative:D,files_modified:h.files_modified}),u,Me({title:S??null,facts:f,narrative:D??null}));if(b){p.push(b.id);continue}let C=I.get(e,R);if(!C)throw new Error(`storeObservations: ON CONFLICT without existing row for content_hash=${R}`);p.push(C.id)}let A=null;if(n){let S=this.db.prepare(`
736
+ `),I=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let h of s){let S=this.rt(h.title),y=this.rt(h.subtitle),D=this.rt(h.narrative),f=this.rl(h.facts),R=Ie(e,S??null,D??null),b=g.get(e,t,h.type,S,y,JSON.stringify(f),D,JSON.stringify(h.concepts),JSON.stringify(h.files_read),JSON.stringify(h.files_modified),o||null,i,h.agent_type??null,h.agent_id??null,R,l,u,d||null,ve({type:h.type,narrative:D,files_modified:h.files_modified}),u,Me({title:S??null,facts:f,narrative:D??null}));if(b){p.push(b.id);continue}let C=I.get(e,R);if(!C)throw new Error(`storeObservations: ON CONFLICT without existing row for content_hash=${R}`);p.push(C.id)}let A=null;if(n){let S=this.db.prepare(`
737
737
  INSERT INTO session_summaries
738
738
  (memory_session_id, project, request, investigated, learned, completed,
739
739
  next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
740
740
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
741
- `).run(e,t,this.rt(n.request),this.rt(n.investigated),this.rt(n.learned),this.rt(n.completed),this.rt(n.next_steps),this.rt(n.notes),o||null,i,c,u);A=Number(S.lastInsertRowid)}return{observationIds:p,summaryId:A,createdAtEpoch:u}})()}markObservationsUsed(e,t=Date.now()){if(e.length!==0)try{if(!this.db.query("PRAGMA table_info(observations)").all().some(o=>o.name==="last_used_at"))return;let n=e.map(()=>"?").join(",");this.db.prepare(`UPDATE observations SET last_used_at = ? WHERE id IN (${n})`).run(t,...e)}catch(s){_.debug("DB","markObservationsUsed failed",{count:e.length},s instanceof Error?s:new Error(String(s)))}}evaporateScratch(e){try{let t=this.db.prepare("DELETE FROM observations WHERE memory_session_id = ? AND type = 'scratch'").run(e),s=Number(t.changes??0);return s>0&&_.info("DB","Evaporated scratch observations at SessionEnd",{memorySessionId:e,count:s}),s}catch(t){return _.warn("DB","evaporateScratch failed",{memorySessionId:e},t instanceof Error?t:new Error(String(t))),0}}reconcileBeforeInsert(e,t,s,n){try{let o=Date.now()-7776e6,i=this.db.query("PRAGMA table_info(observations)").all().some(m=>m.name==="valid_to"),a=i?"AND valid_to IS NULL":"",d=this.db.prepare(`
741
+ `).run(e,t,this.rt(n.request),this.rt(n.investigated),this.rt(n.learned),this.rt(n.completed),this.rt(n.next_steps),this.rt(n.notes),o||null,i,l,u);A=Number(S.lastInsertRowid)}return{observationIds:p,summaryId:A,createdAtEpoch:u}})()}markObservationsUsed(e,t=Date.now()){if(e.length!==0)try{if(!this.db.query("PRAGMA table_info(observations)").all().some(o=>o.name==="last_used_at"))return;let n=e.map(()=>"?").join(",");this.db.prepare(`UPDATE observations SET last_used_at = ? WHERE id IN (${n})`).run(t,...e)}catch(s){c.debug("DB","markObservationsUsed failed",{count:e.length},s instanceof Error?s:new Error(String(s)))}}evaporateScratch(e){try{let t=this.db.prepare("DELETE FROM observations WHERE memory_session_id = ? AND type = 'scratch'").run(e),s=Number(t.changes??0);return s>0&&c.info("DB","Evaporated scratch observations at SessionEnd",{memorySessionId:e,count:s}),s}catch(t){return c.warn("DB","evaporateScratch failed",{memorySessionId:e},t instanceof Error?t:new Error(String(t))),0}}evaporateAllScratch(){try{let e=this.db.prepare("DELETE FROM observations WHERE type = 'scratch'").run(),t=Number(e.changes??0);return t>0&&c.info("DB","Evaporated all scratch observations on idle shutdown",{count:t}),t}catch(e){return c.warn("DB","evaporateAllScratch failed",{},e instanceof Error?e:new Error(String(e))),0}}reconcileBeforeInsert(e,t,s,n){try{let o=Date.now()-7776e6,i=this.db.query("PRAGMA table_info(observations)").all().some(m=>m.name==="valid_to"),a=i?"AND valid_to IS NULL":"",d=this.db.prepare(`
742
742
  SELECT id, title, narrative, importance
743
743
  FROM observations
744
744
  WHERE project = ? AND type = ? AND created_at_epoch >= ? ${a}
745
745
  ORDER BY created_at_epoch DESC
746
746
  LIMIT 20
747
- `).all(e,t,o);if(d.length===0)return{action:"ADD"};let u=this.mq.supersession.enabled&&i;return ze({title:s,narrative:n},d,{noopThreshold:this.mq.reconcile.noopThreshold,updateBand:this.mq.reconcile.updateBand,supersessionEnabled:u})}catch(o){return _.warn("DB","reconcileBeforeInsert failed; defaulting to ADD",{project:e,type:t},o instanceof Error?o:new Error(String(o))),{action:"ADD"}}}supersedeObservation(e,t,s){try{this.db.prepare(`
747
+ `).all(e,t,o);if(d.length===0)return{action:"ADD"};let u=this.mq.supersession.enabled&&i;return ze({title:s,narrative:n},d,{noopThreshold:this.mq.reconcile.noopThreshold,updateBand:this.mq.reconcile.updateBand,supersessionEnabled:u})}catch(o){return c.warn("DB","reconcileBeforeInsert failed; defaulting to ADD",{project:e,type:t},o instanceof Error?o:new Error(String(o))),{action:"ADD"}}}supersedeObservation(e,t,s){try{this.db.prepare(`
748
748
  UPDATE observations
749
749
  SET valid_to = ?,
750
750
  metadata = json_set(COALESCE(metadata, '{}'), '$.superseded_by', ?)
751
751
  WHERE id = ? AND valid_to IS NULL
752
- `).run(s,t,e)}catch(n){_.warn("DB","supersedeObservation failed",{oldId:e,newId:t},n instanceof Error?n:new Error(String(n)))}}getObservationsAsOf(e,t){return this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="valid_from")?this.db.prepare(`
752
+ `).run(s,t,e)}catch(n){c.warn("DB","supersedeObservation failed",{oldId:e,newId:t},n instanceof Error?n:new Error(String(n)))}}getObservationsAsOf(e,t){return this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="valid_from")?this.db.prepare(`
753
753
  SELECT * FROM observations
754
754
  WHERE project = ?
755
755
  AND COALESCE(valid_from, created_at_epoch) <= ?
756
756
  AND (valid_to IS NULL OR valid_to > ?)
757
- `).all(e,t,t):this.db.prepare("SELECT * FROM observations WHERE project = ?").all(e)}deleteObservationsByProject(e,t={}){let s=(e??"").trim();if(s===""||s==="*")throw new Error(`deleteObservationsByProject: refusing unsafe project '${e}'`);let n=this.db.prepare("SELECT count(*) AS c FROM observations WHERE project = ?").get(s).c,o=this.db.prepare("SELECT count(*) AS c FROM session_summaries WHERE project = ?").get(s).c;if(t.dryRun)return{project:s,dryRun:!0,observationsDeleted:n,summariesDeleted:o};this.db.transaction(()=>{this.db.prepare("DELETE FROM observations WHERE project = ?").run(s),this.db.prepare("DELETE FROM session_summaries WHERE project = ?").run(s)})();try{this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run("INSERT INTO observations_fts(observations_fts) VALUES('rebuild')")}catch(a){_.warn("DB","observations_fts rebuild after project delete failed",{project:s},a instanceof Error?a:new Error(String(a)))}return _.info("DB","Deleted observations by project",{project:s,observationsDeleted:n,summariesDeleted:o}),{project:s,dryRun:!1,observationsDeleted:n,summariesDeleted:o}}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i}=t,a=s==="relevance",d=a?"":`ORDER BY ss.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,u=n&&!a?`LIMIT ${n}`:"",c=e.map(()=>"?").join(","),m=[...e],p=[];o&&(p.push("ss.project = ?"),m.push(o)),i&&(p.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),m.push(L(i)));let g=p.length>0?`AND ${p.join(" AND ")}`:"",A=this.db.prepare(`
757
+ `).all(e,t,t):this.db.prepare("SELECT * FROM observations WHERE project = ?").all(e)}deleteObservationsByProject(e,t={}){let s=(e??"").trim();if(s===""||s==="*")throw new Error(`deleteObservationsByProject: refusing unsafe project '${e}'`);let n=this.db.prepare("SELECT count(*) AS c FROM observations WHERE project = ?").get(s).c,o=this.db.prepare("SELECT count(*) AS c FROM session_summaries WHERE project = ?").get(s).c;if(t.dryRun)return{project:s,dryRun:!0,observationsDeleted:n,summariesDeleted:o};this.db.transaction(()=>{this.db.prepare("DELETE FROM observations WHERE project = ?").run(s),this.db.prepare("DELETE FROM session_summaries WHERE project = ?").run(s)})();try{this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run("INSERT INTO observations_fts(observations_fts) VALUES('rebuild')")}catch(a){c.warn("DB","observations_fts rebuild after project delete failed",{project:s},a instanceof Error?a:new Error(String(a)))}return c.info("DB","Deleted observations by project",{project:s,observationsDeleted:n,summariesDeleted:o}),{project:s,dryRun:!1,observationsDeleted:n,summariesDeleted:o}}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i}=t,a=s==="relevance",d=a?"":`ORDER BY ss.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,u=n&&!a?`LIMIT ${n}`:"",l=e.map(()=>"?").join(","),m=[...e],p=[];o&&(p.push("ss.project = ?"),m.push(o)),i&&(p.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),m.push(L(i)));let g=p.length>0?`AND ${p.join(" AND ")}`:"",A=this.db.prepare(`
758
758
  SELECT ss.*
759
759
  FROM session_summaries ss
760
760
  LEFT JOIN sdk_sessions s ON s.memory_session_id = ss.memory_session_id
761
- WHERE ss.id IN (${c}) ${g}
761
+ WHERE ss.id IN (${l}) ${g}
762
762
  ${d}
763
763
  ${u}
764
- `).all(...m);if(!a)return A;let h=new Map(A.map(y=>[y.id,y])),S=e.map(y=>h.get(y)).filter(y=>!!y);return n?S.slice(0,n):S}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i}=t,a=s==="relevance",d=a?"":`ORDER BY up.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,u=n?`LIMIT ${n}`:"",c=e.map(()=>"?").join(","),m=[...e],p=[];o&&(p.push("s.project = ?"),m.push(o)),i&&(p.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),m.push(L(i)));let g=p.length>0?`AND ${p.join(" AND ")}`:"",A=this.db.prepare(`
764
+ `).all(...m);if(!a)return A;let h=new Map(A.map(y=>[y.id,y])),S=e.map(y=>h.get(y)).filter(y=>!!y);return n?S.slice(0,n):S}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",limit:n,project:o,platformSource:i}=t,a=s==="relevance",d=a?"":`ORDER BY up.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,u=n?`LIMIT ${n}`:"",l=e.map(()=>"?").join(","),m=[...e],p=[];o&&(p.push("s.project = ?"),m.push(o)),i&&(p.push(`COALESCE(NULLIF(s.platform_source, ''), '${E}') = ?`),m.push(L(i)));let g=p.length>0?`AND ${p.join(" AND ")}`:"",A=this.db.prepare(`
765
765
  SELECT
766
766
  up.*,
767
767
  s.project,
@@ -769,10 +769,10 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
769
769
  COALESCE(NULLIF(s.platform_source, ''), '${E}') as platform_source
770
770
  FROM user_prompts up
771
771
  JOIN sdk_sessions s ON up.session_db_id = s.id
772
- WHERE up.id IN (${c}) ${g}
772
+ WHERE up.id IN (${l}) ${g}
773
773
  ${d}
774
774
  ${u}
775
- `).all(...m);if(!a)return A;let h=new Map(A.map(S=>[S.id,S]));return e.map(S=>h.get(S)).filter(S=>!!S)}getTimelineAroundTimestamp(e,t=10,s=10,n,o){return this.getTimelineAroundObservation(null,e,t,s,n,o)}getTimelineAroundObservation(e,t,s=10,n=10,o,i){let a=i?L(i):void 0,d=(f,R)=>{let b=[],C=[];return o&&(b.push(`${f}.project = ?`),C.push(o)),a&&(b.push(`COALESCE(NULLIF(${R}.platform_source, ''), '${E}') = ?`),C.push(a)),{clause:b.length>0?`AND ${b.join(" AND ")}`:"",params:C}},u=d("o","src"),c=d("ss","src"),m=d("s","s"),p,g;if(e!==null){let f=`
775
+ `).all(...m);if(!a)return A;let h=new Map(A.map(S=>[S.id,S]));return e.map(S=>h.get(S)).filter(S=>!!S)}getTimelineAroundTimestamp(e,t=10,s=10,n,o){return this.getTimelineAroundObservation(null,e,t,s,n,o)}getTimelineAroundObservation(e,t,s=10,n=10,o,i){let a=i?L(i):void 0,d=(f,R)=>{let b=[],C=[];return o&&(b.push(`${f}.project = ?`),C.push(o)),a&&(b.push(`COALESCE(NULLIF(${R}.platform_source, ''), '${E}') = ?`),C.push(a)),{clause:b.length>0?`AND ${b.join(" AND ")}`:"",params:C}},u=d("o","src"),l=d("ss","src"),m=d("s","s"),p,g;if(e!==null){let f=`
776
776
  SELECT o.id, o.created_at_epoch
777
777
  FROM observations o
778
778
  LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
@@ -786,7 +786,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
786
786
  WHERE o.id >= ? ${u.clause}
787
787
  ORDER BY o.id ASC
788
788
  LIMIT ?
789
- `;try{let b=this.db.prepare(f).all(e,...u.params,s+1),C=this.db.prepare(R).all(e,...u.params,n+1);if(b.length===0&&C.length===0)return{observations:[],sessions:[],prompts:[]};p=b.length>0?b[b.length-1].created_at_epoch:t,g=C.length>0?C[C.length-1].created_at_epoch:t}catch(b){return b instanceof Error?_.error("DB","Error getting boundary observations",{project:o},b):_.error("DB","Error getting boundary observations with non-Error",{},new Error(String(b))),{observations:[],sessions:[],prompts:[]}}}else{let f=`
789
+ `;try{let b=this.db.prepare(f).all(e,...u.params,s+1),C=this.db.prepare(R).all(e,...u.params,n+1);if(b.length===0&&C.length===0)return{observations:[],sessions:[],prompts:[]};p=b.length>0?b[b.length-1].created_at_epoch:t,g=C.length>0?C[C.length-1].created_at_epoch:t}catch(b){return b instanceof Error?c.error("DB","Error getting boundary observations",{project:o},b):c.error("DB","Error getting boundary observations with non-Error",{},new Error(String(b))),{observations:[],sessions:[],prompts:[]}}}else{let f=`
790
790
  SELECT o.created_at_epoch
791
791
  FROM observations o
792
792
  LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
@@ -800,7 +800,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
800
800
  WHERE o.created_at_epoch >= ? ${u.clause}
801
801
  ORDER BY o.created_at_epoch ASC
802
802
  LIMIT ?
803
- `;try{let b=this.db.prepare(f).all(t,...u.params,s),C=this.db.prepare(R).all(t,...u.params,n+1);if(b.length===0&&C.length===0)return{observations:[],sessions:[],prompts:[]};p=b.length>0?b[b.length-1].created_at_epoch:t,g=C.length>0?C[C.length-1].created_at_epoch:t}catch(b){return b instanceof Error?_.error("DB","Error getting boundary timestamps",{project:o},b):_.error("DB","Error getting boundary timestamps with non-Error",{},new Error(String(b))),{observations:[],sessions:[],prompts:[]}}}let I=`
803
+ `;try{let b=this.db.prepare(f).all(t,...u.params,s),C=this.db.prepare(R).all(t,...u.params,n+1);if(b.length===0&&C.length===0)return{observations:[],sessions:[],prompts:[]};p=b.length>0?b[b.length-1].created_at_epoch:t,g=C.length>0?C[C.length-1].created_at_epoch:t}catch(b){return b instanceof Error?c.error("DB","Error getting boundary timestamps",{project:o},b):c.error("DB","Error getting boundary timestamps with non-Error",{},new Error(String(b))),{observations:[],sessions:[],prompts:[]}}}let I=`
804
804
  SELECT o.*
805
805
  FROM observations o
806
806
  LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
@@ -810,7 +810,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
810
810
  SELECT ss.*
811
811
  FROM session_summaries ss
812
812
  LEFT JOIN sdk_sessions src ON src.memory_session_id = ss.memory_session_id
813
- WHERE ss.created_at_epoch >= ? AND ss.created_at_epoch <= ? ${c.clause}
813
+ WHERE ss.created_at_epoch >= ? AND ss.created_at_epoch <= ? ${l.clause}
814
814
  ORDER BY ss.created_at_epoch ASC
815
815
  `,h=`
816
816
  SELECT up.*, s.project, s.memory_session_id, COALESCE(NULLIF(s.platform_source, ''), '${E}') as platform_source
@@ -818,7 +818,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
818
818
  JOIN sdk_sessions s ON up.session_db_id = s.id
819
819
  WHERE up.created_at_epoch >= ? AND up.created_at_epoch <= ? ${m.clause}
820
820
  ORDER BY up.created_at_epoch ASC
821
- `,S=this.db.prepare(I).all(p,g,...u.params),y=this.db.prepare(A).all(p,g,...c.params),D=this.db.prepare(h).all(p,g,...m.params);return{observations:S,sessions:y.map(f=>({id:f.id,memory_session_id:f.memory_session_id,project:f.project,request:f.request,completed:f.completed,next_steps:f.next_steps,created_at:f.created_at,created_at_epoch:f.created_at_epoch})),prompts:D.map(f=>({id:f.id,content_session_id:f.content_session_id,prompt_number:f.prompt_number,prompt_text:f.prompt_text,project:f.project,platform_source:f.platform_source,created_at:f.created_at,created_at_epoch:f.created_at_epoch}))}}getPromptById(e){return this.db.prepare(`
821
+ `,S=this.db.prepare(I).all(p,g,...u.params),y=this.db.prepare(A).all(p,g,...l.params),D=this.db.prepare(h).all(p,g,...m.params);return{observations:S,sessions:y.map(f=>({id:f.id,memory_session_id:f.memory_session_id,project:f.project,request:f.request,completed:f.completed,next_steps:f.next_steps,created_at:f.created_at,created_at_epoch:f.created_at_epoch})),prompts:D.map(f=>({id:f.id,content_session_id:f.content_session_id,prompt_number:f.prompt_number,prompt_text:f.prompt_text,project:f.project,platform_source:f.platform_source,created_at:f.created_at,created_at_epoch:f.created_at_epoch}))}}getPromptById(e){return this.db.prepare(`
822
822
  SELECT
823
823
  p.id,
824
824
  p.content_session_id,
@@ -847,7 +847,7 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
847
847
  `).all(...e)}getOrCreateManualSession(e){let t=`manual-${e}`,s=`manual-content-${e}`;if(this.db.prepare("SELECT memory_session_id FROM sdk_sessions WHERE memory_session_id = ?").get(t))return t;let o=new Date;return this.db.prepare(`
848
848
  INSERT INTO sdk_sessions (memory_session_id, content_session_id, project, platform_source, started_at, started_at_epoch, status)
849
849
  VALUES (?, ?, ?, ?, ?, ?, 'active')
850
- `).run(t,s,e,E,o.toISOString(),o.getTime()),_.info("SESSION","Created manual session",{memorySessionId:t,project:e}),t}close(){this.db.close()}importSdkSession(e){let t=L(e.platform_source),s=this.db.prepare(`SELECT id FROM sdk_sessions
850
+ `).run(t,s,e,E,o.toISOString(),o.getTime()),c.info("SESSION","Created manual session",{memorySessionId:t,project:e}),t}close(){this.db.close()}importSdkSession(e){let t=L(e.platform_source),s=this.db.prepare(`SELECT id FROM sdk_sessions
851
851
  WHERE platform_source = ? AND content_session_id = ?`).get(t,e.content_session_id);return s?{imported:!1,id:s.id}:{imported:!0,id:this.db.prepare(`
852
852
  INSERT INTO sdk_sessions (
853
853
  content_session_id, memory_session_id, project, platform_source, user_prompt,
@@ -882,8 +882,8 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
882
882
  session_db_id, content_session_id, prompt_number, prompt_text,
883
883
  created_at, created_at_epoch
884
884
  ) VALUES (?, ?, ?, ?, ?, ?)
885
- `).run(t,e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var dt=require("os"),ut=G(require("path"),1),ct=require("child_process");var oe=require("fs"),ne=G(require("path"),1);var X={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function at(r){let e=ne.default.join(r,".git"),t;try{t=(0,oe.statSync)(e)}catch(c){return c instanceof Error&&c.code!=="ENOENT"&&_.warn("GIT","Unexpected error checking .git",{error:c instanceof Error?c.message:String(c)}),X}if(!t.isFile())return X;let s;try{s=(0,oe.readFileSync)(e,"utf-8").trim()}catch(c){return _.warn("GIT","Failed to read .git file",{error:c instanceof Error?c.message:String(c)}),X}let n=s.match(/^gitdir:\s*(.+)$/);if(!n)return X;let i=n[1].match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!i)return X;let a=i[1],d=ne.default.basename(r),u=ne.default.basename(a);return{isWorktree:!0,worktreeName:d,parentRepoPath:a,parentProjectName:u}}function _t(r){return r==="~"||r.startsWith("~/")?r.replace(/^~/,(0,dt.homedir)()):r}function tr(r){try{return(0,ct.execFileSync)("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim()||null}catch{return null}}function sr(r){if(!r||r.trim()==="")return _.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),"unknown-project";let e=_t(r),s=tr(e)??e,n=ut.default.basename(s);if(n===""){if(process.platform==="win32"){let i=r.match(/^([A-Z]):\\/i);if(i){let d=`drive-${i[1].toUpperCase()}`;return _.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:d}),d}}return _.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),"unknown-project"}return n}function lt(r){let e=sr(r);if(!r)return{primary:e,parent:null,isWorktree:!1,allProjects:[e]};let t=_t(r),s=at(t);if(s.isWorktree&&s.parentProjectName){let n=`${s.parentProjectName}/${e}`;return{primary:n,parent:s.parentProjectName,isWorktree:!0,allProjects:[s.parentProjectName,n]}}return{primary:e,parent:null,isWorktree:!1,allProjects:[e]}}var w=require("fs"),j=require("path"),we=require("os");var xe={DEFAULT:3e5,HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function pt(r){return process.platform==="win32"?Math.round(r*xe.WINDOWS_MULTIPLIER):r}var O=require("fs");var x=require("path");var mt=require("crypto");var rr=process.platform==="win32";function nr(r){(0,O.existsSync)(r)||(0,O.mkdirSync)(r,{recursive:!0})}function ie(r,e){let t=r;try{if((0,O.lstatSync)(r).isSymbolicLink())try{t=(0,O.realpathSync)(r)}catch{let u=(0,O.readlinkSync)(r);t=(0,x.resolve)((0,x.dirname)(r),u)}}catch(u){let c=u.code;if(c!=="ENOENT"&&c!=="ENOTDIR")throw u}nr((0,x.dirname)(t));let s=(0,x.dirname)(t),n=(0,x.basename)(t),o=(0,x.join)(s,`.${n}.${process.pid}.${(0,mt.randomBytes)(6).toString("hex")}.tmp`),i=Buffer.from(JSON.stringify(e,null,2)+`
886
- `,"utf-8"),a;try{a=(0,O.statSync)(t).mode&511}catch{}let d;try{d=a!==void 0?(0,O.openSync)(o,"w",a):(0,O.openSync)(o,"w");let u=0;for(;u<i.length;){let c=(0,O.writeSync)(d,i,u,i.length-u);if(c===0)throw new Error(`writeSync stalled at ${u}/${i.length} bytes`);u+=c}if((0,O.fsyncSync)(d),(0,O.closeSync)(d),d=void 0,(0,O.renameSync)(o,t),!rr){let c;try{c=(0,O.openSync)(s,"r"),(0,O.fsyncSync)(c)}catch{}finally{if(c!==void 0)try{(0,O.closeSync)(c)}catch{}}}}catch(u){if(d!==void 0)try{(0,O.closeSync)(d)}catch{}try{(0,O.unlinkSync)(o)}catch{}throw u}}var ae=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_API_TIMEOUT_MS:String(pt(xe.API_REQUEST)),CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,j.join)((0,we.homedir)(),".keepmind"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"5",CLAUDE_MEM_OBSERVATION_BATCH_MAX:"3",CLAUDE_MEM_MAX_CONTEXT_MESSAGES:"40",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_UPDATE_CHECK_ENABLED:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:(0,j.join)((0,we.homedir)(),".keepmind","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:""};static getAllDefaults(){return{...this.DEFAULTS}}static envOverride(e){let t=e.replace(/^CLAUDE_MEM_/,"KEEPMIND_");return process.env[t]??process.env[e]}static get(e){return this.envOverride(e)??this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS)){let n=this.envOverride(s);n!==void 0&&(t[s]=n)}return t}static loadFromFile(e,t=!0){try{if(!(0,w.existsSync)(e)){let a=this.getAllDefaults();try{let d=(0,j.dirname)(e);(0,w.existsSync)(d)||(0,w.mkdirSync)(d,{recursive:!0}),ie(e,a),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(d){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,d instanceof Error?d.message:String(d))}return t?this.applyEnvOverrides(a):a}let s=(0,w.readFileSync)(e,"utf-8"),n=JSON.parse(s.replace(/^\uFEFF/,"")),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{ie(e,o),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a instanceof Error?a.message:String(a))}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return t?this.applyEnvOverrides(i):i}catch(s){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,s instanceof Error?s.message:String(s));let n=this.getAllDefaults();try{if((0,w.existsSync)(e)){let o=`${e}.corrupt-${Date.now()}`;(0,w.renameSync)(e,o),console.warn("[SETTINGS] Backed up corrupt settings file to:",o)}ie(e,n),console.warn("[SETTINGS] Recovered settings file with defaults:",e)}catch(o){console.warn("[SETTINGS] Failed to recover corrupt settings file:",e,o instanceof Error?o.message:String(o))}return t?this.applyEnvOverrides(n):n}}};var W=require("fs"),de=require("path");var M=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=Ye(),t=[...process.env.CLAUDE_MEM_MODES_DIR?[process.env.CLAUDE_MEM_MODES_DIR]:[],(0,de.join)(e,"modes"),(0,de.join)(e,"..","plugin","modes")],s=t.find(n=>(0,W.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,de.join)(this.modesDir,`${e}.json`);if(!(0,W.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,W.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,_.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(u=>u.id),concepts:d.observation_concepts.map(u=>u.id)}),d}catch(d){if(d instanceof Error?_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(d)}),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch(d){d instanceof Error?_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{error:String(d)}),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),_.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch(d){return d instanceof Error?_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{message:d.message}):_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{error:String(d)}),this.activeMode=o,o}if(!i)return _.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,_.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}};function Et(){let r=F.settings(),e=ae.loadFromFile(r),t=M.getInstance().getActiveMode(),s=new Set(t.observation_types.map(o=>o.id)),n=new Set(t.observation_concepts.map(o=>o.id));return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:s,observationConcepts:n,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var l={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},gt=4,ke=1;function ue(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/gt)}function Pe(r){let e=r.length,t=r.reduce((i,a)=>i+ue(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function or(r){return M.getInstance().getWorkEmoji(r)}function V(r,e){let t=ue(r),s=r.discovery_tokens||0,n=or(r.type),o=s>0?`${n} ${s.toLocaleString("en-US")}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function ce(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}function ir(r){return ue(r)}function ar(r,e){if(!Number.isFinite(e)||e<=0)return r;let t=[],s=0;for(let n of r){let o=ir(n);s+o>e||(t.push(n),s+=o)}return t}function Tt(r,e){let t=e.now??Date.now(),s=r.map(i=>({o:i,score:Je(i,{now:t,halfLifeDays:e.halfLifeDays})})).sort((i,a)=>a.score-i.score).map(i=>i.o),n=e.maxRows>0?s.slice(0,e.maxRows):s;return ar(n,e.tokenBudget).sort((i,a)=>(a.created_at_epoch??0)-(i.created_at_epoch??0))}var ft=G(require("path"),1),_e=require("fs");function bt(r,e,t,s){let n=Array.from(t.observationTypes),o=n.map(()=>"?").join(","),i=Array.from(t.observationConcepts),a=i.map(()=>"?").join(",");return r.db.prepare(`
885
+ `).run(t,e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var dt=require("os"),ut=G(require("path"),1),ct=require("child_process");var oe=require("fs"),ne=G(require("path"),1);var X={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function at(r){let e=ne.default.join(r,".git"),t;try{t=(0,oe.statSync)(e)}catch(l){return l instanceof Error&&l.code!=="ENOENT"&&c.warn("GIT","Unexpected error checking .git",{error:l instanceof Error?l.message:String(l)}),X}if(!t.isFile())return X;let s;try{s=(0,oe.readFileSync)(e,"utf-8").trim()}catch(l){return c.warn("GIT","Failed to read .git file",{error:l instanceof Error?l.message:String(l)}),X}let n=s.match(/^gitdir:\s*(.+)$/);if(!n)return X;let i=n[1].match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!i)return X;let a=i[1],d=ne.default.basename(r),u=ne.default.basename(a);return{isWorktree:!0,worktreeName:d,parentRepoPath:a,parentProjectName:u}}function lt(r){return r==="~"||r.startsWith("~/")?r.replace(/^~/,(0,dt.homedir)()):r}function tr(r){try{return(0,ct.execFileSync)("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim()||null}catch{return null}}function sr(r){if(!r||r.trim()==="")return c.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:r}),"unknown-project";let e=lt(r),s=tr(e)??e,n=ut.default.basename(s);if(n===""){if(process.platform==="win32"){let i=r.match(/^([A-Z]):\\/i);if(i){let d=`drive-${i[1].toUpperCase()}`;return c.info("PROJECT_NAME","Drive root detected",{cwd:r,projectName:d}),d}}return c.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:r}),"unknown-project"}return n}function _t(r){let e=sr(r);if(!r)return{primary:e,parent:null,isWorktree:!1,allProjects:[e]};let t=lt(r),s=at(t);if(s.isWorktree&&s.parentProjectName){let n=`${s.parentProjectName}/${e}`;return{primary:n,parent:s.parentProjectName,isWorktree:!0,allProjects:[s.parentProjectName,n]}}return{primary:e,parent:null,isWorktree:!1,allProjects:[e]}}var w=require("fs"),j=require("path"),we=require("os");var xe={DEFAULT:3e5,HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function pt(r){return process.platform==="win32"?Math.round(r*xe.WINDOWS_MULTIPLIER):r}var O=require("fs");var x=require("path");var mt=require("crypto");var rr=process.platform==="win32";function nr(r){(0,O.existsSync)(r)||(0,O.mkdirSync)(r,{recursive:!0})}function ie(r,e){let t=r;try{if((0,O.lstatSync)(r).isSymbolicLink())try{t=(0,O.realpathSync)(r)}catch{let u=(0,O.readlinkSync)(r);t=(0,x.resolve)((0,x.dirname)(r),u)}}catch(u){let l=u.code;if(l!=="ENOENT"&&l!=="ENOTDIR")throw u}nr((0,x.dirname)(t));let s=(0,x.dirname)(t),n=(0,x.basename)(t),o=(0,x.join)(s,`.${n}.${process.pid}.${(0,mt.randomBytes)(6).toString("hex")}.tmp`),i=Buffer.from(JSON.stringify(e,null,2)+`
886
+ `,"utf-8"),a;try{a=(0,O.statSync)(t).mode&511}catch{}let d;try{d=a!==void 0?(0,O.openSync)(o,"w",a):(0,O.openSync)(o,"w");let u=0;for(;u<i.length;){let l=(0,O.writeSync)(d,i,u,i.length-u);if(l===0)throw new Error(`writeSync stalled at ${u}/${i.length} bytes`);u+=l}if((0,O.fsyncSync)(d),(0,O.closeSync)(d),d=void 0,(0,O.renameSync)(o,t),!rr){let l;try{l=(0,O.openSync)(s,"r"),(0,O.fsyncSync)(l)}catch{}finally{if(l!==void 0)try{(0,O.closeSync)(l)}catch{}}}}catch(u){if(d!==void 0)try{(0,O.closeSync)(d)}catch{}try{(0,O.unlinkSync)(o)}catch{}throw u}}var ae=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_API_TIMEOUT_MS:String(pt(xe.API_REQUEST)),CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,j.join)((0,we.homedir)(),".keepmind"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"5",CLAUDE_MEM_OBSERVATION_BATCH_MAX:"3",CLAUDE_MEM_MAX_CONTEXT_MESSAGES:"40",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_UPDATE_CHECK_ENABLED:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:(0,j.join)((0,we.homedir)(),".keepmind","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:""};static getAllDefaults(){return{...this.DEFAULTS}}static envOverride(e){let t=e.replace(/^CLAUDE_MEM_/,"KEEPMIND_");return process.env[t]??process.env[e]}static get(e){return this.envOverride(e)??this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS)){let n=this.envOverride(s);n!==void 0&&(t[s]=n)}return t}static loadFromFile(e,t=!0){try{if(!(0,w.existsSync)(e)){let a=this.getAllDefaults();try{let d=(0,j.dirname)(e);(0,w.existsSync)(d)||(0,w.mkdirSync)(d,{recursive:!0}),ie(e,a),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(d){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,d instanceof Error?d.message:String(d))}return t?this.applyEnvOverrides(a):a}let s=(0,w.readFileSync)(e,"utf-8"),n=JSON.parse(s.replace(/^\uFEFF/,"")),o=n;if(n.env&&typeof n.env=="object"){o=n.env;try{ie(e,o),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a instanceof Error?a.message:String(a))}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return t?this.applyEnvOverrides(i):i}catch(s){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,s instanceof Error?s.message:String(s));let n=this.getAllDefaults();try{if((0,w.existsSync)(e)){let o=`${e}.corrupt-${Date.now()}`;(0,w.renameSync)(e,o),console.warn("[SETTINGS] Backed up corrupt settings file to:",o)}ie(e,n),console.warn("[SETTINGS] Recovered settings file with defaults:",e)}catch(o){console.warn("[SETTINGS] Failed to recover corrupt settings file:",e,o instanceof Error?o.message:String(o))}return t?this.applyEnvOverrides(n):n}}};var W=require("fs"),de=require("path");var M=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=Ye(),t=[...process.env.CLAUDE_MEM_MODES_DIR?[process.env.CLAUDE_MEM_MODES_DIR]:[],(0,de.join)(e,"modes"),(0,de.join)(e,"..","plugin","modes")],s=t.find(n=>(0,W.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,de.join)(this.modesDir,`${e}.json`);if(!(0,W.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,W.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,c.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(u=>u.id),concepts:d.observation_concepts.map(u=>u.id)}),d}catch(d){if(d instanceof Error?c.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:d.message}):c.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(d)}),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch(d){d instanceof Error?c.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{message:d.message}):c.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{error:String(d)}),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),c.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch(d){return d instanceof Error?c.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{message:d.message}):c.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{error:String(d)}),this.activeMode=o,o}if(!i)return c.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,c.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}};function Et(){let r=F.settings(),e=ae.loadFromFile(r),t=M.getInstance().getActiveMode(),s=new Set(t.observation_types.map(o=>o.id)),n=new Set(t.observation_concepts.map(o=>o.id));return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:s,observationConcepts:n,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var _={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},gt=4,ke=1;function ue(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/gt)}function Pe(r){let e=r.length,t=r.reduce((i,a)=>i+ue(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function or(r){return M.getInstance().getWorkEmoji(r)}function V(r,e){let t=ue(r),s=r.discovery_tokens||0,n=or(r.type),o=s>0?`${n} ${s.toLocaleString("en-US")}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function ce(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}function ir(r){return ue(r)}function ar(r,e){if(!Number.isFinite(e)||e<=0)return r;let t=[],s=0;for(let n of r){let o=ir(n);s+o>e||(t.push(n),s+=o)}return t}function Tt(r,e){let t=e.now??Date.now(),s=r.map(i=>({o:i,score:Je(i,{now:t,halfLifeDays:e.halfLifeDays})})).sort((i,a)=>a.score-i.score).map(i=>i.o),n=e.maxRows>0?s.slice(0,e.maxRows):s;return ar(n,e.tokenBudget).sort((i,a)=>(a.created_at_epoch??0)-(i.created_at_epoch??0))}var ft=G(require("path"),1),le=require("fs");function bt(r,e,t,s){let n=Array.from(t.observationTypes),o=n.map(()=>"?").join(","),i=Array.from(t.observationConcepts),a=i.map(()=>"?").join(",");return r.db.prepare(`
887
887
  SELECT
888
888
  o.id,
889
889
  o.memory_session_id,
@@ -992,14 +992,14 @@ ${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
992
992
  AND (? IS NULL OR s.platform_source = ?)
993
993
  ORDER BY ss.created_at_epoch DESC
994
994
  LIMIT ?
995
- `).all(...e,...e,s??null,s??null,t.sessionCount+ke)}function dr(r){return r.replace(/[/.]/g,"-")}function ur(r){if(!r.includes('"type":"assistant"'))return null;let e=JSON.parse(r);if(e.type==="assistant"&&e.message?.content&&Array.isArray(e.message.content)){let t="";for(let s of e.message.content)s.type==="text"&&(t+=s.text);if(t=t.replace(ot,"").trim(),t)return t}return null}function cr(r){for(let e=r.length-1;e>=0;e--)try{let t=ur(r[e]);if(t)return t}catch(t){t instanceof Error?_.debug("WORKER","Skipping malformed transcript line",{lineIndex:e},t):_.debug("WORKER","Skipping malformed transcript line",{lineIndex:e,error:String(t)});continue}return""}function _r(r){try{if(!(0,_e.existsSync)(r))return{assistantMessage:""};let e=(0,_e.readFileSync)(r,"utf-8").trim();if(!e)return{assistantMessage:""};let t=e.split(`
996
- `).filter(n=>n.trim());return{assistantMessage:cr(t)}}catch(e){return e instanceof Error?_.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r},e):_.warn("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r,error:String(e)}),{assistantMessage:""}}}function Ot(r,e,t,s){if(!e.showLastMessage||r.length===0)return{assistantMessage:""};let n=r.find(d=>d.memory_session_id!==t);if(!n)return{assistantMessage:""};let o=n.memory_session_id,i=dr(s),a=ft.default.join($,"projects",i,`${o}.jsonl`);return _r(a)}function At(r,e){let t=e[0]?.id;return r.map((s,n)=>{let o=n===0?null:e[n+1];return{...s,displayEpoch:o?o.created_at_epoch:s.created_at_epoch,displayTime:o?o.created_at:s.created_at,shouldShowLink:s.id!==t}})}function It(r,e){let t=[...r.map(s=>({type:"observation",data:s})),...e.map(s=>({type:"summary",data:s}))];return t.sort((s,n)=>{let o=s.type==="observation"?s.data.created_at_epoch:s.data.displayEpoch,i=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch;return o-i}),t}function Nt(r,e){return new Set(r.slice(0,e).map(t=>t.id))}function Lt(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function yt(r){return[`# [${r}] recent context, ${Lt()}`,""]}function Dt(){return[`Legend: \u{1F3AF}session ${M.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji}${t.id}`).join(" ")}`,"Format: ID TIME TYPE TITLE","Fetch details: get_observations([IDs]) | Search: mem-search skill",""]}function vt(r,e){let t=[],s=[`${r.totalObservations} obs (${r.totalReadTokens.toLocaleString("en-US")}t read)`,`${r.totalDiscoveryTokens.toLocaleString("en-US")}t work`];return r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)&&(e.showSavingsPercent?s.push(`${r.savingsPercent}% savings`):e.showSavingsAmount&&s.push(`${r.savings.toLocaleString("en-US")}t saved`)),t.push(`Stats: ${s.join(" | ")}`),t.push(""),t}function Mt(r){return[`### ${r}`]}function Ut(r){return r.toLowerCase().replace(" am","a").replace(" pm","p")}function xt(r,e,t){let s=r.title||"Untitled",n=M.getInstance().getTypeIcon(r.type),o=e?Ut(e):'"';return`${r.id} ${o} ${n} ${s}`}function wt(r,e,t,s){let n=[],o=r.title||"Untitled",i=M.getInstance().getTypeIcon(r.type),a=e?Ut(e):'"',{readTokens:d,discoveryDisplay:u}=V(r,s);n.push(`**${r.id}** ${a} ${i} **${o}**`),t&&n.push(t);let c=[];return s.showReadTokens&&c.push(`~${d}t`),s.showWorkTokens&&c.push(u),c.length>0&&n.push(c.join(" ")),n.push(""),n}function kt(r,e){return[`S${r.id} ${r.request||"Session started"} (${e})`]}var Ct=200;function K(r,e){if(!e)return[];let t=e.length>Ct?`${e.slice(0,Ct).trimEnd()}\u2026`:e;return[`**${r}**: ${t}`,""]}function Pt(r){return r.assistantMessage?["","---","","**Previously**","",`A: ${r.assistantMessage}`,""]:[]}function Ft(r,e){return["",`Access ${Math.round(r/1e3)}k tokens of past work via get_observations([IDs]) or mem-search skill.`]}function $t(r){return`# [${r}] recent context, ${Lt()}
995
+ `).all(...e,...e,s??null,s??null,t.sessionCount+ke)}function dr(r){return r.replace(/[/.]/g,"-")}function ur(r){if(!r.includes('"type":"assistant"'))return null;let e=JSON.parse(r);if(e.type==="assistant"&&e.message?.content&&Array.isArray(e.message.content)){let t="";for(let s of e.message.content)s.type==="text"&&(t+=s.text);if(t=t.replace(ot,"").trim(),t)return t}return null}function cr(r){for(let e=r.length-1;e>=0;e--)try{let t=ur(r[e]);if(t)return t}catch(t){t instanceof Error?c.debug("WORKER","Skipping malformed transcript line",{lineIndex:e},t):c.debug("WORKER","Skipping malformed transcript line",{lineIndex:e,error:String(t)});continue}return""}function lr(r){try{if(!(0,le.existsSync)(r))return{assistantMessage:""};let e=(0,le.readFileSync)(r,"utf-8").trim();if(!e)return{assistantMessage:""};let t=e.split(`
996
+ `).filter(n=>n.trim());return{assistantMessage:cr(t)}}catch(e){return e instanceof Error?c.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r},e):c.warn("WORKER","Failed to extract prior messages from transcript",{transcriptPath:r,error:String(e)}),{assistantMessage:""}}}function Ot(r,e,t,s){if(!e.showLastMessage||r.length===0)return{assistantMessage:""};let n=r.find(d=>d.memory_session_id!==t);if(!n)return{assistantMessage:""};let o=n.memory_session_id,i=dr(s),a=ft.default.join($,"projects",i,`${o}.jsonl`);return lr(a)}function At(r,e){let t=e[0]?.id;return r.map((s,n)=>{let o=n===0?null:e[n+1];return{...s,displayEpoch:o?o.created_at_epoch:s.created_at_epoch,displayTime:o?o.created_at:s.created_at,shouldShowLink:s.id!==t}})}function It(r,e){let t=[...r.map(s=>({type:"observation",data:s})),...e.map(s=>({type:"summary",data:s}))];return t.sort((s,n)=>{let o=s.type==="observation"?s.data.created_at_epoch:s.data.displayEpoch,i=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch;return o-i}),t}function Nt(r,e){return new Set(r.slice(0,e).map(t=>t.id))}function Lt(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function yt(r){return[`# [${r}] recent context, ${Lt()}`,""]}function Dt(){return[`Legend: \u{1F3AF}session ${M.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji}${t.id}`).join(" ")}`,"Format: ID TIME TYPE TITLE","Fetch details: get_observations([IDs]) | Search: mem-search skill",""]}function vt(r,e){let t=[],s=[`${r.totalObservations} obs (${r.totalReadTokens.toLocaleString("en-US")}t read)`,`${r.totalDiscoveryTokens.toLocaleString("en-US")}t work`];return r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)&&(e.showSavingsPercent?s.push(`${r.savingsPercent}% savings`):e.showSavingsAmount&&s.push(`${r.savings.toLocaleString("en-US")}t saved`)),t.push(`Stats: ${s.join(" | ")}`),t.push(""),t}function Mt(r){return[`### ${r}`]}function Ut(r){return r.toLowerCase().replace(" am","a").replace(" pm","p")}function xt(r,e,t){let s=r.title||"Untitled",n=M.getInstance().getTypeIcon(r.type),o=e?Ut(e):'"';return`${r.id} ${o} ${n} ${s}`}function wt(r,e,t,s){let n=[],o=r.title||"Untitled",i=M.getInstance().getTypeIcon(r.type),a=e?Ut(e):'"',{readTokens:d,discoveryDisplay:u}=V(r,s);n.push(`**${r.id}** ${a} ${i} **${o}**`),t&&n.push(t);let l=[];return s.showReadTokens&&l.push(`~${d}t`),s.showWorkTokens&&l.push(u),l.length>0&&n.push(l.join(" ")),n.push(""),n}function kt(r,e){return[`S${r.id} ${r.request||"Session started"} (${e})`]}var Ct=200;function K(r,e){if(!e)return[];let t=e.length>Ct?`${e.slice(0,Ct).trimEnd()}\u2026`:e;return[`**${r}**: ${t}`,""]}function Pt(r){return r.assistantMessage?["","---","","**Previously**","",`A: ${r.assistantMessage}`,""]:[]}function Ft(r,e){return["",`Access ${Math.round(r/1e3)}k tokens of past work via get_observations([IDs]) or mem-search skill.`]}function $t(r){return`# [${r}] recent context, ${Lt()}
997
997
 
998
- No previous sessions found.`}function Gt(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Ht(r){return["",`${l.bright}${l.cyan}[${r}] recent context, ${Gt()}${l.reset}`,`${l.gray}${"\u2500".repeat(60)}${l.reset}`,""]}function Bt(){let e=M.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ");return[`${l.dim}Legend: session-request | ${e}${l.reset}`,""]}function Xt(){return[`${l.bright}Column Key${l.reset}`,`${l.dim} Read: Tokens to read this observation (cost to learn it now)${l.reset}`,`${l.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${l.reset}`,""]}function jt(){return[`${l.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${l.reset}`,"",`${l.dim}When you need implementation details, rationale, or debugging context:${l.reset}`,`${l.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${l.reset}`,`${l.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${l.reset}`,`${l.dim} - Trust this index over re-reading code for past decisions and learnings${l.reset}`,""]}function Wt(r,e){let t=[];if(t.push(`${l.bright}${l.cyan}Context Economics${l.reset}`),t.push(`${l.dim} Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)${l.reset}`),t.push(`${l.dim} Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${l.reset}`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(`${l.green}${s}${l.reset}`)}return t.push(""),t}function Vt(r){return[`${l.bright}${l.cyan}${r}${l.reset}`,""]}function Kt(r){return[`${l.dim}${r}${l.reset}`]}function Yt(r,e,t,s){let n=r.title||"Untitled",o=M.getInstance().getTypeIcon(r.type),{readTokens:i,discoveryTokens:a,workEmoji:d}=V(r,s),u=t?`${l.dim}${e}${l.reset}`:" ".repeat(e.length),c=s.showReadTokens&&i>0?`${l.dim}(~${i}t)${l.reset}`:"",m=s.showWorkTokens&&a>0?`${l.dim}(${d} ${a.toLocaleString()}t)${l.reset}`:"";return` ${l.dim}#${r.id}${l.reset} ${u} ${o} ${n} ${c} ${m}`}function qt(r,e,t,s,n){let o=[],i=r.title||"Untitled",a=M.getInstance().getTypeIcon(r.type),{readTokens:d,discoveryTokens:u,workEmoji:c}=V(r,n),m=t?`${l.dim}${e}${l.reset}`:" ".repeat(e.length),p=n.showReadTokens&&d>0?`${l.dim}(~${d}t)${l.reset}`:"",g=n.showWorkTokens&&u>0?`${l.dim}(${c} ${u.toLocaleString()}t)${l.reset}`:"";return o.push(` ${l.dim}#${r.id}${l.reset} ${m} ${a} ${l.bright}${i}${l.reset}`),s&&o.push(` ${l.dim}${s}${l.reset}`),(p||g)&&o.push(` ${p} ${g}`),o.push(""),o}function Jt(r,e){let t=`${r.request||"Session started"} (${e})`;return[`${l.yellow}#S${r.id}${l.reset} ${t}`,""]}function Y(r,e,t){return e?[`${t}${r}:${l.reset} ${e}`,""]:[]}function Qt(r){return r.assistantMessage?["","---","",`${l.bright}${l.magenta}Previously${l.reset}`,"",`${l.dim}A: ${r.assistantMessage}${l.reset}`,""]:[]}function zt(r,e){let t=Math.round(r/1e3);return["",`${l.dim}Access ${t}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${l.reset}`]}function Zt(r){return`
999
- ${l.bright}${l.cyan}[${r}] recent context, ${Gt()}${l.reset}
1000
- ${l.gray}${"\u2500".repeat(60)}${l.reset}
998
+ No previous sessions found.`}function Gt(){let r=new Date,e=r.toLocaleDateString("en-CA"),t=r.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),s=r.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${t} ${s}`}function Ht(r){return["",`${_.bright}${_.cyan}[${r}] recent context, ${Gt()}${_.reset}`,`${_.gray}${"\u2500".repeat(60)}${_.reset}`,""]}function Bt(){let e=M.getInstance().getActiveMode().observation_types.map(t=>`${t.emoji} ${t.id}`).join(" | ");return[`${_.dim}Legend: session-request | ${e}${_.reset}`,""]}function Xt(){return[`${_.bright}Column Key${_.reset}`,`${_.dim} Read: Tokens to read this observation (cost to learn it now)${_.reset}`,`${_.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${_.reset}`,""]}function jt(){return[`${_.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${_.reset}`,"",`${_.dim}When you need implementation details, rationale, or debugging context:${_.reset}`,`${_.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${_.reset}`,`${_.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${_.reset}`,`${_.dim} - Trust this index over re-reading code for past decisions and learnings${_.reset}`,""]}function Wt(r,e){let t=[];if(t.push(`${_.bright}${_.cyan}Context Economics${_.reset}`),t.push(`${_.dim} Loading: ${r.totalObservations} observations (${r.totalReadTokens.toLocaleString()} tokens to read)${_.reset}`),t.push(`${_.dim} Work investment: ${r.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${_.reset}`),r.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let s=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?s+=`${r.savings.toLocaleString()} tokens (${r.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?s+=`${r.savings.toLocaleString()} tokens`:s+=`${r.savingsPercent}% reduction from reuse`,t.push(`${_.green}${s}${_.reset}`)}return t.push(""),t}function Vt(r){return[`${_.bright}${_.cyan}${r}${_.reset}`,""]}function Kt(r){return[`${_.dim}${r}${_.reset}`]}function Yt(r,e,t,s){let n=r.title||"Untitled",o=M.getInstance().getTypeIcon(r.type),{readTokens:i,discoveryTokens:a,workEmoji:d}=V(r,s),u=t?`${_.dim}${e}${_.reset}`:" ".repeat(e.length),l=s.showReadTokens&&i>0?`${_.dim}(~${i}t)${_.reset}`:"",m=s.showWorkTokens&&a>0?`${_.dim}(${d} ${a.toLocaleString()}t)${_.reset}`:"";return` ${_.dim}#${r.id}${_.reset} ${u} ${o} ${n} ${l} ${m}`}function qt(r,e,t,s,n){let o=[],i=r.title||"Untitled",a=M.getInstance().getTypeIcon(r.type),{readTokens:d,discoveryTokens:u,workEmoji:l}=V(r,n),m=t?`${_.dim}${e}${_.reset}`:" ".repeat(e.length),p=n.showReadTokens&&d>0?`${_.dim}(~${d}t)${_.reset}`:"",g=n.showWorkTokens&&u>0?`${_.dim}(${l} ${u.toLocaleString()}t)${_.reset}`:"";return o.push(` ${_.dim}#${r.id}${_.reset} ${m} ${a} ${_.bright}${i}${_.reset}`),s&&o.push(` ${_.dim}${s}${_.reset}`),(p||g)&&o.push(` ${p} ${g}`),o.push(""),o}function Jt(r,e){let t=`${r.request||"Session started"} (${e})`;return[`${_.yellow}#S${r.id}${_.reset} ${t}`,""]}function Y(r,e,t){return e?[`${t}${r}:${_.reset} ${e}`,""]:[]}function Qt(r){return r.assistantMessage?["","---","",`${_.bright}${_.magenta}Previously${_.reset}`,"",`${_.dim}A: ${r.assistantMessage}${_.reset}`,""]:[]}function zt(r,e){let t=Math.round(r/1e3);return["",`${_.dim}Access ${t}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${_.reset}`]}function Zt(r){return`
999
+ ${_.bright}${_.cyan}[${r}] recent context, ${Gt()}${_.reset}
1000
+ ${_.gray}${"\u2500".repeat(60)}${_.reset}
1001
1001
 
1002
- ${l.dim}No previous sessions found for this project yet.${l.reset}
1003
- `}function es(r,e,t,s){let n=[];return s?n.push(...Ht(r)):n.push(...yt(r)),s?n.push(...Bt()):n.push(...Dt()),s&&(n.push(...Xt()),n.push(...jt())),ce(t)&&(s?n.push(...Wt(e,t)):n.push(...vt(e,t))),n}var me=G(require("path"),1);function Ee(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch(e){return _.debug("PARSER","Failed to parse JSON array, using empty fallback",{preview:r?.substring(0,50)},e instanceof Error?e:new Error(String(e))),[]}}function Fe(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function $e(r){return new Date(r).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function ss(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function ts(r,e){return me.default.isAbsolute(r)?me.default.relative(e,r).split(me.default.sep).join("/"):r}function rs(r,e,t){let s=Ee(r);if(s.length>0)return ts(s[0],e);if(t){let n=Ee(t);if(n.length>0)return ts(n[0],e)}return"General"}function lr(r){let e=new Map;for(let s of r){let n=s.type==="observation"?s.data.created_at:s.data.displayTime,o=ss(n);e.has(o)||e.set(o,[]),e.get(o).push(s)}let t=Array.from(e.entries()).sort((s,n)=>{let o=new Date(s[0]).getTime(),i=new Date(n[0]).getTime();return o-i});return new Map(t)}function ns(r,e){return e.fullObservationField==="narrative"?r.narrative:r.facts?Ee(r.facts).join(`
1004
- `):null}function pr(r,e,t,s){let n=[];n.push(...Mt(r));let o="";for(let i of e)if(i.type==="summary"){let a=i.data,d=Fe(a.displayTime);n.push(...kt(a,d))}else{let a=i.data,d=$e(a.created_at),c=d!==o?d:"";if(o=d,t.has(a.id)){let p=ns(a,s);n.push(...wt(a,c,p,s))}else n.push(xt(a,c,s))}return n}function mr(r,e,t,s,n){let o=[];o.push(...Vt(r));let i=null,a="";for(let d of e)if(d.type==="summary"){i=null,a="";let u=d.data,c=Fe(u.displayTime);o.push(...Jt(u,c))}else{let u=d.data,c=rs(u.files_modified,n,u.files_read),m=$e(u.created_at),p=m!==a;a=m;let g=t.has(u.id);if(c!==i&&(o.push(...Kt(c)),i=c),g){let I=ns(u,s);o.push(...qt(u,m,p,I,s))}else o.push(Yt(u,m,p,s))}return o.push(""),o}function Er(r,e,t,s,n,o){return o?mr(r,e,t,s,n):pr(r,e,t,s)}function os(r,e,t,s,n){let o=[],i=lr(r);for(let[a,d]of i)o.push(...Er(a,d,e,t,s,n));return o}function is(r,e,t){return!(!r.showLastSummary||!e||!!!(e.investigated||e.learned||e.completed||e.next_steps)||t&&e.created_at_epoch<=t.created_at_epoch)}function as(r,e){let t=[];return e?(t.push(...Y("Investigated",r.investigated,l.blue)),t.push(...Y("Learned",r.learned,l.yellow)),t.push(...Y("Completed",r.completed,l.green)),t.push(...Y("Next Steps",r.next_steps,l.magenta))):(t.push(...K("Investigated",r.investigated)),t.push(...K("Learned",r.learned)),t.push(...K("Completed",r.completed)),t.push(...K("Next Steps",r.next_steps))),t}function ds(r,e){return e?Qt(r):Pt(r)}function us(r,e,t){return!ce(e)||r.totalDiscoveryTokens<=0||r.savings<=0?[]:t?zt(r.totalDiscoveryTokens,r.totalReadTokens):Ft(r.totalDiscoveryTokens,r.totalReadTokens)}var gr=cs.default.join((0,_s.homedir)(),".claude","plugins","marketplaces","keepmind","plugin",".install-version");function Tr(){try{return new re}catch(r){if(r instanceof Error&&r.code==="ERR_DLOPEN_FAILED"){try{(0,ls.unlinkSync)(gr)}catch(e){e instanceof Error?_.debug("WORKER","Marker file cleanup failed (may not exist)",{},e):_.debug("WORKER","Marker file cleanup failed (may not exist)",{error:String(e)})}return _.error("WORKER","Native module rebuild needed - restart Claude Code to auto-fix"),null}throw r}}function fr(r,e){return e?Zt(r):$t(r)}function br(r,e,t,s,n,o,i){let a=[],d=Pe(e);a.push(...es(r,d,s,i));let u=t.slice(0,s.sessionCount),c=At(u,t),m=It(e,c),p=Nt(e,s.fullObservationCount);a.push(...os(m,p,s,n,i));let g=t[0],I=e[0];is(s,g,I)&&a.push(...as(g,i));let A=Ot(e,s,o,n);return a.push(...ds(A,i)),a.push(...us(d,s,i)),a.join(`
1005
- `).trimEnd()}var Sr=new Set(["bugfix","discovery","decision","refactor"]);function hr(r,e,t){let s=Pe(r),n={bugfix:0,discovery:0,decision:0,refactor:0,other:0},o=new Set,i=Number.POSITIVE_INFINITY;for(let d of r){let u=Sr.has(d.type)?d.type:"other";n[u]++,d.memory_session_id&&o.add(d.memory_session_id),d.created_at_epoch&&d.created_at_epoch<i&&(i=d.created_at_epoch)}let a=Number.isFinite(i)?Math.max(0,Math.floor((Date.now()-i)/864e5)):0;return{observation_count:r.length,session_count:o.size,timeline_depth_days:a,has_session_summary:e.length>0,obs_type_bugfix:n.bugfix,obs_type_discovery:n.discovery,obs_type_decision:n.decision,obs_type_refactor:n.refactor,obs_type_other:n.other,tokens_injected:s.totalReadTokens,tokens_saved_vs_naive:s.savings,search_strategy:t?"full":"timeline"}}async function Ge(r,e=!1){let t=Et(),s=ee(),n=r?.cwd??process.cwd(),o=lt(n),i=r?.projects?.length?r.projects:o.allProjects,a=i[i.length-1]??o.primary,d=s.importance.enabled&&!r?.full,u=t.totalObservationCount;d&&(t.totalObservationCount=Math.max(u,u*Math.max(1,s.injection.candidateMultiplier))),r?.full&&(t.totalObservationCount=999999,t.sessionCount=999999);let c=Tr();if(!c)return{text:"",stats:null};try{let m=r?.platformSource?L(r.platformSource):void 0,p=i.length>1?ht(c,i,t,m):bt(c,a,t,m),g=d?Tt(p,{tokenBudget:s.injection.tokenBudget,halfLifeDays:s.importance.halfLifeDays,maxRows:u}):p,I=i.length>1?Rt(c,i,t,m):St(c,a,t,m);return s.expiry.enabled&&g.length>0&&c.markObservationsUsed(g.map(h=>h.id)),g.length===0&&I.length===0?{text:fr(a,e),stats:null}:{text:br(a,g,I,t,n,r?.session_id,e),stats:hr(g,I,!!r?.full)}}finally{c.close()}}async function ps(r,e=!1){return(await Ge(r,e)).text}0&&(module.exports={generateContext,generateContextWithStats});
1002
+ ${_.dim}No previous sessions found for this project yet.${_.reset}
1003
+ `}function es(r,e,t,s){let n=[];return s?n.push(...Ht(r)):n.push(...yt(r)),s?n.push(...Bt()):n.push(...Dt()),s&&(n.push(...Xt()),n.push(...jt())),ce(t)&&(s?n.push(...Wt(e,t)):n.push(...vt(e,t))),n}var me=G(require("path"),1);function Ee(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch(e){return c.debug("PARSER","Failed to parse JSON array, using empty fallback",{preview:r?.substring(0,50)},e instanceof Error?e:new Error(String(e))),[]}}function Fe(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function $e(r){return new Date(r).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function ss(r){return new Date(r).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function ts(r,e){return me.default.isAbsolute(r)?me.default.relative(e,r).split(me.default.sep).join("/"):r}function rs(r,e,t){let s=Ee(r);if(s.length>0)return ts(s[0],e);if(t){let n=Ee(t);if(n.length>0)return ts(n[0],e)}return"General"}function _r(r){let e=new Map;for(let s of r){let n=s.type==="observation"?s.data.created_at:s.data.displayTime,o=ss(n);e.has(o)||e.set(o,[]),e.get(o).push(s)}let t=Array.from(e.entries()).sort((s,n)=>{let o=new Date(s[0]).getTime(),i=new Date(n[0]).getTime();return o-i});return new Map(t)}function ns(r,e){return e.fullObservationField==="narrative"?r.narrative:r.facts?Ee(r.facts).join(`
1004
+ `):null}function pr(r,e,t,s){let n=[];n.push(...Mt(r));let o="";for(let i of e)if(i.type==="summary"){let a=i.data,d=Fe(a.displayTime);n.push(...kt(a,d))}else{let a=i.data,d=$e(a.created_at),l=d!==o?d:"";if(o=d,t.has(a.id)){let p=ns(a,s);n.push(...wt(a,l,p,s))}else n.push(xt(a,l,s))}return n}function mr(r,e,t,s,n){let o=[];o.push(...Vt(r));let i=null,a="";for(let d of e)if(d.type==="summary"){i=null,a="";let u=d.data,l=Fe(u.displayTime);o.push(...Jt(u,l))}else{let u=d.data,l=rs(u.files_modified,n,u.files_read),m=$e(u.created_at),p=m!==a;a=m;let g=t.has(u.id);if(l!==i&&(o.push(...Kt(l)),i=l),g){let I=ns(u,s);o.push(...qt(u,m,p,I,s))}else o.push(Yt(u,m,p,s))}return o.push(""),o}function Er(r,e,t,s,n,o){return o?mr(r,e,t,s,n):pr(r,e,t,s)}function os(r,e,t,s,n){let o=[],i=_r(r);for(let[a,d]of i)o.push(...Er(a,d,e,t,s,n));return o}function is(r,e,t){return!(!r.showLastSummary||!e||!!!(e.investigated||e.learned||e.completed||e.next_steps)||t&&e.created_at_epoch<=t.created_at_epoch)}function as(r,e){let t=[];return e?(t.push(...Y("Investigated",r.investigated,_.blue)),t.push(...Y("Learned",r.learned,_.yellow)),t.push(...Y("Completed",r.completed,_.green)),t.push(...Y("Next Steps",r.next_steps,_.magenta))):(t.push(...K("Investigated",r.investigated)),t.push(...K("Learned",r.learned)),t.push(...K("Completed",r.completed)),t.push(...K("Next Steps",r.next_steps))),t}function ds(r,e){return e?Qt(r):Pt(r)}function us(r,e,t){return!ce(e)||r.totalDiscoveryTokens<=0||r.savings<=0?[]:t?zt(r.totalDiscoveryTokens,r.totalReadTokens):Ft(r.totalDiscoveryTokens,r.totalReadTokens)}var gr=cs.default.join((0,ls.homedir)(),".claude","plugins","marketplaces","keepmind","plugin",".install-version");function Tr(){try{return new re}catch(r){if(r instanceof Error&&r.code==="ERR_DLOPEN_FAILED"){try{(0,_s.unlinkSync)(gr)}catch(e){e instanceof Error?c.debug("WORKER","Marker file cleanup failed (may not exist)",{},e):c.debug("WORKER","Marker file cleanup failed (may not exist)",{error:String(e)})}return c.error("WORKER","Native module rebuild needed - restart Claude Code to auto-fix"),null}throw r}}function fr(r,e){return e?Zt(r):$t(r)}function br(r,e,t,s,n,o,i){let a=[],d=Pe(e);a.push(...es(r,d,s,i));let u=t.slice(0,s.sessionCount),l=At(u,t),m=It(e,l),p=Nt(e,s.fullObservationCount);a.push(...os(m,p,s,n,i));let g=t[0],I=e[0];is(s,g,I)&&a.push(...as(g,i));let A=Ot(e,s,o,n);return a.push(...ds(A,i)),a.push(...us(d,s,i)),a.join(`
1005
+ `).trimEnd()}var Sr=new Set(["bugfix","discovery","decision","refactor"]);function hr(r,e,t){let s=Pe(r),n={bugfix:0,discovery:0,decision:0,refactor:0,other:0},o=new Set,i=Number.POSITIVE_INFINITY;for(let d of r){let u=Sr.has(d.type)?d.type:"other";n[u]++,d.memory_session_id&&o.add(d.memory_session_id),d.created_at_epoch&&d.created_at_epoch<i&&(i=d.created_at_epoch)}let a=Number.isFinite(i)?Math.max(0,Math.floor((Date.now()-i)/864e5)):0;return{observation_count:r.length,session_count:o.size,timeline_depth_days:a,has_session_summary:e.length>0,obs_type_bugfix:n.bugfix,obs_type_discovery:n.discovery,obs_type_decision:n.decision,obs_type_refactor:n.refactor,obs_type_other:n.other,tokens_injected:s.totalReadTokens,tokens_saved_vs_naive:s.savings,search_strategy:t?"full":"timeline"}}async function Ge(r,e=!1){let t=Et(),s=ee(),n=r?.cwd??process.cwd(),o=_t(n),i=r?.projects?.length?r.projects:o.allProjects,a=i[i.length-1]??o.primary,d=s.importance.enabled&&!r?.full,u=t.totalObservationCount;d&&(t.totalObservationCount=Math.max(u,u*Math.max(1,s.injection.candidateMultiplier))),r?.full&&(t.totalObservationCount=999999,t.sessionCount=999999);let l=Tr();if(!l)return{text:"",stats:null};try{let m=r?.platformSource?L(r.platformSource):void 0,p=i.length>1?ht(l,i,t,m):bt(l,a,t,m),g=d?Tt(p,{tokenBudget:s.injection.tokenBudget,halfLifeDays:s.importance.halfLifeDays,maxRows:u}):p,I=i.length>1?Rt(l,i,t,m):St(l,a,t,m);return s.expiry.enabled&&g.length>0&&l.markObservationsUsed(g.map(h=>h.id)),g.length===0&&I.length===0?{text:fr(a,e),stats:null}:{text:br(a,g,I,t,n,r?.session_id,e),stats:hr(g,I,!!r?.full)}}finally{l.close()}}async function ps(r,e=!1){return(await Ge(r,e)).text}0&&(module.exports={generateContext,generateContextWithStats});