claude-mem 13.34.2 → 13.35.0

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,10 +1,10 @@
1
1
  var __CM_FILENAME__ = typeof __filename !== "undefined" ? __filename : require("node:path").resolve(process.argv[1] || "");
2
2
  var __CM_DIRNAME__ = typeof __dirname !== "undefined" ? __dirname : require("node:path").dirname(__CM_FILENAME__);
3
3
  var __IMPORT_META_URL__ = require("node:url").pathToFileURL(__CM_FILENAME__).href;
4
- "use strict";var Ce=Object.defineProperty;var ns=Object.getOwnPropertyDescriptor;var rs=Object.getOwnPropertyNames;var os=Object.prototype.hasOwnProperty;var is=(r,e)=>{for(var t in e)Ce(r,t,{get:e[t],enumerable:!0})},as=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of rs(e))!os.call(r,n)&&n!==t&&Ce(r,n,{get:()=>e[n],enumerable:!(s=ns(e,n))||s.enumerable});return r};var _s=r=>as(Ce({},"__esModule",{value:!0}),r);var En={};is(En,{SessionStore:()=>qe,TELEGRAM_WRAPUP_CLAIM_STALE_AFTER_MS:()=>ts,rollupObservationFileLists:()=>ss});module.exports=_s(En);var Es=new Set;function $(r,e,t="additive"){for(let s of Es)s({scope:r,reason:e,kind:t})}var Ve=require("bun:sqlite"),Ne=require("crypto");var h=require("path"),he=require("os"),ae=require("fs"),tt=require("url");var C=require("fs"),Je=require("crypto"),F=require("path");var ds=null;function cs(r){return(ds??process.stderr.write.bind(process.stderr))(r)}function W(r){cs(r)}var un=Promise.resolve();var us=process.platform==="win32";function Le(r){return r.replace(/^\uFEFF/,"")}function Ie(r){return JSON.parse(Le(r))}function z(r){return Ie((0,C.readFileSync)(r,"utf-8"))}function ls(r){(0,C.existsSync)(r)||(0,C.mkdirSync)(r,{recursive:!0})}function P(r,e,t={}){let s=r;try{if((0,C.lstatSync)(r).isSymbolicLink())try{s=(0,C.realpathSync)(r)}catch(c){let d=c instanceof Error?c:new Error(String(c));W(`claude-mem: realpathSync failed for ${r}, resolving symlink manually: ${d.message}
5
- `);let l=(0,C.readlinkSync)(r);s=(0,F.resolve)((0,F.dirname)(r),l)}}catch(c){let d=c.code;if(d!=="ENOENT"&&d!=="ENOTDIR")throw c}ls((0,F.dirname)(s));let n=(0,F.dirname)(s),i=(0,F.basename)(s),o=(0,F.join)(n,`.${i}.${process.pid}.${(0,Je.randomBytes)(6).toString("hex")}.tmp`),a=Buffer.from(JSON.stringify(e,null,2)+`
6
- `,"utf-8"),_=t.mode;if(_===void 0)try{_=(0,C.statSync)(s).mode&511}catch{}let E;try{E=_!==void 0?(0,C.openSync)(o,"w",_):(0,C.openSync)(o,"w");let c=0;for(;c<a.length;){let d=(0,C.writeSync)(E,a,c,a.length-c);if(d===0)throw new Error(`writeSync stalled at ${c}/${a.length} bytes`);c+=d}if((0,C.fsyncSync)(E),(0,C.closeSync)(E),E=void 0,(0,C.renameSync)(o,s),!us){let d;try{d=(0,C.openSync)(n,"r"),(0,C.fsyncSync)(d)}catch(l){let O=l instanceof Error?l:new Error(String(l));W(`claude-mem: directory fsync failed for ${n}: ${O.message}
7
- `)}finally{if(d!==void 0)try{(0,C.closeSync)(d)}catch{}}}}catch(c){if(E!==void 0)try{(0,C.closeSync)(E)}catch{}try{(0,C.unlinkSync)(o)}catch{}throw c}}var ps=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);function ze(r){let e=r.env;return ps(e)&&Object.keys(e).some(t=>t.startsWith("CLAUDE_MEM_"))?"nested":"flat"}function K(r){return ze(r)==="nested"?r.env:r}function Qe(r){return ze(r)!=="nested"?r:Object.fromEntries(Object.entries(r).filter(([e])=>!e.startsWith("CLAUDE_MEM_")))}var Ze=require("os"),et=require("path");function ie(r,e=process.platform,t=(0,Ze.homedir)()){return typeof r!="string"||r.length===0?r:r==="~"?t:r.startsWith("~/")||e==="win32"&&r.startsWith("~\\")?(0,et.join)(t,r.slice(2)):r}function ms(){return typeof __CM_DIRNAME__<"u"?__CM_DIRNAME__:(0,h.dirname)((0,tt.fileURLToPath)(__IMPORT_META_URL__))}var bn=ms();function Ts(){if(process.env.CLAUDE_MEM_DATA_DIR)return ie(process.env.CLAUDE_MEM_DATA_DIR);let r=(0,h.join)((0,he.homedir)(),".claude-mem"),e=(0,h.join)(r,"settings.json");try{if((0,ae.existsSync)(e)){let t=z(e);if(t===null||typeof t!="object"||Array.isArray(t))return r;let s=K(t);if(typeof s.CLAUDE_MEM_DATA_DIR=="string"&&s.CLAUDE_MEM_DATA_DIR)return ie(s.CLAUDE_MEM_DATA_DIR)}}catch{}return r}var M=Ts(),Ss=(0,h.join)((0,he.homedir)(),".claude"),As=process.env.CLAUDE_CONFIG_DIR||Ss,Cn=(0,h.join)(As,"plugins","marketplaces","thedotmack"),Os=(0,h.join)(M,"logs"),_e=(0,h.join)(M,"settings.json"),st="claude-mem.db";var Ee=(0,h.join)(M,st),gs=(0,h.join)(M,"observer-sessions"),Q=(0,h.basename)(gs);function de(r){(0,ae.mkdirSync)(r,{recursive:!0})}var De={dataDir:()=>M,workerPid:()=>(0,h.join)(M,"worker.pid"),serverPid:()=>(0,h.join)(M,".server-beta.pid"),serverPort:()=>(0,h.join)(M,".server-beta.port"),serverRuntime:()=>(0,h.join)(M,".server-beta.runtime.json"),settings:()=>(0,h.join)(M,"settings.json"),database:()=>(0,h.join)(M,st),chroma:()=>(0,h.join)(M,"chroma"),combinedCerts:()=>(0,h.join)(M,"combined_certs.pem"),transcriptsConfig:()=>(0,h.join)(M,"transcript-watch.json"),transcriptsState:()=>(0,h.join)(M,"transcript-watch-state.json"),corpora:()=>(0,h.join)(M,"corpora"),supervisorRegistry:()=>(0,h.join)(M,"supervisor.json"),envFile:()=>(0,h.join)(M,".env"),logsDir:()=>Os};var X=require("fs"),nt=require("path");var Ue=(i=>(i[i.DEBUG=0]="DEBUG",i[i.INFO=1]="INFO",i[i.WARN=2]="WARN",i[i.ERROR=3]="ERROR",i[i.SILENT=4]="SILENT",i))(Ue||{}),Me=null,ye=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;logFileDate=null;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){let e=new Date().toISOString().split("T")[0];if(!(this.logFileInitialized&&this.logFileDate===e)){this.logFileInitialized=!0,this.logFileDate=e;try{let t=De.logsDir();(0,X.existsSync)(t)||(0,X.mkdirSync)(t,{recursive:!0}),this.logFilePath=(0,nt.join)(t,`claude-mem-${e}.log`)}catch(t){console.error("[LOGGER] Failed to initialize log file:",t instanceof Error?t.message:String(t)),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=De.settings();if((0,X.existsSync)(e)){let s=(K(z(e)).CLAUDE_MEM_LOG_LEVEL||"INFO").toString().toUpperCase();this.level=Ue[s]??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}safeStringify(e,t,s=6){let n=new WeakSet,i=(o,a)=>{if(typeof o=="bigint")return`${o}n`;if(o===null||typeof o!="object")return o;let _=o.toJSON,E=typeof _=="function"?_.call(o):o;if(typeof E=="bigint")return`${E}n`;if(E===null||typeof E!="object")return E;if(n.has(E))return"[Circular]";if(a>=s)return Array.isArray(E)?"[Array]":"[Object]";n.add(E);try{if(Array.isArray(E))return E.map(d=>i(d,a+1));let c={};for(let d of Object.keys(E))try{c[d]=i(E[d],a+1)}catch{c[d]="[unreadable]"}return c}finally{n.delete(E)}};try{return JSON.stringify(i(e,0),null,t)??String(e)}catch{return Array.isArray(e)?`[${e.length} items]`:"[unserializable]"}}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}
4
+ "use strict";var Ce=Object.defineProperty;var rs=Object.getOwnPropertyDescriptor;var os=Object.getOwnPropertyNames;var is=Object.prototype.hasOwnProperty;var as=(r,e)=>{for(var t in e)Ce(r,t,{get:e[t],enumerable:!0})},_s=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of os(e))!is.call(r,n)&&n!==t&&Ce(r,n,{get:()=>e[n],enumerable:!(s=rs(e,n))||s.enumerable});return r};var Es=r=>_s(Ce({},"__esModule",{value:!0}),r);var dn={};as(dn,{SessionStore:()=>Je,TELEGRAM_WRAPUP_CLAIM_STALE_AFTER_MS:()=>ss,rollupObservationFileLists:()=>ns});module.exports=Es(dn);var ds=new Set;function $(r,e,t="additive"){for(let s of ds)s({scope:r,reason:e,kind:t})}var qe=require("bun:sqlite"),Ne=require("crypto");var h=require("path"),he=require("os"),ae=require("fs"),st=require("url");var C=require("fs"),ze=require("crypto"),F=require("path");var cs=null;function us(r){return(cs??process.stderr.write.bind(process.stderr))(r)}function W(r){us(r)}var ln=Promise.resolve();var ls=process.platform==="win32";function Le(r){return r.replace(/^\uFEFF/,"")}function Ie(r){return JSON.parse(Le(r))}function z(r){return Ie((0,C.readFileSync)(r,"utf-8"))}function ps(r){(0,C.existsSync)(r)||(0,C.mkdirSync)(r,{recursive:!0})}function P(r,e,t={}){let s=r;try{if((0,C.lstatSync)(r).isSymbolicLink())try{s=(0,C.realpathSync)(r)}catch(c){let d=c instanceof Error?c:new Error(String(c));W(`claude-mem: realpathSync failed for ${r}, resolving symlink manually: ${d.message}
5
+ `);let l=(0,C.readlinkSync)(r);s=(0,F.resolve)((0,F.dirname)(r),l)}}catch(c){let d=c.code;if(d!=="ENOENT"&&d!=="ENOTDIR")throw c}ps((0,F.dirname)(s));let n=(0,F.dirname)(s),i=(0,F.basename)(s),o=(0,F.join)(n,`.${i}.${process.pid}.${(0,ze.randomBytes)(6).toString("hex")}.tmp`),a=Buffer.from(JSON.stringify(e,null,2)+`
6
+ `,"utf-8"),_=t.mode;if(_===void 0)try{_=(0,C.statSync)(s).mode&511}catch{}let E;try{E=_!==void 0?(0,C.openSync)(o,"w",_):(0,C.openSync)(o,"w");let c=0;for(;c<a.length;){let d=(0,C.writeSync)(E,a,c,a.length-c);if(d===0)throw new Error(`writeSync stalled at ${c}/${a.length} bytes`);c+=d}if((0,C.fsyncSync)(E),(0,C.closeSync)(E),E=void 0,(0,C.renameSync)(o,s),!ls){let d;try{d=(0,C.openSync)(n,"r"),(0,C.fsyncSync)(d)}catch(l){let O=l instanceof Error?l:new Error(String(l));W(`claude-mem: directory fsync failed for ${n}: ${O.message}
7
+ `)}finally{if(d!==void 0)try{(0,C.closeSync)(d)}catch{}}}}catch(c){if(E!==void 0)try{(0,C.closeSync)(E)}catch{}try{(0,C.unlinkSync)(o)}catch{}throw c}}var ms=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);function Qe(r){let e=r.env;return ms(e)&&Object.keys(e).some(t=>t.startsWith("CLAUDE_MEM_"))?"nested":"flat"}function K(r){return Qe(r)==="nested"?r.env:r}function Ze(r){return Qe(r)!=="nested"?r:Object.fromEntries(Object.entries(r).filter(([e])=>!e.startsWith("CLAUDE_MEM_")))}var et=require("os"),tt=require("path");function ie(r,e=process.platform,t=(0,et.homedir)()){return typeof r!="string"||r.length===0?r:r==="~"?t:r.startsWith("~/")||e==="win32"&&r.startsWith("~\\")?(0,tt.join)(t,r.slice(2)):r}function Ts(){return typeof __CM_DIRNAME__<"u"?__CM_DIRNAME__:(0,h.dirname)((0,st.fileURLToPath)(__IMPORT_META_URL__))}var Cn=Ts();function Ss(){if(process.env.CLAUDE_MEM_DATA_DIR)return ie(process.env.CLAUDE_MEM_DATA_DIR);let r=(0,h.join)((0,he.homedir)(),".claude-mem"),e=(0,h.join)(r,"settings.json");try{if((0,ae.existsSync)(e)){let t=z(e);if(t===null||typeof t!="object"||Array.isArray(t))return r;let s=K(t);if(typeof s.CLAUDE_MEM_DATA_DIR=="string"&&s.CLAUDE_MEM_DATA_DIR)return ie(s.CLAUDE_MEM_DATA_DIR)}}catch{}return r}var M=Ss(),As=(0,h.join)((0,he.homedir)(),".claude"),Os=process.env.CLAUDE_CONFIG_DIR||As,Ln=(0,h.join)(Os,"plugins","marketplaces","thedotmack"),gs=(0,h.join)(M,"logs"),_e=(0,h.join)(M,"settings.json"),nt="claude-mem.db";var Ee=(0,h.join)(M,nt),fs=(0,h.join)(M,"observer-sessions"),Q=(0,h.basename)(fs);function de(r){(0,ae.mkdirSync)(r,{recursive:!0})}var De={dataDir:()=>M,workerPid:()=>(0,h.join)(M,"worker.pid"),serverPid:()=>(0,h.join)(M,".server-beta.pid"),serverPort:()=>(0,h.join)(M,".server-beta.port"),serverRuntime:()=>(0,h.join)(M,".server-beta.runtime.json"),settings:()=>(0,h.join)(M,"settings.json"),database:()=>(0,h.join)(M,nt),chroma:()=>(0,h.join)(M,"chroma"),combinedCerts:()=>(0,h.join)(M,"combined_certs.pem"),transcriptsConfig:()=>(0,h.join)(M,"transcript-watch.json"),transcriptsState:()=>(0,h.join)(M,"transcript-watch-state.json"),corpora:()=>(0,h.join)(M,"corpora"),supervisorRegistry:()=>(0,h.join)(M,"supervisor.json"),envFile:()=>(0,h.join)(M,".env"),logsDir:()=>gs};var X=require("fs"),rt=require("path");var Ue=(i=>(i[i.DEBUG=0]="DEBUG",i[i.INFO=1]="INFO",i[i.WARN=2]="WARN",i[i.ERROR=3]="ERROR",i[i.SILENT=4]="SILENT",i))(Ue||{}),Me=null,ye=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;logFileDate=null;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){let e=new Date().toISOString().split("T")[0];if(!(this.logFileInitialized&&this.logFileDate===e)){this.logFileInitialized=!0,this.logFileDate=e;try{let t=De.logsDir();(0,X.existsSync)(t)||(0,X.mkdirSync)(t,{recursive:!0}),this.logFilePath=(0,rt.join)(t,`claude-mem-${e}.log`)}catch(t){console.error("[LOGGER] Failed to initialize log file:",t instanceof Error?t.message:String(t)),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=De.settings();if((0,X.existsSync)(e)){let s=(K(z(e)).CLAUDE_MEM_LOG_LEVEL||"INFO").toString().toUpperCase();this.level=Ue[s]??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}safeStringify(e,t,s=6){let n=new WeakSet,i=(o,a)=>{if(typeof o=="bigint")return`${o}n`;if(o===null||typeof o!="object")return o;let _=o.toJSON,E=typeof _=="function"?_.call(o):o;if(typeof E=="bigint")return`${E}n`;if(E===null||typeof E!="object")return E;if(n.has(E))return"[Circular]";if(a>=s)return Array.isArray(E)?"[Array]":"[Object]";n.add(E);try{if(Array.isArray(E))return E.map(d=>i(d,a+1));let c={};for(let d of Object.keys(E))try{c[d]=i(E[d],a+1)}catch{c[d]="[unreadable]"}return c}finally{n.delete(E)}};try{return JSON.stringify(i(e,0),null,t)??String(e)}catch{return Array.isArray(e)?`[${e.length} items]`:"[unserializable]"}}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}
8
8
  ${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let t=Object.keys(e);return t.length===0?"{}":t.length<=3?this.safeStringify(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"),i=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),_=String(e.getMilliseconds()).padStart(3,"0");return`${t}-${s}-${n} ${i}:${o}:${a}.${_}`}log(e,t,s,n,i){if(e<this.getLevel())return;this.ensureLogFileInitialized();let o=this.formatTimestamp(new Date),a=Ue[e].padEnd(5),_=t.padEnd(6),E="";n?.correlationId?E=`[${n.correlationId}] `:n?.sessionId&&(E=`[session-${n.sessionId}] `);let c="";i!=null&&(i instanceof Error?c=this.getLevel()===0?`
9
9
  ${i.message}
10
10
  ${i.stack}`:` ${i.message}`:this.getLevel()===0&&typeof i=="object"?c=`
@@ -12,7 +12,7 @@ ${i.stack}`:` ${i.message}`:this.getLevel()===0&&typeof i=="object"?c=`
12
12
  `,"utf8")}catch(O){let L=O instanceof Error?O:new Error(String(O));W(`[LOGGER] Failed to write to log file: ${L.message}
13
13
  ${L.stack??""}
14
14
  `)}else W(l+`
15
- `)}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){Me=e}error(e,t,s,n){this.log(3,e,t,s,n),this.routeErrorToSink(t,s,n)}routeErrorToSink(e,t,s){try{if(!Me||!(s instanceof Error))return;Me(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)}},u=new ye;function w(r){let e=r.projects?.length?r.projects:r.project?[r.project]:[];return[...new Set(e.map(t=>t.trim()).filter(Boolean))]}function x(r,e,t){let s=e.map(()=>"?").join(",");return t.includeMerged?{sql:`(${r}.project COLLATE NOCASE IN (${s}) OR ${r}.merged_into_project COLLATE NOCASE IN (${s}))`,params:[...e,...e]}:{sql:`${r}.project COLLATE NOCASE IN (${s})`,params:[...e]}}function rt(r,e){let t=w({projects:e});if(t.length===0)return[];let s=t.map(()=>"?").join(","),n=[`SELECT project AS key FROM sdk_sessions WHERE project COLLATE NOCASE IN (${s})`,`SELECT project FROM observations WHERE project COLLATE NOCASE IN (${s})`,`SELECT merged_into_project FROM observations WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM session_summaries WHERE project COLLATE NOCASE IN (${s})`,`SELECT merged_into_project FROM session_summaries WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM observations WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM session_summaries WHERE merged_into_project COLLATE NOCASE IN (${s})`],i=r.prepare(n.join(" UNION ")).all(...n.flatMap(()=>t));return[...new Set([...t,...i.map(o=>o.key)])]}var ot=require("crypto");function ve(r){return typeof r=="string"&&r.trim()!==""}function it(r,e,t){return(0,ot.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function at(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}catch{return[]}}function Fe(r=new Date){return r.toISOString().slice(0,10)}function _t(r,e=new Date,t=10){let s=Fe(e);if(r.includes(s))return r;let n=[...r,s];return n.length>t?n.slice(n.length-t):n}function Et(r){let e=Fe(new Date(r));return{dates:JSON.stringify([e]),lastReinforced:e}}function ce(r,e,t=new Date){let s=r.prepare("SELECT reinforcement_dates FROM observations WHERE id = ?").get(e);if(!s)return!1;let n=at(s.reinforcement_dates),i=_t(n,t);return i===n?!1:(r.prepare("UPDATE observations SET reinforcement_dates = ?, last_reinforced = ? WHERE id = ?").run(JSON.stringify(i),i[i.length-1],e),!0)}var ut=require("crypto");var p="claude";function fs(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function b(r){if(!r)return p;let e=fs(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e.includes("kimi")?"kimi":e==="pi-mono"?"pi":e==="agy"||e==="antigravity"||e.startsWith("antigravity-")?"antigravity-cli":e:p}function dt(r){let e=["claude","codex","antigravity-cli","cursor","kimi"];return[...r].sort((t,s)=>{let n=e.indexOf(t),i=e.indexOf(s);return n!==-1||i!==-1?n===-1?1:i===-1?-1:n-i:t.localeCompare(s)})}var Rs=64*1024,Ns=new Set(["search","timeline","get_observations","get_tool_uses","session_start_context","observation_search"]);function bs(r){if(!r)return!1;if(r.startsWith("memory_"))return!0;if(!r.startsWith("mcp__"))return!1;let e=r.split("__");if(e.length<3)return!1;let t=e[1].toLowerCase(),s=e.slice(2).join("__");return(t.includes("claude-mem")||t.includes("claude_mem")||t.includes("mcp-search")||t.includes("cmem"))&&Ns.has(s)}function ct(r,e=Rs){let t=Buffer.byteLength(r,"utf8");if(t<=e)return r;let s=Buffer.from(r,"utf8"),n=e;for(;n>0&&(s[n]&192)===128;)n--;return`${s.subarray(0,n).toString("utf8")}\u2026[truncated: ${t} bytes]`}function Cs(r,e,t){return(0,ut.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function lt(r){r.run(`
15
+ `)}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){Me=e}error(e,t,s,n){this.log(3,e,t,s,n),this.routeErrorToSink(t,s,n)}routeErrorToSink(e,t,s){try{if(!Me||!(s instanceof Error))return;Me(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)}},u=new ye;function w(r){let e=r.projects?.length?r.projects:r.project?[r.project]:[];return[...new Set(e.map(t=>t.trim()).filter(Boolean))]}function x(r,e,t){let s=e.map(()=>"?").join(",");return t.includeMerged?{sql:`(${r}.project COLLATE NOCASE IN (${s}) OR ${r}.merged_into_project COLLATE NOCASE IN (${s}))`,params:[...e,...e]}:{sql:`${r}.project COLLATE NOCASE IN (${s})`,params:[...e]}}function ot(r,e){let t=w({projects:e});if(t.length===0)return[];let s=t.map(()=>"?").join(","),n=[`SELECT project AS key FROM sdk_sessions WHERE project COLLATE NOCASE IN (${s})`,`SELECT project FROM observations WHERE project COLLATE NOCASE IN (${s})`,`SELECT merged_into_project FROM observations WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM session_summaries WHERE project COLLATE NOCASE IN (${s})`,`SELECT merged_into_project FROM session_summaries WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM observations WHERE merged_into_project COLLATE NOCASE IN (${s})`,`SELECT project FROM session_summaries WHERE merged_into_project COLLATE NOCASE IN (${s})`],i=r.prepare(n.join(" UNION ")).all(...n.flatMap(()=>t));return[...new Set([...t,...i.map(o=>o.key)])]}var it=require("crypto");function ve(r){return typeof r=="string"&&r.trim()!==""}function at(r,e,t){return(0,it.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function _t(r){if(!r)return[];try{let e=JSON.parse(r);return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}catch{return[]}}function Fe(r=new Date){return r.toISOString().slice(0,10)}function Et(r,e=new Date,t=10){let s=Fe(e);if(r.includes(s))return r;let n=[...r,s];return n.length>t?n.slice(n.length-t):n}function dt(r){let e=Fe(new Date(r));return{dates:JSON.stringify([e]),lastReinforced:e}}function ce(r,e,t=new Date){let s=r.prepare("SELECT reinforcement_dates FROM observations WHERE id = ?").get(e);if(!s)return!1;let n=_t(s.reinforcement_dates),i=Et(n,t);return i===n?!1:(r.prepare("UPDATE observations SET reinforcement_dates = ?, last_reinforced = ? WHERE id = ?").run(JSON.stringify(i),i[i.length-1],e),!0)}var lt=require("crypto");var p="claude";function Rs(r){return r.trim().toLowerCase().replace(/\s+/g,"-")}function b(r){if(!r)return p;let e=Rs(r);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e.includes("kimi")?"kimi":e==="pi-mono"?"pi":e==="agy"||e==="antigravity"||e.startsWith("antigravity-")?"antigravity-cli":e:p}function ct(r){let e=["claude","codex","antigravity-cli","cursor","kimi"];return[...r].sort((t,s)=>{let n=e.indexOf(t),i=e.indexOf(s);return n!==-1||i!==-1?n===-1?1:i===-1?-1:n-i:t.localeCompare(s)})}var Ns=new Set(["mem_search","search","timeline","get_observations","get_summaries","get_tool_uses","session_start_context","observation_search","observation_context","memory_search","memory_context"]);function bs(r){if(!r.startsWith("mcp__"))return null;let e=r.split("__");if(e.length<3)return null;let t=e[1].toLowerCase();return!t.includes("claude-mem")&&!t.includes("claude_mem")&&!t.includes("mcp-search")&&!t.includes("mcp_search")&&!t.includes("cmem")?null:e.slice(2).join("__")}function we(r){if(!r)return!1;if(r.startsWith("memory_")||r==="mem_search"||r==="get_summaries")return!0;let e=bs(r);return e!==null&&Ns.has(e)}var Cs=64*1024;function ut(r,e=Cs){let t=Buffer.byteLength(r,"utf8");if(t<=e)return r;let s=Buffer.from(r,"utf8"),n=e;for(;n>0&&(s[n]&192)===128;)n--;return`${s.subarray(0,n).toString("utf8")}\u2026[truncated: ${t} bytes]`}function Ls(r,e,t){return(0,lt.createHash)("sha256").update([r||"",e||"",t||""].join("\0")).digest("hex").slice(0,16)}function pt(r){r.run(`
16
16
  CREATE TABLE IF NOT EXISTS tool_uses (
17
17
  id INTEGER PRIMARY KEY AUTOINCREMENT,
18
18
  tool_use_id TEXT NOT NULL,
@@ -36,7 +36,7 @@ ${L.stack??""}
36
36
  created_at_epoch INTEGER NOT NULL,
37
37
  UNIQUE(content_session_id, tool_use_id)
38
38
  )
39
- `),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_project ON tool_uses(project)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_project_nocase_created ON tool_uses(project COLLATE NOCASE, created_at_epoch DESC, id DESC)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_memory_session ON tool_uses(memory_session_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_content_session ON tool_uses(content_session_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_session_db_id ON tool_uses(session_db_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_tool_name ON tool_uses(tool_name)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_created_at_epoch ON tool_uses(created_at_epoch)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_observation_id ON tool_uses(observation_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_or_generation_id ON tool_uses(or_generation_id)")}function pt(r,e){if(!e.toolUseId||!e.contentSessionId||!e.toolName||bs(e.toolName))return null;let t=e.createdAtEpoch??Date.now(),s=new Date(t).toISOString(),n=Cs(e.toolName,e.toolInput,e.toolResponse),i=e.toolInput!=null?ct(e.toolInput):null,o=e.toolResponse!=null?ct(e.toolResponse):null,a=r.prepare(`
39
+ `),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_project ON tool_uses(project)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_project_nocase_created ON tool_uses(project COLLATE NOCASE, created_at_epoch DESC, id DESC)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_memory_session ON tool_uses(memory_session_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_content_session ON tool_uses(content_session_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_session_db_id ON tool_uses(session_db_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_tool_name ON tool_uses(tool_name)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_created_at_epoch ON tool_uses(created_at_epoch)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_observation_id ON tool_uses(observation_id)"),r.run("CREATE INDEX IF NOT EXISTS idx_tool_uses_or_generation_id ON tool_uses(or_generation_id)")}function mt(r,e){if(!e.toolUseId||!e.contentSessionId||!e.toolName||we(e.toolName))return null;let t=e.createdAtEpoch??Date.now(),s=new Date(t).toISOString(),n=Ls(e.toolName,e.toolInput,e.toolResponse),i=e.toolInput!=null?ut(e.toolInput):null,o=e.toolResponse!=null?ut(e.toolResponse):null,a=r.prepare(`
40
40
  INSERT INTO tool_uses (
41
41
  tool_use_id, content_session_id, memory_session_id, session_db_id, project,
42
42
  platform_source, tool_name, tool_input, tool_response, cwd, prompt_number,
@@ -61,7 +61,7 @@ ${L.stack??""}
61
61
  or_session_id = COALESCE(excluded.or_session_id, tool_uses.or_session_id),
62
62
  content_hash = excluded.content_hash
63
63
  RETURNING id
64
- `).get(e.toolUseId,e.contentSessionId,e.memorySessionId??null,e.sessionDbId??null,e.project??"",b(e.platformSource),e.toolName,i,o,e.cwd??null,e.promptNumber??null,e.agentType??null,e.agentId??null,e.orGenerationId??null,e.orSessionId??null,n,s,t);return a?a.id:null}function mt(r,e){let t=e.toolUseIds.filter(i=>typeof i=="string"&&i.length>0);if(t.length===0)return 0;let s=t.map(()=>"?").join(","),n=r.prepare(`
64
+ `).get(e.toolUseId,e.contentSessionId,e.memorySessionId??null,e.sessionDbId??null,e.project??"",b(e.platformSource),e.toolName,i,o,e.cwd??null,e.promptNumber??null,e.agentType??null,e.agentId??null,e.orGenerationId??null,e.orSessionId??null,n,s,t);return a?a.id:null}function Tt(r,e){let t=e.toolUseIds.filter(i=>typeof i=="string"&&i.length>0);if(t.length===0)return 0;let s=t.map(()=>"?").join(","),n=r.prepare(`
65
65
  UPDATE tool_uses
66
66
  SET observation_id = COALESCE(observation_id, ?),
67
67
  memory_session_id = CASE WHEN observation_id IS NULL
@@ -71,23 +71,23 @@ ${L.stack??""}
71
71
  WHERE content_session_id = ?
72
72
  AND tool_use_id IN (${s})
73
73
  AND (observation_id IS NULL OR observation_id = ?)
74
- `).run(e.observationId,e.memorySessionId??null,e.memorySessionId??null,e.contentSessionId,...t,e.observationId);return Number(n.changes??0)}function Tt(r){return r?{clause:`COALESCE(NULLIF(platform_source, ''), '${p}') = ?`,param:b(r)}:null}function St(r,e,t={}){let s=[],n=[];for(let c of e){if(typeof c=="number"&&Number.isInteger(c)){s.push(c);continue}if(typeof c=="string"&&c.trim().length>0){let d=Number(c);Number.isInteger(d)&&String(d)===c.trim()&&s.push(d),n.push(c.trim())}}if(s.length===0&&n.length===0)return[];let i=[],o=[];s.length>0&&(i.push(`id IN (${s.map(()=>"?").join(",")})`),o.push(...s)),n.length>0&&(i.push(`tool_use_id IN (${n.map(()=>"?").join(",")})`),o.push(...n));let a=[`(${i.join(" OR ")})`];t.project&&(a.push("project COLLATE NOCASE = ?"),o.push(t.project)),t.contentSessionId&&(a.push("content_session_id = ?"),o.push(t.contentSessionId));let _=Tt(t.platformSource);_&&(a.push(_.clause),o.push(_.param));let E=t.limit&&t.limit>0?`LIMIT ${Math.floor(t.limit)}`:"";return r.prepare(`
74
+ `).run(e.observationId,e.memorySessionId??null,e.memorySessionId??null,e.contentSessionId,...t,e.observationId);return Number(n.changes??0)}function St(r){return r?{clause:`COALESCE(NULLIF(platform_source, ''), '${p}') = ?`,param:b(r)}:null}function At(r,e,t={}){let s=[],n=[];for(let c of e){if(typeof c=="number"&&Number.isInteger(c)){s.push(c);continue}if(typeof c=="string"&&c.trim().length>0){let d=Number(c);Number.isInteger(d)&&String(d)===c.trim()&&s.push(d),n.push(c.trim())}}if(s.length===0&&n.length===0)return[];let i=[],o=[];s.length>0&&(i.push(`id IN (${s.map(()=>"?").join(",")})`),o.push(...s)),n.length>0&&(i.push(`tool_use_id IN (${n.map(()=>"?").join(",")})`),o.push(...n));let a=[`(${i.join(" OR ")})`];t.project&&(a.push("project COLLATE NOCASE = ?"),o.push(t.project)),t.contentSessionId&&(a.push("content_session_id = ?"),o.push(t.contentSessionId));let _=St(t.platformSource);_&&(a.push(_.clause),o.push(_.param));let E=t.limit&&t.limit>0?`LIMIT ${Math.floor(t.limit)}`:"";return r.prepare(`
75
75
  SELECT * FROM tool_uses
76
76
  WHERE ${a.join(" AND ")}
77
77
  ORDER BY created_at_epoch DESC
78
78
  ${E}
79
- `).all(...o)}function At(r,e={}){let t=[],s=[];if(e.project&&(t.push("project COLLATE NOCASE = ?"),s.push(e.project)),e.contentSessionId&&(t.push("content_session_id = ?"),s.push(e.contentSessionId)),e.memorySessionId&&(t.push("memory_session_id = ?"),s.push(e.memorySessionId)),typeof e.sessionDbId=="number"&&(t.push("session_db_id = ?"),s.push(e.sessionDbId)),e.toolName){let E=Array.isArray(e.toolName)?e.toolName:[e.toolName];E.length>0&&(t.push(`tool_name IN (${E.map(()=>"?").join(",")})`),s.push(...E))}e.agentId&&(t.push("agent_id = ?"),s.push(e.agentId));let n=Tt(e.platformSource);n&&(t.push(n.clause),s.push(n.param)),typeof e.dateStart=="number"&&(t.push("created_at_epoch >= ?"),s.push(e.dateStart)),typeof e.dateEnd=="number"&&(t.push("created_at_epoch <= ?"),s.push(e.dateEnd));let i=t.length>0?`WHERE ${t.join(" AND ")}`:"",o=e.orderBy==="date_asc"?"ASC":"DESC",a=Math.min(Math.max(Math.floor(e.limit??50),1),500),_=Math.max(Math.floor(e.offset??0),0);return r.prepare(`
79
+ `).all(...o)}function Ot(r,e={}){let t=[],s=[];if(e.project&&(t.push("project COLLATE NOCASE = ?"),s.push(e.project)),e.contentSessionId&&(t.push("content_session_id = ?"),s.push(e.contentSessionId)),e.memorySessionId&&(t.push("memory_session_id = ?"),s.push(e.memorySessionId)),typeof e.sessionDbId=="number"&&(t.push("session_db_id = ?"),s.push(e.sessionDbId)),e.toolName){let E=Array.isArray(e.toolName)?e.toolName:[e.toolName];E.length>0&&(t.push(`tool_name IN (${E.map(()=>"?").join(",")})`),s.push(...E))}e.agentId&&(t.push("agent_id = ?"),s.push(e.agentId));let n=St(e.platformSource);n&&(t.push(n.clause),s.push(n.param)),typeof e.dateStart=="number"&&(t.push("created_at_epoch >= ?"),s.push(e.dateStart)),typeof e.dateEnd=="number"&&(t.push("created_at_epoch <= ?"),s.push(e.dateEnd));let i=t.length>0?`WHERE ${t.join(" AND ")}`:"",o=e.orderBy==="date_asc"?"ASC":"DESC",a=Math.min(Math.max(Math.floor(e.limit??50),1),500),_=Math.max(Math.floor(e.offset??0),0);return r.prepare(`
80
80
  SELECT * FROM tool_uses
81
81
  ${i}
82
82
  ORDER BY created_at_epoch ${o}, id ${o}
83
83
  LIMIT ${a} OFFSET ${_}
84
- `).all(...s)}function Ot(r,e={}){let t=[],s=[];e.project&&(t.push("project COLLATE NOCASE = ?"),s.push(e.project)),e.contentSessionId&&(t.push("content_session_id = ?"),s.push(e.contentSessionId)),e.agentId&&(t.push("agent_id = ?"),s.push(e.agentId)),typeof e.dateStart=="number"&&(t.push("created_at_epoch >= ?"),s.push(e.dateStart)),typeof e.dateEnd=="number"&&(t.push("created_at_epoch <= ?"),s.push(e.dateEnd));let n=t.length>0?`WHERE ${t.join(" AND ")}`:"";return r.prepare(`
84
+ `).all(...s)}function gt(r,e={}){let t=[],s=[];e.project&&(t.push("project COLLATE NOCASE = ?"),s.push(e.project)),e.contentSessionId&&(t.push("content_session_id = ?"),s.push(e.contentSessionId)),e.agentId&&(t.push("agent_id = ?"),s.push(e.agentId)),typeof e.dateStart=="number"&&(t.push("created_at_epoch >= ?"),s.push(e.dateStart)),typeof e.dateEnd=="number"&&(t.push("created_at_epoch <= ?"),s.push(e.dateEnd));let n=t.length>0?`WHERE ${t.join(" AND ")}`:"";return r.prepare(`
85
85
  SELECT tool_name, COUNT(DISTINCT tool_use_id) AS uses
86
86
  FROM tool_uses
87
87
  ${n}
88
88
  GROUP BY tool_name
89
89
  ORDER BY uses DESC, tool_name ASC
90
- `).all(...s)}function gt(r){r.run(`
90
+ `).all(...s)}function ft(r){r.run(`
91
91
  CREATE TABLE IF NOT EXISTS work_state_entries (
92
92
  id INTEGER PRIMARY KEY AUTOINCREMENT,
93
93
  project TEXT NOT NULL,
@@ -96,15 +96,15 @@ ${L.stack??""}
96
96
  created_at TEXT NOT NULL,
97
97
  created_at_epoch INTEGER NOT NULL
98
98
  )
99
- `),r.run("CREATE INDEX IF NOT EXISTS idx_work_state_entries_project ON work_state_entries(project COLLATE NOCASE, list_name, id)")}function ft(r,e){let t=e.createdAtEpoch??Date.now(),s=r.prepare(`
99
+ `),r.run("CREATE INDEX IF NOT EXISTS idx_work_state_entries_project ON work_state_entries(project COLLATE NOCASE, list_name, id)")}function Rt(r,e){let t=e.createdAtEpoch??Date.now(),s=r.prepare(`
100
100
  INSERT INTO work_state_entries (project, list_name, fields, created_at, created_at_epoch)
101
101
  VALUES (?, ?, ?, ?, ?)
102
- `).run(e.project,e.listName,JSON.stringify(e.fields),new Date(t).toISOString(),t),n=Number(s.lastInsertRowid);return u.debug("DB","Work state entry appended",{id:n,project:e.project,listName:e.listName}),n}function Rt(r,e,t){if(e.length===0)return[];let s=e.map(()=>"?").join(", "),n=t===void 0?"":" AND list_name = ?";return r.prepare(`
102
+ `).run(e.project,e.listName,JSON.stringify(e.fields),new Date(t).toISOString(),t),n=Number(s.lastInsertRowid);return u.debug("DB","Work state entry appended",{id:n,project:e.project,listName:e.listName}),n}function Nt(r,e,t){if(e.length===0)return[];let s=e.map(()=>"?").join(", "),n=t===void 0?"":" AND list_name = ?";return r.prepare(`
103
103
  SELECT id, project, list_name, fields, created_at_epoch
104
104
  FROM work_state_entries
105
105
  WHERE project COLLATE NOCASE IN (${s})${n}
106
106
  ORDER BY id
107
- `).all(...e,...t===void 0?[]:[t]).map(o=>({...o,fields:JSON.parse(o.fields)}))}var G=require("fs"),k=require("path"),Z=require("os");var ue={HEALTH_CHECK:3e3,API_REQUEST:3e4,SESSION_INIT_HOOK_CAP:15e3,SESSION_INIT_REQUEST:1e4,SESSION_INIT_REQUEST_MAX:14e3,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function Ls(r=process.platform){return r==="win32"?8e3:5e3}function Nt(r=process.platform){return ue.SESSION_INIT_HOOK_CAP-Ls(r)}function bt(r){return process.platform==="win32"?Math.round(r*ue.WINDOWS_MULTIPLIER):r}function Ct(r){try{return new URL(r).hostname.toLowerCase()==="openrouter.ai"}catch{return!1}}var Is="security_alert",hs="sync-hub.black-pond-afbb.workers.dev",Ds="ziczmqtpmaxbornfghye.supabase.co",Ms="https://sync.cmem.ai",Us=new Set(["xiaomi/mimo-v2-flash:free"]);function ys(r){let e=r.CLAUDE_MEM_OPENROUTER_MODEL;if(typeof e!="string"||!Us.has(e.trim()))return!1;let t=typeof r.CLAUDE_MEM_OPENROUTER_BASE_URL=="string"?r.CLAUDE_MEM_OPENROUTER_BASE_URL.trim():"";return t===""||Ct(t)}var Lt=18e4,It=[{key:"CLAUDE_MEM_LLM_TIMEOUT_MS",legacy:"30000",markerTag:"llm-timeout-migrated-v1"},{key:"CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS",legacy:"30000",markerTag:"field-optimize-timeout-migrated-v1"}];function Dt(r,e){return(0,k.join)((0,k.dirname)(r),`.${(0,k.basename)(r)}.${e.markerTag}`)}function we(r,e){try{(0,G.writeFileSync)(Dt(r,e),new Date().toISOString(),{encoding:"utf-8",mode:384})}catch{}}var ht=new Set;function vs(r){if(typeof r!="string")return null;let e=r.trim();if(e.length===0)return null;try{let t=new URL(e).hostname;if(t===hs||t===Ds)return Ms}catch{return null}return null}var Y=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_SESSION_START_INCLUDE_ALL_SOURCES:"false",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_ALLOWED_ORIGINS:"",CLAUDE_MEM_PUBLIC_URL:"",CLAUDE_MEM_API_TIMEOUT_MS:String(bt(ue.API_REQUEST)),CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS:String(Nt()),CLAUDE_MEM_IDLE_EXIT_SEC:"0",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_SKIP_BASH_PATTERNS:"",CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS:"false",CLAUDE_MEM_SKIP_AGENT_TYPES:"",CLAUDE_MEM_CAPTURE_ADVISOR_CALLS:"false",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CODEX_MODEL:"",CLAUDE_MEM_CODEX_PATH:"codex",CLAUDE_MEM_CODEX_REASONING_EFFORT:"low",CLAUDE_MEM_CODEX_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_SIZE:"8",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_MAX_CHARS:"32000",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_API_KEYS:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_API_KEYS:"",CLAUDE_MEM_OPENROUTER_MODEL:"cohere/north-mini-code:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_EXTRA_BODY:"",CLAUDE_MEM_OPENROUTER_REASONING_EFFORT:"",CLAUDE_MEM_OPENAI_COMPAT_PRESET:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEY:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEYS:"",CLAUDE_MEM_OPENAI_COMPAT_BASE_URL:"",CLAUDE_MEM_OPENAI_COMPAT_MODEL:"",CLAUDE_MEM_QUOTA_FALLBACK_PROVIDER:"",CLAUDE_MEM_QUOTA_FALLBACK_MODEL:"",CLAUDE_MEM_QUOTA_THRESHOLD_FIVE_HOUR:"0.95",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_OPUS:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_SONNET:"0.92",CLAUDE_MEM_QUOTA_THRESHOLD_OVERAGE:"0.95",CLAUDE_MEM_DATA_DIR:(0,k.join)((0,Z.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_CLAUDE_CONFIG_DIR:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:"",CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:"",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY:"true",CLAUDE_MEM_REINFORCE_ALPHA:"0",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_FILE_READ_GATE_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,k.join)((0,Z.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_CODEX_SUBAGENT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_OBSERVER_CONTEXT_WINDOW:"",CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS:"4096",CLAUDE_MEM_OBSERVE_BARE_PROMPTS:"false",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_REDACT_ENABLED:"false",CLAUDE_MEM_REDACT_DISABLED_BUILTINS:"",CLAUDE_MEM_REDACT_CUSTOM_PATTERNS:"[]",CLAUDE_MEM_REDACT_LOG_MATCHES:"false",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_PROJECT_ENVIRONMENTS:"[]",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database",CLAUDE_MEM_CHROMA_PREWARM_TIMEOUT_MS:"120000",CLAUDE_MEM_CHROMA_MUTATION_TIMEOUT_MS:"600000",CLAUDE_MEM_CHROMA_MAX_PENDING_MUTATIONS:"5000",CLAUDE_MEM_CHROMA_EMBEDDING_FUNCTION:"default",CLAUDE_MEM_CLOUD_SYNC_TOKEN:"",CLAUDE_MEM_CLOUD_SYNC_USER_ID:"",CLAUDE_MEM_CLOUD_SYNC_HUB_URL:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME:(0,Z.hostname)(),CLAUDE_MEM_CLOUD_SYNC_WS:"true",CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE:"40",CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS:"90000",CLAUDE_MEM_LLM_TIMEOUT_MS:String(Lt),CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS:String(Lt),CLAUDE_MEM_TV_TOKEN:"",CLAUDE_MEM_PRO_TRIAL_EMAIL:"",CLAUDE_MEM_PRO_TRIAL_AT:"",CLAUDE_MEM_PRO_TRIAL_STATE:"",CLAUDE_MEM_PRO_TRIAL_ENDS_AT:"",CLAUDE_MEM_PRO_PLAN:"",CLAUDE_MEM_PRO_FALLBACK_AT:"",CLAUDE_MEM_PRO_FALLBACK_MESSAGE:"",CLAUDE_MEM_PRO_FALLBACK_ACTION:"",CLAUDE_MEM_PRO_FALLBACK_URL:"",CLAUDE_MEM_PRO_MEMORY_KEY:"",CLAUDE_MEM_PRO_MEMORY_BASE_URL:"",CLAUDE_MEM_PRO_MEMORY_MODEL:"",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_WRAPUPS_ENABLED:"true",CLAUDE_MEM_TELEGRAM_OBSERVATION_ALERTS_ENABLED:"false",CLAUDE_MEM_TELEGRAM_WRAPUP_ROUTES:"{}",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert,sensitive",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_AWARENESS_ENABLED:"true",CLAUDE_MEM_GROK_BOT_AWARENESS_AGENT_IDS:"521e962d-2ec3-4488-bfbc-54d5209ce118,95601360-61f7-4fd9-bb3a-2c976b2b85c0",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_WEBHOOK_URL:"",CLAUDE_MEM_GROK_BOT_WEBHOOK_SECRET:"",CLAUDE_MEM_GROK_BOT_INJECT_ENABLED:"true",CLAUDE_MEM_GROK_BOT_INJECT_AGENT_IDS:"*",CLAUDE_MEM_GROK_BOT_INJECT_TIER:"episode",CLAUDE_MEM_GROK_BOT_INJECT_WINDOW:"80",CLAUDE_MEM_GROK_BOT_INJECT_FALLBACK:"house",CLAUDE_MEM_GROK_BOT_INJECT_PLATFORM_SOURCE:"",CLAUDE_MEM_GROK_BOT_INJECT_PROJECTS_BY_AGENT:"",CLAUDE_MEM_GROK_BOT_INJECT_MAX_LINE_CHARS:"160",CLAUDE_MEM_GROK_BOT_INJECT_DEBOUNCE_MS:"1500",CLAUDE_MEM_GROK_BOT_INJECT_STANDING_LINE:"",CLAUDE_MEM_CCS_ALIGN_ENABLED:"true",CLAUDE_MEM_CCS_ALIGN_VIEWER_IDS:"ccs-align",CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS:"false",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:"",CLAUDE_MEM_DEDUP_ENABLED:"false",CLAUDE_MEM_DEDUP_COSINE_THRESHOLD:"0.80",CLAUDE_MEM_DEDUP_IDF_VETO_DF:"10",CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS:"2",CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS:"10",CLAUDE_MEM_DEDUP_MAX_SCAN:"2000",CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS:"50000",CLAUDE_MEM_WORKER_AUTOSTART:"true",CLAUDE_MEM_PROJECT_NAME_SOURCE:"path"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){let t=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(t):t}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,t){let s=t?this.applyEnvOverrides(e):e;return s.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(s.CLAUDE_MEM_WORKER_HOST),s}static getInt(e){let t=this.get(e);return parseInt(t,10)}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e,t=!0){try{if(!(0,G.existsSync)(e)){let d=this.getAllDefaults();try{P(e,d,{mode:384});for(let l of It)we(e,l);console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(l){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,l instanceof Error?l.message:String(l))}return this.finalizeSettings(d,t)}let s=(0,G.readFileSync)(e,"utf-8"),n=Ie(s),i=K(n),o=i!==n,a=Qe(n),_=o&&Object.keys(a).some(d=>d!=="env");if(o&&!_)try{P(e,i,{mode:384}),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(d){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,d instanceof Error?d.message:String(d))}if(i.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===Is){i={...i,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,d instanceof Error?d.message:String(d))}}if(ys(i)){let d=String(i.CLAUDE_MEM_OPENROUTER_MODEL).trim();i={...i,CLAUDE_MEM_OPENROUTER_MODEL:this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn(`[SETTINGS] Migrated OpenRouter model off the retired default ${d} to ${this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL}:`,e)}catch(l){console.warn("[SETTINGS] Failed to migrate the retired OpenRouter model:",e,l instanceof Error?l.message:String(l))}}let E=vs(i.CLAUDE_MEM_CLOUD_SYNC_HUB_URL);if(E!==null){i={...i,CLAUDE_MEM_CLOUD_SYNC_HUB_URL:E};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn("[SETTINGS] Migrated cloud sync hub URL to",E,"from a retired hub host:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate cloud sync hub URL:",e,d instanceof Error?d.message:String(d))}}for(let d of It)if(!(0,G.existsSync)(Dt(e,d))){if(i[d.key]!==d.legacy){we(e,d);continue}i={...i,[d.key]:this.DEFAULTS[d.key]};try{P(e,_?{...a,env:i}:i,{mode:384}),we(e,d),console.warn(`[SETTINGS] Migrated ${d.key} off the old ${d.legacy}ms default to ${this.DEFAULTS[d.key]}ms:`,e)}catch(l){let O=`${d.key}\0${e}`;ht.has(O)||(ht.add(O),console.warn(`[SETTINGS] Failed to migrate ${d.key}; using the new default in memory (reported once per process):`,e,l instanceof Error?l.message:String(l)))}}let c={...this.DEFAULTS};for(let d of Object.keys(this.DEFAULTS))i[d]!==void 0&&(c[d]=i[d]);return this.finalizeSettings(c,t)}catch(s){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,s instanceof Error?s.message:String(s));let n=this.getAllDefaults();return this.finalizeSettings(n,t)}}};var Ft=require("crypto");function ee(r){return(r??"").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}function H(r){return(r??"").toLowerCase().trim().split(/\s+/).filter(Boolean)}function le(r,e){return Math.log(1+e/(r+.5))}function Mt(r,e){return t=>le(r(t),e)}function Ut(r,e){let t=new Map;for(let s of new Set(r))t.set(s,e(s));return t}function yt(r,e,t){let s=Ut(r,t),n=Ut(e,t),i=0,o=0,a=0;for(let[_,E]of s){o+=E*E;let c=n.get(_);c!==void 0&&(i+=E*c)}for(let[,_]of n)a+=_*_;return o===0||a===0?0:i/Math.sqrt(o*a)}function vt(r,e,t,s){let n=new Set(r),i=new Set(e);for(let o of n)if(!i.has(o)&&t(o)>s)return!0;for(let o of i)if(!n.has(o)&&t(o)>s)return!0;return!1}function Pe(r,e,t,s){let n=ee(r);if(n!==""&&n===ee(e))return{tier:"exact",method:"exact",score:1};let i=H(r),o=H(e),a=s.minSharedTokens??2,_=new Set(o),E=0;for(let d of new Set(i))_.has(d)&&E++;if(E<a)return{tier:"none",method:"none",score:0};let c=yt(i,o,t);return c>=s.cosineThreshold&&!vt(i,o,t,s.vetoThetaIdf)?{tier:"candidate",method:"idf_cosine",score:c}:{tier:"none",method:"none",score:c}}function pe(r,e){return!!r&&!!e}function xe(r,e,t,s=!1){let n=ee(t);if(n==="")return null;let i=b(e),o=s?"subagent":"main";return(0,Ft.createHash)("sha256").update(`${r}\0${i}\0${o}\0${n}`).digest("hex").slice(0,32)}function wt(r,e,t){return t===null?null:r.prepare("SELECT id, occurrence_count, created_at_epoch FROM observations WHERE project = ? AND title_norm_key = ? ORDER BY created_at_epoch ASC, id ASC LIMIT 1").get(e,t)??null}function Pt(r,e,t){let s=[...new Set(H(t))],n=r.prepare("INSERT INTO token_df (project, token, df) VALUES (?, ?, 1) ON CONFLICT(project, token) DO UPDATE SET df = df + 1");for(let i of s)n.run(e,i);r.prepare("INSERT INTO dedup_meta (project, doc_count) VALUES (?, 1) ON CONFLICT(project) DO UPDATE SET doc_count = doc_count + 1").run(e)}function xt(r,e){return r.prepare("SELECT doc_count FROM dedup_meta WHERE project = ?").get(e)?.doc_count??0}function kt(r,e){let t=xt(r,e),s=r.prepare("SELECT token, df FROM token_df WHERE project = ?").all(e),n=new Map(s.map(i=>[i.token,i.df]));return{idfFn:Mt(i=>n.get(i)??0,t),docCount:t}}function Bt(r){return r.prepare("INSERT OR IGNORE INTO observation_dedup_candidates (observation_id, duplicate_of_id, project, method, score, status, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")}function Xt(r,e,t){return xt(r,e)>=t}function Fs(r,e,t=Number.POSITIVE_INFINITY){let s=r.prepare("SELECT COUNT(*) c FROM observations WHERE project = ?").get(e).c;if(s>t)return u.warn("DEDUP",`Skipping dedup backfill for project ${e}: ${s} rows exceeds cap ${t} (CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS)`),0;let n=r.prepare("SELECT o.id, o.title, o.agent_id, o.agent_type, s.platform_source FROM observations o LEFT JOIN sdk_sessions s ON s.memory_session_id = o.memory_session_id WHERE o.project = ?").all(e),i=r.prepare("UPDATE observations SET title_norm_key = ? WHERE id = ?"),o=r.prepare("INSERT INTO token_df (project, token, df) VALUES (?, ?, ?)");return r.transaction(()=>{let _=new Map;for(let E of n){i.run(xe(e,E.platform_source,E.title,pe(E.agent_id,E.agent_type)),E.id);for(let c of new Set(H(E.title)))_.set(c,(_.get(c)??0)+1)}r.prepare("DELETE FROM token_df WHERE project = ?").run(e);for(let[E,c]of _)o.run(e,E,c);r.prepare("INSERT INTO dedup_meta (project, doc_count, last_rebuild_doc_count, deleted_since_rebuild) VALUES (?, ?, ?, 0) ON CONFLICT(project) DO UPDATE SET doc_count = excluded.doc_count, last_rebuild_doc_count = excluded.last_rebuild_doc_count, deleted_since_rebuild = 0").run(e,n.length,n.length)})(),n.length}function ws(r,e,t){let s=r.prepare("SELECT id, title FROM observations WHERE project = ? AND title IS NOT NULL ORDER BY id ASC").all(e);if(s.length<2)return 0;if(s.length>t.maxBackfillRows)return u.warn("DEDUP",`Skipping dedup sweep for project ${e}: ${s.length} rows exceeds cap ${t.maxBackfillRows}`),0;let{idfFn:n,docCount:i}=kt(r,e),o={cosineThreshold:t.cosineThreshold,vetoThetaIdf:le(t.idfVetoDf,i),minSharedTokens:t.minSharedTokens},a=s.map(f=>new Set(H(f.title))),_=new Map;for(let f of a)for(let g of f)_.set(g,(_.get(g)??0)+1);let E=Math.max(2,Math.ceil(Math.sqrt(s.length))*4),c=new Map;a.forEach((f,g)=>{for(let m of f){let N=_.get(m);if(N<2||N>E)continue;let A=c.get(m);A||(A=[],c.set(m,A)),A.push(g)}});let d=new Map;for(let f of c.values())for(let g=0;g<f.length;g++)for(let m=g+1;m<f.length;m++){let N=`${f[g]}:${f[m]}`;d.set(N,(d.get(N)??0)+1)}let l=Bt(r),O=new Date().toISOString(),L=Date.now(),I=0;for(let[f,g]of d){if(g<t.minSharedTokens)continue;let[m,N]=f.split(":").map(Number),A=Pe(s[m].title,s[N].title,n,o);A.tier==="candidate"&&(I+=l.run(s[N].id,s[m].id,e,A.method,A.score,"pending",O,L).changes)}return I}function Gt(r,e){return r.prepare("SELECT DISTINCT project FROM observations").all().map(s=>s.project).map(s=>{let n=Fs(r,s,e.maxBackfillRows),i=ws(r,s,e);return{project:s,docs:n,candidates:i}})}function Ht(r,e,t,s,n){if(!s)return 0;let{idfFn:i,docCount:o}=kt(r,e),a={cosineThreshold:n.cosineThreshold,vetoThetaIdf:le(n.idfVetoDf,o),minSharedTokens:n.minSharedTokens},_=r.prepare("SELECT id, title FROM observations WHERE project = ? AND id != ? AND title IS NOT NULL ORDER BY created_at_epoch DESC, id DESC LIMIT ?").all(e,t,n.maxScan);_.length===n.maxScan&&u.debug("DEDUP",`Tier-1 scan hit MAX_SCAN=${n.maxScan} for project ${e}; older rows covered by dedup-scan`);let E=Bt(r),c=new Date().toISOString(),d=Date.now(),l=0;for(let O of _){let L=Pe(s,O.title,i,a);L.tier==="candidate"&&(l+=E.run(t,O.id,e,L.method,L.score,"pending",c,d).changes)}return l}function jt(r,e,t,s,n){let i=Date.now()-s,o=n!==void 0?"up.session_db_id = ?":"up.content_session_id = ?",a=n??e;return r.prepare(`
107
+ `).all(...e,...t===void 0?[]:[t]).map(o=>({...o,fields:JSON.parse(o.fields)}))}var G=require("fs"),k=require("path"),Z=require("os");var ue={HEALTH_CHECK:3e3,API_REQUEST:3e4,SESSION_INIT_HOOK_CAP:15e3,SESSION_INIT_REQUEST:1e4,SESSION_INIT_REQUEST_MAX:14e3,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function Is(r=process.platform){return r==="win32"?8e3:5e3}function bt(r=process.platform){return ue.SESSION_INIT_HOOK_CAP-Is(r)}function Ct(r){return process.platform==="win32"?Math.round(r*ue.WINDOWS_MULTIPLIER):r}function Lt(r){try{return new URL(r).hostname.toLowerCase()==="openrouter.ai"}catch{return!1}}var hs="security_alert",Ds="sync-hub.black-pond-afbb.workers.dev",Ms="ziczmqtpmaxbornfghye.supabase.co",Us="https://sync.cmem.ai",ys=new Set(["xiaomi/mimo-v2-flash:free"]);function vs(r){let e=r.CLAUDE_MEM_OPENROUTER_MODEL;if(typeof e!="string"||!ys.has(e.trim()))return!1;let t=typeof r.CLAUDE_MEM_OPENROUTER_BASE_URL=="string"?r.CLAUDE_MEM_OPENROUTER_BASE_URL.trim():"";return t===""||Lt(t)}var It=18e4,ht=[{key:"CLAUDE_MEM_LLM_TIMEOUT_MS",legacy:"30000",markerTag:"llm-timeout-migrated-v1"},{key:"CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS",legacy:"30000",markerTag:"field-optimize-timeout-migrated-v1"}];function Mt(r,e){return(0,k.join)((0,k.dirname)(r),`.${(0,k.basename)(r)}.${e.markerTag}`)}function Pe(r,e){try{(0,G.writeFileSync)(Mt(r,e),new Date().toISOString(),{encoding:"utf-8",mode:384})}catch{}}var Dt=new Set;function Fs(r){if(typeof r!="string")return null;let e=r.trim();if(e.length===0)return null;try{let t=new URL(e).hostname;if(t===Ds||t===Ms)return Us}catch{return null}return null}var Y=class{static DEFAULTS={CLAUDE_MEM_MEMORY_SEARCH_HOOK_ENABLED:"true",CLAUDE_MEM_MEMORY_INSTRUCTIONS_ENABLED:"true",CLAUDE_MEM_MEMORY_WATCH_ROOTS:"",CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_SESSION_START_INCLUDE_ALL_SOURCES:"false",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_ALLOWED_ORIGINS:"",CLAUDE_MEM_PUBLIC_URL:"",CLAUDE_MEM_API_TIMEOUT_MS:String(Ct(ue.API_REQUEST)),CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS:String(bt()),CLAUDE_MEM_IDLE_EXIT_SEC:"0",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_SKIP_BASH_PATTERNS:"",CLAUDE_MEM_SKIP_SUBAGENT_OBSERVATIONS:"false",CLAUDE_MEM_SKIP_AGENT_TYPES:"",CLAUDE_MEM_CAPTURE_ADVISOR_CALLS:"false",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CODEX_MODEL:"",CLAUDE_MEM_CODEX_PATH:"codex",CLAUDE_MEM_CODEX_REASONING_EFFORT:"low",CLAUDE_MEM_CODEX_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_SIZE:"8",CLAUDE_MEM_CODEX_OBSERVATION_BATCH_MAX_CHARS:"32000",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_API_KEYS:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_API_KEYS:"",CLAUDE_MEM_OPENROUTER_MODEL:"cohere/north-mini-code:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_EXTRA_BODY:"",CLAUDE_MEM_OPENROUTER_REASONING_EFFORT:"",CLAUDE_MEM_OPENAI_COMPAT_PRESET:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEY:"",CLAUDE_MEM_OPENAI_COMPAT_API_KEYS:"",CLAUDE_MEM_OPENAI_COMPAT_BASE_URL:"",CLAUDE_MEM_OPENAI_COMPAT_MODEL:"",CLAUDE_MEM_QUOTA_FALLBACK_PROVIDER:"",CLAUDE_MEM_QUOTA_FALLBACK_MODEL:"",CLAUDE_MEM_QUOTA_THRESHOLD_FIVE_HOUR:"0.95",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_OPUS:"0.93",CLAUDE_MEM_QUOTA_THRESHOLD_SEVEN_DAY_SONNET:"0.92",CLAUDE_MEM_QUOTA_THRESHOLD_OVERAGE:"0.95",CLAUDE_MEM_DATA_DIR:(0,k.join)((0,Z.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_CLAUDE_CONFIG_DIR:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES:"",CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS:"",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY:"true",CLAUDE_MEM_REINFORCE_ALPHA:"0",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_ENABLED:"true",CLAUDE_MEM_FILE_READ_GATE_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,k.join)((0,Z.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_CODEX_SUBAGENT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_OBSERVER_CONTEXT_WINDOW:"",CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS:"4096",CLAUDE_MEM_OBSERVE_BARE_PROMPTS:"false",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_REDACT_ENABLED:"false",CLAUDE_MEM_REDACT_DISABLED_BUILTINS:"",CLAUDE_MEM_REDACT_CUSTOM_PATTERNS:"[]",CLAUDE_MEM_REDACT_LOG_MATCHES:"false",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_PROJECT_ENVIRONMENTS:"[]",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database",CLAUDE_MEM_CHROMA_PREWARM_TIMEOUT_MS:"120000",CLAUDE_MEM_CHROMA_MUTATION_TIMEOUT_MS:"600000",CLAUDE_MEM_CHROMA_MAX_PENDING_MUTATIONS:"5000",CLAUDE_MEM_CHROMA_EMBEDDING_FUNCTION:"default",CLAUDE_MEM_CLOUD_SYNC_TOKEN:"",CLAUDE_MEM_CLOUD_SYNC_USER_ID:"",CLAUDE_MEM_CLOUD_SYNC_HUB_URL:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_ID:"",CLAUDE_MEM_CLOUD_SYNC_DEVICE_NAME:(0,Z.hostname)(),CLAUDE_MEM_CLOUD_SYNC_WS:"true",CLAUDE_MEM_CLOUD_SYNC_CONTENT_BATCH_SIZE:"40",CLAUDE_MEM_CLOUD_SYNC_REQUEST_TIMEOUT_MS:"90000",CLAUDE_MEM_LLM_TIMEOUT_MS:String(It),CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS:String(It),CLAUDE_MEM_TV_TOKEN:"",CLAUDE_MEM_PRO_TRIAL_EMAIL:"",CLAUDE_MEM_PRO_TRIAL_AT:"",CLAUDE_MEM_PRO_TRIAL_STATE:"",CLAUDE_MEM_PRO_TRIAL_ENDS_AT:"",CLAUDE_MEM_PRO_PLAN:"",CLAUDE_MEM_PRO_FALLBACK_AT:"",CLAUDE_MEM_PRO_FALLBACK_MESSAGE:"",CLAUDE_MEM_PRO_FALLBACK_ACTION:"",CLAUDE_MEM_PRO_FALLBACK_URL:"",CLAUDE_MEM_PRO_MEMORY_KEY:"",CLAUDE_MEM_PRO_MEMORY_BASE_URL:"",CLAUDE_MEM_PRO_MEMORY_MODEL:"",CLAUDE_MEM_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_WRAPUPS_ENABLED:"true",CLAUDE_MEM_TELEGRAM_OBSERVATION_ALERTS_ENABLED:"false",CLAUDE_MEM_TELEGRAM_WRAPUP_ROUTES:"{}",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert,sensitive",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_AWARENESS_ENABLED:"true",CLAUDE_MEM_GROK_BOT_AWARENESS_AGENT_IDS:"521e962d-2ec3-4488-bfbc-54d5209ce118,95601360-61f7-4fd9-bb3a-2c976b2b85c0",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_GROK_BOT_AWARENESS_TRIGGER_CONCEPTS:"",CLAUDE_MEM_GROK_BOT_WEBHOOK_URL:"",CLAUDE_MEM_GROK_BOT_WEBHOOK_SECRET:"",CLAUDE_MEM_GROK_BOT_INJECT_ENABLED:"true",CLAUDE_MEM_GROK_BOT_INJECT_AGENT_IDS:"*",CLAUDE_MEM_GROK_BOT_INJECT_TIER:"episode",CLAUDE_MEM_GROK_BOT_INJECT_WINDOW:"80",CLAUDE_MEM_GROK_BOT_INJECT_FALLBACK:"house",CLAUDE_MEM_GROK_BOT_INJECT_PLATFORM_SOURCE:"",CLAUDE_MEM_GROK_BOT_INJECT_PROJECTS_BY_AGENT:"",CLAUDE_MEM_GROK_BOT_INJECT_MAX_LINE_CHARS:"160",CLAUDE_MEM_GROK_BOT_INJECT_DEBOUNCE_MS:"1500",CLAUDE_MEM_GROK_BOT_INJECT_STANDING_LINE:"",CLAUDE_MEM_CCS_ALIGN_ENABLED:"true",CLAUDE_MEM_CCS_ALIGN_VIEWER_IDS:"ccs-align",CLAUDE_MEM_CCS_ALIGN_TRIGGER_TYPES:"decision,bugfix,security_alert,sensitive",CLAUDE_MEM_CCS_ALIGN_PATCH_SHADOWS:"false",CLAUDE_MEM_QUEUE_ENGINE:"sqlite",CLAUDE_MEM_REDIS_URL:"",CLAUDE_MEM_REDIS_HOST:"127.0.0.1",CLAUDE_MEM_REDIS_PORT:"6379",CLAUDE_MEM_REDIS_MODE:"external",CLAUDE_MEM_QUEUE_REDIS_PREFIX:`claude_mem_${process.env.CLAUDE_MEM_WORKER_PORT??String(37700+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_AUTH_MODE:"api-key",CLAUDE_MEM_RUNTIME:"worker",CLAUDE_MEM_SERVER_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_API_KEY:"",CLAUDE_MEM_SERVER_PROJECT_ID:"",CLAUDE_MEM_SERVER_BETA_URL:`http://127.0.0.1:${process.env.CLAUDE_MEM_SERVER_PORT??String(37877+(process.getuid?.()??77)%100)}`,CLAUDE_MEM_SERVER_BETA_API_KEY:"",CLAUDE_MEM_SERVER_BETA_PROJECT_ID:"",CLAUDE_MEM_DEDUP_ENABLED:"false",CLAUDE_MEM_DEDUP_COSINE_THRESHOLD:"0.80",CLAUDE_MEM_DEDUP_IDF_VETO_DF:"10",CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS:"2",CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS:"10",CLAUDE_MEM_DEDUP_MAX_SCAN:"2000",CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS:"50000",CLAUDE_MEM_WORKER_AUTOSTART:"true",CLAUDE_MEM_PROJECT_NAME_SOURCE:"path"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){let t=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(t):t}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,t){let s=t?this.applyEnvOverrides(e):e;return s.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(s.CLAUDE_MEM_WORKER_HOST),s}static getInt(e){let t=this.get(e);return parseInt(t,10)}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e,t=!0){try{if(!(0,G.existsSync)(e)){let d=this.getAllDefaults();try{P(e,d,{mode:384});for(let l of ht)Pe(e,l);console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(l){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,l instanceof Error?l.message:String(l))}return this.finalizeSettings(d,t)}let s=(0,G.readFileSync)(e,"utf-8"),n=Ie(s),i=K(n),o=i!==n,a=Ze(n),_=o&&Object.keys(a).some(d=>d!=="env");if(o&&!_)try{P(e,i,{mode:384}),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(d){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,d instanceof Error?d.message:String(d))}if(i.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===hs){i={...i,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,d instanceof Error?d.message:String(d))}}if(vs(i)){let d=String(i.CLAUDE_MEM_OPENROUTER_MODEL).trim();i={...i,CLAUDE_MEM_OPENROUTER_MODEL:this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn(`[SETTINGS] Migrated OpenRouter model off the retired default ${d} to ${this.DEFAULTS.CLAUDE_MEM_OPENROUTER_MODEL}:`,e)}catch(l){console.warn("[SETTINGS] Failed to migrate the retired OpenRouter model:",e,l instanceof Error?l.message:String(l))}}let E=Fs(i.CLAUDE_MEM_CLOUD_SYNC_HUB_URL);if(E!==null){i={...i,CLAUDE_MEM_CLOUD_SYNC_HUB_URL:E};try{P(e,_?{...a,env:i}:i,{mode:384}),console.warn("[SETTINGS] Migrated cloud sync hub URL to",E,"from a retired hub host:",e)}catch(d){console.warn("[SETTINGS] Failed to migrate cloud sync hub URL:",e,d instanceof Error?d.message:String(d))}}for(let d of ht)if(!(0,G.existsSync)(Mt(e,d))){if(i[d.key]!==d.legacy){Pe(e,d);continue}i={...i,[d.key]:this.DEFAULTS[d.key]};try{P(e,_?{...a,env:i}:i,{mode:384}),Pe(e,d),console.warn(`[SETTINGS] Migrated ${d.key} off the old ${d.legacy}ms default to ${this.DEFAULTS[d.key]}ms:`,e)}catch(l){let O=`${d.key}\0${e}`;Dt.has(O)||(Dt.add(O),console.warn(`[SETTINGS] Failed to migrate ${d.key}; using the new default in memory (reported once per process):`,e,l instanceof Error?l.message:String(l)))}}let c={...this.DEFAULTS};for(let d of Object.keys(this.DEFAULTS))i[d]!==void 0&&(c[d]=i[d]);return this.finalizeSettings(c,t)}catch(s){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,s instanceof Error?s.message:String(s));let n=this.getAllDefaults();return this.finalizeSettings(n,t)}}};var wt=require("crypto");function ee(r){return(r??"").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}function H(r){return(r??"").toLowerCase().trim().split(/\s+/).filter(Boolean)}function le(r,e){return Math.log(1+e/(r+.5))}function Ut(r,e){return t=>le(r(t),e)}function yt(r,e){let t=new Map;for(let s of new Set(r))t.set(s,e(s));return t}function vt(r,e,t){let s=yt(r,t),n=yt(e,t),i=0,o=0,a=0;for(let[_,E]of s){o+=E*E;let c=n.get(_);c!==void 0&&(i+=E*c)}for(let[,_]of n)a+=_*_;return o===0||a===0?0:i/Math.sqrt(o*a)}function Ft(r,e,t,s){let n=new Set(r),i=new Set(e);for(let o of n)if(!i.has(o)&&t(o)>s)return!0;for(let o of i)if(!n.has(o)&&t(o)>s)return!0;return!1}function xe(r,e,t,s){let n=ee(r);if(n!==""&&n===ee(e))return{tier:"exact",method:"exact",score:1};let i=H(r),o=H(e),a=s.minSharedTokens??2,_=new Set(o),E=0;for(let d of new Set(i))_.has(d)&&E++;if(E<a)return{tier:"none",method:"none",score:0};let c=vt(i,o,t);return c>=s.cosineThreshold&&!Ft(i,o,t,s.vetoThetaIdf)?{tier:"candidate",method:"idf_cosine",score:c}:{tier:"none",method:"none",score:c}}function pe(r,e){return!!r&&!!e}function ke(r,e,t,s=!1){let n=ee(t);if(n==="")return null;let i=b(e),o=s?"subagent":"main";return(0,wt.createHash)("sha256").update(`${r}\0${i}\0${o}\0${n}`).digest("hex").slice(0,32)}function Pt(r,e,t){return t===null?null:r.prepare("SELECT id, occurrence_count, created_at_epoch FROM observations WHERE project = ? AND title_norm_key = ? ORDER BY created_at_epoch ASC, id ASC LIMIT 1").get(e,t)??null}function xt(r,e,t){let s=[...new Set(H(t))],n=r.prepare("INSERT INTO token_df (project, token, df) VALUES (?, ?, 1) ON CONFLICT(project, token) DO UPDATE SET df = df + 1");for(let i of s)n.run(e,i);r.prepare("INSERT INTO dedup_meta (project, doc_count) VALUES (?, 1) ON CONFLICT(project) DO UPDATE SET doc_count = doc_count + 1").run(e)}function kt(r,e){return r.prepare("SELECT doc_count FROM dedup_meta WHERE project = ?").get(e)?.doc_count??0}function Bt(r,e){let t=kt(r,e),s=r.prepare("SELECT token, df FROM token_df WHERE project = ?").all(e),n=new Map(s.map(i=>[i.token,i.df]));return{idfFn:Ut(i=>n.get(i)??0,t),docCount:t}}function Xt(r){return r.prepare("INSERT OR IGNORE INTO observation_dedup_candidates (observation_id, duplicate_of_id, project, method, score, status, created_at, created_at_epoch) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")}function Gt(r,e,t){return kt(r,e)>=t}function ws(r,e,t=Number.POSITIVE_INFINITY){let s=r.prepare("SELECT COUNT(*) c FROM observations WHERE project = ?").get(e).c;if(s>t)return u.warn("DEDUP",`Skipping dedup backfill for project ${e}: ${s} rows exceeds cap ${t} (CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS)`),0;let n=r.prepare("SELECT o.id, o.title, o.agent_id, o.agent_type, s.platform_source FROM observations o LEFT JOIN sdk_sessions s ON s.memory_session_id = o.memory_session_id WHERE o.project = ?").all(e),i=r.prepare("UPDATE observations SET title_norm_key = ? WHERE id = ?"),o=r.prepare("INSERT INTO token_df (project, token, df) VALUES (?, ?, ?)");return r.transaction(()=>{let _=new Map;for(let E of n){i.run(ke(e,E.platform_source,E.title,pe(E.agent_id,E.agent_type)),E.id);for(let c of new Set(H(E.title)))_.set(c,(_.get(c)??0)+1)}r.prepare("DELETE FROM token_df WHERE project = ?").run(e);for(let[E,c]of _)o.run(e,E,c);r.prepare("INSERT INTO dedup_meta (project, doc_count, last_rebuild_doc_count, deleted_since_rebuild) VALUES (?, ?, ?, 0) ON CONFLICT(project) DO UPDATE SET doc_count = excluded.doc_count, last_rebuild_doc_count = excluded.last_rebuild_doc_count, deleted_since_rebuild = 0").run(e,n.length,n.length)})(),n.length}function Ps(r,e,t){let s=r.prepare("SELECT id, title FROM observations WHERE project = ? AND title IS NOT NULL ORDER BY id ASC").all(e);if(s.length<2)return 0;if(s.length>t.maxBackfillRows)return u.warn("DEDUP",`Skipping dedup sweep for project ${e}: ${s.length} rows exceeds cap ${t.maxBackfillRows}`),0;let{idfFn:n,docCount:i}=Bt(r,e),o={cosineThreshold:t.cosineThreshold,vetoThetaIdf:le(t.idfVetoDf,i),minSharedTokens:t.minSharedTokens},a=s.map(f=>new Set(H(f.title))),_=new Map;for(let f of a)for(let g of f)_.set(g,(_.get(g)??0)+1);let E=Math.max(2,Math.ceil(Math.sqrt(s.length))*4),c=new Map;a.forEach((f,g)=>{for(let m of f){let N=_.get(m);if(N<2||N>E)continue;let A=c.get(m);A||(A=[],c.set(m,A)),A.push(g)}});let d=new Map;for(let f of c.values())for(let g=0;g<f.length;g++)for(let m=g+1;m<f.length;m++){let N=`${f[g]}:${f[m]}`;d.set(N,(d.get(N)??0)+1)}let l=Xt(r),O=new Date().toISOString(),L=Date.now(),I=0;for(let[f,g]of d){if(g<t.minSharedTokens)continue;let[m,N]=f.split(":").map(Number),A=xe(s[m].title,s[N].title,n,o);A.tier==="candidate"&&(I+=l.run(s[N].id,s[m].id,e,A.method,A.score,"pending",O,L).changes)}return I}function Ht(r,e){return r.prepare("SELECT DISTINCT project FROM observations").all().map(s=>s.project).map(s=>{let n=ws(r,s,e.maxBackfillRows),i=Ps(r,s,e);return{project:s,docs:n,candidates:i}})}function jt(r,e,t,s,n){if(!s)return 0;let{idfFn:i,docCount:o}=Bt(r,e),a={cosineThreshold:n.cosineThreshold,vetoThetaIdf:le(n.idfVetoDf,o),minSharedTokens:n.minSharedTokens},_=r.prepare("SELECT id, title FROM observations WHERE project = ? AND id != ? AND title IS NOT NULL ORDER BY created_at_epoch DESC, id DESC LIMIT ?").all(e,t,n.maxScan);_.length===n.maxScan&&u.debug("DEDUP",`Tier-1 scan hit MAX_SCAN=${n.maxScan} for project ${e}; older rows covered by dedup-scan`);let E=Xt(r),c=new Date().toISOString(),d=Date.now(),l=0;for(let O of _){let L=xe(s,O.title,i,a);L.tier==="candidate"&&(l+=E.run(t,O.id,e,L.method,L.score,"pending",c,d).changes)}return l}function $t(r,e,t,s,n){let i=Date.now()-s,o=n!==void 0?"up.session_db_id = ?":"up.content_session_id = ?",a=n??e;return r.prepare(`
108
108
  SELECT
109
109
  up.*,
110
110
  s.memory_session_id,
@@ -117,13 +117,13 @@ ${L.stack??""}
117
117
  AND up.created_at_epoch >= ?
118
118
  ORDER BY up.created_at_epoch DESC
119
119
  LIMIT 1
120
- `).get(a,t,i)??void 0}var me=require("fs");var Ps=[{name:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{name:"aws_secret_key",regex:/(?<=AWS_SECRET_ACCESS_KEY\s*[=:]\s*['"]?)[A-Za-z0-9/+=]{40}/g},{name:"github_pat",regex:/\bgh[oprs]_[A-Za-z0-9]{36}\b|\bgithub_pat_[A-Za-z0-9_]{82}\b/g},{name:"openai_key",regex:/\bsk-(?!ant-)[A-Za-z0-9_-]{20,}\b/g},{name:"anthropic_key",regex:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{name:"slack_token",regex:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g},{name:"jwt",regex:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{name:"private_key_pem",regex:/-----BEGIN (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g},{name:"stripe_key",regex:/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{name:"google_api_key",regex:/\bAIza[0-9A-Za-z_-]{35}\b/g},{name:"claude_mem_key",regex:/\bcmem_[A-Za-z0-9_-]{32,}|\bcm_pro_[A-Za-z0-9_-]{8,}/g}],xs=1024*1024,ks="<redacted type='oversize'/>";function Kt(r,e){if(!e.enabled||r.length===0)return{redacted:r,counts:{},oversize:!1};if(r.length>xs)return u.warn("REDACT","field exceeds the 1M-char redaction cap; replaced by an oversize marker",void 0,{inputLength:r.length}),{redacted:ks,counts:{oversize:1},oversize:!0};let t=new Set(e.disabledBuiltinPatterns??[]),s={},n=r,i=[];for(let a of e.customPatterns??[]){if(!a.name||a.name.length===0){u.warn("REDACT","custom pattern skipped: missing name",void 0,{pattern:a});continue}try{i.push({name:a.name,regex:new RegExp(a.regex,"g")})}catch(_){u.warn("REDACT","custom pattern skipped: invalid regex",{name:a.name},_ instanceof Error?_:new Error(String(_)))}}let o=[...i,...Ps];for(let a of o)t.has(a.name)||(a.regex.lastIndex=0,n=n.replace(a.regex,()=>(s[a.name]=(s[a.name]??0)+1,`<redacted type='${a.name}'/>`)));return e.logMatches&&Object.keys(s).length>0&&u.debug("REDACT","patterns matched",void 0,{counts:s}),{redacted:n,counts:s,oversize:!1}}function Bs(r){if(!r||r.trim()==="")return[];try{let e=JSON.parse(r);return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"&&typeof t.regex=="string"):(u.warn("REDACT","CLAUDE_MEM_REDACT_CUSTOM_PATTERNS is not a JSON array, ignoring"),[])}catch(e){return u.warn("REDACT","failed to parse CLAUDE_MEM_REDACT_CUSTOM_PATTERNS as JSON",void 0,e instanceof Error?e:new Error(String(e))),[]}}function Xs(r){return{enabled:r.CLAUDE_MEM_REDACT_ENABLED==="true",disabledBuiltinPatterns:(r.CLAUDE_MEM_REDACT_DISABLED_BUILTINS??"").split(",").map(e=>e.trim()).filter(Boolean),customPatterns:Bs(r.CLAUDE_MEM_REDACT_CUSTOM_PATTERNS??"[]"),logMatches:r.CLAUDE_MEM_REDACT_LOG_MATCHES==="true"}}var te=null,$t=0,Gs=5e3,se=null,Wt=!1,Hs={enabled:!0,disabledBuiltinPatterns:[],customPatterns:[],logMatches:!1},js=/"CLAUDE_MEM_REDACT_ENABLED"\s*:\s*"true"/;function $s(r){if(!(0,me.existsSync)(r))return null;try{return(0,me.readFileSync)(r,"utf-8")}catch{return""}}function Ws(r){if(r===null)return!1;try{let e=JSON.parse(Le(r));return e===null||typeof e!="object"||Array.isArray(e)}catch{return!0}}function Ks(r,e,t){return process.env.CLAUDE_MEM_REDACT_ENABLED==="false"||!(se?.enabled===!0||js.test(e))?t:(Wt||(Wt=!0,u.warn("REDACT","settings.json could not be read; secret redaction stays on until it is repaired",{settingsPath:r,using:se?.enabled?"the last configuration that loaded":"the built-in patterns"})),se?.enabled?se:Hs)}function Yt(r=_e){let e=Date.now();if(te&&e-$t<Gs)return te;let t=Y.loadFromFile(r),s=Xs(t),n=s.enabled?null:$s(r);return Ws(n)?te=Ks(r,n,s):(te=s,se=s),$t=e,te}var Jt=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],Vt=new RegExp(`<(${Jt.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g");var qt=100;function Ys(r){let e=Object.fromEntries(Jt.map(i=>[i,0]));Vt.lastIndex=0;let t=0,s=r.replace(Vt,(i,o)=>(e[o]=(e[o]??0)+1,t+=1,""));return t>qt&&u.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:t,maxAllowed:qt,contentLength:r.length}),{stripped:Kt(s.trim(),Yt()).redacted,counts:e}}function Te(r){return Ys(r).stripped}var Vs=["task-notification"],br=new RegExp(`^\\s*<(${Vs.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),Cr=256*1024;var ke=4e3,Be="[media prompt]";function ne(r){let e=r.trim(),s=Te(r).trim()||e;return s.length<=ke?s:(u.debug("DB","Truncated stored prompt text to the configured cap",{originalLength:s.length,storedLength:ke}),`${s.slice(0,ke-1)}\u2026`)}var qs=require("bun:sqlite");var Js=5e3,zs=4194304;function Qs(r){return r.prepare(`
120
+ `).get(a,t,i)??void 0}var me=require("fs");var xs=[{name:"aws_access_key",regex:/AKIA[0-9A-Z]{16}/g},{name:"aws_secret_key",regex:/(?<=AWS_SECRET_ACCESS_KEY\s*[=:]\s*['"]?)[A-Za-z0-9/+=]{40}/g},{name:"github_pat",regex:/\bgh[oprs]_[A-Za-z0-9]{36}\b|\bgithub_pat_[A-Za-z0-9_]{82}\b/g},{name:"openai_key",regex:/\bsk-(?!ant-)[A-Za-z0-9_-]{20,}\b/g},{name:"anthropic_key",regex:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{name:"slack_token",regex:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g},{name:"jwt",regex:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{name:"private_key_pem",regex:/-----BEGIN (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |DSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/g},{name:"stripe_key",regex:/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{name:"google_api_key",regex:/\bAIza[0-9A-Za-z_-]{35}\b/g},{name:"claude_mem_key",regex:/\bcmem_[A-Za-z0-9_-]{32,}|\bcm_pro_[A-Za-z0-9_-]{8,}/g}],ks=1024*1024,Bs="<redacted type='oversize'/>";function Yt(r,e){if(!e.enabled||r.length===0)return{redacted:r,counts:{},oversize:!1};if(r.length>ks)return u.warn("REDACT","field exceeds the 1M-char redaction cap; replaced by an oversize marker",void 0,{inputLength:r.length}),{redacted:Bs,counts:{oversize:1},oversize:!0};let t=new Set(e.disabledBuiltinPatterns??[]),s={},n=r,i=[];for(let a of e.customPatterns??[]){if(!a.name||a.name.length===0){u.warn("REDACT","custom pattern skipped: missing name",void 0,{pattern:a});continue}try{i.push({name:a.name,regex:new RegExp(a.regex,"g")})}catch(_){u.warn("REDACT","custom pattern skipped: invalid regex",{name:a.name},_ instanceof Error?_:new Error(String(_)))}}let o=[...i,...xs];for(let a of o)t.has(a.name)||(a.regex.lastIndex=0,n=n.replace(a.regex,()=>(s[a.name]=(s[a.name]??0)+1,`<redacted type='${a.name}'/>`)));return e.logMatches&&Object.keys(s).length>0&&u.debug("REDACT","patterns matched",void 0,{counts:s}),{redacted:n,counts:s,oversize:!1}}function Xs(r){if(!r||r.trim()==="")return[];try{let e=JSON.parse(r);return Array.isArray(e)?e.filter(t=>t&&typeof t.name=="string"&&typeof t.regex=="string"):(u.warn("REDACT","CLAUDE_MEM_REDACT_CUSTOM_PATTERNS is not a JSON array, ignoring"),[])}catch(e){return u.warn("REDACT","failed to parse CLAUDE_MEM_REDACT_CUSTOM_PATTERNS as JSON",void 0,e instanceof Error?e:new Error(String(e))),[]}}function Gs(r){return{enabled:r.CLAUDE_MEM_REDACT_ENABLED==="true",disabledBuiltinPatterns:(r.CLAUDE_MEM_REDACT_DISABLED_BUILTINS??"").split(",").map(e=>e.trim()).filter(Boolean),customPatterns:Xs(r.CLAUDE_MEM_REDACT_CUSTOM_PATTERNS??"[]"),logMatches:r.CLAUDE_MEM_REDACT_LOG_MATCHES==="true"}}var te=null,Wt=0,Hs=5e3,se=null,Kt=!1,js={enabled:!0,disabledBuiltinPatterns:[],customPatterns:[],logMatches:!1},$s=/"CLAUDE_MEM_REDACT_ENABLED"\s*:\s*"true"/;function Ws(r){if(!(0,me.existsSync)(r))return null;try{return(0,me.readFileSync)(r,"utf-8")}catch{return""}}function Ks(r){if(r===null)return!1;try{let e=JSON.parse(Le(r));return e===null||typeof e!="object"||Array.isArray(e)}catch{return!0}}function Ys(r,e,t){return process.env.CLAUDE_MEM_REDACT_ENABLED==="false"||!(se?.enabled===!0||$s.test(e))?t:(Kt||(Kt=!0,u.warn("REDACT","settings.json could not be read; secret redaction stays on until it is repaired",{settingsPath:r,using:se?.enabled?"the last configuration that loaded":"the built-in patterns"})),se?.enabled?se:js)}function Vt(r=_e){let e=Date.now();if(te&&e-Wt<Hs)return te;let t=Y.loadFromFile(r),s=Gs(t),n=s.enabled?null:Ws(r);return Ks(n)?te=Ys(r,n,s):(te=s,se=s),Wt=e,te}var zt=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],qt=new RegExp(`<(${zt.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g");var Jt=100;function Vs(r){let e=Object.fromEntries(zt.map(i=>[i,0]));qt.lastIndex=0;let t=0,s=r.replace(qt,(i,o)=>(e[o]=(e[o]??0)+1,t+=1,""));return t>Jt&&u.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:t,maxAllowed:Jt,contentLength:r.length}),{stripped:Yt(s.trim(),Vt()).redacted,counts:e}}function Te(r){return Vs(r).stripped}var qs=["task-notification"],hr=new RegExp(`^\\s*<(${qs.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),Dr=256*1024;var Be=4e3,Xe="[media prompt]";function ne(r){let e=r.trim(),s=Te(r).trim()||e;return s.length<=Be?s:(u.debug("DB","Truncated stored prompt text to the configured cap",{originalLength:s.length,storedLength:Be}),`${s.slice(0,Be-1)}\u2026`)}var Js=require("bun:sqlite");var zs=5e3,Qs=4194304;function Zs(r){return r.prepare(`
121
121
  SELECT name
122
122
  FROM sqlite_master
123
123
  WHERE type = 'table'
124
124
  AND name NOT LIKE 'sqlite_%'
125
125
  LIMIT 1
126
- `).get()!=null}function V(r,e,t){try{r.run(e)}catch(s){let n=s instanceof Error?s:new Error(String(s));throw u.warn("DB",`Failed to apply SQLite pragma ${t}`,{sql:e},n),s}}function Se(r,e={}){let{enableWal:t=!0,enableIncrementalAutoVacuum:s=!0}=e;V(r,`PRAGMA busy_timeout = ${Js}`,"busy_timeout"),V(r,"PRAGMA foreign_keys = ON","foreign_keys"),V(r,"PRAGMA synchronous = NORMAL","synchronous"),V(r,`PRAGMA journal_size_limit = ${zs}`,"journal_size_limit"),s&&!Qs(r)&&V(r,"PRAGMA auto_vacuum = INCREMENTAL","auto_vacuum"),t&&V(r,"PRAGMA journal_mode = WAL","journal_mode")}var zt=!1;function Xe(r,...e){return typeof r.iterate=="function"?r.iterate(...e):(zt||(zt=!0,u.warn("DB","bun:sqlite lacks Statement.iterate(); falling back to .all()",{bunVersion:typeof Bun<"u"?Bun.version:"unknown",requiredBunVersion:">=1.1.31",impact:"rows are materialized in memory; upgrade Bun to restore streaming"})),r.all(...e))}function Ge(r,e,t,s){try{let n=Number(s.limit);if(!Number.isInteger(n)||n<0)throw new Error("Page limit must be a non-negative integer");let i=Number(s.offset??0);if(!Number.isInteger(i))throw new Error("Page offset must be an integer");let o=[];if(n===0)return o;let a=Math.max(0,i);for(let _ of Xe(r,...e))if(t(_)){if(a>0){a--;continue}if(o.push(_),o.length===n)break}return o}finally{r.finalize()}}var $e=require("bun:sqlite");function Ae(r){return r.replace(/\\/g,"/").replace(/\/+/g,"/").replace(/\/+$/,"")}function He(r,e){let t=Ae(r),s=Ae(e);if(t.startsWith(s+"/"))return!t.slice(s.length+1).includes("/");let n=s.split("/"),i=t.split("/");if(i.length<2)return s===""||s===".";let o=i.slice(0,-1).join("/"),a=i[i.length-1];if(s.endsWith("/"+o)||s===o)return!a.includes("/");for(let _=0;_<n.length;_++)if(n.slice(_).join("/")===o)return!0;return!1}var Zs=/^\d{4}-\d{2}-\d{2}$/;function j(r,e){if(typeof r=="number")return r;let t=new Date(r).getTime();return e==="end"&&Zs.test(r.trim())?t+864e5-1:t}var je="\\u0E00-\\u0EFF\\u1000-\\u109F\\u1780-\\u17FF\\u3040-\\u30FF\\u3100-\\u318F\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uAC00-\\uD7AF\\uF900-\\uFAFF",Oe=`
126
+ `).get()!=null}function V(r,e,t){try{r.run(e)}catch(s){let n=s instanceof Error?s:new Error(String(s));throw u.warn("DB",`Failed to apply SQLite pragma ${t}`,{sql:e},n),s}}function Se(r,e={}){let{enableWal:t=!0,enableIncrementalAutoVacuum:s=!0}=e;V(r,`PRAGMA busy_timeout = ${zs}`,"busy_timeout"),V(r,"PRAGMA foreign_keys = ON","foreign_keys"),V(r,"PRAGMA synchronous = NORMAL","synchronous"),V(r,`PRAGMA journal_size_limit = ${Qs}`,"journal_size_limit"),s&&!Zs(r)&&V(r,"PRAGMA auto_vacuum = INCREMENTAL","auto_vacuum"),t&&V(r,"PRAGMA journal_mode = WAL","journal_mode")}var Qt=!1;function Ge(r,...e){return typeof r.iterate=="function"?r.iterate(...e):(Qt||(Qt=!0,u.warn("DB","bun:sqlite lacks Statement.iterate(); falling back to .all()",{bunVersion:typeof Bun<"u"?Bun.version:"unknown",requiredBunVersion:">=1.1.31",impact:"rows are materialized in memory; upgrade Bun to restore streaming"})),r.all(...e))}function He(r,e,t,s){try{let n=Number(s.limit);if(!Number.isInteger(n)||n<0)throw new Error("Page limit must be a non-negative integer");let i=Number(s.offset??0);if(!Number.isInteger(i))throw new Error("Page offset must be an integer");let o=[];if(n===0)return o;let a=Math.max(0,i);for(let _ of Ge(r,...e))if(t(_)){if(a>0){a--;continue}if(o.push(_),o.length===n)break}return o}finally{r.finalize()}}var We=require("bun:sqlite");function Ae(r){return r.replace(/\\/g,"/").replace(/\/+/g,"/").replace(/\/+$/,"")}function je(r,e){let t=Ae(r),s=Ae(e);if(t.startsWith(s+"/"))return!t.slice(s.length+1).includes("/");let n=s.split("/"),i=t.split("/");if(i.length<2)return s===""||s===".";let o=i.slice(0,-1).join("/"),a=i[i.length-1];if(s.endsWith("/"+o)||s===o)return!a.includes("/");for(let _=0;_<n.length;_++)if(n.slice(_).join("/")===o)return!0;return!1}var en=/^\d{4}-\d{2}-\d{2}$/;function j(r,e){if(typeof r=="number")return r;let t=new Date(r).getTime();return e==="end"&&en.test(r.trim())?t+864e5-1:t}var $e="\\u0E00-\\u0EFF\\u1000-\\u109F\\u1780-\\u17FF\\u3040-\\u30FF\\u3100-\\u318F\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uAC00-\\uD7AF\\uF900-\\uFAFF",Oe=`
127
127
  CREATE TRIGGER IF NOT EXISTS observations_ai AFTER INSERT ON observations BEGIN
128
128
  INSERT INTO observations_fts(rowid, title, subtitle, narrative, text, facts, concepts)
129
129
  VALUES (new.id, new.title, new.subtitle, new.narrative, new.text, new.facts, new.concepts);
@@ -159,7 +159,7 @@ ${L.stack??""}
159
159
  INSERT INTO session_summaries_fts(rowid, request, investigated, learned, completed, next_steps, notes)
160
160
  VALUES (new.id, new.request, new.investigated, new.learned, new.completed, new.next_steps, new.notes);
161
161
  END;
162
- `,Qt=class r{db;constructor(e=Ee){e instanceof $e.Database?this.db=e:(de(M),this.db=new $e.Database(e)),Se(this.db),this._fts5Available=this.isFts5Available(),this.ensureFTSTables()}_fts5Available;ensureFTSTables(){let e=this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_fts'").all(),t=e.some(n=>n.name==="observations_fts"),s=e.some(n=>n.name==="session_summaries_fts");if(!(t&&s)){if(!this.isFts5Available()){u.warn("DB","FTS5 not available on this platform \u2014 skipping FTS table creation (search uses ChromaDB)");return}u.info("DB","Creating FTS5 tables");try{this.db.transaction(()=>{let n=this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_fts'").all(),i=!n.some(a=>a.name==="observations_fts"),o=!n.some(a=>a.name==="session_summaries_fts");this.createFTSTablesAndTriggers(i,o)}).immediate(),u.info("DB","FTS5 tables created successfully")}catch(n){this._fts5Available=!1,u.warn("DB","FTS5 table creation failed \u2014 search will use ChromaDB and LIKE queries",{},n instanceof Error?n:void 0)}}}isFts5Available(){try{return this.db.run("CREATE VIRTUAL TABLE temp._fts5_probe USING fts5(test_column)"),this.db.run("DROP TABLE temp._fts5_probe"),!0}catch(e){return u.debug("DB","FTS5 probe failed \u2014 FTS5 unavailable on this platform",void 0,e instanceof Error?e:new Error(String(e))),!1}}canReadFtsIndex(e){try{return this.db.prepare(`SELECT rowid FROM ${e} WHERE ${e} MATCH ? LIMIT 0`).all('"fts_read_probe"'),!0}catch{return!1}}createFTSTablesAndTriggers(e,t){e&&(this.db.run(`
162
+ `,Zt=class r{db;constructor(e=Ee){e instanceof We.Database?this.db=e:(de(M),this.db=new We.Database(e)),Se(this.db),this._fts5Available=this.isFts5Available(),this.ensureFTSTables()}_fts5Available;ensureFTSTables(){let e=this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_fts'").all(),t=e.some(n=>n.name==="observations_fts"),s=e.some(n=>n.name==="session_summaries_fts");if(!(t&&s)){if(!this.isFts5Available()){u.warn("DB","FTS5 not available on this platform \u2014 skipping FTS table creation (search uses ChromaDB)");return}u.info("DB","Creating FTS5 tables");try{this.db.transaction(()=>{let n=this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_fts'").all(),i=!n.some(a=>a.name==="observations_fts"),o=!n.some(a=>a.name==="session_summaries_fts");this.createFTSTablesAndTriggers(i,o)}).immediate(),u.info("DB","FTS5 tables created successfully")}catch(n){this._fts5Available=!1,u.warn("DB","FTS5 table creation failed \u2014 search will use ChromaDB and LIKE queries",{},n instanceof Error?n:void 0)}}}isFts5Available(){try{return this.db.run("CREATE VIRTUAL TABLE temp._fts5_probe USING fts5(test_column)"),this.db.run("DROP TABLE temp._fts5_probe"),!0}catch(e){return u.debug("DB","FTS5 probe failed \u2014 FTS5 unavailable on this platform",void 0,e instanceof Error?e:new Error(String(e))),!1}}canReadFtsIndex(e){try{return this.db.prepare(`SELECT rowid FROM ${e} WHERE ${e} MATCH ? LIMIT 0`).all('"fts_read_probe"'),!0}catch{return!1}}createFTSTablesAndTriggers(e,t){e&&(this.db.run(`
163
163
  CREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(
164
164
  title,
165
165
  subtitle,
@@ -192,7 +192,7 @@ ${L.stack??""}
192
192
  `),this.db.run(ge))}buildFilterClause(e,t,s="o"){let n=[],i=w(e);if(i.length>0){let o=x(s,i,{includeMerged:!0});n.push(o.sql),t.push(...o.params)}if(e.platformSource&&(n.push(`COALESCE(NULLIF((SELECT s2.platform_source FROM sdk_sessions s2 WHERE s2.memory_session_id = ${s}.memory_session_id), ''), '${p}') = ?`),t.push(b(e.platformSource))),e.type)if(Array.isArray(e.type)){let o=e.type.map(()=>"?").join(",");n.push(`${s}.type IN (${o})`),t.push(...e.type)}else n.push(`${s}.type = ?`),t.push(e.type);if(e.dateRange){let{start:o,end:a}=e.dateRange;o&&(n.push(`${s}.created_at_epoch >= ?`),t.push(j(o,"start"))),a&&(n.push(`${s}.created_at_epoch <= ?`),t.push(j(a,"end")))}if(e.concepts){let o=Array.isArray(e.concepts)?e.concepts:[e.concepts],a=o.map(()=>`EXISTS (SELECT 1 FROM json_each(${s}.concepts) WHERE value = ?)`);a.length>0&&(n.push(`(${a.join(" OR ")})`),t.push(...o))}if(e.files){let o=Array.isArray(e.files)?e.files:[e.files],a=o.map(()=>`(
193
193
  EXISTS (SELECT 1 FROM json_each(${s}.files_read) WHERE value LIKE ? ESCAPE '\\')
194
194
  OR EXISTS (SELECT 1 FROM json_each(${s}.files_modified) WHERE value LIKE ? ESCAPE '\\')
195
- )`);a.length>0&&(n.push(`(${a.join(" OR ")})`),o.forEach(_=>{let E=_.replace(/[\\%_]/g,"\\$&");t.push(`%${E}%`,`%${E}%`)}))}return n.length>0?n.join(" AND "):""}static UNSEGMENTED_SCRIPT=new RegExp(`[${je}]`);static UNSEGMENTED_RUN=new RegExp(`[${je}]+|[^\\s${je}]+`,"g");static MAX_SUBSTRING_TERMS=500;static buildSubstringClause(e,t){let s=[...new Set(e.match(r.UNSEGMENTED_RUN)??[])].slice(0,r.MAX_SUBSTRING_TERMS);s.length===0&&s.push(e);let n=[];return{clause:`(${s.map(o=>{let a=`%${o.replace(/[\\%_]/g,"\\$&")}%`;for(let _=0;_<t.length;_+=1)n.push(a);return`(${t.map(_=>`${_} LIKE ? ESCAPE '\\'`).join(" OR ")})`}).join(" AND ")})`,params:n}}static buildFTSMatchQuery(e){let t=(e.match(/\S+/g)??[]).filter(s=>/[\p{L}\p{N}]/u.test(s));return t.length===0?`"${e.replace(/"/g,'""')}"`:t.map(s=>`"${s.replace(/"/g,'""')}"`).join(" AND ")}buildOrderClause(e="relevance",t=!0,s="observations_fts"){switch(e){case"relevance":return t?`ORDER BY ${s}.rank ASC`:"ORDER BY o.created_at_epoch DESC";case"date_desc":return"ORDER BY o.created_at_epoch DESC";case"date_asc":return"ORDER BY o.created_at_epoch ASC";default:return"ORDER BY o.created_at_epoch DESC"}}searchObservationsBySubstring(e,t,s,n,i){let o=r.buildSubstringClause(e,["o.title","o.subtitle","o.narrative","o.text","o.facts","o.concepts"]),a=[],_=this.buildFilterClause(t,a,"o"),E=`
195
+ )`);a.length>0&&(n.push(`(${a.join(" OR ")})`),o.forEach(_=>{let E=_.replace(/[\\%_]/g,"\\$&");t.push(`%${E}%`,`%${E}%`)}))}return n.length>0?n.join(" AND "):""}static UNSEGMENTED_SCRIPT=new RegExp(`[${$e}]`);static UNSEGMENTED_RUN=new RegExp(`[${$e}]+|[^\\s${$e}]+`,"g");static MAX_SUBSTRING_TERMS=500;static buildSubstringClause(e,t){let s=[...new Set(e.match(r.UNSEGMENTED_RUN)??[])].slice(0,r.MAX_SUBSTRING_TERMS);s.length===0&&s.push(e);let n=[];return{clause:`(${s.map(o=>{let a=`%${o.replace(/[\\%_]/g,"\\$&")}%`;for(let _=0;_<t.length;_+=1)n.push(a);return`(${t.map(_=>`${_} LIKE ? ESCAPE '\\'`).join(" OR ")})`}).join(" AND ")})`,params:n}}static buildFTSMatchQuery(e){let t=(e.match(/\S+/g)??[]).filter(s=>/[\p{L}\p{N}]/u.test(s));return t.length===0?`"${e.replace(/"/g,'""')}"`:t.map(s=>`"${s.replace(/"/g,'""')}"`).join(" AND ")}buildOrderClause(e="relevance",t=!0,s="observations_fts"){switch(e){case"relevance":return t?`ORDER BY ${s}.rank ASC`:"ORDER BY o.created_at_epoch DESC";case"date_desc":return"ORDER BY o.created_at_epoch DESC";case"date_asc":return"ORDER BY o.created_at_epoch ASC";default:return"ORDER BY o.created_at_epoch DESC"}}searchObservationsBySubstring(e,t,s,n,i){let o=r.buildSubstringClause(e,["o.title","o.subtitle","o.narrative","o.text","o.facts","o.concepts"]),a=[],_=this.buildFilterClause(t,a,"o"),E=`
196
196
  SELECT o.*, o.discovery_tokens
197
197
  FROM observations o
198
198
  WHERE ${o.clause}
@@ -240,19 +240,19 @@ ${L.stack??""}
240
240
  WHERE ${E}
241
241
  ${c}
242
242
  LIMIT ? OFFSET ?
243
- `;return s.push(n,i),this.db.prepare(d).all(...s)}hasDirectChildFile(e,t){let s=n=>{if(!n)return!1;try{let i=JSON.parse(n);if(Array.isArray(i))return i.some(o=>He(o,t))}catch(i){u.debug("DB",`Failed to parse files JSON for observation ${e.id}`,void 0,i instanceof Error?i:void 0)}return!1};return s(e.files_modified)||s(e.files_read)}hasDirectChildFileSession(e,t){let s=n=>{if(!n)return!1;try{let i=JSON.parse(n);if(Array.isArray(i))return i.some(o=>He(o,t))}catch(i){u.debug("DB",`Failed to parse files JSON for session summary ${e.id}`,void 0,i instanceof Error?i:void 0)}return!1};return s(e.files_read)||s(e.files_edited)}static filePathPatterns(e,t){let s=a=>a.replace(/[\\%_]/g,"\\$&"),n=[`%${s(e)}%`];if(!t||!/^([A-Za-z]:)?[\\/]/.test(e))return n;let i=Ae(e).split("/").filter(a=>a.length>0),o=/^[A-Za-z]:$/.test(i[0]??"")?1:0;for(let a=o;a<i.length;a+=1){let _=i.slice(a);n.push(`${s(_.join("/")+"/")}%`),e.includes("\\")&&n.push(`${s(_.join("\\")+"\\")}%`)}return n}static jsonArrayLikeClause(e,t){let s=Array.from({length:t},()=>"value LIKE ? ESCAPE '\\'").join(" OR ");return`(${e.map(n=>`EXISTS (SELECT 1 FROM json_each(${n}) WHERE ${s})`).join(" OR ")})`}findByFile(e,t={}){let s=[],{limit:n=50,offset:i=0,orderBy:o="date_desc",isFolder:a=!1,..._}=t;delete _.files;let E=a?"":"LIMIT ? OFFSET ?",c=r.filePathPatterns(e,a),d=this.buildFilterClause(_,s,"o");s.push(...c,...c);let l=[d,r.jsonArrayLikeClause(["o.files_read","o.files_modified"],c.length)].filter(Boolean).join(" AND "),O=`${this.buildOrderClause(o,!1)}, o.id ${o==="date_asc"?"ASC":"DESC"}`,L=`
243
+ `;return s.push(n,i),this.db.prepare(d).all(...s)}hasDirectChildFile(e,t){let s=n=>{if(!n)return!1;try{let i=JSON.parse(n);if(Array.isArray(i))return i.some(o=>je(o,t))}catch(i){u.debug("DB",`Failed to parse files JSON for observation ${e.id}`,void 0,i instanceof Error?i:void 0)}return!1};return s(e.files_modified)||s(e.files_read)}hasDirectChildFileSession(e,t){let s=n=>{if(!n)return!1;try{let i=JSON.parse(n);if(Array.isArray(i))return i.some(o=>je(o,t))}catch(i){u.debug("DB",`Failed to parse files JSON for session summary ${e.id}`,void 0,i instanceof Error?i:void 0)}return!1};return s(e.files_read)||s(e.files_edited)}static filePathPatterns(e,t){let s=a=>a.replace(/[\\%_]/g,"\\$&"),n=[`%${s(e)}%`];if(!t||!/^([A-Za-z]:)?[\\/]/.test(e))return n;let i=Ae(e).split("/").filter(a=>a.length>0),o=/^[A-Za-z]:$/.test(i[0]??"")?1:0;for(let a=o;a<i.length;a+=1){let _=i.slice(a);n.push(`${s(_.join("/")+"/")}%`),e.includes("\\")&&n.push(`${s(_.join("\\")+"\\")}%`)}return n}static jsonArrayLikeClause(e,t){let s=Array.from({length:t},()=>"value LIKE ? ESCAPE '\\'").join(" OR ");return`(${e.map(n=>`EXISTS (SELECT 1 FROM json_each(${n}) WHERE ${s})`).join(" OR ")})`}findByFile(e,t={}){let s=[],{limit:n=50,offset:i=0,orderBy:o="date_desc",isFolder:a=!1,..._}=t;delete _.files;let E=a?"":"LIMIT ? OFFSET ?",c=r.filePathPatterns(e,a),d=this.buildFilterClause(_,s,"o");s.push(...c,...c);let l=[d,r.jsonArrayLikeClause(["o.files_read","o.files_modified"],c.length)].filter(Boolean).join(" AND "),O=`${this.buildOrderClause(o,!1)}, o.id ${o==="date_asc"?"ASC":"DESC"}`,L=`
244
244
  SELECT o.*, o.discovery_tokens
245
245
  FROM observations o
246
246
  WHERE ${l}
247
247
  ${O}
248
248
  ${E}
249
- `;a||s.push(n,i);let I=this.db.prepare(L),f=a?Ge(I,s,D=>this.hasDirectChildFile(D,e),{limit:n,offset:i}):I.all(...s),g=[],m={..._};delete m.type;let N=[],A=w(m);if(A.length>0){let D=x("s",A,{includeMerged:!0});N.push(D.sql),g.push(...D.params)}if(m.platformSource&&(N.push(`COALESCE(NULLIF((SELECT s2.platform_source FROM sdk_sessions s2 WHERE s2.memory_session_id = s.memory_session_id), ''), '${p}') = ?`),g.push(b(m.platformSource))),m.dateRange){let{start:D,end:v}=m.dateRange;D&&(N.push("s.created_at_epoch >= ?"),g.push(j(D,"start"))),v&&(N.push("s.created_at_epoch <= ?"),g.push(j(v,"end")))}N.push(r.jsonArrayLikeClause(["s.files_read","s.files_edited"],c.length)),g.push(...c,...c);let y=`
249
+ `;a||s.push(n,i);let I=this.db.prepare(L),f=a?He(I,s,D=>this.hasDirectChildFile(D,e),{limit:n,offset:i}):I.all(...s),g=[],m={..._};delete m.type;let N=[],A=w(m);if(A.length>0){let D=x("s",A,{includeMerged:!0});N.push(D.sql),g.push(...D.params)}if(m.platformSource&&(N.push(`COALESCE(NULLIF((SELECT s2.platform_source FROM sdk_sessions s2 WHERE s2.memory_session_id = s.memory_session_id), ''), '${p}') = ?`),g.push(b(m.platformSource))),m.dateRange){let{start:D,end:v}=m.dateRange;D&&(N.push("s.created_at_epoch >= ?"),g.push(j(D,"start"))),v&&(N.push("s.created_at_epoch <= ?"),g.push(j(v,"end")))}N.push(r.jsonArrayLikeClause(["s.files_read","s.files_edited"],c.length)),g.push(...c,...c);let y=`
250
250
  SELECT s.*, s.discovery_tokens
251
251
  FROM session_summaries s
252
252
  WHERE ${N.join(" AND ")}
253
253
  ORDER BY s.created_at_epoch ${o==="date_asc"?"ASC":"DESC"}
254
254
  ${E}
255
- `;a||g.push(n,i);let T=this.db.prepare(y),S=a?Ge(T,g,D=>this.hasDirectChildFileSession(D,e),{limit:n,offset:i}):T.all(...g);return{observations:f,sessions:S}}findByType(e,t={}){let s=[],{limit:n=50,offset:i=0,orderBy:o="date_desc",...a}=t,_={...a,type:e},E=this.buildFilterClause(_,s,"o"),c=this.buildOrderClause(o,!1),d=`
255
+ `;a||g.push(n,i);let T=this.db.prepare(y),S=a?He(T,g,D=>this.hasDirectChildFileSession(D,e),{limit:n,offset:i}):T.all(...g);return{observations:f,sessions:S}}findByType(e,t={}){let s=[],{limit:n=50,offset:i=0,orderBy:o="date_desc",...a}=t,_={...a,type:e},E=this.buildFilterClause(_,s,"o"),c=this.buildOrderClause(o,!1),d=`
256
256
  SELECT o.*, o.discovery_tokens
257
257
  FROM observations o
258
258
  WHERE ${E}
@@ -280,7 +280,7 @@ ${L.stack??""}
280
280
  ${d}
281
281
  ${o==="date_asc"?"ORDER BY up.created_at_epoch ASC":"ORDER BY up.created_at_epoch DESC"}
282
282
  LIMIT ? OFFSET ?
283
- `;return s.push(n,i),this.db.prepare(O).all(...s)}close(){this.db.close()}};var Zt=4096;var en=new Set(["set_title","set_prompt_session","remap_project"]),tn=/^(?:0|[1-9][0-9]*)$/,es=18446744073709551615n;function U(r){throw u.debug("CLOUD_SYNC","Rejected invalid canonical content",{reason:r}),new Error(`canonical content: ${r}`)}function Re(r,e={}){return typeof r!="string"||!tn.test(r)?U("decimal values must be unsigned base-10 strings without leading zeroes"):(BigInt(r)>es&&U("decimal value exceeds uint64"),e.positive&&r==="0"&&U("decimal value must be positive"),r)}function We(r){let e=Re(r);return BigInt(e)===es&&U("uint64 sequence overflow"),(BigInt(e)+1n).toString(10)}function sn(r){(r===null||typeof r!="object"||Array.isArray(r))&&U("mutation must be an object");let e=r;if((typeof e.op!="string"||!en.has(e.op))&&U("unsupported mutation op"),e.op==="set_title"){let i=re(e,["fields","op","target"],"set_title"),o=fe(i.target,["content_session_id","memory_session_id","platform_source"],"set_title.target");o.memory_session_id===void 0&&o.content_session_id===void 0&&U("set_title target requires a session identifier");for(let _ of["memory_session_id","content_session_id","platform_source"])o[_]!==void 0&&B(o[_],_);let a=re(i.fields,["custom_title"],"set_title.fields");B(a.custom_title,"custom_title");return}if(e.op==="set_prompt_session"){let i=re(e,["fields","op","target"],"set_prompt_session"),o=re(i.target,["origin_device_id","origin_local_id"],"set_prompt_session.target");nn(o.origin_device_id),Re(o.origin_local_id);let a=fe(i.fields,["content_session_id","memory_session_id","platform_source","project"],"set_prompt_session.fields");B(a.memory_session_id,"memory_session_id");for(let _ of["content_session_id","platform_source","project"])a[_]!==void 0&&B(a[_],_);return}let t=re(e,["fields","op","where"],"remap_project"),s=fe(t.where,["memory_session_id","merged_into_project_is_null","project"],"remap_project.where");s.project!==void 0&&B(s.project,"project"),s.memory_session_id!==void 0&&B(s.memory_session_id,"memory_session_id"),s.merged_into_project_is_null!==void 0&&s.merged_into_project_is_null!==!0&&U("merged_into_project_is_null may only be true"),Object.keys(s).length===0&&U("remap_project where is empty");let n=fe(t.fields,["merged_into_project","project"],"remap_project.fields");n.project!==void 0&&B(n.project,"project"),n.merged_into_project!==void 0&&B(n.merged_into_project,"merged_into_project"),Object.keys(n).length===0&&U("remap_project fields are empty")}function Ke(r){sn(r)}function nn(r){return typeof r!="string"||r.length===0||Buffer.byteLength(r,"utf8")>128?U("origin_device_id must be a non-empty string of at most 128 UTF-8 bytes"):r}function B(r,e){return typeof r!="string"||r.length===0||r.trim().length===0||Buffer.byteLength(r,"utf8")>Zt?U(`${e} must be a non-blank string of at most ${Zt} UTF-8 bytes`):r}function re(r,e,t){if(r===null||typeof r!="object"||Array.isArray(r))return U(`${t} must be an object`);let s=r,n=Object.keys(s).sort(),i=[...e].sort();return(n.length!==i.length||n.some((o,a)=>o!==i[a]))&&U(`${t} must contain exactly: ${i.join(", ")}`),s}function fe(r,e,t){if(r===null||typeof r!="object"||Array.isArray(r))return U(`${t} must be an object`);let s=r,n=new Set(e),i=Object.keys(s).find(o=>!n.has(o));return i&&U(`${t} contains unknown field ${i}`),s}var ts=5*6e4,R=r=>typeof r=="object"&&r!==null?JSON.stringify(r):r??null;function ss(r){let e=[],t=[],s=new Set,n=new Set;for(let i of r){for(let o of i.files_read??[])!o||s.has(o)||(s.add(o),e.push(o));for(let o of i.files_modified??[])!o||n.has(o)||(n.add(o),t.push(o))}return{files_read:e,files_edited:t}}var rn=200,on=1e3,an=56,_n=57;function Ye(r){let e=Number(r);return Number.isSafeInteger(e)&&e>0?e:void 0}var qe=class{db;syncOpsEnabled;statementCache=new Map;constructor(e=Ee,t={}){this.syncOpsEnabled=t.syncOpsEnabled??!0,e instanceof Ve.Database?this.db=e:(e!==":memory:"&&de(M),this.db=new Ve.Database(e)),Se(this.db),this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),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.ensureSyncedAtColumns(),this.ensureSyncOriginColumns(),this.ensureSyncOutbox(),this.ensureSyncEntityLedger(),this.ensureSyncRevisionTextAffinity(),this.initializeSyncHubLaunchBaseline(),this.normalizeConceptTags(),this.ensureSDKSessionsObservedColumns(),this.ensureToolUsesTable(),this.ensureTelegramWrapupsTable(),this.addDedupTables(),this.ensureReinforcementColumns(),this.ensureSessionCwdColumn(),this.dropWriteOnlyUserPromptsFtsAndScopeFtsUpdateTriggers(),this.ensureProjectNocaseIndexes(),this.ensureAdvisorCallsTable(),this.ensureSessionProjectKeySourceColumn(),this.requeuePromptsDeadLetteredForSize(),this.ensureWorkStateTable(),this.ensureHookSpoolConsumedTable(),this.ensureProjectRecencyIndexes(),this.ensureMergedIntoProjectCoveringIndexes(),this.ensureNativePromptIdentity()}ensureNativePromptIdentity(){this.db.transaction(()=>{let e=this.db.query("PRAGMA table_info(user_prompts)").all();for(let t of["native_prompt_id","native_prompt_hash"])e.some(s=>s.name===t)||this.db.run(`ALTER TABLE user_prompts ADD COLUMN ${t} TEXT`);this.db.run(`CREATE UNIQUE INDEX IF NOT EXISTS idx_user_prompts_native_identity
283
+ `;return s.push(n,i),this.db.prepare(O).all(...s)}close(){this.db.close()}};var es=4096;var tn=new Set(["set_title","set_prompt_session","remap_project"]),sn=/^(?:0|[1-9][0-9]*)$/,ts=18446744073709551615n;function U(r){throw u.debug("CLOUD_SYNC","Rejected invalid canonical content",{reason:r}),new Error(`canonical content: ${r}`)}function Re(r,e={}){return typeof r!="string"||!sn.test(r)?U("decimal values must be unsigned base-10 strings without leading zeroes"):(BigInt(r)>ts&&U("decimal value exceeds uint64"),e.positive&&r==="0"&&U("decimal value must be positive"),r)}function Ke(r){let e=Re(r);return BigInt(e)===ts&&U("uint64 sequence overflow"),(BigInt(e)+1n).toString(10)}function nn(r){(r===null||typeof r!="object"||Array.isArray(r))&&U("mutation must be an object");let e=r;if((typeof e.op!="string"||!tn.has(e.op))&&U("unsupported mutation op"),e.op==="set_title"){let i=re(e,["fields","op","target"],"set_title"),o=fe(i.target,["content_session_id","memory_session_id","platform_source"],"set_title.target");o.memory_session_id===void 0&&o.content_session_id===void 0&&U("set_title target requires a session identifier");for(let _ of["memory_session_id","content_session_id","platform_source"])o[_]!==void 0&&B(o[_],_);let a=re(i.fields,["custom_title"],"set_title.fields");B(a.custom_title,"custom_title");return}if(e.op==="set_prompt_session"){let i=re(e,["fields","op","target"],"set_prompt_session"),o=re(i.target,["origin_device_id","origin_local_id"],"set_prompt_session.target");rn(o.origin_device_id),Re(o.origin_local_id);let a=fe(i.fields,["content_session_id","memory_session_id","platform_source","project"],"set_prompt_session.fields");B(a.memory_session_id,"memory_session_id");for(let _ of["content_session_id","platform_source","project"])a[_]!==void 0&&B(a[_],_);return}let t=re(e,["fields","op","where"],"remap_project"),s=fe(t.where,["memory_session_id","merged_into_project_is_null","project"],"remap_project.where");s.project!==void 0&&B(s.project,"project"),s.memory_session_id!==void 0&&B(s.memory_session_id,"memory_session_id"),s.merged_into_project_is_null!==void 0&&s.merged_into_project_is_null!==!0&&U("merged_into_project_is_null may only be true"),Object.keys(s).length===0&&U("remap_project where is empty");let n=fe(t.fields,["merged_into_project","project"],"remap_project.fields");n.project!==void 0&&B(n.project,"project"),n.merged_into_project!==void 0&&B(n.merged_into_project,"merged_into_project"),Object.keys(n).length===0&&U("remap_project fields are empty")}function Ye(r){nn(r)}function rn(r){return typeof r!="string"||r.length===0||Buffer.byteLength(r,"utf8")>128?U("origin_device_id must be a non-empty string of at most 128 UTF-8 bytes"):r}function B(r,e){return typeof r!="string"||r.length===0||r.trim().length===0||Buffer.byteLength(r,"utf8")>es?U(`${e} must be a non-blank string of at most ${es} UTF-8 bytes`):r}function re(r,e,t){if(r===null||typeof r!="object"||Array.isArray(r))return U(`${t} must be an object`);let s=r,n=Object.keys(s).sort(),i=[...e].sort();return(n.length!==i.length||n.some((o,a)=>o!==i[a]))&&U(`${t} must contain exactly: ${i.join(", ")}`),s}function fe(r,e,t){if(r===null||typeof r!="object"||Array.isArray(r))return U(`${t} must be an object`);let s=r,n=new Set(e),i=Object.keys(s).find(o=>!n.has(o));return i&&U(`${t} contains unknown field ${i}`),s}var ss=5*6e4,R=r=>typeof r=="object"&&r!==null?JSON.stringify(r):r??null;function ns(r){let e=[],t=[],s=new Set,n=new Set;for(let i of r){for(let o of i.files_read??[])!o||s.has(o)||(s.add(o),e.push(o));for(let o of i.files_modified??[])!o||n.has(o)||(n.add(o),t.push(o))}return{files_read:e,files_edited:t}}var on=200,an=1e3,_n=56,En=57;function Ve(r){let e=Number(r);return Number.isSafeInteger(e)&&e>0?e:void 0}var Je=class{db;syncOpsEnabled;statementCache=new Map;constructor(e=Ee,t={}){this.syncOpsEnabled=t.syncOpsEnabled??!0,e instanceof qe.Database?this.db=e:(e!==":memory:"&&de(M),this.db=new qe.Database(e)),Se(this.db),this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),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.ensureSyncedAtColumns(),this.ensureSyncOriginColumns(),this.ensureSyncOutbox(),this.ensureSyncEntityLedger(),this.ensureSyncRevisionTextAffinity(),this.initializeSyncHubLaunchBaseline(),this.normalizeConceptTags(),this.ensureSDKSessionsObservedColumns(),this.ensureToolUsesTable(),this.ensureTelegramWrapupsTable(),this.addDedupTables(),this.ensureReinforcementColumns(),this.ensureSessionCwdColumn(),this.dropWriteOnlyUserPromptsFtsAndScopeFtsUpdateTriggers(),this.ensureProjectNocaseIndexes(),this.ensureAdvisorCallsTable(),this.ensureSessionProjectKeySourceColumn(),this.requeuePromptsDeadLetteredForSize(),this.ensureWorkStateTable(),this.ensureHookSpoolConsumedTable(),this.ensureProjectRecencyIndexes(),this.ensureMergedIntoProjectCoveringIndexes(),this.ensureNativePromptIdentity()}ensureNativePromptIdentity(){this.db.transaction(()=>{let e=this.db.query("PRAGMA table_info(user_prompts)").all();for(let t of["native_prompt_id","native_prompt_hash"])e.some(s=>s.name===t)||this.db.run(`ALTER TABLE user_prompts ADD COLUMN ${t} TEXT`);this.db.run(`CREATE UNIQUE INDEX IF NOT EXISTS idx_user_prompts_native_identity
284
284
  ON user_prompts(session_db_id, native_prompt_id) WHERE native_prompt_id IS NOT NULL`)}).immediate()}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 i=this.getIndexColumns(n.name);return i.length===t.length&&i.every((o,a)=>o===t[a])})}resolvePromptSessionDbId(e,t,s){if(t!==void 0)return t;let n=s?b(s):void 0;return n?this.db.prepare(`
285
285
  SELECT id
286
286
  FROM sdk_sessions
@@ -327,7 +327,7 @@ ${L.stack??""}
327
327
  FOREIGN KEY (duplicate_of_id) REFERENCES observations(id) ON DELETE CASCADE,
328
328
  UNIQUE(observation_id, duplicate_of_id)
329
329
  )
330
- `),this.db.run("CREATE INDEX IF NOT EXISTS idx_token_df_project ON token_df(project)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_dedup_candidates_project ON observation_dedup_candidates(project, status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_dedup_candidates_obs ON observation_dedup_candidates(observation_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(an,new Date().toISOString())}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"),u.debug("DB","Dropped worker_pid column and its index from pending_messages")}catch(n){u.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"]),i=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(o=>o.name==="platform_source");if(!(e&&!t&&s&&i)){if(i||this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${p}'`),this.db.run(`
330
+ `),this.db.run("CREATE INDEX IF NOT EXISTS idx_token_df_project ON token_df(project)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_dedup_candidates_project ON observation_dedup_candidates(project, status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_dedup_candidates_obs ON observation_dedup_candidates(observation_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(_n,new Date().toISOString())}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"),u.debug("DB","Dropped worker_pid column and its index from pending_messages")}catch(n){u.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"]),i=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(o=>o.name==="platform_source");if(!(e&&!t&&s&&i)){if(i||this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${p}'`),this.db.run(`
331
331
  UPDATE sdk_sessions
332
332
  SET platform_source = '${p}'
333
333
  WHERE platform_source IS NULL OR platform_source = ''
@@ -443,7 +443,7 @@ ${L.stack??""}
443
443
  operation_sha256 TEXT,
444
444
  created_at_epoch INTEGER NOT NULL
445
445
  )
446
- `);let e=new Set(this.db.query("PRAGMA table_info(sync_outbox)").all().map(t=>t.name));e.has("canonical_body")||this.db.run("ALTER TABLE sync_outbox ADD COLUMN canonical_body TEXT"),e.has("operation_sha256")||this.db.run("ALTER TABLE sync_outbox ADD COLUMN operation_sha256 TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(42,new Date().toISOString())}ensureSyncRevisionTextAffinity(){let e=[{table:"observations",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"session_summaries",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"user_prompts",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"sync_outbox",column:"rev",temporary:"rev_text_v46"}],t=(o,a)=>this.db.query(`PRAGMA table_info(${o})`).all().find(_=>_.name===a),s=o=>o?.type.trim().toUpperCase()==="TEXT";if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(46)&&e.every(o=>s(t(o.table,o.column))))return;this.db.transaction(()=>{for(let o of e){let a=this.db.query(`PRAGMA table_info(${o.table})`).all(),_=a.find(c=>c.name===o.column);if(!_)throw new Error(`schema v46: missing ${o.table}.${o.column}`);for(let c of Xe(this.db.query(`
446
+ `);let e=new Set(this.db.query("PRAGMA table_info(sync_outbox)").all().map(t=>t.name));e.has("canonical_body")||this.db.run("ALTER TABLE sync_outbox ADD COLUMN canonical_body TEXT"),e.has("operation_sha256")||this.db.run("ALTER TABLE sync_outbox ADD COLUMN operation_sha256 TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(42,new Date().toISOString())}ensureSyncRevisionTextAffinity(){let e=[{table:"observations",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"session_summaries",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"user_prompts",column:"sync_rev",temporary:"sync_rev_text_v46"},{table:"sync_outbox",column:"rev",temporary:"rev_text_v46"}],t=(o,a)=>this.db.query(`PRAGMA table_info(${o})`).all().find(_=>_.name===a),s=o=>o?.type.trim().toUpperCase()==="TEXT";if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(46)&&e.every(o=>s(t(o.table,o.column))))return;this.db.transaction(()=>{for(let o of e){let a=this.db.query(`PRAGMA table_info(${o.table})`).all(),_=a.find(c=>c.name===o.column);if(!_)throw new Error(`schema v46: missing ${o.table}.${o.column}`);for(let c of Ge(this.db.query(`
447
447
  SELECT CAST(id AS TEXT) AS row_id,
448
448
  typeof(${o.column}) AS storage_type,
449
449
  CAST(${o.column} AS TEXT) AS revision
@@ -548,7 +548,7 @@ ${L.stack??""}
548
548
  ELSE value END)
549
549
  FROM json_each(observations.concepts))
550
550
  WHERE concepts LIKE '%:%' AND json_valid(concepts)
551
- `);for(let i of n){if(i.origin_device_id!==null)continue;let o=We(i.sync_rev);this.db.prepare(`
551
+ `);for(let i of n){if(i.origin_device_id!==null)continue;let o=Ke(i.sync_rev);this.db.prepare(`
552
552
  UPDATE observations SET sync_rev = ?, synced_at = NULL
553
553
  WHERE id = ? AND origin_device_id IS NULL
554
554
  `).run(o,i.id)}this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(49,new Date().toISOString())})(),u.debug("DB",`Normalized prefixed concept tags in ${t} observations (v49)`)}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(o=>o.name)),i=["retry_count","failed_at_epoch","completed_at_epoch"].filter(o=>s.has(o));if(!(e&&i.length===0)){if(i.length>0){this.db.run("BEGIN TRANSACTION");try{this.db.run("DELETE FROM pending_messages WHERE status NOT IN ('pending', 'processing')");for(let o of i)this.db.run(`ALTER TABLE pending_messages DROP COLUMN ${o}`),u.debug("DB",`Dropped dead column ${o} 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(o){this.db.run("ROLLBACK"),u.warn("DB","Failed to drop dead columns from pending_messages",{},o instanceof Error?o:new Error(String(o)));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(`
@@ -785,7 +785,7 @@ ${L.stack??""}
785
785
  UPDATE sdk_sessions
786
786
  SET platform_source = '${p}'
787
787
  WHERE platform_source IS NULL OR platform_source = ''
788
- `),n||this.db.run("CREATE INDEX IF NOT EXISTS idx_sdk_sessions_platform_source ON sdk_sessions(platform_source)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(24,new Date().toISOString()))}addObservationModelColumns(){let e=this.db.query("PRAGMA table_info(observations)").all(),t=e.some(n=>n.name==="generated_by_model"),s=e.some(n=>n.name==="relevance_count");t&&s||(t||this.db.run("ALTER TABLE observations ADD COLUMN generated_by_model TEXT"),s||this.db.run("ALTER TABLE observations ADD COLUMN relevance_count INTEGER DEFAULT 0"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(26,new Date().toISOString()))}ensureSDKSessionsObservedColumns(){let e=this.db.query("PRAGMA table_info(sdk_sessions)").all(),t=e.some(n=>n.name==="observed_model"),s=e.some(n=>n.name==="observed_billing");t&&s||(t||this.db.run("ALTER TABLE sdk_sessions ADD COLUMN observed_model TEXT"),s||this.db.run("ALTER TABLE sdk_sessions ADD COLUMN observed_billing TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(50,new Date().toISOString()))}ensureToolUsesTable(){lt(this.db),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(51,new Date().toISOString())}ensureWorkStateTable(){gt(this.db),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(61,new Date().toISOString())}ensureProjectRecencyIndexes(){this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_project_nocase_recent ON observations(project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_merged_into_nocase_recent ON observations(merged_into_project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_project_nocase_recent ON session_summaries(project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_merged_into_nocase_recent ON session_summaries(merged_into_project COLLATE NOCASE, created_at_epoch DESC)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(63,new Date().toISOString())}ensureMergedIntoProjectCoveringIndexes(){this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_merged_into_nocase_project ON observations(merged_into_project COLLATE NOCASE, project)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_merged_into_nocase_project ON session_summaries(merged_into_project COLLATE NOCASE, project)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(64,new Date().toISOString())}ensureHookSpoolConsumedTable(){this.db.run(`
788
+ `),n||this.db.run("CREATE INDEX IF NOT EXISTS idx_sdk_sessions_platform_source ON sdk_sessions(platform_source)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(24,new Date().toISOString()))}addObservationModelColumns(){let e=this.db.query("PRAGMA table_info(observations)").all(),t=e.some(n=>n.name==="generated_by_model"),s=e.some(n=>n.name==="relevance_count");t&&s||(t||this.db.run("ALTER TABLE observations ADD COLUMN generated_by_model TEXT"),s||this.db.run("ALTER TABLE observations ADD COLUMN relevance_count INTEGER DEFAULT 0"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(26,new Date().toISOString()))}ensureSDKSessionsObservedColumns(){let e=this.db.query("PRAGMA table_info(sdk_sessions)").all(),t=e.some(n=>n.name==="observed_model"),s=e.some(n=>n.name==="observed_billing");t&&s||(t||this.db.run("ALTER TABLE sdk_sessions ADD COLUMN observed_model TEXT"),s||this.db.run("ALTER TABLE sdk_sessions ADD COLUMN observed_billing TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(50,new Date().toISOString()))}ensureToolUsesTable(){pt(this.db),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(51,new Date().toISOString())}ensureWorkStateTable(){ft(this.db),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(61,new Date().toISOString())}ensureProjectRecencyIndexes(){this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_project_nocase_recent ON observations(project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_merged_into_nocase_recent ON observations(merged_into_project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_project_nocase_recent ON session_summaries(project COLLATE NOCASE, created_at_epoch DESC)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_merged_into_nocase_recent ON session_summaries(merged_into_project COLLATE NOCASE, created_at_epoch DESC)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(63,new Date().toISOString())}ensureMergedIntoProjectCoveringIndexes(){this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_merged_into_nocase_project ON observations(merged_into_project COLLATE NOCASE, project)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_summaries_merged_into_nocase_project ON session_summaries(merged_into_project COLLATE NOCASE, project)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(64,new Date().toISOString())}ensureHookSpoolConsumedTable(){this.db.run(`
789
789
  CREATE TABLE IF NOT EXISTS hook_spool_consumed (
790
790
  entry_key TEXT PRIMARY KEY,
791
791
  consumed_at_epoch_ms INTEGER NOT NULL
@@ -803,7 +803,7 @@ ${L.stack??""}
803
803
  sent_at_epoch INTEGER,
804
804
  UNIQUE(platform_source, content_session_id, project, route_key)
805
805
  )
806
- `),this.db.run("CREATE INDEX IF NOT EXISTS idx_telegram_wrapups_platform_content ON telegram_wrapups(platform_source, content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(52,new Date().toISOString())}ensureReinforcementColumns(){let e=this.db.query("PRAGMA table_info(observations)").all();e.some(t=>t.name==="reinforcement_dates")||this.db.run("ALTER TABLE observations ADD COLUMN reinforcement_dates TEXT"),e.some(t=>t.name==="last_reinforced")||this.db.run("ALTER TABLE observations ADD COLUMN last_reinforced TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(_n,new Date().toISOString())}dropWriteOnlyUserPromptsFtsAndScopeFtsUpdateTriggers(){let e=this.db.prepare(`
806
+ `),this.db.run("CREATE INDEX IF NOT EXISTS idx_telegram_wrapups_platform_content ON telegram_wrapups(platform_source, content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(52,new Date().toISOString())}ensureReinforcementColumns(){let e=this.db.query("PRAGMA table_info(observations)").all();e.some(t=>t.name==="reinforcement_dates")||this.db.run("ALTER TABLE observations ADD COLUMN reinforcement_dates TEXT"),e.some(t=>t.name==="last_reinforced")||this.db.run("ALTER TABLE observations ADD COLUMN last_reinforced TEXT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(En,new Date().toISOString())}dropWriteOnlyUserPromptsFtsAndScopeFtsUpdateTriggers(){let e=this.db.prepare(`
807
807
  SELECT name FROM sqlite_master
808
808
  WHERE type = 'trigger'
809
809
  AND name IN ('observations_au', 'session_summaries_au')
@@ -901,7 +901,7 @@ ${L.stack??""}
901
901
  UPDATE tool_uses
902
902
  SET memory_session_id = ?
903
903
  WHERE session_db_id = ?
904
- `).run(t,e)})(),t&&this.requeuePromptSync(e))}enqueueMutationOp(e,t){if(!this.syncOpsEnabled)return;let s=JSON.parse(JSON.stringify(t));if(s.op==="set_prompt_session"){let n=s.target;n?.origin_device_id===null&&(n.origin_device_id="self")}Ke(s),t.op==="set_prompt_session"&&this.cachedStatement(`
904
+ `).run(t,e)})(),t&&this.requeuePromptSync(e))}enqueueMutationOp(e,t){if(!this.syncOpsEnabled)return;let s=JSON.parse(JSON.stringify(t));if(s.op==="set_prompt_session"){let n=s.target;n?.origin_device_id===null&&(n.origin_device_id="self")}Ye(s),t.op==="set_prompt_session"&&this.cachedStatement(`
905
905
  DELETE FROM sync_outbox
906
906
  WHERE json_valid(body)
907
907
  AND json_extract(body, '$.op') = 'set_prompt_session'
@@ -919,7 +919,7 @@ ${L.stack??""}
919
919
  `).all(e);if(n.length===0)return;let i=this.cachedStatement(`
920
920
  UPDATE user_prompts SET sync_rev = ?, synced_at = NULL
921
921
  WHERE id = ? AND origin_device_id IS NULL
922
- `);for(let o of n){let a=We(o.sync_rev);i.run(a,o.id),this.enqueueMutationOp(a,{op:"set_prompt_session",target:{origin_device_id:null,origin_local_id:o.id},fields:{memory_session_id:t.memory_session_id,project:t.project,content_session_id:t.content_session_id,platform_source:t.platform_source}})}})()}markSessionCompleted(e){let t=Date.now(),s=new Date(t).toISOString();this.db.prepare(`
922
+ `);for(let o of n){let a=Ke(o.sync_rev);i.run(a,o.id),this.enqueueMutationOp(a,{op:"set_prompt_session",target:{origin_device_id:null,origin_local_id:o.id},fields:{memory_session_id:t.memory_session_id,project:t.project,content_session_id:t.content_session_id,platform_source:t.platform_source}})}})()}markSessionCompleted(e){let t=Date.now(),s=new Date(t).toISOString();this.db.prepare(`
923
923
  UPDATE sdk_sessions
924
924
  SET status = 'completed', completed_at = ?, completed_at_epoch = ?
925
925
  WHERE id = ?
@@ -933,7 +933,7 @@ ${L.stack??""}
933
933
  UPDATE sdk_sessions SET memory_session_id = ? WHERE id = ?
934
934
  `).run(t,e),this.requeuePromptSync(e),u.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,newId:t})):n.memory_session_id!==t&&u.debug("DB","Keeping the registered memory_session_id",{sessionDbId:e,registered:n.memory_session_id,offered:t}),typeof s=="number"&&n.worker_port!==s&&this.db.prepare(`
935
935
  UPDATE sdk_sessions SET worker_port = ? WHERE id = ?
936
- `).run(s,e),n.memory_session_id??t}getProjectReadKeys(e){return rt(this.db,e)}getAllProjects(e){let t=e?b(e):void 0,s=`
936
+ `).run(s,e),n.memory_session_id??t}getProjectReadKeys(e){return ot(this.db,e)}getAllProjects(e){let t=e?b(e):void 0,s=`
937
937
  SELECT DISTINCT project
938
938
  FROM sdk_sessions
939
939
  WHERE project IS NOT NULL AND project != ''
@@ -948,7 +948,7 @@ ${L.stack??""}
948
948
  AND project != ?
949
949
  GROUP BY COALESCE(platform_source, '${p}'), project
950
950
  ORDER BY latest_epoch DESC
951
- `).all(Q),t=[],s=new Set,n={};for(let o of e){let a=b(o.platform_source);n[a]||(n[a]=[]),n[a].includes(o.project)||n[a].push(o.project),s.has(o.project)||(s.add(o.project),t.push(o.project))}let i=dt(Object.keys(n));return{projects:t,sources:i,projectsBySource:Object.fromEntries(i.map(o=>[o,n[o]||[]]))}}getSessionCatalog(e={}){let t=Math.min(Math.max(Math.trunc(e.limit??rn),1),on),s=Math.max(Math.trunc(e.offset??0),0),n=`
951
+ `).all(Q),t=[],s=new Set,n={};for(let o of e){let a=b(o.platform_source);n[a]||(n[a]=[]),n[a].includes(o.project)||n[a].push(o.project),s.has(o.project)||(s.add(o.project),t.push(o.project))}let i=ct(Object.keys(n));return{projects:t,sources:i,projectsBySource:Object.fromEntries(i.map(o=>[o,n[o]||[]]))}}getSessionCatalog(e={}){let t=Math.min(Math.max(Math.trunc(e.limit??on),1),an),s=Math.max(Math.trunc(e.offset??0),0),n=`
952
952
  SELECT
953
953
  s.content_session_id,
954
954
  s.project,
@@ -972,7 +972,7 @@ ${L.stack??""}
972
972
  FROM user_prompts up
973
973
  JOIN sdk_sessions s ON up.session_db_id = s.id
974
974
  WHERE up.id = ?
975
- `).get(e)}findRecentDuplicateUserPrompt(e,t,s,n){return jt(this.db,e,ne(t),s,this.resolvePromptSessionDbId(e,n)??void 0)}getRecentSessionsWithStatus(e,t=3,s){let n=[e],i="";return s&&(i=`AND COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`,n.push(b(s))),n.push(t),this.db.prepare(`
975
+ `).get(e)}findRecentDuplicateUserPrompt(e,t,s,n){return $t(this.db,e,ne(t),s,this.resolvePromptSessionDbId(e,n)??void 0)}getRecentSessionsWithStatus(e,t=3,s){let n=[e],i="";return s&&(i=`AND COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`,n.push(b(s))),n.push(t),this.db.prepare(`
976
976
  SELECT * FROM (
977
977
  SELECT
978
978
  s.memory_session_id,
@@ -1013,7 +1013,7 @@ ${L.stack??""}
1013
1013
  SELECT *
1014
1014
  FROM observations
1015
1015
  WHERE id = ?
1016
- `).get(e)||null}upsertToolUse(e){return pt(this.db,e)}linkToolUsesToObservation(e){return mt(this.db,e)}getToolUsesByIds(e,t={}){return St(this.db,e,t)}queryToolUses(e={}){return At(this.db,e)}appendWorkStateEntry(e){let t=ft(this.db,e);return $({projects:[e.project]},"appendWorkStateEntry"),t}getWorkStateEntries(e,t){let s=Rt(this.db,this.getProjectReadKeys(e),t),n=a=>a.replace(/[A-Z]/g,_=>_.toLowerCase()),i=new Set(e.map(n)),o=e.at(-1);return s.map(a=>o&&i.has(n(a.project))?{...a,scope_project:o}:a)}countToolUses(e={}){return Ot(this.db,e)}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n,type:i,concepts:o,files:a}=t,_=Ye(t.limit),E=w(t),c=s==="relevance",d=s==="date_asc"?"ASC":"DESC",l=c?"":`ORDER BY o.created_at_epoch ${d}, o.id ${d}`,O=_&&!c?"LIMIT ?":"",L=e.map(()=>"?").join(","),I=[...e],f=[];if(E.length>0){let T=x("o",E,{includeMerged:!0});f.push(T.sql),I.push(...T.params)}if(n&&(f.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),I.push(b(n))),i)if(Array.isArray(i)){let T=i.map(()=>"?").join(",");f.push(`o.type IN (${T})`),I.push(...i)}else f.push("o.type = ?"),I.push(i);if(o){let T=Array.isArray(o)?o:[o],S=T.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE value = ?)");I.push(...T),f.push(`(${S.join(" OR ")})`)}if(a){let T=Array.isArray(a)?a:[a],S=T.map(()=>"(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE value LIKE ? ESCAPE '\\') OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE value LIKE ? ESCAPE '\\'))");T.forEach(D=>{let v=D.replace(/[\\%_]/g,"\\$&");I.push(`%${v}%`,`%${v}%`)}),f.push(`(${S.join(" OR ")})`)}let g=f.length>0?`WHERE o.id IN (${L}) AND ${f.join(" AND ")}`:`WHERE o.id IN (${L})`;O&&I.push(_);let N=this.db.prepare(`
1016
+ `).get(e)||null}upsertToolUse(e){return mt(this.db,e)}linkToolUsesToObservation(e){return Tt(this.db,e)}getToolUsesByIds(e,t={}){return At(this.db,e,t)}queryToolUses(e={}){return Ot(this.db,e)}appendWorkStateEntry(e){let t=Rt(this.db,e);return $({projects:[e.project]},"appendWorkStateEntry"),t}getWorkStateEntries(e,t){let s=Nt(this.db,this.getProjectReadKeys(e),t),n=a=>a.replace(/[A-Z]/g,_=>_.toLowerCase()),i=new Set(e.map(n)),o=e.at(-1);return s.map(a=>o&&i.has(n(a.project))?{...a,scope_project:o}:a)}countToolUses(e={}){return gt(this.db,e)}getObservationsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n,type:i,concepts:o,files:a}=t,_=Ve(t.limit),E=w(t),c=s==="relevance",d=s==="date_asc"?"ASC":"DESC",l=c?"":`ORDER BY o.created_at_epoch ${d}, o.id ${d}`,O=_&&!c?"LIMIT ?":"",L=e.map(()=>"?").join(","),I=[...e],f=[];if(E.length>0){let T=x("o",E,{includeMerged:!0});f.push(T.sql),I.push(...T.params)}if(n&&(f.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),I.push(b(n))),i)if(Array.isArray(i)){let T=i.map(()=>"?").join(",");f.push(`o.type IN (${T})`),I.push(...i)}else f.push("o.type = ?"),I.push(i);if(o){let T=Array.isArray(o)?o:[o],S=T.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE value = ?)");I.push(...T),f.push(`(${S.join(" OR ")})`)}if(a){let T=Array.isArray(a)?a:[a],S=T.map(()=>"(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE value LIKE ? ESCAPE '\\') OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE value LIKE ? ESCAPE '\\'))");T.forEach(D=>{let v=D.replace(/[\\%_]/g,"\\$&");I.push(`%${v}%`,`%${v}%`)}),f.push(`(${S.join(" OR ")})`)}let g=f.length>0?`WHERE o.id IN (${L}) AND ${f.join(" AND ")}`:`WHERE o.id IN (${L})`;O&&I.push(_);let N=this.db.prepare(`
1017
1017
  SELECT o.*
