claude-mem 13.24.17 → 13.24.19
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 +2 -2
- package/dist/npx-cli/index.js +279 -279
- package/dist/opencode-plugin/index.js +11 -11
- 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 +20 -20
- package/plugin/scripts/mcp-server.cjs +42 -42
- package/plugin/scripts/server-service.cjs +138 -136
- package/plugin/scripts/transcript-watcher.cjs +24 -24
- package/plugin/scripts/worker-service.cjs +349 -339
- package/plugin/sqlite/SessionStore.js +14 -4
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
<img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License">
|
|
70
70
|
</a>
|
|
71
71
|
<a href="package.json">
|
|
72
|
-
<img src="https://img.shields.io/badge/version-13.24.
|
|
72
|
+
<img src="https://img.shields.io/badge/version-13.24.19-green.svg" alt="Version">
|
|
73
73
|
</a>
|
|
74
74
|
<a href="package.json">
|
|
75
75
|
<img src="https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg" alt="Node">
|
package/dist/bug-report/index.js
CHANGED
|
@@ -171,8 +171,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
171
171
|
`):e.streamInput(r).catch(s=>i.abort(s))}var q0e=new Set(["EBUSY","EMFILE","ENFILE","ENOTEMPTY","EPERM"]);async function jD(e){for(let t=0;;t++)try{return await Hz(e,{recursive:!0,force:!0})}catch(r){if(t>=4||!q0e.has(Ye(r)??""))return;await ed((t+1)*100)}}function V0e(e,t){e.waitForExit().catch(()=>{}).finally(()=>jD(t))}function FD({prompt:e,options:t}){if((t?.resume||t?.continue)&&t?.sessionStore)return Z0e(e,t);let{queryInstance:r,transport:i,abortController:s}=UD(t,{isSingleUserTurn:typeof e=="string"});return $D(r,i,e,s),r}function Z0e(e,t){let{queryInstance:r,transport:i,abortController:s,processEnv:n}=UD({...t},{isSingleUserTurn:typeof e=="string",deferSpawn:!0}),a=lu(t.cwd??"."),o=t.sessionStore,l=t.loadTimeoutMs??6e4,c=t.resume;return(async()=>{if(c||(c=(await Nn(o.listSessions(BD(a,t.env)),l,`SessionStore.listSessions() timed out after ${l}ms`)).slice().sort((u,p)=>p.mtime-u.mtime)[0]?.sessionId),!!c)return K0e(o,c,a,t.env,t.loadTimeoutMs)})().then(u=>{if(u){i.updateResume(c);let p={CLAUDE_CONFIG_DIR:u};if(process.platform==="win32"){let h=t.env?.CLAUDE_SECURESTORAGE_CONFIG_DIR??process.env.CLAUDE_SECURESTORAGE_CONFIG_DIR??t.env?.CLAUDE_CONFIG_DIR??process.env.CLAUDE_CONFIG_DIR??"";p.CLAUDE_SECURESTORAGE_CONFIG_DIR=h,n.CLAUDE_SECURESTORAGE_CONFIG_DIR=h}i.updateEnv(p),n.CLAUDE_CONFIG_DIR=u,r.addCleanupCallback(()=>V0e(i,u))}r.isClosed()||i.spawn()}).catch(u=>{let p=fl(u);i.spawnAbort(p),r.setError(p)}),$D(r,i,e,s),r}function X0e(e){let t=lu(e??"."),r;try{r=Fz(t)}catch{r=t}return si(r)}function BD(e,t){let r=X0e(e);return t===void 0?ioe(r):(t.CLAUDE_CONFIG_DIR?Ex(t.CLAUDE_CODE_PROJECT_DIR_NAME):void 0)??fk(r)}function Y0e(e){return typeof e=="object"&&e!==null&&"type"in e&&e.type==="agent_metadata"}function DS(e,t){let r=Gz(t,e),i=r.split(lx);if(i[0]===".."||ox(r)||i.length<2)return null;let s=i[0],n=i[1];if(i.length===2&&n.endsWith(".jsonl"))return{projectKey:s,sessionId:n.replace(/\.jsonl$/,"")};if(i.length>=4){let a=i.slice(2),o=a.length-1;return a[o]=a.at(-1).replace(/\.jsonl$/,""),{projectKey:s,sessionId:n,subpath:a.join("/")}}return null}import*as os from"fs/promises";import*as Wr from"path";import{exec as Lwe}from"child_process";import{promisify as Pwe}from"util";import*as qv from"os";import{readFileSync as gwe,existsSync as _we}from"fs";import{join as WD}from"path";import{homedir as KD,hostname as vwe}from"os";var Hv={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 HD(e){return process.platform==="win32"?Math.round(e*Hv.WINDOWS_MULTIPLIER):e}import{closeSync as Wv,existsSync as ewe,fsyncSync as zD,lstatSync as twe,mkdirSync as rwe,openSync as Kv,readFileSync as GRe,readlinkSync as iwe,realpathSync as swe,renameSync as nwe,statSync as awe,unlinkSync as owe,writeSync as lwe}from"fs";import{randomBytes as cwe}from"crypto";import{basename as uwe,dirname as Gv,join as dwe,resolve as pwe}from"path";var J0e=null;function Q0e(e){return(J0e??process.stderr.write.bind(process.stderr))(e)}function zv(e){Q0e(e)}var hwe=process.platform==="win32";function fwe(e){return e.replace(/^\uFEFF/,"")}function Ad(e){return JSON.parse(fwe(e))}function mwe(e){ewe(e)||rwe(e,{recursive:!0})}function xd(e,t){let r=e;try{if(twe(e).isSymbolicLink())try{r=swe(e)}catch(c){let u=c instanceof Error?c:new Error(String(c));zv(`claude-mem: realpathSync failed for ${e}, resolving symlink manually: ${u.message}
|
|
172
172
|
`);let p=iwe(e);r=pwe(Gv(e),p)}}catch(c){let u=c.code;if(u!=="ENOENT"&&u!=="ENOTDIR")throw c}mwe(Gv(r));let i=Gv(r),s=uwe(r),n=dwe(i,`.${s}.${process.pid}.${cwe(6).toString("hex")}.tmp`),a=Buffer.from(JSON.stringify(t,null,2)+`
|
|
173
173
|
`,"utf-8"),o;try{o=awe(r).mode&511}catch{}let l;try{l=o!==void 0?Kv(n,"w",o):Kv(n,"w");let c=0;for(;c<a.length;){let u=lwe(l,a,c,a.length-c);if(u===0)throw new Error(`writeSync stalled at ${c}/${a.length} bytes`);c+=u}if(zD(l),Wv(l),l=void 0,nwe(n,r),!hwe){let u;try{u=Kv(i,"r"),zD(u)}catch(p){let h=p instanceof Error?p:new Error(String(p));zv(`claude-mem: directory fsync failed for ${i}: ${h.message}
|
|
174
|
-
`)}finally{if(u!==void 0)try{Wv(u)}catch{}}}}catch(c){if(l!==void 0)try{Wv(l)}catch{}try{owe(n)}catch{}throw c}}var ywe="security_alert",kd=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(HD(Hv.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:WD(KD(),".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:WD(KD(),".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:vwe(),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(t){
|
|
175
|
-
`).filter(s=>s.trim()).slice(-t)}catch{return[]}}async function Hwe(e){try{let t=Wr.join(e,"settings.json"),r=await os.readFile(t,"utf-8");return{exists:!0,settings:JSON.parse(r)}}catch{return{exists:!1}}}async function zwe(e){try{let t=Wr.join(e,"claude-mem.db");return{exists:!0,size:(await os.stat(t)).size}}catch{return{exists:!1}}}async function Wwe(e){try{let t=Wr.join(e,"claude-mem.db");await os.stat(t);let r="SELECT (SELECT COUNT(*) FROM observations) AS observations, (SELECT COUNT(*) FROM sessions) AS sessions, (SELECT COUNT(*) FROM session_summaries) AS summaries;",{stdout:i}=await Ea(`sqlite3 "${t}" "${r}"`),s=i.trim().split("|");return s.length===3?{observations:parseInt(s[0],10)||0,sessions:parseInt(s[1],10)||0,summaries:parseInt(s[2],10)||0}:void 0}catch{return}}async function Cl(e={}){let t=qv.homedir(),r=Wr.join(t,".claude-mem"),i=Wr.join(t,".claude","plugins","marketplaces","thedotmack"),s=process.cwd(),n=s.includes("claude-mem")&&!s.includes(".claude"),[a,o,l,c]=await Promise.all([Nwe(),Mwe(),Uwe(),$we()]),u={claudeMem:a,claudeCode:o,node:process.version,bun:l},p={os:process.platform,osVersion:c,arch:process.arch},h={pluginPath:Fs(i),dataDir:Fs(r),cwd:Fs(s),isDevMode:n},f=await Bwe(r),_=kd.loadFromFile(qD),v=
|
|
174
|
+
`)}finally{if(u!==void 0)try{Wv(u)}catch{}}}}catch(c){if(l!==void 0)try{Wv(l)}catch{}try{owe(n)}catch{}throw c}}var ywe="security_alert",kd=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(HD(Hv.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:WD(KD(),".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:WD(KD(),".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:vwe(),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(t){let r=process.env[t]??this.DEFAULTS[t];return t==="CLAUDE_MEM_WORKER_HOST"?this.normalizeWorkerHost(r):r}static normalizeWorkerHost(t){return t==="localhost"?"127.0.0.1":t}static finalizeSettings(t,r){let i=r?this.applyEnvOverrides(t):t;return i.CLAUDE_MEM_WORKER_HOST=this.normalizeWorkerHost(i.CLAUDE_MEM_WORKER_HOST),i}static getInt(t){let r=this.get(t);return parseInt(r,10)}static applyEnvOverrides(t){let r={...t};for(let i of Object.keys(this.DEFAULTS))process.env[i]!==void 0&&(r[i]=process.env[i]);return r}static loadFromFile(t,r=!0){try{if(!_we(t)){let c=this.getAllDefaults();try{xd(t,c),console.warn("[SETTINGS] Created settings file with defaults:",t)}catch(u){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",t,u instanceof Error?u.message:String(u))}return this.finalizeSettings(c,r)}let i=gwe(t,"utf-8"),s=Ad(i),n=s,a=s.env&&typeof s.env=="object"&&!Array.isArray(s.env),o=a&&Object.keys(s).some(c=>c!=="env");if(a&&(n=s.env,!o))try{xd(t,n),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",t)}catch(c){console.warn("[SETTINGS] Failed to auto-migrate settings file:",t,c instanceof Error?c.message:String(c))}if(n.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES===ywe){n={...n,CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:this.DEFAULTS.CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES};try{xd(t,o?{...s,env:n}:n),console.warn("[SETTINGS] Migrated Telegram trigger types off the legacy default:",t)}catch(c){console.warn("[SETTINGS] Failed to migrate Telegram trigger types:",t,c instanceof Error?c.message:String(c))}}let l={...this.DEFAULTS};for(let c of Object.keys(this.DEFAULTS))n[c]!==void 0&&(l[c]=n[c]);return this.finalizeSettings(l,r)}catch(i){console.warn("[SETTINGS] Failed to load settings, using defaults:",t,i instanceof Error?i.message:String(i));let s=this.getAllDefaults();return this.finalizeSettings(s,r)}}};import{join as as,dirname as wwe,basename as Swe}from"path";import{homedir as GD}from"os";import{existsSync as Cwe,mkdirSync as uDe,readFileSync as Owe}from"fs";import{fileURLToPath as Awe}from"url";import{homedir as bwe}from"os";import{join as Ewe}from"path";function Td(e,t=process.platform,r=bwe()){return typeof e!="string"||e.length===0?e:e==="~"?r:e.startsWith("~/")||t==="win32"&&e.startsWith("~\\")?Ewe(r,e.slice(2)):e}function xwe(){return typeof __dirname<"u"?__dirname:wwe(Awe(import.meta.url))}var fDe=xwe();function kwe(){if(process.env.CLAUDE_MEM_DATA_DIR)return Td(process.env.CLAUDE_MEM_DATA_DIR);let e=as(GD(),".claude-mem"),t=as(e,"settings.json");try{if(Cwe(t)){let r=Ad(Owe(t,"utf-8")),i=r.env??r;if(i.CLAUDE_MEM_DATA_DIR)return Td(i.CLAUDE_MEM_DATA_DIR)}}catch{}return e}var Rd=kwe(),Twe=as(GD(),".claude"),Rwe=process.env.CLAUDE_CONFIG_DIR||Twe,mDe=as(Rwe,"plugins","marketplaces","thedotmack"),gDe=as(Rd,"logs"),qD=as(Rd,"settings.json"),Dwe="claude-mem.db";var _De=as(Rd,Dwe),Iwe=as(Rd,"observer-sessions"),vDe=Swe(Iwe);var Ea=Pwe(Lwe);function Fs(e){let t=qv.homedir();return e.replace(t,"~")}async function Nwe(){try{let e=Wr.join(process.cwd(),"package.json"),t=await os.readFile(e,"utf-8");return JSON.parse(t).version||"unknown"}catch{return"unknown"}}async function Mwe(){try{let{stdout:e}=await Ea("claude --version");return e.trim()}catch{return"not installed or not in PATH"}}async function Uwe(){try{let{stdout:e}=await Ea("bun --version");return e.trim()}catch{return"not installed"}}async function $we(){try{if(process.platform==="darwin"){let{stdout:e}=await Ea("sw_vers -productVersion");return`macOS ${e.trim()}`}else if(process.platform==="linux"){let{stdout:e}=await Ea("uname -sr");return e.trim()}else if(process.platform==="win32"){let{stdout:e}=await Ea("ver");return e.trim()}return"unknown"}catch{return"unknown"}}async function jwe(e,t){try{return await(await fetch(`http://${e}:${t}/api/health`,{signal:AbortSignal.timeout(2e3)})).json()}catch{return null}}async function Fwe(e,t){try{return await(await fetch(`http://${e}:${t}/api/stats`,{signal:AbortSignal.timeout(2e3)})).json()}catch{return null}}async function Bwe(e){try{let t=Wr.join(e,"worker.pid"),r=await os.readFile(t,"utf-8");return JSON.parse(r)}catch{return null}}async function VD(e,t){try{return(await os.readFile(e,"utf-8")).split(`
|
|
175
|
+
`).filter(s=>s.trim()).slice(-t)}catch{return[]}}async function Hwe(e){try{let t=Wr.join(e,"settings.json"),r=await os.readFile(t,"utf-8");return{exists:!0,settings:JSON.parse(r)}}catch{return{exists:!1}}}async function zwe(e){try{let t=Wr.join(e,"claude-mem.db");return{exists:!0,size:(await os.stat(t)).size}}catch{return{exists:!1}}}async function Wwe(e){try{let t=Wr.join(e,"claude-mem.db");await os.stat(t);let r="SELECT (SELECT COUNT(*) FROM observations) AS observations, (SELECT COUNT(*) FROM sessions) AS sessions, (SELECT COUNT(*) FROM session_summaries) AS summaries;",{stdout:i}=await Ea(`sqlite3 "${t}" "${r}"`),s=i.trim().split("|");return s.length===3?{observations:parseInt(s[0],10)||0,sessions:parseInt(s[1],10)||0,summaries:parseInt(s[2],10)||0}:void 0}catch{return}}async function Cl(e={}){let t=qv.homedir(),r=Wr.join(t,".claude-mem"),i=Wr.join(t,".claude","plugins","marketplaces","thedotmack"),s=process.cwd(),n=s.includes("claude-mem")&&!s.includes(".claude"),[a,o,l,c]=await Promise.all([Nwe(),Mwe(),Uwe(),$we()]),u={claudeMem:a,claudeCode:o,node:process.version,bun:l},p={os:process.platform,osVersion:c,arch:process.arch},h={pluginPath:Fs(i),dataDir:Fs(r),cwd:Fs(s),isDevMode:n},f=await Bwe(r),_=kd.loadFromFile(qD),v=_.CLAUDE_MEM_WORKER_HOST,E=process.env.CLAUDE_MEM_WORKER_PORT||_.CLAUDE_MEM_WORKER_PORT,y=typeof f?.port=="number"?f.port:parseInt(E,10),[m,g]=await Promise.all([jwe(v,y),Fwe(v,y)]),b={running:m!==null,pid:f?.pid,port:y,uptime:g?.worker?.uptime,version:g?.worker?.version,health:m,stats:g},C=[],A=[];if(e.includeLogs!==!1){let P=new Date().toISOString().split("T")[0],$=Wr.join(r,"logs",`worker-${P}.log`),se=Wr.join(r,"silent.log");[C,A]=await Promise.all([VD($,50),VD(se,50)])}let w={workerLog:C.map(Fs),silentLog:A.map(Fs)},[S,x]=await Promise.all([zwe(r),Wwe(r)]),T={path:Fs(Wr.join(r,"claude-mem.db")),exists:S.exists,size:S.size,counts:x},I=await Hwe(r),L={settingsPath:Fs(Wr.join(r,"settings.json")),settingsExist:I.exists,settings:I.settings};return{versions:u,platform:p,paths:h,worker:b,logs:w,database:T,config:L}}function Vv(e){let t="";if(t+=`## Environment
|
|
176
176
|
|
|
177
177
|
`,t+=`- **Claude-mem**: ${e.versions.claudeMem}
|
|
178
178
|
`,t+=`- **Claude Code**: ${e.versions.claudeCode}
|