keepmind 1.3.2 → 1.3.3
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/dist/npx-cli/index.js +93 -93
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +0 -12
- package/plugin/package.json +1 -1
- package/plugin/scripts/context-generator.cjs +50 -50
- package/plugin/scripts/hook-client.cjs +1 -1
- package/plugin/scripts/mcp-server.cjs +1 -1
- package/plugin/scripts/worker-service.cjs +6 -6
package/dist/npx-cli/index.js
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var Uu=Object.create;var $n=Object.defineProperty;var Fu=Object.getOwnPropertyDescriptor;var Wu=Object.getOwnPropertyNames;var ju=Object.getPrototypeOf,Gu=Object.prototype.hasOwnProperty;var S=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Ri=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},he=(t,e)=>{for(var r in e)$n(t,r,{get:e[r],enumerable:!0})},Bu=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Wu(e))!Gu.call(t,s)&&s!==r&&$n(t,s,{get:()=>e[s],enumerable:!(n=Fu(e,s))||n.enumerable});return t};var je=(t,e,r)=>(r=t!=null?Uu(ju(t)):{},Bu(e||!t||!t.__esModule?$n(r,"default",{value:t,enumerable:!0}):r,t));var rt=Ri((zE,es)=>{var Gr=process||{},wi=Gr.argv||[],jr=Gr.env||{},Hu=!(jr.NO_COLOR||wi.includes("--no-color"))&&(!!jr.FORCE_COLOR||wi.includes("--color")||Gr.platform==="win32"||(Gr.stdout||{}).isTTY&&jr.TERM!=="dumb"||!!jr.CI),Ju=(t,e,r=t)=>n=>{let s=""+n,o=s.indexOf(e,t.length);return~o?t+Ku(s,e,r,o)+e:t+s+e},Ku=(t,e,r,n)=>{let s="",o=0;do s+=t.substring(o,n)+r,o=n+e.length,n=t.indexOf(e,o);while(~n);return s+t.substring(o)},Ii=(t=Hu)=>{let e=t?Ju:()=>String;return{isColorSupported:t,reset:e("\x1B[0m","\x1B[0m"),bold:e("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:e("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:e("\x1B[3m","\x1B[23m"),underline:e("\x1B[4m","\x1B[24m"),inverse:e("\x1B[7m","\x1B[27m"),hidden:e("\x1B[8m","\x1B[28m"),strikethrough:e("\x1B[9m","\x1B[29m"),black:e("\x1B[30m","\x1B[39m"),red:e("\x1B[31m","\x1B[39m"),green:e("\x1B[32m","\x1B[39m"),yellow:e("\x1B[33m","\x1B[39m"),blue:e("\x1B[34m","\x1B[39m"),magenta:e("\x1B[35m","\x1B[39m"),cyan:e("\x1B[36m","\x1B[39m"),white:e("\x1B[37m","\x1B[39m"),gray:e("\x1B[90m","\x1B[39m"),bgBlack:e("\x1B[40m","\x1B[49m"),bgRed:e("\x1B[41m","\x1B[49m"),bgGreen:e("\x1B[42m","\x1B[49m"),bgYellow:e("\x1B[43m","\x1B[49m"),bgBlue:e("\x1B[44m","\x1B[49m"),bgMagenta:e("\x1B[45m","\x1B[49m"),bgCyan:e("\x1B[46m","\x1B[49m"),bgWhite:e("\x1B[47m","\x1B[49m"),blackBright:e("\x1B[90m","\x1B[39m"),redBright:e("\x1B[91m","\x1B[39m"),greenBright:e("\x1B[92m","\x1B[39m"),yellowBright:e("\x1B[93m","\x1B[39m"),blueBright:e("\x1B[94m","\x1B[39m"),magentaBright:e("\x1B[95m","\x1B[39m"),cyanBright:e("\x1B[96m","\x1B[39m"),whiteBright:e("\x1B[97m","\x1B[39m"),bgBlackBright:e("\x1B[100m","\x1B[49m"),bgRedBright:e("\x1B[101m","\x1B[49m"),bgGreenBright:e("\x1B[102m","\x1B[49m"),bgYellowBright:e("\x1B[103m","\x1B[49m"),bgBlueBright:e("\x1B[104m","\x1B[49m"),bgMagentaBright:e("\x1B[105m","\x1B[49m"),bgCyanBright:e("\x1B[106m","\x1B[49m"),bgWhiteBright:e("\x1B[107m","\x1B[49m")}};es.exports=Ii();es.exports.createColors=Ii});import{existsSync as Vu,readFileSync as Xu}from"fs";function z(t,e){if(!Vu(t))return e;try{return JSON.parse(Xu(t,"utf-8"))}catch(r){throw new Error(`Corrupt JSON file, refusing to overwrite: ${t}: ${r instanceof Error?r.message:String(r)}`)}}var Qt=S(()=>{"use strict"});import{closeSync as ts,existsSync as $t,fsyncSync as Oi,lstatSync as Yu,mkdirSync as qu,openSync as rs,readFileSync as ki,readlinkSync as zu,realpathSync as Zu,renameSync as Qu,statSync as $u,unlinkSync as ed,writeSync as td}from"fs";import{homedir as rd}from"os";import{basename as nd,dirname as Br,join as Ee,resolve as sd}from"path";import{fileURLToPath as od}from"url";import{randomBytes as id}from"crypto";function ns(){return process.env.CLAUDE_CONFIG_DIR||Ee(rd(),".claude")}function ee(){return Ee(ns(),"plugins","marketplaces","keepmind")}function Se(){return Ee(ns(),"plugins")}function xe(){return Ee(Se(),"known_marketplaces.json")}function Le(){return Ee(Se(),"installed_plugins.json")}function Re(){return Ee(ns(),"settings.json")}function nt(t){return Ee(Se(),"cache","keepmind","keepmind",t)}function Hr(){let t=od(import.meta.url),e=Ee(Br(t),"..","..");if(!$t(Ee(e,"package.json")))throw new Error(`npmPackageRootDirectory: expected package.json at ${e}. Bundle structure may have changed \u2014 update the path walk.`);return e}function ss(){return Ee(Hr(),"plugin")}function xt(){let t=Ee(ss(),".claude-plugin","plugin.json");if($t(t))try{let r=JSON.parse(ki(t,"utf-8"));if(r.version)return r.version}catch{}let e=Ee(Hr(),"package.json");if($t(e))try{let r=JSON.parse(ki(e,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}function Lt(){let t=ee();return $t(Ee(t,"plugin",".claude-plugin","plugin.json"))}function er(t){$t(t)||qu(t,{recursive:!0})}function se(t,e){let r=t;try{if(Yu(t).isSymbolicLink())try{r=Zu(t)}catch{let c=zu(t);r=sd(Br(t),c)}}catch(c){let
|
|
3
|
-
`,"utf-8"),a;try{a=$u(r).mode&511}catch{}let l;try{l=a!==void 0?rs(o,"w",a):rs(o,"w");let c=0;for(;c<i.length;){let
|
|
4
|
-
`)}var Jr,Bi,gd,as,Hi,hd,Ji,ls,Fi,Wi,ji,Gi,is,Ed,Sd,bd,cs=S(()=>{os();Jr="\x1B",Bi="\x9B",gd=39,as="\x07",Hi="[",hd="]",Ji="m",ls=`${hd}8;;`,Fi=new RegExp(`(?:\\${Hi}(?<code>\\d+)m|\\${ls}(?<uri>.*)${as})`,"y"),Wi=t=>{if(t>=30&&t<=37||t>=90&&t<=97)return 39;if(t>=40&&t<=47||t>=100&&t<=107)return 49;if(t===1||t===2)return 22;if(t===3)return 23;if(t===4)return 24;if(t===7)return 27;if(t===8)return 28;if(t===9)return 29;if(t===0)return 0},ji=t=>`${Jr}${Hi}${t}${Ji}`,Gi=t=>`${Jr}${ls}${t}${as}`,is=(t,e,r)=>{let n=e[Symbol.iterator](),s=!1,o=!1,i=t.at(-1),a=i===void 0?0:pe(i),l=n.next(),c=n.next(),
|
|
5
|
-
`),
|
|
2
|
+
var Uu=Object.create;var $n=Object.defineProperty;var Fu=Object.getOwnPropertyDescriptor;var Wu=Object.getOwnPropertyNames;var ju=Object.getPrototypeOf,Gu=Object.prototype.hasOwnProperty;var S=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var Ri=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},he=(t,e)=>{for(var r in e)$n(t,r,{get:e[r],enumerable:!0})},Bu=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Wu(e))!Gu.call(t,s)&&s!==r&&$n(t,s,{get:()=>e[s],enumerable:!(n=Fu(e,s))||n.enumerable});return t};var je=(t,e,r)=>(r=t!=null?Uu(ju(t)):{},Bu(e||!t||!t.__esModule?$n(r,"default",{value:t,enumerable:!0}):r,t));var rt=Ri((zE,es)=>{var Gr=process||{},wi=Gr.argv||[],jr=Gr.env||{},Hu=!(jr.NO_COLOR||wi.includes("--no-color"))&&(!!jr.FORCE_COLOR||wi.includes("--color")||Gr.platform==="win32"||(Gr.stdout||{}).isTTY&&jr.TERM!=="dumb"||!!jr.CI),Ju=(t,e,r=t)=>n=>{let s=""+n,o=s.indexOf(e,t.length);return~o?t+Ku(s,e,r,o)+e:t+s+e},Ku=(t,e,r,n)=>{let s="",o=0;do s+=t.substring(o,n)+r,o=n+e.length,n=t.indexOf(e,o);while(~n);return s+t.substring(o)},Ii=(t=Hu)=>{let e=t?Ju:()=>String;return{isColorSupported:t,reset:e("\x1B[0m","\x1B[0m"),bold:e("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:e("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:e("\x1B[3m","\x1B[23m"),underline:e("\x1B[4m","\x1B[24m"),inverse:e("\x1B[7m","\x1B[27m"),hidden:e("\x1B[8m","\x1B[28m"),strikethrough:e("\x1B[9m","\x1B[29m"),black:e("\x1B[30m","\x1B[39m"),red:e("\x1B[31m","\x1B[39m"),green:e("\x1B[32m","\x1B[39m"),yellow:e("\x1B[33m","\x1B[39m"),blue:e("\x1B[34m","\x1B[39m"),magenta:e("\x1B[35m","\x1B[39m"),cyan:e("\x1B[36m","\x1B[39m"),white:e("\x1B[37m","\x1B[39m"),gray:e("\x1B[90m","\x1B[39m"),bgBlack:e("\x1B[40m","\x1B[49m"),bgRed:e("\x1B[41m","\x1B[49m"),bgGreen:e("\x1B[42m","\x1B[49m"),bgYellow:e("\x1B[43m","\x1B[49m"),bgBlue:e("\x1B[44m","\x1B[49m"),bgMagenta:e("\x1B[45m","\x1B[49m"),bgCyan:e("\x1B[46m","\x1B[49m"),bgWhite:e("\x1B[47m","\x1B[49m"),blackBright:e("\x1B[90m","\x1B[39m"),redBright:e("\x1B[91m","\x1B[39m"),greenBright:e("\x1B[92m","\x1B[39m"),yellowBright:e("\x1B[93m","\x1B[39m"),blueBright:e("\x1B[94m","\x1B[39m"),magentaBright:e("\x1B[95m","\x1B[39m"),cyanBright:e("\x1B[96m","\x1B[39m"),whiteBright:e("\x1B[97m","\x1B[39m"),bgBlackBright:e("\x1B[100m","\x1B[49m"),bgRedBright:e("\x1B[101m","\x1B[49m"),bgGreenBright:e("\x1B[102m","\x1B[49m"),bgYellowBright:e("\x1B[103m","\x1B[49m"),bgBlueBright:e("\x1B[104m","\x1B[49m"),bgMagentaBright:e("\x1B[105m","\x1B[49m"),bgCyanBright:e("\x1B[106m","\x1B[49m"),bgWhiteBright:e("\x1B[107m","\x1B[49m")}};es.exports=Ii();es.exports.createColors=Ii});import{existsSync as Vu,readFileSync as Xu}from"fs";function z(t,e){if(!Vu(t))return e;try{return JSON.parse(Xu(t,"utf-8"))}catch(r){throw new Error(`Corrupt JSON file, refusing to overwrite: ${t}: ${r instanceof Error?r.message:String(r)}`)}}var Qt=S(()=>{"use strict"});import{closeSync as ts,existsSync as $t,fsyncSync as Oi,lstatSync as Yu,mkdirSync as qu,openSync as rs,readFileSync as ki,readlinkSync as zu,realpathSync as Zu,renameSync as Qu,statSync as $u,unlinkSync as ed,writeSync as td}from"fs";import{homedir as rd}from"os";import{basename as nd,dirname as Br,join as Ee,resolve as sd}from"path";import{fileURLToPath as od}from"url";import{randomBytes as id}from"crypto";function ns(){return process.env.CLAUDE_CONFIG_DIR||Ee(rd(),".claude")}function ee(){return Ee(ns(),"plugins","marketplaces","keepmind")}function Se(){return Ee(ns(),"plugins")}function xe(){return Ee(Se(),"known_marketplaces.json")}function Le(){return Ee(Se(),"installed_plugins.json")}function Re(){return Ee(ns(),"settings.json")}function nt(t){return Ee(Se(),"cache","keepmind","keepmind",t)}function Hr(){let t=od(import.meta.url),e=Ee(Br(t),"..","..");if(!$t(Ee(e,"package.json")))throw new Error(`npmPackageRootDirectory: expected package.json at ${e}. Bundle structure may have changed \u2014 update the path walk.`);return e}function ss(){return Ee(Hr(),"plugin")}function xt(){let t=Ee(ss(),".claude-plugin","plugin.json");if($t(t))try{let r=JSON.parse(ki(t,"utf-8"));if(r.version)return r.version}catch{}let e=Ee(Hr(),"package.json");if($t(e))try{let r=JSON.parse(ki(e,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}function Lt(){let t=ee();return $t(Ee(t,"plugin",".claude-plugin","plugin.json"))}function er(t){$t(t)||qu(t,{recursive:!0})}function se(t,e){let r=t;try{if(Yu(t).isSymbolicLink())try{r=Zu(t)}catch{let c=zu(t);r=sd(Br(t),c)}}catch(c){let d=c.code;if(d!=="ENOENT"&&d!=="ENOTDIR")throw c}er(Br(r));let n=Br(r),s=nd(r),o=Ee(n,`.${s}.${process.pid}.${id(6).toString("hex")}.tmp`),i=Buffer.from(JSON.stringify(e,null,2)+`
|
|
3
|
+
`,"utf-8"),a;try{a=$u(r).mode&511}catch{}let l;try{l=a!==void 0?rs(o,"w",a):rs(o,"w");let c=0;for(;c<i.length;){let d=td(l,i,c,i.length-c);if(d===0)throw new Error(`writeSync stalled at ${c}/${i.length} bytes`);c+=d}if(Oi(l),ts(l),l=void 0,Qu(o,r),!j){let d;try{d=rs(n,"r"),Oi(d)}catch{}finally{if(d!==void 0)try{ts(d)}catch{}}}}catch(c){if(l!==void 0)try{ts(l)}catch{}try{ed(o)}catch{}throw c}}var j,Ae=S(()=>{"use strict";Qt();j=process.platform==="win32"});var _i,Ai,Ni,Mi=S(()=>{_i=(()=>{let t=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return e=>{let r=0;for(t.lastIndex=0;t.test(e);)r+=1;return e.length-r}})(),Ai=t=>t===12288||t>=65281&&t<=65376||t>=65504&&t<=65510,Ni=t=>t===8987||t===9001||t>=12272&&t<=12287||t>=12289&&t<=12350||t>=12441&&t<=12543||t>=12549&&t<=12591||t>=12593&&t<=12686||t>=12688&&t<=12771||t>=12783&&t<=12830||t>=12832&&t<=12871||t>=12880&&t<=19903||t>=65040&&t<=65049||t>=65072&&t<=65106||t>=65108&&t<=65126||t>=65128&&t<=65131||t>=127488&&t<=127490||t>=127504&&t<=127547||t>=127552&&t<=127560||t>=131072&&t<=196605||t>=196608&&t<=262141});var ad,ld,xi,cd,Li,ud,dd,pd,Di,Pi,Ui=S(()=>{Mi();ad=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,ld=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,xi=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,cd=/\t{1,1000}/y,Li=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu"),ud=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,dd=new RegExp("\\p{M}+","gu"),pd={limit:1/0,ellipsis:""},Di=(t,e={},r={})=>{let n=e.limit??1/0,s=e.ellipsis??"",o=e?.ellipsisWidth??(s?Di(s,pd,r).width:0),i=0,a=r.controlWidth??0,l=r.tabWidth??8,c=r.emojiWidth??2,d=2,m=r.regularWidth??1,f=r.wideWidth??d,E=[[ud,m],[ad,i],[ld,a],[cd,l],[Li,c],[xi,f]],h=0,b=0,y=t.length,C=0,A=!1,D=y,R=Math.max(0,n-o),T=0,v=0,I=0,Y=0;e:for(;;){if(v>T||b>=y&&b>h){let Z=t.slice(T,v)||t.slice(h,b);C=0;for(let ve of Z.replaceAll(dd,"")){let Q=ve.codePointAt(0)||0;if(Ai(Q)?Y=d:Ni(Q)?Y=f:Y=m,I+Y>R&&(D=Math.min(D,Math.max(T,h)+C)),I+Y>n){A=!0;break e}C+=ve.length,I+=Y}T=v=0}if(b>=y)break e;for(let Z=0,ve=E.length;Z<ve;Z++){let[Q,Mt]=E[Z];if(Q.lastIndex=b,Q.test(t)){if(C=Q===xi?_i(t.slice(b,Q.lastIndex)):Q===Li?1:Q.lastIndex-b,Y=C*Mt,I+Y>R&&(D=Math.min(D,b+Math.floor((R-I)/Mt))),I+Y>n){A=!0;break e}I+=Y,T=h,v=b,b=h=Q.lastIndex;continue e}}b+=1}return{width:A?R:I,index:A?D:y,truncated:A,ellipsed:A&&n>=o}},Pi=Di});var md,fd,pe,os=S(()=>{Ui();md={limit:1/0,ellipsis:"",ellipsisWidth:0},fd=(t,e={})=>Pi(t,md,e).width,pe=fd});function De(t,e,r){return String(t).normalize().split(bd).map(n=>Sd(n,e,r)).join(`
|
|
4
|
+
`)}var Jr,Bi,gd,as,Hi,hd,Ji,ls,Fi,Wi,ji,Gi,is,Ed,Sd,bd,cs=S(()=>{os();Jr="\x1B",Bi="\x9B",gd=39,as="\x07",Hi="[",hd="]",Ji="m",ls=`${hd}8;;`,Fi=new RegExp(`(?:\\${Hi}(?<code>\\d+)m|\\${ls}(?<uri>.*)${as})`,"y"),Wi=t=>{if(t>=30&&t<=37||t>=90&&t<=97)return 39;if(t>=40&&t<=47||t>=100&&t<=107)return 49;if(t===1||t===2)return 22;if(t===3)return 23;if(t===4)return 24;if(t===7)return 27;if(t===8)return 28;if(t===9)return 29;if(t===0)return 0},ji=t=>`${Jr}${Hi}${t}${Ji}`,Gi=t=>`${Jr}${ls}${t}${as}`,is=(t,e,r)=>{let n=e[Symbol.iterator](),s=!1,o=!1,i=t.at(-1),a=i===void 0?0:pe(i),l=n.next(),c=n.next(),d=0;for(;!l.done;){let m=l.value,f=pe(m);a+f<=r?t[t.length-1]+=m:(t.push(m),a=0),(m===Jr||m===Bi)&&(s=!0,o=e.startsWith(ls,d+1)),s?o?m===as&&(s=!1,o=!1):m===Ji&&(s=!1):(a+=f,a===r&&!c.done&&(t.push(""),a=0)),l=c,c=n.next(),d+=m.length}i=t.at(-1),!a&&i!==void 0&&i.length&&t.length>1&&(t[t.length-2]+=t.pop())},Ed=t=>{let e=t.split(" "),r=e.length;for(;r&&!pe(e[r-1]);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},Sd=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let n="",s,o,i=t.split(" "),a=[""],l=0;for(let m=0;m<i.length;m++){let f=i[m];if(r.trim!==!1){let h=a.at(-1)??"",b=h.trimStart();h.length!==b.length&&(a[a.length-1]=b,l=pe(b))}m!==0&&(l>=e&&(r.wordWrap===!1||r.trim===!1)&&(a.push(""),l=0),(l||r.trim===!1)&&(a[a.length-1]+=" ",l++));let E=pe(f);if(r.hard&&E>e){let h=e-l,b=1+Math.floor((E-h-1)/e);Math.floor((E-1)/e)<b&&a.push(""),is(a,f,e),l=pe(a.at(-1)??"");continue}if(l+E>e&&l&&E){if(r.wordWrap===!1&&l<e){is(a,f,e),l=pe(a.at(-1)??"");continue}a.push(""),l=0}if(l+E>e&&r.wordWrap===!1){is(a,f,e),l=pe(a.at(-1)??"");continue}a[a.length-1]+=f,l+=E}r.trim!==!1&&(a=a.map(m=>Ed(m)));let c=a.join(`
|
|
5
|
+
`),d=!1;for(let m=0;m<c.length;m++){let f=c[m];if(n+=f,d)d=!1;else if(d=f>="\uD800"&&f<="\uDBFF",d)continue;if(f===Jr||f===Bi){Fi.lastIndex=m+1;let h=Fi.exec(c)?.groups;if(h?.code!==void 0){let b=Number.parseFloat(h.code);s=b===gd?void 0:b}else h?.uri!==void 0&&(o=h.uri.length===0?void 0:h.uri)}if(c[m+1]===`
|
|
6
6
|
`){o&&(n+=Gi(""));let E=s?Wi(s):void 0;s&&E&&(n+=ji(E))}else f===`
|
|
7
7
|
`&&(s&&Wi(s)&&(n+=ji(s)),o&&(n+=Gi(o)))}return n},bd=/\r?\n/});var ds=Ri((mS,Ki)=>{"use strict";var us={to(t,e){return e?`\x1B[${e+1};${t+1}H`:`\x1B[${t+1}G`},move(t,e){let r="";return t<0?r+=`\x1B[${-t}D`:t>0&&(r+=`\x1B[${t}C`),e<0?r+=`\x1B[${-e}A`:e>0&&(r+=`\x1B[${e}B`),r},up:(t=1)=>`\x1B[${t}A`,down:(t=1)=>`\x1B[${t}B`,forward:(t=1)=>`\x1B[${t}C`,backward:(t=1)=>`\x1B[${t}D`,nextLine:(t=1)=>"\x1B[E".repeat(t),prevLine:(t=1)=>"\x1B[F".repeat(t),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},yd={up:(t=1)=>"\x1B[S".repeat(t),down:(t=1)=>"\x1B[T".repeat(t)},Td={screen:"\x1B[2J",up:(t=1)=>"\x1B[1J".repeat(t),down:(t=1)=>"\x1B[J".repeat(t),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(t){let e="";for(let r=0;r<t;r++)e+=this.line+(r<t-1?us.up():"");return t&&(e+=us.left),e}};Ki.exports={cursor:us,scroll:yd,erase:Td,beep:"\x07"}});import{styleText as ps}from"node:util";import{stdout as fs,stdin as Xi}from"node:process";import*as st from"node:readline";import vd from"node:readline";import{ReadStream as Vi}from"node:tty";function St(t,e,r){if(!r.some(i=>!i.disabled))return t;let n=t+e,s=Math.max(r.length-1,0),o=n<0?s:n>s?0:n;return r[o].disabled?St(o,e<0?-1:1,r):o}function gs(t,e){if(typeof t=="string")return te.aliases.get(t)===e;for(let r of t)if(r!==void 0&&gs(r,e))return!0;return!1}function wd(t,e){if(t===e)return;let r=t.split(`
|
|
8
8
|
`),n=e.split(`
|
|
9
9
|
`),s=Math.max(r.length,n.length),o=[];for(let i=0;i<s;i++)r[i]!==n[i]&&o.push(i);return{lines:o,numLinesBefore:r.length,numLinesAfter:n.length,numLines:s}}function X(t){return t===ms}function Kr(t,e){let r=t;r.isTTY&&r.setRawMode(e)}function Yi({input:t=Xi,output:e=fs,overwrite:r=!0,hideCursor:n=!0}={}){let s=st.createInterface({input:t,output:e,prompt:"",tabSize:1});st.emitKeypressEvents(t,s),t instanceof Vi&&t.isTTY&&t.setRawMode(!0);let o=(i,{name:a,sequence:l})=>{let c=String(i);if(gs([c,a,l],"cancel")){n&&e.write(le.cursor.show),process.exit(0);return}if(!r)return;st.moveCursor(e,a==="return"?0:-1,a==="return"?-1:0,()=>{st.clearLine(e,1,()=>{t.once("keypress",o)})})};return n&&e.write(le.cursor.hide),t.once("keypress",o),()=>{t.off("keypress",o),n&&e.write(le.cursor.show),t instanceof Vi&&t.isTTY&&!Id&&t.setRawMode(!1),s.terminal=!1,s.close()}}function ot(t,e,r,n=r,s=r,o){let i=tr(t??fs);return De(e,i-r.length,{hard:!0,trim:!1}).split(`
|
|
10
|
-
`).map((a,l,c)=>{let
|
|
10
|
+
`).map((a,l,c)=>{let d=o?o(a,l):a;return l===0?`${n}${d}`:l===c.length-1?`${s}${d}`:`${r}${d}`}).join(`
|
|
11
11
|
`)}function qi(t,e){if("~standard"in t){let r=t["~standard"].validate(e);if(r instanceof Promise)throw new TypeError("Schema validation must be synchronous. Update `validate()` and remove any asynchronous logic.");return r.issues?.at(0)?.message}return t(e)}var le,Cd,Rd,te,Id,ms,tr,hs,bt,Vr,zi,Xr,Yr,qr,Es=S(()=>{cs();le=je(ds(),1);Cd=["up","down","left","right","space","enter","cancel"],Rd=["January","February","March","April","May","June","July","August","September","October","November","December"],te={actions:new Set(Cd),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[...Rd],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(t,e)=>`There are only ${t} days in ${e}`,afterMin:t=>`Date must be on or after ${t.toISOString().slice(0,10)}`,beforeMax:t=>`Date must be on or before ${t.toISOString().slice(0,10)}`}}};Id=globalThis.process.platform.startsWith("win"),ms=Symbol("clack:cancel");tr=t=>"columns"in t&&typeof t.columns=="number"?t.columns:80,hs=t=>"rows"in t&&typeof t.rows=="number"?t.rows:20;bt=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(e,r=!0){let{input:n=Xi,output:s=fs,render:o,signal:i,...a}=e;this.opts=a,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=o.bind(this),this._track=r,this._abortSignal=i,this.input=n,this.output=s}unsubscribe(){this._subscribers.clear()}setSubscriber(e,r){let n=this._subscribers.get(e)??[];n.push(r),this._subscribers.set(e,n)}on(e,r){this.setSubscriber(e,{cb:r})}once(e,r){this.setSubscriber(e,{cb:r,once:!0})}emit(e,...r){let n=this._subscribers.get(e)??[],s=[];for(let o of n)o.cb(...r),o.once&&s.push(()=>n.splice(n.indexOf(o),1));for(let o of s)o()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),e(ms);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=vd.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),Kr(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(le.cursor.show),this.output.off("resize",this.render),Kr(this.input,!1),e(this.value)}),this.once("cancel",()=>{this.output.write(le.cursor.show),this.output.off("resize",this.render),Kr(this.input,!1),e(ms)})})}_isActionKey(e,r){return e===" "}_shouldSubmit(e,r){return!0}_setValue(e){this.value=e,this.emit("value",this.value)}_setUserInput(e,r){this.userInput=e??"",this.emit("userInput",this.userInput),r&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(e,r){if(this._track&&r.name!=="return"&&(r.name&&this._isActionKey(e,r)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),r?.name&&(!this._track&&te.aliases.has(r.name)&&this.emit("cursor",te.aliases.get(r.name)),te.actions.has(r.name)&&this.emit("cursor",r.name)),e&&(e.toLowerCase()==="y"||e.toLowerCase()==="n")&&this.emit("confirm",e.toLowerCase()==="y"),this.emit("key",e,r),r?.name==="return"&&this._shouldSubmit(e,r)){if(this.opts.validate){let n=qi(this.opts.validate,this.value);n&&(this.error=n instanceof Error?n.message:n,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}gs([e,r?.name,r?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
12
12
|
`),Kr(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=De(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
13
13
|
`).length-1;this.output.write(le.cursor.move(-999,e*-1))}render(){let e=De(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state==="initial")this.output.write(le.cursor.hide);else{let r=wd(this._prevFrame,e),n=hs(this.output);if(this.restoreCursor(),r){let s=Math.max(0,r.numLinesAfter-n),o=Math.max(0,r.numLinesBefore-n),i=r.lines.find(a=>a>=s);if(i===void 0){this._prevFrame=e;return}if(r.lines.length===1){this.output.write(le.cursor.move(0,i-o)),this.output.write(le.erase.lines(1));let a=e.split(`
|
|
14
14
|
`);this.output.write(a[i]),this._prevFrame=e,this.output.write(le.cursor.move(0,a.length-i-1));return}else if(r.lines.length>1){if(s<o)i=s;else{let l=i-o;l>0&&this.output.write(le.cursor.move(0,l))}this.output.write(le.erase.down());let a=e.split(`
|
|
15
15
|
`).slice(i);this.output.write(a.join(`
|
|
16
|
-
`)),this._prevFrame=e;return}}this.output.write(le.erase.down())}this.output.write(e),this.state==="initial"&&(this.state="active"),this._prevFrame=e}}},Vr=class extends bt{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(e){super(e,!1),this.value=!!e.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",r=>{this.output.write(le.cursor.move(0,-1)),this.value=r,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}},zi=class extends bt{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(e=>e.disabled!==!0)}toggleAll(){let e=this._enabledOptions,r=this.value!==void 0&&this.value.length===e.length;this.value=r?[]:e.map(n=>n.value)}toggleInvert(){let e=this.value;if(!e)return;let r=this._enabledOptions.filter(n=>!e.includes(n.value));this.value=r.map(n=>n.value)}toggleValue(){this.value===void 0&&(this.value=[]);let e=this.value.includes(this._value);this.value=e?this.value.filter(r=>r!==this._value):[...this.value,this._value]}constructor(e){super(e,!1),this.options=e.options,this.value=[...e.initialValues??[]];let r=Math.max(this.options.findIndex(({value:n})=>n===e.cursorAt),0);this.cursor=this.options[r].disabled?St(r,1,this.options):r,this.on("key",(n,s)=>{s.name==="a"&&this.toggleAll(),s.name==="i"&&this.toggleInvert()}),this.on("cursor",n=>{switch(n){case"left":case"up":this.cursor=St(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=St(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}},Xr=class extends bt{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;let e=this.userInput;if(this.cursor>=e.length)return`${this.masked}${ps(["inverse","hidden"],"_")}`;let r=this.masked,n=r.slice(0,this.cursor),s=r.slice(this.cursor);return`${n}${ps("inverse",s[0])}${s.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:e,...r}){super(r),this._mask=e??"\u2022",this.on("userInput",n=>{this._setValue(n)}),this.on("finalize",()=>{this.value===void 0&&(this.value="")})}},Yr=class extends bt{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(e){super(e,!1),this.options=e.options;let r=this.options.findIndex(({value:s})=>s===e.initialValue),n=r===-1?0:r;this.cursor=this.options[n].disabled?St(n,1,this.options):n,this.changeValue(),this.on("cursor",s=>{switch(s){case"left":case"up":this.cursor=St(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=St(this.cursor,1,this.options);break}this.changeValue()})}},qr=class extends bt{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let e=this.userInput;if(this.cursor>=e.length)return`${this.userInput}\u2588`;let r=e.slice(0,this.cursor),[n,...s]=e.slice(this.cursor);return`${r}${ps("inverse",n)}${s.join("")}`}get cursor(){return this._cursor}constructor(e){super({...e,initialUserInput:e.initialUserInput??e.initialValue}),this.on("userInput",r=>{this._setValue(r)}),this.on("finalize",()=>{this.value||(this.value=e.defaultValue),this.value===void 0&&(this.value="")})}}});import{styleText as p,stripVTControlCharacters as _S}from"node:util";import we from"node:process";function Od(){return we.platform!=="win32"?we.env.TERM!=="linux":!!we.env.CI||!!we.env.WT_SESSION||!!we.env.TERMINUS_SUBLIME||we.env.ConEmuTask==="{cmd::Cmder}"||we.env.TERM_PROGRAM==="Terminus-Sublime"||we.env.TERM_PROGRAM==="vscode"||we.env.TERM==="xterm-256color"||we.env.TERM==="alacritty"||we.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function sa(t,e){let r=[`${e?`${p("cyan",O)} `:""}${t.join(" \u2022 ")}`];return e&&r.push(p("cyan",Ge)),r}var nr,Ss,kd,W,_d,ta,ra,Qr,Ad,O,Ge,xS,LS,bs,Zr,Nd,Zi,Qi,Md,$i,xd,Ld,Dd,Pd,DS,Ud,Fd,Wd,jd,sr,na,ea,ys,yt,Gd,rr,oa,H,Ie,or,Be,Bd,Hd,Dt,$r,Jd,Tt,PS,Kd,zr,it,US,en,Ts,vs=S(()=>{Es();Es();cs();os();nr=je(ds(),1);Ss=Od(),kd=()=>process.env.CI==="true",W=(t,e)=>Ss?t:e,_d=W("\u25C6","*"),ta=W("\u25A0","x"),ra=W("\u25B2","x"),Qr=W("\u25C7","o"),Ad=W("\u250C","T"),O=W("\u2502","|"),Ge=W("\u2514","\u2014"),xS=W("\u2510","T"),LS=W("\u2518","\u2014"),bs=W("\u25CF",">"),Zr=W("\u25CB"," "),Nd=W("\u25FB","[\u2022]"),Zi=W("\u25FC","[+]"),Qi=W("\u25FB","[ ]"),Md=W("\u25AA","\u2022"),$i=W("\u2500","-"),xd=W("\u256E","+"),Ld=W("\u251C","+"),Dd=W("\u256F","+"),Pd=W("\u2570","+"),DS=W("\u256D","+"),Ud=W("\u25CF","\u2022"),Fd=W("\u25C6","*"),Wd=W("\u25B2","!"),jd=W("\u25A0","x"),sr=t=>{switch(t){case"initial":case"active":return p("cyan",_d);case"cancel":return p("red",ta);case"error":return p("yellow",ra);case"submit":return p("green",Qr)}},na=t=>{switch(t){case"initial":case"active":return p("cyan",O);case"cancel":return p("red",O);case"error":return p("yellow",O);case"submit":return p("green",O)}};ea=(t,e,r,n,s,o=!1)=>{let i=e,a=0;if(o)for(let l=n-1;l>=r&&(i-=t[l].length,a++,!(i<=s));l--);else for(let l=r;l<n&&(i-=t[l].length,a++,!(i<=s));l++);return{lineCount:i,removals:a}},ys=({cursor:t,options:e,style:r,output:n=process.stdout,maxItems:s=Number.POSITIVE_INFINITY,columnPadding:o=0,rowPadding:i=4})=>{let a=tr(n)-o,l=hs(n),c=p("dim","..."),
|
|
17
|
-
`);y.push(v),C+=v.length}if(C>
|
|
16
|
+
`)),this._prevFrame=e;return}}this.output.write(le.erase.down())}this.output.write(e),this.state==="initial"&&(this.state="active"),this._prevFrame=e}}},Vr=class extends bt{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(e){super(e,!1),this.value=!!e.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",r=>{this.output.write(le.cursor.move(0,-1)),this.value=r,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}},zi=class extends bt{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(e=>e.disabled!==!0)}toggleAll(){let e=this._enabledOptions,r=this.value!==void 0&&this.value.length===e.length;this.value=r?[]:e.map(n=>n.value)}toggleInvert(){let e=this.value;if(!e)return;let r=this._enabledOptions.filter(n=>!e.includes(n.value));this.value=r.map(n=>n.value)}toggleValue(){this.value===void 0&&(this.value=[]);let e=this.value.includes(this._value);this.value=e?this.value.filter(r=>r!==this._value):[...this.value,this._value]}constructor(e){super(e,!1),this.options=e.options,this.value=[...e.initialValues??[]];let r=Math.max(this.options.findIndex(({value:n})=>n===e.cursorAt),0);this.cursor=this.options[r].disabled?St(r,1,this.options):r,this.on("key",(n,s)=>{s.name==="a"&&this.toggleAll(),s.name==="i"&&this.toggleInvert()}),this.on("cursor",n=>{switch(n){case"left":case"up":this.cursor=St(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=St(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}},Xr=class extends bt{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;let e=this.userInput;if(this.cursor>=e.length)return`${this.masked}${ps(["inverse","hidden"],"_")}`;let r=this.masked,n=r.slice(0,this.cursor),s=r.slice(this.cursor);return`${n}${ps("inverse",s[0])}${s.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:e,...r}){super(r),this._mask=e??"\u2022",this.on("userInput",n=>{this._setValue(n)}),this.on("finalize",()=>{this.value===void 0&&(this.value="")})}},Yr=class extends bt{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(e){super(e,!1),this.options=e.options;let r=this.options.findIndex(({value:s})=>s===e.initialValue),n=r===-1?0:r;this.cursor=this.options[n].disabled?St(n,1,this.options):n,this.changeValue(),this.on("cursor",s=>{switch(s){case"left":case"up":this.cursor=St(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=St(this.cursor,1,this.options);break}this.changeValue()})}},qr=class extends bt{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let e=this.userInput;if(this.cursor>=e.length)return`${this.userInput}\u2588`;let r=e.slice(0,this.cursor),[n,...s]=e.slice(this.cursor);return`${r}${ps("inverse",n)}${s.join("")}`}get cursor(){return this._cursor}constructor(e){super({...e,initialUserInput:e.initialUserInput??e.initialValue}),this.on("userInput",r=>{this._setValue(r)}),this.on("finalize",()=>{this.value||(this.value=e.defaultValue),this.value===void 0&&(this.value="")})}}});import{styleText as p,stripVTControlCharacters as _S}from"node:util";import we from"node:process";function Od(){return we.platform!=="win32"?we.env.TERM!=="linux":!!we.env.CI||!!we.env.WT_SESSION||!!we.env.TERMINUS_SUBLIME||we.env.ConEmuTask==="{cmd::Cmder}"||we.env.TERM_PROGRAM==="Terminus-Sublime"||we.env.TERM_PROGRAM==="vscode"||we.env.TERM==="xterm-256color"||we.env.TERM==="alacritty"||we.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function sa(t,e){let r=[`${e?`${p("cyan",O)} `:""}${t.join(" \u2022 ")}`];return e&&r.push(p("cyan",Ge)),r}var nr,Ss,kd,W,_d,ta,ra,Qr,Ad,O,Ge,xS,LS,bs,Zr,Nd,Zi,Qi,Md,$i,xd,Ld,Dd,Pd,DS,Ud,Fd,Wd,jd,sr,na,ea,ys,yt,Gd,rr,oa,H,Ie,or,Be,Bd,Hd,Dt,$r,Jd,Tt,PS,Kd,zr,it,US,en,Ts,vs=S(()=>{Es();Es();cs();os();nr=je(ds(),1);Ss=Od(),kd=()=>process.env.CI==="true",W=(t,e)=>Ss?t:e,_d=W("\u25C6","*"),ta=W("\u25A0","x"),ra=W("\u25B2","x"),Qr=W("\u25C7","o"),Ad=W("\u250C","T"),O=W("\u2502","|"),Ge=W("\u2514","\u2014"),xS=W("\u2510","T"),LS=W("\u2518","\u2014"),bs=W("\u25CF",">"),Zr=W("\u25CB"," "),Nd=W("\u25FB","[\u2022]"),Zi=W("\u25FC","[+]"),Qi=W("\u25FB","[ ]"),Md=W("\u25AA","\u2022"),$i=W("\u2500","-"),xd=W("\u256E","+"),Ld=W("\u251C","+"),Dd=W("\u256F","+"),Pd=W("\u2570","+"),DS=W("\u256D","+"),Ud=W("\u25CF","\u2022"),Fd=W("\u25C6","*"),Wd=W("\u25B2","!"),jd=W("\u25A0","x"),sr=t=>{switch(t){case"initial":case"active":return p("cyan",_d);case"cancel":return p("red",ta);case"error":return p("yellow",ra);case"submit":return p("green",Qr)}},na=t=>{switch(t){case"initial":case"active":return p("cyan",O);case"cancel":return p("red",O);case"error":return p("yellow",O);case"submit":return p("green",O)}};ea=(t,e,r,n,s,o=!1)=>{let i=e,a=0;if(o)for(let l=n-1;l>=r&&(i-=t[l].length,a++,!(i<=s));l--);else for(let l=r;l<n&&(i-=t[l].length,a++,!(i<=s));l++);return{lineCount:i,removals:a}},ys=({cursor:t,options:e,style:r,output:n=process.stdout,maxItems:s=Number.POSITIVE_INFINITY,columnPadding:o=0,rowPadding:i=4})=>{let a=tr(n)-o,l=hs(n),c=p("dim","..."),d=Math.max(l-i,0),m=Math.max(Math.min(s,d),5),f=0;t>=m-3&&(f=Math.max(Math.min(t-m+3,e.length-m),0));let E=m<e.length&&f>0,h=m<e.length&&f+m<e.length,b=Math.min(f+m,e.length),y=[],C=0;E&&C++,h&&C++;let A=f+(E?1:0),D=b-(h?1:0);for(let T=A;T<D;T++){let v=De(r(e[T],T===t),a,{hard:!0,trim:!1}).split(`
|
|
17
|
+
`);y.push(v),C+=v.length}if(C>d){let T=0,v=0,I=C,Y=t-A,Z=d,ve=()=>ea(y,I,0,Y,Z),Q=()=>ea(y,I,Y+1,y.length,Z,!0);E?({lineCount:I,removals:T}=ve(),I>Z&&(h||(Z-=1),{lineCount:I,removals:v}=Q())):(h||(Z-=1),{lineCount:I,removals:v}=Q(),I>Z&&(Z-=1,{lineCount:I,removals:T}=ve())),T>0&&(E=!0,y.splice(0,T)),v>0&&(h=!0,y.splice(y.length-v,v))}let R=[];E&&R.push(c);for(let T of y)for(let v of T)R.push(v);return h&&R.push(c),R},yt=t=>{let e=t.active??"Yes",r=t.inactive??"No";return new Vr({active:e,inactive:r,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue??!0,render(){let n=t.withGuide??te.withGuide,s=`${sr(this.state)} `,o=n?`${p("gray",O)} `:"",i=ot(t.output,t.message,o,s),a=`${n?`${p("gray",O)}
|
|
18
18
|
`:""}${i}
|
|
19
19
|
`,l=this.value?e:r;switch(this.state){case"submit":{let c=n?`${p("gray",O)} `:"";return`${a}${c}${p("dim",l)}`}case"cancel":{let c=n?`${p("gray",O)} `:"";return`${a}${c}${p(["strikethrough","dim"],l)}${n?`
|
|
20
|
-
${p("gray",O)}`:""}`}default:{let c=n?`${p("cyan",O)} `:"",
|
|
20
|
+
${p("gray",O)}`:""}`}default:{let c=n?`${p("cyan",O)} `:"",d=n?p("cyan",Ge):"";return`${a}${c}${this.value?`${p("green",bs)} ${e}`:`${p("dim",Zr)} ${p("dim",e)}`}${t.vertical?n?`
|
|
21
21
|
${p("cyan",O)} `:`
|
|
22
22
|
`:` ${p("dim","/")} `}${this.value?`${p("dim",Zr)} ${p("dim",r)}`:`${p("green",bs)} ${r}`}
|
|
23
|
-
${
|
|
23
|
+
${d}
|
|
24
24
|
`}}}}).prompt()},Gd=[`${p("dim","\u2191/\u2193")} to navigate`,`${p("dim","Space:")} select`,`${p("dim","Enter:")} confirm`],rr=(t,e)=>t.split(`
|
|
25
25
|
`).map(r=>e(r)).join(`
|
|
26
26
|
`),oa=t=>{let e=(n,s)=>{let o=n.label??String(n.value);return s==="disabled"?`${p("gray",Qi)} ${rr(o,i=>p(["strikethrough","gray"],i))}${n.hint?` ${p("dim",`(${n.hint??"disabled"})`)}`:""}`:s==="active"?`${p("cyan",Nd)} ${o}${n.hint?` ${p("dim",`(${n.hint})`)}`:""}`:s==="selected"?`${p("green",Zi)} ${rr(o,i=>p("dim",i))}${n.hint?` ${p("dim",`(${n.hint})`)}`:""}`:s==="cancelled"?`${rr(o,i=>p(["strikethrough","dim"],i))}`:s==="active-selected"?`${p("green",Zi)} ${o}${n.hint?` ${p("dim",`(${n.hint})`)}`:""}`:s==="submitted"?`${rr(o,i=>p("dim",i))}`:`${p("dim",Qi)} ${rr(o,i=>p("dim",i))}`},r=t.required??!0;return new zi({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValues:t.initialValues,required:r,cursorAt:t.cursorAt,validate(n){if(r&&(n===void 0||n.length===0))return`Please select at least one option.
|
|
27
27
|
${p("reset",p("dim",`Press ${p(["gray","bgWhite","inverse"]," space ")} to select, ${p("gray",p("bgWhite",p("inverse"," enter ")))} to submit`))}`},render(){let n=t.withGuide??te.withGuide,s=ot(t.output,t.message,n?`${na(this.state)} `:"",`${sr(this.state)} `),o=`${n?`${p("gray",O)}
|
|
28
28
|
`:""}${s}
|
|
29
|
-
`,i=this.value??[],a=(l,c)=>{if(l.disabled)return e(l,"disabled");let
|
|
29
|
+
`,i=this.value??[],a=(l,c)=>{if(l.disabled)return e(l,"disabled");let d=i.includes(l.value);return c&&d?e(l,"active-selected"):d?e(l,"selected"):e(l,c?"active":"inactive")};switch(this.state){case"submit":{let l=this.options.filter(({value:d})=>i.includes(d)).map(d=>e(d,"submitted")).join(p("dim",", "))||p("dim","none"),c=ot(t.output,l,n?`${p("gray",O)} `:"");return`${o}${c}`}case"cancel":{let l=this.options.filter(({value:d})=>i.includes(d)).map(d=>e(d,"cancelled")).join(p("dim",", "));if(l.trim()==="")return`${o}${p("gray",O)}`;let c=ot(t.output,l,n?`${p("gray",O)} `:"");return`${o}${c}${n?`
|
|
30
30
|
${p("gray",O)}`:""}`}case"error":{let l=n?`${p("yellow",O)} `:"",c=this.error.split(`
|
|
31
31
|
`).map((f,E)=>E===0?`${n?`${p("yellow",Ge)} `:""}${p("yellow",f)}`:` ${f}`).join(`
|
|
32
|
-
`),
|
|
32
|
+
`),d=o.split(`
|
|
33
33
|
`).length,m=c.split(`
|
|
34
|
-
`).length+1;return`${o}${l}${ys({output:t.output,options:this.options,cursor:this.cursor,maxItems:t.maxItems,columnPadding:l.length,rowPadding:
|
|
34
|
+
`).length+1;return`${o}${l}${ys({output:t.output,options:this.options,cursor:this.cursor,maxItems:t.maxItems,columnPadding:l.length,rowPadding:d+m,style:a}).join(`
|
|
35
35
|
${l}`)}
|
|
36
36
|
${c}
|
|
37
37
|
`}default:{let l=n?`${p("cyan",O)} `:"",c=o.split(`
|
|
38
|
-
`).length,
|
|
39
|
-
`),f=
|
|
38
|
+
`).length,d=sa(Gd,n),m=d.join(`
|
|
39
|
+
`),f=d.length+1;return`${o}${l}${ys({output:t.output,options:this.options,cursor:this.cursor,maxItems:t.maxItems,columnPadding:l.length,rowPadding:c+f,style:a}).join(`
|
|
40
40
|
${l}`)}
|
|
41
41
|
${m}
|
|
42
|
-
`}}}}).prompt()},H={message:(t=[],{symbol:e=p("gray",O),secondarySymbol:r=p("gray",O),output:n=process.stdout,spacing:s=1,withGuide:o}={})=>{let i=[],a=o??te.withGuide,l=a?r:"",c=a?`${e} `:"",
|
|
43
|
-
`);if(m.length>0){let[f,...E]=m;f.length>0?i.push(`${c}${f}`):i.push(a?e:"");for(let h of E)h.length>0?i.push(`${
|
|
42
|
+
`}}}}).prompt()},H={message:(t=[],{symbol:e=p("gray",O),secondarySymbol:r=p("gray",O),output:n=process.stdout,spacing:s=1,withGuide:o}={})=>{let i=[],a=o??te.withGuide,l=a?r:"",c=a?`${e} `:"",d=a?`${r} `:"";for(let f=0;f<s;f++)i.push(l);let m=Array.isArray(t)?t:t.split(`
|
|
43
|
+
`);if(m.length>0){let[f,...E]=m;f.length>0?i.push(`${c}${f}`):i.push(a?e:"");for(let h of E)h.length>0?i.push(`${d}${h}`):i.push(a?r:"")}n.write(`${i.join(`
|
|
44
44
|
`)}
|
|
45
45
|
`)},info:(t,e)=>{H.message(t,{...e,symbol:p("blue",Ud)})},success:(t,e)=>{H.message(t,{...e,symbol:p("green",Fd)})},step:(t,e)=>{H.message(t,{...e,symbol:p("green",Qr)})},warn:(t,e)=>{H.message(t,{...e,symbol:p("yellow",Wd)})},warning:(t,e)=>{H.warn(t,e)},error:(t,e)=>{H.message(t,{...e,symbol:p("red",jd)})}},Ie=(t="",e)=>{let r=e?.output??process.stdout,n=e?.withGuide??te.withGuide?`${p("gray",Ge)} `:"";r.write(`${n}${p("red",t)}
|
|
46
46
|
|
|
@@ -51,8 +51,8 @@ ${p("gray",Ge)} `:"";r.write(`${n}${t}
|
|
|
51
51
|
`)},Bd=t=>t,Hd=(t,e,r)=>{let n={hard:!0,trim:!1},s=De(t,e,n).split(`
|
|
52
52
|
`),o=s.reduce((l,c)=>Math.max(pe(c),l),0),i=s.map(r).reduce((l,c)=>Math.max(pe(c),l),0),a=e-(i-o);return De(t,a,n)},Dt=(t="",e="",r)=>{let n=r?.output??we.stdout,s=r?.withGuide??te.withGuide,o=r?.format??Bd,i=["",...Hd(t,tr(n)-6,o).split(`
|
|
53
53
|
`).map(o),""],a=pe(e),l=Math.max(i.reduce((f,E)=>{let h=pe(E);return h>f?h:f},0),a)+2,c=i.map(f=>`${p("gray",O)} ${f}${" ".repeat(l-pe(f))}${p("gray",O)}`).join(`
|
|
54
|
-
`),
|
|
55
|
-
`:"",m=s?Ld:Pd;n.write(`${
|
|
54
|
+
`),d=s?`${p("gray",O)}
|
|
55
|
+
`:"",m=s?Ld:Pd;n.write(`${d}${p("green",Qr)} ${p("reset",e)} ${p("gray",$i.repeat(Math.max(l-a-1,1))+xd)}
|
|
56
56
|
${c}
|
|
57
57
|
${p("gray",m+$i.repeat(l+2)+Dd)}
|
|
58
58
|
`)},$r=t=>new Xr({validate:t.validate,mask:t.mask??Md,signal:t.signal,input:t.input,output:t.output,render(){let e=t.withGuide??te.withGuide,r=`${e?`${p("gray",O)}
|
|
@@ -63,22 +63,22 @@ ${i}${p("yellow",this.error)}
|
|
|
63
63
|
`}case"submit":{let o=e?`${p("gray",O)} `:"",i=s?p("dim",s):"";return`${r}${o}${i}`}case"cancel":{let o=e?`${p("gray",O)} `:"",i=s?p(["strikethrough","dim"],s):"";return`${r}${o}${i}${s&&e?`
|
|
64
64
|
${p("gray",O)}`:""}`}default:{let o=e?`${p("cyan",O)} `:"",i=e?p("cyan",Ge):"";return`${r}${o}${n}
|
|
65
65
|
${i}
|
|
66
|
-
`}}}}).prompt(),Jd=t=>p("magenta",t),Tt=({indicator:t="dots",onCancel:e,output:r=process.stdout,cancelMessage:n,errorMessage:s,frames:o=Ss?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:i=Ss?80:120,signal:a,...l}={})=>{let c=kd(),
|
|
66
|
+
`}}}}).prompt(),Jd=t=>p("magenta",t),Tt=({indicator:t="dots",onCancel:e,output:r=process.stdout,cancelMessage:n,errorMessage:s,frames:o=Ss?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:i=Ss?80:120,signal:a,...l}={})=>{let c=kd(),d,m,f=!1,E=!1,h="",b,y=performance.now(),C=tr(r),A=l?.styleFrame??Jd,D=G=>{let w=G>1?s??te.messages.error:n??te.messages.cancel;E=G===1,f&&(tt(w,G),E&&typeof e=="function"&&e())},R=()=>D(2),T=()=>D(1),v=()=>{process.on("uncaughtExceptionMonitor",R),process.on("unhandledRejection",R),process.on("SIGINT",T),process.on("SIGTERM",T),process.on("exit",D),a&&a.addEventListener("abort",T)},I=()=>{process.removeListener("uncaughtExceptionMonitor",R),process.removeListener("unhandledRejection",R),process.removeListener("SIGINT",T),process.removeListener("SIGTERM",T),process.removeListener("exit",D),a&&a.removeEventListener("abort",T)},Y=()=>{if(b===void 0)return;c&&r.write(`
|
|
67
67
|
`);let G=De(b,C,{hard:!0,trim:!1}).split(`
|
|
68
|
-
`);G.length>1&&r.write(nr.cursor.up(G.length-1)),r.write(nr.cursor.to(0)),r.write(nr.erase.down())},Z=G=>G.replace(/\.+$/,""),ve=G=>{let w=(performance.now()-G)/1e3,N=Math.floor(w/60),L=Math.floor(w%60);return N>0?`[${N}m ${L}s]`:`[${L}s]`},Q=l.withGuide??te.withGuide,Mt=(G="")=>{f=!0,
|
|
68
|
+
`);G.length>1&&r.write(nr.cursor.up(G.length-1)),r.write(nr.cursor.to(0)),r.write(nr.erase.down())},Z=G=>G.replace(/\.+$/,""),ve=G=>{let w=(performance.now()-G)/1e3,N=Math.floor(w/60),L=Math.floor(w%60);return N>0?`[${N}m ${L}s]`:`[${L}s]`},Q=l.withGuide??te.withGuide,Mt=(G="")=>{f=!0,d=Yi({output:r}),h=Z(G),y=performance.now(),Q&&r.write(`${p("gray",O)}
|
|
69
69
|
`);let w=0,N=0;v(),m=setInterval(()=>{if(c&&h===b)return;Y(),b=h;let L=A(o[w]),$;if(c)$=`${L} ${h}...`;else if(t==="timer")$=`${L} ${h} ${ve(y)}`;else{let Qn=".".repeat(Math.floor(N)).slice(0,3);$=`${L} ${h}${Qn}`}let Ce=De($,C,{hard:!0,trim:!1});r.write(Ce),w=w+1<o.length?w+1:0,N=N<4?N+.125:0},i)},tt=(G="",w=0,N=!1)=>{if(!f)return;f=!1,clearInterval(m),Y();let L=w===0?p("green",Qr):w===1?p("red",ta):p("red",ra);h=G??h,N||(t==="timer"?r.write(`${L} ${h} ${ve(y)}
|
|
70
70
|
`):r.write(`${L} ${h}
|
|
71
|
-
`)),I(),
|
|
71
|
+
`)),I(),d()};return{start:Mt,stop:(G="")=>tt(G,0),message:(G="")=>{h=Z(G??h)},cancel:(G="")=>tt(G,1),error:(G="")=>tt(G,2),clear:()=>tt("",0,!0),get isCancelled(){return E}}},PS={light:W("\u2500","-"),heavy:W("\u2501","="),block:W("\u2588","#")},Kd=[`${p("dim","\u2191/\u2193")} to navigate`,`${p("dim","Enter:")} confirm`],zr=(t,e)=>t.includes(`
|
|
72
72
|
`)?t.split(`
|
|
73
73
|
`).map(r=>e(r)).join(`
|
|
74
74
|
`):e(t),it=t=>{let e=(r,n)=>{let s=r.label??String(r.value);switch(n){case"disabled":return`${p("gray",Zr)} ${zr(s,o=>p("gray",o))}${r.hint?` ${p("dim",`(${r.hint??"disabled"})`)}`:""}`;case"selected":return`${zr(s,o=>p("dim",o))}`;case"active":return`${p("green",bs)} ${s}${r.hint?` ${p("dim",`(${r.hint})`)}`:""}`;case"cancelled":return`${zr(s,o=>p(["strikethrough","dim"],o))}`;default:return`${p("dim",Zr)} ${zr(s,o=>p("dim",o))}`}};return new Yr({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue,render(){let r=t.withGuide??te.withGuide,n=`${sr(this.state)} `,s=`${na(this.state)} `,o=ot(t.output,t.message,s,n),i=`${r?`${p("gray",O)}
|
|
75
75
|
`:""}${o}
|
|
76
76
|
`;switch(this.state){case"submit":{let a=r?`${p("gray",O)} `:"",l=ot(t.output,e(this.options[this.cursor],"selected"),a);return`${i}${l}`}case"cancel":{let a=r?`${p("gray",O)} `:"",l=ot(t.output,e(this.options[this.cursor],"cancelled"),a);return`${i}${l}${r?`
|
|
77
77
|
${p("gray",O)}`:""}`}default:{let a=r?`${p("cyan",O)} `:"",l=i.split(`
|
|
78
|
-
`).length,c=sa(Kd,r),
|
|
78
|
+
`).length,c=sa(Kd,r),d=c.join(`
|
|
79
79
|
`),m=c.length+1;return`${i}${a}${ys({output:t.output,cursor:this.cursor,options:this.options,maxItems:t.maxItems,columnPadding:a.length,rowPadding:l+m,style:(f,E)=>e(f,f.disabled?"disabled":E?"active":"inactive")}).join(`
|
|
80
80
|
${a}`)}
|
|
81
|
-
${
|
|
81
|
+
${d}
|
|
82
82
|
`}}}}).prompt()},US=`${p("gray",O)} `,en=async(t,e)=>{for(let r of t){if(r.enabled===!1)continue;let n=Tt(e);n.start(r.title);let s=await r.task(n.message);n.stop(s||r.title)}},Ts=t=>new qr({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,output:t.output,signal:t.signal,input:t.input,render(){let e=t?.withGuide??te.withGuide,r=`${`${e?`${p("gray",O)}
|
|
83
83
|
`:""}${sr(this.state)} `}${t.message}
|
|
84
84
|
`,n=t.placeholder?p("inverse",t.placeholder[0])+p("dim",t.placeholder.slice(1)):p(["inverse","hidden"],"_"),s=this.userInput?this.userInputWithCursor:n,o=this.value??"";switch(this.state){case"error":{let i=this.error?` ${p("yellow",this.error)}`:"",a=e?`${p("yellow",O)} `:"",l=e?p("yellow",Ge):"";return`${r.trim()}
|
|
@@ -87,17 +87,17 @@ ${l}${i}
|
|
|
87
87
|
`}case"submit":{let i=o?` ${p("dim",o)}`:"",a=e?p("gray",O):"";return`${r}${a}${i}`}case"cancel":{let i=o?` ${p(["strikethrough","dim"],o)}`:"",a=e?p("gray",O):"";return`${r}${a}${i}${o.trim()?`
|
|
88
88
|
${a}`:""}`}default:{let i=e?`${p("cyan",O)} `:"",a=e?p("cyan",Ge):"";return`${r}${i}${s}
|
|
89
89
|
${a}
|
|
90
|
-
`}}}}).prompt()});import{spawn as Vd}from"node:child_process";function He(t,e,r){return Vd(t,e??[],{windowsHide:!0,...r})}var Pt=S(()=>{"use strict"});function vt(t){return process.platform==="win32"?Math.round(t*oe.WINDOWS_MULTIPLIER):t}var oe,ir=S(()=>{"use strict";oe={DEFAULT:3e5,HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5}});import{readFileSync as Xd,existsSync as Cs,mkdirSync as Yd,renameSync as qd}from"fs";import{join as aa,dirname as zd}from"path";import{homedir as la}from"os";var re,Ct=S(()=>{"use strict";ir();Ae();re=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(vt(oe.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-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",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_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:aa(la(),".keepmind"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",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:"5",CLAUDE_MEM_OBSERVATION_BATCH_MAX:"3",CLAUDE_MEM_MAX_CONTEXT_MESSAGES:"40",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_UPDATE_CHECK_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:aa(la(),".keepmind","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",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_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",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 envOverride(e){let r=e.replace(/^CLAUDE_MEM_/,"KEEPMIND_");return process.env[r]??process.env[e]}static get(e){return this.envOverride(e)??this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS)){let s=this.envOverride(n);s!==void 0&&(r[n]=s)}return r}static loadFromFile(e,r=!0){try{if(!Cs(e)){let a=this.getAllDefaults();try{let l=zd(e);Cs(l)||Yd(l,{recursive:!0}),se(e,a),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(l){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,l instanceof Error?l.message:String(l))}return r?this.applyEnvOverrides(a):a}let n=Xd(e,"utf-8"),s=JSON.parse(n.replace(/^\uFEFF/,"")),o=s;if(s.env&&typeof s.env=="object"){o=s.env;try{se(e,o),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a instanceof Error?a.message:String(a))}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return r?this.applyEnvOverrides(i):i}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let s=this.getAllDefaults();try{if(Cs(e)){let o=`${e}.corrupt-${Date.now()}`;qd(e,o),console.warn("[SETTINGS] Backed up corrupt settings file to:",o)}se(e,s),console.warn("[SETTINGS] Recovered settings file with defaults:",e)}catch(o){console.warn("[SETTINGS] Failed to recover corrupt settings file:",e,o instanceof Error?o.message:String(o))}return r?this.applyEnvOverrides(s):s}}}});function Qd(t){return(Zd??process.stderr.write.bind(process.stderr))(t)}function tn(t){Qd(t)}var Zd,Rs=S(()=>{"use strict";Zd=null});import{appendFileSync as $d,existsSync as ca,mkdirSync as ep,readFileSync as tp,readdirSync as rp,unlinkSync as np}from"fs";import{join as ua}from"path";var sp,Is,ws,Os,
|
|
91
|
-
${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"),s=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),l=String(e.getMilliseconds()).padStart(3,"0");return`${r}-${n}-${s} ${o}:${i}:${a}.${l}`}log(e,r,n,s,o){if(e<this.getLevel())return;this.ensureLogFileInitialized();let i=this.formatTimestamp(new Date),a=Is[e].padEnd(5),l=r.padEnd(6),c="";s?.correlationId?c=`[${s.correlationId}] `:s?.sessionId&&(c=`[session-${s.sessionId}] `);let
|
|
90
|
+
`}}}}).prompt()});import{spawn as Vd}from"node:child_process";function He(t,e,r){return Vd(t,e??[],{windowsHide:!0,...r})}var Pt=S(()=>{"use strict"});function vt(t){return process.platform==="win32"?Math.round(t*oe.WINDOWS_MULTIPLIER):t}var oe,ir=S(()=>{"use strict";oe={DEFAULT:3e5,HEALTH_CHECK:3e3,API_REQUEST:3e4,HOOK_READINESS_WAIT:1e4,POST_SPAWN_WAIT:15e3,READINESS_WAIT:3e4,PORT_IN_USE_WAIT:3e3,WORKER_STARTUP_WAIT:1e3,PRE_RESTART_SETTLE_DELAY:2e3,POWERSHELL_COMMAND:1e4,WINDOWS_MULTIPLIER:1.5}});import{readFileSync as Xd,existsSync as Cs,mkdirSync as Yd,renameSync as qd}from"fs";import{join as aa,dirname as zd}from"path";import{homedir as la}from"os";var re,Ct=S(()=>{"use strict";ir();Ae();re=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(vt(oe.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-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",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_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:aa(la(),".keepmind"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",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:"5",CLAUDE_MEM_OBSERVATION_BATCH_MAX:"3",CLAUDE_MEM_MAX_CONTEXT_MESSAGES:"40",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_UPDATE_CHECK_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:aa(la(),".keepmind","transcript-watch.json"),CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION:"false",CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",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_TELEGRAM_ENABLED:"true",CLAUDE_MEM_TELEGRAM_BOT_TOKEN:"",CLAUDE_MEM_TELEGRAM_CHAT_ID:"",CLAUDE_MEM_TELEGRAM_TRIGGER_TYPES:"security_alert",CLAUDE_MEM_TELEGRAM_TRIGGER_CONCEPTS:"",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 envOverride(e){let r=e.replace(/^CLAUDE_MEM_/,"KEEPMIND_");return process.env[r]??process.env[e]}static get(e){return this.envOverride(e)??this.DEFAULTS[e]}static getInt(e){let r=this.get(e);return parseInt(r,10)}static getBool(e){let r=this.get(e);return r==="true"||r===!0}static applyEnvOverrides(e){let r={...e};for(let n of Object.keys(this.DEFAULTS)){let s=this.envOverride(n);s!==void 0&&(r[n]=s)}return r}static loadFromFile(e,r=!0){try{if(!Cs(e)){let a=this.getAllDefaults();try{let l=zd(e);Cs(l)||Yd(l,{recursive:!0}),se(e,a),console.warn("[SETTINGS] Created settings file with defaults:",e)}catch(l){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,l instanceof Error?l.message:String(l))}return r?this.applyEnvOverrides(a):a}let n=Xd(e,"utf-8"),s=JSON.parse(n.replace(/^\uFEFF/,"")),o=s;if(s.env&&typeof s.env=="object"){o=s.env;try{se(e,o),console.warn("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(a){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,a instanceof Error?a.message:String(a))}}let i={...this.DEFAULTS};for(let a of Object.keys(this.DEFAULTS))o[a]!==void 0&&(i[a]=o[a]);return r?this.applyEnvOverrides(i):i}catch(n){console.warn("[SETTINGS] Failed to load settings, using defaults:",e,n instanceof Error?n.message:String(n));let s=this.getAllDefaults();try{if(Cs(e)){let o=`${e}.corrupt-${Date.now()}`;qd(e,o),console.warn("[SETTINGS] Backed up corrupt settings file to:",o)}se(e,s),console.warn("[SETTINGS] Recovered settings file with defaults:",e)}catch(o){console.warn("[SETTINGS] Failed to recover corrupt settings file:",e,o instanceof Error?o.message:String(o))}return r?this.applyEnvOverrides(s):s}}}});function Qd(t){return(Zd??process.stderr.write.bind(process.stderr))(t)}function tn(t){Qd(t)}var Zd,Rs=S(()=>{"use strict";Zd=null});import{appendFileSync as $d,existsSync as ca,mkdirSync as ep,readFileSync as tp,readdirSync as rp,unlinkSync as np}from"fs";import{join as ua}from"path";var sp,Is,ws,Os,u,V=S(()=>{"use strict";J();Rs();sp=14,Is=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.WARN=2]="WARN",o[o.ERROR=3]="ERROR",o[o.SILENT=4]="SILENT",o))(Is||{}),ws=null,Os=class{level=null;useColor;logFilePath=null;logFileInitialized=!1;constructor(){this.useColor=process.stdout.isTTY??!1}ensureLogFileInitialized(){if(!this.logFileInitialized){this.logFileInitialized=!0;try{let e=P.logsDir();ca(e)||ep(e,{recursive:!0});let r=new Date().toISOString().split("T")[0];this.logFilePath=ua(e,`keepmind-${r}.log`),this.pruneOldLogs(e)}catch(e){console.error("[LOGGER] Failed to initialize log file:",e instanceof Error?e.message:String(e)),this.logFilePath=null}}}pruneOldLogs(e){try{let r=Date.now()-sp*24*60*60*1e3;for(let n of rp(e)){let s=/^keepmind-(\d{4}-\d{2}-\d{2})\.log$/.exec(n);if(!s)continue;let o=Date.parse(s[1]);if(Number.isFinite(o)&&o<r)try{np(ua(e,n))}catch{}}}catch{}}getLevel(){if(this.level===null)try{let e=P.settings();if(ca(e)){let r=tp(e,"utf-8"),s=(JSON.parse(r).CLAUDE_MEM_LOG_LEVEL||"INFO").toUpperCase();this.level=Is[s]??1}else this.level=1}catch(e){console.error("[LOGGER] Failed to load log level from settings:",e instanceof Error?e.message:String(e)),this.level=1}return this.level}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}
|
|
91
|
+
${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"),s=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),l=String(e.getMilliseconds()).padStart(3,"0");return`${r}-${n}-${s} ${o}:${i}:${a}.${l}`}log(e,r,n,s,o){if(e<this.getLevel())return;this.ensureLogFileInitialized();let i=this.formatTimestamp(new Date),a=Is[e].padEnd(5),l=r.padEnd(6),c="";s?.correlationId?c=`[${s.correlationId}] `:s?.sessionId&&(c=`[session-${s.sessionId}] `);let d="";if(o!=null)if(o instanceof Error)d=this.getLevel()===0?`
|
|
92
92
|
${o.message}
|
|
93
|
-
${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{
|
|
94
|
-
`+JSON.stringify(o,null,2)}catch{
|
|
93
|
+
${o.stack}`:` ${o.message}`;else if(this.getLevel()===0&&typeof o=="object")try{d=`
|
|
94
|
+
`+JSON.stringify(o,null,2)}catch{d=" "+this.formatData(o)}else d=" "+this.formatData(o);let m="";if(s){let{sessionId:E,memorySessionId:h,correlationId:b,...y}=s;Object.keys(y).length>0&&(m=` {${Object.entries(y).map(([A,D])=>`${A}=${D}`).join(", ")}}`)}let f=`[${i}] [${a}] [${l}] ${c}${n}${m}${d}`;if(this.logFilePath)try{$d(this.logFilePath,f+`
|
|
95
95
|
`,"utf8")}catch(E){tn(`[LOGGER] Failed to write to log file: ${E instanceof Error?E.message:String(E)}
|
|
96
96
|
`)}else tn(f+`
|
|
97
97
|
`)}debug(e,r,n,s){this.log(0,e,r,n,s)}info(e,r,n,s){this.log(1,e,r,n,s)}warn(e,r,n,s){this.log(2,e,r,n,s)}setErrorSink(e){ws=e}error(e,r,n,s){this.log(3,e,r,n,s),this.routeErrorToSink(r,n,s)}routeErrorToSink(e,r,n){try{if(!ws||!(n instanceof Error))return;ws(n)}catch{}}dataIn(e,r,n,s){this.info(e,`\u2192 ${r}`,n,s)}dataOut(e,r,n,s){this.info(e,`\u2190 ${r}`,n,s)}success(e,r,n,s){this.info(e,`\u2713 ${r}`,n,s)}failure(e,r,n,s){this.error(e,`\u2717 ${r}`,n,s)}happyPathError(e,r,n,s,o=""){let c=((new Error().stack||"").split(`
|
|
98
|
-
`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),
|
|
98
|
+
`)[2]||"").match(/at\s+(?:.*\s+)?\(?([^:]+):(\d+):(\d+)\)?/),d=c?`${c[1].split("/").pop()}:${c[2]}`:"unknown",m={...n,location:d};return this.warn(e,`[HAPPY-PATH] ${r}`,m,s),o}},u=new Os});import{join as U,dirname as op,basename as ip}from"path";import{homedir as da}from"os";import{existsSync as at,mkdirSync as ap,readFileSync as lp,renameSync as cp}from"fs";import{execSync as ob}from"child_process";import{fileURLToPath as up}from"url";function dp(){return typeof __dirname<"u"?__dirname:op(up(import.meta.url))}function lt(){let t=process.env.KEEPMIND_DATA_DIR??process.env.CLAUDE_MEM_DATA_DIR;if(t)return t;let e=U(da(),".keepmind"),r=U(e,"settings.json");try{if(at(r)){let n=JSON.parse(lp(r,"utf-8")),s=n.env??n,o=s.KEEPMIND_DATA_DIR??s.CLAUDE_MEM_DATA_DIR;if(o)return o}}catch{}return e}function nn(t){ap(t,{recursive:!0})}function Ep(){try{if(at(B)||!at(ar))return at(B);for(let t of["","-wal","-shm"]){let e=ar+t,r=B+t;at(e)&&!at(r)&&cp(e,r)}return u.info("DB","Migrated legacy claude-mem.db to keepmind.db",{from:ar,to:B}),!0}catch(t){return u.warn("DB","Could not rename legacy claude-mem.db to keepmind.db (file may be locked) \u2014 falling back to legacy path",{},t instanceof Error?t:new Error(String(t))),!1}}function cr(){return Ep(),!at(B)&&at(ar)?ar:B}var lb,M,rn,lr,pp,mp,fp,gp,hp,Je,B,ar,ks,pa,_s,cb,ub,db,P,J=S(()=>{"use strict";V();lb=dp();M=lt(),rn=process.env.CLAUDE_CONFIG_DIR||U(da(),".claude"),lr=U(rn,"plugins","marketplaces","keepmind"),pp=U(M,"archives"),mp=U(M,"logs"),fp=U(M,"trash"),gp=U(M,"backups"),hp=U(M,"modes"),Je=U(M,"settings.json"),B=U(M,"keepmind.db"),ar=U(M,"claude-mem.db"),ks=U(M,"vector-db"),pa=U(M,"observer-sessions"),_s=ip(pa),cb=U(rn,"settings.json"),ub=U(rn,"commands"),db=U(rn,"CLAUDE.md");P={dataDir:()=>M,workerPid:()=>U(M,"worker.pid"),workerPort:()=>U(M,"worker.port"),serverPid:()=>U(M,".server-beta.pid"),serverPort:()=>U(M,".server-beta.port"),serverRuntime:()=>U(M,".server-beta.runtime.json"),settings:()=>U(M,"settings.json"),database:()=>cr(),chroma:()=>U(M,"chroma"),combinedCerts:()=>U(M,"combined_certs.pem"),transcriptsConfig:()=>U(M,"transcript-watch.json"),transcriptsState:()=>U(M,"transcript-watch-state.json"),corpora:()=>U(M,"corpora"),supervisorRegistry:()=>U(M,"supervisor.json"),envFile:()=>U(M,".env"),logsDir:()=>mp,archives:()=>pp,trash:()=>fp,backups:()=>gp,modes:()=>hp,vectorDb:()=>ks,observerSessions:()=>pa}});import{execFile as Sp}from"child_process";import{promisify as bp}from"util";import{existsSync as hb,readFileSync as Eb,writeFileSync as Sb,mkdirSync as bb,unlinkSync as yb}from"fs";import{userInfo as vb}from"os";import{join as Rb}from"path";var Ob,ma=S(()=>{"use strict";J();V();Ob=bp(Sp)});import{existsSync as As,readFileSync as ga,writeFileSync as yp,mkdirSync as Tp,chmodSync as fa}from"fs";import{parseEnv as vp}from"util";function ha(){return process.env.CLAUDE_MEM_ENV_FILE??P.envFile()}function Sa(t){return vp(t)}function Cp(t){let e=["# claude-mem credentials","# This file stores keys and gateway settings for the claude-mem memory agent","# Edit this file or use claude-mem settings to configure",""];for(let[r,n]of Object.entries(t))if(n){let s=/[\s#=]/.test(n);e.push(`${r}=${s?`"${n}"`:n}`)}return e.join(`
|
|
99
99
|
`)+`
|
|
100
|
-
`}function ur(){let t=ha();if(!As(t))return{};try{let e=ga(t,"utf-8"),r=Sa(e),n={};for(let s of Ea)r[s]&&(n[s]=r[s]);return n}catch(e){return d.warn("ENV","Failed to load .env file",{path:t},e instanceof Error?e:new Error(String(e))),{}}}function dr(t){let e=ha(),r={};try{As(P.dataDir())||Tp(P.dataDir(),{recursive:!0,mode:448}),fa(P.dataDir(),448),r=As(e)?Sa(ga(e,"utf-8")):{}}catch(s){let o=s instanceof Error?s:new Error(String(s));throw d.error("ENV","Failed to set up env directory or read existing env",{},o),o}let n={...r};for(let s of Ea){let o=t[s];o!==void 0&&(o?n[s]=o:delete n[s])}try{yp(e,Cp(n),{encoding:"utf-8",mode:384}),fa(e,384)}catch(s){throw d.error("ENV","Failed to save .env file",{path:e},s instanceof Error?s:new Error(String(s))),s}}var Ea,ba=S(()=>{"use strict";V();J();ma();Ea=["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","GEMINI_API_KEY","OPENROUTER_API_KEY"]});function ya(t){return t instanceof Error?t:new Error(String(t))}var Ta=S(()=>{"use strict"});function Rt(t=process.env){let e={};for(let[r,n]of Object.entries(t))if(n!==void 0){if(Ip.has(r)){e[r]=n;continue}wp.has(r)||Rp.some(s=>r.startsWith(s))||(e[r]=n)}return e}var Rp,wp,Ip,sn=S(()=>{"use strict";Rp=["CLAUDECODE_","CLAUDE_CODE_"],wp=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID","HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","NO_PROXY","http_proxy","https_proxy","all_proxy","no_proxy","npm_config_proxy","npm_config_https_proxy"]),Ip=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","ANTHROPIC_BEDROCK_BASE_URL","AWS_REGION","AWS_PROFILE","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","ANTHROPIC_VERTEX_PROJECT_ID","CLOUD_ML_REGION","GOOGLE_APPLICATION_CREDENTIALS"])});import{spawnSync as wa}from"child_process";import{existsSync as Op,mkdirSync as va,readFileSync as Ia,writeFileSync as kp}from"fs";import Ca from"path";function Ke(t){if(!Number.isInteger(t)||t<0||t===0)return!1;try{return process.kill(t,0),!0}catch(e){if(e instanceof Error){let r=e.code;return r==="EPERM"?!0:(d.debug("SYSTEM","PID check failed",{pid:t,code:r}),!1)}return d.warn("SYSTEM","PID check threw non-Error",{pid:t,error:String(e)}),!1}}async function on(t,e){let r=Date.now()+e;for(;Date.now()<r;){if(t.every(n=>!Ke(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function xp(t){let e=Ra.get(t);if(e&&Date.now()-e.capturedAtMs<Mp)return e.token;let r=null;try{let n=wa("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${t}").CreationDate.ToString('yyyyMMddHHmmss.ffffff')`],{encoding:"utf-8",timeout:5e3,windowsHide:!0,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(n.status===0){let s=n.stdout.trim();r=s.length>0?s:null}}catch(n){d.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:t,error:n instanceof Error?n.message:String(n)}),r=null}return Ra.set(t,{token:r,capturedAtMs:Date.now()}),r}function Oa(t){if(!Number.isInteger(t)||t<=0)return null;if(process.platform==="linux")try{let e=Ia(`/proc/${t}/stat`,"utf-8"),r=e.lastIndexOf(") ");if(r<0)return null;let s=e.slice(r+2).split(" ")[19];return s&&/^\d+$/.test(s)?s:null}catch(e){return d.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:t,error:e instanceof Error?e.message:String(e)}),null}if(process.platform==="win32")return xp(t);try{let e=wa("ps",["-p",String(t),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(e.status!==0)return null;let r=e.stdout.trim();return r.length>0?r:null}catch(e){return d.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:t,error:e instanceof Error?e.message:String(e)}),null}}function Ls(t){if(!t||!Ke(t.pid))return!1;if(!t.startToken)return!0;let e=Oa(t.pid);if(e===null)return!0;let r=e===t.startToken;return r||d.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:t.pid,stored:t.startToken,current:e}),r}function an(){return Ns||(Ns=new xs),Ns}function Ms(){let t=Lp.shift();t&&t()}var _p,Ap,Np,Mp,Ra,xs,Ns,Lp,pr=S(()=>{"use strict";Pt();V();sn();J();_p=5e3,Ap=1e3,Np=P.supervisorRegistry();Mp=5e3,Ra=new Map;xs=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;constructor(e=Np){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,va(Ca.dirname(this.registryPath),{recursive:!0}),!Op(this.registryPath)){this.persist();return}try{let n=JSON.parse(Ia(this.registryPath,"utf-8")).processes??{};for(let[s,o]of Object.entries(n))this.entries.set(s,o)}catch(r){r instanceof Error?d.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},r):d.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(r)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&d.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}register(e,r,n){this.initialize(),this.entries.set(e,r),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e){this.initialize();let r=this.entries.get(e);this.entries.delete(e),this.runtimeProcesses.delete(e),this.persist(),r?.type==="sdk"&&Ms()}clear(){this.entries.clear(),this.runtimeProcesses.clear(),this.persist()}getAll(){return this.initialize(),Array.from(this.entries.entries()).map(([e,r])=>({id:e,...r})).sort((e,r)=>{let n=Date.parse(e.startedAt),s=Date.parse(r.startedAt);return(Number.isNaN(n)?0:n)-(Number.isNaN(s)?0:s)})}getBySession(e){let r=String(e);return this.getAll().filter(n=>n.sessionId!==void 0&&String(n.sessionId)===r)}getRuntimeProcess(e){return this.runtimeProcesses.get(e)}getByPid(e){return this.getAll().filter(r=>r.pid===e)}pruneDeadEntries(){this.initialize();let e=0,r=0;for(let[n,s]of this.entries)Ke(s.pid)||(this.entries.delete(n),this.runtimeProcesses.delete(n),e+=1,s.type==="sdk"&&(r+=1));e>0&&this.persist();for(let n=0;n<r;n+=1)Ms();return e}async reapSession(e){this.initialize();let r=this.getBySession(e);if(r.length===0)return 0;let n=typeof e=="number"?e:Number(e)||void 0;d.info("SYSTEM",`Reaping ${r.length} process(es) for session ${e}`,{sessionId:n,pids:r.map(i=>i.pid)});let s=r.filter(i=>Ke(i.pid));for(let i of s)try{typeof i.pgid=="number"&&process.platform!=="win32"?process.kill(-i.pgid,"SIGTERM"):process.kill(i.pid,"SIGTERM")}catch(a){a instanceof Error?a.code!=="ESRCH"&&d.debug("SYSTEM",`Failed to SIGTERM session process PID ${i.pid}`,{pid:i.pid,pgid:i.pgid},a):d.warn("SYSTEM",`Failed to SIGTERM session process PID ${i.pid} (non-Error)`,{pid:i.pid,pgid:i.pgid,error:String(a)})}await on(s,_p);let o=s.filter(i=>Ke(i.pid));for(let i of o){d.warn("SYSTEM",`Session process PID ${i.pid} did not exit after SIGTERM, sending SIGKILL`,{pid:i.pid,pgid:i.pgid,sessionId:n});try{typeof i.pgid=="number"&&process.platform!=="win32"?process.kill(-i.pgid,"SIGKILL"):process.kill(i.pid,"SIGKILL")}catch(a){a instanceof Error?a.code!=="ESRCH"&&d.debug("SYSTEM",`Failed to SIGKILL session process PID ${i.pid}`,{pid:i.pid,pgid:i.pgid},a):d.warn("SYSTEM",`Failed to SIGKILL session process PID ${i.pid} (non-Error)`,{pid:i.pid,pgid:i.pgid,error:String(a)})}}if(o.length>0){let i=Date.now()+Ap;for(;Date.now()<i&&o.filter(l=>Ke(l.pid)).length!==0;)await new Promise(l=>setTimeout(l,100))}for(let i of r)this.entries.delete(i.id),this.runtimeProcesses.delete(i.id);this.persist();for(let i of r)i.type==="sdk"&&Ms();return d.info("SYSTEM",`Reaped ${r.length} process(es) for session ${e}`,{sessionId:n,reaped:r.length}),r.length}persist(){let e={processes:Object.fromEntries(this.entries.entries())};va(Ca.dirname(this.registryPath),{recursive:!0}),kp(this.registryPath,JSON.stringify(e,null,2))}},Ns=null;Lp=[]});import{execFile as Dp}from"child_process";import{existsSync as Pp,readFileSync as Up,rmSync as Fp}from"fs";import{promisify as Wp}from"util";async function _a(t){let e=t.currentPid??process.pid,r=t.pidFilePath??Gp,n=t.registry.getAll(),s=[...n].filter(i=>i.pid!==e).sort((i,a)=>Date.parse(a.startedAt)-Date.parse(i.startedAt));for(let i of s){if(!Ke(i.pid)){t.registry.unregister(i.id);continue}try{await ka(i,"SIGTERM")}catch(a){a instanceof Error?d.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:i.pid,pgid:i.pgid,type:i.type},a):d.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:i.pid,pgid:i.pgid,type:i.type,error:String(a)})}}await on(s,5e3);let o=s.filter(i=>Ke(i.pid));for(let i of o)try{await ka(i,"SIGKILL")}catch(a){a instanceof Error?d.debug("SYSTEM","Failed to force kill child process",{pid:i.pid,pgid:i.pgid,type:i.type},a):d.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:i.pid,pgid:i.pgid,type:i.type,error:String(a)})}await on(o,1e3);for(let i of s)t.registry.unregister(i.id);for(let i of n.filter(a=>a.pid===e))t.registry.unregister(i.id);Bp(r,e),t.registry.pruneDeadEntries()}function Bp(t,e){if(!Pp(t))return;let r=null;try{let n=JSON.parse(Up(t,"utf-8"));r=typeof n.pid=="number"?n.pid:null}catch(n){d.debug("SYSTEM","PID file unreadable during shutdown \u2014 leaving it (cannot prove ownership)",{pidFilePath:t,error:n instanceof Error?n.message:String(n)});return}if(r!==e){d.debug("SYSTEM","PID file not owned by this process \u2014 leaving it for its owner (restart successor?)",{pidFilePath:t,recordedPid:r,currentPid:e});return}try{Fp(t,{force:!0})}catch(n){n instanceof Error?d.debug("SYSTEM","Failed to remove PID file during shutdown",{pidFilePath:t},n):d.warn("SYSTEM","Failed to remove PID file during shutdown (non-Error)",{pidFilePath:t,error:String(n)})}}async function ka(t,e){let{pid:r,pgid:n}=t;if(process.platform!=="win32"){if(typeof n=="number")try{process.kill(-n,e);return}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}try{process.kill(r,e)}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}return}if(e==="SIGTERM"){try{process.kill(r,e)}catch(i){if(i instanceof Error&&i.code==="ESRCH")return;throw i}return}let s=await Hp();if(s){await new Promise((i,a)=>{s(r,e,l=>{if(!l){i();return}if(l.code==="ESRCH"){i();return}a(l)})});return}let o=["/PID",String(r),"/T"];e==="SIGKILL"&&o.push("/F"),await jp("taskkill",o,{timeout:oe.POWERSHELL_COMMAND,windowsHide:!0})}async function Hp(){let t="tree-kill";try{let e=await import(t);return e.default??e}catch(e){return d.debug("SYSTEM","tree-kill module not available, using fallback",{},e instanceof Error?e:void 0),null}}var jp,Gp,Aa=S(()=>{"use strict";V();ir();pr();J();jp=Wp(Dp),Gp=P.workerPid()});function Jp(){let e=an().pruneDeadEntries();e>0&&d.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function Ma(){Ut===null&&(Ut=setInterval(Jp,Na),Ut.unref(),d.debug("SYSTEM","Health checker started",{intervalMs:Na}))}function xa(){Ut!==null&&(clearInterval(Ut),Ut=null,d.debug("SYSTEM","Health checker stopped"))}var Na,Ut,La=S(()=>{"use strict";V();pr();Na=3e4,Ut=null});import{existsSync as Kp,readFileSync as Vp,rmSync as Da}from"fs";function Ps(){return Yp}function ln(t={}){let e=t.pidFilePath??Xp;if(!Kp(e))return"missing";let r=null;try{r=JSON.parse(Vp(e,"utf-8"))}catch(s){return s instanceof Error?d.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},s):d.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(s)}),Da(e,{force:!0}),"invalid"}return Ls(r)&&r?((t.logAlive??!0)&&d.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(d.info("SYSTEM","Removing stale PID file (worker process is dead or PID has been reused)",{pid:r?.pid,port:r?.port,startedAt:r?.startedAt}),Da(e,{force:!0}),"stale")}var Xp,Ds,Yp,cn=S(()=>{"use strict";V();pr();Aa();La();J();Xp=P.workerPid(),Ds=class{registry;started=!1;stopPromise=null;signalHandlersRegistered=!1;shutdownInitiated=!1;shutdownHandler=null;constructor(e){this.registry=e}async start(){if(this.started)return;if(this.registry.initialize(),ln({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,Ma()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){d.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,d.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(s){s instanceof Error?d.error("SYSTEM","Error during shutdown",{},s):d.error("SYSTEM","Error during shutdown (non-Error)",{error:String(s)});try{await this.stop()}catch(o){o instanceof Error?d.debug("SYSTEM","Supervisor shutdown fallback failed",{},o):d.debug("SYSTEM","Supervisor shutdown fallback failed",{error:String(o)})}}process.exit(0)};process.on("SIGTERM",()=>{r("SIGTERM")}),process.on("SIGINT",()=>{r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{d.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}xa(),this.stopPromise=_a({registry:this.registry,currentPid:process.pid}).finally(()=>{this.started=!1,this.stopPromise=null}),await this.stopPromise}assertCanSpawn(e){if(this.stopPromise!==null)throw new Error(`Supervisor is shutting down, refusing to spawn ${e}`)}registerProcess(e,r,n){this.registry.register(e,r,n)}unregisterProcess(e){this.registry.unregister(e)}getRegistry(){return this.registry}},Yp=new Ds(an())});import qp from"path";import{homedir as zp}from"os";import{existsSync as mr,writeFileSync as hy,readFileSync as Zp,unlinkSync as Qp,mkdirSync as Ey,rmSync as Sy,statSync as by,utimesSync as $p}from"fs";import{execSync as em}from"child_process";function Pa(t){return t?/(^|[\\/])node(\.exe)?$/i.test(t.trim()):!1}function tm(t,e){let r=e==="win32"?`where ${t}`:`which ${t}`,n;try{n=em(r,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",windowsHide:!0})}catch(o){return o instanceof Error?d.debug("SYSTEM",`Binary lookup failed for ${t}`,{command:r},o):d.debug("SYSTEM",`Binary lookup failed for ${t}`,{command:r},new Error(String(o))),null}return n.split(/\r?\n/).map(o=>o.trim()).find(o=>o.length>0)||null}function un(t={}){let e=Object.keys(t).length===0;if(e&&Us!==void 0)return Us;let r=rm(t);return e&&r!==null&&(Us=r),r}function rm(t){let e=t.platform??process.platform,r=t.execPath??process.execPath;if(Pa(r))return r;let n=t.env??process.env,s=t.homeDirectory??zp(),o=t.pathExists??mr,i=t.lookupInPath??tm,a=e==="win32"?[n.NODE,qp.join(s,".nvm","current","bin","node.exe"),"node"]:[n.NODE,"/usr/local/bin/node","/opt/homebrew/bin/node","/usr/bin/node","node"];for(let l of a){let c=l?.trim();if(c&&(Pa(c)&&o(c)||c.toLowerCase()==="node"))return c}return i("node",e)}function Ua(){if(!mr(Pe))return null;try{return JSON.parse(Zp(Pe,"utf-8"))}catch(t){return t instanceof Error?d.warn("SYSTEM","Failed to parse PID file",{path:Pe},t):d.warn("SYSTEM","Failed to parse PID file",{path:Pe},new Error(String(t))),null}}function Fa(){if(mr(Pe))try{Qp(Pe)}catch(t){t instanceof Error?d.warn("SYSTEM","Failed to remove PID file",{path:Pe},t):d.warn("SYSTEM","Failed to remove PID file",{path:Pe},new Error(String(t)))}}function ct(t){return process.platform==="win32"?Math.round(t*2):t}function Wa(t,e,r={}){Ps().assertCanSpawn("worker daemon");let n=Rt({...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r}),s=un();if(!s){d.error("SYSTEM","Node runtime not found \u2014 ensure node is on PATH or set the NODE env var. The worker daemon runs under Node (node:sqlite).");return}if(process.platform==="win32")try{let u=He(s,[t,"--daemon"],{detached:!0,stdio:"ignore",windowsHide:!0,env:n});if(u.pid===void 0){d.error("SYSTEM","Worker daemon spawn produced no PID on Windows",{runtimePath:s});return}return u.unref(),u.pid}catch(u){d.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:s},ya(u));return}let o="/usr/bin/setsid",i=mr(o),c=He(i?o:s,i?[s,t,"--daemon"]:[t,"--daemon"],{detached:!0,stdio:"ignore",env:n});if(c.pid!==void 0)return c.unref(),c.pid}function ja(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){if(e instanceof Error){let r=e.code;if(r==="EPERM")return!0;d.debug("SYSTEM","Process not alive",{pid:t,code:r})}else d.debug("SYSTEM","Process not alive (non-Error thrown)",{pid:t},new Error(String(e)));return!1}}function Ga(){try{if(!mr(Pe))return;let t=new Date;$p(Pe,t,t)}catch{}}function Ba(){return ln({logAlive:!1})}var Oy,Pe,ky,Us,fr=S(()=>{"use strict";Pt();V();Ta();sn();cn();J();pr();Oy=P.dataDir(),Pe=P.workerPid(),ky=P.workerPort()});import My from"path";import nm from"net";import{readFileSync as Dy}from"fs";async function om(t,e,r="GET"){let n=await fetch(`http://127.0.0.1:${t}${e}`,{method:r,signal:AbortSignal.timeout(sm)}),s="";try{s=await n.text()}catch{}return{ok:n.ok,statusCode:n.status,body:s}}async function Ha(t){return new Promise(e=>{let r=nm.createServer();r.once("error",n=>{n.code==="EADDRINUSE"||n.code==="EACCES"?e(!0):e(!1)}),r.once("listening",()=>{r.close(()=>e(!1))}),r.listen(t,"127.0.0.1")})}async function Ja(t,e,r,n){let s=Date.now();for(;Date.now()-s<r;){try{if((await om(t,e)).ok)return!0}catch(o){o instanceof Error?d.debug("SYSTEM",n,{},o):d.debug("SYSTEM",n,{error:String(o)})}await new Promise(o=>setTimeout(o,500))}return!1}function gr(t,e=3e4){return Ja(t,"/api/health",e,"Service not ready yet, will retry")}function hr(t,e=3e4){return Ja(t,"/api/readiness",e,"Worker not ready yet, will retry")}var sm,Fs=S(()=>{"use strict";V();J();sm=2500});import{dirname as im,join as am}from"path";import{mkdirSync as lm,readFileSync as cm,statSync as Ka,unlinkSync as Va,writeFileSync as um}from"fs";function Xa(){return am(lt(),"spawn.lock")}function Ws(){let t=Xa(),e=JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()});for(let r=0;r<2;r++)try{return lm(im(t),{recursive:!0}),um(t,e,{flag:"wx"}),!0}catch(n){if(n?.code!=="EEXIST")return!0;if(r>0)return!1;let o;try{o=Ka(t).mtimeMs}catch{continue}if(Date.now()-o<=dm)return!1;let i;try{i=Ka(t).mtimeMs}catch{continue}if(i!==o)return!1;try{Va(t)}catch{return!1}}return!1}function js(){let t=Xa();try{if(JSON.parse(cm(t,"utf-8")).pid!==process.pid)return;Va(t)}catch{}}var dm,Gs=S(()=>{"use strict";J();dm=6e4});import{existsSync as pm}from"fs";function mm(t){let e=Ua();return e&&typeof e.port=="number"&&ja(e.pid)?e.port:t}async function fm(t,e){let r=Date.now()+e;for(;Date.now()<r;){let n=mm(t);if(await gr(n,800))return n;await new Promise(s=>setTimeout(s,300))}return null}async function Ya(t,e){if(!e)return d.error("SYSTEM","ensureWorkerStarted called with empty workerScriptPath \u2014 caller bug"),"dead";if(!pm(e))return d.error("SYSTEM","ensureWorkerStarted: worker script not found at expected path \u2014 likely a partial install or build artifact missing",{workerScriptPath:e}),"dead";if(await gr(t,1e3)){let a=await hr(t,ct(oe.READINESS_WAIT));return a||d.warn("SYSTEM","Worker is alive but readiness timed out \u2014 proceeding anyway"),d.info("SYSTEM","Worker already running and healthy (fast path)"),a?"ready":"warming"}if(Ba()==="alive"){if(d.info("SYSTEM","Worker PID file points to a live process, waiting for it to become healthy"),await gr(t,ct(oe.POST_SPAWN_WAIT))){let l=await hr(t,ct(oe.READINESS_WAIT));return d.info("SYSTEM","Worker became healthy while waiting on live PID"),l?"ready":"warming"}d.warn("SYSTEM","PID file marked live but worker never became healthy within the cold-boot window \u2014 treating it as a stale/reused PID and re-spawning"),Fa()}if(await Ha(t)){if(d.info("SYSTEM","Port in use, waiting for worker to become healthy"),await gr(t,ct(oe.PORT_IN_USE_WAIT))){let l=await hr(t,ct(oe.READINESS_WAIT));return d.info("SYSTEM","Worker is now healthy"),l?"ready":"warming"}d.warn("SYSTEM","Configured port in use but no healthy worker \u2014 spawning anyway (worker will pick a free ephemeral port)")}let s=Ws(),o=t;try{if(s){if(d.info("SYSTEM","Starting worker daemon",{workerScriptPath:e}),Wa(e,t)===void 0)return d.error("SYSTEM","Failed to spawn worker daemon"),"dead"}else d.info("SYSTEM","Another launcher holds the spawn lock \u2014 skipping duplicate spawn and waiting for its worker");let a=await fm(t,ct(oe.POST_SPAWN_WAIT));if(a===null)return d.warn("SYSTEM",s?"Worker spawned but health endpoint not responding within window \u2014 likely still starting in background":"Spawn-lock holder's worker not healthy within window \u2014 likely still starting in background"),"warming";o=a}finally{s&&js()}let i=await hr(o,ct(oe.READINESS_WAIT));return i||d.warn("SYSTEM","Worker is alive but readiness timed out \u2014 proceeding anyway"),Ga(),d.info("SYSTEM",s?"Worker started successfully":"Worker is up (started by another launcher)"),i?"ready":"warming"}var qa=S(()=>{"use strict";V();ir();fr();Fs();Gs()});function wt(t){return t instanceof Error?t.message:typeof t=="string"?t:t&&typeof t=="object"&&"message"in t?String(t.message):String(t??"")}function za(t,e){for(let r of Bs)if(r.match(t,e))return r;return Bs[Bs.length-1]}var gm,hm,Bs,dn=S(()=>{"use strict";gm=t=>t.platform==="win32"?'Install Bun manually then re-run `npx keepmind install`. Windows: `winget install Oven-sh.Bun` (or `powershell -c "irm bun.sh/install.ps1 | iex"`).':"Install Bun manually then re-run `npx keepmind install`. macOS/Linux: `curl -fsSL https://bun.sh/install | bash` (or `brew install oven-sh/bun/bun`).",hm=t=>t.platform==="win32"?'Install uv manually then re-run `npx keepmind install`. Windows: `winget install astral-sh.uv` (or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"`).':"Install uv manually then re-run `npx keepmind install`. macOS/Linux: `curl -LsSf https://astral.sh/uv/install.sh | sh` (or `brew install uv`).",Bs=[{id:"bun-missing-after-install",severity:"ABORT",match:t=>{let e=wt(t);return e.includes("Bun executable not found")||e.includes("Bun installation completed but binary not found")||e.includes("Failed to install Bun")},remediation:gm},{id:"uv-missing-after-install",severity:"ABORT",match:t=>{let e=wt(t);return e.includes("uv executable not found")||e.includes("uv installed but version probe failed")||e.includes("uv binary not found")||e.includes("Failed to install uv")},remediation:hm},{id:"tree-sitter-eresolve",severity:"ABORT",match:t=>/\bERESOLVE\b/.test(wt(t)),remediation:()=>"ERESOLVE peer-dependency conflict in marketplace deps that --legacy-peer-deps could not resolve. Open an issue at https://github.com/ManuelStaggl/keepmind/issues with the conflicting peer ranges shown above."},{id:"bun-install-network-fail",severity:"SILENT_RETRY",match:t=>/error: failed to resolve/.test(wt(t)),remediation:()=>"bun install failed to resolve packages \u2014 check network connectivity and re-run `npx keepmind install`. Cached packages in ~/.bun/install/cache will be reused."},{id:"marketplace-dir-not-writable",severity:"ABORT",match:t=>/\b(EACCES|EPERM)\b/.test(wt(t)),remediation:t=>`Cannot write to the claude-mem data/marketplace directory under ${t.dataDir}. Check filesystem permissions or set CLAUDE_MEM_DATA_DIR to a writable path, then re-run.`},{id:"plugin-json-corrupt",severity:"ABORT",match:(t,e)=>e.component==="plugin-json"&&/Unexpected token|JSON|parse/i.test(wt(t)),remediation:()=>"Existing plugin.json is corrupt. Run `rm -rf ~/.claude/plugins/marketplaces/keepmind` and re-run `npx keepmind install`."},{id:"all-ides-failed",severity:"ABORT",match:(t,e)=>e.component==="all-ides",remediation:()=>"Every selected IDE integration failed. See the per-IDE errors above. Re-run with `--ide=<single>` to isolate the failure."},{id:"single-ide-failed",severity:"FAIL_LOUD_PER_IDE",match:(t,e)=>e.phase==="ide-install",remediation:()=>"Re-run `npx keepmind install --ide=<name>` to retry just this IDE. The captured stderr is shown above."},{id:"path-update-failed",severity:"WARN_CONTINUE",match:(t,e)=>e.component==="path-update",remediation:()=>"Could not auto-update PATH in your shell config. Add the printed export line manually and restart your shell."},{id:"auto-memory-toggle-failed",severity:"WARN_CONTINUE",match:(t,e)=>e.component==="auto-memory",remediation:()=>'Could not disable Claude Code auto-memory. Add `"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"` to the env block in ~/.claude/settings.json.'},{id:"version-probe-transient",severity:"WARN_CONTINUE",match:(t,e)=>e.component.endsWith("-version-probe"),remediation:()=>"Could not verify the tool version after install \u2014 the installation is likely OK. Re-run `npx keepmind install` if features misbehave."},{id:"child-process-timeout",severity:"ABORT",match:t=>/timed out|ETIMEDOUT|SIGTERM|did not finish/i.test(wt(t)),remediation:()=>"An install command did not finish in time. Check network connectivity. On a slow host, raise the budget with CLAUDE_MEM_INSTALL_TIMEOUT_MS and re-run."},{id:"unknown-install-error",severity:"ABORT",match:()=>!0,remediation:t=>`An unexpected installer error occurred. Capture ${t.dataDir}/last-install-error.json and open an issue at https://github.com/ManuelStaggl/keepmind/issues.`}]});import{mkdirSync as Em,writeFileSync as Sm}from"fs";import{join as bm}from"path";function Qa(){return{warnings:[],failedIDEs:[],retryCount:{}}}function Ft(t){return t instanceof Error?t.message:typeof t=="string"?t:String(t??"")}function ym(t,e,r,n){try{Em(n,{recursive:!0});let s={severity:t.severity,categoryId:t.id,component:e.component,phase:e.phase,cause:Ft(e.cause),remediation:r,details:e.details??null,timestamp:new Date().toISOString()};Sm(bm(n,"last-install-error.json"),JSON.stringify(s,null,2))}catch{}}function ce(t,e,r){let n=lt(),s=za(e.cause,{component:e.component,phase:e.phase}),o=e.remediation??s.remediation({platform:process.platform,dataDir:n});switch(t){case"ABORT":throw ym(s,e,o,n),new Er(`${e.component} failed during ${e.phase}: ${Ft(e.cause)}`,{category:s,remediation:o,cause:e.cause});case"FAIL_LOUD_PER_IDE":{let i=e.ide??e.component;r.failedIDEs.includes(i)||r.failedIDEs.push(i),r.warnings.push({component:i,message:e.details?`${Ft(e.cause)}
|
|
100
|
+
`}function ur(){let t=ha();if(!As(t))return{};try{let e=ga(t,"utf-8"),r=Sa(e),n={};for(let s of Ea)r[s]&&(n[s]=r[s]);return n}catch(e){return u.warn("ENV","Failed to load .env file",{path:t},e instanceof Error?e:new Error(String(e))),{}}}function dr(t){let e=ha(),r={};try{As(P.dataDir())||Tp(P.dataDir(),{recursive:!0,mode:448}),fa(P.dataDir(),448),r=As(e)?Sa(ga(e,"utf-8")):{}}catch(s){let o=s instanceof Error?s:new Error(String(s));throw u.error("ENV","Failed to set up env directory or read existing env",{},o),o}let n={...r};for(let s of Ea){let o=t[s];o!==void 0&&(o?n[s]=o:delete n[s])}try{yp(e,Cp(n),{encoding:"utf-8",mode:384}),fa(e,384)}catch(s){throw u.error("ENV","Failed to save .env file",{path:e},s instanceof Error?s:new Error(String(s))),s}}var Ea,ba=S(()=>{"use strict";V();J();ma();Ea=["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","GEMINI_API_KEY","OPENROUTER_API_KEY"]});function ya(t){return t instanceof Error?t:new Error(String(t))}var Ta=S(()=>{"use strict"});function Rt(t=process.env){let e={};for(let[r,n]of Object.entries(t))if(n!==void 0){if(Ip.has(r)){e[r]=n;continue}wp.has(r)||Rp.some(s=>r.startsWith(s))||(e[r]=n)}return e}var Rp,wp,Ip,sn=S(()=>{"use strict";Rp=["CLAUDECODE_","CLAUDE_CODE_"],wp=new Set(["CLAUDECODE","CLAUDE_CODE_SESSION","CLAUDE_CODE_ENTRYPOINT","MCP_SESSION_ID","HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","NO_PROXY","http_proxy","https_proxy","all_proxy","no_proxy","npm_config_proxy","npm_config_https_proxy"]),Ip=new Set(["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_GIT_BASH_PATH","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","ANTHROPIC_BEDROCK_BASE_URL","AWS_REGION","AWS_PROFILE","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","ANTHROPIC_VERTEX_PROJECT_ID","CLOUD_ML_REGION","GOOGLE_APPLICATION_CREDENTIALS"])});import{spawnSync as wa}from"child_process";import{existsSync as Op,mkdirSync as va,readFileSync as Ia,writeFileSync as kp}from"fs";import Ca from"path";function Ke(t){if(!Number.isInteger(t)||t<0||t===0)return!1;try{return process.kill(t,0),!0}catch(e){if(e instanceof Error){let r=e.code;return r==="EPERM"?!0:(u.debug("SYSTEM","PID check failed",{pid:t,code:r}),!1)}return u.warn("SYSTEM","PID check threw non-Error",{pid:t,error:String(e)}),!1}}async function on(t,e){let r=Date.now()+e;for(;Date.now()<r;){if(t.every(n=>!Ke(n.pid)))return;await new Promise(n=>setTimeout(n,100))}}function xp(t){let e=Ra.get(t);if(e&&Date.now()-e.capturedAtMs<Mp)return e.token;let r=null;try{let n=wa("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${t}").CreationDate.ToString('yyyyMMddHHmmss.ffffff')`],{encoding:"utf-8",timeout:5e3,windowsHide:!0,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(n.status===0){let s=n.stdout.trim();r=s.length>0?s:null}}catch(n){u.debug("SYSTEM","captureProcessStartToken: powershell CIM lookup failed",{pid:t,error:n instanceof Error?n.message:String(n)}),r=null}return Ra.set(t,{token:r,capturedAtMs:Date.now()}),r}function Oa(t){if(!Number.isInteger(t)||t<=0)return null;if(process.platform==="linux")try{let e=Ia(`/proc/${t}/stat`,"utf-8"),r=e.lastIndexOf(") ");if(r<0)return null;let s=e.slice(r+2).split(" ")[19];return s&&/^\d+$/.test(s)?s:null}catch(e){return u.debug("SYSTEM","captureProcessStartToken: /proc read failed",{pid:t,error:e instanceof Error?e.message:String(e)}),null}if(process.platform==="win32")return xp(t);try{let e=wa("ps",["-p",String(t),"-o","lstart="],{encoding:"utf-8",timeout:2e3,env:{...Rt(process.env),LC_ALL:"C",LANG:"C"}});if(e.status!==0)return null;let r=e.stdout.trim();return r.length>0?r:null}catch(e){return u.debug("SYSTEM","captureProcessStartToken: ps exec failed",{pid:t,error:e instanceof Error?e.message:String(e)}),null}}function Ls(t){if(!t||!Ke(t.pid))return!1;if(!t.startToken)return!0;let e=Oa(t.pid);if(e===null)return!0;let r=e===t.startToken;return r||u.debug("SYSTEM","verifyPidFileOwnership: start-token mismatch (PID reused)",{pid:t.pid,stored:t.startToken,current:e}),r}function an(){return Ns||(Ns=new xs),Ns}function Ms(){let t=Lp.shift();t&&t()}var _p,Ap,Np,Mp,Ra,xs,Ns,Lp,pr=S(()=>{"use strict";Pt();V();sn();J();_p=5e3,Ap=1e3,Np=P.supervisorRegistry();Mp=5e3,Ra=new Map;xs=class{registryPath;entries=new Map;runtimeProcesses=new Map;initialized=!1;constructor(e=Np){this.registryPath=e}initialize(){if(this.initialized)return;if(this.initialized=!0,va(Ca.dirname(this.registryPath),{recursive:!0}),!Op(this.registryPath)){this.persist();return}try{let n=JSON.parse(Ia(this.registryPath,"utf-8")).processes??{};for(let[s,o]of Object.entries(n))this.entries.set(s,o)}catch(r){r instanceof Error?u.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath},r):u.warn("SYSTEM","Failed to parse supervisor registry, rebuilding",{path:this.registryPath,error:String(r)}),this.entries.clear()}let e=this.pruneDeadEntries();e>0&&u.info("SYSTEM","Removed dead processes from supervisor registry",{removed:e}),this.persist()}register(e,r,n){this.initialize(),this.entries.set(e,r),n&&this.runtimeProcesses.set(e,n),this.persist()}unregister(e){this.initialize();let r=this.entries.get(e);this.entries.delete(e),this.runtimeProcesses.delete(e),this.persist(),r?.type==="sdk"&&Ms()}clear(){this.entries.clear(),this.runtimeProcesses.clear(),this.persist()}getAll(){return this.initialize(),Array.from(this.entries.entries()).map(([e,r])=>({id:e,...r})).sort((e,r)=>{let n=Date.parse(e.startedAt),s=Date.parse(r.startedAt);return(Number.isNaN(n)?0:n)-(Number.isNaN(s)?0:s)})}getBySession(e){let r=String(e);return this.getAll().filter(n=>n.sessionId!==void 0&&String(n.sessionId)===r)}getRuntimeProcess(e){return this.runtimeProcesses.get(e)}getByPid(e){return this.getAll().filter(r=>r.pid===e)}pruneDeadEntries(){this.initialize();let e=0,r=0;for(let[n,s]of this.entries)Ke(s.pid)||(this.entries.delete(n),this.runtimeProcesses.delete(n),e+=1,s.type==="sdk"&&(r+=1));e>0&&this.persist();for(let n=0;n<r;n+=1)Ms();return e}async reapSession(e){this.initialize();let r=this.getBySession(e);if(r.length===0)return 0;let n=typeof e=="number"?e:Number(e)||void 0;u.info("SYSTEM",`Reaping ${r.length} process(es) for session ${e}`,{sessionId:n,pids:r.map(i=>i.pid)});let s=r.filter(i=>Ke(i.pid));for(let i of s)try{typeof i.pgid=="number"&&process.platform!=="win32"?process.kill(-i.pgid,"SIGTERM"):process.kill(i.pid,"SIGTERM")}catch(a){a instanceof Error?a.code!=="ESRCH"&&u.debug("SYSTEM",`Failed to SIGTERM session process PID ${i.pid}`,{pid:i.pid,pgid:i.pgid},a):u.warn("SYSTEM",`Failed to SIGTERM session process PID ${i.pid} (non-Error)`,{pid:i.pid,pgid:i.pgid,error:String(a)})}await on(s,_p);let o=s.filter(i=>Ke(i.pid));for(let i of o){u.warn("SYSTEM",`Session process PID ${i.pid} did not exit after SIGTERM, sending SIGKILL`,{pid:i.pid,pgid:i.pgid,sessionId:n});try{typeof i.pgid=="number"&&process.platform!=="win32"?process.kill(-i.pgid,"SIGKILL"):process.kill(i.pid,"SIGKILL")}catch(a){a instanceof Error?a.code!=="ESRCH"&&u.debug("SYSTEM",`Failed to SIGKILL session process PID ${i.pid}`,{pid:i.pid,pgid:i.pgid},a):u.warn("SYSTEM",`Failed to SIGKILL session process PID ${i.pid} (non-Error)`,{pid:i.pid,pgid:i.pgid,error:String(a)})}}if(o.length>0){let i=Date.now()+Ap;for(;Date.now()<i&&o.filter(l=>Ke(l.pid)).length!==0;)await new Promise(l=>setTimeout(l,100))}for(let i of r)this.entries.delete(i.id),this.runtimeProcesses.delete(i.id);this.persist();for(let i of r)i.type==="sdk"&&Ms();return u.info("SYSTEM",`Reaped ${r.length} process(es) for session ${e}`,{sessionId:n,reaped:r.length}),r.length}persist(){let e={processes:Object.fromEntries(this.entries.entries())};va(Ca.dirname(this.registryPath),{recursive:!0}),kp(this.registryPath,JSON.stringify(e,null,2))}},Ns=null;Lp=[]});import{execFile as Dp}from"child_process";import{existsSync as Pp,readFileSync as Up,rmSync as Fp}from"fs";import{promisify as Wp}from"util";async function _a(t){let e=t.currentPid??process.pid,r=t.pidFilePath??Gp,n=t.registry.getAll(),s=[...n].filter(i=>i.pid!==e).sort((i,a)=>Date.parse(a.startedAt)-Date.parse(i.startedAt));for(let i of s){if(!Ke(i.pid)){t.registry.unregister(i.id);continue}try{await ka(i,"SIGTERM")}catch(a){a instanceof Error?u.debug("SYSTEM","Failed to send SIGTERM to child process",{pid:i.pid,pgid:i.pgid,type:i.type},a):u.warn("SYSTEM","Failed to send SIGTERM to child process (non-Error)",{pid:i.pid,pgid:i.pgid,type:i.type,error:String(a)})}}await on(s,5e3);let o=s.filter(i=>Ke(i.pid));for(let i of o)try{await ka(i,"SIGKILL")}catch(a){a instanceof Error?u.debug("SYSTEM","Failed to force kill child process",{pid:i.pid,pgid:i.pgid,type:i.type},a):u.warn("SYSTEM","Failed to force kill child process (non-Error)",{pid:i.pid,pgid:i.pgid,type:i.type,error:String(a)})}await on(o,1e3);for(let i of s)t.registry.unregister(i.id);for(let i of n.filter(a=>a.pid===e))t.registry.unregister(i.id);Bp(r,e),t.registry.pruneDeadEntries()}function Bp(t,e){if(!Pp(t))return;let r=null;try{let n=JSON.parse(Up(t,"utf-8"));r=typeof n.pid=="number"?n.pid:null}catch(n){u.debug("SYSTEM","PID file unreadable during shutdown \u2014 leaving it (cannot prove ownership)",{pidFilePath:t,error:n instanceof Error?n.message:String(n)});return}if(r!==e){u.debug("SYSTEM","PID file not owned by this process \u2014 leaving it for its owner (restart successor?)",{pidFilePath:t,recordedPid:r,currentPid:e});return}try{Fp(t,{force:!0})}catch(n){n instanceof Error?u.debug("SYSTEM","Failed to remove PID file during shutdown",{pidFilePath:t},n):u.warn("SYSTEM","Failed to remove PID file during shutdown (non-Error)",{pidFilePath:t,error:String(n)})}}async function ka(t,e){let{pid:r,pgid:n}=t;if(process.platform!=="win32"){if(typeof n=="number")try{process.kill(-n,e);return}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}try{process.kill(r,e)}catch(i){if((i instanceof Error?i.code:void 0)!=="ESRCH")throw i}return}if(e==="SIGTERM"){try{process.kill(r,e)}catch(i){if(i instanceof Error&&i.code==="ESRCH")return;throw i}return}let s=await Hp();if(s){await new Promise((i,a)=>{s(r,e,l=>{if(!l){i();return}if(l.code==="ESRCH"){i();return}a(l)})});return}let o=["/PID",String(r),"/T"];e==="SIGKILL"&&o.push("/F"),await jp("taskkill",o,{timeout:oe.POWERSHELL_COMMAND,windowsHide:!0})}async function Hp(){let t="tree-kill";try{let e=await import(t);return e.default??e}catch(e){return u.debug("SYSTEM","tree-kill module not available, using fallback",{},e instanceof Error?e:void 0),null}}var jp,Gp,Aa=S(()=>{"use strict";V();ir();pr();J();jp=Wp(Dp),Gp=P.workerPid()});function Jp(){let e=an().pruneDeadEntries();e>0&&u.info("SYSTEM",`Health check: pruned ${e} dead process(es) from registry`)}function Ma(){Ut===null&&(Ut=setInterval(Jp,Na),Ut.unref(),u.debug("SYSTEM","Health checker started",{intervalMs:Na}))}function xa(){Ut!==null&&(clearInterval(Ut),Ut=null,u.debug("SYSTEM","Health checker stopped"))}var Na,Ut,La=S(()=>{"use strict";V();pr();Na=3e4,Ut=null});import{existsSync as Kp,readFileSync as Vp,rmSync as Da}from"fs";function Ps(){return Yp}function ln(t={}){let e=t.pidFilePath??Xp;if(!Kp(e))return"missing";let r=null;try{r=JSON.parse(Vp(e,"utf-8"))}catch(s){return s instanceof Error?u.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e},s):u.warn("SYSTEM","Failed to parse worker PID file, removing it",{path:e,error:String(s)}),Da(e,{force:!0}),"invalid"}return Ls(r)&&r?((t.logAlive??!0)&&u.info("SYSTEM","Worker already running (PID alive)",{existingPid:r.pid,existingPort:r.port,startedAt:r.startedAt}),"alive"):(u.info("SYSTEM","Removing stale PID file (worker process is dead or PID has been reused)",{pid:r?.pid,port:r?.port,startedAt:r?.startedAt}),Da(e,{force:!0}),"stale")}var Xp,Ds,Yp,cn=S(()=>{"use strict";V();pr();Aa();La();J();Xp=P.workerPid(),Ds=class{registry;started=!1;stopPromise=null;signalHandlersRegistered=!1;shutdownInitiated=!1;shutdownHandler=null;constructor(e){this.registry=e}async start(){if(this.started)return;if(this.registry.initialize(),ln({logAlive:!1})==="alive")throw new Error("Worker already running");this.started=!0,Ma()}configureSignalHandlers(e){if(this.shutdownHandler=e,this.signalHandlersRegistered)return;this.signalHandlersRegistered=!0;let r=async n=>{if(this.shutdownInitiated){u.warn("SYSTEM",`Received ${n} but shutdown already in progress`);return}this.shutdownInitiated=!0,u.info("SYSTEM",`Received ${n}, shutting down...`);try{this.shutdownHandler?await this.shutdownHandler():await this.stop()}catch(s){s instanceof Error?u.error("SYSTEM","Error during shutdown",{},s):u.error("SYSTEM","Error during shutdown (non-Error)",{error:String(s)});try{await this.stop()}catch(o){o instanceof Error?u.debug("SYSTEM","Supervisor shutdown fallback failed",{},o):u.debug("SYSTEM","Supervisor shutdown fallback failed",{error:String(o)})}}process.exit(0)};process.on("SIGTERM",()=>{r("SIGTERM")}),process.on("SIGINT",()=>{r("SIGINT")}),process.platform!=="win32"&&(process.argv.includes("--daemon")?process.on("SIGHUP",()=>{u.debug("SYSTEM","Ignoring SIGHUP in daemon mode")}):process.on("SIGHUP",()=>{r("SIGHUP")}))}async stop(){if(this.stopPromise){await this.stopPromise;return}xa(),this.stopPromise=_a({registry:this.registry,currentPid:process.pid}).finally(()=>{this.started=!1,this.stopPromise=null}),await this.stopPromise}assertCanSpawn(e){if(this.stopPromise!==null)throw new Error(`Supervisor is shutting down, refusing to spawn ${e}`)}registerProcess(e,r,n){this.registry.register(e,r,n)}unregisterProcess(e){this.registry.unregister(e)}getRegistry(){return this.registry}},Yp=new Ds(an())});import qp from"path";import{homedir as zp}from"os";import{existsSync as mr,writeFileSync as hy,readFileSync as Zp,unlinkSync as Qp,mkdirSync as Ey,rmSync as Sy,statSync as by,utimesSync as $p}from"fs";import{execSync as em}from"child_process";function Pa(t){return t?/(^|[\\/])node(\.exe)?$/i.test(t.trim()):!1}function tm(t,e){let r=e==="win32"?`where ${t}`:`which ${t}`,n;try{n=em(r,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",windowsHide:!0})}catch(o){return o instanceof Error?u.debug("SYSTEM",`Binary lookup failed for ${t}`,{command:r},o):u.debug("SYSTEM",`Binary lookup failed for ${t}`,{command:r},new Error(String(o))),null}return n.split(/\r?\n/).map(o=>o.trim()).find(o=>o.length>0)||null}function un(t={}){let e=Object.keys(t).length===0;if(e&&Us!==void 0)return Us;let r=rm(t);return e&&r!==null&&(Us=r),r}function rm(t){let e=t.platform??process.platform,r=t.execPath??process.execPath;if(Pa(r))return r;let n=t.env??process.env,s=t.homeDirectory??zp(),o=t.pathExists??mr,i=t.lookupInPath??tm,a=e==="win32"?[n.NODE,qp.join(s,".nvm","current","bin","node.exe"),"node"]:[n.NODE,"/usr/local/bin/node","/opt/homebrew/bin/node","/usr/bin/node","node"];for(let l of a){let c=l?.trim();if(c&&(Pa(c)&&o(c)||c.toLowerCase()==="node"))return c}return i("node",e)}function Ua(){if(!mr(Pe))return null;try{return JSON.parse(Zp(Pe,"utf-8"))}catch(t){return t instanceof Error?u.warn("SYSTEM","Failed to parse PID file",{path:Pe},t):u.warn("SYSTEM","Failed to parse PID file",{path:Pe},new Error(String(t))),null}}function Fa(){if(mr(Pe))try{Qp(Pe)}catch(t){t instanceof Error?u.warn("SYSTEM","Failed to remove PID file",{path:Pe},t):u.warn("SYSTEM","Failed to remove PID file",{path:Pe},new Error(String(t)))}}function ct(t){return process.platform==="win32"?Math.round(t*2):t}function Wa(t,e,r={}){Ps().assertCanSpawn("worker daemon");let n=Rt({...process.env,CLAUDE_MEM_WORKER_PORT:String(e),...r}),s=un();if(!s){u.error("SYSTEM","Node runtime not found \u2014 ensure node is on PATH or set the NODE env var. The worker daemon runs under Node (node:sqlite).");return}if(process.platform==="win32")try{let d=He(s,[t,"--daemon"],{detached:!0,stdio:"ignore",windowsHide:!0,env:n});if(d.pid===void 0){u.error("SYSTEM","Worker daemon spawn produced no PID on Windows",{runtimePath:s});return}return d.unref(),d.pid}catch(d){u.error("SYSTEM","Failed to spawn worker daemon on Windows",{runtimePath:s},ya(d));return}let o="/usr/bin/setsid",i=mr(o),c=He(i?o:s,i?[s,t,"--daemon"]:[t,"--daemon"],{detached:!0,stdio:"ignore",env:n});if(c.pid!==void 0)return c.unref(),c.pid}function ja(t){if(t===0)return!0;if(!Number.isInteger(t)||t<0)return!1;try{return process.kill(t,0),!0}catch(e){if(e instanceof Error){let r=e.code;if(r==="EPERM")return!0;u.debug("SYSTEM","Process not alive",{pid:t,code:r})}else u.debug("SYSTEM","Process not alive (non-Error thrown)",{pid:t},new Error(String(e)));return!1}}function Ga(){try{if(!mr(Pe))return;let t=new Date;$p(Pe,t,t)}catch{}}function Ba(){return ln({logAlive:!1})}var Oy,Pe,ky,Us,fr=S(()=>{"use strict";Pt();V();Ta();sn();cn();J();pr();Oy=P.dataDir(),Pe=P.workerPid(),ky=P.workerPort()});import My from"path";import nm from"net";import{readFileSync as Dy}from"fs";async function om(t,e,r="GET"){let n=await fetch(`http://127.0.0.1:${t}${e}`,{method:r,signal:AbortSignal.timeout(sm)}),s="";try{s=await n.text()}catch{}return{ok:n.ok,statusCode:n.status,body:s}}async function Ha(t){return new Promise(e=>{let r=nm.createServer();r.once("error",n=>{n.code==="EADDRINUSE"||n.code==="EACCES"?e(!0):e(!1)}),r.once("listening",()=>{r.close(()=>e(!1))}),r.listen(t,"127.0.0.1")})}async function Ja(t,e,r,n){let s=Date.now();for(;Date.now()-s<r;){try{if((await om(t,e)).ok)return!0}catch(o){o instanceof Error?u.debug("SYSTEM",n,{},o):u.debug("SYSTEM",n,{error:String(o)})}await new Promise(o=>setTimeout(o,500))}return!1}function gr(t,e=3e4){return Ja(t,"/api/health",e,"Service not ready yet, will retry")}function hr(t,e=3e4){return Ja(t,"/api/readiness",e,"Worker not ready yet, will retry")}var sm,Fs=S(()=>{"use strict";V();J();sm=2500});import{dirname as im,join as am}from"path";import{mkdirSync as lm,readFileSync as cm,statSync as Ka,unlinkSync as Va,writeFileSync as um}from"fs";function Xa(){return am(lt(),"spawn.lock")}function Ws(){let t=Xa(),e=JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()});for(let r=0;r<2;r++)try{return lm(im(t),{recursive:!0}),um(t,e,{flag:"wx"}),!0}catch(n){if(n?.code!=="EEXIST")return!0;if(r>0)return!1;let o;try{o=Ka(t).mtimeMs}catch{continue}if(Date.now()-o<=dm)return!1;let i;try{i=Ka(t).mtimeMs}catch{continue}if(i!==o)return!1;try{Va(t)}catch{return!1}}return!1}function js(){let t=Xa();try{if(JSON.parse(cm(t,"utf-8")).pid!==process.pid)return;Va(t)}catch{}}var dm,Gs=S(()=>{"use strict";J();dm=6e4});import{existsSync as pm}from"fs";function mm(t){let e=Ua();return e&&typeof e.port=="number"&&ja(e.pid)?e.port:t}async function fm(t,e){let r=Date.now()+e;for(;Date.now()<r;){let n=mm(t);if(await gr(n,800))return n;await new Promise(s=>setTimeout(s,300))}return null}async function Ya(t,e){if(!e)return u.error("SYSTEM","ensureWorkerStarted called with empty workerScriptPath \u2014 caller bug"),"dead";if(!pm(e))return u.error("SYSTEM","ensureWorkerStarted: worker script not found at expected path \u2014 likely a partial install or build artifact missing",{workerScriptPath:e}),"dead";if(await gr(t,1e3)){let a=await hr(t,ct(oe.READINESS_WAIT));return a||u.warn("SYSTEM","Worker is alive but readiness timed out \u2014 proceeding anyway"),u.info("SYSTEM","Worker already running and healthy (fast path)"),a?"ready":"warming"}if(Ba()==="alive"){if(u.info("SYSTEM","Worker PID file points to a live process, waiting for it to become healthy"),await gr(t,ct(oe.POST_SPAWN_WAIT))){let l=await hr(t,ct(oe.READINESS_WAIT));return u.info("SYSTEM","Worker became healthy while waiting on live PID"),l?"ready":"warming"}u.warn("SYSTEM","PID file marked live but worker never became healthy within the cold-boot window \u2014 treating it as a stale/reused PID and re-spawning"),Fa()}if(await Ha(t)){if(u.info("SYSTEM","Port in use, waiting for worker to become healthy"),await gr(t,ct(oe.PORT_IN_USE_WAIT))){let l=await hr(t,ct(oe.READINESS_WAIT));return u.info("SYSTEM","Worker is now healthy"),l?"ready":"warming"}u.warn("SYSTEM","Configured port in use but no healthy worker \u2014 spawning anyway (worker will pick a free ephemeral port)")}let s=Ws(),o=t;try{if(s){if(u.info("SYSTEM","Starting worker daemon",{workerScriptPath:e}),Wa(e,t)===void 0)return u.error("SYSTEM","Failed to spawn worker daemon"),"dead"}else u.info("SYSTEM","Another launcher holds the spawn lock \u2014 skipping duplicate spawn and waiting for its worker");let a=await fm(t,ct(oe.POST_SPAWN_WAIT));if(a===null)return u.warn("SYSTEM",s?"Worker spawned but health endpoint not responding within window \u2014 likely still starting in background":"Spawn-lock holder's worker not healthy within window \u2014 likely still starting in background"),"warming";o=a}finally{s&&js()}let i=await hr(o,ct(oe.READINESS_WAIT));return i||u.warn("SYSTEM","Worker is alive but readiness timed out \u2014 proceeding anyway"),Ga(),u.info("SYSTEM",s?"Worker started successfully":"Worker is up (started by another launcher)"),i?"ready":"warming"}var qa=S(()=>{"use strict";V();ir();fr();Fs();Gs()});function wt(t){return t instanceof Error?t.message:typeof t=="string"?t:t&&typeof t=="object"&&"message"in t?String(t.message):String(t??"")}function za(t,e){for(let r of Bs)if(r.match(t,e))return r;return Bs[Bs.length-1]}var gm,hm,Bs,dn=S(()=>{"use strict";gm=t=>t.platform==="win32"?'Install Bun manually then re-run `npx keepmind install`. Windows: `winget install Oven-sh.Bun` (or `powershell -c "irm bun.sh/install.ps1 | iex"`).':"Install Bun manually then re-run `npx keepmind install`. macOS/Linux: `curl -fsSL https://bun.sh/install | bash` (or `brew install oven-sh/bun/bun`).",hm=t=>t.platform==="win32"?'Install uv manually then re-run `npx keepmind install`. Windows: `winget install astral-sh.uv` (or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"`).':"Install uv manually then re-run `npx keepmind install`. macOS/Linux: `curl -LsSf https://astral.sh/uv/install.sh | sh` (or `brew install uv`).",Bs=[{id:"bun-missing-after-install",severity:"ABORT",match:t=>{let e=wt(t);return e.includes("Bun executable not found")||e.includes("Bun installation completed but binary not found")||e.includes("Failed to install Bun")},remediation:gm},{id:"uv-missing-after-install",severity:"ABORT",match:t=>{let e=wt(t);return e.includes("uv executable not found")||e.includes("uv installed but version probe failed")||e.includes("uv binary not found")||e.includes("Failed to install uv")},remediation:hm},{id:"tree-sitter-eresolve",severity:"ABORT",match:t=>/\bERESOLVE\b/.test(wt(t)),remediation:()=>"ERESOLVE peer-dependency conflict in marketplace deps that --legacy-peer-deps could not resolve. Open an issue at https://github.com/ManuelStaggl/keepmind/issues with the conflicting peer ranges shown above."},{id:"bun-install-network-fail",severity:"SILENT_RETRY",match:t=>/error: failed to resolve/.test(wt(t)),remediation:()=>"bun install failed to resolve packages \u2014 check network connectivity and re-run `npx keepmind install`. Cached packages in ~/.bun/install/cache will be reused."},{id:"marketplace-dir-not-writable",severity:"ABORT",match:t=>/\b(EACCES|EPERM)\b/.test(wt(t)),remediation:t=>`Cannot write to the claude-mem data/marketplace directory under ${t.dataDir}. Check filesystem permissions or set CLAUDE_MEM_DATA_DIR to a writable path, then re-run.`},{id:"plugin-json-corrupt",severity:"ABORT",match:(t,e)=>e.component==="plugin-json"&&/Unexpected token|JSON|parse/i.test(wt(t)),remediation:()=>"Existing plugin.json is corrupt. Run `rm -rf ~/.claude/plugins/marketplaces/keepmind` and re-run `npx keepmind install`."},{id:"all-ides-failed",severity:"ABORT",match:(t,e)=>e.component==="all-ides",remediation:()=>"Every selected IDE integration failed. See the per-IDE errors above. Re-run with `--ide=<single>` to isolate the failure."},{id:"single-ide-failed",severity:"FAIL_LOUD_PER_IDE",match:(t,e)=>e.phase==="ide-install",remediation:()=>"Re-run `npx keepmind install --ide=<name>` to retry just this IDE. The captured stderr is shown above."},{id:"path-update-failed",severity:"WARN_CONTINUE",match:(t,e)=>e.component==="path-update",remediation:()=>"Could not auto-update PATH in your shell config. Add the printed export line manually and restart your shell."},{id:"auto-memory-toggle-failed",severity:"WARN_CONTINUE",match:(t,e)=>e.component==="auto-memory",remediation:()=>'Could not disable Claude Code auto-memory. Add `"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"` to the env block in ~/.claude/settings.json.'},{id:"version-probe-transient",severity:"WARN_CONTINUE",match:(t,e)=>e.component.endsWith("-version-probe"),remediation:()=>"Could not verify the tool version after install \u2014 the installation is likely OK. Re-run `npx keepmind install` if features misbehave."},{id:"child-process-timeout",severity:"ABORT",match:t=>/timed out|ETIMEDOUT|SIGTERM|did not finish/i.test(wt(t)),remediation:()=>"An install command did not finish in time. Check network connectivity. On a slow host, raise the budget with CLAUDE_MEM_INSTALL_TIMEOUT_MS and re-run."},{id:"unknown-install-error",severity:"ABORT",match:()=>!0,remediation:t=>`An unexpected installer error occurred. Capture ${t.dataDir}/last-install-error.json and open an issue at https://github.com/ManuelStaggl/keepmind/issues.`}]});import{mkdirSync as Em,writeFileSync as Sm}from"fs";import{join as bm}from"path";function Qa(){return{warnings:[],failedIDEs:[],retryCount:{}}}function Ft(t){return t instanceof Error?t.message:typeof t=="string"?t:String(t??"")}function ym(t,e,r,n){try{Em(n,{recursive:!0});let s={severity:t.severity,categoryId:t.id,component:e.component,phase:e.phase,cause:Ft(e.cause),remediation:r,details:e.details??null,timestamp:new Date().toISOString()};Sm(bm(n,"last-install-error.json"),JSON.stringify(s,null,2))}catch{}}function ce(t,e,r){let n=lt(),s=za(e.cause,{component:e.component,phase:e.phase}),o=e.remediation??s.remediation({platform:process.platform,dataDir:n});switch(t){case"ABORT":throw ym(s,e,o,n),new Er(`${e.component} failed during ${e.phase}: ${Ft(e.cause)}`,{category:s,remediation:o,cause:e.cause});case"FAIL_LOUD_PER_IDE":{let i=e.ide??e.component;r.failedIDEs.includes(i)||r.failedIDEs.push(i),r.warnings.push({component:i,message:e.details?`${Ft(e.cause)}
|
|
101
101
|
${e.details}`:Ft(e.cause),remediation:o});return}case"WARN_CONTINUE":{r.warnings.push({component:e.component,message:Ft(e.cause),remediation:o});return}case"SILENT_RETRY":{let i=(r.retryCount[e.component]??0)+1;r.retryCount[e.component]=i,i>1&&r.warnings.push({component:e.component,message:Ft(e.cause),remediation:o});return}}}function Hs(t,e){if(t.warnings.length!==0){e(""),e("Warnings & remediation:");for(let r of t.warnings)e(` \u2022 [${r.component}] ${r.message}`),r.remediation&&r.remediation!=="No action required."&&e(` \u2192 ${r.remediation}`)}}var Er,Js=S(()=>{"use strict";dn();J();Er=class extends Error{category;remediation;constructor(e,r){super(e,{cause:r.cause}),this.name="InstallAbortError",this.category=r.category,this.remediation=r.remediation}}});import{existsSync as ut,readFileSync as Vs,writeFileSync as Tm}from"fs";import{exec as vm,execSync as pn,spawnSync as mn}from"child_process";import{createRequire as Cm}from"module";import{join as Oe}from"path";import{homedir as Wt}from"os";function $a(){return j?'Install Bun manually: `winget install Oven-sh.Bun` (or `powershell -c "irm bun.sh/install.ps1 | iex"`), then re-run `npx keepmind install`.':"Install Bun manually: `curl -fsSL https://bun.sh/install | bash` (or `brew install oven-sh/bun/bun`), then re-run `npx keepmind install`."}function el(){return j?'Install uv manually: `winget install astral-sh.uv` (or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"`), then re-run `npx keepmind install`.':"Install uv manually: `curl -LsSf https://astral.sh/uv/install.sh | sh` (or `brew install uv`), then re-run `npx keepmind install`."}function tl(){try{if(!ut(Je))return!1;let t=JSON.parse(Vs(Je,"utf-8"));if(!t||typeof t!="object")return!1;let e=t,r=e.env&&typeof e.env=="object"?e.env:{},n=e.CLAUDE_MEM_DISABLE_VECTOR_SEARCH??r.CLAUDE_MEM_DISABLE_VECTOR_SEARCH;return n===!0||n==="true"||n==="1"}catch{return!1}}function ol(t){return Oe(t,".install-version")}function Xs(){try{if(mn("bun",["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:j}).status===0)return"bun"}catch{}return nl.find(ut)||null}function il(){return Xs()!==null}function Ks(){let t=Xs();if(!t)return null;try{let e=mn(t,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:j});return e.status===0?e.stdout.trim():null}catch{return null}}function Ys(){try{if(mn("uv",["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:j}).status===0)return"uv"}catch{}return sl.find(ut)||null}function al(){return Ys()!==null}function rl(){let t=Ys();if(!t)return null;try{let e=mn(t,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:j});return e.status===0?e.stdout.trim():null}catch{return null}}function qs(t){if(t&&typeof t=="object"){let e=t,r=[];e.message&&r.push(e.message);let n=e.stderr?e.stderr.toString().trim():"";n&&r.push(`stderr: ${n}`);let s=e.stdout?e.stdout.toString().trim():"";return!n&&s&&r.push(`stdout: ${s}`),r.join(`
|
|
102
102
|
`)}return String(t)}function wm(){try{if(j?pn('powershell -c "irm bun.sh/install.ps1 | iex"',{stdio:"pipe",timeout:Sr,shell:process.env.ComSpec??"cmd.exe"}):pn("curl -fsSL https://bun.sh/install | bash",{stdio:"pipe",timeout:Sr,shell:"/bin/bash"}),!il())throw new Error("Bun installation completed but binary not found. Please restart your terminal and try again.")}catch(t){let e=j?` - winget install Oven-sh.Bun
|
|
103
103
|
- Or: powershell -c "irm bun.sh/install.ps1 | iex"`:` - curl -fsSL https://bun.sh/install | bash
|
|
@@ -112,10 +112,10 @@ Then restart your terminal and try again.
|
|
|
112
112
|
Underlying error: ${qs(t)}`)}}function km(t){let e=JSON.parse(Vs(Oe(t,"package.json"),"utf-8")),r=Object.keys(e.dependencies||{}),n=Oe(t,"node_modules"),s=Cm(Oe(n,"noop.js")),o=[n],i=[];for(let a of r)try{s.resolve(a,{paths:o})}catch{try{s.resolve(`${a}/package.json`,{paths:o})}catch{i.push(a)}}if(r.includes("zod"))for(let a of Om)try{s.resolve(a,{paths:o})}catch{i.push(a)}if(i.length>0)throw new Error(`Post-install check failed: unresolvable modules: ${i.join(", ")}`)}function ll(t){return t??{warnings:[],failedIDEs:[],retryCount:{}}}async function It(t){let e=ll(t);if(!il())try{wm()}catch(s){ce("ABORT",{component:"bun-install",phase:"setup-runtime",cause:s,remediation:$a()},e)}let r=Xs();if(r||(r=nl.find(ut)??null),!r)throw ce("ABORT",{component:"bun-install",phase:"setup-runtime",cause:new Error("Bun executable not found after auto-install attempt"),remediation:$a()},e),new Error("unreachable");let n=Ks();return n||(await new Promise(s=>setTimeout(s,1e3)),n=Ks()),n?{bunPath:r,version:n}:(ce("WARN_CONTINUE",{component:"bun-version-probe",phase:"setup-runtime",cause:new Error(`Bun at ${r} did not respond to --version after retry`)},e),{bunPath:r,version:"unknown"})}async function zs(t,e={}){let r=ll(t);if(!al())try{Im()}catch(o){if(e.allowVectorSearchOptOut&&tl())return ce("WARN_CONTINUE",{component:"uv-install",phase:"setup-runtime",cause:o},r),{uvPath:"",version:"unknown"};ce("ABORT",{component:"uv-install",phase:"setup-runtime",cause:o,remediation:el()},r)}let n=Ys();if(n||(n=sl.find(ut)??null),!n){if(e.allowVectorSearchOptOut&&tl())return ce("WARN_CONTINUE",{component:"uv-install",phase:"setup-runtime",cause:new Error("uv binary not found after install; vector search disabled \u2014 continuing.")},r),{uvPath:"",version:"unknown"};throw ce("ABORT",{component:"uv-install",phase:"setup-runtime",cause:new Error("uv binary not found after auto-install attempt"),remediation:el()},r),new Error("unreachable")}let s=rl();return s||(await new Promise(o=>setTimeout(o,1e3)),s=rl()),s?{uvPath:n,version:s}:(ce("WARN_CONTINUE",{component:"uv-version-probe",phase:"setup-runtime",cause:new Error(`uv at ${n} did not respond to --version after retry`)},r),{uvPath:n,version:"unknown"})}async function br(t,e){if(!ut(Oe(t,"package.json")))throw new Error(`installPluginDependencies: no package.json at ${t}`);let r=j&&e.includes(" ")?`"${e}"`:e;try{await new Promise((n,s)=>{vm(`${r} install --frozen-lockfile --ignore-scripts`,{cwd:t,timeout:Sr,maxBuffer:16*1024*1024,...j?{shell:process.env.ComSpec??"cmd.exe"}:{}},(o,i,a)=>o?s(Object.assign(o,{stdout:i,stderr:a})):n())})}catch(n){throw new Error(`bun install failed in ${t}
|
|
113
113
|
${qs(n)}`)}km(t)}function _m(t){let e=ol(t);if(!ut(e))return null;let r=Vs(e,"utf-8");try{let s=JSON.parse(r);if(s&&typeof s=="object"&&typeof s.version=="string")return s}catch{}let n=r.trim();return Rm.test(n)?{version:n.replace(/^v/i,"")}:null}function Zs(t,e,r,n){let s={version:e,bun:r,uv:n,installedAt:new Date().toISOString()};Tm(ol(t),JSON.stringify(s))}function cl(t,e){if(!ut(Oe(t,"node_modules")))return!1;let r=_m(t);if(!r||r.version!==e)return!1;let n=Ks();return!(n&&!r.bun||!n&&r.bun||n&&r.bun&&n!==r.bun)}var Sr,nl,sl,Rm,Om,ul=S(()=>{"use strict";dn();Js();J();Ae();Sr=(()=>{let t=process.env.CLAUDE_MEM_INSTALL_TIMEOUT_MS;return t&&Number.isFinite(Number(t))?Number(t):300*1e3})();nl=j?[Oe(Wt(),".bun","bin","bun.exe")]:[Oe(Wt(),".bun","bin","bun"),"/usr/local/bin/bun","/opt/homebrew/bin/bun"],sl=j?[Oe(Wt(),".local","bin","uv.exe"),Oe(Wt(),".cargo","bin","uv.exe")]:[Oe(Wt(),".local","bin","uv"),Oe(Wt(),".cargo","bin","uv"),"/usr/local/bin/uv","/opt/homebrew/bin/uv"],Rm=/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;Om=["zod/v3","zod/v4","zod/v4-mini"]});var dt,dl=S(()=>{"use strict";dt={compressed:"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",frameCount:192,width:128,height:36,frameDelay:22}});import{inflateRawSync as Am}from"zlib";function Dm(t,e=1){if(!t)return"\x1B[38;5;208m";let r=Math.min(255,Math.round(230*e)),n=Math.min(255,Math.round(115*e)),s=Math.min(255,Math.round(70*e));return`\x1B[38;2;${r};${n};${s}m`}function Pm(t,e=1){if(!t)return"\x1B[38;5;215m";let r=Math.min(255,Math.round(255*e)),n=Math.min(255,Math.round(180*e)),s=Math.min(255,Math.round(122*e));return`\x1B[38;2;${r};${n};${s}m`}function Um(){if(yr)return yr;try{yr=Am(Buffer.from(dt.compressed,"base64")).toString("utf8").split(Lm).filter(Boolean)}catch{yr=[]}return yr}function Fm(t,e,r=1){let n=Dm(e,r),s=Pm(e,r),o=n,i=0,a=!1;for(;i<t.length;){let l=t[i];if(l==="<"){let c=t[i+1]==="/";for(;i<t.length&&t[i]!==">";)i++;i++,a=!c,o+=a?s:n;continue}o+=l,i++}return o+ml}function Wm(){return process.env.COLORTERM==="truecolor"||process.env.COLORTERM==="24bit"}function jm(t,e){let r=Qs[t],n=dt.width,s=r.slice(0,Math.min(Ot,e)).padEnd(Ot," "),o=Math.max(0,Math.floor((n-Ot)/2));return" ".repeat(o)+`\x1B[1;97m${s}\x1B[0m`+" ".repeat(Math.max(0,n-o-Ot))}function Gm(t){let e=dt.width,r=Math.max(0,Math.floor((e-t.length)/2));return" ".repeat(r)+`\x1B[2;37m${t}\x1B[0m`+" ".repeat(Math.max(0,e-r-t.length))}function Bm(){return!process.stdout.isTTY||process.env.CI||process.env.CLAUDE_MEM_NO_BANNER||process.env.NO_COLOR?!1:(process.stdout.columns??0)>=dt.width}async function hl(){if(!Bm())return;let t=Wm(),e=Um();if(e.length===0)return;let r=!1,n=()=>{r=!0};process.stdout.on("resize",n),process.stdout.write(xm),process.stdout.write(Nm),process.stdout.write(`
|
|
114
114
|
`.repeat(pl)),process.stdout.write(`\x1B[${pl}A`),process.stdout.write("\x1B[s");let s=" ".repeat(dt.width),o=(i,a,l,c=1)=>{process.stdout.write("\x1B[u"),process.stdout.write(Fm(i,t,c)),process.stdout.write(`
|
|
115
|
-
`);for(let
|
|
116
|
-
`);for(let
|
|
117
|
-
`);process.stdout.write(Gm(l))};try{for(let c=0;c<e.length;c++){if(r)return;o(e[c],0,""),await Tr(dt.frameDelay)}let i=e[e.length-1],a="persistent memory across sessions",l=14;for(let c=1;c<=l;c++){if(r)return;let
|
|
118
|
-
`)}}var Nm,Mm,xm,ml,Lm,yr,Qs,fl,Ot,gl,pl,Tr,El=S(()=>{"use strict";dl();Nm="\x1B[?25l",Mm="\x1B[?25h",xm="\x1B[2J\x1B[3J\x1B[H",ml="\x1B[0m",Lm="";yr=null;Qs=[" _ _ "," ___| | __ _ _ _ __| | ___ _ __ ___ ___ _ __ ___ "," / __| |/ _` | | | |/ _` |/ _ \\_____| '_ ` _ \\ / _ \\ '_ ` _ \\ ","| (__| | (_| | |_| | (_| | __/_____| | | | | | __/ | | | | |"," \\___|_|\\__,_|\\__,_|\\__,_|\\___| |_| |_| |_|\\___|_| |_| |_|"],fl=Qs.length,Ot=Qs[0].length,gl=1,pl=dt.height+fl+gl+1;Tr=t=>new Promise(e=>setTimeout(e,t))});import{spawn as Hm}from"child_process";function Vm(t){let e=process.env.CLAUDE_MEM_INSTALL_TIMEOUT_MS;return e&&Number.isFinite(Number(e))?Number(e):t?Jm:Km}function Sl(t){return/\bERESOLVE\b/.test(t)||/code ERESOLVE/.test(t)}function bl(t){let e=t.search(/While resolving:/);return e===-1?t.trim():t.slice(e).trim()}function $s(t,e,r=!0){return new Promise(n=>{let s=Hm("npm",e,{cwd:t,stdio:["ignore","pipe","pipe"],...j?{shell:process.env.ComSpec??"cmd.exe"}:{}}),o="",i="",a=!1,l=null,c=setTimeout(()=>{a=!0,s.kill("SIGTERM")},Vm(r));s.stdout?.on("data",f=>{o+=f.toString()}),s.stderr?.on("data",f=>{i+=f.toString()});let
|
|
115
|
+
`);for(let d=0;d<fl;d++)process.stdout.write(jm(d,a)),process.stdout.write(`
|
|
116
|
+
`);for(let d=0;d<gl;d++)process.stdout.write(s),process.stdout.write(`
|
|
117
|
+
`);process.stdout.write(Gm(l))};try{for(let c=0;c<e.length;c++){if(r)return;o(e[c],0,""),await Tr(dt.frameDelay)}let i=e[e.length-1],a="persistent memory across sessions",l=14;for(let c=1;c<=l;c++){if(r)return;let d=Math.ceil(Ot*(c/l));o(i,d,""),await Tr(45)}for(let c=1;c<=6;c++){if(r)return;let d=Math.ceil(a.length*(c/6));o(i,Ot,a.slice(0,d)),await Tr(33)}for(let c of[.85,.95,1]){if(r)return;o(i,Ot,a,c),await Tr(100)}await Tr(150)}finally{process.stdout.off("resize",n),process.stdout.write(ml),process.stdout.write(Mm),process.stdout.write(`
|
|
118
|
+
`)}}var Nm,Mm,xm,ml,Lm,yr,Qs,fl,Ot,gl,pl,Tr,El=S(()=>{"use strict";dl();Nm="\x1B[?25l",Mm="\x1B[?25h",xm="\x1B[2J\x1B[3J\x1B[H",ml="\x1B[0m",Lm="";yr=null;Qs=[" _ _ "," ___| | __ _ _ _ __| | ___ _ __ ___ ___ _ __ ___ "," / __| |/ _` | | | |/ _` |/ _ \\_____| '_ ` _ \\ / _ \\ '_ ` _ \\ ","| (__| | (_| | |_| | (_| | __/_____| | | | | | __/ | | | | |"," \\___|_|\\__,_|\\__,_|\\__,_|\\___| |_| |_| |_|\\___|_| |_| |_|"],fl=Qs.length,Ot=Qs[0].length,gl=1,pl=dt.height+fl+gl+1;Tr=t=>new Promise(e=>setTimeout(e,t))});import{spawn as Hm}from"child_process";function Vm(t){let e=process.env.CLAUDE_MEM_INSTALL_TIMEOUT_MS;return e&&Number.isFinite(Number(e))?Number(e):t?Jm:Km}function Sl(t){return/\bERESOLVE\b/.test(t)||/code ERESOLVE/.test(t)}function bl(t){let e=t.search(/While resolving:/);return e===-1?t.trim():t.slice(e).trim()}function $s(t,e,r=!0){return new Promise(n=>{let s=Hm("npm",e,{cwd:t,stdio:["ignore","pipe","pipe"],...j?{shell:process.env.ComSpec??"cmd.exe"}:{}}),o="",i="",a=!1,l=null,c=setTimeout(()=>{a=!0,s.kill("SIGTERM")},Vm(r));s.stdout?.on("data",f=>{o+=f.toString()}),s.stderr?.on("data",f=>{i+=f.toString()});let d=!1,m=f=>{d||(d=!0,clearTimeout(c),n({code:typeof f=="number"?f:a?124:1,stdout:o,stderr:i||(l?String(l.message):""),timedOut:a}))};s.on("error",f=>{l=f,m(null)}),s.on("close",f=>{m(f)})})}var Jm,Km,yl=S(()=>{"use strict";Ae();Jm=300*1e3,Km=120*1e3});async function fn(t,e=1e4){let r=`http://127.0.0.1:${t}`,n=!1;try{await fetch(`${r}/api/admin/shutdown`,{method:"POST",signal:AbortSignal.timeout(5e3)}),n=!0}catch{return{workerWasRunning:!1}}let s=500,o=Math.ceil(e/s);for(let i=0;i<o;i++){await new Promise(a=>setTimeout(a,s));try{await fetch(`${r}/api/health`,{signal:AbortSignal.timeout(1e3)})}catch(a){if(a instanceof Error&&a.name==="AbortError")continue;return{workerWasRunning:n}}}return{workerWasRunning:n}}var eo=S(()=>{"use strict"});import{execSync as Xm}from"child_process";import{existsSync as Ve,readdirSync as Ym}from"fs";import{homedir as Tl}from"os";import{join as Xe}from"path";function vr(t){try{return Xm(`${j?"where":"which"} ${t}`,{stdio:"pipe"}),!0}catch(e){return process.env.DEBUG&&console.error(`[ide-detection] ${t} not in PATH:`,e instanceof Error?e.message:String(e)),!1}}function qm(t){let e=Xe(Tl(),".vscode","extensions");if(!Ve(e))return!1;try{return Ym(e).some(n=>n.toLowerCase().includes(t.toLowerCase()))}catch(r){return console.warn("[ide-detection] Failed to read VS Code extensions directory:",r instanceof Error?r.message:String(r)),!1}}function jt(){let t=Tl();return[{id:"claude-code",label:"Claude Code",detected:vr("claude"),supported:!0,hint:"recommended"},{id:"gemini-cli",label:"Gemini CLI",detected:Ve(Xe(t,".gemini")),supported:!0},{id:"opencode",label:"OpenCode",detected:Ve(Xe(t,".config","opencode"))||vr("opencode"),supported:!0,hint:"plugin-based integration"},{id:"windsurf",label:"Windsurf",detected:Ve(Xe(t,".codeium","windsurf")),supported:!0},{id:"codex-cli",label:"Codex CLI",detected:Ve(Xe(t,".codex")),supported:!0,hint:"native hooks integration"},{id:"cursor",label:"Cursor",detected:Ve(Xe(t,".cursor")),supported:!0,hint:"hooks + MCP integration"},{id:"copilot-cli",label:"Copilot CLI",detected:vr("copilot"),supported:!0,hint:"MCP-based integration"},{id:"antigravity",label:"Antigravity",detected:Ve(Xe(t,".gemini","antigravity")),supported:!0,hint:"MCP-based integration"},{id:"goose",label:"Goose",detected:Ve(Xe(t,".config","goose"))||vr("goose"),supported:!0,hint:"MCP-based integration"},{id:"roo-code",label:"Roo Code",detected:qm("roo-code"),supported:!0,hint:"MCP-based integration"},{id:"warp",label:"Warp",detected:Ve(Xe(t,".warp"))||vr("warp"),supported:!0,hint:"MCP-based integration"}]}var vl=S(()=>{"use strict";Ae()});var Cl=S(()=>{"use strict";Ct();J()});var Rl=S(()=>{"use strict";V();cn()});var wl=S(()=>{"use strict";fr();Fs();Rl()});import zm from"path";import{readFileSync as Zm,existsSync as Qm,writeFileSync as jT,renameSync as GT,mkdirSync as BT}from"fs";function to(t,e,r){let n=process.env[t];if(n){let s=parseInt(n,10);if(Number.isFinite(s)&&s>=r.min&&s<=r.max)return s;u.warn("SYSTEM",`Invalid ${t}, using default`,{value:n,min:r.min,max:r.max})}return e}async function ef(t,e={},r){try{return await fetch(t,{...e,signal:AbortSignal.timeout(r)})}catch(n){throw n instanceof DOMException&&n.name==="TimeoutError"?new Error(`Request timed out after ${r}ms`):n}}function tf(){return zm.join(re.get("CLAUDE_MEM_DATA_DIR"),"settings.json")}function rf(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}function nf(){try{let t=P.workerPid();if(!Qm(t))return null;let e=JSON.parse(Zm(t,"utf-8"));return typeof e.pid!="number"||typeof e.port!="number"||!rf(e.pid)?null:e.port}catch{return null}}function ro(){return En!==null||(En=re.loadFromFile(tf())),En}function Il(t,e){if(!t)return null;let r=parseInt(t,10);return Number.isFinite(r)&&r>=e.min&&r<=e.max?r:null}function sf(t,e,r){let n=process.env[t];if(n!==void 0){let i=Il(n,r);return i!==null?i:(u.warn("SYSTEM",`Invalid ${t}, using default`,{value:n,min:r.min,max:r.max}),e)}let s=ro()[t],o=Il(s,r);return o!==null?o:(u.warn("SYSTEM",`Invalid ${t} in settings.json, using default`,{value:s,min:r.min,max:r.max}),e)}function of(){if(gn!==null)return gn;let t=ro();return gn=parseInt(t.CLAUDE_MEM_WORKER_PORT,10),gn}function Cr(){let t=nf();return t!==null?t:of()}function af(){return hn!==null||(hn=ro().CLAUDE_MEM_WORKER_HOST),hn}function lf(){return Sn!==null||(Sn=sf("CLAUDE_MEM_API_TIMEOUT_MS",vt(oe.API_REQUEST),$m)),Sn}function cf(t){return`http://${af()}:${Cr()}${t}`}function bn(t,e={}){let r=e.method??"GET",n=e.timeoutMs??lf(),s=cf(t),o={method:r};return e.headers&&(o.headers=e.headers),e.body&&(o.body=e.body),n>0?ef(s,o,n):fetch(s,o)}var ev,tv,rv,$m,gn,hn,En,Sn,yn=S(()=>{"use strict";Pt();V();ir();Ct();J();Cl();cn();Rs();wl();fr();Gs();ev=to("CLAUDE_MEM_HEALTH_TIMEOUT_MS",vt(oe.HEALTH_CHECK),{min:500,max:3e5}),tv=to("CLAUDE_MEM_API_TIMEOUT_MS",vt(oe.API_REQUEST),{min:500,max:3e5}),rv=to("CLAUDE_MEM_HOOK_READINESS_TIMEOUT_MS",vt(oe.HOOK_READINESS_WAIT),{min:0,max:3e5}),$m={min:500,max:3e5};gn=null,hn=null,En=null,Sn=null});function Tn(t){if(!t)return t;let e="";for(let r of t){let n=r.codePointAt(0);if(!(n>=55296&&n<=57343)){if(n<=65535){e+=r;continue}e+=uf[r]??df}}return e}var uf,df,no=S(()=>{"use strict";uf={"\u{1F534}":"\u25CF","\u{1F7E3}":"\u25C6","\u{1F504}":"\u21BB","\u{1F535}":"\u25CB","\u{1F6A8}":"\u26A0","\u{1F510}":"\u26B7","\u{1F6E0}":"\u2692","\u{1F50D}":"\u2315","\u{1F3AF}":"\u25CE","\u{1F4AC}":"\u201D","\u{1F9E0}":"\u25C8"},df="\u2022"});import{existsSync as pf,readFileSync as mf,writeFileSync as Ol,mkdirSync as kl,renameSync as ff}from"fs";import{join as so}from"path";function _l(t){try{return pf(t)?JSON.parse(mf(t,"utf-8")):{}}catch(e){return u.error("CONFIG","Failed to read Cursor registry, using empty registry",{file:t,error:e instanceof Error?e.message:String(e)}),{}}}function Al(t,e){let r=so(t,"..");kl(r,{recursive:!0}),Ol(t,JSON.stringify(e,null,2))}function oo(t,e){let r=so(t,".cursor","rules"),n=so(r,"claude-mem-context.mdc"),s=`${n}.tmp`;kl(r,{recursive:!0});let o=`---
|
|
119
119
|
alwaysApply: true
|
|
120
120
|
description: "Claude-mem context from past sessions (auto-updated)"
|
|
121
121
|
---
|
|
@@ -128,9 +128,9 @@ ${Tn(e)}
|
|
|
128
128
|
|
|
129
129
|
---
|
|
130
130
|
*Updated after last session. Use claude-mem's MCP search tools for more detailed queries.*
|
|
131
|
-
`;Ol(s,o),ff(s,n)}var Nl=S(()=>{"use strict";V();no()});import Ye from"path";import{homedir as Ml}from"os";import{existsSync as xl}from"fs";function Ll(t){for(let e of t)if(e&&xl(e))return e;return null}function gf(){let t=[process.env.CLAUDE_PLUGIN_ROOT,process.env.PLUGIN_ROOT,Ye.join(lr,"plugin"),Ye.join(process.cwd(),"plugin"),process.cwd()].filter(e=>!!e);for(let e of t)if(xl(Ye.join(e,"scripts")))return e;return null}function Dl(t){let e=gf(),r=[e?Ye.join(e,"scripts",t):"",Ye.join(lr,"plugin","scripts",t),Ye.join(process.cwd(),"plugin","scripts",t)];return Ll(r)}function Rr(){return Dl("mcp-server.cjs")}function Gt(){return Dl("worker-service.cjs")}function Bt(){let t=[Ye.join(Ml(),".bun","bin","bun"),"/usr/local/bin/bun","/usr/bin/bun",...process.platform==="win32"?[Ye.join(Ml(),".bun","bin","bun.exe"),Ye.join(process.env.LOCALAPPDATA||"","bun","bun.exe")]:[]];return Ll(t)??"bun"}function io(){return process.execPath}var wr=S(()=>{"use strict";J()});var Xl={};he(Xl,{checkCursorHooksStatus:()=>Vl,configureCursorMcp:()=>Ef,findBunPath:()=>Hl,findMcpServerPath:()=>Gl,findWorkerServicePath:()=>Bl,getTargetDir:()=>Cn,handleCursorCommand:()=>vf,installCursorHooks:()=>Jl,readCursorRegistry:()=>vn,registerCursorProject:()=>Wl,uninstallCursorHooks:()=>Kl,unregisterCursorProject:()=>jl,updateCursorContextForProject:()=>hf,writeCursorRegistry:()=>uo});import q from"path";import{homedir as Pl}from"os";import{existsSync as pt,readFileSync as Ul,writeFileSync as lo,unlinkSync as ao,mkdirSync as co}from"fs";function vn(){return _l(Fl)}function uo(t){Al(Fl,t)}function Wl(t,e){let r=vn();r[t]={workspacePath:e,installedAt:new Date().toISOString()},uo(r),
|
|
131
|
+
`;Ol(s,o),ff(s,n)}var Nl=S(()=>{"use strict";V();no()});import Ye from"path";import{homedir as Ml}from"os";import{existsSync as xl}from"fs";function Ll(t){for(let e of t)if(e&&xl(e))return e;return null}function gf(){let t=[process.env.CLAUDE_PLUGIN_ROOT,process.env.PLUGIN_ROOT,Ye.join(lr,"plugin"),Ye.join(process.cwd(),"plugin"),process.cwd()].filter(e=>!!e);for(let e of t)if(xl(Ye.join(e,"scripts")))return e;return null}function Dl(t){let e=gf(),r=[e?Ye.join(e,"scripts",t):"",Ye.join(lr,"plugin","scripts",t),Ye.join(process.cwd(),"plugin","scripts",t)];return Ll(r)}function Rr(){return Dl("mcp-server.cjs")}function Gt(){return Dl("worker-service.cjs")}function Bt(){let t=[Ye.join(Ml(),".bun","bin","bun"),"/usr/local/bin/bun","/usr/bin/bun",...process.platform==="win32"?[Ye.join(Ml(),".bun","bin","bun.exe"),Ye.join(process.env.LOCALAPPDATA||"","bun","bun.exe")]:[]];return Ll(t)??"bun"}function io(){return process.execPath}var wr=S(()=>{"use strict";J()});var Xl={};he(Xl,{checkCursorHooksStatus:()=>Vl,configureCursorMcp:()=>Ef,findBunPath:()=>Hl,findMcpServerPath:()=>Gl,findWorkerServicePath:()=>Bl,getTargetDir:()=>Cn,handleCursorCommand:()=>vf,installCursorHooks:()=>Jl,readCursorRegistry:()=>vn,registerCursorProject:()=>Wl,uninstallCursorHooks:()=>Kl,unregisterCursorProject:()=>jl,updateCursorContextForProject:()=>hf,writeCursorRegistry:()=>uo});import q from"path";import{homedir as Pl}from"os";import{existsSync as pt,readFileSync as Ul,writeFileSync as lo,unlinkSync as ao,mkdirSync as co}from"fs";function vn(){return _l(Fl)}function uo(t){Al(Fl,t)}function Wl(t,e){let r=vn();r[t]={workspacePath:e,installedAt:new Date().toISOString()},uo(r),u.info("CURSOR","Registered project for auto-context updates",{projectName:t,workspacePath:e})}function jl(t){let e=vn();e[t]&&(delete e[t],uo(e),u.info("CURSOR","Unregistered project",{projectName:t}))}async function hf(t,e){let n=vn()[t];if(n)try{let s=await bn(`/api/context/inject?project=${encodeURIComponent(t)}`);if(!s.ok)return;let o=await s.text();if(!o||!o.trim())return;oo(n.workspacePath,o),u.debug("CURSOR","Updated context file",{projectName:t,workspacePath:n.workspacePath})}catch(s){s instanceof Error?u.error("WORKER","Failed to update context file",{projectName:t},s):u.error("WORKER","Failed to update context file",{projectName:t},new Error(String(s)))}}function Gl(){return Rr()}function Bl(){return Gt()}function Hl(){return Bt()}function Cn(t){switch(t){case"project":return q.join(process.cwd(),".cursor");case"user":return q.join(Pl(),".cursor");case"enterprise":return process.platform==="darwin"?"/Library/Application Support/Cursor":process.platform==="linux"?"/etc/cursor":process.platform==="win32"?q.join(process.env.ProgramData||"C:\\ProgramData","Cursor"):null;default:return null}}function Ef(t){let e=Gl();if(!e)return console.error("Could not find MCP server script"),console.error(" Expected at: ~/.claude/plugins/marketplaces/keepmind/plugin/scripts/mcp-server.cjs"),1;let r=Cn(t);if(!r)return console.error(`Invalid target: ${t}. Use: project or user`),1;let n=q.join(r,"mcp.json");try{co(r,{recursive:!0});let s={mcpServers:{}};if(pt(n))try{s=JSON.parse(Ul(n,"utf-8")),s.mcpServers||(s.mcpServers={})}catch(o){o instanceof Error?u.error("WORKER","Corrupt mcp.json, creating new config",{path:n},o):u.error("WORKER","Corrupt mcp.json, creating new config",{path:n},new Error(String(o))),s={mcpServers:{}}}return s.mcpServers["claude-mem"]={command:"node",args:[e]},lo(n,JSON.stringify(s,null,2)),console.log(` Configured MCP server in ${t==="user"?"~/.cursor":".cursor"}/mcp.json`),console.log(` Server path: ${e}`),0}catch(s){return console.error(`Failed to configure MCP: ${s.message}`),1}}async function Jl(t){console.log(`
|
|
132
132
|
Installing Claude-Mem Cursor hooks (${t} level)...
|
|
133
|
-
`);let e=Cn(t);if(!e)return console.error(`Invalid target: ${t}. Use: project, user, or enterprise`),1;let r=Bl();if(!r)return console.error("Could not find worker-service.cjs"),console.error(" Expected at: ~/.claude/plugins/marketplaces/keepmind/plugin/scripts/worker-service.cjs"),1;let n=process.cwd(),s=q.join(e,"hooks.json"),o=Hl(),i=o.replace(/\\/g,"\\\\"),a=r.replace(/\\/g,"\\\\"),l=
|
|
133
|
+
`);let e=Cn(t);if(!e)return console.error(`Invalid target: ${t}. Use: project, user, or enterprise`),1;let r=Bl();if(!r)return console.error("Could not find worker-service.cjs"),console.error(" Expected at: ~/.claude/plugins/marketplaces/keepmind/plugin/scripts/worker-service.cjs"),1;let n=process.cwd(),s=q.join(e,"hooks.json"),o=Hl(),i=o.replace(/\\/g,"\\\\"),a=r.replace(/\\/g,"\\\\"),l=d=>`"${i}" "${a}" hook cursor ${d}`;console.log(` Using Bun runtime: ${o}`);let c={version:1,hooks:{beforeSubmitPrompt:[{command:l("session-init")},{command:l("context")}],afterMCPExecution:[{command:l("observation")}],afterShellExecution:[{command:l("observation")}],afterFileEdit:[{command:l("file-edit")}],stop:[{command:l("summarize")}]}};try{return co(e,{recursive:!0}),await Sf(s,c,r,t,e,n),0}catch(d){let m=d instanceof Error?d.message:String(d);return console.error(`
|
|
134
134
|
Installation failed: ${m}`),t==="enterprise"&&console.error(" Tip: Enterprise installation may require sudo/admin privileges"),1}}async function Sf(t,e,r,n,s,o){lo(t,JSON.stringify(e,null,2)),console.log(" Created hooks.json (unified CLI mode)"),console.log(` Worker service: ${r}`),n==="project"&&await bf(s,o),console.log(`
|
|
135
135
|
Installation complete!
|
|
136
136
|
|
|
@@ -145,7 +145,7 @@ Next steps:
|
|
|
145
145
|
Context Injection:
|
|
146
146
|
Context from past sessions is stored in .cursor/rules/claude-mem-context.mdc
|
|
147
147
|
and automatically included in every chat. It updates after each session ends.
|
|
148
|
-
`)}async function bf(t,e){let r=q.join(t,"rules");co(r,{recursive:!0});let n=q.basename(e),s=!1;console.log(" Generating initial context...");try{s=await yf(n,e)}catch(o){o instanceof Error?
|
|
148
|
+
`)}async function bf(t,e){let r=q.join(t,"rules");co(r,{recursive:!0});let n=q.basename(e),s=!1;console.log(" Generating initial context...");try{s=await yf(n,e)}catch(o){o instanceof Error?u.debug("WORKER","Worker not running during install",{},o):u.debug("WORKER","Worker not running during install",{},new Error(String(o)))}if(!s){let o=q.join(r,"claude-mem-context.mdc");lo(o,`---
|
|
149
149
|
alwaysApply: true
|
|
150
150
|
description: "Claude-mem context from past sessions (auto-updated)"
|
|
151
151
|
---
|
|
@@ -162,7 +162,7 @@ Uninstallation failed: ${l}`),1}}function Tf(t,e,r,n,s){for(let o of e){let i=q.
|
|
|
162
162
|
Uninstallation complete!
|
|
163
163
|
`),console.log("Restart Cursor to apply changes.")}function Vl(){console.log(`
|
|
164
164
|
Claude-Mem Cursor Hooks Status
|
|
165
|
-
`);let t=[{name:"Project",dir:q.join(process.cwd(),".cursor")},{name:"User",dir:q.join(Pl(),".cursor")}];process.platform==="darwin"?t.push({name:"Enterprise",dir:"/Library/Application Support/Cursor"}):process.platform==="linux"&&t.push({name:"Enterprise",dir:"/etc/cursor"});let e=!1;for(let r of t){let n=q.join(r.dir,"hooks.json"),s=q.join(r.dir,"hooks");if(pt(n)){e=!0,console.log(`${r.name}: Installed`),console.log(` Config: ${n}`);let o=null;try{o=JSON.parse(Ul(n,"utf-8"))}catch(i){i instanceof Error?
|
|
165
|
+
`);let t=[{name:"Project",dir:q.join(process.cwd(),".cursor")},{name:"User",dir:q.join(Pl(),".cursor")}];process.platform==="darwin"?t.push({name:"Enterprise",dir:"/Library/Application Support/Cursor"}):process.platform==="linux"&&t.push({name:"Enterprise",dir:"/etc/cursor"});let e=!1;for(let r of t){let n=q.join(r.dir,"hooks.json"),s=q.join(r.dir,"hooks");if(pt(n)){e=!0,console.log(`${r.name}: Installed`),console.log(` Config: ${n}`);let o=null;try{o=JSON.parse(Ul(n,"utf-8"))}catch(i){i instanceof Error?u.error("WORKER","Unable to parse hooks.json",{path:n},i):u.error("WORKER","Unable to parse hooks.json",{path:n},new Error(String(i))),console.log(" Mode: Unable to parse hooks.json")}if(o){let i=o?.hooks?.beforeSubmitPrompt?.[0]?.command||"";if(i.includes("worker-service.cjs")&&i.includes("hook cursor"))console.log(" Mode: Unified CLI (bun worker-service.cjs)");else{let a=["session-init.sh","context-inject.sh","save-observation.sh"],l=["session-init.ps1","context-inject.ps1","save-observation.ps1"],c=a.some(m=>pt(q.join(s,m))),d=l.some(m=>pt(q.join(s,m)));c||d?(console.log(" Mode: Legacy shell scripts (consider reinstalling for unified CLI)"),c&&d?console.log(" Platform: Both (bash + PowerShell)"):c?console.log(" Platform: Unix (bash)"):d&&console.log(" Platform: Windows (PowerShell)")):console.log(" Mode: Unknown configuration")}}if(r.name==="Project"){let i=q.join(r.dir,"rules","claude-mem-context.mdc");pt(i)?console.log(" Context: Active"):console.log(" Context: Not yet generated (will be created on first prompt)")}}else console.log(`${r.name}: Not installed`);console.log("")}return e||console.log(`No hooks installed. Run: claude-mem cursor install
|
|
166
166
|
`),0}async function vf(t,e){switch(t){case"install":{let r=e[0]||"project";return Jl(r)}case"uninstall":{let r=e[0]||"project";return Kl(r)}case"status":return Vl();case"setup":return console.log("Use the main entry point for setup"),0;default:return console.log(`
|
|
167
167
|
Claude-Mem Cursor Integration
|
|
168
168
|
|
|
@@ -187,8 +187,8 @@ Examples:
|
|
|
187
187
|
claude-mem cursor status # Check if hooks are installed
|
|
188
188
|
|
|
189
189
|
For more info: https://docs.claude-mem.ai/cursor
|
|
190
|
-
`),0}}var Fl,Yl=S(()=>{"use strict";V();yn();J();Nl();wr();Fl=q.join(M,"cursor-projects.json")});var go={};he(go,{checkGeminiCliHooksStatus:()=>$l,handleGeminiCliCommand:()=>Nf,installGeminiCliHooks:()=>Zl,uninstallGeminiCliHooks:()=>Ql});import po from"path";import{homedir as Cf}from"os";import{existsSync as Ht,readFileSync as Rn,writeFileSync as mo,mkdirSync as ql}from"fs";function wf(t,e,r){let n=Jt[r];if(!n)throw new Error(`Unknown Gemini CLI event: ${r}`);let s=t.replace(/\\/g,"\\\\"),o=e.replace(/\\/g,"\\\\");return`"${s}" "${o}" hook gemini-cli ${n}`}function If(t){return{matcher:"*",hooks:[{name:Ir,type:"command",command:t,timeout:Rf}]}}function fo(){if(!Ht(me))return{};let t=Rn(me,"utf-8");try{return JSON.parse(t)}catch(e){throw e instanceof Error?
|
|
191
|
-
`)}function Of(t,e){let r={...t};r.hooks||(r.hooks={});for(let[n,s]of Object.entries(e)){let o=r.hooks[n]??[];for(let i of s){let a=o.findIndex(l=>l.hooks.some(c=>c.name===Ir));if(a>=0){let l=o[a],c=l.hooks.findIndex(
|
|
190
|
+
`),0}}var Fl,Yl=S(()=>{"use strict";V();yn();J();Nl();wr();Fl=q.join(M,"cursor-projects.json")});var go={};he(go,{checkGeminiCliHooksStatus:()=>$l,handleGeminiCliCommand:()=>Nf,installGeminiCliHooks:()=>Zl,uninstallGeminiCliHooks:()=>Ql});import po from"path";import{homedir as Cf}from"os";import{existsSync as Ht,readFileSync as Rn,writeFileSync as mo,mkdirSync as ql}from"fs";function wf(t,e,r){let n=Jt[r];if(!n)throw new Error(`Unknown Gemini CLI event: ${r}`);let s=t.replace(/\\/g,"\\\\"),o=e.replace(/\\/g,"\\\\");return`"${s}" "${o}" hook gemini-cli ${n}`}function If(t){return{matcher:"*",hooks:[{name:Ir,type:"command",command:t,timeout:Rf}]}}function fo(){if(!Ht(me))return{};let t=Rn(me,"utf-8");try{return JSON.parse(t)}catch(e){throw e instanceof Error?u.error("WORKER","Corrupt JSON in Gemini settings",{path:me},e):u.error("WORKER","Corrupt JSON in Gemini settings",{path:me},new Error(String(e))),new Error(`Corrupt JSON in ${me}, refusing to overwrite user settings`)}}function zl(t){ql(wn,{recursive:!0}),mo(me,JSON.stringify(t,null,2)+`
|
|
191
|
+
`)}function Of(t,e){let r={...t};r.hooks||(r.hooks={});for(let[n,s]of Object.entries(e)){let o=r.hooks[n]??[];for(let i of s){let a=o.findIndex(l=>l.hooks.some(c=>c.name===Ir));if(a>=0){let l=o[a],c=l.hooks.findIndex(d=>d.name===Ir);c>=0?l.hooks[c]=i.hooks[0]:l.hooks.push(i.hooks[0])}else o.push(i)}r.hooks[n]=o}return r}function kf(){let t="<claude-mem-context>",r=`${t}
|
|
192
192
|
# Memory Context from Past Sessions
|
|
193
193
|
|
|
194
194
|
*No context yet. Complete your first session and context will appear here.*
|
|
@@ -223,7 +223,7 @@ Uninstallation complete!
|
|
|
223
223
|
Claude-Mem Gemini CLI Hooks Status
|
|
224
224
|
`),!Ht(me))return console.log("Gemini CLI settings: Not found"),console.log(` Expected at: ${me}
|
|
225
225
|
`),console.log(`No hooks installed. Run: claude-mem install --ide gemini-cli
|
|
226
|
-
`),0;let t;try{t=fo()}catch(r){let n=r instanceof Error?r.message:String(r);return r instanceof Error?
|
|
226
|
+
`),0;let t;try{t=fo()}catch(r){let n=r instanceof Error?r.message:String(r);return r instanceof Error?u.error("WORKER","Failed to read Gemini CLI settings",{path:me},r):u.error("WORKER","Failed to read Gemini CLI settings",{path:me},new Error(String(r))),console.log(`Gemini CLI settings: ${n}
|
|
227
227
|
`),0}if(!t.hooks)return console.log(`Gemini CLI settings: Found, but no hooks configured
|
|
228
228
|
`),console.log(`No hooks installed. Run: claude-mem install --ide gemini-cli
|
|
229
229
|
`),0;let e=[];for(let[r,n]of Object.entries(t.hooks))n.some(o=>o.hooks.some(i=>i.name===Ir))&&e.push(r);if(e.length===0)return console.log(`Gemini CLI settings: Found, but no claude-mem hooks
|
|
@@ -254,8 +254,8 @@ ${Kt}`;if(xf(t)){let o=Lf(t,"utf-8"),i=o.indexOf(Or),a=o.indexOf(Kt);i!==-1&&a!=
|
|
|
254
254
|
${s}
|
|
255
255
|
`,"utf-8"):Eo(t,s+`
|
|
256
256
|
`,"utf-8")}var Or,Kt,So=S(()=>{"use strict";no();Or="<claude-mem-context>",Kt="</claude-mem-context>"});var Co={};he(Co,{addOpenCodePluginReference:()=>nc,checkOpenCodeStatus:()=>Bf,deregisterOpenCodePluginFromConfig:()=>ic,findBuiltPluginPath:()=>ac,getInstalledPluginPath:()=>Ar,getOpenCodeAgentsMdPath:()=>_r,getOpenCodeConfigDirectory:()=>kr,getOpenCodeConfigPath:()=>vo,getOpenCodePluginsDirectory:()=>To,injectContextIntoAgentsMd:()=>cc,installOpenCodeIntegration:()=>Hf,installOpenCodePlugin:()=>lc,registerOpenCodePluginInConfig:()=>oc,removeOpenCodePluginReference:()=>sc,uninstallOpenCodePlugin:()=>Gf});import qe from"path";import{homedir as ec}from"os";import{fileURLToPath as Pf}from"url";import{existsSync as mt,readFileSync as On,writeFileSync as yo,mkdirSync as Uf,copyFileSync as Ff,unlinkSync as tc}from"fs";function kr(){return process.env.OPENCODE_CONFIG_DIR?process.env.OPENCODE_CONFIG_DIR:qe.join(ec(),".config","opencode")}function To(){return qe.join(kr(),"plugins")}function vo(){return qe.join(kr(),"opencode.json")}function _r(){return qe.join(kr(),"AGENTS.md")}function Ar(){return qe.join(To(),"claude-mem.js")}function rc(t){return Array.isArray(t.plugin)?t.plugin:t.plugin===void 0?[]:[t.plugin]}function nc(t){let e=rc(t);return e.includes(bo)?t:{...t,plugin:[...e,bo]}}function sc(t){return{...t,plugin:rc(t).filter(e=>e!==bo)}}function oc(){let t=vo(),e={$schema:"https://opencode.ai/config.json"};try{let r=mt(t)?JSON.parse(On(t,"utf-8")):e,n=nc(r);return yo(t,`${JSON.stringify(n,null,2)}
|
|
257
|
-
`,"utf-8"),console.log(` Plugin registered in: ${t}`),
|
|
258
|
-
`,"utf-8"),console.log(` Plugin deregistered from: ${t}`),
|
|
257
|
+
`,"utf-8"),console.log(` Plugin registered in: ${t}`),u.info("OPENCODE","Plugin registered in config",{path:t}),0}catch(r){let n=r instanceof Error?r.message:String(r);return console.error(`Failed to register OpenCode plugin in config: ${n}`),1}}function ic(){let t=vo();if(!mt(t))return 0;try{let e=JSON.parse(On(t,"utf-8")),r=sc(e);return yo(t,`${JSON.stringify(r,null,2)}
|
|
258
|
+
`,"utf-8"),console.log(` Plugin deregistered from: ${t}`),u.info("OPENCODE","Plugin deregistered from config",{path:t}),0}catch(e){let r=e instanceof Error?e.message:String(e);return console.error(`Failed to deregister OpenCode plugin from config: ${r}`),1}}function ac(){let t=[qe.join(process.env.CLAUDE_CONFIG_DIR||qe.join(ec(),".claude"),"plugins","marketplaces","keepmind","dist","opencode-plugin","index.js"),qe.join(qe.dirname(Pf(import.meta.url)),"..","..","..","dist","opencode-plugin","index.js")];for(let e of t)if(mt(e))return e;return null}function lc(){let t=ac();if(!t)return console.error("Could not find built OpenCode plugin bundle."),console.error(" Expected at: dist/opencode-plugin/index.js"),console.error(" Run the build first: npm run build"),1;let e=To(),r=Ar();try{Uf(e,{recursive:!0}),Ff(t,r),console.log(` Plugin installed to: ${r}`),u.info("OPENCODE","Plugin installed",{destination:r});let n=oc();return n!==0?n:0}catch(n){let s=n instanceof Error?n.message:String(n);return console.error(`Failed to install OpenCode plugin: ${s}`),1}}function cc(t){let e=_r();try{return In(e,t,"# Claude-Mem Memory Context"),u.info("OPENCODE","Context injected into AGENTS.md",{path:e}),0}catch(r){let n=r instanceof Error?r.message:String(r);return console.error(`Failed to inject context into AGENTS.md: ${n}`),1}}async function Wf(){let t=Cr();if(!(await fetch(`http://127.0.0.1:${t}/api/readiness`)).ok)return null;let r=await fetch(`http://127.0.0.1:${t}/api/context/inject?project=opencode`);if(!r.ok)return null;let n=await r.text();return n&&n.trim()?n:null}function jf(t,e){e.length===0||e==="# Claude-Mem Memory Context"?(tc(t),console.log(" Removed empty AGENTS.md")):(yo(t,e+`
|
|
259
259
|
`,"utf-8"),console.log(" Cleaned context from AGENTS.md"))}function Gf(){let t=!1,e=Ar();if(mt(e))try{tc(e),console.log(` Removed plugin: ${e}`)}catch(n){let s=n instanceof Error?n.message:String(n);console.error(` Failed to remove plugin: ${s}`),t=!0}ic()!==0&&(t=!0);let r=_r();if(mt(r)){let n;try{n=On(r,"utf-8")}catch(i){let a=i instanceof Error?i.message:String(i);console.error(` Failed to read AGENTS.md: ${a}`),t=!0,n=""}let s=n.indexOf(Or),o=n.indexOf(Kt);if(s!==-1&&o!==-1){n=n.slice(0,s).trimEnd()+`
|
|
260
260
|
`+n.slice(o+Kt.length).trimStart();let i=n.trim();try{jf(r,i)}catch(a){let l=a instanceof Error?a.message:String(a);console.error(` Failed to clean AGENTS.md: ${l}`),t=!0}}}return t?1:0}function Bf(){console.log(`
|
|
261
261
|
Claude-Mem OpenCode Integration Status
|
|
@@ -265,7 +265,7 @@ Installing Claude-Mem for OpenCode...
|
|
|
265
265
|
|
|
266
266
|
*No context yet. Complete your first session and context will appear here.*
|
|
267
267
|
|
|
268
|
-
Use claude-mem search tools for manual memory queries.`,n="placeholder";try{let o=await Wf();o&&(r=o,n="existing memory")}catch(o){o instanceof Error?
|
|
268
|
+
Use claude-mem search tools for manual memory queries.`,n="placeholder";try{let o=await Wf();o&&(r=o,n="existing memory")}catch(o){o instanceof Error?u.debug("WORKER","Worker not available during OpenCode install",{},o):u.debug("WORKER","Worker not available during OpenCode install",{},new Error(String(o)))}return cc(r)!==0?u.warn("OPENCODE",`Failed to inject ${n} context into AGENTS.md during install`):console.log(n==="existing memory"?" Context injected from existing memory":" Placeholder context created (worker not running)"),console.log(`
|
|
269
269
|
Installation complete!
|
|
270
270
|
|
|
271
271
|
Plugin installed to: ${Ar()}
|
|
@@ -275,7 +275,7 @@ Next steps:
|
|
|
275
275
|
1. Start keepmind worker: npx keepmind start
|
|
276
276
|
2. Restart OpenCode to load the plugin
|
|
277
277
|
3. Memory capture is automatic from then on
|
|
278
|
-
`),0}var bo,Ro=S(()=>{"use strict";V();So();yn();bo="./plugins/claude-mem.js"});var Oo={};he(Oo,{checkWindsurfHooksStatus:()=>tg,installWindsurfHooks:()=>Yf,readWindsurfRegistry:()=>wo,registerWindsurfProject:()=>mc,uninstallWindsurfHooks:()=>Qf,unregisterWindsurfProject:()=>fc,writeWindsurfContextFile:()=>gc,writeWindsurfRegistry:()=>Io});import ke from"path";import{homedir as Jf}from"os";import{existsSync as Xt,readFileSync as _n,writeFileSync as Nr,unlinkSync as dc,mkdirSync as An,renameSync as Kf}from"fs";function wo(){try{return Xt(Vt)?JSON.parse(_n(Vt,"utf-8")):{}}catch(t){return t instanceof Error?
|
|
278
|
+
`),0}var bo,Ro=S(()=>{"use strict";V();So();yn();bo="./plugins/claude-mem.js"});var Oo={};he(Oo,{checkWindsurfHooksStatus:()=>tg,installWindsurfHooks:()=>Yf,readWindsurfRegistry:()=>wo,registerWindsurfProject:()=>mc,uninstallWindsurfHooks:()=>Qf,unregisterWindsurfProject:()=>fc,writeWindsurfContextFile:()=>gc,writeWindsurfRegistry:()=>Io});import ke from"path";import{homedir as Jf}from"os";import{existsSync as Xt,readFileSync as _n,writeFileSync as Nr,unlinkSync as dc,mkdirSync as An,renameSync as Kf}from"fs";function wo(){try{return Xt(Vt)?JSON.parse(_n(Vt,"utf-8")):{}}catch(t){return t instanceof Error?u.error("WORKER","Failed to read registry, using empty",{file:Vt},t):u.error("WORKER","Failed to read registry, using empty",{file:Vt},new Error(String(t))),{}}}function Io(t){let e=ke.dirname(Vt);An(e,{recursive:!0}),Nr(Vt,JSON.stringify(t,null,2))}function mc(t){let e=wo();e[t]={installedAt:new Date().toISOString()},Io(e),u.info("WINDSURF","Registered project for auto-context updates",{workspacePath:t})}function fc(t){let e=wo();e[t]&&(delete e[t],Io(e),u.info("WINDSURF","Unregistered project",{workspacePath:t}))}function gc(t,e){let r=ke.join(t,".windsurf","rules"),n=ke.join(r,"claude-mem-context.md"),s=`${n}.tmp`;An(r,{recursive:!0});let o=`# Memory Context from Past Sessions
|
|
279
279
|
|
|
280
280
|
The following context is from claude-mem, a persistent memory system that tracks your coding sessions.
|
|
281
281
|
|
|
@@ -286,7 +286,7 @@ ${e}
|
|
|
286
286
|
`;o.length>uc&&(o=o.slice(0,uc-50)+`
|
|
287
287
|
|
|
288
288
|
*[Truncated \u2014 use MCP search for full history]*
|
|
289
|
-
`),Nr(s,o),Kf(s,n)}function Vf(t,e,r){let s={pre_user_prompt:"session-init",post_write_code:"file-edit",post_run_command:"observation",post_mcp_tool_use:"observation",post_cascade_response:"observation"}[r]??"observation";return`"${t}" "${e}" hook windsurf ${s}`}function Xf(t,e,r){An(pc,{recursive:!0});let n={hooks:{}};if(Xt(ae))try{n=JSON.parse(_n(ae,"utf-8")),n.hooks||(n.hooks={})}catch(s){throw s instanceof Error?
|
|
289
|
+
`),Nr(s,o),Kf(s,n)}function Vf(t,e,r){let s={pre_user_prompt:"session-init",post_write_code:"file-edit",post_run_command:"observation",post_mcp_tool_use:"observation",post_cascade_response:"observation"}[r]??"observation";return`"${t}" "${e}" hook windsurf ${s}`}function Xf(t,e,r){An(pc,{recursive:!0});let n={hooks:{}};if(Xt(ae))try{n=JSON.parse(_n(ae,"utf-8")),n.hooks||(n.hooks={})}catch(s){throw s instanceof Error?u.error("WORKER","Corrupt hooks.json, refusing to overwrite",{path:ae},s):u.error("WORKER","Corrupt hooks.json, refusing to overwrite",{path:ae},new Error(String(s))),new Error(`Corrupt hooks.json at ${ae}, refusing to overwrite`)}for(let s of kn){let i={command:Vf(t,e,s),show_output:!1,working_directory:r},a=(n.hooks[s]??[]).filter(l=>!l.command.includes("worker-service")||!l.command.includes("windsurf"));n.hooks[s]=[...a,i]}Nr(ae,JSON.stringify(n,null,2))}async function Yf(){console.log(`
|
|
290
290
|
Installing Claude-Mem Windsurf hooks (user level)...
|
|
291
291
|
`);let t=Gt();if(!t)return console.error("Could not find worker-service.cjs"),console.error(" Expected at: ~/.claude/plugins/marketplaces/keepmind/plugin/scripts/worker-service.cjs"),1;let e=Bt();if(!e)return console.error("Could not find Bun runtime"),console.error(" Install Bun: curl -fsSL https://bun.sh/install | bash"),1;let r=ke.dirname(t);console.log(` Using Bun runtime: ${e}`),console.log(` Worker service: ${t}`);let n=process.cwd();try{return await qf(e,t,r,n),0}catch(s){let o=s instanceof Error?s.message:String(s);return console.error(`
|
|
292
292
|
Installation failed: ${o}`),1}}async function qf(t,e,r,n){Xf(t,e,r),console.log(" Created/merged hooks.json"),await zf(n),console.log(`
|
|
@@ -306,26 +306,26 @@ Next steps:
|
|
|
306
306
|
1. Start keepmind worker: keepmind start
|
|
307
307
|
2. Restart Windsurf to load the hooks
|
|
308
308
|
3. Context is injected via .windsurf/rules/claude-mem-context.md (workspace-level)
|
|
309
|
-
`)}async function zf(t){let e=Cr(),r=ke.basename(t),n=!1;console.log(" Generating initial context...");try{n=await Zf(e,r,t)}catch(s){s instanceof Error?
|
|
309
|
+
`)}async function zf(t){let e=Cr(),r=ke.basename(t),n=!1;console.log(" Generating initial context...");try{n=await Zf(e,r,t)}catch(s){s instanceof Error?u.debug("WORKER","Worker not running during install",{},s):u.debug("WORKER","Worker not running during install",{},new Error(String(s)))}if(!n){let s=ke.join(t,".windsurf","rules");An(s,{recursive:!0});let o=ke.join(s,"claude-mem-context.md");Nr(o,`# Memory Context from Past Sessions
|
|
310
310
|
|
|
311
311
|
*No context yet. Complete your first session and context will appear here.*
|
|
312
312
|
|
|
313
313
|
Use claude-mem's MCP search tools for manual memory queries.
|
|
314
314
|
`),console.log(" Created placeholder context file (will populate after first session)")}mc(t),console.log(" Registered for auto-context updates")}async function Zf(t,e,r){if(!(await fetch(`http://127.0.0.1:${t}/api/readiness`)).ok)return!1;let s=await fetch(`http://127.0.0.1:${t}/api/context/inject?project=${encodeURIComponent(e)}`);if(!s.ok)return!1;let o=await s.text();return o&&o.trim()?(gc(r,o),console.log(" Generated initial context from existing memory"),!0):!1}function Qf(){if(console.log(`
|
|
315
315
|
Uninstalling Claude-Mem Windsurf hooks...
|
|
316
|
-
`),Xt(ae))try{$f()}catch(e){e instanceof Error?
|
|
316
|
+
`),Xt(ae))try{$f()}catch(e){e instanceof Error?u.error("WORKER","Could not parse hooks.json during uninstall",{path:ae},e):u.error("WORKER","Could not parse hooks.json during uninstall",{path:ae},new Error(String(e))),console.log(" Warning: could not parse hooks.json \u2014 leaving file intact to preserve other hooks")}else console.log(" No hooks.json found");let t=process.cwd();try{return eg(t),0}catch(e){let r=e instanceof Error?e.message:String(e);return console.error(`
|
|
317
317
|
Uninstallation failed: ${r}`),1}}function $f(){let e={hooks:JSON.parse(_n(ae,"utf-8")).hooks??{}};for(let r of kn){let n=e.hooks[r]??[];n.length>0&&(e.hooks[r]=n.filter(s=>!s.command.includes("worker-service")||!s.command.includes("windsurf")),e.hooks[r].length===0&&delete e.hooks[r])}Object.keys(e.hooks).length===0?(dc(ae),console.log(" Removed hooks.json (no hooks remaining)")):(Nr(ae,JSON.stringify(e,null,2)),console.log(" Removed claude-mem entries from hooks.json (other hooks preserved)"))}function eg(t){let e=ke.join(t,".windsurf","rules","claude-mem-context.md");Xt(e)&&(dc(e),console.log(" Removed context file")),fc(t),console.log(" Unregistered from auto-context updates"),console.log(`
|
|
318
318
|
Uninstallation complete!
|
|
319
319
|
`),console.log("Restart Windsurf to apply changes.")}function tg(){if(console.log(`
|
|
320
320
|
Claude-Mem Windsurf Hooks Status
|
|
321
|
-
`),Xt(ae)){console.log("User-level: Installed"),console.log(` Config: ${ae}`);let t=null;try{t=JSON.parse(_n(ae,"utf-8"))}catch(r){let n=r instanceof Error?r:new Error(String(r));
|
|
321
|
+
`),Xt(ae)){console.log("User-level: Installed"),console.log(` Config: ${ae}`);let t=null;try{t=JSON.parse(_n(ae,"utf-8"))}catch(r){let n=r instanceof Error?r:new Error(String(r));u.error("WORKER","Unable to parse hooks.json",{path:ae},n),console.log(" Mode: Unable to parse hooks.json")}if(t){let r=kn.filter(n=>(t?.hooks?.[n]??[]).some(s=>s.command.includes("worker-service")&&s.command.includes("windsurf")));console.log(` Events: ${r.length}/${kn.length} registered`);for(let n of r)console.log(` - ${n}`)}let e=ke.join(process.cwd(),".windsurf","rules","claude-mem-context.md");Xt(e)?console.log(" Context: Active (current workspace)"):console.log(" Context: Not yet generated for this workspace")}else console.log("User-level: Not installed"),console.log(`
|
|
322
322
|
No hooks installed. Run: claude-mem windsurf install
|
|
323
323
|
`);return console.log(""),0}var pc,ae,uc,Vt,kn,ko=S(()=>{"use strict";V();yn();J();wr();pc=ke.join(Jf(),".codeium","windsurf"),ae=ke.join(pc,"hooks.json"),uc=6e3,Vt=ke.join(M,"windsurf-projects.json"),kn=["pre_user_prompt","post_write_code","post_run_command","post_mcp_tool_use","post_cascade_response"]});var Fo={};he(Fo,{codexSpawn:()=>Po,installCodexCli:()=>_g,removeLegacyCodexMcpSearchConfig:()=>Cc,resolveCodexCommand:()=>yc,resolveCodexSpawnInvocation:()=>Tc,setTomlBooleanInTable:()=>Uo,setTomlFeatureEnabled:()=>vc,setTomlPluginEnabled:()=>Mo,uninstallCodexCli:()=>Ag});import ie from"path";import{homedir as Ao}from"os";import{execFileSync as No,spawnSync as rg}from"child_process";import{existsSync as qt,mkdirSync as ng,readFileSync as xo,writeFileSync as xn}from"fs";import{fileURLToPath as sg}from"url";function Ec(t){try{return process.platform==="win32"?No("where",[t],{stdio:"ignore"}):No("which",[t],{stdio:"ignore"}),!0}catch{return!1}}function cg(t){let e=ie.resolve(t);for(;;){if(qt(ie.join(e,".agents","plugins","marketplace.json")))return e;let r=ie.dirname(e);if(r===e)return null;e=r}}function Sc(t){return ig.filter(e=>!qt(ie.join(t,e)))}function ug(t){let e=ie.resolve(t),r=Sc(e);if(r.length>0)throw new Error(`Codex marketplace root ${e} is missing required files: ${r.join(", ")}`);return e}function dg(t){if(t)return ug(t);let e=[process.env.CLAUDE_PLUGIN_ROOT,process.env.PLUGIN_ROOT,process.cwd(),ie.dirname(sg(import.meta.url))].filter(r=>!!r);for(let r of e){let n=cg(r);if(n&&Sc(n).length===0)return n}throw new Error("Could not locate a Codex marketplace root with .agents/plugins/marketplace.json and plugin/.codex-plugin/plugin.json. Run npx keepmind@latest install from the package or repo root.")}function bc(){try{let e=No("where",["codex"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).split(/\r?\n/).map(r=>r.trim()).filter(Boolean);return e.find(r=>ag.has(ie.extname(r).toLowerCase()))??e[0]??null}catch{return null}}function pg(t){return`"${t.replace(/"/g,'""')}"`}function yc(t=process.platform,e=bc){return t!=="win32"?"codex":e()??"codex.cmd"}function Tc(t,e=process.platform,r=bc){let n=yc(e,r),s={encoding:"utf-8",stdio:["ignore","pipe","pipe"],...e==="win32"?{windowsHide:!0}:{}};return e==="win32"&&lg.has(ie.extname(n).toLowerCase())?{command:"cmd.exe",args:["/d","/s","/c",[n,...t].map(pg).join(" ")],options:s}:{command:n,args:t,options:s}}function Po(t){let e=Tc(t);return rg(e.command,e.args,e.options)}function Mr(t){let e=Po(t),r=console,n=e.stdout?.trimEnd(),s=e.stderr?.trimEnd();if(n&&r.log(n),s&&r.error(s),e.error)throw e.error;if(e.status!==0){let o=e.status??"unknown";throw new Error(`codex ${t.join(" ")} failed with exit code ${o}${s?`: ${s}`:""}`)}}function mg(t,e,r){try{return Mr(t),console.log(` ${e}`),!0}catch(n){let s=n instanceof Error?n.message:String(n);return console.warn(` ${r}: ${s}`),!1}}function fg(t){let e=t instanceof Error?t.message:String(t);return e.includes(`marketplace '${gt}' is already added from a different source`)||e.includes(`marketplace \`${gt}\` is already added from a different source`)}function gg(t){try{Mr(["plugin","marketplace","add",t]);return}catch(e){if(!fg(e))throw e}console.warn(` Codex marketplace ${gt} is already registered from another source; replacing it with ${t}.`),Mr(["plugin","marketplace","remove",gt]),Mr(["plugin","marketplace","add",t])}function Uo(t,e,r,n){let s=`${r} = ${n?"true":"false"}`,o=t.split(`
|
|
324
324
|
`),i=o.findIndex(m=>m.trim()===e);if(i===-1){let m=t.trimEnd();return`${m}${m?`
|
|
325
325
|
|
|
326
326
|
`:""}${e}
|
|
327
327
|
${s}
|
|
328
|
-
`}let a=i+1;for(;a<o.length&&!/^\s*\[/.test(o[a]);)a+=1;let l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`^\\s*${l}\\s*=`),
|
|
328
|
+
`}let a=i+1;for(;a<o.length&&!/^\s*\[/.test(o[a]);)a+=1;let l=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`^\\s*${l}\\s*=`),d=o.findIndex((m,f)=>f>i&&f<a&&c.test(m));return d===-1?o.splice(i+1,0,s):o[d]=s,o.join(`
|
|
329
329
|
`)}function Mo(t,e,r){let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return Uo(t,`[plugins."${n}"]`,"enabled",r)}function vc(t,e,r){return Uo(t,"[features]",e,r)}function hg(t){let e=t.trim().match(/^\[([^\]]+)\]\s*$/);return e?e[1].replace(/\s+/g,"").replace(/"/g,""):null}function hc(t){return t==="mcp_servers.mcp-search"}function Eg(t){return typeof t=="string"&&t.startsWith("mcp_servers.mcp-search.")}function Sg(t){return/claude-mem/.test(t)}function Cc(t){let e=t.split(`
|
|
330
330
|
`),r=[],n=null,s=[];for(let a of e){let l=hg(a);l!==null?(r.push({header:n,text:s.join(`
|
|
331
331
|
`)}),n=l,s=[a]):s.push(a)}return r.push({header:n,text:s.join(`
|
|
@@ -334,11 +334,11 @@ ${s}
|
|
|
334
334
|
|
|
335
335
|
`):t}function Rc(t){if(!t&&!qt(Nn))return!1;ng(Lo,{recursive:!0});let e=qt(Nn)?xo(Nn,"utf-8"):"",r=e;t&&(r=vc(r,"hooks",!0),r=Cc(r));for(let n of og)r=Mo(r,n,!1);return r=Mo(r,Do,t),r===e?!1:(xn(Nn,r),!0)}function bg(){let t=Rc(!0);console.log(` Enabled Codex plugin: ${Do}${t?"":" (already enabled)"}`)}function yg(){let t=Rc(!1);console.log(` Disabled Codex plugin: ${Do}${t?"":" (already disabled)"}`)}function Tg(t){return t.match(/\d+\.\d+\.\d+/)?.[0]??null}function vg(){let t=Po(["--version"]),e=`${t.stdout??""}
|
|
336
336
|
${t.stderr??""}`.trim();if(t.error)throw t.error;if(t.status!==0){console.warn(` Could not determine Codex CLI version. Continuing; plugin marketplace support requires ${Mn} or newer.${e?`
|
|
337
|
-
${e}`:""}`);return}let r=Tg(e);if(!r){console.warn(` Could not parse Codex CLI version from "${e||"<empty>"}". Continuing; plugin marketplace support requires ${Mn} or newer.`);return}if(r.localeCompare(Mn,void 0,{numeric:!0})<0)throw new Error(`Codex CLI ${r} is too old for plugin marketplace support. Update Codex CLI to ${Mn} or newer, then run: npx keepmind@latest install`)}function Cg(){if(!qt(ft))return!0;let t="<claude-mem-context>",e="</claude-mem-context>";try{return Rg(t,e),!0}catch(r){let n=r instanceof Error?r.message:String(r);return
|
|
337
|
+
${e}`:""}`);return}let r=Tg(e);if(!r){console.warn(` Could not parse Codex CLI version from "${e||"<empty>"}". Continuing; plugin marketplace support requires ${Mn} or newer.`);return}if(r.localeCompare(Mn,void 0,{numeric:!0})<0)throw new Error(`Codex CLI ${r} is too old for plugin marketplace support. Update Codex CLI to ${Mn} or newer, then run: npx keepmind@latest install`)}function Cg(){if(!qt(ft))return!0;let t="<claude-mem-context>",e="</claude-mem-context>";try{return Rg(t,e),!0}catch(r){let n=r instanceof Error?r.message:String(r);return u.warn("WORKER","Failed to clean AGENTS.md context",{error:n}),!1}}function Rg(t,e){let r=xo(ft,"utf-8"),n=r.indexOf(t),s=r.indexOf(e);if(n===-1||s===-1)return;let o=r.substring(0,n).replace(/\n+$/,""),i=r.substring(s+e.length).replace(/^\n+/,""),a=(o+(i?`
|
|
338
338
|
|
|
339
339
|
`+i:"")).trim();a?xn(ft,a+`
|
|
340
340
|
`):xn(ft,""),console.log(` Removed legacy global context from ${ft}`)}function _o(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function wg(t){return t.name==="codex"||t.schema==="codex"}function Ig(t){return t==="~"?Ao():t.startsWith("~/")||t.startsWith("~\\")?ie.join(Ao(),t.slice(2)):t}function Og(t){if(t.mode!=="agents")return!1;let e=t.updateOn;return Array.isArray(e)&&e.length===2&&e.includes("session_start")&&e.includes("session_end")?t.path===void 0?!0:typeof t.path=="string"&&ie.resolve(Ig(t.path))===ft:!1}function kg(){if(!qt(Yt))return!0;try{let t=JSON.parse(xo(Yt,"utf-8"));if(!_o(t)||!Array.isArray(t.watches))return!0;let e=!1;for(let r of t.watches)!_o(r)||!wg(r)||!_o(r.context)||!Og(r.context)||(delete r.context,e=!0);return e&&(xn(Yt,`${JSON.stringify(t,null,2)}
|
|
341
|
-
`),console.log(` Disabled legacy Codex transcript AGENTS.md context in ${Yt}`)),!0}catch(t){let e=t instanceof Error?t.message:String(t);return
|
|
341
|
+
`),console.log(` Disabled legacy Codex transcript AGENTS.md context in ${Yt}`)),!0}catch(t){let e=t instanceof Error?t.message:String(t);return u.warn("WORKER","Failed to disable Codex transcript AGENTS.md context",{error:e}),!1}}async function _g(t){if(console.log(`
|
|
342
342
|
Installing Claude-Mem for Codex CLI (native hooks)...
|
|
343
343
|
`),!Ec("codex"))return console.error("Codex CLI was not found on PATH."),console.error("Install Codex, then run: npx keepmind@latest install"),1;try{vg();let e=dg(t);return console.log(` Registering Codex plugin marketplace: ${e}`),gg(e),bg(),mg(["plugin","marketplace","upgrade",gt],"Refreshed Codex marketplace and installed plugin cache.","Could not refresh Codex marketplace cache; reinstall or upgrade claude-mem from /plugins if Codex still uses old MCP config"),wc()||console.warn(` Native Codex hooks registered, but failed to remove legacy AGENTS.md context from ${ft}.`),Ic()||console.warn(` Native Codex hooks registered, but failed to disable legacy transcript AGENTS.md context in ${Yt}.`),console.log(`
|
|
344
344
|
Installation complete!
|
|
@@ -395,7 +395,7 @@ Next steps:
|
|
|
395
395
|
|
|
396
396
|
*No context yet. Complete your first session and context will appear here.*
|
|
397
397
|
|
|
398
|
-
Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot-cli",ideLabel:"Copilot CLI",configPath:_e.join(Pn(),".github","copilot","mcp.json"),configKey:"servers",contextFile:{path:_e.join(process.cwd(),".github","copilot-instructions.md"),isWorkspaceRelative:!0}},Ug={ideId:"antigravity",ideLabel:"Antigravity",configPath:_e.join(Pn(),".gemini","antigravity","mcp_config.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),".agents","rules","claude-mem-context.md"),isWorkspaceRelative:!0}},Fg={ideId:"roo-code",ideLabel:"Roo Code",configPath:_e.join(process.cwd(),".roo","mcp.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),".roo","rules","claude-mem-context.md"),isWorkspaceRelative:!0}},Wg={ideId:"warp",ideLabel:"Warp",configPath:_e.join(Pn(),".warp","mcp.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),"WARP.md"),isWorkspaceRelative:!0}};Hg={"copilot-cli":Ln(Pg),antigravity:Ln(Ug),goose:_c,"roo-code":Ln(Fg),warp:Ln(Wg)}});import{DatabaseSync as Jg}from"node:sqlite";function Mc(t){return typeof t=="bigint"?Number(t):t}function Kg(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)&&!(t instanceof Uint8Array)&&!(typeof Buffer<"u"&&Buffer.isBuffer(t))}function xc(t){return t===void 0?null:typeof t=="boolean"?t?1:0:t}function Un(t){let e=t;if(e.length===1&&Array.isArray(e[0])&&(e=e[0]),e.length===1&&Kg(e[0])){let r=e[0],n={};for(let s of Object.keys(r))n[s]=xc(r[s]);return[n]}return e.map(xc)}var jo,be,Lr=S(()=>{"use strict";jo=class{constructor(e){this.stmt=e}stmt;all(...e){return this.stmt.all(...Un(e))}get(...e){return this.stmt.get(...Un(e))??null}run(...e){let r=this.stmt.run(...Un(e));return{changes:Mc(r.changes),lastInsertRowid:Mc(r.lastInsertRowid)}}values(...e){return this.stmt.all(...Un(e)).map(n=>Object.values(n))}finalize(){}},be=class{db;queryCache=new Map;safeIntegers;txDepth=0;filename;constructor(e,r={}){let n=r.readonly===!0;this.safeIntegers=r.safeIntegers===!0;let s=e&&e.length>0?e:":memory:";if(this.filename=s,this.db=new Jg(s,{readOnly:n,allowExtension:!0}),!n&&s!==":memory:")try{this.db.exec("PRAGMA journal_mode=WAL")}catch{}}wrap(e){return this.safeIntegers&&e.setReadBigInts(!0),new jo(e)}prepare(e){return this.wrap(this.db.prepare(e))}query(e){let r=this.queryCache.get(e);if(r)return r;let n=this.prepare(e);return this.queryCache.set(e,n),n}run(e,...r){return r.length===0?(this.db.exec(e),{changes:0,lastInsertRowid:0}):this.prepare(e).run(...r)}exec(e){this.db.exec(e)}loadExtension(e,r){this.db.loadExtension(e)}transaction(e){return(...r)=>{let n=this.txDepth===0,s=`__cm_sp_${this.txDepth}`;n?this.db.exec("BEGIN"):this.db.exec(`SAVEPOINT ${s}`),this.txDepth++;try{let o=e(...r);return this.txDepth--,n?this.db.exec("COMMIT"):this.db.exec(`RELEASE ${s}`),o}catch(o){throw this.txDepth--,n?this.db.exec("ROLLBACK"):(this.db.exec(`ROLLBACK TO ${s}`),this.db.exec(`RELEASE ${s}`)),o}}}close(){this.db.close()}}});import{createHash as Vg}from"crypto";function Go(t,e,r){return Vg("sha256").update([t||"",e||"",r||""].join("\0")).digest("hex").slice(0,16)}var Lc=S(()=>{"use strict"});function Bo(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[String(e)]}catch{return[t]}}var Dc=S(()=>{"use strict"});function Yg(t,e){if(e.re.lastIndex=0,e.group===void 0)return t.replace(e.re,Ho(e.type));let r=e.group;return t.replace(e.re,(n,...s)=>{let o=s[r-1];return typeof o!="string"||o.length===0?n:n.replace(o,Ho(e.type))})}function qg(t){if(t.length===0)return 0;let e=new Map;for(let n of t)e.set(n,(e.get(n)??0)+1);let r=0;for(let n of e.values()){let s=n/t.length;r-=s*Math.log2(s)}return r}function Zg(t,e){return t.length<20||t.length>200||/[\s]/.test(t)||!/\d/.test(t)||!/[A-Za-z]/.test(t)||t.includes("/")||t.includes("\\")||t.length<=64&&zg.test(t)||t.includes("redacted:")?!1:qg(t)>=e}function $g(t,e){let r=t.split(Qg);for(let n=0;n<r.length;n++){let s=r[n];s&&Zg(s,e)&&(r[n]=Ho("HIGH_ENTROPY"))}return r.join("")}function Jo(t,e={}){if(typeof t!="string"||t.length===0)return t;try{let r=t;for(let n of Xg)r=Yg(r,n);return e.entropySweep!==!1&&(r=$g(r,e.entropyThreshold??4)),r}catch{return t}}function Fn(t,e={}){if(typeof t=="string")return Jo(t,e);if(Array.isArray(t))return t.map(r=>Fn(r,e));if(t&&typeof t=="object"){let r={};for(let[n,s]of Object.entries(t))r[n]=Fn(s,e);return r}return t}var Ho,Xg,zg,Qg,Pc=S(()=>{"use strict";Ho=t=>`\xABredacted:${t}\xBB`,Xg=[{type:"PRIVATE_KEY",re:/-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,4000}?-----END[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----/g},{type:"CONNECTION_STRING",re:/\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|https?):\/\/[^\s/@]+:[^\s/@]+@[^\s]{1,200}/gi},{type:"AWS_KEY",re:/\b((?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16})\b/g},{type:"GITHUB_FINE_PAT",re:/\bgithub_pat_\w{82}\b/g},{type:"GITHUB_PAT",re:/\bghp_[0-9A-Za-z]{36}\b/g},{type:"GITLAB_PAT",re:/\bglpat-[\w-]{20}\b/g},{type:"SLACK_TOKEN",re:/\bxox[baprs]-[0-9A-Za-z-]{10,200}\b/g},{type:"GOOGLE_API_KEY",re:/\bAIza[\w-]{35}\b/g},{type:"STRIPE_KEY",re:/\b(?:sk|rk|pk)_(?:test|live|prod)_[A-Za-z0-9]{10,99}\b/g},{type:"JWT",re:/\bey[A-Za-z0-9_-]{17,500}\.ey[A-Za-z0-9_/\\-]{17,500}\.[A-Za-z0-9_/\\-]{10,500}={0,2}/g},{type:"BEARER",re:/\b[Bb]earer\s+[A-Za-z0-9._~+/=-]{12,500}/g},{type:"BCRYPT",re:/\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}/g},{type:"GENERIC_SECRET",re:/(?:pass(?:word)?|secret|token|api[_-]?key|client[_-]?secret|auth)\b['"\s]{0,3}[:=>]{1,2}['"\s]{0,3}([\w./+=-]{10,150})/gi,group:1}];zg=/^[0-9a-f]+$/i;Qg=/([\s"'`,;(){}\[\]<>]+)/});import{readFileSync as eh,existsSync as th}from"fs";function Wn(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ht(t,e){if(!Wn(e))return{...t};let r={...t};for(let n of Object.keys(t))e[n]!==void 0&&typeof e[n]==typeof t[n]&&(r[n]=e[n]);return r}function Uc(t=!1){if(Ko&&!t)return Ko;let e=Vo,r;try{let o=P.settings();if(th(o)){let i=JSON.parse(eh(o,"utf-8").replace(/^/,"")),a=Wn(i)?i.memoryQuality??(Wn(i.env)?i.env.memoryQuality:void 0):void 0;Wn(a)&&(r=a)}}catch(o){
|
|
398
|
+
Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot-cli",ideLabel:"Copilot CLI",configPath:_e.join(Pn(),".github","copilot","mcp.json"),configKey:"servers",contextFile:{path:_e.join(process.cwd(),".github","copilot-instructions.md"),isWorkspaceRelative:!0}},Ug={ideId:"antigravity",ideLabel:"Antigravity",configPath:_e.join(Pn(),".gemini","antigravity","mcp_config.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),".agents","rules","claude-mem-context.md"),isWorkspaceRelative:!0}},Fg={ideId:"roo-code",ideLabel:"Roo Code",configPath:_e.join(process.cwd(),".roo","mcp.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),".roo","rules","claude-mem-context.md"),isWorkspaceRelative:!0}},Wg={ideId:"warp",ideLabel:"Warp",configPath:_e.join(Pn(),".warp","mcp.json"),configKey:"mcpServers",contextFile:{path:_e.join(process.cwd(),"WARP.md"),isWorkspaceRelative:!0}};Hg={"copilot-cli":Ln(Pg),antigravity:Ln(Ug),goose:_c,"roo-code":Ln(Fg),warp:Ln(Wg)}});import{DatabaseSync as Jg}from"node:sqlite";function Mc(t){return typeof t=="bigint"?Number(t):t}function Kg(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)&&!(t instanceof Uint8Array)&&!(typeof Buffer<"u"&&Buffer.isBuffer(t))}function xc(t){return t===void 0?null:typeof t=="boolean"?t?1:0:t}function Un(t){let e=t;if(e.length===1&&Array.isArray(e[0])&&(e=e[0]),e.length===1&&Kg(e[0])){let r=e[0],n={};for(let s of Object.keys(r))n[s]=xc(r[s]);return[n]}return e.map(xc)}var jo,be,Lr=S(()=>{"use strict";jo=class{constructor(e){this.stmt=e}stmt;all(...e){return this.stmt.all(...Un(e))}get(...e){return this.stmt.get(...Un(e))??null}run(...e){let r=this.stmt.run(...Un(e));return{changes:Mc(r.changes),lastInsertRowid:Mc(r.lastInsertRowid)}}values(...e){return this.stmt.all(...Un(e)).map(n=>Object.values(n))}finalize(){}},be=class{db;queryCache=new Map;safeIntegers;txDepth=0;filename;constructor(e,r={}){let n=r.readonly===!0;this.safeIntegers=r.safeIntegers===!0;let s=e&&e.length>0?e:":memory:";if(this.filename=s,this.db=new Jg(s,{readOnly:n,allowExtension:!0}),!n&&s!==":memory:")try{this.db.exec("PRAGMA journal_mode=WAL")}catch{}}wrap(e){return this.safeIntegers&&e.setReadBigInts(!0),new jo(e)}prepare(e){return this.wrap(this.db.prepare(e))}query(e){let r=this.queryCache.get(e);if(r)return r;let n=this.prepare(e);return this.queryCache.set(e,n),n}run(e,...r){return r.length===0?(this.db.exec(e),{changes:0,lastInsertRowid:0}):this.prepare(e).run(...r)}exec(e){this.db.exec(e)}loadExtension(e,r){this.db.loadExtension(e)}transaction(e){return(...r)=>{let n=this.txDepth===0,s=`__cm_sp_${this.txDepth}`;n?this.db.exec("BEGIN"):this.db.exec(`SAVEPOINT ${s}`),this.txDepth++;try{let o=e(...r);return this.txDepth--,n?this.db.exec("COMMIT"):this.db.exec(`RELEASE ${s}`),o}catch(o){throw this.txDepth--,n?this.db.exec("ROLLBACK"):(this.db.exec(`ROLLBACK TO ${s}`),this.db.exec(`RELEASE ${s}`)),o}}}close(){this.db.close()}}});import{createHash as Vg}from"crypto";function Go(t,e,r){return Vg("sha256").update([t||"",e||"",r||""].join("\0")).digest("hex").slice(0,16)}var Lc=S(()=>{"use strict"});function Bo(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[String(e)]}catch{return[t]}}var Dc=S(()=>{"use strict"});function Yg(t,e){if(e.re.lastIndex=0,e.group===void 0)return t.replace(e.re,Ho(e.type));let r=e.group;return t.replace(e.re,(n,...s)=>{let o=s[r-1];return typeof o!="string"||o.length===0?n:n.replace(o,Ho(e.type))})}function qg(t){if(t.length===0)return 0;let e=new Map;for(let n of t)e.set(n,(e.get(n)??0)+1);let r=0;for(let n of e.values()){let s=n/t.length;r-=s*Math.log2(s)}return r}function Zg(t,e){return t.length<20||t.length>200||/[\s]/.test(t)||!/\d/.test(t)||!/[A-Za-z]/.test(t)||t.includes("/")||t.includes("\\")||t.length<=64&&zg.test(t)||t.includes("redacted:")?!1:qg(t)>=e}function $g(t,e){let r=t.split(Qg);for(let n=0;n<r.length;n++){let s=r[n];s&&Zg(s,e)&&(r[n]=Ho("HIGH_ENTROPY"))}return r.join("")}function Jo(t,e={}){if(typeof t!="string"||t.length===0)return t;try{let r=t;for(let n of Xg)r=Yg(r,n);return e.entropySweep!==!1&&(r=$g(r,e.entropyThreshold??4)),r}catch{return t}}function Fn(t,e={}){if(typeof t=="string")return Jo(t,e);if(Array.isArray(t))return t.map(r=>Fn(r,e));if(t&&typeof t=="object"){let r={};for(let[n,s]of Object.entries(t))r[n]=Fn(s,e);return r}return t}var Ho,Xg,zg,Qg,Pc=S(()=>{"use strict";Ho=t=>`\xABredacted:${t}\xBB`,Xg=[{type:"PRIVATE_KEY",re:/-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,4000}?-----END[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----/g},{type:"CONNECTION_STRING",re:/\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp|https?):\/\/[^\s/@]+:[^\s/@]+@[^\s]{1,200}/gi},{type:"AWS_KEY",re:/\b((?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16})\b/g},{type:"GITHUB_FINE_PAT",re:/\bgithub_pat_\w{82}\b/g},{type:"GITHUB_PAT",re:/\bghp_[0-9A-Za-z]{36}\b/g},{type:"GITLAB_PAT",re:/\bglpat-[\w-]{20}\b/g},{type:"SLACK_TOKEN",re:/\bxox[baprs]-[0-9A-Za-z-]{10,200}\b/g},{type:"GOOGLE_API_KEY",re:/\bAIza[\w-]{35}\b/g},{type:"STRIPE_KEY",re:/\b(?:sk|rk|pk)_(?:test|live|prod)_[A-Za-z0-9]{10,99}\b/g},{type:"JWT",re:/\bey[A-Za-z0-9_-]{17,500}\.ey[A-Za-z0-9_/\\-]{17,500}\.[A-Za-z0-9_/\\-]{10,500}={0,2}/g},{type:"BEARER",re:/\b[Bb]earer\s+[A-Za-z0-9._~+/=-]{12,500}/g},{type:"BCRYPT",re:/\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}/g},{type:"GENERIC_SECRET",re:/(?:pass(?:word)?|secret|token|api[_-]?key|client[_-]?secret|auth)\b['"\s]{0,3}[:=>]{1,2}['"\s]{0,3}([\w./+=-]{10,150})/gi,group:1}];zg=/^[0-9a-f]+$/i;Qg=/([\s"'`,;(){}\[\]<>]+)/});import{readFileSync as eh,existsSync as th}from"fs";function Wn(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ht(t,e){if(!Wn(e))return{...t};let r={...t};for(let n of Object.keys(t))e[n]!==void 0&&typeof e[n]==typeof t[n]&&(r[n]=e[n]);return r}function Uc(t=!1){if(Ko&&!t)return Ko;let e=Vo,r;try{let o=P.settings();if(th(o)){let i=JSON.parse(eh(o,"utf-8").replace(/^/,"")),a=Wn(i)?i.memoryQuality??(Wn(i.env)?i.env.memoryQuality:void 0):void 0;Wn(a)&&(r=a)}}catch(o){u.debug("CONFIG","memoryQuality config load failed; using defaults",{},o instanceof Error?o:new Error(String(o)))}let n={redactSecrets:ht(e.redactSecrets,r?.redactSecrets),scoping:ht(e.scoping,r?.scoping),importance:ht(e.importance,r?.importance),injection:ht(e.injection,r?.injection),reconcile:ht(e.reconcile,r?.reconcile),supersession:ht(e.supersession,r?.supersession),expiry:ht(e.expiry,r?.expiry),optimizer:ht(e.optimizer,r?.optimizer)},s=process.env.CLAUDE_MEM_REDACT_SECRETS;return(s==="0"||s==="false")&&(n.redactSecrets.enabled=!1),Ko=n,n}var Vo,Ko,Fc=S(()=>{"use strict";J();V();Vo={redactSecrets:{enabled:!0,entropyThreshold:4,entropySweep:!0},scoping:{enabled:!0,includeGlobal:!0,defaultSearchScope:"project"},importance:{enabled:!0,halfLifeDays:14,llmRefine:!1},injection:{tokenBudget:4e3,candidateMultiplier:3},reconcile:{enabled:!1,noopThreshold:.92,updateBand:.75,llmAdjudicate:!1,allowHardDelete:!1},supersession:{enabled:!1},expiry:{enabled:!1,ttlDays:28,importanceFloor:7,hardDelete:!1},optimizer:{enabled:!0,tickMinutes:5,vacuumHours:24}};Ko=null});function nh(t){if(Array.isArray(t))return t.length;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)?e.length:0}catch{return 0}return 0}function Xo(t){let e=rh[t.type??"other"]??4;return nh(t.files_modified)>0&&(e+=1),(t.narrative?.length??0)<40&&(e-=1),/\b(TODO|FIXME|WIP)\b/i.test(t.narrative??"")&&(e-=1),Math.max(1,Math.min(10,e))}var rh,Wc=S(()=>{"use strict";rh={decision:9,bugfix:8,refactor:6,discovery:5,global:7,other:3,trivial:1}});function jn(t){return t?t.toLowerCase().replace(/[^a-z0-9\s]+/g," ").split(/\s+/).filter(e=>e.length>0&&!sh.has(e)).join(" ").trim():""}function jc(t){let e=new Set,r=t.replace(/\s+/g," ");for(let n=0;n+3<=r.length;n++)e.add(r.slice(n,n+3));return e}function oh(t,e){let r=jc(t),n=jc(e);if(r.size===0&&n.size===0)return 1;if(r.size===0||n.size===0)return 0;let s=0;for(let o of r)n.has(o)&&s++;return s/(r.size+n.size-s)}function ih(t,e){let r=new Map,n=new Map;for(let a of t.split(" "))a&&r.set(a,(r.get(a)??0)+1);for(let a of e.split(" "))a&&n.set(a,(n.get(a)??0)+1);if(r.size===0||n.size===0)return 0;let s=0;for(let[a,l]of r)s+=l*(n.get(a)??0);let o=0;for(let a of r.values())o+=a*a;let i=0;for(let a of n.values())i+=a*a;return s/(Math.sqrt(o)*Math.sqrt(i)||1)}function ah(t,e){let r=jn(`${t??""}`),n=jn(`${e??""}`);return Math.max(oh(r,n),ih(r,n))}function Gc(t,e,r){let n=`${t.title??""} ${t.narrative??""}`,s={action:"ADD"},o=-1;for(let i of e){let a=ah(n,`${i.title??""} ${i.narrative??""}`);a<=o||(o=a,a>=r.noopThreshold?s={action:"NOOP",candidateId:i.id,score:a}:a>=r.updateBand&&r.supersessionEnabled?s={action:"UPDATE",candidateId:i.id,score:a}:s={action:"ADD",score:a})}return s}var sh,Yo=S(()=>{"use strict";sh=new Set(["the","a","an","and","or","but","to","of","in","on","for","with","is","are","was","were","be","been","it","this","that","we","i","as","at","by","from","into","over","so","then","than","will"])});import{createHash as lh}from"crypto";function qo(t){let e=t.title??"";if(!e){if(Array.isArray(t.facts)&&t.facts.length>0)e=t.facts[0];else if(typeof t.facts=="string")try{let n=JSON.parse(t.facts);Array.isArray(n)&&n.length>0&&(e=String(n[0]))}catch{}}e||(e=(t.narrative??"").slice(0,80));let r=jn(e);return lh("sha1").update(r).digest("hex").slice(0,16)}var Bc=S(()=>{"use strict";Yo()});function ch(t){return t.trim().toLowerCase().replace(/\s+/g,"-")}function ue(t){if(!t)return _;let e=ch(t);return e?e==="transcript"||e.includes("codex")?"codex":e.includes("cursor")?"cursor":e.includes("claude")?"claude":e:_}function Hc(t){let e=["claude","codex","cursor"];return[...t].sort((r,n)=>{let s=e.indexOf(r),o=e.indexOf(n);return s!==-1||o!==-1?s===-1?1:o===-1?-1:s-o:r.localeCompare(n)})}var _,zo=S(()=>{"use strict";_="claude"});function Jc(t,e,r,n,s){let o=Date.now()-n,i=s!==void 0?"up.session_db_id = ?":"up.content_session_id = ?",a=s??e;return t.prepare(`
|
|
399
399
|
SELECT
|
|
400
400
|
up.*,
|
|
401
401
|
s.memory_session_id,
|
|
@@ -408,7 +408,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
408
408
|
AND up.created_at_epoch >= ?
|
|
409
409
|
ORDER BY up.created_at_epoch DESC
|
|
410
410
|
LIMIT 1
|
|
411
|
-
`).get(a,r,o)??void 0}var Kc=S(()=>{"use strict";zo()});function uh(t){let e=Object.fromEntries(Yc.map(s=>[s,0]));Vc.lastIndex=0;let r=0,n=t.replace(Vc,(s,o)=>(e[o]=(e[o]??0)+1,r+=1,""));return r>Xc&&
|
|
411
|
+
`).get(a,r,o)??void 0}var Kc=S(()=>{"use strict";zo()});function uh(t){let e=Object.fromEntries(Yc.map(s=>[s,0]));Vc.lastIndex=0;let r=0,n=t.replace(Vc,(s,o)=>(e[o]=(e[o]??0)+1,r+=1,""));return r>Xc&&u.warn("SYSTEM","tag count exceeds limit",void 0,{tagCount:r,maxAllowed:Xc,contentLength:t.length}),{stripped:n.trim(),counts:e}}function qc(t){return uh(t).stripped}var Yc,Vc,Xc,dh,wC,IC,zc=S(()=>{"use strict";V();Yc=["private","claude-mem-context","system_instruction","system-instruction","persisted-output","system-reminder"],Vc=new RegExp(`<(${Yc.join("|")})\\b[^>]*>[\\s\\S]*?</\\1>`,"g"),Xc=100;dh=["task-notification"],wC=new RegExp(`^\\s*<(${dh.join("|")})\\b[^>]*>(?:(?!<\\1\\b|</\\1\\b)[\\s\\S])*</\\1>\\s*$`),IC=256*1024});function Gn(t){let e=t.trim(),n=qc(t).trim()||e;return n.length<=Zo?n:(u.debug("DB","Truncated stored prompt text to the configured cap",{originalLength:n.length,storedLength:Zo}),`${n.slice(0,Zo-1)}\u2026`)}var Zo,Zc=S(()=>{"use strict";zc();V();Zo=4e3});var $o={};he($o,{SessionStore:()=>Qo});function ph(t,e){return{customTitle:t,platformSource:e?ue(e):void 0}}var Qo,ei=S(()=>{"use strict";Lr();J();V();Lc();Dc();Pc();Fc();Wc();Yo();Bc();zo();Kc();Zc();Qo=class{db;redactEnabled;redactOpts;mq;rt(e){return this.redactEnabled?Jo(e,this.redactOpts):e}rl(e){return this.redactEnabled?Fn(e,this.redactOpts):e}constructor(e=B){try{this.mq=Uc();let r=this.mq.redactSecrets;this.redactEnabled=r.enabled,this.redactOpts={entropySweep:r.entropySweep,entropyThreshold:r.entropyThreshold}}catch{this.mq=Vo,this.redactEnabled=process.env.CLAUDE_MEM_REDACT_SECRETS!=="0"&&process.env.CLAUDE_MEM_REDACT_SECRETS!=="false",this.redactOpts={entropySweep:!0,entropyThreshold:4}}if(e instanceof be)this.db=e;else{e!==":memory:"&&nn(M);let r=e===B?cr():e;this.db=new be(r),this.db.run("PRAGMA journal_mode = WAL"),this.db.run("PRAGMA synchronous = NORMAL"),this.db.run("PRAGMA foreign_keys = ON"),this.db.run("PRAGMA journal_size_limit = 4194304")}this.initializeSchema(),this.ensureWorkerPortColumn(),this.ensurePromptTrackingColumns(),this.removeSessionSummariesUniqueConstraint(),this.addObservationHierarchicalFields(),this.makeObservationsTextNullable(),this.createUserPromptsTable(),this.ensureDiscoveryTokensColumn(),this.createPendingMessagesTable(),this.renameSessionIdColumns(),this.repairSessionIdColumnRename(),this.addFailedAtEpochColumn(),this.addOnUpdateCascadeToForeignKeys(),this.addObservationContentHashColumn(),this.addSessionCustomTitleColumn(),this.addSessionPlatformSourceColumn(),this.addObservationModelColumns(),this.ensureMergedIntoProjectColumns(),this.addObservationSubagentColumns(),this.addObservationsUniqueContentHashIndex(),this.addObservationsMetadataColumn(),this.dropDeadPendingMessagesColumns(),this.ensurePendingMessagesToolUseIdColumn(),this.dropWorkerPidColumn(),this.ensureSDKSessionsPlatformContentIdentity(),this.ensureUserPromptsSessionDbId(),this.ensurePendingMessagesSessionToolUniqueIndex(),this.addObservationImportanceColumn(),this.addObservationBitemporalColumns(),this.addObservationLastUsedColumn()}addObservationBitemporalColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(37),r=this.db.query("PRAGMA table_info(observations)").all(),n=s=>r.some(o=>o.name===s);e&&n("valid_from")&&n("valid_to")&&n("subject_key")||(n("valid_from")||this.db.run("ALTER TABLE observations ADD COLUMN valid_from INTEGER"),n("valid_to")||this.db.run("ALTER TABLE observations ADD COLUMN valid_to INTEGER"),n("subject_key")||this.db.run("ALTER TABLE observations ADD COLUMN subject_key TEXT"),this.db.run("UPDATE observations SET valid_from = created_at_epoch WHERE valid_from IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_subject_valid ON observations(project, subject_key, valid_to)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(37,new Date().toISOString()))}addObservationLastUsedColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(38),n=this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="last_used_at");e&&n||(n||this.db.run("ALTER TABLE observations ADD COLUMN last_used_at INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_obs_last_used ON observations(last_used_at)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(38,new Date().toISOString()))}addObservationImportanceColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(36),n=this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="importance");e&&n||(n||this.db.run("ALTER TABLE observations ADD COLUMN importance INTEGER"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_importance ON observations(importance)"),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(36,new Date().toISOString()))}getIndexColumns(e){return this.db.query(`PRAGMA index_info(${JSON.stringify(e)})`).all().map(r=>r.name)}hasUniqueIndexOnColumns(e,r){return this.db.query(`PRAGMA index_list(${e})`).all().some(s=>{if(s.unique!==1)return!1;let o=this.getIndexColumns(s.name);return o.length===r.length&&o.every((i,a)=>i===r[a])})}resolvePromptSessionDbId(e,r,n){if(r!==void 0)return r;let s=n?ue(n):void 0;return s?this.db.prepare(`
|
|
412
412
|
SELECT id
|
|
413
413
|
FROM sdk_sessions
|
|
414
414
|
WHERE COALESCE(NULLIF(platform_source, ''), ?) = ?
|
|
@@ -423,7 +423,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
423
423
|
ELSE 1
|
|
424
424
|
END, id
|
|
425
425
|
LIMIT 1
|
|
426
|
-
`).get(e)?.id??null}dropWorkerPidColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(32),n=this.db.query("PRAGMA table_info(pending_messages)").all().some(s=>s.name==="worker_pid");if(!(e&&!n)){if(n)try{this.db.run("DROP INDEX IF EXISTS idx_pending_messages_worker_pid"),this.db.run("ALTER TABLE pending_messages DROP COLUMN worker_pid"),
|
|
426
|
+
`).get(e)?.id??null}dropWorkerPidColumn(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(32),n=this.db.query("PRAGMA table_info(pending_messages)").all().some(s=>s.name==="worker_pid");if(!(e&&!n)){if(n)try{this.db.run("DROP INDEX IF EXISTS idx_pending_messages_worker_pid"),this.db.run("ALTER TABLE pending_messages DROP COLUMN worker_pid"),u.debug("DB","Dropped worker_pid column and its index from pending_messages")}catch(s){u.warn("DB","Failed to drop worker_pid column from pending_messages",{},s instanceof Error?s:new Error(String(s)));return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(32,new Date().toISOString())}}ensureSDKSessionsPlatformContentIdentity(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(33),r=this.hasUniqueIndexOnColumns("sdk_sessions",["content_session_id"]),n=this.hasUniqueIndexOnColumns("sdk_sessions",["platform_source","content_session_id"]),o=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source");if(!(e&&!r&&n&&o)){if(o||this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${_}'`),this.db.run(`
|
|
427
427
|
UPDATE sdk_sessions
|
|
428
428
|
SET platform_source = '${_}'
|
|
429
429
|
WHERE platform_source IS NULL OR platform_source = ''
|
|
@@ -537,7 +537,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
537
537
|
CREATE UNIQUE INDEX IF NOT EXISTS ux_pending_session_tool
|
|
538
538
|
ON pending_messages(session_db_id, tool_use_id)
|
|
539
539
|
WHERE tool_use_id IS NOT NULL
|
|
540
|
-
`),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(35,new Date().toISOString()),this.db.run("COMMIT")}catch(s){throw this.db.run("ROLLBACK"),s}}}dropDeadPendingMessagesColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(31),r=this.db.query("PRAGMA table_info(pending_messages)").all(),n=new Set(r.map(i=>i.name)),o=["retry_count","failed_at_epoch","completed_at_epoch"].filter(i=>n.has(i));if(!(e&&o.length===0)){if(o.length>0){this.db.run("BEGIN TRANSACTION");try{this.db.run("DELETE FROM pending_messages WHERE status NOT IN ('pending', 'processing')");for(let i of o)this.db.run(`ALTER TABLE pending_messages DROP COLUMN ${i}`),
|
|
540
|
+
`),e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(35,new Date().toISOString()),this.db.run("COMMIT")}catch(s){throw this.db.run("ROLLBACK"),s}}}dropDeadPendingMessagesColumns(){let e=this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(31),r=this.db.query("PRAGMA table_info(pending_messages)").all(),n=new Set(r.map(i=>i.name)),o=["retry_count","failed_at_epoch","completed_at_epoch"].filter(i=>n.has(i));if(!(e&&o.length===0)){if(o.length>0){this.db.run("BEGIN TRANSACTION");try{this.db.run("DELETE FROM pending_messages WHERE status NOT IN ('pending', 'processing')");for(let i of o)this.db.run(`ALTER TABLE pending_messages DROP COLUMN ${i}`),u.debug("DB",`Dropped dead column ${i} from pending_messages`);e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString()),this.db.run("COMMIT")}catch(i){this.db.run("ROLLBACK"),u.warn("DB","Failed to drop dead columns from pending_messages",{},i instanceof Error?i:new Error(String(i)));return}return}e||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(31,new Date().toISOString())}}initializeSchema(){this.db.run(`
|
|
541
541
|
CREATE TABLE IF NOT EXISTS schema_versions (
|
|
542
542
|
id INTEGER PRIMARY KEY,
|
|
543
543
|
version INTEGER UNIQUE NOT NULL,
|
|
@@ -602,7 +602,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
602
602
|
CREATE INDEX IF NOT EXISTS idx_session_summaries_sdk_session ON session_summaries(memory_session_id);
|
|
603
603
|
CREATE INDEX IF NOT EXISTS idx_session_summaries_project ON session_summaries(project);
|
|
604
604
|
CREATE INDEX IF NOT EXISTS idx_session_summaries_created ON session_summaries(created_at_epoch DESC);
|
|
605
|
-
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString())}ensureWorkerPortColumn(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),
|
|
605
|
+
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(4,new Date().toISOString())}ensureWorkerPortColumn(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(n=>n.name==="worker_port")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN worker_port INTEGER"),u.debug("DB","Added worker_port column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(5,new Date().toISOString())}ensurePromptTrackingColumns(){this.db.query("PRAGMA table_info(sdk_sessions)").all().some(a=>a.name==="prompt_counter")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN prompt_counter INTEGER DEFAULT 0"),u.debug("DB","Added prompt_counter column to sdk_sessions table")),this.db.query("PRAGMA table_info(observations)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE observations ADD COLUMN prompt_number INTEGER"),u.debug("DB","Added prompt_number column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(a=>a.name==="prompt_number")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN prompt_number INTEGER"),u.debug("DB","Added prompt_number column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(6,new Date().toISOString())}removeSessionSummariesUniqueConstraint(){if(!this.db.query("PRAGMA index_list(session_summaries)").all().some(n=>n.unique===1&&n.origin!=="pk")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString());return}u.debug("DB","Removing UNIQUE constraint from session_summaries.memory_session_id"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS session_summaries_new"),this.db.run(`
|
|
606
606
|
CREATE TABLE session_summaries_new (
|
|
607
607
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
608
608
|
memory_session_id TEXT NOT NULL,
|
|
@@ -630,7 +630,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
630
630
|
CREATE INDEX idx_session_summaries_sdk_session ON session_summaries(memory_session_id);
|
|
631
631
|
CREATE INDEX idx_session_summaries_project ON session_summaries(project);
|
|
632
632
|
CREATE INDEX idx_session_summaries_created ON session_summaries(created_at_epoch DESC);
|
|
633
|
-
`),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),
|
|
633
|
+
`),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(7,new Date().toISOString()),u.debug("DB","Successfully removed UNIQUE constraint from session_summaries.memory_session_id")}addObservationHierarchicalFields(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(8))return;if(this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="title")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString());return}u.debug("DB","Adding hierarchical fields to observations table"),this.db.run(`
|
|
634
634
|
ALTER TABLE observations ADD COLUMN title TEXT;
|
|
635
635
|
ALTER TABLE observations ADD COLUMN subtitle TEXT;
|
|
636
636
|
ALTER TABLE observations ADD COLUMN facts TEXT;
|
|
@@ -638,7 +638,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
638
638
|
ALTER TABLE observations ADD COLUMN concepts TEXT;
|
|
639
639
|
ALTER TABLE observations ADD COLUMN files_read TEXT;
|
|
640
640
|
ALTER TABLE observations ADD COLUMN files_modified TEXT;
|
|
641
|
-
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),
|
|
641
|
+
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(8,new Date().toISOString()),u.debug("DB","Successfully added hierarchical fields to observations table")}makeObservationsTextNullable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(9))return;let n=this.db.query("PRAGMA table_info(observations)").all().find(s=>s.name==="text");if(!n||n.notnull===0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString());return}u.debug("DB","Making observations.text nullable"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TABLE IF EXISTS observations_new"),this.db.run(`
|
|
642
642
|
CREATE TABLE observations_new (
|
|
643
643
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
644
644
|
memory_session_id TEXT NOT NULL,
|
|
@@ -668,7 +668,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
668
668
|
CREATE INDEX idx_observations_project ON observations(project);
|
|
669
669
|
CREATE INDEX idx_observations_type ON observations(type);
|
|
670
670
|
CREATE INDEX idx_observations_created ON observations(created_at_epoch DESC);
|
|
671
|
-
`),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),
|
|
671
|
+
`),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(9,new Date().toISOString()),u.debug("DB","Successfully made observations.text nullable")}createUserPromptsTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(10))return;if(this.db.query("PRAGMA table_info(user_prompts)").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString());return}u.debug("DB","Creating user_prompts table with FTS5 support"),this.db.run("BEGIN TRANSACTION"),this.db.run(`
|
|
672
672
|
CREATE TABLE user_prompts (
|
|
673
673
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
674
674
|
session_db_id INTEGER,
|
|
@@ -709,7 +709,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
709
709
|
INSERT INTO user_prompts_fts(rowid, prompt_text)
|
|
710
710
|
VALUES (new.id, new.prompt_text);
|
|
711
711
|
END;
|
|
712
|
-
`;try{this.db.run(n),this.db.run(s)}catch(o){o instanceof Error?
|
|
712
|
+
`;try{this.db.run(n),this.db.run(s)}catch(o){o instanceof Error?u.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},o):u.warn("DB","FTS5 not available \u2014 user_prompts_fts skipped (search uses ChromaDB)",{},new Error(String(o))),this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),u.debug("DB","Created user_prompts table (without FTS5)");return}this.db.run("COMMIT"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(10,new Date().toISOString()),u.debug("DB","Successfully created user_prompts table")}ensureDiscoveryTokensColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(11))return;this.db.query("PRAGMA table_info(observations)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE observations ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),u.debug("DB","Added discovery_tokens column to observations table")),this.db.query("PRAGMA table_info(session_summaries)").all().some(i=>i.name==="discovery_tokens")||(this.db.run("ALTER TABLE session_summaries ADD COLUMN discovery_tokens INTEGER DEFAULT 0"),u.debug("DB","Added discovery_tokens column to session_summaries table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(11,new Date().toISOString())}createPendingMessagesTable(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(16))return;if(this.db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_messages'").all().length>0){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString());return}u.debug("DB","Creating pending_messages table"),this.db.run(`
|
|
713
713
|
CREATE TABLE pending_messages (
|
|
714
714
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
715
715
|
session_db_id INTEGER NOT NULL,
|
|
@@ -726,7 +726,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
726
726
|
created_at_epoch INTEGER NOT NULL,
|
|
727
727
|
FOREIGN KEY (session_db_id) REFERENCES sdk_sessions(id) ON DELETE CASCADE
|
|
728
728
|
)
|
|
729
|
-
`),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),
|
|
729
|
+
`),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_session ON pending_messages(session_db_id)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_status ON pending_messages(status)"),this.db.run("CREATE INDEX IF NOT EXISTS idx_pending_messages_claude_session ON pending_messages(content_session_id)"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(16,new Date().toISOString()),u.debug("DB","pending_messages table created successfully")}renameSessionIdColumns(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(17))return;u.debug("DB","Checking session ID columns for semantic clarity rename");let r=0,n=(s,o,i)=>{let a=this.db.query(`PRAGMA table_info(${s})`).all(),l=a.some(d=>d.name===o);return a.some(d=>d.name===i)?!1:l?(this.db.run(`ALTER TABLE ${s} RENAME COLUMN ${o} TO ${i}`),u.debug("DB",`Renamed ${s}.${o} to ${i}`),!0):(u.warn("DB",`Column ${o} not found in ${s}, skipping rename`),!1)};n("sdk_sessions","claude_session_id","content_session_id")&&r++,n("sdk_sessions","sdk_session_id","memory_session_id")&&r++,n("pending_messages","claude_session_id","content_session_id")&&r++,n("observations","sdk_session_id","memory_session_id")&&r++,n("session_summaries","sdk_session_id","memory_session_id")&&r++,n("user_prompts","claude_session_id","content_session_id")&&r++,this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(17,new Date().toISOString()),r>0?u.debug("DB",`Successfully renamed ${r} session ID columns`):u.debug("DB","No session ID column renames needed (already up to date)")}repairSessionIdColumnRename(){this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(19)||this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(19,new Date().toISOString())}addFailedAtEpochColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(20))return;this.db.query("PRAGMA table_info(pending_messages)").all().some(s=>s.name==="failed_at_epoch")||(this.db.run("ALTER TABLE pending_messages ADD COLUMN failed_at_epoch INTEGER"),u.debug("DB","Added failed_at_epoch column to pending_messages table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(20,new Date().toISOString())}addOnUpdateCascadeToForeignKeys(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(21))return;u.debug("DB","Adding ON UPDATE CASCADE to FK constraints on observations and session_summaries"),this.db.run("PRAGMA foreign_keys = OFF"),this.db.run("BEGIN TRANSACTION"),this.db.run("DROP TRIGGER IF EXISTS observations_ai"),this.db.run("DROP TRIGGER IF EXISTS observations_ad"),this.db.run("DROP TRIGGER IF EXISTS observations_au"),this.db.run("DROP TABLE IF EXISTS observations_new");let r=this.db.query("PRAGMA table_info(observations)").all(),n=r.some(C=>C.name==="metadata"),s=r.some(C=>C.name==="content_hash"),o=n?`,
|
|
730
730
|
metadata TEXT`:"",i=n?", metadata":"",a=s?`,
|
|
731
731
|
content_hash TEXT`:"",l=s?", content_hash":"",c=`
|
|
732
732
|
CREATE TABLE observations_new (
|
|
@@ -748,7 +748,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
748
748
|
created_at_epoch INTEGER NOT NULL${o}${a},
|
|
749
749
|
FOREIGN KEY(memory_session_id) REFERENCES sdk_sessions(memory_session_id) ON DELETE CASCADE ON UPDATE CASCADE
|
|
750
750
|
)
|
|
751
|
-
`,
|
|
751
|
+
`,d=`
|
|
752
752
|
INSERT INTO observations_new
|
|
753
753
|
SELECT id, memory_session_id, project, text, type, title, subtitle, facts,
|
|
754
754
|
narrative, concepts, files_read, files_modified, prompt_number,
|
|
@@ -822,7 +822,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
822
822
|
INSERT INTO session_summaries_fts(rowid, request, investigated, learned, completed, next_steps, notes)
|
|
823
823
|
VALUES (new.id, new.request, new.investigated, new.learned, new.completed, new.next_steps, new.notes);
|
|
824
824
|
END;
|
|
825
|
-
`;try{this.recreateObservationsWithCascade(c,
|
|
825
|
+
`;try{this.recreateObservationsWithCascade(c,d,m,f),this.recreateSessionSummariesWithCascade(E,h,b,y),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(21,new Date().toISOString()),this.db.run("COMMIT"),this.db.run("PRAGMA foreign_keys = ON"),u.debug("DB","Successfully added ON UPDATE CASCADE to FK constraints")}catch(C){throw this.db.run("ROLLBACK"),this.db.run("PRAGMA foreign_keys = ON"),C instanceof Error?C:new Error(String(C))}}recreateObservationsWithCascade(e,r,n,s){this.db.run(e),this.db.run(r),this.db.run("DROP TABLE observations"),this.db.run("ALTER TABLE observations_new RENAME TO observations"),this.db.run(n),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run(s)}recreateSessionSummariesWithCascade(e,r,n,s){this.db.run(e),this.db.run(r),this.db.run("DROP TABLE session_summaries"),this.db.run("ALTER TABLE session_summaries_new RENAME TO session_summaries"),this.db.run(n),this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='session_summaries_fts'").all().length>0&&this.db.run(s)}addObservationContentHashColumn(){if(this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="content_hash")){this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString());return}this.db.run("ALTER TABLE observations ADD COLUMN content_hash TEXT"),this.db.run("UPDATE observations SET content_hash = substr(hex(randomblob(8)), 1, 16) WHERE content_hash IS NULL"),this.db.run("CREATE INDEX IF NOT EXISTS idx_observations_content_hash ON observations(content_hash, created_at_epoch)"),u.debug("DB","Added content_hash column to observations table with backfill and index"),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(22,new Date().toISOString())}addSessionCustomTitleColumn(){if(this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(23))return;this.db.query("PRAGMA table_info(sdk_sessions)").all().some(s=>s.name==="custom_title")||(this.db.run("ALTER TABLE sdk_sessions ADD COLUMN custom_title TEXT"),u.debug("DB","Added custom_title column to sdk_sessions table")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(23,new Date().toISOString())}addSessionPlatformSourceColumn(){let r=this.db.query("PRAGMA table_info(sdk_sessions)").all().some(i=>i.name==="platform_source"),s=this.db.query("PRAGMA index_list(sdk_sessions)").all().some(i=>i.name==="idx_sdk_sessions_platform_source");this.db.prepare("SELECT version FROM schema_versions WHERE version = ?").get(24)&&r&&s||(r||(this.db.run(`ALTER TABLE sdk_sessions ADD COLUMN platform_source TEXT NOT NULL DEFAULT '${_}'`),u.debug("DB","Added platform_source column to sdk_sessions table")),this.db.run(`
|
|
826
826
|
UPDATE sdk_sessions
|
|
827
827
|
SET platform_source = '${_}'
|
|
828
828
|
WHERE platform_source IS NULL OR platform_source = ''
|
|
@@ -872,7 +872,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
872
872
|
`),this.db.run(`
|
|
873
873
|
CREATE UNIQUE INDEX IF NOT EXISTS ux_observations_session_hash
|
|
874
874
|
ON observations(memory_session_id, content_hash)
|
|
875
|
-
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(29,new Date().toISOString()),this.db.run("COMMIT")}catch(o){throw this.db.run("ROLLBACK"),o}}addObservationsMetadataColumn(){this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="metadata")||(this.db.run("ALTER TABLE observations ADD COLUMN metadata TEXT"),
|
|
875
|
+
`),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(29,new Date().toISOString()),this.db.run("COMMIT")}catch(o){throw this.db.run("ROLLBACK"),o}}addObservationsMetadataColumn(){this.db.query("PRAGMA table_info(observations)").all().some(n=>n.name==="metadata")||(this.db.run("ALTER TABLE observations ADD COLUMN metadata TEXT"),u.debug("DB","Added metadata column to observations table (#2116)")),this.db.prepare("INSERT OR IGNORE INTO schema_versions (version, applied_at) VALUES (?, ?)").run(30,new Date().toISOString())}updateMemorySessionId(e,r){this.db.prepare(`
|
|
876
876
|
UPDATE sdk_sessions
|
|
877
877
|
SET memory_session_id = ?
|
|
878
878
|
WHERE id = ?
|
|
@@ -884,7 +884,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
884
884
|
SELECT id, memory_session_id, worker_port FROM sdk_sessions WHERE id = ?
|
|
885
885
|
`).get(e);if(!s)throw new Error(`Session ${e} not found in sdk_sessions`);s.memory_session_id!==r&&(this.db.prepare(`
|
|
886
886
|
UPDATE sdk_sessions SET memory_session_id = ? WHERE id = ?
|
|
887
|
-
`).run(r,e),
|
|
887
|
+
`).run(r,e),u.info("DB","Registered memory_session_id before storage (FK fix)",{sessionDbId:e,oldId:s.memory_session_id,newId:r})),typeof n=="number"&&s.worker_port!==n&&this.db.prepare(`
|
|
888
888
|
UPDATE sdk_sessions SET worker_port = ? WHERE id = ?
|
|
889
889
|
`).run(n,e)}getRecentSummaries(e,r=10){return this.db.prepare(`
|
|
890
890
|
SELECT
|
|
@@ -1025,14 +1025,14 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1025
1025
|
SELECT *
|
|
1026
1026
|
FROM observations
|
|
1027
1027
|
WHERE id = ?
|
|
1028
|
-
`).get(e)||null}getObservationsByIds(e,r={}){if(e.length===0)return[];let{orderBy:n="date_desc",limit:s,project:o,platformSource:i,type:a,concepts:l,files:c}=r,
|
|
1028
|
+
`).get(e)||null}getObservationsByIds(e,r={}){if(e.length===0)return[];let{orderBy:n="date_desc",limit:s,project:o,platformSource:i,type:a,concepts:l,files:c}=r,d=n==="relevance",m=d?"":`ORDER BY o.created_at_epoch ${n==="date_asc"?"ASC":"DESC"}`,f=s&&!d?`LIMIT ${s}`:"",E=e.map(()=>"?").join(","),h=[...e],b=[];if(o&&(b.push("o.project = ?"),h.push(o)),i&&(b.push(`COALESCE(NULLIF(s.platform_source, ''), '${_}') = ?`),h.push(ue(i))),a)if(Array.isArray(a)){let T=a.map(()=>"?").join(",");b.push(`o.type IN (${T})`),h.push(...a)}else b.push("o.type = ?"),h.push(a);if(l){let T=Array.isArray(l)?l:[l],v=T.map(()=>"EXISTS (SELECT 1 FROM json_each(o.concepts) WHERE value = ?)");h.push(...T),b.push(`(${v.join(" OR ")})`)}if(c){let T=Array.isArray(c)?c:[c],v=T.map(()=>"(EXISTS (SELECT 1 FROM json_each(o.files_read) WHERE value LIKE ?) OR EXISTS (SELECT 1 FROM json_each(o.files_modified) WHERE value LIKE ?))");T.forEach(I=>{h.push(`%${I}%`,`%${I}%`)}),b.push(`(${v.join(" OR ")})`)}let y=b.length>0?`WHERE o.id IN (${E}) AND ${b.join(" AND ")}`:`WHERE o.id IN (${E})`,A=this.db.prepare(`
|
|
1029
1029
|
SELECT o.*
|
|
1030
1030
|
FROM observations o
|
|
1031
1031
|
LEFT JOIN sdk_sessions s ON s.memory_session_id = o.memory_session_id
|
|
1032
1032
|
${y}
|
|
1033
1033
|
${m}
|
|
1034
1034
|
${f}
|
|
1035
|
-
`).all(...h);if(!
|
|
1035
|
+
`).all(...h);if(!d)return A;let D=new Map(A.map(T=>[T.id,T])),R=e.map(T=>D.get(T)).filter(T=>!!T);return s?R.slice(0,s):R}getSummaryForSession(e,r){let n=[e],s="";return r&&(s=`
|
|
1036
1036
|
AND EXISTS (
|
|
1037
1037
|
SELECT 1
|
|
1038
1038
|
FROM sdk_sessions sdk
|
|
@@ -1072,7 +1072,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1072
1072
|
SELECT COUNT(*) as count FROM user_prompts WHERE session_db_id = ?
|
|
1073
1073
|
`).get(n).count:this.db.prepare(`
|
|
1074
1074
|
SELECT COUNT(*) as count FROM user_prompts WHERE content_session_id = ?
|
|
1075
|
-
`).get(e).count}createSDKSession(e,r,n,s,o){let i=new Date,a=i.getTime(),l=ph(s,o),c=l.platformSource??_,
|
|
1075
|
+
`).get(e).count}createSDKSession(e,r,n,s,o){let i=new Date,a=i.getTime(),l=ph(s,o),c=l.platformSource??_,d=this.rt(Gn(n)),m=this.db.prepare(`
|
|
1076
1076
|
SELECT id, platform_source
|
|
1077
1077
|
FROM sdk_sessions
|
|
1078
1078
|
WHERE COALESCE(NULLIF(platform_source, ''), ?) = ?
|
|
@@ -1087,7 +1087,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1087
1087
|
INSERT INTO sdk_sessions
|
|
1088
1088
|
(content_session_id, memory_session_id, project, platform_source, user_prompt, custom_title, started_at, started_at_epoch, status)
|
|
1089
1089
|
VALUES (?, NULL, ?, ?, ?, ?, ?, ?, 'active')
|
|
1090
|
-
`).run(e,r,c,
|
|
1090
|
+
`).run(e,r,c,d,l.customTitle||null,i.toISOString(),a);return Number(f.lastInsertRowid)}saveUserPrompt(e,r,n,s){let o=new Date,i=o.getTime(),a=this.rt(Gn(n)),l=this.resolvePromptSessionDbId(e,s);return this.db.prepare(`
|
|
1091
1091
|
INSERT INTO user_prompts
|
|
1092
1092
|
(session_db_id, content_session_id, prompt_number, prompt_text, created_at, created_at_epoch)
|
|
1093
1093
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
@@ -1101,7 +1101,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1101
1101
|
FROM user_prompts
|
|
1102
1102
|
WHERE content_session_id = ? AND prompt_number = ?
|
|
1103
1103
|
LIMIT 1
|
|
1104
|
-
`).get(e,r)?.prompt_text??null}storeObservation(e,r,n,s,o=0,i,a){let l=i??Date.now(),c=new Date(l).toISOString(),
|
|
1104
|
+
`).get(e,r)?.prompt_text??null}storeObservation(e,r,n,s,o=0,i,a){let l=i??Date.now(),c=new Date(l).toISOString(),d=this.rt(n.title),m=this.rt(n.subtitle),f=this.rt(n.narrative),E=this.rl(n.facts),h=this.rt(n.metadata??null),b=Go(e,d??null,f??null),y=Xo({type:n.type,narrative:f,files_modified:n.files_modified}),C;if(this.mq.reconcile.enabled){let T=this.reconcileBeforeInsert(r,n.type,d??null,f??null);if(T.action==="NOOP"&&T.candidateId){let v=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE id = ?").get(T.candidateId);if(v)return{id:v.id,createdAtEpoch:v.created_at_epoch}}else T.action==="UPDATE"&&(C=T.candidateId)}let D=this.db.prepare(`
|
|
1105
1105
|
INSERT INTO observations
|
|
1106
1106
|
(memory_session_id, project, type, title, subtitle, facts, narrative, concepts,
|
|
1107
1107
|
files_read, files_modified, prompt_number, discovery_tokens, agent_type, agent_id, content_hash, created_at, created_at_epoch,
|
|
@@ -1109,12 +1109,12 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1109
1109
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1110
1110
|
ON CONFLICT(memory_session_id, content_hash) DO NOTHING
|
|
1111
1111
|
RETURNING id, created_at_epoch
|
|
1112
|
-
`).get(e,r,n.type,
|
|
1112
|
+
`).get(e,r,n.type,d,m,JSON.stringify(E),f,JSON.stringify(n.concepts),JSON.stringify(n.files_read),JSON.stringify(n.files_modified),s||null,o,n.agent_type??null,n.agent_id??null,b,c,l,a||null,h,y,l,qo({title:d??null,facts:E,narrative:f??null}));if(D)return C!==void 0&&this.mq.supersession.enabled&&this.supersedeObservation(C,D.id,l),{id:D.id,createdAtEpoch:D.created_at_epoch};let R=this.db.prepare("SELECT id, created_at_epoch FROM observations WHERE memory_session_id = ? AND content_hash = ?").get(e,b);if(!R)throw new Error(`storeObservation: ON CONFLICT without existing row for content_hash=${b}`);return{id:R.id,createdAtEpoch:R.created_at_epoch}}storeSummary(e,r,n,s,o=0,i){let a=i??Date.now(),l=new Date(a).toISOString(),d=this.db.prepare(`
|
|
1113
1113
|
INSERT INTO session_summaries
|
|
1114
1114
|
(memory_session_id, project, request, investigated, learned, completed,
|
|
1115
1115
|
next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
|
|
1116
1116
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1117
|
-
`).run(e,r,this.rt(n.request),this.rt(n.investigated),this.rt(n.learned),this.rt(n.completed),this.rt(n.next_steps),this.rt(n.notes),s||null,o,l,a);return{id:Number(
|
|
1117
|
+
`).run(e,r,this.rt(n.request),this.rt(n.investigated),this.rt(n.learned),this.rt(n.completed),this.rt(n.next_steps),this.rt(n.notes),s||null,o,l,a);return{id:Number(d.lastInsertRowid),createdAtEpoch:a}}storeObservations(e,r,n,s,o,i=0,a,l){let c=a??Date.now(),d=new Date(c).toISOString();return this.db.transaction(()=>{let f=[],E=this.db.prepare(`
|
|
1118
1118
|
INSERT INTO observations
|
|
1119
1119
|
(memory_session_id, project, type, title, subtitle, facts, narrative, concepts,
|
|
1120
1120
|
files_read, files_modified, prompt_number, discovery_tokens, agent_type, agent_id, content_hash, created_at, created_at_epoch,
|
|
@@ -1122,35 +1122,35 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1122
1122
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1123
1123
|
ON CONFLICT(memory_session_id, content_hash) DO NOTHING
|
|
1124
1124
|
RETURNING id
|
|
1125
|
-
`),h=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let y of n){let C=this.rt(y.title),A=this.rt(y.subtitle),D=this.rt(y.narrative),R=this.rl(y.facts),T=Go(e,C??null,D??null),v=E.get(e,r,y.type,C,A,JSON.stringify(R),D,JSON.stringify(y.concepts),JSON.stringify(y.files_read),JSON.stringify(y.files_modified),o||null,i,y.agent_type??null,y.agent_id??null,T,
|
|
1125
|
+
`),h=this.db.prepare("SELECT id FROM observations WHERE memory_session_id = ? AND content_hash = ?");for(let y of n){let C=this.rt(y.title),A=this.rt(y.subtitle),D=this.rt(y.narrative),R=this.rl(y.facts),T=Go(e,C??null,D??null),v=E.get(e,r,y.type,C,A,JSON.stringify(R),D,JSON.stringify(y.concepts),JSON.stringify(y.files_read),JSON.stringify(y.files_modified),o||null,i,y.agent_type??null,y.agent_id??null,T,d,c,l||null,Xo({type:y.type,narrative:D,files_modified:y.files_modified}),c,qo({title:C??null,facts:R,narrative:D??null}));if(v){f.push(v.id);continue}let I=h.get(e,T);if(!I)throw new Error(`storeObservations: ON CONFLICT without existing row for content_hash=${T}`);f.push(I.id)}let b=null;if(s){let C=this.db.prepare(`
|
|
1126
1126
|
INSERT INTO session_summaries
|
|
1127
1127
|
(memory_session_id, project, request, investigated, learned, completed,
|
|
1128
1128
|
next_steps, notes, prompt_number, discovery_tokens, created_at, created_at_epoch)
|
|
1129
1129
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
1130
|
-
`).run(e,r,this.rt(s.request),this.rt(s.investigated),this.rt(s.learned),this.rt(s.completed),this.rt(s.next_steps),this.rt(s.notes),o||null,i,
|
|
1130
|
+
`).run(e,r,this.rt(s.request),this.rt(s.investigated),this.rt(s.learned),this.rt(s.completed),this.rt(s.next_steps),this.rt(s.notes),o||null,i,d,c);b=Number(C.lastInsertRowid)}return{observationIds:f,summaryId:b,createdAtEpoch:c}})()}markObservationsUsed(e,r=Date.now()){if(e.length!==0)try{if(!this.db.query("PRAGMA table_info(observations)").all().some(o=>o.name==="last_used_at"))return;let s=e.map(()=>"?").join(",");this.db.prepare(`UPDATE observations SET last_used_at = ? WHERE id IN (${s})`).run(r,...e)}catch(n){u.debug("DB","markObservationsUsed failed",{count:e.length},n instanceof Error?n:new Error(String(n)))}}evaporateScratch(e){try{let r=this.db.prepare("DELETE FROM observations WHERE memory_session_id = ? AND type = 'scratch'").run(e),n=Number(r.changes??0);return n>0&&u.info("DB","Evaporated scratch observations at SessionEnd",{memorySessionId:e,count:n}),n}catch(r){return u.warn("DB","evaporateScratch failed",{memorySessionId:e},r instanceof Error?r:new Error(String(r))),0}}evaporateAllScratch(){try{let e=this.db.prepare("DELETE FROM observations WHERE type = 'scratch'").run(),r=Number(e.changes??0);return r>0&&u.info("DB","Evaporated all scratch observations on idle shutdown",{count:r}),r}catch(e){return u.warn("DB","evaporateAllScratch failed",{},e instanceof Error?e:new Error(String(e))),0}}reconcileBeforeInsert(e,r,n,s){try{let o=Date.now()-7776e6,i=this.db.query("PRAGMA table_info(observations)").all().some(m=>m.name==="valid_to"),a=i?"AND valid_to IS NULL":"",l=this.db.prepare(`
|
|
1131
1131
|
SELECT id, title, narrative, importance
|
|
1132
1132
|
FROM observations
|
|
1133
1133
|
WHERE project = ? AND type = ? AND created_at_epoch >= ? ${a}
|
|
1134
1134
|
ORDER BY created_at_epoch DESC
|
|
1135
1135
|
LIMIT 20
|
|
1136
|
-
`).all(e,r,o);if(l.length===0)return{action:"ADD"};let c=this.mq.supersession.enabled&&i;return Gc({title:n,narrative:s},l,{noopThreshold:this.mq.reconcile.noopThreshold,updateBand:this.mq.reconcile.updateBand,supersessionEnabled:c})}catch(o){return
|
|
1136
|
+
`).all(e,r,o);if(l.length===0)return{action:"ADD"};let c=this.mq.supersession.enabled&&i;return Gc({title:n,narrative:s},l,{noopThreshold:this.mq.reconcile.noopThreshold,updateBand:this.mq.reconcile.updateBand,supersessionEnabled:c})}catch(o){return u.warn("DB","reconcileBeforeInsert failed; defaulting to ADD",{project:e,type:r},o instanceof Error?o:new Error(String(o))),{action:"ADD"}}}supersedeObservation(e,r,n){try{this.db.prepare(`
|
|
1137
1137
|
UPDATE observations
|
|
1138
1138
|
SET valid_to = ?,
|
|
1139
1139
|
metadata = json_set(COALESCE(metadata, '{}'), '$.superseded_by', ?)
|
|
1140
1140
|
WHERE id = ? AND valid_to IS NULL
|
|
1141
|
-
`).run(n,r,e)}catch(s){
|
|
1141
|
+
`).run(n,r,e)}catch(s){u.warn("DB","supersedeObservation failed",{oldId:e,newId:r},s instanceof Error?s:new Error(String(s)))}}getObservationsAsOf(e,r){return this.db.query("PRAGMA table_info(observations)").all().some(s=>s.name==="valid_from")?this.db.prepare(`
|
|
1142
1142
|
SELECT * FROM observations
|
|
1143
1143
|
WHERE project = ?
|
|
1144
1144
|
AND COALESCE(valid_from, created_at_epoch) <= ?
|
|
1145
1145
|
AND (valid_to IS NULL OR valid_to > ?)
|
|
1146
|
-
`).all(e,r,r):this.db.prepare("SELECT * FROM observations WHERE project = ?").all(e)}deleteObservationsByProject(e,r={}){let n=(e??"").trim();if(n===""||n==="*")throw new Error(`deleteObservationsByProject: refusing unsafe project '${e}'`);let s=this.db.prepare("SELECT count(*) AS c FROM observations WHERE project = ?").get(n).c,o=this.db.prepare("SELECT count(*) AS c FROM session_summaries WHERE project = ?").get(n).c;if(r.dryRun)return{project:n,dryRun:!0,observationsDeleted:s,summariesDeleted:o};this.db.transaction(()=>{this.db.prepare("DELETE FROM observations WHERE project = ?").run(n),this.db.prepare("DELETE FROM session_summaries WHERE project = ?").run(n)})();try{this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run("INSERT INTO observations_fts(observations_fts) VALUES('rebuild')")}catch(a){
|
|
1146
|
+
`).all(e,r,r):this.db.prepare("SELECT * FROM observations WHERE project = ?").all(e)}deleteObservationsByProject(e,r={}){let n=(e??"").trim();if(n===""||n==="*")throw new Error(`deleteObservationsByProject: refusing unsafe project '${e}'`);let s=this.db.prepare("SELECT count(*) AS c FROM observations WHERE project = ?").get(n).c,o=this.db.prepare("SELECT count(*) AS c FROM session_summaries WHERE project = ?").get(n).c;if(r.dryRun)return{project:n,dryRun:!0,observationsDeleted:s,summariesDeleted:o};this.db.transaction(()=>{this.db.prepare("DELETE FROM observations WHERE project = ?").run(n),this.db.prepare("DELETE FROM session_summaries WHERE project = ?").run(n)})();try{this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'").all().length>0&&this.db.run("INSERT INTO observations_fts(observations_fts) VALUES('rebuild')")}catch(a){u.warn("DB","observations_fts rebuild after project delete failed",{project:n},a instanceof Error?a:new Error(String(a)))}return u.info("DB","Deleted observations by project",{project:n,observationsDeleted:s,summariesDeleted:o}),{project:n,dryRun:!1,observationsDeleted:s,summariesDeleted:o}}getSessionSummariesByIds(e,r={}){if(e.length===0)return[];let{orderBy:n="date_desc",limit:s,project:o,platformSource:i}=r,a=n==="relevance",l=a?"":`ORDER BY ss.created_at_epoch ${n==="date_asc"?"ASC":"DESC"}`,c=s&&!a?`LIMIT ${s}`:"",d=e.map(()=>"?").join(","),m=[...e],f=[];o&&(f.push("ss.project = ?"),m.push(o)),i&&(f.push(`COALESCE(NULLIF(s.platform_source, ''), '${_}') = ?`),m.push(ue(i)));let E=f.length>0?`AND ${f.join(" AND ")}`:"",b=this.db.prepare(`
|
|
1147
1147
|
SELECT ss.*
|
|
1148
1148
|
FROM session_summaries ss
|
|
1149
1149
|
LEFT JOIN sdk_sessions s ON s.memory_session_id = ss.memory_session_id
|
|
1150
|
-
WHERE ss.id IN (${
|
|
1150
|
+
WHERE ss.id IN (${d}) ${E}
|
|
1151
1151
|
${l}
|
|
1152
1152
|
${c}
|
|
1153
|
-
`).all(...m);if(!a)return b;let y=new Map(b.map(A=>[A.id,A])),C=e.map(A=>y.get(A)).filter(A=>!!A);return s?C.slice(0,s):C}getUserPromptsByIds(e,r={}){if(e.length===0)return[];let{orderBy:n="date_desc",limit:s,project:o,platformSource:i}=r,a=n==="relevance",l=a?"":`ORDER BY up.created_at_epoch ${n==="date_asc"?"ASC":"DESC"}`,c=s?`LIMIT ${s}`:"",
|
|
1153
|
+
`).all(...m);if(!a)return b;let y=new Map(b.map(A=>[A.id,A])),C=e.map(A=>y.get(A)).filter(A=>!!A);return s?C.slice(0,s):C}getUserPromptsByIds(e,r={}){if(e.length===0)return[];let{orderBy:n="date_desc",limit:s,project:o,platformSource:i}=r,a=n==="relevance",l=a?"":`ORDER BY up.created_at_epoch ${n==="date_asc"?"ASC":"DESC"}`,c=s?`LIMIT ${s}`:"",d=e.map(()=>"?").join(","),m=[...e],f=[];o&&(f.push("s.project = ?"),m.push(o)),i&&(f.push(`COALESCE(NULLIF(s.platform_source, ''), '${_}') = ?`),m.push(ue(i)));let E=f.length>0?`AND ${f.join(" AND ")}`:"",b=this.db.prepare(`
|
|
1154
1154
|
SELECT
|
|
1155
1155
|
up.*,
|
|
1156
1156
|
s.project,
|
|
@@ -1158,10 +1158,10 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1158
1158
|
COALESCE(NULLIF(s.platform_source, ''), '${_}') as platform_source
|
|
1159
1159
|
FROM user_prompts up
|
|
1160
1160
|
JOIN sdk_sessions s ON up.session_db_id = s.id
|
|
1161
|
-
WHERE up.id IN (${
|
|
1161
|
+
WHERE up.id IN (${d}) ${E}
|
|
1162
1162
|
${l}
|
|
1163
1163
|
${c}
|
|
1164
|
-
`).all(...m);if(!a)return b;let y=new Map(b.map(C=>[C.id,C]));return e.map(C=>y.get(C)).filter(C=>!!C)}getTimelineAroundTimestamp(e,r=10,n=10,s,o){return this.getTimelineAroundObservation(null,e,r,n,s,o)}getTimelineAroundObservation(e,r,n=10,s=10,o,i){let a=i?ue(i):void 0,l=(R,T)=>{let v=[],I=[];return o&&(v.push(`${R}.project = ?`),I.push(o)),a&&(v.push(`COALESCE(NULLIF(${T}.platform_source, ''), '${_}') = ?`),I.push(a)),{clause:v.length>0?`AND ${v.join(" AND ")}`:"",params:I}},c=l("o","src"),
|
|
1164
|
+
`).all(...m);if(!a)return b;let y=new Map(b.map(C=>[C.id,C]));return e.map(C=>y.get(C)).filter(C=>!!C)}getTimelineAroundTimestamp(e,r=10,n=10,s,o){return this.getTimelineAroundObservation(null,e,r,n,s,o)}getTimelineAroundObservation(e,r,n=10,s=10,o,i){let a=i?ue(i):void 0,l=(R,T)=>{let v=[],I=[];return o&&(v.push(`${R}.project = ?`),I.push(o)),a&&(v.push(`COALESCE(NULLIF(${T}.platform_source, ''), '${_}') = ?`),I.push(a)),{clause:v.length>0?`AND ${v.join(" AND ")}`:"",params:I}},c=l("o","src"),d=l("ss","src"),m=l("s","s"),f,E;if(e!==null){let R=`
|
|
1165
1165
|
SELECT o.id, o.created_at_epoch
|
|
1166
1166
|
FROM observations o
|
|
1167
1167
|
LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
|
|
@@ -1175,7 +1175,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1175
1175
|
WHERE o.id >= ? ${c.clause}
|
|
1176
1176
|
ORDER BY o.id ASC
|
|
1177
1177
|
LIMIT ?
|
|
1178
|
-
`;try{let v=this.db.prepare(R).all(e,...c.params,n+1),I=this.db.prepare(T).all(e,...c.params,s+1);if(v.length===0&&I.length===0)return{observations:[],sessions:[],prompts:[]};f=v.length>0?v[v.length-1].created_at_epoch:r,E=I.length>0?I[I.length-1].created_at_epoch:r}catch(v){return v instanceof Error?
|
|
1178
|
+
`;try{let v=this.db.prepare(R).all(e,...c.params,n+1),I=this.db.prepare(T).all(e,...c.params,s+1);if(v.length===0&&I.length===0)return{observations:[],sessions:[],prompts:[]};f=v.length>0?v[v.length-1].created_at_epoch:r,E=I.length>0?I[I.length-1].created_at_epoch:r}catch(v){return v instanceof Error?u.error("DB","Error getting boundary observations",{project:o},v):u.error("DB","Error getting boundary observations with non-Error",{},new Error(String(v))),{observations:[],sessions:[],prompts:[]}}}else{let R=`
|
|
1179
1179
|
SELECT o.created_at_epoch
|
|
1180
1180
|
FROM observations o
|
|
1181
1181
|
LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
|
|
@@ -1189,7 +1189,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1189
1189
|
WHERE o.created_at_epoch >= ? ${c.clause}
|
|
1190
1190
|
ORDER BY o.created_at_epoch ASC
|
|
1191
1191
|
LIMIT ?
|
|
1192
|
-
`;try{let v=this.db.prepare(R).all(r,...c.params,n),I=this.db.prepare(T).all(r,...c.params,s+1);if(v.length===0&&I.length===0)return{observations:[],sessions:[],prompts:[]};f=v.length>0?v[v.length-1].created_at_epoch:r,E=I.length>0?I[I.length-1].created_at_epoch:r}catch(v){return v instanceof Error?
|
|
1192
|
+
`;try{let v=this.db.prepare(R).all(r,...c.params,n),I=this.db.prepare(T).all(r,...c.params,s+1);if(v.length===0&&I.length===0)return{observations:[],sessions:[],prompts:[]};f=v.length>0?v[v.length-1].created_at_epoch:r,E=I.length>0?I[I.length-1].created_at_epoch:r}catch(v){return v instanceof Error?u.error("DB","Error getting boundary timestamps",{project:o},v):u.error("DB","Error getting boundary timestamps with non-Error",{},new Error(String(v))),{observations:[],sessions:[],prompts:[]}}}let h=`
|
|
1193
1193
|
SELECT o.*
|
|
1194
1194
|
FROM observations o
|
|
1195
1195
|
LEFT JOIN sdk_sessions src ON src.memory_session_id = o.memory_session_id
|
|
@@ -1199,7 +1199,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1199
1199
|
SELECT ss.*
|
|
1200
1200
|
FROM session_summaries ss
|
|
1201
1201
|
LEFT JOIN sdk_sessions src ON src.memory_session_id = ss.memory_session_id
|
|
1202
|
-
WHERE ss.created_at_epoch >= ? AND ss.created_at_epoch <= ? ${
|
|
1202
|
+
WHERE ss.created_at_epoch >= ? AND ss.created_at_epoch <= ? ${d.clause}
|
|
1203
1203
|
ORDER BY ss.created_at_epoch ASC
|
|
1204
1204
|
`,y=`
|
|
1205
1205
|
SELECT up.*, s.project, s.memory_session_id, COALESCE(NULLIF(s.platform_source, ''), '${_}') as platform_source
|
|
@@ -1207,7 +1207,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1207
1207
|
JOIN sdk_sessions s ON up.session_db_id = s.id
|
|
1208
1208
|
WHERE up.created_at_epoch >= ? AND up.created_at_epoch <= ? ${m.clause}
|
|
1209
1209
|
ORDER BY up.created_at_epoch ASC
|
|
1210
|
-
`,C=this.db.prepare(h).all(f,E,...c.params),A=this.db.prepare(b).all(f,E,...
|
|
1210
|
+
`,C=this.db.prepare(h).all(f,E,...c.params),A=this.db.prepare(b).all(f,E,...d.params),D=this.db.prepare(y).all(f,E,...m.params);return{observations:C,sessions:A.map(R=>({id:R.id,memory_session_id:R.memory_session_id,project:R.project,request:R.request,completed:R.completed,next_steps:R.next_steps,created_at:R.created_at,created_at_epoch:R.created_at_epoch})),prompts:D.map(R=>({id:R.id,content_session_id:R.content_session_id,prompt_number:R.prompt_number,prompt_text:R.prompt_text,project:R.project,platform_source:R.platform_source,created_at:R.created_at,created_at_epoch:R.created_at_epoch}))}}getPromptById(e){return this.db.prepare(`
|
|
1211
1211
|
SELECT
|
|
1212
1212
|
p.id,
|
|
1213
1213
|
p.content_session_id,
|
|
@@ -1236,7 +1236,7 @@ Use claude-mem's MCP search tools for manual memory queries.`;Pg={ideId:"copilot
|
|
|
1236
1236
|
`).all(...e)}getOrCreateManualSession(e){let r=`manual-${e}`,n=`manual-content-${e}`;if(this.db.prepare("SELECT memory_session_id FROM sdk_sessions WHERE memory_session_id = ?").get(r))return r;let o=new Date;return this.db.prepare(`
|
|
1237
1237
|
INSERT INTO sdk_sessions (memory_session_id, content_session_id, project, platform_source, started_at, started_at_epoch, status)
|
|
1238
1238
|
VALUES (?, ?, ?, ?, ?, ?, 'active')
|
|
1239
|
-
`).run(r,n,e,_,o.toISOString(),o.getTime()),
|
|
1239
|
+
`).run(r,n,e,_,o.toISOString(),o.getTime()),u.info("SESSION","Created manual session",{memorySessionId:r,project:e}),r}close(){this.db.close()}importSdkSession(e){let r=ue(e.platform_source),n=this.db.prepare(`SELECT id FROM sdk_sessions
|
|
1240
1240
|
WHERE platform_source = ? AND content_session_id = ?`).get(r,e.content_session_id);return n?{imported:!1,id:n.id}:{imported:!0,id:this.db.prepare(`
|
|
1241
1241
|
INSERT INTO sdk_sessions (
|
|
1242
1242
|
content_session_id, memory_session_id, project, platform_source, user_prompt,
|
|
@@ -1321,18 +1321,18 @@ Refusing to purge without confirmation. Re-run with --yes to remove claude-mem.`
|
|
|
1321
1321
|
`)),process.exit(1)),console.log(F.default.dim(" Purging claude-mem (verified redundant)\u2026"));let a=await n({timestamp:new Date().toISOString()});console.log(`
|
|
1322
1322
|
${F.default.green("\u2713 claude-mem removed.")}`),a.archivePath&&console.log(F.default.dim(` Backup: ${a.archivePath}`)),a.processesKilled&&console.log(F.default.dim(` Stopped ${a.processesKilled} orphaned process(es).`)),console.log("")}var F,Hn=S(()=>{"use strict";F=je(rt(),1);J();Lr()});import{execFile as bh}from"node:child_process";import{promisify as yh}from"node:util";async function ru(){try{return process.platform==="win32"?await vh():await Ch()}catch{return[]}}async function vh(){let t=`Get-CimInstance Win32_Process | Where-Object { $_.Name -match '^(chroma-mcp|python|pythonw)(\\.exe)?$' -and $_.CommandLine -match 'chroma-mcp' -and $_.CommandLine -match '\\.claude-mem' } | ForEach-Object { "$($_.ProcessId)\`t$($_.Name)" }`,{stdout:e}=await oi("powershell",["-NoProfile","-NonInteractive","-Command",t],{windowsHide:!0,timeout:15e3});return Rh(e)}async function Ch(){let{stdout:t}=await oi("ps",["-eo","pid=,comm=,args="],{timeout:15e3}),e=[];for(let r of t.split(`
|
|
1323
1323
|
`)){let n=r.trim();if(!n)continue;let s=n.match(/^(\d+)\s+(\S+)\s+(.*)$/);if(!s)continue;let o=Number(s[1]),i=s[2],a=s[3],l=i.split("/").pop()??i;Th.includes(l)&&/chroma-mcp/.test(a)&&/\.claude-mem/.test(a)&&o!==process.pid&&e.push({pid:o,name:l})}return e}function Rh(t){let e=[];for(let r of t.split(`
|
|
1324
|
-
`)){let n=r.trim();if(!n)continue;let[s,o]=n.split(" "),i=Number(s);!Number.isInteger(i)||i<=0||i===process.pid||e.push({pid:i,name:o??"unknown"})}return e}async function nu(t){let e=0;for(let r of t)if(!(!Number.isInteger(r)||r<=0))try{process.platform==="win32"?await oi("taskkill",["/PID",String(r),"/T","/F"],{windowsHide:!0,timeout:1e4}):process.kill(r,"SIGKILL"),e++}catch(n){if(n?.code==="ESRCH")continue}return e}var oi,Th,su=S(()=>{"use strict";oi=yh(bh),Th=["chroma-mcp.exe","python.exe","pythonw.exe","chroma-mcp","python","python3"]});var ni={};he(ni,{claudeMemDbPath:()=>ci,claudeMemDir:()=>li,detectClaudeMem:()=>lu,purgeClaudeMem:()=>Lh,verifyMigrated:()=>xh});import{execFile as wh}from"node:child_process";import{existsSync as ye,mkdirSync as Ih,readdirSync as Oh,readFileSync as au,rmSync as ai,writeFileSync as kh}from"node:fs";import{homedir as Kn}from"node:os";import{join as ne,dirname as _h,basename as Ah}from"node:path";import{promisify as Nh}from"node:util";function li(){return ne(Kn(),".claude-mem")}function ci(){return ne(li(),"claude-mem.db")}function lu(){let t=li(),e=ci(),r=ye(e),n=new Set,s=new Set,o=z(Le(),{});for(let
|
|
1324
|
+
`)){let n=r.trim();if(!n)continue;let[s,o]=n.split(" "),i=Number(s);!Number.isInteger(i)||i<=0||i===process.pid||e.push({pid:i,name:o??"unknown"})}return e}async function nu(t){let e=0;for(let r of t)if(!(!Number.isInteger(r)||r<=0))try{process.platform==="win32"?await oi("taskkill",["/PID",String(r),"/T","/F"],{windowsHide:!0,timeout:1e4}):process.kill(r,"SIGKILL"),e++}catch(n){if(n?.code==="ESRCH")continue}return e}var oi,Th,su=S(()=>{"use strict";oi=yh(bh),Th=["chroma-mcp.exe","python.exe","pythonw.exe","chroma-mcp","python","python3"]});var ni={};he(ni,{claudeMemDbPath:()=>ci,claudeMemDir:()=>li,detectClaudeMem:()=>lu,purgeClaudeMem:()=>Lh,verifyMigrated:()=>xh});import{execFile as wh}from"node:child_process";import{existsSync as ye,mkdirSync as Ih,readdirSync as Oh,readFileSync as au,rmSync as ai,writeFileSync as kh}from"node:fs";import{homedir as Kn}from"node:os";import{join as ne,dirname as _h,basename as Ah}from"node:path";import{promisify as Nh}from"node:util";function li(){return ne(Kn(),".claude-mem")}function ci(){return ne(li(),"claude-mem.db")}function lu(){let t=li(),e=ci(),r=ye(e),n=new Set,s=new Set,o=z(Le(),{});for(let d of Object.keys(o?.plugins??{}))if(Dr.test(d)){n.add(d);let m=d.split("@")[1];m&&s.add(m)}let i=z(Re(),{});for(let d of Object.keys(i?.enabledPlugins??{}))if(Dr.test(d)){n.add(d);let m=d.split("@")[1];m&&s.add(m)}let a=z(xe(),{});for(let d of Object.keys(a)){if(s.has(d))continue;if(Dr.test(d)){s.add(d);continue}let m=z(ne(Se(),"marketplaces",d,".claude-plugin","marketplace.json"),{});(Array.isArray(m?.plugins)?m.plugins:[]).some(E=>typeof E?.name=="string"&&Dr.test(E.name))&&s.add(d)}let l=[...s].map(d=>ne(Se(),"marketplaces",d)).filter(d=>ye(d));return{installed:r||n.size>0||s.size>0,dataDir:t,dbPath:e,hasData:r,counts:r?Mh(e):null,pluginKeys:[...n],marketplaceKeys:[...s],marketplaceDirs:l}}function Mh(t){try{return Ze(t)}catch{return null}}function xh(t=ci()){if(!ye(t)||!ye(B))return{missing:0,total:0,unhashable:0};let e=new be(B,{readonly:!0}),r=new be(t,{readonly:!0});try{let n=new Set(e.prepare("SELECT content_hash FROM observations WHERE content_hash IS NOT NULL").all().map(a=>a.content_hash)),s=r.prepare("SELECT content_hash FROM observations").all(),o=0,i=0;for(let a of s)a.content_hash?n.has(a.content_hash)||o++:i++;return{missing:o,total:s.length,unhashable:i}}finally{try{r.close()}catch{}try{e.close()}catch{}}}async function Lh(t){let e=t.presence??lu(),r={processesKilled:0,archivePath:null,marketplacesRemoved:[],pluginsRemoved:[],strayPathsRemoved:0,dataDirRemoved:!1,errors:[]};try{let s=await ru();r.processesKilled=await nu(s.map(o=>o.pid))}catch(s){r.errors.push(`process stop: ${Qe(s)}`)}let n=!0;if(ye(e.dataDir))try{r.archivePath=await Dh(e.dataDir,t.timestamp)}catch(s){n=!1,r.errors.push(`archive: ${Qe(s)}`)}try{Ph(e,r)}catch(s){r.errors.push(`deregister: ${Qe(s)}`)}try{r.strayPathsRemoved=Uh()}catch(s){r.errors.push(`stray paths: ${Qe(s)}`)}try{Fh(r)}catch(s){r.errors.push(`shell alias: ${Qe(s)}`)}try{Wh(r)}catch(s){r.errors.push(`claude.json: ${Qe(s)}`)}if(ye(e.dataDir))if(!n)r.errors.push("data dir kept: backup failed, refusing to delete without an archive");else try{ai(e.dataDir,{recursive:!0,force:!0}),r.dataDirRemoved=!ye(e.dataDir)}catch(s){r.errors.push(`remove data dir: ${Qe(s)}`)}return r}async function Dh(t,e){let r=ne(M,"backups");Ih(r,{recursive:!0});let n=e.replace(/[:.]/g,"-");if(process.platform==="win32"){let o=ne(r,`claude-mem-${n}.zip`);return await ou("powershell",["-NoProfile","-NonInteractive","-Command",`Compress-Archive -Path ${iu(ne(t,"*"))} -DestinationPath ${iu(o)} -Force`],{windowsHide:!0,timeout:12e4}),o}let s=ne(r,`claude-mem-${n}.tar.gz`);return await ou("tar",["-czf",s,"-C",_h(t),Ah(t)],{timeout:12e4}),s}function Ph(t,e){let r=z(Le(),{}),n=!1;for(let l of t.pluginKeys)r?.plugins?.[l]!==void 0&&(delete r.plugins[l],e.pluginsRemoved.push(l),n=!0);n&&se(Le(),r);let s=z(Re(),{}),o=!1;for(let l of t.pluginKeys)s?.enabledPlugins?.[l]!==void 0&&(delete s.enabledPlugins[l],o=!0);o&&se(Re(),s);let i=z(xe(),{}),a=!1;for(let l of t.marketplaceKeys)i?.[l]!==void 0&&(delete i[l],a=!0);a&&se(xe(),i);for(let l of t.marketplaceDirs)ye(l)&&(ai(l,{recursive:!0,force:!0}),e.marketplacesRemoved.push(l))}function Uh(){let t=Kn(),e=0,r=ne(t,".npm","_npx");if(ye(r))for(let o of Jn(r)){let i=ne(r,o,"node_modules","claude-mem");ye(i)&&ii(i)&&e++}let n=ne(t,".cache","claude-cli-nodejs");if(ye(n))for(let o of Jn(n)){let i=ne(n,o);for(let a of Jn(i))a.startsWith("mcp-logs-plugin-claude-mem-")&&ii(ne(i,a))&&e++}let s=ne(t,".claude","plugins","data");if(ye(s))for(let o of Jn(s))o.startsWith("claude-mem-")&&ii(ne(s,o))&&e++;return e}function Fh(t){let e=Kn(),r=[ne(e,".bashrc"),ne(e,".zshrc"),ne(e,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")],n=/^\s*(alias\s+claude-mem\s*=|Set-Alias\s+(-Name\s+)?claude-mem\b)/;for(let s of r)if(ye(s))try{let o=au(s,"utf-8").split(`
|
|
1325
1325
|
`),i=o.filter(a=>!n.test(a));i.length!==o.length&&(kh(s,i.join(`
|
|
1326
1326
|
`)),t.strayPathsRemoved+=o.length-i.length)}catch(o){t.errors.push(`shell alias (${s}): ${Qe(o)}`)}}function Wh(t){let e=ne(Kn(),".claude.json");if(!ye(e))return;let r;try{r=JSON.parse(au(e,"utf-8"))}catch(s){t.errors.push(`claude.json parse (left intact): ${Qe(s)}`);return}if(!r||typeof r!="object"||Array.isArray(r))return;let n=!1;for(let s of["skillUsage","pluginUsage","usageStats"]){let o=r[s];if(o&&typeof o=="object"&&!Array.isArray(o))for(let i of Object.keys(o))Dr.test(i)&&(delete o[i],n=!0)}n&&se(e,r)}function Jn(t){try{return Oh(t)}catch{return[]}}function ii(t){try{return ai(t,{recursive:!0,force:!0}),!0}catch{return!1}}function iu(t){return`'${t.replace(/'/g,"''")}'`}function Qe(t){return t instanceof Error?t.message:String(t)}var ou,Dr,si=S(()=>{"use strict";J();Lr();Ae();Hn();su();ou=Nh(wh),Dr=/(^|[@/])claude-mem\b/});var Yn={};he(Yn,{disableClaudeAutoMemory:()=>gu,runInstallCommand:()=>rE,runRepairCommand:()=>sE});import{cpSync as cu,existsSync as Te,mkdirSync as uu,readFileSync as Xn,rmSync as du,writeFileSync as pu}from"fs";import{homedir as mu}from"os";import{dirname as fu,join as de}from"path";function zt(t){return re.loadFromFile(Je)[t]}async function Vn(t){if(K)await en(t);else for(let e of t){let r=await e.task(n=>console.log(` ${n}`));console.log(` ${r}`)}}function ui(t,e){if(t(e),!K)return()=>{};let r=Date.now(),n=setInterval(()=>{let s=Math.round((Date.now()-r)/1e3);t(`${e} ${g.default.dim(`(${s}s \u2014 still working)`)}`)},1e3);return()=>clearInterval(n)}async function kt(t){if(!K)return{result:await t(),output:""};let e="",r=(...s)=>{e+=s.map(o=>typeof o=="string"?o:String(o)).join(" ")+`
|
|
1327
|
-
`},n={log:console.log,error:console.error,warn:console.warn};console.log=r,console.error=r,console.warn=r;try{return{result:await t(),output:e}}finally{console.log=n.log,console.error=n.error,console.warn=n.warn}}function jh(){let t=z(xe(),{});t.keepmind={source:{source:"github",repo:"ManuelStaggl/keepmind"},installLocation:ee(),lastUpdated:new Date().toISOString(),autoUpdate:!0},er(Se()),se(xe(),t)}function Gh(t){let e=z(Le(),{});e.version||(e.version=2),e.plugins||(e.plugins={});let r=nt(t),n=new Date().toISOString();e.plugins["keepmind@keepmind"]=[{scope:"user",installPath:r,version:t,installedAt:n,lastUpdated:n}],se(Le(),e)}function Bh(){let t=z(Re(),{});t.enabledPlugins||(t.enabledPlugins={}),t.enabledPlugins["keepmind@keepmind"]=!0,se(Re(),t)}function gu(){let t=z(Re(),{}),e=t.env&&typeof t.env=="object"?t.env:{};return e.CLAUDE_CODE_DISABLE_AUTO_MEMORY==="1"?!1:(t.env={...e,CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1"},se(Re(),t),!0)}async function Hh(t,e){if(!t.includes("claude-code"))return"not-applicable";if(e.disableAutoMemory)return"disable";if(!K)return"leave-enabled";let r=await it({message:"Disable Claude Code auto-memory?",options:[{value:"leave-enabled",label:"Leave enabled",hint:"Recommended; keeps Claude Code native memory visible on startup."},{value:"disable",label:"Disable auto-memory",hint:"Only if you explicitly want keepmind to replace native startup memory."}],initialValue:"leave-enabled"});return X(r)&&(Ie("Installation cancelled."),process.exit(0)),r}function Jh(t,e){let r=(n,s)=>{ce("FAIL_LOUD_PER_IDE",{component:n,ide:t,phase:"ide-install",cause:new Error(n),details:s&&s.trim().length>0?s.trim().slice(0,4e3):void 0},e)};switch(t){case"claude-code":return{title:"Claude Code: registering plugin",task:async()=>`Claude Code: plugin registered ${g.default.green("OK")}`};case"cursor":return{title:"Cursor: installing hooks + MCP",task:async n=>{n("Loading Cursor installer\u2026");let{installCursorHooks:s,configureCursorMcp:o}=await Promise.resolve().then(()=>(Yl(),Xl));n("Installing Cursor hooks\u2026");let{result:i,output:a}=await kt(()=>s("user"));if(i!==0)return r("Cursor: hook installation failed",a),`Cursor: hook installation failed ${g.default.red("FAIL")}`;n("Configuring Cursor MCP\u2026");let{result:l}=await kt(async()=>o("user"));return l===0?`Cursor: hooks + MCP installed ${g.default.green("OK")}`:`Cursor: hooks installed; MCP setup failed \u2014 run \`npx keepmind cursor mcp\` ${g.default.yellow("!")}`}};case"gemini-cli":return{title:"Gemini CLI: installing hooks",task:async n=>{n("Loading Gemini CLI installer\u2026");let{installGeminiCliHooks:s}=await Promise.resolve().then(()=>(ho(),go));n("Installing Gemini CLI hooks\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("Gemini CLI: hook installation failed",i),`Gemini CLI: hook installation failed ${g.default.red("FAIL")}`):`Gemini CLI: hooks installed ${g.default.green("OK")}`}};case"opencode":return{title:"OpenCode: installing plugin",task:async n=>{n("Loading OpenCode installer\u2026");let{installOpenCodeIntegration:s}=await Promise.resolve().then(()=>(Ro(),Co));n("Installing OpenCode plugin\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("OpenCode: plugin installation failed",i),`OpenCode: plugin installation failed ${g.default.red("FAIL")}`):`OpenCode: plugin installed ${g.default.green("OK")}`}};case"windsurf":return{title:"Windsurf: installing hooks",task:async n=>{n("Loading Windsurf installer\u2026");let{installWindsurfHooks:s}=await Promise.resolve().then(()=>(ko(),Oo));n("Installing Windsurf hooks\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("Windsurf: hook installation failed",i),`Windsurf: hook installation failed ${g.default.red("FAIL")}`):`Windsurf: hooks installed ${g.default.green("OK")}`}};case"codex-cli":return{title:"Codex CLI: registering hooks marketplace",task:async n=>{n("Loading Codex CLI installer\u2026");let{installCodexCli:s}=await Promise.resolve().then(()=>(Wo(),Fo));n("Registering native Codex hooks\u2026");let{result:o,output:i}=await kt(()=>s(ee()));return o!==0?(r("Codex CLI: integration setup failed",i),`Codex CLI: integration setup failed ${g.default.red("FAIL")}`):`Codex CLI: hooks marketplace registered ${g.default.green("OK")}`}};case"copilot-cli":case"antigravity":case"goose":case"roo-code":case"warp":{let o=jt().find(i=>i.id===t)?.label??t;return{title:`${o}: installing MCP integration`,task:async i=>{i("Loading MCP installer\u2026");let{MCP_IDE_INSTALLERS:a}=await Promise.resolve().then(()=>(Nc(),Ac)),l=a[t];if(!l)return`${o}: MCP installer not found ${g.default.yellow("!")}`;i(`Configuring ${o} MCP\u2026`);let{result:c,output:
|
|
1327
|
+
`},n={log:console.log,error:console.error,warn:console.warn};console.log=r,console.error=r,console.warn=r;try{return{result:await t(),output:e}}finally{console.log=n.log,console.error=n.error,console.warn=n.warn}}function jh(){let t=z(xe(),{});t.keepmind={source:{source:"github",repo:"ManuelStaggl/keepmind"},installLocation:ee(),lastUpdated:new Date().toISOString(),autoUpdate:!0},er(Se()),se(xe(),t)}function Gh(t){let e=z(Le(),{});e.version||(e.version=2),e.plugins||(e.plugins={});let r=nt(t),n=new Date().toISOString();e.plugins["keepmind@keepmind"]=[{scope:"user",installPath:r,version:t,installedAt:n,lastUpdated:n}],se(Le(),e)}function Bh(){let t=z(Re(),{});t.enabledPlugins||(t.enabledPlugins={}),t.enabledPlugins["keepmind@keepmind"]=!0,se(Re(),t)}function gu(){let t=z(Re(),{}),e=t.env&&typeof t.env=="object"?t.env:{};return e.CLAUDE_CODE_DISABLE_AUTO_MEMORY==="1"?!1:(t.env={...e,CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1"},se(Re(),t),!0)}async function Hh(t,e){if(!t.includes("claude-code"))return"not-applicable";if(e.disableAutoMemory)return"disable";if(!K)return"leave-enabled";let r=await it({message:"Disable Claude Code auto-memory?",options:[{value:"leave-enabled",label:"Leave enabled",hint:"Recommended; keeps Claude Code native memory visible on startup."},{value:"disable",label:"Disable auto-memory",hint:"Only if you explicitly want keepmind to replace native startup memory."}],initialValue:"leave-enabled"});return X(r)&&(Ie("Installation cancelled."),process.exit(0)),r}function Jh(t,e){let r=(n,s)=>{ce("FAIL_LOUD_PER_IDE",{component:n,ide:t,phase:"ide-install",cause:new Error(n),details:s&&s.trim().length>0?s.trim().slice(0,4e3):void 0},e)};switch(t){case"claude-code":return{title:"Claude Code: registering plugin",task:async()=>`Claude Code: plugin registered ${g.default.green("OK")}`};case"cursor":return{title:"Cursor: installing hooks + MCP",task:async n=>{n("Loading Cursor installer\u2026");let{installCursorHooks:s,configureCursorMcp:o}=await Promise.resolve().then(()=>(Yl(),Xl));n("Installing Cursor hooks\u2026");let{result:i,output:a}=await kt(()=>s("user"));if(i!==0)return r("Cursor: hook installation failed",a),`Cursor: hook installation failed ${g.default.red("FAIL")}`;n("Configuring Cursor MCP\u2026");let{result:l}=await kt(async()=>o("user"));return l===0?`Cursor: hooks + MCP installed ${g.default.green("OK")}`:`Cursor: hooks installed; MCP setup failed \u2014 run \`npx keepmind cursor mcp\` ${g.default.yellow("!")}`}};case"gemini-cli":return{title:"Gemini CLI: installing hooks",task:async n=>{n("Loading Gemini CLI installer\u2026");let{installGeminiCliHooks:s}=await Promise.resolve().then(()=>(ho(),go));n("Installing Gemini CLI hooks\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("Gemini CLI: hook installation failed",i),`Gemini CLI: hook installation failed ${g.default.red("FAIL")}`):`Gemini CLI: hooks installed ${g.default.green("OK")}`}};case"opencode":return{title:"OpenCode: installing plugin",task:async n=>{n("Loading OpenCode installer\u2026");let{installOpenCodeIntegration:s}=await Promise.resolve().then(()=>(Ro(),Co));n("Installing OpenCode plugin\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("OpenCode: plugin installation failed",i),`OpenCode: plugin installation failed ${g.default.red("FAIL")}`):`OpenCode: plugin installed ${g.default.green("OK")}`}};case"windsurf":return{title:"Windsurf: installing hooks",task:async n=>{n("Loading Windsurf installer\u2026");let{installWindsurfHooks:s}=await Promise.resolve().then(()=>(ko(),Oo));n("Installing Windsurf hooks\u2026");let{result:o,output:i}=await kt(()=>s());return o!==0?(r("Windsurf: hook installation failed",i),`Windsurf: hook installation failed ${g.default.red("FAIL")}`):`Windsurf: hooks installed ${g.default.green("OK")}`}};case"codex-cli":return{title:"Codex CLI: registering hooks marketplace",task:async n=>{n("Loading Codex CLI installer\u2026");let{installCodexCli:s}=await Promise.resolve().then(()=>(Wo(),Fo));n("Registering native Codex hooks\u2026");let{result:o,output:i}=await kt(()=>s(ee()));return o!==0?(r("Codex CLI: integration setup failed",i),`Codex CLI: integration setup failed ${g.default.red("FAIL")}`):`Codex CLI: hooks marketplace registered ${g.default.green("OK")}`}};case"copilot-cli":case"antigravity":case"goose":case"roo-code":case"warp":{let o=jt().find(i=>i.id===t)?.label??t;return{title:`${o}: installing MCP integration`,task:async i=>{i("Loading MCP installer\u2026");let{MCP_IDE_INSTALLERS:a}=await Promise.resolve().then(()=>(Nc(),Ac)),l=a[t];if(!l)return`${o}: MCP installer not found ${g.default.yellow("!")}`;i(`Configuring ${o} MCP\u2026`);let{result:c,output:d}=await kt(()=>l());return c!==0?(r(`${o}: MCP integration failed`,d),`${o}: MCP integration failed ${g.default.red("FAIL")}`):`${o}: MCP integration installed ${g.default.green("OK")}`}}}default:{let s=jt().find(o=>o.id===t);return s&&!s.supported?{title:`${s.label}: skipping`,task:async()=>`${s.label}: support coming soon ${g.default.yellow("!")}`}:null}}}async function Kh(t,e){let r=[];for(let n of t){let s=Jh(n,e);s&&r.push(s)}return r.length>0&&await Vn(r),t.length>0&&e.failedIDEs.length===t.length&&ce("ABORT",{component:"all-ides",phase:"ide-install",cause:new Error(`All ${t.length} selected IDE integrations failed.`)},e),e.failedIDEs}function Vh(){let t=mu(),e=process.env.SHELL??"";if(e.includes("fish"))return{path:de(t,".config","fish","config.fish"),shell:"fish"};if(e.includes("zsh"))return{path:de(t,".zshrc"),shell:"zsh"};if(process.platform==="darwin"){let r=de(t,".bash_profile");if(Te(r))return{path:r,shell:"bash"}}return{path:de(t,".bashrc"),shell:"bash"}}function Xh(){let t=mu(),e=de(t,".local","bin"),r=de(e,"claude");if(!Te(r))return;let n=process.env.PATH??"";if(n.split(":").includes(e))return;let{path:o,shell:i}=Vh(),a="$HOME/.local/bin",l=i==="fish"?`set -gx PATH ${e} $PATH`:`export PATH="${a}:$PATH"`,c="";if(Te(o))try{c=Xn(o,"utf-8")}catch(d){k.warn(`Could not read ${o}: ${d instanceof Error?d.message:String(d)}`)}else try{uu(fu(o),{recursive:!0})}catch{}if(c.includes(e)||c.includes(a))k.info(`Claude Code PATH already configured in ${o}`);else try{let m=`${c.length===0||c.endsWith(`
|
|
1328
1328
|
`)?"":`
|
|
1329
1329
|
`}
|
|
1330
1330
|
# Added by keepmind installer for Claude Code
|
|
1331
1331
|
${l}
|
|
1332
|
-
`;pu(o,c+m,"utf-8"),k.success(`Added Claude Code to PATH in ${o}`)}catch(u){k.warn(`Could not update ${o}: ${u instanceof Error?u.message:String(u)}`),k.info(`Run manually: echo '${l}' >> ${o}`);return}process.env.PATH=`${e}:${n}`}async function Yh(){let t=j?'powershell -ExecutionPolicy ByPass -c "irm https://claude.ai/install.ps1 | iex"':"curl -fsSL https://claude.ai/install.sh | bash",e=K?Tt():null;return e?.start("Installing Claude Code (this can take a few minutes \u2014 downloading the native build)\u2026"),new Promise(r=>{let n="",s=He(t,[],{shell:j?process.env.ComSpec??"cmd.exe":"/bin/bash",stdio:e?["inherit","pipe","pipe"]:"inherit"});s.stdout?.on("data",o=>{n+=o.toString()}),s.stderr?.on("data",o=>{n+=o.toString()}),s.on("error",o=>{e?.error("Claude Code install failed"),n&&process.stderr.write(n),k.error(`Claude Code install failed: ${o.message}`),k.info("You can install it manually later: https://claude.ai/install.sh"),r(!1)}),s.on("exit",o=>{if(o!==0){e?.error("Claude Code install failed"),n&&process.stderr.write(n),k.error(`Claude Code install failed (exit ${o??"unknown"})`),k.info("You can install it manually later: https://claude.ai/install.sh"),r(!1);return}if(e?.stop("Claude Code installed"),!j)try{Xh()}catch(i){k.warn(`Could not auto-apply PATH setup: ${i instanceof Error?i.message:String(i)}`)}r(!0)})})}async function qh(){let t=jt(),e=t.find(o=>o.id==="claude-code");if(e&&!e.detected){k.warn("Claude Code is not installed. Claude-mem works best in Claude Code, but also works with the IDEs below.");let o=await it({message:"Install Claude Code now?",options:[{value:"install",label:"Yes \u2014 install Claude Code (recommended)"},{value:"skip",label:"No \u2014 pick another IDE below"},{value:"cancel",label:"Cancel installation"}],initialValue:"install"});(X(o)||o==="cancel")&&(Ie("Installation cancelled."),process.exit(0)),o==="install"&&await Yh()&&(t=jt())}t.filter(o=>o.detected).length===0&&k.warn("No supported IDEs detected \u2014 pick the one(s) you plan to use.");let n=t.map(o=>{let i=o.detected?" [detected]":"",a=o.supported?`${o.hint}${i}`:`coming soon${i}`;return{value:o.id,label:o.label,hint:a}}),s=await oa({message:"Which IDEs do you use?",options:n,initialValues:[],required:!0});return X(s)&&(Ie("Installation cancelled."),process.exit(0)),s}function hu(){let t=ee(),e=Hr();er(t);let r=[".agents",".codex-plugin","plugin","package.json","package-lock.json","dist","LICENSE","README.md","CHANGELOG.md"];for(let n of r){let s=de(e,n),o=de(t,n);Te(s)&&(Te(o)&&du(o,{recursive:!0,force:!0}),cu(s,o,{recursive:!0,force:!0}))}}function Eu(t){let e=ss(),r=nt(t);du(r,{recursive:!0,force:!0}),er(r),cu(e,r,{recursive:!0,force:!0})}async function zh(t){let e=ee(),r=de(e,"package.json");if(!Te(r))return;let n=["install","--omit=dev","--ignore-scripts"],s=await $s(e,n);if(s.code===0)return;s.timedOut&&ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error("npm install timed out"),details:s.stderr.slice(0,4e3)},t),Sl(s.stderr)||ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error(`npm install failed (exit ${s.code})`),details:s.stderr.slice(0,4e3)},t),k.warn("npm reported an ERESOLVE peer-dependency conflict in marketplace deps; retrying once with --legacy-peer-deps."),k.warn(bl(s.stderr));let o=await $s(e,[...n,"--legacy-peer-deps"]);if(o.code===0){t.warnings.push({component:"marketplace-npm-install",message:"tree-sitter peer-dep ERESOLVE was resolved with the --legacy-peer-deps fallback. Benign for the marketplace install; re-evaluate when tree-sitter peer ranges change.",remediation:"No action required."});return}ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error(`npm install --legacy-peer-deps still failed (exit ${o.code}): ERESOLVE`),details:o.stderr.slice(0,4e3)},t)}function $e(t){let e=Je;try{let r={};if(Te(e))try{let n=Xn(e,"utf-8"),s=JSON.parse(n);s&&typeof s=="object"&&s.env&&typeof s.env=="object"?r={...s.env}:s&&typeof s=="object"&&(r={...s})}catch(n){console.warn("[install] Failed to parse existing settings.json, starting from empty:",n instanceof Error?n.message:String(n)),r={}}else{let n=fu(e);Te(n)||uu(n,{recursive:!0})}for(let[n,s]of Object.entries(t))r[n]=s;return pu(e,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return k.error(`Failed to write settings to ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function Zh(){try{if(!Te(Je))return;let t=JSON.parse(Xn(Je,"utf-8")),r=(t.env&&typeof t.env=="object"?t.env:t).CLAUDE_MEM_CLAUDE_AUTH_METHOD;return r==="subscription"||r==="api-key"||r==="gateway"?r:void 0}catch{return}}function di(){let t=Zh();if(t)return t;let e=ur();return e.ANTHROPIC_BASE_URL?.trim()?"gateway":e.ANTHROPIC_API_KEY?.trim()?"api-key":"subscription"}async function Qh(t){return t.runtime!==void 0&&t.runtime!=="worker"&&k.warn(`The "${t.runtime}" runtime was removed in this local-only build \u2014 using the worker runtime instead.`),$e({CLAUDE_MEM_RUNTIME:"worker"}),"worker"}async function $h(t){let e=zt("CLAUDE_MEM_PROVIDER")||"claude",r=h=>{let b=h??di();$e({CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:b})&&k.info("Saved Claude Agent SDK configuration to ~/.keepmind/settings.json")},n=()=>{r("subscription"),dr({ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),k.info("Configured keepmind to use your logged-in Claude SDK account.")},s=async()=>{let h=ur().ANTHROPIC_API_KEY||"";if(h.trim().length>0){let y=await it({message:"An Anthropic API key is already configured. Keep it or enter a new one?",options:[{value:"keep",label:"Keep existing key"},{value:"replace",label:"Enter a new key (rotate)"}],initialValue:"keep"});if(X(y)){k.warn("API key prompt cancelled \u2014 leaving existing configuration untouched.");return}if(y==="keep"){dr({ANTHROPIC_API_KEY:h.trim(),ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),r("api-key");return}}let b=await $r({message:"Paste your Anthropic API key:",mask:"*",validate:y=>!y||y.trim().length===0?"API key required":void 0});if(X(b)){k.warn("API key prompt cancelled \u2014 leaving existing configuration untouched.");return}dr({ANTHROPIC_API_KEY:String(b).trim(),ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),r("api-key"),k.info("Saved Anthropic API key for the Claude Agent SDK path.")},o=async()=>{let h=ur(),b=await Ts({message:"Gateway URL:",placeholder:h.ANTHROPIC_BASE_URL||"http://localhost:4000",defaultValue:h.ANTHROPIC_BASE_URL||"",validate:R=>{let T=R?.trim()??"";if(!T)return"Gateway URL required";try{new URL(T);return}catch{return"Enter a valid URL, for example http://localhost:4000"}}});if(X(b)){k.warn("Gateway setup cancelled \u2014 leaving existing configuration untouched.");return}let y=await $r({message:"Gateway key/token (leave blank to keep current token, or type a new one):",mask:"*"}),C=X(y),A=C?"":String(y).trim(),D={ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:String(b).trim()};!C&&A.length>0&&(D.ANTHROPIC_AUTH_TOKEN=A),dr(D),r("gateway"),C||A.length===0?k.info("Gateway URL saved; existing gateway token preserved."):k.info("Configured Claude Agent SDK gateway in ~/.keepmind/.env.")};if(!K)return t.provider?t.provider==="claude"?(r(),"claude"):($e({CLAUDE_MEM_PROVIDER:t.provider})&&k.info(`Saved provider=${t.provider} to ~/.keepmind/settings.json`),k.warn(`Provider=${t.provider} requested non-interactively. API key prompt skipped \u2014 set CLAUDE_MEM_${t.provider.toUpperCase()}_API_KEY and CLAUDE_MEM_PROVIDER in settings.json or env manually if not already set.`),t.provider):e;let i=async()=>{let h=di(),y=await it({message:"Do you use a subscription plan or an API key/gateway for the memory agent?",options:[{value:"subscription",label:"Subscription plan (recommended \u2014 uses your logged-in Claude SDK account)"},{value:"api-key",label:"API key or gateway (Anthropic, LiteLLM, or compatible proxy)"}],initialValue:h==="subscription"?"subscription":"api-key"});if(X(y)&&(Ie("Installation cancelled."),process.exit(0)),y==="subscription"){n();return}let C=await it({message:"How should keepmind connect?",options:[{value:"direct",label:"Anthropic API key"},{value:"gateway",label:"LiteLLM or custom gateway"}],initialValue:h==="gateway"||ur().ANTHROPIC_BASE_URL?"gateway":"direct"});X(C)&&(Ie("Installation cancelled."),process.exit(0)),C==="gateway"?await o():await s()},a;if(t.provider)a=t.provider;else{let h=await it({message:"Which memory provider do you want to use?",options:[{value:"claude",label:"Claude Agent SDK (recommended)"},{value:"gemini",label:"Gemini"},{value:"openrouter",label:"OpenRouter"}],initialValue:e});X(h)&&(Ie("Installation cancelled."),process.exit(0)),a=h}if(a==="claude")return await i(),"claude";let l=a==="gemini"?"Gemini":"OpenRouter",c=a==="gemini"?"CLAUDE_MEM_GEMINI_API_KEY":"CLAUDE_MEM_OPENROUTER_API_KEY",u=zt(c);if(u&&u.trim().length>0)return $e({CLAUDE_MEM_PROVIDER:a})&&k.info(`Saved provider=${a} to ~/.keepmind/settings.json`),a;let m=await $r({message:`Paste your ${l} API key:`,mask:"*",validate:h=>!h||h.trim().length===0?"API key required":void 0});if(X(m))return k.warn("API key prompt cancelled \u2014 falling back to Claude provider."),r(),"claude";let f=String(m).trim();return $e({CLAUDE_MEM_PROVIDER:a,[c]:f})&&k.info(`Saved provider=${a} to ~/.keepmind/settings.json`),a}async function eE(t){let e=new Set(["claude-haiku-4-5-20251001","claude-sonnet-4-6","claude-opus-4-7"]),r=di()==="gateway";if(t.model&&!r){if(!e.has(t.model))throw new Error(`Unknown Claude model: ${t.model}. Allowed: ${[...e].join(", ")}`);$e({CLAUDE_MEM_MODEL:t.model})&&k.info(`Saved Claude model=${t.model} to ~/.keepmind/settings.json`);return}if(t.model&&r){$e({CLAUDE_MEM_MODEL:t.model})&&k.info(`Saved gateway model=${t.model} to ~/.keepmind/settings.json`);return}if(!K)return;let n=zt("CLAUDE_MEM_MODEL");if(r){let l=await Ts({message:"Which model should the gateway use?",placeholder:"claude-haiku-4-5-20251001",defaultValue:n||"claude-haiku-4-5-20251001",validate:m=>!m||m.trim().length===0?"Model required":void 0});X(l)&&(Ie("Installation cancelled."),process.exit(0));let c=String(l).trim();$e({CLAUDE_MEM_MODEL:c})&&k.info(`Saved gateway model=${c} to ~/.keepmind/settings.json`);return}let s=e.has(n)?n:"claude-haiku-4-5-20251001",o=await it({message:`Which Claude model should keepmind use to compress observations?
|
|
1332
|
+
`;pu(o,c+m,"utf-8"),k.success(`Added Claude Code to PATH in ${o}`)}catch(d){k.warn(`Could not update ${o}: ${d instanceof Error?d.message:String(d)}`),k.info(`Run manually: echo '${l}' >> ${o}`);return}process.env.PATH=`${e}:${n}`}async function Yh(){let t=j?'powershell -ExecutionPolicy ByPass -c "irm https://claude.ai/install.ps1 | iex"':"curl -fsSL https://claude.ai/install.sh | bash",e=K?Tt():null;return e?.start("Installing Claude Code (this can take a few minutes \u2014 downloading the native build)\u2026"),new Promise(r=>{let n="",s=He(t,[],{shell:j?process.env.ComSpec??"cmd.exe":"/bin/bash",stdio:e?["inherit","pipe","pipe"]:"inherit"});s.stdout?.on("data",o=>{n+=o.toString()}),s.stderr?.on("data",o=>{n+=o.toString()}),s.on("error",o=>{e?.error("Claude Code install failed"),n&&process.stderr.write(n),k.error(`Claude Code install failed: ${o.message}`),k.info("You can install it manually later: https://claude.ai/install.sh"),r(!1)}),s.on("exit",o=>{if(o!==0){e?.error("Claude Code install failed"),n&&process.stderr.write(n),k.error(`Claude Code install failed (exit ${o??"unknown"})`),k.info("You can install it manually later: https://claude.ai/install.sh"),r(!1);return}if(e?.stop("Claude Code installed"),!j)try{Xh()}catch(i){k.warn(`Could not auto-apply PATH setup: ${i instanceof Error?i.message:String(i)}`)}r(!0)})})}async function qh(){let t=jt(),e=t.find(o=>o.id==="claude-code");if(e&&!e.detected){k.warn("Claude Code is not installed. Claude-mem works best in Claude Code, but also works with the IDEs below.");let o=await it({message:"Install Claude Code now?",options:[{value:"install",label:"Yes \u2014 install Claude Code (recommended)"},{value:"skip",label:"No \u2014 pick another IDE below"},{value:"cancel",label:"Cancel installation"}],initialValue:"install"});(X(o)||o==="cancel")&&(Ie("Installation cancelled."),process.exit(0)),o==="install"&&await Yh()&&(t=jt())}t.filter(o=>o.detected).length===0&&k.warn("No supported IDEs detected \u2014 pick the one(s) you plan to use.");let n=t.map(o=>{let i=o.detected?" [detected]":"",a=o.supported?`${o.hint}${i}`:`coming soon${i}`;return{value:o.id,label:o.label,hint:a}}),s=await oa({message:"Which IDEs do you use?",options:n,initialValues:[],required:!0});return X(s)&&(Ie("Installation cancelled."),process.exit(0)),s}function hu(){let t=ee(),e=Hr();er(t);let r=[".agents",".codex-plugin","plugin","package.json","package-lock.json","dist","LICENSE","README.md","CHANGELOG.md"];for(let n of r){let s=de(e,n),o=de(t,n);Te(s)&&(Te(o)&&du(o,{recursive:!0,force:!0}),cu(s,o,{recursive:!0,force:!0}))}}function Eu(t){let e=ss(),r=nt(t);du(r,{recursive:!0,force:!0}),er(r),cu(e,r,{recursive:!0,force:!0})}async function zh(t){let e=ee(),r=de(e,"package.json");if(!Te(r))return;let n=["install","--omit=dev","--ignore-scripts"],s=await $s(e,n);if(s.code===0)return;s.timedOut&&ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error("npm install timed out"),details:s.stderr.slice(0,4e3)},t),Sl(s.stderr)||ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error(`npm install failed (exit ${s.code})`),details:s.stderr.slice(0,4e3)},t),k.warn("npm reported an ERESOLVE peer-dependency conflict in marketplace deps; retrying once with --legacy-peer-deps."),k.warn(bl(s.stderr));let o=await $s(e,[...n,"--legacy-peer-deps"]);if(o.code===0){t.warnings.push({component:"marketplace-npm-install",message:"tree-sitter peer-dep ERESOLVE was resolved with the --legacy-peer-deps fallback. Benign for the marketplace install; re-evaluate when tree-sitter peer ranges change.",remediation:"No action required."});return}ce("ABORT",{component:"marketplace-npm-install",phase:"marketplace-deps",cause:new Error(`npm install --legacy-peer-deps still failed (exit ${o.code}): ERESOLVE`),details:o.stderr.slice(0,4e3)},t)}function $e(t){let e=Je;try{let r={};if(Te(e))try{let n=Xn(e,"utf-8"),s=JSON.parse(n);s&&typeof s=="object"&&s.env&&typeof s.env=="object"?r={...s.env}:s&&typeof s=="object"&&(r={...s})}catch(n){console.warn("[install] Failed to parse existing settings.json, starting from empty:",n instanceof Error?n.message:String(n)),r={}}else{let n=fu(e);Te(n)||uu(n,{recursive:!0})}for(let[n,s]of Object.entries(t))r[n]=s;return pu(e,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return k.error(`Failed to write settings to ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function Zh(){try{if(!Te(Je))return;let t=JSON.parse(Xn(Je,"utf-8")),r=(t.env&&typeof t.env=="object"?t.env:t).CLAUDE_MEM_CLAUDE_AUTH_METHOD;return r==="subscription"||r==="api-key"||r==="gateway"?r:void 0}catch{return}}function di(){let t=Zh();if(t)return t;let e=ur();return e.ANTHROPIC_BASE_URL?.trim()?"gateway":e.ANTHROPIC_API_KEY?.trim()?"api-key":"subscription"}async function Qh(t){return t.runtime!==void 0&&t.runtime!=="worker"&&k.warn(`The "${t.runtime}" runtime was removed in this local-only build \u2014 using the worker runtime instead.`),$e({CLAUDE_MEM_RUNTIME:"worker"}),"worker"}async function $h(t){let e=zt("CLAUDE_MEM_PROVIDER")||"claude",r=h=>{let b=h??di();$e({CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:b})&&k.info("Saved Claude Agent SDK configuration to ~/.keepmind/settings.json")},n=()=>{r("subscription"),dr({ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),k.info("Configured keepmind to use your logged-in Claude SDK account.")},s=async()=>{let h=ur().ANTHROPIC_API_KEY||"";if(h.trim().length>0){let y=await it({message:"An Anthropic API key is already configured. Keep it or enter a new one?",options:[{value:"keep",label:"Keep existing key"},{value:"replace",label:"Enter a new key (rotate)"}],initialValue:"keep"});if(X(y)){k.warn("API key prompt cancelled \u2014 leaving existing configuration untouched.");return}if(y==="keep"){dr({ANTHROPIC_API_KEY:h.trim(),ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),r("api-key");return}}let b=await $r({message:"Paste your Anthropic API key:",mask:"*",validate:y=>!y||y.trim().length===0?"API key required":void 0});if(X(b)){k.warn("API key prompt cancelled \u2014 leaving existing configuration untouched.");return}dr({ANTHROPIC_API_KEY:String(b).trim(),ANTHROPIC_BASE_URL:"",ANTHROPIC_AUTH_TOKEN:""}),r("api-key"),k.info("Saved Anthropic API key for the Claude Agent SDK path.")},o=async()=>{let h=ur(),b=await Ts({message:"Gateway URL:",placeholder:h.ANTHROPIC_BASE_URL||"http://localhost:4000",defaultValue:h.ANTHROPIC_BASE_URL||"",validate:R=>{let T=R?.trim()??"";if(!T)return"Gateway URL required";try{new URL(T);return}catch{return"Enter a valid URL, for example http://localhost:4000"}}});if(X(b)){k.warn("Gateway setup cancelled \u2014 leaving existing configuration untouched.");return}let y=await $r({message:"Gateway key/token (leave blank to keep current token, or type a new one):",mask:"*"}),C=X(y),A=C?"":String(y).trim(),D={ANTHROPIC_API_KEY:"",ANTHROPIC_BASE_URL:String(b).trim()};!C&&A.length>0&&(D.ANTHROPIC_AUTH_TOKEN=A),dr(D),r("gateway"),C||A.length===0?k.info("Gateway URL saved; existing gateway token preserved."):k.info("Configured Claude Agent SDK gateway in ~/.keepmind/.env.")};if(!K)return t.provider?t.provider==="claude"?(r(),"claude"):($e({CLAUDE_MEM_PROVIDER:t.provider})&&k.info(`Saved provider=${t.provider} to ~/.keepmind/settings.json`),k.warn(`Provider=${t.provider} requested non-interactively. API key prompt skipped \u2014 set CLAUDE_MEM_${t.provider.toUpperCase()}_API_KEY and CLAUDE_MEM_PROVIDER in settings.json or env manually if not already set.`),t.provider):e;let i=async()=>{let h=di(),y=await it({message:"Do you use a subscription plan or an API key/gateway for the memory agent?",options:[{value:"subscription",label:"Subscription plan (recommended \u2014 uses your logged-in Claude SDK account)"},{value:"api-key",label:"API key or gateway (Anthropic, LiteLLM, or compatible proxy)"}],initialValue:h==="subscription"?"subscription":"api-key"});if(X(y)&&(Ie("Installation cancelled."),process.exit(0)),y==="subscription"){n();return}let C=await it({message:"How should keepmind connect?",options:[{value:"direct",label:"Anthropic API key"},{value:"gateway",label:"LiteLLM or custom gateway"}],initialValue:h==="gateway"||ur().ANTHROPIC_BASE_URL?"gateway":"direct"});X(C)&&(Ie("Installation cancelled."),process.exit(0)),C==="gateway"?await o():await s()},a;if(t.provider)a=t.provider;else{let h=await it({message:"Which memory provider do you want to use?",options:[{value:"claude",label:"Claude Agent SDK (recommended)"},{value:"gemini",label:"Gemini"},{value:"openrouter",label:"OpenRouter"}],initialValue:e});X(h)&&(Ie("Installation cancelled."),process.exit(0)),a=h}if(a==="claude")return await i(),"claude";let l=a==="gemini"?"Gemini":"OpenRouter",c=a==="gemini"?"CLAUDE_MEM_GEMINI_API_KEY":"CLAUDE_MEM_OPENROUTER_API_KEY",d=zt(c);if(d&&d.trim().length>0)return $e({CLAUDE_MEM_PROVIDER:a})&&k.info(`Saved provider=${a} to ~/.keepmind/settings.json`),a;let m=await $r({message:`Paste your ${l} API key:`,mask:"*",validate:h=>!h||h.trim().length===0?"API key required":void 0});if(X(m))return k.warn("API key prompt cancelled \u2014 falling back to Claude provider."),r(),"claude";let f=String(m).trim();return $e({CLAUDE_MEM_PROVIDER:a,[c]:f})&&k.info(`Saved provider=${a} to ~/.keepmind/settings.json`),a}async function eE(t){let e=new Set(["claude-haiku-4-5-20251001","claude-sonnet-4-6","claude-opus-4-7"]),r=di()==="gateway";if(t.model&&!r){if(!e.has(t.model))throw new Error(`Unknown Claude model: ${t.model}. Allowed: ${[...e].join(", ")}`);$e({CLAUDE_MEM_MODEL:t.model})&&k.info(`Saved Claude model=${t.model} to ~/.keepmind/settings.json`);return}if(t.model&&r){$e({CLAUDE_MEM_MODEL:t.model})&&k.info(`Saved gateway model=${t.model} to ~/.keepmind/settings.json`);return}if(!K)return;let n=zt("CLAUDE_MEM_MODEL");if(r){let l=await Ts({message:"Which model should the gateway use?",placeholder:"claude-haiku-4-5-20251001",defaultValue:n||"claude-haiku-4-5-20251001",validate:m=>!m||m.trim().length===0?"Model required":void 0});X(l)&&(Ie("Installation cancelled."),process.exit(0));let c=String(l).trim();$e({CLAUDE_MEM_MODEL:c})&&k.info(`Saved gateway model=${c} to ~/.keepmind/settings.json`);return}let s=e.has(n)?n:"claude-haiku-4-5-20251001",o=await it({message:`Which Claude model should keepmind use to compress observations?
|
|
1333
1333
|
This runs whenever you and Claude touch a file \u2014 keep it cheap and fast.`,options:[{value:"claude-haiku-4-5-20251001",label:"Haiku 4.5 (recommended \u2014 fast, cheap, great for compression)"},{value:"claude-sonnet-4-6",label:"Sonnet 4.6 (balanced quality and cost)"},{value:"claude-opus-4-7",label:"Opus 4.7 (highest quality, most expensive)"}],initialValue:s});X(o)&&(Ie("Installation cancelled."),process.exit(0));let i=o;$e({CLAUDE_MEM_MODEL:i})&&k.info(`Saved Claude model=${i} to ~/.keepmind/settings.json`)}async function tE(){let{detectClaudeMem:t,verifyMigrated:e,purgeClaudeMem:r}=await Promise.resolve().then(()=>(si(),ni)),{performMigration:n}=await Promise.resolve().then(()=>(Hn(),ri)),s=t();if(!s.hasData)return;let o=s.counts,i=o?`${o.observations} observations \xB7 ${o.sessions} sessions \xB7 ${o.summaries} summaries`:"an existing database";Dt(`Found claude-mem at ${s.dataDir}
|
|
1334
|
-
${i}`,"claude-mem detected");let a=await yt({message:"Migrate these claude-mem memories into keepmind now?"});if(X(a)||!a)return;let l=Tt();l.start("Migrating claude-mem memories\u2026");try{let E=await n(s.dbPath,{});l.stop(`Migrated ${E.after.observations} observations \xB7 ${E.after.sessions} sessions (${E.mode}).`)}catch(E){l.stop("Migration failed."),H.error(`Migration failed: ${E instanceof Error?E.message:String(E)}`);return}H.info("Vectors rebuild automatically on the next worker start (semantic search).");let c=e(s.dbPath);if(c.missing>0){H.warn(`Keeping claude-mem: ${c.missing} of ${c.total} observations are not yet in keepmind.`);return}let
|
|
1335
|
-
${n}`),console.error(` ${r.remediation}`),console.error(` ${r.message}`)),process.exit(1)}throw r}}async function nE(t,e){let r=xt(),n,s;K?(await hl(),or(g.default.bgCyan(g.default.black(" keepmind install ")))):console.log("keepmind install");let o=ee(),i=Te(de(o,"plugin",".claude-plugin","plugin.json")),a;if(i)try{a=JSON.parse(Xn(de(o,"plugin",".claude-plugin","plugin.json"),"utf-8")).version??void 0}catch(w){console.warn("[install] Failed to read existing plugin version:",w instanceof Error?w.message:String(w))}let l=g.default.dim("\xB7"),c=[`${g.default.bold("keepmind")} ${g.default.cyan(`v${r}`)}`];if(a&&a!==r?c.push(`installed ${g.default.yellow(`v${a}`)}`):a&&c.push(g.default.dim("reinstall")),k.info(c.join(` ${l} `)),i&&process.stdin.isTTY){let w=await yt({message:"Overwrite existing installation?",initialValue:!0});(X(w)||!w)&&(Ie("Installation cancelled."),process.exit(0))}let
|
|
1334
|
+
${i}`,"claude-mem detected");let a=await yt({message:"Migrate these claude-mem memories into keepmind now?"});if(X(a)||!a)return;let l=Tt();l.start("Migrating claude-mem memories\u2026");try{let E=await n(s.dbPath,{});l.stop(`Migrated ${E.after.observations} observations \xB7 ${E.after.sessions} sessions (${E.mode}).`)}catch(E){l.stop("Migration failed."),H.error(`Migration failed: ${E instanceof Error?E.message:String(E)}`);return}H.info("Vectors rebuild automatically on the next worker start (semantic search).");let c=e(s.dbPath);if(c.missing>0){H.warn(`Keeping claude-mem: ${c.missing} of ${c.total} observations are not yet in keepmind.`);return}let d=c.unhashable>0?` (${c.unhashable} legacy rows without a hash were copied but can't be hash-verified)`:"",m=await yt({message:`Remove claude-mem entirely now? Its ${c.total} observations are safely in keepmind${d} (a backup is archived first).`,initialValue:!1});if(X(m)||!m)return;let f=Tt();f.start("Removing claude-mem\u2026");try{let E=await r({timestamp:new Date().toISOString(),presence:s}),h=[];E.dataDirRemoved&&h.push("data removed"),(E.marketplacesRemoved.length||E.pluginsRemoved.length)&&h.push("plugin deregistered"),E.processesKilled&&h.push(`${E.processesKilled} process(es) stopped`),E.archivePath&&h.push(`backup: ${E.archivePath}`),f.stop(`claude-mem removed${h.length?` (${h.join(", ")})`:""}.`),E.errors.length&&H.warn(`Some cleanup steps had issues: ${E.errors.join("; ")}`)}catch(E){f.stop("claude-mem removal encountered an error."),H.warn(`Removal error: ${E instanceof Error?E.message:String(E)}`)}}async function rE(t={}){let e=Qa();try{await nE(t,e)}catch(r){if(r instanceof Er){Hs(e,s=>K?H.message(s):console.error(` ${s}`));let n=`Installation Aborted: ${r.category.id}`;K?(H.error(n),H.error(r.remediation),Be(g.default.red("keepmind installation aborted."))):(console.error(`
|
|
1335
|
+
${n}`),console.error(` ${r.remediation}`),console.error(` ${r.message}`)),process.exit(1)}throw r}}async function nE(t,e){let r=xt(),n,s;K?(await hl(),or(g.default.bgCyan(g.default.black(" keepmind install ")))):console.log("keepmind install");let o=ee(),i=Te(de(o,"plugin",".claude-plugin","plugin.json")),a;if(i)try{a=JSON.parse(Xn(de(o,"plugin",".claude-plugin","plugin.json"),"utf-8")).version??void 0}catch(w){console.warn("[install] Failed to read existing plugin version:",w instanceof Error?w.message:String(w))}let l=g.default.dim("\xB7"),c=[`${g.default.bold("keepmind")} ${g.default.cyan(`v${r}`)}`];if(a&&a!==r?c.push(`installed ${g.default.yellow(`v${a}`)}`):a&&c.push(g.default.dim("reinstall")),k.info(c.join(` ${l} `)),i&&process.stdin.isTTY){let w=await yt({message:"Overwrite existing installation?",initialValue:!0});(X(w)||!w)&&(Ie("Installation cancelled."),process.exit(0))}let d;if(t.ide){d=[t.ide];let w=jt(),N=w.find(L=>L.id===t.ide);N&&!N.supported&&(k.error(`Support for ${N.label} coming soon.`),process.exit(1)),N||(k.error(`Unknown IDE: ${t.ide}`),k.info(`Available IDEs: ${w.map(L=>L.id).join(", ")}`),process.exit(1))}else process.stdin.isTTY?d=await qh():d=["claude-code"];K&&await tE();let m=await Qh(t);await $h(t)==="claude"&&await eE(t);let E="dead",h=d.length>0;{if(h){let N=zt("CLAUDE_MEM_WORKER_PORT"),L=K?Tt():null;L?.start("Stopping running worker (so we can overwrite cleanly)\u2026");try{let $=await fn(N,1e4);L?L.stop($.workerWasRunning?"Stopped running worker before overwrite.":"No worker running \u2014 proceeding."):$.workerWasRunning&&k.info("Stopped running worker before overwrite.")}catch($){let Ce=$ instanceof Error?$.message:String($);L?L.error(`Pre-overwrite worker shutdown failed: ${Ce}`):console.warn("[install] Pre-overwrite worker shutdown failed:",Ce)}}let w=[{title:"Caching plugin version",task:async N=>(N(`Caching v${r}...`),Eu(r),`Plugin cached (v${r}) ${g.default.green("OK")}`)},{title:"Registering marketplace",task:async()=>(jh(),`Marketplace registered ${g.default.green("OK")}`)},{title:"Registering plugin",task:async()=>(Gh(r),`Plugin registered ${g.default.green("OK")}`)},{title:"Enabling plugin in Claude settings",task:async()=>(Bh(),`Plugin enabled ${g.default.green("OK")}`)},{title:"Setting up runtime (first install can take ~30s)",task:async N=>{N("Checking Bun\u2026");let{version:L}=await It(e);N("Checking uv\u2026");let{version:$}=await zs(e);n=L,s=$;let Ce=nt(r);if(!cl(Ce,r)){let{bunPath:Qn}=await It(),Pu=ui(N,"Installing plugin dependencies (bun install)\u2026");try{await br(Ce,Qn)}finally{Pu()}Zs(Ce,r,L,$)}return`Runtime ready (Bun ${L}, uv ${$}) ${g.default.green("OK")}`}}];h&&(w.unshift({title:"Copying plugin files to marketplace",task:async N=>(N("Copying to marketplace directory..."),hu(),`Plugin files copied ${g.default.green("OK")}`)}),w.push({title:"Installing marketplace dependencies",task:async N=>{let{bunPath:L}=await It(),$=ui(N,"Installing plugin dependencies (bun install)\u2026");try{await br(de(ee(),"plugin"),L)}finally{$()}let Ce=ui(N,"Running npm install\u2026");try{await zh(e)}finally{Ce()}return`Dependencies installed ${g.default.green("OK")}`}})),await Vn(w)}let b=await Kh(d,e),y=null,C=await Hh(d,t);if(C==="disable")try{let w=gu();y=w?"disabled":"already-disabled",w?k.success("Claude Code: auto-memory disabled (CLAUDE_CODE_DISABLE_AUTO_MEMORY=1)."):k.info("Claude Code: auto-memory already disabled, leaving settings.json untouched.")}catch(w){y="failed",ce("WARN_CONTINUE",{component:"auto-memory",phase:"post-ide",cause:w},e)}else C==="leave-enabled"&&(y="left-enabled",k.info("Claude Code: leaving native auto-memory enabled unless you explicitly opt in to disabling it."));let A=!K||t.noAutoStart||m==="server";await Vn([{title:m==="server"?"Starting server daemon":"Starting worker daemon",task:async w=>{if(m==="server")return`Server runtime selected \u2014 start it with ${g.default.bold("npx keepmind server start")} ${g.default.dim("(or via Docker compose)")}`;if(A)return K?"Skipped (--no-auto-start)":"Skipped (non-TTY)";let N=Number(zt("CLAUDE_MEM_WORKER_PORT")),L=de(ee(),"plugin","scripts","worker-service.cjs"),$=de(nt(r),"scripts","worker-service.cjs"),Ce=Te(L)?L:$;switch(w(`Spawning worker on port ${N}...`),E=await Ya(N,Ce),E){case"ready":return`Worker ready at http://localhost:${N} ${g.default.green("OK")}`;case"warming":return`Worker starting on port ${N} \u2014 finishing in background ${g.default.yellow("\u23F3")}`;case"dead":return`Worker did not start \u2014 try \`npx keepmind start\` manually ${g.default.yellow("!")}`}}}]);let R=e.failedIDEs.length>0?"Installation Partial":"Installation Complete",T=[`Version: ${g.default.cyan(r)}`,`Plugin dir: ${g.default.cyan(o)}`,`IDEs: ${g.default.cyan(d.join(", "))}`];y==="disabled"?T.push(`Auto-memory: ${g.default.cyan("disabled")} (CLAUDE_CODE_DISABLE_AUTO_MEMORY=1)`):y==="already-disabled"?T.push(`Auto-memory: ${g.default.cyan("already disabled")} (CLAUDE_CODE_DISABLE_AUTO_MEMORY=1)`):y==="left-enabled"?T.push(`Auto-memory: ${g.default.cyan("left enabled")} (native Claude Code memory preserved)`):y==="failed"&&T.push(`Auto-memory: ${g.default.red("write failed")} (see warning above)`),b.length>0&&T.push(`Failed: ${g.default.red(b.join(", "))}`),K?Dt(T.join(`
|
|
1336
1336
|
`),R):(console.log(`
|
|
1337
1337
|
${R}`),T.forEach(w=>console.log(` ${w}`))),Hs(e,w=>K?H.message(w):console.log(` ${w}`));let v=zt("CLAUDE_MEM_WORKER_PORT"),I=v,Y=!1;if(!A){let w=K?Tt():null;w?.start(`Verifying worker on port ${v}\u2026`);try{let N=await fetch(`http://127.0.0.1:${v}/api/health`,{signal:AbortSignal.timeout(3e3)});if(N.ok){Y=!0;try{let L=await N.json();L&&(typeof L.port=="number"||typeof L.port=="string")&&(I=L.port)}catch{}}w?.stop(Y?`Worker ready at http://localhost:${I}`:`Worker reachable but not ready on port ${v}`)}catch{w?.stop(`Worker not yet responding on port ${v} (still starting)`)}}let Z=E,ve=Z!=="dead"||Y,Q=m==="server"?"Server":"Worker",Mt=m==="server"?"npx keepmind server start":"npx keepmind start",tt=A?`${g.default.yellow("!")} ${Q} autostart skipped \u2014 start it manually with ${g.default.bold(Mt)}`:Y||Z==="ready"?`${g.default.green("\u2713")} ${Q} running at ${g.default.underline(`http://localhost:${I}`)}`:`${g.default.yellow("\u23F3")} ${Q} starting at ${g.default.underline(`http://localhost:${I}`)} \u2014 give it ~30s, then refresh`,G=A?[tt,"",`${g.default.bold("First success:")} once the worker is running, keep ${g.default.underline(`http://localhost:${v}`)} open in a browser, then open Claude Code in any project. Observations stream in as Claude reads, edits, and runs commands.`,"",`${g.default.bold("Two paths from here:")}`,` ${g.default.cyan("A.")} Just start working. Memory builds passively from your first prompt. (Recommended.)`,` ${g.default.cyan("B.")} Front-load it: open Claude Code and run ${g.default.bold("/learn-codebase")} to ingest the whole repo (~5 min, optional).`,"","Memory injection starts on your second session in a project.",`Everything stays in ${g.default.cyan("~/.keepmind")} on this machine.`,"",`${g.default.dim("How it works: /how-it-works \xB7 Disable first-session hint: CLAUDE_MEM_WELCOME_HINT_ENABLED=false")}`,`${g.default.dim("Note: close all Claude Code sessions before uninstalling, or ~/.keepmind will be recreated by active hooks.")}`]:ve?[tt,"",`${g.default.bold("First success:")} keep that URL open in a browser, then open Claude Code in any project. Observations stream in as Claude reads, edits, and runs commands.`,"",`${g.default.bold("Two paths from here:")}`,` ${g.default.cyan("A.")} Just start working. Memory builds passively from your first prompt. (Recommended.)`,` ${g.default.cyan("B.")} Front-load it: open Claude Code and run ${g.default.bold("/learn-codebase")} to ingest the whole repo (~5 min, optional).`,"","Memory injection starts on your second session in a project.",`Everything stays in ${g.default.cyan("~/.keepmind")} on this machine.`,"",`${g.default.dim("How it works: /how-it-works \xB7 Disable first-session hint: CLAUDE_MEM_WELCOME_HINT_ENABLED=false")}`,`${g.default.dim("Note: close all Claude Code sessions before uninstalling, or ~/.keepmind will be recreated by active hooks.")}`]:[`${g.default.yellow("!")} Worker not yet ready on port ${g.default.cyan(String(v))} -- still starting up; check ${g.default.bold("keepmind status")} later, or start manually: ${g.default.bold("npx keepmind start")}`,"",`${g.default.bold("First success:")} keep ${g.default.underline(`http://localhost:${v}`)} open in a browser, then open Claude Code in any project. Observations stream in as Claude reads, edits, and runs commands.`,"",`${g.default.bold("Two paths from here:")}`,` ${g.default.cyan("A.")} Just start working. Memory builds passively from your first prompt. (Recommended.)`,` ${g.default.cyan("B.")} Front-load it: open Claude Code and run ${g.default.bold("/learn-codebase")} to ingest the whole repo (~5 min, optional).`,"","Memory injection starts on your second session in a project.",`Everything stays in ${g.default.cyan("~/.keepmind")} on this machine.`,"",`${g.default.dim("How it works: /how-it-works \xB7 Disable first-session hint: CLAUDE_MEM_WELCOME_HINT_ENABLED=false")}`,`${g.default.dim("Note: close all Claude Code sessions before uninstalling, or ~/.keepmind will be recreated by active hooks.")}`];K?(Dt(G.join(`
|
|
1338
1338
|
`),"Next Steps"),b.length>0?Be(g.default.yellow("keepmind installed with some IDE setup failures.")):Be(g.default.green("keepmind installed successfully!"))):(console.log(`
|
|
@@ -1340,8 +1340,8 @@ ${i}`,"claude-mem detected");let a=await yt({message:"Migrate these claude-mem m
|
|
|
1340
1340
|
keepmind installed with some IDE setup failures.`),process.exitCode=1):console.log(`
|
|
1341
1341
|
keepmind installed successfully!`))}async function sE(){let t=xt(),e=nt(t);K?or(g.default.bgCyan(g.default.black(" keepmind repair "))):console.log("keepmind repair"),k.info(`Version: ${g.default.cyan(t)}`),await Vn([{title:"Setting up runtime",task:async r=>{r("Checking Bun\u2026");let{version:n}=await It();r("Checking uv\u2026");let{version:s}=await zs();Te(de(e,"package.json"))||(r("Cache missing \u2014 repopulating from npm package\u2026"),Eu(t)),r("Reinstalling plugin dependencies\u2026");let{bunPath:o}=await It();return await br(e,o),Zs(e,t,n,s),`Runtime ready (Bun ${n}, uv ${s}) ${g.default.green("OK")}`}},{title:"Reinstalling marketplace plugin dependencies",task:async r=>{let n=de(ee(),"plugin");if(!Te(n))return`No marketplace install \u2014 skipped ${g.default.dim("(cache-only)")}`;r("Refreshing marketplace plugin files\u2026"),hu(),r("Installing marketplace plugin dependencies\u2026");let{bunPath:s}=await It();return await br(n,s),`Marketplace plugin deps installed ${g.default.green("OK")}`}}]),K?Be(g.default.green("keepmind repair complete.")):console.log("keepmind repair complete.")}var g,K,k,qn=S(()=>{"use strict";vs();g=je(rt(),1);Pt();Ct();J();ba();qa();ul();El();dn();Js();yl();Ae();Qt();eo();vl();K=process.stdin.isTTY===!0;k={info:t=>K?H.info(t):console.log(` ${t}`),success:t=>K?H.success(t):console.log(` ${t}`),warn:t=>K?H.warn(t):console.warn(` ${t}`),error:t=>K?H.error(t):console.error(` ${t}`)}});var yu={};he(yu,{removeFromClaudeSettings:()=>bu,runUninstallCommand:()=>mE});import{existsSync as _t,readFileSync as oE,readdirSync as pi,rmSync as Pr,writeFileSync as iE}from"fs";import{homedir as Su}from"os";import{join as Ue}from"path";function aE(){let t=ee();return _t(t)?(Pr(t,{recursive:!0,force:!0}),!0):!1}function lE(){let t=Ue(Se(),"cache","keepmind","keepmind");return _t(t)?(Pr(t,{recursive:!0,force:!0}),!0):!1}function cE(){let t=z(xe(),{});t.keepmind&&(delete t.keepmind,se(xe(),t))}function uE(){let t=z(Le(),{});t.plugins?.["keepmind@keepmind"]&&(delete t.plugins["keepmind@keepmind"],se(Le(),t))}function dE(){let t=Su(),e=[Ue(t,".bashrc"),Ue(t,".zshrc"),Ue(t,"Documents","PowerShell","Microsoft.PowerShell_profile.ps1")],r=/^\s*alias\s+claude-mem\s*=/;for(let n of e){if(!_t(n))continue;let s;try{s=oE(n,"utf-8")}catch(a){console.warn(`[uninstall] Could not read ${n}:`,a instanceof Error?a.message:String(a));continue}let o=s.split(`
|
|
1342
1342
|
`),i=o.filter(a=>!r.test(a));if(i.length!==o.length)try{iE(n,i.join(`
|
|
1343
|
-
`)),console.error(`Removed legacy claude-mem alias from ${n}`)}catch(a){console.warn(`[uninstall] Could not rewrite ${n}:`,a instanceof Error?a.message:String(a))}}}function bu(){let t=z(Re(),{}),e=!1;t.enabledPlugins?.["keepmind@keepmind"]!==void 0&&(delete t.enabledPlugins["keepmind@keepmind"],e=!0),t.env&&typeof t.env=="object"&&!Array.isArray(t.env)&&Object.prototype.hasOwnProperty.call(t.env,"CLAUDE_CODE_DISABLE_AUTO_MEMORY")&&t.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY==="1"&&(delete t.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY,e=!0,Object.keys(t.env).length===0&&delete t.env),e&&se(Re(),t)}function pE(){let t=Su(),e=0,r=Ue(t,".npm","_npx");if(_t(r)){let o=[];try{o=pi(r)}catch(i){console.warn(`[uninstall] Could not read ${r}:`,i instanceof Error?i.message:String(i))}for(let i of o){let a=Ue(r,i,"node_modules","keepmind");if(_t(a))try{Pr(a,{recursive:!0,force:!0}),e++}catch(l){console.warn(`[uninstall] Could not remove ${a}:`,l instanceof Error?l.message:String(l))}}}let n=Ue(t,".cache","claude-cli-nodejs");if(_t(n)){let o=[];try{o=pi(n)}catch(i){console.warn(`[uninstall] Could not read ${n}:`,i instanceof Error?i.message:String(i))}for(let i of o){let a=Ue(n,i),l=[];try{l=pi(a)}catch(c){console.warn(`[uninstall] Could not read ${a}:`,c instanceof Error?c.message:String(c));continue}for(let c of l){if(!c.startsWith("mcp-logs-plugin-claude-mem-"))continue;let
|
|
1344
|
-
`),"Note"),Be(fe.default.green("claude-mem has been uninstalled."))}var fe,Tu=S(()=>{"use strict";vs();fe=je(rt(),1);Ae();Qt();Ct();eo()});var et={};he(et,{runAdoptCommand:()=>SE,runCleanupCommand:()=>bE,runRestartCommand:()=>Ei,runSearchCommand:()=>yE,runServerApiKeyCommand:()=>bi,runStartCommand:()=>gi,runStatusCommand:()=>Si,runStopCommand:()=>hi,runTranscriptWatchCommand:()=>TE});import{existsSync as Zt,readdirSync as fE,readFileSync as gE}from"fs";import{dirname as hE,join as Ur}from"path";function zn(){Lt()||(console.error(ge.default.red("keepmind is not installed.")),console.error(`Run: ${ge.default.bold("npx keepmind install")}`),process.exit(1))}function mi(){let t=un();return t||(console.error(ge.default.red("Node.js runtime not found.")),console.error("keepmind requires Node.js >= 22.5 \u2014 install it from https://nodejs.org"),console.error("After installation, restart your terminal."),process.exit(1)),t}function EE(){try{let t=JSON.parse(gE(Ur(ee(),"plugin",".claude-plugin","plugin.json"),"utf-8"));return typeof t?.version=="string"?t.version:null}catch{return null}}function vu(t){let e=EE();if(e){let n=Ur(nt(e),"scripts",t);if(Zt(n))return n}let r=Ur(Se(),"cache","keepmind","keepmind");if(Zt(r))for(let n of fE(r)){let s=Ur(r,n,"scripts",t);if(Zt(s))return s}return Ur(ee(),"plugin","scripts",t)}function Cu(){return vu("worker-service.cjs")}function fi(t,e,r="worker"){let n=He(t,e,{stdio:"inherit",cwd:hE(e[0]),env:Rt(process.env)});n.on("error",s=>{console.error(ge.default.red(`Failed to start ${r}: ${s.message}`)),process.exit(1)}),n.on("close",s=>{process.exit(s??0)})}function At(t,e=[]){zn();let r=mi(),n=Cu();Zt(n)||(console.error(ge.default.red(`Worker script not found at: ${n}`)),console.error("The installation may be corrupted. Try: npx keepmind install"),process.exit(1)),fi(r,[n,t,...e])}function gi(){At("start")}function hi(){At("stop")}function Ei(){At("restart")}function Si(){At("status")}function bi(t=[]){At("server",["api-key",...t])}function SE(t=[]){zn();let e=mi(),r=Cu();Zt(r)||(console.error(ge.default.red(`Worker script not found at: ${r}`)),console.error("The installation may be corrupted. Try: npx keepmind install"),process.exit(1));let n=process.cwd();fi(e,[r,"adopt","--cwd",n,...t])}function bE(t=[]){At("cleanup",t)}async function yE(t){zn();let e=t.join(" ").trim();e||(console.error(ge.default.red("Usage: npx keepmind search <query>")),process.exit(1));let n=`http://127.0.0.1:${re.get("CLAUDE_MEM_WORKER_PORT")}/api/search?query=${encodeURIComponent(e)}`,s;try{s=await fetch(n)}catch(i){let a=i instanceof Error?i.message:String(i);((i instanceof Error?i.cause:void 0)?.code==="ECONNREFUSED"||a.includes("ECONNREFUSED"))&&(console.error(ge.default.red("Worker is not running.")),console.error(`Start it with: ${ge.default.bold("npx keepmind start")}`),process.exit(1)),console.error(ge.default.red(`Search failed: ${a}`)),process.exit(1)}s.ok||(s.status===404&&(console.error(ge.default.red("Search endpoint not found. Is the worker running?")),console.error(`Try: ${ge.default.bold("npx keepmind start")}`),process.exit(1)),console.error(ge.default.red(`Search failed: HTTP ${s.status}`)),process.exit(1));let o;try{o=await s.json()}catch(i){let a=i instanceof Error?i.message:String(i);console.error(ge.default.red(`Search failed: invalid JSON response (${a})`)),process.exit(1)}console.log(typeof o=="object"&&o!==null?JSON.stringify(o,null,2):o)}function TE(){zn();let t=mi(),e=vu("transcript-watcher.cjs");if(!Zt(e)){At("transcript",["watch"]);return}fi(t,[e,"watch"],"transcript watcher")}var ge,Fe=S(()=>{"use strict";Pt();sn();ge=je(rt(),1);fr();Ae();Ct()});var Mu={};he(Mu,{checkLastInteraction:()=>Au,checkNodeVersion:()=>ku,checkProviderReadiness:()=>_u,runDoctorCommand:()=>GE,summarizeReport:()=>Nu});import{existsSync as Et,readFileSync as Fr,readdirSync as vE}from"fs";import{join as Nt}from"path";import{spawnSync as Ru}from"child_process";function wu(t){try{let e=j?Ru(`${t} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:!0}):Ru(t,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return e.status===0?e.stdout.trim():null}catch{return null}}function CE(){let t=new Set;try{let e=Fr(P.envFile(),"utf-8");for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n||n.startsWith("#"))continue;let s=n.indexOf("=");if(s<=0)continue;let o=n.slice(0,s).trim(),i=n.slice(s+1).trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),o&&i&&t.add(o)}}catch{}return t}function RE(){try{let t=P.workerPid();if(Et(t)){let e=JSON.parse(Fr(t,"utf-8"));if(typeof e.pid=="number"&&typeof e.port=="number"){let r=!1;try{process.kill(e.pid,0),r=!0}catch(n){n?.code==="EPERM"&&(r=!0)}return{port:String(e.port),pidAlive:r,pidPort:e.port}}}}catch{}return{port:re.get("CLAUDE_MEM_WORKER_PORT"),pidAlive:!1,pidPort:null}}async function yi(t,e){try{let r=await fetch(t,{signal:AbortSignal.timeout(e)});return r.ok?await r.json():null}catch{return null}}async function wE(){let{port:t,pidAlive:e,pidPort:r}=RE(),n=`http://127.0.0.1:${t}`,s=await yi(`${n}/api/health`,3e3);if(!s)return{reachable:!1,port:Number(t),pidAlive:e,pidPort:r};let[o,i]=await Promise.all([yi(`${n}/api/stats`,3e3),yi(`${n}/api/chroma/status?deep=true`,8e3)]);return{reachable:!0,port:Number(t),pidAlive:e,pidPort:r,health:s,stats:o??void 0,chroma:i??void 0}}function ku(t=process.version){let e=/^v?(\d+)\.(\d+)/.exec(t),r=e?parseInt(e[1],10):0,n=e?parseInt(e[2],10):0,s=r>22||r===22&&n>=5;return{name:"Node.js >= 22.5",status:s?"ok":"fail",detail:s?t:`${t} is too old \u2014 keepmind needs Node >= 22.5 (node:sqlite). Install: https://nodejs.org`,required:!0}}function _u(t){let e="AI provider";if(!Iu.includes(t.provider))return{name:e,status:"fail",detail:`CLAUDE_MEM_PROVIDER='${t.provider}' is invalid \u2014 must be one of ${Iu.join(", ")}`,required:!0};if(t.provider==="gemini")return t.geminiKey.trim()!==""||t.envKeys.has("GEMINI_API_KEY")?{name:e,status:"ok",detail:"gemini \u2014 API key configured",required:!0}:{name:e,status:"fail",detail:"gemini selected but no API key \u2014 set CLAUDE_MEM_GEMINI_API_KEY in settings.json or GEMINI_API_KEY in ~/.keepmind/.env",required:!0};if(t.provider==="openrouter")return t.openrouterKey.trim()!==""||t.envKeys.has("OPENROUTER_API_KEY")?{name:e,status:"ok",detail:"openrouter \u2014 API key configured",required:!0}:{name:e,status:"fail",detail:"openrouter selected but no API key \u2014 set CLAUDE_MEM_OPENROUTER_API_KEY in settings.json or OPENROUTER_API_KEY in ~/.keepmind/.env",required:!0};if(!Ou.includes(t.claudeAuthMethod))return{name:e,status:"fail",detail:`claude auth method '${t.claudeAuthMethod}' is invalid \u2014 must be one of ${Ou.join(", ")}`,required:!0};switch(t.claudeAuthMethod){case"api-key":return t.envKeys.has("ANTHROPIC_API_KEY")?{name:e,status:"ok",detail:"claude \u2014 ANTHROPIC_API_KEY configured",required:!0}:{name:e,status:"fail",detail:"claude api-key auth selected but ANTHROPIC_API_KEY missing \u2014 add it to ~/.keepmind/.env",required:!0};case"gateway":return t.envKeys.has("ANTHROPIC_BASE_URL")?{name:e,status:"ok",detail:"claude \u2014 gateway (ANTHROPIC_BASE_URL) configured",required:!0}:{name:e,status:"fail",detail:"claude gateway auth selected but ANTHROPIC_BASE_URL missing \u2014 add it to ~/.keepmind/.env",required:!0};case"subscription":return t.staleMarker?{name:e,status:"warn",detail:"claude subscription \u2014 OAuth token is STALE; re-login by running `claude` interactively once",required:!0}:{name:e,status:"ok",detail:"claude \u2014 subscription (OAuth)",required:!0};default:return{name:e,status:"ok",detail:"claude \u2014 uses Claude Code CLI auth",required:!0}}}function Au(t){let e="Last compression",r=t?.lastInteraction;return!r||typeof r.success!="boolean"?{name:e,status:"skip",detail:"no compression has run yet \u2014 end a session to generate the first observation",required:!1}:r.success?{name:e,status:"ok",detail:"most recent summarizer call succeeded",required:!1}:{name:e,status:"warn",detail:`most recent summarizer call FAILED: ${r.error??"unknown error"}`,required:!1}}function Nu(t){let r=t.flatMap(n=>n.checks).filter(n=>n.required&&n.status==="fail").length;return{groups:t,ok:r===0,hardFailures:r}}function IE(t){let e=[];e.push(ku());let r=wu("bun");e.push({name:"Bun runtime",status:r?"ok":"warn",detail:r?`v${r.replace(/^v/,"")}`:"not found \u2014 optional; core memory works without it, but it installs the native deps for semantic vector search. Install: `winget install Oven-sh.Bun` (Windows) or https://bun.sh, then `npx keepmind install`.",required:!1});let n=Lt();e.push({name:"Plugin installed",status:n?"ok":"fail",detail:n?ee():"run `npx keepmind install`",required:!0});let s=(()=>{let c=Nt(Se(),"cache","keepmind","keepmind");try{return vE(c,{withFileTypes:!0}).some(u=>u.isDirectory()&&Et(Nt(c,u.name,"node_modules")))}catch{return!1}})(),o=Nt(ee(),"plugin","node_modules"),i=s||Et(o);e.push({name:"Plugin deps",status:n?i?"ok":"fail":"warn",detail:i?"node_modules present":"missing \u2014 run `npx keepmind repair`",required:n});let a=wu("uv");e.push({name:"uv (optional)",status:"ok",detail:a?`${a} \u2014 present (no longer required; vector search is in-process)`:"not installed \u2014 optional; vector search runs in-process, uv is not needed",required:!1});let l=Nt(t,"last-install-error.json");if(Et(l)){let c=`present at ${l}`;try{let u=JSON.parse(Fr(l,"utf-8"));u&&typeof u=="object"&&(c=`${u.categoryId??"error"}: ${u.remediation??c}`)}catch{}e.push({name:"Last install error",status:"warn",detail:c,required:!1})}return{title:"Runtime & Install",checks:e}}function OE(t){let e=[],r=CE();for(let s of["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","GEMINI_API_KEY","OPENROUTER_API_KEY"])process.env[s]&&process.env[s].trim()!==""&&r.add(s);let n;try{let s=Nt(lt(),"oauth-stale.marker");Et(s)&&(n=Fr(s,"utf-8"))}catch{}return e.push(_u({provider:re.get("CLAUDE_MEM_PROVIDER"),claudeAuthMethod:re.get("CLAUDE_MEM_CLAUDE_AUTH_METHOD"),geminiKey:re.get("CLAUDE_MEM_GEMINI_API_KEY"),openrouterKey:re.get("CLAUDE_MEM_OPENROUTER_API_KEY"),envKeys:r,staleMarker:n})),t.reachable&&e.push(Au(t.health?.ai)),{title:"AI Provider",checks:e}}function kE(t){let e=[];if(t.reachable){let r=t.health??{},n=[`v${(r.version??"?").replace(/^v/,"")}`,r.initialized===!1?"initializing":"initialized",r.mcpReady?"MCP ready":"MCP pending"],s=r.status!=="degraded"&&r.initialized!==!1;e.push({name:"Worker daemon",status:s?"ok":"warn",detail:`${s?"healthy":"degraded"} at http://127.0.0.1:${t.port} (${n.join(", ")})`,required:!1})}else e.push({name:"Worker daemon",status:"fail",detail:`no response on port ${t.port} \u2014 start with \`npx keepmind start\``,required:!1});return t.pidPort===null?e.push({name:"Worker PID file",status:t.reachable?"warn":"skip",detail:t.reachable?"worker responded but no valid worker.pid on disk":"no worker.pid \u2014 worker has not been started",required:!1}):t.pidAlive?e.push({name:"Worker PID file",status:t.reachable?"ok":"warn",detail:t.reachable?`live (port ${t.pidPort})`:`PID alive but daemon not responding on port ${t.pidPort} \u2014 likely a reused/stale PID; clear with \`npx keepmind restart\``,required:!1}):e.push({name:"Worker PID file",status:"warn",detail:"STALE \u2014 worker.pid points at a dead process; clear with `npx keepmind restart`",required:!1}),{title:"Worker",checks:e}}function _E(){let t=cr();if(!Et(t))return{obs:null,schema:null,error:"no database file yet"};let e=null;try{e=new be(t,{readonly:!0});let r=e.prepare("SELECT COUNT(*) AS n FROM observations").get(),n=null;try{n=e.prepare("SELECT MAX(version) AS v FROM schema_versions").get()?.v??null}catch{}return{obs:r?.n??0,schema:n}}catch(r){return{obs:null,schema:null,error:r instanceof Error?r.message:String(r)}}finally{e?.close()}}function AE(t){let e=[];if(t.reachable&&t.stats?.database){let n=t.stats.database;e.push({name:"Database",status:"ok",detail:`${n.observations??0} observations, ${n.sessions??0} sessions (${ME(n.size)})`,required:!1})}else{let{obs:n,schema:s,error:o}=_E();o&&n===null?e.push({name:"Database",status:n===null&&o==="no database file yet"?"warn":"fail",detail:o==="no database file yet"?"no database yet \u2014 created on first session":`cannot open database read-only: ${o}`,required:!1}):e.push({name:"Database",status:"ok",detail:`${n??0} observations${s!==null?`, schema v${s}`:""} (read-only probe)`,required:!1})}if(!(re.get("CLAUDE_MEM_CHROMA_ENABLED")!=="false"))e.push({name:"Vector search",status:"warn",detail:"disabled via CLAUDE_MEM_CHROMA_ENABLED=false \u2014 semantic search falls back to SQLite/BM25",required:!1});else if(t.reachable&&t.chroma){let n=t.chroma;if(n.status==="disabled")e.push({name:"Vector search",status:"warn",detail:"worker has vector search OFF (started with CLAUDE_MEM_CHROMA_ENABLED=false in its env) \u2014 restart without that flag to enable",required:!1});else if(n.probe){let s=n.probe;e.push({name:"Vector search",status:s.ok?"ok":"warn",detail:s.ok?`ready (${n.backend??"sqlite-vec"}, embedder ${s.embedderWarm?"warm":"cold"}, ${s.queryLatencyMs??"?"}ms)`:`unhealthy: ${s.error??"probe failed"}`,required:!1})}else e.push({name:"Vector search",status:n.connected?"ok":"warn",detail:`${n.status??"unknown"} (${n.backend??"sqlite-vec"})`,required:!1})}else{let n=Et(Nt(ks,"vectors.db"));e.push({name:"Vector search",status:n?"ok":"skip",detail:n?"enabled; vector store present (start worker for a live readiness probe)":"enabled but no vector store yet \u2014 built on first backfill",required:!1})}return{title:"Memory Store",checks:e}}async function NE(){let t=[],e="ok",r="api.anthropic.com reachable, certificate trusted";try{r=`reachable (HTTP ${(await fetch("https://api.anthropic.com/v1/models",{method:"GET",signal:AbortSignal.timeout(5e3)})).status}), certificate trusted`}catch(n){let s=n?.cause?.code??n?.code??"";["CERT_HAS_EXPIRED","SELF_SIGNED_CERT_IN_CHAIN","UNABLE_TO_VERIFY_LEAF_SIGNATURE","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","DEPTH_ZERO_SELF_SIGNED_CERT","CERT_UNTRUSTED"].includes(s)?(e="fail",r=`certificate rejected (${s}) \u2014 corporate TLS interception. Export your corporate root CA to a .pem and set NODE_EXTRA_CA_CERTS to it. On Windows, Claude Code's bundled runtime currently IGNORES CA env vars (upstream bug #71581); until fixed, workaround: NODE_TLS_REJECT_UNAUTHORIZED=0.`):(e="warn",r=`could not reach api.anthropic.com (${s||"network error"}) \u2014 offline or blocked`)}return t.push({name:"API TLS reachability",status:e,detail:r,required:!1}),{title:"Connectivity",checks:t}}function ME(t){if(!t||t<=0)return"0 B";let e=["B","KB","MB","GB"],r=t,n=0;for(;r>=1024&&n<e.length-1;)r/=1024,n++;return`${r.toFixed(n===0?0:1)} ${e[n]}`}function LE(t){console.log(Me.default.bold(`
|
|
1343
|
+
`)),console.error(`Removed legacy claude-mem alias from ${n}`)}catch(a){console.warn(`[uninstall] Could not rewrite ${n}:`,a instanceof Error?a.message:String(a))}}}function bu(){let t=z(Re(),{}),e=!1;t.enabledPlugins?.["keepmind@keepmind"]!==void 0&&(delete t.enabledPlugins["keepmind@keepmind"],e=!0),t.env&&typeof t.env=="object"&&!Array.isArray(t.env)&&Object.prototype.hasOwnProperty.call(t.env,"CLAUDE_CODE_DISABLE_AUTO_MEMORY")&&t.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY==="1"&&(delete t.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY,e=!0,Object.keys(t.env).length===0&&delete t.env),e&&se(Re(),t)}function pE(){let t=Su(),e=0,r=Ue(t,".npm","_npx");if(_t(r)){let o=[];try{o=pi(r)}catch(i){console.warn(`[uninstall] Could not read ${r}:`,i instanceof Error?i.message:String(i))}for(let i of o){let a=Ue(r,i,"node_modules","keepmind");if(_t(a))try{Pr(a,{recursive:!0,force:!0}),e++}catch(l){console.warn(`[uninstall] Could not remove ${a}:`,l instanceof Error?l.message:String(l))}}}let n=Ue(t,".cache","claude-cli-nodejs");if(_t(n)){let o=[];try{o=pi(n)}catch(i){console.warn(`[uninstall] Could not read ${n}:`,i instanceof Error?i.message:String(i))}for(let i of o){let a=Ue(n,i),l=[];try{l=pi(a)}catch(c){console.warn(`[uninstall] Could not read ${a}:`,c instanceof Error?c.message:String(c));continue}for(let c of l){if(!c.startsWith("mcp-logs-plugin-claude-mem-"))continue;let d=Ue(a,c);try{Pr(d,{recursive:!0,force:!0}),e++}catch(m){console.warn(`[uninstall] Could not remove ${d}:`,m instanceof Error?m.message:String(m))}}}}let s=Ue(t,".claude","plugins","data","keepmind-keepmind");if(_t(s))try{Pr(s,{recursive:!0,force:!0}),e++}catch(o){console.warn(`[uninstall] Could not remove ${s}:`,o instanceof Error?o.message:String(o))}return e}async function mE(){if(or(fe.default.bgRed(fe.default.white(" claude-mem uninstall "))),Lt()){if(process.stdin.isTTY){let r=await yt({message:"Are you sure you want to uninstall claude-mem?",initialValue:!1});if(X(r)||!r){Ie("Uninstall cancelled.");return}}}else if(H.warn("claude-mem does not appear to be installed."),process.stdin.isTTY){let r=await yt({message:"Clean up any remaining registration data anyway?",initialValue:!1});if(X(r)||!r){Be("Nothing to do.");return}}else{Be("Nothing to do.");return}let t=re.get("CLAUDE_MEM_WORKER_PORT");try{(await fn(t,1e4)).workerWasRunning&&H.info("Worker service stopped.")}catch(r){console.warn("[uninstall] Worker shutdown attempt failed:",r instanceof Error?r.message:String(r))}await en([{title:"Removing marketplace directory",task:async()=>aE()?`Marketplace directory removed ${fe.default.green("OK")}`:`Marketplace directory not found ${fe.default.dim("skipped")}`},{title:"Removing cache directory",task:async()=>lE()?`Cache directory removed ${fe.default.green("OK")}`:`Cache directory not found ${fe.default.dim("skipped")}`},{title:"Removing marketplace registration",task:async()=>(cE(),`Marketplace registration removed ${fe.default.green("OK")}`)},{title:"Removing plugin registration",task:async()=>(uE(),`Plugin registration removed ${fe.default.green("OK")}`)},{title:"Removing from Claude settings",task:async()=>(bu(),`Claude settings updated ${fe.default.green("OK")}`)},{title:"Removing legacy claude-mem shell alias",task:async()=>(dE(),`Legacy alias check complete ${fe.default.green("OK")}`)},{title:"Removing stray claude-mem caches and logs",task:async()=>{let r=pE();return r>0?`Stray paths removed: ${r} ${fe.default.green("OK")}`:`No stray paths found ${fe.default.dim("skipped")}`}}]);let e=[{label:"Gemini CLI hooks",fn:async()=>{let{uninstallGeminiCliHooks:r}=await Promise.resolve().then(()=>(ho(),go));return r()}},{label:"Windsurf hooks",fn:async()=>{let{uninstallWindsurfHooks:r}=await Promise.resolve().then(()=>(ko(),Oo));return r()}},{label:"OpenCode plugin",fn:async()=>{let{uninstallOpenCodePlugin:r}=await Promise.resolve().then(()=>(Ro(),Co));return r()}},{label:"Codex CLI",fn:async()=>{let{uninstallCodexCli:r}=await Promise.resolve().then(()=>(Wo(),Fo));return r()}}];for(let{label:r,fn:n}of e)try{await n()===0&&H.info(`${r}: removed.`)}catch(s){console.warn(`[uninstall] ${r} cleanup failed:`,s instanceof Error?s.message:String(s))}Dt([`Your data directory at ${fe.default.cyan("~/.keepmind")} was preserved.`,"To remove it manually: rm -rf ~/.keepmind"].join(`
|
|
1344
|
+
`),"Note"),Be(fe.default.green("claude-mem has been uninstalled."))}var fe,Tu=S(()=>{"use strict";vs();fe=je(rt(),1);Ae();Qt();Ct();eo()});var et={};he(et,{runAdoptCommand:()=>SE,runCleanupCommand:()=>bE,runRestartCommand:()=>Ei,runSearchCommand:()=>yE,runServerApiKeyCommand:()=>bi,runStartCommand:()=>gi,runStatusCommand:()=>Si,runStopCommand:()=>hi,runTranscriptWatchCommand:()=>TE});import{existsSync as Zt,readdirSync as fE,readFileSync as gE}from"fs";import{dirname as hE,join as Ur}from"path";function zn(){Lt()||(console.error(ge.default.red("keepmind is not installed.")),console.error(`Run: ${ge.default.bold("npx keepmind install")}`),process.exit(1))}function mi(){let t=un();return t||(console.error(ge.default.red("Node.js runtime not found.")),console.error("keepmind requires Node.js >= 22.5 \u2014 install it from https://nodejs.org"),console.error("After installation, restart your terminal."),process.exit(1)),t}function EE(){try{let t=JSON.parse(gE(Ur(ee(),"plugin",".claude-plugin","plugin.json"),"utf-8"));return typeof t?.version=="string"?t.version:null}catch{return null}}function vu(t){let e=EE();if(e){let n=Ur(nt(e),"scripts",t);if(Zt(n))return n}let r=Ur(Se(),"cache","keepmind","keepmind");if(Zt(r))for(let n of fE(r)){let s=Ur(r,n,"scripts",t);if(Zt(s))return s}return Ur(ee(),"plugin","scripts",t)}function Cu(){return vu("worker-service.cjs")}function fi(t,e,r="worker"){let n=He(t,e,{stdio:"inherit",cwd:hE(e[0]),env:Rt(process.env)});n.on("error",s=>{console.error(ge.default.red(`Failed to start ${r}: ${s.message}`)),process.exit(1)}),n.on("close",s=>{process.exit(s??0)})}function At(t,e=[]){zn();let r=mi(),n=Cu();Zt(n)||(console.error(ge.default.red(`Worker script not found at: ${n}`)),console.error("The installation may be corrupted. Try: npx keepmind install"),process.exit(1)),fi(r,[n,t,...e])}function gi(){At("start")}function hi(){At("stop")}function Ei(){At("restart")}function Si(){At("status")}function bi(t=[]){At("server",["api-key",...t])}function SE(t=[]){zn();let e=mi(),r=Cu();Zt(r)||(console.error(ge.default.red(`Worker script not found at: ${r}`)),console.error("The installation may be corrupted. Try: npx keepmind install"),process.exit(1));let n=process.cwd();fi(e,[r,"adopt","--cwd",n,...t])}function bE(t=[]){At("cleanup",t)}async function yE(t){zn();let e=t.join(" ").trim();e||(console.error(ge.default.red("Usage: npx keepmind search <query>")),process.exit(1));let n=`http://127.0.0.1:${re.get("CLAUDE_MEM_WORKER_PORT")}/api/search?query=${encodeURIComponent(e)}`,s;try{s=await fetch(n)}catch(i){let a=i instanceof Error?i.message:String(i);((i instanceof Error?i.cause:void 0)?.code==="ECONNREFUSED"||a.includes("ECONNREFUSED"))&&(console.error(ge.default.red("Worker is not running.")),console.error(`Start it with: ${ge.default.bold("npx keepmind start")}`),process.exit(1)),console.error(ge.default.red(`Search failed: ${a}`)),process.exit(1)}s.ok||(s.status===404&&(console.error(ge.default.red("Search endpoint not found. Is the worker running?")),console.error(`Try: ${ge.default.bold("npx keepmind start")}`),process.exit(1)),console.error(ge.default.red(`Search failed: HTTP ${s.status}`)),process.exit(1));let o;try{o=await s.json()}catch(i){let a=i instanceof Error?i.message:String(i);console.error(ge.default.red(`Search failed: invalid JSON response (${a})`)),process.exit(1)}console.log(typeof o=="object"&&o!==null?JSON.stringify(o,null,2):o)}function TE(){zn();let t=mi(),e=vu("transcript-watcher.cjs");if(!Zt(e)){At("transcript",["watch"]);return}fi(t,[e,"watch"],"transcript watcher")}var ge,Fe=S(()=>{"use strict";Pt();sn();ge=je(rt(),1);fr();Ae();Ct()});var Mu={};he(Mu,{checkLastInteraction:()=>Au,checkNodeVersion:()=>ku,checkProviderReadiness:()=>_u,runDoctorCommand:()=>GE,summarizeReport:()=>Nu});import{existsSync as Et,readFileSync as Fr,readdirSync as vE}from"fs";import{join as Nt}from"path";import{spawnSync as Ru}from"child_process";function wu(t){try{let e=j?Ru(`${t} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],shell:!0}):Ru(t,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return e.status===0?e.stdout.trim():null}catch{return null}}function CE(){let t=new Set;try{let e=Fr(P.envFile(),"utf-8");for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n||n.startsWith("#"))continue;let s=n.indexOf("=");if(s<=0)continue;let o=n.slice(0,s).trim(),i=n.slice(s+1).trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),o&&i&&t.add(o)}}catch{}return t}function RE(){try{let t=P.workerPid();if(Et(t)){let e=JSON.parse(Fr(t,"utf-8"));if(typeof e.pid=="number"&&typeof e.port=="number"){let r=!1;try{process.kill(e.pid,0),r=!0}catch(n){n?.code==="EPERM"&&(r=!0)}return{port:String(e.port),pidAlive:r,pidPort:e.port}}}}catch{}return{port:re.get("CLAUDE_MEM_WORKER_PORT"),pidAlive:!1,pidPort:null}}async function yi(t,e){try{let r=await fetch(t,{signal:AbortSignal.timeout(e)});return r.ok?await r.json():null}catch{return null}}async function wE(){let{port:t,pidAlive:e,pidPort:r}=RE(),n=`http://127.0.0.1:${t}`,s=await yi(`${n}/api/health`,3e3);if(!s)return{reachable:!1,port:Number(t),pidAlive:e,pidPort:r};let[o,i]=await Promise.all([yi(`${n}/api/stats`,3e3),yi(`${n}/api/chroma/status?deep=true`,8e3)]);return{reachable:!0,port:Number(t),pidAlive:e,pidPort:r,health:s,stats:o??void 0,chroma:i??void 0}}function ku(t=process.version){let e=/^v?(\d+)\.(\d+)/.exec(t),r=e?parseInt(e[1],10):0,n=e?parseInt(e[2],10):0,s=r>22||r===22&&n>=5;return{name:"Node.js >= 22.5",status:s?"ok":"fail",detail:s?t:`${t} is too old \u2014 keepmind needs Node >= 22.5 (node:sqlite). Install: https://nodejs.org`,required:!0}}function _u(t){let e="AI provider";if(!Iu.includes(t.provider))return{name:e,status:"fail",detail:`CLAUDE_MEM_PROVIDER='${t.provider}' is invalid \u2014 must be one of ${Iu.join(", ")}`,required:!0};if(t.provider==="gemini")return t.geminiKey.trim()!==""||t.envKeys.has("GEMINI_API_KEY")?{name:e,status:"ok",detail:"gemini \u2014 API key configured",required:!0}:{name:e,status:"fail",detail:"gemini selected but no API key \u2014 set CLAUDE_MEM_GEMINI_API_KEY in settings.json or GEMINI_API_KEY in ~/.keepmind/.env",required:!0};if(t.provider==="openrouter")return t.openrouterKey.trim()!==""||t.envKeys.has("OPENROUTER_API_KEY")?{name:e,status:"ok",detail:"openrouter \u2014 API key configured",required:!0}:{name:e,status:"fail",detail:"openrouter selected but no API key \u2014 set CLAUDE_MEM_OPENROUTER_API_KEY in settings.json or OPENROUTER_API_KEY in ~/.keepmind/.env",required:!0};if(!Ou.includes(t.claudeAuthMethod))return{name:e,status:"fail",detail:`claude auth method '${t.claudeAuthMethod}' is invalid \u2014 must be one of ${Ou.join(", ")}`,required:!0};switch(t.claudeAuthMethod){case"api-key":return t.envKeys.has("ANTHROPIC_API_KEY")?{name:e,status:"ok",detail:"claude \u2014 ANTHROPIC_API_KEY configured",required:!0}:{name:e,status:"fail",detail:"claude api-key auth selected but ANTHROPIC_API_KEY missing \u2014 add it to ~/.keepmind/.env",required:!0};case"gateway":return t.envKeys.has("ANTHROPIC_BASE_URL")?{name:e,status:"ok",detail:"claude \u2014 gateway (ANTHROPIC_BASE_URL) configured",required:!0}:{name:e,status:"fail",detail:"claude gateway auth selected but ANTHROPIC_BASE_URL missing \u2014 add it to ~/.keepmind/.env",required:!0};case"subscription":return t.staleMarker?{name:e,status:"warn",detail:"claude subscription \u2014 OAuth token is STALE; re-login by running `claude` interactively once",required:!0}:{name:e,status:"ok",detail:"claude \u2014 subscription (OAuth)",required:!0};default:return{name:e,status:"ok",detail:"claude \u2014 uses Claude Code CLI auth",required:!0}}}function Au(t){let e="Last compression",r=t?.lastInteraction;return!r||typeof r.success!="boolean"?{name:e,status:"skip",detail:"no compression has run yet \u2014 end a session to generate the first observation",required:!1}:r.success?{name:e,status:"ok",detail:"most recent summarizer call succeeded",required:!1}:{name:e,status:"warn",detail:`most recent summarizer call FAILED: ${r.error??"unknown error"}`,required:!1}}function Nu(t){let r=t.flatMap(n=>n.checks).filter(n=>n.required&&n.status==="fail").length;return{groups:t,ok:r===0,hardFailures:r}}function IE(t){let e=[];e.push(ku());let r=wu("bun");e.push({name:"Bun runtime",status:r?"ok":"warn",detail:r?`v${r.replace(/^v/,"")}`:"not found \u2014 optional; core memory works without it, but it installs the native deps for semantic vector search. Install: `winget install Oven-sh.Bun` (Windows) or https://bun.sh, then `npx keepmind install`.",required:!1});let n=Lt();e.push({name:"Plugin installed",status:n?"ok":"fail",detail:n?ee():"run `npx keepmind install`",required:!0});let s=(()=>{let c=Nt(Se(),"cache","keepmind","keepmind");try{return vE(c,{withFileTypes:!0}).some(d=>d.isDirectory()&&Et(Nt(c,d.name,"node_modules")))}catch{return!1}})(),o=Nt(ee(),"plugin","node_modules"),i=s||Et(o);e.push({name:"Plugin deps",status:n?i?"ok":"fail":"warn",detail:i?"node_modules present":"missing \u2014 run `npx keepmind repair`",required:n});let a=wu("uv");e.push({name:"uv (optional)",status:"ok",detail:a?`${a} \u2014 present (no longer required; vector search is in-process)`:"not installed \u2014 optional; vector search runs in-process, uv is not needed",required:!1});let l=Nt(t,"last-install-error.json");if(Et(l)){let c=`present at ${l}`;try{let d=JSON.parse(Fr(l,"utf-8"));d&&typeof d=="object"&&(c=`${d.categoryId??"error"}: ${d.remediation??c}`)}catch{}e.push({name:"Last install error",status:"warn",detail:c,required:!1})}return{title:"Runtime & Install",checks:e}}function OE(t){let e=[],r=CE();for(let s of["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","GEMINI_API_KEY","OPENROUTER_API_KEY"])process.env[s]&&process.env[s].trim()!==""&&r.add(s);let n;try{let s=Nt(lt(),"oauth-stale.marker");Et(s)&&(n=Fr(s,"utf-8"))}catch{}return e.push(_u({provider:re.get("CLAUDE_MEM_PROVIDER"),claudeAuthMethod:re.get("CLAUDE_MEM_CLAUDE_AUTH_METHOD"),geminiKey:re.get("CLAUDE_MEM_GEMINI_API_KEY"),openrouterKey:re.get("CLAUDE_MEM_OPENROUTER_API_KEY"),envKeys:r,staleMarker:n})),t.reachable&&e.push(Au(t.health?.ai)),{title:"AI Provider",checks:e}}function kE(t){let e=[];if(t.reachable){let r=t.health??{},n=[`v${(r.version??"?").replace(/^v/,"")}`,r.initialized===!1?"initializing":"initialized",r.mcpReady?"MCP ready":"MCP pending"],s=r.status!=="degraded"&&r.initialized!==!1;e.push({name:"Worker daemon",status:s?"ok":"warn",detail:`${s?"healthy":"degraded"} at http://127.0.0.1:${t.port} (${n.join(", ")})`,required:!1})}else e.push({name:"Worker daemon",status:"fail",detail:`no response on port ${t.port} \u2014 start with \`npx keepmind start\``,required:!1});return t.pidPort===null?e.push({name:"Worker PID file",status:t.reachable?"warn":"skip",detail:t.reachable?"worker responded but no valid worker.pid on disk":"no worker.pid \u2014 worker has not been started",required:!1}):t.pidAlive?e.push({name:"Worker PID file",status:t.reachable?"ok":"warn",detail:t.reachable?`live (port ${t.pidPort})`:`PID alive but daemon not responding on port ${t.pidPort} \u2014 likely a reused/stale PID; clear with \`npx keepmind restart\``,required:!1}):e.push({name:"Worker PID file",status:"warn",detail:"STALE \u2014 worker.pid points at a dead process; clear with `npx keepmind restart`",required:!1}),{title:"Worker",checks:e}}function _E(){let t=cr();if(!Et(t))return{obs:null,schema:null,error:"no database file yet"};let e=null;try{e=new be(t,{readonly:!0});let r=e.prepare("SELECT COUNT(*) AS n FROM observations").get(),n=null;try{n=e.prepare("SELECT MAX(version) AS v FROM schema_versions").get()?.v??null}catch{}return{obs:r?.n??0,schema:n}}catch(r){return{obs:null,schema:null,error:r instanceof Error?r.message:String(r)}}finally{e?.close()}}function AE(t){let e=[];if(t.reachable&&t.stats?.database){let n=t.stats.database;e.push({name:"Database",status:"ok",detail:`${n.observations??0} observations, ${n.sessions??0} sessions (${ME(n.size)})`,required:!1})}else{let{obs:n,schema:s,error:o}=_E();o&&n===null?e.push({name:"Database",status:n===null&&o==="no database file yet"?"warn":"fail",detail:o==="no database file yet"?"no database yet \u2014 created on first session":`cannot open database read-only: ${o}`,required:!1}):e.push({name:"Database",status:"ok",detail:`${n??0} observations${s!==null?`, schema v${s}`:""} (read-only probe)`,required:!1})}if(!(re.get("CLAUDE_MEM_CHROMA_ENABLED")!=="false"))e.push({name:"Vector search",status:"warn",detail:"disabled via CLAUDE_MEM_CHROMA_ENABLED=false \u2014 semantic search falls back to SQLite/BM25",required:!1});else if(t.reachable&&t.chroma){let n=t.chroma;if(n.status==="disabled")e.push({name:"Vector search",status:"warn",detail:"worker has vector search OFF (started with CLAUDE_MEM_CHROMA_ENABLED=false in its env) \u2014 restart without that flag to enable",required:!1});else if(n.probe){let s=n.probe;e.push({name:"Vector search",status:s.ok?"ok":"warn",detail:s.ok?`ready (${n.backend??"sqlite-vec"}, embedder ${s.embedderWarm?"warm":"cold"}, ${s.queryLatencyMs??"?"}ms)`:`unhealthy: ${s.error??"probe failed"}`,required:!1})}else e.push({name:"Vector search",status:n.connected?"ok":"warn",detail:`${n.status??"unknown"} (${n.backend??"sqlite-vec"})`,required:!1})}else{let n=Et(Nt(ks,"vectors.db"));e.push({name:"Vector search",status:n?"ok":"skip",detail:n?"enabled; vector store present (start worker for a live readiness probe)":"enabled but no vector store yet \u2014 built on first backfill",required:!1})}return{title:"Memory Store",checks:e}}async function NE(){let t=[],e="ok",r="api.anthropic.com reachable, certificate trusted";try{r=`reachable (HTTP ${(await fetch("https://api.anthropic.com/v1/models",{method:"GET",signal:AbortSignal.timeout(5e3)})).status}), certificate trusted`}catch(n){let s=n?.cause?.code??n?.code??"";["CERT_HAS_EXPIRED","SELF_SIGNED_CERT_IN_CHAIN","UNABLE_TO_VERIFY_LEAF_SIGNATURE","UNABLE_TO_GET_ISSUER_CERT_LOCALLY","DEPTH_ZERO_SELF_SIGNED_CERT","CERT_UNTRUSTED"].includes(s)?(e="fail",r=`certificate rejected (${s}) \u2014 corporate TLS interception. Export your corporate root CA to a .pem and set NODE_EXTRA_CA_CERTS to it. On Windows, Claude Code's bundled runtime currently IGNORES CA env vars (upstream bug #71581); until fixed, workaround: NODE_TLS_REJECT_UNAUTHORIZED=0.`):(e="warn",r=`could not reach api.anthropic.com (${s||"network error"}) \u2014 offline or blocked`)}return t.push({name:"API TLS reachability",status:e,detail:r,required:!1}),{title:"Connectivity",checks:t}}function ME(t){if(!t||t<=0)return"0 B";let e=["B","KB","MB","GB"],r=t,n=0;for(;r>=1024&&n<e.length-1;)r/=1024,n++;return`${r.toFixed(n===0?0:1)} ${e[n]}`}function LE(t){console.log(Me.default.bold(`
|
|
1345
1345
|
keepmind doctor
|
|
1346
1346
|
`));for(let e of t.groups){console.log(Me.default.bold(Me.default.cyan(` ${e.title}`)));for(let r of e.checks)console.log(` ${xE(r.status)} ${r.name.padEnd(22)} ${Me.default.dim(r.detail)}`);console.log("")}t.ok?console.log(Me.default.green("All required checks passed.")):console.log(Me.default.red(`${t.hardFailures} required check(s) failed \u2014 see remediation above.`))}function UE(t){let e=t.health?.version;if(typeof e=="string"&&e.trim())return e.replace(/^v/,"");try{let r=Nt(ee(),"plugin","package.json");if(Et(r)){let n=JSON.parse(Fr(r,"utf-8"));if(typeof n.version=="string"&&n.version.trim())return n.version.replace(/^v/,"")}}catch{}return null}async function FE(){try{let t=await fetch(DE,{signal:AbortSignal.timeout(PE)});if(!t.ok)return null;let e=await t.json();return typeof e.version=="string"&&e.version.trim()?e.version.replace(/^v/,""):null}catch{return null}}function WE(t,e){let r=t.split(".").map(s=>parseInt(s,10)||0),n=e.split(".").map(s=>parseInt(s,10)||0);for(let s=0;s<3;s++){let o=(r[s]||0)-(n[s]||0);if(o!==0)return o}return 0}async function jE(t){let e=UE(t),r=await FE(),n;return e?r?WE(r,e)>0?n={name:"Update available",status:"warn",detail:`v${e} installed, v${r} on npm. In Claude Code: \`/plugin marketplace update keepmind\` then \`/plugin install keepmind@keepmind\`. Tip: enable auto-update (/plugin \u2192 Marketplaces \u2192 keepmind) so updates apply automatically.`,required:!1}:n={name:"Version",status:"ok",detail:`v${e} (up to date)`,required:!1}:n={name:"Version",status:"skip",detail:`v${e} installed \u2014 could not reach npm to check for a newer version`,required:!1}:n={name:"Version",status:"skip",detail:"could not determine the installed keepmind version",required:!1},{title:"Updates",checks:[n]}}async function GE(t=[]){let e=t.includes("--json"),r=lt(),n=await wE(),s=[IE(r),await jE(n),OE(n),kE(n),AE(n),await NE()],o=Nu(s);e?console.log(JSON.stringify(o,null,2)):LE(o),process.exit(o.ok?0:1)}var Me,Iu,Ou,xE,DE,PE,xu=S(()=>{"use strict";Me=je(rt(),1);Ae();Ct();J();Lr();Iu=["claude","gemini","openrouter"],Ou=["subscription","api-key","gateway","cli"];xE=t=>t==="ok"?Me.default.green("\u2713"):t==="warn"?Me.default.yellow("!"):t==="skip"?Me.default.dim("\xB7"):Me.default.red("\u2717");DE="https://registry.npmjs.org/keepmind/latest",PE=3e3});var Ti={};he(Ti,{runServerCommand:()=>HE,runWorkerAliasCommand:()=>JE});function Lu(){console.error(`Usage: ${Wr.default.bold("npx keepmind server <command>")}`),console.error("Commands: api-key create|list|revoke")}function BE(t){switch(t){case"start":return gi(),!0;case"stop":return hi(),!0;case"restart":return Ei(),!0;case"status":return Si(),!0;default:return!1}}async function HE(t=[]){let e=t[0]?.toLowerCase();if(e||(Lu(),process.exit(1)),e==="api-key"){let r=t[1]?.toLowerCase();if(r==="create"||r==="list"||r==="revoke"){bi(t.slice(1));return}console.error(Wr.default.red(`Unknown server api-key subcommand: ${r??"(none)"}`)),console.error("Usage: npx keepmind server api-key create|list|revoke"),process.exit(1)}console.error(Wr.default.red(`Unknown server command: ${e}`)),Lu(),process.exit(1)}function JE(t=[]){let e=t[0]?.toLowerCase();(!e||!BE(e))&&(console.error(Wr.default.red(`Unknown worker command: ${e??"(none)"}`)),console.error("Usage: npx keepmind worker start|stop|restart|status"),process.exit(1))}var Wr,vi=S(()=>{"use strict";Wr=je(rt(),1);Fe()});var x=je(rt(),1);Ae();var We=process.argv.slice(2),Ci=We[0]?.toLowerCase()??"",KE=new Set(["-h","--help","-v","--version"]),Du=Ci.startsWith("-")&&!KE.has(Ci)?"install":Ci;function VE(){let t=xt();console.log(`
|
|
1347
1347
|
${x.default.bold("keepmind")} v${t} \u2014 persistent memory for AI coding assistants
|