1018
1018
  FROM observations o
1019
1019
  LEFT JOIN sdk_sessions s ON s.memory_session_id = o.memory_session_id
@@ -1064,7 +1064,7 @@ ${L.stack??""}
1064
1064
  AND route_key = ?
1065
1065
  AND status = 'claimed'
1066
1066
  AND claimed_at_epoch <= ?
1067
- `).run(i,o,b(e),t,s,n,o-ts).changes===1}markTelegramWrapupSent({platformSource:e,contentSessionId:t,project:s,routeKey:n}){this.db.prepare(`
1067
+ `).run(i,o,b(e),t,s,n,o-ss).changes===1}markTelegramWrapupSent({platformSource:e,contentSessionId:t,project:s,routeKey:n}){this.db.prepare(`
1068
1068
  UPDATE telegram_wrapups
1069
1069
  SET status = 'sent', sent_at_epoch = ?
1070
1070
  WHERE platform_source = ?
@@ -1112,17 +1112,17 @@ ${L.stack??""}
1112
1112
  `).get(p,_,e);if(c){if(t&&this.db.prepare(`
1113
1113
  UPDATE sdk_sessions SET project = ?
1114
1114
  WHERE id = ? AND (project IS NULL OR project = '')
1115
- `).run(t,c.id),E&&E!==Be&&this.db.prepare(`
1115
+ `).run(t,c.id),E&&E!==Xe&&this.db.prepare(`
1116
1116
  UPDATE sdk_sessions SET user_prompt = ?
