Files
thedotmack__claude-mem/plugin/scripts/context-generator.cjs
Alex Newman 9841dd4120 chore: bump version to 13.24.11 (#4004)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Alex Newman <thedotmack@users.noreply.github.com>
2026-09-10 22:25:56 -07:00

81 lines
43 KiB
JavaScript

"use strict";var Bt=Object.create;var P=Object.defineProperty;var Kt=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var Xt=Object.getPrototypeOf,Vt=Object.prototype.hasOwnProperty;var Jt=(t,e)=>{for(var r in e)P(t,r,{get:e[r],enumerable:!0})},me=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Yt(e))!Vt.call(t,o)&&o!==r&&P(t,o,{get:()=>e[o],enumerable:!(n=Kt(e,o))||n.enumerable});return t};var I=(t,e,r)=>(r=t!=null?Bt(Xt(t)):{},me(e||!t||!t.__esModule?P(r,"default",{value:t,enumerable:!0}):r,t)),qt=t=>me(P({},"__esModule",{value:!0}),t);var jr={};Jt(jr,{generateContext:()=>Gt,generateContextWithStats:()=>ce});module.exports=qt(jr);var wt=I(require("path"),1),kt=require("os"),q=require("fs"),Pt=require("bun:sqlite");var g=require("path"),z=require("os"),b=require("fs"),fe=require("url");var m=require("fs"),ge=require("crypto"),A=require("path");var zt=null;function Qt(t){return(zt??process.stderr.write.bind(process.stderr))(t)}function h(t){Qt(t)}var Zt=process.platform==="win32";function er(t){return t.replace(/^\uFEFF/,"")}function y(t){return JSON.parse(er(t))}function tr(t){(0,m.existsSync)(t)||(0,m.mkdirSync)(t,{recursive:!0})}function H(t,e){let r=t;try{if((0,m.lstatSync)(t).isSymbolicLink())try{r=(0,m.realpathSync)(t)}catch(c){let E=c instanceof Error?c:new Error(String(c));h(`claude-mem: realpathSync failed for ${t}, resolving symlink manually: ${E.message}
`);let d=(0,m.readlinkSync)(t);r=(0,A.resolve)((0,A.dirname)(t),d)}}catch(c){let E=c.code;if(E!=="ENOENT"&&E!=="ENOTDIR")throw c}tr((0,A.dirname)(r));let n=(0,A.dirname)(r),o=(0,A.basename)(r),s=(0,A.join)(n,`.${o}.${process.pid}.${(0,ge.randomBytes)(6).toString("hex")}.tmp`),l=Buffer.from(JSON.stringify(e,null,2)+`
`,"utf-8"),u;try{u=(0,m.statSync)(r).mode&511}catch{}let a;try{a=u!==void 0?(0,m.openSync)(s,"w",u):(0,m.openSync)(s,"w");let c=0;for(;c<l.length;){let E=(0,m.writeSync)(a,l,c,l.length-c);if(E===0)throw new Error(`writeSync stalled at ${c}/${l.length} bytes`);c+=E}if((0,m.fsyncSync)(a),(0,m.closeSync)(a),a=void 0,(0,m.renameSync)(s,r),!Zt){let E;try{E=(0,m.openSync)(n,"r"),(0,m.fsyncSync)(E)}catch(d){let p=d instanceof Error?d:new Error(String(d));h(`claude-mem: directory fsync failed for ${n}: ${p.message}
`)}finally{if(E!==void 0)try{(0,m.closeSync)(E)}catch{}}}}catch(c){if(a!==void 0)try{(0,m.closeSync)(a)}catch{}try{(0,m.unlinkSync)(s)}catch{}throw c}}var de=require("os"),pe=require("path");function L(t,e=process.platform,r=(0,de.homedir)()){return typeof t!="string"||t.length===0?t:t==="~"?r:t.startsWith("~/")||e==="win32"&&t.startsWith("~\\")?(0,pe.join)(r,t.slice(2)):t}var lr={};function rr(){return typeof __dirname<"u"?__dirname:(0,g.dirname)((0,fe.fileURLToPath)(lr.url))}var nr=rr();function or(){if(process.env.CLAUDE_MEM_DATA_DIR)return L(process.env.CLAUDE_MEM_DATA_DIR);let t=(0,g.join)((0,z.homedir)(),".claude-mem"),e=(0,g.join)(t,"settings.json");try{if((0,b.existsSync)(e)){let r=y((0,b.readFileSync)(e,"utf-8")),n=r.env??r;if(n.CLAUDE_MEM_DATA_DIR)return L(n.CLAUDE_MEM_DATA_DIR)}}catch{}return t}var f=or(),sr=(0,g.join)((0,z.homedir)(),".claude"),Q=process.env.CLAUDE_CONFIG_DIR||sr,Zr=(0,g.join)(Q,"plugins","marketplaces","thedotmack"),ir=(0,g.join)(f,"logs"),Me=(0,g.join)(f,"settings.json"),Se="claude-mem.db";var Z=(0,g.join)(f,Se),ar=(0,g.join)(f,"observer-sessions"),en=(0,g.basename)(ar);function Ae(){return(0,g.join)(nr,"..")}var T={dataDir:()=>f,workerPid:()=>(0,g.join)(f,"worker.pid"),serverPid:()=>(0,g.join)(f,".server-beta.pid"),serverPort:()=>(0,g.join)(f,".server-beta.port"),serverRuntime:()=>(0,g.join)(f,".server-beta.runtime.json"),settings:()=>(0,g.join)(f,"settings.json"),database:()=>(0,g.join)(f,Se),chroma:()=>(0,g.join)(f,"chroma"),combinedCerts:()=>(0,g.join)(f,"combined_certs.pem"),transcriptsConfig:()=>(0,g.join)(f,"transcript-watch.json"),transcriptsState:()=>(0,g.join)(f,"transcript-watch-state.json"),corpora:()=>(0,g.join)(f,"corpora"),supervisorRegistry:()=>(0,g.join)(f,"supervisor.json"),envFile:()=>(0,g.join)(f,".env"),logsDir:()=>ir};var O=require("fs"),Ce=require("path");var te=(s=>(s[s.DEBUG=0]="DEBUG",s[s.INFO=1]="INFO",s[s.WARN=2]="WARN",s[s.ERROR=3]="ERROR",s[s.SILENT=4]="SILENT",s))(te||{}),ee=null,re=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=T.logsDir();(0,O.existsSync)(e)||(0,O.mkdirSync)(e,{recursive:!0});let r=new Date().toISOString().split("T")[0];this.logFilePath=(0,Ce.join)(e,`claude-mem-${r}.log`)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e instanceof Error?e.message:String(e)),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=T.settings();if((0,O.existsSync)(e)){let r=(0,O.readFileSync)(e,"utf-8"),o=(y(r).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=te[o]??1}else this.level=1}catch(e){console.error("[LOGGER] Failed to load log level from settings:",e instanceof Error?e.message:String(e)),this.level=1}return this.level}formatData(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return e.toString();if(typeof e=="object"){if(e instanceof Error)return this.getLevel()===0?`${e.message}
${e.stack}`:e.message;if(Array.isArray(e))return`[${e.length} items]`;let r=Object.keys(e);return r.length===0?"{}":r.length<=3?JSON.stringify(e):`{${r.length} keys: ${r.slice(0,3).join(", ")}...}`}return String(e)}formatTool(e,r){if(!r)return e;let n=r;if(typeof r=="string")try{n=JSON.parse(r)}catch{n=r}if(e==="Bash"&&n.command)return`${e}(${n.command})`;if(n.file_path)return`${e}(${n.file_path})`;if(n.notebook_path)return`${e}(${n.notebook_path})`;if(e==="Glob"&&n.pattern)return`${e}(${n.pattern})`;if(e==="Grep"&&n.pattern)return`${e}(${n.pattern})`;if(n.url)return`${e}(${n.url})`;if(n.query)return`${e}(${n.query})`;if(e==="Task"){if(n.subagent_type)return`${e}(${n.subagent_type})`;if(n.description)return`${e}(${n.description})`}return e==="Skill"&&n.skill?`${e}(${n.skill})`:e==="LSP"&&n.operation?`${e}(${n.operation})`:e}formatTimestamp(e){let r=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),l=String(e.getMinutes()).padStart(2,"0"),u=String(e.getSeconds()).padStart(2,"0"),a=String(e.getMilliseconds()).padStart(3,"0");return`${r}-${n}-${o} ${s}:${l}:${u}.${a}`}log(e,r,n,o,s){if(e<this.getLevel())return;this.ensureLogFileInitialized();let l=this.formatTimestamp(new Date),u=te[e].padEnd(5),a=r.padEnd(6),c="";o?.correlationId?c=`[${o.correlationId}] `:o?.sessionId&&(c=`[session-${o.sessionId}] `);let E="";if(s!=null)if(s instanceof Error)E=this.getLevel()===0?`
${s.message}
${s.stack}`:` ${s.message}`;else if(this.getLevel()===0&&typeof s=="object")try{E=`
`+JSON.stringify(s,null,2)}catch{E=" "+this.formatData(s)}else E=" "+this.formatData(s);let d="";if(o){let{sessionId:S,memorySessionId:C,correlationId:Ee,..._e}=o;Object.keys(_e).length>0&&(d=` {${Object.entries(_e).map(([Wt,jt])=>`${Wt}=${jt}`).join(", ")}}`)}let p=`[${l}] [${u}] [${a}] ${c}${n}${d}${E}`;if(this.logFilePath)try{(0,O.appendFileSync)(this.logFilePath,p+`
`,"utf8")}catch(S){let C=S instanceof Error?S:new Error(String(S));h(`[LOGGER] Failed to write to log file: ${C.message}
${C.stack??""}
`)}else h(p+`
`)}debug(e,r,n,o){this.log(0,e,r,n,o)}info(e,r,n,o){this.log(1,e,r,n,o)}warn(e,r,n,o){this.log(2,e,r,n,o)}setErrorSink(e){ee=e}error(e,r,n,o){this.log(3,e,r,n,o),this.routeErrorToSink(r,n,o)}routeErrorToSink(e,r,n){try{if(!ee||!(n instanceof Error))return;ee(n)}catch{}}dataIn(e,r,n,o){this.info(e,`\u2192 ${r}`,n,o)}dataOut(e,r,n,o){this.info(e,`\u2190 ${r}`,n,o)}success(e,r,n,o){this.info(e,`\u2713 ${r}`,n,o)}failure(e,r,n,o){this.error(e,`\u2717 ${r}`,n,o)}},_=new re;var Oe=I(require("path"),1),De=require("child_process");var F=require("fs"),R=I(require("path"),1);var U={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function Te(t){let e=R.default.join(t,".git"),r;try{r=(0,F.statSync)(e)}catch(E){return E instanceof Error&&E.code!=="ENOENT"&&_.warn("GIT","Unexpected error checking .git",{error:E instanceof Error?E.message:String(E)}),U}if(!r.isFile())return U;let n;try{n=(0,F.readFileSync)(e,"utf-8").trim()}catch(E){return _.warn("GIT","Failed to read .git file",{error:E instanceof Error?E.message:String(E)}),U}let o=n.match(/^gitdir:\s*(.+)$/);if(!o)return U;let l=R.default.resolve(R.default.dirname(e),o[1]).match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!l)return U;let u=l[1],a=R.default.basename(t),c=R.default.basename(u);return{isWorktree:!0,worktreeName:a,parentRepoPath:u,parentProjectName:c}}function Le(t){try{return(0,De.execFileSync)("git",["rev-parse","--show-toplevel"],{cwd:t,encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim()||null}catch(e){let r=e instanceof Error?e:new Error(String(e));return _.debug("PROJECT_NAME","git rev-parse failed, falling back to basename",{dir:t},r),null}}function ur(t,e=process.platform){if(!t||t.trim()==="")return _.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:t}),"unknown-project";let r=L(t,e),o=Le(r)??r,s=Oe.default.basename(o);if(s===""){if(process.platform==="win32"){let u=t.match(/^([A-Z]):\\/i);if(u){let c=`drive-${u[1].toUpperCase()}`;return _.info("PROJECT_NAME","Drive root detected",{cwd:t,projectName:c}),c}}return _.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:t}),"unknown-project"}return s}function he(t,e=process.platform){let r=ur(t,e);if(!t)return{primary:r,parent:null,isWorktree:!1,allProjects:[r]};let n=L(t,e),o=Te(Le(n)??n);if(o.isWorktree&&o.parentProjectName){let s=`${o.parentProjectName}/${r}`;return{primary:s,parent:o.parentProjectName,isWorktree:!0,allProjects:[o.parentProjectName,s]}}return{primary:r,parent:null,isWorktree:!1,allProjects:[r]}}var ye="claude";function cr(t){return t.trim().toLowerCase().replace(/\s+/g,"-")}function Re(t){if(!t)return ye;let e=cr(t);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:ye}var Er=require("bun:sqlite");var ve=5e3;var i={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},Ie=4,be=1;var G=require("fs"),oe=require("path"),N=require("os");var ne={HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5};function Ue(t){return process.platform==="win32"?Math.round(t*ne.WINDOWS_MULTIPLIER):t}var _r="security_alert",v=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-haiku-4-5-20251001",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_API_TIMEOUT_MS:String(Ue(ne.API_REQUEST)),CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"subscription",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-flash-latest",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_BASE_URL:"",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_DATA_DIR:(0,oe.join)((0,N.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_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_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_WELCOME_HINT_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,oe.join)((0,N.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_OBSERVER_MAX_CONVERSATION_CHARS:"400000",CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD:"3",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_FOLDER_MD_SKELETON_DENYLIST:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_TIER_FAST_MODEL:"haiku",CLAUDE_MEM_TIER_SMART_MODEL:"sonnet",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_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_MAX_PENDING_MUTATIONS:"5000",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,N.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_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_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_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_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:""};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return process.env[e]??this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS))process.env[n]!==void 0&&(r[n]=process.env[n]);return r}static loadFromFile(e,r=!0){try{if(!(0,G.existsSync)(e)){let c=this.getAllDefaults();try{H(e,c),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(E){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,E instanceof Error?E.message:String(E))}return r?this.applyEnvOverrides(c):c}let n=(0,G.readFileSync)(e,"utf-8"),o=y(n),s=o,l=o.env&&typeof o.env=="object"&&!Array.isArray(o.env),u=l&&Object.keys(o).some(c=>c!=="env");if(l&&(s=o.env,!u))try{H(e,s),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(c){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,c instanceof Error?c.message:String(c))}if(s.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===_r){s={...s,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{H(e,u?{...o,env:s}:s),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(c){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,c instanceof Error?c.message:String(c))}}let a={...this.DEFAULTS};for(let c of Object.keys(this.DEFAULTS))s[c]!==void 0&&(a[c]=s[c]);return r?this.applyEnvOverrides(a):a}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let o=this.getAllDefaults();return r?this.applyEnvOverrides(o):o}}};var W=require("fs"),x=require("path");var mr=/^[a-z0-9]+(?:-[a-z0-9]+)*(?:--[a-z0-9]+(?:-[a-z0-9]+)*)?$/,M=class t{static instance=null;activeMode=null;activeModeId=null;modeDirs;constructor(){let e=Ae(),r=[...process.env.CLAUDE_MEM_MODES_DIR?[process.env.CLAUDE_MEM_MODES_DIR]:[],(0,x.join)(T.dataDir(),"modes"),(0,x.join)(e,"modes"),(0,x.join)(e,"..","plugin","modes")];this.modeDirs=[...new Set(r)]}static getInstance(){return t.instance||(t.instance=new t),t.instance}parseInheritance(e){let r=e.split("--");if(r.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(r.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:r[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,r){let n={...e};for(let o in r){let s=r[o],l=e[o];this.isPlainObject(s)&&this.isPlainObject(l)?n[o]=this.deepMerge(l,s):n[o]=s}return n}loadModeFile(e){if(!mr.test(e))throw new Error(`Invalid mode ID: ${e}`);let r=this.modeDirs.map(o=>(0,x.join)(o,`${e}.json`)).find(o=>(0,W.existsSync)(o));if(!r)throw new Error(`Mode file not found: ${e}.json (searched: ${this.modeDirs.join(", ")})`);let n=(0,W.readFileSync)(r,"utf-8");return JSON.parse(n)}loadMode(e){let r=this.parseInheritance(e);if(!r.hasParent)try{let a=this.loadModeFile(e);return this.activeMode=a,this.activeModeId=e,_.debug("SYSTEM",`Loaded mode: ${a.name} (${e})`,void 0,{types:a.observation_types.map(c=>c.id),concepts:a.observation_concepts.map(c=>c.id)}),a}catch(a){if(a instanceof Error?_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:a.message}):_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(a)}),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:n,overrideId:o}=r,s;try{s=this.loadMode(n)}catch(a){a instanceof Error?_.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{message:a.message}):_.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{error:String(a)}),s=this.loadMode("code")}let l;try{l=this.loadModeFile(o),_.debug("SYSTEM",`Loaded override file: ${o} for parent ${n}`)}catch(a){return a instanceof Error?_.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{message:a.message}):_.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{error:String(a)}),this.activeMode=s,s}if(!l)return _.warn("SYSTEM",`Invalid override file: ${o}, using parent mode '${n}' only`),this.activeMode=s,s;let u=this.deepMerge(s,l);return this.activeMode=u,this.activeModeId=e,_.debug("SYSTEM",`Loaded mode with inheritance: ${u.name} (${e} = ${n} + ${o})`,void 0,{parent:n,override:o,types:u.observation_types.map(a=>a.id),concepts:u.observation_concepts.map(a=>a.id)}),u}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getActiveModeId(){if(!this.activeModeId)throw new Error("No mode loaded. Call loadMode() first.");return this.activeModeId}getObservationTypes(){return this.getActiveMode().observation_types}getTypeIcon(e){return this.getObservationTypes().find(n=>n.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(n=>n.id===e)?.work_emoji||"\u{1F4DD}"}};function Ne(){let t=T.settings(),e=v.loadFromFile(t),r=M.getInstance().getActiveMode(),n=new Set(r.observation_types.map(s=>s.id)),o=new Set(r.observation_concepts.map(s=>s.id));return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:n,observationConcepts:o,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}function gr(t,e){return t.fullObservationCount>0?{config:{...t,fullObservationCount:0},observationCount:e}:t.showLastSummary?{config:{...t,showLastSummary:!1},observationCount:e}:t.sessionCount>0?{config:{...t,sessionCount:Math.floor(t.sessionCount/2)},observationCount:e}:e>1?{config:t,observationCount:Math.floor(e/2)}:null}function xe(t,e,r,n=1e4){let o=e,s=t.length,l=r(t,o),u=0;for(;l.length>n;){let a=gr(o,s);if(!a)return{text:l,config:o,observationCount:s,reductions:u,overBudget:!0};o=a.config,s=a.observationCount,l=r(t.slice(0,s),o),u++}return{text:l,config:o,observationCount:s,reductions:u,overBudget:!1}}function $e(t){let e=(t.title?.length||0)+(t.subtitle?.length||0)+(t.narrative?.length||0)+JSON.stringify(t.facts||[]).length;return Math.ceil(e/Ie)}function se(t){let e=t.length,r=t.reduce((l,u)=>l+$e(u),0),n=t.reduce((l,u)=>l+(u.discovery_tokens||0),0),o=n-r,s=n>0?Math.round(o/n*100):0;return{totalObservations:e,totalReadTokens:r,totalDiscoveryTokens:n,savings:o,savingsPercent:s}}function dr(t){return M.getInstance().getWorkEmoji(t)}function $(t,e){let r=$e(t),n=t.discovery_tokens||0,o=dr(t.type),s=n>0?`${o} ${n.toLocaleString()}`:"-";return{readTokens:r,discoveryTokens:n,discoveryDisplay:s,workEmoji:o}}function j(t){return t.showReadTokens||t.showWorkTokens||t.showSavingsAmount||t.showSavingsPercent}var ke=I(require("path"),1),B=require("fs");var pr=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],xn=new RegExp(`<(${pr.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),we=/<system-reminder>[\s\S]*?<\/system-reminder>/g;var fr=["task-notification"],$n=new RegExp(`^\\s*<(${fr.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),wn=256*1024;function Pe(t,e,r,n){let o=Array.from(r.observationTypes),s=o.map(()=>"?").join(","),l=Array.from(r.observationConcepts),u=l.map(()=>"?").join(","),a=e.map(()=>"?").join(",");return t.db.prepare(`
SELECT
o.id,
o.memory_session_id,
COALESCE(s.platform_source, 'claude') as platform_source,
o.type,
o.title,
o.subtitle,
o.narrative,
o.facts,
o.concepts,
o.files_read,
o.files_modified,
o.discovery_tokens,
o.created_at,
o.created_at_epoch,
o.project
FROM observations o
LEFT JOIN sdk_sessions s ON o.memory_session_id = s.memory_session_id
WHERE (o.project IN (${a})
OR o.merged_into_project IN (${a}))
AND (? IS NULL OR s.platform_source = ?)
AND type IN (${s})
AND EXISTS (
SELECT 1 FROM json_each(o.concepts)
WHERE value IN (${u})
)
ORDER BY o.created_at_epoch DESC
LIMIT ?
`).all(...e,...e,n??null,n??null,...o,...l,r.totalObservationCount)}function He(t,e,r,n){let o=e.map(()=>"?").join(",");return t.db.prepare(`
SELECT
ss.id,
ss.memory_session_id,
COALESCE(s.platform_source, 'claude') as platform_source,
ss.request,
ss.investigated,
ss.learned,
ss.completed,
ss.next_steps,
ss.created_at,
ss.created_at_epoch,
ss.project
FROM session_summaries ss
LEFT JOIN sdk_sessions s ON ss.memory_session_id = s.memory_session_id
WHERE (ss.project IN (${o})
OR ss.merged_into_project IN (${o}))
AND (? IS NULL OR s.platform_source = ?)
ORDER BY ss.created_at_epoch DESC
LIMIT ?
`).all(...e,...e,n??null,n??null,r.sessionCount+be)}function Mr(t){return t.replace(/[/.]/g,"-")}function Sr(t){if(!t.includes('"type":"assistant"'))return null;let e=JSON.parse(t);if(e.type==="assistant"&&e.message?.content&&Array.isArray(e.message.content)){let r="";for(let n of e.message.content)n.type==="text"&&(r+=n.text);if(r=r.replace(we,"").trim(),r)return r}return null}function Ar(t){for(let e=t.length-1;e>=0;e--)try{let r=Sr(t[e]);if(r)return r}catch(r){r instanceof Error?_.debug("WORKER","Skipping malformed transcript line",{lineIndex:e},r):_.debug("WORKER","Skipping malformed transcript line",{lineIndex:e,error:String(r)});continue}return""}function Cr(t){try{if(!(0,B.existsSync)(t))return{assistantMessage:""};let e=(0,B.readFileSync)(t,"utf-8").trim();if(!e)return{assistantMessage:""};let r=e.split(`
`).filter(o=>o.trim());return{assistantMessage:Ar(r)}}catch(e){return e instanceof Error?_.failure("WORKER","Failed to extract prior messages from transcript",{transcriptPath:t},e):_.warn("WORKER","Failed to extract prior messages from transcript",{transcriptPath:t,error:String(e)}),{assistantMessage:""}}}function Fe(t,e,r,n){if(!e.showLastMessage||t.length===0)return{assistantMessage:""};let o=t.find(a=>a.memory_session_id!==r);if(!o)return{assistantMessage:""};let s=o.memory_session_id,l=Mr(n),u=ke.default.join(Q,"projects",l,`${s}.jsonl`);return Cr(u)}function Ge(t,e){let r=e[0]?.id;return t.map((n,o)=>{let s=o===0?null:e[o+1];return{...n,displayEpoch:s?s.created_at_epoch:n.created_at_epoch,displayTime:s?s.created_at:n.created_at,shouldShowLink:n.id!==r}})}function We(t,e){let r=[...t.map(n=>({type:"observation",data:n})),...e.map(n=>({type:"summary",data:n}))];return r.sort((n,o)=>{let s=n.type==="observation"?n.data.created_at_epoch:n.data.displayEpoch,l=o.type==="observation"?o.data.created_at_epoch:o.data.displayEpoch;return s-l}),r}function je(t,e){return new Set(t.slice(0,e).map(r=>r.id))}function Be(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function Ke(){let t=M.getInstance();return`${t.getActiveMode().name} (${t.getActiveModeId()})`}function Ye(t){return[`# [${t}] recent context, ${Be()}`,`Mode: ${Ke()}`,""]}function Xe(){return[`Legend: \u{1F3AF}session ${M.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji}${r.id}`).join(" ")}`,"Format: ID TIME TYPE TITLE","Fetch details: get_observations([IDs]) | Search: mem-search skill",""]}function Ve(t,e){let r=[],n=[`${t.totalObservations} obs (${t.totalReadTokens.toLocaleString()}t read)`,`${t.totalDiscoveryTokens.toLocaleString()}t work`];return t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)&&(e.showSavingsPercent?n.push(`${t.savingsPercent}% savings`):e.showSavingsAmount&&n.push(`${t.savings.toLocaleString()}t saved`)),r.push(`Stats: ${n.join(" | ")}`),r.push(""),r}function Je(t){return[`### ${t}`]}function qe(t){return t.toLowerCase().replace(" am","a").replace(" pm","p")}function ze(t,e,r){let n=t.title||"Untitled",o=M.getInstance().getTypeIcon(t.type),s=e?qe(e):'"';return`${t.id} ${s} ${o} ${n}`}function Qe(t,e,r,n){let o=[],s=t.title||"Untitled",l=M.getInstance().getTypeIcon(t.type),u=e?qe(e):'"',{readTokens:a,discoveryDisplay:c}=$(t,n);o.push(`**${t.id}** ${u} ${l} **${s}**`),r&&o.push(r);let E=[];return n.showReadTokens&&E.push(`~${a}t`),n.showWorkTokens&&E.push(c),E.length>0&&o.push(E.join(" ")),o.push(""),o}function Ze(t,e){return[`S${t.id} ${t.request||"Session started"} (${e})`]}function w(t,e){return e?[`**${t}**: ${e}`,""]:[]}function et(t){return t.assistantMessage?["","---","","**Previously**","",`A: ${t.assistantMessage}`,""]:[]}function tt(t,e){return["",`Access ${Math.round(t/1e3)}k tokens of past work via get_observations([IDs]) or mem-search skill.`]}function rt(t){return`# [${t}] recent context, ${Be()}
Mode: ${Ke()}
No previous sessions found.`}function nt(){let t=new Date,e=t.toLocaleDateString("en-CA"),r=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).toLowerCase().replace(" ",""),n=t.toLocaleTimeString("en-US",{timeZoneName:"short"}).split(" ").pop();return`${e} ${r} ${n}`}function ot(){let t=M.getInstance();return`${t.getActiveMode().name} (${t.getActiveModeId()})`}function st(t){return["",`${i.bright}${i.cyan}[${t}] recent context, ${nt()}${i.reset}`,`${i.dim}Mode: ${ot()}${i.reset}`,`${i.gray}${"\u2500".repeat(60)}${i.reset}`,""]}function it(){let e=M.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ");return[`${i.dim}Legend: session-request | ${e}${i.reset}`,""]}function at(){return[`${i.bright}Column Key${i.reset}`,`${i.dim} Read: Tokens to read this observation (cost to learn it now)${i.reset}`,`${i.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${i.reset}`,""]}function lt(){return[`${i.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${i.reset}`,"",`${i.dim}When you need implementation details, rationale, or debugging context:${i.reset}`,`${i.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${i.reset}`,`${i.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${i.reset}`,`${i.dim} - Trust this index over re-reading code for past decisions and learnings${i.reset}`,""]}function ut(t,e){let r=[];if(r.push(`${i.bright}${i.cyan}Context Economics${i.reset}`),r.push(`${i.dim} Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)${i.reset}`),r.push(`${i.dim} Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${i.reset}`),t.totalDiscoveryTokens>0&&(e.showSavingsAmount||e.showSavingsPercent)){let n=" Your savings: ";e.showSavingsAmount&&e.showSavingsPercent?n+=`${t.savings.toLocaleString()} tokens (${t.savingsPercent}% reduction from reuse)`:e.showSavingsAmount?n+=`${t.savings.toLocaleString()} tokens`:n+=`${t.savingsPercent}% reduction from reuse`,r.push(`${i.green}${n}${i.reset}`)}return r.push(""),r}function ct(t){return[`${i.bright}${i.cyan}${t}${i.reset}`,""]}function Et(t){return[`${i.dim}${t}${i.reset}`]}function _t(t,e,r,n){let o=t.title||"Untitled",s=M.getInstance().getTypeIcon(t.type),{readTokens:l,discoveryTokens:u,workEmoji:a}=$(t,n),c=r?`${i.dim}${e}${i.reset}`:" ".repeat(e.length),E=n.showReadTokens&&l>0?`${i.dim}(~${l}t)${i.reset}`:"",d=n.showWorkTokens&&u>0?`${i.dim}(${a} ${u.toLocaleString()}t)${i.reset}`:"";return` ${i.dim}#${t.id}${i.reset} ${c} ${s} ${o} ${E} ${d}`}function mt(t,e,r,n,o){let s=[],l=t.title||"Untitled",u=M.getInstance().getTypeIcon(t.type),{readTokens:a,discoveryTokens:c,workEmoji:E}=$(t,o),d=r?`${i.dim}${e}${i.reset}`:" ".repeat(e.length),p=o.showReadTokens&&a>0?`${i.dim}(~${a}t)${i.reset}`:"",S=o.showWorkTokens&&c>0?`${i.dim}(${E} ${c.toLocaleString()}t)${i.reset}`:"";return s.push(` ${i.dim}#${t.id}${i.reset} ${d} ${u} ${i.bright}${l}${i.reset}`),n&&s.push(` ${i.dim}${n}${i.reset}`),(p||S)&&s.push(` ${p} ${S}`),s.push(""),s}function gt(t,e){let r=`${t.request||"Session started"} (${e})`;return[`${i.yellow}#S${t.id}${i.reset} ${r}`,""]}function k(t,e,r){return e?[`${r}${t}:${i.reset} ${e}`,""]:[]}function dt(t){return t.assistantMessage?["","---","",`${i.bright}${i.magenta}Previously${i.reset}`,"",`${i.dim}A: ${t.assistantMessage}${i.reset}`,""]:[]}function pt(t,e){let r=Math.round(t/1e3);return["",`${i.dim}Access ${r}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${i.reset}`]}function ft(t){return`
${i.bright}${i.cyan}[${t}] recent context, ${nt()}${i.reset}
${i.dim}Mode: ${ot()}${i.reset}
${i.gray}${"\u2500".repeat(60)}${i.reset}
${i.dim}No previous sessions found for this project yet.${i.reset}
`}function Mt(t,e,r,n){let o=[];return n?o.push(...st(t)):o.push(...Ye(t)),n?o.push(...it()):o.push(...Xe()),n&&(o.push(...at()),o.push(...lt())),j(r)&&(n?o.push(...ut(e,r)):o.push(...Ve(e,r))),o}var ie=I(require("path"),1);function X(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch(e){return _.debug("PARSER","Failed to parse JSON array, using empty fallback",{preview:t?.substring(0,50)},e instanceof Error?e:new Error(String(e))),[]}}function ae(t){return new Date(t).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function le(t){return new Date(t).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function At(t){return new Date(t).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function St(t,e){return ie.default.isAbsolute(t)?ie.default.relative(e,t):t}function Ct(t,e,r){let n=X(t);if(n.length>0)return St(n[0],e);if(r){let o=X(r);if(o.length>0)return St(o[0],e)}return"General"}function Tr(t){let e=new Map;for(let n of t){let o=n.type==="observation"?n.data.created_at:n.data.displayTime,s=At(o);e.has(s)||e.set(s,[]),e.get(s).push(n)}let r=Array.from(e.entries()).sort((n,o)=>{let s=new Date(n[0]).getTime(),l=new Date(o[0]).getTime();return s-l});return new Map(r)}function Tt(t,e){return e.fullObservationField==="narrative"?t.narrative:t.facts?X(t.facts).join(`
`):null}function Or(t,e,r,n){let o=[];o.push(...Je(t));let s="";for(let l of e)if(l.type==="summary"){let u=l.data,a=ae(u.displayTime);o.push(...Ze(u,a))}else{let u=l.data,a=le(u.created_at),E=a!==s?a:"";if(s=a,r.has(u.id)){let p=Tt(u,n);o.push(...Qe(u,E,p,n))}else o.push(ze(u,E,n))}return o}function Dr(t,e,r,n,o){let s=[];s.push(...ct(t));let l=null,u="";for(let a of e)if(a.type==="summary"){l=null,u="";let c=a.data,E=ae(c.displayTime);s.push(...gt(c,E))}else{let c=a.data,E=Ct(c.files_modified,o,c.files_read),d=le(c.created_at),p=d!==u;u=d;let S=r.has(c.id);if(E!==l&&(s.push(...Et(E)),l=E),S){let C=Tt(c,n);s.push(...mt(c,d,p,C,n))}else s.push(_t(c,d,p,n))}return s.push(""),s}function Lr(t,e,r,n,o,s){return s?Dr(t,e,r,n,o):Or(t,e,r,n)}function Ot(t,e,r,n,o){let s=[],l=Tr(t);for(let[u,a]of l)s.push(...Lr(u,a,e,r,n,o));return s}function Dt(t,e,r){return!(!t.showLastSummary||!e||!!!(e.investigated||e.learned||e.completed||e.next_steps)||r&&e.created_at_epoch<=r.created_at_epoch)}function Lt(t,e){let r=[];return e?(r.push(...k("Investigated",t.investigated,i.blue)),r.push(...k("Learned",t.learned,i.yellow)),r.push(...k("Completed",t.completed,i.green)),r.push(...k("Next Steps",t.next_steps,i.magenta))):(r.push(...w("Investigated",t.investigated)),r.push(...w("Learned",t.learned)),r.push(...w("Completed",t.completed)),r.push(...w("Next Steps",t.next_steps))),r}function ht(t,e){return e?dt(t):et(t)}function yt(t,e,r){return!j(e)||t.totalDiscoveryTokens<=0||t.savings<=0?[]:r?pt(t.totalDiscoveryTokens,t.totalReadTokens):tt(t.totalDiscoveryTokens,t.totalReadTokens)}var D=require("fs"),ue=require("path");var V=null;function Rt(){return V!==null||(V=v.loadFromFile(Me)),V}var hr="observer-health.json",yr=3,Rr=600,vr={consecutiveFailures:0,failingSinceAt:null,lastErrorAt:null,lastErrorMessage:null,lastErrorProvider:null,lastSuccessAt:null,lastErrorCode:null,lastErrorAction:null,lastErrorUrl:null,lastErrorRequestId:null,quotaCooldown:null};function Ir(){return(0,ue.join)(T.dataDir(),hr)}var br=/(["']?\b(?:api[_-]?key|apikey|access[_-]?token|auth[_-]?token|refresh[_-]?token|id[_-]?token|session[_-]?token|client[_-]?secret|secret[_-]?key|secret|password|passwd|pwd|authorization|auth|token|key)\b["']?\s*[=:]\s*)(["']?)([^\s"'&,;}\]]+)\2/gi;function J(t){return t.replace(/\bsk-[A-Za-z0-9_-]{8,}/g,"sk-\u2026").replace(/\bcm_pro_[A-Za-z0-9_-]{8,}/g,"cm_pro_\u2026").replace(/\b(Bearer|Basic|Digest|Token)\s+[^\s"']+/gi,"$1 \u2026").replace(br,(e,r,n,o)=>/^\d+$/.test(o)?e:`${r}${n}\u2026${n}`).slice(0,Rr)}function vt(t=Ir()){try{if(!(0,D.existsSync)(t))return null;let e=JSON.parse((0,D.readFileSync)(t,"utf-8"));return typeof e!="object"||e===null?null:{...vr,...e}}catch(e){return _.warn("SESSION","Failed to read observer-health file",{filePath:t},e instanceof Error?e:new Error(String(e))),null}}function It(t){return t!==null&&t.consecutiveFailures>=yr&&(t.lastErrorAt??0)>(t.lastSuccessAt??0)}function bt(t){let e=Math.max(1,Math.round(t/6e4));if(e<60)return`${e} minute${e===1?"":"s"}`;let r=Math.round(e/60);return r<48?`about ${r} hour${r===1?"":"s"}`:`about ${Math.round(r/24)} days`}function Ur(){return`http://localhost:${Rt().CLAUDE_MEM_WORKER_PORT}/restart`}function Nr(t){return t.lastErrorKind==="quota_exhausted"}function Ut(t,e=Date.now()){let r=t?.quotaCooldown;return r!=null&&typeof r.until=="number"&&r.until>e}function Nt(t,e=Date.now()){let r=t.quotaCooldown,n=r?.provider??"unknown provider",o=r?.until,s=o?`${new Date(o).toISOString()} (${bt(Math.max(0,o-e))} from now)`:"the next probe window",l=r?.window?` (${r.window})`:"",u=r?.message?J(r.message):null;return["\u26A0\uFE0F Heads up: claude-mem is paused while a provider quota cooldown is active.","",`The memory observer is waiting out a quota cooldown on ${n}${l} until ${s}.`,"",...u?[`Latest signal: ${u}`,""]:[],"This is not a failure. Incoming observations stay queued and will be written","when the cooldown clears \u2014 the worker is intentionally not starting the","generator so it does not keep spending a spent allowance.","","Restarting will NOT help here, and it clears the backoff that is currently keeping","claude-mem from hammering the provider \u2014 so please leave the worker alone.","","(Assistant: tell the user that memory capture is paused for a quota cooldown","at the very start of your first reply. Do NOT restart the worker and do NOT","suggest restarting it.)"].join(`
`)}function xt(t,e=Date.now()){let r=t.failingSinceAt??t.lastErrorAt,n=r?`for ${bt(e-r)} (since ${new Date(r).toISOString()})`:"for an unknown amount of time",o=t.lastErrorProvider??"unknown provider",s=t.consecutiveFailures,l=t.lastErrorAction?J(t.lastErrorAction):null;return Nr(t)?["\u26A0\uFE0F Heads up: claude-mem can't save memories right now.","",`The memory observer's allowance on ${o} is used up (since ${n.replace(/^for .*?\(since /,"").replace(/\)$/,"")}).`,"",`Latest error: ${t.lastErrorMessage?J(t.lastErrorMessage):"unknown"}`,...l?[`What to do: ${l}`]:[],...t.lastErrorUrl?[`Link: ${t.lastErrorUrl}`]:[],...t.lastErrorRequestId?[`Request id: ${t.lastErrorRequestId}`]:[],"","Until the allowance resets or you add capacity, nothing from this session \u2014 or any","other \u2014 will be remembered.","","Restarting will NOT help here, and it clears the backoff that is currently keeping","claude-mem from hammering the provider \u2014 so please leave the worker alone.",...l?[]:["Switch the observer to another provider in ~/.claude-mem/settings.json if you need","memory capture before the allowance resets."],"","(Assistant: tell the user about this outage at the very start of your first reply,","quoting the error above. Do NOT restart the worker and do NOT suggest restarting it.)"].join(`
`):["\u26A0\uFE0F Heads up: claude-mem can't save memories right now.","",`The memory observer (provider: ${o}) has failed ${s} time${s===1?"":"s"} in a row ${n}.`,"",`Latest error: ${t.lastErrorMessage?J(t.lastErrorMessage):"unknown"}`,...l?[`What to do: ${l}`]:[],...t.lastErrorUrl?[`Link: ${t.lastErrorUrl}`]:[],...t.lastErrorRequestId?[`Request id: ${t.lastErrorRequestId}`]:[],"","Until it's fixed, nothing from this session \u2014 or any other \u2014 will be remembered.","","Restarting the memory worker clears almost every outage. Do one of these:",` Click to restart: ${Ur()}`," Or in a terminal: npx claude-mem restart","","Still failing after the restart? Run: npx claude-mem doctor",...l?[]:["If doctor comes back clean, check the observer provider's API key, spend limit, and base","URL in ~/.claude-mem/settings.json. The error above may include a management link."],"","(Assistant: tell the user about this outage at the very start of your first reply,","quoting the error above, and give them the restart link \u2014 let them press it rather","than restarting the worker yourself.)"].join(`
`)}var $r=wt.default.join((0,kt.homedir)(),".claude","plugins","marketplaces","thedotmack","plugin",".install-version");function wr(){try{if(!(0,q.existsSync)(Z))return null;let t=new Pt.Database(Z,{readonly:!0,create:!1});try{return t.run(`PRAGMA busy_timeout = ${ve}`),t}catch(e){throw t.close(),e}}catch(t){if(t instanceof Error&&t.code==="ERR_DLOPEN_FAILED"){try{(0,q.unlinkSync)($r)}catch(e){e instanceof Error?_.debug("WORKER","Marker file cleanup failed (may not exist)",{},e):_.debug("WORKER","Marker file cleanup failed (may not exist)",{error:String(e)})}return _.error("WORKER","Native module rebuild needed - restart Claude Code to auto-fix"),null}throw t}}function kr(t,e){return e?ft(t):rt(t)}function Pr(t,e,r,n,o,s,l){let u=[],a=se(e);u.push(...Mt(t,a,n,l));let c=r.slice(0,n.sessionCount),E=Ge(c,r),d=We(e,E),p=je(e,n.fullObservationCount);u.push(...Ot(d,p,n,o,l));let S=r[0],C=e[0];Dt(n,S,C)&&u.push(...Lt(S,l));let Ee=Fe(e,n,s,o);return u.push(...ht(Ee,l)),u.push(...yt(a,n,l)),u.join(`
`).trimEnd()}var Hr=new Set(["bugfix","discovery","decision","refactor"]);function Fr(t,e,r){let n=se(t),o={bugfix:0,discovery:0,decision:0,refactor:0,other:0},s=new Set,l=Number.POSITIVE_INFINITY;for(let a of t){let c=Hr.has(a.type)?a.type:"other";o[c]++,a.memory_session_id&&s.add(a.memory_session_id),a.created_at_epoch&&a.created_at_epoch<l&&(l=a.created_at_epoch)}let u=Number.isFinite(l)?Math.max(0,Math.floor((Date.now()-l)/864e5)):0;return{observation_count:t.length,session_count:s.size,timeline_depth_days:u,has_session_summary:e.length>0,obs_type_bugfix:o.bugfix,obs_type_discovery:o.discovery,obs_type_decision:o.decision,obs_type_refactor:o.refactor,obs_type_other:o.other,tokens_injected:n.totalReadTokens,tokens_saved_vs_naive:n.savings,search_strategy:r?"full":"timeline"}}function Gr(t){return t.split(`
`).map(e=>e.trim()?`${i.red}${e}${i.reset}`:e).join(`
`)}function $t(t,e=!1){return Ft(Ht(e),t)}function Ht(t=!1){let e=vt(),r=null;return It(e)?r=xt(e):Ut(e)&&(r=Nt(e)),r?t?Gr(r):r:""}function Ft(t,e){return t?e?`${e}
${t}`:t:e}function Wr(t,e,r,n,o,s,l){let u=xe(t,r,(a,c)=>Ft(n,o(a,c)),s);return u.reductions>0&&_.debug("HOOK","Trimmed context to fit the hook output limit",{reductions:u.reductions,observations:u.observationCount,sessions:u.config.sessionCount,chars:u.text.length,overBudget:u.overBudget}),{text:u.text,stats:Fr(t.slice(0,u.observationCount),e.slice(0,u.config.sessionCount),l)}}async function ce(t,e=!1){let r=Ne(),n=t?.cwd??process.cwd(),o=he(n),s=t?.projects?.length?t.projects:o.allProjects,l=s[s.length-1]??o.primary;t?.full&&(r.totalObservationCount=999999,r.sessionCount=999999);let u=wr();if(!u)return{text:$t("",e),stats:null};try{let a={db:u},c=t?.platformSource?Re(t.platformSource):void 0,E=s.length>1?s:[l],d=Pe(a,E,r,c),p=He(a,E,r,c);return d.length===0&&p.length===0?{text:$t(kr(l,e),e),stats:null}:Wr(d,p,r,Ht(e),(S,C)=>Pr(l,S,p,C,n,t?.session_id,e),t?.full?Number.POSITIVE_INFINITY:1e4,!!t?.full)}finally{u.close()}}async function Gt(t,e=!1){return(await ce(t,e)).text}0&&(module.exports={generateContext,generateContextWithStats});