@chude/memory 4.0.1 → 4.0.2

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.
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var DZ=Object.create;var{getPrototypeOf:xZ,defineProperty:P$,getOwnPropertyNames:PZ}=Object;var yZ=Object.prototype.hasOwnProperty;var w_=(A,_,G)=>{G=A!=null?DZ(xZ(A)):{};let $=_||!A||!A.__esModule?P$(G,"default",{value:A,enumerable:!0}):G;for(let K of PZ(A))if(!yZ.call($,K))P$($,K,{get:()=>A[K],enumerable:!0});return $};var k=(A,_)=>{for(var G in _)P$(A,G,{get:_[G],enumerable:!0,configurable:!0,set:($)=>_[G]=()=>$})};var U=(A,_)=>()=>(A&&(_=A(A=0)),_);var U0=import.meta.require;function L(A){return A instanceof Error?A.message:String(A)}function C_(A){return A instanceof Error?A:Error(L(A))}var PG={};k(PG,{getMemoryDir:()=>f_,getMachineLogPath:()=>y$,getLogDir:()=>QA,getLegacyDir:()=>b_,getHookDir:()=>g_,getEventsDir:()=>CA,getEventLogPath:()=>vZ,getDbPath:()=>t0,getDataDir:()=>n,getConfigPath:()=>A0,getConfigDir:()=>oA,getCheckpointPath:()=>c_,getBackupDir:()=>T0,getAllLogFiles:()=>UA});import{existsSync as yK,readdirSync as hZ}from"fs";import{homedir as xG}from"os";import{join as r}from"path";function oA(){let A=process.env.XDG_CONFIG_HOME;if(A)return r(A,DG);return r(xG(),".config",DG)}function n(){let A=process.env.XDG_DATA_HOME;if(A)return r(A,DG);return r(xG(),".local","share",DG)}function b_(){return r(xG(),".memory-nexus")}function f_(){let A=process.env.MEMORY_HOME;if(A)return A;return r(xG(),".memory")}function A0(){return r(oA(),"config.json")}function t0(){return r(n(),"memory.db")}function QA(){return r(n(),"logs")}function g_(){return r(n(),"hooks")}function T0(){return r(n(),"backups")}function c_(){return r(n(),"sync-checkpoint.json")}function CA(){return r(n(),"events")}function vZ(){return r(CA(),"events.jsonl")}function y$(A){return r(CA(),`events-${A}.jsonl`)}function UA(A){let _=A??CA();if(!yK(_))return[];let G=hZ(_),$=[],K=r(_,"events.jsonl");if(yK(K))$.push(K);for(let Z of G)if(Z.startsWith("events-")&&Z.endsWith(".jsonl"))$.push(r(_,Z));return $}var DG="memory";var c=U(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{copyFileSync as kK,existsSync as u_,mkdirSync as k$,readFileSync as wZ,writeFileSync as hK}from"fs";import{dirname as h$,join as v$}from"path";import{homedir as CZ}from"os";function e0(A){return A?.settingsPath??v$(CZ(),".claude","settings.json")}function yG(A){return A?.backupPath??v$(T0(),"settings.json.backup")}function I0(A){return A?.hookScriptPath??v$(g_(),"sync-hook.js")}function s0(A){let _=e0(A);if(!u_(_))return{};try{let G=wZ(_,"utf-8");return JSON.parse(G)}catch{return{}}}function vK(A){let _=e0(A),G=yG(A);if(!u_(_))return!1;return k$(h$(G),{recursive:!0}),kK(_,G),!0}function w$(A){let _=e0(A),G=yG(A);if(!u_(G))return!1;return k$(h$(_),{recursive:!0}),kK(G,_),!0}function O0(A){let _=e0(A),G=I0(A);vK(A);let $=s0(A),K=`bun run "${G.replace(/\\/g,"/")}"`;if($.hooks=$.hooks??{},$.hooks.SessionEnd?.some((Y)=>Y.hooks.some((J)=>J.command.includes(m_)||J.command.includes(d_))))return{success:!0,message:"Hooks already installed"};return $.hooks.SessionEnd=$.hooks.SessionEnd??[],$.hooks.SessionEnd.push({hooks:[{type:"command",command:K,timeout:5}]}),$.hooks.PreCompact=$.hooks.PreCompact??[],$.hooks.PreCompact.push({matcher:"auto",hooks:[{type:"command",command:K,timeout:5}]}),k$(h$(_),{recursive:!0}),hK(_,JSON.stringify($,null,2)+`
3
+ var DZ=Object.create;var{getPrototypeOf:xZ,defineProperty:P1,getOwnPropertyNames:PZ}=Object;var yZ=Object.prototype.hasOwnProperty;var w_=(A,_,G)=>{G=A!=null?DZ(xZ(A)):{};let $=_||!A||!A.__esModule?P1(G,"default",{value:A,enumerable:!0}):G;for(let K of PZ(A))if(!yZ.call($,K))P1($,K,{get:()=>A[K],enumerable:!0});return $};var k=(A,_)=>{for(var G in _)P1(A,G,{get:_[G],enumerable:!0,configurable:!0,set:($)=>_[G]=()=>$})};var U=(A,_)=>()=>(A&&(_=A(A=0)),_);var U0=import.meta.require;function L(A){return A instanceof Error?A.message:String(A)}function C_(A){return A instanceof Error?A:Error(L(A))}var PG={};k(PG,{getMemoryDir:()=>f_,getMachineLogPath:()=>y1,getLogDir:()=>QA,getLegacyDir:()=>b_,getHookDir:()=>g_,getEventsDir:()=>CA,getEventLogPath:()=>vZ,getDbPath:()=>t0,getDataDir:()=>n,getConfigPath:()=>A0,getConfigDir:()=>oA,getCheckpointPath:()=>c_,getBackupDir:()=>T0,getAllLogFiles:()=>UA});import{existsSync as yK,readdirSync as hZ}from"fs";import{homedir as xG}from"os";import{join as r}from"path";function oA(){let A=process.env.XDG_CONFIG_HOME;if(A)return r(A,DG);return r(xG(),".config",DG)}function n(){let A=process.env.XDG_DATA_HOME;if(A)return r(A,DG);return r(xG(),".local","share",DG)}function b_(){return r(xG(),".memory-nexus")}function f_(){let A=process.env.MEMORY_HOME;if(A)return A;return r(xG(),".memory")}function A0(){return r(oA(),"config.json")}function t0(){return r(n(),"memory.db")}function QA(){return r(n(),"logs")}function g_(){return r(n(),"hooks")}function T0(){return r(n(),"backups")}function c_(){return r(n(),"sync-checkpoint.json")}function CA(){return r(n(),"events")}function vZ(){return r(CA(),"events.jsonl")}function y1(A){return r(CA(),`events-${A}.jsonl`)}function UA(A){let _=A??CA();if(!yK(_))return[];let G=hZ(_),$=[],K=r(_,"events.jsonl");if(yK(K))$.push(K);for(let Z of G)if(Z.startsWith("events-")&&Z.endsWith(".jsonl"))$.push(r(_,Z));return $}var DG="memory";var c=U(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{copyFileSync as kK,existsSync as u_,mkdirSync as k1,readFileSync as wZ,writeFileSync as hK}from"fs";import{dirname as h1,join as v1}from"path";import{homedir as CZ}from"os";function e0(A){return A?.settingsPath??v1(CZ(),".claude","settings.json")}function yG(A){return A?.backupPath??v1(T0(),"settings.json.backup")}function I0(A){return A?.hookScriptPath??v1(g_(),"sync-hook.js")}function s0(A){let _=e0(A);if(!u_(_))return{};try{let G=wZ(_,"utf-8");return JSON.parse(G)}catch{return{}}}function vK(A){let _=e0(A),G=yG(A);if(!u_(_))return!1;return k1(h1(G),{recursive:!0}),kK(_,G),!0}function w1(A){let _=e0(A),G=yG(A);if(!u_(G))return!1;return k1(h1(_),{recursive:!0}),kK(G,_),!0}function O0(A){let _=e0(A),G=I0(A);vK(A);let $=s0(A),K=`bun run "${G.replace(/\\/g,"/")}"`;if($.hooks=$.hooks??{},$.hooks.SessionEnd?.some((Y)=>Y.hooks.some((J)=>J.command.includes(m_)||J.command.includes(d_))))return{success:!0,message:"Hooks already installed"};return $.hooks.SessionEnd=$.hooks.SessionEnd??[],$.hooks.SessionEnd.push({hooks:[{type:"command",command:K,timeout:5}]}),$.hooks.PreCompact=$.hooks.PreCompact??[],$.hooks.PreCompact.push({matcher:"auto",hooks:[{type:"command",command:K,timeout:5}]}),k1(h1(_),{recursive:!0}),hK(_,JSON.stringify($,null,2)+`
4
4
  `),{success:!0,message:"Hooks installed successfully"}}function j0(A){let _=e0(A),G=s0(A);if(!G.hooks)return{success:!0,message:"No hooks to uninstall"};if(G.hooks.SessionEnd){if(G.hooks.SessionEnd=G.hooks.SessionEnd.filter(($)=>!$.hooks.some((K)=>K.command.includes(m_)||K.command.includes(d_))),G.hooks.SessionEnd.length===0)delete G.hooks.SessionEnd}if(G.hooks.PreCompact){if(G.hooks.PreCompact=G.hooks.PreCompact.filter(($)=>!$.hooks.some((K)=>K.command.includes(m_)||K.command.includes(d_))),G.hooks.PreCompact.length===0)delete G.hooks.PreCompact}if(Object.keys(G.hooks).length===0)delete G.hooks;return hK(_,JSON.stringify(G,null,2)+`
5
- `),{success:!0,message:"Hooks uninstalled successfully"}}function bA(A){let _=s0(A),G=I0(A),$=yG(A);return{sessionEnd:_.hooks?.SessionEnd?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,preCompact:_.hooks?.PreCompact?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,hookScriptExists:u_(G),backupExists:u_($)}}var m_="memory",d_="memory-nexus";var C$=U(()=>{c()});import{copyFileSync as bZ,cpSync as fZ,existsSync as XA,mkdirSync as f$,readdirSync as gZ,renameSync as cZ,rmSync as g$,statSync as kG,unlinkSync as c$}from"fs";import{join as _0}from"path";function CK(){let A=XA(b_()),_=XA(oA())||XA(n()),G;if(!A&&!_)G="not-needed";else if(A&&!_)G="pending";else if(!A&&_)G="complete";else G="partial";return{legacyExists:A,newExists:_,status:G}}function bK(){let A=b_();if(!XA(A))return!1;let _=_0(A,"memory.db");if(!XA(_))return!1;let G=t0();if(!XA(G))return!0;let $=kG(_).size,K=kG(G).size;return $>K}function b$(A){for(let _ of["-wal","-shm"]){let G=A+_;if(XA(G))c$(G)}}function uZ(A,_){for(let G of _)if(G.isDir&&XA(G.source)&&XA(G.dest))try{g$(G.source,{recursive:!0})}catch{}try{if(gZ(A).length===0)g$(A,{recursive:!0})}catch{}}function fK(){let A=b_();if(!XA(A))return{migrated:!1,itemsMoved:[],errors:[]};let _=[{name:"memory.db",source:_0(A,"memory.db"),dest:t0(),isDir:!1},{name:"config.json",source:_0(A,"config.json"),dest:A0(),isDir:!1},{name:"sync-checkpoint.json",source:_0(A,"sync-checkpoint.json"),dest:c_(),isDir:!1},{name:"logs",source:_0(A,"logs"),dest:QA(),isDir:!0},{name:"hooks",source:_0(A,"hooks"),dest:g_(),isDir:!0},{name:"backups",source:_0(A,"backups"),dest:T0(),isDir:!0}];try{f$(oA(),{recursive:!0}),f$(n(),{recursive:!0})}catch(Z){let Y=L(Z);return{migrated:!1,itemsMoved:[],errors:[`Failed to create target directories: ${Y}`]}}let G=[],$=[];for(let Z of _){if(!XA(Z.source))continue;if(XA(Z.dest)){if(Z.isDir)continue;let Y=kG(Z.source).size;if(kG(Z.dest).size>=Y){if(c$(Z.source),Z.source.endsWith(".db"))b$(Z.source);$.push(Z.name);continue}if(Z.dest.endsWith(".db"))b$(Z.dest)}try{if(wK(Z.source,Z.dest,Z.isDir),G.push({item:Z,rolledBack:!1}),$.push(Z.name),Z.source.endsWith(".db"))b$(Z.source)}catch(Y){let J=L(Y),H=[`Failed to move ${Z.name}: ${J}`];for(let Q=G.length-1;Q>=0;Q--){let X=G[Q];try{wK(X.item.dest,X.item.source,X.item.isDir),X.rolledBack=!0}catch(V){let B=L(V);H.push(`Rollback failed for ${X.item.name}: ${B}`)}}return{migrated:!1,itemsMoved:[],errors:H}}}if($.length===0)return{migrated:!1,itemsMoved:[],errors:[]};let K=[];try{j0(),O0()}catch(Z){let Y=L(Z);K.push(`hook re-install failed: ${Y}`)}return uZ(A,_),process.stderr.write(`Migrated data from ~/.memory-nexus to new paths
6
- `),{migrated:!0,itemsMoved:$,errors:K}}function wK(A,_,G){let $=_0(_,"..");f$($,{recursive:!0});try{cZ(A,_)}catch(K){if(K.code==="EXDEV")if(G)fZ(A,_,{recursive:!0}),g$(A,{recursive:!0});else bZ(A,_),c$(A);else throw K}}var u$=U(()=>{c();C$()});class xA{_id;_projectPath;_startTime;_endTime;_messages;_summary;_messageCount;constructor(A){this._id=A.id,this._projectPath=A.projectPath,this._startTime=new Date(A.startTime.getTime()),this._endTime=A.endTime?new Date(A.endTime.getTime()):void 0,this._messages=Object.freeze([...A.messages??[]]),this._summary=A.summary,this._messageCount=A.messageCount}static create(A){if(!A.id||A.id.trim()==="")throw Error("Session ID cannot be empty");if(A.endTime&&A.endTime<A.startTime)throw Error("End time cannot be before start time");return new xA(A)}get id(){return this._id}get projectPath(){return this._projectPath}get startTime(){return new Date(this._startTime.getTime())}get endTime(){return this._endTime?new Date(this._endTime.getTime()):void 0}get messages(){return[...this._messages]}get summary(){return this._summary}get messageCount(){return this._messageCount??this._messages.length}get durationMs(){if(!this._endTime)return;return this._endTime.getTime()-this._startTime.getTime()}equals(A){return this._id===A._id}addMessage(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages,A],summary:this._summary})}complete(A){if(A<this._startTime)throw Error("End time cannot be before start time");return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:A,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:A,messageCount:this._messageCount})}}class TA{_id;_role;_content;_timestamp;_toolUseIds;constructor(A){this._id=A.id,this._role=A.role,this._content=A.content,this._timestamp=new Date(A.timestamp.getTime()),this._toolUseIds=Object.freeze([...A.toolUseIds??[]])}static create(A){if(!A.id||A.id.trim()==="")throw Error("Message ID cannot be empty");if(!mZ.includes(A.role))throw Error("Invalid message role");return new TA(A)}get id(){return this._id}get role(){return this._role}get content(){return this._content}get timestamp(){return new Date(this._timestamp.getTime())}get toolUses(){return[...this._toolUseIds]}get hasContent(){return this._content.length>0}get hasToolUses(){return this._toolUseIds.length>0}equals(A){return this._id===A._id}addToolUse(A){return new TA({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,A]})}}var mZ;var l_=U(()=>{mZ=["user","assistant"]});class PA{_id;_name;_input;_timestamp;_status;_result;constructor(A){this._id=A.id,this._name=A.name,this._input=structuredClone(A.input),this._timestamp=new Date(A.timestamp.getTime()),this._status=A.status??"pending",this._result=A.result}static create(A){if(!A.id||A.id.trim()==="")throw Error("Tool use ID cannot be empty");if(!A.name||A.name.trim()==="")throw Error("Tool name cannot be empty");if(A.status&&!dZ.includes(A.status))throw Error("Invalid tool use status");return new PA(A)}get id(){return this._id}get name(){return this._name}get input(){return structuredClone(this._input)}get timestamp(){return new Date(this._timestamp.getTime())}get status(){return this._status}get result(){return this._result}get isPending(){return this._status==="pending"}get isSuccess(){return this._status==="success"}get isError(){return this._status==="error"}equals(A){return this._id===A._id}completeSuccess(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:A})}completeError(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:A})}}var dZ;var hG=U(()=>{dZ=["pending","success","error"]});class VA{_id;_sessionPath;_startedAt;_status;_completedAt;_messagesExtracted;_errorMessage;_fileMtime;_fileSize;constructor(A){this._id=A.id,this._sessionPath=A.sessionPath,this._startedAt=new Date(A.startedAt.getTime()),this._status=A.status??"pending",this._completedAt=A.completedAt?new Date(A.completedAt.getTime()):void 0,this._messagesExtracted=A.messagesExtracted??0,this._errorMessage=A.errorMessage,this._fileMtime=A.fileMtime?new Date(A.fileMtime.getTime()):void 0,this._fileSize=A.fileSize}static create(A){if(!A.id||A.id.trim()==="")throw Error("Extraction state ID cannot be empty");if(!A.sessionPath||A.sessionPath.trim()==="")throw Error("Session path cannot be empty");if(A.status&&!lZ.includes(A.status))throw Error("Invalid extraction status");if(A.messagesExtracted!==void 0&&A.messagesExtracted<0)throw Error("Messages extracted cannot be negative");if(A.fileSize!==void 0&&A.fileSize<0)throw Error("File size cannot be negative");return new VA(A)}get id(){return this._id}get sessionPath(){return this._sessionPath}get startedAt(){return new Date(this._startedAt.getTime())}get status(){return this._status}get completedAt(){return this._completedAt?new Date(this._completedAt.getTime()):void 0}get messagesExtracted(){return this._messagesExtracted}get errorMessage(){return this._errorMessage}get fileMtime(){return this._fileMtime?new Date(this._fileMtime.getTime()):void 0}get fileSize(){return this._fileSize}get isPending(){return this._status==="pending"}get isInProgress(){return this._status==="in_progress"}get isComplete(){return this._status==="complete"}get isError(){return this._status==="error"}get durationMs(){if(!this._completedAt)return;return this._completedAt.getTime()-this._startedAt.getTime()}equals(A){return this._id===A._id}startProcessing(){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"in_progress",messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}complete(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"complete",completedAt:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}fail(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"error",errorMessage:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}incrementMessages(A=1){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted+A,errorMessage:this._errorMessage,fileMtime:this._fileMtime,fileSize:this._fileSize})}withFileMetadata(A,_){if(_<0)throw Error("File size cannot be negative");return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted,errorMessage:this._errorMessage,fileMtime:A,fileSize:_})}}var lZ;var vG=U(()=>{lZ=["pending","in_progress","complete","error"]});var j;var gK=U(()=>{j={DB_CONNECTION_FAILED:"DB_CONNECTION_FAILED",DB_CORRUPTED:"DB_CORRUPTED",DB_LOCKED:"DB_LOCKED",INVALID_SESSION_ID:"INVALID_SESSION_ID",SESSION_NOT_FOUND:"SESSION_NOT_FOUND",SOURCE_INACCESSIBLE:"SOURCE_INACCESSIBLE",DISK_FULL:"DISK_FULL",INVALID_JSON:"INVALID_JSON",UNKNOWN_FORMAT:"UNKNOWN_FORMAT",SYNC_INTERRUPTED:"SYNC_INTERRUPTED",SYNC_FAILED:"SYNC_FAILED",INVALID_ARGUMENT:"INVALID_ARGUMENT",MISSING_ARGUMENT:"MISSING_ARGUMENT",VECTOR_UNAVAILABLE:"VECTOR_UNAVAILABLE",PROVIDER_TIMEOUT:"PROVIDER_TIMEOUT",PROVIDER_CONFIG_INVALID:"PROVIDER_CONFIG_INVALID",EMBEDDING_DIMENSION_MISMATCH:"EMBEDDING_DIMENSION_MISMATCH",MODEL_CORRUPTED:"MODEL_CORRUPTED",NOT_FOUND:"NOT_FOUND",INVALID_STATE:"INVALID_STATE",UNKNOWN:"UNKNOWN"}});var F;var cK=U(()=>{F=class F extends Error{code;context;constructor(A,_,G){super(_);if(this.name="MemoryError",this.code=A,this.context=G,Error.captureStackTrace)Error.captureStackTrace(this,F)}toJSON(){let A={error:{code:this.code,message:this.message}};if(this.context&&Object.keys(this.context).length>0)A.error.context=this.context;return A}}});var IA=U(()=>{gK();cK()});var p_=()=>{};var d$=U(()=>{p_()});function bG(A,_){return A instanceof CG&&(_===void 0||A.kind===_)}var CG;var l$=U(()=>{CG=class CG extends Error{kind;status;retryable;metadata;constructor(A){super(A.message);if(this.name="EmbeddingProviderError",this.kind=A.kind,this.status=A.status,this.retryable=A.retryable??!1,this.metadata=A.metadata??{},A.cause!==void 0)this.cause=A.cause}}});var dK={};k(dK,{computeModelHash:()=>p$,EmbeddingService:()=>n$});import{Buffer as uK}from"buffer";import{createHash as mK}from"crypto";function p$(A){let _=`${A.provider}:${A.model}:${A.dimensions}`;return mK("sha256").update(_).digest("hex").slice(0,16)}class n${repository;provider;batchSize;maxBatchBytes;modelHash;modelName;redactor;constructor(A){this.repository=A.repository,this.provider=A.provider,this.batchSize=A.config.batchSize,this.maxBatchBytes=Math.max(1,A.config.maxBatchBytes??nZ),this.modelHash=p$(A.config),this.modelName=A.config.model,this.redactor=A.redactor??iZ}checkModelState(){let A=this.repository.getStoredModelHash(),_=this.modelHash,G=this.modelName;if(A===null)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};if(A===_)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};let $=this.repository.getStoredModelName()??A;return{modelChanged:!0,needsReEmbed:!0,storedHash:A,currentHash:_,storedModelName:$,currentModelName:G,embeddedCount:this.repository.getEmbeddedCount()}}async embedUnembedded(A={}){let _=Date.now(),G=0,$=0,K=Math.max(0,this.repository.getTotalMessageCount()-this.repository.getEmbeddedCount()-this.getSkippedCountForCurrentModel());if(K<=0)return{embedded:0,skipped:0,durationMs:0,rate:0};let Z=this.repository.findUnembedded(this.batchSize,this.modelHash);while(Z.length>0){let H=this.prepareBatch(Z),Q=this.chunkByPayloadBytes(H);for(let X of Q){let V=await this.embedChunk(X);G+=V.embedded,$+=V.skipped,A.onProgress?.({current:Math.min(G+$,K),total:K})}Z=this.repository.findUnembedded(this.batchSize,this.modelHash)}let Y=Date.now()-_,J=Y>0?G/(Y/1000):0;return{embedded:G,skipped:$,durationMs:Y,rate:J}}async clearAndReembed(A={}){return this.repository.clearAllEmbeddings(),this.embedUnembedded(A)}prepareBatch(A){return A.map((_)=>({rowid:_.rowid,rawContent:_.content,text:this.redactor.redactText(_.content).text}))}chunkByPayloadBytes(A){let _=[],G=[];for(let $ of A){let K=[...G,$];if(G.length>0&&this.estimatePayloadBytes(K)>this.maxBatchBytes){_.push(G),G=[$];continue}G=K}if(G.length>0)_.push(G);return _}estimatePayloadBytes(A){return uK.byteLength(JSON.stringify({model:this.modelName,input:A.map((_)=>_.text)}),"utf8")}async embedChunk(A){try{let _=await this.provider.embedBatch(A.map(($)=>$.text)),G=A.map(($,K)=>({rowid:$.rowid,embedding:_[K].embedding}));return this.repository.storeBatch(G,this.modelHash,this.modelName),{embedded:A.length,skipped:0}}catch(_){if(!bG(_,"payload_too_large"))throw _;if(A.length>1){let G=Math.ceil(A.length/2),$=await this.embedChunk(A.slice(0,G)),K=await this.embedChunk(A.slice(G));return{embedded:$.embedded+K.embedded,skipped:$.skipped+K.skipped}}return this.markPayloadTooLargeSkip(A[0]),{embedded:0,skipped:1}}}markPayloadTooLargeSkip(A){this.repository.markSkipped({messageId:A.rowid,modelHash:this.modelHash,modelName:this.modelName,provider:this.provider.name,reason:"payload_too_large",retryable:!1,contentHash:mK("sha256").update(A.rawContent).digest("hex"),contentBytes:uK.byteLength(A.rawContent,"utf8"),safeError:"Provider payload exceeded request limit for this message and model."})}getSkippedCountForCurrentModel(){return typeof this.repository.getSkippedCount==="function"?this.repository.getSkippedCount(this.modelHash):0}}var nZ=800000,iZ;var i$=U(()=>{l$();iZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})}});function e$(A,_,G){let $=new Map;for(let Z of A){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"fts",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}for(let Z of _){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"vector",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}let K=Array.from($.values()).sort((Z,Y)=>Y.rrfScore-Z.rrfScore);if(K=K.filter((Z)=>Z.rrfScore>=0.001),K=K.slice(0,G),K.length>0){let Z=K[0].rrfScore;if(Z>0)for(let Y of K)Y.normalizedScore=Y.rrfScore/Z}return K}function R0(A){let _=(A.match(/"/g)||[]).length,G=_>0&&_%2===0,$;if(G)$=A.replace(/[.:\-()[\]{}^~@/\\]/gu," ").replace(/\s+/g," ").trim();else $=A.replace(/[.:\-()[\]{}^"~@/\\]/gu," ").replace(/\s+/g," ").trim();if($)return $;let K=(A.match(/"/g)||[]).length,Y=K>0&&K%2===0?/[.:\-()[\]{}^~@/\\]/gu:/[.:\-()[\]{}^"~@/\\]/gu;return A.replace(Y," ").replace(/\s+/g," ").trim()}class F0{_id;_filePath;_fileType;_projectEncoded;_content;_contentHash;_lastIndexedAt;_createdAt;constructor(A){this._id=A.id,this._filePath=A.filePath,this._fileType=A.fileType,this._projectEncoded=A.projectEncoded,this._content=A.content,this._contentHash=A.contentHash,this._lastIndexedAt=new Date(A.lastIndexedAt.getTime()),this._createdAt=A.createdAt?new Date(A.createdAt.getTime()):new Date}static create(A){if(!A.filePath||A.filePath.trim()==="")throw Error("File path cannot be empty");if(!A.content||A.content.trim()==="")throw Error("Content cannot be empty");if(!tZ.test(A.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!pK.includes(A.fileType))throw Error(`Invalid file type: "${A.fileType}". Must be one of: ${pK.join(", ")}`);return new F0(A)}get id(){return this._id}get filePath(){return this._filePath}get fileType(){return this._fileType}get projectEncoded(){return this._projectEncoded}get content(){return this._content}get contentHash(){return this._contentHash}get lastIndexedAt(){return new Date(this._lastIndexedAt.getTime())}get createdAt(){return new Date(this._createdAt.getTime())}}var pK,tZ;var gG=U(()=>{pK=["daily_log","decisions","learnings","user_prefs"],tZ=/^[a-f0-9]{64}$/});class G0{_id;_description;_severity;_category;_status;_tool;_tags;_lastReviewedAt;_context;_sourceProject;_loggedAt;_resolvedAt;_resolution;constructor(A){this._id=A.id,this._description=A.description.trim(),this._severity=A.severity,this._category=A.category,this._status=A.status,this._tool=A.tool,this._tags=A.tags?[...A.tags]:void 0,this._lastReviewedAt=A.lastReviewedAt?new Date(A.lastReviewedAt.getTime()):void 0,this._context=A.context,this._sourceProject=A.sourceProject,this._loggedAt=new Date(A.loggedAt.getTime()),this._resolvedAt=A.resolvedAt?new Date(A.resolvedAt.getTime()):void 0,this._resolution=A.resolution}static create(A){if(!A.description||A.description.trim()==="")throw Error("Description cannot be empty");if(!nK.includes(A.severity))throw Error(`Invalid severity: "${A.severity}". Must be one of: ${nK.join(", ")}`);if(!A.category||A.category.trim()==="")throw Error("Category cannot be empty");if(!iK.includes(A.status))throw Error(`Invalid status: "${A.status}". Must be one of: ${iK.join(", ")}`);if(!A.tool||A.tool.trim()==="")throw Error("Tool cannot be empty");if(A.status==="open"&&A.resolvedAt)throw Error("Open entries cannot have a resolvedAt date");return new G0(A)}get id(){return this._id}get description(){return this._description}get severity(){return this._severity}get category(){return this._category}get status(){return this._status}get tool(){return this._tool}get tags(){return this._tags?[...this._tags]:void 0}get lastReviewedAt(){return this._lastReviewedAt?new Date(this._lastReviewedAt.getTime()):void 0}get context(){return this._context}get sourceProject(){return this._sourceProject}get loggedAt(){return new Date(this._loggedAt.getTime())}get resolvedAt(){return this._resolvedAt?new Date(this._resolvedAt.getTime()):void 0}get resolution(){return this._resolution}}var nK,iK;var uG=U(()=>{nK=["low","medium","high","critical"],iK=["open","resolved","wont-fix"]});class $0{_sessionId;_backfilledAt;_dailyLogPath;_success;_errorMessage;constructor(A){this._sessionId=A.sessionId,this._backfilledAt=new Date(A.backfilledAt.getTime()),this._dailyLogPath=A.dailyLogPath,this._success=A.success??!0,this._errorMessage=A.errorMessage}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.dailyLogPath||A.dailyLogPath.trim()==="")throw Error("Daily log path cannot be empty");return new $0(A)}get sessionId(){return this._sessionId}get backfilledAt(){return new Date(this._backfilledAt.getTime())}get dailyLogPath(){return this._dailyLogPath}get success(){return this._success}get errorMessage(){return this._errorMessage}get isSuccess(){return this._success}}var aK={};k(aK,{BackfillService:()=>s$});class s${sessionRepo;messageRepo;backfillStateRepo;summaryGenerator;dailyLogWriter;constructor(A,_,G,$,K){this.sessionRepo=A;this.messageRepo=_;this.backfillStateRepo=G;this.summaryGenerator=$;this.dailyLogWriter=K}async dryRun(A={}){let _=await this.getUnprocessedSessions(A.project);return{unprocessedCount:_.length,estimatedCost:_.length*_Y}}async backfill(A={}){let{batch:_=50,project:G,onProgress:$}=A,Z=(await this.getUnprocessedSessions(G)).slice(0,_),Y={sessionsProcessed:0,sessionsFailed:0,sessionsSkipped:0,dailyLogsCreated:0,dailyLogsUpdated:0,errors:[]};for(let J=0;J<Z.length;J++){let H=Z[J];if(!H)continue;if(await this.backfillStateRepo.findBySessionId(H.id)){Y.sessionsSkipped++,$?.({current:J+1,total:Z.length,sessionId:H.id,action:"skipped"});continue}try{$?.({current:J+1,total:Z.length,sessionId:H.id,action:"processing"});let X=await this.extractContent(H.id),V=H.projectPath.decoded,B=V.split(/[/\\]/).filter(Boolean).pop()??V,W=await this.summaryGenerator.generateSummary(X,H.id,B,H.startTime.toISOString(),H.endTime?.toISOString()??H.startTime.toISOString()),z=`daily/${H.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(z,W+`
5
+ `),{success:!0,message:"Hooks uninstalled successfully"}}function bA(A){let _=s0(A),G=I0(A),$=yG(A);return{sessionEnd:_.hooks?.SessionEnd?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,preCompact:_.hooks?.PreCompact?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,hookScriptExists:u_(G),backupExists:u_($)}}var m_="memory",d_="memory-nexus";var C1=U(()=>{c()});import{copyFileSync as bZ,cpSync as fZ,existsSync as XA,mkdirSync as f1,readdirSync as gZ,renameSync as cZ,rmSync as g1,statSync as kG,unlinkSync as c1}from"fs";import{join as _0}from"path";function CK(){let A=XA(b_()),_=XA(oA())||XA(n()),G;if(!A&&!_)G="not-needed";else if(A&&!_)G="pending";else if(!A&&_)G="complete";else G="partial";return{legacyExists:A,newExists:_,status:G}}function bK(){let A=b_();if(!XA(A))return!1;let _=_0(A,"memory.db");if(!XA(_))return!1;let G=t0();if(!XA(G))return!0;let $=kG(_).size,K=kG(G).size;return $>K}function b1(A){for(let _ of["-wal","-shm"]){let G=A+_;if(XA(G))c1(G)}}function uZ(A,_){for(let G of _)if(G.isDir&&XA(G.source)&&XA(G.dest))try{g1(G.source,{recursive:!0})}catch{}try{if(gZ(A).length===0)g1(A,{recursive:!0})}catch{}}function fK(){let A=b_();if(!XA(A))return{migrated:!1,itemsMoved:[],errors:[]};let _=[{name:"memory.db",source:_0(A,"memory.db"),dest:t0(),isDir:!1},{name:"config.json",source:_0(A,"config.json"),dest:A0(),isDir:!1},{name:"sync-checkpoint.json",source:_0(A,"sync-checkpoint.json"),dest:c_(),isDir:!1},{name:"logs",source:_0(A,"logs"),dest:QA(),isDir:!0},{name:"hooks",source:_0(A,"hooks"),dest:g_(),isDir:!0},{name:"backups",source:_0(A,"backups"),dest:T0(),isDir:!0}];try{f1(oA(),{recursive:!0}),f1(n(),{recursive:!0})}catch(Z){let Y=L(Z);return{migrated:!1,itemsMoved:[],errors:[`Failed to create target directories: ${Y}`]}}let G=[],$=[];for(let Z of _){if(!XA(Z.source))continue;if(XA(Z.dest)){if(Z.isDir)continue;let Y=kG(Z.source).size;if(kG(Z.dest).size>=Y){if(c1(Z.source),Z.source.endsWith(".db"))b1(Z.source);$.push(Z.name);continue}if(Z.dest.endsWith(".db"))b1(Z.dest)}try{if(wK(Z.source,Z.dest,Z.isDir),G.push({item:Z,rolledBack:!1}),$.push(Z.name),Z.source.endsWith(".db"))b1(Z.source)}catch(Y){let J=L(Y),H=[`Failed to move ${Z.name}: ${J}`];for(let Q=G.length-1;Q>=0;Q--){let X=G[Q];try{wK(X.item.dest,X.item.source,X.item.isDir),X.rolledBack=!0}catch(V){let B=L(V);H.push(`Rollback failed for ${X.item.name}: ${B}`)}}return{migrated:!1,itemsMoved:[],errors:H}}}if($.length===0)return{migrated:!1,itemsMoved:[],errors:[]};let K=[];try{j0(),O0()}catch(Z){let Y=L(Z);K.push(`hook re-install failed: ${Y}`)}return uZ(A,_),process.stderr.write(`Migrated data from ~/.memory-nexus to new paths
6
+ `),{migrated:!0,itemsMoved:$,errors:K}}function wK(A,_,G){let $=_0(_,"..");f1($,{recursive:!0});try{cZ(A,_)}catch(K){if(K.code==="EXDEV")if(G)fZ(A,_,{recursive:!0}),g1(A,{recursive:!0});else bZ(A,_),c1(A);else throw K}}var u1=U(()=>{c();C1()});class xA{_id;_projectPath;_startTime;_endTime;_messages;_summary;_messageCount;constructor(A){this._id=A.id,this._projectPath=A.projectPath,this._startTime=new Date(A.startTime.getTime()),this._endTime=A.endTime?new Date(A.endTime.getTime()):void 0,this._messages=Object.freeze([...A.messages??[]]),this._summary=A.summary,this._messageCount=A.messageCount}static create(A){if(!A.id||A.id.trim()==="")throw Error("Session ID cannot be empty");if(A.endTime&&A.endTime<A.startTime)throw Error("End time cannot be before start time");return new xA(A)}get id(){return this._id}get projectPath(){return this._projectPath}get startTime(){return new Date(this._startTime.getTime())}get endTime(){return this._endTime?new Date(this._endTime.getTime()):void 0}get messages(){return[...this._messages]}get summary(){return this._summary}get messageCount(){return this._messageCount??this._messages.length}get durationMs(){if(!this._endTime)return;return this._endTime.getTime()-this._startTime.getTime()}equals(A){return this._id===A._id}addMessage(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages,A],summary:this._summary})}complete(A){if(A<this._startTime)throw Error("End time cannot be before start time");return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:A,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:A,messageCount:this._messageCount})}}class TA{_id;_role;_content;_timestamp;_toolUseIds;constructor(A){this._id=A.id,this._role=A.role,this._content=A.content,this._timestamp=new Date(A.timestamp.getTime()),this._toolUseIds=Object.freeze([...A.toolUseIds??[]])}static create(A){if(!A.id||A.id.trim()==="")throw Error("Message ID cannot be empty");if(!mZ.includes(A.role))throw Error("Invalid message role");return new TA(A)}get id(){return this._id}get role(){return this._role}get content(){return this._content}get timestamp(){return new Date(this._timestamp.getTime())}get toolUses(){return[...this._toolUseIds]}get hasContent(){return this._content.length>0}get hasToolUses(){return this._toolUseIds.length>0}equals(A){return this._id===A._id}addToolUse(A){return new TA({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,A]})}}var mZ;var l_=U(()=>{mZ=["user","assistant"]});class PA{_id;_name;_input;_timestamp;_status;_result;constructor(A){this._id=A.id,this._name=A.name,this._input=structuredClone(A.input),this._timestamp=new Date(A.timestamp.getTime()),this._status=A.status??"pending",this._result=A.result}static create(A){if(!A.id||A.id.trim()==="")throw Error("Tool use ID cannot be empty");if(!A.name||A.name.trim()==="")throw Error("Tool name cannot be empty");if(A.status&&!dZ.includes(A.status))throw Error("Invalid tool use status");return new PA(A)}get id(){return this._id}get name(){return this._name}get input(){return structuredClone(this._input)}get timestamp(){return new Date(this._timestamp.getTime())}get status(){return this._status}get result(){return this._result}get isPending(){return this._status==="pending"}get isSuccess(){return this._status==="success"}get isError(){return this._status==="error"}equals(A){return this._id===A._id}completeSuccess(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:A})}completeError(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:A})}}var dZ;var hG=U(()=>{dZ=["pending","success","error"]});class VA{_id;_sessionPath;_startedAt;_status;_completedAt;_messagesExtracted;_errorMessage;_fileMtime;_fileSize;constructor(A){this._id=A.id,this._sessionPath=A.sessionPath,this._startedAt=new Date(A.startedAt.getTime()),this._status=A.status??"pending",this._completedAt=A.completedAt?new Date(A.completedAt.getTime()):void 0,this._messagesExtracted=A.messagesExtracted??0,this._errorMessage=A.errorMessage,this._fileMtime=A.fileMtime?new Date(A.fileMtime.getTime()):void 0,this._fileSize=A.fileSize}static create(A){if(!A.id||A.id.trim()==="")throw Error("Extraction state ID cannot be empty");if(!A.sessionPath||A.sessionPath.trim()==="")throw Error("Session path cannot be empty");if(A.status&&!lZ.includes(A.status))throw Error("Invalid extraction status");if(A.messagesExtracted!==void 0&&A.messagesExtracted<0)throw Error("Messages extracted cannot be negative");if(A.fileSize!==void 0&&A.fileSize<0)throw Error("File size cannot be negative");return new VA(A)}get id(){return this._id}get sessionPath(){return this._sessionPath}get startedAt(){return new Date(this._startedAt.getTime())}get status(){return this._status}get completedAt(){return this._completedAt?new Date(this._completedAt.getTime()):void 0}get messagesExtracted(){return this._messagesExtracted}get errorMessage(){return this._errorMessage}get fileMtime(){return this._fileMtime?new Date(this._fileMtime.getTime()):void 0}get fileSize(){return this._fileSize}get isPending(){return this._status==="pending"}get isInProgress(){return this._status==="in_progress"}get isComplete(){return this._status==="complete"}get isError(){return this._status==="error"}get durationMs(){if(!this._completedAt)return;return this._completedAt.getTime()-this._startedAt.getTime()}equals(A){return this._id===A._id}startProcessing(){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"in_progress",messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}complete(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"complete",completedAt:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}fail(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"error",errorMessage:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}incrementMessages(A=1){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted+A,errorMessage:this._errorMessage,fileMtime:this._fileMtime,fileSize:this._fileSize})}withFileMetadata(A,_){if(_<0)throw Error("File size cannot be negative");return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted,errorMessage:this._errorMessage,fileMtime:A,fileSize:_})}}var lZ;var vG=U(()=>{lZ=["pending","in_progress","complete","error"]});var j;var gK=U(()=>{j={DB_CONNECTION_FAILED:"DB_CONNECTION_FAILED",DB_CORRUPTED:"DB_CORRUPTED",DB_LOCKED:"DB_LOCKED",INVALID_SESSION_ID:"INVALID_SESSION_ID",SESSION_NOT_FOUND:"SESSION_NOT_FOUND",SOURCE_INACCESSIBLE:"SOURCE_INACCESSIBLE",DISK_FULL:"DISK_FULL",INVALID_JSON:"INVALID_JSON",UNKNOWN_FORMAT:"UNKNOWN_FORMAT",SYNC_INTERRUPTED:"SYNC_INTERRUPTED",SYNC_FAILED:"SYNC_FAILED",INVALID_ARGUMENT:"INVALID_ARGUMENT",MISSING_ARGUMENT:"MISSING_ARGUMENT",VECTOR_UNAVAILABLE:"VECTOR_UNAVAILABLE",PROVIDER_TIMEOUT:"PROVIDER_TIMEOUT",PROVIDER_CONFIG_INVALID:"PROVIDER_CONFIG_INVALID",EMBEDDING_DIMENSION_MISMATCH:"EMBEDDING_DIMENSION_MISMATCH",MODEL_CORRUPTED:"MODEL_CORRUPTED",NOT_FOUND:"NOT_FOUND",INVALID_STATE:"INVALID_STATE",UNKNOWN:"UNKNOWN"}});var F;var cK=U(()=>{F=class F extends Error{code;context;constructor(A,_,G){super(_);if(this.name="MemoryError",this.code=A,this.context=G,Error.captureStackTrace)Error.captureStackTrace(this,F)}toJSON(){let A={error:{code:this.code,message:this.message}};if(this.context&&Object.keys(this.context).length>0)A.error.context=this.context;return A}}});var IA=U(()=>{gK();cK()});var p_=()=>{};var d1=U(()=>{p_()});function bG(A,_){return A instanceof CG&&(_===void 0||A.kind===_)}var CG;var l1=U(()=>{CG=class CG extends Error{kind;status;retryable;metadata;constructor(A){super(A.message);if(this.name="EmbeddingProviderError",this.kind=A.kind,this.status=A.status,this.retryable=A.retryable??!1,this.metadata=A.metadata??{},A.cause!==void 0)this.cause=A.cause}}});var dK={};k(dK,{computeModelHash:()=>p1,EmbeddingService:()=>n1});import{Buffer as uK}from"buffer";import{createHash as mK}from"crypto";function p1(A){let _=`${A.provider}:${A.model}:${A.dimensions}`;return mK("sha256").update(_).digest("hex").slice(0,16)}class n1{repository;provider;batchSize;maxBatchBytes;modelHash;modelName;redactor;constructor(A){this.repository=A.repository,this.provider=A.provider,this.batchSize=A.config.batchSize,this.maxBatchBytes=Math.max(1,A.config.maxBatchBytes??nZ),this.modelHash=p1(A.config),this.modelName=A.config.model,this.redactor=A.redactor??iZ}checkModelState(){let A=this.repository.getStoredModelHash(),_=this.modelHash,G=this.modelName;if(A===null)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};if(A===_)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};let $=this.repository.getStoredModelName()??A;return{modelChanged:!0,needsReEmbed:!0,storedHash:A,currentHash:_,storedModelName:$,currentModelName:G,embeddedCount:this.repository.getEmbeddedCount()}}async embedUnembedded(A={}){let _=Date.now(),G=0,$=0,K=Math.max(0,this.repository.getTotalMessageCount()-this.repository.getEmbeddedCount()-this.getSkippedCountForCurrentModel());if(K<=0)return{embedded:0,skipped:0,durationMs:0,rate:0};let Z=this.repository.findUnembedded(this.batchSize,this.modelHash);while(Z.length>0){let H=this.prepareBatch(Z),Q=this.chunkByPayloadBytes(H);for(let X of Q){let V=await this.embedChunk(X);G+=V.embedded,$+=V.skipped,A.onProgress?.({current:Math.min(G+$,K),total:K})}Z=this.repository.findUnembedded(this.batchSize,this.modelHash)}let Y=Date.now()-_,J=Y>0?G/(Y/1000):0;return{embedded:G,skipped:$,durationMs:Y,rate:J}}async clearAndReembed(A={}){return this.repository.clearAllEmbeddings(),this.embedUnembedded(A)}prepareBatch(A){return A.map((_)=>({rowid:_.rowid,rawContent:_.content,text:this.redactor.redactText(_.content).text}))}chunkByPayloadBytes(A){let _=[],G=[];for(let $ of A){let K=[...G,$];if(G.length>0&&this.estimatePayloadBytes(K)>this.maxBatchBytes){_.push(G),G=[$];continue}G=K}if(G.length>0)_.push(G);return _}estimatePayloadBytes(A){return uK.byteLength(JSON.stringify({model:this.modelName,input:A.map((_)=>_.text)}),"utf8")}async embedChunk(A){try{let _=await this.provider.embedBatch(A.map(($)=>$.text)),G=A.map(($,K)=>({rowid:$.rowid,embedding:_[K].embedding}));return this.repository.storeBatch(G,this.modelHash,this.modelName),{embedded:A.length,skipped:0}}catch(_){if(!bG(_,"payload_too_large"))throw _;if(A.length>1){let G=Math.ceil(A.length/2),$=await this.embedChunk(A.slice(0,G)),K=await this.embedChunk(A.slice(G));return{embedded:$.embedded+K.embedded,skipped:$.skipped+K.skipped}}return this.markPayloadTooLargeSkip(A[0]),{embedded:0,skipped:1}}}markPayloadTooLargeSkip(A){this.repository.markSkipped({messageId:A.rowid,modelHash:this.modelHash,modelName:this.modelName,provider:this.provider.name,reason:"payload_too_large",retryable:!1,contentHash:mK("sha256").update(A.rawContent).digest("hex"),contentBytes:uK.byteLength(A.rawContent,"utf8"),safeError:"Provider payload exceeded request limit for this message and model."})}getSkippedCountForCurrentModel(){return typeof this.repository.getSkippedCount==="function"?this.repository.getSkippedCount(this.modelHash):0}}var nZ=800000,iZ;var i1=U(()=>{l1();iZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})}});function e1(A,_,G){let $=new Map;for(let Z of A){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"fts",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}for(let Z of _){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"vector",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}let K=Array.from($.values()).sort((Z,Y)=>Y.rrfScore-Z.rrfScore);if(K=K.filter((Z)=>Z.rrfScore>=0.001),K=K.slice(0,G),K.length>0){let Z=K[0].rrfScore;if(Z>0)for(let Y of K)Y.normalizedScore=Y.rrfScore/Z}return K}function R0(A){let _=(A.match(/"/g)||[]).length,G=_>0&&_%2===0,$;if(G)$=A.replace(/[.:\-()[\]{}^~@/\\]/gu," ").replace(/\s+/g," ").trim();else $=A.replace(/[.:\-()[\]{}^"~@/\\]/gu," ").replace(/\s+/g," ").trim();if($)return $;let K=(A.match(/"/g)||[]).length,Y=K>0&&K%2===0?/[.:\-()[\]{}^~@/\\]/gu:/[.:\-()[\]{}^"~@/\\]/gu;return A.replace(Y," ").replace(/\s+/g," ").trim()}class F0{_id;_filePath;_fileType;_projectEncoded;_content;_contentHash;_lastIndexedAt;_createdAt;constructor(A){this._id=A.id,this._filePath=A.filePath,this._fileType=A.fileType,this._projectEncoded=A.projectEncoded,this._content=A.content,this._contentHash=A.contentHash,this._lastIndexedAt=new Date(A.lastIndexedAt.getTime()),this._createdAt=A.createdAt?new Date(A.createdAt.getTime()):new Date}static create(A){if(!A.filePath||A.filePath.trim()==="")throw Error("File path cannot be empty");if(!A.content||A.content.trim()==="")throw Error("Content cannot be empty");if(!tZ.test(A.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!pK.includes(A.fileType))throw Error(`Invalid file type: "${A.fileType}". Must be one of: ${pK.join(", ")}`);return new F0(A)}get id(){return this._id}get filePath(){return this._filePath}get fileType(){return this._fileType}get projectEncoded(){return this._projectEncoded}get content(){return this._content}get contentHash(){return this._contentHash}get lastIndexedAt(){return new Date(this._lastIndexedAt.getTime())}get createdAt(){return new Date(this._createdAt.getTime())}}var pK,tZ;var gG=U(()=>{pK=["daily_log","decisions","learnings","user_prefs"],tZ=/^[a-f0-9]{64}$/});class G0{_id;_description;_severity;_category;_status;_tool;_tags;_lastReviewedAt;_context;_sourceProject;_loggedAt;_resolvedAt;_resolution;constructor(A){this._id=A.id,this._description=A.description.trim(),this._severity=A.severity,this._category=A.category,this._status=A.status,this._tool=A.tool,this._tags=A.tags?[...A.tags]:void 0,this._lastReviewedAt=A.lastReviewedAt?new Date(A.lastReviewedAt.getTime()):void 0,this._context=A.context,this._sourceProject=A.sourceProject,this._loggedAt=new Date(A.loggedAt.getTime()),this._resolvedAt=A.resolvedAt?new Date(A.resolvedAt.getTime()):void 0,this._resolution=A.resolution}static create(A){if(!A.description||A.description.trim()==="")throw Error("Description cannot be empty");if(!nK.includes(A.severity))throw Error(`Invalid severity: "${A.severity}". Must be one of: ${nK.join(", ")}`);if(!A.category||A.category.trim()==="")throw Error("Category cannot be empty");if(!iK.includes(A.status))throw Error(`Invalid status: "${A.status}". Must be one of: ${iK.join(", ")}`);if(!A.tool||A.tool.trim()==="")throw Error("Tool cannot be empty");if(A.status==="open"&&A.resolvedAt)throw Error("Open entries cannot have a resolvedAt date");return new G0(A)}get id(){return this._id}get description(){return this._description}get severity(){return this._severity}get category(){return this._category}get status(){return this._status}get tool(){return this._tool}get tags(){return this._tags?[...this._tags]:void 0}get lastReviewedAt(){return this._lastReviewedAt?new Date(this._lastReviewedAt.getTime()):void 0}get context(){return this._context}get sourceProject(){return this._sourceProject}get loggedAt(){return new Date(this._loggedAt.getTime())}get resolvedAt(){return this._resolvedAt?new Date(this._resolvedAt.getTime()):void 0}get resolution(){return this._resolution}}var nK,iK;var uG=U(()=>{nK=["low","medium","high","critical"],iK=["open","resolved","wont-fix"]});class $0{_sessionId;_backfilledAt;_dailyLogPath;_success;_errorMessage;constructor(A){this._sessionId=A.sessionId,this._backfilledAt=new Date(A.backfilledAt.getTime()),this._dailyLogPath=A.dailyLogPath,this._success=A.success??!0,this._errorMessage=A.errorMessage}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.dailyLogPath||A.dailyLogPath.trim()==="")throw Error("Daily log path cannot be empty");return new $0(A)}get sessionId(){return this._sessionId}get backfilledAt(){return new Date(this._backfilledAt.getTime())}get dailyLogPath(){return this._dailyLogPath}get success(){return this._success}get errorMessage(){return this._errorMessage}get isSuccess(){return this._success}}var aK={};k(aK,{BackfillService:()=>s1});class s1{sessionRepo;messageRepo;backfillStateRepo;summaryGenerator;dailyLogWriter;constructor(A,_,G,$,K){this.sessionRepo=A;this.messageRepo=_;this.backfillStateRepo=G;this.summaryGenerator=$;this.dailyLogWriter=K}async dryRun(A={}){let _=await this.getUnprocessedSessions(A.project);return{unprocessedCount:_.length,estimatedCost:_.length*_Y}}async backfill(A={}){let{batch:_=50,project:G,onProgress:$}=A,Z=(await this.getUnprocessedSessions(G)).slice(0,_),Y={sessionsProcessed:0,sessionsFailed:0,sessionsSkipped:0,dailyLogsCreated:0,dailyLogsUpdated:0,errors:[]};for(let J=0;J<Z.length;J++){let H=Z[J];if(!H)continue;if(await this.backfillStateRepo.findBySessionId(H.id)){Y.sessionsSkipped++,$?.({current:J+1,total:Z.length,sessionId:H.id,action:"skipped"});continue}try{$?.({current:J+1,total:Z.length,sessionId:H.id,action:"processing"});let X=await this.extractContent(H.id),V=H.projectPath.decoded,B=V.split(/[/\\]/).filter(Boolean).pop()??V,W=await this.summaryGenerator.generateSummary(X,H.id,B,H.startTime.toISOString(),H.endTime?.toISOString()??H.startTime.toISOString()),z=`daily/${H.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(z,W+`
7
7
 
8
8
  `))Y.dailyLogsCreated++;else Y.dailyLogsUpdated++;await this.backfillStateRepo.save($0.create({sessionId:H.id,backfilledAt:new Date,dailyLogPath:z,success:!0})),Y.sessionsProcessed++}catch(X){let V=L(X);Y.sessionsFailed++,Y.errors.push({sessionId:H.id,error:V});let B=H.startTime.toISOString().slice(0,10);await this.backfillStateRepo.save($0.create({sessionId:H.id,backfilledAt:new Date,dailyLogPath:`daily/${B}.md`,success:!1,errorMessage:V})),$?.({current:J+1,total:Z.length,sessionId:H.id,action:"error"})}}return Y}async getUnprocessedSessions(A){let _=await this.sessionRepo.findFiltered({projectFilter:A,limit:1e4}),G=[];for(let $ of _)if(!await this.backfillStateRepo.findBySessionId($.id))G.push($);return G.sort(($,K)=>$.startTime.getTime()-K.startTime.getTime()),G}async extractContent(A){let G=(await this.messageRepo.findBySession(A)).filter((K)=>K.role==="user"||K.role==="assistant"),$="";for(let K of G){let Y=`${K.role==="user"?"User":"Assistant"}: ${K.content}
9
9
 
10
10
  `;if($.length+Y.length>GY){$+=`... [content truncated]
11
- `;break}$+=Y}return $}}var _Y=0.001,GY=16000;var o$=()=>{};function A5(A,_,G=4){if(_<=0){let Q=A.map((V)=>({...V,truncatedContent:V.content,allocated:V.content.length===0?0:Math.ceil(V.content.length/G),truncated:!1})),X=Q.reduce((V,B)=>V+B.allocated,0);return{sections:Q,totalTokensUsed:X,budgetExceeded:!1}}let $=_*G,K=[...A].sort((Q,X)=>Q.priority-X.priority),Z=$,Y=[],J=!1;for(let Q of K){if(Q.content.length===0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!1});continue}if(Z<=0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!0}),J=!0;continue}let X=Q.content.length;if(X<=Z){let V=Math.ceil(X/G);Y.push({...Q,truncatedContent:Q.content,allocated:V,truncated:!1}),Z-=X}else{let V=Q.content.slice(0,Z),B=Math.ceil(Z/G);Y.push({...Q,truncatedContent:V,allocated:B,truncated:!0}),Z=0,J=!0}}let H=Y.reduce((Q,X)=>Q+X.allocated,0);return{sections:Y,totalTokensUsed:H,budgetExceeded:J}}var tK={};k(tK,{candidateFromPersonaEntry:()=>pG,candidateFromGraphEdge:()=>nG,candidateFromFact:()=>lG,MemoryRankingService:()=>a_});class a_{now;policy;constructor(A={}){this.now=A.now??(()=>new Date),this.policy={defaultHalfLifeDays:A.policy?.defaultHalfLifeDays??90,halfLifeByKind:{...KY,...A.policy?.halfLifeByKind??{}},halfLifeByFactType:{...ZY,...A.policy?.halfLifeByFactType??{}},halfLifeByPersonaKind:{...YY,...A.policy?.halfLifeByPersonaKind??{}}}}rank(A){let _=this.now();return A.filter((G)=>this.isEligible(G,_)).map((G)=>this.scoreCandidate(G,_)).sort((G,$)=>{if($.score!==G.score)return $.score-G.score;return G.id.localeCompare($.id)})}isEligible(A,_){if(!A.id.trim()||!A.content.trim())return!1;if(A.supersededAt)return!1;if(A.governanceStatus&&$Y.has(A.governanceStatus))return!1;if(A.validFrom&&A.validFrom>_)return!1;if(A.validTo&&A.validTo<=_)return!1;return!0}scoreCandidate(A,_){let G=A.metric,$=S0(G?.importanceScore??A.importance??HY(A)),K=S0(G?.utilityScore??A.utility??0.5),Z=S0(A.confidence??QY(G)),Y=Math.max(0,G?.accessCount??0),J=S0(Math.log1p(Y)/Math.log(16)),H=G?.evergreen===!0||A.evergreen===!0,Q=G?.pinned===!0||A.pinned===!0,X=G?.halfLifeDays??this.resolveHalfLifeDays(A),V=A.observedAt??A.validFrom??G?.lastAccessedAt??_,B=Math.max(0,(_.getTime()-V.getTime())/86400000),W=H||Q?1:Math.pow(0.5,B/X),N=S0(A.recencyNoisePenalty??0),z=S0(0.34*$+0.26*K+0.18*Z+0.12*J+(H?0.06:0)+(Q?0.08:0)),q=S0(z*W-N),I={importance:$,utility:K,confidence:Z,accessBoost:J,accessCount:Y,halfLifeDays:X,ageDays:B,decayMultiplier:W,recencyNoisePenalty:N,baseScore:z,finalScore:q};return{...A,evergreen:H,pinned:Q,score:q,whyIncluded:JY(A,I,H,Q),components:I}}resolveHalfLifeDays(A){if(A.kind==="fact"&&XY(A.memoryType))return this.policy.halfLifeByFactType[A.memoryType]??this.policy.defaultHalfLifeDays;if(A.kind==="persona"&&VY(A.memoryType))return this.policy.halfLifeByPersonaKind[A.memoryType]??this.policy.defaultHalfLifeDays;return this.policy.halfLifeByKind[A.kind]??this.policy.defaultHalfLifeDays}}function lG(A,_){let G=A.metadata??{};return{id:A.uuid,kind:"fact",memoryType:A.type,content:A.content,project:A.project,observedAt:A.observedAt,supersededAt:A.supersededAt,confidence:E0(G.confidence),importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function pG(A,_){return{id:A.entryId,kind:"persona",memoryType:A.kind,content:A.content,project:A.project,observedAt:A.updatedAt,validTo:A.expiresAt,confidence:A.confidence,metric:_}}function nG(A,_){let G=A.metadata??{};return{id:A.edgeId,kind:"graph",memoryType:A.relationship,content:`${A.source.label} --${A.relationship}--> ${A.target.label}`,project:A.project,observedAt:A.validFrom,validFrom:A.validFrom,validTo:A.validTo,confidence:A.confidence,importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function JY(A,_,G,$){return["active",`kind=${A.kind}`,A.memoryType?`type=${A.memoryType}`:null,`importance=${i_(_.importance)}`,`utility=${i_(_.utility)}`,`confidence=${i_(_.confidence)}`,`access_count=${_.accessCount}`,`decay=${i_(_.decayMultiplier)}`,G?"evergreen":null,$?"pinned":null,`score=${i_(_.finalScore)}`].filter((Z)=>Z!==null).join("; ")}function HY(A){if(A.kind==="persona"||A.kind==="graph")return 0.65;if(A.kind==="fact")switch(A.memoryType){case"decision":case"preference":case"supersedence":return 0.7;case"learning":return 0.6;case"friction":return 0.55;case"observation":return 0.35;default:return 0.5}return 0.5}function QY(A){return A?Math.max(A.importanceScore,A.utilityScore,0.5):0.8}function S0(A){if(!Number.isFinite(A))return 0;return Math.min(1,Math.max(0,A))}function i_(A){return A.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function E0(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function dG(A){return typeof A==="boolean"?A:void 0}function rK(A){if(A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired")return A;return}function XY(A){return A==="decision"||A==="learning"||A==="preference"||A==="friction"||A==="observation"||A==="supersedence"}function VY(A){return A==="preference"||A==="procedure"||A==="correction"||A==="decision_pattern"||A==="friction_pattern"}var $Y,KY,ZY,YY;var r_=U(()=>{$Y=new Set(["pending_review","suppressed","invalidated","expired"]),KY={fact:90,persona:180,graph:120,link:60,dream:30},ZY={decision:365,learning:180,preference:365,friction:45,observation:14,supersedence:365},YY={preference:365,procedure:365,correction:240,decision_pattern:180,friction_pattern:120}});var sK={};k(sK,{SmartContextService:()=>t_});function WY(A){if(A.length===0)return 0;return Math.ceil(A.length/BY)}function zY(A){return`#${A.id} (${A.severity}/${A.category}): ${A.description}`}function NY(A,_){return`- ${A.content}${qY(_)}`}function LY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.content}`,`(confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}; review: ${A.reviewStatus} after ${A.reviewAfter.toISOString()}${eK(_)})`].join(" ")}function MY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.source.label} --${A.relationship}--> ${A.target.label}`,`(id: ${A.edgeId}; confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}${eK(_)})`].join(" ")}function qY(A){return A?` (rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded})`:""}function eK(A){return A?`; rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded}`:""}class t_{projectResolver;factRepo;frictionRepo;personaRepo;graphRepo;governancePolicy;rankingService;utilityRepo;getSessionSummary;now;constructor(A){if(this.projectResolver=A.projectResolver,this.factRepo=A.factRepo,this.frictionRepo=A.frictionRepo,this.personaRepo=A.personaRepo,this.graphRepo=A.graphRepo,this.governancePolicy=A.governancePolicy,this.rankingService=A.rankingService,this.utilityRepo=A.utilityRepo,this.now=A.now??(()=>new Date),A.getSessionSummary)this.getSessionSummary=A.getSessionSummary}async getContext(A){let _=this.projectResolver.resolveProjectEncoded(A.projectFilter),G=this.projectResolver.resolveProjectName(A.projectFilter);if(!_||!G)return null;let $=await this.factRepo.findByProject(G),K=await this.filterAllowedFacts($.filter((z)=>z.supersededAt===null)),Z=async(z)=>{return(await this.rankFacts(z)).map(({item:I,rank:T})=>NY(I,T)).join(`
11
+ `;break}$+=Y}return $}}var _Y=0.001,GY=16000;var o1=()=>{};function A5(A,_,G=4){if(_<=0){let Q=A.map((V)=>({...V,truncatedContent:V.content,allocated:V.content.length===0?0:Math.ceil(V.content.length/G),truncated:!1})),X=Q.reduce((V,B)=>V+B.allocated,0);return{sections:Q,totalTokensUsed:X,budgetExceeded:!1}}let $=_*G,K=[...A].sort((Q,X)=>Q.priority-X.priority),Z=$,Y=[],J=!1;for(let Q of K){if(Q.content.length===0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!1});continue}if(Z<=0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!0}),J=!0;continue}let X=Q.content.length;if(X<=Z){let V=Math.ceil(X/G);Y.push({...Q,truncatedContent:Q.content,allocated:V,truncated:!1}),Z-=X}else{let V=Q.content.slice(0,Z),B=Math.ceil(Z/G);Y.push({...Q,truncatedContent:V,allocated:B,truncated:!0}),Z=0,J=!0}}let H=Y.reduce((Q,X)=>Q+X.allocated,0);return{sections:Y,totalTokensUsed:H,budgetExceeded:J}}var tK={};k(tK,{candidateFromPersonaEntry:()=>pG,candidateFromGraphEdge:()=>nG,candidateFromFact:()=>lG,MemoryRankingService:()=>a_});class a_{now;policy;constructor(A={}){this.now=A.now??(()=>new Date),this.policy={defaultHalfLifeDays:A.policy?.defaultHalfLifeDays??90,halfLifeByKind:{...KY,...A.policy?.halfLifeByKind??{}},halfLifeByFactType:{...ZY,...A.policy?.halfLifeByFactType??{}},halfLifeByPersonaKind:{...YY,...A.policy?.halfLifeByPersonaKind??{}}}}rank(A){let _=this.now();return A.filter((G)=>this.isEligible(G,_)).map((G)=>this.scoreCandidate(G,_)).sort((G,$)=>{if($.score!==G.score)return $.score-G.score;return G.id.localeCompare($.id)})}isEligible(A,_){if(!A.id.trim()||!A.content.trim())return!1;if(A.supersededAt)return!1;if(A.governanceStatus&&$Y.has(A.governanceStatus))return!1;if(A.validFrom&&A.validFrom>_)return!1;if(A.validTo&&A.validTo<=_)return!1;return!0}scoreCandidate(A,_){let G=A.metric,$=S0(G?.importanceScore??A.importance??HY(A)),K=S0(G?.utilityScore??A.utility??0.5),Z=S0(A.confidence??QY(G)),Y=Math.max(0,G?.accessCount??0),J=S0(Math.log1p(Y)/Math.log(16)),H=G?.evergreen===!0||A.evergreen===!0,Q=G?.pinned===!0||A.pinned===!0,X=G?.halfLifeDays??this.resolveHalfLifeDays(A),V=A.observedAt??A.validFrom??G?.lastAccessedAt??_,B=Math.max(0,(_.getTime()-V.getTime())/86400000),W=H||Q?1:Math.pow(0.5,B/X),N=S0(A.recencyNoisePenalty??0),z=S0(0.34*$+0.26*K+0.18*Z+0.12*J+(H?0.06:0)+(Q?0.08:0)),q=S0(z*W-N),I={importance:$,utility:K,confidence:Z,accessBoost:J,accessCount:Y,halfLifeDays:X,ageDays:B,decayMultiplier:W,recencyNoisePenalty:N,baseScore:z,finalScore:q};return{...A,evergreen:H,pinned:Q,score:q,whyIncluded:JY(A,I,H,Q),components:I}}resolveHalfLifeDays(A){if(A.kind==="fact"&&XY(A.memoryType))return this.policy.halfLifeByFactType[A.memoryType]??this.policy.defaultHalfLifeDays;if(A.kind==="persona"&&VY(A.memoryType))return this.policy.halfLifeByPersonaKind[A.memoryType]??this.policy.defaultHalfLifeDays;return this.policy.halfLifeByKind[A.kind]??this.policy.defaultHalfLifeDays}}function lG(A,_){let G=A.metadata??{};return{id:A.uuid,kind:"fact",memoryType:A.type,content:A.content,project:A.project,observedAt:A.observedAt,supersededAt:A.supersededAt,confidence:E0(G.confidence),importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function pG(A,_){return{id:A.entryId,kind:"persona",memoryType:A.kind,content:A.content,project:A.project,observedAt:A.updatedAt,validTo:A.expiresAt,confidence:A.confidence,metric:_}}function nG(A,_){let G=A.metadata??{};return{id:A.edgeId,kind:"graph",memoryType:A.relationship,content:`${A.source.label} --${A.relationship}--> ${A.target.label}`,project:A.project,observedAt:A.validFrom,validFrom:A.validFrom,validTo:A.validTo,confidence:A.confidence,importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function JY(A,_,G,$){return["active",`kind=${A.kind}`,A.memoryType?`type=${A.memoryType}`:null,`importance=${i_(_.importance)}`,`utility=${i_(_.utility)}`,`confidence=${i_(_.confidence)}`,`access_count=${_.accessCount}`,`decay=${i_(_.decayMultiplier)}`,G?"evergreen":null,$?"pinned":null,`score=${i_(_.finalScore)}`].filter((Z)=>Z!==null).join("; ")}function HY(A){if(A.kind==="persona"||A.kind==="graph")return 0.65;if(A.kind==="fact")switch(A.memoryType){case"decision":case"preference":case"supersedence":return 0.7;case"learning":return 0.6;case"friction":return 0.55;case"observation":return 0.35;default:return 0.5}return 0.5}function QY(A){return A?Math.max(A.importanceScore,A.utilityScore,0.5):0.8}function S0(A){if(!Number.isFinite(A))return 0;return Math.min(1,Math.max(0,A))}function i_(A){return A.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function E0(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function dG(A){return typeof A==="boolean"?A:void 0}function rK(A){if(A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired")return A;return}function XY(A){return A==="decision"||A==="learning"||A==="preference"||A==="friction"||A==="observation"||A==="supersedence"}function VY(A){return A==="preference"||A==="procedure"||A==="correction"||A==="decision_pattern"||A==="friction_pattern"}var $Y,KY,ZY,YY;var r_=U(()=>{$Y=new Set(["pending_review","suppressed","invalidated","expired"]),KY={fact:90,persona:180,graph:120,link:60,dream:30},ZY={decision:365,learning:180,preference:365,friction:45,observation:14,supersedence:365},YY={preference:365,procedure:365,correction:240,decision_pattern:180,friction_pattern:120}});var sK={};k(sK,{SmartContextService:()=>t_});function WY(A){if(A.length===0)return 0;return Math.ceil(A.length/BY)}function zY(A){return`#${A.id} (${A.severity}/${A.category}): ${A.description}`}function NY(A,_){return`- ${A.content}${qY(_)}`}function LY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.content}`,`(confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}; review: ${A.reviewStatus} after ${A.reviewAfter.toISOString()}${eK(_)})`].join(" ")}function MY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.source.label} --${A.relationship}--> ${A.target.label}`,`(id: ${A.edgeId}; confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}${eK(_)})`].join(" ")}function qY(A){return A?` (rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded})`:""}function eK(A){return A?`; rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded}`:""}class t_{projectResolver;factRepo;frictionRepo;personaRepo;graphRepo;governancePolicy;rankingService;utilityRepo;getSessionSummary;now;constructor(A){if(this.projectResolver=A.projectResolver,this.factRepo=A.factRepo,this.frictionRepo=A.frictionRepo,this.personaRepo=A.personaRepo,this.graphRepo=A.graphRepo,this.governancePolicy=A.governancePolicy,this.rankingService=A.rankingService,this.utilityRepo=A.utilityRepo,this.now=A.now??(()=>new Date),A.getSessionSummary)this.getSessionSummary=A.getSessionSummary}async getContext(A){let _=this.projectResolver.resolveProjectEncoded(A.projectFilter),G=this.projectResolver.resolveProjectName(A.projectFilter);if(!_||!G)return null;let $=await this.factRepo.findByProject(G),K=await this.filterAllowedFacts($.filter((z)=>z.supersededAt===null)),Z=async(z)=>{return(await this.rankFacts(z)).map(({item:I,rank:T})=>NY(I,T)).join(`
12
12
  `)},Y=[],J=K.filter((z)=>z.type==="decision");if(J.length>0)Y.push(this.buildSection("decisions","Active Decisions",1,await Z(J)));let H=K.filter((z)=>z.type==="learning");if(H.length>0)Y.push(this.buildSection("learnings","Recent Learnings",2,await Z(H)));let Q=K.filter((z)=>z.type==="preference");if(Q.length>0)Y.push(this.buildSection("preferences","User Preferences",3,await Z(Q)));let X=await this.buildPersonaContent(G);if(X)Y.push(this.buildSection("persona","Persona and Procedural Memory",4,X));let V=await this.buildGraphContent(G);if(V)Y.push(this.buildSection("semantic_graph","Temporal Semantic Graph",4,V));let B=K.filter((z)=>z.type==="observation");if(B.length>0)Y.push(this.buildSection("observations","Observations",4,await Z(B)));if(A.crossProject){let z=await this.factRepo.findAll(),q=await this.filterAllowedFacts(z.filter((O)=>O.supersededAt===null&&O.project!==G&&UY(O))),I=q.filter((O)=>O.type==="preference");if(I.length>0)Y.push(this.buildSection("cross_project_preferences","Global/Cross-Project User Preferences",5,await Z(I)));let T=q.filter((O)=>O.type==="decision");if(T.length>0)Y.push(this.buildSection("cross_project_decisions","Cross-Project Decisions",6,await Z(T)));let M=q.filter((O)=>O.type==="learning");if(M.length>0)Y.push(this.buildSection("cross_project_learnings","Cross-Project Learnings",7,await Z(M)))}let W=await this.buildFrictionContent(A.projectFilter);if(W)Y.push(this.buildSection("friction","Open Friction",8,W));if(this.getSessionSummary){let z=await this.getSessionSummary(A.projectFilter,A.days);if(z)Y.push(this.buildSection("session_summary","Session Summary",9,z))}if(A.budget&&A.budget>0)return this.applyBudget(G,_,Y,A.budget);let N=Y.reduce((z,q)=>z+q.tokenEstimate,0);return{projectName:G,projectEncoded:_,sections:Y,totalTokensEstimate:N,truncated:!1}}buildSection(A,_,G,$){return{key:A,title:_,priority:G,content:$,truncated:!1,tokenEstimate:WY($)}}async buildFrictionContent(A){let _=await this.frictionRepo.findOpen();if(_.length===0)return null;let G=_.filter((K)=>K.description.includes(A)||K.context&&K.context.includes(A));return(G.length>0?G:_).map(zY).join(`
13
13
  `)}async buildPersonaContent(A){if(!this.personaRepo)return null;let _=await this.filterAllowedPersona(await this.personaRepo.findForContext(A));if(_.length===0)return null;return(await this.rankPersona(_)).map(({item:$,rank:K})=>LY($,K)).join(`
14
14
  `)}async buildGraphContent(A){if(!this.graphRepo)return null;let _=await this.filterAllowedGraph(await this.graphRepo.findCurrent({project:A,includeGlobal:!0,asOf:this.now(),minConfidence:0.7,limit:12}));if(_.length===0)return null;return(await this.rankGraph(_)).map(({item:$,rank:K})=>MY($,K)).join(`
15
15
  `)}async rankFacts(A){if(!this.rankingService||A.length===0)return A.map(($)=>({item:$}));let _=await this.lookupMetrics("fact",A.map(($)=>$.uuid)),G=new Map(A.map(($)=>[$.uuid,$]));return this.rankingService.rank(A.map(($)=>lG($,_.get($.uuid)))).map(($)=>({item:G.get($.id),rank:$}))}async rankPersona(A){if(!this.rankingService||A.length===0)return A.map(($)=>({item:$}));let _=await this.lookupMetrics("persona",A.map(($)=>$.entryId)),G=new Map(A.map(($)=>[$.entryId,$]));return this.rankingService.rank(A.map(($)=>pG($,_.get($.entryId)))).map(($)=>({item:G.get($.id),rank:$}))}async rankGraph(A){if(!this.rankingService||A.length===0)return A.map(($)=>({item:$}));let _=await this.lookupMetrics("graph",A.map(($)=>$.edgeId)),G=new Map(A.map(($)=>[$.edgeId,$]));return this.rankingService.rank(A.map(($)=>nG($,_.get($.edgeId)))).map(($)=>({item:G.get($.id),rank:$}))}async lookupMetrics(A,_){if(!this.utilityRepo||_.length===0)return new Map;let G=await this.utilityRepo.findByTargetIds(A,_);return new Map(G.map(($)=>[$.targetId,$]))}async filterAllowedFacts(A){if(!this.governancePolicy||A.length===0)return A;return this.governancePolicy.filterAllowed("fact",A,(_)=>_.uuid)}async filterAllowedPersona(A){if(!this.governancePolicy||A.length===0)return A;return this.governancePolicy.filterAllowed("persona",A,(_)=>_.entryId)}async filterAllowedGraph(A){if(!this.governancePolicy||A.length===0)return A;return this.governancePolicy.filterAllowed("graph",A,(_)=>_.edgeId)}applyBudget(A,_,G,$){let K=G.map((J)=>({key:J.key,priority:J.priority,content:J.content})),Z=A5(K,$),Y=Z.sections.map((J)=>{let H=G.find((Q)=>Q.key===J.key);return{key:J.key,title:H.title,priority:J.priority,content:J.truncatedContent,truncated:J.truncated,tokenEstimate:J.allocated}});return{projectName:A,projectEncoded:_,sections:Y,totalTokensEstimate:Z.totalTokensUsed,truncated:Z.budgetExceeded}}}function UY(A){let _=A.metadata??{};if(_.visibility==="global")return!0;let $=_.scope;return typeof $==="object"&&$!==null&&!Array.isArray($)&&$.visibility==="global"}var BY=4;var iG=U(()=>{r_()});var oK={};k(oK,{AmbientContextService:()=>_5});class _5{smartContext;contextWriter;formatter;constructor(A,_,G){this.smartContext=A;this.contextWriter=_;this.formatter=G}async generateAmbientContext(A){let _=await this.smartContext.getContext({projectFilter:A.projectName,budget:A.budget,crossProject:!0});if(_===null)return{success:!1,reason:"project-not-found"};if(_.sections.length===0)return{success:!1,reason:"no-context"};let G=this.formatter.formatSmartContext(_),$=this.buildSummaryBlock(_);return await this.contextWriter.writeContextFile(A.autoMemoryDir,G),await this.contextWriter.updateMemoryBlock(A.autoMemoryDir,$),{success:!0,contextTokens:_.totalTokensEstimate}}buildSummaryBlock(A){let _=this.countSectionLines(A.sections,"decisions"),G=this.countSectionLines(A.sections,"learnings"),$=this.countSectionLines(A.sections,"friction"),K=new Date().toISOString().split("T")[0];return["## Cross-Project Context",`Run \`memory context ${A.projectName}\` for full briefing. See [context.md](context.md) for latest snapshot.`,`- ${_} active decisions, ${G} learnings`,`- Open friction: ${$}`,`- Last synced: ${K}`].join(`
16
16
  `)}countSectionLines(A,_){let G=A.find(($)=>$.key===_);if(!G||!G.content)return 0;return G.content.split(`
17
- `).filter(($)=>$.trim().length>0).length}}class aG{projections;constructor(A){let _=new Set;for(let G of A){if(!G.name||G.name.trim()==="")throw Error("Projection name is required");if(_.has(G.name))throw Error(`Duplicate projection name: ${G.name}`);_.add(G.name)}this.projections=A.map((G)=>({...G,consumedKinds:[...G.consumedKinds]}))}getConsumedKinds(A){let _=this.projections.find((G)=>G.name===A);if(!_)throw Error(`Projection not found: ${A}`);return[..._.consumedKinds]}async replay(A,_){for(let Y of this.projections)await Y.reset?.(_);let G=new Set,$=new Set,K=0,Z=0;for(let Y of A){if(G.has(Y.eventId)){Z+=1;continue}G.add(Y.eventId),K+=1;for(let J of this.projections)if(J.consumedKinds.includes(Y.kind)){if(await J.apply(Y,_)!==!1)$.add(J.name)}}return{processedEvents:K,skippedDuplicateEvents:Z,appliedProjections:[...$]}}}class GA{params;constructor(A){this.params={id:A.id,surface:A.surface,targetId:A.targetId,project:A.project,visibility:A.visibility,sourceEventIds:[...A.sourceEventIds],transformationMethod:A.transformationMethod,actor:A.actor,confidence:A.confidence,redactionState:A.redactionState,consentStatus:A.consentStatus,consentScopes:[...A.consentScopes],scope:_6(A.scope),status:A.status??"active",statusReason:A.statusReason,createdAt:K0(A.createdAt??new Date),updatedAt:K0(A.updatedAt??A.createdAt??new Date),reviewedAt:A.reviewedAt?K0(A.reviewedAt):null,expiresAt:A.expiresAt?K0(A.expiresAt):null,lastEventId:A.lastEventId}}static create(A){return TY(A),new GA(A)}get id(){return this.params.id}get surface(){return this.params.surface}get targetId(){return this.params.targetId}get project(){return this.params.project}get visibility(){return this.params.visibility}get sourceEventIds(){return[...this.params.sourceEventIds]}get transformationMethod(){return this.params.transformationMethod}get actor(){return this.params.actor}get confidence(){return this.params.confidence}get redactionState(){return this.params.redactionState}get consentStatus(){return this.params.consentStatus}get consentScopes(){return[...this.params.consentScopes]}get scope(){return _6(this.params.scope)}get status(){return this.params.status}get statusReason(){return this.params.statusReason}get createdAt(){return K0(this.params.createdAt)}get updatedAt(){return K0(this.params.updatedAt)}get reviewedAt(){return this.params.reviewedAt?K0(this.params.reviewedAt):null}get expiresAt(){return this.params.expiresAt?K0(this.params.expiresAt):null}get lastEventId(){return this.params.lastEventId}withId(A){return GA.create({...this.toParams(),id:A})}withControl(A){let _=this.toParams(),G=IY(A.control,this.status);return GA.create({..._,status:G,actor:A.actor,statusReason:A.reason??_.statusReason,updatedAt:A.occurredAt,reviewedAt:A.control==="review"?A.occurredAt:_.reviewedAt,expiresAt:A.control==="expire"?A.expiresAt??A.occurredAt:A.expiresAt!==void 0?A.expiresAt:_.expiresAt,consentStatus:A.consentStatus??_.consentStatus,consentScopes:A.consentScopes??_.consentScopes,lastEventId:A.lastEventId??_.lastEventId})}isBlocked(A=new Date){if(this.status==="suppressed"||this.status==="invalidated"||this.status==="expired")return!0;if(this.status==="pending_review")return!0;if(this.expiresAt&&this.expiresAt.getTime()<=A.getTime())return!0;if(this.consentStatus==="denied"||this.consentStatus==="revoked")return!0;if(this.redactionState==="quarantined")return!0;return!1}toJSON(A=new Date){return{...this.id!==void 0?{id:this.id}:{},surface:this.surface,target_id:this.targetId,...this.project!==void 0?{project:this.project}:{},visibility:this.visibility,source_event_ids:this.sourceEventIds,transformation_method:this.transformationMethod,actor:this.actor,confidence:this.confidence,redaction_state:this.redactionState,consent_status:this.consentStatus,consent_scopes:this.consentScopes,scope:this.scope,status:this.status,...this.statusReason!==void 0?{status_reason:this.statusReason}:{},created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString(),reviewed_at:this.reviewedAt?this.reviewedAt.toISOString():null,expires_at:this.expiresAt?this.expiresAt.toISOString():null,...this.lastEventId!==void 0?{last_event_id:this.lastEventId}:{},blocked:this.isBlocked(A)}}toParams(){return{id:this.id,surface:this.surface,targetId:this.targetId,project:this.project,visibility:this.visibility,sourceEventIds:this.sourceEventIds,transformationMethod:this.transformationMethod,actor:this.actor,confidence:this.confidence,redactionState:this.redactionState,consentStatus:this.consentStatus,consentScopes:this.consentScopes,scope:this.scope,status:this.status,statusReason:this.statusReason,createdAt:this.createdAt,updatedAt:this.updatedAt,reviewedAt:this.reviewedAt,expiresAt:this.expiresAt,lastEventId:this.lastEventId}}}function A_(A){if(!tG.includes(A))throw Error(`Invalid memory governance surface: ${A}`);return A}function G5(A){if(!$6.includes(A))throw Error(`Invalid memory governance control: ${A}`);return A}function TY(A){if(A_(A.surface),!A.targetId||A.targetId.trim()==="")throw Error("Memory governance targetId is required");if(!["project","workspace","global"].includes(A.visibility))throw Error("Memory governance visibility is invalid");if(A6("sourceEventIds",A.sourceEventIds),!A.transformationMethod||A.transformationMethod.trim()==="")throw Error("Memory governance transformationMethod is required");if(!A.actor||A.actor.trim()==="")throw Error("Memory governance actor is required");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("Memory governance confidence must be between 0 and 1");if(!["none","redacted","quarantined"].includes(A.redactionState))throw Error("Memory governance redactionState is invalid");if(!["not_required","granted","denied","revoked"].includes(A.consentStatus))throw Error("Memory governance consentStatus is invalid");if(A6("consentScopes",A.consentScopes),!A.scope||!["project","workspace","global"].includes(A.scope.visibility))throw Error("Memory governance scope.visibility is invalid");if(A.status&&!G6.includes(A.status))throw Error("Memory governance status is invalid");rG("createdAt",A.createdAt),rG("updatedAt",A.updatedAt),rG("reviewedAt",A.reviewedAt??void 0),rG("expiresAt",A.expiresAt??void 0)}function IY(A,_){switch(A){case"register":case"unsuppress":case"review":case"consent_grant":return"active";case"suppress":return"suppressed";case"invalidate":return"invalidated";case"expire":return"expired";case"consent_revoke":return _==="invalidated"?"invalidated":"suppressed"}}function A6(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`Memory governance ${A} must be a string array`)}function rG(A,_){if(_!==void 0&&_!==null&&(!(_ instanceof Date)||Number.isNaN(_.getTime())))throw Error(`Memory governance ${A} must be a valid date`)}function K0(A){return new Date(A.getTime())}function _6(A){return JSON.parse(JSON.stringify(A))}var tG,G6,$6;var D0=U(()=>{tG=["fact","context","provider_egress","remote_sync","friction","evaluation","persona","graph","ranking","dream","projection"],G6=["active","pending_review","suppressed","invalidated","expired"],$6=["register","suppress","unsuppress","invalidate","expire","review","consent_grant","consent_revoke"]});class fA{params;constructor(A){this.params={id:A.id,entryId:A.entryId,kind:A.kind,content:A.content.trim(),project:A.project,visibility:A.visibility,sourceEventIds:[...A.sourceEventIds],sourceKinds:[...A.sourceKinds],confidence:A.confidence,scope:K6(A.scope),reviewStatus:A.reviewStatus,reviewAfter:Z0(A.reviewAfter),expiresAt:A.expiresAt?Z0(A.expiresAt):null,why:A.why.trim(),createdAt:Z0(A.createdAt??new Date),updatedAt:Z0(A.updatedAt??A.createdAt??new Date)}}static create(A){return OY(A),new fA(A)}get id(){return this.params.id}get entryId(){return this.params.entryId}get kind(){return this.params.kind}get content(){return this.params.content}get project(){return this.params.project}get visibility(){return this.params.visibility}get sourceEventIds(){return[...this.params.sourceEventIds]}get sourceKinds(){return[...this.params.sourceKinds]}get confidence(){return this.params.confidence}get scope(){return K6(this.params.scope)}get reviewStatus(){return this.params.reviewStatus}get reviewAfter(){return Z0(this.params.reviewAfter)}get expiresAt(){return this.params.expiresAt?Z0(this.params.expiresAt):null}get why(){return this.params.why}get controls(){return[...Z6]}get createdAt(){return Z0(this.params.createdAt)}get updatedAt(){return Z0(this.params.updatedAt)}withId(A){return fA.create({...this.toParams(),id:A})}toJSON(){return{...this.id!==void 0?{id:this.id}:{},entry_id:this.entryId,kind:this.kind,content:this.content,...this.project!==void 0?{project:this.project}:{},visibility:this.visibility,source_event_ids:this.sourceEventIds,source_kinds:this.sourceKinds,confidence:this.confidence,scope:this.scope,review_status:this.reviewStatus,review_after:this.reviewAfter.toISOString(),expires_at:this.expiresAt?this.expiresAt.toISOString():null,why:this.why,controls:this.controls,created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString()}}toParams(){return{id:this.id,entryId:this.entryId,kind:this.kind,content:this.content,project:this.project,visibility:this.visibility,sourceEventIds:this.sourceEventIds,sourceKinds:this.sourceKinds,confidence:this.confidence,scope:this.scope,reviewStatus:this.reviewStatus,reviewAfter:this.reviewAfter,expiresAt:this.expiresAt,why:this.why,createdAt:this.createdAt,updatedAt:this.updatedAt}}}function OY(A){if(!A.entryId||A.entryId.trim()==="")throw Error("entryId cannot be empty");if(!eG.includes(A.kind))throw Error(`Invalid persona kind: ${A.kind}`);if(!A.content||A.content.trim()==="")throw Error("content cannot be empty");if(A.visibility==="project"&&(!A.project||A.project.trim()===""))throw Error("project is required for project-visible persona entries");if(!A.sourceEventIds||A.sourceEventIds.length===0)throw Error("sourceEventIds must include at least one source id");if(!A.sourceKinds||A.sourceKinds.length===0)throw Error("sourceKinds must include at least one source kind");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("confidence must be between 0 and 1");if(!A.scope||!A.scope.visibility)throw Error("scope with visibility is required");if(A.reviewStatus!=="pending_review"&&A.reviewStatus!=="reviewed")throw Error("reviewStatus must be pending_review or reviewed");if(!(A.reviewAfter instanceof Date)||Number.isNaN(A.reviewAfter.getTime()))throw Error("reviewAfter must be a valid Date");if(!A.why||A.why.trim()==="")throw Error("why cannot be empty")}function Z0(A){return new Date(A.getTime())}function K6(A){return JSON.parse(JSON.stringify(A))}var eG,Z6;var e_=U(()=>{eG=["preference","procedure","correction","decision_pattern","friction_pattern"],Z6=["suppress","invalidate","expire","review"]});import{createHash as jY}from"crypto";class oG{deps;now;constructor(A){this.deps=A;this.now=A.now??(()=>new Date)}async rebuildProfile(A={}){let G=(A.project?await this.deps.factRepo.findByProject(A.project):await this.deps.factRepo.findAll()).filter((H)=>H.supersededAt===null),$=G.flatMap((H)=>this.entryFromFact(H)),K=await this.deps.frictionRepo.findPatterns(3),Z=K.filter((H)=>!A.project||H.entries.some((Q)=>Q.sourceProject===A.project||!Q.sourceProject)).map((H)=>this.entryFromFrictionPattern(H.tool,H.category,H.count,H.entries,A.project)),Y=PY([...$,...Z]);if(A.project)await this.deps.personaRepo.deleteByProject(A.project);else await this.deps.personaRepo.clearAll();let J=await this.deps.personaRepo.saveMany(Y);for(let H of J)await this.deps.governanceRepo.save(this.governanceEntryFor(H));return{entries:J,factCount:G.length,frictionPatternCount:K.length}}entryFromFact(A){return Y6(A,this.now())}entryFromFrictionPattern(A,_,G,$,K){let Z=this.now(),Y=$.map((H)=>`friction:${H.id??H.loggedAt.toISOString()}`),J=$.slice(0,3).map((H)=>H.description).join("; ");return fA.create({entryId:J6("friction_pattern",`${A}:${_}:${K??"global"}`),kind:"friction_pattern",content:`${A}/${_} has ${G} recurring friction entries: ${J}`,project:K,visibility:K?"project":"global",sourceEventIds:Y,sourceKinds:["friction"],confidence:Math.min(0.95,0.65+G*0.05),scope:K?{project:K,visibility:"project"}:{visibility:"global"},reviewStatus:"pending_review",reviewAfter:Q6(Z,30),why:"Derived from recurring friction patterns.",createdAt:Z,updatedAt:Z})}governanceEntryFor(A){return GA.create({surface:"persona",targetId:A.entryId,project:A.project,visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:"persona-profile-service",actor:"memory",confidence:A.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:A.scope,status:"active",createdAt:A.createdAt,updatedAt:A.updatedAt,expiresAt:A.expiresAt,lastEventId:A.sourceEventIds[0]})}}function Y6(A,_=new Date){let G=RY(A);if(!G)return[];let $=A.metadata??{},K=SY($),Z=EY(A.project,K),Y=FY(A,$),J=Q6(_,H6($.review_after_days,30));return[fA.create({entryId:J6(G,A.uuid),kind:G,content:A.content,project:A.project,visibility:K,sourceEventIds:[A.uuid],sourceKinds:Y,confidence:DY(G,$),scope:Z,reviewStatus:"pending_review",reviewAfter:J,expiresAt:yY($.expires_at),why:xY(G),createdAt:_,updatedAt:_})]}function $5(A,_=new Date){return Y6(A,_)[0]??null}function RY(A){let _=A.metadata??{},G=sG(_.persona_kind);if(G&&kY(G))return G;let $=sG(_.source_kind);if($==="correction")return"correction";if($==="validated_behavior")return"procedure";if(A.type==="preference")return"preference";return null}function FY(A,_){return[sG(_.source_kind)??A.type]}function SY(A){let _=sG(A.visibility);return _==="global"||_==="workspace"||_==="project"?_:"project"}function EY(A,_){if(_==="project")return{project:A,visibility:_};return{visibility:_}}function DY(A,_){let G=H6(_.confidence,NaN);if(Number.isFinite(G))return Math.max(0,Math.min(1,G));switch(A){case"correction":return 0.88;case"procedure":return 0.82;case"decision_pattern":return 0.8;case"friction_pattern":return 0.75;case"preference":return 0.85}}function xY(A){switch(A){case"preference":return"Derived from an active preference fact.";case"correction":return"Derived from a repeated correction or explicit behavioral instruction.";case"procedure":return"Derived from a validated procedural behavior pattern.";case"decision_pattern":return"Derived from a durable decision pattern.";case"friction_pattern":return"Derived from recurring friction patterns."}}function J6(A,_){return`persona-${A}-${jY("sha256").update(_).digest("hex").slice(0,12)}`}function PY(A){let _=new Set;return A.filter((G)=>{if(_.has(G.entryId))return!1;return _.add(G.entryId),!0})}function sG(A){return typeof A==="string"&&A.trim()?A:null}function H6(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function yY(A){if(typeof A!=="string"||!A.trim())return null;let _=new Date(A);return Number.isNaN(_.getTime())?null:_}function Q6(A,_){return new Date(A.getTime()+_*24*60*60*1000)}function kY(A){return["preference","procedure","correction","decision_pattern","friction_pattern"].includes(A)}var A1=U(()=>{D0();e_()});import{createHash as hY}from"crypto";class Y0{_id;_edgeId;_source;_target;_relationship;_project;_visibility;_sourceEventIds;_sourceKinds;_confidence;_validFrom;_validTo;_why;_metadata;_createdAt;_updatedAt;constructor(A){this._id=A.id,this._source=G1(A.source),this._target=G1(A.target),this._relationship=A.relationship.trim(),this._project=A.project?.trim()||void 0,this._visibility=A.visibility,this._sourceEventIds=[...A.sourceEventIds],this._sourceKinds=[...A.sourceKinds],this._confidence=A.confidence,this._validFrom=new Date(A.validFrom.getTime()),this._validTo=A.validTo?new Date(A.validTo.getTime()):null,this._why=A.why.trim(),this._metadata=A.metadata?V6(A.metadata):void 0,this._createdAt=new Date(A.createdAt.getTime()),this._updatedAt=new Date(A.updatedAt.getTime()),this._edgeId=A.edgeId?.trim()||CY(this)}static create(A){if(X6(A.source,"source"),X6(A.target,"target"),bY(A.relationship),fY(A.visibility),A.visibility==="project"&&(!A.project||!A.project.trim()))throw Error("project is required for project-visible graph edges");if(!Array.isArray(A.sourceEventIds)||A.sourceEventIds.length===0)throw Error("Graph edge sourceEventIds must include at least one source id");if(!Array.isArray(A.sourceKinds)||A.sourceKinds.length===0)throw Error("Graph edge sourceKinds must include at least one source kind");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("Graph edge confidence must be between 0 and 1");if(!_1(A.validFrom))throw Error("Graph edge validFrom must be a valid date");if(A.validTo!==void 0&&A.validTo!==null&&!_1(A.validTo))throw Error("Graph edge validTo must be a valid date");if(A.validTo&&A.validTo<=A.validFrom)throw Error("Graph edge validTo must be after validFrom");if(!A.why||!A.why.trim())throw Error("Graph edge why is required");if(!_1(A.createdAt)||!_1(A.updatedAt))throw Error("Graph edge timestamps must be valid dates");return new Y0(A)}get id(){return this._id}get edgeId(){return this._edgeId}get source(){return G1(this._source)}get target(){return G1(this._target)}get relationship(){return this._relationship}get project(){return this._project}get visibility(){return this._visibility}get sourceEventIds(){return[...this._sourceEventIds]}get sourceKinds(){return[...this._sourceKinds]}get confidence(){return this._confidence}get validFrom(){return new Date(this._validFrom.getTime())}get validTo(){return this._validTo?new Date(this._validTo.getTime()):null}get why(){return this._why}get metadata(){return this._metadata?V6(this._metadata):void 0}get createdAt(){return new Date(this._createdAt.getTime())}get updatedAt(){return new Date(this._updatedAt.getTime())}get scope(){return this._visibility==="project"?{project:this._project,visibility:"project"}:{visibility:this._visibility}}get controls(){return[...wY]}isCurrent(A,_=0.7){return this._validFrom<=A&&(!this._validTo||this._validTo>A)&&this._confidence>=_}withId(A){return Y0.create({id:A,edgeId:this._edgeId,source:this._source,target:this._target,relationship:this._relationship,project:this._project,visibility:this._visibility,sourceEventIds:this._sourceEventIds,sourceKinds:this._sourceKinds,confidence:this._confidence,validFrom:this._validFrom,validTo:this._validTo,why:this._why,metadata:this._metadata,createdAt:this._createdAt,updatedAt:this._updatedAt})}toJSON(){return{...this._id!==void 0?{id:this._id}:{},edge_id:this._edgeId,source:this.source,target:this.target,relationship:this._relationship,...this._project!==void 0?{project:this._project}:{},visibility:this._visibility,source_event_ids:this.sourceEventIds,source_kinds:this.sourceKinds,confidence:this._confidence,valid_from:this._validFrom.toISOString(),valid_to:this._validTo?this._validTo.toISOString():null,why:this._why,scope:this.scope,...this._metadata!==void 0?{metadata:this.metadata}:{},controls:this.controls,created_at:this._createdAt.toISOString(),updated_at:this._updatedAt.toISOString()}}}function CY(A){let _=[A.source.type,A.source.id,A.relationship,A.target.type,A.target.id,A.project??"",A.visibility].join("|");return`graph-${hY("sha256").update(_).digest("hex").slice(0,16)}`}function X6(A,_){if(!$1.includes(A.type))throw Error(`Invalid graph node type: ${A.type}`);if(!A.id||!A.id.trim())throw Error(`Graph edge ${_}.id is required`);if(!A.label||!A.label.trim())throw Error(`Graph edge ${_}.label is required`)}function bY(A){if(!A||!vY.test(A.trim()))throw Error(`Invalid graph relationship: ${A}`)}function fY(A){if(A!=="project"&&A!=="workspace"&&A!=="global")throw Error(`Invalid graph visibility: ${A}`)}function _1(A){return A instanceof Date&&!Number.isNaN(A.getTime())}function G1(A){return{type:A.type,id:A.id,label:A.label}}function V6(A){return JSON.parse(JSON.stringify(A))}var $1,vY,wY;var K1=U(()=>{$1=["project","tool","person","decision","error","plan","file","command","capability"],vY=/^[a-z][a-z0-9_-]*(?:[.:][a-z0-9_-]+)*$/,wY=["suppress","invalidate","expire","review"]});function Z5(A,_=new Date){let G=A.metadata??{},$=gY(G.graph_edges??G.graphEdges??G.relationships),K=[];for(let Z of $)try{let Y=cY(Z.visibility)??"project",J=B6(Z.source,K5(Z.sourceType??Z.source_type),"project"),H=B6(Z.target,K5(Z.targetType??Z.target_type),"tool"),Q=uY(Z.validFrom??Z.valid_from,A.observedAt),X=N6(Z.validTo??Z.valid_to),V=W6(Z.confidence,W6(G.confidence,0.75)),B=gA(Z.relationship,""),W=gA(Z.project,A.project),N=z6(Z.sourceKinds??Z.source_kinds,[dY(A,G)]),z=z6(Z.sourceEventIds??Z.source_event_ids,[]),q=lY([A.uuid,...z]),I=gA(Z.why,`Derived from an active ${A.type} fact.`);K.push(Y0.create({edgeId:gA(Z.id??Z.edgeId??Z.edge_id,void 0),source:J,target:H,relationship:B,project:Y==="project"?W:void 0,visibility:Y,sourceEventIds:q,sourceKinds:N,confidence:V,validFrom:Q,validTo:X,why:I,metadata:mY(Z.metadata),createdAt:_,updatedAt:_}))}catch{}return K}function Y5(A,_){return GA.create({surface:"graph",targetId:A.edgeId,project:A.project,visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:_,actor:"memory",confidence:A.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:A.scope,status:"active",createdAt:A.createdAt,updatedAt:A.updatedAt,lastEventId:A.sourceEventIds[0]})}function gY(A){if(!Array.isArray(A))return[];return A.filter(J5)}function B6(A,_,G){if(J5(A)){let K=K5(A.type)??_??G,Z=gA(A.id,gA(A.label,"")),Y=gA(A.label,Z);return{type:K,id:Z,label:Y}}let $=gA(A,"");return{type:_??G,id:$,label:$}}function K5(A){return typeof A==="string"&&$1.includes(A)?A:void 0}function cY(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function gA(A,_){return typeof A==="string"&&A.trim()?A.trim():_}function W6(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function uY(A,_){return N6(A)??_}function N6(A){if(A===void 0||A===null||A==="")return null;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?null:_}function z6(A,_){if(!Array.isArray(A))return _;let G=A.map(($)=>String($)).filter(($)=>$.trim().length>0);return G.length>0?G:_}function mY(A){return J5(A)?JSON.parse(JSON.stringify(A)):void 0}function dY(A,_){return gA(_.source_kind,A.type)}function lY(A){return[...new Set(A.filter((_)=>_.trim().length>0))]}function J5(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var H5=U(()=>{K1();D0()});import{createHash as pY,randomUUID as nY}from"crypto";class BA{record;constructor(A){this.record=OA(A)}static create(A){let _=eY(A);L6(_);let G=J1(Y1(_.payload)),$={..._,integrity:{algorithm:"sha256",payloadHash:G}},K=J1(Y1($));return new BA({..._,integrity:{algorithm:"sha256",payloadHash:G,envelopeHash:K}})}static fromJSON(A){let _=sY(A);return L6(_),A7(_),new BA(_)}get schemaVersion(){return this.record.schemaVersion}get eventId(){return this.record.eventId}get machineId(){return this.record.machineId}get sequence(){return this.record.sequence}get kind(){return this.record.kind}get operation(){return this.record.operation}get occurredAt(){return new Date(this.record.occurredAt)}get observedAt(){return new Date(this.record.observedAt)}get scope(){return OA(this.record.scope)}get provenance(){return OA(this.record.provenance)}get privacy(){return OA(this.record.privacy)}get consent(){return OA(this.record.consent)}get causality(){return OA(this.record.causality)}get payload(){return OA(this.record.payload)}get integrity(){return OA(this.record.integrity)}toJSON(){return OA(this.record)}}function eY(A){return{schemaVersion:X5,eventId:A.eventId??nY(),machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:q6("occurredAt",A.occurredAt),observedAt:q6("observedAt",A.observedAt),scope:OA(A.scope),provenance:U6(A.provenance),privacy:T6(A.privacy),consent:I6(A.consent),causality:O6(A.causality),payload:OA(A.payload)}}function sY(A){if(!yA(A))throw Error("Memory event record must be an object");let _=A;if(!_.integrity)throw Error("Memory event integrity is required");return{schemaVersion:_.schemaVersion,eventId:String(_.eventId??""),machineId:String(_.machineId??""),sequence:Number(_.sequence),kind:_.kind,operation:_.operation,occurredAt:String(_.occurredAt??""),observedAt:String(_.observedAt??""),scope:yA(_.scope)?oY(_.scope):_.scope,provenance:U6(_.provenance),privacy:T6(_.privacy),consent:I6(_.consent),causality:O6(_.causality),payload:_.payload,integrity:{algorithm:_.integrity.algorithm,payloadHash:String(_.integrity.payloadHash??""),envelopeHash:String(_.integrity.envelopeHash??"")}}}function U6(A){let _=yA(A)?A:{};return{source:String(_.source??""),actor:String(_.actor??""),method:String(_.method??""),sourceIds:__(_.sourceIds)}}function oY(A){let _=yA(A)?A:{};return{project:typeof _.project==="string"?_.project:void 0,workspace:typeof _.workspace==="string"?_.workspace:void 0,visibility:_.visibility}}function T6(A){let _=yA(A)?A:{};return{redactionState:_.redactionState,containsSensitiveContent:_.containsSensitiveContent,policy:typeof _.policy==="string"?_.policy:void 0,redactedFields:Y7(_.redactedFields)}}function I6(A){let _=yA(A)?A:{};return{status:_.status,scopes:__(_.scopes),grantedAt:M6(_.grantedAt),expiresAt:M6(_.expiresAt)}}function O6(A){if(!yA(A))return{parentEventIds:void 0,supersedesEventIds:void 0,relatedEventIds:void 0};let _=A;return{parentEventIds:__(_.parentEventIds),supersedesEventIds:__(_.supersedesEventIds),relatedEventIds:__(_.relatedEventIds)}}function L6(A){if(A.schemaVersion!==X5)throw Error("schemaVersion must be 2");if(!A.eventId||A.eventId.trim()==="")throw Error("eventId is required");if(!A.machineId||A.machineId.trim()==="")throw Error("machineId is required");if(!Number.isSafeInteger(A.sequence)||A.sequence<=0)throw Error("sequence must be a positive safe integer");if(!A.kind||String(A.kind).trim()==="")throw Error("kind is required");if(!iY.includes(A.operation))throw Error("operation is invalid");if(Z1("occurredAt",A.occurredAt),Z1("observedAt",A.observedAt),G7(A.scope),$7(A.provenance),K7(A.privacy),Z7(A.consent),G_("causality.parentEventIds",A.causality.parentEventIds),G_("causality.supersedesEventIds",A.causality.supersedesEventIds),G_("causality.relatedEventIds",A.causality.relatedEventIds),!yA(A.payload))throw Error("payload must be an object")}function A7(A){if(A.integrity.algorithm!=="sha256")throw Error("integrity.algorithm must be sha256");let _=J1(Y1(A.payload));if(A.integrity.payloadHash!==_)throw Error("payload integrity mismatch");let G=J1(Y1({..._7(A),integrity:{algorithm:"sha256",payloadHash:A.integrity.payloadHash}}));if(A.integrity.envelopeHash!==G)throw Error("envelope integrity mismatch")}function _7(A){return{schemaVersion:A.schemaVersion,eventId:A.eventId,machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:A.occurredAt,observedAt:A.observedAt,scope:A.scope,provenance:A.provenance,privacy:A.privacy,consent:A.consent,causality:A.causality,payload:A.payload}}function G7(A){if(!yA(A))throw Error("scope is required");if(!aY.includes(A.visibility))throw Error("scope.visibility is invalid");if(A.visibility==="project"&&(!A.project||A.project.trim()===""))throw Error("scope.project is required for project visibility")}function $7(A){if(!A.source||A.source.trim()==="")throw Error("provenance.source is required");if(!A.actor||A.actor.trim()==="")throw Error("provenance.actor is required");if(!A.method||A.method.trim()==="")throw Error("provenance.method is required");G_("provenance.sourceIds",A.sourceIds??[])}function K7(A){if(!rY.includes(A.redactionState))throw Error("privacy.redactionState is invalid");if(typeof A.containsSensitiveContent!=="boolean")throw Error("privacy.containsSensitiveContent must be boolean");G_("privacy.redactedFields",A.redactedFields??[])}function Z7(A){if(!tY.includes(A.status))throw Error("consent.status is invalid");if(G_("consent.scopes",A.scopes),A.grantedAt!==void 0)Z1("consent.grantedAt",String(A.grantedAt));if(A.expiresAt!==void 0)Z1("consent.expiresAt",String(A.expiresAt))}function Z1(A,_){if(!_||Number.isNaN(new Date(_).getTime()))throw Error(`${A} must be a valid date`)}function __(A){if(!Array.isArray(A))return[];return A.map((_)=>String(_))}function Y7(A){if(A===void 0)return;return __(A)}function M6(A){if(A===void 0)return;return A instanceof Date?A.toISOString():String(A)}function q6(A,_){if(!(_ instanceof Date)||Number.isNaN(_.getTime()))throw Error(`${A} must be a valid date`);return _.toISOString()}function G_(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`${A} must be a string array`)}function Y1(A){return JSON.stringify(Q5(A))}function Q5(A){if(A instanceof Date)return A.toISOString();if(Array.isArray(A))return A.map(Q5);if(!yA(A))return A;let _={};for(let G of Object.keys(A).sort())_[G]=Q5(A[G]);return _}function J1(A){return pY("sha256").update(A).digest("hex")}function OA(A){if(A===void 0)return A;return JSON.parse(JSON.stringify(A))}function yA(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var X5=2,iY,aY,rY,tY;var s_=U(()=>{iY=["add","update","delete","supersede","noop","migrate"],aY=["project","workspace","global"],rY=["none","redacted","quarantined"],tY=["not_required","granted","denied","revoked"]});var j6={};k(j6,{MemoryGovernanceService:()=>cA});class cA{repository;writeEvent;machineId;now;nextSequence;constructor(A){this.repository=A.repository,this.writeEvent=A.writeEvent,this.machineId=A.machineId&&A.machineId.trim()?A.machineId:"local",this.now=A.now??(()=>new Date),this.nextSequence=A.nextSequence??(()=>Math.max(1,Date.now()))}async registerDerivedMemory(A){let _=this.now(),G=this.createEvent({control:"register",surface:A.surface,targetId:A.targetId,actor:A.actor??"memory",reason:void 0,occurredAt:_,project:A.project,visibility:A.visibility??(A.project?"project":"global"),sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,confidence:A.confidence??1,redactionState:A.redactionState??"none",consentStatus:A.consentStatus??"not_required",consentScopes:A.consentScopes??[],expiresAt:A.expiresAt});await this.persistEvent(G);let $=await this.repository.applyMemoryEvent(G);if(!$)throw Error("Governance registration did not produce a projection entry");return $}async suppress(A){return this.applyControl("suppress",A)}async unsuppress(A){return this.applyControl("unsuppress",A)}async invalidate(A){return this.applyControl("invalidate",A)}async expire(A){return this.applyControl("expire",{...A,expiresAt:A.expiresAt??this.now()})}async review(A){return this.applyControl("review",A)}async grantConsent(A){return this.applyControl("consent_grant",{...A,consentStatus:"granted"})}async revokeConsent(A){return this.applyControl("consent_revoke",{...A,consentStatus:"revoked"})}async list(A){return this.repository.findAll(A)}async show(A,_){return this.repository.findByTarget(A,_)}async isAllowed(A,_){let G=await this.repository.findByTarget(A,_);return G?!G.isBlocked(this.now()):!0}async filterAllowed(A,_,G){if(_.length===0)return _;let $=await this.repository.findByTargetIds(A,_.map(G)),K=new Set($.filter((Z)=>Z.isBlocked(this.now())).map((Z)=>Z.targetId));return _.filter((Z)=>!K.has(G(Z)))}async applyControl(A,_){let G=this.now(),$=await this.repository.findByTarget(_.surface,_.targetId),K=this.createEvent({control:A,surface:_.surface,targetId:_.targetId,actor:_.actor??"user",reason:_.reason,occurredAt:G,project:$?.project,visibility:$?.visibility??($?.project?"project":"global"),sourceEventIds:$?.sourceEventIds??[_.targetId],transformationMethod:$?.transformationMethod??`governance.${A}`,confidence:$?.confidence??1,redactionState:$?.redactionState??"none",consentStatus:_.consentStatus??$?.consentStatus??"not_required",consentScopes:_.consentScopes??$?.consentScopes??[],expiresAt:_.expiresAt??$?.expiresAt??null});await this.persistEvent(K);let Z=await this.repository.applyMemoryEvent(K);if(!Z)throw Error(`Governance ${A} did not produce a projection entry`);return Z}createEvent(A){return BA.create({machineId:this.machineId,sequence:this.nextSequence(),kind:A.control==="consent_grant"||A.control==="consent_revoke"?"consent":"governance",operation:A.control==="register"?"add":"update",occurredAt:A.occurredAt,observedAt:A.occurredAt,scope:{...A.project?{project:A.project}:{},visibility:A.visibility},provenance:{source:"memory-governance",actor:A.actor,method:`governance.${A.control}`,sourceIds:A.sourceEventIds},privacy:{redactionState:A.redactionState,containsSensitiveContent:A.redactionState!=="none"},consent:{status:A.consentStatus,scopes:A.consentScopes,...A.expiresAt?{expiresAt:A.expiresAt}:{}},causality:{parentEventIds:A.sourceEventIds,supersedesEventIds:[],relatedEventIds:[A.targetId]},payload:{governance:{control:A.control,surface:A.surface,targetId:A.targetId,...A.project?{project:A.project}:{},visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,actor:A.actor,confidence:A.confidence,redactionState:A.redactionState,consentStatus:A.consentStatus,consentScopes:A.consentScopes,status:"active",...A.reason?{reason:A.reason}:{},...A.expiresAt?{expiresAt:A.expiresAt.toISOString()}:{}}}})}async persistEvent(A){if(this.writeEvent)await this.writeEvent(A)}}var $_=U(()=>{s_()});var F6={};k(F6,{validateRemoteRepositoryUrl:()=>K_,validateRemoteRef:()=>H1,validateMachineIdentity:()=>o_,RemoteEventSyncService:()=>V5});function K_(A,_={}){let G=A.trim();if(!G)return{valid:!1,error:"Remote URL is required"};if(N7(G))return{valid:!1,error:"Remote URL contains control characters"};if(L7(G))return _.allowLocalPathRemote?{valid:!0}:{valid:!1,error:"Local path remotes require explicit allowLocalPathRemote consent"};if(/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:[^\s]+$/.test(G))return{valid:!0};try{let $=new URL(G);if($.protocol==="https:"||$.protocol==="ssh:")return{valid:!0};return{valid:!1,error:"Remote URL protocol is not supported"}}catch{return{valid:!1,error:"Remote URL is not a supported Git remote"}}}function H1(A){let _=A.trim();if(!_)return{valid:!1,error:"Remote ref is required"};if(Q7.test(_))return{valid:!1,error:"Remote ref contains unsafe characters"};if(_.startsWith("/")||_.endsWith("/")||_.startsWith(".")||_.includes("..")||_.includes("//")||_.endsWith(".")||_.endsWith(".lock"))return{valid:!1,error:"Remote ref is not a valid branch name"};return{valid:!0}}function o_(A){let _=A.trim();if(!_)return{valid:!1,error:"Machine identity is required"};if(_==="local"||_==="legacy")return{valid:!1,error:"Machine identity must come from durable config, not a fallback value"};if(!X7.test(_))return{valid:!1,error:"Machine identity contains unsafe characters"};if(_.length>128)return{valid:!1,error:"Machine identity is too long"};return{valid:!0}}class V5{transport;privacyPreflight;projectionRebuilder;now;constructor(A){this.transport=A.transport,this.privacyPreflight=A.privacyPreflight,this.projectionRebuilder=A.projectionRebuilder,this.now=A.now??(()=>new Date)}async sync(A){let _=A.remoteName??J7,G=A.branch??H7,$=A.autoPull??!0,K=A.autoPush??!0,Z=!1,Y=!1,J=!1,H=!1;try{let Q=V7(A,G,_);if(!Q.valid)return R6(Q.error??"Remote sync request is invalid");let X=await this.privacyPreflight?.audit();if(X&&X.eventLogFindings>0)return R6(`Remote synchronization blocked: active event logs contain ${X.eventLogFindings} likely secret finding(s).`);if(!await this.transport.isRepository()){let z=await this.transport.initRepository(B7(A.machineId));if(!z.success)return x0(z.error??"Failed to initialize Git repository in events directory");Z=!0}if(await this.transport.getRemoteUrl()!==A.repositoryUrl.trim()){let z=await this.transport.setRemoteUrl(A.repositoryUrl.trim());if(!z.success)return x0(z.error??"Failed to configure Git remote repository URL",{initializedRepository:Z});Y=!0}let W=await this.transport.listEventLogFingerprints();if(await this.transport.hasEventLog(A.machineId)){let z=await this.transport.commitEventLog(A.machineId,W7(A.machineId,this.now()));if(!z.success)return x0(`Git commit failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y})}if($){let z=await this.transport.fetch(_);if(!z.success)return x0(`Git fetch failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});if(await this.transport.hasRemoteRef(_,G)){let q=await this.transport.pullRebase(_,G);if(!q.success)return await this.transport.abortRebase(),x0(`Git pull failed: ${q.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});J=!0}}if(K){let z=await this.transport.push(_,G);if(!z.success){let q=await this.rebuildIfNeeded(W);return x0(`Git push failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y,pulled:J,rebuildNeeded:q.rebuildNeeded,projectionRebuilt:q.projectionRebuilt})}H=!0}let N=await this.rebuildIfNeeded(W);return{success:!0,status:"synced",rebuildNeeded:N.rebuildNeeded,projectionRebuilt:N.projectionRebuilt,pulled:J,pushed:H,configuredRemote:Y,initializedRepository:Z,error:void 0}}catch(Q){return x0(L(Q),{initializedRepository:Z,configuredRemote:Y,pulled:J,pushed:H})}}async rebuildIfNeeded(A){let _=await this.transport.listEventLogFingerprints(),G=z7(A,_);if(G&&this.projectionRebuilder)return await this.projectionRebuilder.rebuild(),{rebuildNeeded:G,projectionRebuilt:!0};return{rebuildNeeded:G,projectionRebuilt:!1}}}function V7(A,_,G){let $=o_(A.machineId);if(!$.valid)return $;let K=K_(A.repositoryUrl,A.allowLocalPathRemote===void 0?{}:{allowLocalPathRemote:A.allowLocalPathRemote});if(!K.valid)return K;let Z=H1(_);if(!Z.valid)return Z;if(!H1(G).valid)return{valid:!1,error:"Remote name is not valid"};return{valid:!0}}function B7(A){return{machineId:A,userName:"Memory Sync",userEmail:"sync@memory.local"}}function W7(A,_){return`sync: ${A} observed at ${_.toISOString()}`}function R6(A){return{success:!1,status:"blocked",rebuildNeeded:!1,projectionRebuilt:!1,pulled:!1,pushed:!1,configuredRemote:!1,initializedRepository:!1,error:A}}function x0(A,_={}){return{success:!1,status:"failed",rebuildNeeded:_.rebuildNeeded??!1,projectionRebuilt:_.projectionRebuilt??!1,pulled:_.pulled??!1,pushed:_.pushed??!1,configuredRemote:_.configuredRemote??!1,initializedRepository:_.initializedRepository??!1,error:A}}function z7(A,_){let G=Object.keys(A).sort(),$=Object.keys(_).sort();if(G.length!==$.length)return!0;for(let K=0;K<G.length;K+=1){let Z=G[K],Y=$[K];if(Z!==Y||A[Z]!==_[Y])return!0}return!1}function N7(A){return/[\u0000-\u001F\u007F]/.test(A)}function L7(A){return A.startsWith("/")||A.startsWith("./")||A.startsWith("../")||A.startsWith("~")||A.startsWith("file://")||/^[A-Za-z]:[\\/]/.test(A)}var J7="origin",H7="main",Q7,X7;var Q1=U(()=>{Q7=/[\s~^:?*[\]\\;]/,X7=/^[A-Za-z0-9._-]+$/});var E6={};k(E6,{trackDownloadTotal:()=>I7,isUnicodeSupported:()=>S6,getBarCharacters:()=>X1,createProgressReporter:()=>L5,createModelDownloadHandler:()=>O7,createEmbeddingProgressReporter:()=>T7,TtyProgressReporter:()=>W5,TtyEmbeddingProgressReporter:()=>M5,QuietProgressReporter:()=>N5,QuietEmbeddingProgressReporter:()=>U5,PlainProgressReporter:()=>z5,PlainEmbeddingProgressReporter:()=>q5});import B5 from"cli-progress";function S6(){let{env:A}=process;if(process.platform!=="win32")return A.TERM!=="linux";return Boolean(A.MSYSTEM)||Boolean(A.WT_SESSION)||Boolean(A.TERMINUS_SUBLIME)||A.ConEmuTask==="{cmd::Cmder}"||A.TERM_PROGRAM==="vscode"||A.TERM==="xterm-256color"||A.TERM==="alacritty"||A.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function X1(){return S6()?q7:U7}class W5{bar;verbose;total=0;currentValue=0;constructor(A=!1){this.verbose=A;let _=X1();this.bar=new B5.SingleBar({format:"Syncing |{bar}| {percentage}% | {value}/{total} sessions",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0})}start(A){this.total=A,this.currentValue=0,this.bar.start(A,0)}update(A,_){if(this.currentValue=A,this.bar.update(A),this.verbose)this.bar.stop(),console.log(` Processing: ${_}`),this.bar.start(this.total,A)}stop(){this.bar.stop()}log(A){if(this.verbose)this.bar.stop(),console.log(A),this.bar.start(this.total,this.currentValue)}}class z5{verbose;constructor(A=!1){this.verbose=A}start(A){console.log(`Processing ${A} sessions...`)}update(A,_){if(this.verbose)console.log(` [${A}] Processing: ${_}`)}stop(){console.log("Done.")}log(A){if(this.verbose)console.log(A)}}class N5{start(A){}update(A,_){}stop(){}log(A){}}function L5(A){if(A.quiet)return new N5;if(!process.stdout.isTTY)return new z5(A.verbose);return new W5(A.verbose)}class M5{bar;constructor(){let A=X1();this.bar=new B5.SingleBar({format:"Embedding |{bar}| {percentage}% | {value}/{total} messages | ETA: {eta_formatted}",barCompleteChar:A.complete,barIncompleteChar:A.incomplete,hideCursor:!0,etaBuffer:20})}start(A){this.bar.start(A,0)}update(A){this.bar.update(A)}stop(){this.bar.stop()}}class q5{start(A){console.log(`Embedding ${A} messages...`)}update(A){}stop(){console.log("Done.")}}class U5{start(A){}update(A){}stop(){}}function T7(A){if(A.quiet)return new U5;if(!process.stdout.isTTY)return new q5;return new M5}function I7(A,_){let G=Math.round(_/1048576);return G>A?G:A}function O7(A){if(A.quiet||!process.stdout.isTTY){let Z=!1;return(Y)=>{if(!Z&&Y.status==="downloading"&&!A.quiet)console.log("Downloading embedding model (one-time setup)..."),Z=!0}}let _=X1(),G=new B5.SingleBar({format:"Downloading model |{bar}| {percentage}% | {value}/{total} MB",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0}),$=!1,K=0;return(Z)=>{if(Z.status==="downloading"){let Y=Math.round(Z.loaded/1048576),J=Math.round(Z.total/1048576);if(J>K)K=J;if(!$&&K>0)G.start(K,Y),$=!0;else if($){if(J>0&&G.getTotal()!==K)G.setTotal(K);G.update(Y)}}else if(Z.status==="ready"&&$)G.stop()}}var q7,U7;var T5=U(()=>{q7={complete:"\u2588",incomplete:"\u2591"},U7={complete:"#",incomplete:"-"}});function AG(A){try{return A.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),A.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function V1(A,_){let{sqliteVecAvailable:G=!1}=_??{};if(!AG(A))throw Error("FTS5 extension is not available. Ensure you are using Bun with FTS5 support enabled.");try{let Z=A.prepare("PRAGMA table_info(friction_log)").all();if(!Z.some((J)=>J.name==="tool")&&Z.length>0)A.exec(`
17
+ `).filter(($)=>$.trim().length>0).length}}class aG{projections;constructor(A){let _=new Set;for(let G of A){if(!G.name||G.name.trim()==="")throw Error("Projection name is required");if(_.has(G.name))throw Error(`Duplicate projection name: ${G.name}`);_.add(G.name)}this.projections=A.map((G)=>({...G,consumedKinds:[...G.consumedKinds]}))}getConsumedKinds(A){let _=this.projections.find((G)=>G.name===A);if(!_)throw Error(`Projection not found: ${A}`);return[..._.consumedKinds]}async replay(A,_){for(let Y of this.projections)await Y.reset?.(_);let G=new Set,$=new Set,K=0,Z=0;for(let Y of A){if(G.has(Y.eventId)){Z+=1;continue}G.add(Y.eventId),K+=1;for(let J of this.projections)if(J.consumedKinds.includes(Y.kind)){if(await J.apply(Y,_)!==!1)$.add(J.name)}}return{processedEvents:K,skippedDuplicateEvents:Z,appliedProjections:[...$]}}}class GA{params;constructor(A){this.params={id:A.id,surface:A.surface,targetId:A.targetId,project:A.project,visibility:A.visibility,sourceEventIds:[...A.sourceEventIds],transformationMethod:A.transformationMethod,actor:A.actor,confidence:A.confidence,redactionState:A.redactionState,consentStatus:A.consentStatus,consentScopes:[...A.consentScopes],scope:_6(A.scope),status:A.status??"active",statusReason:A.statusReason,createdAt:K0(A.createdAt??new Date),updatedAt:K0(A.updatedAt??A.createdAt??new Date),reviewedAt:A.reviewedAt?K0(A.reviewedAt):null,expiresAt:A.expiresAt?K0(A.expiresAt):null,lastEventId:A.lastEventId}}static create(A){return TY(A),new GA(A)}get id(){return this.params.id}get surface(){return this.params.surface}get targetId(){return this.params.targetId}get project(){return this.params.project}get visibility(){return this.params.visibility}get sourceEventIds(){return[...this.params.sourceEventIds]}get transformationMethod(){return this.params.transformationMethod}get actor(){return this.params.actor}get confidence(){return this.params.confidence}get redactionState(){return this.params.redactionState}get consentStatus(){return this.params.consentStatus}get consentScopes(){return[...this.params.consentScopes]}get scope(){return _6(this.params.scope)}get status(){return this.params.status}get statusReason(){return this.params.statusReason}get createdAt(){return K0(this.params.createdAt)}get updatedAt(){return K0(this.params.updatedAt)}get reviewedAt(){return this.params.reviewedAt?K0(this.params.reviewedAt):null}get expiresAt(){return this.params.expiresAt?K0(this.params.expiresAt):null}get lastEventId(){return this.params.lastEventId}withId(A){return GA.create({...this.toParams(),id:A})}withControl(A){let _=this.toParams(),G=IY(A.control,this.status);return GA.create({..._,status:G,actor:A.actor,statusReason:A.reason??_.statusReason,updatedAt:A.occurredAt,reviewedAt:A.control==="review"?A.occurredAt:_.reviewedAt,expiresAt:A.control==="expire"?A.expiresAt??A.occurredAt:A.expiresAt!==void 0?A.expiresAt:_.expiresAt,consentStatus:A.consentStatus??_.consentStatus,consentScopes:A.consentScopes??_.consentScopes,lastEventId:A.lastEventId??_.lastEventId})}isBlocked(A=new Date){if(this.status==="suppressed"||this.status==="invalidated"||this.status==="expired")return!0;if(this.status==="pending_review")return!0;if(this.expiresAt&&this.expiresAt.getTime()<=A.getTime())return!0;if(this.consentStatus==="denied"||this.consentStatus==="revoked")return!0;if(this.redactionState==="quarantined")return!0;return!1}toJSON(A=new Date){return{...this.id!==void 0?{id:this.id}:{},surface:this.surface,target_id:this.targetId,...this.project!==void 0?{project:this.project}:{},visibility:this.visibility,source_event_ids:this.sourceEventIds,transformation_method:this.transformationMethod,actor:this.actor,confidence:this.confidence,redaction_state:this.redactionState,consent_status:this.consentStatus,consent_scopes:this.consentScopes,scope:this.scope,status:this.status,...this.statusReason!==void 0?{status_reason:this.statusReason}:{},created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString(),reviewed_at:this.reviewedAt?this.reviewedAt.toISOString():null,expires_at:this.expiresAt?this.expiresAt.toISOString():null,...this.lastEventId!==void 0?{last_event_id:this.lastEventId}:{},blocked:this.isBlocked(A)}}toParams(){return{id:this.id,surface:this.surface,targetId:this.targetId,project:this.project,visibility:this.visibility,sourceEventIds:this.sourceEventIds,transformationMethod:this.transformationMethod,actor:this.actor,confidence:this.confidence,redactionState:this.redactionState,consentStatus:this.consentStatus,consentScopes:this.consentScopes,scope:this.scope,status:this.status,statusReason:this.statusReason,createdAt:this.createdAt,updatedAt:this.updatedAt,reviewedAt:this.reviewedAt,expiresAt:this.expiresAt,lastEventId:this.lastEventId}}}function A_(A){if(!tG.includes(A))throw Error(`Invalid memory governance surface: ${A}`);return A}function G5(A){if(!$6.includes(A))throw Error(`Invalid memory governance control: ${A}`);return A}function TY(A){if(A_(A.surface),!A.targetId||A.targetId.trim()==="")throw Error("Memory governance targetId is required");if(!["project","workspace","global"].includes(A.visibility))throw Error("Memory governance visibility is invalid");if(A6("sourceEventIds",A.sourceEventIds),!A.transformationMethod||A.transformationMethod.trim()==="")throw Error("Memory governance transformationMethod is required");if(!A.actor||A.actor.trim()==="")throw Error("Memory governance actor is required");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("Memory governance confidence must be between 0 and 1");if(!["none","redacted","quarantined"].includes(A.redactionState))throw Error("Memory governance redactionState is invalid");if(!["not_required","granted","denied","revoked"].includes(A.consentStatus))throw Error("Memory governance consentStatus is invalid");if(A6("consentScopes",A.consentScopes),!A.scope||!["project","workspace","global"].includes(A.scope.visibility))throw Error("Memory governance scope.visibility is invalid");if(A.status&&!G6.includes(A.status))throw Error("Memory governance status is invalid");rG("createdAt",A.createdAt),rG("updatedAt",A.updatedAt),rG("reviewedAt",A.reviewedAt??void 0),rG("expiresAt",A.expiresAt??void 0)}function IY(A,_){switch(A){case"register":case"unsuppress":case"review":case"consent_grant":return"active";case"suppress":return"suppressed";case"invalidate":return"invalidated";case"expire":return"expired";case"consent_revoke":return _==="invalidated"?"invalidated":"suppressed"}}function A6(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`Memory governance ${A} must be a string array`)}function rG(A,_){if(_!==void 0&&_!==null&&(!(_ instanceof Date)||Number.isNaN(_.getTime())))throw Error(`Memory governance ${A} must be a valid date`)}function K0(A){return new Date(A.getTime())}function _6(A){return JSON.parse(JSON.stringify(A))}var tG,G6,$6;var D0=U(()=>{tG=["fact","context","provider_egress","remote_sync","friction","evaluation","persona","graph","ranking","dream","projection"],G6=["active","pending_review","suppressed","invalidated","expired"],$6=["register","suppress","unsuppress","invalidate","expire","review","consent_grant","consent_revoke"]});class fA{params;constructor(A){this.params={id:A.id,entryId:A.entryId,kind:A.kind,content:A.content.trim(),project:A.project,visibility:A.visibility,sourceEventIds:[...A.sourceEventIds],sourceKinds:[...A.sourceKinds],confidence:A.confidence,scope:K6(A.scope),reviewStatus:A.reviewStatus,reviewAfter:Z0(A.reviewAfter),expiresAt:A.expiresAt?Z0(A.expiresAt):null,why:A.why.trim(),createdAt:Z0(A.createdAt??new Date),updatedAt:Z0(A.updatedAt??A.createdAt??new Date)}}static create(A){return OY(A),new fA(A)}get id(){return this.params.id}get entryId(){return this.params.entryId}get kind(){return this.params.kind}get content(){return this.params.content}get project(){return this.params.project}get visibility(){return this.params.visibility}get sourceEventIds(){return[...this.params.sourceEventIds]}get sourceKinds(){return[...this.params.sourceKinds]}get confidence(){return this.params.confidence}get scope(){return K6(this.params.scope)}get reviewStatus(){return this.params.reviewStatus}get reviewAfter(){return Z0(this.params.reviewAfter)}get expiresAt(){return this.params.expiresAt?Z0(this.params.expiresAt):null}get why(){return this.params.why}get controls(){return[...Z6]}get createdAt(){return Z0(this.params.createdAt)}get updatedAt(){return Z0(this.params.updatedAt)}withId(A){return fA.create({...this.toParams(),id:A})}toJSON(){return{...this.id!==void 0?{id:this.id}:{},entry_id:this.entryId,kind:this.kind,content:this.content,...this.project!==void 0?{project:this.project}:{},visibility:this.visibility,source_event_ids:this.sourceEventIds,source_kinds:this.sourceKinds,confidence:this.confidence,scope:this.scope,review_status:this.reviewStatus,review_after:this.reviewAfter.toISOString(),expires_at:this.expiresAt?this.expiresAt.toISOString():null,why:this.why,controls:this.controls,created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString()}}toParams(){return{id:this.id,entryId:this.entryId,kind:this.kind,content:this.content,project:this.project,visibility:this.visibility,sourceEventIds:this.sourceEventIds,sourceKinds:this.sourceKinds,confidence:this.confidence,scope:this.scope,reviewStatus:this.reviewStatus,reviewAfter:this.reviewAfter,expiresAt:this.expiresAt,why:this.why,createdAt:this.createdAt,updatedAt:this.updatedAt}}}function OY(A){if(!A.entryId||A.entryId.trim()==="")throw Error("entryId cannot be empty");if(!eG.includes(A.kind))throw Error(`Invalid persona kind: ${A.kind}`);if(!A.content||A.content.trim()==="")throw Error("content cannot be empty");if(A.visibility==="project"&&(!A.project||A.project.trim()===""))throw Error("project is required for project-visible persona entries");if(!A.sourceEventIds||A.sourceEventIds.length===0)throw Error("sourceEventIds must include at least one source id");if(!A.sourceKinds||A.sourceKinds.length===0)throw Error("sourceKinds must include at least one source kind");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("confidence must be between 0 and 1");if(!A.scope||!A.scope.visibility)throw Error("scope with visibility is required");if(A.reviewStatus!=="pending_review"&&A.reviewStatus!=="reviewed")throw Error("reviewStatus must be pending_review or reviewed");if(!(A.reviewAfter instanceof Date)||Number.isNaN(A.reviewAfter.getTime()))throw Error("reviewAfter must be a valid Date");if(!A.why||A.why.trim()==="")throw Error("why cannot be empty")}function Z0(A){return new Date(A.getTime())}function K6(A){return JSON.parse(JSON.stringify(A))}var eG,Z6;var e_=U(()=>{eG=["preference","procedure","correction","decision_pattern","friction_pattern"],Z6=["suppress","invalidate","expire","review"]});import{createHash as jY}from"crypto";class oG{deps;now;constructor(A){this.deps=A;this.now=A.now??(()=>new Date)}async rebuildProfile(A={}){let G=(A.project?await this.deps.factRepo.findByProject(A.project):await this.deps.factRepo.findAll()).filter((H)=>H.supersededAt===null),$=G.flatMap((H)=>this.entryFromFact(H)),K=await this.deps.frictionRepo.findPatterns(3),Z=K.filter((H)=>!A.project||H.entries.some((Q)=>Q.sourceProject===A.project||!Q.sourceProject)).map((H)=>this.entryFromFrictionPattern(H.tool,H.category,H.count,H.entries,A.project)),Y=PY([...$,...Z]);if(A.project)await this.deps.personaRepo.deleteByProject(A.project);else await this.deps.personaRepo.clearAll();let J=await this.deps.personaRepo.saveMany(Y);for(let H of J)await this.deps.governanceRepo.save(this.governanceEntryFor(H));return{entries:J,factCount:G.length,frictionPatternCount:K.length}}entryFromFact(A){return Y6(A,this.now())}entryFromFrictionPattern(A,_,G,$,K){let Z=this.now(),Y=$.map((H)=>`friction:${H.id??H.loggedAt.toISOString()}`),J=$.slice(0,3).map((H)=>H.description).join("; ");return fA.create({entryId:J6("friction_pattern",`${A}:${_}:${K??"global"}`),kind:"friction_pattern",content:`${A}/${_} has ${G} recurring friction entries: ${J}`,project:K,visibility:K?"project":"global",sourceEventIds:Y,sourceKinds:["friction"],confidence:Math.min(0.95,0.65+G*0.05),scope:K?{project:K,visibility:"project"}:{visibility:"global"},reviewStatus:"pending_review",reviewAfter:Q6(Z,30),why:"Derived from recurring friction patterns.",createdAt:Z,updatedAt:Z})}governanceEntryFor(A){return GA.create({surface:"persona",targetId:A.entryId,project:A.project,visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:"persona-profile-service",actor:"memory",confidence:A.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:A.scope,status:"active",createdAt:A.createdAt,updatedAt:A.updatedAt,expiresAt:A.expiresAt,lastEventId:A.sourceEventIds[0]})}}function Y6(A,_=new Date){let G=RY(A);if(!G)return[];let $=A.metadata??{},K=SY($),Z=EY(A.project,K),Y=FY(A,$),J=Q6(_,H6($.review_after_days,30));return[fA.create({entryId:J6(G,A.uuid),kind:G,content:A.content,project:A.project,visibility:K,sourceEventIds:[A.uuid],sourceKinds:Y,confidence:DY(G,$),scope:Z,reviewStatus:"pending_review",reviewAfter:J,expiresAt:yY($.expires_at),why:xY(G),createdAt:_,updatedAt:_})]}function $5(A,_=new Date){return Y6(A,_)[0]??null}function RY(A){let _=A.metadata??{},G=sG(_.persona_kind);if(G&&kY(G))return G;let $=sG(_.source_kind);if($==="correction")return"correction";if($==="validated_behavior")return"procedure";if(A.type==="preference")return"preference";return null}function FY(A,_){return[sG(_.source_kind)??A.type]}function SY(A){let _=sG(A.visibility);return _==="global"||_==="workspace"||_==="project"?_:"project"}function EY(A,_){if(_==="project")return{project:A,visibility:_};return{visibility:_}}function DY(A,_){let G=H6(_.confidence,NaN);if(Number.isFinite(G))return Math.max(0,Math.min(1,G));switch(A){case"correction":return 0.88;case"procedure":return 0.82;case"decision_pattern":return 0.8;case"friction_pattern":return 0.75;case"preference":return 0.85}}function xY(A){switch(A){case"preference":return"Derived from an active preference fact.";case"correction":return"Derived from a repeated correction or explicit behavioral instruction.";case"procedure":return"Derived from a validated procedural behavior pattern.";case"decision_pattern":return"Derived from a durable decision pattern.";case"friction_pattern":return"Derived from recurring friction patterns."}}function J6(A,_){return`persona-${A}-${jY("sha256").update(_).digest("hex").slice(0,12)}`}function PY(A){let _=new Set;return A.filter((G)=>{if(_.has(G.entryId))return!1;return _.add(G.entryId),!0})}function sG(A){return typeof A==="string"&&A.trim()?A:null}function H6(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function yY(A){if(typeof A!=="string"||!A.trim())return null;let _=new Date(A);return Number.isNaN(_.getTime())?null:_}function Q6(A,_){return new Date(A.getTime()+_*24*60*60*1000)}function kY(A){return["preference","procedure","correction","decision_pattern","friction_pattern"].includes(A)}var A$=U(()=>{D0();e_()});import{createHash as hY}from"crypto";class Y0{_id;_edgeId;_source;_target;_relationship;_project;_visibility;_sourceEventIds;_sourceKinds;_confidence;_validFrom;_validTo;_why;_metadata;_createdAt;_updatedAt;constructor(A){this._id=A.id,this._source=G$(A.source),this._target=G$(A.target),this._relationship=A.relationship.trim(),this._project=A.project?.trim()||void 0,this._visibility=A.visibility,this._sourceEventIds=[...A.sourceEventIds],this._sourceKinds=[...A.sourceKinds],this._confidence=A.confidence,this._validFrom=new Date(A.validFrom.getTime()),this._validTo=A.validTo?new Date(A.validTo.getTime()):null,this._why=A.why.trim(),this._metadata=A.metadata?V6(A.metadata):void 0,this._createdAt=new Date(A.createdAt.getTime()),this._updatedAt=new Date(A.updatedAt.getTime()),this._edgeId=A.edgeId?.trim()||CY(this)}static create(A){if(X6(A.source,"source"),X6(A.target,"target"),bY(A.relationship),fY(A.visibility),A.visibility==="project"&&(!A.project||!A.project.trim()))throw Error("project is required for project-visible graph edges");if(!Array.isArray(A.sourceEventIds)||A.sourceEventIds.length===0)throw Error("Graph edge sourceEventIds must include at least one source id");if(!Array.isArray(A.sourceKinds)||A.sourceKinds.length===0)throw Error("Graph edge sourceKinds must include at least one source kind");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("Graph edge confidence must be between 0 and 1");if(!_$(A.validFrom))throw Error("Graph edge validFrom must be a valid date");if(A.validTo!==void 0&&A.validTo!==null&&!_$(A.validTo))throw Error("Graph edge validTo must be a valid date");if(A.validTo&&A.validTo<=A.validFrom)throw Error("Graph edge validTo must be after validFrom");if(!A.why||!A.why.trim())throw Error("Graph edge why is required");if(!_$(A.createdAt)||!_$(A.updatedAt))throw Error("Graph edge timestamps must be valid dates");return new Y0(A)}get id(){return this._id}get edgeId(){return this._edgeId}get source(){return G$(this._source)}get target(){return G$(this._target)}get relationship(){return this._relationship}get project(){return this._project}get visibility(){return this._visibility}get sourceEventIds(){return[...this._sourceEventIds]}get sourceKinds(){return[...this._sourceKinds]}get confidence(){return this._confidence}get validFrom(){return new Date(this._validFrom.getTime())}get validTo(){return this._validTo?new Date(this._validTo.getTime()):null}get why(){return this._why}get metadata(){return this._metadata?V6(this._metadata):void 0}get createdAt(){return new Date(this._createdAt.getTime())}get updatedAt(){return new Date(this._updatedAt.getTime())}get scope(){return this._visibility==="project"?{project:this._project,visibility:"project"}:{visibility:this._visibility}}get controls(){return[...wY]}isCurrent(A,_=0.7){return this._validFrom<=A&&(!this._validTo||this._validTo>A)&&this._confidence>=_}withId(A){return Y0.create({id:A,edgeId:this._edgeId,source:this._source,target:this._target,relationship:this._relationship,project:this._project,visibility:this._visibility,sourceEventIds:this._sourceEventIds,sourceKinds:this._sourceKinds,confidence:this._confidence,validFrom:this._validFrom,validTo:this._validTo,why:this._why,metadata:this._metadata,createdAt:this._createdAt,updatedAt:this._updatedAt})}toJSON(){return{...this._id!==void 0?{id:this._id}:{},edge_id:this._edgeId,source:this.source,target:this.target,relationship:this._relationship,...this._project!==void 0?{project:this._project}:{},visibility:this._visibility,source_event_ids:this.sourceEventIds,source_kinds:this.sourceKinds,confidence:this._confidence,valid_from:this._validFrom.toISOString(),valid_to:this._validTo?this._validTo.toISOString():null,why:this._why,scope:this.scope,...this._metadata!==void 0?{metadata:this.metadata}:{},controls:this.controls,created_at:this._createdAt.toISOString(),updated_at:this._updatedAt.toISOString()}}}function CY(A){let _=[A.source.type,A.source.id,A.relationship,A.target.type,A.target.id,A.project??"",A.visibility].join("|");return`graph-${hY("sha256").update(_).digest("hex").slice(0,16)}`}function X6(A,_){if(!$$.includes(A.type))throw Error(`Invalid graph node type: ${A.type}`);if(!A.id||!A.id.trim())throw Error(`Graph edge ${_}.id is required`);if(!A.label||!A.label.trim())throw Error(`Graph edge ${_}.label is required`)}function bY(A){if(!A||!vY.test(A.trim()))throw Error(`Invalid graph relationship: ${A}`)}function fY(A){if(A!=="project"&&A!=="workspace"&&A!=="global")throw Error(`Invalid graph visibility: ${A}`)}function _$(A){return A instanceof Date&&!Number.isNaN(A.getTime())}function G$(A){return{type:A.type,id:A.id,label:A.label}}function V6(A){return JSON.parse(JSON.stringify(A))}var $$,vY,wY;var K$=U(()=>{$$=["project","tool","person","decision","error","plan","file","command","capability"],vY=/^[a-z][a-z0-9_-]*(?:[.:][a-z0-9_-]+)*$/,wY=["suppress","invalidate","expire","review"]});function Z5(A,_=new Date){let G=A.metadata??{},$=gY(G.graph_edges??G.graphEdges??G.relationships),K=[];for(let Z of $)try{let Y=cY(Z.visibility)??"project",J=B6(Z.source,K5(Z.sourceType??Z.source_type),"project"),H=B6(Z.target,K5(Z.targetType??Z.target_type),"tool"),Q=uY(Z.validFrom??Z.valid_from,A.observedAt),X=N6(Z.validTo??Z.valid_to),V=W6(Z.confidence,W6(G.confidence,0.75)),B=gA(Z.relationship,""),W=gA(Z.project,A.project),N=z6(Z.sourceKinds??Z.source_kinds,[dY(A,G)]),z=z6(Z.sourceEventIds??Z.source_event_ids,[]),q=lY([A.uuid,...z]),I=gA(Z.why,`Derived from an active ${A.type} fact.`);K.push(Y0.create({edgeId:gA(Z.id??Z.edgeId??Z.edge_id,void 0),source:J,target:H,relationship:B,project:Y==="project"?W:void 0,visibility:Y,sourceEventIds:q,sourceKinds:N,confidence:V,validFrom:Q,validTo:X,why:I,metadata:mY(Z.metadata),createdAt:_,updatedAt:_}))}catch{}return K}function Y5(A,_){return GA.create({surface:"graph",targetId:A.edgeId,project:A.project,visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:_,actor:"memory",confidence:A.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:A.scope,status:"active",createdAt:A.createdAt,updatedAt:A.updatedAt,lastEventId:A.sourceEventIds[0]})}function gY(A){if(!Array.isArray(A))return[];return A.filter(J5)}function B6(A,_,G){if(J5(A)){let K=K5(A.type)??_??G,Z=gA(A.id,gA(A.label,"")),Y=gA(A.label,Z);return{type:K,id:Z,label:Y}}let $=gA(A,"");return{type:_??G,id:$,label:$}}function K5(A){return typeof A==="string"&&$$.includes(A)?A:void 0}function cY(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function gA(A,_){return typeof A==="string"&&A.trim()?A.trim():_}function W6(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function uY(A,_){return N6(A)??_}function N6(A){if(A===void 0||A===null||A==="")return null;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?null:_}function z6(A,_){if(!Array.isArray(A))return _;let G=A.map(($)=>String($)).filter(($)=>$.trim().length>0);return G.length>0?G:_}function mY(A){return J5(A)?JSON.parse(JSON.stringify(A)):void 0}function dY(A,_){return gA(_.source_kind,A.type)}function lY(A){return[...new Set(A.filter((_)=>_.trim().length>0))]}function J5(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var H5=U(()=>{K$();D0()});import{createHash as pY,randomUUID as nY}from"crypto";class BA{record;constructor(A){this.record=OA(A)}static create(A){let _=eY(A);L6(_);let G=J$(Y$(_.payload)),$={..._,integrity:{algorithm:"sha256",payloadHash:G}},K=J$(Y$($));return new BA({..._,integrity:{algorithm:"sha256",payloadHash:G,envelopeHash:K}})}static fromJSON(A){let _=sY(A);return L6(_),A7(_),new BA(_)}get schemaVersion(){return this.record.schemaVersion}get eventId(){return this.record.eventId}get machineId(){return this.record.machineId}get sequence(){return this.record.sequence}get kind(){return this.record.kind}get operation(){return this.record.operation}get occurredAt(){return new Date(this.record.occurredAt)}get observedAt(){return new Date(this.record.observedAt)}get scope(){return OA(this.record.scope)}get provenance(){return OA(this.record.provenance)}get privacy(){return OA(this.record.privacy)}get consent(){return OA(this.record.consent)}get causality(){return OA(this.record.causality)}get payload(){return OA(this.record.payload)}get integrity(){return OA(this.record.integrity)}toJSON(){return OA(this.record)}}function eY(A){return{schemaVersion:X5,eventId:A.eventId??nY(),machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:q6("occurredAt",A.occurredAt),observedAt:q6("observedAt",A.observedAt),scope:OA(A.scope),provenance:U6(A.provenance),privacy:T6(A.privacy),consent:I6(A.consent),causality:O6(A.causality),payload:OA(A.payload)}}function sY(A){if(!yA(A))throw Error("Memory event record must be an object");let _=A;if(!_.integrity)throw Error("Memory event integrity is required");return{schemaVersion:_.schemaVersion,eventId:String(_.eventId??""),machineId:String(_.machineId??""),sequence:Number(_.sequence),kind:_.kind,operation:_.operation,occurredAt:String(_.occurredAt??""),observedAt:String(_.observedAt??""),scope:yA(_.scope)?oY(_.scope):_.scope,provenance:U6(_.provenance),privacy:T6(_.privacy),consent:I6(_.consent),causality:O6(_.causality),payload:_.payload,integrity:{algorithm:_.integrity.algorithm,payloadHash:String(_.integrity.payloadHash??""),envelopeHash:String(_.integrity.envelopeHash??"")}}}function U6(A){let _=yA(A)?A:{};return{source:String(_.source??""),actor:String(_.actor??""),method:String(_.method??""),sourceIds:__(_.sourceIds)}}function oY(A){let _=yA(A)?A:{};return{project:typeof _.project==="string"?_.project:void 0,workspace:typeof _.workspace==="string"?_.workspace:void 0,visibility:_.visibility}}function T6(A){let _=yA(A)?A:{};return{redactionState:_.redactionState,containsSensitiveContent:_.containsSensitiveContent,policy:typeof _.policy==="string"?_.policy:void 0,redactedFields:Y7(_.redactedFields)}}function I6(A){let _=yA(A)?A:{};return{status:_.status,scopes:__(_.scopes),grantedAt:M6(_.grantedAt),expiresAt:M6(_.expiresAt)}}function O6(A){if(!yA(A))return{parentEventIds:void 0,supersedesEventIds:void 0,relatedEventIds:void 0};let _=A;return{parentEventIds:__(_.parentEventIds),supersedesEventIds:__(_.supersedesEventIds),relatedEventIds:__(_.relatedEventIds)}}function L6(A){if(A.schemaVersion!==X5)throw Error("schemaVersion must be 2");if(!A.eventId||A.eventId.trim()==="")throw Error("eventId is required");if(!A.machineId||A.machineId.trim()==="")throw Error("machineId is required");if(!Number.isSafeInteger(A.sequence)||A.sequence<=0)throw Error("sequence must be a positive safe integer");if(!A.kind||String(A.kind).trim()==="")throw Error("kind is required");if(!iY.includes(A.operation))throw Error("operation is invalid");if(Z$("occurredAt",A.occurredAt),Z$("observedAt",A.observedAt),G7(A.scope),$7(A.provenance),K7(A.privacy),Z7(A.consent),G_("causality.parentEventIds",A.causality.parentEventIds),G_("causality.supersedesEventIds",A.causality.supersedesEventIds),G_("causality.relatedEventIds",A.causality.relatedEventIds),!yA(A.payload))throw Error("payload must be an object")}function A7(A){if(A.integrity.algorithm!=="sha256")throw Error("integrity.algorithm must be sha256");let _=J$(Y$(A.payload));if(A.integrity.payloadHash!==_)throw Error("payload integrity mismatch");let G=J$(Y$({..._7(A),integrity:{algorithm:"sha256",payloadHash:A.integrity.payloadHash}}));if(A.integrity.envelopeHash!==G)throw Error("envelope integrity mismatch")}function _7(A){return{schemaVersion:A.schemaVersion,eventId:A.eventId,machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:A.occurredAt,observedAt:A.observedAt,scope:A.scope,provenance:A.provenance,privacy:A.privacy,consent:A.consent,causality:A.causality,payload:A.payload}}function G7(A){if(!yA(A))throw Error("scope is required");if(!aY.includes(A.visibility))throw Error("scope.visibility is invalid");if(A.visibility==="project"&&(!A.project||A.project.trim()===""))throw Error("scope.project is required for project visibility")}function $7(A){if(!A.source||A.source.trim()==="")throw Error("provenance.source is required");if(!A.actor||A.actor.trim()==="")throw Error("provenance.actor is required");if(!A.method||A.method.trim()==="")throw Error("provenance.method is required");G_("provenance.sourceIds",A.sourceIds??[])}function K7(A){if(!rY.includes(A.redactionState))throw Error("privacy.redactionState is invalid");if(typeof A.containsSensitiveContent!=="boolean")throw Error("privacy.containsSensitiveContent must be boolean");G_("privacy.redactedFields",A.redactedFields??[])}function Z7(A){if(!tY.includes(A.status))throw Error("consent.status is invalid");if(G_("consent.scopes",A.scopes),A.grantedAt!==void 0)Z$("consent.grantedAt",String(A.grantedAt));if(A.expiresAt!==void 0)Z$("consent.expiresAt",String(A.expiresAt))}function Z$(A,_){if(!_||Number.isNaN(new Date(_).getTime()))throw Error(`${A} must be a valid date`)}function __(A){if(!Array.isArray(A))return[];return A.map((_)=>String(_))}function Y7(A){if(A===void 0)return;return __(A)}function M6(A){if(A===void 0)return;return A instanceof Date?A.toISOString():String(A)}function q6(A,_){if(!(_ instanceof Date)||Number.isNaN(_.getTime()))throw Error(`${A} must be a valid date`);return _.toISOString()}function G_(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`${A} must be a string array`)}function Y$(A){return JSON.stringify(Q5(A))}function Q5(A){if(A instanceof Date)return A.toISOString();if(Array.isArray(A))return A.map(Q5);if(!yA(A))return A;let _={};for(let G of Object.keys(A).sort())_[G]=Q5(A[G]);return _}function J$(A){return pY("sha256").update(A).digest("hex")}function OA(A){if(A===void 0)return A;return JSON.parse(JSON.stringify(A))}function yA(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var X5=2,iY,aY,rY,tY;var s_=U(()=>{iY=["add","update","delete","supersede","noop","migrate"],aY=["project","workspace","global"],rY=["none","redacted","quarantined"],tY=["not_required","granted","denied","revoked"]});var j6={};k(j6,{MemoryGovernanceService:()=>cA});class cA{repository;writeEvent;machineId;now;nextSequence;constructor(A){this.repository=A.repository,this.writeEvent=A.writeEvent,this.machineId=A.machineId&&A.machineId.trim()?A.machineId:"local",this.now=A.now??(()=>new Date),this.nextSequence=A.nextSequence??(()=>Math.max(1,Date.now()))}async registerDerivedMemory(A){let _=this.now(),G=this.createEvent({control:"register",surface:A.surface,targetId:A.targetId,actor:A.actor??"memory",reason:void 0,occurredAt:_,project:A.project,visibility:A.visibility??(A.project?"project":"global"),sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,confidence:A.confidence??1,redactionState:A.redactionState??"none",consentStatus:A.consentStatus??"not_required",consentScopes:A.consentScopes??[],expiresAt:A.expiresAt});await this.persistEvent(G);let $=await this.repository.applyMemoryEvent(G);if(!$)throw Error("Governance registration did not produce a projection entry");return $}async suppress(A){return this.applyControl("suppress",A)}async unsuppress(A){return this.applyControl("unsuppress",A)}async invalidate(A){return this.applyControl("invalidate",A)}async expire(A){return this.applyControl("expire",{...A,expiresAt:A.expiresAt??this.now()})}async review(A){return this.applyControl("review",A)}async grantConsent(A){return this.applyControl("consent_grant",{...A,consentStatus:"granted"})}async revokeConsent(A){return this.applyControl("consent_revoke",{...A,consentStatus:"revoked"})}async list(A){return this.repository.findAll(A)}async show(A,_){return this.repository.findByTarget(A,_)}async isAllowed(A,_){let G=await this.repository.findByTarget(A,_);return G?!G.isBlocked(this.now()):!0}async filterAllowed(A,_,G){if(_.length===0)return _;let $=await this.repository.findByTargetIds(A,_.map(G)),K=new Set($.filter((Z)=>Z.isBlocked(this.now())).map((Z)=>Z.targetId));return _.filter((Z)=>!K.has(G(Z)))}async applyControl(A,_){let G=this.now(),$=await this.repository.findByTarget(_.surface,_.targetId),K=this.createEvent({control:A,surface:_.surface,targetId:_.targetId,actor:_.actor??"user",reason:_.reason,occurredAt:G,project:$?.project,visibility:$?.visibility??($?.project?"project":"global"),sourceEventIds:$?.sourceEventIds??[_.targetId],transformationMethod:$?.transformationMethod??`governance.${A}`,confidence:$?.confidence??1,redactionState:$?.redactionState??"none",consentStatus:_.consentStatus??$?.consentStatus??"not_required",consentScopes:_.consentScopes??$?.consentScopes??[],expiresAt:_.expiresAt??$?.expiresAt??null});await this.persistEvent(K);let Z=await this.repository.applyMemoryEvent(K);if(!Z)throw Error(`Governance ${A} did not produce a projection entry`);return Z}createEvent(A){return BA.create({machineId:this.machineId,sequence:this.nextSequence(),kind:A.control==="consent_grant"||A.control==="consent_revoke"?"consent":"governance",operation:A.control==="register"?"add":"update",occurredAt:A.occurredAt,observedAt:A.occurredAt,scope:{...A.project?{project:A.project}:{},visibility:A.visibility},provenance:{source:"memory-governance",actor:A.actor,method:`governance.${A.control}`,sourceIds:A.sourceEventIds},privacy:{redactionState:A.redactionState,containsSensitiveContent:A.redactionState!=="none"},consent:{status:A.consentStatus,scopes:A.consentScopes,...A.expiresAt?{expiresAt:A.expiresAt}:{}},causality:{parentEventIds:A.sourceEventIds,supersedesEventIds:[],relatedEventIds:[A.targetId]},payload:{governance:{control:A.control,surface:A.surface,targetId:A.targetId,...A.project?{project:A.project}:{},visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,actor:A.actor,confidence:A.confidence,redactionState:A.redactionState,consentStatus:A.consentStatus,consentScopes:A.consentScopes,status:"active",...A.reason?{reason:A.reason}:{},...A.expiresAt?{expiresAt:A.expiresAt.toISOString()}:{}}}})}async persistEvent(A){if(this.writeEvent)await this.writeEvent(A)}}var $_=U(()=>{s_()});var F6={};k(F6,{validateRemoteRepositoryUrl:()=>K_,validateRemoteRef:()=>H$,validateMachineIdentity:()=>o_,RemoteEventSyncService:()=>V5});function K_(A,_={}){let G=A.trim();if(!G)return{valid:!1,error:"Remote URL is required"};if(N7(G))return{valid:!1,error:"Remote URL contains control characters"};if(L7(G))return _.allowLocalPathRemote?{valid:!0}:{valid:!1,error:"Local path remotes require explicit allowLocalPathRemote consent"};if(/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:[^\s]+$/.test(G))return{valid:!0};try{let $=new URL(G);if($.protocol==="https:"||$.protocol==="ssh:")return{valid:!0};return{valid:!1,error:"Remote URL protocol is not supported"}}catch{return{valid:!1,error:"Remote URL is not a supported Git remote"}}}function H$(A){let _=A.trim();if(!_)return{valid:!1,error:"Remote ref is required"};if(Q7.test(_))return{valid:!1,error:"Remote ref contains unsafe characters"};if(_.startsWith("/")||_.endsWith("/")||_.startsWith(".")||_.includes("..")||_.includes("//")||_.endsWith(".")||_.endsWith(".lock"))return{valid:!1,error:"Remote ref is not a valid branch name"};return{valid:!0}}function o_(A){let _=A.trim();if(!_)return{valid:!1,error:"Machine identity is required"};if(_==="local"||_==="legacy")return{valid:!1,error:"Machine identity must come from durable config, not a fallback value"};if(!X7.test(_))return{valid:!1,error:"Machine identity contains unsafe characters"};if(_.length>128)return{valid:!1,error:"Machine identity is too long"};return{valid:!0}}class V5{transport;privacyPreflight;projectionRebuilder;now;constructor(A){this.transport=A.transport,this.privacyPreflight=A.privacyPreflight,this.projectionRebuilder=A.projectionRebuilder,this.now=A.now??(()=>new Date)}async sync(A){let _=A.remoteName??J7,G=A.branch??H7,$=A.autoPull??!0,K=A.autoPush??!0,Z=!1,Y=!1,J=!1,H=!1;try{let Q=V7(A,G,_);if(!Q.valid)return R6(Q.error??"Remote sync request is invalid");let X=await this.privacyPreflight?.audit();if(X&&X.eventLogFindings>0)return R6(`Remote synchronization blocked: active event logs contain ${X.eventLogFindings} likely secret finding(s).`);if(!await this.transport.isRepository()){let z=await this.transport.initRepository(B7(A.machineId));if(!z.success)return x0(z.error??"Failed to initialize Git repository in events directory");Z=!0}if(await this.transport.getRemoteUrl()!==A.repositoryUrl.trim()){let z=await this.transport.setRemoteUrl(A.repositoryUrl.trim());if(!z.success)return x0(z.error??"Failed to configure Git remote repository URL",{initializedRepository:Z});Y=!0}let W=await this.transport.listEventLogFingerprints();if(await this.transport.hasEventLog(A.machineId)){let z=await this.transport.commitEventLog(A.machineId,W7(A.machineId,this.now()));if(!z.success)return x0(`Git commit failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y})}if($){let z=await this.transport.fetch(_);if(!z.success)return x0(`Git fetch failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});if(await this.transport.hasRemoteRef(_,G)){let q=await this.transport.pullRebase(_,G);if(!q.success)return await this.transport.abortRebase(),x0(`Git pull failed: ${q.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});J=!0}}if(K){let z=await this.transport.push(_,G);if(!z.success){let q=await this.rebuildIfNeeded(W);return x0(`Git push failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y,pulled:J,rebuildNeeded:q.rebuildNeeded,projectionRebuilt:q.projectionRebuilt})}H=!0}let N=await this.rebuildIfNeeded(W);return{success:!0,status:"synced",rebuildNeeded:N.rebuildNeeded,projectionRebuilt:N.projectionRebuilt,pulled:J,pushed:H,configuredRemote:Y,initializedRepository:Z,error:void 0}}catch(Q){return x0(L(Q),{initializedRepository:Z,configuredRemote:Y,pulled:J,pushed:H})}}async rebuildIfNeeded(A){let _=await this.transport.listEventLogFingerprints(),G=z7(A,_);if(G&&this.projectionRebuilder)return await this.projectionRebuilder.rebuild(),{rebuildNeeded:G,projectionRebuilt:!0};return{rebuildNeeded:G,projectionRebuilt:!1}}}function V7(A,_,G){let $=o_(A.machineId);if(!$.valid)return $;let K=K_(A.repositoryUrl,A.allowLocalPathRemote===void 0?{}:{allowLocalPathRemote:A.allowLocalPathRemote});if(!K.valid)return K;let Z=H$(_);if(!Z.valid)return Z;if(!H$(G).valid)return{valid:!1,error:"Remote name is not valid"};return{valid:!0}}function B7(A){return{machineId:A,userName:"Memory Sync",userEmail:"sync@memory.local"}}function W7(A,_){return`sync: ${A} observed at ${_.toISOString()}`}function R6(A){return{success:!1,status:"blocked",rebuildNeeded:!1,projectionRebuilt:!1,pulled:!1,pushed:!1,configuredRemote:!1,initializedRepository:!1,error:A}}function x0(A,_={}){return{success:!1,status:"failed",rebuildNeeded:_.rebuildNeeded??!1,projectionRebuilt:_.projectionRebuilt??!1,pulled:_.pulled??!1,pushed:_.pushed??!1,configuredRemote:_.configuredRemote??!1,initializedRepository:_.initializedRepository??!1,error:A}}function z7(A,_){let G=Object.keys(A).sort(),$=Object.keys(_).sort();if(G.length!==$.length)return!0;for(let K=0;K<G.length;K+=1){let Z=G[K],Y=$[K];if(Z!==Y||A[Z]!==_[Y])return!0}return!1}function N7(A){return/[\u0000-\u001F\u007F]/.test(A)}function L7(A){return A.startsWith("/")||A.startsWith("./")||A.startsWith("../")||A.startsWith("~")||A.startsWith("file://")||/^[A-Za-z]:[\\/]/.test(A)}var J7="origin",H7="main",Q7,X7;var Q$=U(()=>{Q7=/[\s~^:?*[\]\\;]/,X7=/^[A-Za-z0-9._-]+$/});var E6={};k(E6,{trackDownloadTotal:()=>I7,isUnicodeSupported:()=>S6,getBarCharacters:()=>X$,createProgressReporter:()=>L5,createModelDownloadHandler:()=>O7,createEmbeddingProgressReporter:()=>T7,TtyProgressReporter:()=>W5,TtyEmbeddingProgressReporter:()=>M5,QuietProgressReporter:()=>N5,QuietEmbeddingProgressReporter:()=>U5,PlainProgressReporter:()=>z5,PlainEmbeddingProgressReporter:()=>q5});import B5 from"cli-progress";function S6(){let{env:A}=process;if(process.platform!=="win32")return A.TERM!=="linux";return Boolean(A.MSYSTEM)||Boolean(A.WT_SESSION)||Boolean(A.TERMINUS_SUBLIME)||A.ConEmuTask==="{cmd::Cmder}"||A.TERM_PROGRAM==="vscode"||A.TERM==="xterm-256color"||A.TERM==="alacritty"||A.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function X$(){return S6()?q7:U7}class W5{bar;verbose;total=0;currentValue=0;constructor(A=!1){this.verbose=A;let _=X$();this.bar=new B5.SingleBar({format:"Syncing |{bar}| {percentage}% | {value}/{total} sessions",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0})}start(A){this.total=A,this.currentValue=0,this.bar.start(A,0)}update(A,_){if(this.currentValue=A,this.bar.update(A),this.verbose)this.bar.stop(),console.log(` Processing: ${_}`),this.bar.start(this.total,A)}stop(){this.bar.stop()}log(A){if(this.verbose)this.bar.stop(),console.log(A),this.bar.start(this.total,this.currentValue)}}class z5{verbose;constructor(A=!1){this.verbose=A}start(A){console.log(`Processing ${A} sessions...`)}update(A,_){if(this.verbose)console.log(` [${A}] Processing: ${_}`)}stop(){console.log("Done.")}log(A){if(this.verbose)console.log(A)}}class N5{start(A){}update(A,_){}stop(){}log(A){}}function L5(A){if(A.quiet)return new N5;if(!process.stdout.isTTY)return new z5(A.verbose);return new W5(A.verbose)}class M5{bar;constructor(){let A=X$();this.bar=new B5.SingleBar({format:"Embedding |{bar}| {percentage}% | {value}/{total} messages | ETA: {eta_formatted}",barCompleteChar:A.complete,barIncompleteChar:A.incomplete,hideCursor:!0,etaBuffer:20})}start(A){this.bar.start(A,0)}update(A){this.bar.update(A)}stop(){this.bar.stop()}}class q5{start(A){console.log(`Embedding ${A} messages...`)}update(A){}stop(){console.log("Done.")}}class U5{start(A){}update(A){}stop(){}}function T7(A){if(A.quiet)return new U5;if(!process.stdout.isTTY)return new q5;return new M5}function I7(A,_){let G=Math.round(_/1048576);return G>A?G:A}function O7(A){if(A.quiet||!process.stdout.isTTY){let Z=!1;return(Y)=>{if(!Z&&Y.status==="downloading"&&!A.quiet)console.log("Downloading embedding model (one-time setup)..."),Z=!0}}let _=X$(),G=new B5.SingleBar({format:"Downloading model |{bar}| {percentage}% | {value}/{total} MB",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0}),$=!1,K=0;return(Z)=>{if(Z.status==="downloading"){let Y=Math.round(Z.loaded/1048576),J=Math.round(Z.total/1048576);if(J>K)K=J;if(!$&&K>0)G.start(K,Y),$=!0;else if($){if(J>0&&G.getTotal()!==K)G.setTotal(K);G.update(Y)}}else if(Z.status==="ready"&&$)G.stop()}}var q7,U7;var T5=U(()=>{q7={complete:"\u2588",incomplete:"\u2591"},U7={complete:"#",incomplete:"-"}});function AG(A){try{return A.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),A.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function V$(A,_){let{sqliteVecAvailable:G=!1}=_??{};if(!AG(A))throw Error("FTS5 extension is not available. Ensure you are using Bun with FTS5 support enabled.");try{let Z=A.prepare("PRAGMA table_info(friction_log)").all();if(!Z.some((J)=>J.name==="tool")&&Z.length>0)A.exec(`
18
18
  CREATE TABLE friction_log_new (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  description TEXT NOT NULL,
@@ -681,7 +681,7 @@ CREATE TABLE IF NOT EXISTS embedding_skips (
681
681
  );
682
682
  CREATE INDEX IF NOT EXISTS idx_embedding_skips_model ON embedding_skips(model_hash);
683
683
  CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(message_id, model_hash);
684
- `]});class Z_{_sourceType;_sourceId;_targetType;_targetId;_relationship;_weight;constructor(A){this._sourceType=A.sourceType,this._sourceId=A.sourceId,this._targetType=A.targetType,this._targetId=A.targetId,this._relationship=A.relationship,this._weight=A.weight??1}static create(A){if(!A.sourceId||A.sourceId.trim()==="")throw Error("Source ID cannot be empty");if(!A.targetId||A.targetId.trim()==="")throw Error("Target ID cannot be empty");if(!p6.includes(A.sourceType))throw Error("Invalid source type");if(!p6.includes(A.targetType))throw Error("Invalid target type");if(!j7.includes(A.relationship))throw Error("Invalid relationship type");if(A.weight!==void 0&&(A.weight<0||A.weight>1))throw Error("Weight must be between 0 and 1");return new Z_(A)}get id(){return`${this._sourceType}:${this._sourceId}->${this._targetType}:${this._targetId}:${this._relationship}`}get sourceType(){return this._sourceType}get sourceId(){return this._sourceId}get targetType(){return this._targetType}get targetId(){return this._targetId}get relationship(){return this._relationship}get weight(){return this._weight}equals(A){return this.id===A.id}withWeight(A){if(A<0||A>1)throw Error("Weight must be between 0 and 1");return new Z_({sourceType:this._sourceType,sourceId:this._sourceId,targetType:this._targetType,targetId:this._targetId,relationship:this._relationship,weight:A})}}var p6,j7;var j5=U(()=>{p6=["session","message","topic"],j7=["mentions","related_to","continues"]});import{randomUUID as R7}from"crypto";class YA{_id;_uuid;_type;_project;_content;_metadata;_observedAt;_supersededAt;_supersededBy;constructor(A){this._id=A.id,this._uuid=A.uuid??R7(),this._type=A.type,this._project=A.project,this._content=A.content,this._metadata=A.metadata?JSON.parse(JSON.stringify(A.metadata)):void 0,this._observedAt=new Date(A.observedAt.getTime()),this._supersededAt=A.supersededAt?new Date(A.supersededAt.getTime()):null,this._supersededBy=A.supersededBy??null}static create(A){if(!A.project||A.project.trim()==="")throw Error("Fact project cannot be empty");if(!A.content||A.content.trim()==="")throw Error("Fact content cannot be empty");if(!["decision","learning","preference","friction","observation","supersedence"].includes(A.type))throw Error("Invalid fact type");return new YA(A)}get id(){return this._id}get uuid(){return this._uuid}get type(){return this._type}get project(){return this._project}get content(){return this._content}get metadata(){return this._metadata?JSON.parse(JSON.stringify(this._metadata)):void 0}get observedAt(){return new Date(this._observedAt.getTime())}get supersededAt(){return this._supersededAt?new Date(this._supersededAt.getTime()):null}get supersededBy(){return this._supersededBy}withId(A){return new YA({id:A,uuid:this._uuid,type:this._type,project:this._project,content:this._content,metadata:this._metadata,observedAt:this._observedAt,supersededAt:this._supersededAt,supersededBy:this._supersededBy})}withSuperseded(A,_){return new YA({id:this._id,uuid:this._uuid,type:this._type,project:this._project,content:this._content,metadata:this._metadata,observedAt:this._observedAt,supersededAt:A,supersededBy:_})}}var _G=()=>{};class uA{params;constructor(A){let _=new Date;this.params={id:A.id,surface:A.surface,targetId:A.targetId.trim(),project:A.project?.trim()||void 0,accessCount:A.accessCount??0,lastAccessedAt:A.lastAccessedAt?J0(A.lastAccessedAt):null,lastRankedAt:A.lastRankedAt?J0(A.lastRankedAt):null,utilityScore:A.utilityScore??0.5,importanceScore:A.importanceScore??0.5,evergreen:A.evergreen??!1,pinned:A.pinned??!1,halfLifeDays:A.halfLifeDays??null,metadata:A.metadata?i6(A.metadata):void 0,createdAt:J0(A.createdAt??_),updatedAt:J0(A.updatedAt??A.createdAt??_)}}static create(A){return F7(A),new uA(A)}get id(){return this.params.id}get surface(){return this.params.surface}get targetId(){return this.params.targetId}get project(){return this.params.project}get accessCount(){return this.params.accessCount}get lastAccessedAt(){return this.params.lastAccessedAt?J0(this.params.lastAccessedAt):null}get lastRankedAt(){return this.params.lastRankedAt?J0(this.params.lastRankedAt):null}get utilityScore(){return this.params.utilityScore}get importanceScore(){return this.params.importanceScore}get evergreen(){return this.params.evergreen}get pinned(){return this.params.pinned}get halfLifeDays(){return this.params.halfLifeDays}get metadata(){return this.params.metadata?i6(this.params.metadata):void 0}get controls(){return[...r6]}get createdAt(){return J0(this.params.createdAt)}get updatedAt(){return J0(this.params.updatedAt)}withId(A){return uA.create({...this.toParams(),id:A})}recordAccess(A){return uA.create({...this.toParams(),accessCount:this.accessCount+1,lastAccessedAt:A,updatedAt:A})}markRanked(A){return uA.create({...this.toParams(),lastRankedAt:A,updatedAt:A})}toParams(){return{id:this.id,surface:this.surface,targetId:this.targetId,project:this.project,accessCount:this.accessCount,lastAccessedAt:this.lastAccessedAt,lastRankedAt:this.lastRankedAt,utilityScore:this.utilityScore,importanceScore:this.importanceScore,evergreen:this.evergreen,pinned:this.pinned,halfLifeDays:this.halfLifeDays,metadata:this.metadata,createdAt:this.createdAt,updatedAt:this.updatedAt}}toJSON(){return{...this.id!==void 0?{id:this.id}:{},surface:this.surface,target_id:this.targetId,...this.project!==void 0?{project:this.project}:{},access_count:this.accessCount,last_accessed_at:this.lastAccessedAt?this.lastAccessedAt.toISOString():null,last_ranked_at:this.lastRankedAt?this.lastRankedAt.toISOString():null,utility_score:this.utilityScore,importance_score:this.importanceScore,evergreen:this.evergreen,pinned:this.pinned,half_life_days:this.halfLifeDays,...this.metadata!==void 0?{metadata:this.metadata}:{},controls:this.controls,created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString()}}}function F7(A){if(!a6.includes(A.surface))throw Error(`Invalid utility surface: ${A.surface}`);if(!A.targetId||A.targetId.trim()==="")throw Error("targetId cannot be empty");if(A.accessCount!==void 0&&(!Number.isInteger(A.accessCount)||A.accessCount<0))throw Error("accessCount must be a non-negative integer");if(n6(A.utilityScore??0.5,"utilityScore"),n6(A.importanceScore??0.5,"importanceScore"),A.halfLifeDays!==void 0&&A.halfLifeDays!==null){if(!Number.isFinite(A.halfLifeDays)||A.halfLifeDays<=0)throw Error("halfLifeDays must be a positive finite number")}B1(A.lastAccessedAt,"lastAccessedAt"),B1(A.lastRankedAt,"lastRankedAt"),B1(A.createdAt,"createdAt"),B1(A.updatedAt,"updatedAt")}function n6(A,_){if(!Number.isFinite(A)||A<0||A>1)throw Error(`${_} must be between 0 and 1`)}function B1(A,_){if(A!==void 0&&A!==null&&(!(A instanceof Date)||Number.isNaN(A.getTime())))throw Error(`${_} must be a valid Date`)}function J0(A){return new Date(A.getTime())}function i6(A){return JSON.parse(JSON.stringify(A))}var a6,r6;var R5=U(()=>{a6=["fact","persona","graph","link","dream"],r6=["record_access","rank","pin","mark_evergreen"]});var t6=U(()=>{p_();vG();j5();l_();hG();gG();uG();_G();s_();D0();e_();K1();R5()});class kA{_embedding;_model;_dimensions;constructor(A){this._embedding=new Float32Array(A.embedding),this._model=A.model,this._dimensions=A.dimensions}static create(A){if(A.embedding.length===0)throw Error("Embedding cannot be empty");let _=A.model.trim();if(_==="")throw Error("Model cannot be empty");if(A.dimensions!==A.embedding.length)throw Error(`Dimensions (${A.dimensions}) must match embedding length (${A.embedding.length})`);return new kA({embedding:A.embedding,model:_,dimensions:A.dimensions})}get embedding(){return new Float32Array(this._embedding)}get model(){return this._model}get dimensions(){return this._dimensions}equals(A){if(this._model!==A._model)return!1;if(this._dimensions!==A._dimensions)return!1;for(let _=0;_<this._dimensions;_++)if(this._embedding[_]!==A._embedding[_])return!1;return!0}}var e6={};k(e6,{ProjectPath:()=>$A});class $A{_decoded;_encoded;_projectName;constructor(A,_,G){this._decoded=A,this._encoded=_,this._projectName=G??this.extractProjectName(A)}static fromDecoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.encode(A);return new $A(A,_)}static fromEncoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.decode(A);return new $A(_,A)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName(A){return new $A(this._decoded,this._encoded,A)}equals(A){return this._decoded===A._decoded}static encode(A){return A.replace(/:\\/g,"--").replace(/\\/g,"-").replace(/\//g,"-").replace(/ /g,"-")}static decode(A){if(/^([A-Za-z])--/.test(A))return A.replace(/^([A-Za-z])--/,"$1:\\").replace(/-/g,"\\");else return A.replace(/-/g,"/")}extractProjectName(A){let _=A.replace(/[\\/]+$/,"");if(_===""&&A.startsWith("/"))return"";if(/^[A-Za-z]:$/.test(_))return _;let G=_.split(/[\\/]/);return G[G.length-1]||""}}class GG{_value;constructor(A){this._value=A}static from(A){let _=A.trim();if(_==="")throw Error("Query cannot be empty");return new GG(_)}get value(){return this._value}equals(A){return this._value===A._value}}class jA{_sessionId;_messageId;_snippet;_score;_timestamp;_role;_source;_rawScores;constructor(A){this._sessionId=A.sessionId,this._messageId=A.messageId,this._snippet=A.snippet,this._score=A.score,this._timestamp=new Date(A.timestamp.getTime()),this._role=A.role,this._source=A.source,this._rawScores=A.rawScores?{...A.rawScores}:void 0}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.messageId||A.messageId.trim()==="")throw Error("Message ID cannot be empty");if(!A.snippet||A.snippet.trim()==="")throw Error("Snippet cannot be empty");if(A.score<0||A.score>1)throw Error("Score must be between 0 and 1");if(!A.role||A.role.trim()==="")throw Error("Role cannot be empty");return new jA(A)}get sessionId(){return this._sessionId}get messageId(){return this._messageId}get snippet(){return this._snippet}get score(){return this._score}get timestamp(){return new Date(this._timestamp.getTime())}get role(){return this._role}get source(){return this._source}get rawScores(){return this._rawScores?{...this._rawScores}:void 0}equals(A){return this._sessionId===A._sessionId&&this._messageId===A._messageId}compareByScore(A){return A._score-this._score}}var F5=()=>{};class H0{static decodeProjectDirectory(A){return $A.fromEncoded(A)}static isEncodedPath(A){if(!A||A.length===0)return!1;if(S7.test(A))return!0;if(E7.test(A))return!0;return!1}static extractProjectName(A){return $A.fromEncoded(A).projectName}static filterEncodedPaths(A){return A.filter((_)=>H0.isEncodedPath(_))}static translatePath(A,_=process.platform){if(!A||A.trim()==="")return A;if(_==="win32"){let G=A.match(/^\/mnt\/([a-zA-Z])([\/]?)(.*)$/);if(G){let $=G[1].toUpperCase(),K=G[3].replace(/\//g,"\\");return`${$}:\\${K}`}return A}else{let G=A.match(/^([a-zA-Z]):([\\/]?)(.*)$/);if(G){let $=G[1].toLowerCase(),K=G[3].replace(/\\/g,"/");return`/mnt/${$}/${K}`}return A}}static resolveExistingPath(A,_,G=process.platform){if(!A)return A;let $=_??(()=>!1);if($(A))return A;let K=H0.translatePath(A,G);if($(K))return K;return A}}var S7,E7;var W1=U(()=>{F5();S7=/^[A-Za-z]--/,E7=/^-[a-z]/i});var s6=()=>{};var o6=U(()=>{W1();s6()});var z1=U(()=>{t6();F5();o6();IA()});import{Database as D7}from"bun:sqlite";import{existsSync as x7,mkdirSync as P7}from"fs";import{dirname as A4}from"path";function y7(A){try{return U0("sqlite-vec").load(A),!0}catch{return!1}}function S(){return t0()}function D(A){let{path:_,create:G=!0,applySchema:$=!0,walMode:K=!0,cacheSize:Z=-64000,busyTimeout:Y=5000}=A,J=_!==":memory:",H=J&&x7(_),Q=A.quickCheck??(J&&H);if(J)try{P7(A4(_),{recursive:!0})}catch(B){let W=L(B);throw new F(j.DB_CONNECTION_FAILED,`Failed to create database directory: ${W}`,{path:A4(_)})}let X;try{X=new D7(_,{create:G})}catch(B){let W=L(B),N=B.code;throw new F(j.DB_CONNECTION_FAILED,`Failed to connect to database: ${W}`,{path:_,...N?{errno:N}:{}})}let V=(B)=>{X.close();let W=L(B);if(W.includes("not a database")||W.includes("SQLITE_NOTADB"))throw new F(j.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:_});throw new F(j.DB_CONNECTION_FAILED,`Failed to initialize database: ${W}`,{path:_})};try{X.exec("PRAGMA foreign_keys = ON;");let B=!1;if(K&&J){X.exec("PRAGMA journal_mode = WAL;");let z=X.query("PRAGMA journal_mode;").get();if(B=z.journal_mode==="wal",!B)console.warn(`Warning: WAL mode not enabled. Current mode: ${z.journal_mode}`)}X.exec(`PRAGMA busy_timeout = ${Y};`),X.exec("PRAGMA synchronous = NORMAL;"),X.exec(`PRAGMA cache_size = ${Z};`),X.exec("PRAGMA temp_store = MEMORY;");let W=AG(X);if(!W){let z=X.query("SELECT sqlite_version() as version").get();throw X.close(),new F(j.DB_CONNECTION_FAILED,"FTS5 is not available. memory requires FTS5 for full-text search.",{sqliteVersion:z?.version??"unknown"})}if(Q){let z=X.query("PRAGMA quick_check(1);").get();if(z?.quick_check!=="ok")throw X.close(),new F(j.DB_CORRUPTED,"Database integrity check failed",{path:_,checkResult:z?.quick_check??"unknown"})}let N=y7(X);if($)V1(X,{sqliteVecAvailable:N});return{db:X,walEnabled:B,fts5Available:W,sqliteVecAvailable:N}}catch(B){if(B instanceof F)throw B;throw V(B)}}function E(A){try{A.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{A.exec("PRAGMA journal_mode = DELETE;")}catch{}A.close()}function _4(A){A.exec("PRAGMA wal_checkpoint(PASSIVE);")}function N1(A){return A.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}function G4(A){try{return D(A)}catch(_){if(_ instanceof F)throw _;let G=L(_),$=_.code;throw new F(j.DB_CONNECTION_FAILED,`Database initialization failed: ${G}`,{path:A.path,...$?{errno:$}:{}})}}var S5=U(()=>{O5();z1();c()});var $4={};k($4,{SqliteSessionRepository:()=>m});class m{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`
684
+ `]});class Z_{_sourceType;_sourceId;_targetType;_targetId;_relationship;_weight;constructor(A){this._sourceType=A.sourceType,this._sourceId=A.sourceId,this._targetType=A.targetType,this._targetId=A.targetId,this._relationship=A.relationship,this._weight=A.weight??1}static create(A){if(!A.sourceId||A.sourceId.trim()==="")throw Error("Source ID cannot be empty");if(!A.targetId||A.targetId.trim()==="")throw Error("Target ID cannot be empty");if(!p6.includes(A.sourceType))throw Error("Invalid source type");if(!p6.includes(A.targetType))throw Error("Invalid target type");if(!j7.includes(A.relationship))throw Error("Invalid relationship type");if(A.weight!==void 0&&(A.weight<0||A.weight>1))throw Error("Weight must be between 0 and 1");return new Z_(A)}get id(){return`${this._sourceType}:${this._sourceId}->${this._targetType}:${this._targetId}:${this._relationship}`}get sourceType(){return this._sourceType}get sourceId(){return this._sourceId}get targetType(){return this._targetType}get targetId(){return this._targetId}get relationship(){return this._relationship}get weight(){return this._weight}equals(A){return this.id===A.id}withWeight(A){if(A<0||A>1)throw Error("Weight must be between 0 and 1");return new Z_({sourceType:this._sourceType,sourceId:this._sourceId,targetType:this._targetType,targetId:this._targetId,relationship:this._relationship,weight:A})}}var p6,j7;var j5=U(()=>{p6=["session","message","topic"],j7=["mentions","related_to","continues"]});import{randomUUID as R7}from"crypto";class YA{_id;_uuid;_type;_project;_content;_metadata;_observedAt;_supersededAt;_supersededBy;constructor(A){this._id=A.id,this._uuid=A.uuid??R7(),this._type=A.type,this._project=A.project,this._content=A.content,this._metadata=A.metadata?JSON.parse(JSON.stringify(A.metadata)):void 0,this._observedAt=new Date(A.observedAt.getTime()),this._supersededAt=A.supersededAt?new Date(A.supersededAt.getTime()):null,this._supersededBy=A.supersededBy??null}static create(A){if(!A.project||A.project.trim()==="")throw Error("Fact project cannot be empty");if(!A.content||A.content.trim()==="")throw Error("Fact content cannot be empty");if(!["decision","learning","preference","friction","observation","supersedence"].includes(A.type))throw Error("Invalid fact type");return new YA(A)}get id(){return this._id}get uuid(){return this._uuid}get type(){return this._type}get project(){return this._project}get content(){return this._content}get metadata(){return this._metadata?JSON.parse(JSON.stringify(this._metadata)):void 0}get observedAt(){return new Date(this._observedAt.getTime())}get supersededAt(){return this._supersededAt?new Date(this._supersededAt.getTime()):null}get supersededBy(){return this._supersededBy}withId(A){return new YA({id:A,uuid:this._uuid,type:this._type,project:this._project,content:this._content,metadata:this._metadata,observedAt:this._observedAt,supersededAt:this._supersededAt,supersededBy:this._supersededBy})}withSuperseded(A,_){return new YA({id:this._id,uuid:this._uuid,type:this._type,project:this._project,content:this._content,metadata:this._metadata,observedAt:this._observedAt,supersededAt:A,supersededBy:_})}}var _G=()=>{};class uA{params;constructor(A){let _=new Date;this.params={id:A.id,surface:A.surface,targetId:A.targetId.trim(),project:A.project?.trim()||void 0,accessCount:A.accessCount??0,lastAccessedAt:A.lastAccessedAt?J0(A.lastAccessedAt):null,lastRankedAt:A.lastRankedAt?J0(A.lastRankedAt):null,utilityScore:A.utilityScore??0.5,importanceScore:A.importanceScore??0.5,evergreen:A.evergreen??!1,pinned:A.pinned??!1,halfLifeDays:A.halfLifeDays??null,metadata:A.metadata?i6(A.metadata):void 0,createdAt:J0(A.createdAt??_),updatedAt:J0(A.updatedAt??A.createdAt??_)}}static create(A){return F7(A),new uA(A)}get id(){return this.params.id}get surface(){return this.params.surface}get targetId(){return this.params.targetId}get project(){return this.params.project}get accessCount(){return this.params.accessCount}get lastAccessedAt(){return this.params.lastAccessedAt?J0(this.params.lastAccessedAt):null}get lastRankedAt(){return this.params.lastRankedAt?J0(this.params.lastRankedAt):null}get utilityScore(){return this.params.utilityScore}get importanceScore(){return this.params.importanceScore}get evergreen(){return this.params.evergreen}get pinned(){return this.params.pinned}get halfLifeDays(){return this.params.halfLifeDays}get metadata(){return this.params.metadata?i6(this.params.metadata):void 0}get controls(){return[...r6]}get createdAt(){return J0(this.params.createdAt)}get updatedAt(){return J0(this.params.updatedAt)}withId(A){return uA.create({...this.toParams(),id:A})}recordAccess(A){return uA.create({...this.toParams(),accessCount:this.accessCount+1,lastAccessedAt:A,updatedAt:A})}markRanked(A){return uA.create({...this.toParams(),lastRankedAt:A,updatedAt:A})}toParams(){return{id:this.id,surface:this.surface,targetId:this.targetId,project:this.project,accessCount:this.accessCount,lastAccessedAt:this.lastAccessedAt,lastRankedAt:this.lastRankedAt,utilityScore:this.utilityScore,importanceScore:this.importanceScore,evergreen:this.evergreen,pinned:this.pinned,halfLifeDays:this.halfLifeDays,metadata:this.metadata,createdAt:this.createdAt,updatedAt:this.updatedAt}}toJSON(){return{...this.id!==void 0?{id:this.id}:{},surface:this.surface,target_id:this.targetId,...this.project!==void 0?{project:this.project}:{},access_count:this.accessCount,last_accessed_at:this.lastAccessedAt?this.lastAccessedAt.toISOString():null,last_ranked_at:this.lastRankedAt?this.lastRankedAt.toISOString():null,utility_score:this.utilityScore,importance_score:this.importanceScore,evergreen:this.evergreen,pinned:this.pinned,half_life_days:this.halfLifeDays,...this.metadata!==void 0?{metadata:this.metadata}:{},controls:this.controls,created_at:this.createdAt.toISOString(),updated_at:this.updatedAt.toISOString()}}}function F7(A){if(!a6.includes(A.surface))throw Error(`Invalid utility surface: ${A.surface}`);if(!A.targetId||A.targetId.trim()==="")throw Error("targetId cannot be empty");if(A.accessCount!==void 0&&(!Number.isInteger(A.accessCount)||A.accessCount<0))throw Error("accessCount must be a non-negative integer");if(n6(A.utilityScore??0.5,"utilityScore"),n6(A.importanceScore??0.5,"importanceScore"),A.halfLifeDays!==void 0&&A.halfLifeDays!==null){if(!Number.isFinite(A.halfLifeDays)||A.halfLifeDays<=0)throw Error("halfLifeDays must be a positive finite number")}B$(A.lastAccessedAt,"lastAccessedAt"),B$(A.lastRankedAt,"lastRankedAt"),B$(A.createdAt,"createdAt"),B$(A.updatedAt,"updatedAt")}function n6(A,_){if(!Number.isFinite(A)||A<0||A>1)throw Error(`${_} must be between 0 and 1`)}function B$(A,_){if(A!==void 0&&A!==null&&(!(A instanceof Date)||Number.isNaN(A.getTime())))throw Error(`${_} must be a valid Date`)}function J0(A){return new Date(A.getTime())}function i6(A){return JSON.parse(JSON.stringify(A))}var a6,r6;var R5=U(()=>{a6=["fact","persona","graph","link","dream"],r6=["record_access","rank","pin","mark_evergreen"]});var t6=U(()=>{p_();vG();j5();l_();hG();gG();uG();_G();s_();D0();e_();K$();R5()});class kA{_embedding;_model;_dimensions;constructor(A){this._embedding=new Float32Array(A.embedding),this._model=A.model,this._dimensions=A.dimensions}static create(A){if(A.embedding.length===0)throw Error("Embedding cannot be empty");let _=A.model.trim();if(_==="")throw Error("Model cannot be empty");if(A.dimensions!==A.embedding.length)throw Error(`Dimensions (${A.dimensions}) must match embedding length (${A.embedding.length})`);return new kA({embedding:A.embedding,model:_,dimensions:A.dimensions})}get embedding(){return new Float32Array(this._embedding)}get model(){return this._model}get dimensions(){return this._dimensions}equals(A){if(this._model!==A._model)return!1;if(this._dimensions!==A._dimensions)return!1;for(let _=0;_<this._dimensions;_++)if(this._embedding[_]!==A._embedding[_])return!1;return!0}}var e6={};k(e6,{ProjectPath:()=>$A});class $A{_decoded;_encoded;_projectName;constructor(A,_,G){this._decoded=A,this._encoded=_,this._projectName=G??this.extractProjectName(A)}static fromDecoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.encode(A);return new $A(A,_)}static fromEncoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.decode(A);return new $A(_,A)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName(A){return new $A(this._decoded,this._encoded,A)}equals(A){return this._decoded===A._decoded}static encode(A){return A.replace(/:\\/g,"--").replace(/\\/g,"-").replace(/\//g,"-").replace(/ /g,"-")}static decode(A){if(/^([A-Za-z])--/.test(A))return A.replace(/^([A-Za-z])--/,"$1:\\").replace(/-/g,"\\");else return A.replace(/-/g,"/")}extractProjectName(A){let _=A.replace(/[\\/]+$/,"");if(_===""&&A.startsWith("/"))return"";if(/^[A-Za-z]:$/.test(_))return _;let G=_.split(/[\\/]/);return G[G.length-1]||""}}class GG{_value;constructor(A){this._value=A}static from(A){let _=A.trim();if(_==="")throw Error("Query cannot be empty");return new GG(_)}get value(){return this._value}equals(A){return this._value===A._value}}class jA{_sessionId;_messageId;_snippet;_score;_timestamp;_role;_source;_rawScores;constructor(A){this._sessionId=A.sessionId,this._messageId=A.messageId,this._snippet=A.snippet,this._score=A.score,this._timestamp=new Date(A.timestamp.getTime()),this._role=A.role,this._source=A.source,this._rawScores=A.rawScores?{...A.rawScores}:void 0}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.messageId||A.messageId.trim()==="")throw Error("Message ID cannot be empty");if(!A.snippet||A.snippet.trim()==="")throw Error("Snippet cannot be empty");if(A.score<0||A.score>1)throw Error("Score must be between 0 and 1");if(!A.role||A.role.trim()==="")throw Error("Role cannot be empty");return new jA(A)}get sessionId(){return this._sessionId}get messageId(){return this._messageId}get snippet(){return this._snippet}get score(){return this._score}get timestamp(){return new Date(this._timestamp.getTime())}get role(){return this._role}get source(){return this._source}get rawScores(){return this._rawScores?{...this._rawScores}:void 0}equals(A){return this._sessionId===A._sessionId&&this._messageId===A._messageId}compareByScore(A){return A._score-this._score}}var F5=()=>{};class H0{static decodeProjectDirectory(A){return $A.fromEncoded(A)}static isEncodedPath(A){if(!A||A.length===0)return!1;if(S7.test(A))return!0;if(E7.test(A))return!0;return!1}static extractProjectName(A){return $A.fromEncoded(A).projectName}static filterEncodedPaths(A){return A.filter((_)=>H0.isEncodedPath(_))}static translatePath(A,_=process.platform){if(!A||A.trim()==="")return A;if(_==="win32"){let G=A.match(/^\/mnt\/([a-zA-Z])([\/]?)(.*)$/);if(G){let $=G[1].toUpperCase(),K=G[3].replace(/\//g,"\\");return`${$}:\\${K}`}return A}else{let G=A.match(/^([a-zA-Z]):([\\/]?)(.*)$/);if(G){let $=G[1].toLowerCase(),K=G[3].replace(/\\/g,"/");return`/mnt/${$}/${K}`}return A}}static resolveExistingPath(A,_,G=process.platform){if(!A)return A;let $=_??(()=>!1);if($(A))return A;let K=H0.translatePath(A,G);if($(K))return K;return A}}var S7,E7;var W$=U(()=>{F5();S7=/^[A-Za-z]--/,E7=/^-[a-z]/i});var s6=()=>{};var o6=U(()=>{W$();s6()});var z$=U(()=>{t6();F5();o6();IA()});import{Database as D7}from"bun:sqlite";import{existsSync as x7,mkdirSync as P7}from"fs";import{dirname as A4}from"path";function y7(A){try{return U0("sqlite-vec").load(A),!0}catch{return!1}}function S(){return t0()}function D(A){let{path:_,create:G=!0,applySchema:$=!0,walMode:K=!0,cacheSize:Z=-64000,busyTimeout:Y=5000}=A,J=_!==":memory:",H=J&&x7(_),Q=A.quickCheck??(J&&H);if(J)try{P7(A4(_),{recursive:!0})}catch(B){let W=L(B);throw new F(j.DB_CONNECTION_FAILED,`Failed to create database directory: ${W}`,{path:A4(_)})}let X;try{X=new D7(_,{create:G})}catch(B){let W=L(B),N=B.code;throw new F(j.DB_CONNECTION_FAILED,`Failed to connect to database: ${W}`,{path:_,...N?{errno:N}:{}})}let V=(B)=>{X.close();let W=L(B);if(W.includes("not a database")||W.includes("SQLITE_NOTADB"))throw new F(j.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:_});throw new F(j.DB_CONNECTION_FAILED,`Failed to initialize database: ${W}`,{path:_})};try{X.exec("PRAGMA foreign_keys = ON;");let B=!1;if(K&&J){X.exec("PRAGMA journal_mode = WAL;");let z=X.query("PRAGMA journal_mode;").get();if(B=z.journal_mode==="wal",!B)console.warn(`Warning: WAL mode not enabled. Current mode: ${z.journal_mode}`)}X.exec(`PRAGMA busy_timeout = ${Y};`),X.exec("PRAGMA synchronous = NORMAL;"),X.exec(`PRAGMA cache_size = ${Z};`),X.exec("PRAGMA temp_store = MEMORY;");let W=AG(X);if(!W){let z=X.query("SELECT sqlite_version() as version").get();throw X.close(),new F(j.DB_CONNECTION_FAILED,"FTS5 is not available. memory requires FTS5 for full-text search.",{sqliteVersion:z?.version??"unknown"})}if(Q){let z=X.query("PRAGMA quick_check(1);").get();if(z?.quick_check!=="ok")throw X.close(),new F(j.DB_CORRUPTED,"Database integrity check failed",{path:_,checkResult:z?.quick_check??"unknown"})}let N=y7(X);if($)V$(X,{sqliteVecAvailable:N});return{db:X,walEnabled:B,fts5Available:W,sqliteVecAvailable:N}}catch(B){if(B instanceof F)throw B;throw V(B)}}function E(A){try{A.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{A.exec("PRAGMA journal_mode = DELETE;")}catch{}A.close()}function _4(A){A.exec("PRAGMA wal_checkpoint(PASSIVE);")}function N$(A){return A.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}function G4(A){try{return D(A)}catch(_){if(_ instanceof F)throw _;let G=L(_),$=_.code;throw new F(j.DB_CONNECTION_FAILED,`Database initialization failed: ${G}`,{path:A.path,...$?{errno:$}:{}})}}var S5=U(()=>{O5();z$();c()});var $4={};k($4,{SqliteSessionRepository:()=>m});class m{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`
685
685
  SELECT id, project_path_encoded, project_path_decoded, project_name,
686
686
  start_time, end_time, message_count, summary
687
687
  FROM sessions
@@ -873,7 +873,7 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
873
873
  LIMIT ?
874
874
  `).all(A,_)}getStoredEmbeddingDimensions(){let A=this.db.prepare("SELECT COUNT(*) as count FROM message_embeddings").get();if(!A||A.count===0)return null;let _=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!_||!_.embedding)return null;return _.embedding.byteLength/4}recreateVecTable(A){this.db.exec("DROP TABLE IF EXISTS message_embeddings"),this.db.exec(`CREATE VIRTUAL TABLE message_embeddings USING vec0(
875
875
  embedding float[${A}]
876
- )`),this.db.exec("DELETE FROM embedding_state")}}class L1{db;constructor(A){this.db=A}async findByPath(A){let _=this.db.prepare("SELECT * FROM memory_files WHERE file_path = ?").get(A);return _?this.toEntity(_):null}async findByType(A){return this.db.prepare("SELECT * FROM memory_files WHERE file_type = ? ORDER BY last_indexed_at DESC").all(A).map((G)=>this.toEntity(G))}async findByProject(A){return this.db.prepare("SELECT * FROM memory_files WHERE project_encoded = ? ORDER BY file_path").all(A).map((G)=>this.toEntity(G))}async save(A){this.db.prepare(H4).run(A.filePath,A.fileType,A.projectEncoded??null,A.content,A.contentHash,A.lastIndexedAt.toISOString())}async saveMany(A){let _=this.db.prepare(H4);this.db.transaction(()=>{for(let $ of A)_.run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())})()}async searchContent(A,_=20){let G=R0(A);if(!G)return[];return this.db.prepare(`
876
+ )`),this.db.exec("DELETE FROM embedding_state")}}class L${db;constructor(A){this.db=A}async findByPath(A){let _=this.db.prepare("SELECT * FROM memory_files WHERE file_path = ?").get(A);return _?this.toEntity(_):null}async findByType(A){return this.db.prepare("SELECT * FROM memory_files WHERE file_type = ? ORDER BY last_indexed_at DESC").all(A).map((G)=>this.toEntity(G))}async findByProject(A){return this.db.prepare("SELECT * FROM memory_files WHERE project_encoded = ? ORDER BY file_path").all(A).map((G)=>this.toEntity(G))}async save(A){this.db.prepare(H4).run(A.filePath,A.fileType,A.projectEncoded??null,A.content,A.contentHash,A.lastIndexedAt.toISOString())}async saveMany(A){let _=this.db.prepare(H4);this.db.transaction(()=>{for(let $ of A)_.run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())})()}async searchContent(A,_=20){let G=R0(A);if(!G)return[];return this.db.prepare(`
877
877
  SELECT m.* FROM memory_files m
878
878
  JOIN memory_files_fts f ON f.rowid = m.id
879
879
  WHERE memory_files_fts MATCH ?
@@ -963,12 +963,12 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
963
963
  WHERE facts_fts MATCH ?
964
964
  ORDER BY f.observed_at DESC
965
965
  LIMIT ?
966
- `).all(A,_).map(($)=>this.toEntity($))}async superseded(A,_,G){this.db.prepare("UPDATE facts SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now') WHERE uuid = ?").run(_.toISOString(),G,A)}async supersede(A,_,G){await this.superseded(A,_,G)}async findAll(){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC").all().map((_)=>this.toEntity(_))}async clearAll(){this.db.exec("DELETE FROM facts;")}toEntity(A){return YA.create({id:A.id,uuid:A.uuid,type:A.type,project:A.project,content:A.content,metadata:A.metadata?JSON.parse(A.metadata):void 0,observedAt:new Date(A.observed_at),supersededAt:A.superseded_at?new Date(A.superseded_at):null,supersededBy:A.superseded_by??null})}}var P0=U(()=>{_G()});class M1{db;constructor(A){this.db=A}async findById(A){let _=this.db.prepare("SELECT * FROM extraction_log WHERE session_id = ?").get(A);if(!_)return null;return this.toEntry(_)}async save(A){this.db.prepare(`
966
+ `).all(A,_).map(($)=>this.toEntity($))}async superseded(A,_,G){this.db.prepare("UPDATE facts SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now') WHERE uuid = ?").run(_.toISOString(),G,A)}async supersede(A,_,G){await this.superseded(A,_,G)}async findAll(){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC").all().map((_)=>this.toEntity(_))}async clearAll(){this.db.exec("DELETE FROM facts;")}toEntity(A){return YA.create({id:A.id,uuid:A.uuid,type:A.type,project:A.project,content:A.content,metadata:A.metadata?JSON.parse(A.metadata):void 0,observedAt:new Date(A.observed_at),supersededAt:A.superseded_at?new Date(A.superseded_at):null,supersededBy:A.superseded_by??null})}}var P0=U(()=>{_G()});class M${db;constructor(A){this.db=A}async findById(A){let _=this.db.prepare("SELECT * FROM extraction_log WHERE session_id = ?").get(A);if(!_)return null;return this.toEntry(_)}async save(A){this.db.prepare(`
967
967
  INSERT OR REPLACE INTO extraction_log (
968
968
  session_id, mode, facts_added, facts_updated, facts_superseded,
969
969
  facts_skipped, provider, model, tokens_consumed, extracted_at
970
970
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
971
- `).run(A.sessionId,A.mode,A.factsAdded,A.factsUpdated,A.factsSuperseded,A.factsSkipped,A.provider,A.model,A.tokensConsumed,A.extractedAt.toISOString())}async findAll(){return this.db.prepare("SELECT * FROM extraction_log ORDER BY extracted_at DESC").all().map((_)=>this.toEntry(_))}async clearAll(){this.db.exec("DELETE FROM extraction_log;")}toEntry(A){return{sessionId:A.session_id,mode:A.mode,factsAdded:A.facts_added,factsUpdated:A.facts_updated,factsSuperseded:A.facts_superseded,factsSkipped:A.facts_skipped,provider:A.provider,model:A.model,tokensConsumed:A.tokens_consumed,extractedAt:new Date(A.extracted_at)}}}var L4={};k(L4,{governanceEntryFromFactEvent:()=>T1,SqliteMemoryGovernanceRepository:()=>s});class s{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
971
+ `).run(A.sessionId,A.mode,A.factsAdded,A.factsUpdated,A.factsSuperseded,A.factsSkipped,A.provider,A.model,A.tokensConsumed,A.extractedAt.toISOString())}async findAll(){return this.db.prepare("SELECT * FROM extraction_log ORDER BY extracted_at DESC").all().map((_)=>this.toEntry(_))}async clearAll(){this.db.exec("DELETE FROM extraction_log;")}toEntry(A){return{sessionId:A.session_id,mode:A.mode,factsAdded:A.facts_added,factsUpdated:A.facts_updated,factsSuperseded:A.facts_superseded,factsSkipped:A.facts_skipped,provider:A.provider,model:A.model,tokensConsumed:A.tokens_consumed,extractedAt:new Date(A.extracted_at)}}}var L4={};k(L4,{governanceEntryFromFactEvent:()=>T$,SqliteMemoryGovernanceRepository:()=>s});class s{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
972
972
  INSERT INTO memory_governance (
973
973
  surface, target_id, project, visibility, source_event_ids,
974
974
  transformation_method, actor, confidence, redaction_state,
@@ -992,12 +992,12 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
992
992
  reviewed_at = excluded.reviewed_at,
993
993
  expires_at = excluded.expires_at,
994
994
  last_event_id = excluded.last_event_id
995
- `).run(...this.toSqlParams(A)),G=await this.findByTarget(A.surface,A.targetId);if(G)return G;return A.withId(Number(_.lastInsertRowid))}async findByTarget(A,_){let G=this.db.prepare("SELECT * FROM memory_governance WHERE surface = ? AND target_id = ?").get(A,_);return G?this.toEntity(G):null}async findByTargetIds(A,_){if(_.length===0)return[];let G=_.map(()=>"?").join(", ");return this.db.prepare(`SELECT * FROM memory_governance WHERE surface = ? AND target_id IN (${G})`).all(A,..._).map((K)=>this.toEntity(K))}async findAll(A={}){let _=[],G=[];if(A.surface)_.push("surface = ?"),G.push(A.surface);if(A.targetId)_.push("target_id = ?"),G.push(A.targetId);if(A.project)_.push("project = ?"),G.push(A.project);if(A.status)_.push("status = ?"),G.push(A.status);let $=_.length>0?`WHERE ${_.join(" AND ")}`:"",K=A.limit??100;return G.push(K),this.db.prepare(`SELECT * FROM memory_governance ${$} ORDER BY updated_at DESC LIMIT ?`).all(...G).map((Y)=>this.toEntity(Y))}async applyMemoryEvent(A){let _=q1(A.payload.governance);if(!_)return null;let G=G5(y0(_.control,"register")),$=A_(y0(_.surface,"fact")),K=y0(_.targetId??_.target_id,"");if(!K.trim())throw Error("Governance event targetId is required");if(this.recordGovernanceEvent(A,G,$,K,_),G==="register")return this.save(W4(A,_,$,K));let J=(await this.findByTarget($,K)??W4(A,_,$,K)).withControl({control:G,actor:y0(_.actor,A.provenance.actor),reason:U1(_.reason),occurredAt:A.occurredAt,expiresAt:ZG(_.expiresAt??_.expires_at),consentStatus:N4(_.consentStatus??_.consent_status),consentScopes:y5(_.consentScopes??_.consent_scopes),lastEventId:A.eventId});return this.save(J)}async clearAll(){this.db.exec("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")}toSqlParams(A){return[A.surface,A.targetId,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),A.transformationMethod,A.actor,A.confidence,A.redactionState,A.consentStatus,JSON.stringify(A.consentScopes),JSON.stringify(A.scope),A.status,A.statusReason??null,A.createdAt.toISOString(),A.updatedAt.toISOString(),A.reviewedAt?.toISOString()??null,A.expiresAt?.toISOString()??null,A.lastEventId??null]}toEntity(A){return GA.create({id:A.id,surface:A.surface,targetId:A.target_id,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),transformationMethod:A.transformation_method,actor:A.actor,confidence:A.confidence,redactionState:A.redaction_state,consentStatus:A.consent_status,consentScopes:JSON.parse(A.consent_scopes),scope:JSON.parse(A.scope),status:A.status,statusReason:A.status_reason??void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at),reviewedAt:A.reviewed_at?new Date(A.reviewed_at):null,expiresAt:A.expires_at?new Date(A.expires_at):null,lastEventId:A.last_event_id??void 0})}recordGovernanceEvent(A,_,G,$,K){this.db.prepare(`
995
+ `).run(...this.toSqlParams(A)),G=await this.findByTarget(A.surface,A.targetId);if(G)return G;return A.withId(Number(_.lastInsertRowid))}async findByTarget(A,_){let G=this.db.prepare("SELECT * FROM memory_governance WHERE surface = ? AND target_id = ?").get(A,_);return G?this.toEntity(G):null}async findByTargetIds(A,_){if(_.length===0)return[];let G=_.map(()=>"?").join(", ");return this.db.prepare(`SELECT * FROM memory_governance WHERE surface = ? AND target_id IN (${G})`).all(A,..._).map((K)=>this.toEntity(K))}async findAll(A={}){let _=[],G=[];if(A.surface)_.push("surface = ?"),G.push(A.surface);if(A.targetId)_.push("target_id = ?"),G.push(A.targetId);if(A.project)_.push("project = ?"),G.push(A.project);if(A.status)_.push("status = ?"),G.push(A.status);let $=_.length>0?`WHERE ${_.join(" AND ")}`:"",K=A.limit??100;return G.push(K),this.db.prepare(`SELECT * FROM memory_governance ${$} ORDER BY updated_at DESC LIMIT ?`).all(...G).map((Y)=>this.toEntity(Y))}async applyMemoryEvent(A){let _=q$(A.payload.governance);if(!_)return null;let G=G5(y0(_.control,"register")),$=A_(y0(_.surface,"fact")),K=y0(_.targetId??_.target_id,"");if(!K.trim())throw Error("Governance event targetId is required");if(this.recordGovernanceEvent(A,G,$,K,_),G==="register")return this.save(W4(A,_,$,K));let J=(await this.findByTarget($,K)??W4(A,_,$,K)).withControl({control:G,actor:y0(_.actor,A.provenance.actor),reason:U$(_.reason),occurredAt:A.occurredAt,expiresAt:ZG(_.expiresAt??_.expires_at),consentStatus:N4(_.consentStatus??_.consent_status),consentScopes:y5(_.consentScopes??_.consent_scopes),lastEventId:A.eventId});return this.save(J)}async clearAll(){this.db.exec("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")}toSqlParams(A){return[A.surface,A.targetId,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),A.transformationMethod,A.actor,A.confidence,A.redactionState,A.consentStatus,JSON.stringify(A.consentScopes),JSON.stringify(A.scope),A.status,A.statusReason??null,A.createdAt.toISOString(),A.updatedAt.toISOString(),A.reviewedAt?.toISOString()??null,A.expiresAt?.toISOString()??null,A.lastEventId??null]}toEntity(A){return GA.create({id:A.id,surface:A.surface,targetId:A.target_id,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),transformationMethod:A.transformation_method,actor:A.actor,confidence:A.confidence,redactionState:A.redaction_state,consentStatus:A.consent_status,consentScopes:JSON.parse(A.consent_scopes),scope:JSON.parse(A.scope),status:A.status,statusReason:A.status_reason??void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at),reviewedAt:A.reviewed_at?new Date(A.reviewed_at):null,expiresAt:A.expires_at?new Date(A.expires_at):null,lastEventId:A.last_event_id??void 0})}recordGovernanceEvent(A,_,G,$,K){this.db.prepare(`
996
996
  INSERT INTO memory_governance_events (
997
997
  event_id, kind, control, surface, target_id, actor, reason, occurred_at, payload
998
998
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
999
999
  ON CONFLICT(event_id) DO NOTHING
1000
- `).run(A.eventId,A.kind,_,G,$,y0(K.actor,A.provenance.actor),U1(K.reason)??null,A.occurredAt.toISOString(),JSON.stringify(A.payload))}}function T1(A,_,G){return GA.create({surface:"fact",targetId:_,project:G,visibility:A.scope.visibility,sourceEventIds:A.provenance.sourceIds&&A.provenance.sourceIds.length>0?A.provenance.sourceIds:[A.eventId],transformationMethod:A.provenance.method,actor:A.provenance.actor,confidence:h7(A.payload.fact),redactionState:A.privacy.redactionState,consentStatus:A.consent.status,consentScopes:A.consent.scopes,scope:A.scope,status:"active",createdAt:A.observedAt,updatedAt:A.observedAt,expiresAt:ZG(A.consent.expiresAt),lastEventId:A.eventId})}function W4(A,_,G,$){let K=U1(_.project)??A.scope.project,Z=v7(_.visibility)??A.scope.visibility,Y=q1(_.scope),J={surface:G,targetId:$,project:K,visibility:Z,sourceEventIds:y5(_.sourceEventIds??_.source_event_ids)??A.provenance.sourceIds??[A.eventId],transformationMethod:y0(_.transformationMethod??_.transformation_method,A.provenance.method),actor:y0(_.actor,A.provenance.actor),confidence:z4(_.confidence)??1,redactionState:w7(_.redactionState??_.redaction_state)??A.privacy.redactionState,consentStatus:N4(_.consentStatus??_.consent_status)??A.consent.status,consentScopes:y5(_.consentScopes??_.consent_scopes)??A.consent.scopes,scope:Y??A.scope,status:C7(_.status)??"active",statusReason:U1(_.reason??_.statusReason??_.status_reason),createdAt:ZG(_.createdAt??_.created_at)??A.observedAt,updatedAt:A.observedAt,reviewedAt:ZG(_.reviewedAt??_.reviewed_at)??null,expiresAt:ZG(_.expiresAt??_.expires_at??A.consent.expiresAt)??null,lastEventId:A.eventId};return GA.create(J)}function h7(A){let _=q1(A),G=q1(_?.metadata);return z4(G?.confidence)??1}function q1(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)?A:void 0}function y0(A,_){return typeof A==="string"&&A.trim()?A:_}function U1(A){return typeof A==="string"&&A.trim()?A:void 0}function y5(A){if(!Array.isArray(A))return;return A.map((_)=>String(_))}function z4(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function ZG(A){if(A===null)return null;if(A===void 0)return;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?void 0:_}function v7(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function w7(A){return A==="none"||A==="redacted"||A==="quarantined"?A:void 0}function N4(A){return A==="not_required"||A==="granted"||A==="denied"||A==="revoked"?A:void 0}function C7(A){return A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired"?A:void 0}var k0=U(()=>{D0()});var M4={};k(M4,{SqlitePersonaRepository:()=>SA});class SA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1000
+ `).run(A.eventId,A.kind,_,G,$,y0(K.actor,A.provenance.actor),U$(K.reason)??null,A.occurredAt.toISOString(),JSON.stringify(A.payload))}}function T$(A,_,G){return GA.create({surface:"fact",targetId:_,project:G,visibility:A.scope.visibility,sourceEventIds:A.provenance.sourceIds&&A.provenance.sourceIds.length>0?A.provenance.sourceIds:[A.eventId],transformationMethod:A.provenance.method,actor:A.provenance.actor,confidence:h7(A.payload.fact),redactionState:A.privacy.redactionState,consentStatus:A.consent.status,consentScopes:A.consent.scopes,scope:A.scope,status:"active",createdAt:A.observedAt,updatedAt:A.observedAt,expiresAt:ZG(A.consent.expiresAt),lastEventId:A.eventId})}function W4(A,_,G,$){let K=U$(_.project)??A.scope.project,Z=v7(_.visibility)??A.scope.visibility,Y=q$(_.scope),J={surface:G,targetId:$,project:K,visibility:Z,sourceEventIds:y5(_.sourceEventIds??_.source_event_ids)??A.provenance.sourceIds??[A.eventId],transformationMethod:y0(_.transformationMethod??_.transformation_method,A.provenance.method),actor:y0(_.actor,A.provenance.actor),confidence:z4(_.confidence)??1,redactionState:w7(_.redactionState??_.redaction_state)??A.privacy.redactionState,consentStatus:N4(_.consentStatus??_.consent_status)??A.consent.status,consentScopes:y5(_.consentScopes??_.consent_scopes)??A.consent.scopes,scope:Y??A.scope,status:C7(_.status)??"active",statusReason:U$(_.reason??_.statusReason??_.status_reason),createdAt:ZG(_.createdAt??_.created_at)??A.observedAt,updatedAt:A.observedAt,reviewedAt:ZG(_.reviewedAt??_.reviewed_at)??null,expiresAt:ZG(_.expiresAt??_.expires_at??A.consent.expiresAt)??null,lastEventId:A.eventId};return GA.create(J)}function h7(A){let _=q$(A),G=q$(_?.metadata);return z4(G?.confidence)??1}function q$(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)?A:void 0}function y0(A,_){return typeof A==="string"&&A.trim()?A:_}function U$(A){return typeof A==="string"&&A.trim()?A:void 0}function y5(A){if(!Array.isArray(A))return;return A.map((_)=>String(_))}function z4(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function ZG(A){if(A===null)return null;if(A===void 0)return;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?void 0:_}function v7(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function w7(A){return A==="none"||A==="redacted"||A==="quarantined"?A:void 0}function N4(A){return A==="not_required"||A==="granted"||A==="denied"||A==="revoked"?A:void 0}function C7(A){return A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired"?A:void 0}var k0=U(()=>{D0()});var M4={};k(M4,{SqlitePersonaRepository:()=>SA});class SA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1001
1001
  INSERT INTO persona_entries (
1002
1002
  entry_id, kind, content, project, visibility, source_event_ids,
1003
1003
  source_kinds, confidence, scope, review_status, review_after,
@@ -1092,7 +1092,7 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1092
1092
  WHERE ${Z.join(" AND ")}
1093
1093
  ORDER BY confidence DESC, updated_at DESC, edge_id ASC
1094
1094
  LIMIT ?
1095
- `).all(...Y).map((H)=>this.toEntity(H))}async pruneStale(A){return this.db.prepare("DELETE FROM graph_edges WHERE valid_to IS NOT NULL AND valid_to < ?").run(A.toISOString()).changes}async deleteByProject(A){this.db.prepare("DELETE FROM graph_edges WHERE project = ?").run(A)}async clearAll(){this.db.prepare("DELETE FROM graph_edges").run()}toSqlParams(A){let{source:_,target:G}=A;return[A.edgeId,_.type,_.id,_.label,G.type,G.id,G.label,A.relationship,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),JSON.stringify(A.sourceKinds),A.confidence,A.validFrom.toISOString(),A.validTo?.toISOString()??null,A.why,A.metadata?JSON.stringify(A.metadata):null,A.createdAt.toISOString(),A.updatedAt.toISOString()]}toEntity(A){return Y0.create({id:A.id,edgeId:A.edge_id,source:this.nodeFromRow(A.source_type,A.source_id,A.source_label),target:this.nodeFromRow(A.target_type,A.target_id,A.target_label),relationship:A.relationship,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),sourceKinds:JSON.parse(A.source_kinds),confidence:A.confidence,validFrom:new Date(A.valid_from),validTo:A.valid_to?new Date(A.valid_to):null,why:A.why,metadata:A.metadata?JSON.parse(A.metadata):void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at)})}nodeFromRow(A,_,G){return{type:A,id:_,label:G}}}var YG=U(()=>{K1()});var U4={};k(U4,{SqliteMemoryUtilityRepository:()=>h0});class h0{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1095
+ `).all(...Y).map((H)=>this.toEntity(H))}async pruneStale(A){return this.db.prepare("DELETE FROM graph_edges WHERE valid_to IS NOT NULL AND valid_to < ?").run(A.toISOString()).changes}async deleteByProject(A){this.db.prepare("DELETE FROM graph_edges WHERE project = ?").run(A)}async clearAll(){this.db.prepare("DELETE FROM graph_edges").run()}toSqlParams(A){let{source:_,target:G}=A;return[A.edgeId,_.type,_.id,_.label,G.type,G.id,G.label,A.relationship,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),JSON.stringify(A.sourceKinds),A.confidence,A.validFrom.toISOString(),A.validTo?.toISOString()??null,A.why,A.metadata?JSON.stringify(A.metadata):null,A.createdAt.toISOString(),A.updatedAt.toISOString()]}toEntity(A){return Y0.create({id:A.id,edgeId:A.edge_id,source:this.nodeFromRow(A.source_type,A.source_id,A.source_label),target:this.nodeFromRow(A.target_type,A.target_id,A.target_label),relationship:A.relationship,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),sourceKinds:JSON.parse(A.source_kinds),confidence:A.confidence,validFrom:new Date(A.valid_from),validTo:A.valid_to?new Date(A.valid_to):null,why:A.why,metadata:A.metadata?JSON.parse(A.metadata):void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at)})}nodeFromRow(A,_,G){return{type:A,id:_,label:G}}}var YG=U(()=>{K$()});var U4={};k(U4,{SqliteMemoryUtilityRepository:()=>h0});class h0{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1096
1096
  INSERT INTO memory_utility_metrics (
1097
1097
  surface, target_id, project, access_count, last_accessed_at,
1098
1098
  last_ranked_at, utility_score, importance_score, evergreen, pinned,
@@ -1110,7 +1110,7 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1110
1110
  half_life_days = excluded.half_life_days,
1111
1111
  metadata = excluded.metadata,
1112
1112
  updated_at = excluded.updated_at
1113
- `).run(...this.toSqlParams(A));return await this.findByTarget(A.surface,A.targetId)??A.withId(Number(_.lastInsertRowid))}async findByTarget(A,_){let G=this.db.prepare("SELECT * FROM memory_utility_metrics WHERE surface = ? AND target_id = ?").get(A,_);return G?this.toEntity(G):null}async findByTargetIds(A,_){if(_.length===0)return[];let G=_.map(()=>"?").join(", ");return this.db.prepare(`SELECT * FROM memory_utility_metrics WHERE surface = ? AND target_id IN (${G}) ORDER BY target_id ASC`).all(A,..._).map((K)=>this.toEntity(K))}async recordAccess(A,_,G){let $=await this.findByTarget(A,_);if($)return this.save($.recordAccess(G));return this.save(uA.create({surface:A,targetId:_,accessCount:1,lastAccessedAt:G,lastRankedAt:null,utilityScore:0.5,importanceScore:0.5,evergreen:!1,pinned:!1,createdAt:G,updatedAt:G}))}async deleteByProject(A){this.db.prepare("DELETE FROM memory_utility_metrics WHERE project = ?").run(A)}async clearAll(){this.db.prepare("DELETE FROM memory_utility_metrics").run()}toSqlParams(A){return[A.surface,A.targetId,A.project??null,A.accessCount,A.lastAccessedAt?.toISOString()??null,A.lastRankedAt?.toISOString()??null,A.utilityScore,A.importanceScore,A.evergreen?1:0,A.pinned?1:0,A.halfLifeDays,A.metadata?JSON.stringify(A.metadata):null,A.createdAt.toISOString(),A.updatedAt.toISOString()]}toEntity(A){return uA.create({id:A.id,surface:A.surface,targetId:A.target_id,project:A.project??void 0,accessCount:A.access_count,lastAccessedAt:A.last_accessed_at?new Date(A.last_accessed_at):null,lastRankedAt:A.last_ranked_at?new Date(A.last_ranked_at):null,utilityScore:A.utility_score,importanceScore:A.importance_score,evergreen:A.evergreen===1,pinned:A.pinned===1,halfLifeDays:A.half_life_days,metadata:A.metadata?JSON.parse(A.metadata):void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at)})}}var I1=U(()=>{R5()});var k5=U(()=>{mA();Y_();Z4();E5();Y4();D5();x5();$G();P5();P0();k0();H_();YG();I1()});class Q_{db;constructor(A){this.db=A}async search(A,_){let G=_?.limit??20,$=R0(A.value);if(!$)return[];let{sql:K,params:Z}=this.buildSearchQuery($,G,_),J=this.db.prepare(K).all(...Z);if(J.length===0)return[];return this.normalizeBm25Scores(J).map((Q)=>jA.create({sessionId:Q.session_id,messageId:Q.id,snippet:Q.snippet,score:Q.normalizedScore,timestamp:new Date(Q.timestamp),role:Q.role}))}buildSearchQuery(A,_,G){let $=[A],K=["messages_fts MATCH ?"],Z=`
1113
+ `).run(...this.toSqlParams(A));return await this.findByTarget(A.surface,A.targetId)??A.withId(Number(_.lastInsertRowid))}async findByTarget(A,_){let G=this.db.prepare("SELECT * FROM memory_utility_metrics WHERE surface = ? AND target_id = ?").get(A,_);return G?this.toEntity(G):null}async findByTargetIds(A,_){if(_.length===0)return[];let G=_.map(()=>"?").join(", ");return this.db.prepare(`SELECT * FROM memory_utility_metrics WHERE surface = ? AND target_id IN (${G}) ORDER BY target_id ASC`).all(A,..._).map((K)=>this.toEntity(K))}async recordAccess(A,_,G){let $=await this.findByTarget(A,_);if($)return this.save($.recordAccess(G));return this.save(uA.create({surface:A,targetId:_,accessCount:1,lastAccessedAt:G,lastRankedAt:null,utilityScore:0.5,importanceScore:0.5,evergreen:!1,pinned:!1,createdAt:G,updatedAt:G}))}async deleteByProject(A){this.db.prepare("DELETE FROM memory_utility_metrics WHERE project = ?").run(A)}async clearAll(){this.db.prepare("DELETE FROM memory_utility_metrics").run()}toSqlParams(A){return[A.surface,A.targetId,A.project??null,A.accessCount,A.lastAccessedAt?.toISOString()??null,A.lastRankedAt?.toISOString()??null,A.utilityScore,A.importanceScore,A.evergreen?1:0,A.pinned?1:0,A.halfLifeDays,A.metadata?JSON.stringify(A.metadata):null,A.createdAt.toISOString(),A.updatedAt.toISOString()]}toEntity(A){return uA.create({id:A.id,surface:A.surface,targetId:A.target_id,project:A.project??void 0,accessCount:A.access_count,lastAccessedAt:A.last_accessed_at?new Date(A.last_accessed_at):null,lastRankedAt:A.last_ranked_at?new Date(A.last_ranked_at):null,utilityScore:A.utility_score,importanceScore:A.importance_score,evergreen:A.evergreen===1,pinned:A.pinned===1,halfLifeDays:A.half_life_days,metadata:A.metadata?JSON.parse(A.metadata):void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at)})}}var I$=U(()=>{R5()});var k5=U(()=>{mA();Y_();Z4();E5();Y4();D5();x5();$G();P5();P0();k0();H_();YG();I$()});class Q_{db;constructor(A){this.db=A}async search(A,_){let G=_?.limit??20,$=R0(A.value);if(!$)return[];let{sql:K,params:Z}=this.buildSearchQuery($,G,_),J=this.db.prepare(K).all(...Z);if(J.length===0)return[];return this.normalizeBm25Scores(J).map((Q)=>jA.create({sessionId:Q.session_id,messageId:Q.id,snippet:Q.snippet,score:Q.normalizedScore,timestamp:new Date(Q.timestamp),role:Q.role}))}buildSearchQuery(A,_,G){let $=[A],K=["messages_fts MATCH ?"],Z=`
1114
1114
  FROM messages_fts f
1115
1115
  JOIN messages_meta m ON f.rowid = m.rowid
1116
1116
  `;if(G?.projectFilter)Z+=`
@@ -1128,9 +1128,9 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1128
1128
  WHERE ${K.join(" AND ")}
1129
1129
  ORDER BY score
1130
1130
  LIMIT ?
1131
- `,params:$}}normalizeBm25Scores(A){if(A.length===0)return[];let _=A[0];if(A.length===1&&_)return[{..._,normalizedScore:1}];let G=A.map((Y)=>Y.score),$=Math.min(...G),K=Math.max(...G);if($===K)return A.map((Y)=>({...Y,normalizedScore:1}));let Z=K-$;return A.map((Y)=>({...Y,normalizedScore:(K-Y.score)/Z}))}}var T4=()=>{};class X_{db;fts5Service;embeddingRepo;providerFactory;config;sqliteVecAvailable;lastSearchMeta=null;constructor(A){this.db=A.db,this.fts5Service=A.fts5Service,this.embeddingRepo=A.embeddingRepo,this.providerFactory=A.providerFactory,this.config=A.config,this.sqliteVecAvailable=A.sqliteVecAvailable}getLastSearchMeta(){return this.lastSearchMeta}async search(A,_){let G=performance.now(),$=this.embeddingRepo.getEmbeddedCount(),K=this.embeddingRepo.getTotalMessageCount(),Z=K>0?$/K:0,Y=this.sqliteVecAvailable&&$>0,J={fts:!0,vector:Y,hybrid:Y},H=this.resolveMode(_?.mode,$),Q=!1,X,V;try{switch(H.effectiveMode){case"fts":V=await this.ftsSearch(A,_);break;case"vector":V=await this.vectorSearch(A,_);break;case"hybrid":{let q=await this.hybridSearch(A,_);if(V=q.results,q.degraded)Q=!0,X=q.degradationReason}break}}catch(q){if(H.effectiveMode!=="vector"&&!(q instanceof F))V=await this.ftsSearch(A,_),Q=!0,X="provider_failure";else throw q}V=this.applyDecayToResults(V,_);let B=H.degraded||Q,W=X??(H.degraded?H.reason:void 0),N=B&&!H.degraded?"fts":H.effectiveMode,z=performance.now()-G;return this.lastSearchMeta={mode:N,modeReason:B?W??H.reason:H.reason,degraded:B,degradationReason:B?W:void 0,embeddingCoverage:Z,capabilities:J,timingMs:z},V}resolveMode(A,_=0){let G=this.config.search?.defaultMode??"auto",$=A??G;if($==="fts")return{effectiveMode:"fts",degraded:!1,reason:"explicit"};if($==="vector"){if(!this.sqliteVecAvailable)throw new F(j.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(_===0)throw new F(j.VECTOR_UNAVAILABLE,"No embeddings found in database",{suggestion:"Run 'memory sync --embed' to generate embeddings"});return{effectiveMode:"vector",degraded:!1,reason:"explicit"}}if($==="hybrid"){if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!0,reason:!this.sqliteVecAvailable?"sqlite_vec_unavailable":"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"explicit"}}if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!1,reason:"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"auto_hybrid"}}applyDecayToResults(A,_){if(!(this.config.search?.temporalDecay?.enabled!==!1&&!_?.noDecay)||A.length===0)return A;let $=this.config.search?.temporalDecay?.halfLifeDays??30,Z=new Date().getTime(),Y=86400000,J=A.map((H)=>{let Q=(Z-H.timestamp.getTime())/Y,X=Math.pow(0.5,Q/$),V=Math.max(0,Math.min(1,H.score*X));return{result:H,decayedScore:V}});return J.sort((H,Q)=>Q.decayedScore-H.decayedScore),J.map(({result:H,decayedScore:Q})=>jA.create({sessionId:H.sessionId,messageId:H.messageId,snippet:H.snippet,score:Q,timestamp:H.timestamp,role:H.role,source:H.source,rawScores:H.rawScores}))}async ftsSearch(A,_){return(await this.fts5Service.search(A,_)).map(($)=>jA.create({sessionId:$.sessionId,messageId:$.messageId,snippet:$.snippet,score:$.score,timestamp:$.timestamp,role:$.role,source:"fts",rawScores:{bm25:$.score}}))}async getProvider(A){try{let _=this.providerFactory.createFromConfig(this.config);if(!_){if(A)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!_.isReady())await _.initialize();return _}catch(_){if(A){if(_ instanceof F)throw _;throw new F(j.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${L(_)}`)}return null}}async embedQuery(A,_){return(await _.embed(A)).embedding}checkDimensionMismatch(A){if(this.embeddingRepo.getEmbeddedCount()===0)return null;let G=this.getStoredEmbeddingDimensions();if(G===null)return null;let $=A.dimensions;if($!==G)return`dimension_mismatch (stored: ${G}, provider: ${$})`;return null}getStoredEmbeddingDimensions(){try{let A=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!A||!A.embedding)return null;let _=A.embedding;if(_ instanceof Float32Array)return _.length;if(_ instanceof ArrayBuffer||_.byteLength!==void 0)return _.byteLength/4;return null}catch{return null}}async vectorSearch(A,_){let G=await this.getProvider(!0);if(!G)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let $=this.checkDimensionMismatch(G);if($)throw new F(j.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${$}`);let K=await this.embedQuery(A.value,G),Z=_?.limit??20,Y=Z*I4,J=this.embeddingRepo.vectorKnnSearch(K,Y);if(J.length===0)return[];let H=J.map((V)=>V.rowid),Q=this.hydrateByRowids(H),X=[];for(let V=0;V<J.length&&X.length<Z;V++){let B=J[V];if(!B)continue;let W=Q.get(B.rowid);if(!W)continue;if(!this.passesFilters(W,_))continue;let N=this.vectorSnippet(W.content),z=Math.max(0,Math.min(1,1-B.distance/2));X.push(jA.create({sessionId:W.session_id,messageId:W.id,snippet:N,score:z,timestamp:new Date(W.timestamp),role:W.role,source:"vector",rawScores:{cosine:B.distance}}))}return X}async hybridSearch(A,_){let G=_?.limit??20,$=G*I4,K={..._,limit:$},Z=await this.fts5Service.search(A,K),Y=[],J=null,H=!1,Q;try{if(J=await this.getProvider(!1),J){let M=this.checkDimensionMismatch(J);if(M)J=null,H=!0,Q=M;else{let O=await this.embedQuery(A.value,J);Y=this.embeddingRepo.vectorKnnSearch(O,$)}}else H=!0,Q="provider_unavailable"}catch(M){Y=[],H=!0,Q=`provider_failure: ${L(M)}`}if(Y.length===0&&Z.length>0)return{results:Z.map((O)=>jA.create({sessionId:O.sessionId,messageId:O.messageId,snippet:O.snippet,score:O.score,timestamp:O.timestamp,role:O.role,source:"fts",rawScores:{bm25:O.score}})).slice(0,G),degraded:H,degradationReason:Q};if(Z.length===0&&Y.length===0)return{results:[],degraded:H,degradationReason:Q};let X=this.buildFtsRowidMap(Z),V=Z.map((M,O)=>({rowid:X.get(M.messageId)??0,rank:O+1,source:"fts",rawScore:M.score})),B=Y.map((M,O)=>({rowid:M.rowid,rank:O+1,source:"vector",rawScore:M.distance})),W=e$(V,B,G);if(W.length===0)return{results:[],degraded:H,degradationReason:Q};let N=W.map((M)=>M.rowid),z=this.hydrateByRowids(N),q=new Map;for(let M of W){let O=M.sources.some((y)=>y.source==="fts"),R=M.sources.some((y)=>y.source==="vector");if(O&&R)q.set(M.rowid,"both");else if(O)q.set(M.rowid,"fts");else q.set(M.rowid,"vector")}let I=W.map((M)=>({...M,score:M.normalizedScore})),T=[];for(let M of I){let O=z.get(M.rowid);if(!O)continue;if(!this.passesFilters(O,_))continue;let R=q.get(M.rowid)??"fts",y=Z.find((sA)=>sA.messageId===O.id),HA=y?y.snippet:this.vectorSnippet(O.content),tA=Math.max(0,Math.min(1,M.score)),eA={rrf:M.rrfScore};for(let sA of M.sources){if(sA.source==="fts")eA.bm25=sA.rawScore;if(sA.source==="vector")eA.cosine=sA.rawScore}T.push(jA.create({sessionId:O.session_id,messageId:O.id,snippet:HA,score:tA,timestamp:new Date(O.timestamp),role:O.role,source:R,rawScores:eA}))}return{results:T,degraded:H,degradationReason:Q}}buildFtsRowidMap(A){if(A.length===0)return new Map;let _=A.map((K)=>K.messageId),G=_.map(()=>"?").join(","),$=this.db.prepare(`SELECT rowid, id FROM messages_meta WHERE id IN (${G})`).all(..._);return new Map($.map((K)=>[K.id,K.rowid]))}hydrateByRowids(A){if(A.length===0)return new Map;let _=A.map(()=>"?").join(","),G=this.db.prepare(`SELECT rowid, id, session_id, content, timestamp, role
1131
+ `,params:$}}normalizeBm25Scores(A){if(A.length===0)return[];let _=A[0];if(A.length===1&&_)return[{..._,normalizedScore:1}];let G=A.map((Y)=>Y.score),$=Math.min(...G),K=Math.max(...G);if($===K)return A.map((Y)=>({...Y,normalizedScore:1}));let Z=K-$;return A.map((Y)=>({...Y,normalizedScore:(K-Y.score)/Z}))}}var T4=()=>{};class X_{db;fts5Service;embeddingRepo;providerFactory;config;sqliteVecAvailable;lastSearchMeta=null;constructor(A){this.db=A.db,this.fts5Service=A.fts5Service,this.embeddingRepo=A.embeddingRepo,this.providerFactory=A.providerFactory,this.config=A.config,this.sqliteVecAvailable=A.sqliteVecAvailable}getLastSearchMeta(){return this.lastSearchMeta}async search(A,_){let G=performance.now(),$=this.embeddingRepo.getEmbeddedCount(),K=this.embeddingRepo.getTotalMessageCount(),Z=K>0?$/K:0,Y=this.sqliteVecAvailable&&$>0,J={fts:!0,vector:Y,hybrid:Y},H=this.resolveMode(_?.mode,$),Q=!1,X,V;try{switch(H.effectiveMode){case"fts":V=await this.ftsSearch(A,_);break;case"vector":V=await this.vectorSearch(A,_);break;case"hybrid":{let q=await this.hybridSearch(A,_);if(V=q.results,q.degraded)Q=!0,X=q.degradationReason}break}}catch(q){if(H.effectiveMode!=="vector"&&!(q instanceof F))V=await this.ftsSearch(A,_),Q=!0,X="provider_failure";else throw q}V=this.applyDecayToResults(V,_);let B=H.degraded||Q,W=X??(H.degraded?H.reason:void 0),N=B&&!H.degraded?"fts":H.effectiveMode,z=performance.now()-G;return this.lastSearchMeta={mode:N,modeReason:B?W??H.reason:H.reason,degraded:B,degradationReason:B?W:void 0,embeddingCoverage:Z,capabilities:J,timingMs:z},V}resolveMode(A,_=0){let G=this.config.search?.defaultMode??"auto",$=A??G;if($==="fts")return{effectiveMode:"fts",degraded:!1,reason:"explicit"};if($==="vector"){if(!this.sqliteVecAvailable)throw new F(j.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(_===0)throw new F(j.VECTOR_UNAVAILABLE,"No embeddings found in database",{suggestion:"Run 'memory sync --embed' to generate embeddings"});return{effectiveMode:"vector",degraded:!1,reason:"explicit"}}if($==="hybrid"){if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!0,reason:!this.sqliteVecAvailable?"sqlite_vec_unavailable":"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"explicit"}}if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!1,reason:"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"auto_hybrid"}}applyDecayToResults(A,_){if(!(this.config.search?.temporalDecay?.enabled!==!1&&!_?.noDecay)||A.length===0)return A;let $=this.config.search?.temporalDecay?.halfLifeDays??30,Z=new Date().getTime(),Y=86400000,J=A.map((H)=>{let Q=(Z-H.timestamp.getTime())/Y,X=Math.pow(0.5,Q/$),V=Math.max(0,Math.min(1,H.score*X));return{result:H,decayedScore:V}});return J.sort((H,Q)=>Q.decayedScore-H.decayedScore),J.map(({result:H,decayedScore:Q})=>jA.create({sessionId:H.sessionId,messageId:H.messageId,snippet:H.snippet,score:Q,timestamp:H.timestamp,role:H.role,source:H.source,rawScores:H.rawScores}))}async ftsSearch(A,_){return(await this.fts5Service.search(A,_)).map(($)=>jA.create({sessionId:$.sessionId,messageId:$.messageId,snippet:$.snippet,score:$.score,timestamp:$.timestamp,role:$.role,source:"fts",rawScores:{bm25:$.score}}))}async getProvider(A){try{let _=this.providerFactory.createFromConfig(this.config);if(!_){if(A)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!_.isReady())await _.initialize();return _}catch(_){if(A){if(_ instanceof F)throw _;throw new F(j.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${L(_)}`)}return null}}async embedQuery(A,_){return(await _.embed(A)).embedding}checkDimensionMismatch(A){if(this.embeddingRepo.getEmbeddedCount()===0)return null;let G=this.getStoredEmbeddingDimensions();if(G===null)return null;let $=A.dimensions;if($!==G)return`dimension_mismatch (stored: ${G}, provider: ${$})`;return null}getStoredEmbeddingDimensions(){try{let A=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!A||!A.embedding)return null;let _=A.embedding;if(_ instanceof Float32Array)return _.length;if(_ instanceof ArrayBuffer||_.byteLength!==void 0)return _.byteLength/4;return null}catch{return null}}async vectorSearch(A,_){let G=await this.getProvider(!0);if(!G)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let $=this.checkDimensionMismatch(G);if($)throw new F(j.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${$}`);let K=await this.embedQuery(A.value,G),Z=_?.limit??20,Y=Z*I4,J=this.embeddingRepo.vectorKnnSearch(K,Y);if(J.length===0)return[];let H=J.map((V)=>V.rowid),Q=this.hydrateByRowids(H),X=[];for(let V=0;V<J.length&&X.length<Z;V++){let B=J[V];if(!B)continue;let W=Q.get(B.rowid);if(!W)continue;if(!this.passesFilters(W,_))continue;let N=this.vectorSnippet(W.content),z=Math.max(0,Math.min(1,1-B.distance/2));X.push(jA.create({sessionId:W.session_id,messageId:W.id,snippet:N,score:z,timestamp:new Date(W.timestamp),role:W.role,source:"vector",rawScores:{cosine:B.distance}}))}return X}async hybridSearch(A,_){let G=_?.limit??20,$=G*I4,K={..._,limit:$},Z=await this.fts5Service.search(A,K),Y=[],J=null,H=!1,Q;try{if(J=await this.getProvider(!1),J){let M=this.checkDimensionMismatch(J);if(M)J=null,H=!0,Q=M;else{let O=await this.embedQuery(A.value,J);Y=this.embeddingRepo.vectorKnnSearch(O,$)}}else H=!0,Q="provider_unavailable"}catch(M){Y=[],H=!0,Q=`provider_failure: ${L(M)}`}if(Y.length===0&&Z.length>0)return{results:Z.map((O)=>jA.create({sessionId:O.sessionId,messageId:O.messageId,snippet:O.snippet,score:O.score,timestamp:O.timestamp,role:O.role,source:"fts",rawScores:{bm25:O.score}})).slice(0,G),degraded:H,degradationReason:Q};if(Z.length===0&&Y.length===0)return{results:[],degraded:H,degradationReason:Q};let X=this.buildFtsRowidMap(Z),V=Z.map((M,O)=>({rowid:X.get(M.messageId)??0,rank:O+1,source:"fts",rawScore:M.score})),B=Y.map((M,O)=>({rowid:M.rowid,rank:O+1,source:"vector",rawScore:M.distance})),W=e1(V,B,G);if(W.length===0)return{results:[],degraded:H,degradationReason:Q};let N=W.map((M)=>M.rowid),z=this.hydrateByRowids(N),q=new Map;for(let M of W){let O=M.sources.some((y)=>y.source==="fts"),R=M.sources.some((y)=>y.source==="vector");if(O&&R)q.set(M.rowid,"both");else if(O)q.set(M.rowid,"fts");else q.set(M.rowid,"vector")}let I=W.map((M)=>({...M,score:M.normalizedScore})),T=[];for(let M of I){let O=z.get(M.rowid);if(!O)continue;if(!this.passesFilters(O,_))continue;let R=q.get(M.rowid)??"fts",y=Z.find((sA)=>sA.messageId===O.id),HA=y?y.snippet:this.vectorSnippet(O.content),tA=Math.max(0,Math.min(1,M.score)),eA={rrf:M.rrfScore};for(let sA of M.sources){if(sA.source==="fts")eA.bm25=sA.rawScore;if(sA.source==="vector")eA.cosine=sA.rawScore}T.push(jA.create({sessionId:O.session_id,messageId:O.id,snippet:HA,score:tA,timestamp:new Date(O.timestamp),role:O.role,source:R,rawScores:eA}))}return{results:T,degraded:H,degradationReason:Q}}buildFtsRowidMap(A){if(A.length===0)return new Map;let _=A.map((K)=>K.messageId),G=_.map(()=>"?").join(","),$=this.db.prepare(`SELECT rowid, id FROM messages_meta WHERE id IN (${G})`).all(..._);return new Map($.map((K)=>[K.id,K.rowid]))}hydrateByRowids(A){if(A.length===0)return new Map;let _=A.map(()=>"?").join(","),G=this.db.prepare(`SELECT rowid, id, session_id, content, timestamp, role
1132
1132
  FROM messages_meta
1133
- WHERE rowid IN (${_})`).all(...A);return new Map(G.map(($)=>[$.rowid,$]))}vectorSnippet(A){if(A.length<=200)return A;return A.slice(0,200)+"..."}passesFilters(A,_){if(!_)return!0;if(_.projectFilter){let G=this.db.prepare("SELECT project_name FROM sessions WHERE id = ?").get(A.session_id);if(!G||!G.project_name.toLowerCase().includes(_.projectFilter.toLowerCase()))return!1}if(_.roleFilter){if(Array.isArray(_.roleFilter)){if(!_.roleFilter.includes(A.role))return!1}else if(A.role!==_.roleFilter)return!1}if(_.sessionFilter&&A.session_id!==_.sessionFilter)return!1;if(_.sinceDate){if(new Date(A.timestamp)<_.sinceDate)return!1}if(_.beforeDate){if(new Date(A.timestamp)>_.beforeDate)return!1}return!0}}var I4=4;var O4=U(()=>{z1()});class V0{db;constructor(A){this.db=A}async getStats(A=10){let _=this.db.prepare(`
1133
+ WHERE rowid IN (${_})`).all(...A);return new Map(G.map(($)=>[$.rowid,$]))}vectorSnippet(A){if(A.length<=200)return A;return A.slice(0,200)+"..."}passesFilters(A,_){if(!_)return!0;if(_.projectFilter){let G=this.db.prepare("SELECT project_name FROM sessions WHERE id = ?").get(A.session_id);if(!G||!G.project_name.toLowerCase().includes(_.projectFilter.toLowerCase()))return!1}if(_.roleFilter){if(Array.isArray(_.roleFilter)){if(!_.roleFilter.includes(A.role))return!1}else if(A.role!==_.roleFilter)return!1}if(_.sessionFilter&&A.session_id!==_.sessionFilter)return!1;if(_.sinceDate){if(new Date(A.timestamp)<_.sinceDate)return!1}if(_.beforeDate){if(new Date(A.timestamp)>_.beforeDate)return!1}return!0}}var I4=4;var O4=U(()=>{z$()});class V0{db;constructor(A){this.db=A}async getStats(A=10){let _=this.db.prepare(`
1134
1134
  SELECT page_size * page_count as size
1135
1135
  FROM pragma_page_count(), pragma_page_size()
1136
1136
  `).get(),G=this.db.prepare(`
@@ -1197,12 +1197,12 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1197
1197
  WHERE project_name LIKE '%' || ? || '%'
1198
1198
  GROUP BY project_name
1199
1199
  ORDER BY COUNT(*) DESC
1200
- LIMIT 1`).get(A)?.project_name??null}}var R4=U(()=>{T4();O4()});var EA,V_;var h5=U(()=>{EA={local:{model:"Xenova/all-MiniLM-L6-v2",dimensions:384},openai:{model:"text-embedding-3-small",dimensions:1536},ollama:{model:"nomic-embed-text",dimensions:768},"openai-compatible":{model:"text-embedding-3-small",dimensions:1536}},V_={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var j1={};k(j1,{saveConfig:()=>hA,resolveProviderDefaults:()=>x4,resolveEmbeddingApiKey:()=>HG,loadConfig:()=>f,getConfigPath:()=>W_,getConfigDir:()=>C0,PROVIDER_DEFAULTS:()=>D4,DEFAULT_SEARCH_CONFIG:()=>O1,DEFAULT_REMOTE_SYNC_CONFIG:()=>C5,DEFAULT_PROVIDER_EGRESS_POLICY:()=>o,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>b5,DEFAULT_EMBEDDING_CONFIG:()=>B_,DEFAULT_CONFIG:()=>JG,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>w5});import{randomUUID as v5}from"crypto";import{existsSync as F4,mkdirSync as f7,readFileSync as S4,writeFileSync as g7}from"fs";import{dirname as E4}from"path";function x4(A,_){let G=A.provider;if(G==="local"||!_)return A;let $=D4[G],K={...A};if(!("model"in _))K.model=$?.model??A.model;if(!("dimensions"in _))K.dimensions=$?.dimensions??A.dimensions;return K}function HG(A,_){let G=[A.apiKeyEnv,..._].filter((K)=>Boolean(K));for(let K of G){let Z=process.env[K];if(Z){let Y={apiKey:Z,source:"environment",envVar:K,deprecatedPlaintext:!1};if(A.apiKeyRef)Y.ref=A.apiKeyRef;return Y}}if(A.apiKey){let K={apiKey:A.apiKey,source:"plaintext-config",deprecatedPlaintext:!0};if(A.apiKeyRef)K.ref=A.apiKeyRef;return K}let $={source:"missing",deprecatedPlaintext:!1};if(A.apiKeyRef)$.ref=A.apiKeyRef;return $}function C0(A){if(A!==void 0)return E4(A);return oA()}function W_(A){if(A!==void 0)return A;return A0()}function f(A){let _=W_(A);if(!F4(_)){let G=process.env.MEMORY_TEST_MACHINE_ID??v5(),$={...JG,machineId:G};try{hA($,A)}catch{}return $}try{let G=S4(_,"utf-8"),$=JSON.parse(G),K=$.machineId,Z=!1;if(!K)K=process.env.MEMORY_TEST_MACHINE_ID??v5(),Z=!0;let Y=$.embedding,J={...B_,...Y??{}},H={...C5,...$.remoteSync??{}},Q={...o,...$.providerEgress??{},allowedHosts:Array.isArray($.providerEgress?.allowedHosts)?$.providerEgress.allowedHosts.map(String):[...o.allowedHosts],allowedProviders:Array.isArray($.providerEgress?.allowedProviders)?$.providerEgress.allowedProviders.map(String):[...o.allowedProviders]},X={...b5,...$.legacyMemoryFiles??{}},V={...JG,...$,machineId:K,remoteSync:H,providerEgress:Q,legacyMemoryFiles:X,embedding:x4(J,Y),search:{...O1,...$.search??{},temporalDecay:{...O1.temporalDecay,...$.search?.temporalDecay??{}}},ambientContext:{...w5,...$.ambientContext??{}}};if(Z)try{hA(V,A)}catch{}return V}catch{console.warn("Invalid config.json, using defaults");let G=process.env.MEMORY_TEST_MACHINE_ID??v5();return{...JG,machineId:G}}}function hA(A,_){let G=W_(_),$=E4(G);f7($,{recursive:!0});let K={};if(F4(G))try{let Y=S4(G,"utf-8");K=JSON.parse(Y)}catch{}let Z={...K,...A};g7(G,JSON.stringify(Z,null,2)+`
1201
- `)}var O1,w5,C5,o,b5,D4,B_,JG;var JA=U(()=>{c();h5();O1={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},w5={enabled:!0,budget:800},C5={enabled:!1,autoPush:!0,autoPull:!0},o={consent:"unset",allowedHosts:["api.openai.com","api.anthropic.com"],allowedProviders:["anthropic","openai","claude-cli"]},b5={enabled:!1},D4={...EA};B_={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100,maxBatchBytes:800000},JG={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:B_,search:O1,ambientContext:w5,machineId:"",remoteSync:C5,providerEgress:o,legacyMemoryFiles:b5}});var k4={};k(k4,{PatternRedactor:()=>t,PATTERN_REDACTOR_RULE_VERSION:()=>y4});import{createHash as c7}from"crypto";class t{redactText(A){let _=A,G=[];for(let $ of u7)_=_.replace($.pattern,(K)=>{let Z=$.secretValue?.(K)??K,Y=f5($.kind,Z);return G.push(Y),`${$.preservePrefix?.(K)??""}${Y.placeholder}`});return{text:_,findings:G}}redactJson(A){let _=[];return{value:this.redactUnknown(A,_,new WeakSet),findings:_}}redactUnknown(A,_,G){if(typeof A==="string"){let $=this.redactText(A);return _.push(...$.findings),$.text}if(Array.isArray(A))return A.map(($,K)=>{let Z=A[K-1];if(typeof $==="string"&&typeof Z==="string"&&d7.test(Z))return this.redactFlagAdjacentValue($,_);return this.redactUnknown($,_,G)});if(A&&typeof A==="object"){if(G.has(A))return"[REDACTED:circular]";G.add(A);let $={};for(let[K,Z]of Object.entries(A))$[K]=this.redactObjectValue(K,Z,_,G);return $}return A}redactObjectValue(A,_,G,$){if(typeof _!=="string")return this.redactUnknown(_,G,$);let K=this.redactText(_);if(K.findings.length>0)return G.push(...K.findings),K.text;if(m7.test(A)&&_.trim()!==""&&!P4.test(_)){let Z=f5(l7(A),_);return G.push(Z),Z.placeholder}return _}redactFlagAdjacentValue(A,_){if(A.trim()===""||P4.test(A))return A;let G=this.redactText(A);if(G.findings.length>0)return _.push(...G.findings),G.text;let $=f5("env_secret",A);return _.push($),$.placeholder}}function f5(A,_){let G=c7("sha256").update(_).digest("hex").slice(0,8);return{kind:A,hash:G,ruleVersion:y4,placeholder:`[REDACTED:${A}:${G}]`}}function l7(A){if(/api[-_]?key|auth[-_]?key/i.test(A))return"api_key";if(/authorization|bearer|token/i.test(A))return"bearer_token";return"env_secret"}var y4="pattern-redactor-v2",u7,m7,d7,P4;var pA=U(()=>{u7=[{kind:"private_key",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{kind:"env_secret",pattern:/\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASS|CREDENTIAL)[A-Z0-9_]*)\s*=\s*(?:"[^"]+"|'[^']+'|[^\s]+)/g,preservePrefix:(A)=>`${A.split("=")[0].trim()}=`,secretValue:(A)=>A.slice(A.indexOf("=")+1).trim().replace(/^['"]|['"]$/g,"")},{kind:"api_key",pattern:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g},{kind:"api_key",pattern:/\btskey-(?:auth|client)-[A-Za-z0-9_-]{20,}\b/g},{kind:"aws_access_key",pattern:/\b(A3T[A-Z0-9]|AKIA|ASIA)[A-Z0-9]{16}\b/g},{kind:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{kind:"bearer_token",pattern:/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}/g,preservePrefix:()=>"Bearer ",secretValue:(A)=>A.replace(/^Bearer\s+/i,"")}],m7=/(?:api[-_]?key|auth[-_]?key|authorization|bearer|token|secret|password|passwd|pwd|credential)/i,d7=/^--?(?:api[-_]?key|auth[-_]?key|token|secret|password|passwd|pwd|credential)$/i,P4=/^\[REDACTED:[a-z_]+(?::[a-f0-9]{8})?\]$/});import{appendFileSync as TL,existsSync as p7,mkdirSync as IL,readFileSync as n7,renameSync as OL,statSync as jL}from"fs";import{dirname as i7,join as a7}from"path";function z_(A){if(A!==void 0)return i7(A);return QA()}function h4(A){if(A!==void 0)return A;return a7(QA(),"sync.log")}function N_(A=100,_){let G=h4(_);if(!p7(G))return[];try{let K=n7(G,"utf-8").split(`
1202
- `).filter((Y)=>Y.trim()!==""),Z=[];for(let Y of K)try{let J=JSON.parse(Y);Z.push(J)}catch{continue}return Z.slice(-A)}catch{return[]}}var EL;var R1=U(()=>{c();pA();EL=new t});var g5=U(()=>{c();d$();D5();Y_()});var w4=U(()=>{JA();R1();g5()});var C4=U(()=>{R1()});var L_=U(()=>{JA();R1();g5();w4();C4();C$()});class c5{name="transformers-js";model;dimensions;_pipeline=null;constructor(A){this.model=A?.model??"Xenova/all-MiniLM-L6-v2",this.dimensions=A?.dimensions??384}async initialize(A){if(this._pipeline)return;let{pipeline:_,env:G}=await import("@huggingface/transformers");G.allowLocalModels=!1;let $={dtype:"q8"};if(A)$.progress_callback=(K)=>{A({status:K.status==="ready"?"ready":"downloading",file:K.file??"",loaded:K.loaded??0,total:K.total??0})};try{this._pipeline=await _("feature-extraction",this.model,$)}catch(K){if(console.warn(`Native ONNX runtime failed: ${L(K)}`),console.warn("Falling back to WASM backend (slower but universal)"),G.backends?.onnx?.wasm)G.backends.onnx.wasm.numThreads=1;try{this._pipeline=await _("feature-extraction",this.model,{dtype:"q8",device:"wasm"})}catch(Z){throw Error(`Embedding initialization failed. Native: ${L(K)}. WASM: ${L(Z)}`)}}}async embed(A){if(!this._pipeline)throw Error("Provider not initialized. Call initialize() before embed().");let _=await this._pipeline(A,{pooling:"mean",normalize:!0}),G=new Float32Array(_.tolist()[0]);return kA.create({embedding:G,model:this.model,dimensions:this.dimensions})}async embedBatch(A){let _=[];for(let G of A)_.push(await this.embed(G));return _}isReady(){return this._pipeline!==null}async dispose(){this._pipeline=null}}var b4=()=>{};class F1{name;model;dimensions;apiKey;baseUrl;_ready=!1;constructor(A){this.apiKey=A.apiKey,this.name=A.providerId??"openai",this.model=A.model??"text-embedding-3-small",this.dimensions=A.dimensions??1536,this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async initialize(A){this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let Z=await _.text();throw Error(`OpenAI API error ${_.status}: ${Z}`)}let $=(await _.json()).data?.[0];if(!$)throw Error("OpenAI returned empty embeddings response");let K=new Float32Array($.embedding);return kA.create({embedding:K,model:this.model,dimensions:this.dimensions})}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let K=await _.text();throw Error(`OpenAI API error ${_.status}: ${K}`)}return[...(await _.json()).data].sort((K,Z)=>K.index-Z.index).map((K)=>kA.create({embedding:new Float32Array(K.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var f4=()=>{};class u5{name="ollama";model;dimensions;baseUrl;_ready=!1;constructor(A){this.model=A?.model??"nomic-embed-text",this.dimensions=A?.dimensions??768,this.baseUrl=A?.baseUrl??"http://localhost:11434"}async initialize(A){let _;try{_=await fetch(`${this.baseUrl}/api/tags`,{method:"GET"})}catch(G){let $=L(G);throw Error(`Cannot reach Ollama server at ${this.baseUrl}. Ensure Ollama is running: ollama serve (${$})`)}if(!_.ok)throw Error(`Ollama server returned ${_.status} from ${this.baseUrl}/api/tags`);this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let[_]=await this.requestEmbeddings(A);if(!_)throw Error("Ollama returned empty embeddings response");return _}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");if(A.length===0)return[];try{return await this.requestEmbeddings(A)}catch(_){if(A.length>1&&bG(_,"payload_too_large")){let G=Math.ceil(A.length/2),$=await this.embedBatch(A.slice(0,G)),K=await this.embedBatch(A.slice(G));return[...$,...K]}throw _}}isReady(){return this._ready}async dispose(){this._ready=!1}async requestEmbeddings(A){let _=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:A})});if(!_.ok){let $=await _.text();this.throwWithHint(_.status,$,A)}return(await _.json()).embeddings.map(($)=>kA.create({embedding:new Float32Array($),model:this.model,dimensions:this.dimensions}))}throwWithHint(A,_,G){if(A===413)throw new CG({kind:"payload_too_large",status:A,retryable:!1,message:"Ollama error 413: provider payload too large",metadata:{provider:this.name,model:this.model,inputCount:Array.isArray(G)?G.length:1}});if(A===404||_.includes("not found"))throw Error(`Ollama error ${A}: ${_}. Model '${this.model}' not found. Run: ollama pull ${this.model}`);throw Error(`Ollama error ${A}: ${_}`)}}var g4=U(()=>{l$()});function B0(A){return["You are an expert developer assistant. Analyze the following conversation transcript between a user and an AI coding assistant.","Your task is to extract a structured JSON list of key facts that occurred during this conversation.","","Specifically, you should identify and classify facts into these categories:",'1. "decision": Key architectural choices, technology selections, conventions, or design decisions made.','2. "learning": Lessons learned, discoveries about tools, APIs, bugs found, environment specific issues, or workarounds.','3. "preference": User guidelines, rules, stylistic/operational preferences, or explicit constraints.','4. "friction": Pain points, slow processes, build issues, sync locks, file system access issues, command timeouts, or system bottlenecks.','5. "observation": Key metrics, observed state, runtime configurations, or general context findings.',"","For each fact, assign a confidence score between 0.0 and 1.0 based on how explicitly and clearly it was stated or agreed upon in the transcript.",'Provide optional structured "metadata" for additional context (e.g. rationale, severity, file path, system version, etc.).',"","CRITICAL: Your output MUST be a valid JSON array of objects. Do not include any explanation, markdown formatting outside of a JSON code block, or preambles. Output ONLY the JSON.","","Format:","["," {",' "type": "decision" | "learning" | "preference" | "friction" | "observation",',' "content": "Description of the fact",',' "metadata": { "key": "value" },',' "confidence": 0.95'," }","]","","Transcript:",A.map((G)=>`[${G.timestamp.toISOString()}] ${G.role.toUpperCase()}: ${G.content}`).join(`
1200
+ LIMIT 1`).get(A)?.project_name??null}}var R4=U(()=>{T4();O4()});var EA,V_;var h5=U(()=>{EA={local:{model:"Xenova/all-MiniLM-L6-v2",dimensions:384},openai:{model:"text-embedding-3-small",dimensions:1536},ollama:{model:"nomic-embed-text",dimensions:768},"openai-compatible":{model:"text-embedding-3-small",dimensions:1536}},V_={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var j$={};k(j$,{saveConfig:()=>hA,resolveProviderDefaults:()=>x4,resolveEmbeddingApiKey:()=>HG,loadConfig:()=>f,getConfigPath:()=>W_,getConfigDir:()=>C0,PROVIDER_DEFAULTS:()=>D4,DEFAULT_SEARCH_CONFIG:()=>O$,DEFAULT_REMOTE_SYNC_CONFIG:()=>C5,DEFAULT_PROVIDER_EGRESS_POLICY:()=>o,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>b5,DEFAULT_EMBEDDING_CONFIG:()=>B_,DEFAULT_CONFIG:()=>JG,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>w5});import{randomUUID as v5}from"crypto";import{existsSync as F4,mkdirSync as f7,readFileSync as S4,writeFileSync as g7}from"fs";import{dirname as E4}from"path";function x4(A,_){let G=A.provider;if(G==="local"||!_)return A;let $=D4[G],K={...A};if(!("model"in _))K.model=$?.model??A.model;if(!("dimensions"in _))K.dimensions=$?.dimensions??A.dimensions;return K}function HG(A,_){let G=[A.apiKeyEnv,..._].filter((K)=>Boolean(K));for(let K of G){let Z=process.env[K];if(Z){let Y={apiKey:Z,source:"environment",envVar:K,deprecatedPlaintext:!1};if(A.apiKeyRef)Y.ref=A.apiKeyRef;return Y}}if(A.apiKey){let K={apiKey:A.apiKey,source:"plaintext-config",deprecatedPlaintext:!0};if(A.apiKeyRef)K.ref=A.apiKeyRef;return K}let $={source:"missing",deprecatedPlaintext:!1};if(A.apiKeyRef)$.ref=A.apiKeyRef;return $}function C0(A){if(A!==void 0)return E4(A);return oA()}function W_(A){if(A!==void 0)return A;return A0()}function f(A){let _=W_(A);if(!F4(_)){let G=process.env.MEMORY_TEST_MACHINE_ID??v5(),$={...JG,machineId:G};try{hA($,A)}catch{}return $}try{let G=S4(_,"utf-8"),$=JSON.parse(G),K=$.machineId,Z=!1;if(!K)K=process.env.MEMORY_TEST_MACHINE_ID??v5(),Z=!0;let Y=$.embedding,J={...B_,...Y??{}},H={...C5,...$.remoteSync??{}},Q={...o,...$.providerEgress??{},allowedHosts:Array.isArray($.providerEgress?.allowedHosts)?$.providerEgress.allowedHosts.map(String):[...o.allowedHosts],allowedProviders:Array.isArray($.providerEgress?.allowedProviders)?$.providerEgress.allowedProviders.map(String):[...o.allowedProviders]},X={...b5,...$.legacyMemoryFiles??{}},V={...JG,...$,machineId:K,remoteSync:H,providerEgress:Q,legacyMemoryFiles:X,embedding:x4(J,Y),search:{...O$,...$.search??{},temporalDecay:{...O$.temporalDecay,...$.search?.temporalDecay??{}}},ambientContext:{...w5,...$.ambientContext??{}}};if(Z)try{hA(V,A)}catch{}return V}catch{console.warn("Invalid config.json, using defaults");let G=process.env.MEMORY_TEST_MACHINE_ID??v5();return{...JG,machineId:G}}}function hA(A,_){let G=W_(_),$=E4(G);f7($,{recursive:!0});let K={};if(F4(G))try{let Y=S4(G,"utf-8");K=JSON.parse(Y)}catch{}let Z={...K,...A};g7(G,JSON.stringify(Z,null,2)+`
1201
+ `)}var O$,w5,C5,o,b5,D4,B_,JG;var JA=U(()=>{c();h5();O$={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},w5={enabled:!0,budget:800},C5={enabled:!1,autoPush:!0,autoPull:!0},o={consent:"unset",allowedHosts:["api.openai.com","api.anthropic.com"],allowedProviders:["anthropic","openai","claude-cli"]},b5={enabled:!1},D4={...EA};B_={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100,maxBatchBytes:800000},JG={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:B_,search:O$,ambientContext:w5,machineId:"",remoteSync:C5,providerEgress:o,legacyMemoryFiles:b5}});var k4={};k(k4,{PatternRedactor:()=>t,PATTERN_REDACTOR_RULE_VERSION:()=>y4});import{createHash as c7}from"crypto";class t{redactText(A){let _=A,G=[];for(let $ of u7)_=_.replace($.pattern,(K)=>{let Z=$.secretValue?.(K)??K,Y=f5($.kind,Z);return G.push(Y),`${$.preservePrefix?.(K)??""}${Y.placeholder}`});return{text:_,findings:G}}redactJson(A){let _=[];return{value:this.redactUnknown(A,_,new WeakSet),findings:_}}redactUnknown(A,_,G){if(typeof A==="string"){let $=this.redactText(A);return _.push(...$.findings),$.text}if(Array.isArray(A))return A.map(($,K)=>{let Z=A[K-1];if(typeof $==="string"&&typeof Z==="string"&&d7.test(Z))return this.redactFlagAdjacentValue($,_);return this.redactUnknown($,_,G)});if(A&&typeof A==="object"){if(G.has(A))return"[REDACTED:circular]";G.add(A);let $={};for(let[K,Z]of Object.entries(A))$[K]=this.redactObjectValue(K,Z,_,G);return $}return A}redactObjectValue(A,_,G,$){if(typeof _!=="string")return this.redactUnknown(_,G,$);let K=this.redactText(_);if(K.findings.length>0)return G.push(...K.findings),K.text;if(m7.test(A)&&_.trim()!==""&&!P4.test(_)){let Z=f5(l7(A),_);return G.push(Z),Z.placeholder}return _}redactFlagAdjacentValue(A,_){if(A.trim()===""||P4.test(A))return A;let G=this.redactText(A);if(G.findings.length>0)return _.push(...G.findings),G.text;let $=f5("env_secret",A);return _.push($),$.placeholder}}function f5(A,_){let G=c7("sha256").update(_).digest("hex").slice(0,8);return{kind:A,hash:G,ruleVersion:y4,placeholder:`[REDACTED:${A}:${G}]`}}function l7(A){if(/api[-_]?key|auth[-_]?key/i.test(A))return"api_key";if(/authorization|bearer|token/i.test(A))return"bearer_token";return"env_secret"}var y4="pattern-redactor-v2",u7,m7,d7,P4;var pA=U(()=>{u7=[{kind:"private_key",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{kind:"env_secret",pattern:/\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASS|CREDENTIAL)[A-Z0-9_]*)\s*=\s*(?:"[^"]+"|'[^']+'|[^\s]+)/g,preservePrefix:(A)=>`${A.split("=")[0].trim()}=`,secretValue:(A)=>A.slice(A.indexOf("=")+1).trim().replace(/^['"]|['"]$/g,"")},{kind:"api_key",pattern:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g},{kind:"api_key",pattern:/\btskey-(?:auth|client)-[A-Za-z0-9_-]{20,}\b/g},{kind:"aws_access_key",pattern:/\b(A3T[A-Z0-9]|AKIA|ASIA)[A-Z0-9]{16}\b/g},{kind:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{kind:"bearer_token",pattern:/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}/g,preservePrefix:()=>"Bearer ",secretValue:(A)=>A.replace(/^Bearer\s+/i,"")}],m7=/(?:api[-_]?key|auth[-_]?key|authorization|bearer|token|secret|password|passwd|pwd|credential)/i,d7=/^--?(?:api[-_]?key|auth[-_]?key|token|secret|password|passwd|pwd|credential)$/i,P4=/^\[REDACTED:[a-z_]+(?::[a-f0-9]{8})?\]$/});import{appendFileSync as TL,existsSync as p7,mkdirSync as IL,readFileSync as n7,renameSync as OL,statSync as jL}from"fs";import{dirname as i7,join as a7}from"path";function z_(A){if(A!==void 0)return i7(A);return QA()}function h4(A){if(A!==void 0)return A;return a7(QA(),"sync.log")}function N_(A=100,_){let G=h4(_);if(!p7(G))return[];try{let K=n7(G,"utf-8").split(`
1202
+ `).filter((Y)=>Y.trim()!==""),Z=[];for(let Y of K)try{let J=JSON.parse(Y);Z.push(J)}catch{continue}return Z.slice(-A)}catch{return[]}}var EL;var R$=U(()=>{c();pA();EL=new t});var g5=U(()=>{c();d1();D5();Y_()});var w4=U(()=>{JA();R$();g5()});var C4=U(()=>{R$()});var L_=U(()=>{JA();R$();g5();w4();C4();C1()});class c5{name="transformers-js";model;dimensions;_pipeline=null;constructor(A){this.model=A?.model??"Xenova/all-MiniLM-L6-v2",this.dimensions=A?.dimensions??384}async initialize(A){if(this._pipeline)return;let{pipeline:_,env:G}=await import("@huggingface/transformers");G.allowLocalModels=!1;let $={dtype:"q8"};if(A)$.progress_callback=(K)=>{A({status:K.status==="ready"?"ready":"downloading",file:K.file??"",loaded:K.loaded??0,total:K.total??0})};try{this._pipeline=await _("feature-extraction",this.model,$)}catch(K){if(console.warn(`Native ONNX runtime failed: ${L(K)}`),console.warn("Falling back to WASM backend (slower but universal)"),G.backends?.onnx?.wasm)G.backends.onnx.wasm.numThreads=1;try{this._pipeline=await _("feature-extraction",this.model,{dtype:"q8",device:"wasm"})}catch(Z){throw Error(`Embedding initialization failed. Native: ${L(K)}. WASM: ${L(Z)}`)}}}async embed(A){if(!this._pipeline)throw Error("Provider not initialized. Call initialize() before embed().");let _=await this._pipeline(A,{pooling:"mean",normalize:!0}),G=new Float32Array(_.tolist()[0]);return kA.create({embedding:G,model:this.model,dimensions:this.dimensions})}async embedBatch(A){let _=[];for(let G of A)_.push(await this.embed(G));return _}isReady(){return this._pipeline!==null}async dispose(){this._pipeline=null}}var b4=()=>{};class F${name;model;dimensions;apiKey;baseUrl;_ready=!1;constructor(A){this.apiKey=A.apiKey,this.name=A.providerId??"openai",this.model=A.model??"text-embedding-3-small",this.dimensions=A.dimensions??1536,this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async initialize(A){this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let Z=await _.text();throw Error(`OpenAI API error ${_.status}: ${Z}`)}let $=(await _.json()).data?.[0];if(!$)throw Error("OpenAI returned empty embeddings response");let K=new Float32Array($.embedding);return kA.create({embedding:K,model:this.model,dimensions:this.dimensions})}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let K=await _.text();throw Error(`OpenAI API error ${_.status}: ${K}`)}return[...(await _.json()).data].sort((K,Z)=>K.index-Z.index).map((K)=>kA.create({embedding:new Float32Array(K.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var f4=()=>{};class u5{name="ollama";model;dimensions;baseUrl;_ready=!1;constructor(A){this.model=A?.model??"nomic-embed-text",this.dimensions=A?.dimensions??768,this.baseUrl=A?.baseUrl??"http://localhost:11434"}async initialize(A){let _;try{_=await fetch(`${this.baseUrl}/api/tags`,{method:"GET"})}catch(G){let $=L(G);throw Error(`Cannot reach Ollama server at ${this.baseUrl}. Ensure Ollama is running: ollama serve (${$})`)}if(!_.ok)throw Error(`Ollama server returned ${_.status} from ${this.baseUrl}/api/tags`);this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let[_]=await this.requestEmbeddings(A);if(!_)throw Error("Ollama returned empty embeddings response");return _}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");if(A.length===0)return[];try{return await this.requestEmbeddings(A)}catch(_){if(A.length>1&&bG(_,"payload_too_large")){let G=Math.ceil(A.length/2),$=await this.embedBatch(A.slice(0,G)),K=await this.embedBatch(A.slice(G));return[...$,...K]}throw _}}isReady(){return this._ready}async dispose(){this._ready=!1}async requestEmbeddings(A){let _=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:A})});if(!_.ok){let $=await _.text();this.throwWithHint(_.status,$,A)}return(await _.json()).embeddings.map(($)=>kA.create({embedding:new Float32Array($),model:this.model,dimensions:this.dimensions}))}throwWithHint(A,_,G){if(A===413)throw new CG({kind:"payload_too_large",status:A,retryable:!1,message:"Ollama error 413: provider payload too large",metadata:{provider:this.name,model:this.model,inputCount:Array.isArray(G)?G.length:1}});if(A===404||_.includes("not found"))throw Error(`Ollama error ${A}: ${_}. Model '${this.model}' not found. Run: ollama pull ${this.model}`);throw Error(`Ollama error ${A}: ${_}`)}}var g4=U(()=>{l1()});function B0(A){return["You are an expert developer assistant. Analyze the following conversation transcript between a user and an AI coding assistant.","Your task is to extract a structured JSON list of key facts that occurred during this conversation.","","Specifically, you should identify and classify facts into these categories:",'1. "decision": Key architectural choices, technology selections, conventions, or design decisions made.','2. "learning": Lessons learned, discoveries about tools, APIs, bugs found, environment specific issues, or workarounds.','3. "preference": User guidelines, rules, stylistic/operational preferences, or explicit constraints.','4. "friction": Pain points, slow processes, build issues, sync locks, file system access issues, command timeouts, or system bottlenecks.','5. "observation": Key metrics, observed state, runtime configurations, or general context findings.',"","For each fact, assign a confidence score between 0.0 and 1.0 based on how explicitly and clearly it was stated or agreed upon in the transcript.",'Provide optional structured "metadata" for additional context (e.g. rationale, severity, file path, system version, etc.).',"","CRITICAL: Your output MUST be a valid JSON array of objects. Do not include any explanation, markdown formatting outside of a JSON code block, or preambles. Output ONLY the JSON.","","Format:","["," {",' "type": "decision" | "learning" | "preference" | "friction" | "observation",',' "content": "Description of the fact",',' "metadata": { "key": "value" },',' "confidence": 0.95'," }","]","","Transcript:",A.map((G)=>`[${G.timestamp.toISOString()}] ${G.role.toUpperCase()}: ${G.content}`).join(`
1203
1203
 
1204
1204
  `)].join(`
1205
- `)}function W0(A){let _=A.trim(),G=_.match(/\[\s*\{[\s\S]*\}\s*\]/),$=G?G[0]:_;try{let K=JSON.parse($);if(!Array.isArray(K))return[];let Z=[];for(let Y of K){if(typeof Y.content!=="string"||Y.content.trim()==="")continue;let H=["decision","learning","preference","friction","observation"].includes(Y.type)?Y.type:"observation",Q=typeof Y.confidence==="number"?Math.max(0,Math.min(1,Y.confidence)):0.8;Z.push({type:H,content:Y.content.trim(),metadata:Y.metadata&&typeof Y.metadata==="object"?Y.metadata:void 0,confidence:Q})}return Z}catch(K){return console.error("Failed to parse LLM facts JSON response:",K),[]}}import t7 from"@anthropic-ai/sdk";class m5{providerId="anthropic";modelName;anthropic;constructor(A){this.modelName=A.model??"claude-3-5-sonnet-20241022",this.anthropic=new t7({apiKey:A.apiKey})}async extract(A){if(A.length===0)return[];let _=B0(A);try{let $=(await this.anthropic.messages.create({model:this.modelName,max_tokens:4000,messages:[{role:"user",content:_}]})).content[0],K=$&&"text"in $?$.text:"";return W0(K)}catch(G){throw console.error("Anthropic fact extraction API failed:",G),Error(`Anthropic API error: ${G.message}`)}}}var c4=()=>{};import{spawn as e7}from"child_process";class d5{providerId="claude-cli";modelName="claude-cli-print";async extract(A){if(A.length===0)return[];let _=B0(A);return new Promise((G,$)=>{let K={...process.env};delete K.CLAUDECODE;let Z=e7("claude",["-p","--output-format","text"],{env:K,stdio:["pipe","pipe","pipe"]}),Y="",J="";Z.stdout.on("data",(H)=>{Y+=H.toString()}),Z.stderr.on("data",(H)=>{J+=H.toString()}),Z.on("error",(H)=>{$(Error(`Failed to spawn claude -p: ${H.message}`))}),Z.on("close",(H)=>{if(H===0)G(W0(Y));else $(Error(`claude -p exited with code ${H}: ${J.trim()}`))}),Z.stdin.write(_),Z.stdin.end()})}}var u4=()=>{};class l5{providerId="ollama";modelName;baseUrl;constructor(A){this.baseUrl=A.baseUrl??"http://localhost:11434",this.modelName=A.model??"llama3"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=`${this.baseUrl}/api/generate`,$=await fetch(G,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelName,prompt:_,stream:!1,options:{temperature:0.1}})});if(!$.ok){let Y=await $.text();throw Error(`HTTP ${$.status}: ${Y}`)}let Z=(await $.json())?.response??"";return W0(Z)}catch(G){throw console.error("Ollama fact extraction API failed:",G),Error(`Ollama API error: ${G.message}`)}}}var m4=()=>{};class S1{providerId;modelName;apiKey;baseUrl;constructor(A){this.apiKey=A.apiKey,this.providerId=A.providerId??"openai",this.modelName=A.model??"gpt-4o",this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.modelName,messages:[{role:"user",content:_}],temperature:0.1})});if(!G.ok){let Z=await G.text();throw Error(`HTTP ${G.status}: ${Z}`)}let K=(await G.json())?.choices?.[0]?.message?.content??"";return W0(K)}catch(G){throw console.error("OpenAI fact extraction API failed:",G),Error(`OpenAI API error: ${G.message}`)}}}var d4=()=>{};function QG(A,_=o){let G=s7(A);return p4({capability:"embedding",provider:A.provider,policy:_,target:G})}function XG(A,_){let G=A.providerEgress??o,$=o7(_,A.embedding);return p4({capability:"extraction",provider:_,policy:G,target:$})}function p5(A){if(!A.allowed)throw Error(A.reason??"Provider egress is not allowed by policy")}function p4(A){let{capability:_,provider:G,policy:$,target:K}=A;if(!K.required)return{required:!1,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[]};if($.consent!=="granted")return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider egress consent is not granted. Set providerEgress.consent to "granted" after reviewing what redacted memory content may leave this machine.`,warnings:[]};if(K.host){if(!new Set($.allowedHosts.map((Y)=>Y.toLowerCase())).has(K.host.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider host ${K.host} is not in providerEgress.allowedHosts.`,warnings:[]}}else if(!new Set($.allowedProviders.map((Y)=>Y.toLowerCase())).has(G.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,reason:`Remote ${_} provider ${G} is not in providerEgress.allowedProviders.`,warnings:[]};return{required:!0,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[K.host?`Remote ${_} provider egress is enabled for host ${K.host}.`:`Remote ${_} provider egress is enabled for provider ${G}.`]}}function s7(A){switch(A.provider){case"local":return{required:!1,target:"local"};case"ollama":return b0(A.baseUrl??"http://localhost:11434","ollama");case"openai":return b0(A.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(A.baseUrl,"openai-compatible");default:return{required:!0,target:A.provider}}}function o7(A,_){switch(A){case"ollama":return b0(_.baseUrl??"http://localhost:11434","ollama");case"anthropic":return b0("https://api.anthropic.com","anthropic");case"openai":return b0(_.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(_.baseUrl,"openai-compatible");case"claude-cli":return{required:!0,target:"claude-cli"};default:return{required:!0,target:A}}}function b0(A,_){if(!A)return{required:!0,target:_};try{let $=new URL(A).hostname;return{required:!l4($),target:$,host:!l4($)?$:void 0}}catch{return{required:!0,target:_}}}function l4(A){let _=A.toLowerCase();return _==="localhost"||_==="127.0.0.1"||_==="::1"||_.endsWith(".localhost")}var IM,OM;var n5=U(()=>{JA();IM=[...o.allowedHosts],OM=[...o.allowedProviders]});function q_(A){return{ready:!0,readyReason:A}}function f0(A){return{ready:!1,readyReason:A}}function VG(A,_,G){let $=HG(A,_);if($.source==="missing")return f0($.ref?"API key reference configured but not available at runtime; run through a secret injector or set embedding.apiKeyEnv":G);if($.deprecatedPlaintext)return q_("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return q_()}function BG(A,_,G){let $=HG(A,_);if(!$.apiKey)throw Error(`${G} API key is required. Set ${_.join(" or ")} or configure embedding.apiKeyEnv for runtime injection. apiKeyRef is an opaque reference and is not resolved by memory-nexus.`);return $.apiKey}function n4(A,_){if(!A.baseUrl)throw Error(`openai-compatible ${_} provider requires embedding.baseUrl`);return A.baseUrl}function AJ(){return i4.map((A)=>A.id)}function _J(){return a4.map((A)=>A.id)}function r4(A){return`Unsupported embedding provider: "${A}". Supported: ${AJ().join(", ")}`}function t4(A){return`Unsupported extraction provider: "${A}". Supported: ${_J().join(", ")}`}function e4(A){return[...a5.get(A)?.secretEnvVars??[]]}function s4(A){return[...E1.get(A)?.secretEnvVars??[]]}function o4(A,_=o){let G=a5.get(A.provider);if(!G)return f0(r4(A.provider));let $=G.checkReadiness(A);if(!$.ready)return $;let K=QG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function A9(A,_=o){let G=a5.get(A.provider);if(!G)throw Error(r4(A.provider));if(G.checkReadiness(A).ready)p5(QG(A,_));return G.create(A)}function g0(A,_=process.env){let G=_.LLM_PROVIDER?.trim();if(G)return G;let $=A.embedding?.provider??"claude-cli";return $==="local"?"claude-cli":$}function r5(A,_,G=process.env){let $=E1.get(_);if(!$)return"";return G.LLM_MODEL?.trim()||$.defaultModel}function _9(A,_=g0(A)){let G=E1.get(_);if(!G)return f0(t4(_));let $=G.checkReadiness(A.embedding);if(!$.ready)return $;let K=XG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function G9(A){let _=g0(A),G=E1.get(_);if(!G)throw Error(t4(_));if(G.checkReadiness(A.embedding).ready)p5(XG(A,_));return G.create(A.embedding,r5(A,_))}var M_,i5,i4,a4,a5,E1;var WG=U(()=>{JA();b4();f4();g4();c4();u4();m4();d4();h5();n5();M_=["OPENAI_API_KEY"],i5=["ANTHROPIC_API_KEY"],i4=[{id:"local",defaultModel:EA.local.model,defaultDimensions:EA.local.dimensions,secretEnvVars:[],checkReadiness:()=>q_(),create:(A)=>new c5({model:A.model,dimensions:A.dimensions})},{id:"openai",defaultModel:EA.openai.model,defaultDimensions:EA.openai.dimensions,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A)=>new F1({apiKey:BG(A,M_,"OpenAI embedding"),model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"ollama",defaultModel:EA.ollama.model,defaultDimensions:EA.ollama.dimensions,secretEnvVars:[],checkReadiness:()=>q_("Server reachability verified at sync time"),create:(A)=>new u5({model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"openai-compatible",defaultModel:EA["openai-compatible"].model,defaultDimensions:EA["openai-compatible"].dimensions,secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible embedding provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A)=>new F1({apiKey:BG(A,[],"openai-compatible embedding"),model:A.model,dimensions:A.dimensions,baseUrl:n4(A,"embedding"),providerId:"openai-compatible"})}],a4=[{id:"anthropic",defaultModel:V_.anthropic,secretEnvVars:i5,checkReadiness:(A)=>VG(A,i5,"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new m5({apiKey:BG(A,i5,"Anthropic extraction"),model:_})},{id:"openai",defaultModel:V_.openai,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new S1({apiKey:BG(A,M_,"OpenAI extraction"),model:_})},{id:"ollama",defaultModel:V_.ollama,secretEnvVars:[],checkReadiness:()=>q_(),create:(A,_)=>new l5({baseUrl:A.baseUrl,model:_})},{id:"claude-cli",defaultModel:V_["claude-cli"],secretEnvVars:[],checkReadiness:()=>q_(),create:()=>new d5},{id:"openai-compatible",defaultModel:V_["openai-compatible"],secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible extraction provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A,_)=>new S1({apiKey:BG(A,[],"openai-compatible extraction"),model:_,baseUrl:n4(A,"extraction"),providerId:"openai-compatible"})}],a5=new Map(i4.map((A)=>[A.id,A])),E1=new Map(a4.map((A)=>[A.id,A]))});import{createHash as GJ}from"crypto";import{existsSync as $J}from"fs";import{delimiter as KJ,join as ZJ}from"path";function D1(A,_={}){let G=_.env??process.env,$=_.commandResolver??((Y)=>WJ(Y,G,_.platform)),K=YJ(A,G),Z=new Map;for(let Y of $9){let J=$(Y.command);Z.set(Y.provider,{provider:Y.provider,optional:Y.optional,available:Boolean(J),status:J?"available":"optional_unavailable",statusSource:"path",allowedSignals:Y.allowedSignals,rawSecretAccess:"forbidden",warnings:[]})}for(let Y of K)if(!Z.has(Y.provider))Z.set(Y.provider,{provider:Y.provider,optional:!0,available:!1,status:"reference_only",statusSource:"reference",allowedSignals:["masked-metadata"],rawSecretAccess:"forbidden",warnings:[]});return{providers:Array.from(Z.values()),references:K,warnings:K.filter((Y)=>Y.status==="plaintext_config_deprecated").map((Y)=>`Deprecated plaintext secret configuration is present for ${Y.source}; migrate to runtime environment injection.`)}}function x1(A){let _=GJ("sha256").update(A).digest("hex").slice(0,12),G=JJ(A);if(!G)return{scheme:"unknown",provider:"unknown",maskedReference:`[redacted-ref:${_}]`,fingerprint:_};return{scheme:G.scheme,provider:G.provider,maskedReference:`${G.scheme}://[redacted:${_}]`,fingerprint:_}}function YJ(A,_){let G=A.embedding.apiKeyRef;if(!G)return[];let $=x1(G),K=QJ(A,_),Z=VJ(K.source);return[{source:"embedding.apiKeyRef",provider:$.provider,scheme:$.scheme,maskedReference:$.maskedReference,fingerprint:$.fingerprint,runtimeSecretSource:K.source,envVar:K.envVar,status:Z,note:BJ(Z)}]}function JJ(A){let _=/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(A);if(!_?.[1])return null;let G=_[1].toLowerCase(),$=HJ(G);return{scheme:G,provider:$}}function HJ(A){return $9.find((G)=>G.schemes.includes(A))?.provider??A}function QJ(A,_){let G=XJ(A,_);for(let $ of G)if(_[$])return{source:"environment",envVar:$};if(A.embedding.apiKey)return{source:"plaintext-config"};return{source:"missing"}}function XJ(A,_){let G=new Set;if(A.embedding.apiKeyEnv)G.add(A.embedding.apiKeyEnv);for(let K of e4(A.embedding.provider))G.add(K);let $=g0(A,_);for(let K of s4($))G.add(K);return Array.from(G)}function VJ(A){switch(A){case"environment":return"env_available";case"plaintext-config":return"plaintext_config_deprecated";case"missing":return"reference_only"}}function BJ(A){switch(A){case"env_available":return"Runtime environment contains the referenced provider secret; the value was not returned.";case"plaintext_config_deprecated":return"Deprecated plaintext config is present; migrate to environment injection or embedding.apiKeyEnv.";case"reference_only":return"Run through a secret injector or set embedding.apiKeyEnv."}}function WJ(A,_,G=process.platform){let $=_.PATH??"";if(!$)return null;let K=G==="win32"?zJ(_.PATHEXT):[""];for(let Z of $.split(KJ)){if(!Z)continue;for(let Y of K){let J=ZJ(Z,`${A}${Y}`);if($J(J))return J}}return null}function zJ(A){let _=A?.split(";").filter((G)=>G.trim()!=="");return _&&_.length>0?_:[".EXE",".CMD",".BAT",".COM"]}var $9;var K9=U(()=>{WG();$9=[{provider:"authkey",schemes:["authkey"],command:"authkey",optional:!0,allowedSignals:["env-injection","masked-metadata","proofs","fingerprints"]}]});var t5=U(()=>{K9()});import{Database as s5}from"bun:sqlite";import{accessSync as Z9,constants as Y9,existsSync as y1,readFileSync as NJ,statSync as LJ}from"fs";import{homedir as MJ}from"os";import{join as e5}from"path";function X9(A){try{return A.query("PRAGMA integrity_check(1);").get()?.integrity_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function o5(A){try{return A.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function U_(A){if(!y1(A))return{readable:!1,writable:!1};let _=!1,G=!1;try{Z9(A,Y9.R_OK),_=!0}catch{}try{Z9(A,Y9.W_OK),G=!0}catch{}return{readable:_,writable:G}}function A2(A,_,G,$){let K=$??bA(G),Z=f(_),J=N_(1,A)[0];return{installed:K.sessionEnd&&K.preCompact,enabled:Z.autoSync,lastRun:J?new Date(J.timestamp):null}}function _2(A){let _=[];try{let G=qJ(A),$=f(A);if(typeof $.autoSync!=="boolean")_.push("autoSync is not a boolean");if(typeof $.recoveryOnStartup!=="boolean")_.push("recoveryOnStartup is not a boolean");if(typeof $.syncOnCompaction!=="boolean")_.push("syncOnCompaction is not a boolean");if(typeof $.timeout!=="number"||!Number.isFinite($.timeout)||$.timeout<0)_.push("timeout is not a valid positive number");if(!J9.includes($.logLevel))_.push(`logLevel "${$.logLevel}" is not valid (expected: ${J9.join(", ")})`);if(typeof $.logRetentionDays!=="number"||!Number.isFinite($.logRetentionDays)||$.logRetentionDays<0)_.push("logRetentionDays is not a valid positive number");if(typeof $.showFailures!=="boolean")_.push("showFailures is not a boolean");if(!P1.includes($.providerEgress.consent))_.push(`providerEgress.consent "${$.providerEgress.consent}" is not valid (expected: ${P1.join(", ")})`);if(!Array.isArray($.providerEgress.allowedHosts)||!$.providerEgress.allowedHosts.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if(!Array.isArray($.providerEgress.allowedProviders)||!$.providerEgress.allowedProviders.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedProviders must be an array of non-empty strings");for(let K of G)if(!_.includes(K))_.push(K);return{valid:_.length===0,issues:_}}catch(G){let $=L(G);return _.push(`Failed to load config: ${$}`),{valid:!1,issues:_}}}function qJ(A){let _=[],G=W_(A);if(!y1(G))return _;try{let $=JSON.parse(NJ(G,"utf-8"));if(!Q9($)||$.providerEgress===void 0)return _;let K=$.providerEgress;if(!Q9(K))return["providerEgress must be an object"];if("consent"in K&&(typeof K.consent!=="string"||!P1.includes(K.consent)))_.push(`providerEgress.consent "${String(K.consent)}" is not valid (expected: ${P1.join(", ")})`);if("allowedHosts"in K&&!H9(K.allowedHosts))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if("allowedProviders"in K&&!H9(K.allowedProviders))_.push("providerEgress.allowedProviders must be an array of non-empty strings")}catch{return _}return _}function H9(A){return Array.isArray(A)&&A.every((_)=>typeof _==="string"&&_.trim()!=="")}function Q9(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function G2(){try{let A=U0("sqlite-vec"),_=new s5(":memory:");try{return A.load(_),{available:!0,version:_.query("SELECT vec_version()").get()["vec_version()"]}}finally{_.close()}}catch{return{available:!1,version:null}}}function $2(A){let _=f(A),G=_.embedding,$=o4(G,_.providerEgress);return{configured:!0,provider:G.provider,model:G.model,dimensions:G.dimensions,enabled:G.enabled,ready:$.ready,readyReason:$.readyReason}}function UJ(A){let _=f(A),G=g0(_),$=_9(_,G);return{provider:G,model:r5(_,G),ready:$.ready,readyReason:$.readyReason}}function K2(A){let _=f(A),G=g0(_),$=_.embedding.enabled?QG(_.embedding,_.providerEgress):{required:!1,allowed:!0,target:"disabled",capability:"embedding",provider:_.embedding.provider,warnings:[]},K=XG(_,G);return{consent:_.providerEgress.consent,embedding:$,llmExtraction:K,warnings:[...$.warnings,...K.warnings]}}function V9(A,_={}){let G=f(A);return D1(G,_)}function k1(A){let _=A?.dbPath??S(),G=IJ(_),$=A?.configDir??C0(),K=A?.logsDir??z_(),Z=A?.sourceDir??e5(MJ(),".claude","projects"),Y=A?.logsDir?e5(A.logsDir,"sync.log"):void 0,J=A?.configDir?e5(A.configDir,"config.json"):void 0,H=U_($),Q=U_(K),X=U_(Z),V={configDir:H.readable&&H.writable,logsDir:Q.readable&&Q.writable,sourceDir:X.readable},B=A2(Y,J,A?.hookOverrides,A?.preCalculatedHookStatus),W=_2(J),N=f(J),z=$2(J),q=G2(),I=TJ(_,q,N),T=UJ(J),M=K2(J),O=D1(N,A?.capabilityInterop);return{database:G,permissions:V,hooks:B,config:W,embedding:z,sqliteVec:q,searchCapability:I,llmExtraction:T,providerEgress:M,capabilityInterop:O}}function TJ(A,_,G){let $=0,K=0;try{if(y1(A)){let Y=new s5(A,{create:!1,readonly:!0});try{$=Y.query("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0,K=Y.query("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}finally{Y.close()}}}catch{}let Z=K>0?Math.round($/K*100):0;return{fts5:!0,sqliteVec:_.available,embeddedCount:$,totalMessages:K,coveragePercent:Z,defaultMode:G.search?.defaultMode??"auto",vectorReady:_.available&&$>0}}function IJ(A){if(!y1(A))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let G=U_(A),$=0;try{$=LJ(A).size}catch{}let K="unknown";if(G.readable)try{let Z=new s5(A,{create:!1,readonly:!0});try{K=o5(Z)}finally{Z.close()}}catch{K="corrupted"}return{exists:!0,readable:G.readable,writable:G.writable,integrity:K,size:$}}var J9,P1;var B9=U(()=>{S5();L_();WG();n5();t5();J9=["debug","info","warn","error"],P1=["unset","granted","denied"]});var Z2={};k(Z2,{runHealthCheck:()=>k1,initializeDatabaseSafe:()=>G4,initializeDatabase:()=>D,getDefaultDbPath:()=>S,createSchema:()=>V1,closeDatabase:()=>E,checkpointDatabase:()=>_4,checkSqliteVecAvailability:()=>G2,checkQuickIntegrity:()=>o5,checkProviderEgressHealth:()=>K2,checkHookStatus:()=>A2,checkFts5Support:()=>AG,checkEmbeddingConfig:()=>$2,checkDirectoryPermissions:()=>U_,checkDatabaseIntegrity:()=>X9,checkConfigValidity:()=>_2,checkCapabilityInteropHealth:()=>V9,bulkOperationCheckpoint:()=>N1,TOPICS_TABLE:()=>h6,TOOL_USES_TABLE:()=>y6,SqliteToolUseRepository:()=>X0,SqliteStatsService:()=>V0,SqliteSessionRepository:()=>m,SqliteProjectResolver:()=>w0,SqlitePersonaRepository:()=>SA,SqliteMessageRepository:()=>WA,SqliteMemoryUtilityRepository:()=>h0,SqliteMemoryGovernanceRepository:()=>s,SqliteLinkRepository:()=>J_,SqliteGraphRepository:()=>lA,SqliteFrictionRepository:()=>RA,SqliteExtractionStateRepository:()=>Q0,SqliteContextService:()=>v0,SqliteBackfillStateRepository:()=>KG,SESSIONS_TABLE:()=>D6,SCHEMA_SQL:()=>I5,PERSONA_ENTRIES_TABLE:()=>m6,MESSAGE_EMBEDDINGS_TABLE:()=>C6,MESSAGES_META_TABLE:()=>x6,MESSAGES_FTS_TABLE:()=>P6,MEMORY_UTILITY_METRICS_TABLE:()=>l6,MEMORY_GOVERNANCE_TABLE:()=>c6,MEMORY_GOVERNANCE_EVENTS_TABLE:()=>u6,LINKS_TABLE:()=>k6,HybridSearchService:()=>X_,GRAPH_EDGES_TABLE:()=>d6,Fts5SearchService:()=>Q_,FRICTION_LOG_TABLE:()=>f6,EmbeddingRepository:()=>dA,EXTRACTION_STATE_TABLE:()=>v6,EMBEDDING_STATE_TABLE:()=>w6,EMBEDDING_STATE_ADD_MODEL_NAME:()=>b6,BACKFILL_STATE_TABLE:()=>g6});var u=U(()=>{O5();S5();k5();R4();B9()});import{readdir as Y2,stat as zG}from"fs/promises";import{join as NG}from"path";import{homedir as OJ}from"os";class z0{claudeProjectsDir;resolver;constructor(A){this.claudeProjectsDir=A?.claudeDir??NG(OJ(),".claude","projects"),this.resolver=A?.projectNameResolver}async discoverSessions(){let A=[];try{await zG(this.claudeProjectsDir)}catch{return A}let _;try{_=await Y2(this.claudeProjectsDir)}catch{return A}for(let G of _){let $=NG(this.claudeProjectsDir,G);try{if(!(await zG($)).isDirectory())continue}catch{continue}let K;try{if(K=$A.fromEncoded(G),this.resolver){let Z=this.resolver.resolveFromEncodedPath(G);if(Z!==K.projectName)K=K.withProjectName(Z)}}catch{continue}await this.scanProjectDirectory($,K,A)}return A}async getSessionFile(A){return(await this.discoverSessions()).find(($)=>$.id===A)?.path??null}async scanProjectDirectory(A,_,G){let $;try{$=await Y2(A)}catch{return}for(let K of $){let Z=NG(A,K);try{let Y=await zG(Z);if(Y.isFile()&&K.endsWith(".jsonl")){let J=K.slice(0,-6);G.push({id:J,path:Z,projectPath:_,modifiedTime:Y.mtime,size:Y.size})}else if(Y.isDirectory())await this.scanSubagentsDirectory(Z,_,G)}catch{continue}}}async scanSubagentsDirectory(A,_,G){let $=NG(A,"subagents");try{if(!(await zG($)).isDirectory())return}catch{return}let K;try{K=await Y2($)}catch{return}for(let Z of K){if(!Z.endsWith(".jsonl"))continue;let Y=NG($,Z);try{let J=await zG(Y);if(J.isFile()){let H=Z.slice(0,-6);G.push({id:H,path:Y,projectPath:_,modifiedTime:J.mtime,size:J.size})}}catch{continue}}}}var W9=()=>{};import{readdirSync as jJ,statSync as RJ}from"fs";function FJ(A){return A.replace(/ /g,"-").replace(/-/g,"-")}class h1{rootDir;cache=new Map;dirCache=new Map;constructor(A){this.rootDir=A}resolveFromEncodedPath(A){let _=/^[A-Za-z]--/,G=A;if(_.test(G))G=G.slice(3);else if(G.startsWith("-"))G=G.slice(1);return this.resolveProjectName(G)}resolveProjectName(A){let _=this.cache.get(A);if(_!==void 0)return _;let G=this.walkAndResolve(this.rootDir,A);return this.cache.set(A,G),G}walkAndResolve(A,_){if(_==="")return"";let G=this.listSubdirectories(A),$=[];for(let Z of G){let Y=FJ(Z);$.push({name:Z,encoded:Y})}$.sort((Z,Y)=>Y.encoded.length-Z.encoded.length);for(let Z of $){if(_===Z.encoded)return Z.name;if(_.startsWith(Z.encoded+"-")){let Y=_.slice(Z.encoded.length+1),J=`${A}/${Z.name}`,H=this.walkAndResolve(J,Y);if(H!==this.fallbackLastSegment(Y))return H;return H}}let K=this.probeHiddenDirectories(A,_);if(K!==void 0)return K;return this.fallbackLastSegment(_)}probeHiddenDirectories(A,_){let G=_.split("-");for(let $=1;$<G.length;$++){let K=G.slice(0,$).join("-"),Z=`${A}/${K}`;if(this.isDirectory(Z)){let Y=G.slice($).join("-");if(Y==="")return K;let J=this.walkAndResolve(Z,Y);if(J!==this.fallbackLastSegment(Y))return J}}return}isDirectory(A){try{return RJ(A).isDirectory()}catch{return!1}}listSubdirectories(A){let _=this.dirCache.get(A);if(_!==void 0)return _;try{let $=jJ(A,{withFileTypes:!0}).filter((K)=>K.isDirectory()).map((K)=>K.name);return this.dirCache.set(A,$),$}catch{return this.dirCache.set(A,[]),[]}}fallbackLastSegment(A){let _=A.split("-");return _[_.length-1]??""}}var z9=()=>{};import{readdir as SJ,readFile as EJ,stat as DJ}from"fs/promises";import{join as xJ,relative as PJ}from"path";import{createHash as yJ}from"crypto";class v1{async discoverFiles(){let A=f_();try{await DJ(A)}catch{return[]}let _=[];return await this.scanDirectory(A,A,_),_}async scanDirectory(A,_,G){let $;try{$=await SJ(A,{withFileTypes:!0})}catch{return}for(let K of $){let Z=xJ(A,K.name);if(K.isDirectory())await this.scanDirectory(Z,_,G);else if(K.isFile()&&K.name.endsWith(".md")){let Y=PJ(_,Z).split("\\").join("/"),J=this.classifyFileType(Y);if(!J)continue;let H=await EJ(Z,"utf8"),Q=yJ("sha256").update(H,"utf8").digest("hex"),X=this.extractProjectEncoded(Y);G.push({filePath:Y,absolutePath:Z,fileType:J,projectEncoded:X,contentHash:Q,content:H})}}}classifyFileType(A){if(A.startsWith("daily/"))return"daily_log";if(A.endsWith("DECISIONS.md"))return"decisions";if(A.endsWith("LEARNINGS.md"))return"learnings";if(A.endsWith("USER-PREFS.md"))return"user_prefs";return null}extractProjectEncoded(A){return A.match(/^projects\/([^/]+)\//)?.[1]??void 0}}var N9=U(()=>{c()});var LG=U(()=>{W9();z9();N9()});function DA(A,_){let G=_??new Date,$=A.getTime()-G.getTime(),K=Math.abs($);if(K<3600000){let Y=Math.round($/60000);return MG.format(Y,"minute")}if(K<86400000){let Y=Math.round($/3600000);return MG.format(Y,"hour")}if(K<604800000){let Y=Math.round($/86400000);return MG.format(Y,"day")}if(K<2592000000){let Y=Math.round($/604800000);return MG.format(Y,"week")}let Z=Math.round($/2592000000);return MG.format(Z,"month")}function c0(A){let _=A.getFullYear(),G=String(A.getMonth()+1).padStart(2,"0"),$=String(A.getDate()).padStart(2,"0"),K=String(A.getHours()).padStart(2,"0"),Z=String(A.getMinutes()).padStart(2,"0");return`${_}-${G}-${$} ${K}:${Z}`}function vA(A,_){let G=DA(A,_),$=c0(A);return`${G} (${$})`}var MG;var N0=U(()=>{MG=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function v(A){let _=A?.noColor??!!process.env.NO_COLOR,G=A?.forceColor??!!process.env.FORCE_COLOR,$=A?.isTTY??process.stdout.isTTY===!0;if(_)return!1;if(G)return!0;return $}function O_(A,_,G){if(!G)return A;return`\x1B[${_}m${A}\x1B[0m`}function KA(A,_){return O_(A,"1",_??v())}function P(A,_){return O_(A,"2",_??v())}function C(A,_){return O_(A,"32",_??v())}function d(A,_){return O_(A,"31",_??v())}function l(A,_){return O_(A,"33",_??v())}function E9(A,_){return O_(A,"36",_??v())}import D9 from"string-width";function Q2(A){return D9(A)}function X2(A,_){if(_<=0)return"";if(Q2(A)<=_)return A;let G="...",$=3;if(_<=$)return".".repeat(_);let K=_-$,Z="",Y=0;for(let J of A){let H=D9(J);if(Y+H>K)break;Z+=J,Y+=H}return Z+G}function c1(A,_){let G=Q2(A);if(G>=_)return A;return A+" ".repeat(_-G)}function V2(){return process.stdout.columns||80}function B2(A,_,G=20){let $=V2(),K=Q2(_),Z=$-K;return X2(A,Z>G?Z:G)}var W2=()=>{};function u1(A,_={}){let G=h9(A.snippet),$=A.snippet.replace(/<\/?mark>/g,""),K={sessionId:A.sessionId,messageId:A.messageId,role:A.role,score:A.score,timestamp:A.timestamp.toISOString(),snippet:$};if(_.includeSearchMetaFields){if(_.rank!==void 0)K.rank=_.rank;let Z=A.rawScores;if(Z)K.raw_scores=Z;if(A.source)K.source=A.source;if(G.length>0)K.highlights=G}return K}function x9(A){let _={score:A.score,file:A.file,title:A.title};if(A.docid!==void 0)_.docid=A.docid;if(A.context!==void 0)_.context=A.context;if(A.snippet!==void 0)_.snippet=A.snippet;return _}function m1(A){let _={id:A.id,project:A.projectPath.projectName,projectPath:A.projectPath.decoded,startTime:A.startTime.toISOString()};if(A.endTime)_.endTime=A.endTime.toISOString();if(A.messageCount!==void 0)_.messageCount=A.messageCount;if(A.summary!==void 0)_.summary=A.summary;return _}function P9(A){return{session:m1(A.session),messages:A.messages.map(rJ),toolUses:Array.from(A.toolUses.values()).map(tJ)}}function rJ(A){return{id:A.id,role:A.role,timestamp:A.timestamp.toISOString(),content:A.content}}function tJ(A){let _={id:A.id,name:A.name,status:A.status,input:A.input};if(A.result!==void 0)_.result=A.result;return _}function y9(A){return{session:m1(A.session),weight:A.weight,hops:A.hops}}function z2(A){let _={totalSessions:A.totalSessions,totalMessages:A.totalMessages,totalToolUses:A.totalToolUses,databaseSizeBytes:A.databaseSizeBytes,projectBreakdown:A.projectBreakdown.map((G)=>({projectName:G.projectName,sessionCount:G.sessionCount,messageCount:G.messageCount}))};if(A.hooks)_.hooks={installed:A.hooks.installed,autoSync:A.hooks.autoSync,pendingSessions:A.hooks.pendingSessions};return _}function k9(A){return{projectName:A.projectName,projectPathDecoded:A.projectPathDecoded,sessionCount:A.sessionCount,totalMessages:A.totalMessages,userMessages:A.userMessages,assistantMessages:A.assistantMessages,recentTopics:[...A.recentTopics],recentToolUses:A.recentToolUses.map((_)=>({name:_.name,count:_.count})),lastActivity:A.lastActivity?A.lastActivity.toISOString():null}}var L0=U(()=>{d1()});function N2(A,_){switch(A){case"json":return new b9;case"quiet":return new f9;case"verbose":return new g9(_);case"brief":return new C9;default:return new w9(_)}}function h9(A){let _=[],G=0,$=0;while($<A.length)if(A.startsWith("<mark>",$)){$+=6;let K=A.indexOf("</mark>",$);if(K===-1)break;_.push({offset:G,length:K-$}),G+=K-$,$=K+7}else G++,$++;return _}function v9(A,_){if(!_)return A.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return A.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class w9{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??j_;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $=`Found ${A.length} result(s):
1205
+ `)}function W0(A){let _=A.trim(),G=_.match(/\[\s*\{[\s\S]*\}\s*\]/),$=G?G[0]:_;try{let K=JSON.parse($);if(!Array.isArray(K))return[];let Z=[];for(let Y of K){if(typeof Y.content!=="string"||Y.content.trim()==="")continue;let H=["decision","learning","preference","friction","observation"].includes(Y.type)?Y.type:"observation",Q=typeof Y.confidence==="number"?Math.max(0,Math.min(1,Y.confidence)):0.8;Z.push({type:H,content:Y.content.trim(),metadata:Y.metadata&&typeof Y.metadata==="object"?Y.metadata:void 0,confidence:Q})}return Z}catch(K){return console.error("Failed to parse LLM facts JSON response:",K),[]}}import t7 from"@anthropic-ai/sdk";class m5{providerId="anthropic";modelName;anthropic;constructor(A){this.modelName=A.model??"claude-3-5-sonnet-20241022",this.anthropic=new t7({apiKey:A.apiKey})}async extract(A){if(A.length===0)return[];let _=B0(A);try{let $=(await this.anthropic.messages.create({model:this.modelName,max_tokens:4000,messages:[{role:"user",content:_}]})).content[0],K=$&&"text"in $?$.text:"";return W0(K)}catch(G){throw console.error("Anthropic fact extraction API failed:",G),Error(`Anthropic API error: ${G.message}`)}}}var c4=()=>{};import{spawn as e7}from"child_process";class d5{providerId="claude-cli";modelName="claude-cli-print";async extract(A){if(A.length===0)return[];let _=B0(A);return new Promise((G,$)=>{let K={...process.env};delete K.CLAUDECODE;let Z=e7("claude",["-p","--output-format","text"],{env:K,stdio:["pipe","pipe","pipe"]}),Y="",J="";Z.stdout.on("data",(H)=>{Y+=H.toString()}),Z.stderr.on("data",(H)=>{J+=H.toString()}),Z.on("error",(H)=>{$(Error(`Failed to spawn claude -p: ${H.message}`))}),Z.on("close",(H)=>{if(H===0)G(W0(Y));else $(Error(`claude -p exited with code ${H}: ${J.trim()}`))}),Z.stdin.write(_),Z.stdin.end()})}}var u4=()=>{};class l5{providerId="ollama";modelName;baseUrl;constructor(A){this.baseUrl=A.baseUrl??"http://localhost:11434",this.modelName=A.model??"llama3"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=`${this.baseUrl}/api/generate`,$=await fetch(G,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelName,prompt:_,stream:!1,options:{temperature:0.1}})});if(!$.ok){let Y=await $.text();throw Error(`HTTP ${$.status}: ${Y}`)}let Z=(await $.json())?.response??"";return W0(Z)}catch(G){throw console.error("Ollama fact extraction API failed:",G),Error(`Ollama API error: ${G.message}`)}}}var m4=()=>{};class S${providerId;modelName;apiKey;baseUrl;constructor(A){this.apiKey=A.apiKey,this.providerId=A.providerId??"openai",this.modelName=A.model??"gpt-4o",this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.modelName,messages:[{role:"user",content:_}],temperature:0.1})});if(!G.ok){let Z=await G.text();throw Error(`HTTP ${G.status}: ${Z}`)}let K=(await G.json())?.choices?.[0]?.message?.content??"";return W0(K)}catch(G){throw console.error("OpenAI fact extraction API failed:",G),Error(`OpenAI API error: ${G.message}`)}}}var d4=()=>{};function QG(A,_=o){let G=s7(A);return p4({capability:"embedding",provider:A.provider,policy:_,target:G})}function XG(A,_){let G=A.providerEgress??o,$=o7(_,A.embedding);return p4({capability:"extraction",provider:_,policy:G,target:$})}function p5(A){if(!A.allowed)throw Error(A.reason??"Provider egress is not allowed by policy")}function p4(A){let{capability:_,provider:G,policy:$,target:K}=A;if(!K.required)return{required:!1,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[]};if($.consent!=="granted")return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider egress consent is not granted. Set providerEgress.consent to "granted" after reviewing what redacted memory content may leave this machine.`,warnings:[]};if(K.host){if(!new Set($.allowedHosts.map((Y)=>Y.toLowerCase())).has(K.host.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider host ${K.host} is not in providerEgress.allowedHosts.`,warnings:[]}}else if(!new Set($.allowedProviders.map((Y)=>Y.toLowerCase())).has(G.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,reason:`Remote ${_} provider ${G} is not in providerEgress.allowedProviders.`,warnings:[]};return{required:!0,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[K.host?`Remote ${_} provider egress is enabled for host ${K.host}.`:`Remote ${_} provider egress is enabled for provider ${G}.`]}}function s7(A){switch(A.provider){case"local":return{required:!1,target:"local"};case"ollama":return b0(A.baseUrl??"http://localhost:11434","ollama");case"openai":return b0(A.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(A.baseUrl,"openai-compatible");default:return{required:!0,target:A.provider}}}function o7(A,_){switch(A){case"ollama":return b0(_.baseUrl??"http://localhost:11434","ollama");case"anthropic":return b0("https://api.anthropic.com","anthropic");case"openai":return b0(_.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(_.baseUrl,"openai-compatible");case"claude-cli":return{required:!0,target:"claude-cli"};default:return{required:!0,target:A}}}function b0(A,_){if(!A)return{required:!0,target:_};try{let $=new URL(A).hostname;return{required:!l4($),target:$,host:!l4($)?$:void 0}}catch{return{required:!0,target:_}}}function l4(A){let _=A.toLowerCase();return _==="localhost"||_==="127.0.0.1"||_==="::1"||_.endsWith(".localhost")}var IM,OM;var n5=U(()=>{JA();IM=[...o.allowedHosts],OM=[...o.allowedProviders]});function q_(A){return{ready:!0,readyReason:A}}function f0(A){return{ready:!1,readyReason:A}}function VG(A,_,G){let $=HG(A,_);if($.source==="missing")return f0($.ref?"API key reference configured but not available at runtime; run through a secret injector or set embedding.apiKeyEnv":G);if($.deprecatedPlaintext)return q_("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return q_()}function BG(A,_,G){let $=HG(A,_);if(!$.apiKey)throw Error(`${G} API key is required. Set ${_.join(" or ")} or configure embedding.apiKeyEnv for runtime injection. apiKeyRef is an opaque reference and is not resolved by memory-nexus.`);return $.apiKey}function n4(A,_){if(!A.baseUrl)throw Error(`openai-compatible ${_} provider requires embedding.baseUrl`);return A.baseUrl}function AJ(){return i4.map((A)=>A.id)}function _J(){return a4.map((A)=>A.id)}function r4(A){return`Unsupported embedding provider: "${A}". Supported: ${AJ().join(", ")}`}function t4(A){return`Unsupported extraction provider: "${A}". Supported: ${_J().join(", ")}`}function e4(A){return[...a5.get(A)?.secretEnvVars??[]]}function s4(A){return[...E$.get(A)?.secretEnvVars??[]]}function o4(A,_=o){let G=a5.get(A.provider);if(!G)return f0(r4(A.provider));let $=G.checkReadiness(A);if(!$.ready)return $;let K=QG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function A9(A,_=o){let G=a5.get(A.provider);if(!G)throw Error(r4(A.provider));if(G.checkReadiness(A).ready)p5(QG(A,_));return G.create(A)}function g0(A,_=process.env){let G=_.LLM_PROVIDER?.trim();if(G)return G;let $=A.embedding?.provider??"claude-cli";return $==="local"?"claude-cli":$}function r5(A,_,G=process.env){let $=E$.get(_);if(!$)return"";return G.LLM_MODEL?.trim()||$.defaultModel}function _9(A,_=g0(A)){let G=E$.get(_);if(!G)return f0(t4(_));let $=G.checkReadiness(A.embedding);if(!$.ready)return $;let K=XG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function G9(A){let _=g0(A),G=E$.get(_);if(!G)throw Error(t4(_));if(G.checkReadiness(A.embedding).ready)p5(XG(A,_));return G.create(A.embedding,r5(A,_))}var M_,i5,i4,a4,a5,E$;var WG=U(()=>{JA();b4();f4();g4();c4();u4();m4();d4();h5();n5();M_=["OPENAI_API_KEY"],i5=["ANTHROPIC_API_KEY"],i4=[{id:"local",defaultModel:EA.local.model,defaultDimensions:EA.local.dimensions,secretEnvVars:[],checkReadiness:()=>q_(),create:(A)=>new c5({model:A.model,dimensions:A.dimensions})},{id:"openai",defaultModel:EA.openai.model,defaultDimensions:EA.openai.dimensions,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A)=>new F$({apiKey:BG(A,M_,"OpenAI embedding"),model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"ollama",defaultModel:EA.ollama.model,defaultDimensions:EA.ollama.dimensions,secretEnvVars:[],checkReadiness:()=>q_("Server reachability verified at sync time"),create:(A)=>new u5({model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"openai-compatible",defaultModel:EA["openai-compatible"].model,defaultDimensions:EA["openai-compatible"].dimensions,secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible embedding provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A)=>new F$({apiKey:BG(A,[],"openai-compatible embedding"),model:A.model,dimensions:A.dimensions,baseUrl:n4(A,"embedding"),providerId:"openai-compatible"})}],a4=[{id:"anthropic",defaultModel:V_.anthropic,secretEnvVars:i5,checkReadiness:(A)=>VG(A,i5,"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new m5({apiKey:BG(A,i5,"Anthropic extraction"),model:_})},{id:"openai",defaultModel:V_.openai,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new S$({apiKey:BG(A,M_,"OpenAI extraction"),model:_})},{id:"ollama",defaultModel:V_.ollama,secretEnvVars:[],checkReadiness:()=>q_(),create:(A,_)=>new l5({baseUrl:A.baseUrl,model:_})},{id:"claude-cli",defaultModel:V_["claude-cli"],secretEnvVars:[],checkReadiness:()=>q_(),create:()=>new d5},{id:"openai-compatible",defaultModel:V_["openai-compatible"],secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible extraction provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A,_)=>new S$({apiKey:BG(A,[],"openai-compatible extraction"),model:_,baseUrl:n4(A,"extraction"),providerId:"openai-compatible"})}],a5=new Map(i4.map((A)=>[A.id,A])),E$=new Map(a4.map((A)=>[A.id,A]))});import{createHash as GJ}from"crypto";import{existsSync as $J}from"fs";import{delimiter as KJ,join as ZJ}from"path";function D$(A,_={}){let G=_.env??process.env,$=_.commandResolver??((Y)=>WJ(Y,G,_.platform)),K=YJ(A,G),Z=new Map;for(let Y of $9){let J=$(Y.command);Z.set(Y.provider,{provider:Y.provider,optional:Y.optional,available:Boolean(J),status:J?"available":"optional_unavailable",statusSource:"path",allowedSignals:Y.allowedSignals,rawSecretAccess:"forbidden",warnings:[]})}for(let Y of K)if(!Z.has(Y.provider))Z.set(Y.provider,{provider:Y.provider,optional:!0,available:!1,status:"reference_only",statusSource:"reference",allowedSignals:["masked-metadata"],rawSecretAccess:"forbidden",warnings:[]});return{providers:Array.from(Z.values()),references:K,warnings:K.filter((Y)=>Y.status==="plaintext_config_deprecated").map((Y)=>`Deprecated plaintext secret configuration is present for ${Y.source}; migrate to runtime environment injection.`)}}function x$(A){let _=GJ("sha256").update(A).digest("hex").slice(0,12),G=JJ(A);if(!G)return{scheme:"unknown",provider:"unknown",maskedReference:`[redacted-ref:${_}]`,fingerprint:_};return{scheme:G.scheme,provider:G.provider,maskedReference:`${G.scheme}://[redacted:${_}]`,fingerprint:_}}function YJ(A,_){let G=A.embedding.apiKeyRef;if(!G)return[];let $=x$(G),K=QJ(A,_),Z=VJ(K.source);return[{source:"embedding.apiKeyRef",provider:$.provider,scheme:$.scheme,maskedReference:$.maskedReference,fingerprint:$.fingerprint,runtimeSecretSource:K.source,envVar:K.envVar,status:Z,note:BJ(Z)}]}function JJ(A){let _=/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(A);if(!_?.[1])return null;let G=_[1].toLowerCase(),$=HJ(G);return{scheme:G,provider:$}}function HJ(A){return $9.find((G)=>G.schemes.includes(A))?.provider??A}function QJ(A,_){let G=XJ(A,_);for(let $ of G)if(_[$])return{source:"environment",envVar:$};if(A.embedding.apiKey)return{source:"plaintext-config"};return{source:"missing"}}function XJ(A,_){let G=new Set;if(A.embedding.apiKeyEnv)G.add(A.embedding.apiKeyEnv);for(let K of e4(A.embedding.provider))G.add(K);let $=g0(A,_);for(let K of s4($))G.add(K);return Array.from(G)}function VJ(A){switch(A){case"environment":return"env_available";case"plaintext-config":return"plaintext_config_deprecated";case"missing":return"reference_only"}}function BJ(A){switch(A){case"env_available":return"Runtime environment contains the referenced provider secret; the value was not returned.";case"plaintext_config_deprecated":return"Deprecated plaintext config is present; migrate to environment injection or embedding.apiKeyEnv.";case"reference_only":return"Run through a secret injector or set embedding.apiKeyEnv."}}function WJ(A,_,G=process.platform){let $=_.PATH??"";if(!$)return null;let K=G==="win32"?zJ(_.PATHEXT):[""];for(let Z of $.split(KJ)){if(!Z)continue;for(let Y of K){let J=ZJ(Z,`${A}${Y}`);if($J(J))return J}}return null}function zJ(A){let _=A?.split(";").filter((G)=>G.trim()!=="");return _&&_.length>0?_:[".EXE",".CMD",".BAT",".COM"]}var $9;var K9=U(()=>{WG();$9=[{provider:"authkey",schemes:["authkey"],command:"authkey",optional:!0,allowedSignals:["env-injection","masked-metadata","proofs","fingerprints"]}]});var t5=U(()=>{K9()});import{Database as s5}from"bun:sqlite";import{accessSync as Z9,constants as Y9,existsSync as y$,readFileSync as NJ,statSync as LJ}from"fs";import{homedir as MJ}from"os";import{join as e5}from"path";function X9(A){try{return A.query("PRAGMA integrity_check(1);").get()?.integrity_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function o5(A){try{return A.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function U_(A){if(!y$(A))return{readable:!1,writable:!1};let _=!1,G=!1;try{Z9(A,Y9.R_OK),_=!0}catch{}try{Z9(A,Y9.W_OK),G=!0}catch{}return{readable:_,writable:G}}function A2(A,_,G,$){let K=$??bA(G),Z=f(_),J=N_(1,A)[0];return{installed:K.sessionEnd&&K.preCompact,enabled:Z.autoSync,lastRun:J?new Date(J.timestamp):null}}function _2(A){let _=[];try{let G=qJ(A),$=f(A);if(typeof $.autoSync!=="boolean")_.push("autoSync is not a boolean");if(typeof $.recoveryOnStartup!=="boolean")_.push("recoveryOnStartup is not a boolean");if(typeof $.syncOnCompaction!=="boolean")_.push("syncOnCompaction is not a boolean");if(typeof $.timeout!=="number"||!Number.isFinite($.timeout)||$.timeout<0)_.push("timeout is not a valid positive number");if(!J9.includes($.logLevel))_.push(`logLevel "${$.logLevel}" is not valid (expected: ${J9.join(", ")})`);if(typeof $.logRetentionDays!=="number"||!Number.isFinite($.logRetentionDays)||$.logRetentionDays<0)_.push("logRetentionDays is not a valid positive number");if(typeof $.showFailures!=="boolean")_.push("showFailures is not a boolean");if(!P$.includes($.providerEgress.consent))_.push(`providerEgress.consent "${$.providerEgress.consent}" is not valid (expected: ${P$.join(", ")})`);if(!Array.isArray($.providerEgress.allowedHosts)||!$.providerEgress.allowedHosts.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if(!Array.isArray($.providerEgress.allowedProviders)||!$.providerEgress.allowedProviders.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedProviders must be an array of non-empty strings");for(let K of G)if(!_.includes(K))_.push(K);return{valid:_.length===0,issues:_}}catch(G){let $=L(G);return _.push(`Failed to load config: ${$}`),{valid:!1,issues:_}}}function qJ(A){let _=[],G=W_(A);if(!y$(G))return _;try{let $=JSON.parse(NJ(G,"utf-8"));if(!Q9($)||$.providerEgress===void 0)return _;let K=$.providerEgress;if(!Q9(K))return["providerEgress must be an object"];if("consent"in K&&(typeof K.consent!=="string"||!P$.includes(K.consent)))_.push(`providerEgress.consent "${String(K.consent)}" is not valid (expected: ${P$.join(", ")})`);if("allowedHosts"in K&&!H9(K.allowedHosts))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if("allowedProviders"in K&&!H9(K.allowedProviders))_.push("providerEgress.allowedProviders must be an array of non-empty strings")}catch{return _}return _}function H9(A){return Array.isArray(A)&&A.every((_)=>typeof _==="string"&&_.trim()!=="")}function Q9(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function G2(){try{let A=U0("sqlite-vec"),_=new s5(":memory:");try{return A.load(_),{available:!0,version:_.query("SELECT vec_version()").get()["vec_version()"]}}finally{_.close()}}catch{return{available:!1,version:null}}}function $2(A){let _=f(A),G=_.embedding,$=o4(G,_.providerEgress);return{configured:!0,provider:G.provider,model:G.model,dimensions:G.dimensions,enabled:G.enabled,ready:$.ready,readyReason:$.readyReason}}function UJ(A){let _=f(A),G=g0(_),$=_9(_,G);return{provider:G,model:r5(_,G),ready:$.ready,readyReason:$.readyReason}}function K2(A){let _=f(A),G=g0(_),$=_.embedding.enabled?QG(_.embedding,_.providerEgress):{required:!1,allowed:!0,target:"disabled",capability:"embedding",provider:_.embedding.provider,warnings:[]},K=XG(_,G);return{consent:_.providerEgress.consent,embedding:$,llmExtraction:K,warnings:[...$.warnings,...K.warnings]}}function V9(A,_={}){let G=f(A);return D$(G,_)}function k$(A){let _=A?.dbPath??S(),G=IJ(_),$=A?.configDir??C0(),K=A?.logsDir??z_(),Z=A?.sourceDir??e5(MJ(),".claude","projects"),Y=A?.logsDir?e5(A.logsDir,"sync.log"):void 0,J=A?.configDir?e5(A.configDir,"config.json"):void 0,H=U_($),Q=U_(K),X=U_(Z),V={configDir:H.readable&&H.writable,logsDir:Q.readable&&Q.writable,sourceDir:X.readable},B=A2(Y,J,A?.hookOverrides,A?.preCalculatedHookStatus),W=_2(J),N=f(J),z=$2(J),q=G2(),I=TJ(_,q,N),T=UJ(J),M=K2(J),O=D$(N,A?.capabilityInterop);return{database:G,permissions:V,hooks:B,config:W,embedding:z,sqliteVec:q,searchCapability:I,llmExtraction:T,providerEgress:M,capabilityInterop:O}}function TJ(A,_,G){let $=0,K=0;try{if(y$(A)){let Y=new s5(A,{create:!1,readonly:!0});try{$=Y.query("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0,K=Y.query("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}finally{Y.close()}}}catch{}let Z=K>0?Math.round($/K*100):0;return{fts5:!0,sqliteVec:_.available,embeddedCount:$,totalMessages:K,coveragePercent:Z,defaultMode:G.search?.defaultMode??"auto",vectorReady:_.available&&$>0}}function IJ(A){if(!y$(A))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let G=U_(A),$=0;try{$=LJ(A).size}catch{}let K="unknown";if(G.readable)try{let Z=new s5(A,{create:!1,readonly:!0});try{K=o5(Z)}finally{Z.close()}}catch{K="corrupted"}return{exists:!0,readable:G.readable,writable:G.writable,integrity:K,size:$}}var J9,P$;var B9=U(()=>{S5();L_();WG();n5();t5();J9=["debug","info","warn","error"],P$=["unset","granted","denied"]});var Z2={};k(Z2,{runHealthCheck:()=>k$,initializeDatabaseSafe:()=>G4,initializeDatabase:()=>D,getDefaultDbPath:()=>S,createSchema:()=>V$,closeDatabase:()=>E,checkpointDatabase:()=>_4,checkSqliteVecAvailability:()=>G2,checkQuickIntegrity:()=>o5,checkProviderEgressHealth:()=>K2,checkHookStatus:()=>A2,checkFts5Support:()=>AG,checkEmbeddingConfig:()=>$2,checkDirectoryPermissions:()=>U_,checkDatabaseIntegrity:()=>X9,checkConfigValidity:()=>_2,checkCapabilityInteropHealth:()=>V9,bulkOperationCheckpoint:()=>N$,TOPICS_TABLE:()=>h6,TOOL_USES_TABLE:()=>y6,SqliteToolUseRepository:()=>X0,SqliteStatsService:()=>V0,SqliteSessionRepository:()=>m,SqliteProjectResolver:()=>w0,SqlitePersonaRepository:()=>SA,SqliteMessageRepository:()=>WA,SqliteMemoryUtilityRepository:()=>h0,SqliteMemoryGovernanceRepository:()=>s,SqliteLinkRepository:()=>J_,SqliteGraphRepository:()=>lA,SqliteFrictionRepository:()=>RA,SqliteExtractionStateRepository:()=>Q0,SqliteContextService:()=>v0,SqliteBackfillStateRepository:()=>KG,SESSIONS_TABLE:()=>D6,SCHEMA_SQL:()=>I5,PERSONA_ENTRIES_TABLE:()=>m6,MESSAGE_EMBEDDINGS_TABLE:()=>C6,MESSAGES_META_TABLE:()=>x6,MESSAGES_FTS_TABLE:()=>P6,MEMORY_UTILITY_METRICS_TABLE:()=>l6,MEMORY_GOVERNANCE_TABLE:()=>c6,MEMORY_GOVERNANCE_EVENTS_TABLE:()=>u6,LINKS_TABLE:()=>k6,HybridSearchService:()=>X_,GRAPH_EDGES_TABLE:()=>d6,Fts5SearchService:()=>Q_,FRICTION_LOG_TABLE:()=>f6,EmbeddingRepository:()=>dA,EXTRACTION_STATE_TABLE:()=>v6,EMBEDDING_STATE_TABLE:()=>w6,EMBEDDING_STATE_ADD_MODEL_NAME:()=>b6,BACKFILL_STATE_TABLE:()=>g6});var u=U(()=>{O5();S5();k5();R4();B9()});import{readdir as Y2,stat as zG}from"fs/promises";import{join as NG}from"path";import{homedir as OJ}from"os";class z0{claudeProjectsDir;resolver;constructor(A){this.claudeProjectsDir=A?.claudeDir??NG(OJ(),".claude","projects"),this.resolver=A?.projectNameResolver}async discoverSessions(){let A=[];try{await zG(this.claudeProjectsDir)}catch{return A}let _;try{_=await Y2(this.claudeProjectsDir)}catch{return A}for(let G of _){let $=NG(this.claudeProjectsDir,G);try{if(!(await zG($)).isDirectory())continue}catch{continue}let K;try{if(K=$A.fromEncoded(G),this.resolver){let Z=this.resolver.resolveFromEncodedPath(G);if(Z!==K.projectName)K=K.withProjectName(Z)}}catch{continue}await this.scanProjectDirectory($,K,A)}return A}async getSessionFile(A){return(await this.discoverSessions()).find(($)=>$.id===A)?.path??null}async scanProjectDirectory(A,_,G){let $;try{$=await Y2(A)}catch{return}for(let K of $){let Z=NG(A,K);try{let Y=await zG(Z);if(Y.isFile()&&K.endsWith(".jsonl")){let J=K.slice(0,-6);G.push({id:J,path:Z,projectPath:_,modifiedTime:Y.mtime,size:Y.size})}else if(Y.isDirectory())await this.scanSubagentsDirectory(Z,_,G)}catch{continue}}}async scanSubagentsDirectory(A,_,G){let $=NG(A,"subagents");try{if(!(await zG($)).isDirectory())return}catch{return}let K;try{K=await Y2($)}catch{return}for(let Z of K){if(!Z.endsWith(".jsonl"))continue;let Y=NG($,Z);try{let J=await zG(Y);if(J.isFile()){let H=Z.slice(0,-6);G.push({id:H,path:Y,projectPath:_,modifiedTime:J.mtime,size:J.size})}}catch{continue}}}}var W9=()=>{};import{readdirSync as jJ,statSync as RJ}from"fs";function FJ(A){return A.replace(/ /g,"-").replace(/-/g,"-")}class h${rootDir;cache=new Map;dirCache=new Map;constructor(A){this.rootDir=A}resolveFromEncodedPath(A){let _=/^[A-Za-z]--/,G=A;if(_.test(G))G=G.slice(3);else if(G.startsWith("-"))G=G.slice(1);return this.resolveProjectName(G)}resolveProjectName(A){let _=this.cache.get(A);if(_!==void 0)return _;let G=this.walkAndResolve(this.rootDir,A);return this.cache.set(A,G),G}walkAndResolve(A,_){if(_==="")return"";let G=this.listSubdirectories(A),$=[];for(let Z of G){let Y=FJ(Z);$.push({name:Z,encoded:Y})}$.sort((Z,Y)=>Y.encoded.length-Z.encoded.length);for(let Z of $){if(_===Z.encoded)return Z.name;if(_.startsWith(Z.encoded+"-")){let Y=_.slice(Z.encoded.length+1),J=`${A}/${Z.name}`,H=this.walkAndResolve(J,Y);if(H!==this.fallbackLastSegment(Y))return H;return H}}let K=this.probeHiddenDirectories(A,_);if(K!==void 0)return K;return this.fallbackLastSegment(_)}probeHiddenDirectories(A,_){let G=_.split("-");for(let $=1;$<G.length;$++){let K=G.slice(0,$).join("-"),Z=`${A}/${K}`;if(this.isDirectory(Z)){let Y=G.slice($).join("-");if(Y==="")return K;let J=this.walkAndResolve(Z,Y);if(J!==this.fallbackLastSegment(Y))return J}}return}isDirectory(A){try{return RJ(A).isDirectory()}catch{return!1}}listSubdirectories(A){let _=this.dirCache.get(A);if(_!==void 0)return _;try{let $=jJ(A,{withFileTypes:!0}).filter((K)=>K.isDirectory()).map((K)=>K.name);return this.dirCache.set(A,$),$}catch{return this.dirCache.set(A,[]),[]}}fallbackLastSegment(A){let _=A.split("-");return _[_.length-1]??""}}var z9=()=>{};import{readdir as SJ,readFile as EJ,stat as DJ}from"fs/promises";import{join as xJ,relative as PJ}from"path";import{createHash as yJ}from"crypto";class v${async discoverFiles(){let A=f_();try{await DJ(A)}catch{return[]}let _=[];return await this.scanDirectory(A,A,_),_}async scanDirectory(A,_,G){let $;try{$=await SJ(A,{withFileTypes:!0})}catch{return}for(let K of $){let Z=xJ(A,K.name);if(K.isDirectory())await this.scanDirectory(Z,_,G);else if(K.isFile()&&K.name.endsWith(".md")){let Y=PJ(_,Z).split("\\").join("/"),J=this.classifyFileType(Y);if(!J)continue;let H=await EJ(Z,"utf8"),Q=yJ("sha256").update(H,"utf8").digest("hex"),X=this.extractProjectEncoded(Y);G.push({filePath:Y,absolutePath:Z,fileType:J,projectEncoded:X,contentHash:Q,content:H})}}}classifyFileType(A){if(A.startsWith("daily/"))return"daily_log";if(A.endsWith("DECISIONS.md"))return"decisions";if(A.endsWith("LEARNINGS.md"))return"learnings";if(A.endsWith("USER-PREFS.md"))return"user_prefs";return null}extractProjectEncoded(A){return A.match(/^projects\/([^/]+)\//)?.[1]??void 0}}var N9=U(()=>{c()});var LG=U(()=>{W9();z9();N9()});function DA(A,_){let G=_??new Date,$=A.getTime()-G.getTime(),K=Math.abs($);if(K<3600000){let Y=Math.round($/60000);return MG.format(Y,"minute")}if(K<86400000){let Y=Math.round($/3600000);return MG.format(Y,"hour")}if(K<604800000){let Y=Math.round($/86400000);return MG.format(Y,"day")}if(K<2592000000){let Y=Math.round($/604800000);return MG.format(Y,"week")}let Z=Math.round($/2592000000);return MG.format(Z,"month")}function c0(A){let _=A.getFullYear(),G=String(A.getMonth()+1).padStart(2,"0"),$=String(A.getDate()).padStart(2,"0"),K=String(A.getHours()).padStart(2,"0"),Z=String(A.getMinutes()).padStart(2,"0");return`${_}-${G}-${$} ${K}:${Z}`}function vA(A,_){let G=DA(A,_),$=c0(A);return`${G} (${$})`}var MG;var N0=U(()=>{MG=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function v(A){let _=A?.noColor??!!process.env.NO_COLOR,G=A?.forceColor??!!process.env.FORCE_COLOR,$=A?.isTTY??process.stdout.isTTY===!0;if(_)return!1;if(G)return!0;return $}function O_(A,_,G){if(!G)return A;return`\x1B[${_}m${A}\x1B[0m`}function KA(A,_){return O_(A,"1",_??v())}function P(A,_){return O_(A,"2",_??v())}function C(A,_){return O_(A,"32",_??v())}function d(A,_){return O_(A,"31",_??v())}function l(A,_){return O_(A,"33",_??v())}function E9(A,_){return O_(A,"36",_??v())}import D9 from"string-width";function Q2(A){return D9(A)}function X2(A,_){if(_<=0)return"";if(Q2(A)<=_)return A;let G="...",$=3;if(_<=$)return".".repeat(_);let K=_-$,Z="",Y=0;for(let J of A){let H=D9(J);if(Y+H>K)break;Z+=J,Y+=H}return Z+G}function c$(A,_){let G=Q2(A);if(G>=_)return A;return A+" ".repeat(_-G)}function V2(){return process.stdout.columns||80}function B2(A,_,G=20){let $=V2(),K=Q2(_),Z=$-K;return X2(A,Z>G?Z:G)}var W2=()=>{};function u$(A,_={}){let G=h9(A.snippet),$=A.snippet.replace(/<\/?mark>/g,""),K={sessionId:A.sessionId,messageId:A.messageId,role:A.role,score:A.score,timestamp:A.timestamp.toISOString(),snippet:$};if(_.includeSearchMetaFields){if(_.rank!==void 0)K.rank=_.rank;let Z=A.rawScores;if(Z)K.raw_scores=Z;if(A.source)K.source=A.source;if(G.length>0)K.highlights=G}return K}function x9(A){let _={score:A.score,file:A.file,title:A.title};if(A.docid!==void 0)_.docid=A.docid;if(A.context!==void 0)_.context=A.context;if(A.snippet!==void 0)_.snippet=A.snippet;return _}function m$(A){let _={id:A.id,project:A.projectPath.projectName,projectPath:A.projectPath.decoded,startTime:A.startTime.toISOString()};if(A.endTime)_.endTime=A.endTime.toISOString();if(A.messageCount!==void 0)_.messageCount=A.messageCount;if(A.summary!==void 0)_.summary=A.summary;return _}function P9(A){return{session:m$(A.session),messages:A.messages.map(rJ),toolUses:Array.from(A.toolUses.values()).map(tJ)}}function rJ(A){return{id:A.id,role:A.role,timestamp:A.timestamp.toISOString(),content:A.content}}function tJ(A){let _={id:A.id,name:A.name,status:A.status,input:A.input};if(A.result!==void 0)_.result=A.result;return _}function y9(A){return{session:m$(A.session),weight:A.weight,hops:A.hops}}function z2(A){let _={totalSessions:A.totalSessions,totalMessages:A.totalMessages,totalToolUses:A.totalToolUses,databaseSizeBytes:A.databaseSizeBytes,projectBreakdown:A.projectBreakdown.map((G)=>({projectName:G.projectName,sessionCount:G.sessionCount,messageCount:G.messageCount}))};if(A.hooks)_.hooks={installed:A.hooks.installed,autoSync:A.hooks.autoSync,pendingSessions:A.hooks.pendingSessions};return _}function k9(A){return{projectName:A.projectName,projectPathDecoded:A.projectPathDecoded,sessionCount:A.sessionCount,totalMessages:A.totalMessages,userMessages:A.userMessages,assistantMessages:A.assistantMessages,recentTopics:[...A.recentTopics],recentToolUses:A.recentToolUses.map((_)=>({name:_.name,count:_.count})),lastActivity:A.lastActivity?A.lastActivity.toISOString():null}}var L0=U(()=>{d$()});function N2(A,_){switch(A){case"json":return new b9;case"quiet":return new f9;case"verbose":return new g9(_);case"brief":return new C9;default:return new w9(_)}}function h9(A){let _=[],G=0,$=0;while($<A.length)if(A.startsWith("<mark>",$)){$+=6;let K=A.indexOf("</mark>",$);if(K===-1)break;_.push({offset:G,length:K-$}),G+=K-$,$=K+7}else G++,$++;return _}function v9(A,_){if(!_)return A.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return A.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class w9{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??j_;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $=`Found ${A.length} result(s):
1206
1206
 
1207
1207
  `;for(let K=0;K<A.length;K++){let Z=A[K];if(!Z)continue;let Y=this.formatResult(Z,K+1);if($.length+Y.length>G){$+=`
1208
1208
  (Output truncated - ${j_.toLocaleString()} char limit)
@@ -1211,7 +1211,7 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1211
1211
  ${J}
1212
1212
 
1213
1213
  `}formatError(A){return`Error: ${L(A)}`}formatSummary(A){let _=`Found ${A.found} results (showing ${A.shown})`;if(A.truncated)_+=" - truncated";return _}}class C9{formatResults(A,_){if(A.length===0)return`No results for "${_?.query??""}"`;return A.map((G)=>{let $=G.snippet.replace(/<\/?mark>/g,"").replace(/\s+/g," ").trim().slice(0,80),K=Math.round(G.score*100);return`${G.sessionId} [${K}%] ${$}`}).join(`
1214
- `)}formatError(A){return`Error: ${L(A)}`}formatSummary(A){return""}}class b9{formatResults(A,_){let G=_?.contextBudget??j_,$=A.map((Z,Y)=>u1(Z,{rank:Y+1,includeSearchMetaFields:!!_?.searchMeta}));if(_?.searchMeta){let Z={query:_.query??"",mode:_.searchMeta.mode,mode_reason:_.searchMeta.modeReason,total_results:A.length,embedding_coverage:_.searchMeta.embeddingCoverage,degraded:_.searchMeta.degraded,capabilities:_.searchMeta.capabilities,timing_ms:_.searchMeta.timingMs};if(_.searchMeta.degradationReason)Z.degradation_reason=_.searchMeta.degradationReason;return JSON.stringify({meta:Z,results:$},null,2)}let K=JSON.stringify($,null,2);if(K.length>G){let Z=$.length;while(Z>0){let Y=$.slice(0,Z);if(K=JSON.stringify(Y,null,2),K.length<=G)break;Z--}}return K}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatSummary(A){return""}}class f9{formatResults(A,_){if(A.length===0)return"";let G=V2();return A.map(($)=>{let K=$.sessionId.substring(0,16),Z=$.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),Y=`${K} ${Z}`;return X2(Y,G)}).join(`
1214
+ `)}formatError(A){return`Error: ${L(A)}`}formatSummary(A){return""}}class b9{formatResults(A,_){let G=_?.contextBudget??j_,$=A.map((Z,Y)=>u$(Z,{rank:Y+1,includeSearchMetaFields:!!_?.searchMeta}));if(_?.searchMeta){let Z={query:_.query??"",mode:_.searchMeta.mode,mode_reason:_.searchMeta.modeReason,total_results:A.length,embedding_coverage:_.searchMeta.embeddingCoverage,degraded:_.searchMeta.degraded,capabilities:_.searchMeta.capabilities,timing_ms:_.searchMeta.timingMs};if(_.searchMeta.degradationReason)Z.degradation_reason=_.searchMeta.degradationReason;return JSON.stringify({meta:Z,results:$},null,2)}let K=JSON.stringify($,null,2);if(K.length>G){let Z=$.length;while(Z>0){let Y=$.slice(0,Z);if(K=JSON.stringify(Y,null,2),K.length<=G)break;Z--}}return K}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatSummary(A){return""}}class f9{formatResults(A,_){if(A.length===0)return"";let G=V2();return A.map(($)=>{let K=$.sessionId.substring(0,16),Z=$.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),Y=`${K} ${Z}`;return X2(Y,G)}).join(`
1215
1215
  `)}formatError(A){return`Error: ${L(A)}`}formatSummary(A){return""}}class g9{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??j_;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $="";if(_?.searchMeta){if($+=`Mode: ${_.searchMeta.mode}`,_.searchMeta.degraded)$+=` (degraded: ${_.searchMeta.degradationReason??"unknown"})`;$+=`
1216
1216
  `}if(_?.executionDetails){let K=_.executionDetails;if($+=`=== Execution Details ===
1217
1217
  `,K.timeMs!==void 0)$+=`Time: ${K.timeMs}ms
@@ -1230,18 +1230,18 @@ CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(
1230
1230
  `}return H+=`
1231
1231
  `,H}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1232
1232
  ${G??""}`}formatSummary(A){let _=`=== Summary ===
1233
- Found ${A.found} results (showing ${A.shown})`;if(A.truncated)_+=" - truncated due to context budget";return _}}var j_=50000;var d1=U(()=>{N0();W2();L0()});function L2(A,_){switch(A){case"json":return new m9;case"quiet":return new d9;case"verbose":return new l9(_);case"brief":return new u9;default:return new c9(_)}}function l1(A,_,G){return A===1?_:G}class c9{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G=A.length,$=`Sessions (${G} ${l1(G,"result","results")}):
1233
+ Found ${A.found} results (showing ${A.shown})`;if(A.truncated)_+=" - truncated due to context budget";return _}}var j_=50000;var d$=U(()=>{N0();W2();L0()});function L2(A,_){switch(A){case"json":return new m9;case"quiet":return new d9;case"verbose":return new l9(_);case"brief":return new u9;default:return new c9(_)}}function l$(A,_,G){return A===1?_:G}class c9{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G=A.length,$=`Sessions (${G} ${l$(G,"result","results")}):
1234
1234
 
1235
- `;for(let K of A)$+=this.formatSession(K);return $}formatSession(A){let _=A.id.substring(0,8),G=A.projectPath.projectName,$=DA(A.startTime),K=A.messageCount,Z=`${K} ${l1(K,"message","messages")}`,Y=c1(_,10),J=c1(G,20),H=c1($,18);return` ${Y}${J}${H}${P(Z,this.useColor)}
1235
+ `;for(let K of A)$+=this.formatSession(K);return $}formatSession(A){let _=A.id.substring(0,8),G=A.projectPath.projectName,$=DA(A.startTime),K=A.messageCount,Z=`${K} ${l$(K,"message","messages")}`,Y=c$(_,10),J=c$(G,20),H=c$($,18);return` ${Y}${J}${H}${P(Z,this.useColor)}
1236
1236
  `}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}class u9{formatSessions(A,_){if(A.length===0)return this.formatEmpty();return A.map((G)=>{let $=G.id.substring(0,8),K=G.projectPath.projectName,Z=G.messageCount,Y=DA(G.startTime);return`${$} ${K} ${Z} ${Y}`}).join(`
1237
1237
  `)}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return"No sessions found."}}class m9{formatSessions(A,_){let G=A.map(($)=>({id:$.id,projectPath:$.projectPath.decoded,projectName:$.projectPath.projectName,startTime:$.startTime.toISOString(),endTime:$.endTime?.toISOString()??null,messageCount:$.messageCount}));return JSON.stringify(G,null,2)}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatEmpty(){return"[]"}}class d9{formatSessions(A,_){if(A.length===0)return"";return A.map((G)=>G.id).join(`
1238
1238
  `)}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return""}}class l9{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G="";if(_){if(G+=`=== Execution Details ===
1239
1239
  `,_.executionTimeMs!==void 0)G+=`Time: ${_.executionTimeMs}ms
1240
1240
  `;if(_.filtersApplied&&_.filtersApplied.length>0)G+=`Filters: ${_.filtersApplied.join(", ")}
1241
1241
  `;G+=`
1242
- `}let $=A.length;G+=`Sessions (${$} ${l1($,"result","results")}):
1242
+ `}let $=A.length;G+=`Sessions (${$} ${l$($,"result","results")}):
1243
1243
 
1244
- `;for(let K of A)G+=this.formatSession(K);return G}formatSession(A){let _=A.projectPath.projectName,G=A.projectPath.decoded,$=vA(A.startTime),K=A.messageCount,Z=`${K} ${l1(K,"message","messages")}`,Y=` ${A.id}
1244
+ `;for(let K of A)G+=this.formatSession(K);return G}formatSession(A){let _=A.projectPath.projectName,G=A.projectPath.decoded,$=vA(A.startTime),K=A.messageCount,Z=`${K} ${l$(K,"message","messages")}`,Y=` ${A.id}
1245
1245
  `;return Y+=` Project: ${_} (${G})
1246
1246
  `,Y+=` Started: ${$}
1247
1247
  `,Y+=` ${P(Z,this.useColor)}
@@ -1298,7 +1298,7 @@ Hooks:
1298
1298
  `}return G}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1299
1299
  ${G??""}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}var T2=()=>{};function t9(A){return A.replace(eJ,"")}function _A(A){return t9(A).replace(/\n{3,}/g,`
1300
1300
 
1301
- `).trim()}var eJ;var nA=U(()=>{eJ=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?\x07|\x1b\(B/g});var _3={};k(_3,{createContextFormatter:()=>p1});function p1(A,_){switch(A){case"json":return new e9;case"quiet":return new s9;case"verbose":return new o9(_);case"detailed":return new O2(_);case"ai":return new A3;case"brief":case"default":default:return new I2(_)}}function M0(A){return new Intl.NumberFormat("en-US").format(A)}function sJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.map((Z)=>`${Z.name} (${Z.count})`).join(", ");if($>0)return`${K} (+${$} more)`;return K}function oJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.join(", ");if($>0)return`${K} (+${$} more)`;return K}class I2{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";G+=KA(`${A.projectName} Context`,this.useColor)+`
1301
+ `).trim()}var eJ;var nA=U(()=>{eJ=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?\x07|\x1b\(B/g});var _3={};k(_3,{createContextFormatter:()=>p$});function p$(A,_){switch(A){case"json":return new e9;case"quiet":return new s9;case"verbose":return new o9(_);case"detailed":return new O2(_);case"ai":return new A3;case"brief":case"default":default:return new I2(_)}}function M0(A){return new Intl.NumberFormat("en-US").format(A)}function sJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.map((Z)=>`${Z.name} (${Z.count})`).join(", ");if($>0)return`${K} (+${$} more)`;return K}function oJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.join(", ");if($>0)return`${K} (+${$} more)`;return K}class I2{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";G+=KA(`${A.projectName} Context`,this.useColor)+`
1302
1302
  `;let $=A.lastActivity?DA(A.lastActivity):"never";G+=`Sessions: ${M0(A.sessionCount)} | `,G+=`Messages: ${M0(A.totalMessages)} | `,G+=`Last active: ${$}
1303
1303
  `;let K=oJ(A.recentTopics);if(K)G+=`Topics: ${K}
1304
1304
  `;let Z=sJ(A.recentToolUses);if(Z)G+=`Tools: ${Z}
@@ -1333,7 +1333,7 @@ ${$.content}`;if($.truncated)K+=`
1333
1333
 
1334
1334
  `);if(A.truncated)G+=`
1335
1335
 
1336
- (budget: ~${A.totalTokensEstimate} tokens)`;return G.trim()}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return"No topics extracted yet"}}var n1=U(()=>{N0();nA()});function j2(A,_){switch(A){case"json":return new K3;case"quiet":return new Z3;case"verbose":return new Y3(_);case"detailed":return new R2(_);case"brief":case"default":default:return new $3(_)}}function G3(A,_){let G=`${Math.round(A*100)}%`;if(!_)return G;if(A>0.75)return C(G,_);if(A>=0.5)return l(G,_);return G}function AH(A){return A===1?"1 hop":`${A} hops`}function _H(A){return`${A===1?"1":`${A}`} (${A===1?"direct":"indirect"})`}class $3{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
1336
+ (budget: ~${A.totalTokensEstimate} tokens)`;return G.trim()}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return"No topics extracted yet"}}var n$=U(()=>{N0();nA()});function j2(A,_){switch(A){case"json":return new K3;case"quiet":return new Z3;case"verbose":return new Y3(_);case"detailed":return new R2(_);case"brief":case"default":default:return new $3(_)}}function G3(A,_){let G=`${Math.round(A*100)}%`;if(!_)return G;if(A>0.75)return C(G,_);if(A>=0.5)return l(G,_);return G}function AH(A){return A===1?"1 hop":`${A} hops`}function _H(A){return`${A===1?"1":`${A}`} (${A===1?"direct":"indirect"})`}class $3{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
1337
1337
  `;return A.forEach((K,Z)=>{let Y=K.session.projectPath.projectName,J=DA(K.session.startTime),H=G3(K.weight,this.useColor),Q=AH(K.hops);$+=`${Z+1}. ${Y} (${H}) - ${J} [${Q}]
1338
1338
  `}),$}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return`No relationships found for '${A}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class R2{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
1339
1339
  `;return $+="=".repeat(40)+`
@@ -1349,7 +1349,7 @@ ${$.content}`;if($.truncated)K+=`
1349
1349
  `,G+=`Time: ${_.executionTimeMs}ms
1350
1350
  `,G+=`
1351
1351
  `;return G+=this.detailed.formatRelated(A,_),G}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1352
- ${G??""}`}formatEmpty(A){return this.detailed.formatEmpty(A)}formatNoLinks(){return this.detailed.formatNoLinks()}}var F2=U(()=>{N0()});function a1(A,_){switch(A){case"json":return new X3;case"quiet":return new V3;case"verbose":return new B3(_);case"tools":return new i1(_);case"brief":return new H3;default:return new Q3(_)}}function S2(A){let _=A.replace(/\\/g,"/").split("/");return _[_.length-1]||A}function J3(A){switch(A.name){case"Read":{let _=A.input.file_path,G=A.result?A.result.split(`
1352
+ ${G??""}`}formatEmpty(A){return this.detailed.formatEmpty(A)}formatNoLinks(){return this.detailed.formatNoLinks()}}var F2=U(()=>{N0()});function a$(A,_){switch(A){case"json":return new X3;case"quiet":return new V3;case"verbose":return new B3(_);case"tools":return new i$(_);case"brief":return new H3;default:return new Q3(_)}}function S2(A){let _=A.replace(/\\/g,"/").split("/");return _[_.length-1]||A}function J3(A){switch(A.name){case"Read":{let _=A.input.file_path,G=A.result?A.result.split(`
1353
1353
  `).length:0;return`${S2(_)} -> ${G} lines`}case"Write":{let _=A.input.file_path;return S2(_)}case"Edit":{let _=A.input.file_path;return`${S2(_)} edited`}case"Bash":{if(!A.isSuccess)return"FAILED";let _=A.input.command.substring(0,20);return _.length<A.input.command.length?`${_}...`:_}case"Glob":return`${A.result?.split(`
1354
1354
  `).filter(Boolean).length??0} files`;case"Grep":return A.isSuccess?"matches":"no matches";default:return A.status}}function GH(A){let _=Math.floor(A/3600000),G=Math.floor(A%3600000/60000);if(_>0)return`${_}h ${G}m`;if(G>0)return`${G}m`;return"< 1m"}function E2(A,_){let{session:G,messages:$,toolUses:K}=A,Z=[];Z.push(`Session: ${G.id}`),Z.push(`Project: ${G.projectPath.projectName}`);let Y=c0(G.startTime),J=G.endTime?c0(G.endTime):"ongoing";if(Z.push(`Date: ${Y} - ${J}`),G.durationMs!==void 0)Z.push(`Duration: ${GH(G.durationMs)}`);else Z.push("Duration: ongoing");let H=K.size;return Z.push(`Messages: ${$.length} | Tools: ${H}`),Z.push("---"),Z.join(`
1355
1355
  `)}function D2(A,_,G,$){let K=A.role==="user"?KA("[USER]",G):KA("[ASSISTANT]",G),Z=c0(A.timestamp),Y=`${K} ${P(Z,G)}
@@ -1358,20 +1358,20 @@ ${J.join(" ")}`}return Y}class H3{formatSession(A,_){let{session:G,messages:$}=A
1358
1358
  `)}formatError(A){return`Error: ${L(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class X3{formatSession(A,_){let{session:G,messages:$,toolUses:K}=A,Z={session:{id:G.id,projectPath:G.projectPath.decoded,projectName:G.projectPath.projectName,startTime:G.startTime.toISOString(),endTime:G.endTime?.toISOString()??null,durationMs:G.durationMs??null},messages:$.map((Y)=>({id:Y.id,role:Y.role,content:Y.content,timestamp:Y.timestamp.toISOString(),toolUseIds:Y.toolUses})),toolUses:Object.fromEntries(Array.from(K.entries()).map(([Y,J])=>[Y,{id:J.id,name:J.name,input:J.input,timestamp:J.timestamp.toISOString(),status:J.status,result:J.result??null}]))};return JSON.stringify(Z,null,2)}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatNotFound(A){return JSON.stringify({error:`Session not found: ${A}`})}}class V3{formatSession(A,_){let G=[];for(let $ of A.messages){let K=$.role==="user"?"U:":"A:";G.push(`${K} ${$.content}`)}return G.join(`
1359
1359
  `)}formatError(A){return`Error: ${L(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class B3{useColor;constructor(A){this.useColor=A}formatSession(A,_){let G=[];if(_?.executionTimeMs!==void 0)G.push("=== Execution Details ==="),G.push(`Time: ${_.executionTimeMs}ms`),G.push("");G.push(E2(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(D2($,A.toolUses,this.useColor,!0)),$.role==="assistant"&&$.hasToolUses)for(let K of $.toolUses){let Z=A.toolUses.get(K);if(Z){if(G.push(""),G.push(` [TOOL: ${Z.name}]`),G.push(` Input: ${JSON.stringify(Z.input)}`),Z.result)G.push(` Result: ${Z.result}`);G.push(` Status: ${Z.status}`)}}G.push("")}return G.join(`
1360
1360
  `)}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1361
- ${G??""}`}formatNotFound(A){return`Session not found: ${A}`}}class i1{useColor;static RESULT_TRUNCATE_LENGTH=500;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(E2(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(D2($,A.toolUses,this.useColor,!1)),$.role==="assistant"&&$.hasToolUses)for(let K of $.toolUses){let Z=A.toolUses.get(K);if(Z){if(G.push(""),G.push(` [TOOL: ${Z.name}]`),G.push(` Input: ${JSON.stringify(Z.input)}`),Z.result){let Y=Z.result.length>i1.RESULT_TRUNCATE_LENGTH?Z.result.substring(0,i1.RESULT_TRUNCATE_LENGTH)+"...":Z.result;G.push(` Result: ${Y}`)}G.push(` Status: ${Z.status}`)}}G.push("")}return G.join(`
1361
+ ${G??""}`}formatNotFound(A){return`Session not found: ${A}`}}class i${useColor;static RESULT_TRUNCATE_LENGTH=500;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(E2(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(D2($,A.toolUses,this.useColor,!1)),$.role==="assistant"&&$.hasToolUses)for(let K of $.toolUses){let Z=A.toolUses.get(K);if(Z){if(G.push(""),G.push(` [TOOL: ${Z.name}]`),G.push(` Input: ${JSON.stringify(Z.input)}`),Z.result){let Y=Z.result.length>i$.RESULT_TRUNCATE_LENGTH?Z.result.substring(0,i$.RESULT_TRUNCATE_LENGTH)+"...":Z.result;G.push(` Result: ${Y}`)}G.push(` Status: ${Z.status}`)}}G.push("")}return G.join(`
1362
1362
  `)}formatError(A){return`Error: ${L(A)}`}formatNotFound(A){return`Session not found: ${A}`}}var x2=U(()=>{N0()});function W3(A){switch(A){case j.DB_CONNECTION_FAILED:return"Check database file permissions";case j.DB_CORRUPTED:return"Run 'memory doctor' to diagnose or recreate database";case j.DB_LOCKED:return"Wait and retry, or check for other running processes";case j.INVALID_SESSION_ID:return"Check session ID format (expected UUID)";case j.SESSION_NOT_FOUND:return"Run 'memory list' to see available sessions";case j.SOURCE_INACCESSIBLE:return"Check that ~/.claude/projects exists and is readable";case j.DISK_FULL:return"Free up disk space and retry";case j.INVALID_JSON:return"Check file for JSON syntax errors";case j.UNKNOWN_FORMAT:return"File may be incompatible with current version";case j.SYNC_INTERRUPTED:return"Run 'memory sync' again to resume";case j.SYNC_FAILED:return`Check logs at ${QA()} for details`;case j.INVALID_ARGUMENT:return"Run command with --help to see valid options";case j.MISSING_ARGUMENT:return"Run command with --help to see required arguments";case j.VECTOR_UNAVAILABLE:return"Run 'memory sync --embed' to generate embeddings, or use '--mode fts' for keyword-only search";case j.PROVIDER_TIMEOUT:return"Check network connection or switch to local provider in config";case j.PROVIDER_CONFIG_INVALID:return"Check embedding config in ~/.config/memory/config.json";case j.EMBEDDING_DIMENSION_MISMATCH:return"Run 'memory sync --embed' to re-embed with the current model";case j.MODEL_CORRUPTED:return"Delete cached model files and run 'memory sync --embed' to re-download";case j.NOT_FOUND:return"Check the ID and try again";case j.INVALID_STATE:return"The entity is not in a valid state for this operation";case j.UNKNOWN:default:return null}}function $H(A,_){if(typeof _==="string"||typeof _==="number")return` ${A}: ${_}`;return` ${A}: ${JSON.stringify(_)}`}function i(A,_={}){let G=_.useColor??v(),$=[];if(A instanceof F){let K=d(`Error [${A.code}]:`,G);if($.push(`${K} ${A.message}`),A.context&&Object.keys(A.context).length>0)for(let[Y,J]of Object.entries(A.context))$.push($H(Y,J));let Z=W3(A.code);if(Z)$.push(""),$.push(`Suggestion: ${Z}`)}else{let K=d("Error:",G);$.push(`${K} ${A.message}`)}if(_.verbose&&A.stack)$.push(""),$.push("Stack trace:"),$.push(A.stack);return $.join(`
1363
- `)}function qG(A){if(A instanceof F)return JSON.stringify(A.toJSON());let _={error:{code:"UNKNOWN",message:A.message}};return JSON.stringify(_)}var iA=U(()=>{z1();c()});function z3(A){return{schema_version:"1",command:A.command,kind:A.kind,...A.scope!==void 0?{scope:A.scope}:{},...A.meta!==void 0?{meta:A.meta}:{},data:A.data}}function N3(A){return{schema_version:"1",command:A.command,error:{code:A.code,message:A.message,...A.context!==void 0?{context:A.context}:{}}}}function e(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(z3({...A,command:_}),null,2))}function h(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(N3({...A,command:_}),null,2))}var zA=()=>{};var t1={};k(t1,{writeLock:()=>U3,spawnBackgroundEmbedding:()=>WH,removeLock:()=>r1,readLock:()=>v2,isProcessAlive:()=>w2,isBackgroundEmbedding:()=>NH,cleanupLock:()=>zH,acquireLock:()=>T3});import{spawn as HH}from"child_process";import{existsSync as QH,readFileSync as XH,writeFileSync as VH,unlinkSync as BH,mkdirSync as M3,openSync as L3}from"fs";import{join as q3}from"path";function h2(A){return q3(A??n(),"embedding.lock")}function U3(A,_){let G=h2(_),$=_??n();M3($,{recursive:!0}),VH(G,JSON.stringify(A))}function v2(A){let _=h2(A);if(!QH(_))return null;try{return JSON.parse(XH(_,"utf-8"))}catch{return null}}function r1(A){let _=h2(A);try{BH(_)}catch{}}function w2(A){try{return process.kill(A,0),!0}catch{return!1}}function T3(A,_,G){let $=v2(G);if($){if(w2($.pid))return{acquired:!1,existingPid:$.pid,startedAt:$.startedAt};r1(G)}return U3({pid:A,startedAt:new Date().toISOString(),totalMessages:_},G),{acquired:!0,staleRemoved:$!==null}}function WH(A){let{dataDir:_,logDir:G,command:$=process.execPath}=A??{},K=v2(_);if(K&&w2(K.pid))return{started:!1,reason:"already_running",pid:K.pid};if(K)r1(_);let Z=G??QA();M3(Z,{recursive:!0});let Y=q3(Z,"sync.log"),J=L3(Y,"a"),H=L3(Y,"a"),X=[process.argv[1]??"","sync","--embed","--quiet"],V=HH($,X,{detached:!0,stdio:["ignore",J,H],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(V.unref(),V.pid===void 0)return{started:!1,reason:"spawn_failed"};let B=T3(V.pid,0,_);if(!B.acquired)return{started:!1,reason:"already_running",pid:B.existingPid};return{started:!0,pid:V.pid}}function zH(A){r1(A)}function NH(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var e1=U(()=>{c()});var b2={};k(b2,{EmbeddingProviderFactory:()=>s1});import{createHash as MH}from"crypto";class s1{cache=new Map;cacheKey(A,_){let G=A.apiKey?MH("sha256").update(A.apiKey).digest("hex").slice(0,16):"";return[A.provider,A.model,String(A.dimensions),A.baseUrl??"",A.apiKeyEnv??"",A.apiKeyRef??"",G,_.consent,_.allowedHosts.join(","),_.allowedProviders.join(",")].join(":")}create(A,_=o){let G=this.cacheKey(A,_),$=this.cache.get(G);if($)return $;let K=A9(A,_);return this.cache.set(G,K),K}createFromConfig(A){let _=A.embedding??B_;if(!_.enabled)return null;return this.create(_,A.providerEgress??o)}async dispose(){for(let A of this.cache.values())await A.dispose();this.cache.clear()}}var o1=U(()=>{JA();WG()});var v3={};k(v3,{mergeMemoryBlock:()=>k3,AutoMemoryWriter:()=>h3});import{existsSync as qH,mkdirSync as P3,readFileSync as UH,writeFileSync as c2}from"fs";import{join as y3}from"path";function k3(A,_){let G=`${u2}
1363
+ `)}function qG(A){if(A instanceof F)return JSON.stringify(A.toJSON());let _={error:{code:"UNKNOWN",message:A.message}};return JSON.stringify(_)}var iA=U(()=>{z$();c()});function z3(A){return{schema_version:"1",command:A.command,kind:A.kind,...A.scope!==void 0?{scope:A.scope}:{},...A.meta!==void 0?{meta:A.meta}:{},data:A.data}}function N3(A){return{schema_version:"1",command:A.command,error:{code:A.code,message:A.message,...A.context!==void 0?{context:A.context}:{}}}}function e(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(z3({...A,command:_}),null,2))}function h(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(N3({...A,command:_}),null,2))}var zA=()=>{};var t$={};k(t$,{writeLock:()=>U3,spawnBackgroundEmbedding:()=>WH,removeLock:()=>r$,readLock:()=>v2,isProcessAlive:()=>w2,isBackgroundEmbedding:()=>NH,cleanupLock:()=>zH,acquireLock:()=>T3});import{spawn as HH}from"child_process";import{existsSync as QH,readFileSync as XH,writeFileSync as VH,unlinkSync as BH,mkdirSync as M3,openSync as L3}from"fs";import{join as q3}from"path";function h2(A){return q3(A??n(),"embedding.lock")}function U3(A,_){let G=h2(_),$=_??n();M3($,{recursive:!0}),VH(G,JSON.stringify(A))}function v2(A){let _=h2(A);if(!QH(_))return null;try{return JSON.parse(XH(_,"utf-8"))}catch{return null}}function r$(A){let _=h2(A);try{BH(_)}catch{}}function w2(A){try{return process.kill(A,0),!0}catch{return!1}}function T3(A,_,G){let $=v2(G);if($){if(w2($.pid))return{acquired:!1,existingPid:$.pid,startedAt:$.startedAt};r$(G)}return U3({pid:A,startedAt:new Date().toISOString(),totalMessages:_},G),{acquired:!0,staleRemoved:$!==null}}function WH(A){let{dataDir:_,logDir:G,command:$=process.execPath}=A??{},K=v2(_);if(K&&w2(K.pid))return{started:!1,reason:"already_running",pid:K.pid};if(K)r$(_);let Z=G??QA();M3(Z,{recursive:!0});let Y=q3(Z,"sync.log"),J=L3(Y,"a"),H=L3(Y,"a"),X=[process.argv[1]??"","sync","--embed","--quiet"],V=HH($,X,{detached:!0,stdio:["ignore",J,H],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(V.unref(),V.pid===void 0)return{started:!1,reason:"spawn_failed"};let B=T3(V.pid,0,_);if(!B.acquired)return{started:!1,reason:"already_running",pid:B.existingPid};return{started:!0,pid:V.pid}}function zH(A){r$(A)}function NH(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var e$=U(()=>{c()});var b2={};k(b2,{EmbeddingProviderFactory:()=>s$});import{createHash as MH}from"crypto";class s${cache=new Map;cacheKey(A,_){let G=A.apiKey?MH("sha256").update(A.apiKey).digest("hex").slice(0,16):"";return[A.provider,A.model,String(A.dimensions),A.baseUrl??"",A.apiKeyEnv??"",A.apiKeyRef??"",G,_.consent,_.allowedHosts.join(","),_.allowedProviders.join(",")].join(":")}create(A,_=o){let G=this.cacheKey(A,_),$=this.cache.get(G);if($)return $;let K=A9(A,_);return this.cache.set(G,K),K}createFromConfig(A){let _=A.embedding??B_;if(!_.enabled)return null;return this.create(_,A.providerEgress??o)}async dispose(){for(let A of this.cache.values())await A.dispose();this.cache.clear()}}var o$=U(()=>{JA();WG()});var v3={};k(v3,{mergeMemoryBlock:()=>k3,AutoMemoryWriter:()=>h3});import{existsSync as qH,mkdirSync as P3,readFileSync as UH,writeFileSync as c2}from"fs";import{join as y3}from"path";function k3(A,_){let G=`${u2}
1364
1364
  ${_}
1365
- ${A$}
1366
- `;if(A.length===0)return G;let $=A.indexOf(u2),K=A.indexOf(A$);if($!==-1&&K!==-1){let Y=A.substring(0,$),J=A.substring(K+A$.length);return`${Y}${G}${J}`}let Z=A.endsWith(`
1365
+ ${A1}
1366
+ `;if(A.length===0)return G;let $=A.indexOf(u2),K=A.indexOf(A1);if($!==-1&&K!==-1){let Y=A.substring(0,$),J=A.substring(K+A1.length);return`${Y}${G}${J}`}let Z=A.endsWith(`
1367
1367
  `)?`
1368
1368
  `:`
1369
1369
 
1370
1370
  `;return`${A}${Z}${G}`}class h3{async writeContextFile(A,_){P3(A,{recursive:!0}),c2(y3(A,"context.md"),_,"utf-8")}async updateMemoryBlock(A,_){P3(A,{recursive:!0});let G=y3(A,"MEMORY.md"),$=`${u2}
1371
1371
  ${_}
1372
- ${A$}
1373
- `;if(!qH(G)){c2(G,$,"utf-8");return}let K=UH(G,"utf-8"),Z=k3(K,_);c2(G,Z,"utf-8")}}var u2="<!-- memory-cli:start -->",A$="<!-- memory-cli:end -->";var w3=()=>{};var c3={};k(c3,{sanitizeGitEnvironment:()=>b3,runGitCommand:()=>f3,GitRemoteEventTransport:()=>g3});import{createHash as IH}from"crypto";import{existsSync as OH,mkdirSync as jH,readFileSync as RH}from"fs";import{basename as FH,join as C3}from"path";var{spawn:SH}=globalThis.Bun;function b3(A=process.env){let _={};for(let G of EH){let $=A[G];if($!==void 0)_[G]=$}return _.GIT_TERMINAL_PROMPT="0",_.GIT_PAGER="cat",_.GIT_OPTIONAL_LOCKS="0",_}async function f3(A,_,G={}){let $=SH(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:b3(G.env)}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}class g3{eventsDir;runGit;deps;constructor(A,_={}){this.eventsDir=A;let G=_.env??process.env;this.runGit=_.runGit??(($,K)=>f3($,K,{env:G})),this.deps={existsSync:OH,mkdirSync:jH,readFileSync:RH,getAllLogFiles:UA,..._}}async isRepository(){return this.deps.existsSync(C3(this.eventsDir,".git"))}async initRepository(A){this.deps.mkdirSync(this.eventsDir,{recursive:!0});let _=await this.runGit(["init"],this.eventsDir);if(!_.success)return NA(_,"Failed to initialize Git repository in events directory");let G=await this.runGit(["config","user.name",A.userName],this.eventsDir);if(!G.success)return NA(G,"Failed to configure Git user.name");let $=await this.runGit(["config","user.email",A.userEmail],this.eventsDir);if(!$.success)return NA($,"Failed to configure Git user.email");let K=await this.runGit(["symbolic-ref","HEAD","refs/heads/main"],this.eventsDir);if(!K.success)return NA(K,"Failed to configure Git main branch");return{success:!0}}async getRemoteUrl(){let A=await this.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async setRemoteUrl(A){await this.runGit(["remote","remove","origin"],this.eventsDir);let _=await this.runGit(["remote","add","origin",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Failed to configure Git remote repository URL")}async listEventLogFingerprints(){let A={},_=this.deps.getAllLogFiles(this.eventsDir).sort();for(let G of _)if(this.deps.existsSync(G))A[FH(G)]=DH(this.deps.readFileSync(G,"utf-8"));return A}async hasEventLog(A){return this.deps.existsSync(C3(this.eventsDir,`events-${A}.jsonl`))}async commitEventLog(A,_){let G=`events-${A}.jsonl`;if(!await this.hasEventLog(A))return{success:!0,skipped:!0};let $=await this.runGit(["add","--",G],this.eventsDir);if(!$.success)return NA($,"Git add failed");let K=await this.runGit(["diff","--cached","--quiet","--",G],this.eventsDir);if(K.success)return{success:!0,skipped:!0};if(K.exitCode!==1)return NA(K,"Git diff failed");let Z=await this.runGit(["commit","--no-gpg-sign","-m",_,"--",G],this.eventsDir);return Z.success?{success:!0}:NA(Z,"Git commit failed")}async fetch(A){let _=await this.runGit(["fetch","--prune",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Git fetch failed")}async hasRemoteRef(A,_){return(await this.runGit(["rev-parse","--verify",`refs/remotes/${A}/${_}`],this.eventsDir)).success}async pullRebase(A,_){let G=await this.runGit(["pull","--rebase",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git pull failed")}async abortRebase(){let A=await this.runGit(["rebase","--abort"],this.eventsDir);if(A.success||A.stderr.includes("No rebase in progress"))return{success:!0};return NA(A,"Git rebase abort failed")}async push(A,_){let G=await this.runGit(["push","-u",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git push failed")}}function NA(A,_){return{success:!1,error:A.stderr||A.stdout||_}}function DH(A){return IH("sha256").update(A).digest("hex")}var EH;var u3=U(()=>{c();EH=new Set(["PATH","Path","HOME","USERPROFILE","XDG_CONFIG_HOME","SSH_AUTH_SOCK","TEMP","TMP","TMPDIR","SystemRoot","WINDIR"])});var t3={};k(t3,{rebuildProjectionsWithReport:()=>d3,rebuildProjections:()=>l2,readMemoryEventsWithReport:()=>CH,readMemoryEvents:()=>wH,readEvents:()=>bH,appendMemoryEvent:()=>_$,appendEvent:()=>UG});import{appendFile as xH,mkdir as PH}from"fs/promises";import{basename as yH,dirname as kH}from"path";import{existsSync as hH,createReadStream as vH}from"fs";import*as m3 from"readline";async function UG(A,_){await _$(cH(A,aH(_)),_)}async function _$(A,_){let G=iH(_);await PH(kH(G),{recursive:!0}),await xH(G,`${JSON.stringify(A.toJSON())}
1374
- `,"utf-8")}async function*wH(A,_){let G=await G$(A,_,{reportInvalidToConsole:!1});for(let $ of G.events)yield $}async function CH(A,_){return G$(A,_,{reportInvalidToConsole:!1})}async function*bH(A,_){let G=await G$(A,_,{reportInvalidToConsole:!0});for(let $ of G.events)try{yield $$($)}catch(K){console.error("Skipping malformed event log line:",K)}}async function l2(A,_,G){await d3(A,_,G)}async function d3(A,_,G){let $=await G$(_,G,{reportInvalidToConsole:!1}),K=p3($.events),Y=await new aG([dH(),pH(),nH(),lH()]).replay(K,{db:A});return{invalidEvents:$.invalidEvents.length,invalidEventLines:$.invalidEvents,replay:Y}}async function G$(A,_,G){let $=A?[A]:UA(_),K=[],Z=[];for(let Y of $){let J=await fH(Y,G);K.push(...J.events),Z.push(...J.invalidEvents)}return{events:A?K:p3(K),invalidEvents:Z}}async function fH(A,_){let G=[],$=[];if(!hH(A))return{events:G,invalidEvents:$};let K=vH(A,"utf-8"),Z=m3.createInterface({input:K,crlfDelay:1/0}),Y=0;for await(let J of Z){if(Y+=1,!J.trim())continue;try{let H=JSON.parse(J);G.push(gH(H,A,Y))}catch(H){let Q={filePath:A,lineNumber:Y,line:J,reason:H instanceof Error?H.message:String(H)};if($.push(Q),_.reportInvalidToConsole)console.error("Skipping malformed event log line:",H)}}return{events:G,invalidEvents:$}}function gH(A,_,G){if(m0(A)&&A.schemaVersion===2)return BA.fromJSON(A);return uH(A,_,G)}function cH(A,_){let G=a3(A.metadata);return BA.create({eventId:A.uuid,machineId:_,sequence:A.id??eH(A.observedAt),kind:A.type,operation:A.type==="supersedence"?"supersede":"add",occurredAt:A.observedAt,observedAt:A.observedAt,scope:{project:A.project,visibility:"project"},provenance:{source:"memory-fact",actor:"memory",method:"appendEvent",sourceIds:[A.uuid]},privacy:G,consent:{status:"not_required",scopes:[]},causality:i3(A),payload:{fact:n3(A)}})}function uH(A,_,G){if(!m0(A))throw Error("Legacy event record must be an object");let $=mH(A);return BA.create({eventId:$.uuid,machineId:l3(_),sequence:tH(A,G),kind:$.type,operation:$.type==="supersedence"?"supersede":"add",occurredAt:$.observedAt,observedAt:$.observedAt,scope:{project:$.project,visibility:"project"},provenance:{source:"legacy-event-log",actor:"memory",method:"v1-jsonl-adapter",sourceIds:[$.uuid]},privacy:a3($.metadata),consent:{status:"not_required",scopes:[]},causality:i3($),payload:{fact:n3($)}})}function mH(A){let _=u0(A,"uuid"),G=u0(A,"type"),$=u0(A,"project"),K=u0(A,"content"),Z=sH(A,"observedAt"),Y=oH(A,"supersededAt"),J=typeof A.supersededBy==="string"?A.supersededBy:null,H=m0(A.metadata)?r3(A.metadata):void 0;if(!_.trim())throw Error("Legacy event uuid is required");return YA.create({uuid:_,type:G,project:$,content:K,metadata:H,observedAt:Z,supersededAt:Y,supersededBy:J})}function $$(A){let _=A.payload.fact;if(!m0(_))throw Error(`Memory event ${A.eventId} does not contain a fact payload`);let G={uuid:u0(_,"uuid"),type:typeof _.type==="string"?_.type:A.kind,project:typeof _.project==="string"?_.project:A.scope.project??"",content:u0(_,"content"),metadata:m0(_.metadata)?r3(_.metadata):void 0,observedAt:typeof _.observedAt==="string"?new Date(_.observedAt):A.observedAt,supersededAt:typeof _.supersededAt==="string"?new Date(_.supersededAt):null,supersededBy:typeof _.supersededBy==="string"?_.supersededBy:null},$=YA.create(G);return typeof _.id==="number"?$.withId(_.id):$}function dH(){let A=(_,G)=>{_.prepare(`
1372
+ ${A1}
1373
+ `;if(!qH(G)){c2(G,$,"utf-8");return}let K=UH(G,"utf-8"),Z=k3(K,_);c2(G,Z,"utf-8")}}var u2="<!-- memory-cli:start -->",A1="<!-- memory-cli:end -->";var w3=()=>{};var c3={};k(c3,{sanitizeGitEnvironment:()=>b3,runGitCommand:()=>f3,GitRemoteEventTransport:()=>g3});import{createHash as IH}from"crypto";import{existsSync as OH,mkdirSync as jH,readFileSync as RH}from"fs";import{basename as FH,join as C3}from"path";var{spawn:SH}=globalThis.Bun;function b3(A=process.env){let _={};for(let G of EH){let $=A[G];if($!==void 0)_[G]=$}return _.GIT_TERMINAL_PROMPT="0",_.GIT_PAGER="cat",_.GIT_OPTIONAL_LOCKS="0",_}async function f3(A,_,G={}){let $=SH(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:b3(G.env)}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}class g3{eventsDir;runGit;deps;constructor(A,_={}){this.eventsDir=A;let G=_.env??process.env;this.runGit=_.runGit??(($,K)=>f3($,K,{env:G})),this.deps={existsSync:OH,mkdirSync:jH,readFileSync:RH,getAllLogFiles:UA,..._}}async isRepository(){return this.deps.existsSync(C3(this.eventsDir,".git"))}async initRepository(A){this.deps.mkdirSync(this.eventsDir,{recursive:!0});let _=await this.runGit(["init"],this.eventsDir);if(!_.success)return NA(_,"Failed to initialize Git repository in events directory");let G=await this.runGit(["config","user.name",A.userName],this.eventsDir);if(!G.success)return NA(G,"Failed to configure Git user.name");let $=await this.runGit(["config","user.email",A.userEmail],this.eventsDir);if(!$.success)return NA($,"Failed to configure Git user.email");let K=await this.runGit(["symbolic-ref","HEAD","refs/heads/main"],this.eventsDir);if(!K.success)return NA(K,"Failed to configure Git main branch");return{success:!0}}async getRemoteUrl(){let A=await this.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async setRemoteUrl(A){await this.runGit(["remote","remove","origin"],this.eventsDir);let _=await this.runGit(["remote","add","origin",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Failed to configure Git remote repository URL")}async listEventLogFingerprints(){let A={},_=this.deps.getAllLogFiles(this.eventsDir).sort();for(let G of _)if(this.deps.existsSync(G))A[FH(G)]=DH(this.deps.readFileSync(G,"utf-8"));return A}async hasEventLog(A){return this.deps.existsSync(C3(this.eventsDir,`events-${A}.jsonl`))}async commitEventLog(A,_){let G=`events-${A}.jsonl`;if(!await this.hasEventLog(A))return{success:!0,skipped:!0};let $=await this.runGit(["add","--",G],this.eventsDir);if(!$.success)return NA($,"Git add failed");let K=await this.runGit(["diff","--cached","--quiet","--",G],this.eventsDir);if(K.success)return{success:!0,skipped:!0};if(K.exitCode!==1)return NA(K,"Git diff failed");let Z=await this.runGit(["commit","--no-gpg-sign","-m",_,"--",G],this.eventsDir);return Z.success?{success:!0}:NA(Z,"Git commit failed")}async fetch(A){let _=await this.runGit(["fetch","--prune",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Git fetch failed")}async hasRemoteRef(A,_){return(await this.runGit(["rev-parse","--verify",`refs/remotes/${A}/${_}`],this.eventsDir)).success}async pullRebase(A,_){let G=await this.runGit(["pull","--rebase",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git pull failed")}async abortRebase(){let A=await this.runGit(["rebase","--abort"],this.eventsDir);if(A.success||A.stderr.includes("No rebase in progress"))return{success:!0};return NA(A,"Git rebase abort failed")}async push(A,_){let G=await this.runGit(["push","-u",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git push failed")}}function NA(A,_){return{success:!1,error:A.stderr||A.stdout||_}}function DH(A){return IH("sha256").update(A).digest("hex")}var EH;var u3=U(()=>{c();EH=new Set(["PATH","Path","HOME","USERPROFILE","XDG_CONFIG_HOME","SSH_AUTH_SOCK","TEMP","TMP","TMPDIR","SystemRoot","WINDIR"])});var t3={};k(t3,{rebuildProjectionsWithReport:()=>d3,rebuildProjections:()=>l2,readMemoryEventsWithReport:()=>CH,readMemoryEvents:()=>wH,readEvents:()=>bH,appendMemoryEvent:()=>_1,appendEvent:()=>UG});import{appendFile as xH,mkdir as PH}from"fs/promises";import{basename as yH,dirname as kH}from"path";import{existsSync as hH,createReadStream as vH}from"fs";import*as m3 from"readline";async function UG(A,_){await _1(cH(A,aH(_)),_)}async function _1(A,_){let G=iH(_);await PH(kH(G),{recursive:!0}),await xH(G,`${JSON.stringify(A.toJSON())}
1374
+ `,"utf-8")}async function*wH(A,_){let G=await G1(A,_,{reportInvalidToConsole:!1});for(let $ of G.events)yield $}async function CH(A,_){return G1(A,_,{reportInvalidToConsole:!1})}async function*bH(A,_){let G=await G1(A,_,{reportInvalidToConsole:!0});for(let $ of G.events)try{yield $1($)}catch(K){console.error("Skipping malformed event log line:",K)}}async function l2(A,_,G){await d3(A,_,G)}async function d3(A,_,G){let $=await G1(_,G,{reportInvalidToConsole:!1}),K=p3($.events),Y=await new aG([dH(),pH(),nH(),lH()]).replay(K,{db:A});return{invalidEvents:$.invalidEvents.length,invalidEventLines:$.invalidEvents,replay:Y}}async function G1(A,_,G){let $=A?[A]:UA(_),K=[],Z=[];for(let Y of $){let J=await fH(Y,G);K.push(...J.events),Z.push(...J.invalidEvents)}return{events:A?K:p3(K),invalidEvents:Z}}async function fH(A,_){let G=[],$=[];if(!hH(A))return{events:G,invalidEvents:$};let K=vH(A,"utf-8"),Z=m3.createInterface({input:K,crlfDelay:1/0}),Y=0;for await(let J of Z){if(Y+=1,!J.trim())continue;try{let H=JSON.parse(J);G.push(gH(H,A,Y))}catch(H){let Q={filePath:A,lineNumber:Y,line:J,reason:H instanceof Error?H.message:String(H)};if($.push(Q),_.reportInvalidToConsole)console.error("Skipping malformed event log line:",H)}}return{events:G,invalidEvents:$}}function gH(A,_,G){if(m0(A)&&A.schemaVersion===2)return BA.fromJSON(A);return uH(A,_,G)}function cH(A,_){let G=a3(A.metadata);return BA.create({eventId:A.uuid,machineId:_,sequence:A.id??eH(A.observedAt),kind:A.type,operation:A.type==="supersedence"?"supersede":"add",occurredAt:A.observedAt,observedAt:A.observedAt,scope:{project:A.project,visibility:"project"},provenance:{source:"memory-fact",actor:"memory",method:"appendEvent",sourceIds:[A.uuid]},privacy:G,consent:{status:"not_required",scopes:[]},causality:i3(A),payload:{fact:n3(A)}})}function uH(A,_,G){if(!m0(A))throw Error("Legacy event record must be an object");let $=mH(A);return BA.create({eventId:$.uuid,machineId:l3(_),sequence:tH(A,G),kind:$.type,operation:$.type==="supersedence"?"supersede":"add",occurredAt:$.observedAt,observedAt:$.observedAt,scope:{project:$.project,visibility:"project"},provenance:{source:"legacy-event-log",actor:"memory",method:"v1-jsonl-adapter",sourceIds:[$.uuid]},privacy:a3($.metadata),consent:{status:"not_required",scopes:[]},causality:i3($),payload:{fact:n3($)}})}function mH(A){let _=u0(A,"uuid"),G=u0(A,"type"),$=u0(A,"project"),K=u0(A,"content"),Z=sH(A,"observedAt"),Y=oH(A,"supersededAt"),J=typeof A.supersededBy==="string"?A.supersededBy:null,H=m0(A.metadata)?r3(A.metadata):void 0;if(!_.trim())throw Error("Legacy event uuid is required");return YA.create({uuid:_,type:G,project:$,content:K,metadata:H,observedAt:Z,supersededAt:Y,supersededBy:J})}function $1(A){let _=A.payload.fact;if(!m0(_))throw Error(`Memory event ${A.eventId} does not contain a fact payload`);let G={uuid:u0(_,"uuid"),type:typeof _.type==="string"?_.type:A.kind,project:typeof _.project==="string"?_.project:A.scope.project??"",content:u0(_,"content"),metadata:m0(_.metadata)?r3(_.metadata):void 0,observedAt:typeof _.observedAt==="string"?new Date(_.observedAt):A.observedAt,supersededAt:typeof _.supersededAt==="string"?new Date(_.supersededAt):null,supersededBy:typeof _.supersededBy==="string"?_.supersededBy:null},$=YA.create(G);return typeof _.id==="number"?$.withId(_.id):$}function dH(){let A=(_,G)=>{_.prepare(`
1375
1375
  INSERT INTO facts (
1376
1376
  uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
1377
1377
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
@@ -1384,15 +1384,15 @@ ${A$}
1384
1384
  superseded_at = excluded.superseded_at,
1385
1385
  superseded_by = excluded.superseded_by,
1386
1386
  updated_at = datetime('now')
1387
- `).run(G.uuid,G.type,G.project,G.content,G.metadata?JSON.stringify(G.metadata):null,G.observedAt.toISOString(),G.supersededAt?G.supersededAt.toISOString():null,G.supersededBy)};return{name:"facts",consumedKinds:d2,reset:(_)=>{_.db.run("DELETE FROM facts;")},apply:async(_,G)=>{let $=$$(_);A(G.db,$);let K=new s(G.db);if(!await K.findByTarget("fact",$.uuid))await K.save(T1(_,$.uuid,$.project));if($.type==="supersedence"){let Y=$.metadata?.superseded_uuid,J=$.metadata?.superseded_by_uuid;if(typeof Y==="string"&&typeof J==="string")G.db.prepare(`
1387
+ `).run(G.uuid,G.type,G.project,G.content,G.metadata?JSON.stringify(G.metadata):null,G.observedAt.toISOString(),G.supersededAt?G.supersededAt.toISOString():null,G.supersededBy)};return{name:"facts",consumedKinds:d2,reset:(_)=>{_.db.run("DELETE FROM facts;")},apply:async(_,G)=>{let $=$1(_);A(G.db,$);let K=new s(G.db);if(!await K.findByTarget("fact",$.uuid))await K.save(T$(_,$.uuid,$.project));if($.type==="supersedence"){let Y=$.metadata?.superseded_uuid,J=$.metadata?.superseded_by_uuid;if(typeof Y==="string"&&typeof J==="string")G.db.prepare(`
1388
1388
  UPDATE facts
1389
1389
  SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
1390
1390
  WHERE uuid = ?
1391
- `).run($.observedAt.toISOString(),J,Y)}}}}function lH(){return{name:"memory_governance",consumedKinds:["governance","consent"],reset:(A)=>{A.db.run("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")},apply:async(A,_)=>{await new s(_.db).applyMemoryEvent(A)}}}function pH(){return{name:"persona",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM persona_entries;")},apply:async(A,_)=>{let G=$$(A),$=$5(G,A.observedAt);if(!$)return!1;let Z=await new SA(_.db).save($),Y=new s(_.db);if(!await Y.findByTarget("persona",Z.entryId))await Y.save(GA.create({surface:"persona",targetId:Z.entryId,project:Z.project,visibility:Z.visibility,sourceEventIds:Z.sourceEventIds,transformationMethod:"persona-event-projection",actor:"memory",confidence:Z.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:Z.scope,status:"active",createdAt:Z.createdAt,updatedAt:Z.updatedAt,expiresAt:Z.expiresAt,lastEventId:A.eventId}));return!0}}}function nH(){return{name:"graph",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM graph_edges;")},apply:async(A,_)=>{let G=$$(A),$=Z5(G,A.observedAt);if($.length===0)return!1;let Z=await new lA(_.db).saveMany($),Y=new s(_.db);for(let J of Z)if(!await Y.findByTarget("graph",J.edgeId))await Y.save(Y5(J,"graph-event-projection"));return!0}}}function iH(A){if(A)return A;let _=f();return y$(_.machineId)}function aH(A){if(A){let _=l3(A);return _==="legacy"?"local":_}try{let _=f();if(_.machineId&&_.machineId.trim())return _.machineId}catch{}return"local"}function l3(A){let _=yH(A),G=/^events-(.+)\.jsonl$/.exec(_);return G?.[1]&&G[1].trim()?G[1]:"legacy"}function p3(A){return[...A].sort((_,G)=>{let $=_.observedAt.getTime()-G.observedAt.getTime();if($!==0)return $;let K=_.sequence-G.sequence;if(K!==0)return K;let Z=_.eventId.localeCompare(G.eventId);if(Z!==0)return Z;return _.machineId.localeCompare(G.machineId)})}function n3(A){let _={uuid:A.uuid,type:A.type,project:A.project,content:A.content,observedAt:A.observedAt.toISOString(),supersededAt:A.supersededAt?A.supersededAt.toISOString():null,supersededBy:A.supersededBy};if(A.id!==void 0)_.id=A.id;if(A.metadata!==void 0)_.metadata=A.metadata;return _}function i3(A){let _=A.metadata,G=_?.superseded_uuid,$=_?.superseded_by_uuid;return{parentEventIds:[],supersedesEventIds:typeof G==="string"?[G]:[],relatedEventIds:typeof $==="string"?[$]:[]}}function a3(A){let _=m0(A?.redaction)?A.redaction:void 0,G=m0(A?.privacy)?A.privacy:void 0,$=A?.redactionState??_?.state??G?.redactionState??"none",K=A?.redactedFields??_?.fields??G?.redactedFields;return{redactionState:rH($),containsSensitiveContent:Boolean(A?.containsSensitiveContent??G?.containsSensitiveContent??!1),policy:typeof _?.policy==="string"?_.policy:void 0,redactedFields:Array.isArray(K)?K.map((Z)=>String(Z)):void 0}}function rH(A){if(A==="redacted"||A==="quarantined")return A;return"none"}function tH(A,_){if(typeof A.sequence==="number"&&Number.isSafeInteger(A.sequence)&&A.sequence>0)return A.sequence;return _}function eH(A){return Math.max(1,Math.floor(A.getTime()))}function u0(A,_){let G=A[_];if(typeof G!=="string")throw Error(`${_} must be a string`);return G}function sH(A,_){let G=u0(A,_),$=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function oH(A,_){let G=A[_];if(G===null||G===void 0)return null;if(typeof G!=="string")throw Error(`${_} must be a string or null`);let $=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function r3(A){return JSON.parse(JSON.stringify(A))}function m0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var d2;var K$=U(()=>{_G();s_();k0();H_();A1();YG();H5();D0();c();JA();d2=["decision","learning","preference","friction","observation","supersedence"]});var $8={};k($8,{SecretAuditService:()=>R_});import{existsSync as AQ,mkdirSync as e3,readFileSync as _Q,renameSync as GQ,writeFileSync as s3}from"fs";import{basename as $Q,dirname as KQ,join as o3}from"path";class R_{redactor;constructor(A){this.redactor=A}async audit(A={}){let _=[],G={database:{requested:A.redactDatabase===!0,updatedFields:0,rebuiltFtsIndexes:[]},eventLogs:{requested:A.quarantineEvents===!0,sanitizedFiles:[],quarantinedFiles:[]}};if(A.db){if(G.database.updatedFields=this.scanDatabase(A.db,A.redactDatabase===!0,_),A.redactDatabase&&G.database.updatedFields>0)G.database.rebuiltFtsIndexes=HQ(A.db)}if(A.eventLogPaths){let K=this.scanEventLogs(A.eventLogPaths,A.quarantineEvents===!0,A.quarantineDir,_);G.eventLogs.sanitizedFiles=K.sanitizedFiles,G.eventLogs.quarantinedFiles=K.quarantinedFiles}let $={schemaVersion:1,generatedAt:new Date().toISOString(),redactionPolicy:G8(_),summary:{totalFindings:_.length,databaseFindings:_.filter((K)=>K.surface==="database").length,eventLogFindings:_.filter((K)=>K.surface==="event_log").length},findings:_,remediation:G};if(A.reportPath)e3(KQ(A.reportPath),{recursive:!0}),s3(A.reportPath,JSON.stringify($,null,2)+`
1392
- `,"utf-8");return $}scanDatabase(A,_,G){let $=0;for(let K of ZQ){if(!Z$(A,K.table))continue;let Z=K.columns.filter((Q)=>_8(A,K.table,Q));if(Z.length===0||!_8(A,K.table,K.idColumn))continue;let Y="__memory_audit_row_id",J=[`${aA(K.idColumn)} AS ${Y}`,...Z.map((Q)=>aA(Q))].join(", "),H=A.prepare(`SELECT ${J} FROM ${aA(K.table)}`).all();for(let Q of H){let X=Q[Y];for(let V of Z){let B=Q[V];if(typeof B!=="string"||B.length===0)continue;let W=YQ(this.redactor,B,K.jsonColumns?.includes(V)===!0);if(W.findings.length===0)continue;if(G.push(...W.findings.map((N)=>({surface:"database",table:K.table,column:V,rowId:X,...A8(N)}))),_&&W.value!==B&&X!==void 0)A.prepare(`UPDATE ${aA(K.table)} SET ${aA(V)} = ? WHERE ${aA(K.idColumn)} = ?`).run(W.value,X),$+=1}}}return $}scanEventLogs(A,_,G,$){let K=[],Z=[];for(let Y of A){if(!AQ(Y))continue;let J=_Q(Y,"utf-8"),H=J.includes(`\r
1391
+ `).run($.observedAt.toISOString(),J,Y)}}}}function lH(){return{name:"memory_governance",consumedKinds:["governance","consent"],reset:(A)=>{A.db.run("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")},apply:async(A,_)=>{await new s(_.db).applyMemoryEvent(A)}}}function pH(){return{name:"persona",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM persona_entries;")},apply:async(A,_)=>{let G=$1(A),$=$5(G,A.observedAt);if(!$)return!1;let Z=await new SA(_.db).save($),Y=new s(_.db);if(!await Y.findByTarget("persona",Z.entryId))await Y.save(GA.create({surface:"persona",targetId:Z.entryId,project:Z.project,visibility:Z.visibility,sourceEventIds:Z.sourceEventIds,transformationMethod:"persona-event-projection",actor:"memory",confidence:Z.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:Z.scope,status:"active",createdAt:Z.createdAt,updatedAt:Z.updatedAt,expiresAt:Z.expiresAt,lastEventId:A.eventId}));return!0}}}function nH(){return{name:"graph",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM graph_edges;")},apply:async(A,_)=>{let G=$1(A),$=Z5(G,A.observedAt);if($.length===0)return!1;let Z=await new lA(_.db).saveMany($),Y=new s(_.db);for(let J of Z)if(!await Y.findByTarget("graph",J.edgeId))await Y.save(Y5(J,"graph-event-projection"));return!0}}}function iH(A){if(A)return A;let _=f();return y1(_.machineId)}function aH(A){if(A){let _=l3(A);return _==="legacy"?"local":_}try{let _=f();if(_.machineId&&_.machineId.trim())return _.machineId}catch{}return"local"}function l3(A){let _=yH(A),G=/^events-(.+)\.jsonl$/.exec(_);return G?.[1]&&G[1].trim()?G[1]:"legacy"}function p3(A){return[...A].sort((_,G)=>{let $=_.observedAt.getTime()-G.observedAt.getTime();if($!==0)return $;let K=_.sequence-G.sequence;if(K!==0)return K;let Z=_.eventId.localeCompare(G.eventId);if(Z!==0)return Z;return _.machineId.localeCompare(G.machineId)})}function n3(A){let _={uuid:A.uuid,type:A.type,project:A.project,content:A.content,observedAt:A.observedAt.toISOString(),supersededAt:A.supersededAt?A.supersededAt.toISOString():null,supersededBy:A.supersededBy};if(A.id!==void 0)_.id=A.id;if(A.metadata!==void 0)_.metadata=A.metadata;return _}function i3(A){let _=A.metadata,G=_?.superseded_uuid,$=_?.superseded_by_uuid;return{parentEventIds:[],supersedesEventIds:typeof G==="string"?[G]:[],relatedEventIds:typeof $==="string"?[$]:[]}}function a3(A){let _=m0(A?.redaction)?A.redaction:void 0,G=m0(A?.privacy)?A.privacy:void 0,$=A?.redactionState??_?.state??G?.redactionState??"none",K=A?.redactedFields??_?.fields??G?.redactedFields;return{redactionState:rH($),containsSensitiveContent:Boolean(A?.containsSensitiveContent??G?.containsSensitiveContent??!1),policy:typeof _?.policy==="string"?_.policy:void 0,redactedFields:Array.isArray(K)?K.map((Z)=>String(Z)):void 0}}function rH(A){if(A==="redacted"||A==="quarantined")return A;return"none"}function tH(A,_){if(typeof A.sequence==="number"&&Number.isSafeInteger(A.sequence)&&A.sequence>0)return A.sequence;return _}function eH(A){return Math.max(1,Math.floor(A.getTime()))}function u0(A,_){let G=A[_];if(typeof G!=="string")throw Error(`${_} must be a string`);return G}function sH(A,_){let G=u0(A,_),$=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function oH(A,_){let G=A[_];if(G===null||G===void 0)return null;if(typeof G!=="string")throw Error(`${_} must be a string or null`);let $=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function r3(A){return JSON.parse(JSON.stringify(A))}function m0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var d2;var K1=U(()=>{_G();s_();k0();H_();A$();YG();H5();D0();c();JA();d2=["decision","learning","preference","friction","observation","supersedence"]});var $8={};k($8,{SecretAuditService:()=>R_});import{existsSync as AQ,mkdirSync as e3,readFileSync as _Q,renameSync as GQ,writeFileSync as s3}from"fs";import{basename as $Q,dirname as KQ,join as o3}from"path";class R_{redactor;constructor(A){this.redactor=A}async audit(A={}){let _=[],G={database:{requested:A.redactDatabase===!0,updatedFields:0,rebuiltFtsIndexes:[]},eventLogs:{requested:A.quarantineEvents===!0,sanitizedFiles:[],quarantinedFiles:[]}};if(A.db){if(G.database.updatedFields=this.scanDatabase(A.db,A.redactDatabase===!0,_),A.redactDatabase&&G.database.updatedFields>0)G.database.rebuiltFtsIndexes=HQ(A.db)}if(A.eventLogPaths){let K=this.scanEventLogs(A.eventLogPaths,A.quarantineEvents===!0,A.quarantineDir,_);G.eventLogs.sanitizedFiles=K.sanitizedFiles,G.eventLogs.quarantinedFiles=K.quarantinedFiles}let $={schemaVersion:1,generatedAt:new Date().toISOString(),redactionPolicy:G8(_),summary:{totalFindings:_.length,databaseFindings:_.filter((K)=>K.surface==="database").length,eventLogFindings:_.filter((K)=>K.surface==="event_log").length},findings:_,remediation:G};if(A.reportPath)e3(KQ(A.reportPath),{recursive:!0}),s3(A.reportPath,JSON.stringify($,null,2)+`
1392
+ `,"utf-8");return $}scanDatabase(A,_,G){let $=0;for(let K of ZQ){if(!Z1(A,K.table))continue;let Z=K.columns.filter((Q)=>_8(A,K.table,Q));if(Z.length===0||!_8(A,K.table,K.idColumn))continue;let Y="__memory_audit_row_id",J=[`${aA(K.idColumn)} AS ${Y}`,...Z.map((Q)=>aA(Q))].join(", "),H=A.prepare(`SELECT ${J} FROM ${aA(K.table)}`).all();for(let Q of H){let X=Q[Y];for(let V of Z){let B=Q[V];if(typeof B!=="string"||B.length===0)continue;let W=YQ(this.redactor,B,K.jsonColumns?.includes(V)===!0);if(W.findings.length===0)continue;if(G.push(...W.findings.map((N)=>({surface:"database",table:K.table,column:V,rowId:X,...A8(N)}))),_&&W.value!==B&&X!==void 0)A.prepare(`UPDATE ${aA(K.table)} SET ${aA(V)} = ? WHERE ${aA(K.idColumn)} = ?`).run(W.value,X),$+=1}}}return $}scanEventLogs(A,_,G,$){let K=[],Z=[];for(let Y of A){if(!AQ(Y))continue;let J=_Q(Y,"utf-8"),H=J.includes(`\r
1393
1393
  `)?`\r
1394
1394
  `:`
1395
- `,Q=J.split(/\r?\n/),X=[],V=!1;for(let B=0;B<Q.length;B+=1){let W=Q[B];if(W.trim()===""&&B===Q.length-1)continue;let N=this.redactEventLine(W);if(X.push(N.line),N.findings.length>0)V=!0,$.push(...N.findings.map((z)=>({surface:"event_log",filePath:Y,lineNumber:B+1,...A8(z)})))}if(_&&V){let B=G??o3(n(),"quarantine","event-logs");e3(B,{recursive:!0});let W=o3(B,`${new Date().toISOString().replace(/[:.]/g,"-")}-${$Q(Y)}.raw`);GQ(Y,W),s3(Y,X.join(H)+H,"utf-8"),K.push(Y),Z.push({originalPath:Y,quarantinedPath:W})}}return{sanitizedFiles:K,quarantinedFiles:Z}}redactEventLine(A){try{let _=JSON.parse(A),G=this.redactor.redactJson(_);if(G.findings.length===0)return{line:A,findings:[]};return{line:JSON.stringify(JQ(G.value)),findings:G.findings}}catch{let _=this.redactor.redactText(A);return{line:_.text,findings:_.findings}}}}function YQ(A,_,G){if(!G){let $=A.redactText(_);return{value:$.text,findings:$.findings}}try{let $=JSON.parse(_),K=A.redactJson($);return{value:JSON.stringify(K.value),findings:K.findings}}catch{let $=A.redactText(_);return{value:$.text,findings:$.findings}}}function JQ(A){if(!QQ(A)||A.schemaVersion!==2)return A;let _=A;try{let G=new Set([...Array.isArray(_.privacy?.redactedFields)?_.privacy.redactedFields:[],"event"]);return BA.create({eventId:_.eventId,machineId:_.machineId,sequence:_.sequence,kind:_.kind,operation:_.operation,occurredAt:new Date(_.occurredAt),observedAt:new Date(_.observedAt),scope:_.scope,provenance:_.provenance,privacy:{..._.privacy,redactionState:"redacted",containsSensitiveContent:!0,policy:_.privacy?.policy??G8([]),redactedFields:[...G]},consent:_.consent,causality:_.causality,payload:_.payload}).toJSON()}catch{return A}}function HQ(A){let _=[],G=["messages_fts","facts_fts","memory_files_fts"];for(let $ of G){if(!Z$(A,$))continue;A.exec(`INSERT INTO ${aA($)}(${aA($)}) VALUES('rebuild')`),_.push($)}if(Z$(A,"sessions_fts")&&Z$(A,"sessions"))A.exec("DELETE FROM sessions_fts"),A.exec("INSERT INTO sessions_fts(session_id, summary) SELECT id, summary FROM sessions WHERE summary IS NOT NULL AND summary != ''"),_.push("sessions_fts");return _}function A8(A){return{kind:A.kind,placeholder:A.placeholder,hash:A.hash,ruleVersion:A.ruleVersion}}function G8(A){return A.find((_)=>_.ruleVersion)?.ruleVersion??"pattern-redactor-v2"}function Z$(A,_){let G=A.prepare("SELECT name FROM sqlite_master WHERE name = ?").get(_);return Boolean(G)}function _8(A,_,G){return A.prepare(`PRAGMA table_info(${aA(_)})`).all().some((K)=>K.name===G)}function aA(A){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(A))throw Error(`Unsafe SQL identifier: ${A}`);return`"${A}"`}function QQ(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var ZQ;var Y$=U(()=>{s_();c();ZQ=[{table:"sessions",idColumn:"id",columns:["project_path_decoded","project_name","summary"]},{table:"messages_meta",idColumn:"rowid",columns:["content"]},{table:"tool_uses",idColumn:"id",columns:["name","input","result"],jsonColumns:["input"]},{table:"extraction_state",idColumn:"id",columns:["session_path","error_message"]},{table:"entities",idColumn:"id",columns:["name","metadata"],jsonColumns:["metadata"]},{table:"memory_files",idColumn:"id",columns:["file_path","content"]},{table:"friction_log",idColumn:"id",columns:["description","tool","tags","context","source_project","resolution"],jsonColumns:["tags"]},{table:"backfill_state",idColumn:"session_id",columns:["daily_log_path","error_message"]},{table:"facts",idColumn:"id",columns:["project","content","metadata"],jsonColumns:["metadata"]}]});import*as Y8 from"chrono-node";function F_(A,_){if(!A||A.trim()==="")throw new wA("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let G=_??new Date,$=Y8.parseDate(A,G);if(!$)throw new wA(`Invalid date format: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);let K=new Date($.getFullYear(),$.getMonth(),$.getDate()),Z=new Date(G.getFullYear(),G.getMonth(),G.getDate());if(K>Z)throw new wA(`Future dates not allowed: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return $}var wA;var n2=U(()=>{wA=class wA extends Error{constructor(A){super(A);this.name="DateParseError"}}});function LA(A){if(A.json)return;let _=`${A.command}:--format=${A.alias}`;if(J8.has(_))return;J8.add(_),console.error(`warning: --format ${A.alias} is deprecated and will be removed in the next minor release. ${A.replacement}`)}var J8;var d0=U(()=>{J8=new Set});import{spawn as zQ,execSync as J$}from"child_process";class H${search(A){return new Promise((_,G)=>{let $=zQ("qmd",["search",A,"--json"],{stdio:["pipe","pipe","pipe"]}),K="",Z="";$.stdout.on("data",(Y)=>{K+=Y.toString()}),$.stderr.on("data",(Y)=>{Z+=Y.toString()}),$.on("error",(Y)=>{G(Error(`Failed to spawn qmd: ${Y.message}`))}),$.on("close",(Y)=>{if(Y===0)try{let J=JSON.parse(K);_(J)}catch{G(Error(`Failed to parse qmd output: ${K.slice(0,200)}`))}else G(Error(`qmd exited with code ${Y}: ${Z.trim()}`))})})}isAvailable(){try{return J$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:J$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function i2(){try{return J$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function Q$(){try{return{available:!0,path:J$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var H8=()=>{};var X$=U(()=>{H8()});var X8={};k(X8,{runShowInternal:()=>MQ,executeShowCommand:()=>TG,createShowCommand:()=>V$});import{Command as NQ,Option as a2}from"commander";function V$(){return new NQ("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new a2("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new a2("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new a2("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async(A,_)=>{let G=await TG(A,_);process.exitCode=G.exitCode})}function Q8(A){if(A.json)return"json";if(A.tools)return"tools";if(A.quiet)return"quiet";if(A.verbose)return"verbose";if(A.format==="brief")return"brief";return"default"}async function LQ(A,_,G){let $=await A.findById(_);if($)return $;let Z=G.prepare("SELECT id FROM sessions WHERE id LIKE ? ORDER BY start_time DESC LIMIT 1").get(`${_}%`);if(Z)return A.findById(Z.id);return null}async function TG(A,_,G={}){let{executeQueryCommand:$}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="show";try{return await $(A,{..._,kind:"session",dbPath:G.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function MQ(A,_,G={}){let $=performance.now();if(_.format==="default")LA({command:"show",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let K=G.dbPath??S(),{db:Z}=D({path:K});try{let Y=new m(Z),J=new WA(Z),H=new X0(Z),Q=await LQ(Y,A,Z);if(!Q){if(_.json)h({command:"show",code:"NOT_FOUND",message:`Session not found: ${A}`,context:{session_id:A}});else{let T=Q8(_),M=a1(T,v());console.log(M.formatNotFound(A))}return{exitCode:1}}let X=await J.findBySession(Q.id),V=await H.findBySession(Q.id),B=new Map;for(let T of V)B.set(T.id,T);let W={session:Q,messages:X,toolUses:B};if(_.json){let T=performance.now();return e({command:"show",kind:"session",data:P9(W),meta:{session_id:Q.id,message_count:X.length,timing_ms:Math.round(T-$)}}),{exitCode:0}}let N=Q8(_),z=a1(N,v()),q=performance.now(),I=z.formatSession(W,{executionTimeMs:Math.round(q-$)});if(_.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"show",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var B$=U(()=>{IA();mA();Y_();E5();u();x2();nA();iA();zA();L0();d0()});var V8={};k(V8,{runListInternal:()=>UQ,executeListCommand:()=>r2,createListCommand:()=>W$});import{Command as qQ,Option as E_}from"commander";function W$(){return new qQ("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new E_("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new E_("--before <date>","Sessions before date").conflicts("days")).addOption(new E_("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output as JSON").addOption(new E_("--format <type>","Output format: brief (single-line per session) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new E_("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new E_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A)=>{let _=await r2(A);process.exitCode=_.exitCode})}async function r2(A,_={}){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=A.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="list";try{return await G(void 0,{...A,kind:"session",scope:$,dbPath:_.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function UQ(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"list",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let $=_.dbPath??S(),K=parseInt(A.limit??"20",10);if(isNaN(K)||K<1){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let Z,Y;if(A.days){let H=new Date,Q=new Date(H.getFullYear(),H.getMonth(),H.getDate());Z=new Date(Q.getTime()-(A.days-1)*24*60*60*1000)}else{if(A.since)try{Z=F_(A.since)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"since",value:A.since}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}if(A.before)try{Y=F_(A.before)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"before",value:A.before}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}}let{db:J}=D({path:$});try{let H=new m(J),Q={limit:K,projectFilter:A.project,sinceDate:Z,beforeDate:Y},X=await H.findFiltered(Q),V=TQ(A);if(A.json){let T=performance.now(),M=X.map(m1);return e({command:"list",kind:"session",data:M,meta:{filters_applied:V,count:M.length,timing_ms:Math.round(T-G)}}),{exitCode:0}}let B="default";if(A.quiet)B="quiet";else if(A.verbose)B="verbose";else if(A.format==="brief")B="brief";let W=v(),N=L2(B,W);if(X.length===0)return console.log(N.formatEmpty()),{exitCode:0};let z=performance.now(),q={executionTimeMs:Math.round(z-G),filtersApplied:V},I=N.formatSessions(X,q);if(A.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(A.json)h({command:"list",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{E(J)}}function TQ(A){let _=[];if(A.limit)_.push(`limit: ${A.limit}`);if(A.project)_.push(`project: ${A.project}`);if(A.days)_.push(`days: ${A.days}`);if(A.since)_.push(`since: ${A.since}`);if(A.before)_.push(`before: ${A.before}`);return _}var t2=U(()=>{mA();IA();u();M2();nA();n2();iA();zA();L0();d0()});var e2={};k(e2,{gatherStatus:()=>N8,formatTimeAgo:()=>T8,formatStatusOutput:()=>U8,executeStatusCommand:()=>p0,createStatusCommand:()=>z$,attemptFixes:()=>q8});import{Command as IQ,Option as OQ}from"commander";import{existsSync as jQ,mkdirSync as B8}from"fs";import{dirname as W8}from"path";function z$(){return new IQ("status").description("Show system status, health, and statistics").option("--db","Show database health and diagnostic info").option("--hooks","Show Git hook status").option("--embedding","Show background embedding process status").option("--config","Show config validation status").option("--stats","Show database statistics").option("--all","Show all status and health sections").option("--fix","Attempt to fix common issues automatically").option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new OQ("--format <type>","Output format for stats: brief or ai").choices(["brief","ai","default"])).option("-v, --verbose","Show detailed output with timing").option("-q, --quiet","Minimal output").option("--json","Output as JSON").action(async(A)=>{let _=await p0(A);process.exitCode=_.exitCode})}async function N8(A={}){let _=bA(A.hookOverrides),G=f(A.configPath),$=N_(1,A.logPath),K=A.dbPath??S(),Y=jQ(K)||A.stats,J=0,H,Q=0,X=0,V=k1({dbPath:K,configDir:A.configPath?W8(A.configPath):void 0,logsDir:A.logPath?W8(A.logPath):void 0,hookOverrides:A.hookOverrides,preCalculatedHookStatus:_});if(Y)try{let{db:I}=D({path:K});try{let T=new z0,M=new Q0(I),O=await T.discoverSessions();for(let tA of O){let eA=await M.findBySessionPath(tA.path);if(!eA||eA.status!=="complete")J++}let R=new V0(I),y=A.projects??10;H=await R.getStats(y);let HA=new dA(I);Q=HA.getEmbeddedCount(),X=HA.getTotalMessageCount()}finally{E(I)}}catch{}let B={active:!1};try{let{readLock:I,isProcessAlive:T}=await Promise.resolve().then(() => (e1(),t1)),M=I();if(M&&T(M.pid))B={active:!0,pid:M.pid,startedAt:M.startedAt,embeddedCount:Q,totalMessages:X}}catch{}let W=CK(),N=Q$(),z;if(H)z={...H,hooks:{installed:_.sessionEnd&&_.preCompact,autoSync:G.autoSync,pendingSessions:J}};let q=[];if(A.fix)q=q8(V,v());return{hooks:_,config:RQ(G),lastSync:$.length>0?$[0]?.timestamp??null:null,pendingSessions:J,recentLogs:N_(100,A.logPath).length,embedding:B,health:V,stats:z,migration:W,qmd:N,fixes:q}}function RQ(A){let _={...A.embedding};if(_.apiKey)_.apiKey="[REDACTED:api_key]";if(_.apiKeyRef)_.apiKeyRef=x1(_.apiKeyRef).maskedReference;return{...A,embedding:_}}async function p0(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"status",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let K=A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all?"stats":"status",Z=parseInt(A.projects??"10",10);if(isNaN(Z)||Z<1){if(A.json)h({command:K,code:"INVALID_ARGUMENT",message:"Projects count must be a positive number"});else console.error("Error: Projects count must be a positive number");return{exitCode:1}}let J=await(_.gatherStatus??N8)({dbPath:_.dbPath,logPath:_.logPath,configPath:_.configPath,hookOverrides:_.hookOverrides,fix:A.fix,projects:Z,stats:A.stats||A.all}),H=0;if(A.db||A.all||A.fix)H=CQ(J.health);else if(A.stats)H=J.stats?0:1;else H=0;if(A.json){if(A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all){if(!J.stats)return h({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return e({command:"stats",kind:"stats",data:z2(J.stats),meta:{generated_at:new Date().toISOString(),timing_ms:Math.round(performance.now()-G)}}),{exitCode:0}}let W={hooks:J.hooks,config:J.config,lastSync:J.lastSync,pendingSessions:J.pendingSessions,recentLogs:J.recentLogs,embedding:J.embedding,health:{...J.health,hooks:{...J.health.hooks,lastRun:J.health.hooks.lastRun?.toISOString()??null}},stats:J.stats?z2(J.stats):void 0,migration:J.migration,qmd:J.qmd,fixes:J.fixes};return console.log(JSON.stringify(W,null,2)),{exitCode:H}}let X=v();if(!(A.db||A.hooks||A.embedding||A.config||A.stats||A.all)){if(U8(J),A.fix&&J.fixes.length>0){console.log(`
1395
+ `,Q=J.split(/\r?\n/),X=[],V=!1;for(let B=0;B<Q.length;B+=1){let W=Q[B];if(W.trim()===""&&B===Q.length-1)continue;let N=this.redactEventLine(W);if(X.push(N.line),N.findings.length>0)V=!0,$.push(...N.findings.map((z)=>({surface:"event_log",filePath:Y,lineNumber:B+1,...A8(z)})))}if(_&&V){let B=G??o3(n(),"quarantine","event-logs");e3(B,{recursive:!0});let W=o3(B,`${new Date().toISOString().replace(/[:.]/g,"-")}-${$Q(Y)}.raw`);GQ(Y,W),s3(Y,X.join(H)+H,"utf-8"),K.push(Y),Z.push({originalPath:Y,quarantinedPath:W})}}return{sanitizedFiles:K,quarantinedFiles:Z}}redactEventLine(A){try{let _=JSON.parse(A),G=this.redactor.redactJson(_);if(G.findings.length===0)return{line:A,findings:[]};return{line:JSON.stringify(JQ(G.value)),findings:G.findings}}catch{let _=this.redactor.redactText(A);return{line:_.text,findings:_.findings}}}}function YQ(A,_,G){if(!G){let $=A.redactText(_);return{value:$.text,findings:$.findings}}try{let $=JSON.parse(_),K=A.redactJson($);return{value:JSON.stringify(K.value),findings:K.findings}}catch{let $=A.redactText(_);return{value:$.text,findings:$.findings}}}function JQ(A){if(!QQ(A)||A.schemaVersion!==2)return A;let _=A;try{let G=new Set([...Array.isArray(_.privacy?.redactedFields)?_.privacy.redactedFields:[],"event"]);return BA.create({eventId:_.eventId,machineId:_.machineId,sequence:_.sequence,kind:_.kind,operation:_.operation,occurredAt:new Date(_.occurredAt),observedAt:new Date(_.observedAt),scope:_.scope,provenance:_.provenance,privacy:{..._.privacy,redactionState:"redacted",containsSensitiveContent:!0,policy:_.privacy?.policy??G8([]),redactedFields:[...G]},consent:_.consent,causality:_.causality,payload:_.payload}).toJSON()}catch{return A}}function HQ(A){let _=[],G=["messages_fts","facts_fts","memory_files_fts"];for(let $ of G){if(!Z1(A,$))continue;A.exec(`INSERT INTO ${aA($)}(${aA($)}) VALUES('rebuild')`),_.push($)}if(Z1(A,"sessions_fts")&&Z1(A,"sessions"))A.exec("DELETE FROM sessions_fts"),A.exec("INSERT INTO sessions_fts(session_id, summary) SELECT id, summary FROM sessions WHERE summary IS NOT NULL AND summary != ''"),_.push("sessions_fts");return _}function A8(A){return{kind:A.kind,placeholder:A.placeholder,hash:A.hash,ruleVersion:A.ruleVersion}}function G8(A){return A.find((_)=>_.ruleVersion)?.ruleVersion??"pattern-redactor-v2"}function Z1(A,_){let G=A.prepare("SELECT name FROM sqlite_master WHERE name = ?").get(_);return Boolean(G)}function _8(A,_,G){return A.prepare(`PRAGMA table_info(${aA(_)})`).all().some((K)=>K.name===G)}function aA(A){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(A))throw Error(`Unsafe SQL identifier: ${A}`);return`"${A}"`}function QQ(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var ZQ;var Y1=U(()=>{s_();c();ZQ=[{table:"sessions",idColumn:"id",columns:["project_path_decoded","project_name","summary"]},{table:"messages_meta",idColumn:"rowid",columns:["content"]},{table:"tool_uses",idColumn:"id",columns:["name","input","result"],jsonColumns:["input"]},{table:"extraction_state",idColumn:"id",columns:["session_path","error_message"]},{table:"entities",idColumn:"id",columns:["name","metadata"],jsonColumns:["metadata"]},{table:"memory_files",idColumn:"id",columns:["file_path","content"]},{table:"friction_log",idColumn:"id",columns:["description","tool","tags","context","source_project","resolution"],jsonColumns:["tags"]},{table:"backfill_state",idColumn:"session_id",columns:["daily_log_path","error_message"]},{table:"facts",idColumn:"id",columns:["project","content","metadata"],jsonColumns:["metadata"]}]});import*as Y8 from"chrono-node";function F_(A,_){if(!A||A.trim()==="")throw new wA("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let G=_??new Date,$=Y8.parseDate(A,G);if(!$)throw new wA(`Invalid date format: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);let K=new Date($.getFullYear(),$.getMonth(),$.getDate()),Z=new Date(G.getFullYear(),G.getMonth(),G.getDate());if(K>Z)throw new wA(`Future dates not allowed: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return $}var wA;var n2=U(()=>{wA=class wA extends Error{constructor(A){super(A);this.name="DateParseError"}}});function LA(A){if(A.json)return;let _=`${A.command}:--format=${A.alias}`;if(J8.has(_))return;J8.add(_),console.error(`warning: --format ${A.alias} is deprecated and will be removed in the next minor release. ${A.replacement}`)}var J8;var d0=U(()=>{J8=new Set});import{spawn as zQ,execSync as J1}from"child_process";class H1{search(A){return new Promise((_,G)=>{let $=zQ("qmd",["search",A,"--json"],{stdio:["pipe","pipe","pipe"]}),K="",Z="";$.stdout.on("data",(Y)=>{K+=Y.toString()}),$.stderr.on("data",(Y)=>{Z+=Y.toString()}),$.on("error",(Y)=>{G(Error(`Failed to spawn qmd: ${Y.message}`))}),$.on("close",(Y)=>{if(Y===0)try{let J=JSON.parse(K);_(J)}catch{G(Error(`Failed to parse qmd output: ${K.slice(0,200)}`))}else G(Error(`qmd exited with code ${Y}: ${Z.trim()}`))})})}isAvailable(){try{return J1("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:J1("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function i2(){try{return J1("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function Q1(){try{return{available:!0,path:J1("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var H8=()=>{};var X1=U(()=>{H8()});var X8={};k(X8,{runShowInternal:()=>MQ,executeShowCommand:()=>TG,createShowCommand:()=>V1});import{Command as NQ,Option as a2}from"commander";function V1(){return new NQ("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new a2("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new a2("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new a2("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async(A,_)=>{let G=await TG(A,_);process.exitCode=G.exitCode})}function Q8(A){if(A.json)return"json";if(A.tools)return"tools";if(A.quiet)return"quiet";if(A.verbose)return"verbose";if(A.format==="brief")return"brief";return"default"}async function LQ(A,_,G){let $=await A.findById(_);if($)return $;let Z=G.prepare("SELECT id FROM sessions WHERE id LIKE ? ORDER BY start_time DESC LIMIT 1").get(`${_}%`);if(Z)return A.findById(Z.id);return null}async function TG(A,_,G={}){let{executeQueryCommand:$}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="show";try{return await $(A,{..._,kind:"session",dbPath:G.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function MQ(A,_,G={}){let $=performance.now();if(_.format==="default")LA({command:"show",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let K=G.dbPath??S(),{db:Z}=D({path:K});try{let Y=new m(Z),J=new WA(Z),H=new X0(Z),Q=await LQ(Y,A,Z);if(!Q){if(_.json)h({command:"show",code:"NOT_FOUND",message:`Session not found: ${A}`,context:{session_id:A}});else{let T=Q8(_),M=a$(T,v());console.log(M.formatNotFound(A))}return{exitCode:1}}let X=await J.findBySession(Q.id),V=await H.findBySession(Q.id),B=new Map;for(let T of V)B.set(T.id,T);let W={session:Q,messages:X,toolUses:B};if(_.json){let T=performance.now();return e({command:"show",kind:"session",data:P9(W),meta:{session_id:Q.id,message_count:X.length,timing_ms:Math.round(T-$)}}),{exitCode:0}}let N=Q8(_),z=a$(N,v()),q=performance.now(),I=z.formatSession(W,{executionTimeMs:Math.round(q-$)});if(_.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"show",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var B1=U(()=>{IA();mA();Y_();E5();u();x2();nA();iA();zA();L0();d0()});var V8={};k(V8,{runListInternal:()=>UQ,executeListCommand:()=>r2,createListCommand:()=>W1});import{Command as qQ,Option as E_}from"commander";function W1(){return new qQ("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new E_("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new E_("--before <date>","Sessions before date").conflicts("days")).addOption(new E_("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output as JSON").addOption(new E_("--format <type>","Output format: brief (single-line per session) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new E_("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new E_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A)=>{let _=await r2(A);process.exitCode=_.exitCode})}async function r2(A,_={}){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=A.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="list";try{return await G(void 0,{...A,kind:"session",scope:$,dbPath:_.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function UQ(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"list",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let $=_.dbPath??S(),K=parseInt(A.limit??"20",10);if(isNaN(K)||K<1){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let Z,Y;if(A.days){let H=new Date,Q=new Date(H.getFullYear(),H.getMonth(),H.getDate());Z=new Date(Q.getTime()-(A.days-1)*24*60*60*1000)}else{if(A.since)try{Z=F_(A.since)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"since",value:A.since}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}if(A.before)try{Y=F_(A.before)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"before",value:A.before}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}}let{db:J}=D({path:$});try{let H=new m(J),Q={limit:K,projectFilter:A.project,sinceDate:Z,beforeDate:Y},X=await H.findFiltered(Q),V=TQ(A);if(A.json){let T=performance.now(),M=X.map(m$);return e({command:"list",kind:"session",data:M,meta:{filters_applied:V,count:M.length,timing_ms:Math.round(T-G)}}),{exitCode:0}}let B="default";if(A.quiet)B="quiet";else if(A.verbose)B="verbose";else if(A.format==="brief")B="brief";let W=v(),N=L2(B,W);if(X.length===0)return console.log(N.formatEmpty()),{exitCode:0};let z=performance.now(),q={executionTimeMs:Math.round(z-G),filtersApplied:V},I=N.formatSessions(X,q);if(A.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(A.json)h({command:"list",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{E(J)}}function TQ(A){let _=[];if(A.limit)_.push(`limit: ${A.limit}`);if(A.project)_.push(`project: ${A.project}`);if(A.days)_.push(`days: ${A.days}`);if(A.since)_.push(`since: ${A.since}`);if(A.before)_.push(`before: ${A.before}`);return _}var t2=U(()=>{mA();IA();u();M2();nA();n2();iA();zA();L0();d0()});var e2={};k(e2,{gatherStatus:()=>N8,formatTimeAgo:()=>T8,formatStatusOutput:()=>U8,executeStatusCommand:()=>p0,createStatusCommand:()=>z1,attemptFixes:()=>q8});import{Command as IQ,Option as OQ}from"commander";import{existsSync as jQ,mkdirSync as B8}from"fs";import{dirname as W8}from"path";function z1(){return new IQ("status").description("Show system status, health, and statistics").option("--db","Show database health and diagnostic info").option("--hooks","Show Git hook status").option("--embedding","Show background embedding process status").option("--config","Show config validation status").option("--stats","Show database statistics").option("--all","Show all status and health sections").option("--fix","Attempt to fix common issues automatically").option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new OQ("--format <type>","Output format for stats: brief or ai").choices(["brief","ai","default"])).option("-v, --verbose","Show detailed output with timing").option("-q, --quiet","Minimal output").option("--json","Output as JSON").action(async(A)=>{let _=await p0(A);process.exitCode=_.exitCode})}async function N8(A={}){let _=bA(A.hookOverrides),G=f(A.configPath),$=N_(1,A.logPath),K=A.dbPath??S(),Y=jQ(K)||A.stats,J=0,H,Q=0,X=0,V=k$({dbPath:K,configDir:A.configPath?W8(A.configPath):void 0,logsDir:A.logPath?W8(A.logPath):void 0,hookOverrides:A.hookOverrides,preCalculatedHookStatus:_});if(Y)try{let{db:I}=D({path:K});try{let T=new z0,M=new Q0(I),O=await T.discoverSessions();for(let tA of O){let eA=await M.findBySessionPath(tA.path);if(!eA||eA.status!=="complete")J++}let R=new V0(I),y=A.projects??10;H=await R.getStats(y);let HA=new dA(I);Q=HA.getEmbeddedCount(),X=HA.getTotalMessageCount()}finally{E(I)}}catch{}let B={active:!1};try{let{readLock:I,isProcessAlive:T}=await Promise.resolve().then(() => (e$(),t$)),M=I();if(M&&T(M.pid))B={active:!0,pid:M.pid,startedAt:M.startedAt,embeddedCount:Q,totalMessages:X}}catch{}let W=CK(),N=Q1(),z;if(H)z={...H,hooks:{installed:_.sessionEnd&&_.preCompact,autoSync:G.autoSync,pendingSessions:J}};let q=[];if(A.fix)q=q8(V,v());return{hooks:_,config:RQ(G),lastSync:$.length>0?$[0]?.timestamp??null:null,pendingSessions:J,recentLogs:N_(100,A.logPath).length,embedding:B,health:V,stats:z,migration:W,qmd:N,fixes:q}}function RQ(A){let _={...A.embedding};if(_.apiKey)_.apiKey="[REDACTED:api_key]";if(_.apiKeyRef)_.apiKeyRef=x$(_.apiKeyRef).maskedReference;return{...A,embedding:_}}async function p0(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"status",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let K=A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all?"stats":"status",Z=parseInt(A.projects??"10",10);if(isNaN(Z)||Z<1){if(A.json)h({command:K,code:"INVALID_ARGUMENT",message:"Projects count must be a positive number"});else console.error("Error: Projects count must be a positive number");return{exitCode:1}}let J=await(_.gatherStatus??N8)({dbPath:_.dbPath,logPath:_.logPath,configPath:_.configPath,hookOverrides:_.hookOverrides,fix:A.fix,projects:Z,stats:A.stats||A.all}),H=0;if(A.db||A.all||A.fix)H=CQ(J.health);else if(A.stats)H=J.stats?0:1;else H=0;if(A.json){if(A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all){if(!J.stats)return h({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return e({command:"stats",kind:"stats",data:z2(J.stats),meta:{generated_at:new Date().toISOString(),timing_ms:Math.round(performance.now()-G)}}),{exitCode:0}}let W={hooks:J.hooks,config:J.config,lastSync:J.lastSync,pendingSessions:J.pendingSessions,recentLogs:J.recentLogs,embedding:J.embedding,health:{...J.health,hooks:{...J.health.hooks,lastRun:J.health.hooks.lastRun?.toISOString()??null}},stats:J.stats?z2(J.stats):void 0,migration:J.migration,qmd:J.qmd,fixes:J.fixes};return console.log(JSON.stringify(W,null,2)),{exitCode:H}}let X=v();if(!(A.db||A.hooks||A.embedding||A.config||A.stats||A.all)){if(U8(J),A.fix&&J.fixes.length>0){console.log(`
1396
1396
  Applied fixes:`);for(let W of J.fixes)console.log(W)}return{exitCode:0}}let B=[];if(A.hooks||A.all)B.push(SQ(J,X));if(A.config||A.all)B.push(EQ(J,X));if(A.db||A.all)B.push(DQ(J,X));if(A.embedding||A.all)B.push(xQ(J,X)),B.push(PQ(J,X)),B.push(yQ(J,X)),B.push(kQ(J,X));if(A.stats||A.all)if(!J.stats)B.push(d("Database statistics are not available.",X));else{let W="default";if(A.quiet)W="quiet";else if(A.verbose)W="verbose";else if(A.format==="brief")W="brief";let N=U2(W,X);if(J.stats.totalSessions===0)B.push(N.formatEmpty());else{let z=N.formatStats(J.stats,{executionTimeMs:Math.round(performance.now()-G)});if(A.format==="ai")z=_A(z);B.push(z)}}if(console.log(B.join(`
1397
1397
 
1398
1398
  `)),A.all||A.db){if(J.migration.status==="pending")console.log(""),console.log(l("Legacy data found at ~/.memory-nexus/. Run any memory command to auto-migrate.",X));else if(J.migration.status==="partial")console.log(""),console.log(l("Partial migration detected. Some data in ~/.memory-nexus/ and some in new paths. Re-run migration or check manually.",X))}if(A.fix)if(console.log(""),console.log("Attempting fixes..."),J.fixes.length===0)console.log(P("No automatic fixes available.",X));else for(let W of J.fixes)console.log(W);return{exitCode:H}}function FQ(A){let G=Date.now()-A.getTime(),$=Math.floor(G/1000),K=Math.floor($/60),Z=Math.floor(K/60),Y=Math.floor(Z/24);if(Y>0)return`${Y} day${Y>1?"s":""} ago`;if(Z>0)return`${Z} hour${Z>1?"s":""} ago`;if(K>0)return`${K} minute${K>1?"s":""} ago`;return"just now"}function SQ(A,_){let G=[];if(G.push("Hooks"),G.push(` ${g(A.health.hooks.installed,_)} Installed: ${A.health.hooks.installed?"yes":"no"}`),G.push(` ${g(A.health.hooks.enabled,_)} Enabled (autoSync): ${A.health.hooks.enabled?"yes":"no"}`),A.health.hooks.lastRun)G.push(` ${P(`Last run: ${FQ(A.health.hooks.lastRun)}`,_)}`);else G.push(` ${P("Last run: never",_)}`);return G.join(`
@@ -1405,13 +1405,13 @@ Applied fixes:`);for(let W of J.fixes)console.log(W)}return{exitCode:0}}let B=[]
1405
1405
  `)}function z8(A,_,G){let $=_.host??_.target;if(!_.required)return` ${g(!0,G)} ${A}: local/none (${$})`;if(_.allowed)return` ${g(!0,G)} ${A}: allowed (${$})`;return` ${g(!1,G)} ${A}: blocked - ${_.reason}`}function L8(A){let _=A.health,G=_?.embedding?.provider??"unknown",$=_?.llmExtraction?.provider??"unknown";return _?.providerEgress??{consent:"unset",embedding:{required:!1,allowed:!0,target:G,capability:"embedding",provider:G,warnings:[]},llmExtraction:{required:!1,allowed:!0,target:$,capability:"extraction",provider:$,warnings:[]},warnings:[]}}function M8(A){return A.health?.capabilityInterop??{providers:[],references:[],warnings:[]}}function g(A,_){if(A)return C("[OK]",_);return d("[FAIL]",_)}function hQ(A){if(A===0)return"0 B";let _=["B","KB","MB","GB"],G=1024,$=Math.floor(Math.log(A)/Math.log(G));return`${(A/Math.pow(G,$)).toFixed($>0?1:0)} ${_[$]}`}function vQ(A,_){switch(A){case"ok":return C("ok",_);case"corrupted":return d("CORRUPTED",_);default:return l("unknown",_)}}function wQ(A){let _=0;if(!A.database.readable)_++;if(!A.database.writable)_++;if(!A.permissions.configDir)_++;if(!A.permissions.logsDir)_++;if(!A.permissions.sourceDir)_++;return _+=A.config.issues.length,_}function CQ(A){if(!A.database.exists||A.database.integrity==="corrupted")return 2;if(wQ(A)>0||!A.searchCapability.vectorReady)return 1;return 0}function q8(A,_){let G=[];if(!A.permissions.configDir){let $=C0();try{B8($,{recursive:!0}),G.push(C(`Created config directory: ${$}`,_))}catch(K){let Z=L(K);G.push(d(`Failed to create config directory: ${Z}`,_))}}if(!A.permissions.logsDir){let $=z_();try{B8($,{recursive:!0}),G.push(C(`Created logs directory: ${$}`,_))}catch(K){let Z=L(K);G.push(d(`Failed to create logs directory: ${Z}`,_))}}if(A.database.integrity==="corrupted")G.push(l("Database corruption detected. Consider:",_)),G.push(" 1. Backup your database file"),G.push(` 2. Delete the database: rm ${S()}`),G.push(" 3. Re-sync: memory sync");if(!A.hooks.installed)G.push(l("Hooks not installed. Run 'memory install' to enable automatic sync.",_));return G}function U8(A){console.log("Memory Status"),console.log(`=============
1406
1406
  `),console.log("Hooks:"),console.log(` SessionEnd: ${A.hooks.sessionEnd?"installed":"not installed"}`),console.log(` PreCompact: ${A.hooks.preCompact?"installed":"not installed"}`),console.log(` Hook script: ${A.hooks.hookScriptExists?"present":"missing"}`),console.log(` Backup: ${A.hooks.backupExists?"available":"none"}`),console.log(""),console.log("Configuration:"),console.log(` autoSync: ${A.config.autoSync}`),console.log(` syncOnCompaction: ${A.config.syncOnCompaction}`),console.log(` recoveryOnStartup: ${A.config.recoveryOnStartup}`),console.log(` timeout: ${A.config.timeout}ms`),console.log(` logLevel: ${A.config.logLevel}`),console.log(` showFailures: ${A.config.showFailures}`),console.log("");let _=L8(A);console.log("Provider egress:"),console.log(` Consent: ${_.consent}`),console.log(` Embeddings: ${_.embedding.allowed?"allowed":"blocked"} (${_.embedding.host??_.embedding.target})`),console.log(` LLM extraction: ${_.llmExtraction.allowed?"allowed":"blocked"} (${_.llmExtraction.host??_.llmExtraction.target})`),console.log("");let G=M8(A);if(console.log("Capability interop:"),G.providers.length===0)console.log(" Providers: not reported");else for(let $ of G.providers){let K=$.status==="optional_unavailable"?"optional unavailable":$.status.replace(/_/g," ");console.log(` ${$.provider}: ${K}`)}if(G.references.length>0)for(let $ of G.references)console.log(` ${$.source}: ${$.maskedReference} (${$.status})`);if(console.log(""),console.log("Activity:"),console.log(` Last sync: ${A.lastSync??"never"}`),console.log(` Pending sessions: ${A.pendingSessions}`),console.log(` Recent log entries: ${A.recentLogs}`),console.log(""),console.log("Embedding:"),A.embedding.active){let $=A.embedding.startedAt?T8(A.embedding.startedAt):"unknown",K=A.embedding.embeddedCount!==void 0&&A.embedding.totalMessages!==void 0?`, ${A.embedding.embeddedCount}/${A.embedding.totalMessages} messages`:"";console.log(` Status: active (PID ${A.embedding.pid}${K}, started ${$})`)}else console.log(" Status: idle");if(!A.hooks.sessionEnd||!A.hooks.preCompact)console.log(`
1407
1407
  Recommendation: Run 'memory install' to enable automatic sync.`);if(A.pendingSessions>0)console.log(`
1408
- Note: ${A.pendingSessions} session(s) pending sync. Run 'memory sync' to sync now.`)}function T8(A){let _=Date.now()-new Date(A).getTime(),G=Math.floor(_/60000);if(G<1)return"just now";if(G<60)return`${G} min ago`;let $=Math.floor(G/60);if($<24)return`${$}h ago`;return`${Math.floor($/24)}d ago`}var D_=U(()=>{L_();u();LG();u$();X$();T2();nA();d0();zA();L0();t5()});var I8={};k(I8,{executeStatsCommand:()=>o2,createStatsCommand:()=>N$});import{Command as bQ,Option as s2}from"commander";function N$(){return new bQ("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new s2("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new s2("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new s2("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async(A)=>{let _=await o2(A);process.exitCode=_.exitCode})}async function o2(A,_={}){return p0({stats:!0,projects:A.projects,format:A.format,verbose:A.verbose,quiet:A.quiet,json:A.json},{dbPath:_.dbPath})}var AK=U(()=>{D_()});var R8={};k(R8,{runContextInternal:()=>cQ,executeContextCommand:()=>OG,createContextCommand:()=>L$});import*as O8 from"fs";import*as j8 from"os";import{join as fQ}from"path";import{Command as gQ,Option as IG}from"commander";function L$(){return new gQ("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new IG("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _})).addOption(new IG("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new IG("--budget <tokens>","Maximum token budget for context").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Budget must be a positive number");return _})).option("--cross-project","Include cross-project learnings and decisions").option("--json","Output as JSON").addOption(new IG("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new IG("-q, --quiet","Minimal output").conflicts("verbose")).action(async(A,_)=>{let G=await OG(A,_);process.exitCode=G.exitCode})}async function OG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="context";try{return await G(A,{..._,kind:"context",scope:"project"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function cQ(A,_,G){if(_.format==="detailed")LA({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let $=fQ(j8.homedir(),".memory");if(O8.existsSync($)&&!_.quiet&&!_.json)console.error("[DEPRECATION WARNING] Legacy memory directory ~/.memory/ is deprecated. Your knowledge and decisions are now stored safely in the SQLite database.");let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{return await uQ(Z,A,_)}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"context",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}async function uQ(A,_,G){let $=new w0(A),K=new FA(A),Z=new RA(A),Y=new SA(A),J=new lA(A),H=new h0(A),Q=new s(A),X=new cA({repository:Q}),V=new a_,B=new v0(A),N=await new t_({projectResolver:$,factRepo:K,frictionRepo:Z,personaRepo:Y,graphRepo:J,governancePolicy:X,rankingService:V,utilityRepo:H,getSessionSummary:async(T,M)=>{let O=await B.getProjectContext(T,{days:M});if(!O)return null;return`Sessions: ${O.sessionCount} | Messages: ${O.totalMessages} | Last active: ${O.lastActivity?.toISOString()??"never"}`}}).getContext({projectFilter:_,budget:G.budget,days:G.days,crossProject:G.crossProject});if(G.json){if(!N)return h({command:"context",code:"NOT_FOUND",message:`Project not found: ${_}`,context:{project:_}}),{exitCode:1};let T=await B.getProjectContext(_,{days:G.days});return e({command:"context",kind:"context",data:T?k9(T):null,meta:{project:_,days:G.days,budget:G.budget,cross_project:!!G.crossProject,mode:"smart",sections:N.sections.map((M)=>({key:M.key,title:M.title}))}}),{exitCode:0}}let z=G.format==="ai"?"ai":G.verbose?"verbose":G.quiet?"quiet":G.format==="detailed"?"detailed":"brief",q=v(),I=p1(z,q);if(!N){let T=I.formatEmpty(_);if(z!=="quiet"||T)console.error(T);return{exitCode:1}}if(I.formatSmartContext){let T=I.formatSmartContext(N);console.log(T)}else{let T=N.sections.find((M)=>M.key==="session_summary");if(T)console.log(T.content);else{let M=N.sections.map((O)=>`${O.title}:
1408
+ Note: ${A.pendingSessions} session(s) pending sync. Run 'memory sync' to sync now.`)}function T8(A){let _=Date.now()-new Date(A).getTime(),G=Math.floor(_/60000);if(G<1)return"just now";if(G<60)return`${G} min ago`;let $=Math.floor(G/60);if($<24)return`${$}h ago`;return`${Math.floor($/24)}d ago`}var D_=U(()=>{L_();u();LG();u1();X1();T2();nA();d0();zA();L0();t5()});var I8={};k(I8,{executeStatsCommand:()=>o2,createStatsCommand:()=>N1});import{Command as bQ,Option as s2}from"commander";function N1(){return new bQ("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new s2("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new s2("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new s2("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async(A)=>{let _=await o2(A);process.exitCode=_.exitCode})}async function o2(A,_={}){return p0({stats:!0,projects:A.projects,format:A.format,verbose:A.verbose,quiet:A.quiet,json:A.json},{dbPath:_.dbPath})}var AK=U(()=>{D_()});var R8={};k(R8,{runContextInternal:()=>cQ,executeContextCommand:()=>OG,createContextCommand:()=>L1});import*as O8 from"fs";import*as j8 from"os";import{join as fQ}from"path";import{Command as gQ,Option as IG}from"commander";function L1(){return new gQ("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new IG("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _})).addOption(new IG("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new IG("--budget <tokens>","Maximum token budget for context").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Budget must be a positive number");return _})).option("--cross-project","Include cross-project learnings and decisions").option("--json","Output as JSON").addOption(new IG("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new IG("-q, --quiet","Minimal output").conflicts("verbose")).action(async(A,_)=>{let G=await OG(A,_);process.exitCode=G.exitCode})}async function OG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="context";try{return await G(A,{..._,kind:"context",scope:"project"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function cQ(A,_,G){if(_.format==="detailed")LA({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let $=fQ(j8.homedir(),".memory");if(O8.existsSync($)&&!_.quiet&&!_.json)console.error("[DEPRECATION WARNING] Legacy memory directory ~/.memory/ is deprecated. Your knowledge and decisions are now stored safely in the SQLite database.");let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{return await uQ(Z,A,_)}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"context",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}async function uQ(A,_,G){let $=new w0(A),K=new FA(A),Z=new RA(A),Y=new SA(A),J=new lA(A),H=new h0(A),Q=new s(A),X=new cA({repository:Q}),V=new a_,B=new v0(A),N=await new t_({projectResolver:$,factRepo:K,frictionRepo:Z,personaRepo:Y,graphRepo:J,governancePolicy:X,rankingService:V,utilityRepo:H,getSessionSummary:async(T,M)=>{let O=await B.getProjectContext(T,{days:M});if(!O)return null;return`Sessions: ${O.sessionCount} | Messages: ${O.totalMessages} | Last active: ${O.lastActivity?.toISOString()??"never"}`}}).getContext({projectFilter:_,budget:G.budget,days:G.days,crossProject:G.crossProject});if(G.json){if(!N)return h({command:"context",code:"NOT_FOUND",message:`Project not found: ${_}`,context:{project:_}}),{exitCode:1};let T=await B.getProjectContext(_,{days:G.days});return e({command:"context",kind:"context",data:T?k9(T):null,meta:{project:_,days:G.days,budget:G.budget,cross_project:!!G.crossProject,mode:"smart",sections:N.sections.map((M)=>({key:M.key,title:M.title}))}}),{exitCode:0}}let z=G.format==="ai"?"ai":G.verbose?"verbose":G.quiet?"quiet":G.format==="detailed"?"detailed":"brief",q=v(),I=p$(z,q);if(!N){let T=I.formatEmpty(_);if(z!=="quiet"||T)console.error(T);return{exitCode:1}}if(I.formatSmartContext){let T=I.formatSmartContext(N);console.log(T)}else{let T=N.sections.find((M)=>M.key==="session_summary");if(T)console.log(T.content);else{let M=N.sections.map((O)=>`${O.title}:
1409
1409
  ${O.content}`).join(`
1410
1410
 
1411
- `);console.log(M)}}return{exitCode:0}}var M$=U(()=>{IA();P0();$G();k0();H_();YG();I1();u();iG();$_();r_();n1();iA();zA();L0();d0()});var F8={};k(F8,{runRelatedInternal:()=>dQ,executeRelatedCommand:()=>jG,createRelatedCommand:()=>q$});import{Command as mQ,Option as x_}from"commander";function q$(){return new mQ("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new x_("--limit <n>","Maximum results").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Limit must be a positive number");return _}).default(10)).addOption(new x_("--hops <n>","Traversal depth (1-3)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1||_>3)throw Error("Hops must be 1, 2, or 3");return _}).default(2)).addOption(new x_("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new x_("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new x_("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new x_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A,_)=>{let G=await jG(A,_);process.exitCode=G.exitCode})}async function jG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await G(A,{..._,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function dQ(A,_,G){let $=performance.now();if(_.format==="detailed")LA({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{let Y=new J_(Z),J=new m(Z),H=_.type??"session",Q=await Y.findRelatedWithHops(H,A,_.hops??2),X="brief";if(_.json)X="json";else if(_.verbose)X="verbose";else if(_.quiet)X="quiet";else if(_.format==="detailed")X="detailed";let V=v(),B=j2(X,V);if(Q.length===0){let M=await Y.findBySource(H,A),O=await Y.findByTarget(H,A);if(M.length===0&&O.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let R=B.formatEmpty(A);if(X!=="quiet"||R)console.error(R)}return{exitCode:1}}}let W=new Map;for(let{link:M,hop:O}of Q)if(M.targetType==="session"){let R=W.get(M.targetId);if(!R||M.weight>R.weight)W.set(M.targetId,{weight:M.weight,hops:O})}W.delete(A);let N=Array.from(W.entries()).sort((M,O)=>O[1].weight-M[1].weight||M[1].hops-O[1].hops).slice(0,_.limit??10),z=[];for(let[M,{weight:O,hops:R}]of N){let y=await J.findById(M);if(y)z.push({session:y,weight:O,hops:R})}if(z.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let M=B.formatEmpty(A);if(X!=="quiet"||M)console.error(M)}return{exitCode:1}}if(_.json){let M=performance.now();return e({command:"related",kind:"related",data:z.map(y9),meta:{source_id:A,source_type:H,count:z.length,timing_ms:Math.round(M-$)}}),{exitCode:0}}let q=performance.now(),I={sourceId:A,executionTimeMs:Math.round(q-$)},T=B.formatRelated(z,I);if(_.format==="ai")T=_A(T);return console.log(T),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"related",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var U$=U(()=>{IA();k5();u();F2();nA();iA();zA();L0();d0()});var S_={};k(S_,{executeQueryCommand:()=>GK,createQueryCommand:()=>T$});import{Command as lQ,Option as P_}from"commander";function T$(){return new lQ("query").argument("[argument]","Query argument (search query text, session ID, or project name depending on kind)").description("Execute unified query across sessions, files, stats, or context").addOption(new P_("--scope <scope>","Query scope: global or project").choices(["global","project"])).option("-p, --project <name>","Filter by project name").addOption(new P_("--kind <kind>","Resource kind to query").choices(["message","session","file","stats","context","related"]).default("message")).addOption(new P_("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"])).option("-l, --limit <count>","Maximum results to return").addOption(new P_("--format <type>","Output format: brief or ai").choices(["brief","ai","default"])).option("--json","Output results as JSON envelope").option("--days <count>","Filter results from last N days",(A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new P_("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new P_("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await GK(A,_);process.exitCode=G.exitCode})}async function GK(A,_){let G=_.kind??"message",$=_.project||(_.scope==="project"?A:void 0),K=!process.env.MEMORY_JSON_COMMAND_OVERRIDE;if(K)process.env.MEMORY_JSON_COMMAND_OVERRIDE="query";try{let Z=_;switch(G){case"message":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!1})}case"file":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!0})}case"session":if(A){let{runShowInternal:Y}=await Promise.resolve().then(() => (B$(),X8));return await Y(A,{json:Z.json,verbose:Z.verbose,quiet:Z.quiet,tools:Z.tools,format:Z.format},{dbPath:_.dbPath})}else{let{runListInternal:Y}=await Promise.resolve().then(() => (t2(),V8));return await Y({limit:_.limit,project:$,since:Z.since,before:Z.before,days:_.days,json:_.json,verbose:_.verbose,quiet:_.quiet,format:_.format},{dbPath:_.dbPath})}case"stats":{let{executeStatsCommand:Y}=await Promise.resolve().then(() => (AK(),I8));return await Y({json:_.json,verbose:_.verbose,quiet:_.quiet,projects:_.projects,format:_.format},{dbPath:_.dbPath})}case"context":{let Y=$||A;if(!Y){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Project name is required for context query"});else console.error("Error: Project name is required for context query");return{exitCode:1}}let{runContextInternal:J}=await Promise.resolve().then(() => (M$(),R8));return await J(Y,{json:_.json,verbose:_.verbose,quiet:_.quiet,days:_.days,format:Z.format,budget:Z.budget,crossProject:Z.crossProject},{dbPath:_.dbPath})}case"related":{if(!A){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Source session ID is required for related query"});else console.error("Error: Source session ID is required for related query");return{exitCode:1}}let{runRelatedInternal:Y}=await Promise.resolve().then(() => (U$(),F8));return await Y(A,{limit:Z.limit,json:_.json,verbose:_.verbose,quiet:_.quiet,format:Z.format,type:Z.type,hops:Z.hops,dbPath:_.dbPath},{dbPath:_.dbPath})}default:{if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:`Unsupported kind: ${G}`});else console.error(`Error: Unsupported kind: ${G}`);return{exitCode:1}}}}finally{if(K)delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}var l0=U(()=>{zA()});var _K={};k(_K,{runSearchInternal:()=>nQ,resolveSearchMode:()=>S8,filterCaseSensitive:()=>E8,executeSearchCommand:()=>FG,createSearchCommand:()=>I$});import{Command as pQ,Option as rA}from"commander";function S8(A){if(A.vector===!1)return"fts";if(!A.mode||A.mode==="auto")return;return A.mode}function I$(){return new pQ("search").argument("<query>","Search query text").description("Search across all sessions (keyword, semantic, or hybrid)").option("-l, --limit <count>","Maximum results to return","10").option("-p, --project <name>","Filter by project name").option("-s, --session <id>","Filter by session ID").option("--role <roles>","Filter by role: user, assistant, or both (comma-separated)").addOption(new rA("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new rA("--before <date>","Results before date").conflicts("days")).addOption(new rA("--days <n>","Results from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output results as JSON").option("-i, --ignore-case","Case-insensitive search (default)").option("-c, --case-sensitive","Case-sensitive search").addOption(new rA("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new rA("--no-vector","Disable vector search (same as --mode fts)")).addOption(new rA("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new rA("--format <type>","Output format: brief (single-line per record) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new rA("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new rA("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await FG(A,_);process.exitCode=G.exitCode})}async function FG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=_.files?"file":"message",K=_.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="search";try{return await G(A,{..._,kind:$,scope:K})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function nQ(A,_){let G=performance.now();if(_.format==="default")LA({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let $;try{$=GG.from(A)}catch(H){if(_.json)h({command:"search",code:"INVALID_QUERY",message:"Query cannot be empty"});else console.error("Error: Query cannot be empty");return{exitCode:1}}if(_.files)return iQ(A,_);let K=_.dbPath??S(),{db:Z,sqliteVecAvailable:Y}=D({path:K}),J=new s1;try{let H=f(),Q=new Q_(Z),X=new dA(Z),V=new X_({db:Z,fts5Service:Q,embeddingRepo:X,providerFactory:J,config:H,sqliteVecAvailable:Y}),B=parseInt(_.limit??"10",10);if(isNaN(B)||B<1){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let W;if(_.role){let b=_.role.split(",").map((v_)=>v_.trim().toLowerCase());if(b.length===1)W=b[0];else W=b}let N,z;if(_.days){let b=new Date,v_=new Date(b.getFullYear(),b.getMonth(),b.getDate());N=new Date(v_.getTime()-(_.days-1)*24*60*60*1000)}else{if(_.since)try{N=F_(_.since)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"since",value:_.since}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}if(_.before)try{z=F_(_.before)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"before",value:_.before}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}}let q=S8(_),T={limit:_.caseSensitive?B*2:B,projectFilter:_.project,roleFilter:W,sinceDate:N,beforeDate:z,sessionFilter:_.session,mode:q,noDecay:_.decay===!1},M=await V.search($,T),O=!1;if(_.caseSensitive&&M.length>0){let b=M.length;M=E8(M,A,B),O=b>M.length||M.length<B}else M=M.slice(0,B);let R=V.getLastSearchMeta(),y="default";if(_.json)y="json";else if(_.quiet)y="quiet";else if(_.verbose)y="verbose";else if(_.format==="brief")y="brief";let HA=v(),tA=N2(y,HA),eA=performance.now(),sA={query:A,executionDetails:{timeMs:Math.round(eA-G),ftsQuery:A,filtersApplied:rQ(_,O)},searchMeta:R??void 0},SZ=Math.round(performance.now()-G),EZ=()=>{let b={query:A,total_results:M.length,timing_ms:SZ};if(R){if(b.mode=R.mode,b.mode_reason=R.modeReason,b.embedding_coverage=R.embeddingCoverage,b.degraded=R.degraded,R.degradationReason)b.degradation_reason=R.degradationReason}return b};if(_.json){if(e({command:"search",kind:"message",data:M.map((b,v_)=>u1(b,{rank:v_+1,includeSearchMetaFields:!!R})),meta:EZ()}),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}if(M.length===0&&R?.mode==="vector")return console.log(`No semantic matches for "${A}"`),{exitCode:0};let x$=tA.formatResults(M,sA);if(_.format==="ai")x$=_A(x$);if(console.log(x$),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(_.json)h({command:"search",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{await J.dispose(),E(Z)}}async function iQ(A,_){if(!i2()){if(_.json)h({command:"search",code:"QMD_UNAVAILABLE",message:"qmd is required for --files search. Install: bun add -g @tobilu/qmd"});else console.error("Error: qmd is required for --files search. Install: bun add -g @tobilu/qmd");return{exitCode:1}}try{let $=await new H$().search(A);if(_.json)return e({command:"search",kind:"file",data:$.map(x9),meta:{query:A,files:!0,total_results:$.length}}),{exitCode:0};if($.length===0){let Y=`No file results for "${A}"`;return console.log(_.format==="ai"?Y:Y),{exitCode:0}}let K=v(),Z=aQ($,K);if(_.format==="ai")Z=_A(Z);return console.log(Z),{exitCode:0}}catch(G){let $=L(G);if(_.json)h({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${$}`});else console.error(`Error: qmd search failed: ${$}`);return{exitCode:1}}}function aQ(A,_){let G=[];G.push(`File results: ${A.length} match${A.length!==1?"es":""}`),G.push("");for(let $ of A){let K=$.file.replace(/^qmd:\/\//,"");G.push(` ${C($.title,_)}`),G.push(` ${P(`${K} (score: ${$.score})`,_)}`);let Z=$.snippet||$.context;if(Z)G.push(` ${Z}`);G.push("")}return G.join(`
1412
- `)}function rQ(A,_){let G=[];if(A.limit)G.push(`limit: ${A.limit}`);if(A.project)G.push(`project: ${A.project}`);if(A.session)G.push(`session: ${A.session}`);if(A.role)G.push(`role: ${A.role}`);if(A.days)G.push(`days: ${A.days}`);if(A.since)G.push(`since: ${A.since}`);if(A.before)G.push(`before: ${A.before}`);if(A.caseSensitive)G.push("case-sensitive");if(_)G.push("case-sensitive filter applied");if(A.mode&&A.mode!=="auto")G.push(`mode: ${A.mode}`);if(A.vector===!1)G.push("no-vector");if(A.decay===!1)G.push("no-decay");return G}function E8(A,_,G){return A.filter((K)=>{return K.snippet.replace(/<\/?mark>/g,"").includes(_)}).slice(0,G)}var RG=U(()=>{IA();u();o1();JA();d1();nA();n2();iA();zA();L0();d0();X$()});var UZ={};k(UZ,{ClaudeSummaryGenerator:()=>qZ});import{spawn as dV}from"child_process";class qZ{async generateSummary(A,_,G,$,K){let Z=this.buildPrompt(A,_,G,$,K);return new Promise((Y,J)=>{let H={...process.env};delete H.CLAUDECODE;let Q=dV("claude",["-p","--output-format","text"],{env:H,stdio:["pipe","pipe","pipe"]}),X="",V="";Q.stdout.on("data",(B)=>{X+=B.toString()}),Q.stderr.on("data",(B)=>{V+=B.toString()}),Q.on("error",(B)=>{J(Error(`Failed to spawn claude -p: ${B.message}`))}),Q.on("close",(B)=>{if(B===0)Y(X.trim());else J(Error(`claude -p exited with code ${B}: ${V.trim()}`))}),Q.stdin.write(Z),Q.stdin.end()})}buildPrompt(A,_,G,$,K){return["Summarize this Claude Code session into a structured daily log entry.","Output ONLY the markdown content below, no preamble or explanation.","","Format:",`## Session: ${_} (${$} - ${K})`,`**Project:** ${G}`,"","### Topic","[1-2 sentence summary of what the session was about]","","### Decisions","- [Key technical decisions made, one per bullet]","","### Outcomes","- [What was built, changed, or accomplished]","","### Unresolved",'- [Open questions or incomplete work, or "None" if all resolved]',"","### Learnings","- [Technical insights or patterns discovered]","","### Key Files","- [Important files created or modified]","","Session content:",A].join(`
1413
- `)}}var TZ=()=>{};import{Command as $B}from"commander";var PK={name:"@chude/memory",version:"4.0.1",description:"Cross-project context persistence for Claude Code sessions",type:"module",main:"dist/index.js",types:"dist/index.d.ts",bin:{memory:"dist/presentation/cli/index.js"},files:["dist"],scripts:{"clean:dist":"bun run scripts/clean-dist.ts","build:types":"tsc --project tsconfig.lib.json","build:lib":"bun build src/index.ts --outdir dist --target bun --packages=external --minify --sourcemap=none","build:cli":"bun build src/presentation/cli/index.ts --outdir dist/presentation/cli --target bun --packages=external --minify --sourcemap=none",build:"bun run clean:dist && bun run build:types && bun run build:lib && bun run build:cli","build:hook":"bun build src/infrastructure/hooks/sync-hook-script.ts --outfile=dist/sync-hook.js --target=bun",test:"bun test","test:coverage":"bun run scripts/run-istanbul-bun-coverage.ts --coverage-dir coverage && bun run scripts/check-coverage-thresholds.ts --summary coverage/coverage-summary.json --threshold 95","eval:v5":"bun run scripts/eval-v5.ts","eval:v5:market":"bun run scripts/eval-v5.ts --market-ready",quality:"bun run typecheck && bun run build && bun test --timeout 15000 && bun run test:isolation && bun run eval:v5 && bun run test:coverage && bun audit","test:smoke":"bun test tests/smoke","verify:published":"bun run scripts/verify-published-package.ts","test:isolation":"bun run scripts/check-test-isolation.ts",typecheck:"tsc --noEmit && tsc --project tsconfig.scripts.json",lint:"bun run typecheck",mutation:"stryker run","mutation:domain":"stryker run --mutate 'src/domain/**/!(*.test).ts'"},author:"Chude <chude@emeke.org>",license:"MIT",devDependencies:{"@stryker-mutator/core":"9.6.1","@stryker-mutator/typescript-checker":"9.6.1","@stryker-mutator/vitest-runner":"9.6.1","@types/bun":"1.3.14","@types/cli-progress":"^3.11.6","@types/istanbul-lib-coverage":"^2.0.6","@types/istanbul-lib-instrument":"^1.7.8","@types/istanbul-lib-report":"^3.0.3","@types/istanbul-reports":"^3.0.4","istanbul-lib-coverage":"^3.2.2","istanbul-lib-instrument":"^6.0.3","istanbul-lib-report":"^3.0.1","istanbul-reports":"^3.2.0",typescript:"^5.5.0",vitest:"4.1.9"},engines:{bun:">=1.0.0"},keywords:["claude","claude-code","context","memory","session","search"],repository:{type:"git",url:"git+ssh://git@github.com/chudeemeke/memory-nexus.git"},dependencies:{"@anthropic-ai/claude-code":"2.1.185","@anthropic-ai/sdk":"0.98.1","@huggingface/transformers":"4.2.0","@inquirer/search":"4.2.0","@inquirer/select":"5.2.0","chart.js":"^4.5.1","chrono-node":"2.9.1","cli-progress":"^3.12.0",commander:"14.0.3",fuzzy:"^0.1.3","sqlite-vec":"0.1.9","string-width":"8.2.1"},overrides:{"@protobufjs/utf8":"1.1.1","fast-uri":"3.1.2",picomatch:"4.0.4",postcss:"8.5.15",protobufjs:"8.6.4",qs:"6.15.2",rollup:"4.60.4",vite:"8.0.16",yaml:"2.9.0"},trustedDependencies:["onnxruntime-node","protobufjs"]};u$();import{Command as XQ,Option as K8}from"commander";l_();hG();vG();IA();var pZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class wG{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor(A,_,G,$,K,Z,Y,J,H,Q=pZ){this.sessionSource=A;this.eventParser=_;this.sessionRepo=G;this.messageRepo=$;this.toolUseRepo=K;this.extractionStateRepo=Z;this.db=Y;this.abortSignal=J;this.checkpointManager=H;this.redactor=Q}async sync(A={}){let _=Date.now(),G=A.checkpointEnabled!==!1,$={success:!0,sessionsDiscovered:0,sessionsProcessed:0,sessionsSkipped:0,messagesInserted:0,toolUsesInserted:0,errors:[],durationMs:0,aborted:!1},K=null,Z=new Set;if(G){if(K=this.checkpointManager.load(),K){$.recoveredFromCheckpoint=K.completedSessions;for(let X of K.completedSessionIds)Z.add(X)}}A.onProgress?.({current:0,total:0,sessionId:"",phase:"discovering"});let Y;try{Y=await this.sessionSource.discoverSessions()}catch(X){throw new F(j.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:L(X)})}$.sessionsDiscovered=Y.length;let J=await this.filterSessions(Y,A);if(Z.size>0){let X=J.length;J=J.filter((V)=>!Z.has(V.id)),$.sessionsSkipped+=X-J.length}if($.sessionsSkipped=$.sessionsDiscovered-J.length-Z.size,$.sessionsSkipped<0)$.sessionsSkipped=$.sessionsDiscovered-J.length;let H=J.length+Z.size,Q=K??{startedAt:new Date().toISOString(),totalSessions:H,completedSessions:Z.size,completedSessionIds:[...Z],lastCompletedAt:null};for(let X=0;X<J.length;X++){if(this.abortSignal.shouldAbort()){if($.aborted=!0,G)this.checkpointManager.save(Q);break}let V=J[X];if(!V)continue;A.onProgress?.({current:X+1+Z.size,total:H,sessionId:V.id,phase:"extracting"});try{let B=await this.extractSession(V);if($.sessionsProcessed++,$.messagesInserted+=B.messages,$.toolUsesInserted+=B.toolUses,G)Q.completedSessions++,Q.completedSessionIds.push(V.id),Q.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(Q);A.onSessionComplete?.(V.id)}catch(B){let W=this.wrapError(B,V.path);$.errors.push({sessionPath:V.path,error:W.message}),$.success=!1}}if(G&&!$.aborted&&$.success)this.checkpointManager.clear();return A.onProgress?.({current:H,total:H,sessionId:"",phase:"complete"}),$.durationMs=Date.now()-_,$}async fixProjectNames(A){let _=await this.sessionRepo.findDistinctEncodedPaths(),G=0;for(let $ of _){let K=A.resolveFromEncodedPath($),Z=await this.sessionRepo.updateProjectName($,K);G+=Z}return G}wrapError(A,_){if(A instanceof F)return A;let G=L(A);if(G.includes("ENOENT")||G.includes("no such file"))return new F(j.SOURCE_INACCESSIBLE,`Cannot access session file: ${G}`,{path:_});if(G.includes("JSON")||G.includes("parse"))return new F(j.INVALID_JSON,`Failed to parse session file: ${G}`,{path:_});if(G.includes("locked")||G.includes("SQLITE_BUSY"))return new F(j.DB_LOCKED,`Database is locked: ${G}`,{path:_});if(G.includes("database")||G.includes("SQLITE"))return new F(j.DB_CONNECTION_FAILED,`Database error: ${G}`,{path:_});return new F(j.SYNC_FAILED,G,{path:_})}async filterSessions(A,_){let G=A;if(_.projectFilter)G=G.filter((K)=>K.projectPath.decoded.includes(_.projectFilter));if(_.sessionFilter)G=G.filter((K)=>K.id===_.sessionFilter);let $=[];for(let K of G){let Z=await this.extractionStateRepo.findBySessionPath(K.path);if(this.needsExtraction(K,Z,_.force??!1))$.push(K)}return $}needsExtraction(A,_,G){if(G)return!0;if(!_)return!0;if(_.status!=="complete")return!0;let{fileMtime:$,fileSize:K}=_;if(!$||K===void 0||K===null)return!0;return A.modifiedTime.getTime()!==$.getTime()||A.size!==K}async extractSession(A){let _=crypto.randomUUID(),G=VA.create({id:_,sessionPath:A.path,startedAt:new Date,status:"pending"}).withFileMetadata(A.modifiedTime,A.size);try{let $=[];for await(let X of this.eventParser.parse(A.path))$.push(X);let{messages:K,toolUses:Z,firstTimestamp:Y,lastTimestamp:J}=this.extractEntities($),H=xA.create({id:A.id,projectPath:A.projectPath,startTime:Y??new Date,endTime:J,messageCount:K.length});return this.db.transaction(()=>{if(this.sessionRepo.save(H),K.length>0)this.messageRepo.saveMany(K.map((V)=>({message:V,sessionId:A.id})));if(Z.length>0)this.toolUseRepo.saveMany(Z.map((V)=>({toolUse:V,sessionId:A.id})));let X=G.startProcessing().incrementMessages(K.length).complete(new Date);this.extractionStateRepo.save(X)}).immediate(),{messages:K.length,toolUses:Z.length}}catch($){let K=G.fail(L($));throw await this.extractionStateRepo.save(K),$}}extractEntities(A){let _=[],G=[],$=new Map,K,Z;for(let Y of A){if(Y.type==="skipped")continue;if("data"in Y&&Y.data.timestamp){let J=new Date(Y.data.timestamp);if(!K||J<K)K=J;if(!Z||J>Z)Z=J}switch(Y.type){case"user":{let J=TA.create({id:Y.data.uuid,role:"user",content:this.redactor.redactText(Y.data.message.content).text,timestamp:new Date(Y.data.timestamp)});_.push(J);break}case"assistant":{let J=Y.data.message.content.filter((V)=>V.type==="text").map((V)=>V.text).join(`
1414
- `),H=this.redactor.redactText(J).text,Q=Y.data.message.content.filter((V)=>V.type==="tool_use").map((V)=>V.id);for(let V of Y.data.message.content)if(V.type==="tool_use"){let B=PA.create({id:V.id,name:V.name,input:this.redactor.redactJson(V.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(V.id,B)}let X=TA.create({id:Y.data.uuid,role:"assistant",content:H,timestamp:new Date(Y.data.timestamp),toolUseIds:Q});_.push(X);break}case"tool_use":{let J=PA.create({id:Y.data.uuid,name:Y.data.name,input:this.redactor.redactJson(Y.data.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(Y.data.uuid,J);break}case"tool_result":{let J=$.get(Y.data.toolUseId);if(J){let H=Y.data.isError?J.completeError(this.redactor.redactText(Y.data.content).text):J.completeSuccess(this.redactor.redactText(Y.data.content).text);$.set(Y.data.toolUseId,H)}break}case"summary":case"system":break}}return G.push(...$.values()),{messages:_,toolUses:G,firstTimestamp:K,lastTimestamp:Z}}}p_();d$();i$();import{existsSync as aZ}from"fs";var lK={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};function o0(A,_){return A.redactText(_).text}function n_(A,_){return _===null?null:o0(A,_)}async function a$(A,_,G={}){let $=G.includeSensitive?lK:G.redactor??lK,K=A.query(`SELECT id, project_path_encoded as projectPathEncoded,
1411
+ `);console.log(M)}}return{exitCode:0}}var M1=U(()=>{IA();P0();$G();k0();H_();YG();I$();u();iG();$_();r_();n$();iA();zA();L0();d0()});var F8={};k(F8,{runRelatedInternal:()=>dQ,executeRelatedCommand:()=>jG,createRelatedCommand:()=>q1});import{Command as mQ,Option as x_}from"commander";function q1(){return new mQ("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new x_("--limit <n>","Maximum results").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Limit must be a positive number");return _}).default(10)).addOption(new x_("--hops <n>","Traversal depth (1-3)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1||_>3)throw Error("Hops must be 1, 2, or 3");return _}).default(2)).addOption(new x_("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new x_("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new x_("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new x_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A,_)=>{let G=await jG(A,_);process.exitCode=G.exitCode})}async function jG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await G(A,{..._,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function dQ(A,_,G){let $=performance.now();if(_.format==="detailed")LA({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{let Y=new J_(Z),J=new m(Z),H=_.type??"session",Q=await Y.findRelatedWithHops(H,A,_.hops??2),X="brief";if(_.json)X="json";else if(_.verbose)X="verbose";else if(_.quiet)X="quiet";else if(_.format==="detailed")X="detailed";let V=v(),B=j2(X,V);if(Q.length===0){let M=await Y.findBySource(H,A),O=await Y.findByTarget(H,A);if(M.length===0&&O.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let R=B.formatEmpty(A);if(X!=="quiet"||R)console.error(R)}return{exitCode:1}}}let W=new Map;for(let{link:M,hop:O}of Q)if(M.targetType==="session"){let R=W.get(M.targetId);if(!R||M.weight>R.weight)W.set(M.targetId,{weight:M.weight,hops:O})}W.delete(A);let N=Array.from(W.entries()).sort((M,O)=>O[1].weight-M[1].weight||M[1].hops-O[1].hops).slice(0,_.limit??10),z=[];for(let[M,{weight:O,hops:R}]of N){let y=await J.findById(M);if(y)z.push({session:y,weight:O,hops:R})}if(z.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let M=B.formatEmpty(A);if(X!=="quiet"||M)console.error(M)}return{exitCode:1}}if(_.json){let M=performance.now();return e({command:"related",kind:"related",data:z.map(y9),meta:{source_id:A,source_type:H,count:z.length,timing_ms:Math.round(M-$)}}),{exitCode:0}}let q=performance.now(),I={sourceId:A,executionTimeMs:Math.round(q-$)},T=B.formatRelated(z,I);if(_.format==="ai")T=_A(T);return console.log(T),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"related",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var U1=U(()=>{IA();k5();u();F2();nA();iA();zA();L0();d0()});var S_={};k(S_,{executeQueryCommand:()=>GK,createQueryCommand:()=>T1});import{Command as lQ,Option as P_}from"commander";function T1(){return new lQ("query").argument("[argument]","Query argument (search query text, session ID, or project name depending on kind)").description("Execute unified query across sessions, files, stats, or context").addOption(new P_("--scope <scope>","Query scope: global or project").choices(["global","project"])).option("-p, --project <name>","Filter by project name").addOption(new P_("--kind <kind>","Resource kind to query").choices(["message","session","file","stats","context","related"]).default("message")).addOption(new P_("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"])).option("-l, --limit <count>","Maximum results to return").addOption(new P_("--format <type>","Output format: brief or ai").choices(["brief","ai","default"])).option("--json","Output results as JSON envelope").option("--days <count>","Filter results from last N days",(A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new P_("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new P_("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await GK(A,_);process.exitCode=G.exitCode})}async function GK(A,_){let G=_.kind??"message",$=_.project||(_.scope==="project"?A:void 0),K=!process.env.MEMORY_JSON_COMMAND_OVERRIDE;if(K)process.env.MEMORY_JSON_COMMAND_OVERRIDE="query";try{let Z=_;switch(G){case"message":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!1})}case"file":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!0})}case"session":if(A){let{runShowInternal:Y}=await Promise.resolve().then(() => (B1(),X8));return await Y(A,{json:Z.json,verbose:Z.verbose,quiet:Z.quiet,tools:Z.tools,format:Z.format},{dbPath:_.dbPath})}else{let{runListInternal:Y}=await Promise.resolve().then(() => (t2(),V8));return await Y({limit:_.limit,project:$,since:Z.since,before:Z.before,days:_.days,json:_.json,verbose:_.verbose,quiet:_.quiet,format:_.format},{dbPath:_.dbPath})}case"stats":{let{executeStatsCommand:Y}=await Promise.resolve().then(() => (AK(),I8));return await Y({json:_.json,verbose:_.verbose,quiet:_.quiet,projects:_.projects,format:_.format},{dbPath:_.dbPath})}case"context":{let Y=$||A;if(!Y){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Project name is required for context query"});else console.error("Error: Project name is required for context query");return{exitCode:1}}let{runContextInternal:J}=await Promise.resolve().then(() => (M1(),R8));return await J(Y,{json:_.json,verbose:_.verbose,quiet:_.quiet,days:_.days,format:Z.format,budget:Z.budget,crossProject:Z.crossProject},{dbPath:_.dbPath})}case"related":{if(!A){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Source session ID is required for related query"});else console.error("Error: Source session ID is required for related query");return{exitCode:1}}let{runRelatedInternal:Y}=await Promise.resolve().then(() => (U1(),F8));return await Y(A,{limit:Z.limit,json:_.json,verbose:_.verbose,quiet:_.quiet,format:Z.format,type:Z.type,hops:Z.hops,dbPath:_.dbPath},{dbPath:_.dbPath})}default:{if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:`Unsupported kind: ${G}`});else console.error(`Error: Unsupported kind: ${G}`);return{exitCode:1}}}}finally{if(K)delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}var l0=U(()=>{zA()});var _K={};k(_K,{runSearchInternal:()=>nQ,resolveSearchMode:()=>S8,filterCaseSensitive:()=>E8,executeSearchCommand:()=>FG,createSearchCommand:()=>I1});import{Command as pQ,Option as rA}from"commander";function S8(A){if(A.vector===!1)return"fts";if(!A.mode||A.mode==="auto")return;return A.mode}function I1(){return new pQ("search").argument("<query>","Search query text").description("Search across all sessions (keyword, semantic, or hybrid)").option("-l, --limit <count>","Maximum results to return","10").option("-p, --project <name>","Filter by project name").option("-s, --session <id>","Filter by session ID").option("--role <roles>","Filter by role: user, assistant, or both (comma-separated)").addOption(new rA("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new rA("--before <date>","Results before date").conflicts("days")).addOption(new rA("--days <n>","Results from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output results as JSON").option("-i, --ignore-case","Case-insensitive search (default)").option("-c, --case-sensitive","Case-sensitive search").addOption(new rA("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new rA("--no-vector","Disable vector search (same as --mode fts)")).addOption(new rA("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new rA("--format <type>","Output format: brief (single-line per record) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new rA("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new rA("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await FG(A,_);process.exitCode=G.exitCode})}async function FG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=_.files?"file":"message",K=_.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="search";try{return await G(A,{..._,kind:$,scope:K})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function nQ(A,_){let G=performance.now();if(_.format==="default")LA({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let $;try{$=GG.from(A)}catch(H){if(_.json)h({command:"search",code:"INVALID_QUERY",message:"Query cannot be empty"});else console.error("Error: Query cannot be empty");return{exitCode:1}}if(_.files)return iQ(A,_);let K=_.dbPath??S(),{db:Z,sqliteVecAvailable:Y}=D({path:K}),J=new s$;try{let H=f(),Q=new Q_(Z),X=new dA(Z),V=new X_({db:Z,fts5Service:Q,embeddingRepo:X,providerFactory:J,config:H,sqliteVecAvailable:Y}),B=parseInt(_.limit??"10",10);if(isNaN(B)||B<1){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let W;if(_.role){let b=_.role.split(",").map((v_)=>v_.trim().toLowerCase());if(b.length===1)W=b[0];else W=b}let N,z;if(_.days){let b=new Date,v_=new Date(b.getFullYear(),b.getMonth(),b.getDate());N=new Date(v_.getTime()-(_.days-1)*24*60*60*1000)}else{if(_.since)try{N=F_(_.since)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"since",value:_.since}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}if(_.before)try{z=F_(_.before)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"before",value:_.before}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}}let q=S8(_),T={limit:_.caseSensitive?B*2:B,projectFilter:_.project,roleFilter:W,sinceDate:N,beforeDate:z,sessionFilter:_.session,mode:q,noDecay:_.decay===!1},M=await V.search($,T),O=!1;if(_.caseSensitive&&M.length>0){let b=M.length;M=E8(M,A,B),O=b>M.length||M.length<B}else M=M.slice(0,B);let R=V.getLastSearchMeta(),y="default";if(_.json)y="json";else if(_.quiet)y="quiet";else if(_.verbose)y="verbose";else if(_.format==="brief")y="brief";let HA=v(),tA=N2(y,HA),eA=performance.now(),sA={query:A,executionDetails:{timeMs:Math.round(eA-G),ftsQuery:A,filtersApplied:rQ(_,O)},searchMeta:R??void 0},SZ=Math.round(performance.now()-G),EZ=()=>{let b={query:A,total_results:M.length,timing_ms:SZ};if(R){if(b.mode=R.mode,b.mode_reason=R.modeReason,b.embedding_coverage=R.embeddingCoverage,b.degraded=R.degraded,R.degradationReason)b.degradation_reason=R.degradationReason}return b};if(_.json){if(e({command:"search",kind:"message",data:M.map((b,v_)=>u$(b,{rank:v_+1,includeSearchMetaFields:!!R})),meta:EZ()}),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}if(M.length===0&&R?.mode==="vector")return console.log(`No semantic matches for "${A}"`),{exitCode:0};let x1=tA.formatResults(M,sA);if(_.format==="ai")x1=_A(x1);if(console.log(x1),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(_.json)h({command:"search",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{await J.dispose(),E(Z)}}async function iQ(A,_){if(!i2()){if(_.json)h({command:"search",code:"QMD_UNAVAILABLE",message:"qmd is required for --files search. Install: bun add -g @tobilu/qmd"});else console.error("Error: qmd is required for --files search. Install: bun add -g @tobilu/qmd");return{exitCode:1}}try{let $=await new H1().search(A);if(_.json)return e({command:"search",kind:"file",data:$.map(x9),meta:{query:A,files:!0,total_results:$.length}}),{exitCode:0};if($.length===0){let Y=`No file results for "${A}"`;return console.log(_.format==="ai"?Y:Y),{exitCode:0}}let K=v(),Z=aQ($,K);if(_.format==="ai")Z=_A(Z);return console.log(Z),{exitCode:0}}catch(G){let $=L(G);if(_.json)h({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${$}`});else console.error(`Error: qmd search failed: ${$}`);return{exitCode:1}}}function aQ(A,_){let G=[];G.push(`File results: ${A.length} match${A.length!==1?"es":""}`),G.push("");for(let $ of A){let K=$.file.replace(/^qmd:\/\//,"");G.push(` ${C($.title,_)}`),G.push(` ${P(`${K} (score: ${$.score})`,_)}`);let Z=$.snippet||$.context;if(Z)G.push(` ${Z}`);G.push("")}return G.join(`
1412
+ `)}function rQ(A,_){let G=[];if(A.limit)G.push(`limit: ${A.limit}`);if(A.project)G.push(`project: ${A.project}`);if(A.session)G.push(`session: ${A.session}`);if(A.role)G.push(`role: ${A.role}`);if(A.days)G.push(`days: ${A.days}`);if(A.since)G.push(`since: ${A.since}`);if(A.before)G.push(`before: ${A.before}`);if(A.caseSensitive)G.push("case-sensitive");if(_)G.push("case-sensitive filter applied");if(A.mode&&A.mode!=="auto")G.push(`mode: ${A.mode}`);if(A.vector===!1)G.push("no-vector");if(A.decay===!1)G.push("no-decay");return G}function E8(A,_,G){return A.filter((K)=>{return K.snippet.replace(/<\/?mark>/g,"").includes(_)}).slice(0,G)}var RG=U(()=>{IA();u();o$();JA();d$();nA();n2();iA();zA();L0();d0();X1()});var UZ={};k(UZ,{ClaudeSummaryGenerator:()=>qZ});import{spawn as dV}from"child_process";class qZ{async generateSummary(A,_,G,$,K){let Z=this.buildPrompt(A,_,G,$,K);return new Promise((Y,J)=>{let H={...process.env};delete H.CLAUDECODE;let Q=dV("claude",["-p","--output-format","text"],{env:H,stdio:["pipe","pipe","pipe"]}),X="",V="";Q.stdout.on("data",(B)=>{X+=B.toString()}),Q.stderr.on("data",(B)=>{V+=B.toString()}),Q.on("error",(B)=>{J(Error(`Failed to spawn claude -p: ${B.message}`))}),Q.on("close",(B)=>{if(B===0)Y(X.trim());else J(Error(`claude -p exited with code ${B}: ${V.trim()}`))}),Q.stdin.write(Z),Q.stdin.end()})}buildPrompt(A,_,G,$,K){return["Summarize this Claude Code session into a structured daily log entry.","Output ONLY the markdown content below, no preamble or explanation.","","Format:",`## Session: ${_} (${$} - ${K})`,`**Project:** ${G}`,"","### Topic","[1-2 sentence summary of what the session was about]","","### Decisions","- [Key technical decisions made, one per bullet]","","### Outcomes","- [What was built, changed, or accomplished]","","### Unresolved",'- [Open questions or incomplete work, or "None" if all resolved]',"","### Learnings","- [Technical insights or patterns discovered]","","### Key Files","- [Important files created or modified]","","Session content:",A].join(`
1413
+ `)}}var TZ=()=>{};import{Command as $B}from"commander";var PK={name:"@chude/memory",version:"4.0.2",description:"Cross-project context persistence for Claude Code sessions",type:"module",main:"dist/index.js",types:"dist/index.d.ts",bin:{memory:"dist/presentation/cli/index.js"},files:["dist"],scripts:{"clean:dist":"bun run scripts/clean-dist.ts","build:types":"tsc --project tsconfig.lib.json","build:lib":"bun build src/index.ts --outdir dist --target bun --packages=external --minify --sourcemap=none","build:cli":"bun build src/presentation/cli/index.ts --outdir dist/presentation/cli --target bun --packages=external --minify --sourcemap=none",build:"bun run clean:dist && bun run build:types && bun run build:lib && bun run build:cli","build:hook":"bun build src/infrastructure/hooks/sync-hook-script.ts --outfile=dist/sync-hook.js --target=bun",test:"bun test","test:coverage":"bun run scripts/run-istanbul-bun-coverage.ts --coverage-dir coverage && bun run scripts/check-coverage-thresholds.ts --summary coverage/coverage-summary.json --threshold 95","eval:v5":"bun run scripts/eval-v5.ts","eval:v5:market":"bun run scripts/eval-v5.ts --market-ready",quality:"bun run typecheck && bun run build && bun test --timeout 15000 && bun run test:isolation && bun run eval:v5 && bun run test:coverage && bun audit","test:smoke":"bun test tests/smoke","verify:published":"bun run scripts/verify-published-package.ts","test:isolation":"bun run scripts/check-test-isolation.ts",typecheck:"tsc --noEmit && tsc --project tsconfig.scripts.json",lint:"bun run typecheck",mutation:"stryker run","mutation:domain":"stryker run --mutate 'src/domain/**/!(*.test).ts'"},author:"Chude <chude@emeke.org>",license:"MIT",devDependencies:{"@stryker-mutator/core":"9.6.1","@stryker-mutator/typescript-checker":"9.6.1","@stryker-mutator/vitest-runner":"9.6.1","@types/bun":"1.3.14","@types/cli-progress":"^3.11.6","@types/istanbul-lib-coverage":"^2.0.6","@types/istanbul-lib-instrument":"^1.7.8","@types/istanbul-lib-report":"^3.0.3","@types/istanbul-reports":"^3.0.4","istanbul-lib-coverage":"^3.2.2","istanbul-lib-instrument":"^6.0.3","istanbul-lib-report":"^3.0.1","istanbul-reports":"^3.2.0",typescript:"^5.5.0",vitest:"4.1.9"},engines:{bun:">=1.0.0"},keywords:["claude","claude-code","context","memory","session","search"],repository:{type:"git",url:"git+ssh://git@github.com/chudeemeke/memory-nexus.git"},dependencies:{"@anthropic-ai/claude-code":"2.1.185","@anthropic-ai/sdk":"0.98.1","@huggingface/transformers":"4.2.0","@inquirer/search":"4.2.0","@inquirer/select":"5.2.0","chart.js":"^4.5.1","chrono-node":"2.9.1","cli-progress":"^3.12.0",commander:"14.0.3",fuzzy:"^0.1.3","sqlite-vec":"0.1.9","string-width":"8.2.1"},overrides:{"@protobufjs/utf8":"1.1.1","fast-uri":"3.1.2",picomatch:"4.0.4",postcss:"8.5.15",protobufjs:"8.6.4",qs:"6.15.2",rollup:"4.60.4",vite:"8.0.16",yaml:"2.9.0"},trustedDependencies:["onnxruntime-node","protobufjs"]};u1();import{Command as XQ,Option as K8}from"commander";l_();hG();vG();IA();var pZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class wG{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor(A,_,G,$,K,Z,Y,J,H,Q=pZ){this.sessionSource=A;this.eventParser=_;this.sessionRepo=G;this.messageRepo=$;this.toolUseRepo=K;this.extractionStateRepo=Z;this.db=Y;this.abortSignal=J;this.checkpointManager=H;this.redactor=Q}async sync(A={}){let _=Date.now(),G=A.checkpointEnabled!==!1,$={success:!0,sessionsDiscovered:0,sessionsProcessed:0,sessionsSkipped:0,messagesInserted:0,toolUsesInserted:0,errors:[],durationMs:0,aborted:!1},K=null,Z=new Set;if(G){if(K=this.checkpointManager.load(),K){$.recoveredFromCheckpoint=K.completedSessions;for(let X of K.completedSessionIds)Z.add(X)}}A.onProgress?.({current:0,total:0,sessionId:"",phase:"discovering"});let Y;try{Y=await this.sessionSource.discoverSessions()}catch(X){throw new F(j.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:L(X)})}$.sessionsDiscovered=Y.length;let J=await this.filterSessions(Y,A);if(Z.size>0){let X=J.length;J=J.filter((V)=>!Z.has(V.id)),$.sessionsSkipped+=X-J.length}if($.sessionsSkipped=$.sessionsDiscovered-J.length-Z.size,$.sessionsSkipped<0)$.sessionsSkipped=$.sessionsDiscovered-J.length;let H=J.length+Z.size,Q=K??{startedAt:new Date().toISOString(),totalSessions:H,completedSessions:Z.size,completedSessionIds:[...Z],lastCompletedAt:null};for(let X=0;X<J.length;X++){if(this.abortSignal.shouldAbort()){if($.aborted=!0,G)this.checkpointManager.save(Q);break}let V=J[X];if(!V)continue;A.onProgress?.({current:X+1+Z.size,total:H,sessionId:V.id,phase:"extracting"});try{let B=await this.extractSession(V);if($.sessionsProcessed++,$.messagesInserted+=B.messages,$.toolUsesInserted+=B.toolUses,G)Q.completedSessions++,Q.completedSessionIds.push(V.id),Q.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(Q);A.onSessionComplete?.(V.id)}catch(B){let W=this.wrapError(B,V.path);$.errors.push({sessionPath:V.path,error:W.message}),$.success=!1}}if(G&&!$.aborted&&$.success)this.checkpointManager.clear();return A.onProgress?.({current:H,total:H,sessionId:"",phase:"complete"}),$.durationMs=Date.now()-_,$}async fixProjectNames(A){let _=await this.sessionRepo.findDistinctEncodedPaths(),G=0;for(let $ of _){let K=A.resolveFromEncodedPath($),Z=await this.sessionRepo.updateProjectName($,K);G+=Z}return G}wrapError(A,_){if(A instanceof F)return A;let G=L(A);if(G.includes("ENOENT")||G.includes("no such file"))return new F(j.SOURCE_INACCESSIBLE,`Cannot access session file: ${G}`,{path:_});if(G.includes("JSON")||G.includes("parse"))return new F(j.INVALID_JSON,`Failed to parse session file: ${G}`,{path:_});if(G.includes("locked")||G.includes("SQLITE_BUSY"))return new F(j.DB_LOCKED,`Database is locked: ${G}`,{path:_});if(G.includes("database")||G.includes("SQLITE"))return new F(j.DB_CONNECTION_FAILED,`Database error: ${G}`,{path:_});return new F(j.SYNC_FAILED,G,{path:_})}async filterSessions(A,_){let G=A;if(_.projectFilter)G=G.filter((K)=>K.projectPath.decoded.includes(_.projectFilter));if(_.sessionFilter)G=G.filter((K)=>K.id===_.sessionFilter);let $=[];for(let K of G){let Z=await this.extractionStateRepo.findBySessionPath(K.path);if(this.needsExtraction(K,Z,_.force??!1))$.push(K)}return $}needsExtraction(A,_,G){if(G)return!0;if(!_)return!0;if(_.status!=="complete")return!0;let{fileMtime:$,fileSize:K}=_;if(!$||K===void 0||K===null)return!0;return A.modifiedTime.getTime()!==$.getTime()||A.size!==K}async extractSession(A){let _=crypto.randomUUID(),G=VA.create({id:_,sessionPath:A.path,startedAt:new Date,status:"pending"}).withFileMetadata(A.modifiedTime,A.size);try{let $=[];for await(let X of this.eventParser.parse(A.path))$.push(X);let{messages:K,toolUses:Z,firstTimestamp:Y,lastTimestamp:J}=this.extractEntities($),H=xA.create({id:A.id,projectPath:A.projectPath,startTime:Y??new Date,endTime:J,messageCount:K.length});return this.db.transaction(()=>{if(this.sessionRepo.save(H),K.length>0)this.messageRepo.saveMany(K.map((V)=>({message:V,sessionId:A.id})));if(Z.length>0)this.toolUseRepo.saveMany(Z.map((V)=>({toolUse:V,sessionId:A.id})));let X=G.startProcessing().incrementMessages(K.length).complete(new Date);this.extractionStateRepo.save(X)}).immediate(),{messages:K.length,toolUses:Z.length}}catch($){let K=G.fail(L($));throw await this.extractionStateRepo.save(K),$}}extractEntities(A){let _=[],G=[],$=new Map,K,Z;for(let Y of A){if(Y.type==="skipped")continue;if("data"in Y&&Y.data.timestamp){let J=new Date(Y.data.timestamp);if(!K||J<K)K=J;if(!Z||J>Z)Z=J}switch(Y.type){case"user":{let J=TA.create({id:Y.data.uuid,role:"user",content:this.redactor.redactText(Y.data.message.content).text,timestamp:new Date(Y.data.timestamp)});_.push(J);break}case"assistant":{let J=Y.data.message.content.filter((V)=>V.type==="text").map((V)=>V.text).join(`
1414
+ `),H=this.redactor.redactText(J).text,Q=Y.data.message.content.filter((V)=>V.type==="tool_use").map((V)=>V.id);for(let V of Y.data.message.content)if(V.type==="tool_use"){let B=PA.create({id:V.id,name:V.name,input:this.redactor.redactJson(V.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(V.id,B)}let X=TA.create({id:Y.data.uuid,role:"assistant",content:H,timestamp:new Date(Y.data.timestamp),toolUseIds:Q});_.push(X);break}case"tool_use":{let J=PA.create({id:Y.data.uuid,name:Y.data.name,input:this.redactor.redactJson(Y.data.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(Y.data.uuid,J);break}case"tool_result":{let J=$.get(Y.data.toolUseId);if(J){let H=Y.data.isError?J.completeError(this.redactor.redactText(Y.data.content).text):J.completeSuccess(this.redactor.redactText(Y.data.content).text);$.set(Y.data.toolUseId,H)}break}case"summary":case"system":break}}return G.push(...$.values()),{messages:_,toolUses:G,firstTimestamp:K,lastTimestamp:Z}}}p_();d1();i1();import{existsSync as aZ}from"fs";var lK={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};function o0(A,_){return A.redactText(_).text}function n_(A,_){return _===null?null:o0(A,_)}async function a1(A,_,G={}){let $=G.includeSensitive?lK:G.redactor??lK,K=A.query(`SELECT id, project_path_encoded as projectPathEncoded,
1415
1415
  project_path_decoded as projectPathDecoded,
1416
1416
  project_name as projectName,
1417
1417
  start_time as startTime, end_time as endTime,
@@ -1433,7 +1433,7 @@ ${O.content}`).join(`
1433
1433
  FROM extraction_state`).all().map((z)=>({...z,sessionPath:o0($,z.sessionPath),errorMessage:n_($,z.errorMessage)})),B=A.query(`SELECT uuid, type, project, content, metadata,
1434
1434
  observed_at as observedAt, superseded_at as supersededAt,
1435
1435
  superseded_by as supersededBy
1436
- FROM facts`).all().map((z)=>({...z,content:o0($,z.content),metadata:n_($,z.metadata)})),W={version:"1.0",exportedAt:new Date().toISOString(),stats:{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,sessionEntities:Q.length,entityLinks:X.length,extractionStates:V.length,facts:B.length},sessions:K,messages:Z,toolUses:Y,entities:J,links:H,sessionEntities:Q,entityLinks:X,extractionStates:V,facts:B},N=JSON.stringify(W,null,2);return await Bun.write(_,N),{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,bytes:N.length,facts:B.length}}async function fG(A){if(!aZ(A))return{valid:!1,error:"File does not exist"};try{let G=await Bun.file(A).text(),$=JSON.parse(G);if(!$.version||typeof $.version!=="string")return{valid:!1,error:"Missing or invalid version field"};let K=["sessions","messages","toolUses","entities","links"];for(let Z of K)if(!Array.isArray($[Z]))return{valid:!1,error:`Missing or invalid ${Z} array`};if(!$.stats||typeof $.stats!=="object")return{valid:!1,error:"Missing or invalid stats object"};return{valid:!0,version:$.version}}catch(_){return{valid:!1,error:`Failed to parse file: ${L(_)}`}}}async function r$(A,_,G={}){let $=await fG(_);if(!$.valid)throw Error(`Invalid export file: ${$.error}`);let Z=await Bun.file(_).text(),Y=JSON.parse(Z);if(G.clearExisting)rZ(A);return A.transaction(()=>{let H=A.prepare(`
1436
+ FROM facts`).all().map((z)=>({...z,content:o0($,z.content),metadata:n_($,z.metadata)})),W={version:"1.0",exportedAt:new Date().toISOString(),stats:{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,sessionEntities:Q.length,entityLinks:X.length,extractionStates:V.length,facts:B.length},sessions:K,messages:Z,toolUses:Y,entities:J,links:H,sessionEntities:Q,entityLinks:X,extractionStates:V,facts:B},N=JSON.stringify(W,null,2);return await Bun.write(_,N),{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,bytes:N.length,facts:B.length}}async function fG(A){if(!aZ(A))return{valid:!1,error:"File does not exist"};try{let G=await Bun.file(A).text(),$=JSON.parse(G);if(!$.version||typeof $.version!=="string")return{valid:!1,error:"Missing or invalid version field"};let K=["sessions","messages","toolUses","entities","links"];for(let Z of K)if(!Array.isArray($[Z]))return{valid:!1,error:`Missing or invalid ${Z} array`};if(!$.stats||typeof $.stats!=="object")return{valid:!1,error:"Missing or invalid stats object"};return{valid:!0,version:$.version}}catch(_){return{valid:!1,error:`Failed to parse file: ${L(_)}`}}}async function r1(A,_,G={}){let $=await fG(_);if(!$.valid)throw Error(`Invalid export file: ${$.error}`);let Z=await Bun.file(_).text(),Y=JSON.parse(Z);if(G.clearExisting)rZ(A);return A.transaction(()=>{let H=A.prepare(`
1437
1437
  INSERT OR IGNORE INTO sessions
1438
1438
  (id, project_path_encoded, project_path_decoded, project_name,
1439
1439
  start_time, end_time, message_count, summary)
@@ -1471,16 +1471,16 @@ ${O.content}`).join(`
1471
1471
  INSERT OR IGNORE INTO facts
1472
1472
  (uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by)
1473
1473
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1474
- `);for(let N of Y.facts)W.run(N.uuid,N.type,N.project,N.content,N.metadata,N.observedAt,N.supersededAt,N.supersededBy)}return{sessions:Y.sessions.length,messages:Y.messages.length,toolUses:Y.toolUses.length,entities:Y.entities.length,links:Y.links.length,facts:Y.facts?Y.facts.length:0}}).immediate()}function rZ(A){A.exec("PRAGMA foreign_keys = OFF;");try{A.exec("DELETE FROM session_entities;"),A.exec("DELETE FROM entity_links;"),A.exec("DELETE FROM links;"),A.exec("DELETE FROM messages_meta;"),A.exec("DELETE FROM sessions_fts;"),A.exec("DELETE FROM facts;"),A.exec("DELETE FROM tool_uses;"),A.exec("DELETE FROM sessions;"),A.exec("DELETE FROM entities;"),A.exec("DELETE FROM extraction_state;"),A.exec("DELETE FROM topics;")}finally{A.exec("PRAGMA foreign_keys = ON;")}}function t$(A){return(A.query(`SELECT (SELECT COUNT(*) FROM sessions) +
1474
+ `);for(let N of Y.facts)W.run(N.uuid,N.type,N.project,N.content,N.metadata,N.observedAt,N.supersededAt,N.supersededBy)}return{sessions:Y.sessions.length,messages:Y.messages.length,toolUses:Y.toolUses.length,entities:Y.entities.length,links:Y.links.length,facts:Y.facts?Y.facts.length:0}}).immediate()}function rZ(A){A.exec("PRAGMA foreign_keys = OFF;");try{A.exec("DELETE FROM session_entities;"),A.exec("DELETE FROM entity_links;"),A.exec("DELETE FROM links;"),A.exec("DELETE FROM messages_meta;"),A.exec("DELETE FROM sessions_fts;"),A.exec("DELETE FROM facts;"),A.exec("DELETE FROM tool_uses;"),A.exec("DELETE FROM sessions;"),A.exec("DELETE FROM entities;"),A.exec("DELETE FROM extraction_state;"),A.exec("DELETE FROM topics;")}finally{A.exec("PRAGMA foreign_keys = ON;")}}function t1(A){return(A.query(`SELECT (SELECT COUNT(*) FROM sessions) +
1475
1475
  (SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}gG();class cG{repository;scanner;constructor(A,_){this.repository=A;this.scanner=_}async syncMemoryFiles(A={}){let _={filesIndexed:0,filesSkipped:0,errors:[]},G;try{G=await this.scanner.discoverFiles()}catch($){return _.errors.push({filePath:"~/.memory/",error:L($)}),_}for(let $=0;$<G.length;$++){let K=G[$];if(!K)continue;try{let Z=await this.repository.findByPath(K.filePath);if(Z&&Z.contentHash===K.contentHash){_.filesSkipped++,A.onProgress?.({current:$+1,total:G.length,filePath:K.filePath,action:"skipped"});continue}let Y=F0.create({filePath:K.filePath,fileType:K.fileType,projectEncoded:K.projectEncoded,content:K.content,contentHash:K.contentHash,lastIndexedAt:new Date});await this.repository.save(Y),_.filesIndexed++,A.onProgress?.({current:$+1,total:G.length,filePath:K.filePath,action:"indexing"})}catch(Z){_.errors.push({filePath:K.filePath,error:L(Z)})}}return _}}uG();IA();import{existsSync as eZ,readFileSync as sZ,unlinkSync as oZ}from"fs";var AY={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class mG{repository;redactor;constructor(A,_=AY){this.repository=A;this.redactor=_}async log(A){let _=G0.create({description:this.redactor.redactText(A.description).text,severity:A.severity??"medium",category:A.category??"cli",tool:this.redactor.redactText(A.tool??"memory").text,status:"open",context:A.context?this.redactor.redactText(A.context).text:void 0,sourceProject:A.sourceProject?this.redactor.redactText(A.sourceProject).text:void 0,loggedAt:A.loggedAt??new Date});return this.repository.save(_)}async list(A){return(await this.query(A)).entries}async query(A={}){let G={status:A.status?A.status:A.all?void 0:"open",severity:A.severity,category:A.category,tool:A.tool,sourceProject:A.sourceProject,since:A.since,descriptionContains:A.descriptionContains,contextContains:A.contextContains,limit:A.limit};return this.repository.query(G)}async resolve(A,_){let G=await this.repository.findById(A);if(!G)throw new F(j.NOT_FOUND,`Friction entry #${A} not found`,{id:A});if(G.status!=="open")throw new F(j.INVALID_STATE,`Friction entry #${A} is already ${G.status}`,{id:A,currentStatus:G.status});await this.repository.resolve(A,_)}async wontFix(A,_){let G=await this.repository.findById(A);if(!G)throw new F(j.NOT_FOUND,`Friction entry #${A} not found`,{id:A});if(G.status!=="open")throw new F(j.INVALID_STATE,`Friction entry #${A} is already ${G.status}`,{id:A,currentStatus:G.status});await this.repository.resolve(A,_),await this.repository.updateStatus(A,"wont-fix")}async getStats(){return this.repository.getStats()}async getWeeklyTrends(A=4){return this.repository.getWeeklyTrends(A)}async ingestFallbackFile(A){if(!eZ(A))return 0;let G=sZ(A,"utf-8").split(`
1476
1476
  `).filter(Boolean),$=0;for(let K of G)try{let Z=JSON.parse(K);await this.log({description:Z.description,severity:Z.severity??"medium",category:Z.category??"cli",tool:Z.tool??"unknown",context:Z.context,sourceProject:Z.project,loggedAt:Z.date?new Date(Z.date+"T00:00:00Z"):new Date}),$++}catch{process.stderr.write(`Warning: skipping malformed friction entry in ${A}
1477
1477
  `)}try{oZ(A)}catch{process.stderr.write(`Warning: could not delete ${A} (entries already ingested)
1478
- `)}return $}async detectPatterns(A=3){return this.repository.findPatterns(A)}async markReviewed(A){await this.repository.markReviewed(A,new Date)}async purge(A){return this.repository.deleteByPattern(A)}}o$();iG();A1();H5();r_();$_();Q1();T5();u();LG();import{createReadStream as gJ}from"fs";import{createInterface as cJ}from"readline";function T_(A){if(typeof A==="string"){if(/^\d{4}-\d{2}-\d{2}T/.test(A))return A;let _=new Date(A);if(!isNaN(_.getTime()))return _.toISOString()}if(typeof A==="number"&&!isNaN(A)){let _=A>1000000000000?A:A*1000,G=new Date(_);if(!isNaN(G.getTime()))return G.toISOString()}if(A instanceof Date&&!isNaN(A.getTime()))return A.toISOString();return new Date().toISOString()}var kJ=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function L9(A){if(typeof A!=="object"||A===null)return!1;return typeof A.type==="string"}function J2(A){if(!L9(A))return{type:"skipped",reason:"Invalid event structure"};let _=A.type;if(kJ.has(_))return{type:"skipped",reason:`Event type "${_}" not extracted`};switch(_){case"user":return hJ(A);case"assistant":return wJ(A);case"summary":return bJ(A);case"system":return fJ(A);default:return{type:"skipped",reason:`Event type "${_}" not classified`}}}function hJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"User event missing required fields"};let _={uuid:A.uuid,message:{content:vJ(A.message.content)},timestamp:T_(A.timestamp)};if(A.cwd)_.cwd=A.cwd;if(A.gitBranch)_.gitBranch=A.gitBranch;return{type:"user",data:_}}function vJ(A){if(typeof A==="string")return A;if(Array.isArray(A))return A.filter((G)=>G.type==="tool_result").map((G)=>{if(typeof G.content==="string")return G.content;return JSON.stringify(G.content)}).join(`
1479
- `);return""}function wJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"Assistant event missing required fields"};let _=CJ(A.message.content||[]),G={uuid:A.uuid,message:{content:_},timestamp:T_(A.timestamp)};if(A.message.model)G.message.model=A.message.model;if(A.message.usage)G.usage={inputTokens:A.message.usage.input_tokens,outputTokens:A.message.usage.output_tokens};return{type:"assistant",data:G}}function CJ(A){if(!Array.isArray(A))return[];return A.filter((_)=>{return _.type!=="thinking"}).map((_)=>{if(_.type==="text")return{type:"text",text:_.text};if(_.type==="tool_use")return{type:"tool_use",id:_.id,name:_.name,input:_.input};return{type:"text",text:""}})}function bJ(A){if(!A.summary)return{type:"skipped",reason:"Summary event missing summary field"};let _={content:A.summary,timestamp:T_(A.timestamp)};if(A.leafUuid)_.leafUuid=A.leafUuid;return{type:"summary",data:_}}function fJ(A){if(!A.subtype)return{type:"skipped",reason:"System event missing subtype field"};return{type:"system",data:{subtype:A.subtype,data:A.durationMs??A.data??null,timestamp:T_(A.timestamp)}}}class w1{async*parse(A){let _=gJ(A,{encoding:"utf8"}),G=cJ({input:_,crlfDelay:1/0}),$=0;for await(let K of G){$++;let Z=K.trim();if(Z===""){yield{type:"skipped",reason:`Empty line at ${$}`};continue}try{let Y=JSON.parse(Z);yield J2(Y)}catch(Y){let J=L(Y);yield{type:"skipped",reason:`Malformed JSON at line ${$}: ${J}`}}}}}c();import{existsSync as H2,mkdirSync as uJ,readFileSync as mJ,unlinkSync as dJ,writeFileSync as lJ}from"fs";import{dirname as pJ}from"path";function C1(A){return A??c_()}function M9(A,_){let G=C1(_),$=pJ(G);try{uJ($,{recursive:!0}),lJ(G,JSON.stringify(A,null,2)+`
1480
- `)}catch(K){console.warn("Failed to save checkpoint:",K.message)}}function I_(A){let _=C1(A);if(!H2(_))return null;try{let G=mJ(_,"utf-8"),$=JSON.parse(G);if(typeof $.startedAt!=="string"||typeof $.totalSessions!=="number"||typeof $.completedSessions!=="number"||!Array.isArray($.completedSessionIds))return console.warn("Invalid checkpoint format, ignoring"),null;return $}catch{return console.warn("Invalid checkpoint JSON, ignoring"),null}}function q9(A){let _=C1(A);if(H2(_))try{dJ(_)}catch(G){console.warn("Failed to clear checkpoint:",G.message)}}function U9(A){return H2(C1(A))}import*as I9 from"readline";var AA={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function nJ(){if(AA.ttyOverride!==null)return AA.ttyOverride;return process.stdin.isTTY??!1}function b1(A){if(AA.exitOverride!==null){AA.exitOverride(A);return}process.exit(A)}async function O9(){for(let A of AA.cleanupFunctions)try{await A()}catch(_){console.warn("Cleanup error:",_.message)}}async function iJ(){let A=I9.createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{let G=()=>{console.log(`
1481
- Interrupt received. Choose action:`),console.log(" 1) Abort immediately"),console.log(" 2) Abort after current session (saves progress)"),console.log(" 3) Cancel abort (continue)"),A.question("> ",($)=>{let K=parseInt($.trim(),10);if(K===1||K===2||K===3)A.close(),_(K);else console.log("Invalid choice. Enter 1, 2, or 3."),G()})};G()})}async function aJ(A){switch(A){case 1:console.log("Aborting immediately..."),await O9(),b1(130);break;case 2:console.log("Will abort after current session..."),AA.isShuttingDown=!0;break;case 3:console.log("Continuing..."),AA.interruptCount=0;break}}async function T9(){if(AA.interruptCount++,AA.interruptCount>=2){console.log(`
1482
- Force exiting...`),await O9(),b1(130);return}if(nJ()){let A=await iJ();await aJ(A)}else console.log(`
1483
- Interrupt received, shutting down after current operation...`),AA.isShuttingDown=!0}function j9(){if(AA.handlersRegistered)return;process.on("SIGINT",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b1(1)})}),process.on("SIGTERM",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b1(1)})}),AA.handlersRegistered=!0}function R9(){return AA.isShuttingDown}function F9(A){AA.cleanupFunctions.push(A)}function S9(A){let _=AA.cleanupFunctions.indexOf(A);if(_!==-1)AA.cleanupFunctions.splice(_,1)}class f1{shouldAbort(){return R9()}}class g1{path;constructor(A){this.path=A}load(){return I_(this.path)}save(A){M9(A,this.path)}clear(){q9(this.path)}}N0();d1();M2();T2();n1();F2();x2();iA();import{readFileSync as KH}from"fs";import{resolve as ZH}from"path";function y2(A,_,G,$,K){if(A.total===0)return"No friction entries logged yet.";let Z=[];Z.push(KA("Friction Dashboard",$)),Z.push("=================="),Z.push(""),Z.push(KA(" Overview",$)),Z.push(" --------"),Z.push(` Total: ${A.total} Open: ${l(String(A.open),$)} Resolved: ${C(String(A.resolved),$)} Won't Fix: ${A.wontFix}`),Z.push("");let Y=A.meanTimeToResolve!==null?`MTTR: ${A.meanTimeToResolve.toFixed(1)} days`:"MTTR: N/A";if(A.oldestOpen)Z.push(` ${Y} Oldest Open: #${A.oldestOpen.id} (${A.oldestOpen.daysOpen} days)`);else Z.push(` ${Y}`);Z.push(""),Z.push(KA(" By Severity",$)),Z.push(" -----------");let J=["critical","high","medium","low"],H=Math.max(...J.map((Q)=>A.bySeverity[Q]),1);for(let Q of J){let X=A.bySeverity[Q],V=Math.round(X/H*20),B="=".repeat(V)+" ".repeat(20-V),W=Q.padEnd(10),N=Q==="critical"||Q==="high"?d(W,$):Q==="medium"?l(W,$):C(W,$);Z.push(` ${N}[${B}] ${X}`)}Z.push(""),Z.push(KA(" By Category",$)),Z.push(" -----------");for(let[Q,X]of Object.entries(A.byCategory))Z.push(` ${E9(Q.padEnd(14),$)}${X}`);if(Z.push(""),A.byTool&&Object.keys(A.byTool).length>0){Z.push(KA(" By Tool",$)),Z.push(" -------");for(let[Q,X]of Object.entries(A.byTool)){let V="=".repeat(Math.min(X,40));Z.push(` ${Q.padEnd(15)} ${V} ${X}`)}Z.push("")}if(K&&K.length>0){Z.push(KA(" Pattern Alerts",$)),Z.push(" --------------");for(let Q of K)Z.push(` [!] Pattern detected: ${Q.count} open entries for ${Q.tool}/${Q.category}`);Z.push("")}if(_.length===0)Z.push(" No trend data available.");else{Z.push(KA(" Trends",$)),Z.push(" ------"),Z.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let Q of _)Z.push(` ${P(Q.week.padEnd(12),$)}${String(Q.newCount).padEnd(6)}${Q.resolvedCount}`)}return Z.join(`
1478
+ `)}return $}async detectPatterns(A=3){return this.repository.findPatterns(A)}async markReviewed(A){await this.repository.markReviewed(A,new Date)}async purge(A){return this.repository.deleteByPattern(A)}}o1();iG();A$();H5();r_();$_();Q$();T5();u();LG();import{createReadStream as gJ}from"fs";import{createInterface as cJ}from"readline";function T_(A){if(typeof A==="string"){if(/^\d{4}-\d{2}-\d{2}T/.test(A))return A;let _=new Date(A);if(!isNaN(_.getTime()))return _.toISOString()}if(typeof A==="number"&&!isNaN(A)){let _=A>1000000000000?A:A*1000,G=new Date(_);if(!isNaN(G.getTime()))return G.toISOString()}if(A instanceof Date&&!isNaN(A.getTime()))return A.toISOString();return new Date().toISOString()}var kJ=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function L9(A){if(typeof A!=="object"||A===null)return!1;return typeof A.type==="string"}function J2(A){if(!L9(A))return{type:"skipped",reason:"Invalid event structure"};let _=A.type;if(kJ.has(_))return{type:"skipped",reason:`Event type "${_}" not extracted`};switch(_){case"user":return hJ(A);case"assistant":return wJ(A);case"summary":return bJ(A);case"system":return fJ(A);default:return{type:"skipped",reason:`Event type "${_}" not classified`}}}function hJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"User event missing required fields"};let _={uuid:A.uuid,message:{content:vJ(A.message.content)},timestamp:T_(A.timestamp)};if(A.cwd)_.cwd=A.cwd;if(A.gitBranch)_.gitBranch=A.gitBranch;return{type:"user",data:_}}function vJ(A){if(typeof A==="string")return A;if(Array.isArray(A))return A.filter((G)=>G.type==="tool_result").map((G)=>{if(typeof G.content==="string")return G.content;return JSON.stringify(G.content)}).join(`
1479
+ `);return""}function wJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"Assistant event missing required fields"};let _=CJ(A.message.content||[]),G={uuid:A.uuid,message:{content:_},timestamp:T_(A.timestamp)};if(A.message.model)G.message.model=A.message.model;if(A.message.usage)G.usage={inputTokens:A.message.usage.input_tokens,outputTokens:A.message.usage.output_tokens};return{type:"assistant",data:G}}function CJ(A){if(!Array.isArray(A))return[];return A.filter((_)=>{return _.type!=="thinking"}).map((_)=>{if(_.type==="text")return{type:"text",text:_.text};if(_.type==="tool_use")return{type:"tool_use",id:_.id,name:_.name,input:_.input};return{type:"text",text:""}})}function bJ(A){if(!A.summary)return{type:"skipped",reason:"Summary event missing summary field"};let _={content:A.summary,timestamp:T_(A.timestamp)};if(A.leafUuid)_.leafUuid=A.leafUuid;return{type:"summary",data:_}}function fJ(A){if(!A.subtype)return{type:"skipped",reason:"System event missing subtype field"};return{type:"system",data:{subtype:A.subtype,data:A.durationMs??A.data??null,timestamp:T_(A.timestamp)}}}class w${async*parse(A){let _=gJ(A,{encoding:"utf8"}),G=cJ({input:_,crlfDelay:1/0}),$=0;for await(let K of G){$++;let Z=K.trim();if(Z===""){yield{type:"skipped",reason:`Empty line at ${$}`};continue}try{let Y=JSON.parse(Z);yield J2(Y)}catch(Y){let J=L(Y);yield{type:"skipped",reason:`Malformed JSON at line ${$}: ${J}`}}}}}c();import{existsSync as H2,mkdirSync as uJ,readFileSync as mJ,unlinkSync as dJ,writeFileSync as lJ}from"fs";import{dirname as pJ}from"path";function C$(A){return A??c_()}function M9(A,_){let G=C$(_),$=pJ(G);try{uJ($,{recursive:!0}),lJ(G,JSON.stringify(A,null,2)+`
1480
+ `)}catch(K){console.warn("Failed to save checkpoint:",K.message)}}function I_(A){let _=C$(A);if(!H2(_))return null;try{let G=mJ(_,"utf-8"),$=JSON.parse(G);if(typeof $.startedAt!=="string"||typeof $.totalSessions!=="number"||typeof $.completedSessions!=="number"||!Array.isArray($.completedSessionIds))return console.warn("Invalid checkpoint format, ignoring"),null;return $}catch{return console.warn("Invalid checkpoint JSON, ignoring"),null}}function q9(A){let _=C$(A);if(H2(_))try{dJ(_)}catch(G){console.warn("Failed to clear checkpoint:",G.message)}}function U9(A){return H2(C$(A))}import*as I9 from"readline";var AA={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function nJ(){if(AA.ttyOverride!==null)return AA.ttyOverride;return process.stdin.isTTY??!1}function b$(A){if(AA.exitOverride!==null){AA.exitOverride(A);return}process.exit(A)}async function O9(){for(let A of AA.cleanupFunctions)try{await A()}catch(_){console.warn("Cleanup error:",_.message)}}async function iJ(){let A=I9.createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{let G=()=>{console.log(`
1481
+ Interrupt received. Choose action:`),console.log(" 1) Abort immediately"),console.log(" 2) Abort after current session (saves progress)"),console.log(" 3) Cancel abort (continue)"),A.question("> ",($)=>{let K=parseInt($.trim(),10);if(K===1||K===2||K===3)A.close(),_(K);else console.log("Invalid choice. Enter 1, 2, or 3."),G()})};G()})}async function aJ(A){switch(A){case 1:console.log("Aborting immediately..."),await O9(),b$(130);break;case 2:console.log("Will abort after current session..."),AA.isShuttingDown=!0;break;case 3:console.log("Continuing..."),AA.interruptCount=0;break}}async function T9(){if(AA.interruptCount++,AA.interruptCount>=2){console.log(`
1482
+ Force exiting...`),await O9(),b$(130);return}if(nJ()){let A=await iJ();await aJ(A)}else console.log(`
1483
+ Interrupt received, shutting down after current operation...`),AA.isShuttingDown=!0}function j9(){if(AA.handlersRegistered)return;process.on("SIGINT",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b$(1)})}),process.on("SIGTERM",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b$(1)})}),AA.handlersRegistered=!0}function R9(){return AA.isShuttingDown}function F9(A){AA.cleanupFunctions.push(A)}function S9(A){let _=AA.cleanupFunctions.indexOf(A);if(_!==-1)AA.cleanupFunctions.splice(_,1)}class f${shouldAbort(){return R9()}}class g${path;constructor(A){this.path=A}load(){return I_(this.path)}save(A){M9(A,this.path)}clear(){q9(this.path)}}N0();d$();M2();T2();n$();F2();x2();iA();import{readFileSync as KH}from"fs";import{resolve as ZH}from"path";function y2(A,_,G,$,K){if(A.total===0)return"No friction entries logged yet.";let Z=[];Z.push(KA("Friction Dashboard",$)),Z.push("=================="),Z.push(""),Z.push(KA(" Overview",$)),Z.push(" --------"),Z.push(` Total: ${A.total} Open: ${l(String(A.open),$)} Resolved: ${C(String(A.resolved),$)} Won't Fix: ${A.wontFix}`),Z.push("");let Y=A.meanTimeToResolve!==null?`MTTR: ${A.meanTimeToResolve.toFixed(1)} days`:"MTTR: N/A";if(A.oldestOpen)Z.push(` ${Y} Oldest Open: #${A.oldestOpen.id} (${A.oldestOpen.daysOpen} days)`);else Z.push(` ${Y}`);Z.push(""),Z.push(KA(" By Severity",$)),Z.push(" -----------");let J=["critical","high","medium","low"],H=Math.max(...J.map((Q)=>A.bySeverity[Q]),1);for(let Q of J){let X=A.bySeverity[Q],V=Math.round(X/H*20),B="=".repeat(V)+" ".repeat(20-V),W=Q.padEnd(10),N=Q==="critical"||Q==="high"?d(W,$):Q==="medium"?l(W,$):C(W,$);Z.push(` ${N}[${B}] ${X}`)}Z.push(""),Z.push(KA(" By Category",$)),Z.push(" -----------");for(let[Q,X]of Object.entries(A.byCategory))Z.push(` ${E9(Q.padEnd(14),$)}${X}`);if(Z.push(""),A.byTool&&Object.keys(A.byTool).length>0){Z.push(KA(" By Tool",$)),Z.push(" -------");for(let[Q,X]of Object.entries(A.byTool)){let V="=".repeat(Math.min(X,40));Z.push(` ${Q.padEnd(15)} ${V} ${X}`)}Z.push("")}if(K&&K.length>0){Z.push(KA(" Pattern Alerts",$)),Z.push(" --------------");for(let Q of K)Z.push(` [!] Pattern detected: ${Q.count} open entries for ${Q.tool}/${Q.category}`);Z.push("")}if(_.length===0)Z.push(" No trend data available.");else{Z.push(KA(" Trends",$)),Z.push(" ------"),Z.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let Q of _)Z.push(` ${P(Q.week.padEnd(12),$)}${String(Q.newCount).padEnd(6)}${Q.resolvedCount}`)}return Z.join(`
1484
1484
  `)}function YH(){let A=ZH(import.meta.dirname,"../../../../node_modules/chart.js/dist/chart.umd.js");return KH(A,"utf-8")}function JH(A){return A.map((_)=>({id:_.id,severity:_.severity,category:_.category,description:_.description,daysOpen:Math.floor((Date.now()-_.loggedAt.getTime())/86400000)}))}function k2(A,_,G,$){let K=YH(),Z=JH(G),Y=A.meanTimeToResolve!==null?`${A.meanTimeToResolve.toFixed(1)} days`:"N/A",J=Z.map((H)=>`<tr>
1485
1485
  <td>${H.id??"-"}</td>
1486
1486
  <td class="severity-${H.severity}">${H.severity}</td>
@@ -1668,28 +1668,28 @@ ${$&&$.length>0?` <div class="alerts">
1668
1668
  }
1669
1669
  </script>
1670
1670
  </body>
1671
- </html>`}function P2(A){return A.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}nA();zA();async function C2(A,_){if(!A.embed)return console.log("--background requires --embed flag"),console.log(" Usage: memory sync --embed --background"),{exitCode:0};let{spawnBackgroundEmbedding:G,readLock:$,isProcessAlive:K}=_??await LH(),Z=$();if(Z&&K(Z.pid))return console.log(`Embedding already in progress (PID ${Z.pid}). Use 'memory status' to check progress.`),{exitCode:0};let Y=G();if(Y.started)console.log(`Background embedding started (PID ${Y.pid}). Use 'memory status' to check progress.`);else return console.error(`Failed to start background embedding: ${Y.reason}`),{exitCode:1};return{exitCode:0}}async function LH(){let A=await Promise.resolve().then(() => (e1(),t1));return{spawnBackgroundEmbedding:A.spawnBackgroundEmbedding,readLock:A.readLock,isProcessAlive:A.isProcessAlive}}LG();async function I3(){let{EmbeddingProviderFactory:A}=await Promise.resolve().then(() => (o1(),b2));return new A}async function O3(){let{loadConfig:A}=await Promise.resolve().then(() => (JA(),j1));return A()}async function j3(A){let{EmbeddingRepository:_}=await Promise.resolve().then(() => J4);return new _(A)}async function R3(A){let _=new z0;try{let G=await _.discoverSessions(),$=G;if(A.project)$=$.filter((J)=>J.projectPath.decoded.includes(A.project));if(A.session)$=$.filter((J)=>J.id===A.session);let K=I_(),Z=new Set(K?.completedSessionIds??[]),Y=$.filter((J)=>!Z.has(J.id));if(A.json){let J={dryRun:!0,discovered:G.length,filtered:$.length,toProcess:Y.length,recoveredFromCheckpoint:K?.completedSessions??0,sessions:Y.map((H)=>({id:H.id,project:H.projectPath.decoded,size:H.size,modified:H.modifiedTime.toISOString()}))};console.log(JSON.stringify(J,null,2))}else{if(console.log(`Dry run - no changes will be made
1671
+ </html>`}function P2(A){return A.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}nA();zA();async function C2(A,_){if(!A.embed)return console.log("--background requires --embed flag"),console.log(" Usage: memory sync --embed --background"),{exitCode:0};let{spawnBackgroundEmbedding:G,readLock:$,isProcessAlive:K}=_??await LH(),Z=$();if(Z&&K(Z.pid))return console.log(`Embedding already in progress (PID ${Z.pid}). Use 'memory status' to check progress.`),{exitCode:0};let Y=G();if(Y.started)console.log(`Background embedding started (PID ${Y.pid}). Use 'memory status' to check progress.`);else return console.error(`Failed to start background embedding: ${Y.reason}`),{exitCode:1};return{exitCode:0}}async function LH(){let A=await Promise.resolve().then(() => (e$(),t$));return{spawnBackgroundEmbedding:A.spawnBackgroundEmbedding,readLock:A.readLock,isProcessAlive:A.isProcessAlive}}LG();async function I3(){let{EmbeddingProviderFactory:A}=await Promise.resolve().then(() => (o$(),b2));return new A}async function O3(){let{loadConfig:A}=await Promise.resolve().then(() => (JA(),j$));return A()}async function j3(A){let{EmbeddingRepository:_}=await Promise.resolve().then(() => J4);return new _(A)}async function R3(A){let _=new z0;try{let G=await _.discoverSessions(),$=G;if(A.project)$=$.filter((J)=>J.projectPath.decoded.includes(A.project));if(A.session)$=$.filter((J)=>J.id===A.session);let K=I_(),Z=new Set(K?.completedSessionIds??[]),Y=$.filter((J)=>!Z.has(J.id));if(A.json){let J={dryRun:!0,discovered:G.length,filtered:$.length,toProcess:Y.length,recoveredFromCheckpoint:K?.completedSessions??0,sessions:Y.map((H)=>({id:H.id,project:H.projectPath.decoded,size:H.size,modified:H.modifiedTime.toISOString()}))};console.log(JSON.stringify(J,null,2))}else{if(console.log(`Dry run - no changes will be made
1672
1672
  `),console.log(`Discovered: ${G.length} sessions`),console.log(`After filter: ${$.length} sessions`),K)console.log(`Checkpoint: ${K.completedSessions} already done`);if(console.log(`To process: ${Y.length} sessions
1673
1673
  `),Y.length>0){console.log("Sessions to sync:");for(let J of Y.slice(0,20)){let H=J.projectPath.decoded.split(/[/\\]/).pop()??"unknown";console.log(` ${J.id.slice(0,16)}... ${H}`)}if(Y.length>20)console.log(` ... and ${Y.length-20} more`)}}return{exitCode:0}}catch(G){return f2(G,A),{exitCode:1}}}function f2(A,_){let G=C_(A);if(_.json)console.error(qG(G));else console.error(i(G,{verbose:!!_.verbose}))}function F3(A,_,G){let $=Date.now()-_;if(G.json){let K={success:A.success,aborted:A.aborted??!1,duration:$,discovered:A.sessionsDiscovered,processed:A.sessionsProcessed,skipped:A.sessionsSkipped,messages:A.messagesInserted,toolUses:A.toolUsesInserted,recoveredFromCheckpoint:A.recoveredFromCheckpoint,errors:A.errors};console.log(JSON.stringify(K,null,2));return}if(G.quiet)return;if(A.aborted)console.log(`
1674
1674
  Sync aborted (progress saved)`);else console.log(`
1675
1675
  Sync complete in ${$}ms`);if(console.log(` Discovered: ${A.sessionsDiscovered}`),console.log(` Processed: ${A.sessionsProcessed}`),console.log(` Skipped: ${A.sessionsSkipped}`),console.log(` Messages: ${A.messagesInserted}`),console.log(` Tool uses: ${A.toolUsesInserted}`),A.recoveredFromCheckpoint)console.log(` Recovered: ${A.recoveredFromCheckpoint} from checkpoint`);if(A.errors.length>0){console.log(`
1676
- Errors (${A.errors.length}):`);for(let K of A.errors)console.log(` ${K.sessionPath}: ${K.error}`)}}function S3(){let A=process.platform==="win32"?"C:\\":"/";return new h1(A)}async function g2(A,_,G={}){let $=G.factory??await I3(),K=G.config??await O3(),Z=$.createFromConfig(K);if(!Z){if(!_.quiet)console.error("Embedding is disabled in configuration. Enable it in ~/.config/memory/config.json");return}let Y=G.repositoryOverride??await j3(A),{EmbeddingService:J}=await Promise.resolve().then(() => (i$(),dK)),{PatternRedactor:H}=await Promise.resolve().then(() => (pA(),k4)),{createEmbeddingProgressReporter:Q,createModelDownloadHandler:X}=await Promise.resolve().then(() => (T5(),E6)),V=new J({repository:Y,provider:Z,config:K.embedding,redactor:new H}),B=V.checkModelState();if(B.modelChanged&&B.needsReEmbed){if(!await E3(B,_)){await $.dispose();return}let T=Y.getStoredEmbeddingDimensions(),M=K.embedding.dimensions;if(T!==null&&T!==M){if(!_.quiet)console.log(`Recreating embedding table for ${M}-dimensional vectors...`);Y.recreateVecTable(M)}if(!_.quiet)console.log("Clearing existing embeddings for re-embedding...")}let W=X({quiet:!!_.quiet});await Z.initialize(W);let N=typeof Y.getSkippedCount==="function"?Y.getSkippedCount(B.currentHash):0,z=Math.max(0,Y.getTotalMessageCount()-Y.getEmbeddedCount()-N);if(z===0){if(!_.quiet)if(N>0)console.log(`
1676
+ Errors (${A.errors.length}):`);for(let K of A.errors)console.log(` ${K.sessionPath}: ${K.error}`)}}function S3(){let A=process.platform==="win32"?"C:\\":"/";return new h$(A)}async function g2(A,_,G={}){let $=G.factory??await I3(),K=G.config??await O3(),Z=$.createFromConfig(K);if(!Z){if(!_.quiet)console.error("Embedding is disabled in configuration. Enable it in ~/.config/memory/config.json");return}let Y=G.repositoryOverride??await j3(A),{EmbeddingService:J}=await Promise.resolve().then(() => (i1(),dK)),{PatternRedactor:H}=await Promise.resolve().then(() => (pA(),k4)),{createEmbeddingProgressReporter:Q,createModelDownloadHandler:X}=await Promise.resolve().then(() => (T5(),E6)),V=new J({repository:Y,provider:Z,config:K.embedding,redactor:new H}),B=V.checkModelState();if(B.modelChanged&&B.needsReEmbed){if(!await E3(B,_)){await $.dispose();return}let T=Y.getStoredEmbeddingDimensions(),M=K.embedding.dimensions;if(T!==null&&T!==M){if(!_.quiet)console.log(`Recreating embedding table for ${M}-dimensional vectors...`);Y.recreateVecTable(M)}if(!_.quiet)console.log("Clearing existing embeddings for re-embedding...")}let W=X({quiet:!!_.quiet});await Z.initialize(W);let N=typeof Y.getSkippedCount==="function"?Y.getSkippedCount(B.currentHash):0,z=Math.max(0,Y.getTotalMessageCount()-Y.getEmbeddedCount()-N);if(z===0){if(!_.quiet)if(N>0)console.log(`
1677
1677
  All embeddable messages already embedded (${N} skipped for current model).`);else console.log(`
1678
1678
  All messages already embedded.`);await $.dispose();return}let q=Q({quiet:!!_.quiet});q.start(z);try{let I;if(B.modelChanged&&B.needsReEmbed)I=await V.clearAndReembed({onProgress:(T)=>q.update(T.current)});else I=await V.embedUnembedded({onProgress:(T)=>q.update(T.current)});if(q.stop(),!_.quiet){let T=Math.max(1,Math.round(I.durationMs/1000)),M=I.rate.toFixed(1),O=I.skipped>0?`, skipped ${I.skipped}`:"";console.log(`
1679
1679
  Embedded ${I.embedded} messages${O} in ${T}s (${M} msg/s)`)}}catch(I){q.stop();let T=Y.getEmbeddedCount(),M=Y.getTotalMessageCount();if(!_.quiet)console.error(`
1680
- Embedding failed at ${T}/${M} messages. Run memory sync --embed to resume from where it stopped.`);throw I}finally{await $.dispose()}}async function E3(A,_){let G=A.embeddedCount??0,$=A.storedModelName??A.storedHash??"unknown",K=A.currentModelName;if(_.force)return!0;if(!process.stdin.isTTY||_.quiet)return console.error(`Model changed from ${$} to ${K}. Skipping re-embedding in non-interactive mode. Run 'memory sync --embed' interactively to re-embed.`),!1;let Y=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise((J)=>{Y.question(`Model changed from ${$} to ${K}. Re-embed all ${G} messages? [y/N] `,(H)=>{Y.close(),J(H.trim().toLowerCase()==="y")})})}x5();LG();async function D3(A,_){try{let G=new L1(A),$=new v1,Z=await new cG(G,$).syncMemoryFiles();if(Z.filesIndexed>0||Z.filesSkipped>0||Z.errors.length>0)return Z;return null}catch(G){if(!_.quiet)console.error(` Memory files: error (${L(G)})`);return null}}function x3(A,_){if(_.json){let G={memoryFiles:{indexed:A.filesIndexed,skipped:A.filesSkipped,errors:A.errors}};console.log(JSON.stringify(G,null,2));return}if(_.quiet)return;if(console.log(` Memory files: ${A.filesIndexed} indexed, ${A.filesSkipped} skipped`),A.errors.length>0)for(let G of A.errors)console.log(` Error: ${G.filePath}: ${G.error}`)}async function m2(A,_,G){try{let $,K,Z,Y;if(G){if($=G.loadConfig(),!$.ambientContext.enabled)return;K=G.resolveAutoMemoryDir(),Z=G.resolveProjectName(),Y=G.createAmbientService()}else{let{loadConfig:H}=await Promise.resolve().then(() => (JA(),j1));if($=H(),!$.ambientContext.enabled)return;let Q=process.cwd(),{ProjectPath:X}=await Promise.resolve().then(() => e6),V=X.fromDecoded(Q),B=V.encoded;Z=V.projectName;let{homedir:W}=await import("os"),{join:N}=await import("path");K=N(W(),".claude","projects",B,"memory"),Y=await TH(A)}let J=await Y.generateAmbientContext({projectName:Z,autoMemoryDir:K,budget:$.ambientContext.budget});if(J.success&&!_.quiet)console.log(` Ambient context: updated (~${J.contextTokens} tokens)`);else if(!J.success&&!_.quiet)console.log(` Ambient context: skipped (${J.reason})`)}catch($){if(!_.quiet)console.error(` Ambient context: error (${L($)})`)}}async function TH(A){let{SqliteProjectResolver:_}=await Promise.resolve().then(() => j4),{SqliteFactRepository:G}=await Promise.resolve().then(() => (P0(),B4)),{SqliteFrictionRepository:$}=await Promise.resolve().then(() => ($G(),X4)),{SqlitePersonaRepository:K}=await Promise.resolve().then(() => (H_(),M4)),{SqliteGraphRepository:Z}=await Promise.resolve().then(() => (YG(),q4)),{SqliteMemoryGovernanceRepository:Y}=await Promise.resolve().then(() => (k0(),L4)),{SqliteMemoryUtilityRepository:J}=await Promise.resolve().then(() => (I1(),U4)),{AutoMemoryWriter:H}=await Promise.resolve().then(() => (w3(),v3)),{SmartContextService:Q}=await Promise.resolve().then(() => (iG(),sK)),{MemoryGovernanceService:X}=await Promise.resolve().then(() => ($_(),j6)),{MemoryRankingService:V}=await Promise.resolve().then(() => (r_(),tK)),{AmbientContextService:B}=await Promise.resolve().then(() => oK),{createContextFormatter:W}=await Promise.resolve().then(() => (n1(),_3)),N=new Y(A),z=new Q({projectResolver:new _(A),factRepo:new G(A),frictionRepo:new $(A),personaRepo:new K(A),graphRepo:new Z(A),governancePolicy:new X({repository:N}),rankingService:new V,utilityRepo:new J(A)}),q=W("ai",!1);return new B(z,new H,q)}JA();pA();function VQ({db:A,resolver:_}){let G=new z0({projectNameResolver:_}),$=new w1,K=new m(A),Z=new WA(A),Y=new X0(A),J=new Q0(A),H=new wG(G,$,K,Z,Y,J,A,new f1,new g1,new t);return{fixProjectNames:(Q)=>H.fixProjectNames(Q),sync:(Q)=>H.sync(Q)}}function BQ(A){return{handleBackgroundMode:C2,setupSignalHandlers:j9,hasCheckpoint:U9,loadCheckpoint:I_,createProgressReporter:L5,getDefaultDbPath:S,executeDryRun:R3,handleError:f2,reportResults:F3,createDriveResolver:S3,initializeDatabase:D,closeDatabase:E,bulkOperationCheckpoint:N1,registerCleanup:F9,unregisterCleanup:S9,createSyncService:VQ,loadConfig:f,createRemoteEventSyncService:WQ,runMemoryFileSync:D3,reportMemoryFileResults:x3,runAmbientContextGeneration:m2,runEmbeddingPass:g2,...A}}function p2(){return new XQ("sync").description("Sync sessions from ~/.claude/projects/ to database").option("-f, --force","Re-extract all sessions regardless of state").option("-p, --project <path>","Sync only sessions from specific project").option("-s, --session <id>","Sync a specific session only").option("-n, --dry-run","Show what would be synced without syncing").option("--fix-names","Fix truncated project names in existing sessions").option("--embed","Generate embeddings for messages after sync").option("--background","Run embedding in background (use with --embed)").option("--include-memory-files","Index legacy ~/.memory / MEMORY_HOME markdown files").option("--remote","Synchronize canonical event logs with configured remote").option("--json","Output results as JSON").addOption(new K8("-q, --quiet","Suppress progress output").conflicts("verbose")).addOption(new K8("-v, --verbose","Show detailed progress").conflicts("quiet")).action(async(A)=>{let _=await Z8(A);process.exitCode=_.exitCode})}async function Z8(A,_={}){let G=BQ(_);if(A.background)return await G.handleBackgroundMode(A);G.setupSignalHandlers();let $=Date.now(),K=G.createProgressReporter(A);if(!A.quiet&&G.hasCheckpoint()){let H=G.loadCheckpoint();if(H)console.log(`Resuming from previous interrupted sync (${H.completedSessions}/${H.totalSessions} sessions done)`)}let Z=G.getDefaultDbPath();if(A.dryRun)return await G.executeDryRun(A);let Y;try{Y=G.initializeDatabase({path:Z}).db}catch(H){return G.handleError(H,A),{exitCode:1}}let J=async()=>{G.closeDatabase(Y)};G.registerCleanup(J);try{let H=G.createDriveResolver(),Q=G.createSyncService({db:Y,resolver:H});if(A.fixNames){K.log("Fixing project names...");let I=await Q.fixProjectNames(H);if(!A.quiet)console.log(`Fixed project names: ${I} sessions updated`)}let X={force:A.force,projectFilter:A.project,sessionFilter:A.session,checkpointEnabled:!0,onProgress:(I)=>{if(I.phase==="discovering")K.log("Discovering sessions...");else if(I.phase==="extracting"){if(I.current===1)K.start(I.total);K.update(I.current,I.sessionId)}}},V=await Q.sync(X);G.bulkOperationCheckpoint(Y),K.stop(),G.reportResults(V,$,A);let B=G.loadConfig(),W=B.remoteSync?.repositoryUrl,N=B.remoteSync?.enabled===!0&&typeof W==="string"&&W.trim().length>0;if(N&&A.remote===!0){if(!A.quiet)console.log("Synchronizing events with remote Git repository...");try{let T=await(await G.createRemoteEventSyncService({db:Y})).sync({machineId:B.machineId,repositoryUrl:W,autoPull:B.remoteSync.autoPull,autoPush:B.remoteSync.autoPush});if(T.success){if(T.rebuildNeeded){if(!A.quiet)console.log("Remote events pulled. Rebuilding database projections...")}else if(!A.quiet)console.log("Git events are already up to date.")}else if(T.status==="blocked"){let M=[T.error??"Remote synchronization blocked.","Run 'memory audit-secrets --skip-db --quarantine-events' and retry after reviewing the quarantine output."].join(" ");return console.error(M),{exitCode:1}}else console.error(`Warning: Remote synchronization failed: ${T.error}`)}catch(I){console.error(`Warning: Remote synchronization failed to execute: ${L(I)}`)}}else if(A.remote===!0)return console.error("Remote synchronization requested but no remote repository is configured. Run 'memory remote set <repository-url>' first."),{exitCode:1};else if(N&&!A.quiet)console.warn("Remote synchronization is configured but skipped. Run 'memory sync --remote' to synchronize canonical event logs.");if(A.includeMemoryFiles===!0||B.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1"){let I=await G.runMemoryFileSync(Y,A);if(I)G.reportMemoryFileResults(I,A)}else if(A.verbose&&!A.quiet)console.log(" Memory files: skipped (legacy opt-in disabled)");if(!A.dryRun)await G.runAmbientContextGeneration(Y,A);let q=V.errors.length>0||V.aborted?1:0;if(A.embed&&!A.dryRun){let I=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await G.runEmbeddingPass(Y,A)}catch(T){if(A.json)console.error(qG(C_(T)));else if(!A.quiet)console.error(i(C_(T),{verbose:A.verbose}));return{exitCode:1}}finally{if(I)if(G.removeBackgroundLock)G.removeBackgroundLock();else{let{removeLock:T}=await Promise.resolve().then(() => (e1(),t1));T()}}}return{exitCode:q}}catch(H){return K.stop(),G.handleError(H,A),{exitCode:1}}finally{G.unregisterCleanup(J),G.closeDatabase(Y)}}async function WQ({db:A}){let{RemoteEventSyncService:_}=await Promise.resolve().then(() => (Q1(),F6)),{GitRemoteEventTransport:G}=await Promise.resolve().then(() => (u3(),c3)),{getEventsDir:$}=await Promise.resolve().then(() => (c(),PG)),{rebuildProjections:K}=await Promise.resolve().then(() => (K$(),t3)),{SecretAuditService:Z}=await Promise.resolve().then(() => (Y$(),$8)),{getAllLogFiles:Y}=await Promise.resolve().then(() => (c(),PG));return new _({transport:new G($()),privacyPreflight:{audit:async()=>{return{eventLogFindings:(await new Z(new t).audit({eventLogPaths:Y()})).summary.eventLogFindings}}},projectionRebuilder:{rebuild:async()=>{await K(A)}}})}RG();t2();AK();M$();U$();B$();IA();import{Command as _X}from"commander";N0();import tQ from"@inquirer/search";import eQ from"@inquirer/select";import sQ from"fuzzy";var D8=null,oQ=null,AX=null;function x8(){if(D8!==null)return D8;return process.stdout.isTTY===!0}function P8(){return x8()}async function y8(A){if(!x8())throw Error("Interactive picker requires TTY. Use --session <id> instead.");let{sessionRepo:_,limit:G=100}=A,K=(await _.findFiltered({limit:G})).map((X)=>({value:X.id,name:`${X.projectPath.projectName} (${DA(X.startTime)})`,description:`${X.id.substring(0,8)}... | ${X.messages.length} messages`})),J=await(oQ??tQ)({message:"Search sessions (type to filter):",source:async(X,{signal:V})=>{if(V.aborted)return[];if(!X)return K;return sQ.filter(X,K,{extract:(W)=>`${W.name} ${W.description}`}).map((W)=>W.original)},pageSize:10}),Q=await(AX??eQ)({message:"Action:",choices:[{value:"show",name:"Show session details"},{value:"search",name:"Search within session"},{value:"context",name:"Get project context"},{value:"related",name:"Find related sessions"},{value:"cancel",name:"Cancel"}]});if(Q==="cancel")return null;return{sessionId:J,action:Q}}mA();B$();RG();M$();U$();u();iA();function GX(A){return{dbPath:S(),show:TG,search:FG,context:OG,related:jG,...A}}function $K(){return new _X("browse").description("Interactive session browser").option("-l, --limit <count>","Maximum sessions to show","100").action(async(A)=>{let _=await k8(A);process.exitCode=_.exitCode})}async function k8(A,_={}){if(!P8())return console.error("Error: Interactive mode requires a terminal."),console.error("Use specific commands instead:"),console.error(" memory list - List sessions"),console.error(" memory show <id> - Show session details"),console.error(" memory search <q> - Search sessions"),{exitCode:1};let G=GX(_),$={limit:"100",...A},K=parseInt($.limit,10),Z=G.dbPath,{db:Y}=D({path:Z});try{let J=new m(Y),H=await y8({sessionRepo:J,limit:K});if(!H)return E(Y),{exitCode:0};switch(E(Y),H.action){case"show":await G.show(H.sessionId,{});break;case"search":await G.search("*",{session:H.sessionId});break;case"context":{let{db:Q}=D({path:Z}),V=await new m(Q).findById(H.sessionId);if(E(Q),V)await G.context(V.projectPath.projectName,{});break}case"related":await G.related(H.sessionId,{});break}return{exitCode:0}}catch(J){let H=J instanceof F?J:new F(j.DB_CONNECTION_FAILED,L(J));console.error(i(H));try{E(Y)}catch{}return{exitCode:1}}}l0();JA();import{Command as JX}from"commander";import{copyFileSync as C8,cpSync as HX,existsSync as q0,mkdirSync as k_,readdirSync as b8,readFileSync as QX,rmSync as f8,statSync as KK,writeFileSync as XX}from"fs";import{dirname as VX,join as MA}from"path";c();import{readFileSync as $X,existsSync as KX}from"fs";import{join as h8}from"path";var{spawn:ZX}=globalThis.Bun;async function YX(A,_,G=process.env){let $=ZX(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:G}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}function v8(A,_){let G={};for(let $ of A)if(_.existsSync($))try{let K=_.readFileSync($,"utf-8");G[$]=Bun.hash(K).toString()}catch{G[$]="error"}return G}class y_{eventsDir;deps;constructor(A,_={}){this.eventsDir=A??CA(),this.deps={runGit:YX,existsSync:KX,readFileSync:$X,getAllLogFiles:UA,now:()=>new Date,..._}}async isGitRepo(){let A=h8(this.eventsDir,".git");return this.deps.existsSync(A)}async initRepo(){if(!(await this.deps.runGit(["init"],this.eventsDir)).success)return!1;let _=await this.deps.runGit(["config","user.name"],this.eventsDir);if(!_.success||!_.stdout)await this.deps.runGit(["config","user.name","Memory Nexus"],this.eventsDir),await this.deps.runGit(["config","user.email","sync@memory-nexus.local"],this.eventsDir);return await this.deps.runGit(["checkout","-b","main"],this.eventsDir),!0}async configureRemote(A){if(!A.trim())return!1;return await this.deps.runGit(["remote","remove","origin"],this.eventsDir),(await this.deps.runGit(["remote","add","origin",A],this.eventsDir)).success}async removeRemote(){let A=await this.deps.runGit(["remote","remove","origin"],this.eventsDir);return A.success||A.stderr.includes("No such remote")}async getRemoteUrl(){let A=await this.deps.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async sync(A,_,G=!0,$=!0){try{if(!await this.isGitRepo()){if(!await this.initRepo())return{success:!1,rebuildNeeded:!1,error:"Failed to initialize Git repository in events directory"}}if(await this.getRemoteUrl()!==_){if(!await this.configureRemote(_))return{success:!1,rebuildNeeded:!1,error:"Failed to configure Git remote repository URL"}}let Y=this.deps.getAllLogFiles(this.eventsDir),J=v8(Y,this.deps),H=`events-${A}.jsonl`,Q=h8(this.eventsDir,H);if(this.deps.existsSync(Q))await this.deps.runGit(["add",H],this.eventsDir),await this.deps.runGit(["commit","-m",`sync: ${A} observed at ${this.deps.now().toISOString()}`],this.eventsDir);let X=!0;if(G){if(await this.deps.runGit(["fetch","origin"],this.eventsDir),(await this.deps.runGit(["rev-parse","--verify","origin/main"],this.eventsDir)).success){let z=await this.deps.runGit(["pull","--rebase","origin","main"],this.eventsDir);if(!z.success)return X=!1,await this.deps.runGit(["rebase","--abort"],this.eventsDir),{success:!1,rebuildNeeded:!1,error:`Git pull failed: ${z.stderr}`}}}if($&&X){let N=await this.deps.runGit(["push","-u","origin","main"],this.eventsDir);if(!N.success)return{success:!1,rebuildNeeded:!1,error:`Git push failed: ${N.stderr}`}}let V=this.deps.getAllLogFiles(this.eventsDir),B=v8(V,this.deps),W=!1;if(Y.length!==V.length)W=!0;else for(let N of V)if(J[N]!==B[N]){W=!0;break}return{success:!0,rebuildNeeded:W}}catch(K){return{success:!1,rebuildNeeded:!1,error:L(K)}}}}Q1();Y$();pA();c();var j$=1,qA=0,p=1,O$=2;function ZK(A={}){let _=new JX("remote").description("Manage multi-device Git transport synchronization configuration");return _.command("set <repositoryUrl>").description("Set remote Git repository URL and initialize events log transport repository").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").option("--no-auto-pull","Disable automatic pull when memory sync --remote runs").option("--no-auto-push","Disable automatic push when memory sync --remote runs").action(async(G,$)=>{let K=await g8(G,A,$);process.exitCode=K.exitCode}),_.command("remove").description("Remove remote Git synchronization URL and disable remote sync").option("--json","Output stable JSON").action(async(G)=>{let $=await c8(A,G);process.exitCode=$.exitCode}),_.command("status").description("View remote Git synchronization status").option("--json","Output stable JSON").action(async(G)=>{let $=await u8(A,G);process.exitCode=$.exitCode}),_.command("preflight [repositoryUrl]").description("Validate remote sync readiness without sending event logs").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G,$)=>{let K=await BX(G,A,$);process.exitCode=K.exitCode}),_.command("doctor").description("Diagnose remote sync configuration and privacy readiness").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G)=>{let $=await WX(A,G);process.exitCode=$.exitCode}),_.command("backup [outputDir]").description("Create a local backup of remote sync configuration and event logs").option("--json","Output stable JSON").action(async(G,$)=>{let K=await zX(G,A,$);process.exitCode=K.exitCode}),_.command("restore <backupDir>").description("Restore remote sync configuration and event logs from a backup").option("--json","Output stable JSON").option("--confirm","Confirm restore mutation").action(async(G,$)=>{let K=await NX(G,A,$);process.exitCode=K.exitCode}),_.command("rollback <backupDir>").description("Rollback remote sync configuration and event logs from an explicit backup").option("--json","Output stable JSON").option("--confirm","Confirm rollback mutation").action(async(G,$)=>{let K=await LX(G,A,$);process.exitCode=K.exitCode}),_}async function g8(A,_={},G={}){try{let $=_.loadConfig??f,K=_.saveConfig??hA,Z=_.createGitSyncer??((N)=>new y_(N)),Y=$(_.configPathOverride),J=G.allowLocalPath===!0||_.allowLocalPathRemote===!0,H=K_(A,{allowLocalPathRemote:J});if(!H.valid){let N=`Failed to configure Git remote: ${H.error}`;if(G.json)a("set","error",p,{},[N]);else console.error(`Error: ${N}`);return{exitCode:p}}let Q=Z(_.eventsDirOverride);if(!await Q.isGitRepo()){if(!G.json)console.log("Initializing local Git repository in events directory...");if(!await Q.initRepo()){if(G.json)a("set","error",p,{},["Failed to initialize Git repository locally."]);else console.error("Error: Failed to initialize Git repository locally.");return{exitCode:p}}}if(!G.json)console.log(`Configuring remote origin repository URL: ${A}`);if(!await Q.configureRemote(A)){if(G.json)a("set","error",p,{},["Failed to configure Git remote repository origin."]);else console.error("Error: Failed to configure Git remote repository origin.");return{exitCode:p}}let B=G.autoPull??Y.remoteSync?.autoPull??!0,W=G.autoPush??Y.remoteSync?.autoPush??!0;if(K({remoteSync:{enabled:!0,repositoryUrl:A,autoPush:W,autoPull:B}},_.configPathOverride),G.json)a("set","ok",qA,{enabled:!0,repositoryUrl:A,autoPull:B,autoPush:W});else console.log(`
1680
+ Embedding failed at ${T}/${M} messages. Run memory sync --embed to resume from where it stopped.`);throw I}finally{await $.dispose()}}async function E3(A,_){let G=A.embeddedCount??0,$=A.storedModelName??A.storedHash??"unknown",K=A.currentModelName;if(_.force)return!0;if(!process.stdin.isTTY||_.quiet)return console.error(`Model changed from ${$} to ${K}. Skipping re-embedding in non-interactive mode. Run 'memory sync --embed' interactively to re-embed.`),!1;let Y=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise((J)=>{Y.question(`Model changed from ${$} to ${K}. Re-embed all ${G} messages? [y/N] `,(H)=>{Y.close(),J(H.trim().toLowerCase()==="y")})})}x5();LG();async function D3(A,_){try{let G=new L$(A),$=new v$,Z=await new cG(G,$).syncMemoryFiles();if(Z.filesIndexed>0||Z.filesSkipped>0||Z.errors.length>0)return Z;return null}catch(G){if(!_.quiet)console.error(` Memory files: error (${L(G)})`);return null}}function x3(A,_){if(_.json){let G={memoryFiles:{indexed:A.filesIndexed,skipped:A.filesSkipped,errors:A.errors}};console.log(JSON.stringify(G,null,2));return}if(_.quiet)return;if(console.log(` Memory files: ${A.filesIndexed} indexed, ${A.filesSkipped} skipped`),A.errors.length>0)for(let G of A.errors)console.log(` Error: ${G.filePath}: ${G.error}`)}async function m2(A,_,G){try{let $,K,Z,Y;if(G){if($=G.loadConfig(),!$.ambientContext.enabled)return;K=G.resolveAutoMemoryDir(),Z=G.resolveProjectName(),Y=G.createAmbientService()}else{let{loadConfig:H}=await Promise.resolve().then(() => (JA(),j$));if($=H(),!$.ambientContext.enabled)return;let Q=process.cwd(),{ProjectPath:X}=await Promise.resolve().then(() => e6),V=X.fromDecoded(Q),B=V.encoded;Z=V.projectName;let{homedir:W}=await import("os"),{join:N}=await import("path");K=N(W(),".claude","projects",B,"memory"),Y=await TH(A)}let J=await Y.generateAmbientContext({projectName:Z,autoMemoryDir:K,budget:$.ambientContext.budget});if(J.success&&!_.quiet)console.log(` Ambient context: updated (~${J.contextTokens} tokens)`);else if(!J.success&&!_.quiet)console.log(` Ambient context: skipped (${J.reason})`)}catch($){if(!_.quiet)console.error(` Ambient context: error (${L($)})`)}}async function TH(A){let{SqliteProjectResolver:_}=await Promise.resolve().then(() => j4),{SqliteFactRepository:G}=await Promise.resolve().then(() => (P0(),B4)),{SqliteFrictionRepository:$}=await Promise.resolve().then(() => ($G(),X4)),{SqlitePersonaRepository:K}=await Promise.resolve().then(() => (H_(),M4)),{SqliteGraphRepository:Z}=await Promise.resolve().then(() => (YG(),q4)),{SqliteMemoryGovernanceRepository:Y}=await Promise.resolve().then(() => (k0(),L4)),{SqliteMemoryUtilityRepository:J}=await Promise.resolve().then(() => (I$(),U4)),{AutoMemoryWriter:H}=await Promise.resolve().then(() => (w3(),v3)),{SmartContextService:Q}=await Promise.resolve().then(() => (iG(),sK)),{MemoryGovernanceService:X}=await Promise.resolve().then(() => ($_(),j6)),{MemoryRankingService:V}=await Promise.resolve().then(() => (r_(),tK)),{AmbientContextService:B}=await Promise.resolve().then(() => oK),{createContextFormatter:W}=await Promise.resolve().then(() => (n$(),_3)),N=new Y(A),z=new Q({projectResolver:new _(A),factRepo:new G(A),frictionRepo:new $(A),personaRepo:new K(A),graphRepo:new Z(A),governancePolicy:new X({repository:N}),rankingService:new V,utilityRepo:new J(A)}),q=W("ai",!1);return new B(z,new H,q)}JA();pA();function VQ({db:A,resolver:_}){let G=new z0({projectNameResolver:_}),$=new w$,K=new m(A),Z=new WA(A),Y=new X0(A),J=new Q0(A),H=new wG(G,$,K,Z,Y,J,A,new f$,new g$,new t);return{fixProjectNames:(Q)=>H.fixProjectNames(Q),sync:(Q)=>H.sync(Q)}}function BQ(A){return{handleBackgroundMode:C2,setupSignalHandlers:j9,hasCheckpoint:U9,loadCheckpoint:I_,createProgressReporter:L5,getDefaultDbPath:S,executeDryRun:R3,handleError:f2,reportResults:F3,createDriveResolver:S3,initializeDatabase:D,closeDatabase:E,bulkOperationCheckpoint:N$,registerCleanup:F9,unregisterCleanup:S9,createSyncService:VQ,loadConfig:f,createRemoteEventSyncService:WQ,runMemoryFileSync:D3,reportMemoryFileResults:x3,runAmbientContextGeneration:m2,runEmbeddingPass:g2,...A}}function p2(){return new XQ("sync").description("Sync sessions from ~/.claude/projects/ to database").option("-f, --force","Re-extract all sessions regardless of state").option("-p, --project <path>","Sync only sessions from specific project").option("-s, --session <id>","Sync a specific session only").option("-n, --dry-run","Show what would be synced without syncing").option("--fix-names","Fix truncated project names in existing sessions").option("--embed","Generate embeddings for messages after sync").option("--background","Run embedding in background (use with --embed)").option("--include-memory-files","Index legacy ~/.memory / MEMORY_HOME markdown files").option("--remote","Synchronize canonical event logs with configured remote").option("--json","Output results as JSON").addOption(new K8("-q, --quiet","Suppress progress output").conflicts("verbose")).addOption(new K8("-v, --verbose","Show detailed progress").conflicts("quiet")).action(async(A)=>{let _=await Z8(A);process.exitCode=_.exitCode})}async function Z8(A,_={}){let G=BQ(_);if(A.background)return await G.handleBackgroundMode(A);G.setupSignalHandlers();let $=Date.now(),K=G.createProgressReporter(A);if(!A.quiet&&G.hasCheckpoint()){let H=G.loadCheckpoint();if(H)console.log(`Resuming from previous interrupted sync (${H.completedSessions}/${H.totalSessions} sessions done)`)}let Z=G.getDefaultDbPath();if(A.dryRun)return await G.executeDryRun(A);let Y;try{Y=G.initializeDatabase({path:Z}).db}catch(H){return G.handleError(H,A),{exitCode:1}}let J=async()=>{G.closeDatabase(Y)};G.registerCleanup(J);try{let H=G.createDriveResolver(),Q=G.createSyncService({db:Y,resolver:H});if(A.fixNames){K.log("Fixing project names...");let I=await Q.fixProjectNames(H);if(!A.quiet)console.log(`Fixed project names: ${I} sessions updated`)}let X={force:A.force,projectFilter:A.project,sessionFilter:A.session,checkpointEnabled:!0,onProgress:(I)=>{if(I.phase==="discovering")K.log("Discovering sessions...");else if(I.phase==="extracting"){if(I.current===1)K.start(I.total);K.update(I.current,I.sessionId)}}},V=await Q.sync(X);G.bulkOperationCheckpoint(Y),K.stop(),G.reportResults(V,$,A);let B=G.loadConfig(),W=B.remoteSync?.repositoryUrl,N=B.remoteSync?.enabled===!0&&typeof W==="string"&&W.trim().length>0;if(N&&A.remote===!0){if(!A.quiet)console.log("Synchronizing events with remote Git repository...");try{let T=await(await G.createRemoteEventSyncService({db:Y})).sync({machineId:B.machineId,repositoryUrl:W,autoPull:B.remoteSync.autoPull,autoPush:B.remoteSync.autoPush});if(T.success){if(T.rebuildNeeded){if(!A.quiet)console.log("Remote events pulled. Rebuilding database projections...")}else if(!A.quiet)console.log("Git events are already up to date.")}else if(T.status==="blocked"){let M=[T.error??"Remote synchronization blocked.","Run 'memory audit-secrets --skip-db --quarantine-events' and retry after reviewing the quarantine output."].join(" ");return console.error(M),{exitCode:1}}else console.error(`Warning: Remote synchronization failed: ${T.error}`)}catch(I){console.error(`Warning: Remote synchronization failed to execute: ${L(I)}`)}}else if(A.remote===!0)return console.error("Remote synchronization requested but no remote repository is configured. Run 'memory remote set <repository-url>' first."),{exitCode:1};else if(N&&!A.quiet)console.warn("Remote synchronization is configured but skipped. Run 'memory sync --remote' to synchronize canonical event logs.");if(A.includeMemoryFiles===!0||B.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1"){let I=await G.runMemoryFileSync(Y,A);if(I)G.reportMemoryFileResults(I,A)}else if(A.verbose&&!A.quiet)console.log(" Memory files: skipped (legacy opt-in disabled)");if(!A.dryRun)await G.runAmbientContextGeneration(Y,A);let q=V.errors.length>0||V.aborted?1:0;if(A.embed&&!A.dryRun){let I=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await G.runEmbeddingPass(Y,A)}catch(T){if(A.json)console.error(qG(C_(T)));else if(!A.quiet)console.error(i(C_(T),{verbose:A.verbose}));return{exitCode:1}}finally{if(I)if(G.removeBackgroundLock)G.removeBackgroundLock();else{let{removeLock:T}=await Promise.resolve().then(() => (e$(),t$));T()}}}return{exitCode:q}}catch(H){return K.stop(),G.handleError(H,A),{exitCode:1}}finally{G.unregisterCleanup(J),G.closeDatabase(Y)}}async function WQ({db:A}){let{RemoteEventSyncService:_}=await Promise.resolve().then(() => (Q$(),F6)),{GitRemoteEventTransport:G}=await Promise.resolve().then(() => (u3(),c3)),{getEventsDir:$}=await Promise.resolve().then(() => (c(),PG)),{rebuildProjections:K}=await Promise.resolve().then(() => (K1(),t3)),{SecretAuditService:Z}=await Promise.resolve().then(() => (Y1(),$8)),{getAllLogFiles:Y}=await Promise.resolve().then(() => (c(),PG));return new _({transport:new G($()),privacyPreflight:{audit:async()=>{return{eventLogFindings:(await new Z(new t).audit({eventLogPaths:Y()})).summary.eventLogFindings}}},projectionRebuilder:{rebuild:async()=>{await K(A)}}})}RG();t2();AK();M1();U1();B1();IA();import{Command as _X}from"commander";N0();import tQ from"@inquirer/search";import eQ from"@inquirer/select";import sQ from"fuzzy";var D8=null,oQ=null,AX=null;function x8(){if(D8!==null)return D8;return process.stdout.isTTY===!0}function P8(){return x8()}async function y8(A){if(!x8())throw Error("Interactive picker requires TTY. Use --session <id> instead.");let{sessionRepo:_,limit:G=100}=A,K=(await _.findFiltered({limit:G})).map((X)=>({value:X.id,name:`${X.projectPath.projectName} (${DA(X.startTime)})`,description:`${X.id.substring(0,8)}... | ${X.messages.length} messages`})),J=await(oQ??tQ)({message:"Search sessions (type to filter):",source:async(X,{signal:V})=>{if(V.aborted)return[];if(!X)return K;return sQ.filter(X,K,{extract:(W)=>`${W.name} ${W.description}`}).map((W)=>W.original)},pageSize:10}),Q=await(AX??eQ)({message:"Action:",choices:[{value:"show",name:"Show session details"},{value:"search",name:"Search within session"},{value:"context",name:"Get project context"},{value:"related",name:"Find related sessions"},{value:"cancel",name:"Cancel"}]});if(Q==="cancel")return null;return{sessionId:J,action:Q}}mA();B1();RG();M1();U1();u();iA();function GX(A){return{dbPath:S(),show:TG,search:FG,context:OG,related:jG,...A}}function $K(){return new _X("browse").description("Interactive session browser").option("-l, --limit <count>","Maximum sessions to show","100").action(async(A)=>{let _=await k8(A);process.exitCode=_.exitCode})}async function k8(A,_={}){if(!P8())return console.error("Error: Interactive mode requires a terminal."),console.error("Use specific commands instead:"),console.error(" memory list - List sessions"),console.error(" memory show <id> - Show session details"),console.error(" memory search <q> - Search sessions"),{exitCode:1};let G=GX(_),$={limit:"100",...A},K=parseInt($.limit,10),Z=G.dbPath,{db:Y}=D({path:Z});try{let J=new m(Y),H=await y8({sessionRepo:J,limit:K});if(!H)return E(Y),{exitCode:0};switch(E(Y),H.action){case"show":await G.show(H.sessionId,{});break;case"search":await G.search("*",{session:H.sessionId});break;case"context":{let{db:Q}=D({path:Z}),V=await new m(Q).findById(H.sessionId);if(E(Q),V)await G.context(V.projectPath.projectName,{});break}case"related":await G.related(H.sessionId,{});break}return{exitCode:0}}catch(J){let H=J instanceof F?J:new F(j.DB_CONNECTION_FAILED,L(J));console.error(i(H));try{E(Y)}catch{}return{exitCode:1}}}l0();JA();import{Command as JX}from"commander";import{copyFileSync as C8,cpSync as HX,existsSync as q0,mkdirSync as k_,readdirSync as b8,readFileSync as QX,rmSync as f8,statSync as KK,writeFileSync as XX}from"fs";import{dirname as VX,join as MA}from"path";c();import{readFileSync as $X,existsSync as KX}from"fs";import{join as h8}from"path";var{spawn:ZX}=globalThis.Bun;async function YX(A,_,G=process.env){let $=ZX(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:G}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}function v8(A,_){let G={};for(let $ of A)if(_.existsSync($))try{let K=_.readFileSync($,"utf-8");G[$]=Bun.hash(K).toString()}catch{G[$]="error"}return G}class y_{eventsDir;deps;constructor(A,_={}){this.eventsDir=A??CA(),this.deps={runGit:YX,existsSync:KX,readFileSync:$X,getAllLogFiles:UA,now:()=>new Date,..._}}async isGitRepo(){let A=h8(this.eventsDir,".git");return this.deps.existsSync(A)}async initRepo(){if(!(await this.deps.runGit(["init"],this.eventsDir)).success)return!1;let _=await this.deps.runGit(["config","user.name"],this.eventsDir);if(!_.success||!_.stdout)await this.deps.runGit(["config","user.name","Memory Nexus"],this.eventsDir),await this.deps.runGit(["config","user.email","sync@memory-nexus.local"],this.eventsDir);return await this.deps.runGit(["checkout","-b","main"],this.eventsDir),!0}async configureRemote(A){if(!A.trim())return!1;return await this.deps.runGit(["remote","remove","origin"],this.eventsDir),(await this.deps.runGit(["remote","add","origin",A],this.eventsDir)).success}async removeRemote(){let A=await this.deps.runGit(["remote","remove","origin"],this.eventsDir);return A.success||A.stderr.includes("No such remote")}async getRemoteUrl(){let A=await this.deps.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async sync(A,_,G=!0,$=!0){try{if(!await this.isGitRepo()){if(!await this.initRepo())return{success:!1,rebuildNeeded:!1,error:"Failed to initialize Git repository in events directory"}}if(await this.getRemoteUrl()!==_){if(!await this.configureRemote(_))return{success:!1,rebuildNeeded:!1,error:"Failed to configure Git remote repository URL"}}let Y=this.deps.getAllLogFiles(this.eventsDir),J=v8(Y,this.deps),H=`events-${A}.jsonl`,Q=h8(this.eventsDir,H);if(this.deps.existsSync(Q))await this.deps.runGit(["add",H],this.eventsDir),await this.deps.runGit(["commit","-m",`sync: ${A} observed at ${this.deps.now().toISOString()}`],this.eventsDir);let X=!0;if(G){if(await this.deps.runGit(["fetch","origin"],this.eventsDir),(await this.deps.runGit(["rev-parse","--verify","origin/main"],this.eventsDir)).success){let z=await this.deps.runGit(["pull","--rebase","origin","main"],this.eventsDir);if(!z.success)return X=!1,await this.deps.runGit(["rebase","--abort"],this.eventsDir),{success:!1,rebuildNeeded:!1,error:`Git pull failed: ${z.stderr}`}}}if($&&X){let N=await this.deps.runGit(["push","-u","origin","main"],this.eventsDir);if(!N.success)return{success:!1,rebuildNeeded:!1,error:`Git push failed: ${N.stderr}`}}let V=this.deps.getAllLogFiles(this.eventsDir),B=v8(V,this.deps),W=!1;if(Y.length!==V.length)W=!0;else for(let N of V)if(J[N]!==B[N]){W=!0;break}return{success:!0,rebuildNeeded:W}}catch(K){return{success:!1,rebuildNeeded:!1,error:L(K)}}}}Q$();Y1();pA();c();var j1=1,qA=0,p=1,O1=2;function ZK(A={}){let _=new JX("remote").description("Manage multi-device Git transport synchronization configuration");return _.command("set <repositoryUrl>").description("Set remote Git repository URL and initialize events log transport repository").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").option("--no-auto-pull","Disable automatic pull when memory sync --remote runs").option("--no-auto-push","Disable automatic push when memory sync --remote runs").action(async(G,$)=>{let K=await g8(G,A,$);process.exitCode=K.exitCode}),_.command("remove").description("Remove remote Git synchronization URL and disable remote sync").option("--json","Output stable JSON").action(async(G)=>{let $=await c8(A,G);process.exitCode=$.exitCode}),_.command("status").description("View remote Git synchronization status").option("--json","Output stable JSON").action(async(G)=>{let $=await u8(A,G);process.exitCode=$.exitCode}),_.command("preflight [repositoryUrl]").description("Validate remote sync readiness without sending event logs").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G,$)=>{let K=await BX(G,A,$);process.exitCode=K.exitCode}),_.command("doctor").description("Diagnose remote sync configuration and privacy readiness").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G)=>{let $=await WX(A,G);process.exitCode=$.exitCode}),_.command("backup [outputDir]").description("Create a local backup of remote sync configuration and event logs").option("--json","Output stable JSON").action(async(G,$)=>{let K=await zX(G,A,$);process.exitCode=K.exitCode}),_.command("restore <backupDir>").description("Restore remote sync configuration and event logs from a backup").option("--json","Output stable JSON").option("--confirm","Confirm restore mutation").action(async(G,$)=>{let K=await NX(G,A,$);process.exitCode=K.exitCode}),_.command("rollback <backupDir>").description("Rollback remote sync configuration and event logs from an explicit backup").option("--json","Output stable JSON").option("--confirm","Confirm rollback mutation").action(async(G,$)=>{let K=await LX(G,A,$);process.exitCode=K.exitCode}),_}async function g8(A,_={},G={}){try{let $=_.loadConfig??f,K=_.saveConfig??hA,Z=_.createGitSyncer??((N)=>new y_(N)),Y=$(_.configPathOverride),J=G.allowLocalPath===!0||_.allowLocalPathRemote===!0,H=K_(A,{allowLocalPathRemote:J});if(!H.valid){let N=`Failed to configure Git remote: ${H.error}`;if(G.json)a("set","error",p,{},[N]);else console.error(`Error: ${N}`);return{exitCode:p}}let Q=Z(_.eventsDirOverride);if(!await Q.isGitRepo()){if(!G.json)console.log("Initializing local Git repository in events directory...");if(!await Q.initRepo()){if(G.json)a("set","error",p,{},["Failed to initialize Git repository locally."]);else console.error("Error: Failed to initialize Git repository locally.");return{exitCode:p}}}if(!G.json)console.log(`Configuring remote origin repository URL: ${A}`);if(!await Q.configureRemote(A)){if(G.json)a("set","error",p,{},["Failed to configure Git remote repository origin."]);else console.error("Error: Failed to configure Git remote repository origin.");return{exitCode:p}}let B=G.autoPull??Y.remoteSync?.autoPull??!0,W=G.autoPush??Y.remoteSync?.autoPush??!0;if(K({remoteSync:{enabled:!0,repositoryUrl:A,autoPush:W,autoPull:B}},_.configPathOverride),G.json)a("set","ok",qA,{enabled:!0,repositoryUrl:A,autoPull:B,autoPush:W});else console.log(`
1681
1681
  Success: Remote synchronization configured successfully!`),console.log("To synchronize your local facts with the remote repository, run: memory sync --remote");return{exitCode:qA}}catch($){let K=`Error setting remote: ${L($)}`;if(G.json)a("set","error",p,{},[K]);else console.error("Error setting remote:",L($));return{exitCode:p}}}async function c8(A={},_={}){try{let G=A.loadConfig??f,$=A.saveConfig??hA,K=A.createGitSyncer??((H)=>new y_(H)),Z=G(A.configPathOverride);$({remoteSync:{enabled:!1,autoPush:Z.remoteSync?.autoPush??!0,autoPull:Z.remoteSync?.autoPull??!0}},A.configPathOverride);let Y=K(A.eventsDirOverride);if(await Y.isGitRepo()){if(!_.json)console.log("Removing Git remote origin URL...");await Y.removeRemote()}if(_.json)a("remove","ok",qA,{enabled:!1});else console.log(`
1682
- Success: Remote synchronization disabled and origin repository URL removed.`);return{exitCode:qA}}catch(G){let $=`Error removing remote: ${L(G)}`;if(_.json)a("remove","error",p,{},[$]);else console.error("Error removing remote:",L(G));return{exitCode:p}}}async function u8(A={},_={}){try{let G=A.loadConfig??f,$=A.createGitSyncer??((Q)=>new y_(Q)),K=G(A.configPathOverride),Z=K.remoteSync,Y=$(A.eventsDirOverride),J=await Y.isGitRepo(),H={machineId:K.machineId,enabled:Z?.enabled===!0,repositoryUrl:Z?.repositoryUrl??null,autoPull:Z?.autoPull??!1,autoPush:Z?.autoPush??!1,gitRepository:J?"initialized":"not_initialized",actualRemoteUrl:null};if(J){let Q=await Y.getRemoteUrl();H.actualRemoteUrl=Q}if(_.json)a("status","ok",qA,H);else if(console.log("Remote Sync Status"),console.log("=================="),console.log(`Machine ID: ${K.machineId}`),console.log(`Enabled: ${Z?.enabled?"yes":"no"}`),console.log(`Repository URL: ${Z?.repositoryUrl??"none configured"}`),console.log(`Auto-Pull: ${Z?.autoPull?"enabled":"disabled"}`),console.log(`Auto-Push: ${Z?.autoPush?"enabled":"disabled"}`),console.log(`Git Repository: ${J?"initialized":"not initialized"}`),J)console.log(`Actual Git Remote: ${H.actualRemoteUrl??"none"}`);return{exitCode:qA}}catch(G){let $=`Error gathering remote status: ${L(G)}`;if(_.json)a("status","error",p,{},[$]);else console.error("Error gathering remote status:",L(G));return{exitCode:p}}}async function BX(A,_={},G={}){try{let $=await d8(A,_,G),K=$.ready?qA:O$;if(G.json)a("preflight",$.ready?"ok":"not_ready",K,$,$.errors,$.warnings);else{console.log("Remote Sync Preflight"),console.log("====================="),console.log(`Ready: ${$.ready?"yes":"no"}`),console.log(`Machine ID: ${$.machineId}`),console.log(`Repository URL: ${$.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${$.gitRepository}`),console.log(`Actual Git Remote: ${$.actualRemoteUrl??"none"}`),console.log(`Event-log findings: ${$.eventLogFindings}`);for(let Z of $.warnings)console.warn(`Warning: ${Z}`);for(let Z of $.errors)console.error(`Error: ${Z}`)}return{exitCode:K}}catch($){let K=`Error running remote preflight: ${L($)}`;if(G.json)a("preflight","error",p,{},[K]);else console.error("Error running remote preflight:",L($));return{exitCode:p}}}async function WX(A={},_={}){try{let G=await d8(void 0,A,_),$=G.ready?qA:O$;if(_.json)a("doctor",G.ready?"ok":"not_ready",$,G,G.errors,G.warnings);else{console.log("Remote Sync Doctor"),console.log("=================="),console.log(`Ready: ${G.ready?"yes":"no"}`),console.log(`Remote configured: ${G.enabled?"yes":"no"}`),console.log(`Repository URL: ${G.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${G.gitRepository}`),console.log(`Event-log findings: ${G.eventLogFindings}`);for(let K of G.warnings)console.warn(`Warning: ${K}`);for(let K of G.errors)console.error(`Error: ${K}`)}return{exitCode:$}}catch(G){let $=`Error running remote doctor: ${L(G)}`;if(_.json)a("doctor","error",p,{},[$]);else console.error("Error running remote doctor:",L(G));return{exitCode:p}}}async function zX(A,_={},G={}){try{let $=l8(A,_);if(G.json)a("backup","ok",qA,{...$});else console.log("Remote sync backup created."),console.log(`Backup path: ${$.backupPath}`),console.log(`Config: ${$.includesConfig?"included":"not found"}`),console.log(`Event files: ${$.eventFileCount}`);return{exitCode:qA}}catch($){let K=`Error creating remote backup: ${L($)}`;if(G.json)a("backup","error",p,{},[K]);else console.error("Error creating remote backup:",L($));return{exitCode:p}}}async function NX(A,_={},G={}){return m8("restore",A,_,G)}async function LX(A,_={},G={}){return m8("rollback",A,_,G)}async function m8(A,_,G,$){try{if($.confirm!==!0){let J=`${A} requires --confirm before mutating config or event logs`;if($.json)a(A,"not_ready",O$,{},[J]);else console.error(`Error: ${J}`);return{exitCode:O$}}let K=UX(_),Z=l8(void 0,G);qX(_,K,G);let Y={backupPath:_,rollbackBackupPath:Z.backupPath,restoredConfig:K.includesConfig,restoredEvents:K.includesEvents,eventFileCount:K.eventFileCount};if($.json)a(A,"ok",qA,Y);else console.log(`Remote sync ${A} completed.`),console.log(`Source backup: ${_}`),console.log(`Rollback backup: ${Z.backupPath}`);return{exitCode:qA}}catch(K){let Z=`Error running remote ${A}: ${L(K)}`;if($.json)a(A,"error",p,{},[Z]);else console.error(`Error running remote ${A}:`,L(K));return{exitCode:p}}}async function d8(A,_,G){let $=_.loadConfig??f,K=_.createGitSyncer??((q)=>new y_(q)),Z=_.auditRemoteEventLogs??MX,Y=$(_.configPathOverride),J=Y.remoteSync,H=A??J?.repositoryUrl,Q=[],X=[],V=o_(Y.machineId??"");if(!V.valid)X.push(V.error??"Machine identity is invalid");if(!H)X.push("Remote repository URL is not configured");else{let q=K_(H,{allowLocalPathRemote:G.allowLocalPath===!0||_.allowLocalPathRemote===!0});if(!q.valid)X.push(q.error??"Remote URL is invalid")}let B=K(_.eventsDirOverride),W=await B.isGitRepo(),N=null;if(W){if(N=await B.getRemoteUrl(),H&&N&&N!==H)Q.push("Configured remote URL does not match actual Git origin")}let z=await Z();if(z.eventLogFindings>0)X.push(`Active event logs contain ${z.eventLogFindings} likely secret finding(s)`);return{schemaVersion:j$,ready:X.length===0,enabled:J?.enabled===!0,machineId:Y.machineId??"",repositoryUrl:H??null,autoPull:J?.autoPull??!1,autoPush:J?.autoPush??!1,gitRepository:W?"initialized":"not_initialized",actualRemoteUrl:N,eventLogFindings:z.eventLogFindings,warnings:Q,errors:X}}async function MX(){return{eventLogFindings:(await new R_(new t).audit({eventLogPaths:UA()})).summary.eventLogFindings}}function l8(A,_){let G=_.now?.()??new Date,$=G.toISOString(),K=`remote-sync-${IX(G)}`,Z=A??_.backupDirOverride??MA(T0(),"remote-sync");k_(Z,{recursive:!0,mode:448});let Y=TX(Z,K);k_(Y,{recursive:!0,mode:448});let J=_.configPathOverride??A0(),H=_.eventsDirOverride??CA(),Q=MA(Y,"config.json"),X=MA(Y,"events"),V=q0(J),B=q0(H)&&KK(H).isDirectory(),W=0;if(V)C8(J,Q);if(B)k_(X,{recursive:!0,mode:448}),W=YK(H,X);let N={schemaVersion:j$,kind:"memory.remoteSync.backup",backupId:K,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:[".git"]},z=MA(Y,"manifest.json");return XX(z,`${JSON.stringify(N,null,2)}
1683
- `,{mode:384}),{backupId:K,backupPath:Y,manifestPath:z,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:N.excludedPaths}}function qX(A,_,G){let $=G.configPathOverride??A0(),K=G.eventsDirOverride??CA(),Z=MA(A,"config.json"),Y=MA(A,"events");if(_.includesConfig){if(k_(VX($),{recursive:!0,mode:448}),!q0(Z))throw Error("Backup manifest declares config but config.json is missing");C8(Z,$)}else if(q0($))f8($,{force:!0});if(_.includesEvents){if(!q0(Y)||!KK(Y).isDirectory())throw Error("Backup manifest declares events but events directory is missing");k_(K,{recursive:!0,mode:448}),w8(K),YK(Y,K)}else if(q0(K))w8(K)}function UX(A){let _=MA(A,"manifest.json");if(!q0(_))throw Error("Remote backup manifest.json is missing");let G=JSON.parse(QX(_,"utf-8"));if(G.schemaVersion!==j$||G.kind!=="memory.remoteSync.backup"||typeof G.backupId!=="string"||typeof G.createdAt!=="string"||typeof G.includesConfig!=="boolean"||typeof G.includesEvents!=="boolean"||typeof G.eventFileCount!=="number"||!Array.isArray(G.excludedPaths))throw Error("Remote backup manifest is invalid or unsupported");return G}function YK(A,_){let G=0;for(let $ of b8(A)){if($===".git")continue;let K=MA(A,$),Z=MA(_,$),Y=KK(K);if(Y.isDirectory())k_(Z,{recursive:!0,mode:448}),G+=YK(K,Z);else if(Y.isFile())HX(K,Z),G+=1}return G}function w8(A){for(let _ of b8(A)){if(_===".git")continue;f8(MA(A,_),{recursive:!0,force:!0,maxRetries:10,retryDelay:50})}}function TX(A,_){let G=MA(A,_),$=2;while(q0(G))G=MA(A,`${_}-${$}`),$+=1;return G}function IX(A){return A.toISOString().replace(/[-:.]/g,"").replace("Z","Z")}function a(A,_,G,$,K=[],Z=[]){console.log(JSON.stringify({schemaVersion:j$,command:A,status:_,exitCode:G,data:$,errors:K,warnings:Z},null,2))}L_();import{Command as OX}from"commander";import{copyFileSync as jX,existsSync as p8,mkdirSync as RX}from"fs";import{dirname as FX,join as JK}from"path";function HK(){return new OX("install").description("Install Claude Code hooks for automatic session sync").option("-f, --force","Reinstall even if already installed").action(async(A)=>{let _=await n8(A);process.exitCode=_.exitCode})}async function n8(A,_={}){let G=bA(_.hookOverrides);if(G.sessionEnd&&G.preCompact&&!A.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let $=I0(_.hookOverrides);RX(FX($),{recursive:!0});let K=EX(_.hookScriptSourceOverride);if(!K)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};jX(K,$),console.log(`Copied hook script to ${$}`);let Z=O0(_.hookOverrides);if(console.log(Z.message),Z.success)console.log(`
1682
+ Success: Remote synchronization disabled and origin repository URL removed.`);return{exitCode:qA}}catch(G){let $=`Error removing remote: ${L(G)}`;if(_.json)a("remove","error",p,{},[$]);else console.error("Error removing remote:",L(G));return{exitCode:p}}}async function u8(A={},_={}){try{let G=A.loadConfig??f,$=A.createGitSyncer??((Q)=>new y_(Q)),K=G(A.configPathOverride),Z=K.remoteSync,Y=$(A.eventsDirOverride),J=await Y.isGitRepo(),H={machineId:K.machineId,enabled:Z?.enabled===!0,repositoryUrl:Z?.repositoryUrl??null,autoPull:Z?.autoPull??!1,autoPush:Z?.autoPush??!1,gitRepository:J?"initialized":"not_initialized",actualRemoteUrl:null};if(J){let Q=await Y.getRemoteUrl();H.actualRemoteUrl=Q}if(_.json)a("status","ok",qA,H);else if(console.log("Remote Sync Status"),console.log("=================="),console.log(`Machine ID: ${K.machineId}`),console.log(`Enabled: ${Z?.enabled?"yes":"no"}`),console.log(`Repository URL: ${Z?.repositoryUrl??"none configured"}`),console.log(`Auto-Pull: ${Z?.autoPull?"enabled":"disabled"}`),console.log(`Auto-Push: ${Z?.autoPush?"enabled":"disabled"}`),console.log(`Git Repository: ${J?"initialized":"not initialized"}`),J)console.log(`Actual Git Remote: ${H.actualRemoteUrl??"none"}`);return{exitCode:qA}}catch(G){let $=`Error gathering remote status: ${L(G)}`;if(_.json)a("status","error",p,{},[$]);else console.error("Error gathering remote status:",L(G));return{exitCode:p}}}async function BX(A,_={},G={}){try{let $=await d8(A,_,G),K=$.ready?qA:O1;if(G.json)a("preflight",$.ready?"ok":"not_ready",K,$,$.errors,$.warnings);else{console.log("Remote Sync Preflight"),console.log("====================="),console.log(`Ready: ${$.ready?"yes":"no"}`),console.log(`Machine ID: ${$.machineId}`),console.log(`Repository URL: ${$.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${$.gitRepository}`),console.log(`Actual Git Remote: ${$.actualRemoteUrl??"none"}`),console.log(`Event-log findings: ${$.eventLogFindings}`);for(let Z of $.warnings)console.warn(`Warning: ${Z}`);for(let Z of $.errors)console.error(`Error: ${Z}`)}return{exitCode:K}}catch($){let K=`Error running remote preflight: ${L($)}`;if(G.json)a("preflight","error",p,{},[K]);else console.error("Error running remote preflight:",L($));return{exitCode:p}}}async function WX(A={},_={}){try{let G=await d8(void 0,A,_),$=G.ready?qA:O1;if(_.json)a("doctor",G.ready?"ok":"not_ready",$,G,G.errors,G.warnings);else{console.log("Remote Sync Doctor"),console.log("=================="),console.log(`Ready: ${G.ready?"yes":"no"}`),console.log(`Remote configured: ${G.enabled?"yes":"no"}`),console.log(`Repository URL: ${G.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${G.gitRepository}`),console.log(`Event-log findings: ${G.eventLogFindings}`);for(let K of G.warnings)console.warn(`Warning: ${K}`);for(let K of G.errors)console.error(`Error: ${K}`)}return{exitCode:$}}catch(G){let $=`Error running remote doctor: ${L(G)}`;if(_.json)a("doctor","error",p,{},[$]);else console.error("Error running remote doctor:",L(G));return{exitCode:p}}}async function zX(A,_={},G={}){try{let $=l8(A,_);if(G.json)a("backup","ok",qA,{...$});else console.log("Remote sync backup created."),console.log(`Backup path: ${$.backupPath}`),console.log(`Config: ${$.includesConfig?"included":"not found"}`),console.log(`Event files: ${$.eventFileCount}`);return{exitCode:qA}}catch($){let K=`Error creating remote backup: ${L($)}`;if(G.json)a("backup","error",p,{},[K]);else console.error("Error creating remote backup:",L($));return{exitCode:p}}}async function NX(A,_={},G={}){return m8("restore",A,_,G)}async function LX(A,_={},G={}){return m8("rollback",A,_,G)}async function m8(A,_,G,$){try{if($.confirm!==!0){let J=`${A} requires --confirm before mutating config or event logs`;if($.json)a(A,"not_ready",O1,{},[J]);else console.error(`Error: ${J}`);return{exitCode:O1}}let K=UX(_),Z=l8(void 0,G);qX(_,K,G);let Y={backupPath:_,rollbackBackupPath:Z.backupPath,restoredConfig:K.includesConfig,restoredEvents:K.includesEvents,eventFileCount:K.eventFileCount};if($.json)a(A,"ok",qA,Y);else console.log(`Remote sync ${A} completed.`),console.log(`Source backup: ${_}`),console.log(`Rollback backup: ${Z.backupPath}`);return{exitCode:qA}}catch(K){let Z=`Error running remote ${A}: ${L(K)}`;if($.json)a(A,"error",p,{},[Z]);else console.error(`Error running remote ${A}:`,L(K));return{exitCode:p}}}async function d8(A,_,G){let $=_.loadConfig??f,K=_.createGitSyncer??((q)=>new y_(q)),Z=_.auditRemoteEventLogs??MX,Y=$(_.configPathOverride),J=Y.remoteSync,H=A??J?.repositoryUrl,Q=[],X=[],V=o_(Y.machineId??"");if(!V.valid)X.push(V.error??"Machine identity is invalid");if(!H)X.push("Remote repository URL is not configured");else{let q=K_(H,{allowLocalPathRemote:G.allowLocalPath===!0||_.allowLocalPathRemote===!0});if(!q.valid)X.push(q.error??"Remote URL is invalid")}let B=K(_.eventsDirOverride),W=await B.isGitRepo(),N=null;if(W){if(N=await B.getRemoteUrl(),H&&N&&N!==H)Q.push("Configured remote URL does not match actual Git origin")}let z=await Z();if(z.eventLogFindings>0)X.push(`Active event logs contain ${z.eventLogFindings} likely secret finding(s)`);return{schemaVersion:j1,ready:X.length===0,enabled:J?.enabled===!0,machineId:Y.machineId??"",repositoryUrl:H??null,autoPull:J?.autoPull??!1,autoPush:J?.autoPush??!1,gitRepository:W?"initialized":"not_initialized",actualRemoteUrl:N,eventLogFindings:z.eventLogFindings,warnings:Q,errors:X}}async function MX(){return{eventLogFindings:(await new R_(new t).audit({eventLogPaths:UA()})).summary.eventLogFindings}}function l8(A,_){let G=_.now?.()??new Date,$=G.toISOString(),K=`remote-sync-${IX(G)}`,Z=A??_.backupDirOverride??MA(T0(),"remote-sync");k_(Z,{recursive:!0,mode:448});let Y=TX(Z,K);k_(Y,{recursive:!0,mode:448});let J=_.configPathOverride??A0(),H=_.eventsDirOverride??CA(),Q=MA(Y,"config.json"),X=MA(Y,"events"),V=q0(J),B=q0(H)&&KK(H).isDirectory(),W=0;if(V)C8(J,Q);if(B)k_(X,{recursive:!0,mode:448}),W=YK(H,X);let N={schemaVersion:j1,kind:"memory.remoteSync.backup",backupId:K,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:[".git"]},z=MA(Y,"manifest.json");return XX(z,`${JSON.stringify(N,null,2)}
1683
+ `,{mode:384}),{backupId:K,backupPath:Y,manifestPath:z,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:N.excludedPaths}}function qX(A,_,G){let $=G.configPathOverride??A0(),K=G.eventsDirOverride??CA(),Z=MA(A,"config.json"),Y=MA(A,"events");if(_.includesConfig){if(k_(VX($),{recursive:!0,mode:448}),!q0(Z))throw Error("Backup manifest declares config but config.json is missing");C8(Z,$)}else if(q0($))f8($,{force:!0});if(_.includesEvents){if(!q0(Y)||!KK(Y).isDirectory())throw Error("Backup manifest declares events but events directory is missing");k_(K,{recursive:!0,mode:448}),w8(K),YK(Y,K)}else if(q0(K))w8(K)}function UX(A){let _=MA(A,"manifest.json");if(!q0(_))throw Error("Remote backup manifest.json is missing");let G=JSON.parse(QX(_,"utf-8"));if(G.schemaVersion!==j1||G.kind!=="memory.remoteSync.backup"||typeof G.backupId!=="string"||typeof G.createdAt!=="string"||typeof G.includesConfig!=="boolean"||typeof G.includesEvents!=="boolean"||typeof G.eventFileCount!=="number"||!Array.isArray(G.excludedPaths))throw Error("Remote backup manifest is invalid or unsupported");return G}function YK(A,_){let G=0;for(let $ of b8(A)){if($===".git")continue;let K=MA(A,$),Z=MA(_,$),Y=KK(K);if(Y.isDirectory())k_(Z,{recursive:!0,mode:448}),G+=YK(K,Z);else if(Y.isFile())HX(K,Z),G+=1}return G}function w8(A){for(let _ of b8(A)){if(_===".git")continue;f8(MA(A,_),{recursive:!0,force:!0,maxRetries:10,retryDelay:50})}}function TX(A,_){let G=MA(A,_),$=2;while(q0(G))G=MA(A,`${_}-${$}`),$+=1;return G}function IX(A){return A.toISOString().replace(/[-:.]/g,"").replace("Z","Z")}function a(A,_,G,$,K=[],Z=[]){console.log(JSON.stringify({schemaVersion:j1,command:A,status:_,exitCode:G,data:$,errors:K,warnings:Z},null,2))}L_();import{Command as OX}from"commander";import{copyFileSync as jX,existsSync as p8,mkdirSync as RX}from"fs";import{dirname as FX,join as JK}from"path";function HK(){return new OX("install").description("Install Claude Code hooks for automatic session sync").option("-f, --force","Reinstall even if already installed").action(async(A)=>{let _=await n8(A);process.exitCode=_.exitCode})}async function n8(A,_={}){let G=bA(_.hookOverrides);if(G.sessionEnd&&G.preCompact&&!A.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let $=I0(_.hookOverrides);RX(FX($),{recursive:!0});let K=EX(_.hookScriptSourceOverride);if(!K)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};jX(K,$),console.log(`Copied hook script to ${$}`);let Z=O0(_.hookOverrides);if(console.log(Z.message),Z.success)console.log(`
1684
1684
  Hook installation complete!`),console.log("Sessions will now sync automatically when they end."),console.log(`
1685
1685
  To check status: memory status`),console.log("To uninstall: memory uninstall"),SX(_.hookOverrides);else return{exitCode:1};return{exitCode:0}}function SX(A){let _=s0(A);if(!_.hooks)return;let G="memory-nexus",$=!1;for(let K of Object.values(_.hooks)){if(!Array.isArray(K))continue;for(let Z of K){if(!Z?.hooks)continue;for(let Y of Z.hooks)if(Y.command?.includes(G)){$=!0;break}if($)break}if($)break}if($)console.error(`
1686
- Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function EX(A){if(A!==void 0)return p8(A)?A:null;let _=JK(import.meta.dir,"../../../../dist/sync-hook.js"),G=JK(process.cwd(),"dist/sync-hook.js"),$=JK(process.cwd(),"dist","sync-hook.js");return[_,G,$].find((Z)=>p8(Z))??null}L_();import{Command as DX}from"commander";import{existsSync as xX,unlinkSync as PX}from"fs";function QK(){return new DX("uninstall").description("Remove Claude Code hooks for automatic session sync").option("-r, --restore","Restore settings.json from backup").action(async(A)=>{let _=await i8(A);process.exitCode=_.exitCode})}async function i8(A,_={}){let G=bA(_.hookOverrides);if(!G.sessionEnd&&!G.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if(A.restore&&G.backupExists){if(w$(_.hookOverrides))console.log("Restored settings.json from backup.")}else{let K=j0(_.hookOverrides);console.log(K.message)}let $=I0(_.hookOverrides);if(xX($))PX($),console.log("Removed hook script.");return console.log(`
1687
- Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}D_();import{Command as yX}from"commander";D_();c();u();W1();mA();u();c();X$();import{existsSync as XK,readFileSync as kX,unlinkSync as hX}from"fs";import{join as vX}from"path";function wX(A){let _=0;if(!A.database.exists)_++;if(A.database.exists&&!A.database.readable)_++;if(A.database.exists&&!A.database.writable)_++;if(A.database.integrity==="corrupted")_++;if(!A.permissions.configDir)_++;if(!A.permissions.logsDir)_++;if(!A.permissions.sourceDir)_++;if(_+=A.config.issues.length,A.llmExtraction&&!A.llmExtraction.ready)_++;return _}function VK(){return new yX("doctor").description("Check system health and diagnose issues").option("--json","Output as JSON").option("--fix","Attempt to fix common issues").option("--portability","Perform portability and path-dialect migration checks").action(async(A)=>{let _=await a8(A);process.exitCode=_.exitCode})}async function a8(A,_={}){if(A.portability)return bX(A,_);if(A.json){let $=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R$(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides,fix:A.fix,stats:!1}),K={database:$.health.database,permissions:$.health.permissions,hooks:{...$.health.hooks,lastRun:$.health.hooks.lastRun?.toISOString()??null},config:$.health.config,embedding:$.health.embedding,sqliteVec:$.health.sqliteVec,searchCapability:$.health.searchCapability,llmExtraction:$.health.llmExtraction,providerEgress:$.health.providerEgress,capabilityInterop:$.health.capabilityInterop,migration:$.migration,qmd:$.qmd};console.log(JSON.stringify(K,null,2));let Z=0;if(!$.health.database.exists||$.health.database.integrity==="corrupted")Z=2;else if(wX($.health)>0||!$.health.searchCapability.vectorReady)Z=1;return{exitCode:Z}}return p0({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:A.fix,json:A.json},{dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R$(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides})}function CX(A,_=process.platform){if(_==="win32")return A.includes("/")&&(A.startsWith("/home")||A.startsWith("/mnt")||A.startsWith("/var")||A.startsWith("/usr")||A.startsWith("/"));return A.includes("\\")||/^[a-zA-Z]:/.test(A)}async function bX(A,_={}){let G=XK,$=_.healthOverrides?.dbPath??S(),K=_.healthOverrides?.sourceDir??n(),Z=A.json?!1:v(),Y,J=[],H=[],Q=[];if(!XK($)){if(A.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(d("Error: Database does not exist. Run 'memory sync' first.",Z));return{exitCode:1}}try{Y=D({path:$}).db;let O=await new m(Y).findFiltered({limit:1e5});for(let R of O){let y=R.projectPath.decoded;if(CX(y)&&!J.includes(y))J.push(y);let HA=H0.resolveExistingPath(y,G);if(!G(HA)){if(!H.includes(y))H.push(y)}}}catch(T){let M=L(T);if(A.json)console.log(JSON.stringify({error:`Portability scan failed: ${M}`},null,2));else console.error(d(`Portability scan failed: ${M}`,Z));return{exitCode:2}}finally{if(Y)E(Y)}let X=vX(K,"embedding.lock"),V=!1,B=!1;if(XK(X)){V=!0;try{let T=kX(X,"utf-8"),M=JSON.parse(T);if(M.pid)process.kill(M.pid,0);else B=!0}catch(T){B=!0}}if(V&&B){if(Q.push(X),A.fix)try{hX(X)}catch(T){}}let N=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:$,fix:!1,stats:!1}),z=N.health.sqliteVec.available,q=N.health.sqliteVec.version;if(A.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:J,orphanedPaths:H,staleLocks:Q,sqliteVecAvailable:z,sqliteVecVersion:q,fixedStaleLocks:A.fix&&Q.length>0}},null,2)),{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0};if(console.log("Portability & Migration Diagnostics"),console.log("=================================="),console.log(""),J.length===0)console.log(` ${C("[OK]",Z)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${l("[WARN]",Z)} Path Dialects: ${J.length} mixed slash/drive formats detected.`);for(let T of J)console.log(` - ${T}`)}if(H.length===0)console.log(` ${C("[OK]",Z)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${l("[WARN]",Z)} Orphaned Workspaces: ${H.length} project folder(s) not found on active filesystem.`);for(let T of H)console.log(` - ${T}`)}if(Q.length===0)console.log(` ${C("[OK]",Z)} Active Locks: No stale sync/embedding lock files detected.`);else if(A.fix)console.log(` ${C("[FIXED]",Z)} Active Locks: Cleaned up ${Q.length} stale lock file(s).`);else{console.log(` ${l("[WARN]",Z)} Active Locks: ${Q.length} stale sync/embedding lock file(s) found.`);for(let T of Q)console.log(` - ${T}`)}if(z)console.log(` ${C("[OK]",Z)} sqlite-vec: Loadable (v${q}) for active architecture.`);else console.log(` ${d("[FAIL]",Z)} sqlite-vec: Not loadable on this system architecture.`);if(console.log(""),H.length>0)console.log("\uD83D\uDCA1 [TIP] Orphaned project paths detected. You can safely prune these stale database records by running: memory purge --orphans"),console.log("");return{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0}}function R$(...A){if(A.some((_)=>_===void 0))return;return A.join("/")}u();c();Y$();pA();import{Command as fX}from"commander";import{existsSync as gX,mkdirSync as cX,writeFileSync as uX}from"fs";import{dirname as mX}from"path";function BK(){return new fX("audit-secrets").description("Scan memory database and event logs for likely leaked secrets").option("--json","Output as JSON").option("--db <path>","Database path override").option("--skip-db","Skip database scanning").option("--event-log <path...>","Specific event log path(s) to scan").option("--events-dir <path>","Events directory to scan").option("--skip-events","Skip event-log scanning").option("--redact-db","Rewrite mutable database fields with redacted values").option("--quarantine-events","Move raw event logs to quarantine and write sanitized active copies").option("--quarantine-dir <path>","Quarantine directory for raw event logs").option("--report <path>","Write a redacted evidence report").action(async(A)=>{let _=await r8(A);process.exitCode=_.exitCode})}async function r8(A={},_={}){let G=_.redactor??new t,$=_.createService?.(G)??new R_(G),K=_.getDefaultDbPath??S,Z=_.databaseExists??gX,Y=_.initializeDatabase??D,J=_.closeDatabase??E,H=_.getAllLogFiles??UA,Q=_.writeFile??((B,W)=>uX(B,W,"utf-8")),X=_.mkdir??((B)=>cX(B,{recursive:!0})),V;try{let B=A.db??K(),W=A.skipDb!==!0,N=W&&(B===":memory:"||Z(B));if(N)V=Y({path:B,create:!1,applySchema:!1,walMode:!1,quickCheck:!0}).db;let z=A.skipEvents===!0?[]:nX(A.eventLog??H(A.eventsDir)),q=await $.audit({db:V,eventLogPaths:z,redactDatabase:A.redactDb===!0,quarantineEvents:A.quarantineEvents===!0,quarantineDir:A.quarantineDir}),I=A.redactDb===!0||A.quarantineEvents===!0,T=I?await $.audit({db:V,eventLogPaths:z}):void 0,M={schemaVersion:1,command:"audit-secrets",generatedAt:q.generatedAt,targets:{database:{requested:W,scanned:N,path:W?B:void 0},eventLogs:{requested:A.skipEvents!==!0,scanned:z.length,paths:z}},scan:q,verification:T?{requested:!0,totalFindings:T.summary.totalFindings,databaseFindings:T.summary.databaseFindings,eventLogFindings:T.summary.eventLogFindings,findings:T.findings}:void 0},O=iX(G,M);if(A.report)X(mX(A.report)),Q(A.report,JSON.stringify(O,null,2)+`
1686
+ Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function EX(A){if(A!==void 0)return p8(A)?A:null;let _=JK(import.meta.dir,"../../../../dist/sync-hook.js"),G=JK(process.cwd(),"dist/sync-hook.js"),$=JK(process.cwd(),"dist","sync-hook.js");return[_,G,$].find((Z)=>p8(Z))??null}L_();import{Command as DX}from"commander";import{existsSync as xX,unlinkSync as PX}from"fs";function QK(){return new DX("uninstall").description("Remove Claude Code hooks for automatic session sync").option("-r, --restore","Restore settings.json from backup").action(async(A)=>{let _=await i8(A);process.exitCode=_.exitCode})}async function i8(A,_={}){let G=bA(_.hookOverrides);if(!G.sessionEnd&&!G.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if(A.restore&&G.backupExists){if(w1(_.hookOverrides))console.log("Restored settings.json from backup.")}else{let K=j0(_.hookOverrides);console.log(K.message)}let $=I0(_.hookOverrides);if(xX($))PX($),console.log("Removed hook script.");return console.log(`
1687
+ Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}D_();import{Command as yX}from"commander";D_();c();u();W$();mA();u();c();X1();import{existsSync as XK,readFileSync as kX,unlinkSync as hX}from"fs";import{join as vX}from"path";function wX(A){let _=0;if(!A.database.exists)_++;if(A.database.exists&&!A.database.readable)_++;if(A.database.exists&&!A.database.writable)_++;if(A.database.integrity==="corrupted")_++;if(!A.permissions.configDir)_++;if(!A.permissions.logsDir)_++;if(!A.permissions.sourceDir)_++;if(_+=A.config.issues.length,A.llmExtraction&&!A.llmExtraction.ready)_++;return _}function VK(){return new yX("doctor").description("Check system health and diagnose issues").option("--json","Output as JSON").option("--fix","Attempt to fix common issues").option("--portability","Perform portability and path-dialect migration checks").action(async(A)=>{let _=await a8(A);process.exitCode=_.exitCode})}async function a8(A,_={}){if(A.portability)return bX(A,_);if(A.json){let $=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R1(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R1(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides,fix:A.fix,stats:!1}),K={database:$.health.database,permissions:$.health.permissions,hooks:{...$.health.hooks,lastRun:$.health.hooks.lastRun?.toISOString()??null},config:$.health.config,embedding:$.health.embedding,sqliteVec:$.health.sqliteVec,searchCapability:$.health.searchCapability,llmExtraction:$.health.llmExtraction,providerEgress:$.health.providerEgress,capabilityInterop:$.health.capabilityInterop,migration:$.migration,qmd:$.qmd};console.log(JSON.stringify(K,null,2));let Z=0;if(!$.health.database.exists||$.health.database.integrity==="corrupted")Z=2;else if(wX($.health)>0||!$.health.searchCapability.vectorReady)Z=1;return{exitCode:Z}}return p0({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:A.fix,json:A.json},{dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R1(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R1(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides})}function CX(A,_=process.platform){if(_==="win32")return A.includes("/")&&(A.startsWith("/home")||A.startsWith("/mnt")||A.startsWith("/var")||A.startsWith("/usr")||A.startsWith("/"));return A.includes("\\")||/^[a-zA-Z]:/.test(A)}async function bX(A,_={}){let G=XK,$=_.healthOverrides?.dbPath??S(),K=_.healthOverrides?.sourceDir??n(),Z=A.json?!1:v(),Y,J=[],H=[],Q=[];if(!XK($)){if(A.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(d("Error: Database does not exist. Run 'memory sync' first.",Z));return{exitCode:1}}try{Y=D({path:$}).db;let O=await new m(Y).findFiltered({limit:1e5});for(let R of O){let y=R.projectPath.decoded;if(CX(y)&&!J.includes(y))J.push(y);let HA=H0.resolveExistingPath(y,G);if(!G(HA)){if(!H.includes(y))H.push(y)}}}catch(T){let M=L(T);if(A.json)console.log(JSON.stringify({error:`Portability scan failed: ${M}`},null,2));else console.error(d(`Portability scan failed: ${M}`,Z));return{exitCode:2}}finally{if(Y)E(Y)}let X=vX(K,"embedding.lock"),V=!1,B=!1;if(XK(X)){V=!0;try{let T=kX(X,"utf-8"),M=JSON.parse(T);if(M.pid)process.kill(M.pid,0);else B=!0}catch(T){B=!0}}if(V&&B){if(Q.push(X),A.fix)try{hX(X)}catch(T){}}let N=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:$,fix:!1,stats:!1}),z=N.health.sqliteVec.available,q=N.health.sqliteVec.version;if(A.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:J,orphanedPaths:H,staleLocks:Q,sqliteVecAvailable:z,sqliteVecVersion:q,fixedStaleLocks:A.fix&&Q.length>0}},null,2)),{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0};if(console.log("Portability & Migration Diagnostics"),console.log("=================================="),console.log(""),J.length===0)console.log(` ${C("[OK]",Z)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${l("[WARN]",Z)} Path Dialects: ${J.length} mixed slash/drive formats detected.`);for(let T of J)console.log(` - ${T}`)}if(H.length===0)console.log(` ${C("[OK]",Z)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${l("[WARN]",Z)} Orphaned Workspaces: ${H.length} project folder(s) not found on active filesystem.`);for(let T of H)console.log(` - ${T}`)}if(Q.length===0)console.log(` ${C("[OK]",Z)} Active Locks: No stale sync/embedding lock files detected.`);else if(A.fix)console.log(` ${C("[FIXED]",Z)} Active Locks: Cleaned up ${Q.length} stale lock file(s).`);else{console.log(` ${l("[WARN]",Z)} Active Locks: ${Q.length} stale sync/embedding lock file(s) found.`);for(let T of Q)console.log(` - ${T}`)}if(z)console.log(` ${C("[OK]",Z)} sqlite-vec: Loadable (v${q}) for active architecture.`);else console.log(` ${d("[FAIL]",Z)} sqlite-vec: Not loadable on this system architecture.`);if(console.log(""),H.length>0)console.log("\uD83D\uDCA1 [TIP] Orphaned project paths detected. You can safely prune these stale database records by running: memory purge --orphans"),console.log("");return{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0}}function R1(...A){if(A.some((_)=>_===void 0))return;return A.join("/")}u();c();Y1();pA();import{Command as fX}from"commander";import{existsSync as gX,mkdirSync as cX,writeFileSync as uX}from"fs";import{dirname as mX}from"path";function BK(){return new fX("audit-secrets").description("Scan memory database and event logs for likely leaked secrets").option("--json","Output as JSON").option("--db <path>","Database path override").option("--skip-db","Skip database scanning").option("--event-log <path...>","Specific event log path(s) to scan").option("--events-dir <path>","Events directory to scan").option("--skip-events","Skip event-log scanning").option("--redact-db","Rewrite mutable database fields with redacted values").option("--quarantine-events","Move raw event logs to quarantine and write sanitized active copies").option("--quarantine-dir <path>","Quarantine directory for raw event logs").option("--report <path>","Write a redacted evidence report").action(async(A)=>{let _=await r8(A);process.exitCode=_.exitCode})}async function r8(A={},_={}){let G=_.redactor??new t,$=_.createService?.(G)??new R_(G),K=_.getDefaultDbPath??S,Z=_.databaseExists??gX,Y=_.initializeDatabase??D,J=_.closeDatabase??E,H=_.getAllLogFiles??UA,Q=_.writeFile??((B,W)=>uX(B,W,"utf-8")),X=_.mkdir??((B)=>cX(B,{recursive:!0})),V;try{let B=A.db??K(),W=A.skipDb!==!0,N=W&&(B===":memory:"||Z(B));if(N)V=Y({path:B,create:!1,applySchema:!1,walMode:!1,quickCheck:!0}).db;let z=A.skipEvents===!0?[]:nX(A.eventLog??H(A.eventsDir)),q=await $.audit({db:V,eventLogPaths:z,redactDatabase:A.redactDb===!0,quarantineEvents:A.quarantineEvents===!0,quarantineDir:A.quarantineDir}),I=A.redactDb===!0||A.quarantineEvents===!0,T=I?await $.audit({db:V,eventLogPaths:z}):void 0,M={schemaVersion:1,command:"audit-secrets",generatedAt:q.generatedAt,targets:{database:{requested:W,scanned:N,path:W?B:void 0},eventLogs:{requested:A.skipEvents!==!0,scanned:z.length,paths:z}},scan:q,verification:T?{requested:!0,totalFindings:T.summary.totalFindings,databaseFindings:T.summary.databaseFindings,eventLogFindings:T.summary.eventLogFindings,findings:T.findings}:void 0},O=iX(G,M);if(A.report)X(mX(A.report)),Q(A.report,JSON.stringify(O,null,2)+`
1688
1688
  `);if(A.json)console.log(JSON.stringify(O,null,2));else console.log(dX(O));if((O.verification?.totalFindings??O.scan.summary.totalFindings)===0)return{exitCode:0};return{exitCode:I?2:1}}catch(B){let W=G.redactText(L(B)).text;if(A.json)console.log(JSON.stringify({error:W},null,2));else console.error(`Error: ${W}`);return{exitCode:2}}finally{if(V)J(V)}}function dX(A){let _=[],G=A.scan.summary;if(_.push("Secret audit"),_.push(` Database: ${lX(A)}`),_.push(` Event logs: ${A.targets.eventLogs.scanned} scanned`),_.push(` Findings: ${G.totalFindings} total (${G.databaseFindings} database, ${G.eventLogFindings} event log)`),G.totalFindings===0)_.push(""),_.push("No suspected secrets found.");else{_.push(""),_.push("Findings:");for(let $ of A.scan.findings.slice(0,20))_.push(` - ${pX($)}`);if(A.scan.findings.length>20)_.push(` - ... ${A.scan.findings.length-20} more`);_.push(""),_.push("No raw secret values are printed. Use --redact-db and/or --quarantine-events to remediate.")}if(A.scan.remediation.database.requested||A.scan.remediation.eventLogs.requested){if(_.push(""),_.push("Remediation:"),_.push(` Database fields updated: ${A.scan.remediation.database.updatedFields}`),_.push(` FTS indexes rebuilt: ${A.scan.remediation.database.rebuiltFtsIndexes.length}`),_.push(` Event logs sanitized: ${A.scan.remediation.eventLogs.sanitizedFiles.length}`),_.push(` Raw event logs quarantined: ${A.scan.remediation.eventLogs.quarantinedFiles.length}`),A.verification)_.push(` Verification remaining findings: ${A.verification.totalFindings}`)}return _.join(`
1689
- `)}function lX(A){if(!A.targets.database.requested)return"skipped";if(!A.targets.database.scanned)return`not found (${A.targets.database.path??"unknown"})`;return`scanned (${A.targets.database.path??"unknown"})`}function pX(A){if(A.surface==="database")return`database ${A.table}.${A.column} row ${A.rowId}: ${A.kind} ${A.placeholder}`;return`event log ${A.filePath}:${A.lineNumber}: ${A.kind} ${A.placeholder}`}function nX(A){return[...new Set(A.filter((_)=>_.trim()!==""))]}function iX(A,_){return A.redactJson(_).value}mA();u();W1();import{Command as aX,Option as rX}from"commander";import*as t8 from"readline";import{existsSync as tX}from"fs";function WK(A){let _=A.match(/^(\d+)([dmy])$/i);if(!_)throw Error(`Invalid duration format: "${A}". Use format like "30d" (days), "6m" (months), or "1y" (years).`);let G=parseInt(_[1],10),$=_[2].toLowerCase();if(G<=0)throw Error("Duration value must be a positive number.");let K=new Date,Z;switch($){case"d":Z=new Date(K.getTime()-G*24*60*60*1000);break;case"m":Z=new Date(K.getFullYear(),K.getMonth()-G,K.getDate());break;case"y":Z=new Date(K.getFullYear()-G,K.getMonth(),K.getDate());break;default:throw Error(`Unknown duration unit: "${$}"`)}return Z}function SG(A){return A.toISOString().split("T")[0]}async function eX(A){let _=t8.createInterface({input:process.stdin,output:process.stdout});return new Promise((G)=>{_.question(A,($)=>{_.close(),G($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}function zK(){return new aX("purge").description("Remove old sessions from database").option("--older-than <duration>",'Delete sessions older than duration (e.g., "90d", "6m", "1y")').option("--orphans","Delete orphaned sessions whose project workspaces no longer exist").option("-f, --force","Skip confirmation prompt").option("--dry-run","Show what would be deleted without deleting").option("--json","Output as JSON").addOption(new rX("-q, --quiet","Minimal output").conflicts("json")).action(async(A)=>{let _=await e8(A);process.exitCode=_.exitCode})}async function e8(A,_={}){let G=_.askConfirmation??eX,$=_.existsSync??tX,K=_.getDefaultDbPath??S,Z=_.initializeDatabase??D,Y=_.closeDatabase??E,J=_.createSessionRepository??((V)=>new m(V));if(!A.olderThan&&!A.orphans){if(A.json)console.log(JSON.stringify({error:"Please specify either --older-than <duration> or --orphans."},null,2));else console.error("Error: Please specify either --older-than <duration> or --orphans.");return{exitCode:1}}let H;if(A.olderThan)try{H=WK(A.olderThan)}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:1}}let Q=_.dbPath??K(),X;try{X=Z({path:Q}).db}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:`Database error: ${B}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let V=J(X),B=new Map;if(H){let z=await V.findOlderThan(H);for(let q of z)B.set(q.id,q)}if(A.orphans){let z=await V.findFiltered({limit:1e5});for(let q of z){let I=q.projectPath.decoded,T=H0.resolveExistingPath(I,$);if(!$(T))B.set(q.id,q)}}let W=B.size;if(W===0){if(A.json)console.log(JSON.stringify({sessionsDeleted:0,cutoffDate:H?.toISOString()??null,dryRun:A.dryRun??!1,message:H&&!A.orphans?`No sessions older than ${SG(H)}`:"No sessions matched the purge criteria."},null,2));else if(!A.quiet)if(H&&!A.orphans)console.log(`No sessions older than ${SG(H)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if(A.dryRun){let z=Array.from(B.values());if(A.json)console.log(JSON.stringify({sessionsToDelete:W,cutoffDate:H?.toISOString()??null,dryRun:!0,sessions:z.map((q)=>({id:q.id,project:q.projectPath.projectName,startTime:q.startTime.toISOString(),messageCount:q.messageCount}))},null,2));else if(A.quiet)console.log(W.toString());else{if(H&&!A.orphans)console.log(`Would delete ${W} session(s) older than ${SG(H)}:
1689
+ `)}function lX(A){if(!A.targets.database.requested)return"skipped";if(!A.targets.database.scanned)return`not found (${A.targets.database.path??"unknown"})`;return`scanned (${A.targets.database.path??"unknown"})`}function pX(A){if(A.surface==="database")return`database ${A.table}.${A.column} row ${A.rowId}: ${A.kind} ${A.placeholder}`;return`event log ${A.filePath}:${A.lineNumber}: ${A.kind} ${A.placeholder}`}function nX(A){return[...new Set(A.filter((_)=>_.trim()!==""))]}function iX(A,_){return A.redactJson(_).value}mA();u();W$();import{Command as aX,Option as rX}from"commander";import*as t8 from"readline";import{existsSync as tX}from"fs";function WK(A){let _=A.match(/^(\d+)([dmy])$/i);if(!_)throw Error(`Invalid duration format: "${A}". Use format like "30d" (days), "6m" (months), or "1y" (years).`);let G=parseInt(_[1],10),$=_[2].toLowerCase();if(G<=0)throw Error("Duration value must be a positive number.");let K=new Date,Z;switch($){case"d":Z=new Date(K.getTime()-G*24*60*60*1000);break;case"m":Z=new Date(K.getFullYear(),K.getMonth()-G,K.getDate());break;case"y":Z=new Date(K.getFullYear()-G,K.getMonth(),K.getDate());break;default:throw Error(`Unknown duration unit: "${$}"`)}return Z}function SG(A){return A.toISOString().split("T")[0]}async function eX(A){let _=t8.createInterface({input:process.stdin,output:process.stdout});return new Promise((G)=>{_.question(A,($)=>{_.close(),G($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}function zK(){return new aX("purge").description("Remove old sessions from database").option("--older-than <duration>",'Delete sessions older than duration (e.g., "90d", "6m", "1y")').option("--orphans","Delete orphaned sessions whose project workspaces no longer exist").option("-f, --force","Skip confirmation prompt").option("--dry-run","Show what would be deleted without deleting").option("--json","Output as JSON").addOption(new rX("-q, --quiet","Minimal output").conflicts("json")).action(async(A)=>{let _=await e8(A);process.exitCode=_.exitCode})}async function e8(A,_={}){let G=_.askConfirmation??eX,$=_.existsSync??tX,K=_.getDefaultDbPath??S,Z=_.initializeDatabase??D,Y=_.closeDatabase??E,J=_.createSessionRepository??((V)=>new m(V));if(!A.olderThan&&!A.orphans){if(A.json)console.log(JSON.stringify({error:"Please specify either --older-than <duration> or --orphans."},null,2));else console.error("Error: Please specify either --older-than <duration> or --orphans.");return{exitCode:1}}let H;if(A.olderThan)try{H=WK(A.olderThan)}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:1}}let Q=_.dbPath??K(),X;try{X=Z({path:Q}).db}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:`Database error: ${B}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let V=J(X),B=new Map;if(H){let z=await V.findOlderThan(H);for(let q of z)B.set(q.id,q)}if(A.orphans){let z=await V.findFiltered({limit:1e5});for(let q of z){let I=q.projectPath.decoded,T=H0.resolveExistingPath(I,$);if(!$(T))B.set(q.id,q)}}let W=B.size;if(W===0){if(A.json)console.log(JSON.stringify({sessionsDeleted:0,cutoffDate:H?.toISOString()??null,dryRun:A.dryRun??!1,message:H&&!A.orphans?`No sessions older than ${SG(H)}`:"No sessions matched the purge criteria."},null,2));else if(!A.quiet)if(H&&!A.orphans)console.log(`No sessions older than ${SG(H)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if(A.dryRun){let z=Array.from(B.values());if(A.json)console.log(JSON.stringify({sessionsToDelete:W,cutoffDate:H?.toISOString()??null,dryRun:!0,sessions:z.map((q)=>({id:q.id,project:q.projectPath.projectName,startTime:q.startTime.toISOString(),messageCount:q.messageCount}))},null,2));else if(A.quiet)console.log(W.toString());else{if(H&&!A.orphans)console.log(`Would delete ${W} session(s) older than ${SG(H)}:
1690
1690
  `);else console.log(`Would delete ${W} session(s):
1691
- `);let q=v();for(let I of z){let T=I.id.substring(0,16),M=I.projectPath.projectName,O=I.startTime.toISOString().split("T")[0],R=I.messageCount;if(q)console.log(` \x1B[33m${T}\x1B[0m ${M} ${O} (${R} messages)`);else console.log(` ${T} ${M} ${O} (${R} messages)`)}}return{exitCode:0}}if(!A.force){if(!await G(H&&!A.orphans?`Delete ${W} session(s) older than ${SG(H)}? This cannot be undone. (y/n) `:`Delete ${W} session(s)? This cannot be undone. (y/n) `)){if(A.json)console.log(JSON.stringify({cancelled:!0},null,2));else if(!A.quiet)console.log("Purge cancelled.");return{exitCode:0}}}if(X.transaction(()=>{for(let z of B.keys())V.delete(z)}).immediate(),A.json)console.log(JSON.stringify({sessionsDeleted:W,cutoffDate:H?.toISOString()??null,dryRun:!1},null,2));else if(A.quiet)console.log(W.toString());else if(H&&!A.orphans)console.log(`Deleted ${W} session(s) older than ${SG(H)}.`);else console.log(`Deleted ${W} session(s).`);return{exitCode:0}}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:2}}finally{if(X)Y(X)}}u();c();L_();import{Command as sX}from"commander";import{existsSync as s8,unlinkSync as oX}from"fs";import{join as AV}from"path";function NK(){return new sX("migrate").description("Migrate database across platform environments").option("--from-windows","Migrate database from native Windows/desktop host").action(async(A)=>{let _=await o8(A);process.exitCode=_.exitCode})}async function o8(A,_={}){let G=v(),$=_.dbPath??S(),K=_.dataDir??n(),Z=_.uninstallHooks??j0,Y=_.installHooks??O0;if(!s8($))return console.error(d(`Error: Database not found at ${$}. Run 'memory sync' first.`,G)),{exitCode:1};let J;try{J=D({path:$}).db;let X=J.prepare("PRAGMA integrity_check").get();if(!X||X.integrity_check!=="ok"){let V=X?.integrity_check??"unknown";throw Error(`Database integrity check failed: ${V}`)}J.prepare("PRAGMA wal_checkpoint(TRUNCATE)").run()}catch(Q){let X=L(Q);if(console.error(d(`Error during migration: ${X}`,G)),J)E(J);return{exitCode:2}}let H=AV(K,"embedding.lock");if(s8(H))try{oX(H),console.log(C("Cleaned up stale embedding lock file.",G))}catch(Q){}try{Z(),Y(),console.log(C("Successfully re-installed Git hooks natively.",G))}catch(Q){let X=L(Q);console.log(l(`Warning: Failed to re-install Git hooks: ${X}`,G))}try{let X=await new V0(J).getStats();if(console.log(""),console.log(C("Database migration successful!",G)),console.log("================================="),console.log(`Total sessions: ${X.totalSessions}`),console.log(`Total messages: ${X.totalMessages}`),console.log(""),console.log("Project Breakdown:"),X.projectBreakdown.length===0)console.log(" No projects found.");else for(let V of X.projectBreakdown)console.log(` - ${V.projectName}: ${V.sessionCount} sessions, ${V.messageCount} messages`);console.log("")}catch(Q){}finally{E(J)}return{exitCode:0}}u();import{Command as _V,Option as LK}from"commander";pA();import{existsSync as AZ}from"fs";import{dirname as GV}from"path";function MK(){return new _V("export").description("Export database to JSON file for backup").argument("<output-file>","Path to write the JSON backup file").addOption(new LK("-q, --quiet","Suppress output except the file path").conflicts("json")).addOption(new LK("--json","Output stats as JSON").conflicts("quiet")).addOption(new LK("--include-sensitive","Export raw sensitive values without redaction")).action(async(A,_)=>{let G=await _Z(A,_);process.exitCode=G.exitCode})}async function _Z(A,_={}){let G=GV(A);if(G!=="."&&!AZ(G))return console.error(`Error: Directory does not exist: ${G}`),{exitCode:1};let $=S();if(!AZ($))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:K}=D({path:$});try{let Z=await a$(K,A,{includeSensitive:_.includeSensitive,redactor:new t});if(_.json)console.log(JSON.stringify({success:!0,path:A,stats:Z},null,2));else if(_.quiet)console.log(A);else console.log($V(Z,A));return{exitCode:0}}catch(Z){let Y=L(Z);if(_.json)console.log(JSON.stringify({success:!1,error:Y},null,2));else console.error(`Error: ${Y}`);return{exitCode:1}}finally{E(K)}}function $V(A,_){let G=[];return G.push(`Exported ${A.sessions} sessions, ${A.messages} messages to ${_}`),G.push(""),G.push("Details:"),G.push(` Sessions: ${A.sessions}`),G.push(` Messages: ${A.messages}`),G.push(` Tool uses: ${A.toolUses}`),G.push(` Entities: ${A.entities}`),G.push(` Links: ${A.links}`),G.push(` File size: ${KV(A.bytes)}`),G.join(`
1692
- `)}function KV(A){if(A===0)return"0 B";let _=["B","KB","MB","GB"],G=1024,$=Math.floor(Math.log(A)/Math.log(G));return`${(A/Math.pow(G,$)).toFixed($>0?1:0)} ${_[$]}`}u();import{Command as ZV,Option as GZ}from"commander";import{existsSync as YV}from"fs";function qK(){return new ZV("import").description("Import database from JSON backup file").argument("<input-file>","Path to the JSON backup file").option("--clear","Clear existing data before import").option("--force","Skip confirmation when merging with existing data").addOption(new GZ("-q, --quiet","Suppress output except errors").conflicts("json")).addOption(new GZ("--json","Output stats as JSON").conflicts("quiet")).action(async(A,_)=>{let G=await $Z(A,_);process.exitCode=G.exitCode})}async function $Z(A,_={}){if(!YV(A))return EG("File does not exist",A,_),{exitCode:1};let G=await fG(A);if(!G.valid)return EG(`Invalid backup file: ${G.error}`,A,_),{exitCode:1};let $=S(),{db:K}=D({path:$});try{if(t$(K)&&!_.clear&&!_.force){if(!_.json&&!_.quiet)console.log("Warning: Database contains existing data."),console.log("Use --clear to replace all data, or --force to merge without prompt.");if(!process.stdout.isTTY)return EG("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",A,_),{exitCode:1};return EG("Use --clear to replace data or --force to merge",A,_),{exitCode:1}}let Y=await r$(K,A,{clearExisting:_.clear});if(_.json){let J={success:!0,path:A,version:G.version,stats:Y,cleared:_.clear??!1};console.log(JSON.stringify(J,null,2))}else if(_.quiet);else console.log(JV(Y,A,_.clear??!1));return{exitCode:0}}catch(Z){let Y=L(Z);return EG(Y,A,_),{exitCode:1}}finally{E(K)}}function EG(A,_,G){if(G.json)console.log(JSON.stringify({success:!1,path:_,error:A},null,2));else console.error(`Error: ${A}`)}function JV(A,_,G){let $=[],K=G?"Replaced":"Imported";return $.push(`${K} ${A.sessions} sessions, ${A.messages} messages from ${_}`),$.push(""),$.push("Details:"),$.push(` Sessions: ${A.sessions}`),$.push(` Messages: ${A.messages}`),$.push(` Tool uses: ${A.toolUses}`),$.push(` Entities: ${A.entities}`),$.push(` Links: ${A.links}`),$.join(`
1691
+ `);let q=v();for(let I of z){let T=I.id.substring(0,16),M=I.projectPath.projectName,O=I.startTime.toISOString().split("T")[0],R=I.messageCount;if(q)console.log(` \x1B[33m${T}\x1B[0m ${M} ${O} (${R} messages)`);else console.log(` ${T} ${M} ${O} (${R} messages)`)}}return{exitCode:0}}if(!A.force){if(!await G(H&&!A.orphans?`Delete ${W} session(s) older than ${SG(H)}? This cannot be undone. (y/n) `:`Delete ${W} session(s)? This cannot be undone. (y/n) `)){if(A.json)console.log(JSON.stringify({cancelled:!0},null,2));else if(!A.quiet)console.log("Purge cancelled.");return{exitCode:0}}}if(X.transaction(()=>{for(let z of B.keys())V.delete(z)}).immediate(),A.json)console.log(JSON.stringify({sessionsDeleted:W,cutoffDate:H?.toISOString()??null,dryRun:!1},null,2));else if(A.quiet)console.log(W.toString());else if(H&&!A.orphans)console.log(`Deleted ${W} session(s) older than ${SG(H)}.`);else console.log(`Deleted ${W} session(s).`);return{exitCode:0}}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:2}}finally{if(X)Y(X)}}u();c();L_();import{Command as sX}from"commander";import{existsSync as s8,unlinkSync as oX}from"fs";import{join as AV}from"path";function NK(){return new sX("migrate").description("Migrate database across platform environments").option("--from-windows","Migrate database from native Windows/desktop host").action(async(A)=>{let _=await o8(A);process.exitCode=_.exitCode})}async function o8(A,_={}){let G=v(),$=_.dbPath??S(),K=_.dataDir??n(),Z=_.uninstallHooks??j0,Y=_.installHooks??O0;if(!s8($))return console.error(d(`Error: Database not found at ${$}. Run 'memory sync' first.`,G)),{exitCode:1};let J;try{J=D({path:$}).db;let X=J.prepare("PRAGMA integrity_check").get();if(!X||X.integrity_check!=="ok"){let V=X?.integrity_check??"unknown";throw Error(`Database integrity check failed: ${V}`)}J.prepare("PRAGMA wal_checkpoint(TRUNCATE)").run()}catch(Q){let X=L(Q);if(console.error(d(`Error during migration: ${X}`,G)),J)E(J);return{exitCode:2}}let H=AV(K,"embedding.lock");if(s8(H))try{oX(H),console.log(C("Cleaned up stale embedding lock file.",G))}catch(Q){}try{Z(),Y(),console.log(C("Successfully re-installed Git hooks natively.",G))}catch(Q){let X=L(Q);console.log(l(`Warning: Failed to re-install Git hooks: ${X}`,G))}try{let X=await new V0(J).getStats();if(console.log(""),console.log(C("Database migration successful!",G)),console.log("================================="),console.log(`Total sessions: ${X.totalSessions}`),console.log(`Total messages: ${X.totalMessages}`),console.log(""),console.log("Project Breakdown:"),X.projectBreakdown.length===0)console.log(" No projects found.");else for(let V of X.projectBreakdown)console.log(` - ${V.projectName}: ${V.sessionCount} sessions, ${V.messageCount} messages`);console.log("")}catch(Q){}finally{E(J)}return{exitCode:0}}u();import{Command as _V,Option as LK}from"commander";pA();import{existsSync as AZ}from"fs";import{dirname as GV}from"path";function MK(){return new _V("export").description("Export database to JSON file for backup").argument("<output-file>","Path to write the JSON backup file").addOption(new LK("-q, --quiet","Suppress output except the file path").conflicts("json")).addOption(new LK("--json","Output stats as JSON").conflicts("quiet")).addOption(new LK("--include-sensitive","Export raw sensitive values without redaction")).action(async(A,_)=>{let G=await _Z(A,_);process.exitCode=G.exitCode})}async function _Z(A,_={}){let G=GV(A);if(G!=="."&&!AZ(G))return console.error(`Error: Directory does not exist: ${G}`),{exitCode:1};let $=S();if(!AZ($))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:K}=D({path:$});try{let Z=await a1(K,A,{includeSensitive:_.includeSensitive,redactor:new t});if(_.json)console.log(JSON.stringify({success:!0,path:A,stats:Z},null,2));else if(_.quiet)console.log(A);else console.log($V(Z,A));return{exitCode:0}}catch(Z){let Y=L(Z);if(_.json)console.log(JSON.stringify({success:!1,error:Y},null,2));else console.error(`Error: ${Y}`);return{exitCode:1}}finally{E(K)}}function $V(A,_){let G=[];return G.push(`Exported ${A.sessions} sessions, ${A.messages} messages to ${_}`),G.push(""),G.push("Details:"),G.push(` Sessions: ${A.sessions}`),G.push(` Messages: ${A.messages}`),G.push(` Tool uses: ${A.toolUses}`),G.push(` Entities: ${A.entities}`),G.push(` Links: ${A.links}`),G.push(` File size: ${KV(A.bytes)}`),G.join(`
1692
+ `)}function KV(A){if(A===0)return"0 B";let _=["B","KB","MB","GB"],G=1024,$=Math.floor(Math.log(A)/Math.log(G));return`${(A/Math.pow(G,$)).toFixed($>0?1:0)} ${_[$]}`}u();import{Command as ZV,Option as GZ}from"commander";import{existsSync as YV}from"fs";function qK(){return new ZV("import").description("Import database from JSON backup file").argument("<input-file>","Path to the JSON backup file").option("--clear","Clear existing data before import").option("--force","Skip confirmation when merging with existing data").addOption(new GZ("-q, --quiet","Suppress output except errors").conflicts("json")).addOption(new GZ("--json","Output stats as JSON").conflicts("quiet")).action(async(A,_)=>{let G=await $Z(A,_);process.exitCode=G.exitCode})}async function $Z(A,_={}){if(!YV(A))return EG("File does not exist",A,_),{exitCode:1};let G=await fG(A);if(!G.valid)return EG(`Invalid backup file: ${G.error}`,A,_),{exitCode:1};let $=S(),{db:K}=D({path:$});try{if(t1(K)&&!_.clear&&!_.force){if(!_.json&&!_.quiet)console.log("Warning: Database contains existing data."),console.log("Use --clear to replace all data, or --force to merge without prompt.");if(!process.stdout.isTTY)return EG("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",A,_),{exitCode:1};return EG("Use --clear to replace data or --force to merge",A,_),{exitCode:1}}let Y=await r1(K,A,{clearExisting:_.clear});if(_.json){let J={success:!0,path:A,version:G.version,stats:Y,cleared:_.clear??!1};console.log(JSON.stringify(J,null,2))}else if(_.quiet);else console.log(JV(Y,A,_.clear??!1));return{exitCode:0}}catch(Z){let Y=L(Z);return EG(Y,A,_),{exitCode:1}}finally{E(K)}}function EG(A,_,G){if(G.json)console.log(JSON.stringify({success:!1,path:_,error:A},null,2));else console.error(`Error: ${A}`)}function JV(A,_,G){let $=[],K=G?"Replaced":"Imported";return $.push(`${K} ${A.sessions} sessions, ${A.messages} messages from ${_}`),$.push(""),$.push("Details:"),$.push(` Sessions: ${A.sessions}`),$.push(` Messages: ${A.messages}`),$.push(` Tool uses: ${A.toolUses}`),$.push(` Entities: ${A.entities}`),$.push(` Links: ${A.links}`),$.join(`
1693
1693
  `)}import{Command as HV}from"commander";function QV(A){return A==="bash"||A==="zsh"||A==="fish"}function XV(){return`# memory bash completion
1694
1694
  # Add to ~/.bashrc: eval "$(memory completion bash)"
1695
1695
 
@@ -2216,16 +2216,16 @@ Usage:
2216
2216
  memory completion fish > ~/.config/fish/completions/memory.fish
2217
2217
  `).action((_)=>{let G=KZ(_);process.exitCode=G.exitCode})}function KZ(A){if(!QV(A))return console.error(`Error: Invalid shell type '${A}'`),console.error("Valid shells: bash, zsh, fish"),{exitCode:1};let _=WV(A);return console.log(_),{exitCode:0}}IA();u();import{Command as n0,Option as xV}from"commander";import{join as PV}from"path";import{homedir as yV}from"os";iA();zA();async function ZZ(A,_){if(!_.description)return console.error("Error: description is required for log action"),{exitCode:1};let G=await A.log({description:_.description,severity:_.severity,category:_.category,tool:_.tool,context:_.context,sourceProject:_.source});if(_.json)console.log(JSON.stringify({id:G.id,description:G.description,severity:G.severity,category:G.category,tool:G.tool,status:G.status,loggedAt:G.loggedAt.toISOString(),context:G.context??null,sourceProject:G.sourceProject??null}));else console.log(`Logged friction #${G.id} (${G.severity}/${G.category})`);return{exitCode:0}}zA();import{createHash as zV}from"crypto";var NV=["low","medium","high","critical"],LV=["open","resolved","wont-fix"];async function HZ(A,_){let G=qV(_);if("error"in G)return TV(G.error,_);let $=await A.query({all:_.all,status:_.status,severity:_.severity,category:_.category,tool:_.tool,sourceProject:_.project,since:G.since,descriptionContains:_.descriptionContains,contextContains:_.contextContains,limit:G.limit}),K=$.entries,Z=$.totalCount,Y=G.min!==void 0&&Z<G.min?1:0;if(_.json){let J=IV(_,Z,K.length,G);if(_.count)e({command:"friction",kind:"friction",data:{count:Z},meta:J});else e({command:"friction",kind:"friction",data:K.map(jV),meta:J})}else if(_.count)console.log(String(Z));else MV(K,_);if(_.tool&&!_.count)await A.markReviewed(_.tool);return{exitCode:Y}}function MV(A,_){if(A.length===0){console.log(_.all?"No friction entries found.":"No open friction entries.");return}console.log(`${"".padEnd(5)}${"ID".padEnd(6)}${"Severity".padEnd(10)}${"Category".padEnd(14)}${"Description".padEnd(62)}Age`),console.log("-".repeat(101));let G=0,$={};for(let J of A){let H=!J.lastReviewedAt||J.lastReviewedAt<J.loggedAt;if(H)G++;$[J.severity]=($[J.severity]??0)+1;let Q=H?"[NEW]":" ",X=J.description.length>60?J.description.slice(0,57)+"...":J.description,V=Date.now()-J.loggedAt.getTime(),B=Math.floor(V/86400000),W=B===0?"today":`${B}d`;console.log(`${Q}${String(J.id).padEnd(6)}${J.severity.padEnd(10)}${J.category.padEnd(14)}${X.padEnd(62)}${W}`)}let K=Object.entries($).map(([J,H])=>`${H} ${J}`).join(", "),Z=_.tool?` for ${_.tool}`:"",Y=G>0?` -- ${G} new since last review`:"";console.log(`
2218
2218
  ${A.length} ${_.all?"total":"open"} entries${Z} (${K})${Y}`)}function qV(A){let _=A.limit?YZ(A.limit):void 0;if(_===null)return{error:"Limit must be a positive integer"};let G=A.min?YZ(A.min):void 0;if(G===null)return{error:"Min must be a positive integer"};if(A.severity&&!NV.includes(A.severity))return{error:"Severity must be one of: low, medium, high, critical"};if(A.status&&!LV.includes(A.status))return{error:"Status must be one of: open, resolved, wont-fix"};let $=A.since?UV(A.since):void 0;if($===null)return{error:"Since must use YYYY-MM-DD"};return{limit:_,min:G,since:$}}function YZ(A){if(!/^[1-9]\d*$/.test(A))return null;return Number(A)}function UV(A){let _=/^(\d{4})-(\d{2})-(\d{2})$/.exec(A);if(!_)return null;let G=new Date(`${A}T00:00:00.000Z`);if(Number.isNaN(G.getTime())||G.getUTCFullYear()!==Number(_[1])||G.getUTCMonth()+1!==Number(_[2])||G.getUTCDate()!==Number(_[3]))return null;return G}function TV(A,_){if(_.json)h({command:"friction",code:"INVALID_ARGUMENT",message:A});else console.error(`Error: ${A}`);return{exitCode:2}}function IV(A,_,G,$){return{count:_,returned:A.count?0:G,mode:A.count?"count":"list",filters_applied:OV(A,$),...$.min!==void 0?{min:$.min,threshold_met:_>=$.min}:{},...$.limit!==void 0&&!A.count?{limit:$.limit}:{}}}function OV(A,_){let G=[],$=A.status??(A.all?void 0:"open");if($)G.push(`status:${$}`);if(A.all&&!A.status)G.push("status:all");if(A.severity)G.push(`severity:${A.severity}`);if(A.category)G.push(`category:${A.category}`);if(A.tool)G.push(`tool:${A.tool}`);if(A.project)G.push(`project:${A.project}`);if(_.since)G.push(`since:${_.since.toISOString()}`);if(A.descriptionContains)G.push(`description_contains:${JZ(A.descriptionContains)}`);if(A.contextContains)G.push(`context_contains:${JZ(A.contextContains)}`);return G}function JZ(A){return`[redacted:${zV("sha256").update(A).digest("hex").slice(0,8)}]`}function jV(A){return{id:A.id,description:A.description,severity:A.severity,category:A.category,tool:A.tool,status:A.status,loggedAt:A.loggedAt.toISOString(),resolvedAt:A.resolvedAt?.toISOString()??null,resolution:A.resolution??null,context:A.context??null,sourceProject:A.sourceProject??null,lastReviewedAt:A.lastReviewedAt?.toISOString()??null}}async function QZ(A,_){if(!_.id||!_.resolution)return console.error("Error: id and --resolution are required for resolve action"),{exitCode:1};let G=parseInt(_.id,10);if(isNaN(G))return console.error("Error: id must be a number"),{exitCode:1};if(await A.resolve(G,_.resolution),_.json)console.log(JSON.stringify({id:G,status:"resolved",resolution:_.resolution}));else console.log(`Resolved friction #${G}`);return{exitCode:0}}async function XZ(A,_){if(!_.id||!_.resolution)return console.error("Error: id and --resolution are required for wont-fix action"),{exitCode:1};let G=parseInt(_.id,10);if(isNaN(G))return console.error("Error: id must be a number"),{exitCode:1};if(await A.wontFix(G,_.resolution),_.json)console.log(JSON.stringify({id:G,status:"wont-fix",resolution:_.resolution}));else console.log(`Marked friction #${G} as won't fix`);return{exitCode:0}}import{exec as RV}from"child_process";import{mkdirSync as FV,writeFileSync as SV}from"fs";import{join as EV}from"path";import{platform as VZ}from"os";nA();c();async function BZ(A,_,G=DV){let $=await A.getStats(),K=await A.getWeeklyTrends(12),Z=await A.list({tool:_.tool}),Y=await A.detectPatterns();if(_.html){let J=k2($,K,Z,Y),H=f_();FV(H,{recursive:!0});let Q=EV(H,"dashboard.html");if(SV(Q,J,"utf-8"),!_.json)console.log(`Dashboard written to ${Q}`),G(Q)}else if(_.json)console.log(JSON.stringify({stats:$,trends:K,patterns:Y},null,2));else{let J=y2($,K,Z,v(),Y);if(_.format==="ai")J=_A(J);console.log(J)}return{exitCode:0}}function DV(A){let _=VZ()==="win32"?"start":VZ()==="darwin"?"open":"xdg-open";RV(`${_} "${A}"`)}async function WZ(A,_){if(!_.pattern)return console.error("Error: pattern is required for purge action"),{exitCode:1};if(_.dryRun){let K=(await A.list({all:!0})).filter((Z)=>{return new RegExp("^"+_.pattern.replace(/%/g,".*").replace(/_/g,".")+"$").test(Z.description)});if(K.length===0)if(_.json)console.log(JSON.stringify({wouldDelete:0,pattern:_.pattern}));else console.log(`No entries match pattern: "${_.pattern}"`);else if(_.json)console.log(JSON.stringify({wouldDelete:K.length,pattern:_.pattern}));else{console.log(`Would delete ${K.length} entries matching "${_.pattern}":`);for(let Z of K.slice(0,10))console.log(` #${Z.id}: ${Z.description}`);if(K.length>10)console.log(` ... and ${K.length-10} more`)}return{exitCode:0}}if(!_.force)return console.error(`Use --dry-run to preview or --force to delete entries matching "${_.pattern}".`),{exitCode:1};let G=await A.purge(_.pattern);if(G===0)if(_.json)console.log(JSON.stringify({deleted:0,pattern:_.pattern}));else console.log(`No entries match pattern: "${_.pattern}"`);else if(_.json)console.log(JSON.stringify({deleted:G,pattern:_.pattern}));else console.log(`Purged ${G} friction entries matching "${_.pattern}"`);return{exitCode:0}}pA();var kV=new Set([j.NOT_FOUND,j.INVALID_STATE]);function TK(){let A=new n0("friction").description("Log and track friction with memory tool").addOption(new xV("--format <type>","Output format").choices(["default","ai"]).default("default"));return A.addCommand(new n0("log").description("Log a friction entry").argument("<description>","What went wrong").option("--severity <level>","low|medium|high|critical","medium").option("--category <cat>","search|sync|cli|context|integration|ux","cli").option("--tool <name>","Tool that had friction (e.g., aidev, memory, gsd)").option("--source <project>","Source project name").option("--context <ctx>","Additional context").option("--json","Output as JSON").action(async(_,G)=>{let $=await i0({action:"log",description:_,...G});process.exitCode=$.exitCode})),A.addCommand(new n0("list").description("List friction entries").option("--all","Include resolved and won't-fix entries").option("--status <status>","Filter by status").option("--severity <level>","Filter by severity").option("--category <cat>","Filter by category").option("--tool <name>","Filter by tool name").option("--project <name>","Filter by source project").option("--since <date>","Include entries logged on or after YYYY-MM-DD UTC").option("--description-contains <text>","Filter by case-insensitive description substring").option("--context-contains <text>","Filter by case-insensitive context substring").option("--count","Print only the matching count").option("--min <n>","Exit 0 when matching count is at least n, else 1").option("--limit <n>","Maximum entries","50").option("--json","Output as JSON").action(async(_)=>{let G=await i0({action:"list",..._});process.exitCode=G.exitCode})),A.addCommand(new n0("resolve").description("Resolve a friction entry").argument("<id>","Friction entry ID").requiredOption("--resolution <text>","How it was resolved").option("--json","Output as JSON").action(async(_,G)=>{let $=await i0({action:"resolve",id:_,...G});process.exitCode=$.exitCode})),A.addCommand(new n0("wont-fix").description("Mark a friction entry as won't fix").argument("<id>","Friction entry ID").requiredOption("--resolution <text>","Why it won't be fixed").option("--json","Output as JSON").action(async(_,G)=>{let $=await i0({action:"wont-fix",id:_,...G});process.exitCode=$.exitCode})),A.addCommand(new n0("dashboard").description("Show friction dashboard").option("--html","Generate HTML report").option("--tool <name>","Filter by tool name").option("--json","Output as JSON").action(async(_)=>{let G=await i0({action:"dashboard",..._});process.exitCode=G.exitCode})),A.addCommand(new n0("purge").description("Delete friction entries by description pattern").argument("<pattern>","Description pattern (SQL LIKE: % for wildcard)").option("--dry-run","Preview matches without deleting").option("-f, --force","Skip confirmation").option("--json","Output as JSON").action(async(_,G)=>{let $=await i0({action:"purge",pattern:_,...G});process.exitCode=$.exitCode})),A}async function i0(A,_={}){let G;try{let $=_.dbPath??S();G=D({path:$}).db;let K=new RA(G),Z=new mG(K,new t),Y=PV(yV(),".claude","friction.jsonl"),J=await Z.ingestFallbackFile(Y);if(J>0)process.stderr.write(`Ingested ${J} friction entries from fallback file
2219
- `);switch(A.action){case"log":return await ZZ(Z,A);case"list":return await HZ(Z,A);case"resolve":return await QZ(Z,A);case"wont-fix":return await XZ(Z,A);case"dashboard":return await BZ(Z,A,_.openInBrowser);case"purge":return await WZ(Z,A);default:return console.error(`Unknown friction action: ${A.action}`),{exitCode:2}}}catch($){let K=$ instanceof F?$:new F(j.UNKNOWN,L($));if(A.json)h({command:"friction",code:K.code,message:K.message,...K.context!==void 0?{context:K.context}:{}});else console.error(i(K));return{exitCode:kV.has(K.code)?1:3}}finally{if(G)E(G)}}u();k0();K$();$_();D0();import{Command as hV,Option as a0}from"commander";var h_=[...tG];function OK(){let A=new hV("governance").description("Inspect and control derived memory consent/provenance state");return A.command("list").description("List governed derived memory").addOption(new a0("--surface <surface>","Surface to list").choices(h_)).option("--project <project>","Project to filter by").option("--status <status>","Governance status to filter by").addOption(new a0("--limit <n>","Maximum entries").argParser(gV)).option("--json","Output as JSON").action(async(_)=>{process.exitCode=(await r0({action:"list",..._})).exitCode}),A.command("show").description("Show governance state for a target").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to inspect").choices(h_).default("fact")).option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"show",targetId:_,...G})).exitCode}),F$(A,"suppress","Suppress a target from future memory use"),F$(A,"unsuppress","Reactivate a suppressed target"),F$(A,"invalidate","Invalidate a target as wrong or unsafe"),F$(A,"review","Mark a target as reviewed"),A.command("expire").description("Expire a target now or at a supplied ISO timestamp").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--at <iso>","Expiry timestamp, defaults to now").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"expire",targetId:_,...G})).exitCode}),A.command("consent-grant").description("Grant consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-grant",targetId:_,...G})).exitCode}),A.command("consent-revoke").description("Revoke consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-revoke",targetId:_,...G})).exitCode}),A}async function r0(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return S$(A,"DB_CONNECTION_FAILED",zZ(K),1)}try{let K=new s($),Z=new cA({repository:K,writeEvent:_.writeEvents===!1?void 0:_$});if(A.action==="list"){let X=await Z.list({surface:A.surface,project:A.project,status:A.status,limit:A.limit});return IK(A,X.map((V)=>V.toJSON()))}let Y=CV(A.surface),J=bV(A.targetId);if(A.action==="show"){let X=await Z.show(Y,J);if(!X)return S$(A,"NOT_FOUND",`No governance entry found for ${Y}:${J}`,1);return IK(A,X.toJSON())}let H={surface:Y,targetId:J,actor:"user",reason:A.reason,expiresAt:A.at?fV(A.at):void 0,consentScopes:A.scope},Q=A.action==="suppress"?await Z.suppress(H):A.action==="unsuppress"?await Z.unsuppress(H):A.action==="invalidate"?await Z.invalidate(H):A.action==="expire"?await Z.expire(H):A.action==="review"?await Z.review(H):A.action==="consent-grant"?await Z.grantConsent(H):A.action==="consent-revoke"?await Z.revokeConsent(H):null;if(!Q)return S$(A,"INVALID_ACTION",`Unsupported governance action: ${A.action}`,2);return IK(A,Q.toJSON())}catch(K){return S$(A,"UNEXPECTED_ERROR",zZ(K),2)}finally{E($)}}function F$(A,_,G){A.command(_).description(G).argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async($,K)=>{process.exitCode=(await r0({action:_,targetId:$,...K})).exitCode})}function IK(A,_){if(A.json)console.log(JSON.stringify({status:"success",data:_},null,2));else if(Array.isArray(_))if(_.length===0)console.log("No governed memory entries found.");else for(let G of _)console.log(vV(G));else console.log(wV(_));return{exitCode:0}}function S$(A,_,G,$){if(A.json)console.log(JSON.stringify({status:"error",error:{code:_,message:G}},null,2));else console.error(`Error: ${G}`);return{exitCode:$}}function vV(A){let _=A.blocked?"blocked":"active";return`${A.surface}:${A.target_id} [${A.status}/${_}] ${A.project??"global"} via ${A.transformation_method}`}function wV(A){return[`${A.surface}:${A.target_id}`,`Status: ${A.status}${A.blocked?" (blocked)":""}`,`Project: ${A.project??"global"}`,`Source events: ${A.source_event_ids.join(", ")}`,`Method: ${A.transformation_method}`,`Actor: ${A.actor}`,`Consent: ${A.consent_status} ${A.consent_scopes.join(", ")}`,`Redaction: ${A.redaction_state}`,A.status_reason?`Reason: ${A.status_reason}`:void 0].filter((_)=>_!==void 0).join(`
2220
- `)}function CV(A){return A_(A??"fact")}function bV(A){if(!A||!A.trim())throw Error("targetId is required");return A}function fV(A){let _=new Date(A);if(Number.isNaN(_.getTime()))throw Error(`Invalid ISO date: ${A}`);return _}function gV(A){let _=Number.parseInt(A,10);if(!Number.isSafeInteger(_)||_<1)throw Error("Value must be a positive integer");return _}function zZ(A){return A instanceof Error?A.message:String(A)}A1();$_();e_();u();P0();$G();k0();H_();import{Command as cV,Option as E$}from"commander";var NZ=[...eG];function FK(){let A=new cV("profile").description("Inspect and rebuild governed persona/procedural memory");return A.command("show").description("Show persona/procedural memory for a project").argument("[project]","Project name to show; omitted shows global persona only").addOption(new E$("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E$("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Show every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"show",project:_,...G})).exitCode}),A.command("export").description("Export governed persona/procedural memory as stable JSON").argument("[project]","Project name to export; omitted exports global persona only").addOption(new E$("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E$("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Export every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"export",project:_,...G})).exitCode}),A.command("rebuild").description("Rebuild persona/procedural memory from governed source facts and friction").argument("[project]","Project name to rebuild").option("--all","Rebuild all profile entries").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"rebuild",project:_,...G})).exitCode}),A}async function D$(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return RK(A,"DB_CONNECTION_FAILED",MZ(K),1)}try{let K=new FA($),Z=new RA($),Y=new SA($),J=new s($),H=new cA({repository:J,..._.now?{now:_.now}:{}});if(A.action==="rebuild"){if(!A.project&&!A.all)return RK(A,"INVALID_ARGUMENT","Provide a project or --all for profile rebuild.",1);let N=await new oG({factRepo:K,frictionRepo:Z,personaRepo:Y,governanceRepo:J,..._.now?{now:_.now}:{}}).rebuildProfile(A.project?{project:A.project}:{});return jK(A,{project:A.project??null,all:A.all===!0,entry_count:N.entries.length,fact_count:N.factCount,friction_pattern_count:N.frictionPatternCount,entries:N.entries.map((z)=>z.toJSON())})}let Q=await uV(Y,A),X=await H.filterAllowed("persona",Q,(W)=>W.entryId),V=A.kind?X.filter((W)=>W.kind===A.kind):X,B=V.slice(0,A.limit??V.length);if(A.action==="export")return jK(A,{schema_version:1,generated_at:(_.now?.()??new Date).toISOString(),project:A.project??null,all:A.all===!0,entries:B.map((W)=>W.toJSON())});return jK(A,B)}catch(K){return RK(A,"UNEXPECTED_ERROR",MZ(K),2)}finally{E($)}}async function uV(A,_){let G=_.limit??100;if(_.project)return A.findForContext(_.project,{limit:G});if(_.all)return A.findAll({kind:_.kind,limit:G});return A.findAll({kind:_.kind,visibility:"global",limit:G})}function jK(A,_){if(A.json||A.action==="export")return console.log(JSON.stringify({status:"success",data:_},null,2)),{exitCode:0};if(A.action==="rebuild"){let K=_;return console.log(`Profile rebuilt for ${K.project??"all projects"}.`),console.log(`Entries: ${K.entry_count} | Facts scanned: ${K.fact_count} | Friction patterns scanned: ${K.friction_pattern_count}`),{exitCode:0}}let G=_,$=A.project?`Persona Profile for Project: ${A.project}`:A.all?"Persona Profile for All Projects":"Global Persona Profile";if(console.log(`
2219
+ `);switch(A.action){case"log":return await ZZ(Z,A);case"list":return await HZ(Z,A);case"resolve":return await QZ(Z,A);case"wont-fix":return await XZ(Z,A);case"dashboard":return await BZ(Z,A,_.openInBrowser);case"purge":return await WZ(Z,A);default:return console.error(`Unknown friction action: ${A.action}`),{exitCode:2}}}catch($){let K=$ instanceof F?$:new F(j.UNKNOWN,L($));if(A.json)h({command:"friction",code:K.code,message:K.message,...K.context!==void 0?{context:K.context}:{}});else console.error(i(K));return{exitCode:kV.has(K.code)?1:3}}finally{if(G)E(G)}}u();k0();K1();$_();D0();import{Command as hV,Option as a0}from"commander";var h_=[...tG];function OK(){let A=new hV("governance").description("Inspect and control derived memory consent/provenance state");return A.command("list").description("List governed derived memory").addOption(new a0("--surface <surface>","Surface to list").choices(h_)).option("--project <project>","Project to filter by").option("--status <status>","Governance status to filter by").addOption(new a0("--limit <n>","Maximum entries").argParser(gV)).option("--json","Output as JSON").action(async(_)=>{process.exitCode=(await r0({action:"list",..._})).exitCode}),A.command("show").description("Show governance state for a target").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to inspect").choices(h_).default("fact")).option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"show",targetId:_,...G})).exitCode}),F1(A,"suppress","Suppress a target from future memory use"),F1(A,"unsuppress","Reactivate a suppressed target"),F1(A,"invalidate","Invalidate a target as wrong or unsafe"),F1(A,"review","Mark a target as reviewed"),A.command("expire").description("Expire a target now or at a supplied ISO timestamp").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--at <iso>","Expiry timestamp, defaults to now").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"expire",targetId:_,...G})).exitCode}),A.command("consent-grant").description("Grant consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-grant",targetId:_,...G})).exitCode}),A.command("consent-revoke").description("Revoke consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-revoke",targetId:_,...G})).exitCode}),A}async function r0(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return S1(A,"DB_CONNECTION_FAILED",zZ(K),1)}try{let K=new s($),Z=new cA({repository:K,writeEvent:_.writeEvents===!1?void 0:_1});if(A.action==="list"){let X=await Z.list({surface:A.surface,project:A.project,status:A.status,limit:A.limit});return IK(A,X.map((V)=>V.toJSON()))}let Y=CV(A.surface),J=bV(A.targetId);if(A.action==="show"){let X=await Z.show(Y,J);if(!X)return S1(A,"NOT_FOUND",`No governance entry found for ${Y}:${J}`,1);return IK(A,X.toJSON())}let H={surface:Y,targetId:J,actor:"user",reason:A.reason,expiresAt:A.at?fV(A.at):void 0,consentScopes:A.scope},Q=A.action==="suppress"?await Z.suppress(H):A.action==="unsuppress"?await Z.unsuppress(H):A.action==="invalidate"?await Z.invalidate(H):A.action==="expire"?await Z.expire(H):A.action==="review"?await Z.review(H):A.action==="consent-grant"?await Z.grantConsent(H):A.action==="consent-revoke"?await Z.revokeConsent(H):null;if(!Q)return S1(A,"INVALID_ACTION",`Unsupported governance action: ${A.action}`,2);return IK(A,Q.toJSON())}catch(K){return S1(A,"UNEXPECTED_ERROR",zZ(K),2)}finally{E($)}}function F1(A,_,G){A.command(_).description(G).argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async($,K)=>{process.exitCode=(await r0({action:_,targetId:$,...K})).exitCode})}function IK(A,_){if(A.json)console.log(JSON.stringify({status:"success",data:_},null,2));else if(Array.isArray(_))if(_.length===0)console.log("No governed memory entries found.");else for(let G of _)console.log(vV(G));else console.log(wV(_));return{exitCode:0}}function S1(A,_,G,$){if(A.json)console.log(JSON.stringify({status:"error",error:{code:_,message:G}},null,2));else console.error(`Error: ${G}`);return{exitCode:$}}function vV(A){let _=A.blocked?"blocked":"active";return`${A.surface}:${A.target_id} [${A.status}/${_}] ${A.project??"global"} via ${A.transformation_method}`}function wV(A){return[`${A.surface}:${A.target_id}`,`Status: ${A.status}${A.blocked?" (blocked)":""}`,`Project: ${A.project??"global"}`,`Source events: ${A.source_event_ids.join(", ")}`,`Method: ${A.transformation_method}`,`Actor: ${A.actor}`,`Consent: ${A.consent_status} ${A.consent_scopes.join(", ")}`,`Redaction: ${A.redaction_state}`,A.status_reason?`Reason: ${A.status_reason}`:void 0].filter((_)=>_!==void 0).join(`
2220
+ `)}function CV(A){return A_(A??"fact")}function bV(A){if(!A||!A.trim())throw Error("targetId is required");return A}function fV(A){let _=new Date(A);if(Number.isNaN(_.getTime()))throw Error(`Invalid ISO date: ${A}`);return _}function gV(A){let _=Number.parseInt(A,10);if(!Number.isSafeInteger(_)||_<1)throw Error("Value must be a positive integer");return _}function zZ(A){return A instanceof Error?A.message:String(A)}A$();$_();e_();u();P0();$G();k0();H_();import{Command as cV,Option as E1}from"commander";var NZ=[...eG];function FK(){let A=new cV("profile").description("Inspect and rebuild governed persona/procedural memory");return A.command("show").description("Show persona/procedural memory for a project").argument("[project]","Project name to show; omitted shows global persona only").addOption(new E1("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E1("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Show every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D1({action:"show",project:_,...G})).exitCode}),A.command("export").description("Export governed persona/procedural memory as stable JSON").argument("[project]","Project name to export; omitted exports global persona only").addOption(new E1("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E1("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Export every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D1({action:"export",project:_,...G})).exitCode}),A.command("rebuild").description("Rebuild persona/procedural memory from governed source facts and friction").argument("[project]","Project name to rebuild").option("--all","Rebuild all profile entries").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D1({action:"rebuild",project:_,...G})).exitCode}),A}async function D1(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return RK(A,"DB_CONNECTION_FAILED",MZ(K),1)}try{let K=new FA($),Z=new RA($),Y=new SA($),J=new s($),H=new cA({repository:J,..._.now?{now:_.now}:{}});if(A.action==="rebuild"){if(!A.project&&!A.all)return RK(A,"INVALID_ARGUMENT","Provide a project or --all for profile rebuild.",1);let N=await new oG({factRepo:K,frictionRepo:Z,personaRepo:Y,governanceRepo:J,..._.now?{now:_.now}:{}}).rebuildProfile(A.project?{project:A.project}:{});return jK(A,{project:A.project??null,all:A.all===!0,entry_count:N.entries.length,fact_count:N.factCount,friction_pattern_count:N.frictionPatternCount,entries:N.entries.map((z)=>z.toJSON())})}let Q=await uV(Y,A),X=await H.filterAllowed("persona",Q,(W)=>W.entryId),V=A.kind?X.filter((W)=>W.kind===A.kind):X,B=V.slice(0,A.limit??V.length);if(A.action==="export")return jK(A,{schema_version:1,generated_at:(_.now?.()??new Date).toISOString(),project:A.project??null,all:A.all===!0,entries:B.map((W)=>W.toJSON())});return jK(A,B)}catch(K){return RK(A,"UNEXPECTED_ERROR",MZ(K),2)}finally{E($)}}async function uV(A,_){let G=_.limit??100;if(_.project)return A.findForContext(_.project,{limit:G});if(_.all)return A.findAll({kind:_.kind,limit:G});return A.findAll({kind:_.kind,visibility:"global",limit:G})}function jK(A,_){if(A.json||A.action==="export")return console.log(JSON.stringify({status:"success",data:_},null,2)),{exitCode:0};if(A.action==="rebuild"){let K=_;return console.log(`Profile rebuilt for ${K.project??"all projects"}.`),console.log(`Entries: ${K.entry_count} | Facts scanned: ${K.fact_count} | Friction patterns scanned: ${K.friction_pattern_count}`),{exitCode:0}}let G=_,$=A.project?`Persona Profile for Project: ${A.project}`:A.all?"Persona Profile for All Projects":"Global Persona Profile";if(console.log(`
2221
2221
  ${$}`),console.log("=".repeat($.length)),G.length===0)return console.log("No governed persona entries found."),{exitCode:0};for(let K of G)console.log(mV(K));return{exitCode:0}}function RK(A,_,G,$){if(A.json)console.log(JSON.stringify({status:"error",error:{code:_,message:G}},null,2));else console.error(`Error: ${G}`);return{exitCode:$}}function mV(A){let _=A.project?`project:${A.project}`:A.visibility,G=`${A.reviewStatus} after ${A.reviewAfter.toISOString()}`;return[`
2222
2222
  [${A.kind}] ${A.content}`,` scope: ${_}`,` confidence: ${A.confidence.toFixed(2)}`,` why: ${A.why}`,` review: ${G}`,` controls: ${A.controls.join(", ")}`,` sources: ${A.sourceEventIds.join(", ")}`].join(`
2223
2223
  `)}function LZ(A){let _=Number.parseInt(A,10);if(!Number.isSafeInteger(_)||_<1)throw Error("Value must be a positive integer");return _}function MZ(A){return A instanceof Error?A.message:String(A)}import{Command as lV}from"commander";import{createInterface as pV}from"readline";import{existsSync as nV,mkdirSync as iV,appendFileSync as aV,writeFileSync as rV}from"fs";import{join as tV,dirname as eV}from"path";class IZ{memoryDir;constructor(A){this.memoryDir=A}async writeOrAppend(A,_){let G=tV(this.memoryDir,A),$=eV(G);iV($,{recursive:!0});let K=nV(G);if(K)aV(G,`
2224
2224
  `+_);else rV(G,_);return!K}}async function OZ(A,_,G={}){let $=parseInt(A.batch,10),K=A.project;if(A.dryRun){let Q=await _.dryRun({project:K});if(Q.unprocessedCount===0)return console.log("No sessions to backfill. All sessions have been processed."),{exitCode:0};return console.log(`${Q.unprocessedCount} sessions to backfill. Estimated cost: ~$${Q.estimatedCost.toFixed(2)}`),{exitCode:0}}let Z=await _.dryRun({project:K});if(Z.unprocessedCount===0)return console.log("No sessions to backfill. All sessions have been processed."),{exitCode:0};let Y=Math.min(Z.unprocessedCount,$);if(!A.force){if(!await(G.confirm??sV)(`Process ${Y} sessions? Estimated cost: ~$${(Y*0.001).toFixed(2)} [y/N] `))return console.error("Cancelled."),{exitCode:0}}let J=null;try{if(G.createProgressBar)J=await G.createProgressBar(Y);else if(process.stderr.isTTY){let Q=await import("cli-progress"),X=new Q.default.SingleBar({format:"Backfill |{bar}| {percentage}% | {value}/{total} sessions | {sessionId}",hideCursor:!0,stream:process.stderr},Q.default.Presets.shades_classic);X.start(Y,0,{sessionId:""}),J=X}}catch{}let H=await _.backfill({batch:$,project:K,onProgress:(Q)=>{J?.update(Q.current,{sessionId:Q.sessionId.slice(0,8)})}});if(J?.stop(),console.log(`
2225
2225
  Backfill complete: ${H.sessionsProcessed} processed, ${H.sessionsFailed} failed, ${H.sessionsSkipped} skipped`),H.dailyLogsCreated>0||H.dailyLogsUpdated>0)console.log(`Daily logs: ${H.dailyLogsCreated} created, ${H.dailyLogsUpdated} updated`);if(H.errors.length>0){console.error(`
2226
- Errors:`);for(let Q of H.errors)console.error(` ${Q.sessionId}: ${Q.error}`)}return{exitCode:0}}function SK(){return new lV("backfill").description("Generate daily log entries from historical sessions via claude -p").option("--dry-run","Show session count and estimated cost without processing").option("--project <name>","Only backfill sessions for one project").option("--batch <n>","Process N sessions per run (default: 50)","50").option("-f, --force","Skip confirmation prompt").option("--write-memory-files","Write legacy ~/.memory / MEMORY_HOME daily log files").action(async(A)=>{let{initializeDatabase:_,closeDatabase:G}=await Promise.resolve().then(() => (u(),Z2)),{SqliteSessionRepository:$}=await Promise.resolve().then(() => (mA(),$4)),{SqliteMessageRepository:K}=await Promise.resolve().then(() => (Y_(),K4)),{SqliteBackfillStateRepository:Z}=await Promise.resolve().then(() => (P5(),V4)),{ClaudeSummaryGenerator:Y}=await Promise.resolve().then(() => (TZ(),UZ)),{getMemoryDir:J}=await Promise.resolve().then(() => (c(),PG)),{BackfillService:H}=await Promise.resolve().then(() => (o$(),aK)),{getDefaultDbPath:Q}=await Promise.resolve().then(() => (u(),Z2)),{loadConfig:X}=await Promise.resolve().then(() => (JA(),j1)),V=X(),B=A.writeMemoryFiles===!0||V.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1";if(!A.dryRun&&!B){console.error("Legacy memory-file backfill is disabled by default. Re-run with --write-memory-files or set legacyMemoryFiles.enabled=true to write ~/.memory / MEMORY_HOME daily logs."),process.exitCode=1;return}let W=Q(),z=_({path:W}).db;try{let q=new $(z),I=new K(z),T=new Z(z),M=new Y,O=J(),R=new IZ(O),y=new H(q,I,T,M,R),HA=await OZ(A,y);process.exitCode=HA.exitCode}finally{G(z)}})}async function sV(A){return new Promise((_)=>{let G=pV({input:process.stdin,output:process.stderr});G.question(A,($)=>{G.close(),_($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}u();P0();mA();Y_();JA();import{Command as AB}from"commander";_G();K$();l_();var oV={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class EK{db;factRepo;logRepo;messageRepo;extractionProvider;embeddingProvider;eventLogPath;redactor;constructor(A,_,G,$,K,Z,Y,J=oV){this.db=A;this.factRepo=_;this.logRepo=G;this.messageRepo=$;this.extractionProvider=K;this.embeddingProvider=Z;this.eventLogPath=Y;this.redactor=J}async extractFromSession(A,_,G){if(await this.logRepo.findById(A)&&!G?.force)return{skippedSession:!0,added:0,updated:0,superseded:0,skipped:0};let K=await this.messageRepo.findBySession(A);if(K.length===0)return{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let Z=K.map((q)=>TA.create({id:q.id,role:q.role,content:this.redactor.redactText(q.content).text,timestamp:q.timestamp,toolUseIds:q.toolUses})),Y=(await this.extractionProvider.extract(Z)).map((q)=>({...q,content:this.redactor.redactText(q.content).text,metadata:this.redactor.redactJson(q.metadata).value}));if(Y.length===0)return await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:0,factsUpdated:0,factsSuperseded:0,factsSkipped:0,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let H=(await this.factRepo.findByProject(_)).filter((q)=>q.supersededAt===null),Q=Boolean(this.embeddingProvider&&this.embeddingProvider.isReady()),X=[],V=[];if(Q&&this.embeddingProvider)try{X=(await this.embeddingProvider.embedBatch(H.map((T)=>this.redactor.redactText(T.content).text))).map((T)=>T.embedding),V=(await this.embeddingProvider.embedBatch(Y.map((T)=>T.content))).map((T)=>T.embedding)}catch(q){let I=this.redactor.redactText(L(q)).text;console.warn("Failed to generate vector embeddings during extraction comparison, falling back to Jaccard:",I)}let B=0,W=0,N=0,z=0;for(let q=0;q<Y.length;q++){let I=Y[q];if(!I)continue;let T=0,M=null;for(let O=0;O<H.length;O++){let R=H[O];if(!R)continue;let y=0;if(I.content.trim().toLowerCase()===R.content.trim().toLowerCase())y=1;else{let HA=V[q],tA=X[O];if(Q&&HA&&tA)y=this.cosineSimilarity(HA,tA);else y=this.jaccardWordSimilarity(I.content,R.content)}if(y>T)T=y,M=R}if(T>=0.95||M&&I.content.trim().toLowerCase()===M.content.trim().toLowerCase())z++;else if(T>=0.85&&M){B++,W++,N++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath);let R=YA.create({type:"supersedence",project:_,content:`Superseded ${M.uuid} by ${O.uuid}`,metadata:{superseded_uuid:M.uuid,superseded_by_uuid:O.uuid},observedAt:new Date});await UG(R,this.eventLogPath)}else{B++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath)}}return await l2(this.db,this.eventLogPath),await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:B,factsUpdated:W,factsSuperseded:N,factsSkipped:z,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:B,updated:W,superseded:N,skipped:z}}cosineSimilarity(A,_){let G=0,$=0,K=0;for(let Z=0;Z<A.length;Z++){let Y=A[Z]??0,J=_[Z]??0;G+=Y*J,$+=Y*Y,K+=J*J}if($===0||K===0)return 0;return G/(Math.sqrt($)*Math.sqrt(K))}jaccardWordSimilarity(A,_){let G=(J)=>new Set(J.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()?"']/g,"").split(/\s+/).filter((H)=>H.length>0)),$=G(A),K=G(_),Z=new Set([...$].filter((J)=>K.has(J))),Y=new Set([...$,...K]);if(Y.size===0)return 0;return Z.size/Y.size}}zA();pA();WG();class jZ{current=0;total=0;isTty=process.stdout.isTTY;quiet=!1;constructor(A,_=!1){if(this.total=A,this.quiet=_,this.quiet)return;if(this.isTty)process.stdout.write(`\rExtracting facts... [0/${A}] \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 0%`);else console.log(`Extracting facts from ${A} sessions...`)}update(A){if(this.quiet)return;this.current++;let _=Math.round(this.current/this.total*100),G=Math.min(10,Math.max(0,Math.floor(_/10))),$="\u2588".repeat(G)+"\u2591".repeat(10-G);if(this.isTty){let K=A.length>25?A.substring(0,22)+"...":A;process.stdout.write(`\rExtracting facts... [${this.current}/${this.total}] [${$}] ${_}% - Session: ${K}`)}else console.log(`[${this.current}/${this.total}] Processed session: ${A}`)}stop(){if(this.quiet)return;if(this.isTty)process.stdout.write(`
2227
- `)}}async function _B(A){let{EmbeddingProviderFactory:_}=await Promise.resolve().then(() => (o1(),b2)),$=new _().createFromConfig(A);if(!$)return;return await $.initialize(),$}function DK(){return new AB("extract").description("Extract facts from session messages using LLM").argument("<project>","Project name or path to process").option("--all","Process all sessions matching this project").option("--since <duration>","Filter sessions by age (e.g. '24h', '7d', '30d')").option("-f, --force","Force extraction even on previously processed sessions").option("--json","Output result as JSON").option("-q, --quiet","Minimal output").action(async(A,_)=>{let G=await RZ({project:A,..._});process.exitCode=G.exitCode})}async function RZ(A,_={}){let G=performance.now(),$=_.dbPath??S(),K=f(),Z;if(_.mockExtractor)Z=_.mockExtractor;else try{Z=G9(K)}catch(H){let Q=L(H);if(A.json)h({command:"extract",code:"PROVIDER_INIT_FAILED",message:Q});else console.error(`Error: Provider initialization failed: ${Q}`);return{exitCode:1}}let Y=_.mockEmbedder;if(!_.mockEmbedder&&K.embedding?.enabled)try{Y=await(_.createEmbedder??_B)(K)}catch(H){}let J;try{J=D({path:$}).db}catch(H){if(A.json)h({command:"extract",code:"DB_CONNECTION_FAILED",message:H.message});else console.error(`Error: Database connection failed: ${H.message}`);return{exitCode:1}}try{let H=new FA(J),Q=new M1(J),X=new m(J),V=new WA(J),B=await X.findFiltered({projectFilter:A.project,limit:1e4}),W=B;if(A.since&&!A.all)try{let R=WK(A.since);W=B.filter((y)=>y.startTime>=R)}catch(R){if(A.json)h({command:"extract",code:"INVALID_ARGUMENT",message:R.message});else console.error(`Error: ${R.message}`);return{exitCode:1}}let N=new EK(J,H,Q,V,Z,Y,_.eventLogPath,new t),z=[];for(let R of W)if(!await Q.findById(R.id)||A.force)z.push(R);if(z.length===0){if(A.json)console.log(JSON.stringify({status:"success",data:{added:0,updated:0,superseded:0,skipped:0},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:0}},null,2));else if(!A.quiet)console.log("No new sessions to extract for project:",A.project);return{exitCode:0}}let q=new jZ(z.length,!!A.quiet||!!A.json),I=0,T=0,M=0,O=0;for(let R of z){let y=await N.extractFromSession(R.id,A.project,A.force?{force:!0}:void 0);I+=y.added,T+=y.updated,M+=y.superseded,O+=y.skipped,q.update(R.id.substring(0,8))}if(q.stop(),A.json)console.log(JSON.stringify({status:"success",data:{added:I,updated:T,superseded:M,skipped:O},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:z.length}},null,2));else if(A.quiet)console.log(`added: ${I}, updated: ${T}, superseded: ${M}, skipped: ${O}`);else{let R=v();console.log(`
2226
+ Errors:`);for(let Q of H.errors)console.error(` ${Q.sessionId}: ${Q.error}`)}return{exitCode:0}}function SK(){return new lV("backfill").description("Generate daily log entries from historical sessions via claude -p").option("--dry-run","Show session count and estimated cost without processing").option("--project <name>","Only backfill sessions for one project").option("--batch <n>","Process N sessions per run (default: 50)","50").option("-f, --force","Skip confirmation prompt").option("--write-memory-files","Write legacy ~/.memory / MEMORY_HOME daily log files").action(async(A)=>{let{initializeDatabase:_,closeDatabase:G}=await Promise.resolve().then(() => (u(),Z2)),{SqliteSessionRepository:$}=await Promise.resolve().then(() => (mA(),$4)),{SqliteMessageRepository:K}=await Promise.resolve().then(() => (Y_(),K4)),{SqliteBackfillStateRepository:Z}=await Promise.resolve().then(() => (P5(),V4)),{ClaudeSummaryGenerator:Y}=await Promise.resolve().then(() => (TZ(),UZ)),{getMemoryDir:J}=await Promise.resolve().then(() => (c(),PG)),{BackfillService:H}=await Promise.resolve().then(() => (o1(),aK)),{getDefaultDbPath:Q}=await Promise.resolve().then(() => (u(),Z2)),{loadConfig:X}=await Promise.resolve().then(() => (JA(),j$)),V=X(),B=A.writeMemoryFiles===!0||V.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1";if(!A.dryRun&&!B){console.error("Legacy memory-file backfill is disabled by default. Re-run with --write-memory-files or set legacyMemoryFiles.enabled=true to write ~/.memory / MEMORY_HOME daily logs."),process.exitCode=1;return}let W=Q(),z=_({path:W}).db;try{let q=new $(z),I=new K(z),T=new Z(z),M=new Y,O=J(),R=new IZ(O),y=new H(q,I,T,M,R),HA=await OZ(A,y);process.exitCode=HA.exitCode}finally{G(z)}})}async function sV(A){return new Promise((_)=>{let G=pV({input:process.stdin,output:process.stderr});G.question(A,($)=>{G.close(),_($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}u();P0();mA();Y_();JA();import{Command as AB}from"commander";_G();K1();l_();var oV={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class EK{db;factRepo;logRepo;messageRepo;extractionProvider;embeddingProvider;eventLogPath;redactor;constructor(A,_,G,$,K,Z,Y,J=oV){this.db=A;this.factRepo=_;this.logRepo=G;this.messageRepo=$;this.extractionProvider=K;this.embeddingProvider=Z;this.eventLogPath=Y;this.redactor=J}async extractFromSession(A,_,G){if(await this.logRepo.findById(A)&&!G?.force)return{skippedSession:!0,added:0,updated:0,superseded:0,skipped:0};let K=await this.messageRepo.findBySession(A);if(K.length===0)return{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let Z=K.map((q)=>TA.create({id:q.id,role:q.role,content:this.redactor.redactText(q.content).text,timestamp:q.timestamp,toolUseIds:q.toolUses})),Y=(await this.extractionProvider.extract(Z)).map((q)=>({...q,content:this.redactor.redactText(q.content).text,metadata:this.redactor.redactJson(q.metadata).value}));if(Y.length===0)return await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:0,factsUpdated:0,factsSuperseded:0,factsSkipped:0,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let H=(await this.factRepo.findByProject(_)).filter((q)=>q.supersededAt===null),Q=Boolean(this.embeddingProvider&&this.embeddingProvider.isReady()),X=[],V=[];if(Q&&this.embeddingProvider)try{X=(await this.embeddingProvider.embedBatch(H.map((T)=>this.redactor.redactText(T.content).text))).map((T)=>T.embedding),V=(await this.embeddingProvider.embedBatch(Y.map((T)=>T.content))).map((T)=>T.embedding)}catch(q){let I=this.redactor.redactText(L(q)).text;console.warn("Failed to generate vector embeddings during extraction comparison, falling back to Jaccard:",I)}let B=0,W=0,N=0,z=0;for(let q=0;q<Y.length;q++){let I=Y[q];if(!I)continue;let T=0,M=null;for(let O=0;O<H.length;O++){let R=H[O];if(!R)continue;let y=0;if(I.content.trim().toLowerCase()===R.content.trim().toLowerCase())y=1;else{let HA=V[q],tA=X[O];if(Q&&HA&&tA)y=this.cosineSimilarity(HA,tA);else y=this.jaccardWordSimilarity(I.content,R.content)}if(y>T)T=y,M=R}if(T>=0.95||M&&I.content.trim().toLowerCase()===M.content.trim().toLowerCase())z++;else if(T>=0.85&&M){B++,W++,N++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath);let R=YA.create({type:"supersedence",project:_,content:`Superseded ${M.uuid} by ${O.uuid}`,metadata:{superseded_uuid:M.uuid,superseded_by_uuid:O.uuid},observedAt:new Date});await UG(R,this.eventLogPath)}else{B++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath)}}return await l2(this.db,this.eventLogPath),await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:B,factsUpdated:W,factsSuperseded:N,factsSkipped:z,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:B,updated:W,superseded:N,skipped:z}}cosineSimilarity(A,_){let G=0,$=0,K=0;for(let Z=0;Z<A.length;Z++){let Y=A[Z]??0,J=_[Z]??0;G+=Y*J,$+=Y*Y,K+=J*J}if($===0||K===0)return 0;return G/(Math.sqrt($)*Math.sqrt(K))}jaccardWordSimilarity(A,_){let G=(J)=>new Set(J.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()?"']/g,"").split(/\s+/).filter((H)=>H.length>0)),$=G(A),K=G(_),Z=new Set([...$].filter((J)=>K.has(J))),Y=new Set([...$,...K]);if(Y.size===0)return 0;return Z.size/Y.size}}zA();pA();WG();class jZ{current=0;total=0;isTty=process.stdout.isTTY;quiet=!1;constructor(A,_=!1){if(this.total=A,this.quiet=_,this.quiet)return;if(this.isTty)process.stdout.write(`\rExtracting facts... [0/${A}] \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 0%`);else console.log(`Extracting facts from ${A} sessions...`)}update(A){if(this.quiet)return;this.current++;let _=Math.round(this.current/this.total*100),G=Math.min(10,Math.max(0,Math.floor(_/10))),$="\u2588".repeat(G)+"\u2591".repeat(10-G);if(this.isTty){let K=A.length>25?A.substring(0,22)+"...":A;process.stdout.write(`\rExtracting facts... [${this.current}/${this.total}] [${$}] ${_}% - Session: ${K}`)}else console.log(`[${this.current}/${this.total}] Processed session: ${A}`)}stop(){if(this.quiet)return;if(this.isTty)process.stdout.write(`
2227
+ `)}}async function _B(A){let{EmbeddingProviderFactory:_}=await Promise.resolve().then(() => (o$(),b2)),$=new _().createFromConfig(A);if(!$)return;return await $.initialize(),$}function DK(){return new AB("extract").description("Extract facts from session messages using LLM").argument("<project>","Project name or path to process").option("--all","Process all sessions matching this project").option("--since <duration>","Filter sessions by age (e.g. '24h', '7d', '30d')").option("-f, --force","Force extraction even on previously processed sessions").option("--json","Output result as JSON").option("-q, --quiet","Minimal output").action(async(A,_)=>{let G=await RZ({project:A,..._});process.exitCode=G.exitCode})}async function RZ(A,_={}){let G=performance.now(),$=_.dbPath??S(),K=f(),Z;if(_.mockExtractor)Z=_.mockExtractor;else try{Z=G9(K)}catch(H){let Q=L(H);if(A.json)h({command:"extract",code:"PROVIDER_INIT_FAILED",message:Q});else console.error(`Error: Provider initialization failed: ${Q}`);return{exitCode:1}}let Y=_.mockEmbedder;if(!_.mockEmbedder&&K.embedding?.enabled)try{Y=await(_.createEmbedder??_B)(K)}catch(H){}let J;try{J=D({path:$}).db}catch(H){if(A.json)h({command:"extract",code:"DB_CONNECTION_FAILED",message:H.message});else console.error(`Error: Database connection failed: ${H.message}`);return{exitCode:1}}try{let H=new FA(J),Q=new M$(J),X=new m(J),V=new WA(J),B=await X.findFiltered({projectFilter:A.project,limit:1e4}),W=B;if(A.since&&!A.all)try{let R=WK(A.since);W=B.filter((y)=>y.startTime>=R)}catch(R){if(A.json)h({command:"extract",code:"INVALID_ARGUMENT",message:R.message});else console.error(`Error: ${R.message}`);return{exitCode:1}}let N=new EK(J,H,Q,V,Z,Y,_.eventLogPath,new t),z=[];for(let R of W)if(!await Q.findById(R.id)||A.force)z.push(R);if(z.length===0){if(A.json)console.log(JSON.stringify({status:"success",data:{added:0,updated:0,superseded:0,skipped:0},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:0}},null,2));else if(!A.quiet)console.log("No new sessions to extract for project:",A.project);return{exitCode:0}}let q=new jZ(z.length,!!A.quiet||!!A.json),I=0,T=0,M=0,O=0;for(let R of z){let y=await N.extractFromSession(R.id,A.project,A.force?{force:!0}:void 0);I+=y.added,T+=y.updated,M+=y.superseded,O+=y.skipped,q.update(R.id.substring(0,8))}if(q.stop(),A.json)console.log(JSON.stringify({status:"success",data:{added:I,updated:T,superseded:M,skipped:O},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:z.length}},null,2));else if(A.quiet)console.log(`added: ${I}, updated: ${T}, superseded: ${M}, skipped: ${O}`);else{let R=v();console.log(`
2228
2228
  `+C("==================================================",R)),console.log(C(" Extraction Completed Successfully",R)),console.log(C("==================================================",R)),console.log(`Sessions Processed : ${z.length}`),console.log(`Added : ${I}`),console.log(`Updated : ${T}`),console.log(`Superseded : ${M}`),console.log(`Skipped (Duplicate): ${O}`),console.log(P(`Timing : ${Math.round(performance.now()-G)}ms`,R))}return{exitCode:0}}catch(H){if(A.json)console.log(JSON.stringify({status:"error",error:{code:"UNEXPECTED_ERROR",message:H.message}},null,2));else console.error(`Error: Fact extraction pipeline execution failed: ${H.message}`);return{exitCode:2}}finally{E(J)}}u();P0();import{Command as GB}from"commander";function xK(){return new GB("facts").description("View active facts for a project").argument("<project>","Project name or path to view facts for").option("--superseded","Show superseded facts alongside active ones in a timeline").option("--json","Output results as JSON").action(async(A,_)=>{let G=await FZ({project:A,..._});process.exitCode=G.exitCode})}async function FZ(A,_={}){let G=_.dbPath??S(),$;try{$=D({path:G}).db}catch(K){if(A.json)console.log(JSON.stringify({status:"error",error:{code:"DB_CONNECTION_FAILED",message:K.message}},null,2));else console.error(`Error: Database connection failed: ${K.message}`);return{exitCode:1}}try{let Z=await new FA($).findByProject(A.project);if(A.json){let J=Z;if(!A.superseded)J=Z.filter((H)=>H.supersededAt===null);return console.log(JSON.stringify({status:"success",data:J.map((H)=>({uuid:H.uuid,type:H.type,project:H.project,content:H.content,metadata:H.metadata,observed_at:H.observedAt.toISOString(),superseded_at:H.supersededAt?H.supersededAt.toISOString():null,superseded_by:H.supersededBy}))},null,2)),{exitCode:0}}let Y=v();if(!A.superseded){let J=Z.filter((Q)=>Q.supersededAt===null);if(console.log(`
2229
2229
  Active Facts for Project: ${A.project}`),console.log("=".repeat(30+A.project.length)),J.length===0)return console.log(P("No active facts found for this project.",Y)),{exitCode:0};let H=["decision","learning","preference","friction","observation"];for(let Q of H){let X=J.filter((V)=>V.type===Q);if(X.length===0)continue;console.log(`
2230
2230
  ${Q.toUpperCase()}`);for(let V of X)console.log(` - ${V.content}`)}}else{if(console.log(`
2231
- Facts History Timeline for Project: ${A.project}`),console.log("=".repeat(35+A.project.length)),Z.length===0)return console.log(P("No facts history found for this project.",Y)),{exitCode:0};let J=[...Z].sort((H,Q)=>H.observedAt.getTime()-Q.observedAt.getTime());for(let H of J){let Q=H.observedAt.toISOString().split("T")[0],X=`[${H.type.toUpperCase()}]`;if(H.supersededAt)console.log(`[${Q}] ${l(X,Y)} (SUPERSEDED) ${H.content}`),console.log(` \u21B3 replaced by ${H.supersededBy} on ${H.supersededAt.toISOString().split("T")[0]}`);else console.log(`[${Q}] ${C(X,Y)} ${H.content}`)}}return{exitCode:0}}catch(K){if(A.json)console.log(JSON.stringify({status:"error",error:{code:"UNEXPECTED_ERROR",message:K.message}},null,2));else console.error(`Error: Facts query execution failed: ${K.message}`);return{exitCode:2}}finally{E($)}}var w=new $B;w.name("memory").description("Cross-project context persistence for Claude Code sessions").version(PK.version);w.commandsGroup("Query Commands:");w.addCommand(T$());w.addCommand(I$());w.addCommand(L$());w.addCommand(V$());w.addCommand(W$());w.addCommand(q$());w.addCommand(N$());w.addCommand(xK());w.addCommand(OK());w.addCommand(FK());w.commandsGroup("Data Commands:");w.addCommand(p2());w.addCommand(SK());w.addCommand(MK());w.addCommand(qK());w.addCommand(zK());w.addCommand(NK());w.addCommand(DK());w.addCommand(ZK());w.commandsGroup("System Commands:");w.addCommand(HK());w.addCommand(QK());w.addCommand(z$());w.addCommand(VK());w.addCommand(BK());w.addCommand(UK());w.addCommand($K());w.commandsGroup("Feedback Commands:");w.addCommand(TK());if(import.meta.main){if(bK())fK();w.parse()}export{w as program};
2231
+ Facts History Timeline for Project: ${A.project}`),console.log("=".repeat(35+A.project.length)),Z.length===0)return console.log(P("No facts history found for this project.",Y)),{exitCode:0};let J=[...Z].sort((H,Q)=>H.observedAt.getTime()-Q.observedAt.getTime());for(let H of J){let Q=H.observedAt.toISOString().split("T")[0],X=`[${H.type.toUpperCase()}]`;if(H.supersededAt)console.log(`[${Q}] ${l(X,Y)} (SUPERSEDED) ${H.content}`),console.log(` \u21B3 replaced by ${H.supersededBy} on ${H.supersededAt.toISOString().split("T")[0]}`);else console.log(`[${Q}] ${C(X,Y)} ${H.content}`)}}return{exitCode:0}}catch(K){if(A.json)console.log(JSON.stringify({status:"error",error:{code:"UNEXPECTED_ERROR",message:K.message}},null,2));else console.error(`Error: Facts query execution failed: ${K.message}`);return{exitCode:2}}finally{E($)}}var w=new $B;w.name("memory").description("Cross-project context persistence for Claude Code sessions").version(PK.version);w.commandsGroup("Query Commands:");w.addCommand(T1());w.addCommand(I1());w.addCommand(L1());w.addCommand(V1());w.addCommand(W1());w.addCommand(q1());w.addCommand(N1());w.addCommand(xK());w.addCommand(OK());w.addCommand(FK());w.commandsGroup("Data Commands:");w.addCommand(p2());w.addCommand(SK());w.addCommand(MK());w.addCommand(qK());w.addCommand(zK());w.addCommand(NK());w.addCommand(DK());w.addCommand(ZK());w.commandsGroup("System Commands:");w.addCommand(HK());w.addCommand(QK());w.addCommand(z1());w.addCommand(VK());w.addCommand(BK());w.addCommand(UK());w.addCommand($K());w.commandsGroup("Feedback Commands:");w.addCommand(TK());if(import.meta.main){if(bK())fK();w.parse()}export{w as program};