1117
1117
  WHERE id = ? AND (user_prompt IS NULL OR user_prompt = '' OR user_prompt = ?)
1118
- `).run(E,c.id,Be),n){let l=this.db.prepare("SELECT custom_title FROM sdk_sessions WHERE id = ?").get(c.id);l&&l.custom_title===null&&(this.db.prepare(`
1118
+ `).run(E,c.id,Xe),n){let l=this.db.prepare("SELECT custom_title FROM sdk_sessions WHERE id = ?").get(c.id);l&&l.custom_title===null&&(this.db.prepare(`
1119
1119
  UPDATE sdk_sessions SET custom_title = ?
1120
1120
  WHERE id = ? AND custom_title IS NULL
1121
1121
  `).run(n,c.id),this.enqueueSetTitleOp(e,_,n))}return c.id}let d=this.db.prepare(`
1122
1122
  INSERT INTO sdk_sessions
1123
1123
  (content_session_id, memory_session_id, project, platform_source, user_prompt, custom_title, started_at, started_at_epoch, status)
1124
1124
  VALUES (?, NULL, ?, ?, ?, ?, ?, ?, 'active')
1125
- `).run(e,t,_,E,n||null,o.toISOString(),a);return n&&this.enqueueSetTitleOp(e,_,n),Number(d.lastInsertRowid)}setSessionCwd(e,t,s){t.trim()&&this.db.prepare("UPDATE sdk_sessions SET cwd = ?, project_key_source = ? WHERE id = ? AND cwd IS NULL").run(t,s??null,e)}getSessionCwd(e){return this.db.prepare("SELECT cwd FROM sdk_sessions WHERE id = ?").get(e)?.cwd??null}enqueueSetTitleOp(e,t,s){let n=this.validateSetTitleMutation(e,t,s);this.enqueueMutationOp("1",n)}validateSetTitleMutation(e,t,s){let n={op:"set_title",target:{content_session_id:e,platform_source:t},fields:{custom_title:s}};return Ke(n),n}saveUserPrompt(e,t,s,n,i,o){let a=new Date,_=a.getTime(),E=ne(s),c=this.resolvePromptSessionDbId(e,n);return this.db.prepare(`
1125
+ `).run(e,t,_,E,n||null,o.toISOString(),a);return n&&this.enqueueSetTitleOp(e,_,n),Number(d.lastInsertRowid)}setSessionCwd(e,t,s){t.trim()&&this.db.prepare("UPDATE sdk_sessions SET cwd = ?, project_key_source = ? WHERE id = ? AND cwd IS NULL").run(t,s??null,e)}getSessionCwd(e){return this.db.prepare("SELECT cwd FROM sdk_sessions WHERE id = ?").get(e)?.cwd??null}enqueueSetTitleOp(e,t,s){let n=this.validateSetTitleMutation(e,t,s);this.enqueueMutationOp("1",n)}validateSetTitleMutation(e,t,s){let n={op:"set_title",target:{content_session_id:e,platform_source:t},fields:{custom_title:s}};return Ye(n),n}saveUserPrompt(e,t,s,n,i,o){let a=new Date,_=a.getTime(),E=ne(s),c=this.resolvePromptSessionDbId(e,n);return this.db.prepare(`
1126
1126
  INSERT INTO user_prompts
