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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +3 -1
- package/dist/bug-report/index.js +66 -66
- package/dist/npx-cli/index.js +278 -278
- package/dist/opencode-plugin/index.js +45 -43
- package/dsh/package.json +1 -1
- package/openclaw/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/hooks/codex-hooks.json +1 -1
- package/plugin/hooks/hooks.json +1 -1
- package/plugin/package.json +1 -1
- package/plugin/scripts/context-generator.cjs +14 -14
- package/plugin/scripts/context-generator.cjs.map +1 -1
- package/plugin/scripts/mcp-server.cjs +102 -58
- package/plugin/scripts/mcp-server.cjs.map +3 -3
- package/plugin/scripts/server-service.cjs +6 -6
- package/plugin/scripts/server-service.cjs.map +1 -1
- package/plugin/scripts/transcript-watcher.cjs +22 -22
- package/plugin/scripts/transcript-watcher.cjs.map +3 -3
- package/plugin/scripts/worker-service.cjs +515 -480
- package/plugin/scripts/worker-service.cjs.map +3 -3
- package/plugin/skills/mem-search/SKILL.md +81 -128
- package/plugin/sqlite/SessionStore.js +42 -42
- package/plugin/sqlite/SessionStore.js.map +3 -3
|
@@ -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
|
|
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}
|
|
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),!
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 = ${
|
|
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
|
-
`,
|
|
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(`[${
|
|
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=>
|
|
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?
|
|
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?
|
|
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
|
|
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(
|
|
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
|
|
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=
|
|
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(){
|
|
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(
|
|
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")}
|
|
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=
|
|
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
|
|
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=
|
|
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
|
|
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
|
|
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-
|
|
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!==
|
|
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,
|
|
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
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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,
|