claude-mem 13.26.0 → 13.26.1
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/.codex-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bug-report/index.js +1 -1
- package/dist/npx-cli/index.js +2 -2
- package/dist/opencode-plugin/index.js +10 -10
- 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/package.json +1 -1
- package/plugin/scripts/context-generator.cjs +32 -29
- package/plugin/scripts/context-generator.cjs.map +3 -3
- package/plugin/scripts/mcp-server.cjs +2 -2
- package/plugin/scripts/mcp-server.cjs.map +1 -1
- package/plugin/scripts/server-service.cjs +3 -3
- package/plugin/scripts/server-service.cjs.map +1 -1
- package/plugin/scripts/transcript-watcher.cjs +2 -2
- package/plugin/scripts/transcript-watcher.cjs.map +1 -1
- package/plugin/scripts/worker-service.cjs +343 -321
- package/plugin/scripts/worker-service.cjs.map +3 -3
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "Claude-Mem (Persistent Memory)",
|
|
4
4
|
"description": "OpenClaw plugin for Claude-Mem. Records observations from embedded runner sessions and streams them to messaging channels.",
|
|
5
5
|
"kind": "memory",
|
|
6
|
-
"version": "13.26.
|
|
6
|
+
"version": "13.26.1",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"author": "thedotmack",
|
|
9
9
|
"homepage": "https://claude-mem.ai",
|
package/package.json
CHANGED
package/plugin/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
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
|
-
"use strict";var
|
|
4
|
-
`);let
|
|
5
|
-
`,"utf-8"),i;try{i=(0,
|
|
6
|
-
`)}finally{if(
|
|
7
|
-
${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"),
|
|
3
|
+
"use strict";var zt=Object.create;var G=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var er=Object.getPrototypeOf,tr=Object.prototype.hasOwnProperty;var rr=(t,e)=>{for(var r in e)G(t,r,{get:e[r],enumerable:!0})},de=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Zt(e))!tr.call(t,o)&&o!==r&&G(t,o,{get:()=>e[o],enumerable:!(n=Qt(e,o))||n.enumerable});return t};var N=(t,e,r)=>(r=t!=null?zt(er(t)):{},de(e||!t||!t.__esModule?G(r,"default",{value:t,enumerable:!0}):r,t)),nr=t=>de(G({},"__esModule",{value:!0}),t);var ln={};rr(ln,{generateContext:()=>Xt,generateContextWithStats:()=>_e});module.exports=nr(ln);var Bt=N(require("path"),1),jt=require("os"),Q=require("fs"),Kt=require("bun:sqlite");var d=require("path"),Z=require("os"),x=require("fs"),Se=require("url");var m=require("fs"),pe=require("crypto"),C=require("path");var or=null;function sr(t){return(or??process.stderr.write.bind(process.stderr))(t)}function R(t){sr(t)}var ir=process.platform==="win32";function ar(t){return t.replace(/^\uFEFF/,"")}function y(t){return JSON.parse(ar(t))}function lr(t){(0,m.existsSync)(t)||(0,m.mkdirSync)(t,{recursive:!0})}function b(t,e){let r=t;try{if((0,m.lstatSync)(t).isSymbolicLink())try{r=(0,m.realpathSync)(t)}catch(E){let c=E instanceof Error?E:new Error(String(E));R(`claude-mem: realpathSync failed for ${t}, resolving symlink manually: ${c.message}
|
|
4
|
+
`);let g=(0,m.readlinkSync)(t);r=(0,C.resolve)((0,C.dirname)(t),g)}}catch(E){let c=E.code;if(c!=="ENOENT"&&c!=="ENOTDIR")throw E}lr((0,C.dirname)(r));let n=(0,C.dirname)(r),o=(0,C.basename)(r),s=(0,C.join)(n,`.${o}.${process.pid}.${(0,pe.randomBytes)(6).toString("hex")}.tmp`),l=Buffer.from(JSON.stringify(e,null,2)+`
|
|
5
|
+
`,"utf-8"),i;try{i=(0,m.statSync)(r).mode&511}catch{}let u;try{u=i!==void 0?(0,m.openSync)(s,"w",i):(0,m.openSync)(s,"w");let E=0;for(;E<l.length;){let c=(0,m.writeSync)(u,l,E,l.length-E);if(c===0)throw new Error(`writeSync stalled at ${E}/${l.length} bytes`);E+=c}if((0,m.fsyncSync)(u),(0,m.closeSync)(u),u=void 0,(0,m.renameSync)(s,r),!ir){let c;try{c=(0,m.openSync)(n,"r"),(0,m.fsyncSync)(c)}catch(g){let p=g instanceof Error?g:new Error(String(g));R(`claude-mem: directory fsync failed for ${n}: ${p.message}
|
|
6
|
+
`)}finally{if(c!==void 0)try{(0,m.closeSync)(c)}catch{}}}}catch(E){if(u!==void 0)try{(0,m.closeSync)(u)}catch{}try{(0,m.unlinkSync)(s)}catch{}throw E}}var fe=require("os"),Me=require("path");function h(t,e=process.platform,r=(0,fe.homedir)()){return typeof t!="string"||t.length===0?t:t==="~"?r:t.startsWith("~/")||e==="win32"&&t.startsWith("~\\")?(0,Me.join)(r,t.slice(2)):t}var dr={};function ur(){return typeof __CM_DIRNAME__<"u"?__CM_DIRNAME__:(0,d.dirname)((0,Se.fileURLToPath)(dr.url))}var cr=ur();function Er(){if(process.env.CLAUDE_MEM_DATA_DIR)return h(process.env.CLAUDE_MEM_DATA_DIR);let t=(0,d.join)((0,Z.homedir)(),".claude-mem"),e=(0,d.join)(t,"settings.json");try{if((0,x.existsSync)(e)){let r=y((0,x.readFileSync)(e,"utf-8")),n=r.env??r;if(n.CLAUDE_MEM_DATA_DIR)return h(n.CLAUDE_MEM_DATA_DIR)}}catch{}return t}var f=Er(),_r=(0,d.join)((0,Z.homedir)(),".claude"),ee=process.env.CLAUDE_CONFIG_DIR||_r,Mn=(0,d.join)(ee,"plugins","marketplaces","thedotmack"),mr=(0,d.join)(f,"logs"),Ae=(0,d.join)(f,"settings.json"),Ce="claude-mem.db";var te=(0,d.join)(f,Ce),gr=(0,d.join)(f,"observer-sessions"),Sn=(0,d.basename)(gr);function Te(){return(0,d.join)(cr,"..")}var A={dataDir:()=>f,workerPid:()=>(0,d.join)(f,"worker.pid"),serverPid:()=>(0,d.join)(f,".server-beta.pid"),serverPort:()=>(0,d.join)(f,".server-beta.port"),serverRuntime:()=>(0,d.join)(f,".server-beta.runtime.json"),settings:()=>(0,d.join)(f,"settings.json"),database:()=>(0,d.join)(f,Ce),chroma:()=>(0,d.join)(f,"chroma"),combinedCerts:()=>(0,d.join)(f,"combined_certs.pem"),transcriptsConfig:()=>(0,d.join)(f,"transcript-watch.json"),transcriptsState:()=>(0,d.join)(f,"transcript-watch-state.json"),corpora:()=>(0,d.join)(f,"corpora"),supervisorRegistry:()=>(0,d.join)(f,"supervisor.json"),envFile:()=>(0,d.join)(f,".env"),logsDir:()=>mr};var O=require("fs"),Oe=require("path");var ne=(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))(ne||{}),re=null,oe=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 r=A.logsDir();(0,O.existsSync)(r)||(0,O.mkdirSync)(r,{recursive:!0}),this.logFilePath=(0,Oe.join)(r,`claude-mem-${e}.log`)}catch(r){console.error("[LOGGER] Failed to initialize log file:",r instanceof Error?r.message:String(r)),this.logFilePath=null}}}getLevel(){if(this.level===null)try{let e=A.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=ne[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}
|
|
7
|
+
${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"),i=String(e.getSeconds()).padStart(2,"0"),u=String(e.getMilliseconds()).padStart(3,"0");return`${r}-${n}-${o} ${s}:${l}:${i}.${u}`}log(e,r,n,o,s){if(e<this.getLevel())return;this.ensureLogFileInitialized();let l=this.formatTimestamp(new Date),i=ne[e].padEnd(5),u=r.padEnd(6),E="";o?.correlationId?E=`[${o.correlationId}] `:o?.sessionId&&(E=`[session-${o.sessionId}] `);let c="";if(s!=null)if(s instanceof Error)c=this.getLevel()===0?`
|
|
8
8
|
${s.message}
|
|
9
|
-
${s.stack}`:` ${s.message}`;else if(this.getLevel()===0&&typeof s=="object")try{
|
|
10
|
-
`+JSON.stringify(s,null,2)}catch{
|
|
11
|
-
`,"utf8")}catch(S){let
|
|
12
|
-
${
|
|
9
|
+
${s.stack}`:` ${s.message}`;else if(this.getLevel()===0&&typeof s=="object")try{c=`
|
|
10
|
+
`+JSON.stringify(s,null,2)}catch{c=" "+this.formatData(s)}else c=" "+this.formatData(s);let g="";if(o){let{sessionId:S,memorySessionId:T,correlationId:me,...ge}=o;Object.keys(ge).length>0&&(g=` {${Object.entries(ge).map(([Vt,qt])=>`${Vt}=${qt}`).join(", ")}}`)}let p=`[${l}] [${i}] [${u}] ${E}${n}${g}${c}`;if(this.logFilePath)try{(0,O.appendFileSync)(this.logFilePath,p+`
|
|
11
|
+
`,"utf8")}catch(S){let T=S instanceof Error?S:new Error(String(S));R(`[LOGGER] Failed to write to log file: ${T.message}
|
|
12
|
+
${T.stack??""}
|
|
13
13
|
`)}else R(p+`
|
|
14
|
-
`)}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)}},c=new re;var De=I(require("path"),1),Le=require("child_process");var F=require("fs"),y=I(require("path"),1);var b={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function Te(t){let e=y.default.join(t,".git"),r;try{r=(0,F.statSync)(e)}catch(u){return u instanceof Error&&u.code!=="ENOENT"&&c.warn("GIT","Unexpected error checking .git",{error:u instanceof Error?u.message:String(u)}),b}if(!r.isFile())return b;let n;try{n=(0,F.readFileSync)(e,"utf-8").trim()}catch(u){return c.warn("GIT","Failed to read .git file",{error:u instanceof Error?u.message:String(u)}),b}let o=n.match(/^gitdir:\s*(.+)$/);if(!o)return b;let E=y.default.resolve(y.default.dirname(e),o[1]).match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!E)return b;let i=E[1],l=y.default.basename(t),_=y.default.basename(i);return{isWorktree:!0,worktreeName:l,parentRepoPath:i,parentProjectName:_}}var Oe="unknown-project";function Re(t){try{return(0,Le.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 c.debug("PROJECT_NAME","git rev-parse failed, falling back to basename",{dir:t},r),null}}function _r(t,e=process.platform){if(!t||t.trim()==="")return c.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:t}),Oe;let r=L(t,e),o=Re(r)??r,s=De.default.basename(o);if(s===""){if(process.platform==="win32"){let i=t.match(/^([A-Z]):\\/i);if(i){let _=`drive-${i[1].toUpperCase()}`;return c.info("PROJECT_NAME","Drive root detected",{cwd:t,projectName:_}),_}}return c.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:t}),Oe}return s}function he(t,e=process.platform){let r=_r(t,e);if(!t)return{primary:r,parent:null,isWorktree:!1,allProjects:[r]};let n=L(t,e),o=Te(Re(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 Ue(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 gr=require("bun:sqlite");var Ie=5e3;var a={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"},ve=4,Ne=1;var G=require("fs"),oe=require("path"),x=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 be(t){return process.platform==="win32"?Math.round(t*ne.WINDOWS_MULTIPLIER):t}var mr="security_alert",dr="sync-hub.black-pond-afbb.workers.dev",pr="https://sync.cmem.ai";function fr(t){if(typeof t!="string")return null;let e=t.trim();if(e.length===0)return null;try{if(new URL(e).hostname===dr)return pr}catch{return null}return null}var U=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(be(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,x.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_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,x.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,x.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:"30000",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_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_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_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){let r=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(r):r}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,r){let n=r?this.applyEnvOverrides(e):e;return n.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(n.CLAUDE_MEM_WORKER_HOST),n}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 u=this.getAllDefaults();try{v(e,u),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(m){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,m instanceof Error?m.message:String(m))}return this.finalizeSettings(u,r)}let n=(0,G.readFileSync)(e,"utf-8"),o=h(n),s=o,E=o.env&&typeof o.env=="object"&&!Array.isArray(o.env),i=E&&Object.keys(o).some(u=>u!=="env");if(E&&(s=o.env,!i))try{v(e,s),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(u){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,u instanceof Error?u.message:String(u))}if(s.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===mr){s={...s,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{v(e,i?{...o,env:s}:s),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",e)}catch(u){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",e,u instanceof Error?u.message:String(u))}}let l=fr(s.CLAUDE_MEM_CLOUD_SYNC_HUB_URL);if(l!==null){s={...s,CLAUDE_MEM_CLOUD_SYNC_HUB_URL:l};try{v(e,i?{...o,env:s}:s),console.warn("[SETTINGS] Migrated cloud sync hub URL off the legacy workers.dev host:",e)}catch(u){console.warn("[SETTINGS] Failed to migrate cloud sync hub URL:",e,u instanceof Error?u.message:String(u))}}let _={...this.DEFAULTS};for(let u of Object.keys(this.DEFAULTS))s[u]!==void 0&&(_[u]=s[u]);return this.finalizeSettings(_,r)}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let o=this.getAllDefaults();return this.finalizeSettings(o,r)}}};var W=require("fs"),$=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=Ce(),r=[...process.env.CLAUDE_MEM_MODES_DIR?[process.env.CLAUDE_MEM_MODES_DIR]:[],(0,$.join)(T.dataDir(),"modes"),(0,$.join)(e,"modes"),(0,$.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],E=e[o];this.isPlainObject(s)&&this.isPlainObject(E)?n[o]=this.deepMerge(E,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,$.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 l=this.loadModeFile(e);return this.activeMode=l,this.activeModeId=e,c.debug("SYSTEM",`Loaded mode: ${l.name} (${e})`,void 0,{types:l.observation_types.map(_=>_.id),concepts:l.observation_concepts.map(_=>_.id)}),l}catch(l){if(l instanceof Error?c.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:l.message}):c.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(l)}),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(l){l instanceof Error?c.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{message:l.message}):c.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{error:String(l)}),s=this.loadMode("code")}let E;try{E=this.loadModeFile(o),c.debug("SYSTEM",`Loaded override file: ${o} for parent ${n}`)}catch(l){return l instanceof Error?c.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{message:l.message}):c.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{error:String(l)}),this.activeMode=s,s}if(!E)return c.warn("SYSTEM",`Invalid override file: ${o}, using parent mode '${n}' only`),this.activeMode=s,s;let i=this.deepMerge(s,E);return this.activeMode=i,this.activeModeId=e,c.debug("SYSTEM",`Loaded mode with inheritance: ${i.name} (${e} = ${n} + ${o})`,void 0,{parent:n,override:o,types:i.observation_types.map(l=>l.id),concepts:i.observation_concepts.map(l=>l.id)}),i}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 Sr(t){let e=(t??"").split(",").map(r=>r.trim()).filter(r=>r!=="");return e.length>0?e:null}function xe(t,e,r){let n=Sr(e);if(!n)return new Set(r);let o=n.filter(E=>r.includes(E)),s=n.filter(E=>!r.includes(E));return s.length>0&&c.warn("CONFIG",`${t} has ids not in the active mode; ignoring them`,{discardedIds:s.join(","),fallingBackToModeList:o.length===0}),new Set(o.length>0?o:r)}function $e(){let t=T.settings(),e=U.loadFromFile(t),r=M.getInstance().getActiveMode(),n=xe("CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES",e.CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES,r.observation_types.map(s=>s.id)),o=xe("CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS",e.CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS,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 Cr(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 we(t,e,r,n=1e4){let o=e,s=t.length,E=r(t,o),i=0;for(;E.length>n;){let l=Cr(o,s);if(!l)return{text:E,config:o,observationCount:s,reductions:i,overBudget:!0};o=l.config,s=l.observationCount,E=r(t.slice(0,s),o),i++}return{text:E,config:o,observationCount:s,reductions:i,overBudget:!1}}function ke(t){let e=(t.title?.length||0)+(t.subtitle?.length||0)+(t.narrative?.length||0)+JSON.stringify(t.facts||[]).length;return Math.ceil(e/ve)}function se(t){let e=t.length,r=t.reduce((E,i)=>E+ke(i),0),n=t.reduce((E,i)=>E+(i.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 Ar(t){return M.getInstance().getWorkEmoji(t)}function w(t,e){let r=ke(t),n=t.discovery_tokens||0,o=Ar(t.type),s=n>0?`${o} ${n.toLocaleString()}`:"-";return{readTokens:r,discoveryTokens:n,discoveryDisplay:s,workEmoji:o}}function B(t){return t.showReadTokens||t.showWorkTokens||t.showSavingsAmount||t.showSavingsPercent}var He=I(require("path"),1),j=require("fs");var Tr=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],Bn=new RegExp(`<(${Tr.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),Pe=/<system-reminder>[\s\S]*?<\/system-reminder>/g;var Or=["task-notification"],jn=new RegExp(`^\\s*<(${Or.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),Kn=256*1024;var Dr=`
|
|
14
|
+
`)}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){re=e}error(e,r,n,o){this.log(3,e,r,n,o),this.routeErrorToSink(r,n,o)}routeErrorToSink(e,r,n){try{if(!re||!(n instanceof Error))return;re(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 oe;var he=N(require("path"),1),Re=require("child_process");var W=require("fs"),U=N(require("path"),1);var $={isWorktree:!1,worktreeName:null,parentRepoPath:null,parentProjectName:null};function De(t){let e=U.default.join(t,".git"),r;try{r=(0,W.statSync)(e)}catch(c){return c instanceof Error&&c.code!=="ENOENT"&&_.warn("GIT","Unexpected error checking .git",{error:c instanceof Error?c.message:String(c)}),$}if(!r.isFile())return $;let n;try{n=(0,W.readFileSync)(e,"utf-8").trim()}catch(c){return _.warn("GIT","Failed to read .git file",{error:c instanceof Error?c.message:String(c)}),$}let o=n.match(/^gitdir:\s*(.+)$/);if(!o)return $;let l=U.default.resolve(U.default.dirname(e),o[1]).match(/^(.+)[/\\]\.git[/\\]worktrees[/\\]([^/\\]+)$/);if(!l)return $;let i=l[1],u=U.default.basename(t),E=U.default.basename(i);return{isWorktree:!0,worktreeName:u,parentRepoPath:i,parentProjectName:E}}var Le="unknown-project";function ye(t){try{return(0,Re.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 pr(t,e=process.platform){if(!t||t.trim()==="")return _.warn("PROJECT_NAME","Empty cwd provided, using fallback",{cwd:t}),Le;let r=h(t,e),o=ye(r)??r,s=he.default.basename(o);if(s===""){if(process.platform==="win32"){let i=t.match(/^([A-Z]):\\/i);if(i){let E=`drive-${i[1].toUpperCase()}`;return _.info("PROJECT_NAME","Drive root detected",{cwd:t,projectName:E}),E}}return _.warn("PROJECT_NAME","Root directory detected, using fallback",{cwd:t}),Le}return s}function Ue(t,e=process.platform){let r=pr(t,e);if(!t)return{primary:r,parent:null,isWorktree:!1,allProjects:[r]};let n=h(t,e),o=De(ye(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 Ie="claude";function fr(t){return t.trim().toLowerCase().replace(/\s+/g,"-")}function ve(t){if(!t)return Ie;let e=fr(t);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:Ie}var Mr=require("bun:sqlite");var Ne=5e3;var a={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"},be=4,xe=1;var B=require("fs"),ie=require("path"),w=require("os");var se={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 $e(t){return process.platform==="win32"?Math.round(t*se.WINDOWS_MULTIPLIER):t}var Sr="security_alert",Ar="sync-hub.black-pond-afbb.workers.dev",Cr="https://sync.cmem.ai";function Tr(t){if(typeof t!="string")return null;let e=t.trim();if(e.length===0)return null;try{if(new URL(e).hostname===Ar)return Cr}catch{return null}return null}var I=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($e(se.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,ie.join)((0,w.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_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,ie.join)((0,w.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,w.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:"30000",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_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_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:""};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){let r=process.env[e]??this.DEFAULTS[e];return e==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(r):r}static normalizeWorkerHost(e){return e==="localhost"?"127.0.0.1":e}static finalizeSettings(e,r){let n=r?this.applyEnvOverrides(e):e;return n.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(n.CLAUDE_MEM_WORKER_HOST),n}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,B.existsSync)(e)){let c=this.getAllDefaults();try{b(e,c),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(g){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,g instanceof Error?g.message:String(g))}return this.finalizeSettings(c,r)}let n=(0,B.readFileSync)(e,"utf-8"),o=y(n),s=o,l=o.env&&typeof o.env=="object"&&!Array.isArray(o.env),i=l&&Object.keys(o).some(c=>c!=="env");if(l&&(s=o.env,!i))try{b(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===Sr){s={...s,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{b(e,i?{...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 u=Tr(s.CLAUDE_MEM_CLOUD_SYNC_HUB_URL);if(u!==null){s={...s,CLAUDE_MEM_CLOUD_SYNC_HUB_URL:u};try{b(e,i?{...o,env:s}:s),console.warn("[SETTINGS] Migrated cloud sync hub URL off the legacy workers.dev host:",e)}catch(c){console.warn("[SETTINGS] Failed to migrate cloud sync hub URL:",e,c instanceof Error?c.message:String(c))}}let E={...this.DEFAULTS};for(let c of Object.keys(this.DEFAULTS))s[c]!==void 0&&(E[c]=s[c]);return this.finalizeSettings(E,r)}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let o=this.getAllDefaults();return this.finalizeSettings(o,r)}}};var j=require("fs"),k=require("path");var Or=/^[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=Te(),r=[...process.env.CLAUDE_MEM_MODES_DIR?[process.env.CLAUDE_MEM_MODES_DIR]:[],(0,k.join)(A.dataDir(),"modes"),(0,k.join)(e,"modes"),(0,k.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(!Or.test(e))throw new Error(`Invalid mode ID: ${e}`);let r=this.modeDirs.map(o=>(0,k.join)(o,`${e}.json`)).find(o=>(0,j.existsSync)(o));if(!r)throw new Error(`Mode file not found: ${e}.json (searched: ${this.modeDirs.join(", ")})`);let n=(0,j.readFileSync)(r,"utf-8");return JSON.parse(n)}loadMode(e){let r=this.parseInheritance(e);if(!r.hasParent)try{let u=this.loadModeFile(e);return this.activeMode=u,this.activeModeId=e,_.debug("SYSTEM",`Loaded mode: ${u.name} (${e})`,void 0,{types:u.observation_types.map(E=>E.id),concepts:u.observation_concepts.map(E=>E.id)}),u}catch(u){if(u instanceof Error?_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:u.message}):_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(u)}),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(u){u instanceof Error?_.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{message:u.message}):_.warn("WORKER",`Parent mode '${n}' not found for ${e}, falling back to 'code'`,{error:String(u)}),s=this.loadMode("code")}let l;try{l=this.loadModeFile(o),_.debug("SYSTEM",`Loaded override file: ${o} for parent ${n}`)}catch(u){return u instanceof Error?_.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{message:u.message}):_.warn("WORKER",`Override file '${o}' not found, using parent mode '${n}' only`,{error:String(u)}),this.activeMode=s,s}if(!l)return _.warn("SYSTEM",`Invalid override file: ${o}, using parent mode '${n}' only`),this.activeMode=s,s;let i=this.deepMerge(s,l);return this.activeMode=i,this.activeModeId=e,_.debug("SYSTEM",`Loaded mode with inheritance: ${i.name} (${e} = ${n} + ${o})`,void 0,{parent:n,override:o,types:i.observation_types.map(u=>u.id),concepts:i.observation_concepts.map(u=>u.id)}),i}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 Dr(t){let e=(t??"").split(",").map(r=>r.trim()).filter(r=>r!=="");return e.length>0?e:null}function we(t,e,r){let n=Dr(e);if(!n)return new Set(r);let o=n.filter(l=>r.includes(l)),s=n.filter(l=>!r.includes(l));return s.length>0&&_.warn("CONFIG",`${t} has ids not in the active mode; ignoring them`,{discardedIds:s.join(","),fallingBackToModeList:o.length===0}),new Set(o.length>0?o:r)}function ke(){let t=A.settings(),e=I.loadFromFile(t),r=M.getInstance().getActiveMode(),n=we("CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES",e.CLAUDE_MEM_CONTEXT_OBSERVATION_TYPES,r.observation_types.map(s=>s.id)),o=we("CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS",e.CLAUDE_MEM_CONTEXT_OBSERVATION_CONCEPTS,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 Lr(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 Pe(t,e,r,n=1e4){let o=e,s=t.length,l=r(t,o),i=0;for(;l.length>n;){let u=Lr(o,s);if(!u)return{text:l,config:o,observationCount:s,reductions:i,overBudget:!0};o=u.config,s=u.observationCount,l=r(t.slice(0,s),o),i++}return{text:l,config:o,observationCount:s,reductions:i,overBudget:!1}}function He(t){let e=(t.title?.length||0)+(t.subtitle?.length||0)+(t.narrative?.length||0)+JSON.stringify(t.facts||[]).length;return Math.ceil(e/be)}function ae(t){let e=t.length,r=t.reduce((l,i)=>l+He(i),0),n=t.reduce((l,i)=>l+(i.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 hr(t){return M.getInstance().getWorkEmoji(t)}function P(t,e){let r=He(t),n=t.discovery_tokens||0,o=hr(t.type),s=n>0?`${o} ${n.toLocaleString()}`:"-";return{readTokens:r,discoveryTokens:n,discoveryDisplay:s,workEmoji:o}}function K(t){return t.showReadTokens||t.showWorkTokens||t.showSavingsAmount||t.showSavingsPercent}var Ge=N(require("path"),1),Y=require("fs");var Rr=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],Zn=new RegExp(`<(${Rr.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),Fe=/<system-reminder>[\s\S]*?<\/system-reminder>/g;var yr=["task-notification"],eo=new RegExp(`^\\s*<(${yr.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),to=256*1024;var Ur=`
|
|
15
15
|
o.id,
|
|
16
16
|
o.memory_session_id,
|
|
17
17
|
COALESCE(s.platform_source, 'claude') as platform_source,
|
|
@@ -27,22 +27,22 @@ ${A.stack??""}
|
|
|
27
27
|
o.created_at,
|
|
28
28
|
o.created_at_epoch,
|
|
29
29
|
o.project
|
|
30
|
-
`;function
|
|
30
|
+
`;function We(t,e,r,n){return Ir(t,r,{limit:r.totalObservationCount,platformSource:n,projects:e})}function Ir(t,e,r){let n=Array.from(e.observationTypes),o=n.map(()=>"?").join(","),s=Array.from(e.observationConcepts),l=s.map(()=>"?").join(","),i=(r.projects??[]).filter(E=>E.trim().length>0),u=i.length>0?`AND (o.project IN (${i.map(()=>"?").join(",")})
|
|
31
31
|
OR o.merged_into_project IN (${i.map(()=>"?").join(",")}))`:"";return t.db.prepare(`
|
|
32
32
|
SELECT
|
|
33
|
-
${
|
|
33
|
+
${Ur}
|
|
34
34
|
FROM observations o
|
|
35
35
|
LEFT JOIN sdk_sessions s ON o.memory_session_id = s.memory_session_id
|
|
36
36
|
WHERE (? IS NULL OR s.platform_source = ?)
|
|
37
|
-
${
|
|
37
|
+
${u}
|
|
38
38
|
AND type IN (${o})
|
|
39
39
|
AND EXISTS (
|
|
40
40
|
SELECT 1 FROM json_each(o.concepts)
|
|
41
|
-
WHERE value IN (${
|
|
41
|
+
WHERE value IN (${l})
|
|
42
42
|
)
|
|
43
43
|
ORDER BY o.created_at_epoch DESC
|
|
44
44
|
LIMIT ?
|
|
45
|
-
`).all(r.platformSource??null,r.platformSource??null,...i.length>0?[...i,...i]:[],...n,...s,r.limit)}function
|
|
45
|
+
`).all(r.platformSource??null,r.platformSource??null,...i.length>0?[...i,...i]:[],...n,...s,r.limit)}function Be(t,e,r,n){let o=e.map(()=>"?").join(",");return t.db.prepare(`
|
|
46
46
|
SELECT
|
|
47
47
|
ss.id,
|
|
48
48
|
ss.memory_session_id,
|
|
@@ -62,24 +62,27 @@ ${A.stack??""}
|
|
|
62
62
|
AND (? IS NULL OR s.platform_source = ?)
|
|
63
63
|
ORDER BY ss.created_at_epoch DESC
|
|
64
64
|
LIMIT ?
|
|
65
|
-
`).all(...e,...e,n??null,n??null,r.sessionCount+
|
|
66
|
-
`).filter(o=>o.trim());return{assistantMessage:
|
|
67
|
-
Mode: ${
|
|
65
|
+
`).all(...e,...e,n??null,n??null,r.sessionCount+xe)}function vr(t){return t.replace(/[/.]/g,"-")}function Nr(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(Fe,"").trim(),r)return r}return null}function br(t){for(let e=t.length-1;e>=0;e--)try{let r=Nr(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 xr(t){try{if(!(0,Y.existsSync)(t))return{assistantMessage:""};let e=(0,Y.readFileSync)(t,"utf-8").trim();if(!e)return{assistantMessage:""};let r=e.split(`
|
|
66
|
+
`).filter(o=>o.trim());return{assistantMessage:br(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 je(t,e,r,n){if(!e.showLastMessage||t.length===0)return{assistantMessage:""};let o=t.find(u=>u.memory_session_id!==r);if(!o)return{assistantMessage:""};let s=o.memory_session_id,l=vr(n),i=Ge.default.join(ee,"projects",l,`${s}.jsonl`);return xr(i)}function Ke(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 Ye(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 Xe(){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 Ve(){let t=M.getInstance();return`${t.getActiveMode().name} (${t.getActiveModeId()})`}function qe(t){return[`# [${t}] recent context, ${Xe()}`,`Mode: ${Ve()}`,""]}function ze(){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 Qe(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 Ze(t){return[`### ${t}`]}function et(t){return t.toLowerCase().replace(" am","a").replace(" pm","p")}function tt(t,e,r){let n=t.title||"Untitled",o=M.getInstance().getTypeIcon(t.type),s=e?et(e):'"';return`${t.id} ${s} ${o} ${n}`}function rt(t,e,r,n){let o=[],s=t.title||"Untitled",l=M.getInstance().getTypeIcon(t.type),i=e?et(e):'"',{readTokens:u,discoveryDisplay:E}=P(t,n);o.push(`**${t.id}** ${i} ${l} **${s}**`),r&&o.push(r);let c=[];return n.showReadTokens&&c.push(`~${u}t`),n.showWorkTokens&&c.push(E),c.length>0&&o.push(c.join(" ")),o.push(""),o}function nt(t,e){return[`S${t.id} ${t.request||"Session started"} (${e})`]}function H(t,e){return e?[`**${t}**: ${e}`,""]:[]}function ot(t){return t.assistantMessage?["","---","","**Previously**","",`A: ${t.assistantMessage}`,""]:[]}function st(t,e){return["",`Access ${Math.round(t/1e3)}k tokens of past work via get_observations([IDs]) or mem-search skill.`]}function it(t){return`# [${t}] recent context, ${Xe()}
|
|
67
|
+
Mode: ${Ve()}
|
|
68
68
|
|
|
69
|
-
No previous sessions found.`}function
|
|
70
|
-
${a.bright}${a.cyan}[${t}] recent context, ${
|
|
71
|
-
${a.dim}Mode: ${
|
|
69
|
+
No previous sessions found.`}function at(){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 lt(){let t=M.getInstance();return`${t.getActiveMode().name} (${t.getActiveModeId()})`}function ut(t){return["",`${a.bright}${a.cyan}[${t}] recent context, ${at()}${a.reset}`,`${a.dim}Mode: ${lt()}${a.reset}`,`${a.gray}${"\u2500".repeat(60)}${a.reset}`,""]}function ct(){let e=M.getInstance().getActiveMode().observation_types.map(r=>`${r.emoji} ${r.id}`).join(" | ");return[`${a.dim}Legend: session-request | ${e}${a.reset}`,""]}function Et(){return[`${a.bright}Column Key${a.reset}`,`${a.dim} Read: Tokens to read this observation (cost to learn it now)${a.reset}`,`${a.dim} Work: Tokens spent on work that produced this record ( research, building, deciding)${a.reset}`,""]}function _t(){return[`${a.dim}Context Index: This semantic index (titles, types, files, tokens) is usually sufficient to understand past work.${a.reset}`,"",`${a.dim}When you need implementation details, rationale, or debugging context:${a.reset}`,`${a.dim} - Fetch by ID: get_observations([IDs]) for observations visible in this index${a.reset}`,`${a.dim} - Search history: Use the mem-search skill for past decisions, bugs, and deeper research${a.reset}`,`${a.dim} - Trust this index over re-reading code for past decisions and learnings${a.reset}`,""]}function mt(t,e){let r=[];if(r.push(`${a.bright}${a.cyan}Context Economics${a.reset}`),r.push(`${a.dim} Loading: ${t.totalObservations} observations (${t.totalReadTokens.toLocaleString()} tokens to read)${a.reset}`),r.push(`${a.dim} Work investment: ${t.totalDiscoveryTokens.toLocaleString()} tokens spent on research, building, and decisions${a.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(`${a.green}${n}${a.reset}`)}return r.push(""),r}function gt(t){return[`${a.bright}${a.cyan}${t}${a.reset}`,""]}function dt(t){return[`${a.dim}${t}${a.reset}`]}function pt(t,e,r,n){let o=t.title||"Untitled",s=M.getInstance().getTypeIcon(t.type),{readTokens:l,discoveryTokens:i,workEmoji:u}=P(t,n),E=r?`${a.dim}${e}${a.reset}`:" ".repeat(e.length),c=n.showReadTokens&&l>0?`${a.dim}(~${l}t)${a.reset}`:"",g=n.showWorkTokens&&i>0?`${a.dim}(${u} ${i.toLocaleString()}t)${a.reset}`:"";return` ${a.dim}#${t.id}${a.reset} ${E} ${s} ${o} ${c} ${g}`}function ft(t,e,r,n,o){let s=[],l=t.title||"Untitled",i=M.getInstance().getTypeIcon(t.type),{readTokens:u,discoveryTokens:E,workEmoji:c}=P(t,o),g=r?`${a.dim}${e}${a.reset}`:" ".repeat(e.length),p=o.showReadTokens&&u>0?`${a.dim}(~${u}t)${a.reset}`:"",S=o.showWorkTokens&&E>0?`${a.dim}(${c} ${E.toLocaleString()}t)${a.reset}`:"";return s.push(` ${a.dim}#${t.id}${a.reset} ${g} ${i} ${a.bright}${l}${a.reset}`),n&&s.push(` ${a.dim}${n}${a.reset}`),(p||S)&&s.push(` ${p} ${S}`),s.push(""),s}function Mt(t,e){let r=`${t.request||"Session started"} (${e})`;return[`${a.yellow}#S${t.id}${a.reset} ${r}`,""]}function F(t,e,r){return e?[`${r}${t}:${a.reset} ${e}`,""]:[]}function St(t){return t.assistantMessage?["","---","",`${a.bright}${a.magenta}Previously${a.reset}`,"",`${a.dim}A: ${t.assistantMessage}${a.reset}`,""]:[]}function At(t,e){let r=Math.round(t/1e3);return["",`${a.dim}Access ${r}k tokens of past research & decisions for just ${e.toLocaleString()}t. Use the claude-mem skill to access memories by ID.${a.reset}`]}function Ct(t){return`
|
|
70
|
+
${a.bright}${a.cyan}[${t}] recent context, ${at()}${a.reset}
|
|
71
|
+
${a.dim}Mode: ${lt()}${a.reset}
|
|
72
72
|
${a.gray}${"\u2500".repeat(60)}${a.reset}
|
|
73
73
|
|
|
74
74
|
${a.dim}No previous sessions found for this project yet.${a.reset}
|
|
75
|
-
`}function
|
|
76
|
-
`):null}function
|
|
77
|
-
`)}function
|
|
78
|
-
`):["\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?
|
|
79
|
-
`)}var
|
|
80
|
-
`)
|
|
75
|
+
`}function Tt(t,e,r,n){let o=[];return n?o.push(...ut(t)):o.push(...qe(t)),n?o.push(...ct()):o.push(...ze()),n&&(o.push(...Et()),o.push(..._t())),K(r)&&(n?o.push(...mt(e,r)):o.push(...Qe(e,r))),o}var le=N(require("path"),1);function V(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 ue(t){return new Date(t).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",hour12:!0})}function ce(t){return new Date(t).toLocaleString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}function Dt(t){return new Date(t).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric"})}function Ot(t,e){return le.default.isAbsolute(t)?le.default.relative(e,t):t}function Lt(t,e,r){let n=V(t);if(n.length>0)return Ot(n[0],e);if(r){let o=V(r);if(o.length>0)return Ot(o[0],e)}return"General"}function $r(t){let e=new Map;for(let n of t){let o=n.type==="observation"?n.data.created_at:n.data.displayTime,s=Dt(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 ht(t,e){return e.fullObservationField==="narrative"?t.narrative:t.facts?V(t.facts).join(`
|
|
76
|
+
`):null}function wr(t,e,r,n){let o=[];o.push(...Ze(t));let s="";for(let l of e)if(l.type==="summary"){let i=l.data,u=ue(i.displayTime);o.push(...nt(i,u))}else{let i=l.data,u=ce(i.created_at),c=u!==s?u:"";if(s=u,r.has(i.id)){let p=ht(i,n);o.push(...rt(i,c,p,n))}else o.push(tt(i,c,n))}return o}function kr(t,e,r,n,o){let s=[];s.push(...gt(t));let l=null,i="";for(let u of e)if(u.type==="summary"){l=null,i="";let E=u.data,c=ue(E.displayTime);s.push(...Mt(E,c))}else{let E=u.data,c=Lt(E.files_modified,o,E.files_read),g=ce(E.created_at),p=g!==i;i=g;let S=r.has(E.id);if(c!==l&&(s.push(...dt(c)),l=c),S){let T=ht(E,n);s.push(...ft(E,g,p,T,n))}else s.push(pt(E,g,p,n))}return s.push(""),s}function Pr(t,e,r,n,o,s){return s?kr(t,e,r,n,o):wr(t,e,r,n)}function Rt(t,e,r,n,o){let s=[],l=$r(t);for(let[i,u]of l)s.push(...Pr(i,u,e,r,n,o));return s}function yt(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 Ut(t,e){let r=[];return e?(r.push(...F("Investigated",t.investigated,a.blue)),r.push(...F("Learned",t.learned,a.yellow)),r.push(...F("Completed",t.completed,a.green)),r.push(...F("Next Steps",t.next_steps,a.magenta))):(r.push(...H("Investigated",t.investigated)),r.push(...H("Learned",t.learned)),r.push(...H("Completed",t.completed)),r.push(...H("Next Steps",t.next_steps))),r}function It(t,e){return e?St(t):ot(t)}function vt(t,e,r){return!K(e)||t.totalDiscoveryTokens<=0||t.savings<=0?[]:r?At(t.totalDiscoveryTokens,t.totalReadTokens):st(t.totalDiscoveryTokens,t.totalReadTokens)}var D=require("fs"),Ee=require("path");var q=null;function Nt(){return q!==null||(q=I.loadFromFile(Ae)),q}var Hr="observer-health.json",Fr=3,Gr=600,Wr={consecutiveFailures:0,failingSinceAt:null,lastErrorAt:null,lastErrorMessage:null,lastErrorProvider:null,lastSuccessAt:null,lastErrorCode:null,lastErrorAction:null,lastErrorUrl:null,lastErrorRequestId:null,quotaCooldown:null};function Br(){return(0,Ee.join)(A.dataDir(),Hr)}var jr=/(["']?\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 v(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(jr,(e,r,n,o)=>/^\d+$/.test(o)?e:`${r}${n}\u2026${n}`).slice(0,Gr)}function bt(t=Br()){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:{...Wr,...e}}catch(e){return _.warn("SESSION","Failed to read observer-health file",{filePath:t},e instanceof Error?e:new Error(String(e))),null}}function xt(t){return t!==null&&t.consecutiveFailures>=Fr&&(t.lastErrorAt??0)>(t.lastSuccessAt??0)}function z(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 Kr(){return`http://localhost:${Nt().CLAUDE_MEM_WORKER_PORT}/restart`}function Yr(t){return t.lastErrorKind==="quota_exhausted"}function $t(t,e=Date.now()){let r=t?.quotaCooldown;return r!=null&&typeof r.until=="number"&&r.until>e}function wt(t,e=Date.now()){let r=t.quotaCooldown,n=r?.provider??"unknown provider",o=r?.until,s=o?`${new Date(o).toISOString()} (${z(Math.max(0,o-e))} from now)`:"the next probe window",l=r?.window?` (${r.window})`:"",i=r?.message?v(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}.`,"",...i?[`Latest signal: ${i}`,""]:[],"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(`
|
|
77
|
+
`)}function kt(t,e=Date.now()){let r=t.failingSinceAt??t.lastErrorAt,n=r?`for ${z(e-r)} (since ${new Date(r).toISOString()})`:"for an unknown amount of time",o=t.lastErrorProvider??"unknown provider",s=t.consecutiveFailures,l=t.lastErrorAction?v(t.lastErrorAction):null;return Yr(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?v(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(`
|
|
78
|
+
`):["\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?v(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: ${Kr()}`," 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(`
|
|
79
|
+
`)}var L=require("fs"),Ht=require("path");var Jr="sync-health.json",Xr=900*1e3,Vr=5,Pt={invalid_token:"Cloud sync is paused: this device's sync token is no longer valid (connecting another machine can rotate it). Reconnect at https://cmem.ai (Connect), then restart claude-mem. Your local memories are safe.",subscription_inactive:"Cloud sync is paused: your CMEM Pro trial or subscription is not active. Renew at https://cmem.ai/pro and sync resumes on its own within the hour. Your local memories are safe."};function qr(){return(0,Ht.join)(A.dataDir(),Jr)}function Ft(t=qr()){try{if(!(0,L.existsSync)(t))return null;let e=JSON.parse((0,L.readFileSync)(t,"utf-8"));if(!e||typeof e!="object"||Array.isArray(e))return null;let r=e;return r.state!=="ok"&&r.state!=="auth_paused"&&r.state!=="failing"?null:{state:r.state,code:typeof r.code=="string"?r.code:null,message:typeof r.message=="string"?r.message:null,consecutiveFailures:typeof r.consecutiveFailures=="number"?r.consecutiveFailures:0,failingSinceAt:typeof r.failingSinceAt=="number"?r.failingSinceAt:null,lastErrorAt:typeof r.lastErrorAt=="number"?r.lastErrorAt:null,lastSuccessAt:typeof r.lastSuccessAt=="number"?r.lastSuccessAt:null,updatedAt:typeof r.updatedAt=="number"?r.updatedAt:0}}catch{return null}}function zr(t,e=Date.now()){return t?t.state==="auth_paused"?!0:t.state!=="failing"?!1:t.consecutiveFailures>=Vr?!0:t.failingSinceAt!==null&&e-t.failingSinceAt>=Xr:!1}function Gt(t,e=Date.now()){if(!zr(t,e))return"";if(t.state==="auth_paused")return`\u26A0 ${t.code==="subscription_inactive"||t.code==="invalid_token"?Pt[t.code]:t.message??Pt.invalid_token}`;let r=t.failingSinceAt!==null?` for ${z(e-t.failingSinceAt)}`:"",n=t.message?` Last error: ${v(t.message)}`:"";return[`\u26A0 Cloud sync has been failing${r} (${t.consecutiveFailures} attempt${t.consecutiveFailures===1?"":"s"}). New memories are saved locally and queued; they upload once the sync server accepts them.`+n,"Details: /api/sync/status on the claude-mem worker."].join(`
|
|
80
|
+
`)}var Zr=Bt.default.join((0,jt.homedir)(),".claude","plugins","marketplaces","thedotmack","plugin",".install-version");function en(){try{if(!(0,Q.existsSync)(te))return null;let t=new Kt.Database(te,{readonly:!0,create:!1});try{return t.run(`PRAGMA busy_timeout = ${Ne}`),t}catch(e){throw t.close(),e}}catch(t){if(t instanceof Error&&t.code==="ERR_DLOPEN_FAILED"){try{(0,Q.unlinkSync)(Zr)}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 tn(t,e){return e?Ct(t):it(t)}function rn(t,e,r,n,o,s,l){let i=[],u=ae(e);i.push(...Tt(t,u,n,l));let E=r.slice(0,n.sessionCount),c=Ke(E,r),g=Ye(e,c),p=Je(e,n.fullObservationCount);i.push(...Rt(g,p,n,o,l));let S=r[0],T=e[0];yt(n,S,T)&&i.push(...Ut(S,l));let me=je(e,n,s,o);return i.push(...It(me,l)),i.push(...vt(u,n,l)),i.join(`
|
|
81
|
+
`).trimEnd()}var nn=new Set(["bugfix","discovery","decision","refactor"]);function on(t,e,r){let n=ae(t),o={bugfix:0,discovery:0,decision:0,refactor:0,other:0},s=new Set,l=Number.POSITIVE_INFINITY;for(let u of t){let E=nn.has(u.type)?u.type:"other";o[E]++,u.memory_session_id&&s.add(u.memory_session_id),u.created_at_epoch&&u.created_at_epoch<l&&(l=u.created_at_epoch)}let i=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:i,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 sn(t){return t.split(`
|
|
81
82
|
`).map(e=>e.trim()?`${a.red}${e}${a.reset}`:e).join(`
|
|
82
|
-
`)}function
|
|
83
|
+
`)}function Wt(t,e=!1){return Jt(Yt(e),t)}function Yt(t=!1){let e=bt(),r=null;xt(e)?r=kt(e):$t(e)&&(r=wt(e));let n=Gt(Ft());return n&&(r=r?`${r}
|
|
83
84
|
|
|
84
|
-
${
|
|
85
|
+
${n}`:n),r?t?sn(r):r:""}function Jt(t,e){return t?e?`${e}
|
|
86
|
+
|
|
87
|
+
${t}`:t:e}function an(t,e,r,n,o,s,l){let i=Pe(t,r,(u,E)=>Jt(n,o(u,E)),s);return i.reductions>0&&_.debug("HOOK","Trimmed context to fit the hook output limit",{reductions:i.reductions,observations:i.observationCount,sessions:i.config.sessionCount,chars:i.text.length,overBudget:i.overBudget}),{text:i.text,stats:on(t.slice(0,i.observationCount),e.slice(0,i.config.sessionCount),l)}}async function _e(t,e=!1){let r=ke(),n=t?.cwd??process.cwd(),o=Ue(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 i=en();if(!i)return{text:Wt("",e),stats:null};try{let u={db:i},E=t?.platformSource?ve(t.platformSource):void 0,c=s.length>1?s:[l],g=We(u,c,r,E),p=Be(u,c,r,E);return g.length===0&&p.length===0?{text:Wt(tn(l,e),e),stats:null}:an(g,p,r,Yt(e),(S,T)=>rn(l,S,p,T,n,t?.session_id,e),t?.full?Number.POSITIVE_INFINITY:1e4,!!t?.full)}finally{i.close()}}async function Xt(t,e=!1){return(await _e(t,e)).text}0&&(module.exports={generateContext,generateContextWithStats});
|
|
85
88
|
//# sourceMappingURL=context-generator.cjs.map
|