1127
1127
  (session_db_id, content_session_id, prompt_number, prompt_text, created_at, created_at_epoch, native_prompt_id, native_prompt_hash)
1128
1128
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
@@ -1137,12 +1137,12 @@ ${L.stack??""}
1137
1137
  FROM user_prompts
1138
1138
  WHERE content_session_id = ? AND prompt_number = ?
1139
1139
  LIMIT 1
1140
- `).get(e,t)?.prompt_text??null}dedupConfig(){let e=Y.loadFromFile(_e),t=(n,i)=>{let o=Number(e[n]);return Number.isFinite(o)?o:i},s=(n,i)=>Math.trunc(t(n,i));return{enabled:e.CLAUDE_MEM_DEDUP_ENABLED==="true",cosineThreshold:t("CLAUDE_MEM_DEDUP_COSINE_THRESHOLD",.8),idfVetoDf:s("CLAUDE_MEM_DEDUP_IDF_VETO_DF",10),minSharedTokens:s("CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS",2),maxScan:s("CLAUDE_MEM_DEDUP_MAX_SCAN",2e3),maxBackfillRows:s("CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS",5e4),minProjectDocs:s("CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS",10)}}listDedupCandidates(e,t=100){let s="SELECT c.id, c.project, c.method, c.score, c.status, c.created_at_epoch, c.observation_id, o1.title AS observation_title, c.duplicate_of_id, o2.title AS duplicate_of_title FROM observation_dedup_candidates c JOIN observations o1 ON o1.id = c.observation_id JOIN observations o2 ON o2.id = c.duplicate_of_id ",n="ORDER BY c.score DESC, c.id DESC LIMIT ?";return e?this.db.prepare(`${s}WHERE c.project = ? ${n}`).all(e,t):this.db.prepare(`${s}${n}`).all(t)}isDedupEnabled(){return this.dedupConfig().enabled}runDedupScan(){return Gt(this.db,this.dedupConfig())}maintainDedupOnInsert(e,t,s,n){Pt(this.db,e,s),Xt(this.db,e,n.minProjectDocs)&&Ht(this.db,e,t,s,n)}storeObservation(e,t,s,n,i=0,o,a){if(!ve(s.title))throw new Error("storeObservation requires a non-empty title");let _=this.storeObservations(e,t,[s],null,n,i,o,a);return{id:_.observationIds[0],createdAtEpoch:_.createdAtEpoch,mergedIntoExisting:_.mergedIntoExisting[0]??!1}}storeSummary(e,t,s,n,i=0,o){let a=o??Date.now(),_=new Date(a).toISOString(),c=this.db.prepare(`
1140
+ `).get(e,t)?.prompt_text??null}dedupConfig(){let e=Y.loadFromFile(_e),t=(n,i)=>{let o=Number(e[n]);return Number.isFinite(o)?o:i},s=(n,i)=>Math.trunc(t(n,i));return{enabled:e.CLAUDE_MEM_DEDUP_ENABLED==="true",cosineThreshold:t("CLAUDE_MEM_DEDUP_COSINE_THRESHOLD",.8),idfVetoDf:s("CLAUDE_MEM_DEDUP_IDF_VETO_DF",10),minSharedTokens:s("CLAUDE_MEM_DEDUP_MIN_SHARED_TOKENS",2),maxScan:s("CLAUDE_MEM_DEDUP_MAX_SCAN",2e3),maxBackfillRows:s("CLAUDE_MEM_DEDUP_MAX_BACKFILL_ROWS",5e4),minProjectDocs:s("CLAUDE_MEM_DEDUP_MIN_PROJECT_DOCS",10)}}listDedupCandidates(e,t=100){let s="SELECT c.id, c.project, c.method, c.score, c.status, c.created_at_epoch, c.observation_id, o1.title AS observation_title, c.duplicate_of_id, o2.title AS duplicate_of_title FROM observation_dedup_candidates c JOIN observations o1 ON o1.id = c.observation_id JOIN observations o2 ON o2.id = c.duplicate_of_id ",n="ORDER BY c.score DESC, c.id DESC LIMIT ?";return e?this.db.prepare(`${s}WHERE c.project = ? ${n}`).all(e,t):this.db.prepare(`${s}${n}`).all(t)}isDedupEnabled(){return this.dedupConfig().enabled}runDedupScan(){return Ht(this.db,this.dedupConfig())}maintainDedupOnInsert(e,t,s,n){xt(this.db,e,s),Gt(this.db,e,n.minProjectDocs)&&jt(this.db,e,t,s,n)}storeObservation(e,t,s,n,i=0,o,a){if(!ve(s.title))throw new Error("storeObservation requires a non-empty title");let _=this.storeObservations(e,t,[s],null,n,i,o,a);return{id:_.observationIds[0],createdAtEpoch:_.createdAtEpoch,mergedIntoExisting:_.mergedIntoExisting[0]??!1}}storeSummary(e,t,s,n,i=0,o){let a=o??Date.now(),_=new Date(a).toISOString(),c=this.db.prepare(`
1141
1141
  INSERT INTO session_summaries
