@chude/memory 4.0.0 → 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.
Files changed (60) hide show
  1. package/README.md +58 -11
  2. package/dist/application/services/embedding-service.d.ts +8 -1
  3. package/dist/application/services/friction-service.d.ts +18 -2
  4. package/dist/application/services/index.d.ts +11 -1
  5. package/dist/application/services/memory-governance-service.d.ts +65 -0
  6. package/dist/application/services/memory-ranking-service.d.ts +65 -0
  7. package/dist/application/services/persona-profile-service.d.ts +29 -0
  8. package/dist/application/services/projection-registry.d.ts +18 -0
  9. package/dist/application/services/remote-event-sync-service.d.ts +76 -0
  10. package/dist/application/services/smart-context-service.d.ts +34 -1
  11. package/dist/application/services/temporal-graph-service.d.ts +30 -0
  12. package/dist/domain/entities/graph-edge.d.ts +87 -0
  13. package/dist/domain/entities/index.d.ts +5 -0
  14. package/dist/domain/entities/memory-event.d.ts +101 -0
  15. package/dist/domain/entities/memory-governance.d.ts +100 -0
  16. package/dist/domain/entities/memory-utility-metric.d.ts +65 -0
  17. package/dist/domain/entities/persona-entry.d.ts +67 -0
  18. package/dist/domain/ports/capability.d.ts +35 -0
  19. package/dist/domain/ports/embedding.d.ts +21 -0
  20. package/dist/domain/ports/index.d.ts +1 -0
  21. package/dist/domain/ports/redactor.d.ts +3 -0
  22. package/dist/domain/ports/repositories.d.ts +155 -1
  23. package/dist/domain/ports/sources.d.ts +1 -1
  24. package/dist/domain/services/path-decoder.d.ts +1 -1
  25. package/dist/domain/value-objects/project-path.d.ts +2 -2
  26. package/dist/index.d.ts +2 -2
  27. package/dist/index.js +774 -328
  28. package/dist/infrastructure/capabilities/capability-status.d.ts +10 -0
  29. package/dist/infrastructure/capabilities/index.d.ts +1 -0
  30. package/dist/infrastructure/database/event-log.d.ts +40 -8
  31. package/dist/infrastructure/database/health-checker.d.ts +22 -1
  32. package/dist/infrastructure/database/index.d.ts +3 -3
  33. package/dist/infrastructure/database/repositories/embedding-repository.d.ts +18 -4
  34. package/dist/infrastructure/database/repositories/friction-repository.d.ts +2 -1
  35. package/dist/infrastructure/database/repositories/graph-repository.d.ts +17 -0
  36. package/dist/infrastructure/database/repositories/index.d.ts +4 -0
  37. package/dist/infrastructure/database/repositories/memory-governance-repository.d.ts +21 -0
  38. package/dist/infrastructure/database/repositories/memory-utility-repository.d.ts +15 -0
  39. package/dist/infrastructure/database/repositories/persona-repository.d.ts +16 -0
  40. package/dist/infrastructure/database/schema.d.ts +40 -0
  41. package/dist/infrastructure/embedding/embedding-provider-factory.d.ts +3 -2
  42. package/dist/infrastructure/embedding/ollama-provider.d.ts +1 -0
  43. package/dist/infrastructure/hooks/config-manager.d.ts +17 -0
  44. package/dist/infrastructure/providers/provider-egress-policy.d.ts +21 -0
  45. package/dist/infrastructure/providers/provider-registry.d.ts +8 -4
  46. package/dist/infrastructure/remote/git-remote-event-transport.d.ts +40 -0
  47. package/dist/infrastructure/security/pattern-redactor.d.ts +3 -0
  48. package/dist/infrastructure/security/secret-audit-service.d.ts +57 -0
  49. package/dist/infrastructure/sources/project-name-resolver.d.ts +2 -2
  50. package/dist/presentation/cli/commands/audit-secrets.d.ts +54 -0
  51. package/dist/presentation/cli/commands/friction/types.d.ts +13 -0
  52. package/dist/presentation/cli/commands/governance.d.ts +27 -0
  53. package/dist/presentation/cli/commands/index.d.ts +6 -0
  54. package/dist/presentation/cli/commands/profile.d.ts +23 -0
  55. package/dist/presentation/cli/commands/remote.d.ts +21 -3
  56. package/dist/presentation/cli/commands/sync/ambient.d.ts +7 -0
  57. package/dist/presentation/cli/commands/sync/types.d.ts +8 -12
  58. package/dist/presentation/cli/formatters/envelope.d.ts +2 -2
  59. package/dist/presentation/cli/index.js +918 -351
  60. package/package.json +9 -6
@@ -1,18 +1,20 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var D6=Object.create;var{getPrototypeOf:k6,defineProperty:h$,getOwnPropertyNames:S6}=Object;var v6=Object.prototype.hasOwnProperty;var h1=($,Z,K)=>{K=$!=null?D6(k6($)):{};let X=Z||!$||!$.__esModule?h$(K,"default",{value:$,enumerable:!0}):K;for(let Y of S6($))if(!v6.call(X,Y))h$(X,Y,{get:()=>$[Y],enumerable:!0});return X};var y=($,Z)=>{for(var K in Z)h$($,K,{get:Z[K],enumerable:!0,configurable:!0,set:(X)=>Z[K]=()=>X})};var L=($,Z)=>()=>($&&(Z=$($=0)),Z);var n0=import.meta.require;function A($){return $ instanceof Error?$.message:String($)}function g1($){return $ instanceof Error?$:Error(A($))}var N3={};y(N3,{getMemoryDir:()=>c1,getMachineLogPath:()=>g$,getLogDir:()=>X0,getLegacyDir:()=>m1,getHookDir:()=>d1,getEventsDir:()=>H1,getEventLogPath:()=>w6,getDbPath:()=>J1,getDataDir:()=>a,getConfigPath:()=>u1,getConfigDir:()=>S0,getCheckpointPath:()=>l1,getBackupDir:()=>p1,getAllLogFiles:()=>n1});import{existsSync as A3,readdirSync as y6}from"fs";import{homedir as M4}from"os";import{join as n}from"path";function S0(){let $=process.env.XDG_CONFIG_HOME;if($)return n($,F4);return n(M4(),".config",F4)}function a(){let $=process.env.XDG_DATA_HOME;if($)return n($,F4);return n(M4(),".local","share",F4)}function m1(){return n(M4(),".memory-nexus")}function c1(){let $=process.env.MEMORY_HOME;if($)return $;return n(M4(),".memory")}function u1(){return n(S0(),"config.json")}function J1(){return n(a(),"memory.db")}function X0(){return n(a(),"logs")}function d1(){return n(a(),"hooks")}function p1(){return n(a(),"backups")}function l1(){return n(a(),"sync-checkpoint.json")}function H1(){return n(a(),"events")}function w6(){return n(H1(),"events.jsonl")}function g$($){return n(H1(),`events-${$}.jsonl`)}function n1($){let Z=$??H1();if(!A3(Z))return[];let K=y6(Z),X=[],Y=n(Z,"events.jsonl");if(A3(Y))X.push(Y);for(let Q of K)if(Q.startsWith("events-")&&Q.endsWith(".jsonl"))X.push(n(Z,Q));return X}var F4="memory";var l=L(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{copyFileSync as q3,existsSync as a1,mkdirSync as m$,readFileSync as b6,writeFileSync as O3}from"fs";import{dirname as c$,join as u$}from"path";import{homedir as f6}from"os";function V1($){return $?.settingsPath??u$(f6(),".claude","settings.json")}function j4($){return $?.backupPath??u$(p1(),"settings.json.backup")}function a0($){return $?.hookScriptPath??u$(d1(),"sync-hook.js")}function W1($){let Z=V1($);if(!a1(Z))return{};try{let K=b6(Z,"utf-8");return JSON.parse(K)}catch{return{}}}function U3($){let Z=V1($),K=j4($);if(!a1(Z))return!1;return m$(c$(K),{recursive:!0}),q3(Z,K),!0}function d$($){let Z=V1($),K=j4($);if(!a1(K))return!1;return m$(c$(Z),{recursive:!0}),q3(K,Z),!0}function i0($){let Z=V1($),K=a0($);U3($);let X=W1($),Y=`bun run "${K.replace(/\\/g,"/")}"`;if(X.hooks=X.hooks??{},X.hooks.SessionEnd?.some((G)=>G.hooks.some((_)=>_.command.includes(i1)||_.command.includes(r1))))return{success:!0,message:"Hooks already installed"};return X.hooks.SessionEnd=X.hooks.SessionEnd??[],X.hooks.SessionEnd.push({hooks:[{type:"command",command:Y,timeout:5}]}),X.hooks.PreCompact=X.hooks.PreCompact??[],X.hooks.PreCompact.push({matcher:"auto",hooks:[{type:"command",command:Y,timeout:5}]}),m$(c$(Z),{recursive:!0}),O3(Z,JSON.stringify(X,null,2)+`
4
- `),{success:!0,message:"Hooks installed successfully"}}function r0($){let Z=V1($),K=W1($);if(!K.hooks)return{success:!0,message:"No hooks to uninstall"};if(K.hooks.SessionEnd){if(K.hooks.SessionEnd=K.hooks.SessionEnd.filter((X)=>!X.hooks.some((Y)=>Y.command.includes(i1)||Y.command.includes(r1))),K.hooks.SessionEnd.length===0)delete K.hooks.SessionEnd}if(K.hooks.PreCompact){if(K.hooks.PreCompact=K.hooks.PreCompact.filter((X)=>!X.hooks.some((Y)=>Y.command.includes(i1)||Y.command.includes(r1))),K.hooks.PreCompact.length===0)delete K.hooks.PreCompact}if(Object.keys(K.hooks).length===0)delete K.hooks;return O3(Z,JSON.stringify(K,null,2)+`
5
- `),{success:!0,message:"Hooks uninstalled successfully"}}function F0($){let Z=W1($),K=a0($),X=j4($);return{sessionEnd:Z.hooks?.SessionEnd?.some((Y)=>Y.hooks.some((Q)=>Q.command.includes(i1)||Q.command.includes(r1)))??!1,preCompact:Z.hooks?.PreCompact?.some((Y)=>Y.hooks.some((Q)=>Q.command.includes(i1)||Q.command.includes(r1)))??!1,hookScriptExists:a1(K),backupExists:a1(X)}}var i1="memory",r1="memory-nexus";var p$=L(()=>{l()});import{copyFileSync as h6,cpSync as g6,existsSync as Y0,mkdirSync as n$,readdirSync as m6,renameSync as c6,rmSync as a$,statSync as x4,unlinkSync as i$}from"fs";import{join as v0}from"path";function I3(){let $=Y0(m1()),Z=Y0(S0())||Y0(a()),K;if(!$&&!Z)K="not-needed";else if($&&!Z)K="pending";else if(!$&&Z)K="complete";else K="partial";return{legacyExists:$,newExists:Z,status:K}}function T3(){let $=m1();if(!Y0($))return!1;let Z=v0($,"memory.db");if(!Y0(Z))return!1;let K=J1();if(!Y0(K))return!0;let X=x4(Z).size,Y=x4(K).size;return X>Y}function l$($){for(let Z of["-wal","-shm"]){let K=$+Z;if(Y0(K))i$(K)}}function u6($,Z){for(let K of Z)if(K.isDir&&Y0(K.source)&&Y0(K.dest))try{a$(K.source,{recursive:!0})}catch{}try{if(m6($).length===0)a$($,{recursive:!0})}catch{}}function R3(){let $=m1();if(!Y0($))return{migrated:!1,itemsMoved:[],errors:[]};let Z=[{name:"memory.db",source:v0($,"memory.db"),dest:J1(),isDir:!1},{name:"config.json",source:v0($,"config.json"),dest:u1(),isDir:!1},{name:"sync-checkpoint.json",source:v0($,"sync-checkpoint.json"),dest:l1(),isDir:!1},{name:"logs",source:v0($,"logs"),dest:X0(),isDir:!0},{name:"hooks",source:v0($,"hooks"),dest:d1(),isDir:!0},{name:"backups",source:v0($,"backups"),dest:p1(),isDir:!0}];try{n$(S0(),{recursive:!0}),n$(a(),{recursive:!0})}catch(Q){let G=A(Q);return{migrated:!1,itemsMoved:[],errors:[`Failed to create target directories: ${G}`]}}let K=[],X=[];for(let Q of Z){if(!Y0(Q.source))continue;if(Y0(Q.dest)){if(Q.isDir)continue;let G=x4(Q.source).size;if(x4(Q.dest).size>=G){if(i$(Q.source),Q.source.endsWith(".db"))l$(Q.source);X.push(Q.name);continue}if(Q.dest.endsWith(".db"))l$(Q.dest)}try{if(L3(Q.source,Q.dest,Q.isDir),K.push({item:Q,rolledBack:!1}),X.push(Q.name),Q.source.endsWith(".db"))l$(Q.source)}catch(G){let _=A(G),J=[`Failed to move ${Q.name}: ${_}`];for(let H=K.length-1;H>=0;H--){let V=K[H];try{L3(V.item.dest,V.item.source,V.item.isDir),V.rolledBack=!0}catch(B){let z=A(B);J.push(`Rollback failed for ${V.item.name}: ${z}`)}}return{migrated:!1,itemsMoved:[],errors:J}}}if(X.length===0)return{migrated:!1,itemsMoved:[],errors:[]};let Y=[];try{r0(),i0()}catch(Q){let G=A(Q);Y.push(`hook re-install failed: ${G}`)}return u6($,Z),process.stderr.write(`Migrated data from ~/.memory-nexus to new paths
6
- `),{migrated:!0,itemsMoved:X,errors:Y}}function L3($,Z,K){let X=v0(Z,"..");n$(X,{recursive:!0});try{c6($,Z)}catch(Y){if(Y.code==="EXDEV")if(K)g6($,Z,{recursive:!0}),a$($,{recursive:!0});else h6($,Z),i$($);else throw Y}}var r$=L(()=>{l();p$()});class O0{_id;_projectPath;_startTime;_endTime;_messages;_summary;_messageCount;constructor($){this._id=$.id,this._projectPath=$.projectPath,this._startTime=new Date($.startTime.getTime()),this._endTime=$.endTime?new Date($.endTime.getTime()):void 0,this._messages=Object.freeze([...$.messages??[]]),this._summary=$.summary,this._messageCount=$.messageCount}static create($){if(!$.id||$.id.trim()==="")throw Error("Session ID cannot be empty");if($.endTime&&$.endTime<$.startTime)throw Error("End time cannot be before start time");return new O0($)}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($){return this._id===$._id}addMessage($){return new O0({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages,$],summary:this._summary})}complete($){if($<this._startTime)throw Error("End time cannot be before start time");return new O0({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:$,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary($){return new O0({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:$,messageCount:this._messageCount})}}class J0{_id;_role;_content;_timestamp;_toolUseIds;constructor($){this._id=$.id,this._role=$.role,this._content=$.content,this._timestamp=new Date($.timestamp.getTime()),this._toolUseIds=Object.freeze([...$.toolUseIds??[]])}static create($){if(!$.id||$.id.trim()==="")throw Error("Message ID cannot be empty");if(!d6.includes($.role))throw Error("Invalid message role");return new J0($)}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($){return this._id===$._id}addToolUse($){return new J0({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,$]})}}var d6;var o1=L(()=>{d6=["user","assistant"]});class U0{_id;_name;_input;_timestamp;_status;_result;constructor($){this._id=$.id,this._name=$.name,this._input=structuredClone($.input),this._timestamp=new Date($.timestamp.getTime()),this._status=$.status??"pending",this._result=$.result}static create($){if(!$.id||$.id.trim()==="")throw Error("Tool use ID cannot be empty");if(!$.name||$.name.trim()==="")throw Error("Tool name cannot be empty");if($.status&&!p6.includes($.status))throw Error("Invalid tool use status");return new U0($)}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($){return this._id===$._id}completeSuccess($){return new U0({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:$})}completeError($){return new U0({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:$})}}var p6;var E4=L(()=>{p6=["pending","success","error"]});class Q0{_id;_sessionPath;_startedAt;_status;_completedAt;_messagesExtracted;_errorMessage;_fileMtime;_fileSize;constructor($){this._id=$.id,this._sessionPath=$.sessionPath,this._startedAt=new Date($.startedAt.getTime()),this._status=$.status??"pending",this._completedAt=$.completedAt?new Date($.completedAt.getTime()):void 0,this._messagesExtracted=$.messagesExtracted??0,this._errorMessage=$.errorMessage,this._fileMtime=$.fileMtime?new Date($.fileMtime.getTime()):void 0,this._fileSize=$.fileSize}static create($){if(!$.id||$.id.trim()==="")throw Error("Extraction state ID cannot be empty");if(!$.sessionPath||$.sessionPath.trim()==="")throw Error("Session path cannot be empty");if($.status&&!l6.includes($.status))throw Error("Invalid extraction status");if($.messagesExtracted!==void 0&&$.messagesExtracted<0)throw Error("Messages extracted cannot be negative");if($.fileSize!==void 0&&$.fileSize<0)throw Error("File size cannot be negative");return new Q0($)}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($){return this._id===$._id}startProcessing(){return new Q0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"in_progress",messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}complete($){return new Q0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"complete",completedAt:$,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}fail($){return new Q0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"error",errorMessage:$,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}incrementMessages($=1){return new Q0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted+$,errorMessage:this._errorMessage,fileMtime:this._fileMtime,fileSize:this._fileSize})}withFileMetadata($,Z){if(Z<0)throw Error("File size cannot be negative");return new Q0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted,errorMessage:this._errorMessage,fileMtime:$,fileSize:Z})}}var l6;var P4=L(()=>{l6=["pending","in_progress","complete","error"]});var F;var F3=L(()=>{F={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 j;var M3=L(()=>{j=class j extends Error{code;context;constructor($,Z,K){super(Z);if(this.name="MemoryError",this.code=$,this.context=K,Error.captureStackTrace)Error.captureStackTrace(this,j)}toJSON(){let $={error:{code:this.code,message:this.message}};if(this.context&&Object.keys(this.context).length>0)$.error.context=this.context;return $}}});var H0=L(()=>{F3();M3()});var t1=()=>{};var t$=L(()=>{t1()});var j3={};y(j3,{computeModelHash:()=>s$,EmbeddingService:()=>e$});import{createHash as a6}from"crypto";function s$($){let Z=`${$.provider}:${$.model}:${$.dimensions}`;return a6("sha256").update(Z).digest("hex").slice(0,16)}class e${repository;provider;batchSize;modelHash;modelName;redactor;constructor($){this.repository=$.repository,this.provider=$.provider,this.batchSize=$.config.batchSize,this.modelHash=s$($.config),this.modelName=$.config.model,this.redactor=$.redactor??i6}checkModelState(){let $=this.repository.getStoredModelHash(),Z=this.modelHash,K=this.modelName;if($===null)return{modelChanged:!1,needsReEmbed:!1,currentHash:Z,currentModelName:K};if($===Z)return{modelChanged:!1,needsReEmbed:!1,currentHash:Z,currentModelName:K};let X=this.repository.getStoredModelName()??$;return{modelChanged:!0,needsReEmbed:!0,storedHash:$,currentHash:Z,storedModelName:X,currentModelName:K,embeddedCount:this.repository.getEmbeddedCount()}}async embedUnembedded($={}){let Z=Date.now(),K=0,X=this.repository.getTotalMessageCount()-this.repository.getEmbeddedCount();if(X<=0)return{embedded:0,skipped:0,durationMs:0,rate:0};let Y=this.repository.findUnembedded(this.batchSize);while(Y.length>0){let _=Y.map((V)=>this.redactor.redactText(V.content).text),J=await this.provider.embedBatch(_),H=Y.map((V,B)=>({rowid:V.rowid,embedding:J[B].embedding}));this.repository.storeBatch(H,this.modelHash,this.modelName),K+=Y.length,$.onProgress?.({current:K,total:X}),Y=this.repository.findUnembedded(this.batchSize)}let Q=Date.now()-Z,G=Q>0?K/(Q/1000):0;return{embedded:K,skipped:0,durationMs:Q,rate:G}}async clearAndReembed($={}){return this.repository.clearAllEmbeddings(),this.embedUnembedded($)}}var i6;var $9=L(()=>{i6={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})}});function Y9($,Z,K){let X=new Map;for(let Q of $){let G=X.get(Q.rowid)??{rowid:Q.rowid,rrfScore:0,normalizedScore:0,sources:[]};G.rrfScore+=1/(60+Q.rank),G.sources.push({source:"fts",rank:Q.rank,rawScore:Q.rawScore}),X.set(Q.rowid,G)}for(let Q of Z){let G=X.get(Q.rowid)??{rowid:Q.rowid,rrfScore:0,normalizedScore:0,sources:[]};G.rrfScore+=1/(60+Q.rank),G.sources.push({source:"vector",rank:Q.rank,rawScore:Q.rawScore}),X.set(Q.rowid,G)}let Y=Array.from(X.values()).sort((Q,G)=>G.rrfScore-Q.rrfScore);if(Y=Y.filter((Q)=>Q.rrfScore>=0.001),Y=Y.slice(0,K),Y.length>0){let Q=Y[0].rrfScore;if(Q>0)for(let G of Y)G.normalizedScore=G.rrfScore/Q}return Y}function o0($){let Z=($.match(/"/g)||[]).length,K=Z>0&&Z%2===0,X;if(K)X=$.replace(/[.:\-()[\]{}^~@/\\]/gu," ").replace(/\s+/g," ").trim();else X=$.replace(/[.:\-()[\]{}^"~@/\\]/gu," ").replace(/\s+/g," ").trim();if(X)return X;let Y=($.match(/"/g)||[]).length,G=Y>0&&Y%2===0?/[.:\-()[\]{}^~@/\\]/gu:/[.:\-()[\]{}^"~@/\\]/gu;return $.replace(G," ").replace(/\s+/g," ").trim()}class t0{_id;_filePath;_fileType;_projectEncoded;_content;_contentHash;_lastIndexedAt;_createdAt;constructor($){this._id=$.id,this._filePath=$.filePath,this._fileType=$.fileType,this._projectEncoded=$.projectEncoded,this._content=$.content,this._contentHash=$.contentHash,this._lastIndexedAt=new Date($.lastIndexedAt.getTime()),this._createdAt=$.createdAt?new Date($.createdAt.getTime()):new Date}static create($){if(!$.filePath||$.filePath.trim()==="")throw Error("File path cannot be empty");if(!$.content||$.content.trim()==="")throw Error("Content cannot be empty");if(!t6.test($.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!E3.includes($.fileType))throw Error(`Invalid file type: "${$.fileType}". Must be one of: ${E3.join(", ")}`);return new t0($)}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 E3,t6;var S4=L(()=>{E3=["daily_log","decisions","learnings","user_prefs"],t6=/^[a-f0-9]{64}$/});class C0{_id;_description;_severity;_category;_status;_tool;_tags;_lastReviewedAt;_context;_sourceProject;_loggedAt;_resolvedAt;_resolution;constructor($){this._id=$.id,this._description=$.description.trim(),this._severity=$.severity,this._category=$.category,this._status=$.status,this._tool=$.tool,this._tags=$.tags?[...$.tags]:void 0,this._lastReviewedAt=$.lastReviewedAt?new Date($.lastReviewedAt.getTime()):void 0,this._context=$.context,this._sourceProject=$.sourceProject,this._loggedAt=new Date($.loggedAt.getTime()),this._resolvedAt=$.resolvedAt?new Date($.resolvedAt.getTime()):void 0,this._resolution=$.resolution}static create($){if(!$.description||$.description.trim()==="")throw Error("Description cannot be empty");if(!P3.includes($.severity))throw Error(`Invalid severity: "${$.severity}". Must be one of: ${P3.join(", ")}`);if(!$.category||$.category.trim()==="")throw Error("Category cannot be empty");if(!D3.includes($.status))throw Error(`Invalid status: "${$.status}". Must be one of: ${D3.join(", ")}`);if(!$.tool||$.tool.trim()==="")throw Error("Tool cannot be empty");if($.status==="open"&&$.resolvedAt)throw Error("Open entries cannot have a resolvedAt date");return new C0($)}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 P3,D3;var C4=L(()=>{P3=["low","medium","high","critical"],D3=["open","resolved","wont-fix"]});class y0{_sessionId;_backfilledAt;_dailyLogPath;_success;_errorMessage;constructor($){this._sessionId=$.sessionId,this._backfilledAt=new Date($.backfilledAt.getTime()),this._dailyLogPath=$.dailyLogPath,this._success=$.success??!0,this._errorMessage=$.errorMessage}static create($){if(!$.sessionId||$.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!$.dailyLogPath||$.dailyLogPath.trim()==="")throw Error("Daily log path cannot be empty");return new y0($)}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 k3={};y(k3,{BackfillService:()=>Q9});class Q9{sessionRepo;messageRepo;backfillStateRepo;summaryGenerator;dailyLogWriter;constructor($,Z,K,X,Y){this.sessionRepo=$;this.messageRepo=Z;this.backfillStateRepo=K;this.summaryGenerator=X;this.dailyLogWriter=Y}async dryRun($={}){let Z=await this.getUnprocessedSessions($.project);return{unprocessedCount:Z.length,estimatedCost:Z.length*Z7}}async backfill($={}){let{batch:Z=50,project:K,onProgress:X}=$,Q=(await this.getUnprocessedSessions(K)).slice(0,Z),G={sessionsProcessed:0,sessionsFailed:0,sessionsSkipped:0,dailyLogsCreated:0,dailyLogsUpdated:0,errors:[]};for(let _=0;_<Q.length;_++){let J=Q[_];if(!J)continue;if(await this.backfillStateRepo.findBySessionId(J.id)){G.sessionsSkipped++,X?.({current:_+1,total:Q.length,sessionId:J.id,action:"skipped"});continue}try{X?.({current:_+1,total:Q.length,sessionId:J.id,action:"processing"});let V=await this.extractContent(J.id),B=J.projectPath.decoded,z=B.split(/[/\\]/).filter(Boolean).pop()??B,W=await this.summaryGenerator.generateSummary(V,J.id,z,J.startTime.toISOString(),J.endTime?.toISOString()??J.startTime.toISOString()),q=`daily/${J.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(q,W+`
7
-
8
- `))G.dailyLogsCreated++;else G.dailyLogsUpdated++;await this.backfillStateRepo.save(y0.create({sessionId:J.id,backfilledAt:new Date,dailyLogPath:q,success:!0})),G.sessionsProcessed++}catch(V){let B=A(V);G.sessionsFailed++,G.errors.push({sessionId:J.id,error:B});let z=J.startTime.toISOString().slice(0,10);await this.backfillStateRepo.save(y0.create({sessionId:J.id,backfilledAt:new Date,dailyLogPath:`daily/${z}.md`,success:!1,errorMessage:B})),X?.({current:_+1,total:Q.length,sessionId:J.id,action:"error"})}}return G}async getUnprocessedSessions($){let Z=await this.sessionRepo.findFiltered({projectFilter:$,limit:1e4}),K=[];for(let X of Z)if(!await this.backfillStateRepo.findBySessionId(X.id))K.push(X);return K.sort((X,Y)=>X.startTime.getTime()-Y.startTime.getTime()),K}async extractContent($){let K=(await this.messageRepo.findBySession($)).filter((Y)=>Y.role==="user"||Y.role==="assistant"),X="";for(let Y of K){let G=`${Y.role==="user"?"User":"Assistant"}: ${Y.content}
9
-
10
- `;if(X.length+G.length>K7){X+=`... [content truncated]
11
- `;break}X+=G}return X}}var Z7=0.001,K7=16000;var G9=()=>{};function _9($,Z,K=4){if(Z<=0){let H=$.map((B)=>({...B,truncatedContent:B.content,allocated:B.content.length===0?0:Math.ceil(B.content.length/K),truncated:!1})),V=H.reduce((B,z)=>B+z.allocated,0);return{sections:H,totalTokensUsed:V,budgetExceeded:!1}}let X=Z*K,Y=[...$].sort((H,V)=>H.priority-V.priority),Q=X,G=[],_=!1;for(let H of Y){if(H.content.length===0){G.push({...H,truncatedContent:"",allocated:0,truncated:!1});continue}if(Q<=0){G.push({...H,truncatedContent:"",allocated:0,truncated:!0}),_=!0;continue}let V=H.content.length;if(V<=Q){let B=Math.ceil(V/K);G.push({...H,truncatedContent:H.content,allocated:B,truncated:!1}),Q-=V}else{let B=H.content.slice(0,Q),z=Math.ceil(Q/K);G.push({...H,truncatedContent:B,allocated:z,truncated:!0}),Q=0,_=!0}}let J=G.reduce((H,V)=>H+V.allocated,0);return{sections:G,totalTokensUsed:J,budgetExceeded:_}}var S3={};y(S3,{SmartContextService:()=>e1});function Y7($){if($.length===0)return 0;return Math.ceil($.length/X7)}function Q7($){return`#${$.id} (${$.severity}/${$.category}): ${$.description}`}class e1{projectResolver;factRepo;frictionRepo;getSessionSummary;constructor($){if(this.projectResolver=$.projectResolver,this.factRepo=$.factRepo,this.frictionRepo=$.frictionRepo,$.getSessionSummary)this.getSessionSummary=$.getSessionSummary}async getContext($){let Z=this.projectResolver.resolveProjectEncoded($.projectFilter),K=this.projectResolver.resolveProjectName($.projectFilter);if(!Z||!K)return null;let Y=(await this.factRepo.findByProject(K)).filter((W)=>W.supersededAt===null),Q=(W)=>{return W.map((N)=>`- ${N.content}`).join(`
12
- `)},G=[],_=Y.filter((W)=>W.type==="decision");if(_.length>0)G.push(this.buildSection("decisions","Active Decisions",1,Q(_)));let J=Y.filter((W)=>W.type==="learning");if(J.length>0)G.push(this.buildSection("learnings","Recent Learnings",2,Q(J)));let H=Y.filter((W)=>W.type==="preference");if(H.length>0)G.push(this.buildSection("preferences","User Preferences",3,Q(H)));let V=Y.filter((W)=>W.type==="observation");if(V.length>0)G.push(this.buildSection("observations","Observations",4,Q(V)));if($.crossProject){let N=(await this.factRepo.findAll()).filter((U)=>U.supersededAt===null&&U.project!==K),q=N.filter((U)=>U.type==="preference");if(q.length>0)G.push(this.buildSection("cross_project_preferences","Global/Cross-Project User Preferences",5,Q(q)));let I=N.filter((U)=>U.type==="decision");if(I.length>0)G.push(this.buildSection("cross_project_decisions","Cross-Project Decisions",6,Q(I)));let T=N.filter((U)=>U.type==="learning");if(T.length>0)G.push(this.buildSection("cross_project_learnings","Cross-Project Learnings",7,Q(T)))}let B=await this.buildFrictionContent($.projectFilter);if(B)G.push(this.buildSection("friction","Open Friction",8,B));if(this.getSessionSummary){let W=await this.getSessionSummary($.projectFilter,$.days);if(W)G.push(this.buildSection("session_summary","Session Summary",9,W))}if($.budget&&$.budget>0)return this.applyBudget(K,Z,G,$.budget);let z=G.reduce((W,N)=>W+N.tokenEstimate,0);return{projectName:K,projectEncoded:Z,sections:G,totalTokensEstimate:z,truncated:!1}}buildSection($,Z,K,X){return{key:$,title:Z,priority:K,content:X,truncated:!1,tokenEstimate:Y7(X)}}async buildFrictionContent($){let Z=await this.frictionRepo.findOpen();if(Z.length===0)return null;let K=Z.filter((Y)=>Y.description.includes($)||Y.context&&Y.context.includes($));return(K.length>0?K:Z).map(Q7).join(`
13
- `)}applyBudget($,Z,K,X){let Y=K.map((_)=>({key:_.key,priority:_.priority,content:_.content})),Q=_9(Y,X),G=Q.sections.map((_)=>{let J=K.find((H)=>H.key===_.key);return{key:_.key,title:J.title,priority:_.priority,content:_.truncatedContent,truncated:_.truncated,tokenEstimate:_.allocated}});return{projectName:$,projectEncoded:Z,sections:G,totalTokensEstimate:Q.totalTokensUsed,truncated:Q.budgetExceeded}}}var X7=4;var w4=()=>{};var v3={};y(v3,{AmbientContextService:()=>J9});class J9{smartContext;contextWriter;formatter;constructor($,Z,K){this.smartContext=$;this.contextWriter=Z;this.formatter=K}async generateAmbientContext($){let Z=await this.smartContext.getContext({projectFilter:$.projectName,budget:$.budget,crossProject:!0});if(Z===null)return{success:!1,reason:"project-not-found"};if(Z.sections.length===0)return{success:!1,reason:"no-context"};let K=this.formatter.formatSmartContext(Z),X=this.buildSummaryBlock(Z);return await this.contextWriter.writeContextFile($.autoMemoryDir,K),await this.contextWriter.updateMemoryBlock($.autoMemoryDir,X),{success:!0,contextTokens:Z.totalTokensEstimate}}buildSummaryBlock($){let Z=this.countSectionLines($.sections,"decisions"),K=this.countSectionLines($.sections,"learnings"),X=this.countSectionLines($.sections,"friction"),Y=new Date().toISOString().split("T")[0];return["## Cross-Project Context",`Run \`memory context ${$.projectName}\` for full briefing. See [context.md](context.md) for latest snapshot.`,`- ${Z} active decisions, ${K} learnings`,`- Open friction: ${X}`,`- Last synced: ${Y}`].join(`
14
- `)}countSectionLines($,Z){let K=$.find((X)=>X.key===Z);if(!K||!K.content)return 0;return K.content.split(`
15
- `).filter((X)=>X.trim().length>0).length}}var y3={};y(y3,{trackDownloadTotal:()=>V7,isUnicodeSupported:()=>C3,getBarCharacters:()=>b4,createProgressReporter:()=>z9,createModelDownloadHandler:()=>W7,createEmbeddingProgressReporter:()=>H7,TtyProgressReporter:()=>V9,TtyEmbeddingProgressReporter:()=>A9,QuietProgressReporter:()=>B9,QuietEmbeddingProgressReporter:()=>q9,PlainProgressReporter:()=>W9,PlainEmbeddingProgressReporter:()=>N9});import H9 from"cli-progress";function C3(){let{env:$}=process;if(process.platform!=="win32")return $.TERM!=="linux";return Boolean($.MSYSTEM)||Boolean($.WT_SESSION)||Boolean($.TERMINUS_SUBLIME)||$.ConEmuTask==="{cmd::Cmder}"||$.TERM_PROGRAM==="vscode"||$.TERM==="xterm-256color"||$.TERM==="alacritty"||$.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function b4(){return C3()?_7:J7}class V9{bar;verbose;total=0;currentValue=0;constructor($=!1){this.verbose=$;let Z=b4();this.bar=new H9.SingleBar({format:"Syncing |{bar}| {percentage}% | {value}/{total} sessions",barCompleteChar:Z.complete,barIncompleteChar:Z.incomplete,hideCursor:!0})}start($){this.total=$,this.currentValue=0,this.bar.start($,0)}update($,Z){if(this.currentValue=$,this.bar.update($),this.verbose)this.bar.stop(),console.log(` Processing: ${Z}`),this.bar.start(this.total,$)}stop(){this.bar.stop()}log($){if(this.verbose)this.bar.stop(),console.log($),this.bar.start(this.total,this.currentValue)}}class W9{verbose;constructor($=!1){this.verbose=$}start($){console.log(`Processing ${$} sessions...`)}update($,Z){if(this.verbose)console.log(` [${$}] Processing: ${Z}`)}stop(){console.log("Done.")}log($){if(this.verbose)console.log($)}}class B9{start($){}update($,Z){}stop(){}log($){}}function z9($){if($.quiet)return new B9;if(!process.stdout.isTTY)return new W9($.verbose);return new V9($.verbose)}class A9{bar;constructor(){let $=b4();this.bar=new H9.SingleBar({format:"Embedding |{bar}| {percentage}% | {value}/{total} messages | ETA: {eta_formatted}",barCompleteChar:$.complete,barIncompleteChar:$.incomplete,hideCursor:!0,etaBuffer:20})}start($){this.bar.start($,0)}update($){this.bar.update($)}stop(){this.bar.stop()}}class N9{start($){console.log(`Embedding ${$} messages...`)}update($){}stop(){console.log("Done.")}}class q9{start($){}update($){}stop(){}}function H7($){if($.quiet)return new q9;if(!process.stdout.isTTY)return new N9;return new A9}function V7($,Z){let K=Math.round(Z/1048576);return K>$?K:$}function W7($){if($.quiet||!process.stdout.isTTY){let Q=!1;return(G)=>{if(!Q&&G.status==="downloading"&&!$.quiet)console.log("Downloading embedding model (one-time setup)..."),Q=!0}}let Z=b4(),K=new H9.SingleBar({format:"Downloading model |{bar}| {percentage}% | {value}/{total} MB",barCompleteChar:Z.complete,barIncompleteChar:Z.incomplete,hideCursor:!0}),X=!1,Y=0;return(Q)=>{if(Q.status==="downloading"){let G=Math.round(Q.loaded/1048576),_=Math.round(Q.total/1048576);if(_>Y)Y=_;if(!X&&Y>0)K.start(Y,G),X=!0;else if(X){if(_>0&&K.getTotal()!==Y)K.setTotal(Y);K.update(G)}}else if(Q.status==="ready"&&X)K.stop()}}var _7,J7;var O9=L(()=>{_7={complete:"\u2588",incomplete:"\u2591"},J7={complete:"#",incomplete:"-"}});function $4($){try{return $.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),$.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function f4($,Z){let{sqliteVecAvailable:K=!1}=Z??{};if(!$4($))throw Error("FTS5 extension is not available. Ensure you are using Bun with FTS5 support enabled.");try{let Q=$.prepare("PRAGMA table_info(friction_log)").all();if(!Q.some((_)=>_.name==="tool")&&Q.length>0)$.exec(`
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
+ `),{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 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
+
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
+
10
+ `;if($.length+Y.length>GY){$+=`... [content truncated]
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
+ `)},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
+ `)}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
+ `)}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
+ `)}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
+ `)}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 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(`
16
18
  CREATE TABLE friction_log_new (
17
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
18
20
  description TEXT NOT NULL,
@@ -37,13 +39,13 @@ CREATE INDEX IF NOT EXISTS idx_friction_status ON friction_log(status);
37
39
  CREATE INDEX IF NOT EXISTS idx_friction_severity ON friction_log(severity);
38
40
  CREATE INDEX IF NOT EXISTS idx_friction_category ON friction_log(category);
39
41
  CREATE INDEX IF NOT EXISTS idx_friction_tool ON friction_log(tool);
40
- `)}catch{}for(let Q of U9)$.exec(Q);if(!$.prepare("PRAGMA table_info(embedding_state)").all().some((Q)=>Q.name==="model_name"))$.exec(`
42
+ `)}catch{}for(let Z of I5)A.exec(Z);if(!A.prepare("PRAGMA table_info(embedding_state)").all().some((Z)=>Z.name==="model_name"))A.exec(`
41
43
  ALTER TABLE embedding_state ADD COLUMN model_name TEXT NOT NULL DEFAULT '';
42
- `);if(K)$.exec(`
44
+ `);if(G)A.exec(`
43
45
  CREATE VIRTUAL TABLE IF NOT EXISTS message_embeddings USING vec0(
44
46
  embedding float[384]
45
47
  );
46
- `)}var w3=`
48
+ `)}var D6=`
47
49
  CREATE TABLE IF NOT EXISTS sessions (
48
50
  id TEXT PRIMARY KEY,
49
51
  project_path_encoded TEXT NOT NULL,
@@ -58,7 +60,7 @@ CREATE TABLE IF NOT EXISTS sessions (
58
60
  );
59
61
  CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path_encoded);
60
62
  CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time);
61
- `,b3=`
63
+ `,x6=`
62
64
  CREATE TABLE IF NOT EXISTS messages_meta (
63
65
  rowid INTEGER PRIMARY KEY AUTOINCREMENT,
64
66
  id TEXT UNIQUE NOT NULL,
@@ -71,14 +73,14 @@ CREATE TABLE IF NOT EXISTS messages_meta (
71
73
  );
72
74
  CREATE INDEX IF NOT EXISTS idx_messages_session ON messages_meta(session_id);
73
75
  CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages_meta(timestamp);
74
- `,f3=`
76
+ `,P6=`
75
77
  CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
76
78
  content,
77
79
  content=messages_meta,
78
80
  content_rowid=rowid,
79
81
  tokenize='porter unicode61'
80
82
  );
81
- `,h3=`
83
+ `,y6=`
82
84
  CREATE TABLE IF NOT EXISTS tool_uses (
83
85
  id TEXT PRIMARY KEY,
84
86
  session_id TEXT NOT NULL,
@@ -91,7 +93,7 @@ CREATE TABLE IF NOT EXISTS tool_uses (
91
93
  );
92
94
  CREATE INDEX IF NOT EXISTS idx_tool_uses_session ON tool_uses(session_id);
93
95
  CREATE INDEX IF NOT EXISTS idx_tool_uses_name ON tool_uses(name);
94
- `,g3=`
96
+ `,k6=`
95
97
  CREATE TABLE IF NOT EXISTS links (
96
98
  id INTEGER PRIMARY KEY AUTOINCREMENT,
97
99
  source_type TEXT NOT NULL CHECK (source_type IN ('session', 'message', 'topic')),
@@ -104,14 +106,14 @@ CREATE TABLE IF NOT EXISTS links (
104
106
  );
105
107
  CREATE INDEX IF NOT EXISTS idx_links_source ON links(source_type, source_id);
106
108
  CREATE INDEX IF NOT EXISTS idx_links_target ON links(target_type, target_id);
107
- `,m3=`
109
+ `,h6=`
108
110
  CREATE TABLE IF NOT EXISTS topics (
109
111
  id INTEGER PRIMARY KEY AUTOINCREMENT,
110
112
  name TEXT UNIQUE NOT NULL,
111
113
  created_at TEXT DEFAULT (datetime('now'))
112
114
  );
113
115
  CREATE INDEX IF NOT EXISTS idx_topics_name ON topics(name);
114
- `,c3=`
116
+ `,v6=`
115
117
  CREATE TABLE IF NOT EXISTS extraction_state (
116
118
  id TEXT PRIMARY KEY,
117
119
  session_path TEXT UNIQUE NOT NULL,
@@ -125,7 +127,7 @@ CREATE TABLE IF NOT EXISTS extraction_state (
125
127
  );
126
128
  CREATE INDEX IF NOT EXISTS idx_extraction_session_path ON extraction_state(session_path);
127
129
  CREATE INDEX IF NOT EXISTS idx_extraction_status ON extraction_state(status);
128
- `,u3=`
130
+ `,w6=`
129
131
  CREATE TABLE IF NOT EXISTS embedding_state (
130
132
  message_id INTEGER PRIMARY KEY,
131
133
  embedded_at TEXT NOT NULL,
@@ -133,13 +135,13 @@ CREATE TABLE IF NOT EXISTS embedding_state (
133
135
  FOREIGN KEY (message_id) REFERENCES messages_meta(rowid) ON DELETE CASCADE
134
136
  );
135
137
  CREATE INDEX IF NOT EXISTS idx_embedding_state_model ON embedding_state(model_hash);
136
- `,d3=`
138
+ `,C6=`
137
139
  CREATE VIRTUAL TABLE IF NOT EXISTS message_embeddings USING vec0(
138
140
  embedding float[384]
139
141
  );
140
- `,p3=`
142
+ `,b6=`
141
143
  ALTER TABLE embedding_state ADD COLUMN model_name TEXT NOT NULL DEFAULT '';
142
- `,l3=`
144
+ `,f6=`
143
145
  CREATE TABLE IF NOT EXISTS friction_log (
144
146
  id INTEGER PRIMARY KEY AUTOINCREMENT,
145
147
  description TEXT NOT NULL,
@@ -159,7 +161,7 @@ CREATE INDEX IF NOT EXISTS idx_friction_status ON friction_log(status);
159
161
  CREATE INDEX IF NOT EXISTS idx_friction_severity ON friction_log(severity);
160
162
  CREATE INDEX IF NOT EXISTS idx_friction_category ON friction_log(category);
161
163
  CREATE INDEX IF NOT EXISTS idx_friction_tool ON friction_log(tool);
162
- `,n3=`
164
+ `,g6=`
163
165
  CREATE TABLE IF NOT EXISTS backfill_state (
164
166
  session_id TEXT PRIMARY KEY,
165
167
  backfilled_at TEXT NOT NULL,
@@ -167,7 +169,123 @@ CREATE TABLE IF NOT EXISTS backfill_state (
167
169
  success INTEGER DEFAULT 1,
168
170
  error_message TEXT
169
171
  );
170
- `,U9;var L9=L(()=>{U9=[`
172
+ `,c6=`
173
+ CREATE TABLE IF NOT EXISTS memory_governance (
174
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
175
+ surface TEXT NOT NULL CHECK (surface IN ('fact', 'context', 'provider_egress', 'remote_sync', 'friction', 'evaluation', 'persona', 'graph', 'ranking', 'dream', 'projection')),
176
+ target_id TEXT NOT NULL,
177
+ project TEXT,
178
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
179
+ source_event_ids TEXT NOT NULL,
180
+ transformation_method TEXT NOT NULL,
181
+ actor TEXT NOT NULL,
182
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
183
+ redaction_state TEXT NOT NULL CHECK (redaction_state IN ('none', 'redacted', 'quarantined')),
184
+ consent_status TEXT NOT NULL CHECK (consent_status IN ('not_required', 'granted', 'denied', 'revoked')),
185
+ consent_scopes TEXT NOT NULL,
186
+ scope TEXT NOT NULL,
187
+ status TEXT NOT NULL CHECK (status IN ('active', 'pending_review', 'suppressed', 'invalidated', 'expired')),
188
+ status_reason TEXT,
189
+ created_at TEXT NOT NULL,
190
+ updated_at TEXT NOT NULL,
191
+ reviewed_at TEXT,
192
+ expires_at TEXT,
193
+ last_event_id TEXT,
194
+ UNIQUE(surface, target_id)
195
+ );
196
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_surface ON memory_governance(surface);
197
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_project ON memory_governance(project);
198
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_status ON memory_governance(status);
199
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_target ON memory_governance(surface, target_id);
200
+ `,u6=`
201
+ CREATE TABLE IF NOT EXISTS memory_governance_events (
202
+ event_id TEXT PRIMARY KEY,
203
+ kind TEXT NOT NULL CHECK (kind IN ('governance', 'consent')),
204
+ control TEXT NOT NULL,
205
+ surface TEXT NOT NULL,
206
+ target_id TEXT NOT NULL,
207
+ actor TEXT NOT NULL,
208
+ reason TEXT,
209
+ occurred_at TEXT NOT NULL,
210
+ payload TEXT NOT NULL
211
+ );
212
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_events_target ON memory_governance_events(surface, target_id);
213
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_events_occurred ON memory_governance_events(occurred_at);
214
+ `,m6=`
215
+ CREATE TABLE IF NOT EXISTS persona_entries (
216
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
217
+ entry_id TEXT UNIQUE NOT NULL,
218
+ kind TEXT NOT NULL CHECK (kind IN ('preference', 'procedure', 'correction', 'decision_pattern', 'friction_pattern')),
219
+ content TEXT NOT NULL,
220
+ project TEXT,
221
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
222
+ source_event_ids TEXT NOT NULL,
223
+ source_kinds TEXT NOT NULL,
224
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
225
+ scope TEXT NOT NULL,
226
+ review_status TEXT NOT NULL CHECK (review_status IN ('pending_review', 'reviewed')),
227
+ review_after TEXT NOT NULL,
228
+ expires_at TEXT,
229
+ why TEXT NOT NULL,
230
+ created_at TEXT NOT NULL,
231
+ updated_at TEXT NOT NULL
232
+ );
233
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_project ON persona_entries(project);
234
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_kind ON persona_entries(kind);
235
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_visibility ON persona_entries(visibility);
236
+ `,d6=`
237
+ CREATE TABLE IF NOT EXISTS graph_edges (
238
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
239
+ edge_id TEXT UNIQUE NOT NULL,
240
+ source_type TEXT NOT NULL CHECK (source_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
241
+ source_id TEXT NOT NULL,
242
+ source_label TEXT NOT NULL,
243
+ target_type TEXT NOT NULL CHECK (target_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
244
+ target_id TEXT NOT NULL,
245
+ target_label TEXT NOT NULL,
246
+ relationship TEXT NOT NULL,
247
+ project TEXT,
248
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
249
+ source_event_ids TEXT NOT NULL,
250
+ source_kinds TEXT NOT NULL,
251
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
252
+ valid_from TEXT NOT NULL,
253
+ valid_to TEXT,
254
+ why TEXT NOT NULL,
255
+ metadata TEXT,
256
+ created_at TEXT NOT NULL,
257
+ updated_at TEXT NOT NULL
258
+ );
259
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_edge_id ON graph_edges(edge_id);
260
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_project ON graph_edges(project);
261
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_scope ON graph_edges(project, visibility);
262
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges(source_type, source_id);
263
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges(target_type, target_id);
264
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_relationship ON graph_edges(relationship);
265
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_temporal ON graph_edges(valid_from, valid_to, confidence);
266
+ `,l6=`
267
+ CREATE TABLE IF NOT EXISTS memory_utility_metrics (
268
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
269
+ surface TEXT NOT NULL CHECK (surface IN ('fact', 'persona', 'graph', 'link', 'dream')),
270
+ target_id TEXT NOT NULL,
271
+ project TEXT,
272
+ access_count INTEGER NOT NULL DEFAULT 0 CHECK (access_count >= 0),
273
+ last_accessed_at TEXT,
274
+ last_ranked_at TEXT,
275
+ utility_score REAL NOT NULL DEFAULT 0.5 CHECK (utility_score >= 0 AND utility_score <= 1),
276
+ importance_score REAL NOT NULL DEFAULT 0.5 CHECK (importance_score >= 0 AND importance_score <= 1),
277
+ evergreen INTEGER NOT NULL DEFAULT 0 CHECK (evergreen IN (0, 1)),
278
+ pinned INTEGER NOT NULL DEFAULT 0 CHECK (pinned IN (0, 1)),
279
+ half_life_days REAL CHECK (half_life_days IS NULL OR half_life_days > 0),
280
+ metadata TEXT,
281
+ created_at TEXT NOT NULL,
282
+ updated_at TEXT NOT NULL,
283
+ UNIQUE(surface, target_id)
284
+ );
285
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_target ON memory_utility_metrics(surface, target_id);
286
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_project ON memory_utility_metrics(project);
287
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_rank ON memory_utility_metrics(surface, evergreen, pinned, utility_score, importance_score);
288
+ `,I5;var O5=U(()=>{I5=[`
171
289
  CREATE TABLE IF NOT EXISTS sessions (
172
290
  id TEXT PRIMARY KEY,
173
291
  project_path_encoded TEXT NOT NULL,
@@ -429,65 +547,199 @@ CREATE TABLE IF NOT EXISTS extraction_log (
429
547
  tokens_consumed INTEGER DEFAULT 0,
430
548
  extracted_at TEXT NOT NULL
431
549
  );
432
- `]});class z1{_sourceType;_sourceId;_targetType;_targetId;_relationship;_weight;constructor($){this._sourceType=$.sourceType,this._sourceId=$.sourceId,this._targetType=$.targetType,this._targetId=$.targetId,this._relationship=$.relationship,this._weight=$.weight??1}static create($){if(!$.sourceId||$.sourceId.trim()==="")throw Error("Source ID cannot be empty");if(!$.targetId||$.targetId.trim()==="")throw Error("Target ID cannot be empty");if(!a3.includes($.sourceType))throw Error("Invalid source type");if(!a3.includes($.targetType))throw Error("Invalid target type");if(!B7.includes($.relationship))throw Error("Invalid relationship type");if($.weight!==void 0&&($.weight<0||$.weight>1))throw Error("Weight must be between 0 and 1");return new z1($)}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($){return this.id===$.id}withWeight($){if($<0||$>1)throw Error("Weight must be between 0 and 1");return new z1({sourceType:this._sourceType,sourceId:this._sourceId,targetType:this._targetType,targetId:this._targetId,relationship:this._relationship,weight:$})}}var a3,B7;var I9=L(()=>{a3=["session","message","topic"],B7=["mentions","related_to","continues"]});import{randomUUID as z7}from"crypto";class Z0{_id;_uuid;_type;_project;_content;_metadata;_observedAt;_supersededAt;_supersededBy;constructor($){this._id=$.id,this._uuid=$.uuid??z7(),this._type=$.type,this._project=$.project,this._content=$.content,this._metadata=$.metadata?JSON.parse(JSON.stringify($.metadata)):void 0,this._observedAt=new Date($.observedAt.getTime()),this._supersededAt=$.supersededAt?new Date($.supersededAt.getTime()):null,this._supersededBy=$.supersededBy??null}static create($){if(!$.project||$.project.trim()==="")throw Error("Fact project cannot be empty");if(!$.content||$.content.trim()==="")throw Error("Fact content cannot be empty");if(!["decision","learning","preference","friction","observation","supersedence"].includes($.type))throw Error("Invalid fact type");return new Z0($)}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($){return new Z0({id:$,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($,Z){return new Z0({id:this._id,uuid:this._uuid,type:this._type,project:this._project,content:this._content,metadata:this._metadata,observedAt:this._observedAt,supersededAt:$,supersededBy:Z})}}var Z4=()=>{};var i3=L(()=>{t1();P4();I9();o1();E4();S4();C4();Z4()});class V0{_embedding;_model;_dimensions;constructor($){this._embedding=new Float32Array($.embedding),this._model=$.model,this._dimensions=$.dimensions}static create($){if($.embedding.length===0)throw Error("Embedding cannot be empty");let Z=$.model.trim();if(Z==="")throw Error("Model cannot be empty");if($.dimensions!==$.embedding.length)throw Error(`Dimensions (${$.dimensions}) must match embedding length (${$.embedding.length})`);return new V0({embedding:$.embedding,model:Z,dimensions:$.dimensions})}get embedding(){return new Float32Array(this._embedding)}get model(){return this._model}get dimensions(){return this._dimensions}equals($){if(this._model!==$._model)return!1;if(this._dimensions!==$._dimensions)return!1;for(let Z=0;Z<this._dimensions;Z++)if(this._embedding[Z]!==$._embedding[Z])return!1;return!0}}var r3={};y(r3,{ProjectPath:()=>t});class t{_decoded;_encoded;_projectName;constructor($,Z,K){this._decoded=$,this._encoded=Z,this._projectName=K??this.extractProjectName($)}static fromDecoded($){if(!$||$.trim()==="")throw Error("Path cannot be empty");let Z=t.encode($);return new t($,Z)}static fromEncoded($){if(!$||$.trim()==="")throw Error("Path cannot be empty");let Z=t.decode($);return new t(Z,$)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName($){return new t(this._decoded,this._encoded,$)}equals($){return this._decoded===$._decoded}static encode($){return $.replace(/:\\/g,"--").replace(/\\/g,"-").replace(/\//g,"-").replace(/ /g,"-")}static decode($){if(/^([A-Za-z])--/.test($))return $.replace(/^([A-Za-z])--/,"$1:\\").replace(/-/g,"\\");else return $.replace(/-/g,"/")}extractProjectName($){let Z=$.replace(/[\\/]+$/,"");if(Z===""&&$.startsWith("/"))return"";if(/^[A-Za-z]:$/.test(Z))return Z;let K=Z.split(/[\\/]/);return K[K.length-1]||""}}class K4{_value;constructor($){this._value=$}static from($){let Z=$.trim();if(Z==="")throw Error("Query cannot be empty");return new K4(Z)}get value(){return this._value}equals($){return this._value===$._value}}class W0{_sessionId;_messageId;_snippet;_score;_timestamp;_role;_source;_rawScores;constructor($){this._sessionId=$.sessionId,this._messageId=$.messageId,this._snippet=$.snippet,this._score=$.score,this._timestamp=new Date($.timestamp.getTime()),this._role=$.role,this._source=$.source,this._rawScores=$.rawScores?{...$.rawScores}:void 0}static create($){if(!$.sessionId||$.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!$.messageId||$.messageId.trim()==="")throw Error("Message ID cannot be empty");if(!$.snippet||$.snippet.trim()==="")throw Error("Snippet cannot be empty");if($.score<0||$.score>1)throw Error("Score must be between 0 and 1");if(!$.role||$.role.trim()==="")throw Error("Role cannot be empty");return new W0($)}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($){return this._sessionId===$._sessionId&&this._messageId===$._messageId}compareByScore($){return $._score-this._score}}var T9=()=>{};class w0{static decodeProjectDirectory($){return t.fromEncoded($)}static isEncodedPath($){if(!$||$.length===0)return!1;if(A7.test($))return!0;if(N7.test($))return!0;return!1}static extractProjectName($){return t.fromEncoded($).projectName}static filterEncodedPaths($){return $.filter((Z)=>w0.isEncodedPath(Z))}static translatePath($,Z=process.platform){if(!$||$.trim()==="")return $;if(Z==="win32"){let K=$.match(/^\/mnt\/([a-zA-Z])([\/]?)(.*)$/);if(K){let X=K[1].toUpperCase(),Y=K[3].replace(/\//g,"\\");return`${X}:\\${Y}`}return $}else{let K=$.match(/^([a-zA-Z]):([\\/]?)(.*)$/);if(K){let X=K[1].toLowerCase(),Y=K[3].replace(/\\/g,"/");return`/mnt/${X}/${Y}`}return $}}static resolveExistingPath($,Z,K=process.platform){if(!$)return $;let X=Z??(()=>!1);if(X($))return $;let Y=w0.translatePath($,K);if(X(Y))return Y;return $}}var A7,N7;var h4=L(()=>{T9();A7=/^[A-Za-z]--/,N7=/^-[a-z]/i});var o3=()=>{};var t3=L(()=>{h4();o3()});var g4=L(()=>{i3();T9();t3();H0()});import{Database as q7}from"bun:sqlite";import{existsSync as O7,mkdirSync as U7}from"fs";import{dirname as s3}from"path";function L7($){try{return n0("sqlite-vec").load($),!0}catch{return!1}}function P(){return J1()}function S($){let{path:Z,create:K=!0,applySchema:X=!0,walMode:Y=!0,cacheSize:Q=-64000,busyTimeout:G=5000}=$,_=Z!==":memory:",J=_&&O7(Z),H=$.quickCheck??(_&&J);if(_)try{U7(s3(Z),{recursive:!0})}catch(z){let W=A(z);throw new j(F.DB_CONNECTION_FAILED,`Failed to create database directory: ${W}`,{path:s3(Z)})}let V;try{V=new q7(Z,{create:K})}catch(z){let W=A(z),N=z.code;throw new j(F.DB_CONNECTION_FAILED,`Failed to connect to database: ${W}`,{path:Z,...N?{errno:N}:{}})}let B=(z)=>{V.close();let W=A(z);if(W.includes("not a database")||W.includes("SQLITE_NOTADB"))throw new j(F.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:Z});throw new j(F.DB_CONNECTION_FAILED,`Failed to initialize database: ${W}`,{path:Z})};try{V.exec("PRAGMA foreign_keys = ON;");let z=!1;if(Y&&_){V.exec("PRAGMA journal_mode = WAL;");let q=V.query("PRAGMA journal_mode;").get();if(z=q.journal_mode==="wal",!z)console.warn(`Warning: WAL mode not enabled. Current mode: ${q.journal_mode}`)}V.exec(`PRAGMA busy_timeout = ${G};`),V.exec("PRAGMA synchronous = NORMAL;"),V.exec(`PRAGMA cache_size = ${Q};`),V.exec("PRAGMA temp_store = MEMORY;");let W=$4(V);if(!W){let q=V.query("SELECT sqlite_version() as version").get();throw V.close(),new j(F.DB_CONNECTION_FAILED,"FTS5 is not available. memory requires FTS5 for full-text search.",{sqliteVersion:q?.version??"unknown"})}if(H){let q=V.query("PRAGMA quick_check(1);").get();if(q?.quick_check!=="ok")throw V.close(),new j(F.DB_CORRUPTED,"Database integrity check failed",{path:Z,checkResult:q?.quick_check??"unknown"})}let N=L7(V);if(X)f4(V,{sqliteVecAvailable:N});return{db:V,walEnabled:z,fts5Available:W,sqliteVecAvailable:N}}catch(z){if(z instanceof j)throw z;throw B(z)}}function D($){try{$.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{$.exec("PRAGMA journal_mode = DELETE;")}catch{}$.close()}function e3($){$.exec("PRAGMA wal_checkpoint(PASSIVE);")}function m4($){return $.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}function $5($){try{return S($)}catch(Z){if(Z instanceof j)throw Z;let K=A(Z),X=Z.code;throw new j(F.DB_CONNECTION_FAILED,`Database initialization failed: ${K}`,{path:$.path,...X?{errno:X}:{}})}}var R9=L(()=>{L9();g4();l()});var Z5={};y(Z5,{SqliteSessionRepository:()=>g});class g{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`
550
+ `,`
551
+ CREATE TABLE IF NOT EXISTS memory_governance (
552
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
553
+ surface TEXT NOT NULL CHECK (surface IN ('fact', 'context', 'provider_egress', 'remote_sync', 'friction', 'evaluation', 'persona', 'graph', 'ranking', 'dream', 'projection')),
554
+ target_id TEXT NOT NULL,
555
+ project TEXT,
556
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
557
+ source_event_ids TEXT NOT NULL,
558
+ transformation_method TEXT NOT NULL,
559
+ actor TEXT NOT NULL,
560
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
561
+ redaction_state TEXT NOT NULL CHECK (redaction_state IN ('none', 'redacted', 'quarantined')),
562
+ consent_status TEXT NOT NULL CHECK (consent_status IN ('not_required', 'granted', 'denied', 'revoked')),
563
+ consent_scopes TEXT NOT NULL,
564
+ scope TEXT NOT NULL,
565
+ status TEXT NOT NULL CHECK (status IN ('active', 'pending_review', 'suppressed', 'invalidated', 'expired')),
566
+ status_reason TEXT,
567
+ created_at TEXT NOT NULL,
568
+ updated_at TEXT NOT NULL,
569
+ reviewed_at TEXT,
570
+ expires_at TEXT,
571
+ last_event_id TEXT,
572
+ UNIQUE(surface, target_id)
573
+ );
574
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_surface ON memory_governance(surface);
575
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_project ON memory_governance(project);
576
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_status ON memory_governance(status);
577
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_target ON memory_governance(surface, target_id);
578
+ `,`
579
+ CREATE TABLE IF NOT EXISTS memory_governance_events (
580
+ event_id TEXT PRIMARY KEY,
581
+ kind TEXT NOT NULL CHECK (kind IN ('governance', 'consent')),
582
+ control TEXT NOT NULL,
583
+ surface TEXT NOT NULL,
584
+ target_id TEXT NOT NULL,
585
+ actor TEXT NOT NULL,
586
+ reason TEXT,
587
+ occurred_at TEXT NOT NULL,
588
+ payload TEXT NOT NULL
589
+ );
590
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_events_target ON memory_governance_events(surface, target_id);
591
+ CREATE INDEX IF NOT EXISTS idx_memory_governance_events_occurred ON memory_governance_events(occurred_at);
592
+ `,`
593
+ CREATE TABLE IF NOT EXISTS persona_entries (
594
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
595
+ entry_id TEXT UNIQUE NOT NULL,
596
+ kind TEXT NOT NULL CHECK (kind IN ('preference', 'procedure', 'correction', 'decision_pattern', 'friction_pattern')),
597
+ content TEXT NOT NULL,
598
+ project TEXT,
599
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
600
+ source_event_ids TEXT NOT NULL,
601
+ source_kinds TEXT NOT NULL,
602
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
603
+ scope TEXT NOT NULL,
604
+ review_status TEXT NOT NULL CHECK (review_status IN ('pending_review', 'reviewed')),
605
+ review_after TEXT NOT NULL,
606
+ expires_at TEXT,
607
+ why TEXT NOT NULL,
608
+ created_at TEXT NOT NULL,
609
+ updated_at TEXT NOT NULL
610
+ );
611
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_project ON persona_entries(project);
612
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_kind ON persona_entries(kind);
613
+ CREATE INDEX IF NOT EXISTS idx_persona_entries_visibility ON persona_entries(visibility);
614
+ `,`
615
+ CREATE TABLE IF NOT EXISTS graph_edges (
616
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
617
+ edge_id TEXT UNIQUE NOT NULL,
618
+ source_type TEXT NOT NULL CHECK (source_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
619
+ source_id TEXT NOT NULL,
620
+ source_label TEXT NOT NULL,
621
+ target_type TEXT NOT NULL CHECK (target_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
622
+ target_id TEXT NOT NULL,
623
+ target_label TEXT NOT NULL,
624
+ relationship TEXT NOT NULL,
625
+ project TEXT,
626
+ visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
627
+ source_event_ids TEXT NOT NULL,
628
+ source_kinds TEXT NOT NULL,
629
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
630
+ valid_from TEXT NOT NULL,
631
+ valid_to TEXT,
632
+ why TEXT NOT NULL,
633
+ metadata TEXT,
634
+ created_at TEXT NOT NULL,
635
+ updated_at TEXT NOT NULL
636
+ );
637
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_edge_id ON graph_edges(edge_id);
638
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_project ON graph_edges(project);
639
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_scope ON graph_edges(project, visibility);
640
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges(source_type, source_id);
641
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges(target_type, target_id);
642
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_relationship ON graph_edges(relationship);
643
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_temporal ON graph_edges(valid_from, valid_to, confidence);
644
+ `,`
645
+ CREATE TABLE IF NOT EXISTS memory_utility_metrics (
646
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
647
+ surface TEXT NOT NULL CHECK (surface IN ('fact', 'persona', 'graph', 'link', 'dream')),
648
+ target_id TEXT NOT NULL,
649
+ project TEXT,
650
+ access_count INTEGER NOT NULL DEFAULT 0 CHECK (access_count >= 0),
651
+ last_accessed_at TEXT,
652
+ last_ranked_at TEXT,
653
+ utility_score REAL NOT NULL DEFAULT 0.5 CHECK (utility_score >= 0 AND utility_score <= 1),
654
+ importance_score REAL NOT NULL DEFAULT 0.5 CHECK (importance_score >= 0 AND importance_score <= 1),
655
+ evergreen INTEGER NOT NULL DEFAULT 0 CHECK (evergreen IN (0, 1)),
656
+ pinned INTEGER NOT NULL DEFAULT 0 CHECK (pinned IN (0, 1)),
657
+ half_life_days REAL CHECK (half_life_days IS NULL OR half_life_days > 0),
658
+ metadata TEXT,
659
+ created_at TEXT NOT NULL,
660
+ updated_at TEXT NOT NULL,
661
+ UNIQUE(surface, target_id)
662
+ );
663
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_target ON memory_utility_metrics(surface, target_id);
664
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_project ON memory_utility_metrics(project);
665
+ CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_rank ON memory_utility_metrics(surface, evergreen, pinned, utility_score, importance_score);
666
+ `,`
667
+ CREATE TABLE IF NOT EXISTS embedding_skips (
668
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
669
+ message_id INTEGER NOT NULL,
670
+ model_hash TEXT NOT NULL,
671
+ model_name TEXT NOT NULL,
672
+ provider TEXT NOT NULL,
673
+ reason TEXT NOT NULL CHECK (reason IN ('payload_too_large')),
674
+ retryable INTEGER NOT NULL CHECK (retryable IN (0, 1)),
675
+ content_hash TEXT NOT NULL,
676
+ content_bytes INTEGER NOT NULL CHECK (content_bytes >= 0),
677
+ safe_error TEXT,
678
+ skipped_at TEXT NOT NULL,
679
+ FOREIGN KEY (message_id) REFERENCES messages_meta(rowid) ON DELETE CASCADE,
680
+ UNIQUE(message_id, model_hash, reason)
681
+ );
682
+ CREATE INDEX IF NOT EXISTS idx_embedding_skips_model ON embedding_skips(model_hash);
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")}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(`
433
685
  SELECT id, project_path_encoded, project_path_decoded, project_name,
434
686
  start_time, end_time, message_count, summary
435
687
  FROM sessions
436
688
  WHERE id = $id
437
- `),this.findByProjectStmt=$.prepare(`
689
+ `),this.findByProjectStmt=A.prepare(`
438
690
  SELECT id, project_path_encoded, project_path_decoded, project_name,
439
691
  start_time, end_time, message_count, summary
440
692
  FROM sessions
441
693
  WHERE project_path_encoded = $projectPath
442
694
  ORDER BY start_time DESC
443
- `),this.findRecentStmt=$.prepare(`
695
+ `),this.findRecentStmt=A.prepare(`
444
696
  SELECT id, project_path_encoded, project_path_decoded, project_name,
445
697
  start_time, end_time, message_count, summary
446
698
  FROM sessions
447
699
  ORDER BY start_time DESC
448
700
  LIMIT $limit
449
- `),this.insertStmt=$.prepare(`
701
+ `),this.insertStmt=A.prepare(`
450
702
  INSERT OR IGNORE INTO sessions
451
703
  (id, project_path_encoded, project_path_decoded, project_name,
452
704
  start_time, end_time, message_count)
453
705
  VALUES
454
706
  ($id, $projectPathEncoded, $projectPathDecoded, $projectName,
455
707
  $startTime, $endTime, $messageCount)
456
- `),this.deleteStmt=$.prepare(`
708
+ `),this.deleteStmt=A.prepare(`
457
709
  DELETE FROM sessions WHERE id = $id
458
- `),this.updateSummaryStmt=$.prepare(`
710
+ `),this.updateSummaryStmt=A.prepare(`
459
711
  UPDATE sessions SET summary = $summary, updated_at = datetime('now')
460
712
  WHERE id = $id
461
- `),this.updateProjectNameStmt=$.prepare(`
713
+ `),this.updateProjectNameStmt=A.prepare(`
462
714
  UPDATE sessions SET project_name = $projectName, updated_at = datetime('now')
463
715
  WHERE project_path_encoded = $encodedPath
464
- `),this.findDistinctEncodedPathsStmt=$.prepare(`
716
+ `),this.findDistinctEncodedPathsStmt=A.prepare(`
465
717
  SELECT DISTINCT project_path_encoded FROM sessions
466
718
  ORDER BY project_path_encoded
467
- `)}rowToSession($){let Z=t.fromDecoded($.project_path_decoded);return O0.create({id:$.id,projectPath:Z,startTime:new Date($.start_time),endTime:$.end_time?new Date($.end_time):void 0,summary:$.summary??void 0,messageCount:$.message_count})}async findById($){let Z=this.findByIdStmt.get({$id:$});if(!Z)return null;return this.rowToSession(Z)}async findByProject($){return this.findByProjectStmt.all({$projectPath:$.encoded}).map((K)=>this.rowToSession(K))}async findRecent($){return this.findRecentStmt.all({$limit:$}).map((K)=>this.rowToSession(K))}async save($){this.insertStmt.run({$id:$.id,$projectPathEncoded:$.projectPath.encoded,$projectPathDecoded:$.projectPath.decoded,$projectName:$.projectPath.projectName,$startTime:$.startTime.toISOString(),$endTime:$.endTime?.toISOString()??null,$messageCount:$.messages.length})}async saveMany($){this.db.transaction(()=>{for(let K of $)this.insertStmt.run({$id:K.id,$projectPathEncoded:K.projectPath.encoded,$projectPathDecoded:K.projectPath.decoded,$projectName:K.projectPath.projectName,$startTime:K.startTime.toISOString(),$endTime:K.endTime?.toISOString()??null,$messageCount:K.messages.length})}).immediate()}async delete($){this.deleteStmt.run({$id:$})}async updateSummary($,Z){this.updateSummaryStmt.run({$id:$,$summary:Z})}async findOlderThan($){return this.db.prepare(`
719
+ `)}rowToSession(A){let _=$A.fromDecoded(A.project_path_decoded);return xA.create({id:A.id,projectPath:_,startTime:new Date(A.start_time),endTime:A.end_time?new Date(A.end_time):void 0,summary:A.summary??void 0,messageCount:A.message_count})}async findById(A){let _=this.findByIdStmt.get({$id:A});if(!_)return null;return this.rowToSession(_)}async findByProject(A){return this.findByProjectStmt.all({$projectPath:A.encoded}).map((G)=>this.rowToSession(G))}async findRecent(A){return this.findRecentStmt.all({$limit:A}).map((G)=>this.rowToSession(G))}async save(A){this.insertStmt.run({$id:A.id,$projectPathEncoded:A.projectPath.encoded,$projectPathDecoded:A.projectPath.decoded,$projectName:A.projectPath.projectName,$startTime:A.startTime.toISOString(),$endTime:A.endTime?.toISOString()??null,$messageCount:A.messages.length})}async saveMany(A){this.db.transaction(()=>{for(let G of A)this.insertStmt.run({$id:G.id,$projectPathEncoded:G.projectPath.encoded,$projectPathDecoded:G.projectPath.decoded,$projectName:G.projectPath.projectName,$startTime:G.startTime.toISOString(),$endTime:G.endTime?.toISOString()??null,$messageCount:G.messages.length})}).immediate()}async delete(A){this.deleteStmt.run({$id:A})}async updateSummary(A,_){this.updateSummaryStmt.run({$id:A,$summary:_})}async findOlderThan(A){return this.db.prepare(`
468
720
  SELECT id, project_path_encoded, project_path_decoded, project_name,
469
721
  start_time, end_time, message_count, summary
470
722
  FROM sessions
471
723
  WHERE updated_at < $cutoffDate
472
724
  ORDER BY updated_at ASC
473
- `).all({$cutoffDate:$.toISOString()}).map((Y)=>this.rowToSession(Y))}async countOlderThan($){return this.db.prepare(`
725
+ `).all({$cutoffDate:A.toISOString()}).map((K)=>this.rowToSession(K))}async countOlderThan(A){return this.db.prepare(`
474
726
  SELECT COUNT(*) as count
475
727
  FROM sessions
476
728
  WHERE updated_at < $cutoffDate
477
- `).get({$cutoffDate:$.toISOString()}).count}async deleteOlderThan($){let Z=await this.countOlderThan($),K=`
729
+ `).get({$cutoffDate:A.toISOString()}).count}async deleteOlderThan(A){let _=await this.countOlderThan(A),G=`
478
730
  DELETE FROM sessions
479
731
  WHERE updated_at < $cutoffDate
480
732
  `;return this.db.prepare(`
481
733
  DELETE FROM sessions
482
734
  WHERE updated_at < $cutoffDate
483
- `).run({$cutoffDate:$.toISOString()}),Z}async updateProjectName($,Z){let X=this.db.prepare("SELECT COUNT(*) as count FROM sessions WHERE project_path_encoded = $encodedPath").get({$encodedPath:$}).count;if(X>0)this.updateProjectNameStmt.run({$encodedPath:$,$projectName:Z});return X}async findDistinctEncodedPaths(){return this.findDistinctEncodedPathsStmt.all().map((Z)=>Z.project_path_encoded)}async findFiltered($){let Z=[],K={};if($.projectFilter)Z.push("project_name LIKE $projectFilter"),K.$projectFilter=`%${$.projectFilter}%`;if($.sinceDate)Z.push("start_time >= $sinceDate"),K.$sinceDate=$.sinceDate.toISOString();if($.beforeDate)Z.push("start_time <= $beforeDate"),K.$beforeDate=$.beforeDate.toISOString();let X=Z.length>0?`WHERE ${Z.join(" AND ")}`:"",Y=$.limit??20;K.$limit=Y;let Q=`
735
+ `).run({$cutoffDate:A.toISOString()}),_}async updateProjectName(A,_){let $=this.db.prepare("SELECT COUNT(*) as count FROM sessions WHERE project_path_encoded = $encodedPath").get({$encodedPath:A}).count;if($>0)this.updateProjectNameStmt.run({$encodedPath:A,$projectName:_});return $}async findDistinctEncodedPaths(){return this.findDistinctEncodedPathsStmt.all().map((_)=>_.project_path_encoded)}async findFiltered(A){let _=[],G={};if(A.projectFilter)_.push("project_name LIKE $projectFilter"),G.$projectFilter=`%${A.projectFilter}%`;if(A.sinceDate)_.push("start_time >= $sinceDate"),G.$sinceDate=A.sinceDate.toISOString();if(A.beforeDate)_.push("start_time <= $beforeDate"),G.$beforeDate=A.beforeDate.toISOString();let $=_.length>0?`WHERE ${_.join(" AND ")}`:"",K=A.limit??20;G.$limit=K;let Z=`
484
736
  SELECT id, project_path_encoded, project_path_decoded, project_name,
485
737
  start_time, end_time, message_count, summary
486
738
  FROM sessions
487
- ${X}
739
+ ${$}
488
740
  ORDER BY start_time DESC
489
741
  LIMIT $limit
490
- `;return this.db.prepare(Q).all(K).map((J)=>this.rowToSession(J))}async searchSummaries($,Z=20){let K=o0($);if(!K)return[];let X=`
742
+ `;return this.db.prepare(Z).all(G).map((H)=>this.rowToSession(H))}async searchSummaries(A,_=20){let G=R0(A);if(!G)return[];let $=`
491
743
  SELECT s.id, s.project_path_encoded, s.project_path_decoded, s.project_name,
492
744
  s.start_time, s.end_time, s.message_count, s.summary
493
745
  FROM sessions s
@@ -495,56 +747,56 @@ CREATE TABLE IF NOT EXISTS extraction_log (
495
747
  WHERE sessions_fts MATCH $query
496
748
  ORDER BY rank
497
749
  LIMIT $limit
498
- `;return this.db.prepare(X).all({$query:K,$limit:Z}).map((G)=>this.rowToSession(G))}}var M0=()=>{};var K5={};y(K5,{SqliteMessageRepository:()=>G0});class G0{db;findByIdStmt;findBySessionStmt;existsStmt;insertStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
750
+ `;return this.db.prepare($).all({$query:G,$limit:_}).map((Y)=>this.rowToSession(Y))}}var mA=()=>{};var K4={};k(K4,{SqliteMessageRepository:()=>WA});class WA{db;findByIdStmt;findBySessionStmt;existsStmt;insertStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
499
751
  FROM messages_meta
500
- WHERE id = ?`),this.findBySessionStmt=$.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
752
+ WHERE id = ?`),this.findBySessionStmt=A.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
501
753
  FROM messages_meta
502
754
  WHERE session_id = ?
503
- ORDER BY timestamp ASC`),this.existsStmt=$.prepare("SELECT id FROM messages_meta WHERE id = ?"),this.insertStmt=$.prepare(`INSERT OR IGNORE INTO messages_meta (id, session_id, role, content, timestamp, tool_use_ids)
504
- VALUES ($id, $session_id, $role, $content, $timestamp, $tool_use_ids)`)}async findById($){let Z=this.findByIdStmt.get($);if(!Z)return null;return this.rowToMessage(Z)}async findBySession($){return this.findBySessionStmt.all($).map((K)=>this.rowToMessage(K))}async save($,Z){this.insertStmt.run({$id:$.id,$session_id:Z,$role:$.role,$content:$.content,$timestamp:$.timestamp.toISOString(),$tool_use_ids:$.toolUses.length>0?JSON.stringify($.toolUses):null})}async saveMany($,Z){let X={inserted:0,skipped:0,errors:[]};for(let Y=0;Y<$.length;Y+=100){let Q=$.slice(Y,Y+100);this.db.transaction((_)=>{for(let{message:J,sessionId:H}of _)try{if(this.existsStmt.get(J.id)){X.skipped++;continue}this.insertStmt.run({$id:J.id,$session_id:H,$role:J.role,$content:J.content,$timestamp:J.timestamp.toISOString(),$tool_use_ids:J.toolUses.length>0?JSON.stringify(J.toolUses):null}),X.inserted++}catch(V){X.skipped++,X.errors.push({id:J.id,reason:A(V)})}}).immediate(Q),Z?.onProgress?.({inserted:X.inserted,total:$.length})}return X}rowToMessage($){let Z=$.tool_use_ids?JSON.parse($.tool_use_ids):void 0;return J0.create({id:$.id,role:$.role,content:$.content,timestamp:new Date($.timestamp),toolUseIds:Z})}}var A1=L(()=>{o1()});class b0{findByIdStmt;findBySessionPathStmt;findPendingStmt;saveStmt;constructor($){this.findByIdStmt=$.prepare(`
755
+ ORDER BY timestamp ASC`),this.existsStmt=A.prepare("SELECT id FROM messages_meta WHERE id = ?"),this.insertStmt=A.prepare(`INSERT OR IGNORE INTO messages_meta (id, session_id, role, content, timestamp, tool_use_ids)
756
+ VALUES ($id, $session_id, $role, $content, $timestamp, $tool_use_ids)`)}async findById(A){let _=this.findByIdStmt.get(A);if(!_)return null;return this.rowToMessage(_)}async findBySession(A){return this.findBySessionStmt.all(A).map((G)=>this.rowToMessage(G))}async save(A,_){this.insertStmt.run({$id:A.id,$session_id:_,$role:A.role,$content:A.content,$timestamp:A.timestamp.toISOString(),$tool_use_ids:A.toolUses.length>0?JSON.stringify(A.toolUses):null})}async saveMany(A,_){let $={inserted:0,skipped:0,errors:[]};for(let K=0;K<A.length;K+=100){let Z=A.slice(K,K+100);this.db.transaction((J)=>{for(let{message:H,sessionId:Q}of J)try{if(this.existsStmt.get(H.id)){$.skipped++;continue}this.insertStmt.run({$id:H.id,$session_id:Q,$role:H.role,$content:H.content,$timestamp:H.timestamp.toISOString(),$tool_use_ids:H.toolUses.length>0?JSON.stringify(H.toolUses):null}),$.inserted++}catch(X){$.skipped++,$.errors.push({id:H.id,reason:L(X)})}}).immediate(Z),_?.onProgress?.({inserted:$.inserted,total:A.length})}return $}rowToMessage(A){let _=A.tool_use_ids?JSON.parse(A.tool_use_ids):void 0;return TA.create({id:A.id,role:A.role,content:A.content,timestamp:new Date(A.timestamp),toolUseIds:_})}}var Y_=U(()=>{l_()});class Q0{findByIdStmt;findBySessionPathStmt;findPendingStmt;saveStmt;constructor(A){this.findByIdStmt=A.prepare(`
505
757
  SELECT id, session_path, started_at, status, completed_at,
506
758
  messages_extracted, error_message, file_mtime, file_size
507
759
  FROM extraction_state
508
760
  WHERE id = $id
509
- `),this.findBySessionPathStmt=$.prepare(`
761
+ `),this.findBySessionPathStmt=A.prepare(`
510
762
  SELECT id, session_path, started_at, status, completed_at,
511
763
  messages_extracted, error_message, file_mtime, file_size
512
764
  FROM extraction_state
513
765
  WHERE session_path = $sessionPath
514
- `),this.findPendingStmt=$.prepare(`
766
+ `),this.findPendingStmt=A.prepare(`
515
767
  SELECT id, session_path, started_at, status, completed_at,
516
768
  messages_extracted, error_message, file_mtime, file_size
517
769
  FROM extraction_state
518
770
  WHERE status IN ('pending', 'in_progress')
519
771
  ORDER BY started_at ASC
520
- `),this.saveStmt=$.prepare(`
772
+ `),this.saveStmt=A.prepare(`
521
773
  INSERT OR REPLACE INTO extraction_state
522
774
  (id, session_path, started_at, status, completed_at,
523
775
  messages_extracted, error_message, file_mtime, file_size)
524
776
  VALUES
525
777
  ($id, $sessionPath, $startedAt, $status, $completedAt,
526
778
  $messagesExtracted, $errorMessage, $fileMtime, $fileSize)
527
- `)}rowToExtractionState($){return Q0.create({id:$.id,sessionPath:$.session_path,startedAt:new Date($.started_at),status:$.status,completedAt:$.completed_at?new Date($.completed_at):void 0,messagesExtracted:$.messages_extracted,errorMessage:$.error_message??void 0,fileMtime:$.file_mtime?new Date($.file_mtime):void 0,fileSize:$.file_size??void 0})}async findById($){let Z=this.findByIdStmt.get({$id:$});if(!Z)return null;return this.rowToExtractionState(Z)}async findBySessionPath($){let Z=this.findBySessionPathStmt.get({$sessionPath:$});if(!Z)return null;return this.rowToExtractionState(Z)}async findPending(){return this.findPendingStmt.all().map((Z)=>this.rowToExtractionState(Z))}async save($){this.saveStmt.run({$id:$.id,$sessionPath:$.sessionPath,$startedAt:$.startedAt.toISOString(),$status:$.status,$completedAt:$.completedAt?.toISOString()??null,$messagesExtracted:$.messagesExtracted,$errorMessage:$.errorMessage??null,$fileMtime:$.fileMtime?.toISOString()??null,$fileSize:$.fileSize??null})}}var X5=L(()=>{P4()});class f0{db;findByIdStmt;findBySessionStmt;insertStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`SELECT id, session_id, name, input, timestamp, status, result
779
+ `)}rowToExtractionState(A){return VA.create({id:A.id,sessionPath:A.session_path,startedAt:new Date(A.started_at),status:A.status,completedAt:A.completed_at?new Date(A.completed_at):void 0,messagesExtracted:A.messages_extracted,errorMessage:A.error_message??void 0,fileMtime:A.file_mtime?new Date(A.file_mtime):void 0,fileSize:A.file_size??void 0})}async findById(A){let _=this.findByIdStmt.get({$id:A});if(!_)return null;return this.rowToExtractionState(_)}async findBySessionPath(A){let _=this.findBySessionPathStmt.get({$sessionPath:A});if(!_)return null;return this.rowToExtractionState(_)}async findPending(){return this.findPendingStmt.all().map((_)=>this.rowToExtractionState(_))}async save(A){this.saveStmt.run({$id:A.id,$sessionPath:A.sessionPath,$startedAt:A.startedAt.toISOString(),$status:A.status,$completedAt:A.completedAt?.toISOString()??null,$messagesExtracted:A.messagesExtracted,$errorMessage:A.errorMessage??null,$fileMtime:A.fileMtime?.toISOString()??null,$fileSize:A.fileSize??null})}}var Z4=U(()=>{vG()});class X0{db;findByIdStmt;findBySessionStmt;insertStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`SELECT id, session_id, name, input, timestamp, status, result
528
780
  FROM tool_uses
529
- WHERE id = ?`),this.findBySessionStmt=$.prepare(`SELECT id, session_id, name, input, timestamp, status, result
781
+ WHERE id = ?`),this.findBySessionStmt=A.prepare(`SELECT id, session_id, name, input, timestamp, status, result
530
782
  FROM tool_uses
531
783
  WHERE session_id = ?
532
- ORDER BY timestamp ASC`),this.insertStmt=$.prepare(`INSERT OR IGNORE INTO tool_uses
784
+ ORDER BY timestamp ASC`),this.insertStmt=A.prepare(`INSERT OR IGNORE INTO tool_uses
533
785
  (id, session_id, name, input, timestamp, status, result)
534
- VALUES ($id, $session_id, $name, $input, $timestamp, $status, $result)`)}async findById($){let Z=this.findByIdStmt.get($);if(!Z)return null;return this.rowToEntity(Z)}async findBySession($){return this.findBySessionStmt.all($).map((K)=>this.rowToEntity(K))}async save($,Z){this.insertStmt.run({$id:$.id,$session_id:Z,$name:$.name,$input:JSON.stringify($.input),$timestamp:$.timestamp.toISOString(),$status:$.status,$result:$.result??null})}async saveMany($,Z){let X={inserted:0,skipped:0,errors:[]};for(let Y=0;Y<$.length;Y+=100){let Q=$.slice(Y,Y+100);this.db.transaction((_)=>{for(let{toolUse:J,sessionId:H}of _)try{if(this.insertStmt.run({$id:J.id,$session_id:H,$name:J.name,$input:JSON.stringify(J.input),$timestamp:J.timestamp.toISOString(),$status:J.status,$result:J.result??null}).changes>0)X.inserted++;else X.skipped++}catch(V){X.skipped++,X.errors.push({id:J.id,reason:A(V)})}}).immediate(Q),Z?.onProgress?.({inserted:X.inserted,total:$.length})}return X}rowToEntity($){return U0.create({id:$.id,name:$.name,input:JSON.parse($.input),timestamp:new Date($.timestamp),status:$.status,result:$.result??void 0})}}var F9=L(()=>{E4()});class N1{db;findBySourceStmt;findByTargetStmt;insertStmt;constructor($){this.db=$,this.findBySourceStmt=$.prepare(`
786
+ VALUES ($id, $session_id, $name, $input, $timestamp, $status, $result)`)}async findById(A){let _=this.findByIdStmt.get(A);if(!_)return null;return this.rowToEntity(_)}async findBySession(A){return this.findBySessionStmt.all(A).map((G)=>this.rowToEntity(G))}async save(A,_){this.insertStmt.run({$id:A.id,$session_id:_,$name:A.name,$input:JSON.stringify(A.input),$timestamp:A.timestamp.toISOString(),$status:A.status,$result:A.result??null})}async saveMany(A,_){let $={inserted:0,skipped:0,errors:[]};for(let K=0;K<A.length;K+=100){let Z=A.slice(K,K+100);this.db.transaction((J)=>{for(let{toolUse:H,sessionId:Q}of J)try{if(this.insertStmt.run({$id:H.id,$session_id:Q,$name:H.name,$input:JSON.stringify(H.input),$timestamp:H.timestamp.toISOString(),$status:H.status,$result:H.result??null}).changes>0)$.inserted++;else $.skipped++}catch(X){$.skipped++,$.errors.push({id:H.id,reason:L(X)})}}).immediate(Z),_?.onProgress?.({inserted:$.inserted,total:A.length})}return $}rowToEntity(A){return PA.create({id:A.id,name:A.name,input:JSON.parse(A.input),timestamp:new Date(A.timestamp),status:A.status,result:A.result??void 0})}}var E5=U(()=>{hG()});class J_{db;findBySourceStmt;findByTargetStmt;insertStmt;constructor(A){this.db=A,this.findBySourceStmt=A.prepare(`
535
787
  SELECT source_type, source_id, target_type, target_id, relationship, weight
536
788
  FROM links
537
789
  WHERE source_type = $sourceType AND source_id = $sourceId
538
- `),this.findByTargetStmt=$.prepare(`
790
+ `),this.findByTargetStmt=A.prepare(`
539
791
  SELECT source_type, source_id, target_type, target_id, relationship, weight
540
792
  FROM links
541
793
  WHERE target_type = $targetType AND target_id = $targetId
542
- `),this.insertStmt=$.prepare(`
794
+ `),this.insertStmt=A.prepare(`
543
795
  INSERT OR REPLACE INTO links
544
796
  (source_type, source_id, target_type, target_id, relationship, weight)
545
797
  VALUES
546
798
  ($sourceType, $sourceId, $targetType, $targetId, $relationship, $weight)
547
- `)}rowToLink($){return z1.create({sourceType:$.source_type,sourceId:$.source_id,targetType:$.target_type,targetId:$.target_id,relationship:$.relationship,weight:$.weight})}async findBySource($,Z){return this.findBySourceStmt.all({$sourceType:$,$sourceId:Z}).map((X)=>this.rowToLink(X))}async findByTarget($,Z){return this.findByTargetStmt.all({$targetType:$,$targetId:Z}).map((X)=>this.rowToLink(X))}async findRelated($,Z,K=2){return(await this.findRelatedWithHops($,Z,K)).map((Y)=>Y.link)}async findRelatedWithHops($,Z,K=2){return this.db.prepare(`
799
+ `)}rowToLink(A){return Z_.create({sourceType:A.source_type,sourceId:A.source_id,targetType:A.target_type,targetId:A.target_id,relationship:A.relationship,weight:A.weight})}async findBySource(A,_){return this.findBySourceStmt.all({$sourceType:A,$sourceId:_}).map(($)=>this.rowToLink($))}async findByTarget(A,_){return this.findByTargetStmt.all({$targetType:A,$targetId:_}).map(($)=>this.rowToLink($))}async findRelated(A,_,G=2){return(await this.findRelatedWithHops(A,_,G)).map((K)=>K.link)}async findRelatedWithHops(A,_,G=2){return this.db.prepare(`
548
800
  WITH RECURSIVE related(
549
801
  source_type, source_id, target_type, target_id,
550
802
  relationship, weight, hop, path
@@ -573,37 +825,70 @@ CREATE TABLE IF NOT EXISTS extraction_log (
573
825
  SELECT DISTINCT source_type, source_id, target_type, target_id, relationship, weight, hop
574
826
  FROM related
575
827
  ORDER BY hop ASC, weight DESC
576
- `).all({$entityType:$,$entityId:Z,$maxHops:K}).map((G)=>({link:this.rowToLink(G),hop:G.hop}))}async save($){this.insertStmt.run({$sourceType:$.sourceType,$sourceId:$.sourceId,$targetType:$.targetType,$targetId:$.targetId,$relationship:$.relationship,$weight:$.weight})}async saveMany($){this.db.transaction(()=>{for(let K of $)this.insertStmt.run({$sourceType:K.sourceType,$sourceId:K.sourceId,$targetType:K.targetType,$targetId:K.targetId,$relationship:K.relationship,$weight:K.weight})}).immediate()}}var Y5=L(()=>{I9()});var M9=L(()=>{t1()});var Q5={};y(Q5,{EmbeddingRepository:()=>j0});class j0{db;constructor($){this.db=$}findUnembedded($){return this.db.prepare(`
828
+ `).all({$entityType:A,$entityId:_,$maxHops:G}).map((Y)=>({link:this.rowToLink(Y),hop:Y.hop}))}async save(A){this.insertStmt.run({$sourceType:A.sourceType,$sourceId:A.sourceId,$targetType:A.targetType,$targetId:A.targetId,$relationship:A.relationship,$weight:A.weight})}async saveMany(A){this.db.transaction(()=>{for(let G of A)this.insertStmt.run({$sourceType:G.sourceType,$sourceId:G.sourceId,$targetType:G.targetType,$targetId:G.targetId,$relationship:G.relationship,$weight:G.weight})}).immediate()}}var Y4=U(()=>{j5()});var D5=U(()=>{p_()});var J4={};k(J4,{EmbeddingRepository:()=>dA});class dA{db;constructor(A){this.db=A}findUnembedded(A,_){if(_)return this.db.prepare(`
829
+ SELECT m.rowid AS rowid, m.content AS content
830
+ FROM messages_meta m
831
+ LEFT JOIN embedding_state es ON m.rowid = es.message_id
832
+ LEFT JOIN embedding_skips esk
833
+ ON m.rowid = esk.message_id
834
+ AND esk.model_hash = ?
835
+ WHERE es.message_id IS NULL
836
+ AND esk.message_id IS NULL
837
+ ORDER BY m.rowid ASC
838
+ LIMIT ?
839
+ `).all(_,A);return this.db.prepare(`
577
840
  SELECT m.rowid AS rowid, m.content AS content
578
841
  FROM messages_meta m
579
842
  LEFT JOIN embedding_state es ON m.rowid = es.message_id
580
843
  WHERE es.message_id IS NULL
581
844
  ORDER BY m.rowid ASC
582
845
  LIMIT ?
583
- `).all($)}storeBatch($,Z,K){let X=this.db.prepare("INSERT INTO message_embeddings(rowid, embedding) VALUES (?, vec_f32(?))"),Y=this.db.prepare("INSERT INTO embedding_state(message_id, embedded_at, model_hash, model_name) VALUES (?, ?, ?, ?)");this.db.transaction((G)=>{let _=new Date().toISOString();for(let J of G)X.run(J.rowid,J.embedding),Y.run(J.rowid,_,Z,K)})($)}getStoredModelHash(){return this.db.prepare("SELECT DISTINCT model_hash FROM embedding_state LIMIT 1").get()?.model_hash??null}getStoredModelName(){return this.db.prepare("SELECT DISTINCT model_name FROM embedding_state WHERE model_name != '' LIMIT 1").get()?.model_name??null}clearAllEmbeddings(){this.db.exec("DELETE FROM message_embeddings"),this.db.exec("DELETE FROM embedding_state")}getEmbeddedCount(){return this.db.prepare("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0}getTotalMessageCount(){return this.db.prepare("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}vectorKnnSearch($,Z){if(Z<=0)return[];return this.db.prepare(`
846
+ `).all(A)}markSkipped(A){let _=A.skippedAt instanceof Date?A.skippedAt.toISOString():A.skippedAt??new Date().toISOString();this.db.prepare(`
847
+ INSERT INTO embedding_skips (
848
+ message_id,
849
+ model_hash,
850
+ model_name,
851
+ provider,
852
+ reason,
853
+ retryable,
854
+ content_hash,
855
+ content_bytes,
856
+ safe_error,
857
+ skipped_at
858
+ )
859
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
860
+ ON CONFLICT(message_id, model_hash, reason) DO UPDATE SET
861
+ model_name = excluded.model_name,
862
+ provider = excluded.provider,
863
+ retryable = excluded.retryable,
864
+ content_hash = excluded.content_hash,
865
+ content_bytes = excluded.content_bytes,
866
+ safe_error = excluded.safe_error,
867
+ skipped_at = excluded.skipped_at
868
+ `).run(A.messageId,A.modelHash,A.modelName,A.provider,A.reason,A.retryable?1:0,A.contentHash,A.contentBytes,A.safeError??null,_)}getSkippedCount(A){if(A)return this.db.prepare("SELECT COUNT(*) as count FROM embedding_skips WHERE model_hash = ?").get(A)?.count??0;return this.db.prepare("SELECT COUNT(*) as count FROM embedding_skips").get()?.count??0}storeBatch(A,_,G){let $=this.db.prepare("INSERT INTO message_embeddings(rowid, embedding) VALUES (?, vec_f32(?))"),K=this.db.prepare("INSERT INTO embedding_state(message_id, embedded_at, model_hash, model_name) VALUES (?, ?, ?, ?)");this.db.transaction((Y)=>{let J=new Date().toISOString();for(let H of Y)$.run(H.rowid,H.embedding),K.run(H.rowid,J,_,G)})(A)}getStoredModelHash(){return this.db.prepare("SELECT DISTINCT model_hash FROM embedding_state LIMIT 1").get()?.model_hash??null}getStoredModelName(){return this.db.prepare("SELECT DISTINCT model_name FROM embedding_state WHERE model_name != '' LIMIT 1").get()?.model_name??null}clearAllEmbeddings(){this.db.exec("DELETE FROM message_embeddings"),this.db.exec("DELETE FROM embedding_state")}getEmbeddedCount(){return this.db.prepare("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0}getTotalMessageCount(){return this.db.prepare("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}vectorKnnSearch(A,_){if(_<=0)return[];return this.db.prepare(`
584
869
  SELECT rowid, distance
585
870
  FROM message_embeddings
586
871
  WHERE embedding MATCH ?
587
872
  ORDER BY distance
588
873
  LIMIT ?
589
- `).all($,Z)}getStoredEmbeddingDimensions(){let $=this.db.prepare("SELECT COUNT(*) as count FROM message_embeddings").get();if(!$||$.count===0)return null;let Z=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!Z||!Z.embedding)return null;return Z.embedding.byteLength/4}recreateVecTable($){this.db.exec("DROP TABLE IF EXISTS message_embeddings"),this.db.exec(`CREATE VIRTUAL TABLE message_embeddings USING vec0(
590
- embedding float[${$}]
591
- )`),this.db.exec("DELETE FROM embedding_state")}}class c4{db;constructor($){this.db=$}async findByPath($){let Z=this.db.prepare("SELECT * FROM memory_files WHERE file_path = ?").get($);return Z?this.toEntity(Z):null}async findByType($){return this.db.prepare("SELECT * FROM memory_files WHERE file_type = ? ORDER BY last_indexed_at DESC").all($).map((K)=>this.toEntity(K))}async findByProject($){return this.db.prepare("SELECT * FROM memory_files WHERE project_encoded = ? ORDER BY file_path").all($).map((K)=>this.toEntity(K))}async save($){this.db.prepare(G5).run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())}async saveMany($){let Z=this.db.prepare(G5);this.db.transaction(()=>{for(let X of $)Z.run(X.filePath,X.fileType,X.projectEncoded??null,X.content,X.contentHash,X.lastIndexedAt.toISOString())})()}async searchContent($,Z=20){let K=o0($);if(!K)return[];return this.db.prepare(`
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
+ embedding float[${A}]
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(`
592
877
  SELECT m.* FROM memory_files m
593
878
  JOIN memory_files_fts f ON f.rowid = m.id
594
879
  WHERE memory_files_fts MATCH ?
595
880
  ORDER BY rank
596
881
  LIMIT ?
597
- `).all(K,Z).map((Y)=>this.toEntity(Y))}async findCrossProjectLearnings($,Z=20){if($)return this.db.prepare(`SELECT * FROM memory_files
882
+ `).all(G,_).map((K)=>this.toEntity(K))}async findCrossProjectLearnings(A,_=20){if(A)return this.db.prepare(`SELECT * FROM memory_files
598
883
  WHERE file_type = 'learnings'
599
884
  AND content LIKE '%Applies to: cross-project%'
600
885
  AND (project_encoded IS NULL OR project_encoded != ?)
601
886
  ORDER BY last_indexed_at DESC
602
- LIMIT ?`).all($,Z).map((Y)=>this.toEntity(Y));return this.db.prepare(`SELECT * FROM memory_files
887
+ LIMIT ?`).all(A,_).map((K)=>this.toEntity(K));return this.db.prepare(`SELECT * FROM memory_files
603
888
  WHERE file_type = 'learnings'
604
889
  AND content LIKE '%Applies to: cross-project%'
605
890
  ORDER BY last_indexed_at DESC
606
- LIMIT ?`).all(Z).map((X)=>this.toEntity(X))}toEntity($){return t0.create({id:$.id,filePath:$.file_path,fileType:$.file_type,projectEncoded:$.project_encoded??void 0,content:$.content,contentHash:$.content_hash,lastIndexedAt:new Date($.last_indexed_at),createdAt:new Date($.created_at)})}}var G5=`
891
+ LIMIT ?`).all(_).map(($)=>this.toEntity($))}toEntity(A){return F0.create({id:A.id,filePath:A.file_path,fileType:A.file_type,projectEncoded:A.project_encoded??void 0,content:A.content,contentHash:A.content_hash,lastIndexedAt:new Date(A.last_indexed_at),createdAt:new Date(A.created_at)})}}var H4=`
607
892
  INSERT INTO memory_files (file_path, file_type, project_encoded, content, content_hash, last_indexed_at)
608
893
  VALUES (?, ?, ?, ?, ?, ?)
609
894
  ON CONFLICT(file_path) DO UPDATE SET
@@ -612,10 +897,10 @@ CREATE TABLE IF NOT EXISTS extraction_log (
612
897
  content = excluded.content,
613
898
  content_hash = excluded.content_hash,
614
899
  last_indexed_at = excluded.last_indexed_at
615
- `;var j9=L(()=>{S4()});var _5={};y(_5,{SqliteFrictionRepository:()=>x0});class x0{db;constructor($){this.db=$}async save($){let Z=this.db.prepare(`
900
+ `;var x5=U(()=>{gG()});var X4={};k(X4,{SqliteFrictionRepository:()=>RA});class RA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
616
901
  INSERT INTO friction_log (description, severity, category, tool, tags, status, context, source_project, logged_at, resolved_at, resolution, last_reviewed_at)
617
902
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
618
- `).run($.description,$.severity,$.category,$.tool,$.tags?JSON.stringify($.tags):null,$.status,$.context??null,$.sourceProject??null,$.loggedAt.toISOString(),$.resolvedAt?.toISOString()??null,$.resolution??null,$.lastReviewedAt?.toISOString()??null);return C0.create({id:Number(Z.lastInsertRowid),description:$.description,severity:$.severity,category:$.category,status:$.status,tool:$.tool,tags:$.tags,lastReviewedAt:$.lastReviewedAt,context:$.context,sourceProject:$.sourceProject,loggedAt:$.loggedAt,resolvedAt:$.resolvedAt,resolution:$.resolution})}async findById($){let Z=this.db.prepare("SELECT * FROM friction_log WHERE id = ?").get($);return Z?this.toEntity(Z):null}async findOpen(){return this.db.prepare("SELECT * FROM friction_log WHERE status = 'open' ORDER BY logged_at DESC").all().map((Z)=>this.toEntity(Z))}async findAll($){let Z=[],K=[];if($?.status)Z.push("status = ?"),K.push($.status);if($?.category)Z.push("category = ?"),K.push($.category);if($?.tool)Z.push("tool = ?"),K.push($.tool);if($?.sourceProject)Z.push("source_project = ?"),K.push($.sourceProject);let X=Z.length>0?`WHERE ${Z.join(" AND ")}`:"",Y=$?.limit??100;K.push(Y);let Q=`SELECT * FROM friction_log ${X} ORDER BY logged_at DESC LIMIT ?`;return this.db.prepare(Q).all(...K).map((_)=>this.toEntity(_))}async resolve($,Z){if(this.db.prepare("UPDATE friction_log SET status = 'resolved', resolution = ?, resolved_at = ? WHERE id = ?").run(Z,new Date().toISOString(),$).changes===0)throw Error(`Friction entry with id ${$} not found`)}async updateStatus($,Z){if(this.db.prepare("UPDATE friction_log SET status = ? WHERE id = ?").run(Z,$).changes===0)throw Error(`Friction entry with id ${$} not found`)}async getStats(){let $=this.db.prepare(`
903
+ `).run(A.description,A.severity,A.category,A.tool,A.tags?JSON.stringify(A.tags):null,A.status,A.context??null,A.sourceProject??null,A.loggedAt.toISOString(),A.resolvedAt?.toISOString()??null,A.resolution??null,A.lastReviewedAt?.toISOString()??null);return G0.create({id:Number(_.lastInsertRowid),description:A.description,severity:A.severity,category:A.category,status:A.status,tool:A.tool,tags:A.tags,lastReviewedAt:A.lastReviewedAt,context:A.context,sourceProject:A.sourceProject,loggedAt:A.loggedAt,resolvedAt:A.resolvedAt,resolution:A.resolution})}async findById(A){let _=this.db.prepare("SELECT * FROM friction_log WHERE id = ?").get(A);return _?this.toEntity(_):null}async findOpen(){return this.db.prepare("SELECT * FROM friction_log WHERE status = 'open' ORDER BY logged_at DESC").all().map((_)=>this.toEntity(_))}async findAll(A){let _=[],G=[];if(A?.status)_.push("status = ?"),G.push(A.status);if(A?.category)_.push("category = ?"),G.push(A.category);if(A?.tool)_.push("tool = ?"),G.push(A.tool);if(A?.sourceProject)_.push("source_project = ?"),G.push(A.sourceProject);let $=_.length>0?`WHERE ${_.join(" AND ")}`:"",K=A?.limit??100;G.push(K);let Z=`SELECT * FROM friction_log ${$} ORDER BY logged_at DESC LIMIT ?`;return this.db.prepare(Z).all(...G).map((J)=>this.toEntity(J))}async query(A={}){let{whereClause:_,params:G}=k7(A),$=this.db.prepare(`SELECT COUNT(*) as count FROM friction_log ${_}`).get(...G),K=[...G],Z=A.limit!==void 0?" LIMIT ?":"";if(A.limit!==void 0)K.push(A.limit);return{entries:this.db.prepare(`SELECT * FROM friction_log ${_} ORDER BY logged_at DESC${Z}`).all(...K).map((J)=>this.toEntity(J)),totalCount:$.count}}async resolve(A,_){if(this.db.prepare("UPDATE friction_log SET status = 'resolved', resolution = ?, resolved_at = ? WHERE id = ?").run(_,new Date().toISOString(),A).changes===0)throw Error(`Friction entry with id ${A} not found`)}async updateStatus(A,_){if(this.db.prepare("UPDATE friction_log SET status = ? WHERE id = ?").run(_,A).changes===0)throw Error(`Friction entry with id ${A} not found`)}async getStats(){let A=this.db.prepare(`
619
904
  SELECT
620
905
  COUNT(*) as total,
621
906
  COALESCE(SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END), 0) as open_count,
@@ -624,71 +909,213 @@ CREATE TABLE IF NOT EXISTS extraction_log (
624
909
  AVG(CASE WHEN resolved_at IS NOT NULL
625
910
  THEN julianday(resolved_at) - julianday(logged_at) END) as avg_resolve_days
626
911
  FROM friction_log
627
- `).get(),Z=this.db.prepare("SELECT severity, COUNT(*) as count FROM friction_log GROUP BY severity").all(),K={low:0,medium:0,high:0,critical:0};for(let H of Z)K[H.severity]=H.count;let X=this.db.prepare("SELECT category, COUNT(*) as count FROM friction_log GROUP BY category").all(),Y={};for(let H of X)Y[H.category]=H.count;let Q=this.db.prepare("SELECT tool, COUNT(*) as count FROM friction_log GROUP BY tool").all(),G={};for(let H of Q)G[H.tool]=H.count;let _=this.db.prepare(`
912
+ `).get(),_=this.db.prepare("SELECT severity, COUNT(*) as count FROM friction_log GROUP BY severity").all(),G={low:0,medium:0,high:0,critical:0};for(let Q of _)G[Q.severity]=Q.count;let $=this.db.prepare("SELECT category, COUNT(*) as count FROM friction_log GROUP BY category").all(),K={};for(let Q of $)K[Q.category]=Q.count;let Z=this.db.prepare("SELECT tool, COUNT(*) as count FROM friction_log GROUP BY tool").all(),Y={};for(let Q of Z)Y[Q.tool]=Q.count;let J=this.db.prepare(`
628
913
  SELECT id, description,
629
914
  julianday('now') - julianday(logged_at) as days_open
630
915
  FROM friction_log
631
916
  WHERE status = 'open'
632
917
  ORDER BY logged_at ASC
633
918
  LIMIT 1
634
- `).get(),J=_?{id:_.id,description:_.description,daysOpen:Math.floor(_.days_open)}:null;return{total:$.total,open:$.open_count,resolved:$.resolved_count,wontFix:$.wont_fix_count,bySeverity:K,byCategory:Y,byTool:G,meanTimeToResolve:$.avg_resolve_days??null,oldestOpen:J}}async getWeeklyTrends($){let Z=[],K=new Date;for(let _=$-1;_>=0;_--){let J=new Date(K);J.setDate(J.getDate()-_*7);let H=J.getFullYear(),V=new Date(H,0,1),B=Math.ceil((J.getTime()-V.getTime())/86400000),z=Math.ceil((B+V.getDay())/7),W=`${H}-W${String(z).padStart(2,"0")}`;Z.push(W)}let X=this.db.prepare(`
919
+ `).get(),H=J?{id:J.id,description:J.description,daysOpen:Math.floor(J.days_open)}:null;return{total:A.total,open:A.open_count,resolved:A.resolved_count,wontFix:A.wont_fix_count,bySeverity:G,byCategory:K,byTool:Y,meanTimeToResolve:A.avg_resolve_days??null,oldestOpen:H}}async getWeeklyTrends(A){let _=[],G=new Date;for(let J=A-1;J>=0;J--){let H=new Date(G);H.setDate(H.getDate()-J*7);let Q=H.getFullYear(),X=new Date(Q,0,1),V=Math.ceil((H.getTime()-X.getTime())/86400000),B=Math.ceil((V+X.getDay())/7),W=`${Q}-W${String(B).padStart(2,"0")}`;_.push(W)}let $=this.db.prepare(`
635
920
  SELECT strftime('%Y-W', logged_at) || printf('%02d', CAST(strftime('%W', logged_at) AS INTEGER)) as week,
636
921
  COUNT(*) as count
637
922
  FROM friction_log
638
923
  WHERE logged_at >= ?
639
924
  GROUP BY week
640
- `).all(new Date(K.getTime()-$*7*86400000).toISOString()),Y=new Map(X.map((_)=>[_.week,_.count])),Q=this.db.prepare(`
925
+ `).all(new Date(G.getTime()-A*7*86400000).toISOString()),K=new Map($.map((J)=>[J.week,J.count])),Z=this.db.prepare(`
641
926
  SELECT strftime('%Y-W', resolved_at) || printf('%02d', CAST(strftime('%W', resolved_at) AS INTEGER)) as week,
642
927
  COUNT(*) as count
643
928
  FROM friction_log
644
929
  WHERE resolved_at IS NOT NULL AND resolved_at >= ?
645
930
  GROUP BY week
646
- `).all(new Date(K.getTime()-$*7*86400000).toISOString()),G=new Map(Q.map((_)=>[_.week,_.count]));return Z.map((_)=>({week:_,newCount:Y.get(_)??0,resolvedCount:G.get(_)??0}))}async markReviewed($,Z){this.db.prepare("UPDATE friction_log SET last_reviewed_at = ? WHERE tool = ? AND status = 'open'").run(Z.toISOString(),$)}async findPatterns($){let Z=this.db.prepare(`
931
+ `).all(new Date(G.getTime()-A*7*86400000).toISOString()),Y=new Map(Z.map((J)=>[J.week,J.count]));return _.map((J)=>({week:J,newCount:K.get(J)??0,resolvedCount:Y.get(J)??0}))}async markReviewed(A,_){this.db.prepare("UPDATE friction_log SET last_reviewed_at = ? WHERE tool = ? AND status = 'open'").run(_.toISOString(),A)}async findPatterns(A){let _=this.db.prepare(`
647
932
  SELECT tool, category, COUNT(*) as count
648
933
  FROM friction_log
649
934
  WHERE status = 'open'
650
935
  GROUP BY tool, category
651
936
  HAVING COUNT(*) >= ?
652
937
  ORDER BY count DESC
653
- `).all($),K=[];for(let X of Z){let Y=this.db.prepare("SELECT * FROM friction_log WHERE tool = ? AND category = ? AND status = 'open'").all(X.tool,X.category);K.push({tool:X.tool,category:X.category,count:X.count,entries:Y.map((Q)=>this.toEntity(Q))})}return K}async deleteByPattern($){return this.db.prepare("DELETE FROM friction_log WHERE description LIKE $pattern").run({$pattern:$}),this.db.query("SELECT changes() as count").get().count}toEntity($){return C0.create({id:$.id,description:$.description,severity:$.severity,category:$.category,status:$.status,tool:$.tool,tags:$.tags?JSON.parse($.tags):void 0,lastReviewedAt:$.last_reviewed_at?new Date($.last_reviewed_at):void 0,context:$.context??void 0,sourceProject:$.source_project??void 0,loggedAt:new Date($.logged_at),resolvedAt:$.resolved_at?new Date($.resolved_at):void 0,resolution:$.resolution??void 0})}}var u4=L(()=>{C4()});var J5={};y(J5,{SqliteBackfillStateRepository:()=>X4});class X4{db;constructor($){this.db=$}async findBySessionId($){let Z=this.db.prepare("SELECT * FROM backfill_state WHERE session_id = ?").get($);if(!Z)return null;return this.toEntity(Z)}async findAll(){return this.db.prepare("SELECT * FROM backfill_state ORDER BY backfilled_at DESC").all().map((Z)=>this.toEntity(Z))}async save($){this.db.prepare(`INSERT OR REPLACE INTO backfill_state
938
+ `).all(A),G=[];for(let $ of _){let K=this.db.prepare("SELECT * FROM friction_log WHERE tool = ? AND category = ? AND status = 'open'").all($.tool,$.category);G.push({tool:$.tool,category:$.category,count:$.count,entries:K.map((Z)=>this.toEntity(Z))})}return G}async deleteByPattern(A){return this.db.prepare("DELETE FROM friction_log WHERE description LIKE $pattern").run({$pattern:A}),this.db.query("SELECT changes() as count").get().count}toEntity(A){return G0.create({id:A.id,description:A.description,severity:A.severity,category:A.category,status:A.status,tool:A.tool,tags:A.tags?JSON.parse(A.tags):void 0,lastReviewedAt:A.last_reviewed_at?new Date(A.last_reviewed_at):void 0,context:A.context??void 0,sourceProject:A.source_project??void 0,loggedAt:new Date(A.logged_at),resolvedAt:A.resolved_at?new Date(A.resolved_at):void 0,resolution:A.resolution??void 0})}}function k7(A){let _=[],G=[];if(A.status)_.push("status = ?"),G.push(A.status);if(A.severity)_.push("severity = ?"),G.push(A.severity);if(A.category)_.push("category = ?"),G.push(A.category);if(A.tool)_.push("tool = ?"),G.push(A.tool);if(A.sourceProject)_.push("source_project = ?"),G.push(A.sourceProject);if(A.since)_.push("logged_at >= ?"),G.push(A.since.toISOString());if(A.descriptionContains)_.push("LOWER(description) LIKE LOWER(?) ESCAPE '\\'"),G.push(`%${Q4(A.descriptionContains)}%`);if(A.contextContains)_.push("LOWER(COALESCE(context, '')) LIKE LOWER(?) ESCAPE '\\'"),G.push(`%${Q4(A.contextContains)}%`);return{whereClause:_.length>0?`WHERE ${_.join(" AND ")}`:"",params:G}}function Q4(A){return A.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}var $G=U(()=>{uG()});var V4={};k(V4,{SqliteBackfillStateRepository:()=>KG});class KG{db;constructor(A){this.db=A}async findBySessionId(A){let _=this.db.prepare("SELECT * FROM backfill_state WHERE session_id = ?").get(A);if(!_)return null;return this.toEntity(_)}async findAll(){return this.db.prepare("SELECT * FROM backfill_state ORDER BY backfilled_at DESC").all().map((_)=>this.toEntity(_))}async save(A){this.db.prepare(`INSERT OR REPLACE INTO backfill_state
654
939
  (session_id, backfilled_at, daily_log_path, success, error_message)
655
- VALUES (?, ?, ?, ?, ?)`).run($.sessionId,$.backfilledAt.toISOString(),$.dailyLogPath,$.success?1:0,$.errorMessage??null)}async countByStatus(){let $=this.db.prepare(`SELECT
940
+ VALUES (?, ?, ?, ?, ?)`).run(A.sessionId,A.backfilledAt.toISOString(),A.dailyLogPath,A.success?1:0,A.errorMessage??null)}async countByStatus(){let A=this.db.prepare(`SELECT
656
941
  COUNT(*) as total,
657
942
  SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) as succeeded,
658
943
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as failed
659
- FROM backfill_state`).get();return{total:$.total,succeeded:$.succeeded??0,failed:$.failed??0}}toEntity($){return y0.create({sessionId:$.session_id,backfilledAt:new Date($.backfilled_at),dailyLogPath:$.daily_log_path,success:$.success===1,errorMessage:$.error_message??void 0})}}var x9=()=>{};var H5={};y(H5,{SqliteFactRepository:()=>E0});class E0{db;constructor($){this.db=$}async findById($){let Z=this.db.prepare("SELECT * FROM facts WHERE id = ?").get($);if(!Z)return null;return this.toEntity(Z)}async findByUuid($){let Z=this.db.prepare("SELECT * FROM facts WHERE uuid = ?").get($);if(!Z)return null;return this.toEntity(Z)}async findByProject($){return this.db.prepare("SELECT * FROM facts WHERE project = ? ORDER BY observed_at DESC").all($).map((K)=>this.toEntity(K))}async findRecent($){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC LIMIT ?").all($).map((K)=>this.toEntity(K))}async save($){let Z=$.metadata?JSON.stringify($.metadata):null,K=await this.findByUuid($.uuid);if(K)return this.db.prepare(`
944
+ FROM backfill_state`).get();return{total:A.total,succeeded:A.succeeded??0,failed:A.failed??0}}toEntity(A){return $0.create({sessionId:A.session_id,backfilledAt:new Date(A.backfilled_at),dailyLogPath:A.daily_log_path,success:A.success===1,errorMessage:A.error_message??void 0})}}var P5=()=>{};var B4={};k(B4,{SqliteFactRepository:()=>FA});class FA{db;constructor(A){this.db=A}async findById(A){let _=this.db.prepare("SELECT * FROM facts WHERE id = ?").get(A);if(!_)return null;return this.toEntity(_)}async findByUuid(A){let _=this.db.prepare("SELECT * FROM facts WHERE uuid = ?").get(A);if(!_)return null;return this.toEntity(_)}async findByProject(A){return this.db.prepare("SELECT * FROM facts WHERE project = ? ORDER BY observed_at DESC").all(A).map((G)=>this.toEntity(G))}async findRecent(A){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC LIMIT ?").all(A).map((G)=>this.toEntity(G))}async save(A){let _=A.metadata?JSON.stringify(A.metadata):null,G=await this.findByUuid(A.uuid);if(G)return this.db.prepare(`
660
945
  UPDATE facts
661
946
  SET type = ?, project = ?, content = ?, metadata = ?, observed_at = ?, superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
662
947
  WHERE uuid = ?
663
- `).run($.type,$.project,$.content,Z,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy,$.uuid),$.withId(K.id);else{let X=this.db.prepare(`
948
+ `).run(A.type,A.project,A.content,_,A.observedAt.toISOString(),A.supersededAt?A.supersededAt.toISOString():null,A.supersededBy,A.uuid),A.withId(G.id);else{let $=this.db.prepare(`
664
949
  INSERT INTO facts (
665
950
  uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
666
951
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
667
- `).run($.uuid,$.type,$.project,$.content,Z,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy);return $.withId(Number(X.lastInsertRowid))}}async saveMany($){let Z=[];return this.db.transaction(()=>{for(let X of $){let Y=X.metadata?JSON.stringify(X.metadata):null,Q=this.db.prepare("SELECT id FROM facts WHERE uuid = ?").get(X.uuid);if(Q)this.db.prepare(`
952
+ `).run(A.uuid,A.type,A.project,A.content,_,A.observedAt.toISOString(),A.supersededAt?A.supersededAt.toISOString():null,A.supersededBy);return A.withId(Number($.lastInsertRowid))}}async saveMany(A){let _=[];return this.db.transaction(()=>{for(let $ of A){let K=$.metadata?JSON.stringify($.metadata):null,Z=this.db.prepare("SELECT id FROM facts WHERE uuid = ?").get($.uuid);if(Z)this.db.prepare(`
668
953
  UPDATE facts
669
954
  SET type = ?, project = ?, content = ?, metadata = ?, observed_at = ?, superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
670
955
  WHERE uuid = ?
671
- `).run(X.type,X.project,X.content,Y,X.observedAt.toISOString(),X.supersededAt?X.supersededAt.toISOString():null,X.supersededBy,X.uuid),Z.push(X.withId(Q.id));else{let G=this.db.prepare(`
956
+ `).run($.type,$.project,$.content,K,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy,$.uuid),_.push($.withId(Z.id));else{let Y=this.db.prepare(`
672
957
  INSERT INTO facts (
673
958
  uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
674
959
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
675
- `).run(X.uuid,X.type,X.project,X.content,Y,X.observedAt.toISOString(),X.supersededAt?X.supersededAt.toISOString():null,X.supersededBy);Z.push(X.withId(Number(G.lastInsertRowid)))}}})(),Z}async search($,Z=20){return this.db.prepare(`
960
+ `).run($.uuid,$.type,$.project,$.content,K,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy);_.push($.withId(Number(Y.lastInsertRowid)))}}})(),_}async search(A,_=20){return this.db.prepare(`
676
961
  SELECT f.* FROM facts f
677
962
  JOIN facts_fts fts ON f.id = fts.rowid
678
963
  WHERE facts_fts MATCH ?
679
964
  ORDER BY f.observed_at DESC
680
965
  LIMIT ?
681
- `).all($,Z).map((X)=>this.toEntity(X))}async superseded($,Z,K){this.db.prepare("UPDATE facts SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now') WHERE uuid = ?").run(Z.toISOString(),K,$)}async supersede($,Z,K){await this.superseded($,Z,K)}async findAll(){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC").all().map((Z)=>this.toEntity(Z))}async clearAll(){this.db.exec("DELETE FROM facts;")}toEntity($){return Z0.create({id:$.id,uuid:$.uuid,type:$.type,project:$.project,content:$.content,metadata:$.metadata?JSON.parse($.metadata):void 0,observedAt:new Date($.observed_at),supersededAt:$.superseded_at?new Date($.superseded_at):null,supersededBy:$.superseded_by??null})}}var q1=L(()=>{Z4()});class d4{db;constructor($){this.db=$}async findById($){let Z=this.db.prepare("SELECT * FROM extraction_log WHERE session_id = ?").get($);if(!Z)return null;return this.toEntry(Z)}async save($){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(`
682
967
  INSERT OR REPLACE INTO extraction_log (
683
968
  session_id, mode, facts_added, facts_updated, facts_superseded,
684
969
  facts_skipped, provider, model, tokens_consumed, extracted_at
685
970
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
686
- `).run($.sessionId,$.mode,$.factsAdded,$.factsUpdated,$.factsSuperseded,$.factsSkipped,$.provider,$.model,$.tokensConsumed,$.extractedAt.toISOString())}async findAll(){return this.db.prepare("SELECT * FROM extraction_log ORDER BY extracted_at DESC").all().map((Z)=>this.toEntry(Z))}async clearAll(){this.db.exec("DELETE FROM extraction_log;")}toEntry($){return{sessionId:$.session_id,mode:$.mode,factsAdded:$.facts_added,factsUpdated:$.facts_updated,factsSuperseded:$.facts_superseded,factsSkipped:$.facts_skipped,provider:$.provider,model:$.model,tokensConsumed:$.tokens_consumed,extractedAt:new Date($.extracted_at)}}}var E9=L(()=>{M0();A1();X5();F9();Y5();M9();j9();u4();x9();q1()});class O1{db;constructor($){this.db=$}async search($,Z){let K=Z?.limit??20,X=o0($.value);if(!X)return[];let{sql:Y,params:Q}=this.buildSearchQuery(X,K,Z),_=this.db.prepare(Y).all(...Q);if(_.length===0)return[];return this.normalizeBm25Scores(_).map((H)=>W0.create({sessionId:H.session_id,messageId:H.id,snippet:H.snippet,score:H.normalizedScore,timestamp:new Date(H.timestamp),role:H.role}))}buildSearchQuery($,Z,K){let X=[$],Y=["messages_fts MATCH ?"],Q=`
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
+ INSERT INTO memory_governance (
973
+ surface, target_id, project, visibility, source_event_ids,
974
+ transformation_method, actor, confidence, redaction_state,
975
+ consent_status, consent_scopes, scope, status, status_reason,
976
+ created_at, updated_at, reviewed_at, expires_at, last_event_id
977
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
978
+ ON CONFLICT(surface, target_id) DO UPDATE SET
979
+ project = excluded.project,
980
+ visibility = excluded.visibility,
981
+ source_event_ids = excluded.source_event_ids,
982
+ transformation_method = excluded.transformation_method,
983
+ actor = excluded.actor,
984
+ confidence = excluded.confidence,
985
+ redaction_state = excluded.redaction_state,
986
+ consent_status = excluded.consent_status,
987
+ consent_scopes = excluded.consent_scopes,
988
+ scope = excluded.scope,
989
+ status = excluded.status,
990
+ status_reason = excluded.status_reason,
991
+ updated_at = excluded.updated_at,
992
+ reviewed_at = excluded.reviewed_at,
993
+ expires_at = excluded.expires_at,
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 _=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
+ INSERT INTO memory_governance_events (
997
+ event_id, kind, control, surface, target_id, actor, reason, occurred_at, payload
998
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
999
+ ON CONFLICT(event_id) DO NOTHING
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
+ INSERT INTO persona_entries (
1002
+ entry_id, kind, content, project, visibility, source_event_ids,
1003
+ source_kinds, confidence, scope, review_status, review_after,
1004
+ expires_at, why, created_at, updated_at
1005
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1006
+ ON CONFLICT(entry_id) DO UPDATE SET
1007
+ kind = excluded.kind,
1008
+ content = excluded.content,
1009
+ project = excluded.project,
1010
+ visibility = excluded.visibility,
1011
+ source_event_ids = excluded.source_event_ids,
1012
+ source_kinds = excluded.source_kinds,
1013
+ confidence = excluded.confidence,
1014
+ scope = excluded.scope,
1015
+ review_status = excluded.review_status,
1016
+ review_after = excluded.review_after,
1017
+ expires_at = excluded.expires_at,
1018
+ why = excluded.why,
1019
+ updated_at = excluded.updated_at
1020
+ `).run(...this.toSqlParams(A));return await this.findByEntryId(A.entryId)??A.withId(Number(_.lastInsertRowid))}async saveMany(A){let _=[];this.db.transaction(($)=>{for(let K of $)this.db.prepare(`
1021
+ INSERT INTO persona_entries (
1022
+ entry_id, kind, content, project, visibility, source_event_ids,
1023
+ source_kinds, confidence, scope, review_status, review_after,
1024
+ expires_at, why, created_at, updated_at
1025
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1026
+ ON CONFLICT(entry_id) DO UPDATE SET
1027
+ kind = excluded.kind,
1028
+ content = excluded.content,
1029
+ project = excluded.project,
1030
+ visibility = excluded.visibility,
1031
+ source_event_ids = excluded.source_event_ids,
1032
+ source_kinds = excluded.source_kinds,
1033
+ confidence = excluded.confidence,
1034
+ scope = excluded.scope,
1035
+ review_status = excluded.review_status,
1036
+ review_after = excluded.review_after,
1037
+ expires_at = excluded.expires_at,
1038
+ why = excluded.why,
1039
+ updated_at = excluded.updated_at
1040
+ `).run(...this.toSqlParams(K))})(A);for(let $ of A){let K=await this.findByEntryId($.entryId);if(K)_.push(K)}return _}async findByEntryId(A){let _=this.db.prepare("SELECT * FROM persona_entries WHERE entry_id = ?").get(A);return _?this.toEntity(_):null}async findAll(A={}){let _=[],G=[];if(A.project)_.push("project = ?"),G.push(A.project);if(A.visibility)_.push("visibility = ?"),G.push(A.visibility);if(A.kind)_.push("kind = ?"),G.push(A.kind);let $=A.limit??100;G.push($);let K=_.length>0?`WHERE ${_.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM persona_entries ${K} ORDER BY confidence DESC, updated_at DESC LIMIT ?`).all(...G).map((Y)=>this.toEntity(Y))}async findForContext(A,_={}){let $=_.includeGlobal??!0?"(project = ? OR visibility = 'global')":"project = ?",K=_.limit??20;return this.db.prepare(`SELECT * FROM persona_entries WHERE ${$} ORDER BY confidence DESC, updated_at DESC LIMIT ?`).all(A,K).map((Y)=>this.toEntity(Y))}async deleteByProject(A){this.db.prepare("DELETE FROM persona_entries WHERE project = ?").run(A)}async clearAll(){this.db.prepare("DELETE FROM persona_entries").run()}toSqlParams(A){return[A.entryId,A.kind,A.content,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),JSON.stringify(A.sourceKinds),A.confidence,JSON.stringify(A.scope),A.reviewStatus,A.reviewAfter.toISOString(),A.expiresAt?.toISOString()??null,A.why,A.createdAt.toISOString(),A.updatedAt.toISOString()]}toEntity(A){return fA.create({id:A.id,entryId:A.entry_id,kind:A.kind,content:A.content,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),sourceKinds:JSON.parse(A.source_kinds),confidence:A.confidence,scope:JSON.parse(A.scope),reviewStatus:A.review_status,reviewAfter:new Date(A.review_after),expiresAt:A.expires_at?new Date(A.expires_at):null,why:A.why,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at)})}}var H_=U(()=>{e_()});var q4={};k(q4,{SqliteGraphRepository:()=>lA});class lA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1041
+ INSERT INTO graph_edges (
1042
+ edge_id, source_type, source_id, source_label, target_type, target_id,
1043
+ target_label, relationship, project, visibility, source_event_ids,
1044
+ source_kinds, confidence, valid_from, valid_to, why, metadata,
1045
+ created_at, updated_at
1046
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1047
+ ON CONFLICT(edge_id) DO UPDATE SET
1048
+ source_type = excluded.source_type,
1049
+ source_id = excluded.source_id,
1050
+ source_label = excluded.source_label,
1051
+ target_type = excluded.target_type,
1052
+ target_id = excluded.target_id,
1053
+ target_label = excluded.target_label,
1054
+ relationship = excluded.relationship,
1055
+ project = excluded.project,
1056
+ visibility = excluded.visibility,
1057
+ source_event_ids = excluded.source_event_ids,
1058
+ source_kinds = excluded.source_kinds,
1059
+ confidence = excluded.confidence,
1060
+ valid_from = excluded.valid_from,
1061
+ valid_to = excluded.valid_to,
1062
+ why = excluded.why,
1063
+ metadata = excluded.metadata,
1064
+ updated_at = excluded.updated_at
1065
+ `).run(...this.toSqlParams(A));return await this.findByEdgeId(A.edgeId)??A.withId(Number(_.lastInsertRowid))}async saveMany(A){this.db.transaction(($)=>{for(let K of $)this.db.prepare(`
1066
+ INSERT INTO graph_edges (
1067
+ edge_id, source_type, source_id, source_label, target_type, target_id,
1068
+ target_label, relationship, project, visibility, source_event_ids,
1069
+ source_kinds, confidence, valid_from, valid_to, why, metadata,
1070
+ created_at, updated_at
1071
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1072
+ ON CONFLICT(edge_id) DO UPDATE SET
1073
+ source_type = excluded.source_type,
1074
+ source_id = excluded.source_id,
1075
+ source_label = excluded.source_label,
1076
+ target_type = excluded.target_type,
1077
+ target_id = excluded.target_id,
1078
+ target_label = excluded.target_label,
1079
+ relationship = excluded.relationship,
1080
+ project = excluded.project,
1081
+ visibility = excluded.visibility,
1082
+ source_event_ids = excluded.source_event_ids,
1083
+ source_kinds = excluded.source_kinds,
1084
+ confidence = excluded.confidence,
1085
+ valid_from = excluded.valid_from,
1086
+ valid_to = excluded.valid_to,
1087
+ why = excluded.why,
1088
+ metadata = excluded.metadata,
1089
+ updated_at = excluded.updated_at
1090
+ `).run(...this.toSqlParams(K))})(A);let G=[];for(let $ of A){let K=await this.findByEdgeId($.edgeId);if(K)G.push(K)}return G}async findByEdgeId(A){let _=this.db.prepare("SELECT * FROM graph_edges WHERE edge_id = ?").get(A);return _?this.toEntity(_):null}async findCurrent(A={}){let _=A.asOf??new Date,G=A.minConfidence??0.7,$=A.includeGlobal??!0,K=A.limit??50,Z=["valid_from <= ?","(valid_to IS NULL OR valid_to > ?)","confidence >= ?"],Y=[_.toISOString(),_.toISOString(),G];if(A.project)if($)Z.push("(project = ? OR visibility IN ('global', 'workspace'))"),Y.push(A.project);else Z.push("project = ?"),Y.push(A.project);if(A.nodeId)Z.push("(source_id = ? OR target_id = ?)"),Y.push(A.nodeId,A.nodeId);if(A.relationship)Z.push("relationship = ?"),Y.push(A.relationship);return Y.push(K),this.db.prepare(`
1091
+ SELECT * FROM graph_edges
1092
+ WHERE ${Z.join(" AND ")}
1093
+ ORDER BY confidence DESC, updated_at DESC, edge_id ASC
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(()=>{K$()});var U4={};k(U4,{SqliteMemoryUtilityRepository:()=>h0});class h0{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
1096
+ INSERT INTO memory_utility_metrics (
1097
+ surface, target_id, project, access_count, last_accessed_at,
1098
+ last_ranked_at, utility_score, importance_score, evergreen, pinned,
1099
+ half_life_days, metadata, created_at, updated_at
1100
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1101
+ ON CONFLICT(surface, target_id) DO UPDATE SET
1102
+ project = excluded.project,
1103
+ access_count = excluded.access_count,
1104
+ last_accessed_at = excluded.last_accessed_at,
1105
+ last_ranked_at = excluded.last_ranked_at,
1106
+ utility_score = excluded.utility_score,
1107
+ importance_score = excluded.importance_score,
1108
+ evergreen = excluded.evergreen,
1109
+ pinned = excluded.pinned,
1110
+ half_life_days = excluded.half_life_days,
1111
+ metadata = excluded.metadata,
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 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=`
687
1114
  FROM messages_fts f
688
1115
  JOIN messages_meta m ON f.rowid = m.rowid
689
- `;if(K?.projectFilter)Q+=`
1116
+ `;if(G?.projectFilter)Z+=`
690
1117
  JOIN sessions s ON m.session_id = s.id
691
- `,Y.push("LOWER(s.project_name) LIKE LOWER(?)"),X.push(`%${K.projectFilter}%`);if(K?.roleFilter)if(Array.isArray(K.roleFilter)){let _=K.roleFilter.map(()=>"?").join(", ");Y.push(`m.role IN (${_})`),X.push(...K.roleFilter)}else Y.push("m.role = ?"),X.push(K.roleFilter);if(K?.sessionFilter)Y.push("m.session_id = ?"),X.push(K.sessionFilter);if(K?.sinceDate)Y.push("m.timestamp >= ?"),X.push(K.sinceDate.toISOString());if(K?.beforeDate)Y.push("m.timestamp <= ?"),X.push(K.beforeDate.toISOString());return X.push(Z),{sql:`
1118
+ `,K.push("LOWER(s.project_name) LIKE LOWER(?)"),$.push(`%${G.projectFilter}%`);if(G?.roleFilter)if(Array.isArray(G.roleFilter)){let J=G.roleFilter.map(()=>"?").join(", ");K.push(`m.role IN (${J})`),$.push(...G.roleFilter)}else K.push("m.role = ?"),$.push(G.roleFilter);if(G?.sessionFilter)K.push("m.session_id = ?"),$.push(G.sessionFilter);if(G?.sinceDate)K.push("m.timestamp >= ?"),$.push(G.sinceDate.toISOString());if(G?.beforeDate)K.push("m.timestamp <= ?"),$.push(G.beforeDate.toISOString());return $.push(_),{sql:`
692
1119
  SELECT
693
1120
  m.id,
694
1121
  m.session_id,
@@ -697,16 +1124,16 @@ CREATE TABLE IF NOT EXISTS extraction_log (
697
1124
  m.timestamp,
698
1125
  bm25(messages_fts) as score,
699
1126
  snippet(messages_fts, 0, '<mark>', '</mark>', '...', 64) as snippet
700
- ${Q}
701
- WHERE ${Y.join(" AND ")}
1127
+ ${Z}
1128
+ WHERE ${K.join(" AND ")}
702
1129
  ORDER BY score
703
1130
  LIMIT ?
704
- `,params:X}}normalizeBm25Scores($){if($.length===0)return[];let Z=$[0];if($.length===1&&Z)return[{...Z,normalizedScore:1}];let K=$.map((G)=>G.score),X=Math.min(...K),Y=Math.max(...K);if(X===Y)return $.map((G)=>({...G,normalizedScore:1}));let Q=Y-X;return $.map((G)=>({...G,normalizedScore:(Y-G.score)/Q}))}}var V5=()=>{};class U1{db;fts5Service;embeddingRepo;providerFactory;config;sqliteVecAvailable;lastSearchMeta=null;constructor($){this.db=$.db,this.fts5Service=$.fts5Service,this.embeddingRepo=$.embeddingRepo,this.providerFactory=$.providerFactory,this.config=$.config,this.sqliteVecAvailable=$.sqliteVecAvailable}getLastSearchMeta(){return this.lastSearchMeta}async search($,Z){let K=performance.now(),X=this.embeddingRepo.getEmbeddedCount(),Y=this.embeddingRepo.getTotalMessageCount(),Q=Y>0?X/Y:0,G=this.sqliteVecAvailable&&X>0,_={fts:!0,vector:G,hybrid:G},J=this.resolveMode(Z?.mode,X),H=!1,V,B;try{switch(J.effectiveMode){case"fts":B=await this.ftsSearch($,Z);break;case"vector":B=await this.vectorSearch($,Z);break;case"hybrid":{let I=await this.hybridSearch($,Z);if(B=I.results,I.degraded)H=!0,V=I.degradationReason}break}}catch(I){if(J.effectiveMode!=="vector"&&!(I instanceof j))B=await this.ftsSearch($,Z),H=!0,V="provider_failure";else throw I}B=this.applyDecayToResults(B,Z);let z=J.degraded||H,W=V??(J.degraded?J.reason:void 0),N=z&&!J.degraded?"fts":J.effectiveMode,q=performance.now()-K;return this.lastSearchMeta={mode:N,modeReason:z?W??J.reason:J.reason,degraded:z,degradationReason:z?W:void 0,embeddingCoverage:Q,capabilities:_,timingMs:q},B}resolveMode($,Z=0){let K=this.config.search?.defaultMode??"auto",X=$??K;if(X==="fts")return{effectiveMode:"fts",degraded:!1,reason:"explicit"};if(X==="vector"){if(!this.sqliteVecAvailable)throw new j(F.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(Z===0)throw new j(F.VECTOR_UNAVAILABLE,"No embeddings found in database",{suggestion:"Run 'memory sync --embed' to generate embeddings"});return{effectiveMode:"vector",degraded:!1,reason:"explicit"}}if(X==="hybrid"){if(!this.sqliteVecAvailable||Z===0)return{effectiveMode:"fts",degraded:!0,reason:!this.sqliteVecAvailable?"sqlite_vec_unavailable":"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"explicit"}}if(!this.sqliteVecAvailable||Z===0)return{effectiveMode:"fts",degraded:!1,reason:"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"auto_hybrid"}}applyDecayToResults($,Z){if(!(this.config.search?.temporalDecay?.enabled!==!1&&!Z?.noDecay)||$.length===0)return $;let X=this.config.search?.temporalDecay?.halfLifeDays??30,Q=new Date().getTime(),G=86400000,_=$.map((J)=>{let H=(Q-J.timestamp.getTime())/G,V=Math.pow(0.5,H/X),B=Math.max(0,Math.min(1,J.score*V));return{result:J,decayedScore:B}});return _.sort((J,H)=>H.decayedScore-J.decayedScore),_.map(({result:J,decayedScore:H})=>W0.create({sessionId:J.sessionId,messageId:J.messageId,snippet:J.snippet,score:H,timestamp:J.timestamp,role:J.role,source:J.source,rawScores:J.rawScores}))}async ftsSearch($,Z){return(await this.fts5Service.search($,Z)).map((X)=>W0.create({sessionId:X.sessionId,messageId:X.messageId,snippet:X.snippet,score:X.score,timestamp:X.timestamp,role:X.role,source:"fts",rawScores:{bm25:X.score}}))}async getProvider($){try{let Z=this.providerFactory.createFromConfig(this.config);if(!Z){if($)throw new j(F.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!Z.isReady())await Z.initialize();return Z}catch(Z){if($){if(Z instanceof j)throw Z;throw new j(F.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${A(Z)}`)}return null}}async embedQuery($,Z){return(await Z.embed($)).embedding}checkDimensionMismatch($){if(this.embeddingRepo.getEmbeddedCount()===0)return null;let K=this.getStoredEmbeddingDimensions();if(K===null)return null;let X=$.dimensions;if(X!==K)return`dimension_mismatch (stored: ${K}, provider: ${X})`;return null}getStoredEmbeddingDimensions(){try{let $=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!$||!$.embedding)return null;let Z=$.embedding;if(Z instanceof Float32Array)return Z.length;if(Z instanceof ArrayBuffer||Z.byteLength!==void 0)return Z.byteLength/4;return null}catch{return null}}async vectorSearch($,Z){let K=await this.getProvider(!0);if(!K)throw new j(F.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let X=this.checkDimensionMismatch(K);if(X)throw new j(F.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${X}`);let Y=await this.embedQuery($.value,K),Q=Z?.limit??20,G=Q*W5,_=this.embeddingRepo.vectorKnnSearch(Y,G);if(_.length===0)return[];let J=_.map((B)=>B.rowid),H=this.hydrateByRowids(J),V=[];for(let B=0;B<_.length&&V.length<Q;B++){let z=_[B];if(!z)continue;let W=H.get(z.rowid);if(!W)continue;if(!this.passesFilters(W,Z))continue;let N=this.vectorSnippet(W.content),q=Math.max(0,Math.min(1,1-z.distance/2));V.push(W0.create({sessionId:W.session_id,messageId:W.id,snippet:N,score:q,timestamp:new Date(W.timestamp),role:W.role,source:"vector",rawScores:{cosine:z.distance}}))}return V}async hybridSearch($,Z){let K=Z?.limit??20,X=K*W5,Y={...Z,limit:X},Q=await this.fts5Service.search($,Y),G=[],_=null,J=!1,H;try{if(_=await this.getProvider(!1),_){let O=this.checkDimensionMismatch(_);if(O)_=null,J=!0,H=O;else{let R=await this.embedQuery($.value,_);G=this.embeddingRepo.vectorKnnSearch(R,X)}}else J=!0,H="provider_unavailable"}catch(O){G=[],J=!0,H=`provider_failure: ${A(O)}`}if(G.length===0&&Q.length>0)return{results:Q.map((R)=>W0.create({sessionId:R.sessionId,messageId:R.messageId,snippet:R.snippet,score:R.score,timestamp:R.timestamp,role:R.role,source:"fts",rawScores:{bm25:R.score}})).slice(0,K),degraded:J,degradationReason:H};if(Q.length===0&&G.length===0)return{results:[],degraded:J,degradationReason:H};let V=this.buildFtsRowidMap(Q),B=Q.map((O,R)=>({rowid:V.get(O.messageId)??0,rank:R+1,source:"fts",rawScore:O.score})),z=G.map((O,R)=>({rowid:O.rowid,rank:R+1,source:"vector",rawScore:O.distance})),W=Y9(B,z,K);if(W.length===0)return{results:[],degraded:J,degradationReason:H};let N=W.map((O)=>O.rowid),q=this.hydrateByRowids(N),I=new Map;for(let O of W){let R=O.sources.some((x)=>x.source==="fts"),M=O.sources.some((x)=>x.source==="vector");if(R&&M)I.set(O.rowid,"both");else if(R)I.set(O.rowid,"fts");else I.set(O.rowid,"vector")}let T=W.map((O)=>({...O,score:O.normalizedScore})),U=[];for(let O of T){let R=q.get(O.rowid);if(!R)continue;if(!this.passesFilters(R,Z))continue;let M=I.get(O.rowid)??"fts",x=Q.find((q0)=>q0.messageId===R.id),o=x?x.snippet:this.vectorSnippet(R.content),A0=Math.max(0,Math.min(1,O.score)),N0={rrf:O.rrfScore};for(let q0 of O.sources){if(q0.source==="fts")N0.bm25=q0.rawScore;if(q0.source==="vector")N0.cosine=q0.rawScore}U.push(W0.create({sessionId:R.session_id,messageId:R.id,snippet:o,score:A0,timestamp:new Date(R.timestamp),role:R.role,source:M,rawScores:N0}))}return{results:U,degraded:J,degradationReason:H}}buildFtsRowidMap($){if($.length===0)return new Map;let Z=$.map((Y)=>Y.messageId),K=Z.map(()=>"?").join(","),X=this.db.prepare(`SELECT rowid, id FROM messages_meta WHERE id IN (${K})`).all(...Z);return new Map(X.map((Y)=>[Y.id,Y.rowid]))}hydrateByRowids($){if($.length===0)return new Map;let Z=$.map(()=>"?").join(","),K=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
705
1132
  FROM messages_meta
706
- WHERE rowid IN (${Z})`).all(...$);return new Map(K.map((X)=>[X.rowid,X]))}vectorSnippet($){if($.length<=200)return $;return $.slice(0,200)+"..."}passesFilters($,Z){if(!Z)return!0;if(Z.projectFilter){let K=this.db.prepare("SELECT project_name FROM sessions WHERE id = ?").get($.session_id);if(!K||!K.project_name.toLowerCase().includes(Z.projectFilter.toLowerCase()))return!1}if(Z.roleFilter){if(Array.isArray(Z.roleFilter)){if(!Z.roleFilter.includes($.role))return!1}else if($.role!==Z.roleFilter)return!1}if(Z.sessionFilter&&$.session_id!==Z.sessionFilter)return!1;if(Z.sinceDate){if(new Date($.timestamp)<Z.sinceDate)return!1}if(Z.beforeDate){if(new Date($.timestamp)>Z.beforeDate)return!1}return!0}}var W5=4;var B5=L(()=>{g4()});class h0{db;constructor($){this.db=$}async getStats($=10){let Z=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(`
707
1134
  SELECT page_size * page_count as size
708
1135
  FROM pragma_page_count(), pragma_page_size()
709
- `).get(),K=this.db.prepare(`
1136
+ `).get(),G=this.db.prepare(`
710
1137
  SELECT
711
1138
  s.project_name as projectName,
712
1139
  COUNT(DISTINCT s.id) as sessionCount,
@@ -716,15 +1143,15 @@ CREATE TABLE IF NOT EXISTS extraction_log (
716
1143
  GROUP BY s.project_name
717
1144
  ORDER BY sessionCount DESC
718
1145
  LIMIT ?
719
- `).all($),X=K.reduce((G,_)=>G+_.sessionCount,0),Y=K.reduce((G,_)=>G+_.messageCount,0),Q=this.db.prepare("SELECT COUNT(*) as totalToolUses FROM tool_uses").get();return{totalSessions:X,totalMessages:Y,totalToolUses:Q?.totalToolUses??0,databaseSizeBytes:Z?.size??0,projectBreakdown:K.map((G)=>({projectName:G.projectName,sessionCount:G.sessionCount,messageCount:G.messageCount}))}}}var z5={};y(z5,{SqliteProjectResolver:()=>e0,SqliteContextService:()=>s0});class s0{db;constructor($){this.db=$}async getProjectContext($,Z={}){let K=Z.topicsLimit??10,X=Z.toolsLimit??10,Y;if(Z.days){let I=new Date,T=new Date(I.getFullYear(),I.getMonth(),I.getDate());Y=new Date(T.getTime()-(Z.days-1)*24*60*60*1000)}let Q=this.db.prepare(`SELECT DISTINCT project_name, project_path_decoded, project_path_encoded
1146
+ `).all(A),$=G.reduce((Y,J)=>Y+J.sessionCount,0),K=G.reduce((Y,J)=>Y+J.messageCount,0),Z=this.db.prepare("SELECT COUNT(*) as totalToolUses FROM tool_uses").get();return{totalSessions:$,totalMessages:K,totalToolUses:Z?.totalToolUses??0,databaseSizeBytes:_?.size??0,projectBreakdown:G.map((Y)=>({projectName:Y.projectName,sessionCount:Y.sessionCount,messageCount:Y.messageCount}))}}}var j4={};k(j4,{SqliteProjectResolver:()=>w0,SqliteContextService:()=>v0});class v0{db;constructor(A){this.db=A}async getProjectContext(A,_={}){let G=_.topicsLimit??10,$=_.toolsLimit??10,K;if(_.days){let q=new Date,I=new Date(q.getFullYear(),q.getMonth(),q.getDate());K=new Date(I.getTime()-(_.days-1)*24*60*60*1000)}let Z=this.db.prepare(`SELECT DISTINCT project_name, project_path_decoded, project_path_encoded
720
1147
  FROM sessions
721
1148
  WHERE LOWER(project_name) = LOWER(?)
722
- LIMIT 1`).get($)??this.db.prepare(`SELECT project_name, project_path_decoded, project_path_encoded
1149
+ LIMIT 1`).get(A)??this.db.prepare(`SELECT project_name, project_path_decoded, project_path_encoded
723
1150
  FROM sessions
724
1151
  WHERE project_name LIKE '%' || ? || '%'
725
1152
  GROUP BY project_name
726
1153
  ORDER BY COUNT(*) DESC
727
- LIMIT 1`).get($);if(!Q)return null;let G=Q.project_path_encoded,J=`
1154
+ LIMIT 1`).get(A);if(!Z)return null;let Y=Z.project_path_encoded,H=`
728
1155
  SELECT
729
1156
  COUNT(DISTINCT s.id) as sessionCount,
730
1157
  MAX(s.start_time) as lastActivity,
@@ -733,20 +1160,20 @@ CREATE TABLE IF NOT EXISTS extraction_log (
733
1160
  FROM sessions s
734
1161
  LEFT JOIN messages_meta m ON m.session_id = s.id
735
1162
  WHERE s.project_path_encoded = ?
736
- ${Y?"AND s.start_time >= ?":""}
737
- `,H=Y?this.db.prepare(J).get(G,Y.toISOString()):this.db.prepare(J).get(G);if(!H||H.sessionCount===0)return null;let B=`
1163
+ ${K?"AND s.start_time >= ?":""}
1164
+ `,Q=K?this.db.prepare(H).get(Y,K.toISOString()):this.db.prepare(H).get(Y);if(!Q||Q.sessionCount===0)return null;let V=`
738
1165
  SELECT t.name, COUNT(*) as count
739
1166
  FROM tool_uses t
740
1167
  JOIN sessions s ON t.session_id = s.id
741
1168
  WHERE s.project_path_encoded = ?
742
- ${Y?"AND t.timestamp >= ?":""}
1169
+ ${K?"AND t.timestamp >= ?":""}
743
1170
  GROUP BY t.name
744
1171
  ORDER BY count DESC
745
1172
  LIMIT ?
746
- `,z=Y?this.db.prepare(B).all(G,Y.toISOString(),X):this.db.prepare(B).all(G,X),N=`
1173
+ `,B=K?this.db.prepare(V).all(Y,K.toISOString(),$):this.db.prepare(V).all(Y,$),N=`
747
1174
  SELECT DISTINCT l.target_id as topic
748
1175
  FROM links l
749
- ${Y?`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
1176
+ ${K?`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
750
1177
  WHERE s.project_path_encoded = ?
751
1178
  AND l.target_type = 'topic'
752
1179
  AND s.start_time >= ?`:`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
@@ -754,297 +1181,312 @@ CREATE TABLE IF NOT EXISTS extraction_log (
754
1181
  AND l.target_type = 'topic'`}
755
1182
  ORDER BY l.weight DESC
756
1183
  LIMIT ?
757
- `,q=Y?this.db.prepare(N).all(G,Y.toISOString(),K):this.db.prepare(N).all(G,K);return{projectName:Q.project_name,projectPathDecoded:Q.project_path_decoded,sessionCount:H.sessionCount,totalMessages:H.userMessages+H.assistantMessages,userMessages:H.userMessages,assistantMessages:H.assistantMessages,recentTopics:q.map((I)=>I.topic),recentToolUses:z.map((I)=>({name:I.name,count:I.count})),lastActivity:H.lastActivity?new Date(H.lastActivity):null}}}class e0{db;constructor($){this.db=$}resolveProjectEncoded($){let Z=this.db.prepare(`SELECT DISTINCT project_path_encoded
1184
+ `,z=K?this.db.prepare(N).all(Y,K.toISOString(),G):this.db.prepare(N).all(Y,G);return{projectName:Z.project_name,projectPathDecoded:Z.project_path_decoded,sessionCount:Q.sessionCount,totalMessages:Q.userMessages+Q.assistantMessages,userMessages:Q.userMessages,assistantMessages:Q.assistantMessages,recentTopics:z.map((q)=>q.topic),recentToolUses:B.map((q)=>({name:q.name,count:q.count})),lastActivity:Q.lastActivity?new Date(Q.lastActivity):null}}}class w0{db;constructor(A){this.db=A}resolveProjectEncoded(A){let _=this.db.prepare(`SELECT DISTINCT project_path_encoded
758
1185
  FROM sessions
759
1186
  WHERE LOWER(project_name) = LOWER(?)
760
- LIMIT 1`).get($);if(Z)return Z.project_path_encoded;return this.db.prepare(`SELECT project_path_encoded
1187
+ LIMIT 1`).get(A);if(_)return _.project_path_encoded;return this.db.prepare(`SELECT project_path_encoded
761
1188
  FROM sessions
762
1189
  WHERE project_name LIKE '%' || ? || '%'
763
1190
  GROUP BY project_path_encoded
764
1191
  ORDER BY COUNT(*) DESC
765
- LIMIT 1`).get($)?.project_path_encoded??null}resolveProjectName($){let Z=this.db.prepare(`SELECT DISTINCT project_name
1192
+ LIMIT 1`).get(A)?.project_path_encoded??null}resolveProjectName(A){let _=this.db.prepare(`SELECT DISTINCT project_name
766
1193
  FROM sessions
767
1194
  WHERE LOWER(project_name) = LOWER(?)
768
- LIMIT 1`).get($);if(Z)return Z.project_name;return this.db.prepare(`SELECT project_name
1195
+ LIMIT 1`).get(A);if(_)return _.project_name;return this.db.prepare(`SELECT project_name
769
1196
  FROM sessions
770
1197
  WHERE project_name LIKE '%' || ? || '%'
771
1198
  GROUP BY project_name
772
1199
  ORDER BY COUNT(*) DESC
773
- LIMIT 1`).get($)?.project_name??null}}var A5=L(()=>{V5();B5()});var B0,L1;var P9=L(()=>{B0={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}},L1={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var n4={};y(n4,{saveConfig:()=>L0,resolveProviderDefaults:()=>L5,resolveEmbeddingApiKey:()=>Q4,loadConfig:()=>h,getConfigPath:()=>l4,getConfigDir:()=>$1,PROVIDER_DEFAULTS:()=>U5,DEFAULT_SEARCH_CONFIG:()=>p4,DEFAULT_REMOTE_SYNC_CONFIG:()=>S9,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>v9,DEFAULT_EMBEDDING_CONFIG:()=>I1,DEFAULT_CONFIG:()=>Y4,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>k9});import{randomUUID as D9}from"crypto";import{existsSync as N5,mkdirSync as T7,readFileSync as q5,writeFileSync as R7}from"fs";import{dirname as O5}from"path";function L5($,Z){let K=$.provider;if(K==="local"||!Z)return $;let X=U5[K],Y={...$};if(!("model"in Z))Y.model=X?.model??$.model;if(!("dimensions"in Z))Y.dimensions=X?.dimensions??$.dimensions;return Y}function Q4($,Z){let K=[$.apiKeyEnv,...Z].filter((Y)=>Boolean(Y));for(let Y of K){let Q=process.env[Y];if(Q){let G={apiKey:Q,source:"environment",envVar:Y,deprecatedPlaintext:!1};if($.apiKeyRef)G.ref=$.apiKeyRef;return G}}if($.apiKey){let Y={apiKey:$.apiKey,source:"plaintext-config",deprecatedPlaintext:!0};if($.apiKeyRef)Y.ref=$.apiKeyRef;return Y}let X={source:"missing",deprecatedPlaintext:!1};if($.apiKeyRef)X.ref=$.apiKeyRef;return X}function $1($){if($!==void 0)return O5($);return S0()}function l4($){if($!==void 0)return $;return u1()}function h($){let Z=l4($);if(!N5(Z)){let K=process.env.MEMORY_TEST_MACHINE_ID??D9(),X={...Y4,machineId:K};try{L0(X,$)}catch{}return X}try{let K=q5(Z,"utf-8"),X=JSON.parse(K),Y=X.machineId,Q=!1;if(!Y)Y=process.env.MEMORY_TEST_MACHINE_ID??D9(),Q=!0;let G=X.embedding,_={...I1,...G??{}},J={...S9,...X.remoteSync??{}},H={...v9,...X.legacyMemoryFiles??{}},V={...Y4,...X,machineId:Y,remoteSync:J,legacyMemoryFiles:H,embedding:L5(_,G),search:{...p4,...X.search??{},temporalDecay:{...p4.temporalDecay,...X.search?.temporalDecay??{}}},ambientContext:{...k9,...X.ambientContext??{}}};if(Q)try{L0(V,$)}catch{}return V}catch{console.warn("Invalid config.json, using defaults");let K=process.env.MEMORY_TEST_MACHINE_ID??D9();return{...Y4,machineId:K}}}function L0($,Z){let K=l4(Z),X=O5(K);T7(X,{recursive:!0});let Y={};if(N5(K))try{let G=q5(K,"utf-8");Y=JSON.parse(G)}catch{}let Q={...Y,...$};R7(K,JSON.stringify(Q,null,2)+`
774
- `)}var p4,k9,S9,v9,U5,I1,Y4;var K0=L(()=>{l();P9();p4={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},k9={enabled:!0,budget:800},S9={enabled:!1,autoPush:!0,autoPull:!0},v9={enabled:!1},U5={...B0};I1={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100},Y4={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:I1,search:p4,ambientContext:k9,machineId:"",remoteSync:S9,legacyMemoryFiles:v9}});import{appendFileSync as OJ,existsSync as F7,mkdirSync as UJ,readFileSync as M7,renameSync as LJ,statSync as IJ}from"fs";import{dirname as j7,join as x7}from"path";function T1($){if($!==void 0)return j7($);return X0()}function I5($){if($!==void 0)return $;return x7(X0(),"sync.log")}function R1($=100,Z){let K=I5(Z);if(!F7(K))return[];try{let Y=M7(K,"utf-8").split(`
775
- `).filter((G)=>G.trim()!==""),Q=[];for(let G of Y)try{let _=JSON.parse(G);Q.push(_)}catch{continue}return Q.slice(-$)}catch{return[]}}var a4=L(()=>{l()});var C9=L(()=>{l();t$();M9();A1()});var R5=L(()=>{K0();a4();C9()});var F5=L(()=>{a4()});var F1=L(()=>{K0();a4();C9();R5();F5();p$()});class y9{name="transformers-js";model;dimensions;_pipeline=null;constructor($){this.model=$?.model??"Xenova/all-MiniLM-L6-v2",this.dimensions=$?.dimensions??384}async initialize($){if(this._pipeline)return;let{pipeline:Z,env:K}=await import("@huggingface/transformers");K.allowLocalModels=!1;let X={dtype:"q8"};if($)X.progress_callback=(Y)=>{$({status:Y.status==="ready"?"ready":"downloading",file:Y.file??"",loaded:Y.loaded??0,total:Y.total??0})};try{this._pipeline=await Z("feature-extraction",this.model,X)}catch(Y){if(console.warn(`Native ONNX runtime failed: ${A(Y)}`),console.warn("Falling back to WASM backend (slower but universal)"),K.backends?.onnx?.wasm)K.backends.onnx.wasm.numThreads=1;try{this._pipeline=await Z("feature-extraction",this.model,{dtype:"q8",device:"wasm"})}catch(Q){throw Error(`Embedding initialization failed. Native: ${A(Y)}. WASM: ${A(Q)}`)}}}async embed($){if(!this._pipeline)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await this._pipeline($,{pooling:"mean",normalize:!0}),K=new Float32Array(Z.tolist()[0]);return V0.create({embedding:K,model:this.model,dimensions:this.dimensions})}async embedBatch($){let Z=[];for(let K of $)Z.push(await this.embed(K));return Z}isReady(){return this._pipeline!==null}async dispose(){this._pipeline=null}}var M5=()=>{};class i4{name;model;dimensions;apiKey;baseUrl;_ready=!1;constructor($){this.apiKey=$.apiKey,this.name=$.providerId??"openai",this.model=$.model??"text-embedding-3-small",this.dimensions=$.dimensions??1536,this.baseUrl=$.baseUrl??"https://api.openai.com/v1"}async initialize($){this._ready=!0}async embed($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:$,dimensions:this.dimensions})});if(!Z.ok){let Q=await Z.text();throw Error(`OpenAI API error ${Z.status}: ${Q}`)}let X=(await Z.json()).data?.[0];if(!X)throw Error("OpenAI returned empty embeddings response");let Y=new Float32Array(X.embedding);return V0.create({embedding:Y,model:this.model,dimensions:this.dimensions})}async embedBatch($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:$,dimensions:this.dimensions})});if(!Z.ok){let Y=await Z.text();throw Error(`OpenAI API error ${Z.status}: ${Y}`)}return[...(await Z.json()).data].sort((Y,Q)=>Y.index-Q.index).map((Y)=>V0.create({embedding:new Float32Array(Y.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var j5=()=>{};class w9{name="ollama";model;dimensions;baseUrl;_ready=!1;constructor($){this.model=$?.model??"nomic-embed-text",this.dimensions=$?.dimensions??768,this.baseUrl=$?.baseUrl??"http://localhost:11434"}async initialize($){let Z;try{Z=await fetch(`${this.baseUrl}/api/tags`,{method:"GET"})}catch(K){let X=A(K);throw Error(`Cannot reach Ollama server at ${this.baseUrl}. Ensure Ollama is running: ollama serve (${X})`)}if(!Z.ok)throw Error(`Ollama server returned ${Z.status} from ${this.baseUrl}/api/tags`);this._ready=!0}async embed($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:$})});if(!Z.ok){let Q=await Z.text();this.throwWithHint(Z.status,Q)}let X=(await Z.json()).embeddings?.[0];if(!X)throw Error("Ollama returned empty embeddings response");let Y=new Float32Array(X);return V0.create({embedding:Y,model:this.model,dimensions:this.dimensions})}async embedBatch($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:$})});if(!Z.ok){let X=await Z.text();this.throwWithHint(Z.status,X)}return(await Z.json()).embeddings.map((X)=>V0.create({embedding:new Float32Array(X),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}throwWithHint($,Z){if($===404||Z.includes("not found"))throw Error(`Ollama error ${$}: ${Z}. Model '${this.model}' not found. Run: ollama pull ${this.model}`);throw Error(`Ollama error ${$}: ${Z}`)}}var x5=()=>{};function g0($){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:",$.map((K)=>`[${K.timestamp.toISOString()}] ${K.role.toUpperCase()}: ${K.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(`
776
1203
 
777
1204
  `)].join(`
778
- `)}function m0($){let Z=$.trim(),K=Z.match(/\[\s*\{[\s\S]*\}\s*\]/),X=K?K[0]:Z;try{let Y=JSON.parse(X);if(!Array.isArray(Y))return[];let Q=[];for(let G of Y){if(typeof G.content!=="string"||G.content.trim()==="")continue;let J=["decision","learning","preference","friction","observation"].includes(G.type)?G.type:"observation",H=typeof G.confidence==="number"?Math.max(0,Math.min(1,G.confidence)):0.8;Q.push({type:J,content:G.content.trim(),metadata:G.metadata&&typeof G.metadata==="object"?G.metadata:void 0,confidence:H})}return Q}catch(Y){return console.error("Failed to parse LLM facts JSON response:",Y),[]}}import P7 from"@anthropic-ai/sdk";class b9{providerId="anthropic";modelName;anthropic;constructor($){this.modelName=$.model??"claude-3-5-sonnet-20241022",this.anthropic=new P7({apiKey:$.apiKey})}async extract($){if($.length===0)return[];let Z=g0($);try{let X=(await this.anthropic.messages.create({model:this.modelName,max_tokens:4000,messages:[{role:"user",content:Z}]})).content[0],Y=X&&"text"in X?X.text:"";return m0(Y)}catch(K){throw console.error("Anthropic fact extraction API failed:",K),Error(`Anthropic API error: ${K.message}`)}}}var E5=()=>{};import{spawn as D7}from"child_process";class f9{providerId="claude-cli";modelName="claude-cli-print";async extract($){if($.length===0)return[];let Z=g0($);return new Promise((K,X)=>{let Y={...process.env};delete Y.CLAUDECODE;let Q=D7("claude",["-p","--output-format","text"],{env:Y,stdio:["pipe","pipe","pipe"]}),G="",_="";Q.stdout.on("data",(J)=>{G+=J.toString()}),Q.stderr.on("data",(J)=>{_+=J.toString()}),Q.on("error",(J)=>{X(Error(`Failed to spawn claude -p: ${J.message}`))}),Q.on("close",(J)=>{if(J===0)K(m0(G));else X(Error(`claude -p exited with code ${J}: ${_.trim()}`))}),Q.stdin.write(Z),Q.stdin.end()})}}var P5=()=>{};class h9{providerId="ollama";modelName;baseUrl;constructor($){this.baseUrl=$.baseUrl??"http://localhost:11434",this.modelName=$.model??"llama3"}async extract($){if($.length===0)return[];let Z=g0($);try{let K=`${this.baseUrl}/api/generate`,X=await fetch(K,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelName,prompt:Z,stream:!1,options:{temperature:0.1}})});if(!X.ok){let G=await X.text();throw Error(`HTTP ${X.status}: ${G}`)}let Q=(await X.json())?.response??"";return m0(Q)}catch(K){throw console.error("Ollama fact extraction API failed:",K),Error(`Ollama API error: ${K.message}`)}}}var D5=()=>{};class r4{providerId;modelName;apiKey;baseUrl;constructor($){this.apiKey=$.apiKey,this.providerId=$.providerId??"openai",this.modelName=$.model??"gpt-4o",this.baseUrl=$.baseUrl??"https://api.openai.com/v1"}async extract($){if($.length===0)return[];let Z=g0($);try{let K=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:Z}],temperature:0.1})});if(!K.ok){let Q=await K.text();throw Error(`HTTP ${K.status}: ${Q}`)}let Y=(await K.json())?.choices?.[0]?.message?.content??"";return m0(Y)}catch(K){throw console.error("OpenAI fact extraction API failed:",K),Error(`OpenAI API error: ${K.message}`)}}}var k5=()=>{};function M1($){return{ready:!0,readyReason:$}}function J4($){return{ready:!1,readyReason:$}}function G4($,Z,K){let X=Q4($,Z);if(X.source==="missing")return J4(X.ref?"API key reference configured but not available at runtime; run through a secret injector or set embedding.apiKeyEnv":K);if(X.deprecatedPlaintext)return M1("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return M1()}function _4($,Z,K){let X=Q4($,Z);if(!X.apiKey)throw Error(`${K} API key is required. Set ${Z.join(" or ")} or configure embedding.apiKeyEnv for runtime injection. apiKeyRef is an opaque reference and is not resolved by memory-nexus.`);return X.apiKey}function S5($,Z){if(!$.baseUrl)throw Error(`openai-compatible ${Z} provider requires embedding.baseUrl`);return $.baseUrl}function k7(){return v5.map(($)=>$.id)}function S7(){return C5.map(($)=>$.id)}function w5($){return`Unsupported embedding provider: "${$}". Supported: ${k7().join(", ")}`}function b5($){return`Unsupported extraction provider: "${$}". Supported: ${S7().join(", ")}`}function f5($){let Z=y5.get($.provider);if(!Z)return J4(w5($.provider));return Z.checkReadiness($)}function h5($){let Z=y5.get($.provider);if(!Z)throw Error(w5($.provider));return Z.create($)}function o4($,Z=process.env){let K=Z.LLM_PROVIDER?.trim();if(K)return K;let X=$.embedding?.provider??"claude-cli";return X==="local"?"claude-cli":X}function m9($,Z,K=process.env){let X=g9.get(Z);if(!X)return"";return K.LLM_MODEL?.trim()||X.defaultModel}function g5($,Z=o4($)){let K=g9.get(Z);if(!K)return J4(b5(Z));return K.checkReadiness($.embedding)}function m5($){let Z=o4($),K=g9.get(Z);if(!K)throw Error(b5(Z));return K.create($.embedding,m9($,Z))}var v5,C5,y5,g9;var t4=L(()=>{K0();M5();j5();x5();E5();P5();D5();k5();P9();v5=[{id:"local",defaultModel:B0.local.model,defaultDimensions:B0.local.dimensions,checkReadiness:()=>M1(),create:($)=>new y9({model:$.model,dimensions:$.dimensions})},{id:"openai",defaultModel:B0.openai.model,defaultDimensions:B0.openai.dimensions,checkReadiness:($)=>G4($,["OPENAI_API_KEY"],"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:($)=>new i4({apiKey:_4($,["OPENAI_API_KEY"],"OpenAI embedding"),model:$.model,dimensions:$.dimensions,baseUrl:$.baseUrl})},{id:"ollama",defaultModel:B0.ollama.model,defaultDimensions:B0.ollama.dimensions,checkReadiness:()=>M1("Server reachability verified at sync time"),create:($)=>new w9({model:$.model,dimensions:$.dimensions,baseUrl:$.baseUrl})},{id:"openai-compatible",defaultModel:B0["openai-compatible"].model,defaultDimensions:B0["openai-compatible"].dimensions,checkReadiness:($)=>{if(!$.baseUrl)return J4("openai-compatible embedding provider requires embedding.baseUrl");return G4($,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:($)=>new i4({apiKey:_4($,[],"openai-compatible embedding"),model:$.model,dimensions:$.dimensions,baseUrl:S5($,"embedding"),providerId:"openai-compatible"})}],C5=[{id:"anthropic",defaultModel:L1.anthropic,checkReadiness:($)=>G4($,["ANTHROPIC_API_KEY"],"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:($,Z)=>new b9({apiKey:_4($,["ANTHROPIC_API_KEY"],"Anthropic extraction"),model:Z})},{id:"openai",defaultModel:L1.openai,checkReadiness:($)=>G4($,["OPENAI_API_KEY"],"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:($,Z)=>new r4({apiKey:_4($,["OPENAI_API_KEY"],"OpenAI extraction"),model:Z})},{id:"ollama",defaultModel:L1.ollama,checkReadiness:()=>M1(),create:($,Z)=>new h9({baseUrl:$.baseUrl,model:Z})},{id:"claude-cli",defaultModel:L1["claude-cli"],checkReadiness:()=>M1(),create:()=>new f9},{id:"openai-compatible",defaultModel:L1["openai-compatible"],checkReadiness:($)=>{if(!$.baseUrl)return J4("openai-compatible extraction provider requires embedding.baseUrl");return G4($,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:($,Z)=>new r4({apiKey:_4($,[],"openai-compatible extraction"),model:Z,baseUrl:S5($,"extraction"),providerId:"openai-compatible"})}],y5=new Map(v5.map(($)=>[$.id,$])),g9=new Map(C5.map(($)=>[$.id,$]))});import{Database as u9}from"bun:sqlite";import{accessSync as c5,constants as u5,existsSync as d9,statSync as v7}from"fs";import{homedir as C7}from"os";import{join as c9}from"path";function p5($){try{return $.query("PRAGMA integrity_check(1);").get()?.integrity_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function p9($){try{return $.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function j1($){if(!d9($))return{readable:!1,writable:!1};let Z=!1,K=!1;try{c5($,u5.R_OK),Z=!0}catch{}try{c5($,u5.W_OK),K=!0}catch{}return{readable:Z,writable:K}}function l9($,Z,K,X){let Y=X??F0(K),Q=h(Z),_=R1(1,$)[0];return{installed:Y.sessionEnd&&Y.preCompact,enabled:Q.autoSync,lastRun:_?new Date(_.timestamp):null}}function n9($){let Z=[];try{let K=h($);if(typeof K.autoSync!=="boolean")Z.push("autoSync is not a boolean");if(typeof K.recoveryOnStartup!=="boolean")Z.push("recoveryOnStartup is not a boolean");if(typeof K.syncOnCompaction!=="boolean")Z.push("syncOnCompaction is not a boolean");if(typeof K.timeout!=="number"||!Number.isFinite(K.timeout)||K.timeout<0)Z.push("timeout is not a valid positive number");if(!d5.includes(K.logLevel))Z.push(`logLevel "${K.logLevel}" is not valid (expected: ${d5.join(", ")})`);if(typeof K.logRetentionDays!=="number"||!Number.isFinite(K.logRetentionDays)||K.logRetentionDays<0)Z.push("logRetentionDays is not a valid positive number");if(typeof K.showFailures!=="boolean")Z.push("showFailures is not a boolean");return{valid:Z.length===0,issues:Z}}catch(K){let X=A(K);return Z.push(`Failed to load config: ${X}`),{valid:!1,issues:Z}}}function a9(){try{let $=n0("sqlite-vec"),Z=new u9(":memory:");try{return $.load(Z),{available:!0,version:Z.query("SELECT vec_version()").get()["vec_version()"]}}finally{Z.close()}}catch{return{available:!1,version:null}}}function i9($){let K=h($).embedding,X=f5(K);return{configured:!0,provider:K.provider,model:K.model,dimensions:K.dimensions,enabled:K.enabled,ready:X.ready,readyReason:X.readyReason}}function y7($){let Z=h($),K=o4(Z),X=g5(Z,K);return{provider:K,model:m9(Z,K),ready:X.ready,readyReason:X.readyReason}}function s4($){let Z=$?.dbPath??P(),K=b7(Z),X=$?.configDir??$1(),Y=$?.logsDir??T1(),Q=$?.sourceDir??c9(C7(),".claude","projects"),G=$?.logsDir?c9($.logsDir,"sync.log"):void 0,_=$?.configDir?c9($.configDir,"config.json"):void 0,J=j1(X),H=j1(Y),V=j1(Q),B={configDir:J.readable&&J.writable,logsDir:H.readable&&H.writable,sourceDir:V.readable},z=l9(G,_,$?.hookOverrides,$?.preCalculatedHookStatus),W=n9(_),N=h(_),q=i9(_),I=a9(),T=w7(Z,I,N),U=y7(_);return{database:K,permissions:B,hooks:z,config:W,embedding:q,sqliteVec:I,searchCapability:T,llmExtraction:U}}function w7($,Z,K){let X=0,Y=0;try{if(d9($)){let G=new u9($,{create:!1,readonly:!0});try{X=G.query("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0,Y=G.query("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}finally{G.close()}}}catch{}let Q=Y>0?Math.round(X/Y*100):0;return{fts5:!0,sqliteVec:Z.available,embeddedCount:X,totalMessages:Y,coveragePercent:Q,defaultMode:K.search?.defaultMode??"auto",vectorReady:Z.available&&X>0}}function b7($){if(!d9($))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let K=j1($),X=0;try{X=v7($).size}catch{}let Y="unknown";if(K.readable)try{let Q=new u9($,{create:!1,readonly:!0});try{Y=p9(Q)}finally{Q.close()}}catch{Y="corrupted"}return{exists:!0,readable:K.readable,writable:K.writable,integrity:Y,size:X}}var d5;var l5=L(()=>{R9();F1();t4();d5=["debug","info","warn","error"]});var r9={};y(r9,{runHealthCheck:()=>s4,initializeDatabaseSafe:()=>$5,initializeDatabase:()=>S,getDefaultDbPath:()=>P,createSchema:()=>f4,closeDatabase:()=>D,checkpointDatabase:()=>e3,checkSqliteVecAvailability:()=>a9,checkQuickIntegrity:()=>p9,checkHookStatus:()=>l9,checkFts5Support:()=>$4,checkEmbeddingConfig:()=>i9,checkDirectoryPermissions:()=>j1,checkDatabaseIntegrity:()=>p5,checkConfigValidity:()=>n9,bulkOperationCheckpoint:()=>m4,TOPICS_TABLE:()=>m3,TOOL_USES_TABLE:()=>h3,SqliteToolUseRepository:()=>f0,SqliteStatsService:()=>h0,SqliteSessionRepository:()=>g,SqliteProjectResolver:()=>e0,SqliteMessageRepository:()=>G0,SqliteLinkRepository:()=>N1,SqliteFrictionRepository:()=>x0,SqliteExtractionStateRepository:()=>b0,SqliteContextService:()=>s0,SqliteBackfillStateRepository:()=>X4,SESSIONS_TABLE:()=>w3,SCHEMA_SQL:()=>U9,MESSAGE_EMBEDDINGS_TABLE:()=>d3,MESSAGES_META_TABLE:()=>b3,MESSAGES_FTS_TABLE:()=>f3,LINKS_TABLE:()=>g3,HybridSearchService:()=>U1,Fts5SearchService:()=>O1,FRICTION_LOG_TABLE:()=>l3,EmbeddingRepository:()=>j0,EXTRACTION_STATE_TABLE:()=>c3,EMBEDDING_STATE_TABLE:()=>u3,EMBEDDING_STATE_ADD_MODEL_NAME:()=>p3,BACKFILL_STATE_TABLE:()=>n3});var c=L(()=>{L9();R9();E9();A5();l5()});import{readdir as o9,stat as H4}from"fs/promises";import{join as V4}from"path";import{homedir as f7}from"os";class c0{claudeProjectsDir;resolver;constructor($){this.claudeProjectsDir=$?.claudeDir??V4(f7(),".claude","projects"),this.resolver=$?.projectNameResolver}async discoverSessions(){let $=[];try{await H4(this.claudeProjectsDir)}catch{return $}let Z;try{Z=await o9(this.claudeProjectsDir)}catch{return $}for(let K of Z){let X=V4(this.claudeProjectsDir,K);try{if(!(await H4(X)).isDirectory())continue}catch{continue}let Y;try{if(Y=t.fromEncoded(K),this.resolver){let Q=this.resolver.resolveFromEncodedPath(K);if(Q!==Y.projectName)Y=Y.withProjectName(Q)}}catch{continue}await this.scanProjectDirectory(X,Y,$)}return $}async getSessionFile($){return(await this.discoverSessions()).find((X)=>X.id===$)?.path??null}async scanProjectDirectory($,Z,K){let X;try{X=await o9($)}catch{return}for(let Y of X){let Q=V4($,Y);try{let G=await H4(Q);if(G.isFile()&&Y.endsWith(".jsonl")){let _=Y.slice(0,-6);K.push({id:_,path:Q,projectPath:Z,modifiedTime:G.mtime,size:G.size})}else if(G.isDirectory())await this.scanSubagentsDirectory(Q,Z,K)}catch{continue}}}async scanSubagentsDirectory($,Z,K){let X=V4($,"subagents");try{if(!(await H4(X)).isDirectory())return}catch{return}let Y;try{Y=await o9(X)}catch{return}for(let Q of Y){if(!Q.endsWith(".jsonl"))continue;let G=V4(X,Q);try{let _=await H4(G);if(_.isFile()){let J=Q.slice(0,-6);K.push({id:J,path:G,projectPath:Z,modifiedTime:_.mtime,size:_.size})}}catch{continue}}}}var n5=()=>{};import{readdirSync as h7,statSync as g7}from"fs";function m7($){return $.replace(/ /g,"-").replace(/-/g,"-")}class e4{rootDir;cache=new Map;dirCache=new Map;constructor($){this.rootDir=$}resolveFromEncodedPath($){let Z=/^[A-Za-z]--/,K=$;if(Z.test(K))K=K.slice(3);else if(K.startsWith("-"))K=K.slice(1);return this.resolveProjectName(K)}resolveProjectName($){let Z=this.cache.get($);if(Z!==void 0)return Z;let K=this.walkAndResolve(this.rootDir,$);return this.cache.set($,K),K}walkAndResolve($,Z){if(Z==="")return"";let K=this.listSubdirectories($),X=[];for(let Q of K){let G=m7(Q);X.push({name:Q,encoded:G})}X.sort((Q,G)=>G.encoded.length-Q.encoded.length);for(let Q of X){if(Z===Q.encoded)return Q.name;if(Z.startsWith(Q.encoded+"-")){let G=Z.slice(Q.encoded.length+1),_=`${$}/${Q.name}`,J=this.walkAndResolve(_,G);if(J!==this.fallbackLastSegment(G))return J;return J}}let Y=this.probeHiddenDirectories($,Z);if(Y!==void 0)return Y;return this.fallbackLastSegment(Z)}probeHiddenDirectories($,Z){let K=Z.split("-");for(let X=1;X<K.length;X++){let Y=K.slice(0,X).join("-"),Q=`${$}/${Y}`;if(this.isDirectory(Q)){let G=K.slice(X).join("-");if(G==="")return Y;let _=this.walkAndResolve(Q,G);if(_!==this.fallbackLastSegment(G))return _}}return}isDirectory($){try{return g7($).isDirectory()}catch{return!1}}listSubdirectories($){let Z=this.dirCache.get($);if(Z!==void 0)return Z;try{let X=h7($,{withFileTypes:!0}).filter((Y)=>Y.isDirectory()).map((Y)=>Y.name);return this.dirCache.set($,X),X}catch{return this.dirCache.set($,[]),[]}}fallbackLastSegment($){let Z=$.split("-");return Z[Z.length-1]??""}}var a5=()=>{};import{readdir as c7,readFile as u7,stat as d7}from"fs/promises";import{join as p7,relative as l7}from"path";import{createHash as n7}from"crypto";class $${async discoverFiles(){let $=c1();try{await d7($)}catch{return[]}let Z=[];return await this.scanDirectory($,$,Z),Z}async scanDirectory($,Z,K){let X;try{X=await c7($,{withFileTypes:!0})}catch{return}for(let Y of X){let Q=p7($,Y.name);if(Y.isDirectory())await this.scanDirectory(Q,Z,K);else if(Y.isFile()&&Y.name.endsWith(".md")){let G=l7(Z,Q).split("\\").join("/"),_=this.classifyFileType(G);if(!_)continue;let J=await u7(Q,"utf8"),H=n7("sha256").update(J,"utf8").digest("hex"),V=this.extractProjectEncoded(G);K.push({filePath:G,absolutePath:Q,fileType:_,projectEncoded:V,contentHash:H,content:J})}}}classifyFileType($){if($.startsWith("daily/"))return"daily_log";if($.endsWith("DECISIONS.md"))return"decisions";if($.endsWith("LEARNINGS.md"))return"learnings";if($.endsWith("USER-PREFS.md"))return"user_prefs";return null}extractProjectEncoded($){return $.match(/^projects\/([^/]+)\//)?.[1]??void 0}}var i5=L(()=>{l()});var W4=L(()=>{n5();a5();i5()});function z0($,Z){let K=Z??new Date,X=$.getTime()-K.getTime(),Y=Math.abs(X);if(Y<3600000){let G=Math.round(X/60000);return B4.format(G,"minute")}if(Y<86400000){let G=Math.round(X/3600000);return B4.format(G,"hour")}if(Y<604800000){let G=Math.round(X/86400000);return B4.format(G,"day")}if(Y<2592000000){let G=Math.round(X/604800000);return B4.format(G,"week")}let Q=Math.round(X/2592000000);return B4.format(Q,"month")}function Z1($){let Z=$.getFullYear(),K=String($.getMonth()+1).padStart(2,"0"),X=String($.getDate()).padStart(2,"0"),Y=String($.getHours()).padStart(2,"0"),Q=String($.getMinutes()).padStart(2,"0");return`${Z}-${K}-${X} ${Y}:${Q}`}function I0($,Z){let K=z0($,Z),X=Z1($);return`${K} (${X})`}var B4;var u0=L(()=>{B4=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function v($){let Z=$?.noColor??!!process.env.NO_COLOR,K=$?.forceColor??!!process.env.FORCE_COLOR,X=$?.isTTY??process.stdout.isTTY===!0;if(Z)return!1;if(K)return!0;return X}function P1($,Z,K){if(!K)return $;return`\x1B[${Z}m${$}\x1B[0m`}function s($,Z){return P1($,"1",Z??v())}function k($,Z){return P1($,"2",Z??v())}function w($,Z){return P1($,"32",Z??v())}function m($,Z){return P1($,"31",Z??v())}function u($,Z){return P1($,"33",Z??v())}function GZ($,Z){return P1($,"36",Z??v())}import _Z from"string-width";function e9($){return _Z($)}function $2($,Z){if(Z<=0)return"";if(e9($)<=Z)return $;let K="...",X=3;if(Z<=X)return".".repeat(Z);let Y=Z-X,Q="",G=0;for(let _ of $){let J=_Z(_);if(G+J>Y)break;Q+=_,G+=J}return Q+K}function G$($,Z){let K=e9($);if(K>=Z)return $;return $+" ".repeat(Z-K)}function Z2(){return process.stdout.columns||80}function K2($,Z,K=20){let X=Z2(),Y=e9(Z),Q=X-Y;return $2($,Q>K?Q:K)}var X2=()=>{};function _$($,Z={}){let K=BZ($.snippet),X=$.snippet.replace(/<\/?mark>/g,""),Y={sessionId:$.sessionId,messageId:$.messageId,role:$.role,score:$.score,timestamp:$.timestamp.toISOString(),snippet:X};if(Z.includeSearchMetaFields){if(Z.rank!==void 0)Y.rank=Z.rank;let Q=$.rawScores;if(Q)Y.raw_scores=Q;if($.source)Y.source=$.source;if(K.length>0)Y.highlights=K}return Y}function JZ($){let Z={score:$.score,file:$.file,title:$.title};if($.docid!==void 0)Z.docid=$.docid;if($.context!==void 0)Z.context=$.context;if($.snippet!==void 0)Z.snippet=$.snippet;return Z}function J$($){let Z={id:$.id,project:$.projectPath.projectName,projectPath:$.projectPath.decoded,startTime:$.startTime.toISOString()};if($.endTime)Z.endTime=$.endTime.toISOString();if($.messageCount!==void 0)Z.messageCount=$.messageCount;if($.summary!==void 0)Z.summary=$.summary;return Z}function HZ($){return{session:J$($.session),messages:$.messages.map(VK),toolUses:Array.from($.toolUses.values()).map(WK)}}function VK($){return{id:$.id,role:$.role,timestamp:$.timestamp.toISOString(),content:$.content}}function WK($){let Z={id:$.id,name:$.name,status:$.status,input:$.input};if($.result!==void 0)Z.result=$.result;return Z}function VZ($){return{session:J$($.session),weight:$.weight,hops:$.hops}}function Y2($){let Z={totalSessions:$.totalSessions,totalMessages:$.totalMessages,totalToolUses:$.totalToolUses,databaseSizeBytes:$.databaseSizeBytes,projectBreakdown:$.projectBreakdown.map((K)=>({projectName:K.projectName,sessionCount:K.sessionCount,messageCount:K.messageCount}))};if($.hooks)Z.hooks={installed:$.hooks.installed,autoSync:$.hooks.autoSync,pendingSessions:$.hooks.pendingSessions};return Z}function WZ($){return{projectName:$.projectName,projectPathDecoded:$.projectPathDecoded,sessionCount:$.sessionCount,totalMessages:$.totalMessages,userMessages:$.userMessages,assistantMessages:$.assistantMessages,recentTopics:[...$.recentTopics],recentToolUses:$.recentToolUses.map((Z)=>({name:Z.name,count:Z.count})),lastActivity:$.lastActivity?$.lastActivity.toISOString():null}}var d0=L(()=>{H$()});function Q2($,Z){switch($){case"json":return new qZ;case"quiet":return new OZ;case"verbose":return new UZ(Z);case"brief":return new NZ;default:return new AZ(Z)}}function BZ($){let Z=[],K=0,X=0;while(X<$.length)if($.startsWith("<mark>",X)){X+=6;let Y=$.indexOf("</mark>",X);if(Y===-1)break;Z.push({offset:K,length:Y-X}),K+=Y-X,X=Y+7}else K++,X++;return Z}function zZ($,Z){if(!Z)return $.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return $.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class AZ{useColor;constructor($){this.useColor=$}formatResults($,Z){let K=Z?.contextBudget??D1;if($.length===0)return`No results found for: ${Z?.query??"query"}`;let X=`Found ${$.length} result(s):
779
-
780
- `;for(let Y=0;Y<$.length;Y++){let Q=$[Y];if(!Q)continue;let G=this.formatResult(Q,Y+1);if(X.length+G.length>K){X+=`
781
- (Output truncated - ${D1.toLocaleString()} char limit)
782
- `;break}X+=G}return X}formatResult($,Z){let K=($.score*100).toFixed(0),X=$.sessionId.substring(0,16),Y=I0($.timestamp),Q=zZ($.snippet,this.useColor),G=$.role.charAt(0).toUpperCase()+$.role.slice(1),_=K2(Q," ");return`${Z}. [${K}%] [${G}] ${X}...
783
- ${Y}
784
- ${_}
785
-
786
- `}formatError($){return`Error: ${A($)}`}formatSummary($){let Z=`Found ${$.found} results (showing ${$.shown})`;if($.truncated)Z+=" - truncated";return Z}}class NZ{formatResults($,Z){if($.length===0)return`No results for "${Z?.query??""}"`;return $.map((K)=>{let X=K.snippet.replace(/<\/?mark>/g,"").replace(/\s+/g," ").trim().slice(0,80),Y=Math.round(K.score*100);return`${K.sessionId} [${Y}%] ${X}`}).join(`
787
- `)}formatError($){return`Error: ${A($)}`}formatSummary($){return""}}class qZ{formatResults($,Z){let K=Z?.contextBudget??D1,X=$.map((Q,G)=>_$(Q,{rank:G+1,includeSearchMetaFields:!!Z?.searchMeta}));if(Z?.searchMeta){let Q={query:Z.query??"",mode:Z.searchMeta.mode,mode_reason:Z.searchMeta.modeReason,total_results:$.length,embedding_coverage:Z.searchMeta.embeddingCoverage,degraded:Z.searchMeta.degraded,capabilities:Z.searchMeta.capabilities,timing_ms:Z.searchMeta.timingMs};if(Z.searchMeta.degradationReason)Q.degradation_reason=Z.searchMeta.degradationReason;return JSON.stringify({meta:Q,results:X},null,2)}let Y=JSON.stringify(X,null,2);if(Y.length>K){let Q=X.length;while(Q>0){let G=X.slice(0,Q);if(Y=JSON.stringify(G,null,2),Y.length<=K)break;Q--}}return Y}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatSummary($){return""}}class OZ{formatResults($,Z){if($.length===0)return"";let K=Z2();return $.map((X)=>{let Y=X.sessionId.substring(0,16),Q=X.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),G=`${Y} ${Q}`;return $2(G,K)}).join(`
788
- `)}formatError($){return`Error: ${A($)}`}formatSummary($){return""}}class UZ{useColor;constructor($){this.useColor=$}formatResults($,Z){let K=Z?.contextBudget??D1;if($.length===0)return`No results found for: ${Z?.query??"query"}`;let X="";if(Z?.searchMeta){if(X+=`Mode: ${Z.searchMeta.mode}`,Z.searchMeta.degraded)X+=` (degraded: ${Z.searchMeta.degradationReason??"unknown"})`;X+=`
789
- `}if(Z?.executionDetails){let Y=Z.executionDetails;if(X+=`=== Execution Details ===
790
- `,Y.timeMs!==void 0)X+=`Time: ${Y.timeMs}ms
791
- `;if(Y.ftsQuery)X+=`FTS5 Query: ${Y.ftsQuery}
792
- `;if(Y.filtersApplied&&Y.filtersApplied.length>0)X+=`Filters: ${Y.filtersApplied.join(", ")}
793
- `;X+=`
794
- `}X+=`Found ${$.length} result(s):
795
-
796
- `;for(let Y=0;Y<$.length;Y++){let Q=$[Y];if(!Q)continue;let G=this.formatResult(Q,Y+1,!!Z?.searchMeta);if(X.length+G.length>K){X+=`
797
- (Output truncated - ${D1.toLocaleString()} char limit)
798
- `;break}X+=G}return X}formatResult($,Z,K){let X=($.score*100).toFixed(0),Y=I0($.timestamp),Q=zZ($.snippet,this.useColor),G=$.role.charAt(0).toUpperCase()+$.role.slice(1),_=K2(Q," "),J=`${Z}. [${X}%] [${G}] ${$.sessionId}
799
- ${Y}
800
- ${_}
801
- `;if(K&&$.rawScores){let H=[];if($.rawScores.bm25!==void 0)H.push(`bm25: ${$.rawScores.bm25}`);if($.rawScores.cosine!==void 0)H.push(`cosine: ${$.rawScores.cosine}`);if($.rawScores.rrf!==void 0)H.push(`rrf: ${$.rawScores.rrf}`);if(H.length>0)J+=` Scores: ${H.join(", ")}
802
- `;if($.source)J+=` Source: ${$.source}
803
- `}return J+=`
804
- `,J}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
805
- ${K??""}`}formatSummary($){let Z=`=== Summary ===
806
- Found ${$.found} results (showing ${$.shown})`;if($.truncated)Z+=" - truncated due to context budget";return Z}}var D1=50000;var H$=L(()=>{u0();X2();d0()});function G2($,Z){switch($){case"json":return new TZ;case"quiet":return new RZ;case"verbose":return new FZ(Z);case"brief":return new IZ;default:return new LZ(Z)}}function V$($,Z,K){return $===1?Z:K}class LZ{useColor;constructor($){this.useColor=$}formatSessions($,Z){let K=$.length,X=`Sessions (${K} ${V$(K,"result","results")}):
807
-
808
- `;for(let Y of $)X+=this.formatSession(Y);return X}formatSession($){let Z=$.id.substring(0,8),K=$.projectPath.projectName,X=z0($.startTime),Y=$.messageCount,Q=`${Y} ${V$(Y,"message","messages")}`,G=G$(Z,10),_=G$(K,20),J=G$(X,18);return` ${G}${_}${J}${k(Q,this.useColor)}
809
- `}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}class IZ{formatSessions($,Z){if($.length===0)return this.formatEmpty();return $.map((K)=>{let X=K.id.substring(0,8),Y=K.projectPath.projectName,Q=K.messageCount,G=z0(K.startTime);return`${X} ${Y} ${Q} ${G}`}).join(`
810
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions found."}}class TZ{formatSessions($,Z){let K=$.map((X)=>({id:X.id,projectPath:X.projectPath.decoded,projectName:X.projectPath.projectName,startTime:X.startTime.toISOString(),endTime:X.endTime?.toISOString()??null,messageCount:X.messageCount}));return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty(){return"[]"}}class RZ{formatSessions($,Z){if($.length===0)return"";return $.map((K)=>K.id).join(`
811
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return""}}class FZ{useColor;constructor($){this.useColor=$}formatSessions($,Z){let K="";if(Z){if(K+=`=== Execution Details ===
812
- `,Z.executionTimeMs!==void 0)K+=`Time: ${Z.executionTimeMs}ms
813
- `;if(Z.filtersApplied&&Z.filtersApplied.length>0)K+=`Filters: ${Z.filtersApplied.join(", ")}
814
- `;K+=`
815
- `}let X=$.length;K+=`Sessions (${X} ${V$(X,"result","results")}):
816
-
817
- `;for(let Y of $)K+=this.formatSession(Y);return K}formatSession($){let Z=$.projectPath.projectName,K=$.projectPath.decoded,X=I0($.startTime),Y=$.messageCount,Q=`${Y} ${V$(Y,"message","messages")}`,G=` ${$.id}
818
- `;return G+=` Project: ${Z} (${K})
819
- `,G+=` Started: ${X}
820
- `,G+=` ${k(Q,this.useColor)}
821
-
822
- `,G}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
823
- ${K??""}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}var _2=L(()=>{u0();X2()});function J2($){if($<1024)return`${$} B`;else if($<1048576)return`${($/1024).toFixed(1)} KB`;else if($<1073741824)return`${($/1048576).toFixed(1)} MB`;else return`${($/1073741824).toFixed(1)} GB`}function e($){return new Intl.NumberFormat("en-US").format($)}function H2($,Z){switch($){case"json":return new xZ;case"quiet":return new EZ;case"verbose":return new PZ(Z);case"brief":return new MZ;default:return new jZ(Z)}}class MZ{formatStats($,Z){return[`${e($.totalSessions)} sessions`,`${e($.totalMessages)} messages`,`${e($.totalToolUses)} tool uses`,`${e($.projectBreakdown.length)} projects`,`${J2($.databaseSizeBytes)}`].join(`
824
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return`0 sessions
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
+
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
+ (Output truncated - ${j_.toLocaleString()} char limit)
1209
+ `;break}$+=Y}return $}formatResult(A,_){let G=(A.score*100).toFixed(0),$=A.sessionId.substring(0,16),K=vA(A.timestamp),Z=v9(A.snippet,this.useColor),Y=A.role.charAt(0).toUpperCase()+A.role.slice(1),J=B2(Z," ");return`${_}. [${G}%] [${Y}] ${$}...
1210
+ ${K}
1211
+ ${J}
1212
+
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)=>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
+ `)}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
+ `}if(_?.executionDetails){let K=_.executionDetails;if($+=`=== Execution Details ===
1217
+ `,K.timeMs!==void 0)$+=`Time: ${K.timeMs}ms
1218
+ `;if(K.ftsQuery)$+=`FTS5 Query: ${K.ftsQuery}
1219
+ `;if(K.filtersApplied&&K.filtersApplied.length>0)$+=`Filters: ${K.filtersApplied.join(", ")}
1220
+ `;$+=`
1221
+ `}$+=`Found ${A.length} result(s):
1222
+
1223
+ `;for(let K=0;K<A.length;K++){let Z=A[K];if(!Z)continue;let Y=this.formatResult(Z,K+1,!!_?.searchMeta);if($.length+Y.length>G){$+=`
1224
+ (Output truncated - ${j_.toLocaleString()} char limit)
1225
+ `;break}$+=Y}return $}formatResult(A,_,G){let $=(A.score*100).toFixed(0),K=vA(A.timestamp),Z=v9(A.snippet,this.useColor),Y=A.role.charAt(0).toUpperCase()+A.role.slice(1),J=B2(Z," "),H=`${_}. [${$}%] [${Y}] ${A.sessionId}
1226
+ ${K}
1227
+ ${J}
1228
+ `;if(G&&A.rawScores){let Q=[];if(A.rawScores.bm25!==void 0)Q.push(`bm25: ${A.rawScores.bm25}`);if(A.rawScores.cosine!==void 0)Q.push(`cosine: ${A.rawScores.cosine}`);if(A.rawScores.rrf!==void 0)Q.push(`rrf: ${A.rawScores.rrf}`);if(Q.length>0)H+=` Scores: ${Q.join(", ")}
1229
+ `;if(A.source)H+=` Source: ${A.source}
1230
+ `}return H+=`
1231
+ `,H}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
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 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
+
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
+ `}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
+ `)}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
+ `)}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
+ `,_.executionTimeMs!==void 0)G+=`Time: ${_.executionTimeMs}ms
1240
+ `;if(_.filtersApplied&&_.filtersApplied.length>0)G+=`Filters: ${_.filtersApplied.join(", ")}
1241
+ `;G+=`
1242
+ `}let $=A.length;G+=`Sessions (${$} ${l$($,"result","results")}):
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} ${l$(K,"message","messages")}`,Y=` ${A.id}
1245
+ `;return Y+=` Project: ${_} (${G})
1246
+ `,Y+=` Started: ${$}
1247
+ `,Y+=` ${P(Z,this.useColor)}
1248
+
1249
+ `,Y}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1250
+ ${G??""}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}var M2=U(()=>{N0();W2()});function q2(A){if(A<1024)return`${A} B`;else if(A<1048576)return`${(A/1024).toFixed(1)} KB`;else if(A<1073741824)return`${(A/1048576).toFixed(1)} MB`;else return`${(A/1073741824).toFixed(1)} GB`}function ZA(A){return new Intl.NumberFormat("en-US").format(A)}function U2(A,_){switch(A){case"json":return new i9;case"quiet":return new a9;case"verbose":return new r9(_);case"brief":return new p9;default:return new n9(_)}}class p9{formatStats(A,_){return[`${ZA(A.totalSessions)} sessions`,`${ZA(A.totalMessages)} messages`,`${ZA(A.totalToolUses)} tool uses`,`${ZA(A.projectBreakdown.length)} projects`,`${q2(A.databaseSizeBytes)}`].join(`
1251
+ `)}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return`0 sessions
825
1252
  0 messages
826
1253
  0 tool uses
827
1254
  0 projects
828
- 0 B`}}class jZ{constructor($){}formatStats($,Z){let K="";if(K+=`=== Database Statistics ===
829
-
830
- `,K+=`Totals:
831
- `,K+=` Sessions: ${e($.totalSessions)}
832
- `,K+=` Messages: ${e($.totalMessages)}
833
- `,K+=` Tool Uses: ${e($.totalToolUses)}
834
- `,K+=` Size: ${J2($.databaseSizeBytes)}
835
- `,$.projectBreakdown.length>0){K+=`
1255
+ 0 B`}}class n9{constructor(A){}formatStats(A,_){let G="";if(G+=`=== Database Statistics ===
1256
+
1257
+ `,G+=`Totals:
1258
+ `,G+=` Sessions: ${ZA(A.totalSessions)}
1259
+ `,G+=` Messages: ${ZA(A.totalMessages)}
1260
+ `,G+=` Tool Uses: ${ZA(A.totalToolUses)}
1261
+ `,G+=` Size: ${q2(A.databaseSizeBytes)}
1262
+ `,A.projectBreakdown.length>0){G+=`
836
1263
  Projects:
837
- `;for(let X of $.projectBreakdown)K+=` ${X.projectName}
838
- `,K+=` Sessions: ${e(X.sessionCount)}`,K+=`, Messages: ${e(X.messageCount)}
839
- `}if($.hooks){if(K+=`
1264
+ `;for(let $ of A.projectBreakdown)G+=` ${$.projectName}
1265
+ `,G+=` Sessions: ${ZA($.sessionCount)}`,G+=`, Messages: ${ZA($.messageCount)}
1266
+ `}if(A.hooks){if(G+=`
840
1267
  Hooks:
841
- `,K+=` Installed: ${$.hooks.installed?"yes":"no"}
842
- `,K+=` Auto-sync: ${$.hooks.autoSync?"enabled":"disabled"}
843
- `,K+=` Pending sessions: ${$.hooks.pendingSessions}
844
- `,!$.hooks.installed)K+=`
1268
+ `,G+=` Installed: ${A.hooks.installed?"yes":"no"}
1269
+ `,G+=` Auto-sync: ${A.hooks.autoSync?"enabled":"disabled"}
1270
+ `,G+=` Pending sessions: ${A.hooks.pendingSessions}
1271
+ `,!A.hooks.installed)G+=`
845
1272
  Run 'aidev memory install' to enable automatic sync
846
- `}return K}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}class xZ{formatStats($,Z){let K={totalSessions:$.totalSessions,totalMessages:$.totalMessages,totalToolUses:$.totalToolUses,databaseSizeBytes:$.databaseSizeBytes,projectBreakdown:$.projectBreakdown.map((X)=>({projectName:X.projectName,sessionCount:X.sessionCount,messageCount:X.messageCount}))};if(Z?.executionTimeMs!==void 0)K.executionTimeMs=Z.executionTimeMs;if($.hooks)K.hooks={installed:$.hooks.installed,autoSync:$.hooks.autoSync,pendingSessions:$.hooks.pendingSessions};return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty(){return JSON.stringify({totalSessions:0,totalMessages:0,totalToolUses:0,databaseSizeBytes:0,projectBreakdown:[],empty:!0,message:"No sessions synced. Run 'memory sync' to import data."})}}class EZ{formatStats($,Z){return[`Sessions: ${$.totalSessions}`,`Messages: ${$.totalMessages}`,`Tool uses: ${$.totalToolUses}`,`Size: ${$.databaseSizeBytes}`].join(`
847
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return`Sessions: 0
1273
+ `}return G}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}class i9{formatStats(A,_){let G={totalSessions:A.totalSessions,totalMessages:A.totalMessages,totalToolUses:A.totalToolUses,databaseSizeBytes:A.databaseSizeBytes,projectBreakdown:A.projectBreakdown.map(($)=>({projectName:$.projectName,sessionCount:$.sessionCount,messageCount:$.messageCount}))};if(_?.executionTimeMs!==void 0)G.executionTimeMs=_.executionTimeMs;if(A.hooks)G.hooks={installed:A.hooks.installed,autoSync:A.hooks.autoSync,pendingSessions:A.hooks.pendingSessions};return JSON.stringify(G,null,2)}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatEmpty(){return JSON.stringify({totalSessions:0,totalMessages:0,totalToolUses:0,databaseSizeBytes:0,projectBreakdown:[],empty:!0,message:"No sessions synced. Run 'memory sync' to import data."})}}class a9{formatStats(A,_){return[`Sessions: ${A.totalSessions}`,`Messages: ${A.totalMessages}`,`Tool uses: ${A.totalToolUses}`,`Size: ${A.databaseSizeBytes}`].join(`
1274
+ `)}formatError(A){return`Error: ${L(A)}`}formatEmpty(){return`Sessions: 0
848
1275
  Messages: 0
849
1276
  Tool uses: 0
850
- Size: 0`}}class PZ{constructor($){}formatStats($,Z){let K="";if(Z?.executionTimeMs!==void 0)K+=`=== Execution Details ===
851
- `,K+=`Time: ${Z.executionTimeMs}ms
852
-
853
- `;if(K+=`=== Database Statistics ===
854
-
855
- `,K+=`Totals:
856
- `,K+=` Sessions: ${e($.totalSessions)}
857
- `,K+=` Messages: ${e($.totalMessages)}
858
- `,K+=` Tool Uses: ${e($.totalToolUses)}
859
- `,K+=` Size: ${J2($.databaseSizeBytes)} (${e($.databaseSizeBytes)} bytes)
860
- `,$.projectBreakdown.length>0){K+=`
861
- Projects (${$.projectBreakdown.length}):
862
- `;for(let X of $.projectBreakdown){let Y=X.sessionCount>0?(X.messageCount/X.sessionCount).toFixed(1):"0";K+=` ${X.projectName}
863
- `,K+=` Sessions: ${e(X.sessionCount)}`,K+=`, Messages: ${e(X.messageCount)}`,K+=` (avg ${Y}/session)
864
- `}}if($.hooks){if(K+=`
1277
+ Size: 0`}}class r9{constructor(A){}formatStats(A,_){let G="";if(_?.executionTimeMs!==void 0)G+=`=== Execution Details ===
1278
+ `,G+=`Time: ${_.executionTimeMs}ms
1279
+
1280
+ `;if(G+=`=== Database Statistics ===
1281
+
1282
+ `,G+=`Totals:
1283
+ `,G+=` Sessions: ${ZA(A.totalSessions)}
1284
+ `,G+=` Messages: ${ZA(A.totalMessages)}
1285
+ `,G+=` Tool Uses: ${ZA(A.totalToolUses)}
1286
+ `,G+=` Size: ${q2(A.databaseSizeBytes)} (${ZA(A.databaseSizeBytes)} bytes)
1287
+ `,A.projectBreakdown.length>0){G+=`
1288
+ Projects (${A.projectBreakdown.length}):
1289
+ `;for(let $ of A.projectBreakdown){let K=$.sessionCount>0?($.messageCount/$.sessionCount).toFixed(1):"0";G+=` ${$.projectName}
1290
+ `,G+=` Sessions: ${ZA($.sessionCount)}`,G+=`, Messages: ${ZA($.messageCount)}`,G+=` (avg ${K}/session)
1291
+ `}}if(A.hooks){if(G+=`
865
1292
  Hooks:
866
- `,K+=` Installed: ${$.hooks.installed?"yes":"no"}
867
- `,K+=` Auto-sync: ${$.hooks.autoSync?"enabled":"disabled"}
868
- `,K+=` Pending sessions: ${$.hooks.pendingSessions}
869
- `,!$.hooks.installed)K+=`
1293
+ `,G+=` Installed: ${A.hooks.installed?"yes":"no"}
1294
+ `,G+=` Auto-sync: ${A.hooks.autoSync?"enabled":"disabled"}
1295
+ `,G+=` Pending sessions: ${A.hooks.pendingSessions}
1296
+ `,!A.hooks.installed)G+=`
870
1297
  Run 'aidev memory install' to enable automatic sync
871
- `}return K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
872
- ${K??""}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}var V2=()=>{};function DZ($){return $.replace(BK,"")}function r($){return DZ($).replace(/\n{3,}/g,`
873
-
874
- `).trim()}var BK;var P0=L(()=>{BK=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?\x07|\x1b\(B/g});var yZ={};y(yZ,{createContextFormatter:()=>W$});function W$($,Z){switch($){case"json":return new kZ;case"quiet":return new SZ;case"verbose":return new vZ(Z);case"detailed":return new B2(Z);case"ai":return new CZ;case"brief":case"default":default:return new W2(Z)}}function p0($){return new Intl.NumberFormat("en-US").format($)}function zK($,Z=3){if($.length===0)return"";let K=$.slice(0,Z),X=$.length-Z,Y=K.map((Q)=>`${Q.name} (${Q.count})`).join(", ");if(X>0)return`${Y} (+${X} more)`;return Y}function AK($,Z=3){if($.length===0)return"";let K=$.slice(0,Z),X=$.length-Z,Y=K.join(", ");if(X>0)return`${Y} (+${X} more)`;return Y}class W2{useColor;constructor($){this.useColor=$}formatContext($,Z){let K="";K+=s(`${$.projectName} Context`,this.useColor)+`
875
- `;let X=$.lastActivity?z0($.lastActivity):"never";K+=`Sessions: ${p0($.sessionCount)} | `,K+=`Messages: ${p0($.totalMessages)} | `,K+=`Last active: ${X}
876
- `;let Y=AK($.recentTopics);if(Y)K+=`Topics: ${Y}
877
- `;let Q=zK($.recentToolUses);if(Q)K+=`Tools: ${Q}
878
- `;return K}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return k("No topics extracted yet",this.useColor)}}class B2{useColor;constructor($){this.useColor=$}formatContext($,Z){let K="";if(K+=s(`${$.projectName} Context`,this.useColor)+`
879
- `,K+="=".repeat(40)+`
880
-
881
- `,K+=`Project: ${$.projectPathDecoded}
882
- `,K+=`Sessions: ${p0($.sessionCount)}
883
- `,K+=`Messages: ${p0($.totalMessages)}`,K+=` (user: ${p0($.userMessages)}, assistant: ${p0($.assistantMessages)})
884
- `,$.lastActivity)K+=`Last active: ${I0($.lastActivity)}
885
- `;else K+=`Last active: never
886
- `;if(K+=`
1298
+ `}return G}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
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
+
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
+ `;let $=A.lastActivity?DA(A.lastActivity):"never";G+=`Sessions: ${M0(A.sessionCount)} | `,G+=`Messages: ${M0(A.totalMessages)} | `,G+=`Last active: ${$}
1303
+ `;let K=oJ(A.recentTopics);if(K)G+=`Topics: ${K}
1304
+ `;let Z=sJ(A.recentToolUses);if(Z)G+=`Tools: ${Z}
1305
+ `;return G}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return P("No topics extracted yet",this.useColor)}}class O2{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";if(G+=KA(`${A.projectName} Context`,this.useColor)+`
1306
+ `,G+="=".repeat(40)+`
1307
+
1308
+ `,G+=`Project: ${A.projectPathDecoded}
1309
+ `,G+=`Sessions: ${M0(A.sessionCount)}
1310
+ `,G+=`Messages: ${M0(A.totalMessages)}`,G+=` (user: ${M0(A.userMessages)}, assistant: ${M0(A.assistantMessages)})
1311
+ `,A.lastActivity)G+=`Last active: ${vA(A.lastActivity)}
1312
+ `;else G+=`Last active: never
1313
+ `;if(G+=`
887
1314
  Topics:
888
- `,$.recentTopics.length>0)for(let X of $.recentTopics)K+=` - ${X}
889
- `;else K+=k(` (no topics extracted yet)
890
- `,this.useColor);if(K+=`
1315
+ `,A.recentTopics.length>0)for(let $ of A.recentTopics)G+=` - ${$}
1316
+ `;else G+=P(` (no topics extracted yet)
1317
+ `,this.useColor);if(G+=`
891
1318
  Tool Usage:
892
- `,$.recentToolUses.length>0)for(let X of $.recentToolUses)K+=` - ${X.name}: ${p0(X.count)} times
893
- `;else K+=k(` (no tool usage recorded)
894
- `,this.useColor);return K}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return k("(no topics extracted yet)",this.useColor)}}class kZ{formatContext($,Z){let K={projectName:$.projectName,projectPath:$.projectPathDecoded,sessionCount:$.sessionCount,totalMessages:$.totalMessages,userMessages:$.userMessages,assistantMessages:$.assistantMessages,lastActivity:$.lastActivity?.toISOString()??null,topics:$.recentTopics,toolUsage:$.recentToolUses};return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty($){return JSON.stringify({error:`No sessions found for project matching '${$}'`})}formatNoTopics(){return JSON.stringify({topics:[]})}}class SZ{formatContext($,Z){return`${$.projectName}: ${$.sessionCount} sessions, ${p0($.totalMessages)} messages`}formatError($){return`Error: ${A($)}`}formatEmpty($){return""}formatNoTopics(){return""}}class vZ{detailed;constructor($){this.detailed=new B2($)}formatContext($,Z){let K="";if(Z){if(K+=`=== Execution Details ===
895
- `,Z.executionTimeMs!==void 0)K+=`Time: ${Z.executionTimeMs}ms
896
- `;if(Z.filtersApplied&&Z.filtersApplied.length>0)K+=`Filters: ${Z.filtersApplied.join(", ")}
897
- `;K+=`
898
- `}return K+=this.detailed.formatContext($,Z),K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
899
- ${K??""}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return this.detailed.formatNoTopics()}}class CZ{formatContext($,Z){let K=new W2(!1);return r(K.formatContext($,Z))}formatSmartContext($){let Z=[];for(let X of $.sections){if(X.content.trim()==="")continue;let Y=`### ${X.title}
900
- ${X.content}`;if(X.truncated)Y+=`
901
- [truncated]`;Z.push(Y)}let K=`## ${$.projectName} context
902
-
903
- `+Z.join(`
1319
+ `,A.recentToolUses.length>0)for(let $ of A.recentToolUses)G+=` - ${$.name}: ${M0($.count)} times
1320
+ `;else G+=P(` (no tool usage recorded)
1321
+ `,this.useColor);return G}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return P("(no topics extracted yet)",this.useColor)}}class e9{formatContext(A,_){let G={projectName:A.projectName,projectPath:A.projectPathDecoded,sessionCount:A.sessionCount,totalMessages:A.totalMessages,userMessages:A.userMessages,assistantMessages:A.assistantMessages,lastActivity:A.lastActivity?.toISOString()??null,topics:A.recentTopics,toolUsage:A.recentToolUses};return JSON.stringify(G,null,2)}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatEmpty(A){return JSON.stringify({error:`No sessions found for project matching '${A}'`})}formatNoTopics(){return JSON.stringify({topics:[]})}}class s9{formatContext(A,_){return`${A.projectName}: ${A.sessionCount} sessions, ${M0(A.totalMessages)} messages`}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return""}formatNoTopics(){return""}}class o9{detailed;constructor(A){this.detailed=new O2(A)}formatContext(A,_){let G="";if(_){if(G+=`=== Execution Details ===
1322
+ `,_.executionTimeMs!==void 0)G+=`Time: ${_.executionTimeMs}ms
1323
+ `;if(_.filtersApplied&&_.filtersApplied.length>0)G+=`Filters: ${_.filtersApplied.join(", ")}
1324
+ `;G+=`
1325
+ `}return G+=this.detailed.formatContext(A,_),G}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
1326
+ ${G??""}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return this.detailed.formatNoTopics()}}class A3{formatContext(A,_){let G=new I2(!1);return _A(G.formatContext(A,_))}formatSmartContext(A){let _=[];for(let $ of A.sections){if($.content.trim()==="")continue;let K=`### ${$.title}
1327
+ ${$.content}`;if($.truncated)K+=`
1328
+ [truncated]`;_.push(K)}let G=`## ${A.projectName} context
1329
+
1330
+ `+_.join(`
904
1331
 
905
1332
  ---
906
1333
 
907
- `);if($.truncated)K+=`
908
-
909
- (budget: ~${$.totalTokensEstimate} tokens)`;return K.trim()}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return"No topics extracted yet"}}var B$=L(()=>{u0();P0()});function z2($,Z){switch($){case"json":return new fZ;case"quiet":return new hZ;case"verbose":return new gZ(Z);case"detailed":return new A2(Z);case"brief":case"default":default:return new bZ(Z)}}function wZ($,Z){let K=`${Math.round($*100)}%`;if(!Z)return K;if($>0.75)return w(K,Z);if($>=0.5)return u(K,Z);return K}function NK($){return $===1?"1 hop":`${$} hops`}function qK($){return`${$===1?"1":`${$}`} (${$===1?"direct":"indirect"})`}class bZ{useColor;constructor($){this.useColor=$}formatRelated($,Z){if($.length===0)return"";let X=`Related to session ${Z?.sourceId??"unknown"}...
910
- `;return $.forEach((Y,Q)=>{let G=Y.session.projectPath.projectName,_=z0(Y.session.startTime),J=wZ(Y.weight,this.useColor),H=NK(Y.hops);X+=`${Q+1}. ${G} (${J}) - ${_} [${H}]
911
- `}),X}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No relationships found for '${$}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class A2{useColor;constructor($){this.useColor=$}formatRelated($,Z){if($.length===0)return"";let X=`Related to session ${Z?.sourceId??"unknown"}...
912
- `;return X+="=".repeat(40)+`
913
-
914
- `,$.forEach((Y,Q)=>{let G=Y.session,_=G.projectPath.projectName,J=G.projectPath.decoded,H=wZ(Y.weight,this.useColor),V=qK(Y.hops),B=I0(G.startTime),z=G.messages.length;X+=`${Q+1}. ${_}
915
- `,X+=` Weight: ${H} | Hops: ${V}
916
- `,X+=` Path: ${J}
917
- `,X+=` Last active: ${B}
918
- `,X+=` Messages: ${z}
919
-
920
- `}),X}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No relationships found for '${$}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class fZ{formatRelated($,Z){let X={sourceId:Z?.sourceId??"unknown",related:$.map((Y)=>({sessionId:Y.session.id,projectName:Y.session.projectPath.projectName,weight:Y.weight,hops:Y.hops,lastActivity:Y.session.startTime.toISOString(),messageCount:Y.session.messages.length}))};return JSON.stringify(X,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty($){return JSON.stringify({error:`No relationships found for '${$}'`})}formatNoLinks(){return JSON.stringify({error:"No relationships extracted yet"})}}class hZ{formatRelated($,Z){if($.length===0)return"";return $.map((K)=>K.session.id).join(`
921
- `)}formatError($){return`Error: ${A($)}`}formatEmpty($){return""}formatNoLinks(){return""}}class gZ{detailed;constructor($){this.detailed=new A2($)}formatRelated($,Z){let K="";if(Z?.executionTimeMs!==void 0)K+=`=== Execution Details ===
922
- `,K+=`Time: ${Z.executionTimeMs}ms
923
- `,K+=`
924
- `;return K+=this.detailed.formatRelated($,Z),K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
925
- ${K??""}`}formatEmpty($){return this.detailed.formatEmpty($)}formatNoLinks(){return this.detailed.formatNoLinks()}}var N2=L(()=>{u0()});function A$($,Z){switch($){case"json":return new dZ;case"quiet":return new pZ;case"verbose":return new lZ(Z);case"tools":return new z$(Z);case"brief":return new cZ;default:return new uZ(Z)}}function q2($){let Z=$.replace(/\\/g,"/").split("/");return Z[Z.length-1]||$}function mZ($){switch($.name){case"Read":{let Z=$.input.file_path,K=$.result?$.result.split(`
926
- `).length:0;return`${q2(Z)} -> ${K} lines`}case"Write":{let Z=$.input.file_path;return q2(Z)}case"Edit":{let Z=$.input.file_path;return`${q2(Z)} edited`}case"Bash":{if(!$.isSuccess)return"FAILED";let Z=$.input.command.substring(0,20);return Z.length<$.input.command.length?`${Z}...`:Z}case"Glob":return`${$.result?.split(`
927
- `).filter(Boolean).length??0} files`;case"Grep":return $.isSuccess?"matches":"no matches";default:return $.status}}function OK($){let Z=Math.floor($/3600000),K=Math.floor($%3600000/60000);if(Z>0)return`${Z}h ${K}m`;if(K>0)return`${K}m`;return"< 1m"}function O2($,Z){let{session:K,messages:X,toolUses:Y}=$,Q=[];Q.push(`Session: ${K.id}`),Q.push(`Project: ${K.projectPath.projectName}`);let G=Z1(K.startTime),_=K.endTime?Z1(K.endTime):"ongoing";if(Q.push(`Date: ${G} - ${_}`),K.durationMs!==void 0)Q.push(`Duration: ${OK(K.durationMs)}`);else Q.push("Duration: ongoing");let J=Y.size;return Q.push(`Messages: ${X.length} | Tools: ${J}`),Q.push("---"),Q.join(`
928
- `)}function U2($,Z,K,X){let Y=$.role==="user"?s("[USER]",K):s("[ASSISTANT]",K),Q=Z1($.timestamp),G=`${Y} ${k(Q,K)}
929
- `;if(G+=$.content,X&&$.role==="assistant"&&$.hasToolUses){let _=[];for(let J of $.toolUses){let H=Z.get(J);if(H)_.push(`[${H.name}: ${mZ(H)}]`)}if(_.length>0)G+=`
930
- ${_.join(" ")}`}return G}class cZ{formatSession($,Z){let{session:K,messages:X}=$,Y=Z1(K.startTime);return`${K.id} | ${K.projectPath.projectName} | ${X.length} messages | ${Y}`}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class uZ{useColor;constructor($){this.useColor=$}formatSession($,Z){let K=[];K.push(O2($,this.useColor)),K.push("");for(let X of $.messages)K.push(U2(X,$.toolUses,this.useColor,!0)),K.push("");return K.join(`
931
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class dZ{formatSession($,Z){let{session:K,messages:X,toolUses:Y}=$,Q={session:{id:K.id,projectPath:K.projectPath.decoded,projectName:K.projectPath.projectName,startTime:K.startTime.toISOString(),endTime:K.endTime?.toISOString()??null,durationMs:K.durationMs??null},messages:X.map((G)=>({id:G.id,role:G.role,content:G.content,timestamp:G.timestamp.toISOString(),toolUseIds:G.toolUses})),toolUses:Object.fromEntries(Array.from(Y.entries()).map(([G,_])=>[G,{id:_.id,name:_.name,input:_.input,timestamp:_.timestamp.toISOString(),status:_.status,result:_.result??null}]))};return JSON.stringify(Q,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatNotFound($){return JSON.stringify({error:`Session not found: ${$}`})}}class pZ{formatSession($,Z){let K=[];for(let X of $.messages){let Y=X.role==="user"?"U:":"A:";K.push(`${Y} ${X.content}`)}return K.join(`
932
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class lZ{useColor;constructor($){this.useColor=$}formatSession($,Z){let K=[];if(Z?.executionTimeMs!==void 0)K.push("=== Execution Details ==="),K.push(`Time: ${Z.executionTimeMs}ms`),K.push("");K.push(O2($,this.useColor)),K.push("");for(let X of $.messages){if(K.push(U2(X,$.toolUses,this.useColor,!0)),X.role==="assistant"&&X.hasToolUses)for(let Y of X.toolUses){let Q=$.toolUses.get(Y);if(Q){if(K.push(""),K.push(` [TOOL: ${Q.name}]`),K.push(` Input: ${JSON.stringify(Q.input)}`),Q.result)K.push(` Result: ${Q.result}`);K.push(` Status: ${Q.status}`)}}K.push("")}return K.join(`
933
- `)}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
934
- ${K??""}`}formatNotFound($){return`Session not found: ${$}`}}class z${useColor;static RESULT_TRUNCATE_LENGTH=500;constructor($){this.useColor=$}formatSession($,Z){let K=[];K.push(O2($,this.useColor)),K.push("");for(let X of $.messages){if(K.push(U2(X,$.toolUses,this.useColor,!1)),X.role==="assistant"&&X.hasToolUses)for(let Y of X.toolUses){let Q=$.toolUses.get(Y);if(Q){if(K.push(""),K.push(` [TOOL: ${Q.name}]`),K.push(` Input: ${JSON.stringify(Q.input)}`),Q.result){let G=Q.result.length>z$.RESULT_TRUNCATE_LENGTH?Q.result.substring(0,z$.RESULT_TRUNCATE_LENGTH)+"...":Q.result;K.push(` Result: ${G}`)}K.push(` Status: ${Q.status}`)}}K.push("")}return K.join(`
935
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}var L2=L(()=>{u0()});function nZ($){switch($){case F.DB_CONNECTION_FAILED:return"Check database file permissions";case F.DB_CORRUPTED:return"Run 'memory doctor' to diagnose or recreate database";case F.DB_LOCKED:return"Wait and retry, or check for other running processes";case F.INVALID_SESSION_ID:return"Check session ID format (expected UUID)";case F.SESSION_NOT_FOUND:return"Run 'memory list' to see available sessions";case F.SOURCE_INACCESSIBLE:return"Check that ~/.claude/projects exists and is readable";case F.DISK_FULL:return"Free up disk space and retry";case F.INVALID_JSON:return"Check file for JSON syntax errors";case F.UNKNOWN_FORMAT:return"File may be incompatible with current version";case F.SYNC_INTERRUPTED:return"Run 'memory sync' again to resume";case F.SYNC_FAILED:return`Check logs at ${X0()} for details`;case F.INVALID_ARGUMENT:return"Run command with --help to see valid options";case F.MISSING_ARGUMENT:return"Run command with --help to see required arguments";case F.VECTOR_UNAVAILABLE:return"Run 'memory sync --embed' to generate embeddings, or use '--mode fts' for keyword-only search";case F.PROVIDER_TIMEOUT:return"Check network connection or switch to local provider in config";case F.PROVIDER_CONFIG_INVALID:return"Check embedding config in ~/.config/memory/config.json";case F.EMBEDDING_DIMENSION_MISMATCH:return"Run 'memory sync --embed' to re-embed with the current model";case F.MODEL_CORRUPTED:return"Delete cached model files and run 'memory sync --embed' to re-download";case F.NOT_FOUND:return"Check the ID and try again";case F.INVALID_STATE:return"The entity is not in a valid state for this operation";case F.UNKNOWN:default:return null}}function UK($,Z){if(typeof Z==="string"||typeof Z==="number")return` ${$}: ${Z}`;return` ${$}: ${JSON.stringify(Z)}`}function p($,Z={}){let K=Z.useColor??v(),X=[];if($ instanceof j){let Y=m(`Error [${$.code}]:`,K);if(X.push(`${Y} ${$.message}`),$.context&&Object.keys($.context).length>0)for(let[G,_]of Object.entries($.context))X.push(UK(G,_));let Q=nZ($.code);if(Q)X.push(""),X.push(`Suggestion: ${Q}`)}else{let Y=m("Error:",K);X.push(`${Y} ${$.message}`)}if(Z.verbose&&$.stack)X.push(""),X.push("Stack trace:"),X.push($.stack);return X.join(`
936
- `)}function K1($){if($ instanceof j)return JSON.stringify($.toJSON());let Z={error:{code:"UNKNOWN",message:$.message}};return JSON.stringify(Z)}var D0=L(()=>{g4();l()});function aZ($){return{schema_version:"1",command:$.command,kind:$.kind,...$.scope!==void 0?{scope:$.scope}:{},...$.meta!==void 0?{meta:$.meta}:{},data:$.data}}function iZ($){return{schema_version:"1",command:$.command,error:{code:$.code,message:$.message,...$.context!==void 0?{context:$.context}:{}}}}function $0($){let Z=process.env.MEMORY_JSON_COMMAND_OVERRIDE||$.command;console.log(JSON.stringify(aZ({...$,command:Z}),null,2))}function C($){let Z=process.env.MEMORY_JSON_COMMAND_OVERRIDE||$.command;console.log(JSON.stringify(iZ({...$,command:Z}),null,2))}var T0=()=>{};var q$={};y(q$,{writeLock:()=>sZ,spawnBackgroundEmbedding:()=>PK,removeLock:()=>N$,readLock:()=>M2,isProcessAlive:()=>j2,isBackgroundEmbedding:()=>kK,cleanupLock:()=>DK,acquireLock:()=>eZ});import{spawn as FK}from"child_process";import{existsSync as MK,readFileSync as jK,writeFileSync as xK,unlinkSync as EK,mkdirSync as oZ,openSync as rZ}from"fs";import{join as tZ}from"path";function F2($){return tZ($??a(),"embedding.lock")}function sZ($,Z){let K=F2(Z),X=Z??a();oZ(X,{recursive:!0}),xK(K,JSON.stringify($))}function M2($){let Z=F2($);if(!MK(Z))return null;try{return JSON.parse(jK(Z,"utf-8"))}catch{return null}}function N$($){let Z=F2($);try{EK(Z)}catch{}}function j2($){try{return process.kill($,0),!0}catch{return!1}}function eZ($,Z,K){let X=M2(K);if(X){if(j2(X.pid))return{acquired:!1,existingPid:X.pid,startedAt:X.startedAt};N$(K)}return sZ({pid:$,startedAt:new Date().toISOString(),totalMessages:Z},K),{acquired:!0,staleRemoved:X!==null}}function PK($){let{dataDir:Z,logDir:K,command:X=process.execPath}=$??{},Y=M2(Z);if(Y&&j2(Y.pid))return{started:!1,reason:"already_running",pid:Y.pid};if(Y)N$(Z);let Q=K??X0();oZ(Q,{recursive:!0});let G=tZ(Q,"sync.log"),_=rZ(G,"a"),J=rZ(G,"a"),V=[process.argv[1]??"","sync","--embed","--quiet"],B=FK(X,V,{detached:!0,stdio:["ignore",_,J],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(B.unref(),B.pid===void 0)return{started:!1,reason:"spawn_failed"};let z=eZ(B.pid,0,Z);if(!z.acquired)return{started:!1,reason:"already_running",pid:z.existingPid};return{started:!0,pid:B.pid}}function DK($){N$($)}function kK(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var O$=L(()=>{l()});var E2={};y(E2,{EmbeddingProviderFactory:()=>U$});import{createHash as vK}from"crypto";class U${cache=new Map;cacheKey($){let Z=$.apiKey?vK("sha256").update($.apiKey).digest("hex").slice(0,16):"";return[$.provider,$.model,String($.dimensions),$.baseUrl??"",$.apiKeyEnv??"",$.apiKeyRef??"",Z].join(":")}create($){let Z=this.cacheKey($),K=this.cache.get(Z);if(K)return K;let X=h5($);return this.cache.set(Z,X),X}createFromConfig($){let Z=$.embedding??I1;if(!Z.enabled)return null;return this.create(Z)}async dispose(){for(let $ of this.cache.values())await $.dispose();this.cache.clear()}}var L$=L(()=>{K0();t4()});var G8={};y(G8,{PatternRedactor:()=>l0});class l0{redactText($){let Z=$,K=[];for(let X of CK)Z=Z.replace(X.pattern,(Y)=>{let Q=`[REDACTED:${X.kind}]`;return K.push({kind:X.kind,placeholder:Q}),`${X.preservePrefix?.(Y)??""}${Q}`});return{text:Z,findings:K}}redactJson($){let Z=[];return{value:this.redactUnknown($,Z,new WeakSet),findings:Z}}redactUnknown($,Z,K){if(typeof $==="string"){let X=this.redactText($);return Z.push(...X.findings),X.text}if(Array.isArray($))return $.map((X)=>this.redactUnknown(X,Z,K));if($&&typeof $==="object"){if(K.has($))return"[REDACTED:circular]";K.add($);let X={};for(let[Y,Q]of Object.entries($))X[Y]=this.redactUnknown(Q,Z,K);return X}return $}}var CK;var z4=L(()=>{CK=[{kind:"private_key",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/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:"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 "},{kind:"env_secret",pattern:/\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASS|CREDENTIAL)[A-Z0-9_]*)\s*=\s*(?:"[^"]+"|'[^']+'|[^\s]+)/g,preservePrefix:($)=>`${$.split("=")[0].trim()}=`}]});var A8={};y(A8,{mergeMemoryBlock:()=>B8,AutoMemoryWriter:()=>z8});import{existsSync as yK,mkdirSync as V8,readFileSync as wK,writeFileSync as k2}from"fs";import{join as W8}from"path";function B8($,Z){let K=`${S2}
937
- ${Z}
938
- ${I$}
939
- `;if($.length===0)return K;let X=$.indexOf(S2),Y=$.indexOf(I$);if(X!==-1&&Y!==-1){let G=$.substring(0,X),_=$.substring(Y+I$.length);return`${G}${K}${_}`}let Q=$.endsWith(`
1334
+ `);if(A.truncated)G+=`
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 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
+ `;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
+ `}),$}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
+ `;return $+="=".repeat(40)+`
1340
+
1341
+ `,A.forEach((K,Z)=>{let Y=K.session,J=Y.projectPath.projectName,H=Y.projectPath.decoded,Q=G3(K.weight,this.useColor),X=_H(K.hops),V=vA(Y.startTime),B=Y.messages.length;$+=`${Z+1}. ${J}
1342
+ `,$+=` Weight: ${Q} | Hops: ${X}
1343
+ `,$+=` Path: ${H}
1344
+ `,$+=` Last active: ${V}
1345
+ `,$+=` Messages: ${B}
1346
+
1347
+ `}),$}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 K3{formatRelated(A,_){let $={sourceId:_?.sourceId??"unknown",related:A.map((K)=>({sessionId:K.session.id,projectName:K.session.projectPath.projectName,weight:K.weight,hops:K.hops,lastActivity:K.session.startTime.toISOString(),messageCount:K.session.messages.length}))};return JSON.stringify($,null,2)}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatEmpty(A){return JSON.stringify({error:`No relationships found for '${A}'`})}formatNoLinks(){return JSON.stringify({error:"No relationships extracted yet"})}}class Z3{formatRelated(A,_){if(A.length===0)return"";return A.map((G)=>G.session.id).join(`
1348
+ `)}formatError(A){return`Error: ${L(A)}`}formatEmpty(A){return""}formatNoLinks(){return""}}class Y3{detailed;constructor(A){this.detailed=new R2(A)}formatRelated(A,_){let G="";if(_?.executionTimeMs!==void 0)G+=`=== Execution Details ===
1349
+ `,G+=`Time: ${_.executionTimeMs}ms
1350
+ `,G+=`
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 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
+ `).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
+ `).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
+ `)}function D2(A,_,G,$){let K=A.role==="user"?KA("[USER]",G):KA("[ASSISTANT]",G),Z=c0(A.timestamp),Y=`${K} ${P(Z,G)}
1356
+ `;if(Y+=A.content,$&&A.role==="assistant"&&A.hasToolUses){let J=[];for(let H of A.toolUses){let Q=_.get(H);if(Q)J.push(`[${Q.name}: ${J3(Q)}]`)}if(J.length>0)Y+=`
1357
+ ${J.join(" ")}`}return Y}class H3{formatSession(A,_){let{session:G,messages:$}=A,K=c0(G.startTime);return`${G.id} | ${G.projectPath.projectName} | ${$.length} messages | ${K}`}formatError(A){return`Error: ${L(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class Q3{useColor;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(E2(A,this.useColor)),G.push("");for(let $ of A.messages)G.push(D2($,A.toolUses,this.useColor,!0)),G.push("");return G.join(`
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
+ `)}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
+ `)}formatError(A){let _=L(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
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
+ `)}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(()=>{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
+ ${_}
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(`
940
1367
  `)?`
941
1368
  `:`
942
1369
 
943
- `;return`${$}${Q}${K}`}class z8{async writeContextFile($,Z){V8($,{recursive:!0}),k2(W8($,"context.md"),Z,"utf-8")}async updateMemoryBlock($,Z){V8($,{recursive:!0});let K=W8($,"MEMORY.md"),X=`${S2}
944
- ${Z}
945
- ${I$}
946
- `;if(!yK(K)){k2(K,X,"utf-8");return}let Y=wK(K,"utf-8"),Q=B8(Y,Z);k2(K,Q,"utf-8")}}var S2="<!-- memory-cli:start -->",I$="<!-- memory-cli:end -->";var N8=()=>{};var L8={};y(L8,{runGit:()=>U8,GitSyncer:()=>k1});import{readFileSync as bK,existsSync as fK}from"fs";import{join as q8}from"path";var{spawn:hK}=globalThis.Bun;async function U8($,Z,K=process.env){let X=hK(["git",...$],{cwd:Z,stdout:"pipe",stderr:"pipe",env:K}),Y=await new Response(X.stdout).text(),Q=await new Response(X.stderr).text(),G=await X.exited;return{success:G===0,stdout:Y.trim(),stderr:Q.trim(),exitCode:G}}function O8($,Z){let K={};for(let X of $)if(Z.existsSync(X))try{let Y=Z.readFileSync(X,"utf-8");K[X]=Bun.hash(Y).toString()}catch{K[X]="error"}return K}class k1{eventsDir;deps;constructor($,Z={}){this.eventsDir=$??H1(),this.deps={runGit:U8,existsSync:fK,readFileSync:bK,getAllLogFiles:n1,now:()=>new Date,...Z}}async isGitRepo(){let $=q8(this.eventsDir,".git");return this.deps.existsSync($)}async initRepo(){if(!(await this.deps.runGit(["init"],this.eventsDir)).success)return!1;let Z=await this.deps.runGit(["config","user.name"],this.eventsDir);if(!Z.success||!Z.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($){if(!$.trim())return!1;return await this.deps.runGit(["remote","remove","origin"],this.eventsDir),(await this.deps.runGit(["remote","add","origin",$],this.eventsDir)).success}async removeRemote(){let $=await this.deps.runGit(["remote","remove","origin"],this.eventsDir);return $.success||$.stderr.includes("No such remote")}async getRemoteUrl(){let $=await this.deps.runGit(["remote","get-url","origin"],this.eventsDir);return $.success?$.stdout:null}async sync($,Z,K=!0,X=!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()!==Z){if(!await this.configureRemote(Z))return{success:!1,rebuildNeeded:!1,error:"Failed to configure Git remote repository URL"}}let G=this.deps.getAllLogFiles(this.eventsDir),_=O8(G,this.deps),J=`events-${$}.jsonl`,H=q8(this.eventsDir,J);if(this.deps.existsSync(H))await this.deps.runGit(["add",J],this.eventsDir),await this.deps.runGit(["commit","-m",`sync: ${$} observed at ${this.deps.now().toISOString()}`],this.eventsDir);let V=!0;if(K){if(await this.deps.runGit(["fetch","origin"],this.eventsDir),(await this.deps.runGit(["rev-parse","--verify","origin/main"],this.eventsDir)).success){let q=await this.deps.runGit(["pull","--rebase","origin","main"],this.eventsDir);if(!q.success)return V=!1,await this.deps.runGit(["rebase","--abort"],this.eventsDir),{success:!1,rebuildNeeded:!1,error:`Git pull failed: ${q.stderr}`}}}if(X&&V){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 B=this.deps.getAllLogFiles(this.eventsDir),z=O8(B,this.deps),W=!1;if(G.length!==B.length)W=!0;else for(let N of B)if(_[N]!==z[N]){W=!0;break}return{success:!0,rebuildNeeded:W}}catch(Y){return{success:!1,rebuildNeeded:!1,error:A(Y)}}}}var C2=L(()=>{l()});var F8={};y(F8,{rebuildProjections:()=>y2,readEvents:()=>R8,appendEvent:()=>A4});import{appendFile as gK,mkdir as mK}from"fs/promises";import{dirname as cK}from"path";import{existsSync as uK,createReadStream as dK}from"fs";import*as T8 from"readline";async function A4($,Z){let K=Z;if(!K){let Q=h();K=g$(Q.machineId)}let X=cK(K);await mK(X,{recursive:!0});let Y={id:$.id,uuid:$.uuid,type:$.type,project:$.project,content:$.content,metadata:$.metadata,observedAt:$.observedAt.toISOString(),supersededAt:$.supersededAt?$.supersededAt.toISOString():null,supersededBy:$.supersededBy,version:1};await gK(K,JSON.stringify(Y)+`
947
- `,"utf-8")}async function*R8($,Z){if($){yield*I8($);return}let K=n1(Z),X=[];for(let Y of K)for await(let Q of I8(Y))X.push(Q);X.sort((Y,Q)=>{let G=Y.observedAt.getTime()-Q.observedAt.getTime();if(G!==0)return G;return Y.uuid.localeCompare(Q.uuid)});for(let Y of X)yield Y}async function*I8($){if(!uK($))return;let Z=dK($,"utf-8"),K=T8.createInterface({input:Z,crlfDelay:1/0});for await(let X of K){if(!X.trim())continue;try{let Y=JSON.parse(X),Q=Z0.create({uuid:Y.uuid,type:Y.type,project:Y.project,content:Y.content,metadata:Y.metadata,observedAt:new Date(Y.observedAt),supersededAt:Y.supersededAt?new Date(Y.supersededAt):null,supersededBy:Y.supersededBy??null});yield Y.id!==void 0?Q.withId(Y.id):Q}catch(Y){console.error("Skipping malformed event log line:",Y)}}}async function y2($,Z,K){let X=[];for await(let Q of R8(Z,K))X.push(Q);$.transaction(()=>{$.run("DELETE FROM facts;");let Q=$.prepare(`
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
+ ${_}
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(`
948
1375
  INSERT INTO facts (
949
1376
  uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
950
1377
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
951
- `);for(let G of X)if(Q.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),G.type==="supersedence"){let _=G.metadata?.superseded_uuid,J=G.metadata?.superseded_by_uuid;if(_&&J)$.prepare(`
1378
+ ON CONFLICT(uuid) DO UPDATE SET
1379
+ type = excluded.type,
1380
+ project = excluded.project,
1381
+ content = excluded.content,
1382
+ metadata = excluded.metadata,
1383
+ observed_at = excluded.observed_at,
1384
+ superseded_at = excluded.superseded_at,
1385
+ superseded_by = excluded.superseded_by,
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 $=$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(`
952
1388
  UPDATE facts
953
1389
  SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
954
1390
  WHERE uuid = ?
955
- `).run(G.observedAt.toISOString(),J,_)}})()}var w2=L(()=>{Z4();l();K0()});import*as x8 from"chrono-node";function S1($,Z){if(!$||$.trim()==="")throw new R0("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let K=Z??new Date,X=x8.parseDate($,K);if(!X)throw new R0(`Invalid date format: '${$}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);let Y=new Date(X.getFullYear(),X.getMonth(),X.getDate()),Q=new Date(K.getFullYear(),K.getMonth(),K.getDate());if(Y>Q)throw new R0(`Future dates not allowed: '${$}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return X}var R0;var f2=L(()=>{R0=class R0 extends Error{constructor($){super($);this.name="DateParseError"}}});function _0($){if($.json)return;let Z=`${$.command}:--format=${$.alias}`;if(E8.has(Z))return;E8.add(Z),console.error(`warning: --format ${$.alias} is deprecated and will be removed in the next minor release. ${$.replacement}`)}var E8;var X1=L(()=>{E8=new Set});import{spawn as oK,execSync as T$}from"child_process";class R${search($){return new Promise((Z,K)=>{let X=oK("qmd",["search",$,"--json"],{stdio:["pipe","pipe","pipe"]}),Y="",Q="";X.stdout.on("data",(G)=>{Y+=G.toString()}),X.stderr.on("data",(G)=>{Q+=G.toString()}),X.on("error",(G)=>{K(Error(`Failed to spawn qmd: ${G.message}`))}),X.on("close",(G)=>{if(G===0)try{let _=JSON.parse(Y);Z(_)}catch{K(Error(`Failed to parse qmd output: ${Y.slice(0,200)}`))}else K(Error(`qmd exited with code ${G}: ${Q.trim()}`))})})}isAvailable(){try{return T$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:T$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function h2(){try{return T$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function F$(){try{return{available:!0,path:T$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var P8=()=>{};var M$=L(()=>{P8()});var k8={};y(k8,{runShowInternal:()=>eK,executeShowCommand:()=>N4,createShowCommand:()=>j$});import{Command as tK,Option as g2}from"commander";function j$(){return new tK("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new g2("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new g2("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new g2("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async($,Z)=>{let K=await N4($,Z);process.exitCode=K.exitCode})}function D8($){if($.json)return"json";if($.tools)return"tools";if($.quiet)return"quiet";if($.verbose)return"verbose";if($.format==="brief")return"brief";return"default"}async function sK($,Z,K){let X=await $.findById(Z);if(X)return X;let Q=K.prepare("SELECT id FROM sessions WHERE id LIKE ? ORDER BY start_time DESC LIMIT 1").get(`${Z}%`);if(Q)return $.findById(Q.id);return null}async function N4($,Z,K={}){let{executeQueryCommand:X}=await Promise.resolve().then(() => (Y1(),v1));process.env.MEMORY_JSON_COMMAND_OVERRIDE="show";try{return await X($,{...Z,kind:"session",dbPath:K.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function eK($,Z,K={}){let X=performance.now();if(Z.format==="default")_0({command:"show",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:Z.json});let Y=K.dbPath??P(),{db:Q}=S({path:Y});try{let G=new g(Q),_=new G0(Q),J=new f0(Q),H=await sK(G,$,Q);if(!H){if(Z.json)C({command:"show",code:"NOT_FOUND",message:`Session not found: ${$}`,context:{session_id:$}});else{let U=D8(Z),O=A$(U,v());console.log(O.formatNotFound($))}return{exitCode:1}}let V=await _.findBySession(H.id),B=await J.findBySession(H.id),z=new Map;for(let U of B)z.set(U.id,U);let W={session:H,messages:V,toolUses:z};if(Z.json){let U=performance.now();return $0({command:"show",kind:"session",data:HZ(W),meta:{session_id:H.id,message_count:V.length,timing_ms:Math.round(U-X)}}),{exitCode:0}}let N=D8(Z),q=A$(N,v()),I=performance.now(),T=q.formatSession(W,{executionTimeMs:Math.round(I-X)});if(Z.format==="ai")T=r(T);return console.log(T),{exitCode:0}}catch(G){let _=G instanceof j?G:new j(F.DB_CONNECTION_FAILED,A(G));if(Z.json)C({command:"show",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(p(_));return{exitCode:1}}finally{D(Q)}}var x$=L(()=>{H0();M0();A1();F9();c();L2();P0();D0();T0();d0();X1()});var S8={};y(S8,{runListInternal:()=>ZX,executeListCommand:()=>m2,createListCommand:()=>E$});import{Command as $X,Option as C1}from"commander";function E$(){return new $X("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new C1("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new C1("--before <date>","Sessions before date").conflicts("days")).addOption(new C1("--days <n>","Sessions from last N days (includes today)").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Days must be a positive number");return Z}).conflicts(["since","before"])).option("--json","Output as JSON").addOption(new C1("--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 C1("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new C1("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async($)=>{let Z=await m2($);process.exitCode=Z.exitCode})}async function m2($,Z={}){let{executeQueryCommand:K}=await Promise.resolve().then(() => (Y1(),v1)),X=$.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="list";try{return await K(void 0,{...$,kind:"session",scope:X,dbPath:Z.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function ZX($,Z={}){let K=performance.now();if($.format==="default")_0({command:"list",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:$.json});let X=Z.dbPath??P(),Y=parseInt($.limit??"20",10);if(isNaN(Y)||Y<1){if($.json)C({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 Q,G;if($.days){let J=new Date,H=new Date(J.getFullYear(),J.getMonth(),J.getDate());Q=new Date(H.getTime()-($.days-1)*24*60*60*1000)}else{if($.since)try{Q=S1($.since)}catch(J){if(J instanceof R0){if($.json)C({command:"list",code:"INVALID_ARGUMENT",message:J.message,context:{flag:"since",value:$.since}});else console.error(`Error: ${J.message}`);return{exitCode:1}}throw J}if($.before)try{G=S1($.before)}catch(J){if(J instanceof R0){if($.json)C({command:"list",code:"INVALID_ARGUMENT",message:J.message,context:{flag:"before",value:$.before}});else console.error(`Error: ${J.message}`);return{exitCode:1}}throw J}}let{db:_}=S({path:X});try{let J=new g(_),H={limit:Y,projectFilter:$.project,sinceDate:Q,beforeDate:G},V=await J.findFiltered(H),B=KX($);if($.json){let U=performance.now(),O=V.map(J$);return $0({command:"list",kind:"session",data:O,meta:{filters_applied:B,count:O.length,timing_ms:Math.round(U-K)}}),{exitCode:0}}let z="default";if($.quiet)z="quiet";else if($.verbose)z="verbose";else if($.format==="brief")z="brief";let W=v(),N=G2(z,W);if(V.length===0)return console.log(N.formatEmpty()),{exitCode:0};let q=performance.now(),I={executionTimeMs:Math.round(q-K),filtersApplied:B},T=N.formatSessions(V,I);if($.format==="ai")T=r(T);return console.log(T),{exitCode:0}}catch(J){let H=J instanceof j?J:new j(F.DB_CONNECTION_FAILED,A(J));if($.json)C({command:"list",code:H.code,message:H.message,...H.context!==void 0?{context:H.context}:{}});else console.error(p(H));return{exitCode:1}}finally{D(_)}}function KX($){let Z=[];if($.limit)Z.push(`limit: ${$.limit}`);if($.project)Z.push(`project: ${$.project}`);if($.days)Z.push(`days: ${$.days}`);if($.since)Z.push(`since: ${$.since}`);if($.before)Z.push(`before: ${$.before}`);return Z}var c2=L(()=>{M0();H0();c();_2();P0();f2();D0();T0();d0();X1()});var u2={};y(u2,{gatherStatus:()=>y8,formatTimeAgo:()=>f8,formatStatusOutput:()=>b8,executeStatusCommand:()=>Q1,createStatusCommand:()=>P$,attemptFixes:()=>w8});import{Command as XX,Option as YX}from"commander";import{existsSync as QX,mkdirSync as v8}from"fs";import{dirname as C8}from"path";function P$(){return new XX("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 YX("--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($)=>{let Z=await Q1($);process.exitCode=Z.exitCode})}async function y8($={}){let Z=F0($.hookOverrides),K=h($.configPath),X=R1(1,$.logPath),Y=$.dbPath??P(),G=QX(Y)||$.stats,_=0,J,H=0,V=0,B=s4({dbPath:Y,configDir:$.configPath?C8($.configPath):void 0,logsDir:$.logPath?C8($.logPath):void 0,hookOverrides:$.hookOverrides,preCalculatedHookStatus:Z});if(G)try{let{db:T}=S({path:Y});try{let U=new c0,O=new b0(T),R=await U.discoverSessions();for(let A0 of R){let N0=await O.findBySessionPath(A0.path);if(!N0||N0.status!=="complete")_++}let M=new h0(T),x=$.projects??10;J=await M.getStats(x);let o=new j0(T);H=o.getEmbeddedCount(),V=o.getTotalMessageCount()}finally{D(T)}}catch{}let z={active:!1};try{let{readLock:T,isProcessAlive:U}=await Promise.resolve().then(() => (O$(),q$)),O=T();if(O&&U(O.pid))z={active:!0,pid:O.pid,startedAt:O.startedAt,embeddedCount:H,totalMessages:V}}catch{}let W=I3(),N=F$(),q;if(J)q={...J,hooks:{installed:Z.sessionEnd&&Z.preCompact,autoSync:K.autoSync,pendingSessions:_}};let I=[];if($.fix)I=w8(B,v());return{hooks:Z,config:GX(K),lastSync:X.length>0?X[0]?.timestamp??null:null,pendingSessions:_,recentLogs:R1(100,$.logPath).length,embedding:z,health:B,stats:q,migration:W,qmd:N,fixes:I}}function GX($){let Z={...$.embedding};if(Z.apiKey)Z.apiKey="[REDACTED:api_key]";return{...$,embedding:Z}}async function Q1($,Z={}){let K=performance.now();if($.format==="default")_0({command:"status",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:$.json});let Y=$.stats&&!$.db&&!$.hooks&&!$.config&&!$.embedding&&!$.all?"stats":"status",Q=parseInt($.projects??"10",10);if(isNaN(Q)||Q<1){if($.json)C({command:Y,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 _=await(Z.gatherStatus??y8)({dbPath:Z.dbPath,logPath:Z.logPath,configPath:Z.configPath,hookOverrides:Z.hookOverrides,fix:$.fix,projects:Q,stats:$.stats||$.all}),J=0;if($.db||$.all||$.fix)J=qX(_.health);else if($.stats)J=_.stats?0:1;else J=0;if($.json){if($.stats&&!$.db&&!$.hooks&&!$.config&&!$.embedding&&!$.all){if(!_.stats)return C({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return $0({command:"stats",kind:"stats",data:Y2(_.stats),meta:{generated_at:new Date().toISOString(),timing_ms:Math.round(performance.now()-K)}}),{exitCode:0}}let W={hooks:_.hooks,config:_.config,lastSync:_.lastSync,pendingSessions:_.pendingSessions,recentLogs:_.recentLogs,embedding:_.embedding,health:{..._.health,hooks:{..._.health.hooks,lastRun:_.health.hooks.lastRun?.toISOString()??null}},stats:_.stats?Y2(_.stats):void 0,migration:_.migration,qmd:_.qmd,fixes:_.fixes};return console.log(JSON.stringify(W,null,2)),{exitCode:J}}let V=v();if(!($.db||$.hooks||$.embedding||$.config||$.stats||$.all)){if(b8(_),$.fix&&_.fixes.length>0){console.log(`
956
- Applied fixes:`);for(let W of _.fixes)console.log(W)}return{exitCode:0}}let z=[];if($.hooks||$.all)z.push(JX(_,V));if($.config||$.all)z.push(HX(_,V));if($.db||$.all)z.push(VX(_,V));if($.embedding||$.all)z.push(WX(_,V)),z.push(BX(_,V));if($.stats||$.all)if(!_.stats)z.push(m("Database statistics are not available.",V));else{let W="default";if($.quiet)W="quiet";else if($.verbose)W="verbose";else if($.format==="brief")W="brief";let N=H2(W,V);if(_.stats.totalSessions===0)z.push(N.formatEmpty());else{let q=N.formatStats(_.stats,{executionTimeMs:Math.round(performance.now()-K)});if($.format==="ai")q=r(q);z.push(q)}}if(console.log(z.join(`
957
-
958
- `)),$.all||$.db){if(_.migration.status==="pending")console.log(""),console.log(u("Legacy data found at ~/.memory-nexus/. Run any memory command to auto-migrate.",V));else if(_.migration.status==="partial")console.log(""),console.log(u("Partial migration detected. Some data in ~/.memory-nexus/ and some in new paths. Re-run migration or check manually.",V))}if($.fix)if(console.log(""),console.log("Attempting fixes..."),_.fixes.length===0)console.log(k("No automatic fixes available.",V));else for(let W of _.fixes)console.log(W);return{exitCode:J}}function _X($){let K=Date.now()-$.getTime(),X=Math.floor(K/1000),Y=Math.floor(X/60),Q=Math.floor(Y/60),G=Math.floor(Q/24);if(G>0)return`${G} day${G>1?"s":""} ago`;if(Q>0)return`${Q} hour${Q>1?"s":""} ago`;if(Y>0)return`${Y} minute${Y>1?"s":""} ago`;return"just now"}function JX($,Z){let K=[];if(K.push("Hooks"),K.push(` ${d($.health.hooks.installed,Z)} Installed: ${$.health.hooks.installed?"yes":"no"}`),K.push(` ${d($.health.hooks.enabled,Z)} Enabled (autoSync): ${$.health.hooks.enabled?"yes":"no"}`),$.health.hooks.lastRun)K.push(` ${k(`Last run: ${_X($.health.hooks.lastRun)}`,Z)}`);else K.push(` ${k("Last run: never",Z)}`);return K.join(`
959
- `)}function HX($,Z){let K=[];if(K.push("Configuration"),$.health.config.valid)K.push(` ${d(!0,Z)} Valid`);else{K.push(` ${d(!1,Z)} Invalid`);for(let X of $.health.config.issues)K.push(` ${m("-",Z)} ${X}`)}return K.join(`
960
- `)}function VX($,Z){let K=[];K.push("Database");let X=P();if($.health.database.exists)K.push(` ${d($.health.database.exists,Z)} Exists: ${X}`),K.push(` ${d($.health.database.readable,Z)} Readable`),K.push(` ${d($.health.database.writable,Z)} Writable`),K.push(` ${d($.health.database.integrity==="ok",Z)} Integrity: ${AX($.health.database.integrity,Z)}`),K.push(` ${k(`Size: ${zX($.health.database.size)}`,Z)}`);else K.push(` ${d(!1,Z)} Database not found: ${X}`),K.push(` ${k("Run 'memory sync' to create database",Z)}`);if($.health.sqliteVec.available)K.push(` ${d(!0,Z)} sqlite-vec: v${$.health.sqliteVec.version}`);else K.push(` ${d(!1,Z)} sqlite-vec: not available`);if(K.push(""),K.push("Permissions"),K.push(` ${d($.health.permissions.configDir,Z)} Config directory: ${$1()}`),K.push(` ${d($.health.permissions.logsDir,Z)} Logs directory: ${T1()}`),K.push(` ${d($.health.permissions.sourceDir,Z)} Source directory: ~/.claude/projects`),K.push(""),K.push("Search Capability"),K.push(` ${d($.health.searchCapability.fts5,Z)} FTS5: available`),K.push(` ${d($.health.searchCapability.sqliteVec,Z)} sqlite-vec: ${$.health.searchCapability.sqliteVec?"available":"not available"}`),K.push(` ${k(`Embeddings: ${$.health.searchCapability.embeddedCount}/${$.health.searchCapability.totalMessages} (${$.health.searchCapability.coveragePercent}%)`,Z)}`),K.push(` ${k(`Default mode: ${$.health.searchCapability.defaultMode}`,Z)}`),K.push(` ${d($.health.searchCapability.vectorReady,Z)} Vector search: ${$.health.searchCapability.vectorReady?"ready":"not ready"}`),K.push(""),K.push("Optional Tools"),$.qmd.available)K.push(` ${k("[INFO]",Z)} qmd: installed at ${$.qmd.path} (enables --files search)`);else K.push(` ${k("[INFO]",Z)} qmd: not found (optional -- install with: bun add -g @tobilu/qmd)`);return K.join(`
961
- `)}function WX($,Z){let K=[];if(K.push("Embeddings"),K.push(` ${d($.health.embedding.enabled,Z)} Enabled: ${$.health.embedding.enabled?"yes":"no"}`),K.push(` ${k(`Provider: ${$.health.embedding.provider}`,Z)}`),K.push(` ${k(`Model: ${$.health.embedding.model}`,Z)}`),K.push(` ${k(`Dimensions: ${$.health.embedding.dimensions}`,Z)}`),K.push(` ${d($.health.embedding.ready,Z)} Ready: ${$.health.embedding.ready?"yes":"no"}`),$.health.embedding.readyReason)if($.health.embedding.ready)K.push(` ${k(`Note: ${$.health.embedding.readyReason}`,Z)}`);else K.push(` ${m(`Reason: ${$.health.embedding.readyReason}`,Z)}`);return K.join(`
962
- `)}function BX($,Z){let K=[];if(K.push("LLM Fact Extraction"),K.push(` ${d($.health.llmExtraction.ready,Z)} Ready: ${$.health.llmExtraction.ready?"yes":"no"}`),K.push(` ${k(`Provider: ${$.health.llmExtraction.provider}`,Z)}`),K.push(` ${k(`Model: ${$.health.llmExtraction.model}`,Z)}`),$.health.llmExtraction.readyReason)if($.health.llmExtraction.ready)K.push(` ${k(`Note: ${$.health.llmExtraction.readyReason}`,Z)}`);else K.push(` ${m(`Reason: ${$.health.llmExtraction.readyReason}`,Z)}`);return K.join(`
963
- `)}function d($,Z){if($)return w("[OK]",Z);return m("[FAIL]",Z)}function zX($){if($===0)return"0 B";let Z=["B","KB","MB","GB"],K=1024,X=Math.floor(Math.log($)/Math.log(K));return`${($/Math.pow(K,X)).toFixed(X>0?1:0)} ${Z[X]}`}function AX($,Z){switch($){case"ok":return w("ok",Z);case"corrupted":return m("CORRUPTED",Z);default:return u("unknown",Z)}}function NX($){let Z=0;if(!$.database.readable)Z++;if(!$.database.writable)Z++;if(!$.permissions.configDir)Z++;if(!$.permissions.logsDir)Z++;if(!$.permissions.sourceDir)Z++;return Z+=$.config.issues.length,Z}function qX($){if(!$.database.exists||$.database.integrity==="corrupted")return 2;if(NX($)>0||!$.searchCapability.vectorReady)return 1;return 0}function w8($,Z){let K=[];if(!$.permissions.configDir){let X=$1();try{v8(X,{recursive:!0}),K.push(w(`Created config directory: ${X}`,Z))}catch(Y){let Q=A(Y);K.push(m(`Failed to create config directory: ${Q}`,Z))}}if(!$.permissions.logsDir){let X=T1();try{v8(X,{recursive:!0}),K.push(w(`Created logs directory: ${X}`,Z))}catch(Y){let Q=A(Y);K.push(m(`Failed to create logs directory: ${Q}`,Z))}}if($.database.integrity==="corrupted")K.push(u("Database corruption detected. Consider:",Z)),K.push(" 1. Backup your database file"),K.push(` 2. Delete the database: rm ${P()}`),K.push(" 3. Re-sync: memory sync");if(!$.hooks.installed)K.push(u("Hooks not installed. Run 'memory install' to enable automatic sync.",Z));return K}function b8($){if(console.log("Memory Status"),console.log(`=============
964
- `),console.log("Hooks:"),console.log(` SessionEnd: ${$.hooks.sessionEnd?"installed":"not installed"}`),console.log(` PreCompact: ${$.hooks.preCompact?"installed":"not installed"}`),console.log(` Hook script: ${$.hooks.hookScriptExists?"present":"missing"}`),console.log(` Backup: ${$.hooks.backupExists?"available":"none"}`),console.log(""),console.log("Configuration:"),console.log(` autoSync: ${$.config.autoSync}`),console.log(` syncOnCompaction: ${$.config.syncOnCompaction}`),console.log(` recoveryOnStartup: ${$.config.recoveryOnStartup}`),console.log(` timeout: ${$.config.timeout}ms`),console.log(` logLevel: ${$.config.logLevel}`),console.log(` showFailures: ${$.config.showFailures}`),console.log(""),console.log("Activity:"),console.log(` Last sync: ${$.lastSync??"never"}`),console.log(` Pending sessions: ${$.pendingSessions}`),console.log(` Recent log entries: ${$.recentLogs}`),console.log(""),console.log("Embedding:"),$.embedding.active){let Z=$.embedding.startedAt?f8($.embedding.startedAt):"unknown",K=$.embedding.embeddedCount!==void 0&&$.embedding.totalMessages!==void 0?`, ${$.embedding.embeddedCount}/${$.embedding.totalMessages} messages`:"";console.log(` Status: active (PID ${$.embedding.pid}${K}, started ${Z})`)}else console.log(" Status: idle");if(!$.hooks.sessionEnd||!$.hooks.preCompact)console.log(`
965
- Recommendation: Run 'memory install' to enable automatic sync.`);if($.pendingSessions>0)console.log(`
966
- Note: ${$.pendingSessions} session(s) pending sync. Run 'memory sync' to sync now.`)}function f8($){let Z=Date.now()-new Date($).getTime(),K=Math.floor(Z/60000);if(K<1)return"just now";if(K<60)return`${K} min ago`;let X=Math.floor(K/60);if(X<24)return`${X}h ago`;return`${Math.floor(X/24)}d ago`}var y1=L(()=>{F1();c();W4();r$();M$();V2();P0();X1();T0();d0()});var h8={};y(h8,{executeStatsCommand:()=>p2,createStatsCommand:()=>D$});import{Command as OX,Option as d2}from"commander";function D$(){return new OX("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new d2("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new d2("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new d2("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async($)=>{let Z=await p2($);process.exitCode=Z.exitCode})}async function p2($,Z={}){return Q1({stats:!0,projects:$.projects,format:$.format,verbose:$.verbose,quiet:$.quiet,json:$.json},{dbPath:Z.dbPath})}var l2=L(()=>{y1()});var c8={};y(c8,{runContextInternal:()=>IX,executeContextCommand:()=>O4,createContextCommand:()=>k$});import*as g8 from"fs";import*as m8 from"os";import{join as UX}from"path";import{Command as LX,Option as q4}from"commander";function k$(){return new LX("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new q4("--days <n>","Sessions from last N days (includes today)").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Days must be a positive number");return Z})).addOption(new q4("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new q4("--budget <tokens>","Maximum token budget for context").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Budget must be a positive number");return Z})).option("--cross-project","Include cross-project learnings and decisions").option("--json","Output as JSON").addOption(new q4("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new q4("-q, --quiet","Minimal output").conflicts("verbose")).action(async($,Z)=>{let K=await O4($,Z);process.exitCode=K.exitCode})}async function O4($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (Y1(),v1));process.env.MEMORY_JSON_COMMAND_OVERRIDE="context";try{return await K($,{...Z,kind:"context",scope:"project"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function IX($,Z,K){if(Z.format==="detailed")_0({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:Z.json});let X=UX(m8.homedir(),".memory");if(g8.existsSync(X)&&!Z.quiet&&!Z.json)console.error("[DEPRECATION WARNING] Legacy memory directory ~/.memory/ is deprecated. Your knowledge and decisions are now stored safely in the SQLite database.");let Y=K?.dbPath??Z.dbPath??P(),{db:Q}=S({path:Y});try{return await TX(Q,$,Z)}catch(G){let _=G instanceof j?G:new j(F.DB_CONNECTION_FAILED,A(G));if(Z.json)C({command:"context",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(p(_));return{exitCode:1}}finally{D(Q)}}async function TX($,Z,K){let X=new e0($),Y=new E0($),Q=new x0($),G=new s0($),J=await new e1({projectResolver:X,factRepo:Y,frictionRepo:Q,getSessionSummary:async(z,W)=>{let N=await G.getProjectContext(z,{days:W});if(!N)return null;return`Sessions: ${N.sessionCount} | Messages: ${N.totalMessages} | Last active: ${N.lastActivity?.toISOString()??"never"}`}}).getContext({projectFilter:Z,budget:K.budget,days:K.days,crossProject:K.crossProject});if(K.json){if(!J)return C({command:"context",code:"NOT_FOUND",message:`Project not found: ${Z}`,context:{project:Z}}),{exitCode:1};let z=await G.getProjectContext(Z,{days:K.days});return $0({command:"context",kind:"context",data:z?WZ(z):null,meta:{project:Z,days:K.days,budget:K.budget,cross_project:!!K.crossProject,mode:"smart",sections:J.sections.map((W)=>({key:W.key,title:W.title}))}}),{exitCode:0}}let H=K.format==="ai"?"ai":K.verbose?"verbose":K.quiet?"quiet":K.format==="detailed"?"detailed":"brief",V=v(),B=W$(H,V);if(!J){let z=B.formatEmpty(Z);if(H!=="quiet"||z)console.error(z);return{exitCode:1}}if(B.formatSmartContext){let z=B.formatSmartContext(J);console.log(z)}else{let z=J.sections.find((W)=>W.key==="session_summary");if(z)console.log(z.content);else{let W=J.sections.map((N)=>`${N.title}:
967
- ${N.content}`).join(`
968
-
969
- `);console.log(W)}}return{exitCode:0}}var S$=L(()=>{H0();q1();u4();c();w4();B$();D0();T0();d0();X1()});var u8={};y(u8,{runRelatedInternal:()=>FX,executeRelatedCommand:()=>U4,createRelatedCommand:()=>v$});import{Command as RX,Option as w1}from"commander";function v$(){return new RX("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new w1("--limit <n>","Maximum results").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Limit must be a positive number");return Z}).default(10)).addOption(new w1("--hops <n>","Traversal depth (1-3)").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1||Z>3)throw Error("Hops must be 1, 2, or 3");return Z}).default(2)).addOption(new w1("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new w1("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new w1("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new w1("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async($,Z)=>{let K=await U4($,Z);process.exitCode=K.exitCode})}async function U4($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (Y1(),v1));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await K($,{...Z,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function FX($,Z,K){let X=performance.now();if(Z.format==="detailed")_0({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:Z.json});let Y=K?.dbPath??Z.dbPath??P(),{db:Q}=S({path:Y});try{let G=new N1(Q),_=new g(Q),J=Z.type??"session",H=await G.findRelatedWithHops(J,$,Z.hops??2),V="brief";if(Z.json)V="json";else if(Z.verbose)V="verbose";else if(Z.quiet)V="quiet";else if(Z.format==="detailed")V="detailed";let B=v(),z=z2(V,B);if(H.length===0){let O=await G.findBySource(J,$),R=await G.findByTarget(J,$);if(O.length===0&&R.length===0){if(Z.json)C({command:"related",code:"NOT_FOUND",message:`No related items found for ${$}`,context:{source_id:$,source_type:J}});else{let M=z.formatEmpty($);if(V!=="quiet"||M)console.error(M)}return{exitCode:1}}}let W=new Map;for(let{link:O,hop:R}of H)if(O.targetType==="session"){let M=W.get(O.targetId);if(!M||O.weight>M.weight)W.set(O.targetId,{weight:O.weight,hops:R})}W.delete($);let N=Array.from(W.entries()).sort((O,R)=>R[1].weight-O[1].weight||O[1].hops-R[1].hops).slice(0,Z.limit??10),q=[];for(let[O,{weight:R,hops:M}]of N){let x=await _.findById(O);if(x)q.push({session:x,weight:R,hops:M})}if(q.length===0){if(Z.json)C({command:"related",code:"NOT_FOUND",message:`No related items found for ${$}`,context:{source_id:$,source_type:J}});else{let O=z.formatEmpty($);if(V!=="quiet"||O)console.error(O)}return{exitCode:1}}if(Z.json){let O=performance.now();return $0({command:"related",kind:"related",data:q.map(VZ),meta:{source_id:$,source_type:J,count:q.length,timing_ms:Math.round(O-X)}}),{exitCode:0}}let I=performance.now(),T={sourceId:$,executionTimeMs:Math.round(I-X)},U=z.formatRelated(q,T);if(Z.format==="ai")U=r(U);return console.log(U),{exitCode:0}}catch(G){let _=G instanceof j?G:new j(F.DB_CONNECTION_FAILED,A(G));if(Z.json)C({command:"related",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(p(_));return{exitCode:1}}finally{D(Q)}}var C$=L(()=>{H0();E9();c();N2();P0();D0();T0();d0();X1()});var v1={};y(v1,{executeQueryCommand:()=>a2,createQueryCommand:()=>y$});import{Command as MX,Option as b1}from"commander";function y$(){return new MX("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 b1("--scope <scope>","Query scope: global or project").choices(["global","project"])).option("-p, --project <name>","Filter by project name").addOption(new b1("--kind <kind>","Resource kind to query").choices(["message","session","file","stats","context","related"]).default("message")).addOption(new b1("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"])).option("-l, --limit <count>","Maximum results to return").addOption(new b1("--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",($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Days must be a positive number");return Z}).option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new b1("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new b1("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async($,Z)=>{let K=await a2($,Z);process.exitCode=K.exitCode})}async function a2($,Z){let K=Z.kind??"message",X=Z.project||(Z.scope==="project"?$:void 0),Y=!process.env.MEMORY_JSON_COMMAND_OVERRIDE;if(Y)process.env.MEMORY_JSON_COMMAND_OVERRIDE="query";try{let Q=Z;switch(K){case"message":{let{runSearchInternal:G}=await Promise.resolve().then(() => (L4(),n2));return await G($||"",{...Z,project:X,files:!1})}case"file":{let{runSearchInternal:G}=await Promise.resolve().then(() => (L4(),n2));return await G($||"",{...Z,project:X,files:!0})}case"session":if($){let{runShowInternal:G}=await Promise.resolve().then(() => (x$(),k8));return await G($,{json:Q.json,verbose:Q.verbose,quiet:Q.quiet,tools:Q.tools,format:Q.format},{dbPath:Z.dbPath})}else{let{runListInternal:G}=await Promise.resolve().then(() => (c2(),S8));return await G({limit:Z.limit,project:X,since:Q.since,before:Q.before,days:Z.days,json:Z.json,verbose:Z.verbose,quiet:Z.quiet,format:Z.format},{dbPath:Z.dbPath})}case"stats":{let{executeStatsCommand:G}=await Promise.resolve().then(() => (l2(),h8));return await G({json:Z.json,verbose:Z.verbose,quiet:Z.quiet,projects:Z.projects,format:Z.format},{dbPath:Z.dbPath})}case"context":{let G=X||$;if(!G){if(Z.json)C({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:_}=await Promise.resolve().then(() => (S$(),c8));return await _(G,{json:Z.json,verbose:Z.verbose,quiet:Z.quiet,days:Z.days,format:Q.format,budget:Q.budget,crossProject:Q.crossProject},{dbPath:Z.dbPath})}case"related":{if(!$){if(Z.json)C({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:G}=await Promise.resolve().then(() => (C$(),u8));return await G($,{limit:Q.limit,json:Z.json,verbose:Z.verbose,quiet:Z.quiet,format:Q.format,type:Q.type,hops:Q.hops,dbPath:Z.dbPath},{dbPath:Z.dbPath})}default:{if(Z.json)C({command:"query",code:"INVALID_ARGUMENT",message:`Unsupported kind: ${K}`});else console.error(`Error: Unsupported kind: ${K}`);return{exitCode:1}}}}finally{if(Y)delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}var Y1=L(()=>{T0()});var n2={};y(n2,{runSearchInternal:()=>xX,resolveSearchMode:()=>d8,filterCaseSensitive:()=>p8,executeSearchCommand:()=>I4,createSearchCommand:()=>w$});import{Command as jX,Option as k0}from"commander";function d8($){if($.vector===!1)return"fts";if(!$.mode||$.mode==="auto")return;return $.mode}function w$(){return new jX("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 k0("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new k0("--before <date>","Results before date").conflicts("days")).addOption(new k0("--days <n>","Results from last N days (includes today)").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Days must be a positive number");return Z}).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 k0("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new k0("--no-vector","Disable vector search (same as --mode fts)")).addOption(new k0("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new k0("--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 k0("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new k0("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async($,Z)=>{let K=await I4($,Z);process.exitCode=K.exitCode})}async function I4($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (Y1(),v1)),X=Z.files?"file":"message",Y=Z.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="search";try{return await K($,{...Z,kind:X,scope:Y})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function xX($,Z){let K=performance.now();if(Z.format==="default")_0({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:Z.json});let X;try{X=K4.from($)}catch(J){if(Z.json)C({command:"search",code:"INVALID_QUERY",message:"Query cannot be empty"});else console.error("Error: Query cannot be empty");return{exitCode:1}}if(Z.files)return EX($,Z);let Y=Z.dbPath??P(),{db:Q,sqliteVecAvailable:G}=S({path:Y}),_=new U$;try{let J=h(),H=new O1(Q),V=new j0(Q),B=new U1({db:Q,fts5Service:H,embeddingRepo:V,providerFactory:_,config:J,sqliteVecAvailable:G}),z=parseInt(Z.limit??"10",10);if(isNaN(z)||z<1){if(Z.json)C({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(Z.role){let f=Z.role.split(",").map((f1)=>f1.trim().toLowerCase());if(f.length===1)W=f[0];else W=f}let N,q;if(Z.days){let f=new Date,f1=new Date(f.getFullYear(),f.getMonth(),f.getDate());N=new Date(f1.getTime()-(Z.days-1)*24*60*60*1000)}else{if(Z.since)try{N=S1(Z.since)}catch(f){if(f instanceof R0){if(Z.json)C({command:"search",code:"INVALID_ARGUMENT",message:f.message,context:{flag:"since",value:Z.since}});else console.error(`Error: ${f.message}`);return{exitCode:1}}throw f}if(Z.before)try{q=S1(Z.before)}catch(f){if(f instanceof R0){if(Z.json)C({command:"search",code:"INVALID_ARGUMENT",message:f.message,context:{flag:"before",value:Z.before}});else console.error(`Error: ${f.message}`);return{exitCode:1}}throw f}}let I=d8(Z),U={limit:Z.caseSensitive?z*2:z,projectFilter:Z.project,roleFilter:W,sinceDate:N,beforeDate:q,sessionFilter:Z.session,mode:I,noDecay:Z.decay===!1},O=await B.search(X,U),R=!1;if(Z.caseSensitive&&O.length>0){let f=O.length;O=p8(O,$,z),R=f>O.length||O.length<z}else O=O.slice(0,z);let M=B.getLastSearchMeta(),x="default";if(Z.json)x="json";else if(Z.quiet)x="quiet";else if(Z.verbose)x="verbose";else if(Z.format==="brief")x="brief";let o=v(),A0=Q2(x,o),N0=performance.now(),q0={query:$,executionDetails:{timeMs:Math.round(N0-K),ftsQuery:$,filtersApplied:DX(Z,R)},searchMeta:M??void 0},E6=Math.round(performance.now()-K),P6=()=>{let f={query:$,total_results:O.length,timing_ms:E6};if(M){if(f.mode=M.mode,f.mode_reason=M.modeReason,f.embedding_coverage=M.embeddingCoverage,f.degraded=M.degraded,M.degradationReason)f.degradation_reason=M.degradationReason}return f};if(Z.json){if($0({command:"search",kind:"message",data:O.map((f,f1)=>_$(f,{rank:f1+1,includeSearchMetaFields:!!M})),meta:P6()}),M&&M.embeddingCoverage===0&&!J.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),L0({search:{...J.search,hintShown:!0}});return{exitCode:0}}if(O.length===0&&M?.mode==="vector")return console.log(`No semantic matches for "${$}"`),{exitCode:0};let f$=A0.formatResults(O,q0);if(Z.format==="ai")f$=r(f$);if(console.log(f$),M&&M.embeddingCoverage===0&&!J.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),L0({search:{...J.search,hintShown:!0}});return{exitCode:0}}catch(J){let H=J instanceof j?J:new j(F.DB_CONNECTION_FAILED,A(J));if(Z.json)C({command:"search",code:H.code,message:H.message,...H.context!==void 0?{context:H.context}:{}});else console.error(p(H));return{exitCode:1}}finally{await _.dispose(),D(Q)}}async function EX($,Z){if(!h2()){if(Z.json)C({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 X=await new R$().search($);if(Z.json)return $0({command:"search",kind:"file",data:X.map(JZ),meta:{query:$,files:!0,total_results:X.length}}),{exitCode:0};if(X.length===0){let G=`No file results for "${$}"`;return console.log(Z.format==="ai"?G:G),{exitCode:0}}let Y=v(),Q=PX(X,Y);if(Z.format==="ai")Q=r(Q);return console.log(Q),{exitCode:0}}catch(K){let X=A(K);if(Z.json)C({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${X}`});else console.error(`Error: qmd search failed: ${X}`);return{exitCode:1}}}function PX($,Z){let K=[];K.push(`File results: ${$.length} match${$.length!==1?"es":""}`),K.push("");for(let X of $){let Y=X.file.replace(/^qmd:\/\//,"");K.push(` ${w(X.title,Z)}`),K.push(` ${k(`${Y} (score: ${X.score})`,Z)}`);let Q=X.snippet||X.context;if(Q)K.push(` ${Q}`);K.push("")}return K.join(`
970
- `)}function DX($,Z){let K=[];if($.limit)K.push(`limit: ${$.limit}`);if($.project)K.push(`project: ${$.project}`);if($.session)K.push(`session: ${$.session}`);if($.role)K.push(`role: ${$.role}`);if($.days)K.push(`days: ${$.days}`);if($.since)K.push(`since: ${$.since}`);if($.before)K.push(`before: ${$.before}`);if($.caseSensitive)K.push("case-sensitive");if(Z)K.push("case-sensitive filter applied");if($.mode&&$.mode!=="auto")K.push(`mode: ${$.mode}`);if($.vector===!1)K.push("no-vector");if($.decay===!1)K.push("no-decay");return K}function p8($,Z,K){return $.filter((Y)=>{return Y.snippet.replace(/<\/?mark>/g,"").includes(Z)}).slice(0,K)}var L4=L(()=>{H0();c();L$();K0();H$();P0();f2();D0();T0();d0();X1();M$()});var I6={};y(I6,{ClaudeSummaryGenerator:()=>L6});import{spawn as PY}from"child_process";class L6{async generateSummary($,Z,K,X,Y){let Q=this.buildPrompt($,Z,K,X,Y);return new Promise((G,_)=>{let J={...process.env};delete J.CLAUDECODE;let H=PY("claude",["-p","--output-format","text"],{env:J,stdio:["pipe","pipe","pipe"]}),V="",B="";H.stdout.on("data",(z)=>{V+=z.toString()}),H.stderr.on("data",(z)=>{B+=z.toString()}),H.on("error",(z)=>{_(Error(`Failed to spawn claude -p: ${z.message}`))}),H.on("close",(z)=>{if(z===0)G(V.trim());else _(Error(`claude -p exited with code ${z}: ${B.trim()}`))}),H.stdin.write(Q),H.stdin.end()})}buildPrompt($,Z,K,X,Y){return["Summarize this Claude Code session into a structured daily log entry.","Output ONLY the markdown content below, no preamble or explanation.","","Format:",`## Session: ${Z} (${X} - ${Y})`,`**Project:** ${K}`,"","### 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:",$].join(`
971
- `)}}var T6=()=>{};import{Command as uY}from"commander";var z3={name:"@chude/memory",version:"4.0.0",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",quality:"bun run typecheck && bun run build && bun test --timeout 15000 && bun run test:isolation && bun run test:coverage && bun audit","test:smoke":"bun test tests/smoke","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.7"},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.152","@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.4.2",qs:"6.15.2",rollup:"4.60.4",vite:"8.0.14",yaml:"2.9.0"},trustedDependencies:["onnxruntime-node","protobufjs"]};r$();import{Command as pK,Option as M8}from"commander";o1();E4();P4();H0();var n6={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})};class D4{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor($,Z,K,X,Y,Q,G,_,J,H=n6){this.sessionSource=$;this.eventParser=Z;this.sessionRepo=K;this.messageRepo=X;this.toolUseRepo=Y;this.extractionStateRepo=Q;this.db=G;this.abortSignal=_;this.checkpointManager=J;this.redactor=H}async sync($={}){let Z=Date.now(),K=$.checkpointEnabled!==!1,X={success:!0,sessionsDiscovered:0,sessionsProcessed:0,sessionsSkipped:0,messagesInserted:0,toolUsesInserted:0,errors:[],durationMs:0,aborted:!1},Y=null,Q=new Set;if(K){if(Y=this.checkpointManager.load(),Y){X.recoveredFromCheckpoint=Y.completedSessions;for(let V of Y.completedSessionIds)Q.add(V)}}$.onProgress?.({current:0,total:0,sessionId:"",phase:"discovering"});let G;try{G=await this.sessionSource.discoverSessions()}catch(V){throw new j(F.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:A(V)})}X.sessionsDiscovered=G.length;let _=await this.filterSessions(G,$);if(Q.size>0){let V=_.length;_=_.filter((B)=>!Q.has(B.id)),X.sessionsSkipped+=V-_.length}if(X.sessionsSkipped=X.sessionsDiscovered-_.length-Q.size,X.sessionsSkipped<0)X.sessionsSkipped=X.sessionsDiscovered-_.length;let J=_.length+Q.size,H=Y??{startedAt:new Date().toISOString(),totalSessions:J,completedSessions:Q.size,completedSessionIds:[...Q],lastCompletedAt:null};for(let V=0;V<_.length;V++){if(this.abortSignal.shouldAbort()){if(X.aborted=!0,K)this.checkpointManager.save(H);break}let B=_[V];if(!B)continue;$.onProgress?.({current:V+1+Q.size,total:J,sessionId:B.id,phase:"extracting"});try{let z=await this.extractSession(B);if(X.sessionsProcessed++,X.messagesInserted+=z.messages,X.toolUsesInserted+=z.toolUses,K)H.completedSessions++,H.completedSessionIds.push(B.id),H.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(H);$.onSessionComplete?.(B.id)}catch(z){let W=this.wrapError(z,B.path);X.errors.push({sessionPath:B.path,error:W.message}),X.success=!1}}if(K&&!X.aborted&&X.success)this.checkpointManager.clear();return $.onProgress?.({current:J,total:J,sessionId:"",phase:"complete"}),X.durationMs=Date.now()-Z,X}async fixProjectNames($){let Z=await this.sessionRepo.findDistinctEncodedPaths(),K=0;for(let X of Z){let Y=$.resolveFromEncodedPath(X),Q=await this.sessionRepo.updateProjectName(X,Y);K+=Q}return K}wrapError($,Z){if($ instanceof j)return $;let K=A($);if(K.includes("ENOENT")||K.includes("no such file"))return new j(F.SOURCE_INACCESSIBLE,`Cannot access session file: ${K}`,{path:Z});if(K.includes("JSON")||K.includes("parse"))return new j(F.INVALID_JSON,`Failed to parse session file: ${K}`,{path:Z});if(K.includes("locked")||K.includes("SQLITE_BUSY"))return new j(F.DB_LOCKED,`Database is locked: ${K}`,{path:Z});if(K.includes("database")||K.includes("SQLITE"))return new j(F.DB_CONNECTION_FAILED,`Database error: ${K}`,{path:Z});return new j(F.SYNC_FAILED,K,{path:Z})}async filterSessions($,Z){let K=$;if(Z.projectFilter)K=K.filter((Y)=>Y.projectPath.decoded.includes(Z.projectFilter));if(Z.sessionFilter)K=K.filter((Y)=>Y.id===Z.sessionFilter);let X=[];for(let Y of K){let Q=await this.extractionStateRepo.findBySessionPath(Y.path);if(this.needsExtraction(Y,Q,Z.force??!1))X.push(Y)}return X}needsExtraction($,Z,K){if(K)return!0;if(!Z)return!0;if(Z.status!=="complete")return!0;let{fileMtime:X,fileSize:Y}=Z;if(!X||Y===void 0||Y===null)return!0;return $.modifiedTime.getTime()!==X.getTime()||$.size!==Y}async extractSession($){let Z=crypto.randomUUID(),K=Q0.create({id:Z,sessionPath:$.path,startedAt:new Date,status:"pending"}).withFileMetadata($.modifiedTime,$.size);try{let X=[];for await(let V of this.eventParser.parse($.path))X.push(V);let{messages:Y,toolUses:Q,firstTimestamp:G,lastTimestamp:_}=this.extractEntities(X),J=O0.create({id:$.id,projectPath:$.projectPath,startTime:G??new Date,endTime:_,messageCount:Y.length});return this.db.transaction(()=>{if(this.sessionRepo.save(J),Y.length>0)this.messageRepo.saveMany(Y.map((B)=>({message:B,sessionId:$.id})));if(Q.length>0)this.toolUseRepo.saveMany(Q.map((B)=>({toolUse:B,sessionId:$.id})));let V=K.startProcessing().incrementMessages(Y.length).complete(new Date);this.extractionStateRepo.save(V)}).immediate(),{messages:Y.length,toolUses:Q.length}}catch(X){let Y=K.fail(A(X));throw await this.extractionStateRepo.save(Y),X}}extractEntities($){let Z=[],K=[],X=new Map,Y,Q;for(let G of $){if(G.type==="skipped")continue;if("data"in G&&G.data.timestamp){let _=new Date(G.data.timestamp);if(!Y||_<Y)Y=_;if(!Q||_>Q)Q=_}switch(G.type){case"user":{let _=J0.create({id:G.data.uuid,role:"user",content:this.redactor.redactText(G.data.message.content).text,timestamp:new Date(G.data.timestamp)});Z.push(_);break}case"assistant":{let _=G.data.message.content.filter((B)=>B.type==="text").map((B)=>B.text).join(`
972
- `),J=this.redactor.redactText(_).text,H=G.data.message.content.filter((B)=>B.type==="tool_use").map((B)=>B.id);for(let B of G.data.message.content)if(B.type==="tool_use"){let z=U0.create({id:B.id,name:B.name,input:this.redactor.redactJson(B.input).value,timestamp:new Date(G.data.timestamp),status:"pending"});X.set(B.id,z)}let V=J0.create({id:G.data.uuid,role:"assistant",content:J,timestamp:new Date(G.data.timestamp),toolUseIds:H});Z.push(V);break}case"tool_use":{let _=U0.create({id:G.data.uuid,name:G.data.name,input:this.redactor.redactJson(G.data.input).value,timestamp:new Date(G.data.timestamp),status:"pending"});X.set(G.data.uuid,_);break}case"tool_result":{let _=X.get(G.data.toolUseId);if(_){let J=G.data.isError?_.completeError(this.redactor.redactText(G.data.content).text):_.completeSuccess(this.redactor.redactText(G.data.content).text);X.set(G.data.toolUseId,J)}break}case"summary":case"system":break}}return K.push(...X.values()),{messages:Z,toolUses:K,firstTimestamp:Y,lastTimestamp:Q}}}t1();t$();$9();import{existsSync as r6}from"fs";var x3={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})};function B1($,Z){return $.redactText(Z).text}function s1($,Z){return Z===null?null:B1($,Z)}async function Z9($,Z,K={}){let X=K.includeSensitive?x3:K.redactor??x3,Y=$.query(`SELECT id, project_path_encoded as projectPathEncoded,
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
+ `)?`\r
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(!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
+ 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
+
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(`
1399
+ `)}function EQ(A,_){let G=[];if(G.push("Configuration"),A.health.config.valid)G.push(` ${g(!0,_)} Valid`);else{G.push(` ${g(!1,_)} Invalid`);for(let $ of A.health.config.issues)G.push(` ${d("-",_)} ${$}`)}return G.join(`
1400
+ `)}function DQ(A,_){let G=[];G.push("Database");let $=S();if(A.health.database.exists)G.push(` ${g(A.health.database.exists,_)} Exists: ${$}`),G.push(` ${g(A.health.database.readable,_)} Readable`),G.push(` ${g(A.health.database.writable,_)} Writable`),G.push(` ${g(A.health.database.integrity==="ok",_)} Integrity: ${vQ(A.health.database.integrity,_)}`),G.push(` ${P(`Size: ${hQ(A.health.database.size)}`,_)}`);else G.push(` ${g(!1,_)} Database not found: ${$}`),G.push(` ${P("Run 'memory sync' to create database",_)}`);if(A.health.sqliteVec.available)G.push(` ${g(!0,_)} sqlite-vec: v${A.health.sqliteVec.version}`);else G.push(` ${g(!1,_)} sqlite-vec: not available`);if(G.push(""),G.push("Permissions"),G.push(` ${g(A.health.permissions.configDir,_)} Config directory: ${C0()}`),G.push(` ${g(A.health.permissions.logsDir,_)} Logs directory: ${z_()}`),G.push(` ${g(A.health.permissions.sourceDir,_)} Source directory: ~/.claude/projects`),G.push(""),G.push("Search Capability"),G.push(` ${g(A.health.searchCapability.fts5,_)} FTS5: available`),G.push(` ${g(A.health.searchCapability.sqliteVec,_)} sqlite-vec: ${A.health.searchCapability.sqliteVec?"available":"not available"}`),G.push(` ${P(`Embeddings: ${A.health.searchCapability.embeddedCount}/${A.health.searchCapability.totalMessages} (${A.health.searchCapability.coveragePercent}%)`,_)}`),G.push(` ${P(`Default mode: ${A.health.searchCapability.defaultMode}`,_)}`),G.push(` ${g(A.health.searchCapability.vectorReady,_)} Vector search: ${A.health.searchCapability.vectorReady?"ready":"not ready"}`),G.push(""),G.push("Optional Tools"),A.qmd.available)G.push(` ${P("[INFO]",_)} qmd: installed at ${A.qmd.path} (enables --files search)`);else G.push(` ${P("[INFO]",_)} qmd: not found (optional -- install with: bun add -g @tobilu/qmd)`);return G.join(`
1401
+ `)}function xQ(A,_){let G=[];if(G.push("Embeddings"),G.push(` ${g(A.health.embedding.enabled,_)} Enabled: ${A.health.embedding.enabled?"yes":"no"}`),G.push(` ${P(`Provider: ${A.health.embedding.provider}`,_)}`),G.push(` ${P(`Model: ${A.health.embedding.model}`,_)}`),G.push(` ${P(`Dimensions: ${A.health.embedding.dimensions}`,_)}`),G.push(` ${g(A.health.embedding.ready,_)} Ready: ${A.health.embedding.ready?"yes":"no"}`),A.health.embedding.readyReason)if(A.health.embedding.ready)G.push(` ${P(`Note: ${A.health.embedding.readyReason}`,_)}`);else G.push(` ${d(`Reason: ${A.health.embedding.readyReason}`,_)}`);return G.join(`
1402
+ `)}function PQ(A,_){let G=[];if(G.push("LLM Fact Extraction"),G.push(` ${g(A.health.llmExtraction.ready,_)} Ready: ${A.health.llmExtraction.ready?"yes":"no"}`),G.push(` ${P(`Provider: ${A.health.llmExtraction.provider}`,_)}`),G.push(` ${P(`Model: ${A.health.llmExtraction.model}`,_)}`),A.health.llmExtraction.readyReason)if(A.health.llmExtraction.ready)G.push(` ${P(`Note: ${A.health.llmExtraction.readyReason}`,_)}`);else G.push(` ${d(`Reason: ${A.health.llmExtraction.readyReason}`,_)}`);return G.join(`
1403
+ `)}function yQ(A,_){let G=L8(A),$=[];if($.push("Provider Egress"),$.push(` ${g(G.consent==="granted",_)} Consent: ${G.consent}`),$.push(z8("Embeddings",G.embedding,_)),$.push(z8("LLM Extraction",G.llmExtraction,_)),G.warnings.length>0)for(let K of G.warnings)$.push(` ${l(`Warning: ${K}`,_)}`);return $.join(`
1404
+ `)}function kQ(A,_){let G=M8(A),$=["Capability Interop"];for(let K of G.providers){let Z=K.status==="optional_unavailable"?"optional unavailable":K.status.replace(/_/g," "),Y=K.available?g(!0,_):P("[INFO]",_);$.push(` ${Y} ${K.provider}: ${Z}`)}if(G.references.length===0)$.push(` ${P("References: none configured",_)}`);else for(let K of G.references){let Z=K.envVar?` via ${K.envVar}`:"";$.push(` ${P(`${K.source}: ${K.maskedReference} (${K.status}${Z})`,_)}`)}for(let K of G.warnings)$.push(` ${l(`Warning: ${K}`,_)}`);return $.join(`
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
+ `),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
+ 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();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
+ ${O.content}`).join(`
1410
+
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,
973
1415
  project_path_decoded as projectPathDecoded,
974
1416
  project_name as projectName,
975
1417
  start_time as startTime, end_time as endTime,
976
1418
  message_count as messageCount, summary
977
- FROM sessions`).all().map((q)=>({...q,summary:s1(X,q.summary)})),Q=$.query(`SELECT id, session_id as sessionId, role, content, timestamp,
1419
+ FROM sessions`).all().map((z)=>({...z,summary:n_($,z.summary)})),Z=A.query(`SELECT id, session_id as sessionId, role, content, timestamp,
978
1420
  tool_use_ids as toolUseIds
979
- FROM messages_meta`).all().map((q)=>({...q,content:B1(X,q.content)})),G=$.query(`SELECT id, session_id as sessionId, name, input, timestamp, status, result
980
- FROM tool_uses`).all().map((q)=>({...q,input:B1(X,q.input),result:s1(X,q.result)})),_=$.query(`SELECT id, type, name, metadata, confidence
981
- FROM entities`).all().map((q)=>({...q,name:B1(X,q.name),metadata:s1(X,q.metadata)})),J=$.query(`SELECT source_type as sourceType, source_id as sourceId,
1421
+ FROM messages_meta`).all().map((z)=>({...z,content:o0($,z.content)})),Y=A.query(`SELECT id, session_id as sessionId, name, input, timestamp, status, result
1422
+ FROM tool_uses`).all().map((z)=>({...z,input:o0($,z.input),result:n_($,z.result)})),J=A.query(`SELECT id, type, name, metadata, confidence
1423
+ FROM entities`).all().map((z)=>({...z,name:o0($,z.name),metadata:n_($,z.metadata)})),H=A.query(`SELECT source_type as sourceType, source_id as sourceId,
982
1424
  target_type as targetType, target_id as targetId,
983
1425
  relationship, weight
984
- FROM links`).all(),H=$.query(`SELECT session_id as sessionId, entity_id as entityId, frequency
985
- FROM session_entities`).all(),V=$.query(`SELECT source_id as sourceId, target_id as targetId, relationship, weight
986
- FROM entity_links`).all(),B=$.query(`SELECT id, session_path as sessionPath, started_at as startedAt,
1426
+ FROM links`).all(),Q=A.query(`SELECT session_id as sessionId, entity_id as entityId, frequency
1427
+ FROM session_entities`).all(),X=A.query(`SELECT source_id as sourceId, target_id as targetId, relationship, weight
1428
+ FROM entity_links`).all(),V=A.query(`SELECT id, session_path as sessionPath, started_at as startedAt,
987
1429
  status, completed_at as completedAt,
988
1430
  messages_extracted as messagesExtracted,
989
1431
  error_message as errorMessage,
990
1432
  file_mtime as fileMtime, file_size as fileSize
991
- FROM extraction_state`).all().map((q)=>({...q,sessionPath:B1(X,q.sessionPath),errorMessage:s1(X,q.errorMessage)})),z=$.query(`SELECT uuid, type, project, content, metadata,
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,
992
1434
  observed_at as observedAt, superseded_at as supersededAt,
993
1435
  superseded_by as supersededBy
994
- FROM facts`).all().map((q)=>({...q,content:B1(X,q.content),metadata:s1(X,q.metadata)})),W={version:"1.0",exportedAt:new Date().toISOString(),stats:{sessions:Y.length,messages:Q.length,toolUses:G.length,entities:_.length,links:J.length,sessionEntities:H.length,entityLinks:V.length,extractionStates:B.length,facts:z.length},sessions:Y,messages:Q,toolUses:G,entities:_,links:J,sessionEntities:H,entityLinks:V,extractionStates:B,facts:z},N=JSON.stringify(W,null,2);return await Bun.write(Z,N),{sessions:Y.length,messages:Q.length,toolUses:G.length,entities:_.length,links:J.length,bytes:N.length,facts:z.length}}async function k4($){if(!r6($))return{valid:!1,error:"File does not exist"};try{let K=await Bun.file($).text(),X=JSON.parse(K);if(!X.version||typeof X.version!=="string")return{valid:!1,error:"Missing or invalid version field"};let Y=["sessions","messages","toolUses","entities","links"];for(let Q of Y)if(!Array.isArray(X[Q]))return{valid:!1,error:`Missing or invalid ${Q} array`};if(!X.stats||typeof X.stats!=="object")return{valid:!1,error:"Missing or invalid stats object"};return{valid:!0,version:X.version}}catch(Z){return{valid:!1,error:`Failed to parse file: ${A(Z)}`}}}async function K9($,Z,K={}){let X=await k4(Z);if(!X.valid)throw Error(`Invalid export file: ${X.error}`);let Q=await Bun.file(Z).text(),G=JSON.parse(Q);if(K.clearExisting)o6($);return $.transaction(()=>{let J=$.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(`
995
1437
  INSERT OR IGNORE INTO sessions
996
1438
  (id, project_path_encoded, project_path_decoded, project_name,
997
1439
  start_time, end_time, message_count, summary)
998
1440
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
999
- `);for(let W of G.sessions)J.run(W.id,W.projectPathEncoded,W.projectPathDecoded,W.projectName,W.startTime,W.endTime,W.messageCount,W.summary);let H=$.prepare(`
1441
+ `);for(let W of Y.sessions)H.run(W.id,W.projectPathEncoded,W.projectPathDecoded,W.projectName,W.startTime,W.endTime,W.messageCount,W.summary);let Q=A.prepare(`
1000
1442
  INSERT OR IGNORE INTO messages_meta
1001
1443
  (id, session_id, role, content, timestamp, tool_use_ids)
1002
1444
  VALUES (?, ?, ?, ?, ?, ?)
1003
- `);for(let W of G.messages)H.run(W.id,W.sessionId,W.role,W.content,W.timestamp,W.toolUseIds);let V=$.prepare(`
1445
+ `);for(let W of Y.messages)Q.run(W.id,W.sessionId,W.role,W.content,W.timestamp,W.toolUseIds);let X=A.prepare(`
1004
1446
  INSERT OR IGNORE INTO tool_uses
1005
1447
  (id, session_id, name, input, timestamp, status, result)
1006
1448
  VALUES (?, ?, ?, ?, ?, ?, ?)
1007
- `);for(let W of G.toolUses)V.run(W.id,W.sessionId,W.name,W.input,W.timestamp,W.status,W.result);let B=$.prepare(`
1449
+ `);for(let W of Y.toolUses)X.run(W.id,W.sessionId,W.name,W.input,W.timestamp,W.status,W.result);let V=A.prepare(`
1008
1450
  INSERT OR IGNORE INTO entities
1009
1451
  (id, type, name, metadata, confidence)
1010
1452
  VALUES (?, ?, ?, ?, ?)
1011
- `);for(let W of G.entities)B.run(W.id,W.type,W.name,W.metadata,W.confidence);let z=$.prepare(`
1453
+ `);for(let W of Y.entities)V.run(W.id,W.type,W.name,W.metadata,W.confidence);let B=A.prepare(`
1012
1454
  INSERT OR IGNORE INTO links
1013
1455
  (source_type, source_id, target_type, target_id, relationship, weight)
1014
1456
  VALUES (?, ?, ?, ?, ?, ?)
1015
- `);for(let W of G.links)z.run(W.sourceType,W.sourceId,W.targetType,W.targetId,W.relationship,W.weight);if(G.sessionEntities&&G.sessionEntities.length>0){let W=$.prepare(`
1457
+ `);for(let W of Y.links)B.run(W.sourceType,W.sourceId,W.targetType,W.targetId,W.relationship,W.weight);if(Y.sessionEntities&&Y.sessionEntities.length>0){let W=A.prepare(`
1016
1458
  INSERT OR IGNORE INTO session_entities
1017
1459
  (session_id, entity_id, frequency)
1018
1460
  VALUES (?, ?, ?)
1019
- `);for(let N of G.sessionEntities)W.run(N.sessionId,N.entityId,N.frequency)}if(G.entityLinks&&G.entityLinks.length>0){let W=$.prepare(`
1461
+ `);for(let N of Y.sessionEntities)W.run(N.sessionId,N.entityId,N.frequency)}if(Y.entityLinks&&Y.entityLinks.length>0){let W=A.prepare(`
1020
1462
  INSERT OR IGNORE INTO entity_links
1021
1463
  (source_id, target_id, relationship, weight)
1022
1464
  VALUES (?, ?, ?, ?)
1023
- `);for(let N of G.entityLinks)W.run(N.sourceId,N.targetId,N.relationship,N.weight)}if(G.extractionStates&&G.extractionStates.length>0){let W=$.prepare(`
1465
+ `);for(let N of Y.entityLinks)W.run(N.sourceId,N.targetId,N.relationship,N.weight)}if(Y.extractionStates&&Y.extractionStates.length>0){let W=A.prepare(`
1024
1466
  INSERT OR IGNORE INTO extraction_state
1025
1467
  (id, session_path, started_at, status, completed_at,
1026
1468
  messages_extracted, error_message, file_mtime, file_size)
1027
1469
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
1028
- `);for(let N of G.extractionStates)W.run(N.id,N.sessionPath,N.startedAt,N.status,N.completedAt,N.messagesExtracted,N.errorMessage,N.fileMtime,N.fileSize)}if(G.facts&&G.facts.length>0){let W=$.prepare(`
1470
+ `);for(let N of Y.extractionStates)W.run(N.id,N.sessionPath,N.startedAt,N.status,N.completedAt,N.messagesExtracted,N.errorMessage,N.fileMtime,N.fileSize)}if(Y.facts&&Y.facts.length>0){let W=A.prepare(`
1029
1471
  INSERT OR IGNORE INTO facts
1030
1472
  (uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by)
1031
1473
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
1032
- `);for(let N of G.facts)W.run(N.uuid,N.type,N.project,N.content,N.metadata,N.observedAt,N.supersededAt,N.supersededBy)}return{sessions:G.sessions.length,messages:G.messages.length,toolUses:G.toolUses.length,entities:G.entities.length,links:G.links.length,facts:G.facts?G.facts.length:0}}).immediate()}function o6($){$.exec("PRAGMA foreign_keys = OFF;");try{$.exec("DELETE FROM session_entities;"),$.exec("DELETE FROM entity_links;"),$.exec("DELETE FROM links;"),$.exec("DELETE FROM messages_meta;"),$.exec("DELETE FROM sessions_fts;"),$.exec("DELETE FROM facts;"),$.exec("DELETE FROM tool_uses;"),$.exec("DELETE FROM sessions;"),$.exec("DELETE FROM entities;"),$.exec("DELETE FROM extraction_state;"),$.exec("DELETE FROM topics;")}finally{$.exec("PRAGMA foreign_keys = ON;")}}function X9($){return($.query(`SELECT (SELECT COUNT(*) FROM sessions) +
1033
- (SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}S4();class v4{repository;scanner;constructor($,Z){this.repository=$;this.scanner=Z}async syncMemoryFiles($={}){let Z={filesIndexed:0,filesSkipped:0,errors:[]},K;try{K=await this.scanner.discoverFiles()}catch(X){return Z.errors.push({filePath:"~/.memory/",error:A(X)}),Z}for(let X=0;X<K.length;X++){let Y=K[X];if(!Y)continue;try{let Q=await this.repository.findByPath(Y.filePath);if(Q&&Q.contentHash===Y.contentHash){Z.filesSkipped++,$.onProgress?.({current:X+1,total:K.length,filePath:Y.filePath,action:"skipped"});continue}let G=t0.create({filePath:Y.filePath,fileType:Y.fileType,projectEncoded:Y.projectEncoded,content:Y.content,contentHash:Y.contentHash,lastIndexedAt:new Date});await this.repository.save(G),Z.filesIndexed++,$.onProgress?.({current:X+1,total:K.length,filePath:Y.filePath,action:"indexing"})}catch(Q){Z.errors.push({filePath:Y.filePath,error:A(Q)})}}return Z}}C4();H0();import{existsSync as s6,readFileSync as e6,unlinkSync as $7}from"fs";class y4{repository;constructor($){this.repository=$}async log($){let Z=C0.create({description:$.description,severity:$.severity??"medium",category:$.category??"cli",tool:$.tool??"memory",status:"open",context:$.context,sourceProject:$.sourceProject,loggedAt:$.loggedAt??new Date});return this.repository.save(Z)}async list($){if($?.all||$?.tool||$?.category||$?.sourceProject)return this.repository.findAll({status:$?.all?$.status:"open",category:$?.category,tool:$?.tool,sourceProject:$?.sourceProject,limit:$?.limit});return this.repository.findOpen()}async resolve($,Z){let K=await this.repository.findById($);if(!K)throw new j(F.NOT_FOUND,`Friction entry #${$} not found`,{id:$});if(K.status!=="open")throw new j(F.INVALID_STATE,`Friction entry #${$} is already ${K.status}`,{id:$,currentStatus:K.status});await this.repository.resolve($,Z)}async wontFix($,Z){let K=await this.repository.findById($);if(!K)throw new j(F.NOT_FOUND,`Friction entry #${$} not found`,{id:$});if(K.status!=="open")throw new j(F.INVALID_STATE,`Friction entry #${$} is already ${K.status}`,{id:$,currentStatus:K.status});await this.repository.resolve($,Z),await this.repository.updateStatus($,"wont-fix")}async getStats(){return this.repository.getStats()}async getWeeklyTrends($=4){return this.repository.getWeeklyTrends($)}async ingestFallbackFile($){if(!s6($))return 0;let K=e6($,"utf-8").split(`
1034
- `).filter(Boolean),X=0;for(let Y of K)try{let Q=JSON.parse(Y);await this.log({description:Q.description,severity:Q.severity??"medium",category:Q.category??"cli",tool:Q.tool??"unknown",context:Q.context,sourceProject:Q.project,loggedAt:Q.date?new Date(Q.date+"T00:00:00Z"):new Date}),X++}catch{process.stderr.write(`Warning: skipping malformed friction entry in ${$}
1035
- `)}try{$7($)}catch{process.stderr.write(`Warning: could not delete ${$} (entries already ingested)
1036
- `)}return X}async detectPatterns($=3){return this.repository.findPatterns($)}async markReviewed($){await this.repository.markReviewed($,new Date)}async purge($){return this.repository.deleteByPattern($)}}G9();w4();O9();c();W4();import{createReadStream as $K}from"fs";import{createInterface as ZK}from"readline";function x1($){if(typeof $==="string"){if(/^\d{4}-\d{2}-\d{2}T/.test($))return $;let Z=new Date($);if(!isNaN(Z.getTime()))return Z.toISOString()}if(typeof $==="number"&&!isNaN($)){let Z=$>1000000000000?$:$*1000,K=new Date(Z);if(!isNaN(K.getTime()))return K.toISOString()}if($ instanceof Date&&!isNaN($.getTime()))return $.toISOString();return new Date().toISOString()}var a7=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function r5($){if(typeof $!=="object"||$===null)return!1;return typeof $.type==="string"}function t9($){if(!r5($))return{type:"skipped",reason:"Invalid event structure"};let Z=$.type;if(a7.has(Z))return{type:"skipped",reason:`Event type "${Z}" not extracted`};switch(Z){case"user":return i7($);case"assistant":return o7($);case"summary":return s7($);case"system":return e7($);default:return{type:"skipped",reason:`Event type "${Z}" not classified`}}}function i7($){if(!$.uuid||!$.timestamp||!$.message)return{type:"skipped",reason:"User event missing required fields"};let Z={uuid:$.uuid,message:{content:r7($.message.content)},timestamp:x1($.timestamp)};if($.cwd)Z.cwd=$.cwd;if($.gitBranch)Z.gitBranch=$.gitBranch;return{type:"user",data:Z}}function r7($){if(typeof $==="string")return $;if(Array.isArray($))return $.filter((K)=>K.type==="tool_result").map((K)=>{if(typeof K.content==="string")return K.content;return JSON.stringify(K.content)}).join(`
1037
- `);return""}function o7($){if(!$.uuid||!$.timestamp||!$.message)return{type:"skipped",reason:"Assistant event missing required fields"};let Z=t7($.message.content||[]),K={uuid:$.uuid,message:{content:Z},timestamp:x1($.timestamp)};if($.message.model)K.message.model=$.message.model;if($.message.usage)K.usage={inputTokens:$.message.usage.input_tokens,outputTokens:$.message.usage.output_tokens};return{type:"assistant",data:K}}function t7($){if(!Array.isArray($))return[];return $.filter((Z)=>{return Z.type!=="thinking"}).map((Z)=>{if(Z.type==="text")return{type:"text",text:Z.text};if(Z.type==="tool_use")return{type:"tool_use",id:Z.id,name:Z.name,input:Z.input};return{type:"text",text:""}})}function s7($){if(!$.summary)return{type:"skipped",reason:"Summary event missing summary field"};let Z={content:$.summary,timestamp:x1($.timestamp)};if($.leafUuid)Z.leafUuid=$.leafUuid;return{type:"summary",data:Z}}function e7($){if(!$.subtype)return{type:"skipped",reason:"System event missing subtype field"};return{type:"system",data:{subtype:$.subtype,data:$.durationMs??$.data??null,timestamp:x1($.timestamp)}}}class Z${async*parse($){let Z=$K($,{encoding:"utf8"}),K=ZK({input:Z,crlfDelay:1/0}),X=0;for await(let Y of K){X++;let Q=Y.trim();if(Q===""){yield{type:"skipped",reason:`Empty line at ${X}`};continue}try{let G=JSON.parse(Q);yield t9(G)}catch(G){let _=A(G);yield{type:"skipped",reason:`Malformed JSON at line ${X}: ${_}`}}}}}l();import{existsSync as s9,mkdirSync as KK,readFileSync as XK,unlinkSync as YK,writeFileSync as QK}from"fs";import{dirname as GK}from"path";function K$($){return $??l1()}function o5($,Z){let K=K$(Z),X=GK(K);try{KK(X,{recursive:!0}),QK(K,JSON.stringify($,null,2)+`
1038
- `)}catch(Y){console.warn("Failed to save checkpoint:",Y.message)}}function E1($){let Z=K$($);if(!s9(Z))return null;try{let K=XK(Z,"utf-8"),X=JSON.parse(K);if(typeof X.startedAt!=="string"||typeof X.totalSessions!=="number"||typeof X.completedSessions!=="number"||!Array.isArray(X.completedSessionIds))return console.warn("Invalid checkpoint format, ignoring"),null;return X}catch{return console.warn("Invalid checkpoint JSON, ignoring"),null}}function t5($){let Z=K$($);if(s9(Z))try{YK(Z)}catch(K){console.warn("Failed to clear checkpoint:",K.message)}}function s5($){return s9(K$($))}import*as $Z from"readline";var i={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function _K(){if(i.ttyOverride!==null)return i.ttyOverride;return process.stdin.isTTY??!1}function X$($){if(i.exitOverride!==null){i.exitOverride($);return}process.exit($)}async function ZZ(){for(let $ of i.cleanupFunctions)try{await $()}catch(Z){console.warn("Cleanup error:",Z.message)}}async function JK(){let $=$Z.createInterface({input:process.stdin,output:process.stdout});return new Promise((Z)=>{let K=()=>{console.log(`
1039
- Interrupt received. Choose action:`),console.log(" 1) Abort immediately"),console.log(" 2) Abort after current session (saves progress)"),console.log(" 3) Cancel abort (continue)"),$.question("> ",(X)=>{let Y=parseInt(X.trim(),10);if(Y===1||Y===2||Y===3)$.close(),Z(Y);else console.log("Invalid choice. Enter 1, 2, or 3."),K()})};K()})}async function HK($){switch($){case 1:console.log("Aborting immediately..."),await ZZ(),X$(130);break;case 2:console.log("Will abort after current session..."),i.isShuttingDown=!0;break;case 3:console.log("Continuing..."),i.interruptCount=0;break}}async function e5(){if(i.interruptCount++,i.interruptCount>=2){console.log(`
1040
- Force exiting...`),await ZZ(),X$(130);return}if(_K()){let $=await JK();await HK($)}else console.log(`
1041
- Interrupt received, shutting down after current operation...`),i.isShuttingDown=!0}function KZ(){if(i.handlersRegistered)return;process.on("SIGINT",()=>{e5().catch(($)=>{console.error("Signal handler error:",$),X$(1)})}),process.on("SIGTERM",()=>{e5().catch(($)=>{console.error("Signal handler error:",$),X$(1)})}),i.handlersRegistered=!0}function XZ(){return i.isShuttingDown}function YZ($){i.cleanupFunctions.push($)}function QZ($){let Z=i.cleanupFunctions.indexOf($);if(Z!==-1)i.cleanupFunctions.splice(Z,1)}class Y${shouldAbort(){return XZ()}}class Q${path;constructor($){this.path=$}load(){return E1(this.path)}save($){o5($,this.path)}clear(){t5(this.path)}}u0();H$();_2();V2();B$();N2();L2();D0();import{readFileSync as LK}from"fs";import{resolve as IK}from"path";function T2($,Z,K,X,Y){if($.total===0)return"No friction entries logged yet.";let Q=[];Q.push(s("Friction Dashboard",X)),Q.push("=================="),Q.push(""),Q.push(s(" Overview",X)),Q.push(" --------"),Q.push(` Total: ${$.total} Open: ${u(String($.open),X)} Resolved: ${w(String($.resolved),X)} Won't Fix: ${$.wontFix}`),Q.push("");let G=$.meanTimeToResolve!==null?`MTTR: ${$.meanTimeToResolve.toFixed(1)} days`:"MTTR: N/A";if($.oldestOpen)Q.push(` ${G} Oldest Open: #${$.oldestOpen.id} (${$.oldestOpen.daysOpen} days)`);else Q.push(` ${G}`);Q.push(""),Q.push(s(" By Severity",X)),Q.push(" -----------");let _=["critical","high","medium","low"],J=Math.max(..._.map((H)=>$.bySeverity[H]),1);for(let H of _){let V=$.bySeverity[H],B=Math.round(V/J*20),z="=".repeat(B)+" ".repeat(20-B),W=H.padEnd(10),N=H==="critical"||H==="high"?m(W,X):H==="medium"?u(W,X):w(W,X);Q.push(` ${N}[${z}] ${V}`)}Q.push(""),Q.push(s(" By Category",X)),Q.push(" -----------");for(let[H,V]of Object.entries($.byCategory))Q.push(` ${GZ(H.padEnd(14),X)}${V}`);if(Q.push(""),$.byTool&&Object.keys($.byTool).length>0){Q.push(s(" By Tool",X)),Q.push(" -------");for(let[H,V]of Object.entries($.byTool)){let B="=".repeat(Math.min(V,40));Q.push(` ${H.padEnd(15)} ${B} ${V}`)}Q.push("")}if(Y&&Y.length>0){Q.push(s(" Pattern Alerts",X)),Q.push(" --------------");for(let H of Y)Q.push(` [!] Pattern detected: ${H.count} open entries for ${H.tool}/${H.category}`);Q.push("")}if(Z.length===0)Q.push(" No trend data available.");else{Q.push(s(" Trends",X)),Q.push(" ------"),Q.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let H of Z)Q.push(` ${k(H.week.padEnd(12),X)}${String(H.newCount).padEnd(6)}${H.resolvedCount}`)}return Q.join(`
1042
- `)}function TK(){let $=IK(import.meta.dirname,"../../../../node_modules/chart.js/dist/chart.umd.js");return LK($,"utf-8")}function RK($){return $.map((Z)=>({id:Z.id,severity:Z.severity,category:Z.category,description:Z.description,daysOpen:Math.floor((Date.now()-Z.loggedAt.getTime())/86400000)}))}function R2($,Z,K,X){let Y=TK(),Q=RK(K),G=$.meanTimeToResolve!==null?`${$.meanTimeToResolve.toFixed(1)} days`:"N/A",_=Q.map((J)=>`<tr>
1043
- <td>${J.id??"-"}</td>
1044
- <td class="severity-${J.severity}">${J.severity}</td>
1045
- <td>${J.category}</td>
1046
- <td>${I2(J.description)}</td>
1047
- <td>${J.daysOpen}d</td>
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
+ (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
+ `).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
+ `)}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)}}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
+ `)}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
+ <td>${H.id??"-"}</td>
1486
+ <td class="severity-${H.severity}">${H.severity}</td>
1487
+ <td>${H.category}</td>
1488
+ <td>${P2(H.description)}</td>
1489
+ <td>${H.daysOpen}d</td>
1048
1490
  </tr>`).join(`
1049
1491
  `);return`<!DOCTYPE html>
1050
1492
  <html lang="en">
@@ -1073,30 +1515,30 @@ Interrupt received, shutting down after current operation...`),i.isShuttingDown=
1073
1515
  .resolved { color: #44bb44; }
1074
1516
  .generated { color: #666; font-size: 0.8em; margin-top: 48px; text-align: center; }
1075
1517
  </style>
1076
- <script>${Y}</script>
1518
+ <script>${K}</script>
1077
1519
  </head>
1078
1520
  <body>
1079
1521
  <h1>Friction Dashboard</h1>
1080
1522
 
1081
1523
  <div class="stats-grid">
1082
1524
  <div class="stat-card">
1083
- <div class="stat-value">${$.total}</div>
1525
+ <div class="stat-value">${A.total}</div>
1084
1526
  <div class="stat-label">Total</div>
1085
1527
  </div>
1086
1528
  <div class="stat-card">
1087
- <div class="stat-value open">${$.open}</div>
1529
+ <div class="stat-value open">${A.open}</div>
1088
1530
  <div class="stat-label">Open</div>
1089
1531
  </div>
1090
1532
  <div class="stat-card">
1091
- <div class="stat-value resolved">${$.resolved}</div>
1533
+ <div class="stat-value resolved">${A.resolved}</div>
1092
1534
  <div class="stat-label">Resolved</div>
1093
1535
  </div>
1094
1536
  <div class="stat-card">
1095
- <div class="stat-value">${$.wontFix}</div>
1537
+ <div class="stat-value">${A.wontFix}</div>
1096
1538
  <div class="stat-label">Won't Fix</div>
1097
1539
  </div>
1098
1540
  <div class="stat-card">
1099
- <div class="stat-value">${G}</div>
1541
+ <div class="stat-value">${Y}</div>
1100
1542
  <div class="stat-label">MTTR</div>
1101
1543
  </div>
1102
1544
  </div>
@@ -1121,10 +1563,10 @@ Interrupt received, shutting down after current operation...`),i.isShuttingDown=
1121
1563
  <canvas id="byToolChart"></canvas>
1122
1564
  </div>
1123
1565
 
1124
- ${X&&X.length>0?` <div class="alerts">
1566
+ ${$&&$.length>0?` <div class="alerts">
1125
1567
  <h2>Pattern Alerts</h2>
1126
1568
  <ul>
1127
- ${X.map((J)=>`<li>Pattern detected: ${J.count} open entries for ${I2(J.tool)}/${I2(J.category)}</li>`).join(`
1569
+ ${$.map((H)=>`<li>Pattern detected: ${H.count} open entries for ${P2(H.tool)}/${P2(H.category)}</li>`).join(`
1128
1570
  `)}
1129
1571
  </ul>
1130
1572
  </div>`:""}
@@ -1135,16 +1577,16 @@ ${X&&X.length>0?` <div class="alerts">
1135
1577
  <tr><th>ID</th><th>Severity</th><th>Category</th><th>Description</th><th>Age</th></tr>
1136
1578
  </thead>
1137
1579
  <tbody>
1138
- ${_||'<tr><td colspan="5">No open items</td></tr>'}
1580
+ ${J||'<tr><td colspan="5">No open items</td></tr>'}
1139
1581
  </tbody>
1140
1582
  </table>
1141
1583
 
1142
1584
  <div class="generated">Generated ${new Date().toISOString().split("T")[0]}</div>
1143
1585
 
1144
1586
  <script>
1145
- const stats = ${JSON.stringify($)};
1146
- const trends = ${JSON.stringify(Z)};
1147
- const openItems = ${JSON.stringify(Q)};
1587
+ const stats = ${JSON.stringify(A)};
1588
+ const trends = ${JSON.stringify(_)};
1589
+ const openItems = ${JSON.stringify(Z)};
1148
1590
 
1149
1591
  const chartDefaults = {
1150
1592
  color: '#e0e0e0',
@@ -1226,32 +1668,36 @@ ${X&&X.length>0?` <div class="alerts">
1226
1668
  }
1227
1669
  </script>
1228
1670
  </body>
1229
- </html>`}function I2($){return $.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}P0();T0();async function x2($,Z){if(!$.embed)return console.log("--background requires --embed flag"),console.log(" Usage: memory sync --embed --background"),{exitCode:0};let{spawnBackgroundEmbedding:K,readLock:X,isProcessAlive:Y}=Z??await SK(),Q=X();if(Q&&Y(Q.pid))return console.log(`Embedding already in progress (PID ${Q.pid}). Use 'memory status' to check progress.`),{exitCode:0};let G=K();if(G.started)console.log(`Background embedding started (PID ${G.pid}). Use 'memory status' to check progress.`);else return console.error(`Failed to start background embedding: ${G.reason}`),{exitCode:1};return{exitCode:0}}async function SK(){let $=await Promise.resolve().then(() => (O$(),q$));return{spawnBackgroundEmbedding:$.spawnBackgroundEmbedding,readLock:$.readLock,isProcessAlive:$.isProcessAlive}}W4();async function $8(){let{EmbeddingProviderFactory:$}=await Promise.resolve().then(() => (L$(),E2));return new $}async function Z8(){let{loadConfig:$}=await Promise.resolve().then(() => (K0(),n4));return $()}async function K8($){let{EmbeddingRepository:Z}=await Promise.resolve().then(() => Q5);return new Z($)}async function X8($){let Z=new c0;try{let K=await Z.discoverSessions(),X=K;if($.project)X=X.filter((_)=>_.projectPath.decoded.includes($.project));if($.session)X=X.filter((_)=>_.id===$.session);let Y=E1(),Q=new Set(Y?.completedSessionIds??[]),G=X.filter((_)=>!Q.has(_.id));if($.json){let _={dryRun:!0,discovered:K.length,filtered:X.length,toProcess:G.length,recoveredFromCheckpoint:Y?.completedSessions??0,sessions:G.map((J)=>({id:J.id,project:J.projectPath.decoded,size:J.size,modified:J.modifiedTime.toISOString()}))};console.log(JSON.stringify(_,null,2))}else{if(console.log(`Dry run - no changes will be made
1230
- `),console.log(`Discovered: ${K.length} sessions`),console.log(`After filter: ${X.length} sessions`),Y)console.log(`Checkpoint: ${Y.completedSessions} already done`);if(console.log(`To process: ${G.length} sessions
1231
- `),G.length>0){console.log("Sessions to sync:");for(let _ of G.slice(0,20)){let J=_.projectPath.decoded.split(/[/\\]/).pop()??"unknown";console.log(` ${_.id.slice(0,16)}... ${J}`)}if(G.length>20)console.log(` ... and ${G.length-20} more`)}}return{exitCode:0}}catch(K){return P2(K,$),{exitCode:1}}}function P2($,Z){let K=g1($);if(Z.json)console.error(K1(K));else console.error(p(K,{verbose:!!Z.verbose}))}function Y8($,Z,K){let X=Date.now()-Z;if(K.json){let Y={success:$.success,aborted:$.aborted??!1,duration:X,discovered:$.sessionsDiscovered,processed:$.sessionsProcessed,skipped:$.sessionsSkipped,messages:$.messagesInserted,toolUses:$.toolUsesInserted,recoveredFromCheckpoint:$.recoveredFromCheckpoint,errors:$.errors};console.log(JSON.stringify(Y,null,2));return}if(K.quiet)return;if($.aborted)console.log(`
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
+ `),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
+ `),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(`
1232
1674
  Sync aborted (progress saved)`);else console.log(`
1233
- Sync complete in ${X}ms`);if(console.log(` Discovered: ${$.sessionsDiscovered}`),console.log(` Processed: ${$.sessionsProcessed}`),console.log(` Skipped: ${$.sessionsSkipped}`),console.log(` Messages: ${$.messagesInserted}`),console.log(` Tool uses: ${$.toolUsesInserted}`),$.recoveredFromCheckpoint)console.log(` Recovered: ${$.recoveredFromCheckpoint} from checkpoint`);if($.errors.length>0){console.log(`
1234
- Errors (${$.errors.length}):`);for(let Y of $.errors)console.log(` ${Y.sessionPath}: ${Y.error}`)}}function Q8(){let $=process.platform==="win32"?"C:\\":"/";return new e4($)}async function D2($,Z,K={}){let X=K.factory??await $8(),Y=K.config??await Z8(),Q=X.createFromConfig(Y);if(!Q){if(!Z.quiet)console.error("Embedding is disabled in configuration. Enable it in ~/.config/memory/config.json");return}let G=K.repositoryOverride??await K8($),{EmbeddingService:_}=await Promise.resolve().then(() => ($9(),j3)),{PatternRedactor:J}=await Promise.resolve().then(() => (z4(),G8)),{createEmbeddingProgressReporter:H,createModelDownloadHandler:V}=await Promise.resolve().then(() => (O9(),y3)),B=new _({repository:G,provider:Q,config:Y.embedding,redactor:new J}),z=B.checkModelState();if(z.modelChanged&&z.needsReEmbed){if(!await _8(z,Z)){await X.dispose();return}let T=G.getStoredEmbeddingDimensions(),U=Y.embedding.dimensions;if(T!==null&&T!==U){if(!Z.quiet)console.log(`Recreating embedding table for ${U}-dimensional vectors...`);G.recreateVecTable(U)}if(!Z.quiet)console.log("Clearing existing embeddings for re-embedding...")}let W=V({quiet:!!Z.quiet});await Q.initialize(W);let N=G.getTotalMessageCount()-G.getEmbeddedCount();if(N===0){if(!Z.quiet)console.log(`
1235
- All messages already embedded.`);await X.dispose();return}let q=H({quiet:!!Z.quiet});q.start(N);try{let I;if(z.modelChanged&&z.needsReEmbed)I=await B.clearAndReembed({onProgress:(T)=>q.update(T.current)});else I=await B.embedUnembedded({onProgress:(T)=>q.update(T.current)});if(q.stop(),!Z.quiet){let T=Math.max(1,Math.round(I.durationMs/1000)),U=I.rate.toFixed(1);console.log(`
1236
- Embedded ${I.embedded} messages in ${T}s (${U} msg/s)`)}}catch(I){q.stop();let T=G.getEmbeddedCount(),U=G.getTotalMessageCount();if(!Z.quiet)console.error(`
1237
- Embedding failed at ${T}/${U} messages. Run memory sync --embed to resume from where it stopped.`);throw I}finally{await X.dispose()}}async function _8($,Z){let K=$.embeddedCount??0,X=$.storedModelName??$.storedHash??"unknown",Y=$.currentModelName;if(Z.force)return!0;if(!process.stdin.isTTY||Z.quiet)return console.error(`Model changed from ${X} to ${Y}. Skipping re-embedding in non-interactive mode. Run 'memory sync --embed' interactively to re-embed.`),!1;let G=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{G.question(`Model changed from ${X} to ${Y}. Re-embed all ${K} messages? [y/N] `,(J)=>{G.close(),_(J.trim().toLowerCase()==="y")})})}j9();W4();async function J8($,Z){try{let K=new c4($),X=new $$,Q=await new v4(K,X).syncMemoryFiles();if(Q.filesIndexed>0||Q.filesSkipped>0||Q.errors.length>0)return Q;return null}catch(K){if(!Z.quiet)console.error(` Memory files: error (${A(K)})`);return null}}function H8($,Z){if(Z.json){let K={memoryFiles:{indexed:$.filesIndexed,skipped:$.filesSkipped,errors:$.errors}};console.log(JSON.stringify(K,null,2));return}if(Z.quiet)return;if(console.log(` Memory files: ${$.filesIndexed} indexed, ${$.filesSkipped} skipped`),$.errors.length>0)for(let K of $.errors)console.log(` Error: ${K.filePath}: ${K.error}`)}async function v2($,Z,K){try{let X,Y,Q,G;if(K){if(X=K.loadConfig(),!X.ambientContext.enabled)return;Y=K.resolveAutoMemoryDir(),Q=K.resolveProjectName(),G=K.createAmbientService()}else{let{loadConfig:J}=await Promise.resolve().then(() => (K0(),n4));if(X=J(),!X.ambientContext.enabled)return;let H=process.cwd(),{ProjectPath:V}=await Promise.resolve().then(() => r3),B=V.fromDecoded(H),z=B.encoded;Q=B.projectName;let{homedir:W}=await import("os"),{join:N}=await import("path");Y=N(W(),".claude","projects",z,"memory");let{SqliteProjectResolver:q}=await Promise.resolve().then(() => z5),{SqliteFactRepository:I}=await Promise.resolve().then(() => (q1(),H5)),{SqliteFrictionRepository:T}=await Promise.resolve().then(() => (u4(),_5)),{AutoMemoryWriter:U}=await Promise.resolve().then(() => (N8(),A8)),{SmartContextService:O}=await Promise.resolve().then(() => (w4(),S3)),{AmbientContextService:R}=await Promise.resolve().then(() => v3),{createContextFormatter:M}=await Promise.resolve().then(() => (B$(),yZ)),x=new q($),o=new I($),A0=new T($),N0=M("ai",!1),q0=new O({projectResolver:x,factRepo:o,frictionRepo:A0});G=new R(q0,new U,N0)}let _=await G.generateAmbientContext({projectName:Q,autoMemoryDir:Y,budget:X.ambientContext.budget});if(_.success&&!Z.quiet)console.log(` Ambient context: updated (~${_.contextTokens} tokens)`);else if(!_.success&&!Z.quiet)console.log(` Ambient context: skipped (${_.reason})`)}catch(X){if(!Z.quiet)console.error(` Ambient context: error (${A(X)})`)}}K0();z4();function lK({db:$,resolver:Z}){let K=new c0({projectNameResolver:Z}),X=new Z$,Y=new g($),Q=new G0($),G=new f0($),_=new b0($),J=new D4(K,X,Y,Q,G,_,$,new Y$,new Q$,new l0);return{fixProjectNames:(H)=>J.fixProjectNames(H),sync:(H)=>J.sync(H)}}async function nK($){await(await rK())($)}function aK($){return{handleBackgroundMode:x2,setupSignalHandlers:KZ,hasCheckpoint:s5,loadCheckpoint:E1,createProgressReporter:z9,getDefaultDbPath:P,executeDryRun:X8,handleError:P2,reportResults:Y8,createDriveResolver:Q8,initializeDatabase:S,closeDatabase:D,bulkOperationCheckpoint:m4,registerCleanup:YZ,unregisterCleanup:QZ,createSyncService:lK,loadConfig:h,createGitSyncer:iK,rebuildProjections:nK,experimentalRemoteSync:process.env.MEMORY_EXPERIMENTAL_REMOTE_SYNC==="1",runMemoryFileSync:J8,reportMemoryFileResults:H8,runAmbientContextGeneration:v2,runEmbeddingPass:D2,...$}}function b2(){return new pK("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("--json","Output results as JSON").addOption(new M8("-q, --quiet","Suppress progress output").conflicts("verbose")).addOption(new M8("-v, --verbose","Show detailed progress").conflicts("quiet")).action(async($)=>{let Z=await j8($);process.exitCode=Z.exitCode})}async function j8($,Z={}){let K=aK(Z);if($.background)return await K.handleBackgroundMode($);K.setupSignalHandlers();let X=Date.now(),Y=K.createProgressReporter($);if(!$.quiet&&K.hasCheckpoint()){let J=K.loadCheckpoint();if(J)console.log(`Resuming from previous interrupted sync (${J.completedSessions}/${J.totalSessions} sessions done)`)}let Q=K.getDefaultDbPath();if($.dryRun)return await K.executeDryRun($);let G;try{G=K.initializeDatabase({path:Q}).db}catch(J){return K.handleError(J,$),{exitCode:1}}let _=async()=>{K.closeDatabase(G)};K.registerCleanup(_);try{let J=K.createDriveResolver(),H=K.createSyncService({db:G,resolver:J});if($.fixNames){Y.log("Fixing project names...");let U=await H.fixProjectNames(J);if(!$.quiet)console.log(`Fixed project names: ${U} sessions updated`)}let V={force:$.force,projectFilter:$.project,sessionFilter:$.session,checkpointEnabled:!0,onProgress:(U)=>{if(U.phase==="discovering")Y.log("Discovering sessions...");else if(U.phase==="extracting"){if(U.current===1)Y.start(U.total);Y.update(U.current,U.sessionId)}}},B=await H.sync(V);K.bulkOperationCheckpoint(G),Y.stop(),K.reportResults(B,X,$);let z=K.loadConfig(),W=z.remoteSync?.repositoryUrl,N=z.remoteSync?.enabled===!0&&typeof W==="string"&&W.trim().length>0,q=K.experimentalRemoteSync;if(N&&q){if(!$.quiet)console.log("Synchronizing events with remote Git repository...");try{let O=await(await K.createGitSyncer()).sync(z.machineId,W,z.remoteSync.autoPull,z.remoteSync.autoPush);if(O.success){if(O.rebuildNeeded){if(!$.quiet)console.log("Remote events pulled. Rebuilding database projections...");await K.rebuildProjections(G)}else if(!$.quiet)console.log("Git events are already up to date.")}else console.error(`Warning: Remote synchronization failed: ${O.error}`)}catch(U){console.error(`Warning: Remote synchronization failed to execute: ${A(U)}`)}}else if(N&&!$.quiet)console.warn("Remote synchronization is configured but disabled until Phase 38 readiness. Set MEMORY_EXPERIMENTAL_REMOTE_SYNC=1 only for explicit prototype testing.");if($.includeMemoryFiles===!0||z.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1"){let U=await K.runMemoryFileSync(G,$);if(U)K.reportMemoryFileResults(U,$)}else if($.verbose&&!$.quiet)console.log(" Memory files: skipped (legacy opt-in disabled)");if(!$.dryRun)await K.runAmbientContextGeneration(G,$);let T=B.errors.length>0||B.aborted?1:0;if($.embed&&!$.dryRun){let U=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await K.runEmbeddingPass(G,$)}catch(O){if($.json)console.error(K1(g1(O)));else if(!$.quiet)console.error(p(g1(O),{verbose:$.verbose}));return{exitCode:1}}finally{if(U)if(K.removeBackgroundLock)K.removeBackgroundLock();else{let{removeLock:O}=await Promise.resolve().then(() => (O$(),q$));O()}}}return{exitCode:T}}catch(J){return Y.stop(),K.handleError(J,$),{exitCode:1}}finally{K.unregisterCleanup(_),K.closeDatabase(G)}}async function iK(){let{GitSyncer:$}=await Promise.resolve().then(() => (C2(),L8));return new $}async function rK(){let{rebuildProjections:$}=await Promise.resolve().then(() => (w2(),F8));return $}L4();c2();l2();S$();C$();x$();H0();import{Command as wX}from"commander";u0();import kX from"@inquirer/search";import SX from"@inquirer/select";import vX from"fuzzy";var l8=null,CX=null,yX=null;function n8(){if(l8!==null)return l8;return process.stdout.isTTY===!0}function a8(){return n8()}async function i8($){if(!n8())throw Error("Interactive picker requires TTY. Use --session <id> instead.");let{sessionRepo:Z,limit:K=100}=$,Y=(await Z.findFiltered({limit:K})).map((V)=>({value:V.id,name:`${V.projectPath.projectName} (${z0(V.startTime)})`,description:`${V.id.substring(0,8)}... | ${V.messages.length} messages`})),_=await(CX??kX)({message:"Search sessions (type to filter):",source:async(V,{signal:B})=>{if(B.aborted)return[];if(!V)return Y;return vX.filter(V,Y,{extract:(W)=>`${W.name} ${W.description}`}).map((W)=>W.original)},pageSize:10}),H=await(yX??SX)({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(H==="cancel")return null;return{sessionId:_,action:H}}M0();x$();L4();S$();C$();c();D0();function bX($){return{dbPath:P(),show:N4,search:I4,context:O4,related:U4,...$}}function i2(){return new wX("browse").description("Interactive session browser").option("-l, --limit <count>","Maximum sessions to show","100").action(async($)=>{let Z=await r8($);process.exitCode=Z.exitCode})}async function r8($,Z={}){if(!a8())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 K=bX(Z),X={limit:"100",...$},Y=parseInt(X.limit,10),Q=K.dbPath,{db:G}=S({path:Q});try{let _=new g(G),J=await i8({sessionRepo:_,limit:Y});if(!J)return D(G),{exitCode:0};switch(D(G),J.action){case"show":await K.show(J.sessionId,{});break;case"search":await K.search("*",{session:J.sessionId});break;case"context":{let{db:H}=S({path:Q}),B=await new g(H).findById(J.sessionId);if(D(H),B)await K.context(B.projectPath.projectName,{});break}case"related":await K.related(J.sessionId,{});break}return{exitCode:0}}catch(_){let J=_ instanceof j?_:new j(F.DB_CONNECTION_FAILED,A(_));console.error(p(J));try{D(G)}catch{}return{exitCode:1}}}Y1();K0();C2();import{Command as fX}from"commander";function r2($={}){let Z=new fX("remote").description("Manage multi-device Git transport synchronization configuration");return Z.command("set <repositoryUrl>").description("Set remote Git repository URL and initialize events log transport repository").action(async(K)=>{let X=await o8(K,$);process.exitCode=X.exitCode}),Z.command("remove").description("Remove remote Git synchronization URL and disable remote sync").action(async()=>{let K=await t8($);process.exitCode=K.exitCode}),Z.command("status").description("View remote Git synchronization status").action(async()=>{let K=await s8($);process.exitCode=K.exitCode}),Z}async function o8($,Z={}){try{let K=Z.loadConfig??h,X=Z.saveConfig??L0,Y=Z.createGitSyncer??((H)=>new k1(H)),Q=K(Z.configPathOverride),G=Y(Z.eventsDirOverride);if(!await G.isGitRepo()){if(console.log("Initializing local Git repository in events directory..."),!await G.initRepo())return console.error("Error: Failed to initialize Git repository locally."),{exitCode:1}}if(console.log(`Configuring remote origin repository URL: ${$}`),!await G.configureRemote($))return console.error("Error: Failed to configure Git remote repository origin."),{exitCode:1};return X({remoteSync:{enabled:!0,repositoryUrl:$,autoPush:Q.remoteSync?.autoPush??!0,autoPull:Q.remoteSync?.autoPull??!0}},Z.configPathOverride),console.log(`
1238
- Success: Remote synchronization configured successfully!`),console.log("To synchronize your local facts with the remote repository, run: memory sync"),{exitCode:0}}catch(K){return console.error("Error setting remote:",A(K)),{exitCode:1}}}async function t8($={}){try{let Z=$.loadConfig??h,K=$.saveConfig??L0,X=$.createGitSyncer??((_)=>new k1(_)),Y=Z($.configPathOverride);K({remoteSync:{enabled:!1,autoPush:Y.remoteSync?.autoPush??!0,autoPull:Y.remoteSync?.autoPull??!0}},$.configPathOverride);let Q=X($.eventsDirOverride);if(await Q.isGitRepo())console.log("Removing Git remote origin URL..."),await Q.removeRemote();return console.log(`
1239
- Success: Remote synchronization disabled and origin repository URL removed.`),{exitCode:0}}catch(Z){return console.error("Error removing remote:",A(Z)),{exitCode:1}}}async function s8($={}){try{let Z=$.loadConfig??h,K=$.createGitSyncer??((_)=>new k1(_)),X=Z($.configPathOverride),Y=X.remoteSync;console.log("Remote Sync Status"),console.log("=================="),console.log(`Machine ID: ${X.machineId}`),console.log(`Enabled: ${Y?.enabled?"yes":"no"}`),console.log(`Repository URL: ${Y?.repositoryUrl??"none configured"}`),console.log(`Auto-Pull: ${Y?.autoPull?"enabled":"disabled"}`),console.log(`Auto-Push: ${Y?.autoPush?"enabled":"disabled"}`);let Q=K($.eventsDirOverride),G=await Q.isGitRepo();if(console.log(`Git Repository: ${G?"initialized":"not initialized"}`),G){let _=await Q.getRemoteUrl();console.log(`Actual Git Remote: ${_??"none"}`)}return{exitCode:0}}catch(Z){return console.error("Error gathering remote status:",A(Z)),{exitCode:1}}}F1();import{Command as hX}from"commander";import{copyFileSync as gX,existsSync as e8,mkdirSync as mX}from"fs";import{dirname as cX,join as o2}from"path";function t2(){return new hX("install").description("Install Claude Code hooks for automatic session sync").option("-f, --force","Reinstall even if already installed").action(async($)=>{let Z=await $6($);process.exitCode=Z.exitCode})}async function $6($,Z={}){let K=F0(Z.hookOverrides);if(K.sessionEnd&&K.preCompact&&!$.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let X=a0(Z.hookOverrides);mX(cX(X),{recursive:!0});let Y=dX(Z.hookScriptSourceOverride);if(!Y)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};gX(Y,X),console.log(`Copied hook script to ${X}`);let Q=i0(Z.hookOverrides);if(console.log(Q.message),Q.success)console.log(`
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 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
+ All embeddable messages already embedded (${N} skipped for current model).`);else console.log(`
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
+ 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 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
+ 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: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(`
1240
1684
  Hook installation complete!`),console.log("Sessions will now sync automatically when they end."),console.log(`
1241
- To check status: memory status`),console.log("To uninstall: memory uninstall"),uX(Z.hookOverrides);else return{exitCode:1};return{exitCode:0}}function uX($){let Z=W1($);if(!Z.hooks)return;let K="memory-nexus",X=!1;for(let Y of Object.values(Z.hooks)){if(!Array.isArray(Y))continue;for(let Q of Y){if(!Q?.hooks)continue;for(let G of Q.hooks)if(G.command?.includes(K)){X=!0;break}if(X)break}if(X)break}if(X)console.error(`
1242
- Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function dX($){if($!==void 0)return e8($)?$:null;let Z=o2(import.meta.dir,"../../../../dist/sync-hook.js"),K=o2(process.cwd(),"dist/sync-hook.js"),X=o2(process.cwd(),"dist","sync-hook.js");return[Z,K,X].find((Q)=>e8(Q))??null}F1();import{Command as pX}from"commander";import{existsSync as lX,unlinkSync as nX}from"fs";function s2(){return new pX("uninstall").description("Remove Claude Code hooks for automatic session sync").option("-r, --restore","Restore settings.json from backup").action(async($)=>{let Z=await Z6($);process.exitCode=Z.exitCode})}async function Z6($,Z={}){let K=F0(Z.hookOverrides);if(!K.sessionEnd&&!K.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if($.restore&&K.backupExists){if(d$(Z.hookOverrides))console.log("Restored settings.json from backup.")}else{let Y=r0(Z.hookOverrides);console.log(Y.message)}let X=a0(Z.hookOverrides);if(lX(X))nX(X),console.log("Removed hook script.");return console.log(`
1243
- Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}y1();import{Command as aX}from"commander";y1();l();c();h4();M0();c();l();M$();import{existsSync as e2,readFileSync as iX,unlinkSync as rX}from"fs";import{join as oX}from"path";function tX($){let Z=0;if(!$.database.exists)Z++;if($.database.exists&&!$.database.readable)Z++;if($.database.exists&&!$.database.writable)Z++;if($.database.integrity==="corrupted")Z++;if(!$.permissions.configDir)Z++;if(!$.permissions.logsDir)Z++;if(!$.permissions.sourceDir)Z++;if(Z+=$.config.issues.length,$.llmExtraction&&!$.llmExtraction.ready)Z++;return Z}function $3(){return new aX("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($)=>{let Z=await K6($);process.exitCode=Z.exitCode})}async function K6($,Z={}){if($.portability)return eX($,Z);if($.json){let X=await(Z.gatherStatus??(await Promise.resolve().then(() => (y1(),u2))).gatherStatus)({dbPath:Z.healthOverrides?.dbPath,logPath:Z.healthOverrides?.logsDir?b$(Z.healthOverrides.logsDir,"sync.log"):void 0,configPath:Z.healthOverrides?.configDir?b$(Z.healthOverrides.configDir,"config.json"):void 0,hookOverrides:Z.healthOverrides?.hookOverrides,fix:$.fix,stats:!1}),Y={database:X.health.database,permissions:X.health.permissions,hooks:{...X.health.hooks,lastRun:X.health.hooks.lastRun?.toISOString()??null},config:X.health.config,embedding:X.health.embedding,sqliteVec:X.health.sqliteVec,searchCapability:X.health.searchCapability,llmExtraction:X.health.llmExtraction,migration:X.migration,qmd:X.qmd};console.log(JSON.stringify(Y,null,2));let Q=0;if(!X.health.database.exists||X.health.database.integrity==="corrupted")Q=2;else if(tX(X.health)>0||!X.health.searchCapability.vectorReady)Q=1;return{exitCode:Q}}return Q1({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:$.fix,json:$.json},{dbPath:Z.healthOverrides?.dbPath,logPath:Z.healthOverrides?.logsDir?b$(Z.healthOverrides.logsDir,"sync.log"):void 0,configPath:Z.healthOverrides?.configDir?b$(Z.healthOverrides.configDir,"config.json"):void 0,hookOverrides:Z.healthOverrides?.hookOverrides})}function sX($,Z=process.platform){if(Z==="win32")return $.includes("/")&&($.startsWith("/home")||$.startsWith("/mnt")||$.startsWith("/var")||$.startsWith("/usr")||$.startsWith("/"));return $.includes("\\")||/^[a-zA-Z]:/.test($)}async function eX($,Z={}){let K=e2,X=Z.healthOverrides?.dbPath??P(),Y=Z.healthOverrides?.sourceDir??a(),Q=$.json?!1:v(),G,_=[],J=[],H=[];if(!e2(X)){if($.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(m("Error: Database does not exist. Run 'memory sync' first.",Q));return{exitCode:1}}try{G=S({path:X}).db;let R=await new g(G).findFiltered({limit:1e5});for(let M of R){let x=M.projectPath.decoded;if(sX(x)&&!_.includes(x))_.push(x);let o=w0.resolveExistingPath(x,K);if(!K(o)){if(!J.includes(x))J.push(x)}}}catch(U){let O=A(U);if($.json)console.log(JSON.stringify({error:`Portability scan failed: ${O}`},null,2));else console.error(m(`Portability scan failed: ${O}`,Q));return{exitCode:2}}finally{if(G)D(G)}let V=oX(Y,"embedding.lock"),B=!1,z=!1;if(e2(V)){B=!0;try{let U=iX(V,"utf-8"),O=JSON.parse(U);if(O.pid)process.kill(O.pid,0);else z=!0}catch(U){z=!0}}if(B&&z){if(H.push(V),$.fix)try{rX(V)}catch(U){}}let N=await(Z.gatherStatus??(await Promise.resolve().then(() => (y1(),u2))).gatherStatus)({dbPath:X,fix:!1,stats:!1}),q=N.health.sqliteVec.available,I=N.health.sqliteVec.version;if($.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:_,orphanedPaths:J,staleLocks:H,sqliteVecAvailable:q,sqliteVecVersion:I,fixedStaleLocks:$.fix&&H.length>0}},null,2)),{exitCode:J.length>0||_.length>0||H.length>0&&!$.fix||!q?1:0};if(console.log("Portability & Migration Diagnostics"),console.log("=================================="),console.log(""),_.length===0)console.log(` ${w("[OK]",Q)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${u("[WARN]",Q)} Path Dialects: ${_.length} mixed slash/drive formats detected.`);for(let U of _)console.log(` - ${U}`)}if(J.length===0)console.log(` ${w("[OK]",Q)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${u("[WARN]",Q)} Orphaned Workspaces: ${J.length} project folder(s) not found on active filesystem.`);for(let U of J)console.log(` - ${U}`)}if(H.length===0)console.log(` ${w("[OK]",Q)} Active Locks: No stale sync/embedding lock files detected.`);else if($.fix)console.log(` ${w("[FIXED]",Q)} Active Locks: Cleaned up ${H.length} stale lock file(s).`);else{console.log(` ${u("[WARN]",Q)} Active Locks: ${H.length} stale sync/embedding lock file(s) found.`);for(let U of H)console.log(` - ${U}`)}if(q)console.log(` ${w("[OK]",Q)} sqlite-vec: Loadable (v${I}) for active architecture.`);else console.log(` ${m("[FAIL]",Q)} sqlite-vec: Not loadable on this system architecture.`);if(console.log(""),J.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:J.length>0||_.length>0||H.length>0&&!$.fix||!q?1:0}}function b$(...$){if($.some((Z)=>Z===void 0))return;return $.join("/")}M0();c();h4();import{Command as $Y,Option as ZY}from"commander";import*as X6 from"readline";import{existsSync as KY}from"fs";function Z3($){let Z=$.match(/^(\d+)([dmy])$/i);if(!Z)throw Error(`Invalid duration format: "${$}". Use format like "30d" (days), "6m" (months), or "1y" (years).`);let K=parseInt(Z[1],10),X=Z[2].toLowerCase();if(K<=0)throw Error("Duration value must be a positive number.");let Y=new Date,Q;switch(X){case"d":Q=new Date(Y.getTime()-K*24*60*60*1000);break;case"m":Q=new Date(Y.getFullYear(),Y.getMonth()-K,Y.getDate());break;case"y":Q=new Date(Y.getFullYear()-K,Y.getMonth(),Y.getDate());break;default:throw Error(`Unknown duration unit: "${X}"`)}return Q}function T4($){return $.toISOString().split("T")[0]}async function XY($){let Z=X6.createInterface({input:process.stdin,output:process.stdout});return new Promise((K)=>{Z.question($,(X)=>{Z.close(),K(X.toLowerCase()==="y"||X.toLowerCase()==="yes")})})}function K3(){return new $Y("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 ZY("-q, --quiet","Minimal output").conflicts("json")).action(async($)=>{let Z=await Y6($);process.exitCode=Z.exitCode})}async function Y6($,Z={}){let K=Z.askConfirmation??XY,X=Z.existsSync??KY,Y=Z.getDefaultDbPath??P,Q=Z.initializeDatabase??S,G=Z.closeDatabase??D,_=Z.createSessionRepository??((B)=>new g(B));if(!$.olderThan&&!$.orphans){if($.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 J;if($.olderThan)try{J=Z3($.olderThan)}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:z},null,2));else console.error(`Error: ${z}`);return{exitCode:1}}let H=Z.dbPath??Y(),V;try{V=Q({path:H}).db}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:`Database error: ${z}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let B=_(V),z=new Map;if(J){let q=await B.findOlderThan(J);for(let I of q)z.set(I.id,I)}if($.orphans){let q=await B.findFiltered({limit:1e5});for(let I of q){let T=I.projectPath.decoded,U=w0.resolveExistingPath(T,X);if(!X(U))z.set(I.id,I)}}let W=z.size;if(W===0){if($.json)console.log(JSON.stringify({sessionsDeleted:0,cutoffDate:J?.toISOString()??null,dryRun:$.dryRun??!1,message:J&&!$.orphans?`No sessions older than ${T4(J)}`:"No sessions matched the purge criteria."},null,2));else if(!$.quiet)if(J&&!$.orphans)console.log(`No sessions older than ${T4(J)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if($.dryRun){let q=Array.from(z.values());if($.json)console.log(JSON.stringify({sessionsToDelete:W,cutoffDate:J?.toISOString()??null,dryRun:!0,sessions:q.map((I)=>({id:I.id,project:I.projectPath.projectName,startTime:I.startTime.toISOString(),messageCount:I.messageCount}))},null,2));else if($.quiet)console.log(W.toString());else{if(J&&!$.orphans)console.log(`Would delete ${W} session(s) older than ${T4(J)}:
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(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
+ `);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();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)}:
1244
1690
  `);else console.log(`Would delete ${W} session(s):
1245
- `);let I=v();for(let T of q){let U=T.id.substring(0,16),O=T.projectPath.projectName,R=T.startTime.toISOString().split("T")[0],M=T.messageCount;if(I)console.log(` \x1B[33m${U}\x1B[0m ${O} ${R} (${M} messages)`);else console.log(` ${U} ${O} ${R} (${M} messages)`)}}return{exitCode:0}}if(!$.force){if(!await K(J&&!$.orphans?`Delete ${W} session(s) older than ${T4(J)}? This cannot be undone. (y/n) `:`Delete ${W} session(s)? This cannot be undone. (y/n) `)){if($.json)console.log(JSON.stringify({cancelled:!0},null,2));else if(!$.quiet)console.log("Purge cancelled.");return{exitCode:0}}}if(V.transaction(()=>{for(let q of z.keys())B.delete(q)}).immediate(),$.json)console.log(JSON.stringify({sessionsDeleted:W,cutoffDate:J?.toISOString()??null,dryRun:!1},null,2));else if($.quiet)console.log(W.toString());else if(J&&!$.orphans)console.log(`Deleted ${W} session(s) older than ${T4(J)}.`);else console.log(`Deleted ${W} session(s).`);return{exitCode:0}}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:z},null,2));else console.error(`Error: ${z}`);return{exitCode:2}}finally{if(V)G(V)}}c();l();F1();import{Command as YY}from"commander";import{existsSync as Q6,unlinkSync as QY}from"fs";import{join as GY}from"path";function X3(){return new YY("migrate").description("Migrate database across platform environments").option("--from-windows","Migrate database from native Windows/desktop host").action(async($)=>{let Z=await G6($);process.exitCode=Z.exitCode})}async function G6($,Z={}){let K=v(),X=Z.dbPath??P(),Y=Z.dataDir??a(),Q=Z.uninstallHooks??r0,G=Z.installHooks??i0;if(!Q6(X))return console.error(m(`Error: Database not found at ${X}. Run 'memory sync' first.`,K)),{exitCode:1};let _;try{_=S({path:X}).db;let V=_.prepare("PRAGMA integrity_check").get();if(!V||V.integrity_check!=="ok"){let B=V?.integrity_check??"unknown";throw Error(`Database integrity check failed: ${B}`)}_.prepare("PRAGMA wal_checkpoint(TRUNCATE)").run()}catch(H){let V=A(H);if(console.error(m(`Error during migration: ${V}`,K)),_)D(_);return{exitCode:2}}let J=GY(Y,"embedding.lock");if(Q6(J))try{QY(J),console.log(w("Cleaned up stale embedding lock file.",K))}catch(H){}try{Q(),G(),console.log(w("Successfully re-installed Git hooks natively.",K))}catch(H){let V=A(H);console.log(u(`Warning: Failed to re-install Git hooks: ${V}`,K))}try{let V=await new h0(_).getStats();if(console.log(""),console.log(w("Database migration successful!",K)),console.log("================================="),console.log(`Total sessions: ${V.totalSessions}`),console.log(`Total messages: ${V.totalMessages}`),console.log(""),console.log("Project Breakdown:"),V.projectBreakdown.length===0)console.log(" No projects found.");else for(let B of V.projectBreakdown)console.log(` - ${B.projectName}: ${B.sessionCount} sessions, ${B.messageCount} messages`);console.log("")}catch(H){}finally{D(_)}return{exitCode:0}}c();import{Command as _Y,Option as Y3}from"commander";z4();import{existsSync as _6}from"fs";import{dirname as JY}from"path";function Q3(){return new _Y("export").description("Export database to JSON file for backup").argument("<output-file>","Path to write the JSON backup file").addOption(new Y3("-q, --quiet","Suppress output except the file path").conflicts("json")).addOption(new Y3("--json","Output stats as JSON").conflicts("quiet")).addOption(new Y3("--include-sensitive","Export raw sensitive values without redaction")).action(async($,Z)=>{let K=await J6($,Z);process.exitCode=K.exitCode})}async function J6($,Z={}){let K=JY($);if(K!=="."&&!_6(K))return console.error(`Error: Directory does not exist: ${K}`),{exitCode:1};let X=P();if(!_6(X))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:Y}=S({path:X});try{let Q=await Z9(Y,$,{includeSensitive:Z.includeSensitive,redactor:new l0});if(Z.json)console.log(JSON.stringify({success:!0,path:$,stats:Q},null,2));else if(Z.quiet)console.log($);else console.log(HY(Q,$));return{exitCode:0}}catch(Q){let G=A(Q);if(Z.json)console.log(JSON.stringify({success:!1,error:G},null,2));else console.error(`Error: ${G}`);return{exitCode:1}}finally{D(Y)}}function HY($,Z){let K=[];return K.push(`Exported ${$.sessions} sessions, ${$.messages} messages to ${Z}`),K.push(""),K.push("Details:"),K.push(` Sessions: ${$.sessions}`),K.push(` Messages: ${$.messages}`),K.push(` Tool uses: ${$.toolUses}`),K.push(` Entities: ${$.entities}`),K.push(` Links: ${$.links}`),K.push(` File size: ${VY($.bytes)}`),K.join(`
1246
- `)}function VY($){if($===0)return"0 B";let Z=["B","KB","MB","GB"],K=1024,X=Math.floor(Math.log($)/Math.log(K));return`${($/Math.pow(K,X)).toFixed(X>0?1:0)} ${Z[X]}`}c();import{Command as WY,Option as H6}from"commander";import{existsSync as BY}from"fs";function G3(){return new WY("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 H6("-q, --quiet","Suppress output except errors").conflicts("json")).addOption(new H6("--json","Output stats as JSON").conflicts("quiet")).action(async($,Z)=>{let K=await V6($,Z);process.exitCode=K.exitCode})}async function V6($,Z={}){if(!BY($))return R4("File does not exist",$,Z),{exitCode:1};let K=await k4($);if(!K.valid)return R4(`Invalid backup file: ${K.error}`,$,Z),{exitCode:1};let X=P(),{db:Y}=S({path:X});try{if(X9(Y)&&!Z.clear&&!Z.force){if(!Z.json&&!Z.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 R4("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",$,Z),{exitCode:1};return R4("Use --clear to replace data or --force to merge",$,Z),{exitCode:1}}let G=await K9(Y,$,{clearExisting:Z.clear});if(Z.json){let _={success:!0,path:$,version:K.version,stats:G,cleared:Z.clear??!1};console.log(JSON.stringify(_,null,2))}else if(Z.quiet);else console.log(zY(G,$,Z.clear??!1));return{exitCode:0}}catch(Q){let G=A(Q);return R4(G,$,Z),{exitCode:1}}finally{D(Y)}}function R4($,Z,K){if(K.json)console.log(JSON.stringify({success:!1,path:Z,error:$},null,2));else console.error(`Error: ${$}`)}function zY($,Z,K){let X=[],Y=K?"Replaced":"Imported";return X.push(`${Y} ${$.sessions} sessions, ${$.messages} messages from ${Z}`),X.push(""),X.push("Details:"),X.push(` Sessions: ${$.sessions}`),X.push(` Messages: ${$.messages}`),X.push(` Tool uses: ${$.toolUses}`),X.push(` Entities: ${$.entities}`),X.push(` Links: ${$.links}`),X.join(`
1247
- `)}import{Command as AY}from"commander";function NY($){return $==="bash"||$==="zsh"||$==="fish"}function qY(){return`# memory bash completion
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
+ `)}import{Command as HV}from"commander";function QV(A){return A==="bash"||A==="zsh"||A==="fish"}function XV(){return`# memory bash completion
1248
1694
  # Add to ~/.bashrc: eval "$(memory completion bash)"
1249
1695
 
1250
1696
  _memory_completion() {
1251
1697
  local cur prev words cword
1252
1698
  _init_completion || return
1253
1699
 
1254
- local commands="sync search list stats context related show browse install uninstall status doctor purge export import completion"
1700
+ local commands="sync search list stats context related show browse governance profile remote install uninstall status doctor audit-secrets purge export import completion"
1255
1701
  local search_opts="--limit --project --role --session --after --before --case-sensitive --json --verbose --quiet"
1256
1702
  local list_opts="--limit --project --after --before --sort --json --verbose --quiet"
1257
1703
  local stats_opts="--projects --json --verbose --quiet"
@@ -1259,10 +1705,14 @@ _memory_completion() {
1259
1705
  local related_opts="--limit --depth --json --verbose --quiet"
1260
1706
  local show_opts="--json --verbose --quiet"
1261
1707
  local browse_opts="--project"
1262
- local sync_opts="--force --dry-run --verbose --quiet"
1708
+ local governance_opts="--surface --project --status --limit --reason --at --scope --json"
1709
+ local profile_opts="show export rebuild --kind --limit --all --json"
1710
+ local sync_opts="--force --dry-run --remote --verbose --quiet"
1711
+ local remote_opts="set remove status preflight doctor backup restore rollback --json --allow-local-path --no-auto-pull --no-auto-push --confirm"
1263
1712
  local install_opts="--force"
1264
1713
  local uninstall_opts="--restore"
1265
1714
  local doctor_opts="--json --fix"
1715
+ local audit_secrets_opts="--json --db --skip-db --event-log --events-dir --skip-events --redact-db --quarantine-events --quarantine-dir --report"
1266
1716
  local purge_opts="--before --dry-run --force --json --verbose --quiet"
1267
1717
  local export_opts="--json --verbose --quiet --include-sensitive"
1268
1718
  local import_opts="--force --dry-run --json --verbose --quiet"
@@ -1301,10 +1751,22 @@ _memory_completion() {
1301
1751
  COMPREPLY=( $(compgen -W "\${browse_opts}" -- "\${cur}") )
1302
1752
  return 0
1303
1753
  ;;
1754
+ governance)
1755
+ COMPREPLY=( $(compgen -W "list show suppress unsuppress invalidate expire review consent-grant consent-revoke \${governance_opts}" -- "\${cur}") )
1756
+ return 0
1757
+ ;;
1758
+ profile)
1759
+ COMPREPLY=( $(compgen -W "\${profile_opts}" -- "\${cur}") )
1760
+ return 0
1761
+ ;;
1304
1762
  sync)
1305
1763
  COMPREPLY=( $(compgen -W "\${sync_opts}" -- "\${cur}") )
1306
1764
  return 0
1307
1765
  ;;
1766
+ remote)
1767
+ COMPREPLY=( $(compgen -W "\${remote_opts}" -- "\${cur}") )
1768
+ return 0
1769
+ ;;
1308
1770
  install)
1309
1771
  COMPREPLY=( $(compgen -W "\${install_opts}" -- "\${cur}") )
1310
1772
  return 0
@@ -1317,6 +1779,10 @@ _memory_completion() {
1317
1779
  COMPREPLY=( $(compgen -W "\${doctor_opts}" -- "\${cur}") )
1318
1780
  return 0
1319
1781
  ;;
1782
+ audit-secrets)
1783
+ COMPREPLY=( $(compgen -W "\${audit_secrets_opts}" -- "\${cur}") )
1784
+ return 0
1785
+ ;;
1320
1786
  purge)
1321
1787
  COMPREPLY=( $(compgen -W "\${purge_opts}" -- "\${cur}") )
1322
1788
  return 0
@@ -1352,10 +1818,14 @@ _memory_completion() {
1352
1818
  related) COMPREPLY=( $(compgen -W "\${related_opts}" -- "\${cur}") ) ;;
1353
1819
  show) COMPREPLY=( $(compgen -W "\${show_opts}" -- "\${cur}") ) ;;
1354
1820
  browse) COMPREPLY=( $(compgen -W "\${browse_opts}" -- "\${cur}") ) ;;
1821
+ governance) COMPREPLY=( $(compgen -W "list show suppress unsuppress invalidate expire review consent-grant consent-revoke \${governance_opts}" -- "\${cur}") ) ;;
1822
+ profile) COMPREPLY=( $(compgen -W "\${profile_opts}" -- "\${cur}") ) ;;
1355
1823
  sync) COMPREPLY=( $(compgen -W "\${sync_opts}" -- "\${cur}") ) ;;
1824
+ remote) COMPREPLY=( $(compgen -W "\${remote_opts}" -- "\${cur}") ) ;;
1356
1825
  install) COMPREPLY=( $(compgen -W "\${install_opts}" -- "\${cur}") ) ;;
1357
1826
  uninstall) COMPREPLY=( $(compgen -W "\${uninstall_opts}" -- "\${cur}") ) ;;
1358
1827
  doctor) COMPREPLY=( $(compgen -W "\${doctor_opts}" -- "\${cur}") ) ;;
1828
+ audit-secrets) COMPREPLY=( $(compgen -W "\${audit_secrets_opts}" -- "\${cur}") ) ;;
1359
1829
  purge) COMPREPLY=( $(compgen -W "\${purge_opts}" -- "\${cur}") ) ;;
1360
1830
  export) COMPREPLY=( $(compgen -W "\${export_opts}" -- "\${cur}") ) ;;
1361
1831
  import) COMPREPLY=( $(compgen -W "\${import_opts}" -- "\${cur}") ) ;;
@@ -1367,7 +1837,7 @@ _memory_completion() {
1367
1837
  }
1368
1838
 
1369
1839
  complete -F _memory_completion memory
1370
- `}function OY(){return`#compdef memory
1840
+ `}function VV(){return`#compdef memory
1371
1841
  # memory zsh completion
1372
1842
  # Add to ~/.zshrc: eval "$(memory completion zsh)"
1373
1843
 
@@ -1382,18 +1852,22 @@ _memory() {
1382
1852
  'related:Find sessions related to a given session'
1383
1853
  'show:Show session details and conversation'
1384
1854
  'browse:Browse and select sessions interactively'
1855
+ 'governance:Inspect and control derived memory consent/provenance state'
1856
+ 'profile:Inspect and rebuild governed persona/procedural memory'
1857
+ 'remote:Manage remote event-log synchronization'
1385
1858
  'install:Install automatic sync hook'
1386
1859
  'uninstall:Remove automatic sync hook'
1387
1860
  'status:Show hook installation status'
1388
1861
  'doctor:Check system health and diagnose issues'
1862
+ 'audit-secrets:Scan database and event logs for likely leaked secrets'
1389
1863
  'purge:Remove old sessions from database'
1390
1864
  'export:Export database to JSON file'
1391
1865
  'import:Import database from JSON file'
1392
1866
  'completion:Generate shell completion script'
1393
1867
  )
1394
1868
 
1395
- local -a search_opts list_opts stats_opts context_opts related_opts show_opts browse_opts
1396
- local -a sync_opts install_opts uninstall_opts doctor_opts purge_opts export_opts import_opts completion_shells
1869
+ local -a search_opts list_opts stats_opts context_opts related_opts show_opts browse_opts governance_opts profile_opts
1870
+ local -a sync_opts remote_opts install_opts uninstall_opts doctor_opts audit_secrets_opts purge_opts export_opts import_opts completion_shells
1397
1871
 
1398
1872
  search_opts=(
1399
1873
  '--limit[Maximum number of results]:number'
@@ -1451,13 +1925,42 @@ _memory() {
1451
1925
  '--project[Filter by project name]:project'
1452
1926
  )
1453
1927
 
1928
+ governance_opts=(
1929
+ '--surface[Governance surface]:surface:(fact context provider_egress remote_sync friction evaluation persona graph ranking dream projection)'
1930
+ '--project[Filter by project name]:project'
1931
+ '--status[Governance status]:status:(active pending_review suppressed invalidated expired)'
1932
+ '--limit[Maximum number of entries]:number'
1933
+ '--reason[Reason for the control event]:reason'
1934
+ '--at[Expiry timestamp]:iso-date'
1935
+ '--scope[Consent scope]:scope'
1936
+ '--json[Output as JSON]'
1937
+ )
1938
+
1939
+ profile_opts=(
1940
+ '1:action:(show export rebuild)'
1941
+ '--kind[Persona entry kind]:kind:(preference procedure correction decision_pattern friction_pattern)'
1942
+ '--limit[Maximum number of entries]:number'
1943
+ '--all[Use every project scope where supported]'
1944
+ '--json[Output as JSON]'
1945
+ )
1946
+
1454
1947
  sync_opts=(
1455
1948
  '--force[Force re-sync all sessions]'
1456
1949
  '--dry-run[Preview changes without syncing]'
1950
+ '--remote[Synchronize canonical event logs with configured remote]'
1457
1951
  '--verbose[Show detailed output]'
1458
1952
  '--quiet[Minimal output]'
1459
1953
  )
1460
1954
 
1955
+ remote_opts=(
1956
+ '1:action:(set remove status preflight doctor backup restore rollback)'
1957
+ '--json[Output stable JSON]'
1958
+ '--allow-local-path[Allow local path remotes]'
1959
+ '--no-auto-pull[Disable automatic remote pull]'
1960
+ '--no-auto-push[Disable automatic remote push]'
1961
+ '--confirm[Confirm restore or rollback mutation]'
1962
+ )
1963
+
1461
1964
  install_opts=(
1462
1965
  '--force[Overwrite existing hook]'
1463
1966
  )
@@ -1471,6 +1974,19 @@ _memory() {
1471
1974
  '--fix[Attempt to fix common issues]'
1472
1975
  )
1473
1976
 
1977
+ audit_secrets_opts=(
1978
+ '--json[Output as JSON]'
1979
+ '--db[Database path override]:path:_files'
1980
+ '--skip-db[Skip database scanning]'
1981
+ '--event-log[Specific event log path]:path:_files'
1982
+ '--events-dir[Events directory to scan]:directory:_files -/'
1983
+ '--skip-events[Skip event-log scanning]'
1984
+ '--redact-db[Rewrite mutable database fields with redacted values]'
1985
+ '--quarantine-events[Quarantine raw event logs and write sanitized active copies]'
1986
+ '--quarantine-dir[Quarantine directory]:directory:_files -/'
1987
+ '--report[Write a redacted evidence report]:path:_files'
1988
+ )
1989
+
1474
1990
  purge_opts=(
1475
1991
  '--before[Delete sessions before date]:date'
1476
1992
  '--dry-run[Preview deletions without removing]'
@@ -1514,10 +2030,14 @@ _memory() {
1514
2030
  related) _arguments "$related_opts[@]" ':session:' ;;
1515
2031
  show) _arguments "$show_opts[@]" ':session:' ;;
1516
2032
  browse) _arguments "$browse_opts[@]" ;;
2033
+ governance) _arguments '1:action:(list show suppress unsuppress invalidate expire review consent-grant consent-revoke)' "$governance_opts[@]" ':target:' ;;
2034
+ profile) _arguments "$profile_opts[@]" ':project:' ;;
1517
2035
  sync) _arguments "$sync_opts[@]" ;;
2036
+ remote) _arguments "$remote_opts[@]" ':repository-url:' ;;
1518
2037
  install) _arguments "$install_opts[@]" ;;
1519
2038
  uninstall) _arguments "$uninstall_opts[@]" ;;
1520
2039
  doctor) _arguments "$doctor_opts[@]" ;;
2040
+ audit-secrets) _arguments "$audit_secrets_opts[@]" ;;
1521
2041
  purge) _arguments "$purge_opts[@]" ;;
1522
2042
  export) _arguments "$export_opts[@]" ':output-file:_files' ;;
1523
2043
  import) _arguments "$import_opts[@]" ':input-file:_files' ;;
@@ -1528,7 +2048,7 @@ _memory() {
1528
2048
  }
1529
2049
 
1530
2050
  _memory "$@"
1531
- `}function UY(){return`# memory fish completion
2051
+ `}function BV(){return`# memory fish completion
1532
2052
  # Save to ~/.config/fish/completions/memory.fish:
1533
2053
  # memory completion fish > ~/.config/fish/completions/memory.fish
1534
2054
 
@@ -1544,10 +2064,14 @@ complete -c memory -n "__fish_use_subcommand" -a context -d "Get context for a p
1544
2064
  complete -c memory -n "__fish_use_subcommand" -a related -d "Find sessions related to a given session"
1545
2065
  complete -c memory -n "__fish_use_subcommand" -a show -d "Show session details and conversation"
1546
2066
  complete -c memory -n "__fish_use_subcommand" -a browse -d "Browse and select sessions interactively"
2067
+ complete -c memory -n "__fish_use_subcommand" -a governance -d "Inspect and control derived memory consent/provenance state"
2068
+ complete -c memory -n "__fish_use_subcommand" -a profile -d "Inspect and rebuild governed persona/procedural memory"
2069
+ complete -c memory -n "__fish_use_subcommand" -a remote -d "Manage remote event-log synchronization"
1547
2070
  complete -c memory -n "__fish_use_subcommand" -a install -d "Install automatic sync hook"
1548
2071
  complete -c memory -n "__fish_use_subcommand" -a uninstall -d "Remove automatic sync hook"
1549
2072
  complete -c memory -n "__fish_use_subcommand" -a status -d "Show hook installation status"
1550
2073
  complete -c memory -n "__fish_use_subcommand" -a doctor -d "Check system health and diagnose issues"
2074
+ complete -c memory -n "__fish_use_subcommand" -a audit-secrets -d "Scan database and event logs for likely leaked secrets"
1551
2075
  complete -c memory -n "__fish_use_subcommand" -a purge -d "Remove old sessions from database"
1552
2076
  complete -c memory -n "__fish_use_subcommand" -a export -d "Export database to JSON file"
1553
2077
  complete -c memory -n "__fish_use_subcommand" -a import -d "Import database from JSON file"
@@ -1602,12 +2126,39 @@ complete -c memory -n "__fish_seen_subcommand_from show" -l quiet -d "Minimal ou
1602
2126
  # browse options
1603
2127
  complete -c memory -n "__fish_seen_subcommand_from browse" -l project -d "Filter by project name"
1604
2128
 
2129
+ # governance actions and options
2130
+ complete -c memory -n "__fish_seen_subcommand_from governance" -a "list show suppress unsuppress invalidate expire review consent-grant consent-revoke"
2131
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l surface -d "Governance surface" -a "fact context provider_egress remote_sync friction evaluation persona graph ranking dream projection"
2132
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l project -d "Filter by project name"
2133
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l status -d "Governance status" -a "active pending_review suppressed invalidated expired"
2134
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l limit -d "Maximum number of entries"
2135
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l reason -d "Reason for the control event"
2136
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l at -d "Expiry timestamp"
2137
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l scope -d "Consent scope"
2138
+ complete -c memory -n "__fish_seen_subcommand_from governance" -l json -d "Output as JSON"
2139
+
2140
+ # profile actions and options
2141
+ complete -c memory -n "__fish_seen_subcommand_from profile" -a "show export rebuild"
2142
+ complete -c memory -n "__fish_seen_subcommand_from profile" -l kind -d "Persona entry kind" -a "preference procedure correction decision_pattern friction_pattern"
2143
+ complete -c memory -n "__fish_seen_subcommand_from profile" -l limit -d "Maximum number of entries"
2144
+ complete -c memory -n "__fish_seen_subcommand_from profile" -l all -d "Use every project scope where supported"
2145
+ complete -c memory -n "__fish_seen_subcommand_from profile" -l json -d "Output as JSON"
2146
+
1605
2147
  # sync options
1606
2148
  complete -c memory -n "__fish_seen_subcommand_from sync" -l force -d "Force re-sync all sessions"
1607
2149
  complete -c memory -n "__fish_seen_subcommand_from sync" -l dry-run -d "Preview changes without syncing"
2150
+ complete -c memory -n "__fish_seen_subcommand_from sync" -l remote -d "Synchronize canonical event logs with configured remote"
1608
2151
  complete -c memory -n "__fish_seen_subcommand_from sync" -l verbose -d "Show detailed output"
1609
2152
  complete -c memory -n "__fish_seen_subcommand_from sync" -l quiet -d "Minimal output"
1610
2153
 
2154
+ # remote actions and options
2155
+ complete -c memory -n "__fish_seen_subcommand_from remote" -a "set remove status preflight doctor backup restore rollback"
2156
+ complete -c memory -n "__fish_seen_subcommand_from remote" -l json -d "Output stable JSON"
2157
+ complete -c memory -n "__fish_seen_subcommand_from remote" -l allow-local-path -d "Allow local path remotes"
2158
+ complete -c memory -n "__fish_seen_subcommand_from remote" -l no-auto-pull -d "Disable automatic remote pull"
2159
+ complete -c memory -n "__fish_seen_subcommand_from remote" -l no-auto-push -d "Disable automatic remote push"
2160
+ complete -c memory -n "__fish_seen_subcommand_from remote" -l confirm -d "Confirm restore or rollback mutation"
2161
+
1611
2162
  # install options
1612
2163
  complete -c memory -n "__fish_seen_subcommand_from install" -l force -d "Overwrite existing hook"
1613
2164
 
@@ -1618,6 +2169,18 @@ complete -c memory -n "__fish_seen_subcommand_from uninstall" -l restore -d "Res
1618
2169
  complete -c memory -n "__fish_seen_subcommand_from doctor" -l json -d "Output as JSON"
1619
2170
  complete -c memory -n "__fish_seen_subcommand_from doctor" -l fix -d "Attempt to fix common issues"
1620
2171
 
2172
+ # audit-secrets options
2173
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l json -d "Output as JSON"
2174
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l db -d "Database path override" -r
2175
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l skip-db -d "Skip database scanning"
2176
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l event-log -d "Specific event log path" -r
2177
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l events-dir -d "Events directory to scan" -r
2178
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l skip-events -d "Skip event-log scanning"
2179
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l redact-db -d "Rewrite mutable database fields with redacted values"
2180
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l quarantine-events -d "Quarantine raw event logs and write sanitized active copies"
2181
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l quarantine-dir -d "Quarantine directory" -r
2182
+ complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l report -d "Write a redacted evidence report" -r
2183
+
1621
2184
  # purge options
1622
2185
  complete -c memory -n "__fish_seen_subcommand_from purge" -l before -d "Delete sessions before date"
1623
2186
  complete -c memory -n "__fish_seen_subcommand_from purge" -l dry-run -d "Preview deletions without removing"
@@ -1641,7 +2204,7 @@ complete -c memory -n "__fish_seen_subcommand_from import" -l quiet -d "Minimal
1641
2204
 
1642
2205
  # completion shells
1643
2206
  complete -c memory -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"
1644
- `}function LY($){switch($){case"bash":return qY();case"zsh":return OY();case"fish":return UY();default:throw Error(`Unknown shell type: ${$}`)}}function _3(){return new AY("completion").description("Generate shell completion script").argument("<shell>","Shell type (bash, zsh, or fish)").addHelpText("after",`
2207
+ `}function WV(A){switch(A){case"bash":return XV();case"zsh":return VV();case"fish":return BV();default:throw Error(`Unknown shell type: ${A}`)}}function UK(){return new HV("completion").description("Generate shell completion script").argument("<shell>","Shell type (bash, zsh, or fish)").addHelpText("after",`
1645
2208
  Usage:
1646
2209
  # Bash (add to ~/.bashrc)
1647
2210
  eval "$(memory completion bash)"
@@ -1651,14 +2214,18 @@ Usage:
1651
2214
 
1652
2215
  # Fish (save to completions directory)
1653
2216
  memory completion fish > ~/.config/fish/completions/memory.fish
1654
- `).action((Z)=>{let K=W6(Z);process.exitCode=K.exitCode})}function W6($){if(!NY($))return console.error(`Error: Invalid shell type '${$}'`),console.error("Valid shells: bash, zsh, fish"),{exitCode:1};let Z=LY($);return console.log(Z),{exitCode:0}}H0();c();import{Command as G1,Option as jY}from"commander";import{join as xY}from"path";import{homedir as EY}from"os";D0();async function B6($,Z){if(!Z.description)return console.error("Error: description is required for log action"),{exitCode:1};let K=await $.log({description:Z.description,severity:Z.severity,category:Z.category,tool:Z.tool,context:Z.context,sourceProject:Z.source});if(Z.json)console.log(JSON.stringify({id:K.id,description:K.description,severity:K.severity,category:K.category,tool:K.tool,status:K.status,loggedAt:K.loggedAt.toISOString(),context:K.context??null,sourceProject:K.sourceProject??null}));else console.log(`Logged friction #${K.id} (${K.severity}/${K.category})`);return{exitCode:0}}async function z6($,Z){let K=Z.limit?parseInt(Z.limit,10):void 0,X=await $.list({all:Z.all,status:Z.status,category:Z.category,tool:Z.tool,limit:K});if(Z.json)console.log(JSON.stringify(X.map((Y)=>({id:Y.id,description:Y.description,severity:Y.severity,category:Y.category,tool:Y.tool,status:Y.status,loggedAt:Y.loggedAt.toISOString(),resolvedAt:Y.resolvedAt?.toISOString()??null,resolution:Y.resolution??null,context:Y.context??null,sourceProject:Y.sourceProject??null,lastReviewedAt:Y.lastReviewedAt?.toISOString()??null}))));else if(X.length===0)console.log(Z.all?"No friction entries found.":"No open friction entries.");else{console.log(`${"".padEnd(5)}${"ID".padEnd(6)}${"Severity".padEnd(10)}${"Category".padEnd(14)}${"Description".padEnd(62)}Age`),console.log("-".repeat(101));let Y=0,Q={};for(let H of X){let V=!H.lastReviewedAt||H.lastReviewedAt<H.loggedAt;if(V)Y++;Q[H.severity]=(Q[H.severity]??0)+1;let B=V?"[NEW]":" ",z=H.description.length>60?H.description.slice(0,57)+"...":H.description,W=Date.now()-H.loggedAt.getTime(),N=Math.floor(W/86400000),q=N===0?"today":`${N}d`;console.log(`${B}${String(H.id).padEnd(6)}${H.severity.padEnd(10)}${H.category.padEnd(14)}${z.padEnd(62)}${q}`)}let G=Object.entries(Q).map(([H,V])=>`${V} ${H}`).join(", "),_=Z.tool?` for ${Z.tool}`:"",J=Y>0?` -- ${Y} new since last review`:"";console.log(`
1655
- ${X.length} ${Z.all?"total":"open"} entries${_} (${G})${J}`)}if(Z.tool)await $.markReviewed(Z.tool);return{exitCode:0}}async function A6($,Z){if(!Z.id||!Z.resolution)return console.error("Error: id and --resolution are required for resolve action"),{exitCode:1};let K=parseInt(Z.id,10);if(isNaN(K))return console.error("Error: id must be a number"),{exitCode:1};if(await $.resolve(K,Z.resolution),Z.json)console.log(JSON.stringify({id:K,status:"resolved",resolution:Z.resolution}));else console.log(`Resolved friction #${K}`);return{exitCode:0}}async function N6($,Z){if(!Z.id||!Z.resolution)return console.error("Error: id and --resolution are required for wont-fix action"),{exitCode:1};let K=parseInt(Z.id,10);if(isNaN(K))return console.error("Error: id must be a number"),{exitCode:1};if(await $.wontFix(K,Z.resolution),Z.json)console.log(JSON.stringify({id:K,status:"wont-fix",resolution:Z.resolution}));else console.log(`Marked friction #${K} as won't fix`);return{exitCode:0}}import{exec as IY}from"child_process";import{mkdirSync as TY,writeFileSync as RY}from"fs";import{join as FY}from"path";import{platform as q6}from"os";P0();l();async function O6($,Z,K=MY){let X=await $.getStats(),Y=await $.getWeeklyTrends(12),Q=await $.list({tool:Z.tool}),G=await $.detectPatterns();if(Z.html){let _=R2(X,Y,Q,G),J=c1();TY(J,{recursive:!0});let H=FY(J,"dashboard.html");if(RY(H,_,"utf-8"),!Z.json)console.log(`Dashboard written to ${H}`),K(H)}else if(Z.json)console.log(JSON.stringify({stats:X,trends:Y,patterns:G},null,2));else{let _=T2(X,Y,Q,v(),G);if(Z.format==="ai")_=r(_);console.log(_)}return{exitCode:0}}function MY($){let Z=q6()==="win32"?"start":q6()==="darwin"?"open":"xdg-open";IY(`${Z} "${$}"`)}async function U6($,Z){if(!Z.pattern)return console.error("Error: pattern is required for purge action"),{exitCode:1};if(Z.dryRun){let Y=(await $.list({all:!0})).filter((Q)=>{return new RegExp("^"+Z.pattern.replace(/%/g,".*").replace(/_/g,".")+"$").test(Q.description)});if(Y.length===0)if(Z.json)console.log(JSON.stringify({wouldDelete:0,pattern:Z.pattern}));else console.log(`No entries match pattern: "${Z.pattern}"`);else if(Z.json)console.log(JSON.stringify({wouldDelete:Y.length,pattern:Z.pattern}));else{console.log(`Would delete ${Y.length} entries matching "${Z.pattern}":`);for(let Q of Y.slice(0,10))console.log(` #${Q.id}: ${Q.description}`);if(Y.length>10)console.log(` ... and ${Y.length-10} more`)}return{exitCode:0}}if(!Z.force)return console.error(`Use --dry-run to preview or --force to delete entries matching "${Z.pattern}".`),{exitCode:1};let K=await $.purge(Z.pattern);if(K===0)if(Z.json)console.log(JSON.stringify({deleted:0,pattern:Z.pattern}));else console.log(`No entries match pattern: "${Z.pattern}"`);else if(Z.json)console.log(JSON.stringify({deleted:K,pattern:Z.pattern}));else console.log(`Purged ${K} friction entries matching "${Z.pattern}"`);return{exitCode:0}}function J3(){let $=new G1("friction").description("Log and track friction with memory tool").addOption(new jY("--format <type>","Output format").choices(["default","ai"]).default("default"));return $.addCommand(new G1("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(Z,K)=>{let X=await _1({action:"log",description:Z,...K});process.exitCode=X.exitCode})),$.addCommand(new G1("list").description("List friction entries").option("--all","Include resolved and won't-fix entries").option("--status <status>","Filter by status").option("--category <cat>","Filter by category").option("--tool <name>","Filter by tool name").option("--limit <n>","Maximum entries","50").option("--json","Output as JSON").action(async(Z)=>{let K=await _1({action:"list",...Z});process.exitCode=K.exitCode})),$.addCommand(new G1("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(Z,K)=>{let X=await _1({action:"resolve",id:Z,...K});process.exitCode=X.exitCode})),$.addCommand(new G1("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(Z,K)=>{let X=await _1({action:"wont-fix",id:Z,...K});process.exitCode=X.exitCode})),$.addCommand(new G1("dashboard").description("Show friction dashboard").option("--html","Generate HTML report").option("--tool <name>","Filter by tool name").option("--json","Output as JSON").action(async(Z)=>{let K=await _1({action:"dashboard",...Z});process.exitCode=K.exitCode})),$.addCommand(new G1("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(Z,K)=>{let X=await _1({action:"purge",pattern:Z,...K});process.exitCode=X.exitCode})),$}async function _1($,Z={}){let K;try{let X=Z.dbPath??P();K=S({path:X}).db;let Y=new x0(K),Q=new y4(Y),G=xY(EY(),".claude","friction.jsonl"),_=await Q.ingestFallbackFile(G);if(_>0)process.stderr.write(`Ingested ${_} friction entries from fallback file
1656
- `);switch($.action){case"log":return await B6(Q,$);case"list":return await z6(Q,$);case"resolve":return await A6(Q,$);case"wont-fix":return await N6(Q,$);case"dashboard":return await O6(Q,$,Z.openInBrowser);case"purge":return await U6(Q,$);default:return console.error(`Unknown friction action: ${$.action}`),{exitCode:1}}}catch(X){let Y=X instanceof j?X:new j(F.UNKNOWN,A(X));if($.json)console.log(K1(Y));else console.error(p(Y));return{exitCode:1}}finally{if(K)D(K)}}import{Command as DY}from"commander";import{createInterface as kY}from"readline";import{existsSync as SY,mkdirSync as vY,appendFileSync as CY,writeFileSync as yY}from"fs";import{join as wY,dirname as bY}from"path";class R6{memoryDir;constructor($){this.memoryDir=$}async writeOrAppend($,Z){let K=wY(this.memoryDir,$),X=bY(K);vY(X,{recursive:!0});let Y=SY(K);if(Y)CY(K,`
1657
- `+Z);else yY(K,Z);return!Y}}async function F6($,Z,K={}){let X=parseInt($.batch,10),Y=$.project;if($.dryRun){let H=await Z.dryRun({project:Y});if(H.unprocessedCount===0)return console.log("No sessions to backfill. All sessions have been processed."),{exitCode:0};return console.log(`${H.unprocessedCount} sessions to backfill. Estimated cost: ~$${H.estimatedCost.toFixed(2)}`),{exitCode:0}}let Q=await Z.dryRun({project:Y});if(Q.unprocessedCount===0)return console.log("No sessions to backfill. All sessions have been processed."),{exitCode:0};let G=Math.min(Q.unprocessedCount,X);if(!$.force){if(!await(K.confirm??fY)(`Process ${G} sessions? Estimated cost: ~$${(G*0.001).toFixed(2)} [y/N] `))return console.error("Cancelled."),{exitCode:0}}let _=null;try{if(K.createProgressBar)_=await K.createProgressBar(G);else if(process.stderr.isTTY){let H=await import("cli-progress"),V=new H.default.SingleBar({format:"Backfill |{bar}| {percentage}% | {value}/{total} sessions | {sessionId}",hideCursor:!0,stream:process.stderr},H.default.Presets.shades_classic);V.start(G,0,{sessionId:""}),_=V}}catch{}let J=await Z.backfill({batch:X,project:Y,onProgress:(H)=>{_?.update(H.current,{sessionId:H.sessionId.slice(0,8)})}});if(_?.stop(),console.log(`
1658
- Backfill complete: ${J.sessionsProcessed} processed, ${J.sessionsFailed} failed, ${J.sessionsSkipped} skipped`),J.dailyLogsCreated>0||J.dailyLogsUpdated>0)console.log(`Daily logs: ${J.dailyLogsCreated} created, ${J.dailyLogsUpdated} updated`);if(J.errors.length>0){console.error(`
1659
- Errors:`);for(let H of J.errors)console.error(` ${H.sessionId}: ${H.error}`)}return{exitCode:0}}function H3(){return new DY("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($)=>{let{initializeDatabase:Z,closeDatabase:K}=await Promise.resolve().then(() => (c(),r9)),{SqliteSessionRepository:X}=await Promise.resolve().then(() => (M0(),Z5)),{SqliteMessageRepository:Y}=await Promise.resolve().then(() => (A1(),K5)),{SqliteBackfillStateRepository:Q}=await Promise.resolve().then(() => (x9(),J5)),{ClaudeSummaryGenerator:G}=await Promise.resolve().then(() => (T6(),I6)),{getMemoryDir:_}=await Promise.resolve().then(() => (l(),N3)),{BackfillService:J}=await Promise.resolve().then(() => (G9(),k3)),{getDefaultDbPath:H}=await Promise.resolve().then(() => (c(),r9)),{loadConfig:V}=await Promise.resolve().then(() => (K0(),n4)),B=V(),z=$.writeMemoryFiles===!0||B.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1";if(!$.dryRun&&!z){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=H(),q=Z({path:W}).db;try{let I=new X(q),T=new Y(q),U=new Q(q),O=new G,R=_(),M=new R6(R),x=new J(I,T,U,O,M),o=await F6($,x);process.exitCode=o.exitCode}finally{K(q)}})}async function fY($){return new Promise((Z)=>{let K=kY({input:process.stdin,output:process.stderr});K.question($,(X)=>{K.close(),Z(X.toLowerCase()==="y"||X.toLowerCase()==="yes")})})}c();q1();M0();A1();K0();import{Command as gY}from"commander";Z4();w2();o1();var hY={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})};class V3{db;factRepo;logRepo;messageRepo;extractionProvider;embeddingProvider;eventLogPath;redactor;constructor($,Z,K,X,Y,Q,G,_=hY){this.db=$;this.factRepo=Z;this.logRepo=K;this.messageRepo=X;this.extractionProvider=Y;this.embeddingProvider=Q;this.eventLogPath=G;this.redactor=_}async extractFromSession($,Z,K){if(await this.logRepo.findById($)&&!K?.force)return{skippedSession:!0,added:0,updated:0,superseded:0,skipped:0};let Y=await this.messageRepo.findBySession($);if(Y.length===0)return{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let Q=Y.map((I)=>J0.create({id:I.id,role:I.role,content:this.redactor.redactText(I.content).text,timestamp:I.timestamp,toolUseIds:I.toolUses})),G=(await this.extractionProvider.extract(Q)).map((I)=>({...I,content:this.redactor.redactText(I.content).text,metadata:this.redactor.redactJson(I.metadata).value}));if(G.length===0)return await this.logRepo.save({sessionId:$,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 J=(await this.factRepo.findByProject(Z)).filter((I)=>I.supersededAt===null),H=Boolean(this.embeddingProvider&&this.embeddingProvider.isReady()),V=[],B=[];if(H&&this.embeddingProvider)try{V=(await this.embeddingProvider.embedBatch(J.map((U)=>U.content))).map((U)=>U.embedding),B=(await this.embeddingProvider.embedBatch(G.map((U)=>U.content))).map((U)=>U.embedding)}catch(I){console.warn("Failed to generate vector embeddings during extraction comparison, falling back to Jaccard:",I)}let z=0,W=0,N=0,q=0;for(let I=0;I<G.length;I++){let T=G[I];if(!T)continue;let U=0,O=null;for(let R=0;R<J.length;R++){let M=J[R];if(!M)continue;let x=0;if(T.content.trim().toLowerCase()===M.content.trim().toLowerCase())x=1;else{let o=B[I],A0=V[R];if(H&&o&&A0)x=this.cosineSimilarity(o,A0);else x=this.jaccardWordSimilarity(T.content,M.content)}if(x>U)U=x,O=M}if(U>=0.95||O&&T.content.trim().toLowerCase()===O.content.trim().toLowerCase())q++;else if(U>=0.85&&O){z++,W++,N++;let R=Z0.create({type:T.type,project:Z,content:T.content,metadata:{confidence:T.confidence,...T.metadata},observedAt:new Date});await A4(R,this.eventLogPath);let M=Z0.create({type:"supersedence",project:Z,content:`Superseded ${O.uuid} by ${R.uuid}`,metadata:{superseded_uuid:O.uuid,superseded_by_uuid:R.uuid},observedAt:new Date});await A4(M,this.eventLogPath)}else{z++;let R=Z0.create({type:T.type,project:Z,content:T.content,metadata:{confidence:T.confidence,...T.metadata},observedAt:new Date});await A4(R,this.eventLogPath)}}return await y2(this.db,this.eventLogPath),await this.logRepo.save({sessionId:$,mode:"manual",factsAdded:z,factsUpdated:W,factsSuperseded:N,factsSkipped:q,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:z,updated:W,superseded:N,skipped:q}}cosineSimilarity($,Z){let K=0,X=0,Y=0;for(let Q=0;Q<$.length;Q++){let G=$[Q]??0,_=Z[Q]??0;K+=G*_,X+=G*G,Y+=_*_}if(X===0||Y===0)return 0;return K/(Math.sqrt(X)*Math.sqrt(Y))}jaccardWordSimilarity($,Z){let K=(_)=>new Set(_.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()?"']/g,"").split(/\s+/).filter((J)=>J.length>0)),X=K($),Y=K(Z),Q=new Set([...X].filter((_)=>Y.has(_))),G=new Set([...X,...Y]);if(G.size===0)return 0;return Q.size/G.size}}T0();z4();t4();class M6{current=0;total=0;isTty=process.stdout.isTTY;quiet=!1;constructor($,Z=!1){if(this.total=$,this.quiet=Z,this.quiet)return;if(this.isTty)process.stdout.write(`\rExtracting facts... [0/${$}] \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 0%`);else console.log(`Extracting facts from ${$} sessions...`)}update($){if(this.quiet)return;this.current++;let Z=Math.round(this.current/this.total*100),K=Math.min(10,Math.max(0,Math.floor(Z/10))),X="\u2588".repeat(K)+"\u2591".repeat(10-K);if(this.isTty){let Y=$.length>25?$.substring(0,22)+"...":$;process.stdout.write(`\rExtracting facts... [${this.current}/${this.total}] [${X}] ${Z}% - Session: ${Y}`)}else console.log(`[${this.current}/${this.total}] Processed session: ${$}`)}stop(){if(this.quiet)return;if(this.isTty)process.stdout.write(`
1660
- `)}}async function mY($){let{EmbeddingProviderFactory:Z}=await Promise.resolve().then(() => (L$(),E2)),X=new Z().create($.embedding);return await X.initialize(),X}function W3(){return new gY("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($,Z)=>{let K=await j6({project:$,...Z});process.exitCode=K.exitCode})}async function j6($,Z={}){let K=performance.now(),X=Z.dbPath??P(),Y=h(),Q;if(Z.mockExtractor)Q=Z.mockExtractor;else try{Q=m5(Y)}catch(J){let H=A(J);if($.json)C({command:"extract",code:"PROVIDER_INIT_FAILED",message:H});else console.error(`Error: Provider initialization failed: ${H}`);return{exitCode:1}}let G=Z.mockEmbedder;if(!Z.mockEmbedder&&Y.embedding?.enabled)try{G=await(Z.createEmbedder??mY)(Y)}catch(J){}let _;try{_=S({path:X}).db}catch(J){if($.json)C({command:"extract",code:"DB_CONNECTION_FAILED",message:J.message});else console.error(`Error: Database connection failed: ${J.message}`);return{exitCode:1}}try{let J=new E0(_),H=new d4(_),V=new g(_),B=new G0(_),z=await V.findFiltered({projectFilter:$.project,limit:1e4}),W=z;if($.since&&!$.all)try{let M=Z3($.since);W=z.filter((x)=>x.startTime>=M)}catch(M){if($.json)C({command:"extract",code:"INVALID_ARGUMENT",message:M.message});else console.error(`Error: ${M.message}`);return{exitCode:1}}let N=new V3(_,J,H,B,Q,G,Z.eventLogPath,new l0),q=[];for(let M of W)if(!await H.findById(M.id)||$.force)q.push(M);if(q.length===0){if($.json)console.log(JSON.stringify({status:"success",data:{added:0,updated:0,superseded:0,skipped:0},meta:{timing_ms:Math.round(performance.now()-K),sessions_processed:0}},null,2));else if(!$.quiet)console.log("No new sessions to extract for project:",$.project);return{exitCode:0}}let I=new M6(q.length,!!$.quiet||!!$.json),T=0,U=0,O=0,R=0;for(let M of q){let x=await N.extractFromSession(M.id,$.project,$.force?{force:!0}:void 0);T+=x.added,U+=x.updated,O+=x.superseded,R+=x.skipped,I.update(M.id.substring(0,8))}if(I.stop(),$.json)console.log(JSON.stringify({status:"success",data:{added:T,updated:U,superseded:O,skipped:R},meta:{timing_ms:Math.round(performance.now()-K),sessions_processed:q.length}},null,2));else if($.quiet)console.log(`added: ${T}, updated: ${U}, superseded: ${O}, skipped: ${R}`);else{let M=v();console.log(`
1661
- `+w("==================================================",M)),console.log(w(" Extraction Completed Successfully",M)),console.log(w("==================================================",M)),console.log(`Sessions Processed : ${q.length}`),console.log(`Added : ${T}`),console.log(`Updated : ${U}`),console.log(`Superseded : ${O}`),console.log(`Skipped (Duplicate): ${R}`),console.log(k(`Timing : ${Math.round(performance.now()-K)}ms`,M))}return{exitCode:0}}catch(J){if($.json)console.log(JSON.stringify({status:"error",error:{code:"UNEXPECTED_ERROR",message:J.message}},null,2));else console.error(`Error: Fact extraction pipeline execution failed: ${J.message}`);return{exitCode:2}}finally{D(_)}}c();q1();import{Command as cY}from"commander";function B3(){return new cY("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($,Z)=>{let K=await x6({project:$,...Z});process.exitCode=K.exitCode})}async function x6($,Z={}){let K=Z.dbPath??P(),X;try{X=S({path:K}).db}catch(Y){if($.json)console.log(JSON.stringify({status:"error",error:{code:"DB_CONNECTION_FAILED",message:Y.message}},null,2));else console.error(`Error: Database connection failed: ${Y.message}`);return{exitCode:1}}try{let Q=await new E0(X).findByProject($.project);if($.json){let _=Q;if(!$.superseded)_=Q.filter((J)=>J.supersededAt===null);return console.log(JSON.stringify({status:"success",data:_.map((J)=>({uuid:J.uuid,type:J.type,project:J.project,content:J.content,metadata:J.metadata,observed_at:J.observedAt.toISOString(),superseded_at:J.supersededAt?J.supersededAt.toISOString():null,superseded_by:J.supersededBy}))},null,2)),{exitCode:0}}let G=v();if(!$.superseded){let _=Q.filter((H)=>H.supersededAt===null);if(console.log(`
1662
- Active Facts for Project: ${$.project}`),console.log("=".repeat(30+$.project.length)),_.length===0)return console.log(k("No active facts found for this project.",G)),{exitCode:0};let J=["decision","learning","preference","friction","observation"];for(let H of J){let V=_.filter((B)=>B.type===H);if(V.length===0)continue;console.log(`
1663
- ${H.toUpperCase()}`);for(let B of V)console.log(` - ${B.content}`)}}else{if(console.log(`
1664
- Facts History Timeline for Project: ${$.project}`),console.log("=".repeat(35+$.project.length)),Q.length===0)return console.log(k("No facts history found for this project.",G)),{exitCode:0};let _=[...Q].sort((J,H)=>J.observedAt.getTime()-H.observedAt.getTime());for(let J of _){let H=J.observedAt.toISOString().split("T")[0],V=`[${J.type.toUpperCase()}]`;if(J.supersededAt)console.log(`[${H}] ${u(V,G)} (SUPERSEDED) ${J.content}`),console.log(` \u21B3 replaced by ${J.supersededBy} on ${J.supersededAt.toISOString().split("T")[0]}`);else console.log(`[${H}] ${w(V,G)} ${J.content}`)}}return{exitCode:0}}catch(Y){if($.json)console.log(JSON.stringify({status:"error",error:{code:"UNEXPECTED_ERROR",message:Y.message}},null,2));else console.error(`Error: Facts query execution failed: ${Y.message}`);return{exitCode:2}}finally{D(X)}}var b=new uY;b.name("memory").description("Cross-project context persistence for Claude Code sessions").version(z3.version);b.commandsGroup("Query Commands:");b.addCommand(y$());b.addCommand(w$());b.addCommand(k$());b.addCommand(j$());b.addCommand(E$());b.addCommand(v$());b.addCommand(D$());b.addCommand(B3());b.commandsGroup("Data Commands:");b.addCommand(b2());b.addCommand(H3());b.addCommand(Q3());b.addCommand(G3());b.addCommand(K3());b.addCommand(X3());b.addCommand(W3());if(process.env.MEMORY_EXPERIMENTAL_REMOTE_SYNC==="1")b.addCommand(r2());b.commandsGroup("System Commands:");b.addCommand(t2());b.addCommand(s2());b.addCommand(P$());b.addCommand($3());b.addCommand(_3());b.addCommand(i2());b.commandsGroup("Feedback Commands:");b.addCommand(J3());if(import.meta.main){if(T3())R3();b.parse()}export{b as program};
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
+ ${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();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
+ ${$}`),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
+ [${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
+ `)}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
+ `+_);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
+ 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(() => (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
+ `+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
+ 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
+ ${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(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};