1142
1142
  (memory_session_id, project, request, investigated, learned, completed,
1143
1143
  next_steps, files_read, files_edited, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
1144
1144
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1145
- `).run(e,t,s.request,s.investigated,s.learned,s.completed,s.next_steps,JSON.stringify(s.files_read??[]),JSON.stringify(s.files_edited??[]),s.notes,n||null,i,_,a);return $({projects:[t]},"storeSummary"),{id:Number(c.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,i,o=0,a,_){let E=a??Date.now(),c=new Date(E).toISOString(),d=Et(E),l=new Date(E),O=this.dedupConfig(),L=b(this.db.prepare("SELECT platform_source FROM sdk_sessions WHERE memory_session_id = ? LIMIT 1").get(e)?.platform_source),f=this.db.transaction(()=>{let g=[],m=[],N=[],A=this.db.prepare(`
1145
+ `).run(e,t,s.request,s.investigated,s.learned,s.completed,s.next_steps,JSON.stringify(s.files_read??[]),JSON.stringify(s.files_edited??[]),s.notes,n||null,i,_,a);return $({projects:[t]},"storeSummary"),{id:Number(c.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,t,s,n,i,o=0,a,_){let E=a??Date.now(),c=new Date(E).toISOString(),d=dt(E),l=new Date(E),O=this.dedupConfig(),L=b(this.db.prepare("SELECT platform_source FROM sdk_sessions WHERE memory_session_id = ? LIMIT 1").get(e)?.platform_source),f=this.db.transaction(()=>{let g=[],m=[],N=[],A=this.db.prepare(`
1146
1146
  INSERT INTO observations
1147
1147
  (memory_session_id, project, type, title, subtitle, facts, narrative, concepts,
1148
1148
  files_read, files_modified, prompt_number, discovery_tokens, agent_type, agent_id, content_hash, created_at, created_at_epoch,
@@ -1150,19 +1150,19 @@ ${L.stack??""}
1150
1150
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1151
1151
  ON CONFLICT(memory_session_id, content_hash) DO NOTHING
1152
1152
  RETURNING id
1153
- `),y=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let S of s){if(!ve(S.title)){u.debug("DB","Skipping observation with empty title");continue}let D=it(e,S.title,S.narrative),v=xe(t,L,S.title,pe(S.agent_id,S.agent_type));if(O.enabled){let be=y.get(e,D);if(be){ce(this.db,be.id,l),g.push(be.id),m.push(!1);continue}let oe=wt(this.db,t,v);if(oe){this.db.prepare("UPDATE observations SET occurrence_count = occurrence_count + 1 WHERE id = ?").run(oe.id),ce(this.db,oe.id,l),g.push(oe.id),m.push(!0);continue}}let q=A.get(e,t,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.files_read),JSON.stringify(S.files_modified),i||null,o,S.agent_type??null,S.agent_id??null,D,c,E,_||null,S.metadata??null,v,d.dates,d.lastReinforced);if(q){O.enabled&&this.maintainDedupOnInsert(t,q.id,S.title,O),g.push(q.id),m.push(!1),N.push(q.id);continue}let J=y.get(e,D);if(!J)throw new Error(`storeObservations: ON CONFLICT without existing row for content_hash=${D}`);ce(this.db,J.id,l),g.push(J.id),m.push(!1)}let T=null;if(n){let S=ss(s),D=n.files_read??S.files_read,v=n.files_edited??S.files_edited,J=this.db.prepare(`
1153
+ `),y=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let S of s){if(!ve(S.title)){u.debug("DB","Skipping observation with empty title");continue}let D=at(e,S.title,S.narrative),v=ke(t,L,S.title,pe(S.agent_id,S.agent_type));if(O.enabled){let be=y.get(e,D);if(be){ce(this.db,be.id,l),g.push(be.id),m.push(!1);continue}let oe=Pt(this.db,t,v);if(oe){this.db.prepare("UPDATE observations SET occurrence_count = occurrence_count + 1 WHERE id = ?").run(oe.id),ce(this.db,oe.id,l),g.push(oe.id),m.push(!0);continue}}let q=A.get(e,t,S.type,S.title,S.subtitle,JSON.stringify(S.facts),S.narrative,JSON.stringify(S.concepts),JSON.stringify(S.files_read),JSON.stringify(S.files_modified),i||null,o,S.agent_type??null,S.agent_id??null,D,c,E,_||null,S.metadata??null,v,d.dates,d.lastReinforced);if(q){O.enabled&&this.maintainDedupOnInsert(t,q.id,S.title,O),g.push(q.id),m.push(!1),N.push(q.id);continue}let J=y.get(e,D);if(!J)throw new Error(`storeObservations: ON CONFLICT without existing row for content_hash=${D}`);ce(this.db,J.id,l),g.push(J.id),m.push(!1)}let T=null;if(n){let S=ns(s),D=n.files_read??S.files_read,v=n.files_edited??S.files_edited,J=this.db.prepare(`
1154
1154
  INSERT INTO session_summaries
1155
1155
  (memory_session_id, project, request, investigated, learned, completed,
1156
1156
  next_steps, files_read, files_edited, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
1157
1157
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1158
- `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,JSON.stringify(D),JSON.stringify(v),n.notes,i||null,o,c,E);T=Number(J.lastInsertRowid)}return{observationIds:g,mergedIntoExisting:m,insertedObservationIds:N,summaryId:T,createdAtEpoch:E}})();return $({projects:[t]},"storeObservations"),f}updateDiscoveryTokens(e,t,s){e.length===0&&t===null||this.db.transaction(()=>{let n=this.db.prepare("UPDATE observations SET discovery_tokens = ? WHERE id = ?");for(let i of e)n.run(s,i);t!==null&&this.db.prepare("UPDATE session_summaries SET discovery_tokens = ? WHERE id = ?").run(s,t)})()}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n}=t,i=Ye(t.limit),o=w(t),a=s==="relevance",_=a?"":`ORDER BY ss.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,E=i&&!a?"LIMIT ?":"",c=e.map(()=>"?").join(","),d=[...e],l=[];if(o.length>0){let m=x("ss",o,{includeMerged:!0});l.push(m.sql),d.push(...m.params)}n&&(l.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),d.push(b(n)));let O=l.length>0?`AND ${l.join(" AND ")}`:"";E&&d.push(i);let I=this.db.prepare(`
1158
+ `).run(e,t,n.request,n.investigated,n.learned,n.completed,n.next_steps,JSON.stringify(D),JSON.stringify(v),n.notes,i||null,o,c,E);T=Number(J.lastInsertRowid)}return{observationIds:g,mergedIntoExisting:m,insertedObservationIds:N,summaryId:T,createdAtEpoch:E}})();return $({projects:[t]},"storeObservations"),f}updateDiscoveryTokens(e,t,s){e.length===0&&t===null||this.db.transaction(()=>{let n=this.db.prepare("UPDATE observations SET discovery_tokens = ? WHERE id = ?");for(let i of e)n.run(s,i);t!==null&&this.db.prepare("UPDATE session_summaries SET discovery_tokens = ? WHERE id = ?").run(s,t)})()}getSessionSummariesByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n}=t,i=Ve(t.limit),o=w(t),a=s==="relevance",_=a?"":`ORDER BY ss.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,E=i&&!a?"LIMIT ?":"",c=e.map(()=>"?").join(","),d=[...e],l=[];if(o.length>0){let m=x("ss",o,{includeMerged:!0});l.push(m.sql),d.push(...m.params)}n&&(l.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),d.push(b(n)));let O=l.length>0?`AND ${l.join(" AND ")}`:"";E&&d.push(i);let I=this.db.prepare(`
1159
1159
  SELECT ss.*
1160
1160
  FROM session_summaries ss
1161
1161
  LEFT JOIN sdk_sessions s ON s.memory_session_id = ss.memory_session_id
1162
1162
  WHERE ss.id IN (${c}) ${O}
1163
1163
  ${_}
1164
1164
  ${E}
1165
- `).all(...d);if(!a)return I;let f=new Map(I.map(m=>[m.id,m])),g=e.map(m=>f.get(m)).filter(m=>!!m);return i?g.slice(0,i):g}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n}=t,i=Ye(t.limit),o=w(t),a=s==="relevance",_=a?"":`ORDER BY up.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,E=i&&!a?"LIMIT ?":"",c=e.map(()=>"?").join(","),d=[...e],l=[];if(o.length>0){let m=x("s",o,{includeMerged:!1});l.push(m.sql),d.push(...m.params)}n&&(l.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),d.push(b(n)));let O=l.length>0?`AND ${l.join(" AND ")}`:"";E&&d.push(i);let I=this.db.prepare(`
1165
+ `).all(...d);if(!a)return I;let f=new Map(I.map(m=>[m.id,m])),g=e.map(m=>f.get(m)).filter(m=>!!m);return i?g.slice(0,i):g}getUserPromptsByIds(e,t={}){if(e.length===0)return[];let{orderBy:s="date_desc",platformSource:n}=t,i=Ve(t.limit),o=w(t),a=s==="relevance",_=a?"":`ORDER BY up.created_at_epoch ${s==="date_asc"?"ASC":"DESC"}`,E=i&&!a?"LIMIT ?":"",c=e.map(()=>"?").join(","),d=[...e],l=[];if(o.length>0){let m=x("s",o,{includeMerged:!1});l.push(m.sql),d.push(...m.params)}n&&(l.push(`COALESCE(NULLIF(s.platform_source, ''), '${p}') = ?`),d.push(b(n)));let O=l.length>0?`AND ${l.join(" AND ")}`:"";E&&d.push(i);let I=this.db.prepare(`
1166
1166
  SELECT
1167
1167
  up.*,
1168
1168
  s.project,