@chude/memory 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -11
- package/dist/application/services/embedding-service.d.ts +8 -1
- package/dist/application/services/friction-service.d.ts +18 -2
- package/dist/application/services/index.d.ts +11 -1
- package/dist/application/services/memory-governance-service.d.ts +65 -0
- package/dist/application/services/memory-ranking-service.d.ts +65 -0
- package/dist/application/services/persona-profile-service.d.ts +29 -0
- package/dist/application/services/projection-registry.d.ts +18 -0
- package/dist/application/services/remote-event-sync-service.d.ts +76 -0
- package/dist/application/services/smart-context-service.d.ts +34 -1
- package/dist/application/services/temporal-graph-service.d.ts +30 -0
- package/dist/domain/entities/graph-edge.d.ts +87 -0
- package/dist/domain/entities/index.d.ts +5 -0
- package/dist/domain/entities/memory-event.d.ts +101 -0
- package/dist/domain/entities/memory-governance.d.ts +100 -0
- package/dist/domain/entities/memory-utility-metric.d.ts +65 -0
- package/dist/domain/entities/persona-entry.d.ts +67 -0
- package/dist/domain/ports/capability.d.ts +35 -0
- package/dist/domain/ports/embedding.d.ts +21 -0
- package/dist/domain/ports/index.d.ts +1 -0
- package/dist/domain/ports/redactor.d.ts +3 -0
- package/dist/domain/ports/repositories.d.ts +155 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +774 -328
- package/dist/infrastructure/capabilities/capability-status.d.ts +10 -0
- package/dist/infrastructure/capabilities/index.d.ts +1 -0
- package/dist/infrastructure/database/event-log.d.ts +40 -8
- package/dist/infrastructure/database/health-checker.d.ts +22 -1
- package/dist/infrastructure/database/index.d.ts +3 -3
- package/dist/infrastructure/database/repositories/embedding-repository.d.ts +18 -4
- package/dist/infrastructure/database/repositories/friction-repository.d.ts +2 -1
- package/dist/infrastructure/database/repositories/graph-repository.d.ts +17 -0
- package/dist/infrastructure/database/repositories/index.d.ts +4 -0
- package/dist/infrastructure/database/repositories/memory-governance-repository.d.ts +21 -0
- package/dist/infrastructure/database/repositories/memory-utility-repository.d.ts +15 -0
- package/dist/infrastructure/database/repositories/persona-repository.d.ts +16 -0
- package/dist/infrastructure/database/schema.d.ts +40 -0
- package/dist/infrastructure/embedding/embedding-provider-factory.d.ts +3 -2
- package/dist/infrastructure/embedding/ollama-provider.d.ts +1 -0
- package/dist/infrastructure/hooks/config-manager.d.ts +17 -0
- package/dist/infrastructure/providers/provider-egress-policy.d.ts +21 -0
- package/dist/infrastructure/providers/provider-registry.d.ts +8 -4
- package/dist/infrastructure/remote/git-remote-event-transport.d.ts +40 -0
- package/dist/infrastructure/security/pattern-redactor.d.ts +3 -0
- package/dist/infrastructure/security/secret-audit-service.d.ts +57 -0
- package/dist/presentation/cli/commands/audit-secrets.d.ts +54 -0
- package/dist/presentation/cli/commands/friction/types.d.ts +13 -0
- package/dist/presentation/cli/commands/governance.d.ts +27 -0
- package/dist/presentation/cli/commands/index.d.ts +6 -0
- package/dist/presentation/cli/commands/profile.d.ts +23 -0
- package/dist/presentation/cli/commands/remote.d.ts +21 -3
- package/dist/presentation/cli/commands/sync/ambient.d.ts +7 -0
- package/dist/presentation/cli/commands/sync/types.d.ts +8 -12
- package/dist/presentation/cli/formatters/envelope.d.ts +2 -2
- package/dist/presentation/cli/index.js +918 -351
- package/package.json +9 -6
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
`),{success:!0,message:"Hooks installed successfully"}}function
|
|
5
|
-
`),{success:!0,message:"Hooks uninstalled successfully"}}function
|
|
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
|
-
`))
|
|
9
|
-
|
|
10
|
-
`;if(
|
|
11
|
-
`;break}
|
|
12
|
-
`)},
|
|
13
|
-
`)}
|
|
14
|
-
`)}
|
|
15
|
-
`)
|
|
3
|
+
var DZ=Object.create;var{getPrototypeOf:xZ,defineProperty:P$,getOwnPropertyNames:PZ}=Object;var yZ=Object.prototype.hasOwnProperty;var w_=(A,_,G)=>{G=A!=null?DZ(xZ(A)):{};let $=_||!A||!A.__esModule?P$(G,"default",{value:A,enumerable:!0}):G;for(let K of PZ(A))if(!yZ.call($,K))P$($,K,{get:()=>A[K],enumerable:!0});return $};var k=(A,_)=>{for(var G in _)P$(A,G,{get:_[G],enumerable:!0,configurable:!0,set:($)=>_[G]=()=>$})};var U=(A,_)=>()=>(A&&(_=A(A=0)),_);var U0=import.meta.require;function L(A){return A instanceof Error?A.message:String(A)}function C_(A){return A instanceof Error?A:Error(L(A))}var PG={};k(PG,{getMemoryDir:()=>f_,getMachineLogPath:()=>y$,getLogDir:()=>QA,getLegacyDir:()=>b_,getHookDir:()=>g_,getEventsDir:()=>CA,getEventLogPath:()=>vZ,getDbPath:()=>t0,getDataDir:()=>n,getConfigPath:()=>A0,getConfigDir:()=>oA,getCheckpointPath:()=>c_,getBackupDir:()=>T0,getAllLogFiles:()=>UA});import{existsSync as yK,readdirSync as hZ}from"fs";import{homedir as xG}from"os";import{join as r}from"path";function oA(){let A=process.env.XDG_CONFIG_HOME;if(A)return r(A,DG);return r(xG(),".config",DG)}function n(){let A=process.env.XDG_DATA_HOME;if(A)return r(A,DG);return r(xG(),".local","share",DG)}function b_(){return r(xG(),".memory-nexus")}function f_(){let A=process.env.MEMORY_HOME;if(A)return A;return r(xG(),".memory")}function A0(){return r(oA(),"config.json")}function t0(){return r(n(),"memory.db")}function QA(){return r(n(),"logs")}function g_(){return r(n(),"hooks")}function T0(){return r(n(),"backups")}function c_(){return r(n(),"sync-checkpoint.json")}function CA(){return r(n(),"events")}function vZ(){return r(CA(),"events.jsonl")}function y$(A){return r(CA(),`events-${A}.jsonl`)}function UA(A){let _=A??CA();if(!yK(_))return[];let G=hZ(_),$=[],K=r(_,"events.jsonl");if(yK(K))$.push(K);for(let Z of G)if(Z.startsWith("events-")&&Z.endsWith(".jsonl"))$.push(r(_,Z));return $}var DG="memory";var c=U(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{copyFileSync as kK,existsSync as u_,mkdirSync as k$,readFileSync as wZ,writeFileSync as hK}from"fs";import{dirname as h$,join as v$}from"path";import{homedir as CZ}from"os";function e0(A){return A?.settingsPath??v$(CZ(),".claude","settings.json")}function yG(A){return A?.backupPath??v$(T0(),"settings.json.backup")}function I0(A){return A?.hookScriptPath??v$(g_(),"sync-hook.js")}function s0(A){let _=e0(A);if(!u_(_))return{};try{let G=wZ(_,"utf-8");return JSON.parse(G)}catch{return{}}}function vK(A){let _=e0(A),G=yG(A);if(!u_(_))return!1;return k$(h$(G),{recursive:!0}),kK(_,G),!0}function w$(A){let _=e0(A),G=yG(A);if(!u_(G))return!1;return k$(h$(_),{recursive:!0}),kK(G,_),!0}function O0(A){let _=e0(A),G=I0(A);vK(A);let $=s0(A),K=`bun run "${G.replace(/\\/g,"/")}"`;if($.hooks=$.hooks??{},$.hooks.SessionEnd?.some((Y)=>Y.hooks.some((J)=>J.command.includes(m_)||J.command.includes(d_))))return{success:!0,message:"Hooks already installed"};return $.hooks.SessionEnd=$.hooks.SessionEnd??[],$.hooks.SessionEnd.push({hooks:[{type:"command",command:K,timeout:5}]}),$.hooks.PreCompact=$.hooks.PreCompact??[],$.hooks.PreCompact.push({matcher:"auto",hooks:[{type:"command",command:K,timeout:5}]}),k$(h$(_),{recursive:!0}),hK(_,JSON.stringify($,null,2)+`
|
|
4
|
+
`),{success:!0,message:"Hooks installed successfully"}}function j0(A){let _=e0(A),G=s0(A);if(!G.hooks)return{success:!0,message:"No hooks to uninstall"};if(G.hooks.SessionEnd){if(G.hooks.SessionEnd=G.hooks.SessionEnd.filter(($)=>!$.hooks.some((K)=>K.command.includes(m_)||K.command.includes(d_))),G.hooks.SessionEnd.length===0)delete G.hooks.SessionEnd}if(G.hooks.PreCompact){if(G.hooks.PreCompact=G.hooks.PreCompact.filter(($)=>!$.hooks.some((K)=>K.command.includes(m_)||K.command.includes(d_))),G.hooks.PreCompact.length===0)delete G.hooks.PreCompact}if(Object.keys(G.hooks).length===0)delete G.hooks;return hK(_,JSON.stringify(G,null,2)+`
|
|
5
|
+
`),{success:!0,message:"Hooks uninstalled successfully"}}function bA(A){let _=s0(A),G=I0(A),$=yG(A);return{sessionEnd:_.hooks?.SessionEnd?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,preCompact:_.hooks?.PreCompact?.some((K)=>K.hooks.some((Z)=>Z.command.includes(m_)||Z.command.includes(d_)))??!1,hookScriptExists:u_(G),backupExists:u_($)}}var m_="memory",d_="memory-nexus";var C$=U(()=>{c()});import{copyFileSync as bZ,cpSync as fZ,existsSync as XA,mkdirSync as f$,readdirSync as gZ,renameSync as cZ,rmSync as g$,statSync as kG,unlinkSync as c$}from"fs";import{join as _0}from"path";function CK(){let A=XA(b_()),_=XA(oA())||XA(n()),G;if(!A&&!_)G="not-needed";else if(A&&!_)G="pending";else if(!A&&_)G="complete";else G="partial";return{legacyExists:A,newExists:_,status:G}}function bK(){let A=b_();if(!XA(A))return!1;let _=_0(A,"memory.db");if(!XA(_))return!1;let G=t0();if(!XA(G))return!0;let $=kG(_).size,K=kG(G).size;return $>K}function b$(A){for(let _ of["-wal","-shm"]){let G=A+_;if(XA(G))c$(G)}}function uZ(A,_){for(let G of _)if(G.isDir&&XA(G.source)&&XA(G.dest))try{g$(G.source,{recursive:!0})}catch{}try{if(gZ(A).length===0)g$(A,{recursive:!0})}catch{}}function fK(){let A=b_();if(!XA(A))return{migrated:!1,itemsMoved:[],errors:[]};let _=[{name:"memory.db",source:_0(A,"memory.db"),dest:t0(),isDir:!1},{name:"config.json",source:_0(A,"config.json"),dest:A0(),isDir:!1},{name:"sync-checkpoint.json",source:_0(A,"sync-checkpoint.json"),dest:c_(),isDir:!1},{name:"logs",source:_0(A,"logs"),dest:QA(),isDir:!0},{name:"hooks",source:_0(A,"hooks"),dest:g_(),isDir:!0},{name:"backups",source:_0(A,"backups"),dest:T0(),isDir:!0}];try{f$(oA(),{recursive:!0}),f$(n(),{recursive:!0})}catch(Z){let Y=L(Z);return{migrated:!1,itemsMoved:[],errors:[`Failed to create target directories: ${Y}`]}}let G=[],$=[];for(let Z of _){if(!XA(Z.source))continue;if(XA(Z.dest)){if(Z.isDir)continue;let Y=kG(Z.source).size;if(kG(Z.dest).size>=Y){if(c$(Z.source),Z.source.endsWith(".db"))b$(Z.source);$.push(Z.name);continue}if(Z.dest.endsWith(".db"))b$(Z.dest)}try{if(wK(Z.source,Z.dest,Z.isDir),G.push({item:Z,rolledBack:!1}),$.push(Z.name),Z.source.endsWith(".db"))b$(Z.source)}catch(Y){let J=L(Y),H=[`Failed to move ${Z.name}: ${J}`];for(let Q=G.length-1;Q>=0;Q--){let X=G[Q];try{wK(X.item.dest,X.item.source,X.item.isDir),X.rolledBack=!0}catch(V){let B=L(V);H.push(`Rollback failed for ${X.item.name}: ${B}`)}}return{migrated:!1,itemsMoved:[],errors:H}}}if($.length===0)return{migrated:!1,itemsMoved:[],errors:[]};let K=[];try{j0(),O0()}catch(Z){let Y=L(Z);K.push(`hook re-install failed: ${Y}`)}return uZ(A,_),process.stderr.write(`Migrated data from ~/.memory-nexus to new paths
|
|
6
|
+
`),{migrated:!0,itemsMoved:$,errors:K}}function wK(A,_,G){let $=_0(_,"..");f$($,{recursive:!0});try{cZ(A,_)}catch(K){if(K.code==="EXDEV")if(G)fZ(A,_,{recursive:!0}),g$(A,{recursive:!0});else bZ(A,_),c$(A);else throw K}}var u$=U(()=>{c();C$()});class xA{_id;_projectPath;_startTime;_endTime;_messages;_summary;_messageCount;constructor(A){this._id=A.id,this._projectPath=A.projectPath,this._startTime=new Date(A.startTime.getTime()),this._endTime=A.endTime?new Date(A.endTime.getTime()):void 0,this._messages=Object.freeze([...A.messages??[]]),this._summary=A.summary,this._messageCount=A.messageCount}static create(A){if(!A.id||A.id.trim()==="")throw Error("Session ID cannot be empty");if(A.endTime&&A.endTime<A.startTime)throw Error("End time cannot be before start time");return new xA(A)}get id(){return this._id}get projectPath(){return this._projectPath}get startTime(){return new Date(this._startTime.getTime())}get endTime(){return this._endTime?new Date(this._endTime.getTime()):void 0}get messages(){return[...this._messages]}get summary(){return this._summary}get messageCount(){return this._messageCount??this._messages.length}get durationMs(){if(!this._endTime)return;return this._endTime.getTime()-this._startTime.getTime()}equals(A){return this._id===A._id}addMessage(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages,A],summary:this._summary})}complete(A){if(A<this._startTime)throw Error("End time cannot be before start time");return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:A,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary(A){return new xA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:A,messageCount:this._messageCount})}}class TA{_id;_role;_content;_timestamp;_toolUseIds;constructor(A){this._id=A.id,this._role=A.role,this._content=A.content,this._timestamp=new Date(A.timestamp.getTime()),this._toolUseIds=Object.freeze([...A.toolUseIds??[]])}static create(A){if(!A.id||A.id.trim()==="")throw Error("Message ID cannot be empty");if(!mZ.includes(A.role))throw Error("Invalid message role");return new TA(A)}get id(){return this._id}get role(){return this._role}get content(){return this._content}get timestamp(){return new Date(this._timestamp.getTime())}get toolUses(){return[...this._toolUseIds]}get hasContent(){return this._content.length>0}get hasToolUses(){return this._toolUseIds.length>0}equals(A){return this._id===A._id}addToolUse(A){return new TA({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,A]})}}var mZ;var l_=U(()=>{mZ=["user","assistant"]});class PA{_id;_name;_input;_timestamp;_status;_result;constructor(A){this._id=A.id,this._name=A.name,this._input=structuredClone(A.input),this._timestamp=new Date(A.timestamp.getTime()),this._status=A.status??"pending",this._result=A.result}static create(A){if(!A.id||A.id.trim()==="")throw Error("Tool use ID cannot be empty");if(!A.name||A.name.trim()==="")throw Error("Tool name cannot be empty");if(A.status&&!dZ.includes(A.status))throw Error("Invalid tool use status");return new PA(A)}get id(){return this._id}get name(){return this._name}get input(){return structuredClone(this._input)}get timestamp(){return new Date(this._timestamp.getTime())}get status(){return this._status}get result(){return this._result}get isPending(){return this._status==="pending"}get isSuccess(){return this._status==="success"}get isError(){return this._status==="error"}equals(A){return this._id===A._id}completeSuccess(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:A})}completeError(A){return new PA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:A})}}var dZ;var hG=U(()=>{dZ=["pending","success","error"]});class VA{_id;_sessionPath;_startedAt;_status;_completedAt;_messagesExtracted;_errorMessage;_fileMtime;_fileSize;constructor(A){this._id=A.id,this._sessionPath=A.sessionPath,this._startedAt=new Date(A.startedAt.getTime()),this._status=A.status??"pending",this._completedAt=A.completedAt?new Date(A.completedAt.getTime()):void 0,this._messagesExtracted=A.messagesExtracted??0,this._errorMessage=A.errorMessage,this._fileMtime=A.fileMtime?new Date(A.fileMtime.getTime()):void 0,this._fileSize=A.fileSize}static create(A){if(!A.id||A.id.trim()==="")throw Error("Extraction state ID cannot be empty");if(!A.sessionPath||A.sessionPath.trim()==="")throw Error("Session path cannot be empty");if(A.status&&!lZ.includes(A.status))throw Error("Invalid extraction status");if(A.messagesExtracted!==void 0&&A.messagesExtracted<0)throw Error("Messages extracted cannot be negative");if(A.fileSize!==void 0&&A.fileSize<0)throw Error("File size cannot be negative");return new VA(A)}get id(){return this._id}get sessionPath(){return this._sessionPath}get startedAt(){return new Date(this._startedAt.getTime())}get status(){return this._status}get completedAt(){return this._completedAt?new Date(this._completedAt.getTime()):void 0}get messagesExtracted(){return this._messagesExtracted}get errorMessage(){return this._errorMessage}get fileMtime(){return this._fileMtime?new Date(this._fileMtime.getTime()):void 0}get fileSize(){return this._fileSize}get isPending(){return this._status==="pending"}get isInProgress(){return this._status==="in_progress"}get isComplete(){return this._status==="complete"}get isError(){return this._status==="error"}get durationMs(){if(!this._completedAt)return;return this._completedAt.getTime()-this._startedAt.getTime()}equals(A){return this._id===A._id}startProcessing(){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"in_progress",messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}complete(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"complete",completedAt:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}fail(A){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"error",errorMessage:A,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}incrementMessages(A=1){return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted+A,errorMessage:this._errorMessage,fileMtime:this._fileMtime,fileSize:this._fileSize})}withFileMetadata(A,_){if(_<0)throw Error("File size cannot be negative");return new VA({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:this._status,completedAt:this._completedAt,messagesExtracted:this._messagesExtracted,errorMessage:this._errorMessage,fileMtime:A,fileSize:_})}}var lZ;var vG=U(()=>{lZ=["pending","in_progress","complete","error"]});var j;var gK=U(()=>{j={DB_CONNECTION_FAILED:"DB_CONNECTION_FAILED",DB_CORRUPTED:"DB_CORRUPTED",DB_LOCKED:"DB_LOCKED",INVALID_SESSION_ID:"INVALID_SESSION_ID",SESSION_NOT_FOUND:"SESSION_NOT_FOUND",SOURCE_INACCESSIBLE:"SOURCE_INACCESSIBLE",DISK_FULL:"DISK_FULL",INVALID_JSON:"INVALID_JSON",UNKNOWN_FORMAT:"UNKNOWN_FORMAT",SYNC_INTERRUPTED:"SYNC_INTERRUPTED",SYNC_FAILED:"SYNC_FAILED",INVALID_ARGUMENT:"INVALID_ARGUMENT",MISSING_ARGUMENT:"MISSING_ARGUMENT",VECTOR_UNAVAILABLE:"VECTOR_UNAVAILABLE",PROVIDER_TIMEOUT:"PROVIDER_TIMEOUT",PROVIDER_CONFIG_INVALID:"PROVIDER_CONFIG_INVALID",EMBEDDING_DIMENSION_MISMATCH:"EMBEDDING_DIMENSION_MISMATCH",MODEL_CORRUPTED:"MODEL_CORRUPTED",NOT_FOUND:"NOT_FOUND",INVALID_STATE:"INVALID_STATE",UNKNOWN:"UNKNOWN"}});var F;var cK=U(()=>{F=class F extends Error{code;context;constructor(A,_,G){super(_);if(this.name="MemoryError",this.code=A,this.context=G,Error.captureStackTrace)Error.captureStackTrace(this,F)}toJSON(){let A={error:{code:this.code,message:this.message}};if(this.context&&Object.keys(this.context).length>0)A.error.context=this.context;return A}}});var IA=U(()=>{gK();cK()});var p_=()=>{};var d$=U(()=>{p_()});function bG(A,_){return A instanceof CG&&(_===void 0||A.kind===_)}var CG;var l$=U(()=>{CG=class CG extends Error{kind;status;retryable;metadata;constructor(A){super(A.message);if(this.name="EmbeddingProviderError",this.kind=A.kind,this.status=A.status,this.retryable=A.retryable??!1,this.metadata=A.metadata??{},A.cause!==void 0)this.cause=A.cause}}});var dK={};k(dK,{computeModelHash:()=>p$,EmbeddingService:()=>n$});import{Buffer as uK}from"buffer";import{createHash as mK}from"crypto";function p$(A){let _=`${A.provider}:${A.model}:${A.dimensions}`;return mK("sha256").update(_).digest("hex").slice(0,16)}class n${repository;provider;batchSize;maxBatchBytes;modelHash;modelName;redactor;constructor(A){this.repository=A.repository,this.provider=A.provider,this.batchSize=A.config.batchSize,this.maxBatchBytes=Math.max(1,A.config.maxBatchBytes??nZ),this.modelHash=p$(A.config),this.modelName=A.config.model,this.redactor=A.redactor??iZ}checkModelState(){let A=this.repository.getStoredModelHash(),_=this.modelHash,G=this.modelName;if(A===null)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};if(A===_)return{modelChanged:!1,needsReEmbed:!1,currentHash:_,currentModelName:G};let $=this.repository.getStoredModelName()??A;return{modelChanged:!0,needsReEmbed:!0,storedHash:A,currentHash:_,storedModelName:$,currentModelName:G,embeddedCount:this.repository.getEmbeddedCount()}}async embedUnembedded(A={}){let _=Date.now(),G=0,$=0,K=Math.max(0,this.repository.getTotalMessageCount()-this.repository.getEmbeddedCount()-this.getSkippedCountForCurrentModel());if(K<=0)return{embedded:0,skipped:0,durationMs:0,rate:0};let Z=this.repository.findUnembedded(this.batchSize,this.modelHash);while(Z.length>0){let H=this.prepareBatch(Z),Q=this.chunkByPayloadBytes(H);for(let X of Q){let V=await this.embedChunk(X);G+=V.embedded,$+=V.skipped,A.onProgress?.({current:Math.min(G+$,K),total:K})}Z=this.repository.findUnembedded(this.batchSize,this.modelHash)}let Y=Date.now()-_,J=Y>0?G/(Y/1000):0;return{embedded:G,skipped:$,durationMs:Y,rate:J}}async clearAndReembed(A={}){return this.repository.clearAllEmbeddings(),this.embedUnembedded(A)}prepareBatch(A){return A.map((_)=>({rowid:_.rowid,rawContent:_.content,text:this.redactor.redactText(_.content).text}))}chunkByPayloadBytes(A){let _=[],G=[];for(let $ of A){let K=[...G,$];if(G.length>0&&this.estimatePayloadBytes(K)>this.maxBatchBytes){_.push(G),G=[$];continue}G=K}if(G.length>0)_.push(G);return _}estimatePayloadBytes(A){return uK.byteLength(JSON.stringify({model:this.modelName,input:A.map((_)=>_.text)}),"utf8")}async embedChunk(A){try{let _=await this.provider.embedBatch(A.map(($)=>$.text)),G=A.map(($,K)=>({rowid:$.rowid,embedding:_[K].embedding}));return this.repository.storeBatch(G,this.modelHash,this.modelName),{embedded:A.length,skipped:0}}catch(_){if(!bG(_,"payload_too_large"))throw _;if(A.length>1){let G=Math.ceil(A.length/2),$=await this.embedChunk(A.slice(0,G)),K=await this.embedChunk(A.slice(G));return{embedded:$.embedded+K.embedded,skipped:$.skipped+K.skipped}}return this.markPayloadTooLargeSkip(A[0]),{embedded:0,skipped:1}}}markPayloadTooLargeSkip(A){this.repository.markSkipped({messageId:A.rowid,modelHash:this.modelHash,modelName:this.modelName,provider:this.provider.name,reason:"payload_too_large",retryable:!1,contentHash:mK("sha256").update(A.rawContent).digest("hex"),contentBytes:uK.byteLength(A.rawContent,"utf8"),safeError:"Provider payload exceeded request limit for this message and model."})}getSkippedCountForCurrentModel(){return typeof this.repository.getSkippedCount==="function"?this.repository.getSkippedCount(this.modelHash):0}}var nZ=800000,iZ;var i$=U(()=>{l$();iZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})}});function e$(A,_,G){let $=new Map;for(let Z of A){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"fts",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}for(let Z of _){let Y=$.get(Z.rowid)??{rowid:Z.rowid,rrfScore:0,normalizedScore:0,sources:[]};Y.rrfScore+=1/(60+Z.rank),Y.sources.push({source:"vector",rank:Z.rank,rawScore:Z.rawScore}),$.set(Z.rowid,Y)}let K=Array.from($.values()).sort((Z,Y)=>Y.rrfScore-Z.rrfScore);if(K=K.filter((Z)=>Z.rrfScore>=0.001),K=K.slice(0,G),K.length>0){let Z=K[0].rrfScore;if(Z>0)for(let Y of K)Y.normalizedScore=Y.rrfScore/Z}return K}function R0(A){let _=(A.match(/"/g)||[]).length,G=_>0&&_%2===0,$;if(G)$=A.replace(/[.:\-()[\]{}^~@/\\]/gu," ").replace(/\s+/g," ").trim();else $=A.replace(/[.:\-()[\]{}^"~@/\\]/gu," ").replace(/\s+/g," ").trim();if($)return $;let K=(A.match(/"/g)||[]).length,Y=K>0&&K%2===0?/[.:\-()[\]{}^~@/\\]/gu:/[.:\-()[\]{}^"~@/\\]/gu;return A.replace(Y," ").replace(/\s+/g," ").trim()}class F0{_id;_filePath;_fileType;_projectEncoded;_content;_contentHash;_lastIndexedAt;_createdAt;constructor(A){this._id=A.id,this._filePath=A.filePath,this._fileType=A.fileType,this._projectEncoded=A.projectEncoded,this._content=A.content,this._contentHash=A.contentHash,this._lastIndexedAt=new Date(A.lastIndexedAt.getTime()),this._createdAt=A.createdAt?new Date(A.createdAt.getTime()):new Date}static create(A){if(!A.filePath||A.filePath.trim()==="")throw Error("File path cannot be empty");if(!A.content||A.content.trim()==="")throw Error("Content cannot be empty");if(!tZ.test(A.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!pK.includes(A.fileType))throw Error(`Invalid file type: "${A.fileType}". Must be one of: ${pK.join(", ")}`);return new F0(A)}get id(){return this._id}get filePath(){return this._filePath}get fileType(){return this._fileType}get projectEncoded(){return this._projectEncoded}get content(){return this._content}get contentHash(){return this._contentHash}get lastIndexedAt(){return new Date(this._lastIndexedAt.getTime())}get createdAt(){return new Date(this._createdAt.getTime())}}var pK,tZ;var gG=U(()=>{pK=["daily_log","decisions","learnings","user_prefs"],tZ=/^[a-f0-9]{64}$/});class G0{_id;_description;_severity;_category;_status;_tool;_tags;_lastReviewedAt;_context;_sourceProject;_loggedAt;_resolvedAt;_resolution;constructor(A){this._id=A.id,this._description=A.description.trim(),this._severity=A.severity,this._category=A.category,this._status=A.status,this._tool=A.tool,this._tags=A.tags?[...A.tags]:void 0,this._lastReviewedAt=A.lastReviewedAt?new Date(A.lastReviewedAt.getTime()):void 0,this._context=A.context,this._sourceProject=A.sourceProject,this._loggedAt=new Date(A.loggedAt.getTime()),this._resolvedAt=A.resolvedAt?new Date(A.resolvedAt.getTime()):void 0,this._resolution=A.resolution}static create(A){if(!A.description||A.description.trim()==="")throw Error("Description cannot be empty");if(!nK.includes(A.severity))throw Error(`Invalid severity: "${A.severity}". Must be one of: ${nK.join(", ")}`);if(!A.category||A.category.trim()==="")throw Error("Category cannot be empty");if(!iK.includes(A.status))throw Error(`Invalid status: "${A.status}". Must be one of: ${iK.join(", ")}`);if(!A.tool||A.tool.trim()==="")throw Error("Tool cannot be empty");if(A.status==="open"&&A.resolvedAt)throw Error("Open entries cannot have a resolvedAt date");return new G0(A)}get id(){return this._id}get description(){return this._description}get severity(){return this._severity}get category(){return this._category}get status(){return this._status}get tool(){return this._tool}get tags(){return this._tags?[...this._tags]:void 0}get lastReviewedAt(){return this._lastReviewedAt?new Date(this._lastReviewedAt.getTime()):void 0}get context(){return this._context}get sourceProject(){return this._sourceProject}get loggedAt(){return new Date(this._loggedAt.getTime())}get resolvedAt(){return this._resolvedAt?new Date(this._resolvedAt.getTime()):void 0}get resolution(){return this._resolution}}var nK,iK;var uG=U(()=>{nK=["low","medium","high","critical"],iK=["open","resolved","wont-fix"]});class $0{_sessionId;_backfilledAt;_dailyLogPath;_success;_errorMessage;constructor(A){this._sessionId=A.sessionId,this._backfilledAt=new Date(A.backfilledAt.getTime()),this._dailyLogPath=A.dailyLogPath,this._success=A.success??!0,this._errorMessage=A.errorMessage}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.dailyLogPath||A.dailyLogPath.trim()==="")throw Error("Daily log path cannot be empty");return new $0(A)}get sessionId(){return this._sessionId}get backfilledAt(){return new Date(this._backfilledAt.getTime())}get dailyLogPath(){return this._dailyLogPath}get success(){return this._success}get errorMessage(){return this._errorMessage}get isSuccess(){return this._success}}var aK={};k(aK,{BackfillService:()=>s$});class s${sessionRepo;messageRepo;backfillStateRepo;summaryGenerator;dailyLogWriter;constructor(A,_,G,$,K){this.sessionRepo=A;this.messageRepo=_;this.backfillStateRepo=G;this.summaryGenerator=$;this.dailyLogWriter=K}async dryRun(A={}){let _=await this.getUnprocessedSessions(A.project);return{unprocessedCount:_.length,estimatedCost:_.length*_Y}}async backfill(A={}){let{batch:_=50,project:G,onProgress:$}=A,Z=(await this.getUnprocessedSessions(G)).slice(0,_),Y={sessionsProcessed:0,sessionsFailed:0,sessionsSkipped:0,dailyLogsCreated:0,dailyLogsUpdated:0,errors:[]};for(let J=0;J<Z.length;J++){let H=Z[J];if(!H)continue;if(await this.backfillStateRepo.findBySessionId(H.id)){Y.sessionsSkipped++,$?.({current:J+1,total:Z.length,sessionId:H.id,action:"skipped"});continue}try{$?.({current:J+1,total:Z.length,sessionId:H.id,action:"processing"});let X=await this.extractContent(H.id),V=H.projectPath.decoded,B=V.split(/[/\\]/).filter(Boolean).pop()??V,W=await this.summaryGenerator.generateSummary(X,H.id,B,H.startTime.toISOString(),H.endTime?.toISOString()??H.startTime.toISOString()),z=`daily/${H.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(z,W+`
|
|
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 o$=()=>{};function A5(A,_,G=4){if(_<=0){let Q=A.map((V)=>({...V,truncatedContent:V.content,allocated:V.content.length===0?0:Math.ceil(V.content.length/G),truncated:!1})),X=Q.reduce((V,B)=>V+B.allocated,0);return{sections:Q,totalTokensUsed:X,budgetExceeded:!1}}let $=_*G,K=[...A].sort((Q,X)=>Q.priority-X.priority),Z=$,Y=[],J=!1;for(let Q of K){if(Q.content.length===0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!1});continue}if(Z<=0){Y.push({...Q,truncatedContent:"",allocated:0,truncated:!0}),J=!0;continue}let X=Q.content.length;if(X<=Z){let V=Math.ceil(X/G);Y.push({...Q,truncatedContent:Q.content,allocated:V,truncated:!1}),Z-=X}else{let V=Q.content.slice(0,Z),B=Math.ceil(Z/G);Y.push({...Q,truncatedContent:V,allocated:B,truncated:!0}),Z=0,J=!0}}let H=Y.reduce((Q,X)=>Q+X.allocated,0);return{sections:Y,totalTokensUsed:H,budgetExceeded:J}}var tK={};k(tK,{candidateFromPersonaEntry:()=>pG,candidateFromGraphEdge:()=>nG,candidateFromFact:()=>lG,MemoryRankingService:()=>a_});class a_{now;policy;constructor(A={}){this.now=A.now??(()=>new Date),this.policy={defaultHalfLifeDays:A.policy?.defaultHalfLifeDays??90,halfLifeByKind:{...KY,...A.policy?.halfLifeByKind??{}},halfLifeByFactType:{...ZY,...A.policy?.halfLifeByFactType??{}},halfLifeByPersonaKind:{...YY,...A.policy?.halfLifeByPersonaKind??{}}}}rank(A){let _=this.now();return A.filter((G)=>this.isEligible(G,_)).map((G)=>this.scoreCandidate(G,_)).sort((G,$)=>{if($.score!==G.score)return $.score-G.score;return G.id.localeCompare($.id)})}isEligible(A,_){if(!A.id.trim()||!A.content.trim())return!1;if(A.supersededAt)return!1;if(A.governanceStatus&&$Y.has(A.governanceStatus))return!1;if(A.validFrom&&A.validFrom>_)return!1;if(A.validTo&&A.validTo<=_)return!1;return!0}scoreCandidate(A,_){let G=A.metric,$=S0(G?.importanceScore??A.importance??HY(A)),K=S0(G?.utilityScore??A.utility??0.5),Z=S0(A.confidence??QY(G)),Y=Math.max(0,G?.accessCount??0),J=S0(Math.log1p(Y)/Math.log(16)),H=G?.evergreen===!0||A.evergreen===!0,Q=G?.pinned===!0||A.pinned===!0,X=G?.halfLifeDays??this.resolveHalfLifeDays(A),V=A.observedAt??A.validFrom??G?.lastAccessedAt??_,B=Math.max(0,(_.getTime()-V.getTime())/86400000),W=H||Q?1:Math.pow(0.5,B/X),N=S0(A.recencyNoisePenalty??0),z=S0(0.34*$+0.26*K+0.18*Z+0.12*J+(H?0.06:0)+(Q?0.08:0)),q=S0(z*W-N),I={importance:$,utility:K,confidence:Z,accessBoost:J,accessCount:Y,halfLifeDays:X,ageDays:B,decayMultiplier:W,recencyNoisePenalty:N,baseScore:z,finalScore:q};return{...A,evergreen:H,pinned:Q,score:q,whyIncluded:JY(A,I,H,Q),components:I}}resolveHalfLifeDays(A){if(A.kind==="fact"&&XY(A.memoryType))return this.policy.halfLifeByFactType[A.memoryType]??this.policy.defaultHalfLifeDays;if(A.kind==="persona"&&VY(A.memoryType))return this.policy.halfLifeByPersonaKind[A.memoryType]??this.policy.defaultHalfLifeDays;return this.policy.halfLifeByKind[A.kind]??this.policy.defaultHalfLifeDays}}function lG(A,_){let G=A.metadata??{};return{id:A.uuid,kind:"fact",memoryType:A.type,content:A.content,project:A.project,observedAt:A.observedAt,supersededAt:A.supersededAt,confidence:E0(G.confidence),importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function pG(A,_){return{id:A.entryId,kind:"persona",memoryType:A.kind,content:A.content,project:A.project,observedAt:A.updatedAt,validTo:A.expiresAt,confidence:A.confidence,metric:_}}function nG(A,_){let G=A.metadata??{};return{id:A.edgeId,kind:"graph",memoryType:A.relationship,content:`${A.source.label} --${A.relationship}--> ${A.target.label}`,project:A.project,observedAt:A.validFrom,validFrom:A.validFrom,validTo:A.validTo,confidence:A.confidence,importance:E0(G.importance),utility:E0(G.utility),evergreen:dG(G.evergreen),pinned:dG(G.pinned),recencyNoisePenalty:E0(G.recencyNoisePenalty),governanceStatus:rK(G.governanceStatus),metric:_}}function JY(A,_,G,$){return["active",`kind=${A.kind}`,A.memoryType?`type=${A.memoryType}`:null,`importance=${i_(_.importance)}`,`utility=${i_(_.utility)}`,`confidence=${i_(_.confidence)}`,`access_count=${_.accessCount}`,`decay=${i_(_.decayMultiplier)}`,G?"evergreen":null,$?"pinned":null,`score=${i_(_.finalScore)}`].filter((Z)=>Z!==null).join("; ")}function HY(A){if(A.kind==="persona"||A.kind==="graph")return 0.65;if(A.kind==="fact")switch(A.memoryType){case"decision":case"preference":case"supersedence":return 0.7;case"learning":return 0.6;case"friction":return 0.55;case"observation":return 0.35;default:return 0.5}return 0.5}function QY(A){return A?Math.max(A.importanceScore,A.utilityScore,0.5):0.8}function S0(A){if(!Number.isFinite(A))return 0;return Math.min(1,Math.max(0,A))}function i_(A){return A.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function E0(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function dG(A){return typeof A==="boolean"?A:void 0}function rK(A){if(A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired")return A;return}function XY(A){return A==="decision"||A==="learning"||A==="preference"||A==="friction"||A==="observation"||A==="supersedence"}function VY(A){return A==="preference"||A==="procedure"||A==="correction"||A==="decision_pattern"||A==="friction_pattern"}var $Y,KY,ZY,YY;var r_=U(()=>{$Y=new Set(["pending_review","suppressed","invalidated","expired"]),KY={fact:90,persona:180,graph:120,link:60,dream:30},ZY={decision:365,learning:180,preference:365,friction:45,observation:14,supersedence:365},YY={preference:365,procedure:365,correction:240,decision_pattern:180,friction_pattern:120}});var sK={};k(sK,{SmartContextService:()=>t_});function WY(A){if(A.length===0)return 0;return Math.ceil(A.length/BY)}function zY(A){return`#${A.id} (${A.severity}/${A.category}): ${A.description}`}function NY(A,_){return`- ${A.content}${qY(_)}`}function LY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.content}`,`(confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}; review: ${A.reviewStatus} after ${A.reviewAfter.toISOString()}${eK(_)})`].join(" ")}function MY(A,_){let G=A.visibility==="global"?"global":A.project??A.visibility;return[`- ${A.source.label} --${A.relationship}--> ${A.target.label}`,`(id: ${A.edgeId}; confidence: ${A.confidence.toFixed(2)}; scope: ${G}; why: ${A.why}${eK(_)})`].join(" ")}function qY(A){return A?` (rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded})`:""}function eK(A){return A?`; rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded}`:""}class t_{projectResolver;factRepo;frictionRepo;personaRepo;graphRepo;governancePolicy;rankingService;utilityRepo;getSessionSummary;now;constructor(A){if(this.projectResolver=A.projectResolver,this.factRepo=A.factRepo,this.frictionRepo=A.frictionRepo,this.personaRepo=A.personaRepo,this.graphRepo=A.graphRepo,this.governancePolicy=A.governancePolicy,this.rankingService=A.rankingService,this.utilityRepo=A.utilityRepo,this.now=A.now??(()=>new Date),A.getSessionSummary)this.getSessionSummary=A.getSessionSummary}async getContext(A){let _=this.projectResolver.resolveProjectEncoded(A.projectFilter),G=this.projectResolver.resolveProjectName(A.projectFilter);if(!_||!G)return null;let $=await this.factRepo.findByProject(G),K=await this.filterAllowedFacts($.filter((z)=>z.supersededAt===null)),Z=async(z)=>{return(await this.rankFacts(z)).map(({item:I,rank:T})=>NY(I,T)).join(`
|
|
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 A1=U(()=>{D0();e_()});import{createHash as hY}from"crypto";class Y0{_id;_edgeId;_source;_target;_relationship;_project;_visibility;_sourceEventIds;_sourceKinds;_confidence;_validFrom;_validTo;_why;_metadata;_createdAt;_updatedAt;constructor(A){this._id=A.id,this._source=G1(A.source),this._target=G1(A.target),this._relationship=A.relationship.trim(),this._project=A.project?.trim()||void 0,this._visibility=A.visibility,this._sourceEventIds=[...A.sourceEventIds],this._sourceKinds=[...A.sourceKinds],this._confidence=A.confidence,this._validFrom=new Date(A.validFrom.getTime()),this._validTo=A.validTo?new Date(A.validTo.getTime()):null,this._why=A.why.trim(),this._metadata=A.metadata?V6(A.metadata):void 0,this._createdAt=new Date(A.createdAt.getTime()),this._updatedAt=new Date(A.updatedAt.getTime()),this._edgeId=A.edgeId?.trim()||CY(this)}static create(A){if(X6(A.source,"source"),X6(A.target,"target"),bY(A.relationship),fY(A.visibility),A.visibility==="project"&&(!A.project||!A.project.trim()))throw Error("project is required for project-visible graph edges");if(!Array.isArray(A.sourceEventIds)||A.sourceEventIds.length===0)throw Error("Graph edge sourceEventIds must include at least one source id");if(!Array.isArray(A.sourceKinds)||A.sourceKinds.length===0)throw Error("Graph edge sourceKinds must include at least one source kind");if(!Number.isFinite(A.confidence)||A.confidence<0||A.confidence>1)throw Error("Graph edge confidence must be between 0 and 1");if(!_1(A.validFrom))throw Error("Graph edge validFrom must be a valid date");if(A.validTo!==void 0&&A.validTo!==null&&!_1(A.validTo))throw Error("Graph edge validTo must be a valid date");if(A.validTo&&A.validTo<=A.validFrom)throw Error("Graph edge validTo must be after validFrom");if(!A.why||!A.why.trim())throw Error("Graph edge why is required");if(!_1(A.createdAt)||!_1(A.updatedAt))throw Error("Graph edge timestamps must be valid dates");return new Y0(A)}get id(){return this._id}get edgeId(){return this._edgeId}get source(){return G1(this._source)}get target(){return G1(this._target)}get relationship(){return this._relationship}get project(){return this._project}get visibility(){return this._visibility}get sourceEventIds(){return[...this._sourceEventIds]}get sourceKinds(){return[...this._sourceKinds]}get confidence(){return this._confidence}get validFrom(){return new Date(this._validFrom.getTime())}get validTo(){return this._validTo?new Date(this._validTo.getTime()):null}get why(){return this._why}get metadata(){return this._metadata?V6(this._metadata):void 0}get createdAt(){return new Date(this._createdAt.getTime())}get updatedAt(){return new Date(this._updatedAt.getTime())}get scope(){return this._visibility==="project"?{project:this._project,visibility:"project"}:{visibility:this._visibility}}get controls(){return[...wY]}isCurrent(A,_=0.7){return this._validFrom<=A&&(!this._validTo||this._validTo>A)&&this._confidence>=_}withId(A){return Y0.create({id:A,edgeId:this._edgeId,source:this._source,target:this._target,relationship:this._relationship,project:this._project,visibility:this._visibility,sourceEventIds:this._sourceEventIds,sourceKinds:this._sourceKinds,confidence:this._confidence,validFrom:this._validFrom,validTo:this._validTo,why:this._why,metadata:this._metadata,createdAt:this._createdAt,updatedAt:this._updatedAt})}toJSON(){return{...this._id!==void 0?{id:this._id}:{},edge_id:this._edgeId,source:this.source,target:this.target,relationship:this._relationship,...this._project!==void 0?{project:this._project}:{},visibility:this._visibility,source_event_ids:this.sourceEventIds,source_kinds:this.sourceKinds,confidence:this._confidence,valid_from:this._validFrom.toISOString(),valid_to:this._validTo?this._validTo.toISOString():null,why:this._why,scope:this.scope,...this._metadata!==void 0?{metadata:this.metadata}:{},controls:this.controls,created_at:this._createdAt.toISOString(),updated_at:this._updatedAt.toISOString()}}}function CY(A){let _=[A.source.type,A.source.id,A.relationship,A.target.type,A.target.id,A.project??"",A.visibility].join("|");return`graph-${hY("sha256").update(_).digest("hex").slice(0,16)}`}function X6(A,_){if(!$1.includes(A.type))throw Error(`Invalid graph node type: ${A.type}`);if(!A.id||!A.id.trim())throw Error(`Graph edge ${_}.id is required`);if(!A.label||!A.label.trim())throw Error(`Graph edge ${_}.label is required`)}function bY(A){if(!A||!vY.test(A.trim()))throw Error(`Invalid graph relationship: ${A}`)}function fY(A){if(A!=="project"&&A!=="workspace"&&A!=="global")throw Error(`Invalid graph visibility: ${A}`)}function _1(A){return A instanceof Date&&!Number.isNaN(A.getTime())}function G1(A){return{type:A.type,id:A.id,label:A.label}}function V6(A){return JSON.parse(JSON.stringify(A))}var $1,vY,wY;var K1=U(()=>{$1=["project","tool","person","decision","error","plan","file","command","capability"],vY=/^[a-z][a-z0-9_-]*(?:[.:][a-z0-9_-]+)*$/,wY=["suppress","invalidate","expire","review"]});function Z5(A,_=new Date){let G=A.metadata??{},$=gY(G.graph_edges??G.graphEdges??G.relationships),K=[];for(let Z of $)try{let Y=cY(Z.visibility)??"project",J=B6(Z.source,K5(Z.sourceType??Z.source_type),"project"),H=B6(Z.target,K5(Z.targetType??Z.target_type),"tool"),Q=uY(Z.validFrom??Z.valid_from,A.observedAt),X=N6(Z.validTo??Z.valid_to),V=W6(Z.confidence,W6(G.confidence,0.75)),B=gA(Z.relationship,""),W=gA(Z.project,A.project),N=z6(Z.sourceKinds??Z.source_kinds,[dY(A,G)]),z=z6(Z.sourceEventIds??Z.source_event_ids,[]),q=lY([A.uuid,...z]),I=gA(Z.why,`Derived from an active ${A.type} fact.`);K.push(Y0.create({edgeId:gA(Z.id??Z.edgeId??Z.edge_id,void 0),source:J,target:H,relationship:B,project:Y==="project"?W:void 0,visibility:Y,sourceEventIds:q,sourceKinds:N,confidence:V,validFrom:Q,validTo:X,why:I,metadata:mY(Z.metadata),createdAt:_,updatedAt:_}))}catch{}return K}function Y5(A,_){return GA.create({surface:"graph",targetId:A.edgeId,project:A.project,visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:_,actor:"memory",confidence:A.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:A.scope,status:"active",createdAt:A.createdAt,updatedAt:A.updatedAt,lastEventId:A.sourceEventIds[0]})}function gY(A){if(!Array.isArray(A))return[];return A.filter(J5)}function B6(A,_,G){if(J5(A)){let K=K5(A.type)??_??G,Z=gA(A.id,gA(A.label,"")),Y=gA(A.label,Z);return{type:K,id:Z,label:Y}}let $=gA(A,"");return{type:_??G,id:$,label:$}}function K5(A){return typeof A==="string"&&$1.includes(A)?A:void 0}function cY(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function gA(A,_){return typeof A==="string"&&A.trim()?A.trim():_}function W6(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function uY(A,_){return N6(A)??_}function N6(A){if(A===void 0||A===null||A==="")return null;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?null:_}function z6(A,_){if(!Array.isArray(A))return _;let G=A.map(($)=>String($)).filter(($)=>$.trim().length>0);return G.length>0?G:_}function mY(A){return J5(A)?JSON.parse(JSON.stringify(A)):void 0}function dY(A,_){return gA(_.source_kind,A.type)}function lY(A){return[...new Set(A.filter((_)=>_.trim().length>0))]}function J5(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var H5=U(()=>{K1();D0()});import{createHash as pY,randomUUID as nY}from"crypto";class BA{record;constructor(A){this.record=OA(A)}static create(A){let _=eY(A);L6(_);let G=J1(Y1(_.payload)),$={..._,integrity:{algorithm:"sha256",payloadHash:G}},K=J1(Y1($));return new BA({..._,integrity:{algorithm:"sha256",payloadHash:G,envelopeHash:K}})}static fromJSON(A){let _=sY(A);return L6(_),A7(_),new BA(_)}get schemaVersion(){return this.record.schemaVersion}get eventId(){return this.record.eventId}get machineId(){return this.record.machineId}get sequence(){return this.record.sequence}get kind(){return this.record.kind}get operation(){return this.record.operation}get occurredAt(){return new Date(this.record.occurredAt)}get observedAt(){return new Date(this.record.observedAt)}get scope(){return OA(this.record.scope)}get provenance(){return OA(this.record.provenance)}get privacy(){return OA(this.record.privacy)}get consent(){return OA(this.record.consent)}get causality(){return OA(this.record.causality)}get payload(){return OA(this.record.payload)}get integrity(){return OA(this.record.integrity)}toJSON(){return OA(this.record)}}function eY(A){return{schemaVersion:X5,eventId:A.eventId??nY(),machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:q6("occurredAt",A.occurredAt),observedAt:q6("observedAt",A.observedAt),scope:OA(A.scope),provenance:U6(A.provenance),privacy:T6(A.privacy),consent:I6(A.consent),causality:O6(A.causality),payload:OA(A.payload)}}function sY(A){if(!yA(A))throw Error("Memory event record must be an object");let _=A;if(!_.integrity)throw Error("Memory event integrity is required");return{schemaVersion:_.schemaVersion,eventId:String(_.eventId??""),machineId:String(_.machineId??""),sequence:Number(_.sequence),kind:_.kind,operation:_.operation,occurredAt:String(_.occurredAt??""),observedAt:String(_.observedAt??""),scope:yA(_.scope)?oY(_.scope):_.scope,provenance:U6(_.provenance),privacy:T6(_.privacy),consent:I6(_.consent),causality:O6(_.causality),payload:_.payload,integrity:{algorithm:_.integrity.algorithm,payloadHash:String(_.integrity.payloadHash??""),envelopeHash:String(_.integrity.envelopeHash??"")}}}function U6(A){let _=yA(A)?A:{};return{source:String(_.source??""),actor:String(_.actor??""),method:String(_.method??""),sourceIds:__(_.sourceIds)}}function oY(A){let _=yA(A)?A:{};return{project:typeof _.project==="string"?_.project:void 0,workspace:typeof _.workspace==="string"?_.workspace:void 0,visibility:_.visibility}}function T6(A){let _=yA(A)?A:{};return{redactionState:_.redactionState,containsSensitiveContent:_.containsSensitiveContent,policy:typeof _.policy==="string"?_.policy:void 0,redactedFields:Y7(_.redactedFields)}}function I6(A){let _=yA(A)?A:{};return{status:_.status,scopes:__(_.scopes),grantedAt:M6(_.grantedAt),expiresAt:M6(_.expiresAt)}}function O6(A){if(!yA(A))return{parentEventIds:void 0,supersedesEventIds:void 0,relatedEventIds:void 0};let _=A;return{parentEventIds:__(_.parentEventIds),supersedesEventIds:__(_.supersedesEventIds),relatedEventIds:__(_.relatedEventIds)}}function L6(A){if(A.schemaVersion!==X5)throw Error("schemaVersion must be 2");if(!A.eventId||A.eventId.trim()==="")throw Error("eventId is required");if(!A.machineId||A.machineId.trim()==="")throw Error("machineId is required");if(!Number.isSafeInteger(A.sequence)||A.sequence<=0)throw Error("sequence must be a positive safe integer");if(!A.kind||String(A.kind).trim()==="")throw Error("kind is required");if(!iY.includes(A.operation))throw Error("operation is invalid");if(Z1("occurredAt",A.occurredAt),Z1("observedAt",A.observedAt),G7(A.scope),$7(A.provenance),K7(A.privacy),Z7(A.consent),G_("causality.parentEventIds",A.causality.parentEventIds),G_("causality.supersedesEventIds",A.causality.supersedesEventIds),G_("causality.relatedEventIds",A.causality.relatedEventIds),!yA(A.payload))throw Error("payload must be an object")}function A7(A){if(A.integrity.algorithm!=="sha256")throw Error("integrity.algorithm must be sha256");let _=J1(Y1(A.payload));if(A.integrity.payloadHash!==_)throw Error("payload integrity mismatch");let G=J1(Y1({..._7(A),integrity:{algorithm:"sha256",payloadHash:A.integrity.payloadHash}}));if(A.integrity.envelopeHash!==G)throw Error("envelope integrity mismatch")}function _7(A){return{schemaVersion:A.schemaVersion,eventId:A.eventId,machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:A.occurredAt,observedAt:A.observedAt,scope:A.scope,provenance:A.provenance,privacy:A.privacy,consent:A.consent,causality:A.causality,payload:A.payload}}function G7(A){if(!yA(A))throw Error("scope is required");if(!aY.includes(A.visibility))throw Error("scope.visibility is invalid");if(A.visibility==="project"&&(!A.project||A.project.trim()===""))throw Error("scope.project is required for project visibility")}function $7(A){if(!A.source||A.source.trim()==="")throw Error("provenance.source is required");if(!A.actor||A.actor.trim()==="")throw Error("provenance.actor is required");if(!A.method||A.method.trim()==="")throw Error("provenance.method is required");G_("provenance.sourceIds",A.sourceIds??[])}function K7(A){if(!rY.includes(A.redactionState))throw Error("privacy.redactionState is invalid");if(typeof A.containsSensitiveContent!=="boolean")throw Error("privacy.containsSensitiveContent must be boolean");G_("privacy.redactedFields",A.redactedFields??[])}function Z7(A){if(!tY.includes(A.status))throw Error("consent.status is invalid");if(G_("consent.scopes",A.scopes),A.grantedAt!==void 0)Z1("consent.grantedAt",String(A.grantedAt));if(A.expiresAt!==void 0)Z1("consent.expiresAt",String(A.expiresAt))}function Z1(A,_){if(!_||Number.isNaN(new Date(_).getTime()))throw Error(`${A} must be a valid date`)}function __(A){if(!Array.isArray(A))return[];return A.map((_)=>String(_))}function Y7(A){if(A===void 0)return;return __(A)}function M6(A){if(A===void 0)return;return A instanceof Date?A.toISOString():String(A)}function q6(A,_){if(!(_ instanceof Date)||Number.isNaN(_.getTime()))throw Error(`${A} must be a valid date`);return _.toISOString()}function G_(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`${A} must be a string array`)}function Y1(A){return JSON.stringify(Q5(A))}function Q5(A){if(A instanceof Date)return A.toISOString();if(Array.isArray(A))return A.map(Q5);if(!yA(A))return A;let _={};for(let G of Object.keys(A).sort())_[G]=Q5(A[G]);return _}function J1(A){return pY("sha256").update(A).digest("hex")}function OA(A){if(A===void 0)return A;return JSON.parse(JSON.stringify(A))}function yA(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var X5=2,iY,aY,rY,tY;var s_=U(()=>{iY=["add","update","delete","supersede","noop","migrate"],aY=["project","workspace","global"],rY=["none","redacted","quarantined"],tY=["not_required","granted","denied","revoked"]});var j6={};k(j6,{MemoryGovernanceService:()=>cA});class cA{repository;writeEvent;machineId;now;nextSequence;constructor(A){this.repository=A.repository,this.writeEvent=A.writeEvent,this.machineId=A.machineId&&A.machineId.trim()?A.machineId:"local",this.now=A.now??(()=>new Date),this.nextSequence=A.nextSequence??(()=>Math.max(1,Date.now()))}async registerDerivedMemory(A){let _=this.now(),G=this.createEvent({control:"register",surface:A.surface,targetId:A.targetId,actor:A.actor??"memory",reason:void 0,occurredAt:_,project:A.project,visibility:A.visibility??(A.project?"project":"global"),sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,confidence:A.confidence??1,redactionState:A.redactionState??"none",consentStatus:A.consentStatus??"not_required",consentScopes:A.consentScopes??[],expiresAt:A.expiresAt});await this.persistEvent(G);let $=await this.repository.applyMemoryEvent(G);if(!$)throw Error("Governance registration did not produce a projection entry");return $}async suppress(A){return this.applyControl("suppress",A)}async unsuppress(A){return this.applyControl("unsuppress",A)}async invalidate(A){return this.applyControl("invalidate",A)}async expire(A){return this.applyControl("expire",{...A,expiresAt:A.expiresAt??this.now()})}async review(A){return this.applyControl("review",A)}async grantConsent(A){return this.applyControl("consent_grant",{...A,consentStatus:"granted"})}async revokeConsent(A){return this.applyControl("consent_revoke",{...A,consentStatus:"revoked"})}async list(A){return this.repository.findAll(A)}async show(A,_){return this.repository.findByTarget(A,_)}async isAllowed(A,_){let G=await this.repository.findByTarget(A,_);return G?!G.isBlocked(this.now()):!0}async filterAllowed(A,_,G){if(_.length===0)return _;let $=await this.repository.findByTargetIds(A,_.map(G)),K=new Set($.filter((Z)=>Z.isBlocked(this.now())).map((Z)=>Z.targetId));return _.filter((Z)=>!K.has(G(Z)))}async applyControl(A,_){let G=this.now(),$=await this.repository.findByTarget(_.surface,_.targetId),K=this.createEvent({control:A,surface:_.surface,targetId:_.targetId,actor:_.actor??"user",reason:_.reason,occurredAt:G,project:$?.project,visibility:$?.visibility??($?.project?"project":"global"),sourceEventIds:$?.sourceEventIds??[_.targetId],transformationMethod:$?.transformationMethod??`governance.${A}`,confidence:$?.confidence??1,redactionState:$?.redactionState??"none",consentStatus:_.consentStatus??$?.consentStatus??"not_required",consentScopes:_.consentScopes??$?.consentScopes??[],expiresAt:_.expiresAt??$?.expiresAt??null});await this.persistEvent(K);let Z=await this.repository.applyMemoryEvent(K);if(!Z)throw Error(`Governance ${A} did not produce a projection entry`);return Z}createEvent(A){return BA.create({machineId:this.machineId,sequence:this.nextSequence(),kind:A.control==="consent_grant"||A.control==="consent_revoke"?"consent":"governance",operation:A.control==="register"?"add":"update",occurredAt:A.occurredAt,observedAt:A.occurredAt,scope:{...A.project?{project:A.project}:{},visibility:A.visibility},provenance:{source:"memory-governance",actor:A.actor,method:`governance.${A.control}`,sourceIds:A.sourceEventIds},privacy:{redactionState:A.redactionState,containsSensitiveContent:A.redactionState!=="none"},consent:{status:A.consentStatus,scopes:A.consentScopes,...A.expiresAt?{expiresAt:A.expiresAt}:{}},causality:{parentEventIds:A.sourceEventIds,supersedesEventIds:[],relatedEventIds:[A.targetId]},payload:{governance:{control:A.control,surface:A.surface,targetId:A.targetId,...A.project?{project:A.project}:{},visibility:A.visibility,sourceEventIds:A.sourceEventIds,transformationMethod:A.transformationMethod,actor:A.actor,confidence:A.confidence,redactionState:A.redactionState,consentStatus:A.consentStatus,consentScopes:A.consentScopes,status:"active",...A.reason?{reason:A.reason}:{},...A.expiresAt?{expiresAt:A.expiresAt.toISOString()}:{}}}})}async persistEvent(A){if(this.writeEvent)await this.writeEvent(A)}}var $_=U(()=>{s_()});var F6={};k(F6,{validateRemoteRepositoryUrl:()=>K_,validateRemoteRef:()=>H1,validateMachineIdentity:()=>o_,RemoteEventSyncService:()=>V5});function K_(A,_={}){let G=A.trim();if(!G)return{valid:!1,error:"Remote URL is required"};if(N7(G))return{valid:!1,error:"Remote URL contains control characters"};if(L7(G))return _.allowLocalPathRemote?{valid:!0}:{valid:!1,error:"Local path remotes require explicit allowLocalPathRemote consent"};if(/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:[^\s]+$/.test(G))return{valid:!0};try{let $=new URL(G);if($.protocol==="https:"||$.protocol==="ssh:")return{valid:!0};return{valid:!1,error:"Remote URL protocol is not supported"}}catch{return{valid:!1,error:"Remote URL is not a supported Git remote"}}}function H1(A){let _=A.trim();if(!_)return{valid:!1,error:"Remote ref is required"};if(Q7.test(_))return{valid:!1,error:"Remote ref contains unsafe characters"};if(_.startsWith("/")||_.endsWith("/")||_.startsWith(".")||_.includes("..")||_.includes("//")||_.endsWith(".")||_.endsWith(".lock"))return{valid:!1,error:"Remote ref is not a valid branch name"};return{valid:!0}}function o_(A){let _=A.trim();if(!_)return{valid:!1,error:"Machine identity is required"};if(_==="local"||_==="legacy")return{valid:!1,error:"Machine identity must come from durable config, not a fallback value"};if(!X7.test(_))return{valid:!1,error:"Machine identity contains unsafe characters"};if(_.length>128)return{valid:!1,error:"Machine identity is too long"};return{valid:!0}}class V5{transport;privacyPreflight;projectionRebuilder;now;constructor(A){this.transport=A.transport,this.privacyPreflight=A.privacyPreflight,this.projectionRebuilder=A.projectionRebuilder,this.now=A.now??(()=>new Date)}async sync(A){let _=A.remoteName??J7,G=A.branch??H7,$=A.autoPull??!0,K=A.autoPush??!0,Z=!1,Y=!1,J=!1,H=!1;try{let Q=V7(A,G,_);if(!Q.valid)return R6(Q.error??"Remote sync request is invalid");let X=await this.privacyPreflight?.audit();if(X&&X.eventLogFindings>0)return R6(`Remote synchronization blocked: active event logs contain ${X.eventLogFindings} likely secret finding(s).`);if(!await this.transport.isRepository()){let z=await this.transport.initRepository(B7(A.machineId));if(!z.success)return x0(z.error??"Failed to initialize Git repository in events directory");Z=!0}if(await this.transport.getRemoteUrl()!==A.repositoryUrl.trim()){let z=await this.transport.setRemoteUrl(A.repositoryUrl.trim());if(!z.success)return x0(z.error??"Failed to configure Git remote repository URL",{initializedRepository:Z});Y=!0}let W=await this.transport.listEventLogFingerprints();if(await this.transport.hasEventLog(A.machineId)){let z=await this.transport.commitEventLog(A.machineId,W7(A.machineId,this.now()));if(!z.success)return x0(`Git commit failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y})}if($){let z=await this.transport.fetch(_);if(!z.success)return x0(`Git fetch failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});if(await this.transport.hasRemoteRef(_,G)){let q=await this.transport.pullRebase(_,G);if(!q.success)return await this.transport.abortRebase(),x0(`Git pull failed: ${q.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});J=!0}}if(K){let z=await this.transport.push(_,G);if(!z.success){let q=await this.rebuildIfNeeded(W);return x0(`Git push failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y,pulled:J,rebuildNeeded:q.rebuildNeeded,projectionRebuilt:q.projectionRebuilt})}H=!0}let N=await this.rebuildIfNeeded(W);return{success:!0,status:"synced",rebuildNeeded:N.rebuildNeeded,projectionRebuilt:N.projectionRebuilt,pulled:J,pushed:H,configuredRemote:Y,initializedRepository:Z,error:void 0}}catch(Q){return x0(L(Q),{initializedRepository:Z,configuredRemote:Y,pulled:J,pushed:H})}}async rebuildIfNeeded(A){let _=await this.transport.listEventLogFingerprints(),G=z7(A,_);if(G&&this.projectionRebuilder)return await this.projectionRebuilder.rebuild(),{rebuildNeeded:G,projectionRebuilt:!0};return{rebuildNeeded:G,projectionRebuilt:!1}}}function V7(A,_,G){let $=o_(A.machineId);if(!$.valid)return $;let K=K_(A.repositoryUrl,A.allowLocalPathRemote===void 0?{}:{allowLocalPathRemote:A.allowLocalPathRemote});if(!K.valid)return K;let Z=H1(_);if(!Z.valid)return Z;if(!H1(G).valid)return{valid:!1,error:"Remote name is not valid"};return{valid:!0}}function B7(A){return{machineId:A,userName:"Memory Sync",userEmail:"sync@memory.local"}}function W7(A,_){return`sync: ${A} observed at ${_.toISOString()}`}function R6(A){return{success:!1,status:"blocked",rebuildNeeded:!1,projectionRebuilt:!1,pulled:!1,pushed:!1,configuredRemote:!1,initializedRepository:!1,error:A}}function x0(A,_={}){return{success:!1,status:"failed",rebuildNeeded:_.rebuildNeeded??!1,projectionRebuilt:_.projectionRebuilt??!1,pulled:_.pulled??!1,pushed:_.pushed??!1,configuredRemote:_.configuredRemote??!1,initializedRepository:_.initializedRepository??!1,error:A}}function z7(A,_){let G=Object.keys(A).sort(),$=Object.keys(_).sort();if(G.length!==$.length)return!0;for(let K=0;K<G.length;K+=1){let Z=G[K],Y=$[K];if(Z!==Y||A[Z]!==_[Y])return!0}return!1}function N7(A){return/[\u0000-\u001F\u007F]/.test(A)}function L7(A){return A.startsWith("/")||A.startsWith("./")||A.startsWith("../")||A.startsWith("~")||A.startsWith("file://")||/^[A-Za-z]:[\\/]/.test(A)}var J7="origin",H7="main",Q7,X7;var Q1=U(()=>{Q7=/[\s~^:?*[\]\\;]/,X7=/^[A-Za-z0-9._-]+$/});var E6={};k(E6,{trackDownloadTotal:()=>I7,isUnicodeSupported:()=>S6,getBarCharacters:()=>X1,createProgressReporter:()=>L5,createModelDownloadHandler:()=>O7,createEmbeddingProgressReporter:()=>T7,TtyProgressReporter:()=>W5,TtyEmbeddingProgressReporter:()=>M5,QuietProgressReporter:()=>N5,QuietEmbeddingProgressReporter:()=>U5,PlainProgressReporter:()=>z5,PlainEmbeddingProgressReporter:()=>q5});import B5 from"cli-progress";function S6(){let{env:A}=process;if(process.platform!=="win32")return A.TERM!=="linux";return Boolean(A.MSYSTEM)||Boolean(A.WT_SESSION)||Boolean(A.TERMINUS_SUBLIME)||A.ConEmuTask==="{cmd::Cmder}"||A.TERM_PROGRAM==="vscode"||A.TERM==="xterm-256color"||A.TERM==="alacritty"||A.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function X1(){return S6()?q7:U7}class W5{bar;verbose;total=0;currentValue=0;constructor(A=!1){this.verbose=A;let _=X1();this.bar=new B5.SingleBar({format:"Syncing |{bar}| {percentage}% | {value}/{total} sessions",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0})}start(A){this.total=A,this.currentValue=0,this.bar.start(A,0)}update(A,_){if(this.currentValue=A,this.bar.update(A),this.verbose)this.bar.stop(),console.log(` Processing: ${_}`),this.bar.start(this.total,A)}stop(){this.bar.stop()}log(A){if(this.verbose)this.bar.stop(),console.log(A),this.bar.start(this.total,this.currentValue)}}class z5{verbose;constructor(A=!1){this.verbose=A}start(A){console.log(`Processing ${A} sessions...`)}update(A,_){if(this.verbose)console.log(` [${A}] Processing: ${_}`)}stop(){console.log("Done.")}log(A){if(this.verbose)console.log(A)}}class N5{start(A){}update(A,_){}stop(){}log(A){}}function L5(A){if(A.quiet)return new N5;if(!process.stdout.isTTY)return new z5(A.verbose);return new W5(A.verbose)}class M5{bar;constructor(){let A=X1();this.bar=new B5.SingleBar({format:"Embedding |{bar}| {percentage}% | {value}/{total} messages | ETA: {eta_formatted}",barCompleteChar:A.complete,barIncompleteChar:A.incomplete,hideCursor:!0,etaBuffer:20})}start(A){this.bar.start(A,0)}update(A){this.bar.update(A)}stop(){this.bar.stop()}}class q5{start(A){console.log(`Embedding ${A} messages...`)}update(A){}stop(){console.log("Done.")}}class U5{start(A){}update(A){}stop(){}}function T7(A){if(A.quiet)return new U5;if(!process.stdout.isTTY)return new q5;return new M5}function I7(A,_){let G=Math.round(_/1048576);return G>A?G:A}function O7(A){if(A.quiet||!process.stdout.isTTY){let Z=!1;return(Y)=>{if(!Z&&Y.status==="downloading"&&!A.quiet)console.log("Downloading embedding model (one-time setup)..."),Z=!0}}let _=X1(),G=new B5.SingleBar({format:"Downloading model |{bar}| {percentage}% | {value}/{total} MB",barCompleteChar:_.complete,barIncompleteChar:_.incomplete,hideCursor:!0}),$=!1,K=0;return(Z)=>{if(Z.status==="downloading"){let Y=Math.round(Z.loaded/1048576),J=Math.round(Z.total/1048576);if(J>K)K=J;if(!$&&K>0)G.start(K,Y),$=!0;else if($){if(J>0&&G.getTotal()!==K)G.setTotal(K);G.update(Y)}}else if(Z.status==="ready"&&$)G.stop()}}var q7,U7;var T5=U(()=>{q7={complete:"\u2588",incomplete:"\u2591"},U7={complete:"#",incomplete:"-"}});function AG(A){try{return A.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),A.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function V1(A,_){let{sqliteVecAvailable:G=!1}=_??{};if(!AG(A))throw Error("FTS5 extension is not available. Ensure you are using Bun with FTS5 support enabled.");try{let Z=A.prepare("PRAGMA table_info(friction_log)").all();if(!Z.some((J)=>J.name==="tool")&&Z.length>0)A.exec(`
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
138
|
+
`,C6=`
|
|
137
139
|
CREATE VIRTUAL TABLE IF NOT EXISTS message_embeddings USING vec0(
|
|
138
140
|
embedding float[384]
|
|
139
141
|
);
|
|
140
|
-
`,
|
|
142
|
+
`,b6=`
|
|
141
143
|
ALTER TABLE embedding_state ADD COLUMN model_name TEXT NOT NULL DEFAULT '';
|
|
142
|
-
`,
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
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")}B1(A.lastAccessedAt,"lastAccessedAt"),B1(A.lastRankedAt,"lastRankedAt"),B1(A.createdAt,"createdAt"),B1(A.updatedAt,"updatedAt")}function n6(A,_){if(!Number.isFinite(A)||A<0||A>1)throw Error(`${_} must be between 0 and 1`)}function B1(A,_){if(A!==void 0&&A!==null&&(!(A instanceof Date)||Number.isNaN(A.getTime())))throw Error(`${_} must be a valid Date`)}function J0(A){return new Date(A.getTime())}function i6(A){return JSON.parse(JSON.stringify(A))}var a6,r6;var R5=U(()=>{a6=["fact","persona","graph","link","dream"],r6=["record_access","rank","pin","mark_evergreen"]});var t6=U(()=>{p_();vG();j5();l_();hG();gG();uG();_G();s_();D0();e_();K1();R5()});class kA{_embedding;_model;_dimensions;constructor(A){this._embedding=new Float32Array(A.embedding),this._model=A.model,this._dimensions=A.dimensions}static create(A){if(A.embedding.length===0)throw Error("Embedding cannot be empty");let _=A.model.trim();if(_==="")throw Error("Model cannot be empty");if(A.dimensions!==A.embedding.length)throw Error(`Dimensions (${A.dimensions}) must match embedding length (${A.embedding.length})`);return new kA({embedding:A.embedding,model:_,dimensions:A.dimensions})}get embedding(){return new Float32Array(this._embedding)}get model(){return this._model}get dimensions(){return this._dimensions}equals(A){if(this._model!==A._model)return!1;if(this._dimensions!==A._dimensions)return!1;for(let _=0;_<this._dimensions;_++)if(this._embedding[_]!==A._embedding[_])return!1;return!0}}var e6={};k(e6,{ProjectPath:()=>$A});class $A{_decoded;_encoded;_projectName;constructor(A,_,G){this._decoded=A,this._encoded=_,this._projectName=G??this.extractProjectName(A)}static fromDecoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.encode(A);return new $A(A,_)}static fromEncoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=$A.decode(A);return new $A(_,A)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName(A){return new $A(this._decoded,this._encoded,A)}equals(A){return this._decoded===A._decoded}static encode(A){return A.replace(/:\\/g,"--").replace(/\\/g,"-").replace(/\//g,"-").replace(/ /g,"-")}static decode(A){if(/^([A-Za-z])--/.test(A))return A.replace(/^([A-Za-z])--/,"$1:\\").replace(/-/g,"\\");else return A.replace(/-/g,"/")}extractProjectName(A){let _=A.replace(/[\\/]+$/,"");if(_===""&&A.startsWith("/"))return"";if(/^[A-Za-z]:$/.test(_))return _;let G=_.split(/[\\/]/);return G[G.length-1]||""}}class GG{_value;constructor(A){this._value=A}static from(A){let _=A.trim();if(_==="")throw Error("Query cannot be empty");return new GG(_)}get value(){return this._value}equals(A){return this._value===A._value}}class jA{_sessionId;_messageId;_snippet;_score;_timestamp;_role;_source;_rawScores;constructor(A){this._sessionId=A.sessionId,this._messageId=A.messageId,this._snippet=A.snippet,this._score=A.score,this._timestamp=new Date(A.timestamp.getTime()),this._role=A.role,this._source=A.source,this._rawScores=A.rawScores?{...A.rawScores}:void 0}static create(A){if(!A.sessionId||A.sessionId.trim()==="")throw Error("Session ID cannot be empty");if(!A.messageId||A.messageId.trim()==="")throw Error("Message ID cannot be empty");if(!A.snippet||A.snippet.trim()==="")throw Error("Snippet cannot be empty");if(A.score<0||A.score>1)throw Error("Score must be between 0 and 1");if(!A.role||A.role.trim()==="")throw Error("Role cannot be empty");return new jA(A)}get sessionId(){return this._sessionId}get messageId(){return this._messageId}get snippet(){return this._snippet}get score(){return this._score}get timestamp(){return new Date(this._timestamp.getTime())}get role(){return this._role}get source(){return this._source}get rawScores(){return this._rawScores?{...this._rawScores}:void 0}equals(A){return this._sessionId===A._sessionId&&this._messageId===A._messageId}compareByScore(A){return A._score-this._score}}var F5=()=>{};class H0{static decodeProjectDirectory(A){return $A.fromEncoded(A)}static isEncodedPath(A){if(!A||A.length===0)return!1;if(S7.test(A))return!0;if(E7.test(A))return!0;return!1}static extractProjectName(A){return $A.fromEncoded(A).projectName}static filterEncodedPaths(A){return A.filter((_)=>H0.isEncodedPath(_))}static translatePath(A,_=process.platform){if(!A||A.trim()==="")return A;if(_==="win32"){let G=A.match(/^\/mnt\/([a-zA-Z])([\/]?)(.*)$/);if(G){let $=G[1].toUpperCase(),K=G[3].replace(/\//g,"\\");return`${$}:\\${K}`}return A}else{let G=A.match(/^([a-zA-Z]):([\\/]?)(.*)$/);if(G){let $=G[1].toLowerCase(),K=G[3].replace(/\\/g,"/");return`/mnt/${$}/${K}`}return A}}static resolveExistingPath(A,_,G=process.platform){if(!A)return A;let $=_??(()=>!1);if($(A))return A;let K=H0.translatePath(A,G);if($(K))return K;return A}}var S7,E7;var W1=U(()=>{F5();S7=/^[A-Za-z]--/,E7=/^-[a-z]/i});var s6=()=>{};var o6=U(()=>{W1();s6()});var z1=U(()=>{t6();F5();o6();IA()});import{Database as D7}from"bun:sqlite";import{existsSync as x7,mkdirSync as P7}from"fs";import{dirname as A4}from"path";function y7(A){try{return U0("sqlite-vec").load(A),!0}catch{return!1}}function S(){return t0()}function D(A){let{path:_,create:G=!0,applySchema:$=!0,walMode:K=!0,cacheSize:Z=-64000,busyTimeout:Y=5000}=A,J=_!==":memory:",H=J&&x7(_),Q=A.quickCheck??(J&&H);if(J)try{P7(A4(_),{recursive:!0})}catch(B){let W=L(B);throw new F(j.DB_CONNECTION_FAILED,`Failed to create database directory: ${W}`,{path:A4(_)})}let X;try{X=new D7(_,{create:G})}catch(B){let W=L(B),N=B.code;throw new F(j.DB_CONNECTION_FAILED,`Failed to connect to database: ${W}`,{path:_,...N?{errno:N}:{}})}let V=(B)=>{X.close();let W=L(B);if(W.includes("not a database")||W.includes("SQLITE_NOTADB"))throw new F(j.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:_});throw new F(j.DB_CONNECTION_FAILED,`Failed to initialize database: ${W}`,{path:_})};try{X.exec("PRAGMA foreign_keys = ON;");let B=!1;if(K&&J){X.exec("PRAGMA journal_mode = WAL;");let z=X.query("PRAGMA journal_mode;").get();if(B=z.journal_mode==="wal",!B)console.warn(`Warning: WAL mode not enabled. Current mode: ${z.journal_mode}`)}X.exec(`PRAGMA busy_timeout = ${Y};`),X.exec("PRAGMA synchronous = NORMAL;"),X.exec(`PRAGMA cache_size = ${Z};`),X.exec("PRAGMA temp_store = MEMORY;");let W=AG(X);if(!W){let z=X.query("SELECT sqlite_version() as version").get();throw X.close(),new F(j.DB_CONNECTION_FAILED,"FTS5 is not available. memory requires FTS5 for full-text search.",{sqliteVersion:z?.version??"unknown"})}if(Q){let z=X.query("PRAGMA quick_check(1);").get();if(z?.quick_check!=="ok")throw X.close(),new F(j.DB_CORRUPTED,"Database integrity check failed",{path:_,checkResult:z?.quick_check??"unknown"})}let N=y7(X);if($)V1(X,{sqliteVecAvailable:N});return{db:X,walEnabled:B,fts5Available:W,sqliteVecAvailable:N}}catch(B){if(B instanceof F)throw B;throw V(B)}}function E(A){try{A.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{A.exec("PRAGMA journal_mode = DELETE;")}catch{}A.close()}function _4(A){A.exec("PRAGMA wal_checkpoint(PASSIVE);")}function N1(A){return A.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}function G4(A){try{return D(A)}catch(_){if(_ instanceof F)throw _;let G=L(_),$=_.code;throw new F(j.DB_CONNECTION_FAILED,`Database initialization failed: ${G}`,{path:A.path,...$?{errno:$}:{}})}}var S5=U(()=>{O5();z1();c()});var $4={};k($4,{SqliteSessionRepository:()=>m});class m{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
708
|
+
`),this.deleteStmt=A.prepare(`
|
|
457
709
|
DELETE FROM sessions WHERE id = $id
|
|
458
|
-
`),this.updateSummaryStmt
|
|
710
|
+
`),this.updateSummaryStmt=A.prepare(`
|
|
459
711
|
UPDATE sessions SET summary = $summary, updated_at = datetime('now')
|
|
460
712
|
WHERE id = $id
|
|
461
|
-
`),this.updateProjectNameStmt
|
|
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
|
|
716
|
+
`),this.findDistinctEncodedPathsStmt=A.prepare(`
|
|
465
717
|
SELECT DISTINCT project_path_encoded FROM sessions
|
|
466
718
|
ORDER BY project_path_encoded
|
|
467
|
-
`)}rowToSession(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
${
|
|
739
|
+
${$}
|
|
488
740
|
ORDER BY start_time DESC
|
|
489
741
|
LIMIT $limit
|
|
490
|
-
`;return this.db.prepare(
|
|
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(
|
|
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
|
|
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
|
|
504
|
-
VALUES ($id, $session_id, $role, $content, $timestamp, $tool_use_ids)`)}async findById(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
590
|
-
embedding float[${
|
|
591
|
-
)`),this.db.exec("DELETE FROM embedding_state")}}class
|
|
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 L1{db;constructor(A){this.db=A}async findByPath(A){let _=this.db.prepare("SELECT * FROM memory_files WHERE file_path = ?").get(A);return _?this.toEntity(_):null}async findByType(A){return this.db.prepare("SELECT * FROM memory_files WHERE file_type = ? ORDER BY last_indexed_at DESC").all(A).map((G)=>this.toEntity(G))}async findByProject(A){return this.db.prepare("SELECT * FROM memory_files WHERE project_encoded = ? ORDER BY file_path").all(A).map((G)=>this.toEntity(G))}async save(A){this.db.prepare(H4).run(A.filePath,A.fileType,A.projectEncoded??null,A.content,A.contentHash,A.lastIndexedAt.toISOString())}async saveMany(A){let _=this.db.prepare(H4);this.db.transaction(()=>{for(let $ of A)_.run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())})()}async searchContent(A,_=20){let G=R0(A);if(!G)return[];return this.db.prepare(`
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(),
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
966
|
+
`).all(A,_).map(($)=>this.toEntity($))}async superseded(A,_,G){this.db.prepare("UPDATE facts SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now') WHERE uuid = ?").run(_.toISOString(),G,A)}async supersede(A,_,G){await this.superseded(A,_,G)}async findAll(){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC").all().map((_)=>this.toEntity(_))}async clearAll(){this.db.exec("DELETE FROM facts;")}toEntity(A){return YA.create({id:A.id,uuid:A.uuid,type:A.type,project:A.project,content:A.content,metadata:A.metadata?JSON.parse(A.metadata):void 0,observedAt:new Date(A.observed_at),supersededAt:A.superseded_at?new Date(A.superseded_at):null,supersededBy:A.superseded_by??null})}}var P0=U(()=>{_G()});class M1{db;constructor(A){this.db=A}async findById(A){let _=this.db.prepare("SELECT * FROM extraction_log WHERE session_id = ?").get(A);if(!_)return null;return this.toEntry(_)}async save(A){this.db.prepare(`
|
|
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(
|
|
971
|
+
`).run(A.sessionId,A.mode,A.factsAdded,A.factsUpdated,A.factsSuperseded,A.factsSkipped,A.provider,A.model,A.tokensConsumed,A.extractedAt.toISOString())}async findAll(){return this.db.prepare("SELECT * FROM extraction_log ORDER BY extracted_at DESC").all().map((_)=>this.toEntry(_))}async clearAll(){this.db.exec("DELETE FROM extraction_log;")}toEntry(A){return{sessionId:A.session_id,mode:A.mode,factsAdded:A.facts_added,factsUpdated:A.facts_updated,factsSuperseded:A.facts_superseded,factsSkipped:A.facts_skipped,provider:A.provider,model:A.model,tokensConsumed:A.tokens_consumed,extractedAt:new Date(A.extracted_at)}}}var L4={};k(L4,{governanceEntryFromFactEvent:()=>T1,SqliteMemoryGovernanceRepository:()=>s});class s{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
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 _=q1(A.payload.governance);if(!_)return null;let G=G5(y0(_.control,"register")),$=A_(y0(_.surface,"fact")),K=y0(_.targetId??_.target_id,"");if(!K.trim())throw Error("Governance event targetId is required");if(this.recordGovernanceEvent(A,G,$,K,_),G==="register")return this.save(W4(A,_,$,K));let J=(await this.findByTarget($,K)??W4(A,_,$,K)).withControl({control:G,actor:y0(_.actor,A.provenance.actor),reason:U1(_.reason),occurredAt:A.occurredAt,expiresAt:ZG(_.expiresAt??_.expires_at),consentStatus:N4(_.consentStatus??_.consent_status),consentScopes:y5(_.consentScopes??_.consent_scopes),lastEventId:A.eventId});return this.save(J)}async clearAll(){this.db.exec("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")}toSqlParams(A){return[A.surface,A.targetId,A.project??null,A.visibility,JSON.stringify(A.sourceEventIds),A.transformationMethod,A.actor,A.confidence,A.redactionState,A.consentStatus,JSON.stringify(A.consentScopes),JSON.stringify(A.scope),A.status,A.statusReason??null,A.createdAt.toISOString(),A.updatedAt.toISOString(),A.reviewedAt?.toISOString()??null,A.expiresAt?.toISOString()??null,A.lastEventId??null]}toEntity(A){return GA.create({id:A.id,surface:A.surface,targetId:A.target_id,project:A.project??void 0,visibility:A.visibility,sourceEventIds:JSON.parse(A.source_event_ids),transformationMethod:A.transformation_method,actor:A.actor,confidence:A.confidence,redactionState:A.redaction_state,consentStatus:A.consent_status,consentScopes:JSON.parse(A.consent_scopes),scope:JSON.parse(A.scope),status:A.status,statusReason:A.status_reason??void 0,createdAt:new Date(A.created_at),updatedAt:new Date(A.updated_at),reviewedAt:A.reviewed_at?new Date(A.reviewed_at):null,expiresAt:A.expires_at?new Date(A.expires_at):null,lastEventId:A.last_event_id??void 0})}recordGovernanceEvent(A,_,G,$,K){this.db.prepare(`
|
|
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),U1(K.reason)??null,A.occurredAt.toISOString(),JSON.stringify(A.payload))}}function T1(A,_,G){return GA.create({surface:"fact",targetId:_,project:G,visibility:A.scope.visibility,sourceEventIds:A.provenance.sourceIds&&A.provenance.sourceIds.length>0?A.provenance.sourceIds:[A.eventId],transformationMethod:A.provenance.method,actor:A.provenance.actor,confidence:h7(A.payload.fact),redactionState:A.privacy.redactionState,consentStatus:A.consent.status,consentScopes:A.consent.scopes,scope:A.scope,status:"active",createdAt:A.observedAt,updatedAt:A.observedAt,expiresAt:ZG(A.consent.expiresAt),lastEventId:A.eventId})}function W4(A,_,G,$){let K=U1(_.project)??A.scope.project,Z=v7(_.visibility)??A.scope.visibility,Y=q1(_.scope),J={surface:G,targetId:$,project:K,visibility:Z,sourceEventIds:y5(_.sourceEventIds??_.source_event_ids)??A.provenance.sourceIds??[A.eventId],transformationMethod:y0(_.transformationMethod??_.transformation_method,A.provenance.method),actor:y0(_.actor,A.provenance.actor),confidence:z4(_.confidence)??1,redactionState:w7(_.redactionState??_.redaction_state)??A.privacy.redactionState,consentStatus:N4(_.consentStatus??_.consent_status)??A.consent.status,consentScopes:y5(_.consentScopes??_.consent_scopes)??A.consent.scopes,scope:Y??A.scope,status:C7(_.status)??"active",statusReason:U1(_.reason??_.statusReason??_.status_reason),createdAt:ZG(_.createdAt??_.created_at)??A.observedAt,updatedAt:A.observedAt,reviewedAt:ZG(_.reviewedAt??_.reviewed_at)??null,expiresAt:ZG(_.expiresAt??_.expires_at??A.consent.expiresAt)??null,lastEventId:A.eventId};return GA.create(J)}function h7(A){let _=q1(A),G=q1(_?.metadata);return z4(G?.confidence)??1}function q1(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)?A:void 0}function y0(A,_){return typeof A==="string"&&A.trim()?A:_}function U1(A){return typeof A==="string"&&A.trim()?A:void 0}function y5(A){if(!Array.isArray(A))return;return A.map((_)=>String(_))}function z4(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function ZG(A){if(A===null)return null;if(A===void 0)return;let _=A instanceof Date?A:new Date(String(A));return Number.isNaN(_.getTime())?void 0:_}function v7(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function w7(A){return A==="none"||A==="redacted"||A==="quarantined"?A:void 0}function N4(A){return A==="not_required"||A==="granted"||A==="denied"||A==="revoked"?A:void 0}function C7(A){return A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired"?A:void 0}var k0=U(()=>{D0()});var M4={};k(M4,{SqlitePersonaRepository:()=>SA});class SA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
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(()=>{K1()});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 I1=U(()=>{R5()});var k5=U(()=>{mA();Y_();Z4();E5();Y4();D5();x5();$G();P5();P0();k0();H_();YG();I1()});class Q_{db;constructor(A){this.db=A}async search(A,_){let G=_?.limit??20,$=R0(A.value);if(!$)return[];let{sql:K,params:Z}=this.buildSearchQuery($,G,_),J=this.db.prepare(K).all(...Z);if(J.length===0)return[];return this.normalizeBm25Scores(J).map((Q)=>jA.create({sessionId:Q.session_id,messageId:Q.id,snippet:Q.snippet,score:Q.normalizedScore,timestamp:new Date(Q.timestamp),role:Q.role}))}buildSearchQuery(A,_,G){let $=[A],K=["messages_fts MATCH ?"],Z=`
|
|
687
1114
|
FROM messages_fts f
|
|
688
1115
|
JOIN messages_meta m ON f.rowid = m.rowid
|
|
689
|
-
`;if(
|
|
1116
|
+
`;if(G?.projectFilter)Z+=`
|
|
690
1117
|
JOIN sessions s ON m.session_id = s.id
|
|
691
|
-
`,
|
|
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
|
-
${
|
|
701
|
-
WHERE ${
|
|
1127
|
+
${Z}
|
|
1128
|
+
WHERE ${K.join(" AND ")}
|
|
702
1129
|
ORDER BY score
|
|
703
1130
|
LIMIT ?
|
|
704
|
-
`,params
|
|
1131
|
+
`,params:$}}normalizeBm25Scores(A){if(A.length===0)return[];let _=A[0];if(A.length===1&&_)return[{..._,normalizedScore:1}];let G=A.map((Y)=>Y.score),$=Math.min(...G),K=Math.max(...G);if($===K)return A.map((Y)=>({...Y,normalizedScore:1}));let Z=K-$;return A.map((Y)=>({...Y,normalizedScore:(K-Y.score)/Z}))}}var T4=()=>{};class X_{db;fts5Service;embeddingRepo;providerFactory;config;sqliteVecAvailable;lastSearchMeta=null;constructor(A){this.db=A.db,this.fts5Service=A.fts5Service,this.embeddingRepo=A.embeddingRepo,this.providerFactory=A.providerFactory,this.config=A.config,this.sqliteVecAvailable=A.sqliteVecAvailable}getLastSearchMeta(){return this.lastSearchMeta}async search(A,_){let G=performance.now(),$=this.embeddingRepo.getEmbeddedCount(),K=this.embeddingRepo.getTotalMessageCount(),Z=K>0?$/K:0,Y=this.sqliteVecAvailable&&$>0,J={fts:!0,vector:Y,hybrid:Y},H=this.resolveMode(_?.mode,$),Q=!1,X,V;try{switch(H.effectiveMode){case"fts":V=await this.ftsSearch(A,_);break;case"vector":V=await this.vectorSearch(A,_);break;case"hybrid":{let q=await this.hybridSearch(A,_);if(V=q.results,q.degraded)Q=!0,X=q.degradationReason}break}}catch(q){if(H.effectiveMode!=="vector"&&!(q instanceof F))V=await this.ftsSearch(A,_),Q=!0,X="provider_failure";else throw q}V=this.applyDecayToResults(V,_);let B=H.degraded||Q,W=X??(H.degraded?H.reason:void 0),N=B&&!H.degraded?"fts":H.effectiveMode,z=performance.now()-G;return this.lastSearchMeta={mode:N,modeReason:B?W??H.reason:H.reason,degraded:B,degradationReason:B?W:void 0,embeddingCoverage:Z,capabilities:J,timingMs:z},V}resolveMode(A,_=0){let G=this.config.search?.defaultMode??"auto",$=A??G;if($==="fts")return{effectiveMode:"fts",degraded:!1,reason:"explicit"};if($==="vector"){if(!this.sqliteVecAvailable)throw new F(j.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(_===0)throw new F(j.VECTOR_UNAVAILABLE,"No embeddings found in database",{suggestion:"Run 'memory sync --embed' to generate embeddings"});return{effectiveMode:"vector",degraded:!1,reason:"explicit"}}if($==="hybrid"){if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!0,reason:!this.sqliteVecAvailable?"sqlite_vec_unavailable":"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"explicit"}}if(!this.sqliteVecAvailable||_===0)return{effectiveMode:"fts",degraded:!1,reason:"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"auto_hybrid"}}applyDecayToResults(A,_){if(!(this.config.search?.temporalDecay?.enabled!==!1&&!_?.noDecay)||A.length===0)return A;let $=this.config.search?.temporalDecay?.halfLifeDays??30,Z=new Date().getTime(),Y=86400000,J=A.map((H)=>{let Q=(Z-H.timestamp.getTime())/Y,X=Math.pow(0.5,Q/$),V=Math.max(0,Math.min(1,H.score*X));return{result:H,decayedScore:V}});return J.sort((H,Q)=>Q.decayedScore-H.decayedScore),J.map(({result:H,decayedScore:Q})=>jA.create({sessionId:H.sessionId,messageId:H.messageId,snippet:H.snippet,score:Q,timestamp:H.timestamp,role:H.role,source:H.source,rawScores:H.rawScores}))}async ftsSearch(A,_){return(await this.fts5Service.search(A,_)).map(($)=>jA.create({sessionId:$.sessionId,messageId:$.messageId,snippet:$.snippet,score:$.score,timestamp:$.timestamp,role:$.role,source:"fts",rawScores:{bm25:$.score}}))}async getProvider(A){try{let _=this.providerFactory.createFromConfig(this.config);if(!_){if(A)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!_.isReady())await _.initialize();return _}catch(_){if(A){if(_ instanceof F)throw _;throw new F(j.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${L(_)}`)}return null}}async embedQuery(A,_){return(await _.embed(A)).embedding}checkDimensionMismatch(A){if(this.embeddingRepo.getEmbeddedCount()===0)return null;let G=this.getStoredEmbeddingDimensions();if(G===null)return null;let $=A.dimensions;if($!==G)return`dimension_mismatch (stored: ${G}, provider: ${$})`;return null}getStoredEmbeddingDimensions(){try{let A=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!A||!A.embedding)return null;let _=A.embedding;if(_ instanceof Float32Array)return _.length;if(_ instanceof ArrayBuffer||_.byteLength!==void 0)return _.byteLength/4;return null}catch{return null}}async vectorSearch(A,_){let G=await this.getProvider(!0);if(!G)throw new F(j.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let $=this.checkDimensionMismatch(G);if($)throw new F(j.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${$}`);let K=await this.embedQuery(A.value,G),Z=_?.limit??20,Y=Z*I4,J=this.embeddingRepo.vectorKnnSearch(K,Y);if(J.length===0)return[];let H=J.map((V)=>V.rowid),Q=this.hydrateByRowids(H),X=[];for(let V=0;V<J.length&&X.length<Z;V++){let B=J[V];if(!B)continue;let W=Q.get(B.rowid);if(!W)continue;if(!this.passesFilters(W,_))continue;let N=this.vectorSnippet(W.content),z=Math.max(0,Math.min(1,1-B.distance/2));X.push(jA.create({sessionId:W.session_id,messageId:W.id,snippet:N,score:z,timestamp:new Date(W.timestamp),role:W.role,source:"vector",rawScores:{cosine:B.distance}}))}return X}async hybridSearch(A,_){let G=_?.limit??20,$=G*I4,K={..._,limit:$},Z=await this.fts5Service.search(A,K),Y=[],J=null,H=!1,Q;try{if(J=await this.getProvider(!1),J){let M=this.checkDimensionMismatch(J);if(M)J=null,H=!0,Q=M;else{let O=await this.embedQuery(A.value,J);Y=this.embeddingRepo.vectorKnnSearch(O,$)}}else H=!0,Q="provider_unavailable"}catch(M){Y=[],H=!0,Q=`provider_failure: ${L(M)}`}if(Y.length===0&&Z.length>0)return{results:Z.map((O)=>jA.create({sessionId:O.sessionId,messageId:O.messageId,snippet:O.snippet,score:O.score,timestamp:O.timestamp,role:O.role,source:"fts",rawScores:{bm25:O.score}})).slice(0,G),degraded:H,degradationReason:Q};if(Z.length===0&&Y.length===0)return{results:[],degraded:H,degradationReason:Q};let X=this.buildFtsRowidMap(Z),V=Z.map((M,O)=>({rowid:X.get(M.messageId)??0,rank:O+1,source:"fts",rawScore:M.score})),B=Y.map((M,O)=>({rowid:M.rowid,rank:O+1,source:"vector",rawScore:M.distance})),W=e$(V,B,G);if(W.length===0)return{results:[],degraded:H,degradationReason:Q};let N=W.map((M)=>M.rowid),z=this.hydrateByRowids(N),q=new Map;for(let M of W){let O=M.sources.some((y)=>y.source==="fts"),R=M.sources.some((y)=>y.source==="vector");if(O&&R)q.set(M.rowid,"both");else if(O)q.set(M.rowid,"fts");else q.set(M.rowid,"vector")}let I=W.map((M)=>({...M,score:M.normalizedScore})),T=[];for(let M of I){let O=z.get(M.rowid);if(!O)continue;if(!this.passesFilters(O,_))continue;let R=q.get(M.rowid)??"fts",y=Z.find((sA)=>sA.messageId===O.id),HA=y?y.snippet:this.vectorSnippet(O.content),tA=Math.max(0,Math.min(1,M.score)),eA={rrf:M.rrfScore};for(let sA of M.sources){if(sA.source==="fts")eA.bm25=sA.rawScore;if(sA.source==="vector")eA.cosine=sA.rawScore}T.push(jA.create({sessionId:O.session_id,messageId:O.id,snippet:HA,score:tA,timestamp:new Date(O.timestamp),role:O.role,source:R,rawScores:eA}))}return{results:T,degraded:H,degradationReason:Q}}buildFtsRowidMap(A){if(A.length===0)return new Map;let _=A.map((K)=>K.messageId),G=_.map(()=>"?").join(","),$=this.db.prepare(`SELECT rowid, id FROM messages_meta WHERE id IN (${G})`).all(..._);return new Map($.map((K)=>[K.id,K.rowid]))}hydrateByRowids(A){if(A.length===0)return new Map;let _=A.map(()=>"?").join(","),G=this.db.prepare(`SELECT rowid, id, session_id, content, timestamp, role
|
|
705
1132
|
FROM messages_meta
|
|
706
|
-
WHERE rowid IN (${
|
|
1133
|
+
WHERE rowid IN (${_})`).all(...A);return new Map(G.map(($)=>[$.rowid,$]))}vectorSnippet(A){if(A.length<=200)return A;return A.slice(0,200)+"..."}passesFilters(A,_){if(!_)return!0;if(_.projectFilter){let G=this.db.prepare("SELECT project_name FROM sessions WHERE id = ?").get(A.session_id);if(!G||!G.project_name.toLowerCase().includes(_.projectFilter.toLowerCase()))return!1}if(_.roleFilter){if(Array.isArray(_.roleFilter)){if(!_.roleFilter.includes(A.role))return!1}else if(A.role!==_.roleFilter)return!1}if(_.sessionFilter&&A.session_id!==_.sessionFilter)return!1;if(_.sinceDate){if(new Date(A.timestamp)<_.sinceDate)return!1}if(_.beforeDate){if(new Date(A.timestamp)>_.beforeDate)return!1}return!0}}var I4=4;var O4=U(()=>{z1()});class V0{db;constructor(A){this.db=A}async getStats(A=10){let _=this.db.prepare(`
|
|
707
1134
|
SELECT page_size * page_count as size
|
|
708
1135
|
FROM pragma_page_count(), pragma_page_size()
|
|
709
|
-
`).get(),
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
${
|
|
737
|
-
`,
|
|
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
|
-
${
|
|
1169
|
+
${K?"AND t.timestamp >= ?":""}
|
|
743
1170
|
GROUP BY t.name
|
|
744
1171
|
ORDER BY count DESC
|
|
745
1172
|
LIMIT ?
|
|
746
|
-
`,
|
|
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
|
-
${
|
|
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
|
-
`,
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
774
|
-
`)}var
|
|
775
|
-
`).filter((
|
|
1200
|
+
LIMIT 1`).get(A)?.project_name??null}}var R4=U(()=>{T4();O4()});var EA,V_;var h5=U(()=>{EA={local:{model:"Xenova/all-MiniLM-L6-v2",dimensions:384},openai:{model:"text-embedding-3-small",dimensions:1536},ollama:{model:"nomic-embed-text",dimensions:768},"openai-compatible":{model:"text-embedding-3-small",dimensions:1536}},V_={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var j1={};k(j1,{saveConfig:()=>hA,resolveProviderDefaults:()=>x4,resolveEmbeddingApiKey:()=>HG,loadConfig:()=>f,getConfigPath:()=>W_,getConfigDir:()=>C0,PROVIDER_DEFAULTS:()=>D4,DEFAULT_SEARCH_CONFIG:()=>O1,DEFAULT_REMOTE_SYNC_CONFIG:()=>C5,DEFAULT_PROVIDER_EGRESS_POLICY:()=>o,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>b5,DEFAULT_EMBEDDING_CONFIG:()=>B_,DEFAULT_CONFIG:()=>JG,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>w5});import{randomUUID as v5}from"crypto";import{existsSync as F4,mkdirSync as f7,readFileSync as S4,writeFileSync as g7}from"fs";import{dirname as E4}from"path";function x4(A,_){let G=A.provider;if(G==="local"||!_)return A;let $=D4[G],K={...A};if(!("model"in _))K.model=$?.model??A.model;if(!("dimensions"in _))K.dimensions=$?.dimensions??A.dimensions;return K}function HG(A,_){let G=[A.apiKeyEnv,..._].filter((K)=>Boolean(K));for(let K of G){let Z=process.env[K];if(Z){let Y={apiKey:Z,source:"environment",envVar:K,deprecatedPlaintext:!1};if(A.apiKeyRef)Y.ref=A.apiKeyRef;return Y}}if(A.apiKey){let K={apiKey:A.apiKey,source:"plaintext-config",deprecatedPlaintext:!0};if(A.apiKeyRef)K.ref=A.apiKeyRef;return K}let $={source:"missing",deprecatedPlaintext:!1};if(A.apiKeyRef)$.ref=A.apiKeyRef;return $}function C0(A){if(A!==void 0)return E4(A);return oA()}function W_(A){if(A!==void 0)return A;return A0()}function f(A){let _=W_(A);if(!F4(_)){let G=process.env.MEMORY_TEST_MACHINE_ID??v5(),$={...JG,machineId:G};try{hA($,A)}catch{}return $}try{let G=S4(_,"utf-8"),$=JSON.parse(G),K=$.machineId,Z=!1;if(!K)K=process.env.MEMORY_TEST_MACHINE_ID??v5(),Z=!0;let Y=$.embedding,J={...B_,...Y??{}},H={...C5,...$.remoteSync??{}},Q={...o,...$.providerEgress??{},allowedHosts:Array.isArray($.providerEgress?.allowedHosts)?$.providerEgress.allowedHosts.map(String):[...o.allowedHosts],allowedProviders:Array.isArray($.providerEgress?.allowedProviders)?$.providerEgress.allowedProviders.map(String):[...o.allowedProviders]},X={...b5,...$.legacyMemoryFiles??{}},V={...JG,...$,machineId:K,remoteSync:H,providerEgress:Q,legacyMemoryFiles:X,embedding:x4(J,Y),search:{...O1,...$.search??{},temporalDecay:{...O1.temporalDecay,...$.search?.temporalDecay??{}}},ambientContext:{...w5,...$.ambientContext??{}}};if(Z)try{hA(V,A)}catch{}return V}catch{console.warn("Invalid config.json, using defaults");let G=process.env.MEMORY_TEST_MACHINE_ID??v5();return{...JG,machineId:G}}}function hA(A,_){let G=W_(_),$=E4(G);f7($,{recursive:!0});let K={};if(F4(G))try{let Y=S4(G,"utf-8");K=JSON.parse(Y)}catch{}let Z={...K,...A};g7(G,JSON.stringify(Z,null,2)+`
|
|
1201
|
+
`)}var O1,w5,C5,o,b5,D4,B_,JG;var JA=U(()=>{c();h5();O1={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},w5={enabled:!0,budget:800},C5={enabled:!1,autoPush:!0,autoPull:!0},o={consent:"unset",allowedHosts:["api.openai.com","api.anthropic.com"],allowedProviders:["anthropic","openai","claude-cli"]},b5={enabled:!1},D4={...EA};B_={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100,maxBatchBytes:800000},JG={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:B_,search:O1,ambientContext:w5,machineId:"",remoteSync:C5,providerEgress:o,legacyMemoryFiles:b5}});var k4={};k(k4,{PatternRedactor:()=>t,PATTERN_REDACTOR_RULE_VERSION:()=>y4});import{createHash as c7}from"crypto";class t{redactText(A){let _=A,G=[];for(let $ of u7)_=_.replace($.pattern,(K)=>{let Z=$.secretValue?.(K)??K,Y=f5($.kind,Z);return G.push(Y),`${$.preservePrefix?.(K)??""}${Y.placeholder}`});return{text:_,findings:G}}redactJson(A){let _=[];return{value:this.redactUnknown(A,_,new WeakSet),findings:_}}redactUnknown(A,_,G){if(typeof A==="string"){let $=this.redactText(A);return _.push(...$.findings),$.text}if(Array.isArray(A))return A.map(($,K)=>{let Z=A[K-1];if(typeof $==="string"&&typeof Z==="string"&&d7.test(Z))return this.redactFlagAdjacentValue($,_);return this.redactUnknown($,_,G)});if(A&&typeof A==="object"){if(G.has(A))return"[REDACTED:circular]";G.add(A);let $={};for(let[K,Z]of Object.entries(A))$[K]=this.redactObjectValue(K,Z,_,G);return $}return A}redactObjectValue(A,_,G,$){if(typeof _!=="string")return this.redactUnknown(_,G,$);let K=this.redactText(_);if(K.findings.length>0)return G.push(...K.findings),K.text;if(m7.test(A)&&_.trim()!==""&&!P4.test(_)){let Z=f5(l7(A),_);return G.push(Z),Z.placeholder}return _}redactFlagAdjacentValue(A,_){if(A.trim()===""||P4.test(A))return A;let G=this.redactText(A);if(G.findings.length>0)return _.push(...G.findings),G.text;let $=f5("env_secret",A);return _.push($),$.placeholder}}function f5(A,_){let G=c7("sha256").update(_).digest("hex").slice(0,8);return{kind:A,hash:G,ruleVersion:y4,placeholder:`[REDACTED:${A}:${G}]`}}function l7(A){if(/api[-_]?key|auth[-_]?key/i.test(A))return"api_key";if(/authorization|bearer|token/i.test(A))return"bearer_token";return"env_secret"}var y4="pattern-redactor-v2",u7,m7,d7,P4;var pA=U(()=>{u7=[{kind:"private_key",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{kind:"env_secret",pattern:/\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASS|CREDENTIAL)[A-Z0-9_]*)\s*=\s*(?:"[^"]+"|'[^']+'|[^\s]+)/g,preservePrefix:(A)=>`${A.split("=")[0].trim()}=`,secretValue:(A)=>A.slice(A.indexOf("=")+1).trim().replace(/^['"]|['"]$/g,"")},{kind:"api_key",pattern:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g},{kind:"api_key",pattern:/\btskey-(?:auth|client)-[A-Za-z0-9_-]{20,}\b/g},{kind:"aws_access_key",pattern:/\b(A3T[A-Z0-9]|AKIA|ASIA)[A-Z0-9]{16}\b/g},{kind:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{kind:"bearer_token",pattern:/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}/g,preservePrefix:()=>"Bearer ",secretValue:(A)=>A.replace(/^Bearer\s+/i,"")}],m7=/(?:api[-_]?key|auth[-_]?key|authorization|bearer|token|secret|password|passwd|pwd|credential)/i,d7=/^--?(?:api[-_]?key|auth[-_]?key|token|secret|password|passwd|pwd|credential)$/i,P4=/^\[REDACTED:[a-z_]+(?::[a-f0-9]{8})?\]$/});import{appendFileSync as TL,existsSync as p7,mkdirSync as IL,readFileSync as n7,renameSync as OL,statSync as jL}from"fs";import{dirname as i7,join as a7}from"path";function z_(A){if(A!==void 0)return i7(A);return QA()}function h4(A){if(A!==void 0)return A;return a7(QA(),"sync.log")}function N_(A=100,_){let G=h4(_);if(!p7(G))return[];try{let K=n7(G,"utf-8").split(`
|
|
1202
|
+
`).filter((Y)=>Y.trim()!==""),Z=[];for(let Y of K)try{let J=JSON.parse(Y);Z.push(J)}catch{continue}return Z.slice(-A)}catch{return[]}}var EL;var R1=U(()=>{c();pA();EL=new t});var g5=U(()=>{c();d$();D5();Y_()});var w4=U(()=>{JA();R1();g5()});var C4=U(()=>{R1()});var L_=U(()=>{JA();R1();g5();w4();C4();C$()});class c5{name="transformers-js";model;dimensions;_pipeline=null;constructor(A){this.model=A?.model??"Xenova/all-MiniLM-L6-v2",this.dimensions=A?.dimensions??384}async initialize(A){if(this._pipeline)return;let{pipeline:_,env:G}=await import("@huggingface/transformers");G.allowLocalModels=!1;let $={dtype:"q8"};if(A)$.progress_callback=(K)=>{A({status:K.status==="ready"?"ready":"downloading",file:K.file??"",loaded:K.loaded??0,total:K.total??0})};try{this._pipeline=await _("feature-extraction",this.model,$)}catch(K){if(console.warn(`Native ONNX runtime failed: ${L(K)}`),console.warn("Falling back to WASM backend (slower but universal)"),G.backends?.onnx?.wasm)G.backends.onnx.wasm.numThreads=1;try{this._pipeline=await _("feature-extraction",this.model,{dtype:"q8",device:"wasm"})}catch(Z){throw Error(`Embedding initialization failed. Native: ${L(K)}. WASM: ${L(Z)}`)}}}async embed(A){if(!this._pipeline)throw Error("Provider not initialized. Call initialize() before embed().");let _=await this._pipeline(A,{pooling:"mean",normalize:!0}),G=new Float32Array(_.tolist()[0]);return kA.create({embedding:G,model:this.model,dimensions:this.dimensions})}async embedBatch(A){let _=[];for(let G of A)_.push(await this.embed(G));return _}isReady(){return this._pipeline!==null}async dispose(){this._pipeline=null}}var b4=()=>{};class F1{name;model;dimensions;apiKey;baseUrl;_ready=!1;constructor(A){this.apiKey=A.apiKey,this.name=A.providerId??"openai",this.model=A.model??"text-embedding-3-small",this.dimensions=A.dimensions??1536,this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async initialize(A){this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let Z=await _.text();throw Error(`OpenAI API error ${_.status}: ${Z}`)}let $=(await _.json()).data?.[0];if(!$)throw Error("OpenAI returned empty embeddings response");let K=new Float32Array($.embedding);return kA.create({embedding:K,model:this.model,dimensions:this.dimensions})}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let _=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:A,dimensions:this.dimensions})});if(!_.ok){let K=await _.text();throw Error(`OpenAI API error ${_.status}: ${K}`)}return[...(await _.json()).data].sort((K,Z)=>K.index-Z.index).map((K)=>kA.create({embedding:new Float32Array(K.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var f4=()=>{};class u5{name="ollama";model;dimensions;baseUrl;_ready=!1;constructor(A){this.model=A?.model??"nomic-embed-text",this.dimensions=A?.dimensions??768,this.baseUrl=A?.baseUrl??"http://localhost:11434"}async initialize(A){let _;try{_=await fetch(`${this.baseUrl}/api/tags`,{method:"GET"})}catch(G){let $=L(G);throw Error(`Cannot reach Ollama server at ${this.baseUrl}. Ensure Ollama is running: ollama serve (${$})`)}if(!_.ok)throw Error(`Ollama server returned ${_.status} from ${this.baseUrl}/api/tags`);this._ready=!0}async embed(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let[_]=await this.requestEmbeddings(A);if(!_)throw Error("Ollama returned empty embeddings response");return _}async embedBatch(A){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");if(A.length===0)return[];try{return await this.requestEmbeddings(A)}catch(_){if(A.length>1&&bG(_,"payload_too_large")){let G=Math.ceil(A.length/2),$=await this.embedBatch(A.slice(0,G)),K=await this.embedBatch(A.slice(G));return[...$,...K]}throw _}}isReady(){return this._ready}async dispose(){this._ready=!1}async requestEmbeddings(A){let _=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:A})});if(!_.ok){let $=await _.text();this.throwWithHint(_.status,$,A)}return(await _.json()).embeddings.map(($)=>kA.create({embedding:new Float32Array($),model:this.model,dimensions:this.dimensions}))}throwWithHint(A,_,G){if(A===413)throw new CG({kind:"payload_too_large",status:A,retryable:!1,message:"Ollama error 413: provider payload too large",metadata:{provider:this.name,model:this.model,inputCount:Array.isArray(G)?G.length:1}});if(A===404||_.includes("not found"))throw Error(`Ollama error ${A}: ${_}. Model '${this.model}' not found. Run: ollama pull ${this.model}`);throw Error(`Ollama error ${A}: ${_}`)}}var g4=U(()=>{l$()});function B0(A){return["You are an expert developer assistant. Analyze the following conversation transcript between a user and an AI coding assistant.","Your task is to extract a structured JSON list of key facts that occurred during this conversation.","","Specifically, you should identify and classify facts into these categories:",'1. "decision": Key architectural choices, technology selections, conventions, or design decisions made.','2. "learning": Lessons learned, discoveries about tools, APIs, bugs found, environment specific issues, or workarounds.','3. "preference": User guidelines, rules, stylistic/operational preferences, or explicit constraints.','4. "friction": Pain points, slow processes, build issues, sync locks, file system access issues, command timeouts, or system bottlenecks.','5. "observation": Key metrics, observed state, runtime configurations, or general context findings.',"","For each fact, assign a confidence score between 0.0 and 1.0 based on how explicitly and clearly it was stated or agreed upon in the transcript.",'Provide optional structured "metadata" for additional context (e.g. rationale, severity, file path, system version, etc.).',"","CRITICAL: Your output MUST be a valid JSON array of objects. Do not include any explanation, markdown formatting outside of a JSON code block, or preambles. Output ONLY the JSON.","","Format:","["," {",' "type": "decision" | "learning" | "preference" | "friction" | "observation",',' "content": "Description of the fact",',' "metadata": { "key": "value" },',' "confidence": 0.95'," }","]","","Transcript:",A.map((G)=>`[${G.timestamp.toISOString()}] ${G.role.toUpperCase()}: ${G.content}`).join(`
|
|
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
|
|
781
|
-
(Output truncated - ${
|
|
782
|
-
`;break}
|
|
783
|
-
${
|
|
784
|
-
${
|
|
785
|
-
|
|
786
|
-
`}formatError(
|
|
787
|
-
`)}formatError(
|
|
788
|
-
`)}formatError(
|
|
789
|
-
`}if(
|
|
790
|
-
`,
|
|
791
|
-
`;if(
|
|
792
|
-
`;if(
|
|
793
|
-
|
|
794
|
-
`}
|
|
795
|
-
|
|
796
|
-
`;for(let
|
|
797
|
-
(Output truncated - ${
|
|
798
|
-
`;break}
|
|
799
|
-
${
|
|
800
|
-
${
|
|
801
|
-
`;if(
|
|
802
|
-
`;if(
|
|
803
|
-
`}return
|
|
804
|
-
`,
|
|
805
|
-
${
|
|
806
|
-
Found ${
|
|
807
|
-
|
|
808
|
-
`;for(let
|
|
809
|
-
`}formatError(
|
|
810
|
-
`)}formatError(
|
|
811
|
-
`)}formatError(
|
|
812
|
-
`,
|
|
813
|
-
`;if(
|
|
814
|
-
`;
|
|
815
|
-
`}let
|
|
816
|
-
|
|
817
|
-
`;for(let
|
|
818
|
-
`;return
|
|
819
|
-
`,
|
|
820
|
-
`,
|
|
821
|
-
|
|
822
|
-
`,
|
|
823
|
-
${
|
|
824
|
-
`)}formatError(
|
|
1205
|
+
`)}function W0(A){let _=A.trim(),G=_.match(/\[\s*\{[\s\S]*\}\s*\]/),$=G?G[0]:_;try{let K=JSON.parse($);if(!Array.isArray(K))return[];let Z=[];for(let Y of K){if(typeof Y.content!=="string"||Y.content.trim()==="")continue;let H=["decision","learning","preference","friction","observation"].includes(Y.type)?Y.type:"observation",Q=typeof Y.confidence==="number"?Math.max(0,Math.min(1,Y.confidence)):0.8;Z.push({type:H,content:Y.content.trim(),metadata:Y.metadata&&typeof Y.metadata==="object"?Y.metadata:void 0,confidence:Q})}return Z}catch(K){return console.error("Failed to parse LLM facts JSON response:",K),[]}}import t7 from"@anthropic-ai/sdk";class m5{providerId="anthropic";modelName;anthropic;constructor(A){this.modelName=A.model??"claude-3-5-sonnet-20241022",this.anthropic=new t7({apiKey:A.apiKey})}async extract(A){if(A.length===0)return[];let _=B0(A);try{let $=(await this.anthropic.messages.create({model:this.modelName,max_tokens:4000,messages:[{role:"user",content:_}]})).content[0],K=$&&"text"in $?$.text:"";return W0(K)}catch(G){throw console.error("Anthropic fact extraction API failed:",G),Error(`Anthropic API error: ${G.message}`)}}}var c4=()=>{};import{spawn as e7}from"child_process";class d5{providerId="claude-cli";modelName="claude-cli-print";async extract(A){if(A.length===0)return[];let _=B0(A);return new Promise((G,$)=>{let K={...process.env};delete K.CLAUDECODE;let Z=e7("claude",["-p","--output-format","text"],{env:K,stdio:["pipe","pipe","pipe"]}),Y="",J="";Z.stdout.on("data",(H)=>{Y+=H.toString()}),Z.stderr.on("data",(H)=>{J+=H.toString()}),Z.on("error",(H)=>{$(Error(`Failed to spawn claude -p: ${H.message}`))}),Z.on("close",(H)=>{if(H===0)G(W0(Y));else $(Error(`claude -p exited with code ${H}: ${J.trim()}`))}),Z.stdin.write(_),Z.stdin.end()})}}var u4=()=>{};class l5{providerId="ollama";modelName;baseUrl;constructor(A){this.baseUrl=A.baseUrl??"http://localhost:11434",this.modelName=A.model??"llama3"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=`${this.baseUrl}/api/generate`,$=await fetch(G,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.modelName,prompt:_,stream:!1,options:{temperature:0.1}})});if(!$.ok){let Y=await $.text();throw Error(`HTTP ${$.status}: ${Y}`)}let Z=(await $.json())?.response??"";return W0(Z)}catch(G){throw console.error("Ollama fact extraction API failed:",G),Error(`Ollama API error: ${G.message}`)}}}var m4=()=>{};class S1{providerId;modelName;apiKey;baseUrl;constructor(A){this.apiKey=A.apiKey,this.providerId=A.providerId??"openai",this.modelName=A.model??"gpt-4o",this.baseUrl=A.baseUrl??"https://api.openai.com/v1"}async extract(A){if(A.length===0)return[];let _=B0(A);try{let G=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.modelName,messages:[{role:"user",content:_}],temperature:0.1})});if(!G.ok){let Z=await G.text();throw Error(`HTTP ${G.status}: ${Z}`)}let K=(await G.json())?.choices?.[0]?.message?.content??"";return W0(K)}catch(G){throw console.error("OpenAI fact extraction API failed:",G),Error(`OpenAI API error: ${G.message}`)}}}var d4=()=>{};function QG(A,_=o){let G=s7(A);return p4({capability:"embedding",provider:A.provider,policy:_,target:G})}function XG(A,_){let G=A.providerEgress??o,$=o7(_,A.embedding);return p4({capability:"extraction",provider:_,policy:G,target:$})}function p5(A){if(!A.allowed)throw Error(A.reason??"Provider egress is not allowed by policy")}function p4(A){let{capability:_,provider:G,policy:$,target:K}=A;if(!K.required)return{required:!1,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[]};if($.consent!=="granted")return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider egress consent is not granted. Set providerEgress.consent to "granted" after reviewing what redacted memory content may leave this machine.`,warnings:[]};if(K.host){if(!new Set($.allowedHosts.map((Y)=>Y.toLowerCase())).has(K.host.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,host:K.host,reason:`Remote ${_} provider host ${K.host} is not in providerEgress.allowedHosts.`,warnings:[]}}else if(!new Set($.allowedProviders.map((Y)=>Y.toLowerCase())).has(G.toLowerCase()))return{required:!0,allowed:!1,capability:_,provider:G,target:K.target,reason:`Remote ${_} provider ${G} is not in providerEgress.allowedProviders.`,warnings:[]};return{required:!0,allowed:!0,capability:_,provider:G,target:K.target,host:K.host,warnings:[K.host?`Remote ${_} provider egress is enabled for host ${K.host}.`:`Remote ${_} provider egress is enabled for provider ${G}.`]}}function s7(A){switch(A.provider){case"local":return{required:!1,target:"local"};case"ollama":return b0(A.baseUrl??"http://localhost:11434","ollama");case"openai":return b0(A.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(A.baseUrl,"openai-compatible");default:return{required:!0,target:A.provider}}}function o7(A,_){switch(A){case"ollama":return b0(_.baseUrl??"http://localhost:11434","ollama");case"anthropic":return b0("https://api.anthropic.com","anthropic");case"openai":return b0(_.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return b0(_.baseUrl,"openai-compatible");case"claude-cli":return{required:!0,target:"claude-cli"};default:return{required:!0,target:A}}}function b0(A,_){if(!A)return{required:!0,target:_};try{let $=new URL(A).hostname;return{required:!l4($),target:$,host:!l4($)?$:void 0}}catch{return{required:!0,target:_}}}function l4(A){let _=A.toLowerCase();return _==="localhost"||_==="127.0.0.1"||_==="::1"||_.endsWith(".localhost")}var IM,OM;var n5=U(()=>{JA();IM=[...o.allowedHosts],OM=[...o.allowedProviders]});function q_(A){return{ready:!0,readyReason:A}}function f0(A){return{ready:!1,readyReason:A}}function VG(A,_,G){let $=HG(A,_);if($.source==="missing")return f0($.ref?"API key reference configured but not available at runtime; run through a secret injector or set embedding.apiKeyEnv":G);if($.deprecatedPlaintext)return q_("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return q_()}function BG(A,_,G){let $=HG(A,_);if(!$.apiKey)throw Error(`${G} API key is required. Set ${_.join(" or ")} or configure embedding.apiKeyEnv for runtime injection. apiKeyRef is an opaque reference and is not resolved by memory-nexus.`);return $.apiKey}function n4(A,_){if(!A.baseUrl)throw Error(`openai-compatible ${_} provider requires embedding.baseUrl`);return A.baseUrl}function AJ(){return i4.map((A)=>A.id)}function _J(){return a4.map((A)=>A.id)}function r4(A){return`Unsupported embedding provider: "${A}". Supported: ${AJ().join(", ")}`}function t4(A){return`Unsupported extraction provider: "${A}". Supported: ${_J().join(", ")}`}function e4(A){return[...a5.get(A)?.secretEnvVars??[]]}function s4(A){return[...E1.get(A)?.secretEnvVars??[]]}function o4(A,_=o){let G=a5.get(A.provider);if(!G)return f0(r4(A.provider));let $=G.checkReadiness(A);if(!$.ready)return $;let K=QG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function A9(A,_=o){let G=a5.get(A.provider);if(!G)throw Error(r4(A.provider));if(G.checkReadiness(A).ready)p5(QG(A,_));return G.create(A)}function g0(A,_=process.env){let G=_.LLM_PROVIDER?.trim();if(G)return G;let $=A.embedding?.provider??"claude-cli";return $==="local"?"claude-cli":$}function r5(A,_,G=process.env){let $=E1.get(_);if(!$)return"";return G.LLM_MODEL?.trim()||$.defaultModel}function _9(A,_=g0(A)){let G=E1.get(_);if(!G)return f0(t4(_));let $=G.checkReadiness(A.embedding);if(!$.ready)return $;let K=XG(A,_);if(!K.allowed)return f0(K.reason??"Provider egress is not allowed by policy");return $}function G9(A){let _=g0(A),G=E1.get(_);if(!G)throw Error(t4(_));if(G.checkReadiness(A.embedding).ready)p5(XG(A,_));return G.create(A.embedding,r5(A,_))}var M_,i5,i4,a4,a5,E1;var WG=U(()=>{JA();b4();f4();g4();c4();u4();m4();d4();h5();n5();M_=["OPENAI_API_KEY"],i5=["ANTHROPIC_API_KEY"],i4=[{id:"local",defaultModel:EA.local.model,defaultDimensions:EA.local.dimensions,secretEnvVars:[],checkReadiness:()=>q_(),create:(A)=>new c5({model:A.model,dimensions:A.dimensions})},{id:"openai",defaultModel:EA.openai.model,defaultDimensions:EA.openai.dimensions,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A)=>new F1({apiKey:BG(A,M_,"OpenAI embedding"),model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"ollama",defaultModel:EA.ollama.model,defaultDimensions:EA.ollama.dimensions,secretEnvVars:[],checkReadiness:()=>q_("Server reachability verified at sync time"),create:(A)=>new u5({model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"openai-compatible",defaultModel:EA["openai-compatible"].model,defaultDimensions:EA["openai-compatible"].dimensions,secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible embedding provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A)=>new F1({apiKey:BG(A,[],"openai-compatible embedding"),model:A.model,dimensions:A.dimensions,baseUrl:n4(A,"embedding"),providerId:"openai-compatible"})}],a4=[{id:"anthropic",defaultModel:V_.anthropic,secretEnvVars:i5,checkReadiness:(A)=>VG(A,i5,"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new m5({apiKey:BG(A,i5,"Anthropic extraction"),model:_})},{id:"openai",defaultModel:V_.openai,secretEnvVars:M_,checkReadiness:(A)=>VG(A,M_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new S1({apiKey:BG(A,M_,"OpenAI extraction"),model:_})},{id:"ollama",defaultModel:V_.ollama,secretEnvVars:[],checkReadiness:()=>q_(),create:(A,_)=>new l5({baseUrl:A.baseUrl,model:_})},{id:"claude-cli",defaultModel:V_["claude-cli"],secretEnvVars:[],checkReadiness:()=>q_(),create:()=>new d5},{id:"openai-compatible",defaultModel:V_["openai-compatible"],secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return f0("openai-compatible extraction provider requires embedding.baseUrl");return VG(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A,_)=>new S1({apiKey:BG(A,[],"openai-compatible extraction"),model:_,baseUrl:n4(A,"extraction"),providerId:"openai-compatible"})}],a5=new Map(i4.map((A)=>[A.id,A])),E1=new Map(a4.map((A)=>[A.id,A]))});import{createHash as GJ}from"crypto";import{existsSync as $J}from"fs";import{delimiter as KJ,join as ZJ}from"path";function D1(A,_={}){let G=_.env??process.env,$=_.commandResolver??((Y)=>WJ(Y,G,_.platform)),K=YJ(A,G),Z=new Map;for(let Y of $9){let J=$(Y.command);Z.set(Y.provider,{provider:Y.provider,optional:Y.optional,available:Boolean(J),status:J?"available":"optional_unavailable",statusSource:"path",allowedSignals:Y.allowedSignals,rawSecretAccess:"forbidden",warnings:[]})}for(let Y of K)if(!Z.has(Y.provider))Z.set(Y.provider,{provider:Y.provider,optional:!0,available:!1,status:"reference_only",statusSource:"reference",allowedSignals:["masked-metadata"],rawSecretAccess:"forbidden",warnings:[]});return{providers:Array.from(Z.values()),references:K,warnings:K.filter((Y)=>Y.status==="plaintext_config_deprecated").map((Y)=>`Deprecated plaintext secret configuration is present for ${Y.source}; migrate to runtime environment injection.`)}}function x1(A){let _=GJ("sha256").update(A).digest("hex").slice(0,12),G=JJ(A);if(!G)return{scheme:"unknown",provider:"unknown",maskedReference:`[redacted-ref:${_}]`,fingerprint:_};return{scheme:G.scheme,provider:G.provider,maskedReference:`${G.scheme}://[redacted:${_}]`,fingerprint:_}}function YJ(A,_){let G=A.embedding.apiKeyRef;if(!G)return[];let $=x1(G),K=QJ(A,_),Z=VJ(K.source);return[{source:"embedding.apiKeyRef",provider:$.provider,scheme:$.scheme,maskedReference:$.maskedReference,fingerprint:$.fingerprint,runtimeSecretSource:K.source,envVar:K.envVar,status:Z,note:BJ(Z)}]}function JJ(A){let _=/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(A);if(!_?.[1])return null;let G=_[1].toLowerCase(),$=HJ(G);return{scheme:G,provider:$}}function HJ(A){return $9.find((G)=>G.schemes.includes(A))?.provider??A}function QJ(A,_){let G=XJ(A,_);for(let $ of G)if(_[$])return{source:"environment",envVar:$};if(A.embedding.apiKey)return{source:"plaintext-config"};return{source:"missing"}}function XJ(A,_){let G=new Set;if(A.embedding.apiKeyEnv)G.add(A.embedding.apiKeyEnv);for(let K of e4(A.embedding.provider))G.add(K);let $=g0(A,_);for(let K of s4($))G.add(K);return Array.from(G)}function VJ(A){switch(A){case"environment":return"env_available";case"plaintext-config":return"plaintext_config_deprecated";case"missing":return"reference_only"}}function BJ(A){switch(A){case"env_available":return"Runtime environment contains the referenced provider secret; the value was not returned.";case"plaintext_config_deprecated":return"Deprecated plaintext config is present; migrate to environment injection or embedding.apiKeyEnv.";case"reference_only":return"Run through a secret injector or set embedding.apiKeyEnv."}}function WJ(A,_,G=process.platform){let $=_.PATH??"";if(!$)return null;let K=G==="win32"?zJ(_.PATHEXT):[""];for(let Z of $.split(KJ)){if(!Z)continue;for(let Y of K){let J=ZJ(Z,`${A}${Y}`);if($J(J))return J}}return null}function zJ(A){let _=A?.split(";").filter((G)=>G.trim()!=="");return _&&_.length>0?_:[".EXE",".CMD",".BAT",".COM"]}var $9;var K9=U(()=>{WG();$9=[{provider:"authkey",schemes:["authkey"],command:"authkey",optional:!0,allowedSignals:["env-injection","masked-metadata","proofs","fingerprints"]}]});var t5=U(()=>{K9()});import{Database as s5}from"bun:sqlite";import{accessSync as Z9,constants as Y9,existsSync as y1,readFileSync as NJ,statSync as LJ}from"fs";import{homedir as MJ}from"os";import{join as e5}from"path";function X9(A){try{return A.query("PRAGMA integrity_check(1);").get()?.integrity_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function o5(A){try{return A.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function U_(A){if(!y1(A))return{readable:!1,writable:!1};let _=!1,G=!1;try{Z9(A,Y9.R_OK),_=!0}catch{}try{Z9(A,Y9.W_OK),G=!0}catch{}return{readable:_,writable:G}}function A2(A,_,G,$){let K=$??bA(G),Z=f(_),J=N_(1,A)[0];return{installed:K.sessionEnd&&K.preCompact,enabled:Z.autoSync,lastRun:J?new Date(J.timestamp):null}}function _2(A){let _=[];try{let G=qJ(A),$=f(A);if(typeof $.autoSync!=="boolean")_.push("autoSync is not a boolean");if(typeof $.recoveryOnStartup!=="boolean")_.push("recoveryOnStartup is not a boolean");if(typeof $.syncOnCompaction!=="boolean")_.push("syncOnCompaction is not a boolean");if(typeof $.timeout!=="number"||!Number.isFinite($.timeout)||$.timeout<0)_.push("timeout is not a valid positive number");if(!J9.includes($.logLevel))_.push(`logLevel "${$.logLevel}" is not valid (expected: ${J9.join(", ")})`);if(typeof $.logRetentionDays!=="number"||!Number.isFinite($.logRetentionDays)||$.logRetentionDays<0)_.push("logRetentionDays is not a valid positive number");if(typeof $.showFailures!=="boolean")_.push("showFailures is not a boolean");if(!P1.includes($.providerEgress.consent))_.push(`providerEgress.consent "${$.providerEgress.consent}" is not valid (expected: ${P1.join(", ")})`);if(!Array.isArray($.providerEgress.allowedHosts)||!$.providerEgress.allowedHosts.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if(!Array.isArray($.providerEgress.allowedProviders)||!$.providerEgress.allowedProviders.every((K)=>typeof K==="string"&&K.trim()!==""))_.push("providerEgress.allowedProviders must be an array of non-empty strings");for(let K of G)if(!_.includes(K))_.push(K);return{valid:_.length===0,issues:_}}catch(G){let $=L(G);return _.push(`Failed to load config: ${$}`),{valid:!1,issues:_}}}function qJ(A){let _=[],G=W_(A);if(!y1(G))return _;try{let $=JSON.parse(NJ(G,"utf-8"));if(!Q9($)||$.providerEgress===void 0)return _;let K=$.providerEgress;if(!Q9(K))return["providerEgress must be an object"];if("consent"in K&&(typeof K.consent!=="string"||!P1.includes(K.consent)))_.push(`providerEgress.consent "${String(K.consent)}" is not valid (expected: ${P1.join(", ")})`);if("allowedHosts"in K&&!H9(K.allowedHosts))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if("allowedProviders"in K&&!H9(K.allowedProviders))_.push("providerEgress.allowedProviders must be an array of non-empty strings")}catch{return _}return _}function H9(A){return Array.isArray(A)&&A.every((_)=>typeof _==="string"&&_.trim()!=="")}function Q9(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function G2(){try{let A=U0("sqlite-vec"),_=new s5(":memory:");try{return A.load(_),{available:!0,version:_.query("SELECT vec_version()").get()["vec_version()"]}}finally{_.close()}}catch{return{available:!1,version:null}}}function $2(A){let _=f(A),G=_.embedding,$=o4(G,_.providerEgress);return{configured:!0,provider:G.provider,model:G.model,dimensions:G.dimensions,enabled:G.enabled,ready:$.ready,readyReason:$.readyReason}}function UJ(A){let _=f(A),G=g0(_),$=_9(_,G);return{provider:G,model:r5(_,G),ready:$.ready,readyReason:$.readyReason}}function K2(A){let _=f(A),G=g0(_),$=_.embedding.enabled?QG(_.embedding,_.providerEgress):{required:!1,allowed:!0,target:"disabled",capability:"embedding",provider:_.embedding.provider,warnings:[]},K=XG(_,G);return{consent:_.providerEgress.consent,embedding:$,llmExtraction:K,warnings:[...$.warnings,...K.warnings]}}function V9(A,_={}){let G=f(A);return D1(G,_)}function k1(A){let _=A?.dbPath??S(),G=IJ(_),$=A?.configDir??C0(),K=A?.logsDir??z_(),Z=A?.sourceDir??e5(MJ(),".claude","projects"),Y=A?.logsDir?e5(A.logsDir,"sync.log"):void 0,J=A?.configDir?e5(A.configDir,"config.json"):void 0,H=U_($),Q=U_(K),X=U_(Z),V={configDir:H.readable&&H.writable,logsDir:Q.readable&&Q.writable,sourceDir:X.readable},B=A2(Y,J,A?.hookOverrides,A?.preCalculatedHookStatus),W=_2(J),N=f(J),z=$2(J),q=G2(),I=TJ(_,q,N),T=UJ(J),M=K2(J),O=D1(N,A?.capabilityInterop);return{database:G,permissions:V,hooks:B,config:W,embedding:z,sqliteVec:q,searchCapability:I,llmExtraction:T,providerEgress:M,capabilityInterop:O}}function TJ(A,_,G){let $=0,K=0;try{if(y1(A)){let Y=new s5(A,{create:!1,readonly:!0});try{$=Y.query("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0,K=Y.query("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}finally{Y.close()}}}catch{}let Z=K>0?Math.round($/K*100):0;return{fts5:!0,sqliteVec:_.available,embeddedCount:$,totalMessages:K,coveragePercent:Z,defaultMode:G.search?.defaultMode??"auto",vectorReady:_.available&&$>0}}function IJ(A){if(!y1(A))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let G=U_(A),$=0;try{$=LJ(A).size}catch{}let K="unknown";if(G.readable)try{let Z=new s5(A,{create:!1,readonly:!0});try{K=o5(Z)}finally{Z.close()}}catch{K="corrupted"}return{exists:!0,readable:G.readable,writable:G.writable,integrity:K,size:$}}var J9,P1;var B9=U(()=>{S5();L_();WG();n5();t5();J9=["debug","info","warn","error"],P1=["unset","granted","denied"]});var Z2={};k(Z2,{runHealthCheck:()=>k1,initializeDatabaseSafe:()=>G4,initializeDatabase:()=>D,getDefaultDbPath:()=>S,createSchema:()=>V1,closeDatabase:()=>E,checkpointDatabase:()=>_4,checkSqliteVecAvailability:()=>G2,checkQuickIntegrity:()=>o5,checkProviderEgressHealth:()=>K2,checkHookStatus:()=>A2,checkFts5Support:()=>AG,checkEmbeddingConfig:()=>$2,checkDirectoryPermissions:()=>U_,checkDatabaseIntegrity:()=>X9,checkConfigValidity:()=>_2,checkCapabilityInteropHealth:()=>V9,bulkOperationCheckpoint:()=>N1,TOPICS_TABLE:()=>h6,TOOL_USES_TABLE:()=>y6,SqliteToolUseRepository:()=>X0,SqliteStatsService:()=>V0,SqliteSessionRepository:()=>m,SqliteProjectResolver:()=>w0,SqlitePersonaRepository:()=>SA,SqliteMessageRepository:()=>WA,SqliteMemoryUtilityRepository:()=>h0,SqliteMemoryGovernanceRepository:()=>s,SqliteLinkRepository:()=>J_,SqliteGraphRepository:()=>lA,SqliteFrictionRepository:()=>RA,SqliteExtractionStateRepository:()=>Q0,SqliteContextService:()=>v0,SqliteBackfillStateRepository:()=>KG,SESSIONS_TABLE:()=>D6,SCHEMA_SQL:()=>I5,PERSONA_ENTRIES_TABLE:()=>m6,MESSAGE_EMBEDDINGS_TABLE:()=>C6,MESSAGES_META_TABLE:()=>x6,MESSAGES_FTS_TABLE:()=>P6,MEMORY_UTILITY_METRICS_TABLE:()=>l6,MEMORY_GOVERNANCE_TABLE:()=>c6,MEMORY_GOVERNANCE_EVENTS_TABLE:()=>u6,LINKS_TABLE:()=>k6,HybridSearchService:()=>X_,GRAPH_EDGES_TABLE:()=>d6,Fts5SearchService:()=>Q_,FRICTION_LOG_TABLE:()=>f6,EmbeddingRepository:()=>dA,EXTRACTION_STATE_TABLE:()=>v6,EMBEDDING_STATE_TABLE:()=>w6,EMBEDDING_STATE_ADD_MODEL_NAME:()=>b6,BACKFILL_STATE_TABLE:()=>g6});var u=U(()=>{O5();S5();k5();R4();B9()});import{readdir as Y2,stat as zG}from"fs/promises";import{join as NG}from"path";import{homedir as OJ}from"os";class z0{claudeProjectsDir;resolver;constructor(A){this.claudeProjectsDir=A?.claudeDir??NG(OJ(),".claude","projects"),this.resolver=A?.projectNameResolver}async discoverSessions(){let A=[];try{await zG(this.claudeProjectsDir)}catch{return A}let _;try{_=await Y2(this.claudeProjectsDir)}catch{return A}for(let G of _){let $=NG(this.claudeProjectsDir,G);try{if(!(await zG($)).isDirectory())continue}catch{continue}let K;try{if(K=$A.fromEncoded(G),this.resolver){let Z=this.resolver.resolveFromEncodedPath(G);if(Z!==K.projectName)K=K.withProjectName(Z)}}catch{continue}await this.scanProjectDirectory($,K,A)}return A}async getSessionFile(A){return(await this.discoverSessions()).find(($)=>$.id===A)?.path??null}async scanProjectDirectory(A,_,G){let $;try{$=await Y2(A)}catch{return}for(let K of $){let Z=NG(A,K);try{let Y=await zG(Z);if(Y.isFile()&&K.endsWith(".jsonl")){let J=K.slice(0,-6);G.push({id:J,path:Z,projectPath:_,modifiedTime:Y.mtime,size:Y.size})}else if(Y.isDirectory())await this.scanSubagentsDirectory(Z,_,G)}catch{continue}}}async scanSubagentsDirectory(A,_,G){let $=NG(A,"subagents");try{if(!(await zG($)).isDirectory())return}catch{return}let K;try{K=await Y2($)}catch{return}for(let Z of K){if(!Z.endsWith(".jsonl"))continue;let Y=NG($,Z);try{let J=await zG(Y);if(J.isFile()){let H=Z.slice(0,-6);G.push({id:H,path:Y,projectPath:_,modifiedTime:J.mtime,size:J.size})}}catch{continue}}}}var W9=()=>{};import{readdirSync as jJ,statSync as RJ}from"fs";function FJ(A){return A.replace(/ /g,"-").replace(/-/g,"-")}class h1{rootDir;cache=new Map;dirCache=new Map;constructor(A){this.rootDir=A}resolveFromEncodedPath(A){let _=/^[A-Za-z]--/,G=A;if(_.test(G))G=G.slice(3);else if(G.startsWith("-"))G=G.slice(1);return this.resolveProjectName(G)}resolveProjectName(A){let _=this.cache.get(A);if(_!==void 0)return _;let G=this.walkAndResolve(this.rootDir,A);return this.cache.set(A,G),G}walkAndResolve(A,_){if(_==="")return"";let G=this.listSubdirectories(A),$=[];for(let Z of G){let Y=FJ(Z);$.push({name:Z,encoded:Y})}$.sort((Z,Y)=>Y.encoded.length-Z.encoded.length);for(let Z of $){if(_===Z.encoded)return Z.name;if(_.startsWith(Z.encoded+"-")){let Y=_.slice(Z.encoded.length+1),J=`${A}/${Z.name}`,H=this.walkAndResolve(J,Y);if(H!==this.fallbackLastSegment(Y))return H;return H}}let K=this.probeHiddenDirectories(A,_);if(K!==void 0)return K;return this.fallbackLastSegment(_)}probeHiddenDirectories(A,_){let G=_.split("-");for(let $=1;$<G.length;$++){let K=G.slice(0,$).join("-"),Z=`${A}/${K}`;if(this.isDirectory(Z)){let Y=G.slice($).join("-");if(Y==="")return K;let J=this.walkAndResolve(Z,Y);if(J!==this.fallbackLastSegment(Y))return J}}return}isDirectory(A){try{return RJ(A).isDirectory()}catch{return!1}}listSubdirectories(A){let _=this.dirCache.get(A);if(_!==void 0)return _;try{let $=jJ(A,{withFileTypes:!0}).filter((K)=>K.isDirectory()).map((K)=>K.name);return this.dirCache.set(A,$),$}catch{return this.dirCache.set(A,[]),[]}}fallbackLastSegment(A){let _=A.split("-");return _[_.length-1]??""}}var z9=()=>{};import{readdir as SJ,readFile as EJ,stat as DJ}from"fs/promises";import{join as xJ,relative as PJ}from"path";import{createHash as yJ}from"crypto";class v1{async discoverFiles(){let A=f_();try{await DJ(A)}catch{return[]}let _=[];return await this.scanDirectory(A,A,_),_}async scanDirectory(A,_,G){let $;try{$=await SJ(A,{withFileTypes:!0})}catch{return}for(let K of $){let Z=xJ(A,K.name);if(K.isDirectory())await this.scanDirectory(Z,_,G);else if(K.isFile()&&K.name.endsWith(".md")){let Y=PJ(_,Z).split("\\").join("/"),J=this.classifyFileType(Y);if(!J)continue;let H=await EJ(Z,"utf8"),Q=yJ("sha256").update(H,"utf8").digest("hex"),X=this.extractProjectEncoded(Y);G.push({filePath:Y,absolutePath:Z,fileType:J,projectEncoded:X,contentHash:Q,content:H})}}}classifyFileType(A){if(A.startsWith("daily/"))return"daily_log";if(A.endsWith("DECISIONS.md"))return"decisions";if(A.endsWith("LEARNINGS.md"))return"learnings";if(A.endsWith("USER-PREFS.md"))return"user_prefs";return null}extractProjectEncoded(A){return A.match(/^projects\/([^/]+)\//)?.[1]??void 0}}var N9=U(()=>{c()});var LG=U(()=>{W9();z9();N9()});function DA(A,_){let G=_??new Date,$=A.getTime()-G.getTime(),K=Math.abs($);if(K<3600000){let Y=Math.round($/60000);return MG.format(Y,"minute")}if(K<86400000){let Y=Math.round($/3600000);return MG.format(Y,"hour")}if(K<604800000){let Y=Math.round($/86400000);return MG.format(Y,"day")}if(K<2592000000){let Y=Math.round($/604800000);return MG.format(Y,"week")}let Z=Math.round($/2592000000);return MG.format(Z,"month")}function c0(A){let _=A.getFullYear(),G=String(A.getMonth()+1).padStart(2,"0"),$=String(A.getDate()).padStart(2,"0"),K=String(A.getHours()).padStart(2,"0"),Z=String(A.getMinutes()).padStart(2,"0");return`${_}-${G}-${$} ${K}:${Z}`}function vA(A,_){let G=DA(A,_),$=c0(A);return`${G} (${$})`}var MG;var N0=U(()=>{MG=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function v(A){let _=A?.noColor??!!process.env.NO_COLOR,G=A?.forceColor??!!process.env.FORCE_COLOR,$=A?.isTTY??process.stdout.isTTY===!0;if(_)return!1;if(G)return!0;return $}function O_(A,_,G){if(!G)return A;return`\x1B[${_}m${A}\x1B[0m`}function KA(A,_){return O_(A,"1",_??v())}function P(A,_){return O_(A,"2",_??v())}function C(A,_){return O_(A,"32",_??v())}function d(A,_){return O_(A,"31",_??v())}function l(A,_){return O_(A,"33",_??v())}function E9(A,_){return O_(A,"36",_??v())}import D9 from"string-width";function Q2(A){return D9(A)}function X2(A,_){if(_<=0)return"";if(Q2(A)<=_)return A;let G="...",$=3;if(_<=$)return".".repeat(_);let K=_-$,Z="",Y=0;for(let J of A){let H=D9(J);if(Y+H>K)break;Z+=J,Y+=H}return Z+G}function c1(A,_){let G=Q2(A);if(G>=_)return A;return A+" ".repeat(_-G)}function V2(){return process.stdout.columns||80}function B2(A,_,G=20){let $=V2(),K=Q2(_),Z=$-K;return X2(A,Z>G?Z:G)}var W2=()=>{};function u1(A,_={}){let G=h9(A.snippet),$=A.snippet.replace(/<\/?mark>/g,""),K={sessionId:A.sessionId,messageId:A.messageId,role:A.role,score:A.score,timestamp:A.timestamp.toISOString(),snippet:$};if(_.includeSearchMetaFields){if(_.rank!==void 0)K.rank=_.rank;let Z=A.rawScores;if(Z)K.raw_scores=Z;if(A.source)K.source=A.source;if(G.length>0)K.highlights=G}return K}function x9(A){let _={score:A.score,file:A.file,title:A.title};if(A.docid!==void 0)_.docid=A.docid;if(A.context!==void 0)_.context=A.context;if(A.snippet!==void 0)_.snippet=A.snippet;return _}function m1(A){let _={id:A.id,project:A.projectPath.projectName,projectPath:A.projectPath.decoded,startTime:A.startTime.toISOString()};if(A.endTime)_.endTime=A.endTime.toISOString();if(A.messageCount!==void 0)_.messageCount=A.messageCount;if(A.summary!==void 0)_.summary=A.summary;return _}function P9(A){return{session:m1(A.session),messages:A.messages.map(rJ),toolUses:Array.from(A.toolUses.values()).map(tJ)}}function rJ(A){return{id:A.id,role:A.role,timestamp:A.timestamp.toISOString(),content:A.content}}function tJ(A){let _={id:A.id,name:A.name,status:A.status,input:A.input};if(A.result!==void 0)_.result=A.result;return _}function y9(A){return{session:m1(A.session),weight:A.weight,hops:A.hops}}function z2(A){let _={totalSessions:A.totalSessions,totalMessages:A.totalMessages,totalToolUses:A.totalToolUses,databaseSizeBytes:A.databaseSizeBytes,projectBreakdown:A.projectBreakdown.map((G)=>({projectName:G.projectName,sessionCount:G.sessionCount,messageCount:G.messageCount}))};if(A.hooks)_.hooks={installed:A.hooks.installed,autoSync:A.hooks.autoSync,pendingSessions:A.hooks.pendingSessions};return _}function k9(A){return{projectName:A.projectName,projectPathDecoded:A.projectPathDecoded,sessionCount:A.sessionCount,totalMessages:A.totalMessages,userMessages:A.userMessages,assistantMessages:A.assistantMessages,recentTopics:[...A.recentTopics],recentToolUses:A.recentToolUses.map((_)=>({name:_.name,count:_.count})),lastActivity:A.lastActivity?A.lastActivity.toISOString():null}}var L0=U(()=>{d1()});function N2(A,_){switch(A){case"json":return new b9;case"quiet":return new f9;case"verbose":return new g9(_);case"brief":return new C9;default:return new w9(_)}}function h9(A){let _=[],G=0,$=0;while($<A.length)if(A.startsWith("<mark>",$)){$+=6;let K=A.indexOf("</mark>",$);if(K===-1)break;_.push({offset:G,length:K-$}),G+=K-$,$=K+7}else G++,$++;return _}function v9(A,_){if(!_)return A.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return A.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class w9{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??j_;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $=`Found ${A.length} result(s):
|
|
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)=>u1(Z,{rank:Y+1,includeSearchMetaFields:!!_?.searchMeta}));if(_?.searchMeta){let Z={query:_.query??"",mode:_.searchMeta.mode,mode_reason:_.searchMeta.modeReason,total_results:A.length,embedding_coverage:_.searchMeta.embeddingCoverage,degraded:_.searchMeta.degraded,capabilities:_.searchMeta.capabilities,timing_ms:_.searchMeta.timingMs};if(_.searchMeta.degradationReason)Z.degradation_reason=_.searchMeta.degradationReason;return JSON.stringify({meta:Z,results:$},null,2)}let K=JSON.stringify($,null,2);if(K.length>G){let Z=$.length;while(Z>0){let Y=$.slice(0,Z);if(K=JSON.stringify(Y,null,2),K.length<=G)break;Z--}}return K}formatError(A){let _=L(A);return JSON.stringify({error:_})}formatSummary(A){return""}}class f9{formatResults(A,_){if(A.length===0)return"";let G=V2();return A.map(($)=>{let K=$.sessionId.substring(0,16),Z=$.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),Y=`${K} ${Z}`;return X2(Y,G)}).join(`
|
|
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 d1=U(()=>{N0();W2();L0()});function L2(A,_){switch(A){case"json":return new m9;case"quiet":return new d9;case"verbose":return new l9(_);case"brief":return new u9;default:return new c9(_)}}function l1(A,_,G){return A===1?_:G}class c9{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G=A.length,$=`Sessions (${G} ${l1(G,"result","results")}):
|
|
1234
|
+
|
|
1235
|
+
`;for(let K of A)$+=this.formatSession(K);return $}formatSession(A){let _=A.id.substring(0,8),G=A.projectPath.projectName,$=DA(A.startTime),K=A.messageCount,Z=`${K} ${l1(K,"message","messages")}`,Y=c1(_,10),J=c1(G,20),H=c1($,18);return` ${Y}${J}${H}${P(Z,this.useColor)}
|
|
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 (${$} ${l1($,"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} ${l1(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
|
|
829
|
-
|
|
830
|
-
`,
|
|
831
|
-
`,
|
|
832
|
-
`,
|
|
833
|
-
`,
|
|
834
|
-
`,
|
|
835
|
-
|
|
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
|
|
838
|
-
`,
|
|
839
|
-
`}if(
|
|
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
|
-
`,
|
|
842
|
-
`,
|
|
843
|
-
`,
|
|
844
|
-
|
|
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
|
|
847
|
-
`)}formatError(
|
|
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
|
|
851
|
-
`,
|
|
852
|
-
|
|
853
|
-
`;if(
|
|
854
|
-
|
|
855
|
-
`,
|
|
856
|
-
`,
|
|
857
|
-
`,
|
|
858
|
-
`,
|
|
859
|
-
`,
|
|
860
|
-
|
|
861
|
-
Projects (${
|
|
862
|
-
`;for(let
|
|
863
|
-
`,
|
|
864
|
-
`}}if(
|
|
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
|
-
`,
|
|
867
|
-
`,
|
|
868
|
-
`,
|
|
869
|
-
|
|
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
|
|
872
|
-
${
|
|
873
|
-
|
|
874
|
-
`).trim()}var
|
|
875
|
-
`;let
|
|
876
|
-
`;let
|
|
877
|
-
`;let
|
|
878
|
-
`;return
|
|
879
|
-
`,
|
|
880
|
-
|
|
881
|
-
`,
|
|
882
|
-
`,
|
|
883
|
-
`,
|
|
884
|
-
|
|
885
|
-
`;else
|
|
886
|
-
`;if(
|
|
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:()=>p1});function p1(A,_){switch(A){case"json":return new e9;case"quiet":return new s9;case"verbose":return new o9(_);case"detailed":return new O2(_);case"ai":return new A3;case"brief":case"default":default:return new I2(_)}}function M0(A){return new Intl.NumberFormat("en-US").format(A)}function sJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.map((Z)=>`${Z.name} (${Z.count})`).join(", ");if($>0)return`${K} (+${$} more)`;return K}function oJ(A,_=3){if(A.length===0)return"";let G=A.slice(0,_),$=A.length-_,K=G.join(", ");if($>0)return`${K} (+${$} more)`;return K}class I2{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";G+=KA(`${A.projectName} Context`,this.useColor)+`
|
|
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
|
-
|
|
889
|
-
`;else
|
|
890
|
-
`,this.useColor);if(
|
|
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
|
-
|
|
893
|
-
`;else
|
|
894
|
-
`,this.useColor);return
|
|
895
|
-
`,
|
|
896
|
-
`;if(
|
|
897
|
-
`;
|
|
898
|
-
`}return
|
|
899
|
-
${
|
|
900
|
-
${
|
|
901
|
-
[truncated]`;
|
|
902
|
-
|
|
903
|
-
`+
|
|
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(
|
|
908
|
-
|
|
909
|
-
(budget: ~${
|
|
910
|
-
`;return
|
|
911
|
-
`})
|
|
912
|
-
`;return
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
`})
|
|
921
|
-
`)}formatError(
|
|
922
|
-
`,
|
|
923
|
-
`,
|
|
924
|
-
`;return
|
|
925
|
-
${
|
|
926
|
-
`).length:0;return`${
|
|
927
|
-
`).filter(Boolean).length??0} files`;case"Grep":return
|
|
928
|
-
`)}function
|
|
929
|
-
`;if(
|
|
930
|
-
${
|
|
931
|
-
`)}formatError(
|
|
932
|
-
`)}formatError(
|
|
933
|
-
`)}formatError(
|
|
934
|
-
${
|
|
935
|
-
`)}formatError(
|
|
936
|
-
`)}function
|
|
937
|
-
${
|
|
938
|
-
${
|
|
939
|
-
`;if(
|
|
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 n1=U(()=>{N0();nA()});function j2(A,_){switch(A){case"json":return new K3;case"quiet":return new Z3;case"verbose":return new Y3(_);case"detailed":return new R2(_);case"brief":case"default":default:return new $3(_)}}function G3(A,_){let G=`${Math.round(A*100)}%`;if(!_)return G;if(A>0.75)return C(G,_);if(A>=0.5)return l(G,_);return G}function AH(A){return A===1?"1 hop":`${A} hops`}function _H(A){return`${A===1?"1":`${A}`} (${A===1?"direct":"indirect"})`}class $3{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
|
|
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 a1(A,_){switch(A){case"json":return new X3;case"quiet":return new V3;case"verbose":return new B3(_);case"tools":return new i1(_);case"brief":return new H3;default:return new Q3(_)}}function S2(A){let _=A.replace(/\\/g,"/").split("/");return _[_.length-1]||A}function J3(A){switch(A.name){case"Read":{let _=A.input.file_path,G=A.result?A.result.split(`
|
|
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 i1{useColor;static RESULT_TRUNCATE_LENGTH=500;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(E2(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(D2($,A.toolUses,this.useColor,!1)),$.role==="assistant"&&$.hasToolUses)for(let K of $.toolUses){let Z=A.toolUses.get(K);if(Z){if(G.push(""),G.push(` [TOOL: ${Z.name}]`),G.push(` Input: ${JSON.stringify(Z.input)}`),Z.result){let Y=Z.result.length>i1.RESULT_TRUNCATE_LENGTH?Z.result.substring(0,i1.RESULT_TRUNCATE_LENGTH)+"...":Z.result;G.push(` Result: ${Y}`)}G.push(` Status: ${Z.status}`)}}G.push("")}return G.join(`
|
|
1362
|
+
`)}formatError(A){return`Error: ${L(A)}`}formatNotFound(A){return`Session not found: ${A}`}}var x2=U(()=>{N0()});function W3(A){switch(A){case j.DB_CONNECTION_FAILED:return"Check database file permissions";case j.DB_CORRUPTED:return"Run 'memory doctor' to diagnose or recreate database";case j.DB_LOCKED:return"Wait and retry, or check for other running processes";case j.INVALID_SESSION_ID:return"Check session ID format (expected UUID)";case j.SESSION_NOT_FOUND:return"Run 'memory list' to see available sessions";case j.SOURCE_INACCESSIBLE:return"Check that ~/.claude/projects exists and is readable";case j.DISK_FULL:return"Free up disk space and retry";case j.INVALID_JSON:return"Check file for JSON syntax errors";case j.UNKNOWN_FORMAT:return"File may be incompatible with current version";case j.SYNC_INTERRUPTED:return"Run 'memory sync' again to resume";case j.SYNC_FAILED:return`Check logs at ${QA()} for details`;case j.INVALID_ARGUMENT:return"Run command with --help to see valid options";case j.MISSING_ARGUMENT:return"Run command with --help to see required arguments";case j.VECTOR_UNAVAILABLE:return"Run 'memory sync --embed' to generate embeddings, or use '--mode fts' for keyword-only search";case j.PROVIDER_TIMEOUT:return"Check network connection or switch to local provider in config";case j.PROVIDER_CONFIG_INVALID:return"Check embedding config in ~/.config/memory/config.json";case j.EMBEDDING_DIMENSION_MISMATCH:return"Run 'memory sync --embed' to re-embed with the current model";case j.MODEL_CORRUPTED:return"Delete cached model files and run 'memory sync --embed' to re-download";case j.NOT_FOUND:return"Check the ID and try again";case j.INVALID_STATE:return"The entity is not in a valid state for this operation";case j.UNKNOWN:default:return null}}function $H(A,_){if(typeof _==="string"||typeof _==="number")return` ${A}: ${_}`;return` ${A}: ${JSON.stringify(_)}`}function i(A,_={}){let G=_.useColor??v(),$=[];if(A instanceof F){let K=d(`Error [${A.code}]:`,G);if($.push(`${K} ${A.message}`),A.context&&Object.keys(A.context).length>0)for(let[Y,J]of Object.entries(A.context))$.push($H(Y,J));let Z=W3(A.code);if(Z)$.push(""),$.push(`Suggestion: ${Z}`)}else{let K=d("Error:",G);$.push(`${K} ${A.message}`)}if(_.verbose&&A.stack)$.push(""),$.push("Stack trace:"),$.push(A.stack);return $.join(`
|
|
1363
|
+
`)}function qG(A){if(A instanceof F)return JSON.stringify(A.toJSON());let _={error:{code:"UNKNOWN",message:A.message}};return JSON.stringify(_)}var iA=U(()=>{z1();c()});function z3(A){return{schema_version:"1",command:A.command,kind:A.kind,...A.scope!==void 0?{scope:A.scope}:{},...A.meta!==void 0?{meta:A.meta}:{},data:A.data}}function N3(A){return{schema_version:"1",command:A.command,error:{code:A.code,message:A.message,...A.context!==void 0?{context:A.context}:{}}}}function e(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(z3({...A,command:_}),null,2))}function h(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(N3({...A,command:_}),null,2))}var zA=()=>{};var t1={};k(t1,{writeLock:()=>U3,spawnBackgroundEmbedding:()=>WH,removeLock:()=>r1,readLock:()=>v2,isProcessAlive:()=>w2,isBackgroundEmbedding:()=>NH,cleanupLock:()=>zH,acquireLock:()=>T3});import{spawn as HH}from"child_process";import{existsSync as QH,readFileSync as XH,writeFileSync as VH,unlinkSync as BH,mkdirSync as M3,openSync as L3}from"fs";import{join as q3}from"path";function h2(A){return q3(A??n(),"embedding.lock")}function U3(A,_){let G=h2(_),$=_??n();M3($,{recursive:!0}),VH(G,JSON.stringify(A))}function v2(A){let _=h2(A);if(!QH(_))return null;try{return JSON.parse(XH(_,"utf-8"))}catch{return null}}function r1(A){let _=h2(A);try{BH(_)}catch{}}function w2(A){try{return process.kill(A,0),!0}catch{return!1}}function T3(A,_,G){let $=v2(G);if($){if(w2($.pid))return{acquired:!1,existingPid:$.pid,startedAt:$.startedAt};r1(G)}return U3({pid:A,startedAt:new Date().toISOString(),totalMessages:_},G),{acquired:!0,staleRemoved:$!==null}}function WH(A){let{dataDir:_,logDir:G,command:$=process.execPath}=A??{},K=v2(_);if(K&&w2(K.pid))return{started:!1,reason:"already_running",pid:K.pid};if(K)r1(_);let Z=G??QA();M3(Z,{recursive:!0});let Y=q3(Z,"sync.log"),J=L3(Y,"a"),H=L3(Y,"a"),X=[process.argv[1]??"","sync","--embed","--quiet"],V=HH($,X,{detached:!0,stdio:["ignore",J,H],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(V.unref(),V.pid===void 0)return{started:!1,reason:"spawn_failed"};let B=T3(V.pid,0,_);if(!B.acquired)return{started:!1,reason:"already_running",pid:B.existingPid};return{started:!0,pid:V.pid}}function zH(A){r1(A)}function NH(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var e1=U(()=>{c()});var b2={};k(b2,{EmbeddingProviderFactory:()=>s1});import{createHash as MH}from"crypto";class s1{cache=new Map;cacheKey(A,_){let G=A.apiKey?MH("sha256").update(A.apiKey).digest("hex").slice(0,16):"";return[A.provider,A.model,String(A.dimensions),A.baseUrl??"",A.apiKeyEnv??"",A.apiKeyRef??"",G,_.consent,_.allowedHosts.join(","),_.allowedProviders.join(",")].join(":")}create(A,_=o){let G=this.cacheKey(A,_),$=this.cache.get(G);if($)return $;let K=A9(A,_);return this.cache.set(G,K),K}createFromConfig(A){let _=A.embedding??B_;if(!_.enabled)return null;return this.create(_,A.providerEgress??o)}async dispose(){for(let A of this.cache.values())await A.dispose();this.cache.clear()}}var o1=U(()=>{JA();WG()});var v3={};k(v3,{mergeMemoryBlock:()=>k3,AutoMemoryWriter:()=>h3});import{existsSync as qH,mkdirSync as P3,readFileSync as UH,writeFileSync as c2}from"fs";import{join as y3}from"path";function k3(A,_){let G=`${u2}
|
|
1364
|
+
${_}
|
|
1365
|
+
${A$}
|
|
1366
|
+
`;if(A.length===0)return G;let $=A.indexOf(u2),K=A.indexOf(A$);if($!==-1&&K!==-1){let Y=A.substring(0,$),J=A.substring(K+A$.length);return`${Y}${G}${J}`}let Z=A.endsWith(`
|
|
940
1367
|
`)?`
|
|
941
1368
|
`:`
|
|
942
1369
|
|
|
943
|
-
`;return`${
|
|
944
|
-
${
|
|
945
|
-
${
|
|
946
|
-
`;if(!
|
|
947
|
-
`,"utf-8")}async function*
|
|
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
|
+
${A$}
|
|
1373
|
+
`;if(!qH(G)){c2(G,$,"utf-8");return}let K=UH(G,"utf-8"),Z=k3(K,_);c2(G,Z,"utf-8")}}var u2="<!-- memory-cli:start -->",A$="<!-- memory-cli:end -->";var w3=()=>{};var c3={};k(c3,{sanitizeGitEnvironment:()=>b3,runGitCommand:()=>f3,GitRemoteEventTransport:()=>g3});import{createHash as IH}from"crypto";import{existsSync as OH,mkdirSync as jH,readFileSync as RH}from"fs";import{basename as FH,join as C3}from"path";var{spawn:SH}=globalThis.Bun;function b3(A=process.env){let _={};for(let G of EH){let $=A[G];if($!==void 0)_[G]=$}return _.GIT_TERMINAL_PROMPT="0",_.GIT_PAGER="cat",_.GIT_OPTIONAL_LOCKS="0",_}async function f3(A,_,G={}){let $=SH(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:b3(G.env)}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}class g3{eventsDir;runGit;deps;constructor(A,_={}){this.eventsDir=A;let G=_.env??process.env;this.runGit=_.runGit??(($,K)=>f3($,K,{env:G})),this.deps={existsSync:OH,mkdirSync:jH,readFileSync:RH,getAllLogFiles:UA,..._}}async isRepository(){return this.deps.existsSync(C3(this.eventsDir,".git"))}async initRepository(A){this.deps.mkdirSync(this.eventsDir,{recursive:!0});let _=await this.runGit(["init"],this.eventsDir);if(!_.success)return NA(_,"Failed to initialize Git repository in events directory");let G=await this.runGit(["config","user.name",A.userName],this.eventsDir);if(!G.success)return NA(G,"Failed to configure Git user.name");let $=await this.runGit(["config","user.email",A.userEmail],this.eventsDir);if(!$.success)return NA($,"Failed to configure Git user.email");let K=await this.runGit(["symbolic-ref","HEAD","refs/heads/main"],this.eventsDir);if(!K.success)return NA(K,"Failed to configure Git main branch");return{success:!0}}async getRemoteUrl(){let A=await this.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async setRemoteUrl(A){await this.runGit(["remote","remove","origin"],this.eventsDir);let _=await this.runGit(["remote","add","origin",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Failed to configure Git remote repository URL")}async listEventLogFingerprints(){let A={},_=this.deps.getAllLogFiles(this.eventsDir).sort();for(let G of _)if(this.deps.existsSync(G))A[FH(G)]=DH(this.deps.readFileSync(G,"utf-8"));return A}async hasEventLog(A){return this.deps.existsSync(C3(this.eventsDir,`events-${A}.jsonl`))}async commitEventLog(A,_){let G=`events-${A}.jsonl`;if(!await this.hasEventLog(A))return{success:!0,skipped:!0};let $=await this.runGit(["add","--",G],this.eventsDir);if(!$.success)return NA($,"Git add failed");let K=await this.runGit(["diff","--cached","--quiet","--",G],this.eventsDir);if(K.success)return{success:!0,skipped:!0};if(K.exitCode!==1)return NA(K,"Git diff failed");let Z=await this.runGit(["commit","--no-gpg-sign","-m",_,"--",G],this.eventsDir);return Z.success?{success:!0}:NA(Z,"Git commit failed")}async fetch(A){let _=await this.runGit(["fetch","--prune",A],this.eventsDir);return _.success?{success:!0}:NA(_,"Git fetch failed")}async hasRemoteRef(A,_){return(await this.runGit(["rev-parse","--verify",`refs/remotes/${A}/${_}`],this.eventsDir)).success}async pullRebase(A,_){let G=await this.runGit(["pull","--rebase",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git pull failed")}async abortRebase(){let A=await this.runGit(["rebase","--abort"],this.eventsDir);if(A.success||A.stderr.includes("No rebase in progress"))return{success:!0};return NA(A,"Git rebase abort failed")}async push(A,_){let G=await this.runGit(["push","-u",A,_],this.eventsDir);return G.success?{success:!0}:NA(G,"Git push failed")}}function NA(A,_){return{success:!1,error:A.stderr||A.stdout||_}}function DH(A){return IH("sha256").update(A).digest("hex")}var EH;var u3=U(()=>{c();EH=new Set(["PATH","Path","HOME","USERPROFILE","XDG_CONFIG_HOME","SSH_AUTH_SOCK","TEMP","TMP","TMPDIR","SystemRoot","WINDIR"])});var t3={};k(t3,{rebuildProjectionsWithReport:()=>d3,rebuildProjections:()=>l2,readMemoryEventsWithReport:()=>CH,readMemoryEvents:()=>wH,readEvents:()=>bH,appendMemoryEvent:()=>_$,appendEvent:()=>UG});import{appendFile as xH,mkdir as PH}from"fs/promises";import{basename as yH,dirname as kH}from"path";import{existsSync as hH,createReadStream as vH}from"fs";import*as m3 from"readline";async function UG(A,_){await _$(cH(A,aH(_)),_)}async function _$(A,_){let G=iH(_);await PH(kH(G),{recursive:!0}),await xH(G,`${JSON.stringify(A.toJSON())}
|
|
1374
|
+
`,"utf-8")}async function*wH(A,_){let G=await G$(A,_,{reportInvalidToConsole:!1});for(let $ of G.events)yield $}async function CH(A,_){return G$(A,_,{reportInvalidToConsole:!1})}async function*bH(A,_){let G=await G$(A,_,{reportInvalidToConsole:!0});for(let $ of G.events)try{yield $$($)}catch(K){console.error("Skipping malformed event log line:",K)}}async function l2(A,_,G){await d3(A,_,G)}async function d3(A,_,G){let $=await G$(_,G,{reportInvalidToConsole:!1}),K=p3($.events),Y=await new aG([dH(),pH(),nH(),lH()]).replay(K,{db:A});return{invalidEvents:$.invalidEvents.length,invalidEventLines:$.invalidEvents,replay:Y}}async function G$(A,_,G){let $=A?[A]:UA(_),K=[],Z=[];for(let Y of $){let J=await fH(Y,G);K.push(...J.events),Z.push(...J.invalidEvents)}return{events:A?K:p3(K),invalidEvents:Z}}async function fH(A,_){let G=[],$=[];if(!hH(A))return{events:G,invalidEvents:$};let K=vH(A,"utf-8"),Z=m3.createInterface({input:K,crlfDelay:1/0}),Y=0;for await(let J of Z){if(Y+=1,!J.trim())continue;try{let H=JSON.parse(J);G.push(gH(H,A,Y))}catch(H){let Q={filePath:A,lineNumber:Y,line:J,reason:H instanceof Error?H.message:String(H)};if($.push(Q),_.reportInvalidToConsole)console.error("Skipping malformed event log line:",H)}}return{events:G,invalidEvents:$}}function gH(A,_,G){if(m0(A)&&A.schemaVersion===2)return BA.fromJSON(A);return uH(A,_,G)}function cH(A,_){let G=a3(A.metadata);return BA.create({eventId:A.uuid,machineId:_,sequence:A.id??eH(A.observedAt),kind:A.type,operation:A.type==="supersedence"?"supersede":"add",occurredAt:A.observedAt,observedAt:A.observedAt,scope:{project:A.project,visibility:"project"},provenance:{source:"memory-fact",actor:"memory",method:"appendEvent",sourceIds:[A.uuid]},privacy:G,consent:{status:"not_required",scopes:[]},causality:i3(A),payload:{fact:n3(A)}})}function uH(A,_,G){if(!m0(A))throw Error("Legacy event record must be an object");let $=mH(A);return BA.create({eventId:$.uuid,machineId:l3(_),sequence:tH(A,G),kind:$.type,operation:$.type==="supersedence"?"supersede":"add",occurredAt:$.observedAt,observedAt:$.observedAt,scope:{project:$.project,visibility:"project"},provenance:{source:"legacy-event-log",actor:"memory",method:"v1-jsonl-adapter",sourceIds:[$.uuid]},privacy:a3($.metadata),consent:{status:"not_required",scopes:[]},causality:i3($),payload:{fact:n3($)}})}function mH(A){let _=u0(A,"uuid"),G=u0(A,"type"),$=u0(A,"project"),K=u0(A,"content"),Z=sH(A,"observedAt"),Y=oH(A,"supersededAt"),J=typeof A.supersededBy==="string"?A.supersededBy:null,H=m0(A.metadata)?r3(A.metadata):void 0;if(!_.trim())throw Error("Legacy event uuid is required");return YA.create({uuid:_,type:G,project:$,content:K,metadata:H,observedAt:Z,supersededAt:Y,supersededBy:J})}function $$(A){let _=A.payload.fact;if(!m0(_))throw Error(`Memory event ${A.eventId} does not contain a fact payload`);let G={uuid:u0(_,"uuid"),type:typeof _.type==="string"?_.type:A.kind,project:typeof _.project==="string"?_.project:A.scope.project??"",content:u0(_,"content"),metadata:m0(_.metadata)?r3(_.metadata):void 0,observedAt:typeof _.observedAt==="string"?new Date(_.observedAt):A.observedAt,supersededAt:typeof _.supersededAt==="string"?new Date(_.supersededAt):null,supersededBy:typeof _.supersededBy==="string"?_.supersededBy:null},$=YA.create(G);return typeof _.id==="number"?$.withId(_.id):$}function dH(){let A=(_,G)=>{_.prepare(`
|
|
948
1375
|
INSERT INTO facts (
|
|
949
1376
|
uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
|
|
950
1377
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
951
|
-
|
|
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 $=$$(_);A(G.db,$);let K=new s(G.db);if(!await K.findByTarget("fact",$.uuid))await K.save(T1(_,$.uuid,$.project));if($.type==="supersedence"){let Y=$.metadata?.superseded_uuid,J=$.metadata?.superseded_by_uuid;if(typeof Y==="string"&&typeof J==="string")G.db.prepare(`
|
|
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
|
-
|
|
957
|
-
|
|
958
|
-
|
|
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
|
-
|
|
961
|
-
|
|
962
|
-
`)}function
|
|
963
|
-
`)}function
|
|
964
|
-
`),
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
${
|
|
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
|
-
`)
|
|
971
|
-
|
|
972
|
-
|
|
1391
|
+
`).run($.observedAt.toISOString(),J,Y)}}}}function lH(){return{name:"memory_governance",consumedKinds:["governance","consent"],reset:(A)=>{A.db.run("DELETE FROM memory_governance_events; DELETE FROM memory_governance;")},apply:async(A,_)=>{await new s(_.db).applyMemoryEvent(A)}}}function pH(){return{name:"persona",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM persona_entries;")},apply:async(A,_)=>{let G=$$(A),$=$5(G,A.observedAt);if(!$)return!1;let Z=await new SA(_.db).save($),Y=new s(_.db);if(!await Y.findByTarget("persona",Z.entryId))await Y.save(GA.create({surface:"persona",targetId:Z.entryId,project:Z.project,visibility:Z.visibility,sourceEventIds:Z.sourceEventIds,transformationMethod:"persona-event-projection",actor:"memory",confidence:Z.confidence,redactionState:"redacted",consentStatus:"not_required",consentScopes:[],scope:Z.scope,status:"active",createdAt:Z.createdAt,updatedAt:Z.updatedAt,expiresAt:Z.expiresAt,lastEventId:A.eventId}));return!0}}}function nH(){return{name:"graph",consumedKinds:d2,reset:(A)=>{A.db.run("DELETE FROM graph_edges;")},apply:async(A,_)=>{let G=$$(A),$=Z5(G,A.observedAt);if($.length===0)return!1;let Z=await new lA(_.db).saveMany($),Y=new s(_.db);for(let J of Z)if(!await Y.findByTarget("graph",J.edgeId))await Y.save(Y5(J,"graph-event-projection"));return!0}}}function iH(A){if(A)return A;let _=f();return y$(_.machineId)}function aH(A){if(A){let _=l3(A);return _==="legacy"?"local":_}try{let _=f();if(_.machineId&&_.machineId.trim())return _.machineId}catch{}return"local"}function l3(A){let _=yH(A),G=/^events-(.+)\.jsonl$/.exec(_);return G?.[1]&&G[1].trim()?G[1]:"legacy"}function p3(A){return[...A].sort((_,G)=>{let $=_.observedAt.getTime()-G.observedAt.getTime();if($!==0)return $;let K=_.sequence-G.sequence;if(K!==0)return K;let Z=_.eventId.localeCompare(G.eventId);if(Z!==0)return Z;return _.machineId.localeCompare(G.machineId)})}function n3(A){let _={uuid:A.uuid,type:A.type,project:A.project,content:A.content,observedAt:A.observedAt.toISOString(),supersededAt:A.supersededAt?A.supersededAt.toISOString():null,supersededBy:A.supersededBy};if(A.id!==void 0)_.id=A.id;if(A.metadata!==void 0)_.metadata=A.metadata;return _}function i3(A){let _=A.metadata,G=_?.superseded_uuid,$=_?.superseded_by_uuid;return{parentEventIds:[],supersedesEventIds:typeof G==="string"?[G]:[],relatedEventIds:typeof $==="string"?[$]:[]}}function a3(A){let _=m0(A?.redaction)?A.redaction:void 0,G=m0(A?.privacy)?A.privacy:void 0,$=A?.redactionState??_?.state??G?.redactionState??"none",K=A?.redactedFields??_?.fields??G?.redactedFields;return{redactionState:rH($),containsSensitiveContent:Boolean(A?.containsSensitiveContent??G?.containsSensitiveContent??!1),policy:typeof _?.policy==="string"?_.policy:void 0,redactedFields:Array.isArray(K)?K.map((Z)=>String(Z)):void 0}}function rH(A){if(A==="redacted"||A==="quarantined")return A;return"none"}function tH(A,_){if(typeof A.sequence==="number"&&Number.isSafeInteger(A.sequence)&&A.sequence>0)return A.sequence;return _}function eH(A){return Math.max(1,Math.floor(A.getTime()))}function u0(A,_){let G=A[_];if(typeof G!=="string")throw Error(`${_} must be a string`);return G}function sH(A,_){let G=u0(A,_),$=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function oH(A,_){let G=A[_];if(G===null||G===void 0)return null;if(typeof G!=="string")throw Error(`${_} must be a string or null`);let $=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function r3(A){return JSON.parse(JSON.stringify(A))}function m0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var d2;var K$=U(()=>{_G();s_();k0();H_();A1();YG();H5();D0();c();JA();d2=["decision","learning","preference","friction","observation","supersedence"]});var $8={};k($8,{SecretAuditService:()=>R_});import{existsSync as AQ,mkdirSync as e3,readFileSync as _Q,renameSync as GQ,writeFileSync as s3}from"fs";import{basename as $Q,dirname as KQ,join as o3}from"path";class R_{redactor;constructor(A){this.redactor=A}async audit(A={}){let _=[],G={database:{requested:A.redactDatabase===!0,updatedFields:0,rebuiltFtsIndexes:[]},eventLogs:{requested:A.quarantineEvents===!0,sanitizedFiles:[],quarantinedFiles:[]}};if(A.db){if(G.database.updatedFields=this.scanDatabase(A.db,A.redactDatabase===!0,_),A.redactDatabase&&G.database.updatedFields>0)G.database.rebuiltFtsIndexes=HQ(A.db)}if(A.eventLogPaths){let K=this.scanEventLogs(A.eventLogPaths,A.quarantineEvents===!0,A.quarantineDir,_);G.eventLogs.sanitizedFiles=K.sanitizedFiles,G.eventLogs.quarantinedFiles=K.quarantinedFiles}let $={schemaVersion:1,generatedAt:new Date().toISOString(),redactionPolicy:G8(_),summary:{totalFindings:_.length,databaseFindings:_.filter((K)=>K.surface==="database").length,eventLogFindings:_.filter((K)=>K.surface==="event_log").length},findings:_,remediation:G};if(A.reportPath)e3(KQ(A.reportPath),{recursive:!0}),s3(A.reportPath,JSON.stringify($,null,2)+`
|
|
1392
|
+
`,"utf-8");return $}scanDatabase(A,_,G){let $=0;for(let K of ZQ){if(!Z$(A,K.table))continue;let Z=K.columns.filter((Q)=>_8(A,K.table,Q));if(Z.length===0||!_8(A,K.table,K.idColumn))continue;let Y="__memory_audit_row_id",J=[`${aA(K.idColumn)} AS ${Y}`,...Z.map((Q)=>aA(Q))].join(", "),H=A.prepare(`SELECT ${J} FROM ${aA(K.table)}`).all();for(let Q of H){let X=Q[Y];for(let V of Z){let B=Q[V];if(typeof B!=="string"||B.length===0)continue;let W=YQ(this.redactor,B,K.jsonColumns?.includes(V)===!0);if(W.findings.length===0)continue;if(G.push(...W.findings.map((N)=>({surface:"database",table:K.table,column:V,rowId:X,...A8(N)}))),_&&W.value!==B&&X!==void 0)A.prepare(`UPDATE ${aA(K.table)} SET ${aA(V)} = ? WHERE ${aA(K.idColumn)} = ?`).run(W.value,X),$+=1}}}return $}scanEventLogs(A,_,G,$){let K=[],Z=[];for(let Y of A){if(!AQ(Y))continue;let J=_Q(Y,"utf-8"),H=J.includes(`\r
|
|
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(!Z$(A,$))continue;A.exec(`INSERT INTO ${aA($)}(${aA($)}) VALUES('rebuild')`),_.push($)}if(Z$(A,"sessions_fts")&&Z$(A,"sessions"))A.exec("DELETE FROM sessions_fts"),A.exec("INSERT INTO sessions_fts(session_id, summary) SELECT id, summary FROM sessions WHERE summary IS NOT NULL AND summary != ''"),_.push("sessions_fts");return _}function A8(A){return{kind:A.kind,placeholder:A.placeholder,hash:A.hash,ruleVersion:A.ruleVersion}}function G8(A){return A.find((_)=>_.ruleVersion)?.ruleVersion??"pattern-redactor-v2"}function Z$(A,_){let G=A.prepare("SELECT name FROM sqlite_master WHERE name = ?").get(_);return Boolean(G)}function _8(A,_,G){return A.prepare(`PRAGMA table_info(${aA(_)})`).all().some((K)=>K.name===G)}function aA(A){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(A))throw Error(`Unsafe SQL identifier: ${A}`);return`"${A}"`}function QQ(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var ZQ;var Y$=U(()=>{s_();c();ZQ=[{table:"sessions",idColumn:"id",columns:["project_path_decoded","project_name","summary"]},{table:"messages_meta",idColumn:"rowid",columns:["content"]},{table:"tool_uses",idColumn:"id",columns:["name","input","result"],jsonColumns:["input"]},{table:"extraction_state",idColumn:"id",columns:["session_path","error_message"]},{table:"entities",idColumn:"id",columns:["name","metadata"],jsonColumns:["metadata"]},{table:"memory_files",idColumn:"id",columns:["file_path","content"]},{table:"friction_log",idColumn:"id",columns:["description","tool","tags","context","source_project","resolution"],jsonColumns:["tags"]},{table:"backfill_state",idColumn:"session_id",columns:["daily_log_path","error_message"]},{table:"facts",idColumn:"id",columns:["project","content","metadata"],jsonColumns:["metadata"]}]});import*as Y8 from"chrono-node";function F_(A,_){if(!A||A.trim()==="")throw new wA("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let G=_??new Date,$=Y8.parseDate(A,G);if(!$)throw new wA(`Invalid date format: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);let K=new Date($.getFullYear(),$.getMonth(),$.getDate()),Z=new Date(G.getFullYear(),G.getMonth(),G.getDate());if(K>Z)throw new wA(`Future dates not allowed: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return $}var wA;var n2=U(()=>{wA=class wA extends Error{constructor(A){super(A);this.name="DateParseError"}}});function LA(A){if(A.json)return;let _=`${A.command}:--format=${A.alias}`;if(J8.has(_))return;J8.add(_),console.error(`warning: --format ${A.alias} is deprecated and will be removed in the next minor release. ${A.replacement}`)}var J8;var d0=U(()=>{J8=new Set});import{spawn as zQ,execSync as J$}from"child_process";class H${search(A){return new Promise((_,G)=>{let $=zQ("qmd",["search",A,"--json"],{stdio:["pipe","pipe","pipe"]}),K="",Z="";$.stdout.on("data",(Y)=>{K+=Y.toString()}),$.stderr.on("data",(Y)=>{Z+=Y.toString()}),$.on("error",(Y)=>{G(Error(`Failed to spawn qmd: ${Y.message}`))}),$.on("close",(Y)=>{if(Y===0)try{let J=JSON.parse(K);_(J)}catch{G(Error(`Failed to parse qmd output: ${K.slice(0,200)}`))}else G(Error(`qmd exited with code ${Y}: ${Z.trim()}`))})})}isAvailable(){try{return J$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:J$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function i2(){try{return J$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function Q$(){try{return{available:!0,path:J$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var H8=()=>{};var X$=U(()=>{H8()});var X8={};k(X8,{runShowInternal:()=>MQ,executeShowCommand:()=>TG,createShowCommand:()=>V$});import{Command as NQ,Option as a2}from"commander";function V$(){return new NQ("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new a2("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new a2("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new a2("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async(A,_)=>{let G=await TG(A,_);process.exitCode=G.exitCode})}function Q8(A){if(A.json)return"json";if(A.tools)return"tools";if(A.quiet)return"quiet";if(A.verbose)return"verbose";if(A.format==="brief")return"brief";return"default"}async function LQ(A,_,G){let $=await A.findById(_);if($)return $;let Z=G.prepare("SELECT id FROM sessions WHERE id LIKE ? ORDER BY start_time DESC LIMIT 1").get(`${_}%`);if(Z)return A.findById(Z.id);return null}async function TG(A,_,G={}){let{executeQueryCommand:$}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="show";try{return await $(A,{..._,kind:"session",dbPath:G.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function MQ(A,_,G={}){let $=performance.now();if(_.format==="default")LA({command:"show",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let K=G.dbPath??S(),{db:Z}=D({path:K});try{let Y=new m(Z),J=new WA(Z),H=new X0(Z),Q=await LQ(Y,A,Z);if(!Q){if(_.json)h({command:"show",code:"NOT_FOUND",message:`Session not found: ${A}`,context:{session_id:A}});else{let T=Q8(_),M=a1(T,v());console.log(M.formatNotFound(A))}return{exitCode:1}}let X=await J.findBySession(Q.id),V=await H.findBySession(Q.id),B=new Map;for(let T of V)B.set(T.id,T);let W={session:Q,messages:X,toolUses:B};if(_.json){let T=performance.now();return e({command:"show",kind:"session",data:P9(W),meta:{session_id:Q.id,message_count:X.length,timing_ms:Math.round(T-$)}}),{exitCode:0}}let N=Q8(_),z=a1(N,v()),q=performance.now(),I=z.formatSession(W,{executionTimeMs:Math.round(q-$)});if(_.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"show",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var B$=U(()=>{IA();mA();Y_();E5();u();x2();nA();iA();zA();L0();d0()});var V8={};k(V8,{runListInternal:()=>UQ,executeListCommand:()=>r2,createListCommand:()=>W$});import{Command as qQ,Option as E_}from"commander";function W$(){return new qQ("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new E_("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new E_("--before <date>","Sessions before date").conflicts("days")).addOption(new E_("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output as JSON").addOption(new E_("--format <type>","Output format: brief (single-line per session) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new E_("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new E_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A)=>{let _=await r2(A);process.exitCode=_.exitCode})}async function r2(A,_={}){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=A.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="list";try{return await G(void 0,{...A,kind:"session",scope:$,dbPath:_.dbPath})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function UQ(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"list",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let $=_.dbPath??S(),K=parseInt(A.limit??"20",10);if(isNaN(K)||K<1){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let Z,Y;if(A.days){let H=new Date,Q=new Date(H.getFullYear(),H.getMonth(),H.getDate());Z=new Date(Q.getTime()-(A.days-1)*24*60*60*1000)}else{if(A.since)try{Z=F_(A.since)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"since",value:A.since}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}if(A.before)try{Y=F_(A.before)}catch(H){if(H instanceof wA){if(A.json)h({command:"list",code:"INVALID_ARGUMENT",message:H.message,context:{flag:"before",value:A.before}});else console.error(`Error: ${H.message}`);return{exitCode:1}}throw H}}let{db:J}=D({path:$});try{let H=new m(J),Q={limit:K,projectFilter:A.project,sinceDate:Z,beforeDate:Y},X=await H.findFiltered(Q),V=TQ(A);if(A.json){let T=performance.now(),M=X.map(m1);return e({command:"list",kind:"session",data:M,meta:{filters_applied:V,count:M.length,timing_ms:Math.round(T-G)}}),{exitCode:0}}let B="default";if(A.quiet)B="quiet";else if(A.verbose)B="verbose";else if(A.format==="brief")B="brief";let W=v(),N=L2(B,W);if(X.length===0)return console.log(N.formatEmpty()),{exitCode:0};let z=performance.now(),q={executionTimeMs:Math.round(z-G),filtersApplied:V},I=N.formatSessions(X,q);if(A.format==="ai")I=_A(I);return console.log(I),{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(A.json)h({command:"list",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{E(J)}}function TQ(A){let _=[];if(A.limit)_.push(`limit: ${A.limit}`);if(A.project)_.push(`project: ${A.project}`);if(A.days)_.push(`days: ${A.days}`);if(A.since)_.push(`since: ${A.since}`);if(A.before)_.push(`before: ${A.before}`);return _}var t2=U(()=>{mA();IA();u();M2();nA();n2();iA();zA();L0();d0()});var e2={};k(e2,{gatherStatus:()=>N8,formatTimeAgo:()=>T8,formatStatusOutput:()=>U8,executeStatusCommand:()=>p0,createStatusCommand:()=>z$,attemptFixes:()=>q8});import{Command as IQ,Option as OQ}from"commander";import{existsSync as jQ,mkdirSync as B8}from"fs";import{dirname as W8}from"path";function z$(){return new IQ("status").description("Show system status, health, and statistics").option("--db","Show database health and diagnostic info").option("--hooks","Show Git hook status").option("--embedding","Show background embedding process status").option("--config","Show config validation status").option("--stats","Show database statistics").option("--all","Show all status and health sections").option("--fix","Attempt to fix common issues automatically").option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new OQ("--format <type>","Output format for stats: brief or ai").choices(["brief","ai","default"])).option("-v, --verbose","Show detailed output with timing").option("-q, --quiet","Minimal output").option("--json","Output as JSON").action(async(A)=>{let _=await p0(A);process.exitCode=_.exitCode})}async function N8(A={}){let _=bA(A.hookOverrides),G=f(A.configPath),$=N_(1,A.logPath),K=A.dbPath??S(),Y=jQ(K)||A.stats,J=0,H,Q=0,X=0,V=k1({dbPath:K,configDir:A.configPath?W8(A.configPath):void 0,logsDir:A.logPath?W8(A.logPath):void 0,hookOverrides:A.hookOverrides,preCalculatedHookStatus:_});if(Y)try{let{db:I}=D({path:K});try{let T=new z0,M=new Q0(I),O=await T.discoverSessions();for(let tA of O){let eA=await M.findBySessionPath(tA.path);if(!eA||eA.status!=="complete")J++}let R=new V0(I),y=A.projects??10;H=await R.getStats(y);let HA=new dA(I);Q=HA.getEmbeddedCount(),X=HA.getTotalMessageCount()}finally{E(I)}}catch{}let B={active:!1};try{let{readLock:I,isProcessAlive:T}=await Promise.resolve().then(() => (e1(),t1)),M=I();if(M&&T(M.pid))B={active:!0,pid:M.pid,startedAt:M.startedAt,embeddedCount:Q,totalMessages:X}}catch{}let W=CK(),N=Q$(),z;if(H)z={...H,hooks:{installed:_.sessionEnd&&_.preCompact,autoSync:G.autoSync,pendingSessions:J}};let q=[];if(A.fix)q=q8(V,v());return{hooks:_,config:RQ(G),lastSync:$.length>0?$[0]?.timestamp??null:null,pendingSessions:J,recentLogs:N_(100,A.logPath).length,embedding:B,health:V,stats:z,migration:W,qmd:N,fixes:q}}function RQ(A){let _={...A.embedding};if(_.apiKey)_.apiKey="[REDACTED:api_key]";if(_.apiKeyRef)_.apiKeyRef=x1(_.apiKeyRef).maskedReference;return{...A,embedding:_}}async function p0(A,_={}){let G=performance.now();if(A.format==="default")LA({command:"status",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:A.json});let K=A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all?"stats":"status",Z=parseInt(A.projects??"10",10);if(isNaN(Z)||Z<1){if(A.json)h({command:K,code:"INVALID_ARGUMENT",message:"Projects count must be a positive number"});else console.error("Error: Projects count must be a positive number");return{exitCode:1}}let J=await(_.gatherStatus??N8)({dbPath:_.dbPath,logPath:_.logPath,configPath:_.configPath,hookOverrides:_.hookOverrides,fix:A.fix,projects:Z,stats:A.stats||A.all}),H=0;if(A.db||A.all||A.fix)H=CQ(J.health);else if(A.stats)H=J.stats?0:1;else H=0;if(A.json){if(A.stats&&!A.db&&!A.hooks&&!A.config&&!A.embedding&&!A.all){if(!J.stats)return h({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return e({command:"stats",kind:"stats",data:z2(J.stats),meta:{generated_at:new Date().toISOString(),timing_ms:Math.round(performance.now()-G)}}),{exitCode:0}}let W={hooks:J.hooks,config:J.config,lastSync:J.lastSync,pendingSessions:J.pendingSessions,recentLogs:J.recentLogs,embedding:J.embedding,health:{...J.health,hooks:{...J.health.hooks,lastRun:J.health.hooks.lastRun?.toISOString()??null}},stats:J.stats?z2(J.stats):void 0,migration:J.migration,qmd:J.qmd,fixes:J.fixes};return console.log(JSON.stringify(W,null,2)),{exitCode:H}}let X=v();if(!(A.db||A.hooks||A.embedding||A.config||A.stats||A.all)){if(U8(J),A.fix&&J.fixes.length>0){console.log(`
|
|
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();u$();X$();T2();nA();d0();zA();L0();t5()});var I8={};k(I8,{executeStatsCommand:()=>o2,createStatsCommand:()=>N$});import{Command as bQ,Option as s2}from"commander";function N$(){return new bQ("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new s2("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new s2("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new s2("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async(A)=>{let _=await o2(A);process.exitCode=_.exitCode})}async function o2(A,_={}){return p0({stats:!0,projects:A.projects,format:A.format,verbose:A.verbose,quiet:A.quiet,json:A.json},{dbPath:_.dbPath})}var AK=U(()=>{D_()});var R8={};k(R8,{runContextInternal:()=>cQ,executeContextCommand:()=>OG,createContextCommand:()=>L$});import*as O8 from"fs";import*as j8 from"os";import{join as fQ}from"path";import{Command as gQ,Option as IG}from"commander";function L$(){return new gQ("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new IG("--days <n>","Sessions from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _})).addOption(new IG("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new IG("--budget <tokens>","Maximum token budget for context").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Budget must be a positive number");return _})).option("--cross-project","Include cross-project learnings and decisions").option("--json","Output as JSON").addOption(new IG("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new IG("-q, --quiet","Minimal output").conflicts("verbose")).action(async(A,_)=>{let G=await OG(A,_);process.exitCode=G.exitCode})}async function OG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="context";try{return await G(A,{..._,kind:"context",scope:"project"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function cQ(A,_,G){if(_.format==="detailed")LA({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let $=fQ(j8.homedir(),".memory");if(O8.existsSync($)&&!_.quiet&&!_.json)console.error("[DEPRECATION WARNING] Legacy memory directory ~/.memory/ is deprecated. Your knowledge and decisions are now stored safely in the SQLite database.");let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{return await uQ(Z,A,_)}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"context",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}async function uQ(A,_,G){let $=new w0(A),K=new FA(A),Z=new RA(A),Y=new SA(A),J=new lA(A),H=new h0(A),Q=new s(A),X=new cA({repository:Q}),V=new a_,B=new v0(A),N=await new t_({projectResolver:$,factRepo:K,frictionRepo:Z,personaRepo:Y,graphRepo:J,governancePolicy:X,rankingService:V,utilityRepo:H,getSessionSummary:async(T,M)=>{let O=await B.getProjectContext(T,{days:M});if(!O)return null;return`Sessions: ${O.sessionCount} | Messages: ${O.totalMessages} | Last active: ${O.lastActivity?.toISOString()??"never"}`}}).getContext({projectFilter:_,budget:G.budget,days:G.days,crossProject:G.crossProject});if(G.json){if(!N)return h({command:"context",code:"NOT_FOUND",message:`Project not found: ${_}`,context:{project:_}}),{exitCode:1};let T=await B.getProjectContext(_,{days:G.days});return e({command:"context",kind:"context",data:T?k9(T):null,meta:{project:_,days:G.days,budget:G.budget,cross_project:!!G.crossProject,mode:"smart",sections:N.sections.map((M)=>({key:M.key,title:M.title}))}}),{exitCode:0}}let z=G.format==="ai"?"ai":G.verbose?"verbose":G.quiet?"quiet":G.format==="detailed"?"detailed":"brief",q=v(),I=p1(z,q);if(!N){let T=I.formatEmpty(_);if(z!=="quiet"||T)console.error(T);return{exitCode:1}}if(I.formatSmartContext){let T=I.formatSmartContext(N);console.log(T)}else{let T=N.sections.find((M)=>M.key==="session_summary");if(T)console.log(T.content);else{let M=N.sections.map((O)=>`${O.title}:
|
|
1409
|
+
${O.content}`).join(`
|
|
1410
|
+
|
|
1411
|
+
`);console.log(M)}}return{exitCode:0}}var M$=U(()=>{IA();P0();$G();k0();H_();YG();I1();u();iG();$_();r_();n1();iA();zA();L0();d0()});var F8={};k(F8,{runRelatedInternal:()=>dQ,executeRelatedCommand:()=>jG,createRelatedCommand:()=>q$});import{Command as mQ,Option as x_}from"commander";function q$(){return new mQ("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new x_("--limit <n>","Maximum results").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Limit must be a positive number");return _}).default(10)).addOption(new x_("--hops <n>","Traversal depth (1-3)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1||_>3)throw Error("Hops must be 1, 2, or 3");return _}).default(2)).addOption(new x_("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new x_("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new x_("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new x_("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A,_)=>{let G=await jG(A,_);process.exitCode=G.exitCode})}async function jG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await G(A,{..._,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function dQ(A,_,G){let $=performance.now();if(_.format==="detailed")LA({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let K=G?.dbPath??_.dbPath??S(),{db:Z}=D({path:K});try{let Y=new J_(Z),J=new m(Z),H=_.type??"session",Q=await Y.findRelatedWithHops(H,A,_.hops??2),X="brief";if(_.json)X="json";else if(_.verbose)X="verbose";else if(_.quiet)X="quiet";else if(_.format==="detailed")X="detailed";let V=v(),B=j2(X,V);if(Q.length===0){let M=await Y.findBySource(H,A),O=await Y.findByTarget(H,A);if(M.length===0&&O.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let R=B.formatEmpty(A);if(X!=="quiet"||R)console.error(R)}return{exitCode:1}}}let W=new Map;for(let{link:M,hop:O}of Q)if(M.targetType==="session"){let R=W.get(M.targetId);if(!R||M.weight>R.weight)W.set(M.targetId,{weight:M.weight,hops:O})}W.delete(A);let N=Array.from(W.entries()).sort((M,O)=>O[1].weight-M[1].weight||M[1].hops-O[1].hops).slice(0,_.limit??10),z=[];for(let[M,{weight:O,hops:R}]of N){let y=await J.findById(M);if(y)z.push({session:y,weight:O,hops:R})}if(z.length===0){if(_.json)h({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let M=B.formatEmpty(A);if(X!=="quiet"||M)console.error(M)}return{exitCode:1}}if(_.json){let M=performance.now();return e({command:"related",kind:"related",data:z.map(y9),meta:{source_id:A,source_type:H,count:z.length,timing_ms:Math.round(M-$)}}),{exitCode:0}}let q=performance.now(),I={sourceId:A,executionTimeMs:Math.round(q-$)},T=B.formatRelated(z,I);if(_.format==="ai")T=_A(T);return console.log(T),{exitCode:0}}catch(Y){let J=Y instanceof F?Y:new F(j.DB_CONNECTION_FAILED,L(Y));if(_.json)h({command:"related",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(i(J));return{exitCode:1}}finally{E(Z)}}var U$=U(()=>{IA();k5();u();F2();nA();iA();zA();L0();d0()});var S_={};k(S_,{executeQueryCommand:()=>GK,createQueryCommand:()=>T$});import{Command as lQ,Option as P_}from"commander";function T$(){return new lQ("query").argument("[argument]","Query argument (search query text, session ID, or project name depending on kind)").description("Execute unified query across sessions, files, stats, or context").addOption(new P_("--scope <scope>","Query scope: global or project").choices(["global","project"])).option("-p, --project <name>","Filter by project name").addOption(new P_("--kind <kind>","Resource kind to query").choices(["message","session","file","stats","context","related"]).default("message")).addOption(new P_("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"])).option("-l, --limit <count>","Maximum results to return").addOption(new P_("--format <type>","Output format: brief or ai").choices(["brief","ai","default"])).option("--json","Output results as JSON envelope").option("--days <count>","Filter results from last N days",(A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).option("--projects <count>","Number of projects to show in stats breakdown","10").addOption(new P_("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new P_("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await GK(A,_);process.exitCode=G.exitCode})}async function GK(A,_){let G=_.kind??"message",$=_.project||(_.scope==="project"?A:void 0),K=!process.env.MEMORY_JSON_COMMAND_OVERRIDE;if(K)process.env.MEMORY_JSON_COMMAND_OVERRIDE="query";try{let Z=_;switch(G){case"message":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!1})}case"file":{let{runSearchInternal:Y}=await Promise.resolve().then(() => (RG(),_K));return await Y(A||"",{..._,project:$,files:!0})}case"session":if(A){let{runShowInternal:Y}=await Promise.resolve().then(() => (B$(),X8));return await Y(A,{json:Z.json,verbose:Z.verbose,quiet:Z.quiet,tools:Z.tools,format:Z.format},{dbPath:_.dbPath})}else{let{runListInternal:Y}=await Promise.resolve().then(() => (t2(),V8));return await Y({limit:_.limit,project:$,since:Z.since,before:Z.before,days:_.days,json:_.json,verbose:_.verbose,quiet:_.quiet,format:_.format},{dbPath:_.dbPath})}case"stats":{let{executeStatsCommand:Y}=await Promise.resolve().then(() => (AK(),I8));return await Y({json:_.json,verbose:_.verbose,quiet:_.quiet,projects:_.projects,format:_.format},{dbPath:_.dbPath})}case"context":{let Y=$||A;if(!Y){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Project name is required for context query"});else console.error("Error: Project name is required for context query");return{exitCode:1}}let{runContextInternal:J}=await Promise.resolve().then(() => (M$(),R8));return await J(Y,{json:_.json,verbose:_.verbose,quiet:_.quiet,days:_.days,format:Z.format,budget:Z.budget,crossProject:Z.crossProject},{dbPath:_.dbPath})}case"related":{if(!A){if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:"Source session ID is required for related query"});else console.error("Error: Source session ID is required for related query");return{exitCode:1}}let{runRelatedInternal:Y}=await Promise.resolve().then(() => (U$(),F8));return await Y(A,{limit:Z.limit,json:_.json,verbose:_.verbose,quiet:_.quiet,format:Z.format,type:Z.type,hops:Z.hops,dbPath:_.dbPath},{dbPath:_.dbPath})}default:{if(_.json)h({command:"query",code:"INVALID_ARGUMENT",message:`Unsupported kind: ${G}`});else console.error(`Error: Unsupported kind: ${G}`);return{exitCode:1}}}}finally{if(K)delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}var l0=U(()=>{zA()});var _K={};k(_K,{runSearchInternal:()=>nQ,resolveSearchMode:()=>S8,filterCaseSensitive:()=>E8,executeSearchCommand:()=>FG,createSearchCommand:()=>I$});import{Command as pQ,Option as rA}from"commander";function S8(A){if(A.vector===!1)return"fts";if(!A.mode||A.mode==="auto")return;return A.mode}function I$(){return new pQ("search").argument("<query>","Search query text").description("Search across all sessions (keyword, semantic, or hybrid)").option("-l, --limit <count>","Maximum results to return","10").option("-p, --project <name>","Filter by project name").option("-s, --session <id>","Filter by session ID").option("--role <roles>","Filter by role: user, assistant, or both (comma-separated)").addOption(new rA("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new rA("--before <date>","Results before date").conflicts("days")).addOption(new rA("--days <n>","Results from last N days (includes today)").argParser((A)=>{let _=parseInt(A,10);if(isNaN(_)||_<1)throw Error("Days must be a positive number");return _}).conflicts(["since","before"])).option("--json","Output results as JSON").option("-i, --ignore-case","Case-insensitive search (default)").option("-c, --case-sensitive","Case-sensitive search").addOption(new rA("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new rA("--no-vector","Disable vector search (same as --mode fts)")).addOption(new rA("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new rA("--format <type>","Output format: brief (single-line per record) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new rA("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new rA("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await FG(A,_);process.exitCode=G.exitCode})}async function FG(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (l0(),S_)),$=_.files?"file":"message",K=_.project?"project":"global";process.env.MEMORY_JSON_COMMAND_OVERRIDE="search";try{return await G(A,{..._,kind:$,scope:K})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function nQ(A,_){let G=performance.now();if(_.format==="default")LA({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let $;try{$=GG.from(A)}catch(H){if(_.json)h({command:"search",code:"INVALID_QUERY",message:"Query cannot be empty"});else console.error("Error: Query cannot be empty");return{exitCode:1}}if(_.files)return iQ(A,_);let K=_.dbPath??S(),{db:Z,sqliteVecAvailable:Y}=D({path:K}),J=new s1;try{let H=f(),Q=new Q_(Z),X=new dA(Z),V=new X_({db:Z,fts5Service:Q,embeddingRepo:X,providerFactory:J,config:H,sqliteVecAvailable:Y}),B=parseInt(_.limit??"10",10);if(isNaN(B)||B<1){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:"Limit must be a positive number"});else console.error("Error: Limit must be a positive number");return{exitCode:1}}let W;if(_.role){let b=_.role.split(",").map((v_)=>v_.trim().toLowerCase());if(b.length===1)W=b[0];else W=b}let N,z;if(_.days){let b=new Date,v_=new Date(b.getFullYear(),b.getMonth(),b.getDate());N=new Date(v_.getTime()-(_.days-1)*24*60*60*1000)}else{if(_.since)try{N=F_(_.since)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"since",value:_.since}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}if(_.before)try{z=F_(_.before)}catch(b){if(b instanceof wA){if(_.json)h({command:"search",code:"INVALID_ARGUMENT",message:b.message,context:{flag:"before",value:_.before}});else console.error(`Error: ${b.message}`);return{exitCode:1}}throw b}}let q=S8(_),T={limit:_.caseSensitive?B*2:B,projectFilter:_.project,roleFilter:W,sinceDate:N,beforeDate:z,sessionFilter:_.session,mode:q,noDecay:_.decay===!1},M=await V.search($,T),O=!1;if(_.caseSensitive&&M.length>0){let b=M.length;M=E8(M,A,B),O=b>M.length||M.length<B}else M=M.slice(0,B);let R=V.getLastSearchMeta(),y="default";if(_.json)y="json";else if(_.quiet)y="quiet";else if(_.verbose)y="verbose";else if(_.format==="brief")y="brief";let HA=v(),tA=N2(y,HA),eA=performance.now(),sA={query:A,executionDetails:{timeMs:Math.round(eA-G),ftsQuery:A,filtersApplied:rQ(_,O)},searchMeta:R??void 0},SZ=Math.round(performance.now()-G),EZ=()=>{let b={query:A,total_results:M.length,timing_ms:SZ};if(R){if(b.mode=R.mode,b.mode_reason=R.modeReason,b.embedding_coverage=R.embeddingCoverage,b.degraded=R.degraded,R.degradationReason)b.degradation_reason=R.degradationReason}return b};if(_.json){if(e({command:"search",kind:"message",data:M.map((b,v_)=>u1(b,{rank:v_+1,includeSearchMetaFields:!!R})),meta:EZ()}),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}if(M.length===0&&R?.mode==="vector")return console.log(`No semantic matches for "${A}"`),{exitCode:0};let x$=tA.formatResults(M,sA);if(_.format==="ai")x$=_A(x$);if(console.log(x$),R&&R.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),hA({search:{...H.search,hintShown:!0}});return{exitCode:0}}catch(H){let Q=H instanceof F?H:new F(j.DB_CONNECTION_FAILED,L(H));if(_.json)h({command:"search",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(i(Q));return{exitCode:1}}finally{await J.dispose(),E(Z)}}async function iQ(A,_){if(!i2()){if(_.json)h({command:"search",code:"QMD_UNAVAILABLE",message:"qmd is required for --files search. Install: bun add -g @tobilu/qmd"});else console.error("Error: qmd is required for --files search. Install: bun add -g @tobilu/qmd");return{exitCode:1}}try{let $=await new H$().search(A);if(_.json)return e({command:"search",kind:"file",data:$.map(x9),meta:{query:A,files:!0,total_results:$.length}}),{exitCode:0};if($.length===0){let Y=`No file results for "${A}"`;return console.log(_.format==="ai"?Y:Y),{exitCode:0}}let K=v(),Z=aQ($,K);if(_.format==="ai")Z=_A(Z);return console.log(Z),{exitCode:0}}catch(G){let $=L(G);if(_.json)h({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${$}`});else console.error(`Error: qmd search failed: ${$}`);return{exitCode:1}}}function aQ(A,_){let G=[];G.push(`File results: ${A.length} match${A.length!==1?"es":""}`),G.push("");for(let $ of A){let K=$.file.replace(/^qmd:\/\//,"");G.push(` ${C($.title,_)}`),G.push(` ${P(`${K} (score: ${$.score})`,_)}`);let Z=$.snippet||$.context;if(Z)G.push(` ${Z}`);G.push("")}return G.join(`
|
|
1412
|
+
`)}function rQ(A,_){let G=[];if(A.limit)G.push(`limit: ${A.limit}`);if(A.project)G.push(`project: ${A.project}`);if(A.session)G.push(`session: ${A.session}`);if(A.role)G.push(`role: ${A.role}`);if(A.days)G.push(`days: ${A.days}`);if(A.since)G.push(`since: ${A.since}`);if(A.before)G.push(`before: ${A.before}`);if(A.caseSensitive)G.push("case-sensitive");if(_)G.push("case-sensitive filter applied");if(A.mode&&A.mode!=="auto")G.push(`mode: ${A.mode}`);if(A.vector===!1)G.push("no-vector");if(A.decay===!1)G.push("no-decay");return G}function E8(A,_,G){return A.filter((K)=>{return K.snippet.replace(/<\/?mark>/g,"").includes(_)}).slice(0,G)}var RG=U(()=>{IA();u();o1();JA();d1();nA();n2();iA();zA();L0();d0();X$()});var UZ={};k(UZ,{ClaudeSummaryGenerator:()=>qZ});import{spawn as dV}from"child_process";class qZ{async generateSummary(A,_,G,$,K){let Z=this.buildPrompt(A,_,G,$,K);return new Promise((Y,J)=>{let H={...process.env};delete H.CLAUDECODE;let Q=dV("claude",["-p","--output-format","text"],{env:H,stdio:["pipe","pipe","pipe"]}),X="",V="";Q.stdout.on("data",(B)=>{X+=B.toString()}),Q.stderr.on("data",(B)=>{V+=B.toString()}),Q.on("error",(B)=>{J(Error(`Failed to spawn claude -p: ${B.message}`))}),Q.on("close",(B)=>{if(B===0)Y(X.trim());else J(Error(`claude -p exited with code ${B}: ${V.trim()}`))}),Q.stdin.write(Z),Q.stdin.end()})}buildPrompt(A,_,G,$,K){return["Summarize this Claude Code session into a structured daily log entry.","Output ONLY the markdown content below, no preamble or explanation.","","Format:",`## Session: ${_} (${$} - ${K})`,`**Project:** ${G}`,"","### Topic","[1-2 sentence summary of what the session was about]","","### Decisions","- [Key technical decisions made, one per bullet]","","### Outcomes","- [What was built, changed, or accomplished]","","### Unresolved",'- [Open questions or incomplete work, or "None" if all resolved]',"","### Learnings","- [Technical insights or patterns discovered]","","### Key Files","- [Important files created or modified]","","Session content:",A].join(`
|
|
1413
|
+
`)}}var TZ=()=>{};import{Command as $B}from"commander";var PK={name:"@chude/memory",version:"4.0.1",description:"Cross-project context persistence for Claude Code sessions",type:"module",main:"dist/index.js",types:"dist/index.d.ts",bin:{memory:"dist/presentation/cli/index.js"},files:["dist"],scripts:{"clean:dist":"bun run scripts/clean-dist.ts","build:types":"tsc --project tsconfig.lib.json","build:lib":"bun build src/index.ts --outdir dist --target bun --packages=external --minify --sourcemap=none","build:cli":"bun build src/presentation/cli/index.ts --outdir dist/presentation/cli --target bun --packages=external --minify --sourcemap=none",build:"bun run clean:dist && bun run build:types && bun run build:lib && bun run build:cli","build:hook":"bun build src/infrastructure/hooks/sync-hook-script.ts --outfile=dist/sync-hook.js --target=bun",test:"bun test","test:coverage":"bun run scripts/run-istanbul-bun-coverage.ts --coverage-dir coverage && bun run scripts/check-coverage-thresholds.ts --summary coverage/coverage-summary.json --threshold 95","eval:v5":"bun run scripts/eval-v5.ts","eval:v5:market":"bun run scripts/eval-v5.ts --market-ready",quality:"bun run typecheck && bun run build && bun test --timeout 15000 && bun run test:isolation && bun run eval:v5 && bun run test:coverage && bun audit","test:smoke":"bun test tests/smoke","verify:published":"bun run scripts/verify-published-package.ts","test:isolation":"bun run scripts/check-test-isolation.ts",typecheck:"tsc --noEmit && tsc --project tsconfig.scripts.json",lint:"bun run typecheck",mutation:"stryker run","mutation:domain":"stryker run --mutate 'src/domain/**/!(*.test).ts'"},author:"Chude <chude@emeke.org>",license:"MIT",devDependencies:{"@stryker-mutator/core":"9.6.1","@stryker-mutator/typescript-checker":"9.6.1","@stryker-mutator/vitest-runner":"9.6.1","@types/bun":"1.3.14","@types/cli-progress":"^3.11.6","@types/istanbul-lib-coverage":"^2.0.6","@types/istanbul-lib-instrument":"^1.7.8","@types/istanbul-lib-report":"^3.0.3","@types/istanbul-reports":"^3.0.4","istanbul-lib-coverage":"^3.2.2","istanbul-lib-instrument":"^6.0.3","istanbul-lib-report":"^3.0.1","istanbul-reports":"^3.2.0",typescript:"^5.5.0",vitest:"4.1.9"},engines:{bun:">=1.0.0"},keywords:["claude","claude-code","context","memory","session","search"],repository:{type:"git",url:"git+ssh://git@github.com/chudeemeke/memory-nexus.git"},dependencies:{"@anthropic-ai/claude-code":"2.1.185","@anthropic-ai/sdk":"0.98.1","@huggingface/transformers":"4.2.0","@inquirer/search":"4.2.0","@inquirer/select":"5.2.0","chart.js":"^4.5.1","chrono-node":"2.9.1","cli-progress":"^3.12.0",commander:"14.0.3",fuzzy:"^0.1.3","sqlite-vec":"0.1.9","string-width":"8.2.1"},overrides:{"@protobufjs/utf8":"1.1.1","fast-uri":"3.1.2",picomatch:"4.0.4",postcss:"8.5.15",protobufjs:"8.6.4",qs:"6.15.2",rollup:"4.60.4",vite:"8.0.16",yaml:"2.9.0"},trustedDependencies:["onnxruntime-node","protobufjs"]};u$();import{Command as XQ,Option as K8}from"commander";l_();hG();vG();IA();var pZ={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class wG{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor(A,_,G,$,K,Z,Y,J,H,Q=pZ){this.sessionSource=A;this.eventParser=_;this.sessionRepo=G;this.messageRepo=$;this.toolUseRepo=K;this.extractionStateRepo=Z;this.db=Y;this.abortSignal=J;this.checkpointManager=H;this.redactor=Q}async sync(A={}){let _=Date.now(),G=A.checkpointEnabled!==!1,$={success:!0,sessionsDiscovered:0,sessionsProcessed:0,sessionsSkipped:0,messagesInserted:0,toolUsesInserted:0,errors:[],durationMs:0,aborted:!1},K=null,Z=new Set;if(G){if(K=this.checkpointManager.load(),K){$.recoveredFromCheckpoint=K.completedSessions;for(let X of K.completedSessionIds)Z.add(X)}}A.onProgress?.({current:0,total:0,sessionId:"",phase:"discovering"});let Y;try{Y=await this.sessionSource.discoverSessions()}catch(X){throw new F(j.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:L(X)})}$.sessionsDiscovered=Y.length;let J=await this.filterSessions(Y,A);if(Z.size>0){let X=J.length;J=J.filter((V)=>!Z.has(V.id)),$.sessionsSkipped+=X-J.length}if($.sessionsSkipped=$.sessionsDiscovered-J.length-Z.size,$.sessionsSkipped<0)$.sessionsSkipped=$.sessionsDiscovered-J.length;let H=J.length+Z.size,Q=K??{startedAt:new Date().toISOString(),totalSessions:H,completedSessions:Z.size,completedSessionIds:[...Z],lastCompletedAt:null};for(let X=0;X<J.length;X++){if(this.abortSignal.shouldAbort()){if($.aborted=!0,G)this.checkpointManager.save(Q);break}let V=J[X];if(!V)continue;A.onProgress?.({current:X+1+Z.size,total:H,sessionId:V.id,phase:"extracting"});try{let B=await this.extractSession(V);if($.sessionsProcessed++,$.messagesInserted+=B.messages,$.toolUsesInserted+=B.toolUses,G)Q.completedSessions++,Q.completedSessionIds.push(V.id),Q.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(Q);A.onSessionComplete?.(V.id)}catch(B){let W=this.wrapError(B,V.path);$.errors.push({sessionPath:V.path,error:W.message}),$.success=!1}}if(G&&!$.aborted&&$.success)this.checkpointManager.clear();return A.onProgress?.({current:H,total:H,sessionId:"",phase:"complete"}),$.durationMs=Date.now()-_,$}async fixProjectNames(A){let _=await this.sessionRepo.findDistinctEncodedPaths(),G=0;for(let $ of _){let K=A.resolveFromEncodedPath($),Z=await this.sessionRepo.updateProjectName($,K);G+=Z}return G}wrapError(A,_){if(A instanceof F)return A;let G=L(A);if(G.includes("ENOENT")||G.includes("no such file"))return new F(j.SOURCE_INACCESSIBLE,`Cannot access session file: ${G}`,{path:_});if(G.includes("JSON")||G.includes("parse"))return new F(j.INVALID_JSON,`Failed to parse session file: ${G}`,{path:_});if(G.includes("locked")||G.includes("SQLITE_BUSY"))return new F(j.DB_LOCKED,`Database is locked: ${G}`,{path:_});if(G.includes("database")||G.includes("SQLITE"))return new F(j.DB_CONNECTION_FAILED,`Database error: ${G}`,{path:_});return new F(j.SYNC_FAILED,G,{path:_})}async filterSessions(A,_){let G=A;if(_.projectFilter)G=G.filter((K)=>K.projectPath.decoded.includes(_.projectFilter));if(_.sessionFilter)G=G.filter((K)=>K.id===_.sessionFilter);let $=[];for(let K of G){let Z=await this.extractionStateRepo.findBySessionPath(K.path);if(this.needsExtraction(K,Z,_.force??!1))$.push(K)}return $}needsExtraction(A,_,G){if(G)return!0;if(!_)return!0;if(_.status!=="complete")return!0;let{fileMtime:$,fileSize:K}=_;if(!$||K===void 0||K===null)return!0;return A.modifiedTime.getTime()!==$.getTime()||A.size!==K}async extractSession(A){let _=crypto.randomUUID(),G=VA.create({id:_,sessionPath:A.path,startedAt:new Date,status:"pending"}).withFileMetadata(A.modifiedTime,A.size);try{let $=[];for await(let X of this.eventParser.parse(A.path))$.push(X);let{messages:K,toolUses:Z,firstTimestamp:Y,lastTimestamp:J}=this.extractEntities($),H=xA.create({id:A.id,projectPath:A.projectPath,startTime:Y??new Date,endTime:J,messageCount:K.length});return this.db.transaction(()=>{if(this.sessionRepo.save(H),K.length>0)this.messageRepo.saveMany(K.map((V)=>({message:V,sessionId:A.id})));if(Z.length>0)this.toolUseRepo.saveMany(Z.map((V)=>({toolUse:V,sessionId:A.id})));let X=G.startProcessing().incrementMessages(K.length).complete(new Date);this.extractionStateRepo.save(X)}).immediate(),{messages:K.length,toolUses:Z.length}}catch($){let K=G.fail(L($));throw await this.extractionStateRepo.save(K),$}}extractEntities(A){let _=[],G=[],$=new Map,K,Z;for(let Y of A){if(Y.type==="skipped")continue;if("data"in Y&&Y.data.timestamp){let J=new Date(Y.data.timestamp);if(!K||J<K)K=J;if(!Z||J>Z)Z=J}switch(Y.type){case"user":{let J=TA.create({id:Y.data.uuid,role:"user",content:this.redactor.redactText(Y.data.message.content).text,timestamp:new Date(Y.data.timestamp)});_.push(J);break}case"assistant":{let J=Y.data.message.content.filter((V)=>V.type==="text").map((V)=>V.text).join(`
|
|
1414
|
+
`),H=this.redactor.redactText(J).text,Q=Y.data.message.content.filter((V)=>V.type==="tool_use").map((V)=>V.id);for(let V of Y.data.message.content)if(V.type==="tool_use"){let B=PA.create({id:V.id,name:V.name,input:this.redactor.redactJson(V.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(V.id,B)}let X=TA.create({id:Y.data.uuid,role:"assistant",content:H,timestamp:new Date(Y.data.timestamp),toolUseIds:Q});_.push(X);break}case"tool_use":{let J=PA.create({id:Y.data.uuid,name:Y.data.name,input:this.redactor.redactJson(Y.data.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(Y.data.uuid,J);break}case"tool_result":{let J=$.get(Y.data.toolUseId);if(J){let H=Y.data.isError?J.completeError(this.redactor.redactText(Y.data.content).text):J.completeSuccess(this.redactor.redactText(Y.data.content).text);$.set(Y.data.toolUseId,H)}break}case"summary":case"system":break}}return G.push(...$.values()),{messages:_,toolUses:G,firstTimestamp:K,lastTimestamp:Z}}}p_();d$();i$();import{existsSync as aZ}from"fs";var lK={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};function o0(A,_){return A.redactText(_).text}function n_(A,_){return _===null?null:o0(A,_)}async function a$(A,_,G={}){let $=G.includeSensitive?lK:G.redactor??lK,K=A.query(`SELECT id, project_path_encoded as projectPathEncoded,
|
|
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((
|
|
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((
|
|
980
|
-
FROM tool_uses`).all().map((
|
|
981
|
-
FROM entities`).all().map((
|
|
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(),
|
|
985
|
-
FROM session_entities`).all(),
|
|
986
|
-
FROM entity_links`).all(),
|
|
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((
|
|
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((
|
|
1436
|
+
FROM facts`).all().map((z)=>({...z,content:o0($,z.content),metadata:n_($,z.metadata)})),W={version:"1.0",exportedAt:new Date().toISOString(),stats:{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,sessionEntities:Q.length,entityLinks:X.length,extractionStates:V.length,facts:B.length},sessions:K,messages:Z,toolUses:Y,entities:J,links:H,sessionEntities:Q,entityLinks:X,extractionStates:V,facts:B},N=JSON.stringify(W,null,2);return await Bun.write(_,N),{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,bytes:N.length,facts:B.length}}async function fG(A){if(!aZ(A))return{valid:!1,error:"File does not exist"};try{let G=await Bun.file(A).text(),$=JSON.parse(G);if(!$.version||typeof $.version!=="string")return{valid:!1,error:"Missing or invalid version field"};let K=["sessions","messages","toolUses","entities","links"];for(let Z of K)if(!Array.isArray($[Z]))return{valid:!1,error:`Missing or invalid ${Z} array`};if(!$.stats||typeof $.stats!=="object")return{valid:!1,error:"Missing or invalid stats object"};return{valid:!0,version:$.version}}catch(_){return{valid:!1,error:`Failed to parse file: ${L(_)}`}}}async function r$(A,_,G={}){let $=await fG(_);if(!$.valid)throw Error(`Invalid export file: ${$.error}`);let Z=await Bun.file(_).text(),Y=JSON.parse(Z);if(G.clearExisting)rZ(A);return A.transaction(()=>{let H=A.prepare(`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1033
|
-
(SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}
|
|
1034
|
-
`).filter(Boolean)
|
|
1035
|
-
`)}try{
|
|
1036
|
-
`)}return
|
|
1037
|
-
`);return""}function
|
|
1038
|
-
`)}catch(
|
|
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)")
|
|
1040
|
-
Force exiting...`),await
|
|
1041
|
-
Interrupt received, shutting down after current operation...`),
|
|
1042
|
-
`)}function
|
|
1043
|
-
<td>${
|
|
1044
|
-
<td class="severity-${
|
|
1045
|
-
<td>${
|
|
1046
|
-
<td>${
|
|
1047
|
-
<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 t$(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)}}o$();iG();A1();H5();r_();$_();Q1();T5();u();LG();import{createReadStream as gJ}from"fs";import{createInterface as cJ}from"readline";function T_(A){if(typeof A==="string"){if(/^\d{4}-\d{2}-\d{2}T/.test(A))return A;let _=new Date(A);if(!isNaN(_.getTime()))return _.toISOString()}if(typeof A==="number"&&!isNaN(A)){let _=A>1000000000000?A:A*1000,G=new Date(_);if(!isNaN(G.getTime()))return G.toISOString()}if(A instanceof Date&&!isNaN(A.getTime()))return A.toISOString();return new Date().toISOString()}var kJ=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function L9(A){if(typeof A!=="object"||A===null)return!1;return typeof A.type==="string"}function J2(A){if(!L9(A))return{type:"skipped",reason:"Invalid event structure"};let _=A.type;if(kJ.has(_))return{type:"skipped",reason:`Event type "${_}" not extracted`};switch(_){case"user":return hJ(A);case"assistant":return wJ(A);case"summary":return bJ(A);case"system":return fJ(A);default:return{type:"skipped",reason:`Event type "${_}" not classified`}}}function hJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"User event missing required fields"};let _={uuid:A.uuid,message:{content:vJ(A.message.content)},timestamp:T_(A.timestamp)};if(A.cwd)_.cwd=A.cwd;if(A.gitBranch)_.gitBranch=A.gitBranch;return{type:"user",data:_}}function vJ(A){if(typeof A==="string")return A;if(Array.isArray(A))return A.filter((G)=>G.type==="tool_result").map((G)=>{if(typeof G.content==="string")return G.content;return JSON.stringify(G.content)}).join(`
|
|
1479
|
+
`);return""}function wJ(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"Assistant event missing required fields"};let _=CJ(A.message.content||[]),G={uuid:A.uuid,message:{content:_},timestamp:T_(A.timestamp)};if(A.message.model)G.message.model=A.message.model;if(A.message.usage)G.usage={inputTokens:A.message.usage.input_tokens,outputTokens:A.message.usage.output_tokens};return{type:"assistant",data:G}}function CJ(A){if(!Array.isArray(A))return[];return A.filter((_)=>{return _.type!=="thinking"}).map((_)=>{if(_.type==="text")return{type:"text",text:_.text};if(_.type==="tool_use")return{type:"tool_use",id:_.id,name:_.name,input:_.input};return{type:"text",text:""}})}function bJ(A){if(!A.summary)return{type:"skipped",reason:"Summary event missing summary field"};let _={content:A.summary,timestamp:T_(A.timestamp)};if(A.leafUuid)_.leafUuid=A.leafUuid;return{type:"summary",data:_}}function fJ(A){if(!A.subtype)return{type:"skipped",reason:"System event missing subtype field"};return{type:"system",data:{subtype:A.subtype,data:A.durationMs??A.data??null,timestamp:T_(A.timestamp)}}}class w1{async*parse(A){let _=gJ(A,{encoding:"utf8"}),G=cJ({input:_,crlfDelay:1/0}),$=0;for await(let K of G){$++;let Z=K.trim();if(Z===""){yield{type:"skipped",reason:`Empty line at ${$}`};continue}try{let Y=JSON.parse(Z);yield J2(Y)}catch(Y){let J=L(Y);yield{type:"skipped",reason:`Malformed JSON at line ${$}: ${J}`}}}}}c();import{existsSync as H2,mkdirSync as uJ,readFileSync as mJ,unlinkSync as dJ,writeFileSync as lJ}from"fs";import{dirname as pJ}from"path";function C1(A){return A??c_()}function M9(A,_){let G=C1(_),$=pJ(G);try{uJ($,{recursive:!0}),lJ(G,JSON.stringify(A,null,2)+`
|
|
1480
|
+
`)}catch(K){console.warn("Failed to save checkpoint:",K.message)}}function I_(A){let _=C1(A);if(!H2(_))return null;try{let G=mJ(_,"utf-8"),$=JSON.parse(G);if(typeof $.startedAt!=="string"||typeof $.totalSessions!=="number"||typeof $.completedSessions!=="number"||!Array.isArray($.completedSessionIds))return console.warn("Invalid checkpoint format, ignoring"),null;return $}catch{return console.warn("Invalid checkpoint JSON, ignoring"),null}}function q9(A){let _=C1(A);if(H2(_))try{dJ(_)}catch(G){console.warn("Failed to clear checkpoint:",G.message)}}function U9(A){return H2(C1(A))}import*as I9 from"readline";var AA={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function nJ(){if(AA.ttyOverride!==null)return AA.ttyOverride;return process.stdin.isTTY??!1}function b1(A){if(AA.exitOverride!==null){AA.exitOverride(A);return}process.exit(A)}async function O9(){for(let A of AA.cleanupFunctions)try{await A()}catch(_){console.warn("Cleanup error:",_.message)}}async function iJ(){let A=I9.createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{let G=()=>{console.log(`
|
|
1481
|
+
Interrupt received. Choose action:`),console.log(" 1) Abort immediately"),console.log(" 2) Abort after current session (saves progress)"),console.log(" 3) Cancel abort (continue)"),A.question("> ",($)=>{let K=parseInt($.trim(),10);if(K===1||K===2||K===3)A.close(),_(K);else console.log("Invalid choice. Enter 1, 2, or 3."),G()})};G()})}async function aJ(A){switch(A){case 1:console.log("Aborting immediately..."),await O9(),b1(130);break;case 2:console.log("Will abort after current session..."),AA.isShuttingDown=!0;break;case 3:console.log("Continuing..."),AA.interruptCount=0;break}}async function T9(){if(AA.interruptCount++,AA.interruptCount>=2){console.log(`
|
|
1482
|
+
Force exiting...`),await O9(),b1(130);return}if(nJ()){let A=await iJ();await aJ(A)}else console.log(`
|
|
1483
|
+
Interrupt received, shutting down after current operation...`),AA.isShuttingDown=!0}function j9(){if(AA.handlersRegistered)return;process.on("SIGINT",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b1(1)})}),process.on("SIGTERM",()=>{T9().catch((A)=>{console.error("Signal handler error:",A),b1(1)})}),AA.handlersRegistered=!0}function R9(){return AA.isShuttingDown}function F9(A){AA.cleanupFunctions.push(A)}function S9(A){let _=AA.cleanupFunctions.indexOf(A);if(_!==-1)AA.cleanupFunctions.splice(_,1)}class f1{shouldAbort(){return R9()}}class g1{path;constructor(A){this.path=A}load(){return I_(this.path)}save(A){M9(A,this.path)}clear(){q9(this.path)}}N0();d1();M2();T2();n1();F2();x2();iA();import{readFileSync as KH}from"fs";import{resolve as ZH}from"path";function y2(A,_,G,$,K){if(A.total===0)return"No friction entries logged yet.";let Z=[];Z.push(KA("Friction Dashboard",$)),Z.push("=================="),Z.push(""),Z.push(KA(" Overview",$)),Z.push(" --------"),Z.push(` Total: ${A.total} Open: ${l(String(A.open),$)} Resolved: ${C(String(A.resolved),$)} Won't Fix: ${A.wontFix}`),Z.push("");let Y=A.meanTimeToResolve!==null?`MTTR: ${A.meanTimeToResolve.toFixed(1)} days`:"MTTR: N/A";if(A.oldestOpen)Z.push(` ${Y} Oldest Open: #${A.oldestOpen.id} (${A.oldestOpen.daysOpen} days)`);else Z.push(` ${Y}`);Z.push(""),Z.push(KA(" By Severity",$)),Z.push(" -----------");let J=["critical","high","medium","low"],H=Math.max(...J.map((Q)=>A.bySeverity[Q]),1);for(let Q of J){let X=A.bySeverity[Q],V=Math.round(X/H*20),B="=".repeat(V)+" ".repeat(20-V),W=Q.padEnd(10),N=Q==="critical"||Q==="high"?d(W,$):Q==="medium"?l(W,$):C(W,$);Z.push(` ${N}[${B}] ${X}`)}Z.push(""),Z.push(KA(" By Category",$)),Z.push(" -----------");for(let[Q,X]of Object.entries(A.byCategory))Z.push(` ${E9(Q.padEnd(14),$)}${X}`);if(Z.push(""),A.byTool&&Object.keys(A.byTool).length>0){Z.push(KA(" By Tool",$)),Z.push(" -------");for(let[Q,X]of Object.entries(A.byTool)){let V="=".repeat(Math.min(X,40));Z.push(` ${Q.padEnd(15)} ${V} ${X}`)}Z.push("")}if(K&&K.length>0){Z.push(KA(" Pattern Alerts",$)),Z.push(" --------------");for(let Q of K)Z.push(` [!] Pattern detected: ${Q.count} open entries for ${Q.tool}/${Q.category}`);Z.push("")}if(_.length===0)Z.push(" No trend data available.");else{Z.push(KA(" Trends",$)),Z.push(" ------"),Z.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let Q of _)Z.push(` ${P(Q.week.padEnd(12),$)}${String(Q.newCount).padEnd(6)}${Q.resolvedCount}`)}return Z.join(`
|
|
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>${
|
|
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">${
|
|
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">${
|
|
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">${
|
|
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">${
|
|
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">${
|
|
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
|
-
${
|
|
1566
|
+
${$&&$.length>0?` <div class="alerts">
|
|
1125
1567
|
<h2>Pattern Alerts</h2>
|
|
1126
1568
|
<ul>
|
|
1127
|
-
${
|
|
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
|
-
${
|
|
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(
|
|
1147
|
-
const openItems = ${JSON.stringify(
|
|
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
|
|
1230
|
-
`),console.log(`Discovered: ${
|
|
1231
|
-
`),
|
|
1671
|
+
</html>`}function P2(A){return A.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}nA();zA();async function C2(A,_){if(!A.embed)return console.log("--background requires --embed flag"),console.log(" Usage: memory sync --embed --background"),{exitCode:0};let{spawnBackgroundEmbedding:G,readLock:$,isProcessAlive:K}=_??await LH(),Z=$();if(Z&&K(Z.pid))return console.log(`Embedding already in progress (PID ${Z.pid}). Use 'memory status' to check progress.`),{exitCode:0};let Y=G();if(Y.started)console.log(`Background embedding started (PID ${Y.pid}). Use 'memory status' to check progress.`);else return console.error(`Failed to start background embedding: ${Y.reason}`),{exitCode:1};return{exitCode:0}}async function LH(){let A=await Promise.resolve().then(() => (e1(),t1));return{spawnBackgroundEmbedding:A.spawnBackgroundEmbedding,readLock:A.readLock,isProcessAlive:A.isProcessAlive}}LG();async function I3(){let{EmbeddingProviderFactory:A}=await Promise.resolve().then(() => (o1(),b2));return new A}async function O3(){let{loadConfig:A}=await Promise.resolve().then(() => (JA(),j1));return A()}async function j3(A){let{EmbeddingRepository:_}=await Promise.resolve().then(() => J4);return new _(A)}async function R3(A){let _=new z0;try{let G=await _.discoverSessions(),$=G;if(A.project)$=$.filter((J)=>J.projectPath.decoded.includes(A.project));if(A.session)$=$.filter((J)=>J.id===A.session);let K=I_(),Z=new Set(K?.completedSessionIds??[]),Y=$.filter((J)=>!Z.has(J.id));if(A.json){let J={dryRun:!0,discovered:G.length,filtered:$.length,toProcess:Y.length,recoveredFromCheckpoint:K?.completedSessions??0,sessions:Y.map((H)=>({id:H.id,project:H.projectPath.decoded,size:H.size,modified:H.modifiedTime.toISOString()}))};console.log(JSON.stringify(J,null,2))}else{if(console.log(`Dry run - no changes will be made
|
|
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 ${
|
|
1234
|
-
Errors (${
|
|
1235
|
-
All messages already embedded
|
|
1236
|
-
|
|
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
|
|
1675
|
+
Sync complete in ${$}ms`);if(console.log(` Discovered: ${A.sessionsDiscovered}`),console.log(` Processed: ${A.sessionsProcessed}`),console.log(` Skipped: ${A.sessionsSkipped}`),console.log(` Messages: ${A.messagesInserted}`),console.log(` Tool uses: ${A.toolUsesInserted}`),A.recoveredFromCheckpoint)console.log(` Recovered: ${A.recoveredFromCheckpoint} from checkpoint`);if(A.errors.length>0){console.log(`
|
|
1676
|
+
Errors (${A.errors.length}):`);for(let K of A.errors)console.log(` ${K.sessionPath}: ${K.error}`)}}function S3(){let A=process.platform==="win32"?"C:\\":"/";return new h1(A)}async function g2(A,_,G={}){let $=G.factory??await I3(),K=G.config??await O3(),Z=$.createFromConfig(K);if(!Z){if(!_.quiet)console.error("Embedding is disabled in configuration. Enable it in ~/.config/memory/config.json");return}let Y=G.repositoryOverride??await j3(A),{EmbeddingService:J}=await Promise.resolve().then(() => (i$(),dK)),{PatternRedactor:H}=await Promise.resolve().then(() => (pA(),k4)),{createEmbeddingProgressReporter:Q,createModelDownloadHandler:X}=await Promise.resolve().then(() => (T5(),E6)),V=new J({repository:Y,provider:Z,config:K.embedding,redactor:new H}),B=V.checkModelState();if(B.modelChanged&&B.needsReEmbed){if(!await E3(B,_)){await $.dispose();return}let T=Y.getStoredEmbeddingDimensions(),M=K.embedding.dimensions;if(T!==null&&T!==M){if(!_.quiet)console.log(`Recreating embedding table for ${M}-dimensional vectors...`);Y.recreateVecTable(M)}if(!_.quiet)console.log("Clearing existing embeddings for re-embedding...")}let W=X({quiet:!!_.quiet});await Z.initialize(W);let N=typeof Y.getSkippedCount==="function"?Y.getSkippedCount(B.currentHash):0,z=Math.max(0,Y.getTotalMessageCount()-Y.getEmbeddedCount()-N);if(z===0){if(!_.quiet)if(N>0)console.log(`
|
|
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 L1(A),$=new v1,Z=await new cG(G,$).syncMemoryFiles();if(Z.filesIndexed>0||Z.filesSkipped>0||Z.errors.length>0)return Z;return null}catch(G){if(!_.quiet)console.error(` Memory files: error (${L(G)})`);return null}}function x3(A,_){if(_.json){let G={memoryFiles:{indexed:A.filesIndexed,skipped:A.filesSkipped,errors:A.errors}};console.log(JSON.stringify(G,null,2));return}if(_.quiet)return;if(console.log(` Memory files: ${A.filesIndexed} indexed, ${A.filesSkipped} skipped`),A.errors.length>0)for(let G of A.errors)console.log(` Error: ${G.filePath}: ${G.error}`)}async function m2(A,_,G){try{let $,K,Z,Y;if(G){if($=G.loadConfig(),!$.ambientContext.enabled)return;K=G.resolveAutoMemoryDir(),Z=G.resolveProjectName(),Y=G.createAmbientService()}else{let{loadConfig:H}=await Promise.resolve().then(() => (JA(),j1));if($=H(),!$.ambientContext.enabled)return;let Q=process.cwd(),{ProjectPath:X}=await Promise.resolve().then(() => e6),V=X.fromDecoded(Q),B=V.encoded;Z=V.projectName;let{homedir:W}=await import("os"),{join:N}=await import("path");K=N(W(),".claude","projects",B,"memory"),Y=await TH(A)}let J=await Y.generateAmbientContext({projectName:Z,autoMemoryDir:K,budget:$.ambientContext.budget});if(J.success&&!_.quiet)console.log(` Ambient context: updated (~${J.contextTokens} tokens)`);else if(!J.success&&!_.quiet)console.log(` Ambient context: skipped (${J.reason})`)}catch($){if(!_.quiet)console.error(` Ambient context: error (${L($)})`)}}async function TH(A){let{SqliteProjectResolver:_}=await Promise.resolve().then(() => j4),{SqliteFactRepository:G}=await Promise.resolve().then(() => (P0(),B4)),{SqliteFrictionRepository:$}=await Promise.resolve().then(() => ($G(),X4)),{SqlitePersonaRepository:K}=await Promise.resolve().then(() => (H_(),M4)),{SqliteGraphRepository:Z}=await Promise.resolve().then(() => (YG(),q4)),{SqliteMemoryGovernanceRepository:Y}=await Promise.resolve().then(() => (k0(),L4)),{SqliteMemoryUtilityRepository:J}=await Promise.resolve().then(() => (I1(),U4)),{AutoMemoryWriter:H}=await Promise.resolve().then(() => (w3(),v3)),{SmartContextService:Q}=await Promise.resolve().then(() => (iG(),sK)),{MemoryGovernanceService:X}=await Promise.resolve().then(() => ($_(),j6)),{MemoryRankingService:V}=await Promise.resolve().then(() => (r_(),tK)),{AmbientContextService:B}=await Promise.resolve().then(() => oK),{createContextFormatter:W}=await Promise.resolve().then(() => (n1(),_3)),N=new Y(A),z=new Q({projectResolver:new _(A),factRepo:new G(A),frictionRepo:new $(A),personaRepo:new K(A),graphRepo:new Z(A),governancePolicy:new X({repository:N}),rankingService:new V,utilityRepo:new J(A)}),q=W("ai",!1);return new B(z,new H,q)}JA();pA();function VQ({db:A,resolver:_}){let G=new z0({projectNameResolver:_}),$=new w1,K=new m(A),Z=new WA(A),Y=new X0(A),J=new Q0(A),H=new wG(G,$,K,Z,Y,J,A,new f1,new g1,new t);return{fixProjectNames:(Q)=>H.fixProjectNames(Q),sync:(Q)=>H.sync(Q)}}function BQ(A){return{handleBackgroundMode:C2,setupSignalHandlers:j9,hasCheckpoint:U9,loadCheckpoint:I_,createProgressReporter:L5,getDefaultDbPath:S,executeDryRun:R3,handleError:f2,reportResults:F3,createDriveResolver:S3,initializeDatabase:D,closeDatabase:E,bulkOperationCheckpoint:N1,registerCleanup:F9,unregisterCleanup:S9,createSyncService:VQ,loadConfig:f,createRemoteEventSyncService:WQ,runMemoryFileSync:D3,reportMemoryFileResults:x3,runAmbientContextGeneration:m2,runEmbeddingPass:g2,...A}}function p2(){return new XQ("sync").description("Sync sessions from ~/.claude/projects/ to database").option("-f, --force","Re-extract all sessions regardless of state").option("-p, --project <path>","Sync only sessions from specific project").option("-s, --session <id>","Sync a specific session only").option("-n, --dry-run","Show what would be synced without syncing").option("--fix-names","Fix truncated project names in existing sessions").option("--embed","Generate embeddings for messages after sync").option("--background","Run embedding in background (use with --embed)").option("--include-memory-files","Index legacy ~/.memory / MEMORY_HOME markdown files").option("--remote","Synchronize canonical event logs with configured remote").option("--json","Output results as JSON").addOption(new K8("-q, --quiet","Suppress progress output").conflicts("verbose")).addOption(new K8("-v, --verbose","Show detailed progress").conflicts("quiet")).action(async(A)=>{let _=await Z8(A);process.exitCode=_.exitCode})}async function Z8(A,_={}){let G=BQ(_);if(A.background)return await G.handleBackgroundMode(A);G.setupSignalHandlers();let $=Date.now(),K=G.createProgressReporter(A);if(!A.quiet&&G.hasCheckpoint()){let H=G.loadCheckpoint();if(H)console.log(`Resuming from previous interrupted sync (${H.completedSessions}/${H.totalSessions} sessions done)`)}let Z=G.getDefaultDbPath();if(A.dryRun)return await G.executeDryRun(A);let Y;try{Y=G.initializeDatabase({path:Z}).db}catch(H){return G.handleError(H,A),{exitCode:1}}let J=async()=>{G.closeDatabase(Y)};G.registerCleanup(J);try{let H=G.createDriveResolver(),Q=G.createSyncService({db:Y,resolver:H});if(A.fixNames){K.log("Fixing project names...");let I=await Q.fixProjectNames(H);if(!A.quiet)console.log(`Fixed project names: ${I} sessions updated`)}let X={force:A.force,projectFilter:A.project,sessionFilter:A.session,checkpointEnabled:!0,onProgress:(I)=>{if(I.phase==="discovering")K.log("Discovering sessions...");else if(I.phase==="extracting"){if(I.current===1)K.start(I.total);K.update(I.current,I.sessionId)}}},V=await Q.sync(X);G.bulkOperationCheckpoint(Y),K.stop(),G.reportResults(V,$,A);let B=G.loadConfig(),W=B.remoteSync?.repositoryUrl,N=B.remoteSync?.enabled===!0&&typeof W==="string"&&W.trim().length>0;if(N&&A.remote===!0){if(!A.quiet)console.log("Synchronizing events with remote Git repository...");try{let T=await(await G.createRemoteEventSyncService({db:Y})).sync({machineId:B.machineId,repositoryUrl:W,autoPull:B.remoteSync.autoPull,autoPush:B.remoteSync.autoPush});if(T.success){if(T.rebuildNeeded){if(!A.quiet)console.log("Remote events pulled. Rebuilding database projections...")}else if(!A.quiet)console.log("Git events are already up to date.")}else if(T.status==="blocked"){let M=[T.error??"Remote synchronization blocked.","Run 'memory audit-secrets --skip-db --quarantine-events' and retry after reviewing the quarantine output."].join(" ");return console.error(M),{exitCode:1}}else console.error(`Warning: Remote synchronization failed: ${T.error}`)}catch(I){console.error(`Warning: Remote synchronization failed to execute: ${L(I)}`)}}else if(A.remote===!0)return console.error("Remote synchronization requested but no remote repository is configured. Run 'memory remote set <repository-url>' first."),{exitCode:1};else if(N&&!A.quiet)console.warn("Remote synchronization is configured but skipped. Run 'memory sync --remote' to synchronize canonical event logs.");if(A.includeMemoryFiles===!0||B.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1"){let I=await G.runMemoryFileSync(Y,A);if(I)G.reportMemoryFileResults(I,A)}else if(A.verbose&&!A.quiet)console.log(" Memory files: skipped (legacy opt-in disabled)");if(!A.dryRun)await G.runAmbientContextGeneration(Y,A);let q=V.errors.length>0||V.aborted?1:0;if(A.embed&&!A.dryRun){let I=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await G.runEmbeddingPass(Y,A)}catch(T){if(A.json)console.error(qG(C_(T)));else if(!A.quiet)console.error(i(C_(T),{verbose:A.verbose}));return{exitCode:1}}finally{if(I)if(G.removeBackgroundLock)G.removeBackgroundLock();else{let{removeLock:T}=await Promise.resolve().then(() => (e1(),t1));T()}}}return{exitCode:q}}catch(H){return K.stop(),G.handleError(H,A),{exitCode:1}}finally{G.unregisterCleanup(J),G.closeDatabase(Y)}}async function WQ({db:A}){let{RemoteEventSyncService:_}=await Promise.resolve().then(() => (Q1(),F6)),{GitRemoteEventTransport:G}=await Promise.resolve().then(() => (u3(),c3)),{getEventsDir:$}=await Promise.resolve().then(() => (c(),PG)),{rebuildProjections:K}=await Promise.resolve().then(() => (K$(),t3)),{SecretAuditService:Z}=await Promise.resolve().then(() => (Y$(),$8)),{getAllLogFiles:Y}=await Promise.resolve().then(() => (c(),PG));return new _({transport:new G($()),privacyPreflight:{audit:async()=>{return{eventLogFindings:(await new Z(new t).audit({eventLogPaths:Y()})).summary.eventLogFindings}}},projectionRebuilder:{rebuild:async()=>{await K(A)}}})}RG();t2();AK();M$();U$();B$();IA();import{Command as _X}from"commander";N0();import tQ from"@inquirer/search";import eQ from"@inquirer/select";import sQ from"fuzzy";var D8=null,oQ=null,AX=null;function x8(){if(D8!==null)return D8;return process.stdout.isTTY===!0}function P8(){return x8()}async function y8(A){if(!x8())throw Error("Interactive picker requires TTY. Use --session <id> instead.");let{sessionRepo:_,limit:G=100}=A,K=(await _.findFiltered({limit:G})).map((X)=>({value:X.id,name:`${X.projectPath.projectName} (${DA(X.startTime)})`,description:`${X.id.substring(0,8)}... | ${X.messages.length} messages`})),J=await(oQ??tQ)({message:"Search sessions (type to filter):",source:async(X,{signal:V})=>{if(V.aborted)return[];if(!X)return K;return sQ.filter(X,K,{extract:(W)=>`${W.name} ${W.description}`}).map((W)=>W.original)},pageSize:10}),Q=await(AX??eQ)({message:"Action:",choices:[{value:"show",name:"Show session details"},{value:"search",name:"Search within session"},{value:"context",name:"Get project context"},{value:"related",name:"Find related sessions"},{value:"cancel",name:"Cancel"}]});if(Q==="cancel")return null;return{sessionId:J,action:Q}}mA();B$();RG();M$();U$();u();iA();function GX(A){return{dbPath:S(),show:TG,search:FG,context:OG,related:jG,...A}}function $K(){return new _X("browse").description("Interactive session browser").option("-l, --limit <count>","Maximum sessions to show","100").action(async(A)=>{let _=await k8(A);process.exitCode=_.exitCode})}async function k8(A,_={}){if(!P8())return console.error("Error: Interactive mode requires a terminal."),console.error("Use specific commands instead:"),console.error(" memory list - List sessions"),console.error(" memory show <id> - Show session details"),console.error(" memory search <q> - Search sessions"),{exitCode:1};let G=GX(_),$={limit:"100",...A},K=parseInt($.limit,10),Z=G.dbPath,{db:Y}=D({path:Z});try{let J=new m(Y),H=await y8({sessionRepo:J,limit:K});if(!H)return E(Y),{exitCode:0};switch(E(Y),H.action){case"show":await G.show(H.sessionId,{});break;case"search":await G.search("*",{session:H.sessionId});break;case"context":{let{db:Q}=D({path:Z}),V=await new m(Q).findById(H.sessionId);if(E(Q),V)await G.context(V.projectPath.projectName,{});break}case"related":await G.related(H.sessionId,{});break}return{exitCode:0}}catch(J){let H=J instanceof F?J:new F(j.DB_CONNECTION_FAILED,L(J));console.error(i(H));try{E(Y)}catch{}return{exitCode:1}}}l0();JA();import{Command as JX}from"commander";import{copyFileSync as C8,cpSync as HX,existsSync as q0,mkdirSync as k_,readdirSync as b8,readFileSync as QX,rmSync as f8,statSync as KK,writeFileSync as XX}from"fs";import{dirname as VX,join as MA}from"path";c();import{readFileSync as $X,existsSync as KX}from"fs";import{join as h8}from"path";var{spawn:ZX}=globalThis.Bun;async function YX(A,_,G=process.env){let $=ZX(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:G}),K=await new Response($.stdout).text(),Z=await new Response($.stderr).text(),Y=await $.exited;return{success:Y===0,stdout:K.trim(),stderr:Z.trim(),exitCode:Y}}function v8(A,_){let G={};for(let $ of A)if(_.existsSync($))try{let K=_.readFileSync($,"utf-8");G[$]=Bun.hash(K).toString()}catch{G[$]="error"}return G}class y_{eventsDir;deps;constructor(A,_={}){this.eventsDir=A??CA(),this.deps={runGit:YX,existsSync:KX,readFileSync:$X,getAllLogFiles:UA,now:()=>new Date,..._}}async isGitRepo(){let A=h8(this.eventsDir,".git");return this.deps.existsSync(A)}async initRepo(){if(!(await this.deps.runGit(["init"],this.eventsDir)).success)return!1;let _=await this.deps.runGit(["config","user.name"],this.eventsDir);if(!_.success||!_.stdout)await this.deps.runGit(["config","user.name","Memory Nexus"],this.eventsDir),await this.deps.runGit(["config","user.email","sync@memory-nexus.local"],this.eventsDir);return await this.deps.runGit(["checkout","-b","main"],this.eventsDir),!0}async configureRemote(A){if(!A.trim())return!1;return await this.deps.runGit(["remote","remove","origin"],this.eventsDir),(await this.deps.runGit(["remote","add","origin",A],this.eventsDir)).success}async removeRemote(){let A=await this.deps.runGit(["remote","remove","origin"],this.eventsDir);return A.success||A.stderr.includes("No such remote")}async getRemoteUrl(){let A=await this.deps.runGit(["remote","get-url","origin"],this.eventsDir);return A.success?A.stdout:null}async sync(A,_,G=!0,$=!0){try{if(!await this.isGitRepo()){if(!await this.initRepo())return{success:!1,rebuildNeeded:!1,error:"Failed to initialize Git repository in events directory"}}if(await this.getRemoteUrl()!==_){if(!await this.configureRemote(_))return{success:!1,rebuildNeeded:!1,error:"Failed to configure Git remote repository URL"}}let Y=this.deps.getAllLogFiles(this.eventsDir),J=v8(Y,this.deps),H=`events-${A}.jsonl`,Q=h8(this.eventsDir,H);if(this.deps.existsSync(Q))await this.deps.runGit(["add",H],this.eventsDir),await this.deps.runGit(["commit","-m",`sync: ${A} observed at ${this.deps.now().toISOString()}`],this.eventsDir);let X=!0;if(G){if(await this.deps.runGit(["fetch","origin"],this.eventsDir),(await this.deps.runGit(["rev-parse","--verify","origin/main"],this.eventsDir)).success){let z=await this.deps.runGit(["pull","--rebase","origin","main"],this.eventsDir);if(!z.success)return X=!1,await this.deps.runGit(["rebase","--abort"],this.eventsDir),{success:!1,rebuildNeeded:!1,error:`Git pull failed: ${z.stderr}`}}}if($&&X){let N=await this.deps.runGit(["push","-u","origin","main"],this.eventsDir);if(!N.success)return{success:!1,rebuildNeeded:!1,error:`Git push failed: ${N.stderr}`}}let V=this.deps.getAllLogFiles(this.eventsDir),B=v8(V,this.deps),W=!1;if(Y.length!==V.length)W=!0;else for(let N of V)if(J[N]!==B[N]){W=!0;break}return{success:!0,rebuildNeeded:W}}catch(K){return{success:!1,rebuildNeeded:!1,error:L(K)}}}}Q1();Y$();pA();c();var j$=1,qA=0,p=1,O$=2;function ZK(A={}){let _=new JX("remote").description("Manage multi-device Git transport synchronization configuration");return _.command("set <repositoryUrl>").description("Set remote Git repository URL and initialize events log transport repository").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").option("--no-auto-pull","Disable automatic pull when memory sync --remote runs").option("--no-auto-push","Disable automatic push when memory sync --remote runs").action(async(G,$)=>{let K=await g8(G,A,$);process.exitCode=K.exitCode}),_.command("remove").description("Remove remote Git synchronization URL and disable remote sync").option("--json","Output stable JSON").action(async(G)=>{let $=await c8(A,G);process.exitCode=$.exitCode}),_.command("status").description("View remote Git synchronization status").option("--json","Output stable JSON").action(async(G)=>{let $=await u8(A,G);process.exitCode=$.exitCode}),_.command("preflight [repositoryUrl]").description("Validate remote sync readiness without sending event logs").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G,$)=>{let K=await BX(G,A,$);process.exitCode=K.exitCode}),_.command("doctor").description("Diagnose remote sync configuration and privacy readiness").option("--json","Output stable JSON").option("--allow-local-path","Allow local path remotes for explicit test/private workflows").action(async(G)=>{let $=await WX(A,G);process.exitCode=$.exitCode}),_.command("backup [outputDir]").description("Create a local backup of remote sync configuration and event logs").option("--json","Output stable JSON").action(async(G,$)=>{let K=await zX(G,A,$);process.exitCode=K.exitCode}),_.command("restore <backupDir>").description("Restore remote sync configuration and event logs from a backup").option("--json","Output stable JSON").option("--confirm","Confirm restore mutation").action(async(G,$)=>{let K=await NX(G,A,$);process.exitCode=K.exitCode}),_.command("rollback <backupDir>").description("Rollback remote sync configuration and event logs from an explicit backup").option("--json","Output stable JSON").option("--confirm","Confirm rollback mutation").action(async(G,$)=>{let K=await LX(G,A,$);process.exitCode=K.exitCode}),_}async function g8(A,_={},G={}){try{let $=_.loadConfig??f,K=_.saveConfig??hA,Z=_.createGitSyncer??((N)=>new y_(N)),Y=$(_.configPathOverride),J=G.allowLocalPath===!0||_.allowLocalPathRemote===!0,H=K_(A,{allowLocalPathRemote:J});if(!H.valid){let N=`Failed to configure Git remote: ${H.error}`;if(G.json)a("set","error",p,{},[N]);else console.error(`Error: ${N}`);return{exitCode:p}}let Q=Z(_.eventsDirOverride);if(!await Q.isGitRepo()){if(!G.json)console.log("Initializing local Git repository in events directory...");if(!await Q.initRepo()){if(G.json)a("set","error",p,{},["Failed to initialize Git repository locally."]);else console.error("Error: Failed to initialize Git repository locally.");return{exitCode:p}}}if(!G.json)console.log(`Configuring remote origin repository URL: ${A}`);if(!await Q.configureRemote(A)){if(G.json)a("set","error",p,{},["Failed to configure Git remote repository origin."]);else console.error("Error: Failed to configure Git remote repository origin.");return{exitCode:p}}let B=G.autoPull??Y.remoteSync?.autoPull??!0,W=G.autoPush??Y.remoteSync?.autoPush??!0;if(K({remoteSync:{enabled:!0,repositoryUrl:A,autoPush:W,autoPull:B}},_.configPathOverride),G.json)a("set","ok",qA,{enabled:!0,repositoryUrl:A,autoPull:B,autoPush:W});else console.log(`
|
|
1681
|
+
Success: Remote synchronization configured successfully!`),console.log("To synchronize your local facts with the remote repository, run: memory sync --remote");return{exitCode:qA}}catch($){let K=`Error setting remote: ${L($)}`;if(G.json)a("set","error",p,{},[K]);else console.error("Error setting remote:",L($));return{exitCode:p}}}async function c8(A={},_={}){try{let G=A.loadConfig??f,$=A.saveConfig??hA,K=A.createGitSyncer??((H)=>new y_(H)),Z=G(A.configPathOverride);$({remoteSync:{enabled:!1,autoPush:Z.remoteSync?.autoPush??!0,autoPull:Z.remoteSync?.autoPull??!0}},A.configPathOverride);let Y=K(A.eventsDirOverride);if(await Y.isGitRepo()){if(!_.json)console.log("Removing Git remote origin URL...");await Y.removeRemote()}if(_.json)a("remove","ok",qA,{enabled:!1});else console.log(`
|
|
1682
|
+
Success: Remote synchronization disabled and origin repository URL removed.`);return{exitCode:qA}}catch(G){let $=`Error removing remote: ${L(G)}`;if(_.json)a("remove","error",p,{},[$]);else console.error("Error removing remote:",L(G));return{exitCode:p}}}async function u8(A={},_={}){try{let G=A.loadConfig??f,$=A.createGitSyncer??((Q)=>new y_(Q)),K=G(A.configPathOverride),Z=K.remoteSync,Y=$(A.eventsDirOverride),J=await Y.isGitRepo(),H={machineId:K.machineId,enabled:Z?.enabled===!0,repositoryUrl:Z?.repositoryUrl??null,autoPull:Z?.autoPull??!1,autoPush:Z?.autoPush??!1,gitRepository:J?"initialized":"not_initialized",actualRemoteUrl:null};if(J){let Q=await Y.getRemoteUrl();H.actualRemoteUrl=Q}if(_.json)a("status","ok",qA,H);else if(console.log("Remote Sync Status"),console.log("=================="),console.log(`Machine ID: ${K.machineId}`),console.log(`Enabled: ${Z?.enabled?"yes":"no"}`),console.log(`Repository URL: ${Z?.repositoryUrl??"none configured"}`),console.log(`Auto-Pull: ${Z?.autoPull?"enabled":"disabled"}`),console.log(`Auto-Push: ${Z?.autoPush?"enabled":"disabled"}`),console.log(`Git Repository: ${J?"initialized":"not initialized"}`),J)console.log(`Actual Git Remote: ${H.actualRemoteUrl??"none"}`);return{exitCode:qA}}catch(G){let $=`Error gathering remote status: ${L(G)}`;if(_.json)a("status","error",p,{},[$]);else console.error("Error gathering remote status:",L(G));return{exitCode:p}}}async function BX(A,_={},G={}){try{let $=await d8(A,_,G),K=$.ready?qA:O$;if(G.json)a("preflight",$.ready?"ok":"not_ready",K,$,$.errors,$.warnings);else{console.log("Remote Sync Preflight"),console.log("====================="),console.log(`Ready: ${$.ready?"yes":"no"}`),console.log(`Machine ID: ${$.machineId}`),console.log(`Repository URL: ${$.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${$.gitRepository}`),console.log(`Actual Git Remote: ${$.actualRemoteUrl??"none"}`),console.log(`Event-log findings: ${$.eventLogFindings}`);for(let Z of $.warnings)console.warn(`Warning: ${Z}`);for(let Z of $.errors)console.error(`Error: ${Z}`)}return{exitCode:K}}catch($){let K=`Error running remote preflight: ${L($)}`;if(G.json)a("preflight","error",p,{},[K]);else console.error("Error running remote preflight:",L($));return{exitCode:p}}}async function WX(A={},_={}){try{let G=await d8(void 0,A,_),$=G.ready?qA:O$;if(_.json)a("doctor",G.ready?"ok":"not_ready",$,G,G.errors,G.warnings);else{console.log("Remote Sync Doctor"),console.log("=================="),console.log(`Ready: ${G.ready?"yes":"no"}`),console.log(`Remote configured: ${G.enabled?"yes":"no"}`),console.log(`Repository URL: ${G.repositoryUrl??"none configured"}`),console.log(`Git Repository: ${G.gitRepository}`),console.log(`Event-log findings: ${G.eventLogFindings}`);for(let K of G.warnings)console.warn(`Warning: ${K}`);for(let K of G.errors)console.error(`Error: ${K}`)}return{exitCode:$}}catch(G){let $=`Error running remote doctor: ${L(G)}`;if(_.json)a("doctor","error",p,{},[$]);else console.error("Error running remote doctor:",L(G));return{exitCode:p}}}async function zX(A,_={},G={}){try{let $=l8(A,_);if(G.json)a("backup","ok",qA,{...$});else console.log("Remote sync backup created."),console.log(`Backup path: ${$.backupPath}`),console.log(`Config: ${$.includesConfig?"included":"not found"}`),console.log(`Event files: ${$.eventFileCount}`);return{exitCode:qA}}catch($){let K=`Error creating remote backup: ${L($)}`;if(G.json)a("backup","error",p,{},[K]);else console.error("Error creating remote backup:",L($));return{exitCode:p}}}async function NX(A,_={},G={}){return m8("restore",A,_,G)}async function LX(A,_={},G={}){return m8("rollback",A,_,G)}async function m8(A,_,G,$){try{if($.confirm!==!0){let J=`${A} requires --confirm before mutating config or event logs`;if($.json)a(A,"not_ready",O$,{},[J]);else console.error(`Error: ${J}`);return{exitCode:O$}}let K=UX(_),Z=l8(void 0,G);qX(_,K,G);let Y={backupPath:_,rollbackBackupPath:Z.backupPath,restoredConfig:K.includesConfig,restoredEvents:K.includesEvents,eventFileCount:K.eventFileCount};if($.json)a(A,"ok",qA,Y);else console.log(`Remote sync ${A} completed.`),console.log(`Source backup: ${_}`),console.log(`Rollback backup: ${Z.backupPath}`);return{exitCode:qA}}catch(K){let Z=`Error running remote ${A}: ${L(K)}`;if($.json)a(A,"error",p,{},[Z]);else console.error(`Error running remote ${A}:`,L(K));return{exitCode:p}}}async function d8(A,_,G){let $=_.loadConfig??f,K=_.createGitSyncer??((q)=>new y_(q)),Z=_.auditRemoteEventLogs??MX,Y=$(_.configPathOverride),J=Y.remoteSync,H=A??J?.repositoryUrl,Q=[],X=[],V=o_(Y.machineId??"");if(!V.valid)X.push(V.error??"Machine identity is invalid");if(!H)X.push("Remote repository URL is not configured");else{let q=K_(H,{allowLocalPathRemote:G.allowLocalPath===!0||_.allowLocalPathRemote===!0});if(!q.valid)X.push(q.error??"Remote URL is invalid")}let B=K(_.eventsDirOverride),W=await B.isGitRepo(),N=null;if(W){if(N=await B.getRemoteUrl(),H&&N&&N!==H)Q.push("Configured remote URL does not match actual Git origin")}let z=await Z();if(z.eventLogFindings>0)X.push(`Active event logs contain ${z.eventLogFindings} likely secret finding(s)`);return{schemaVersion:j$,ready:X.length===0,enabled:J?.enabled===!0,machineId:Y.machineId??"",repositoryUrl:H??null,autoPull:J?.autoPull??!1,autoPush:J?.autoPush??!1,gitRepository:W?"initialized":"not_initialized",actualRemoteUrl:N,eventLogFindings:z.eventLogFindings,warnings:Q,errors:X}}async function MX(){return{eventLogFindings:(await new R_(new t).audit({eventLogPaths:UA()})).summary.eventLogFindings}}function l8(A,_){let G=_.now?.()??new Date,$=G.toISOString(),K=`remote-sync-${IX(G)}`,Z=A??_.backupDirOverride??MA(T0(),"remote-sync");k_(Z,{recursive:!0,mode:448});let Y=TX(Z,K);k_(Y,{recursive:!0,mode:448});let J=_.configPathOverride??A0(),H=_.eventsDirOverride??CA(),Q=MA(Y,"config.json"),X=MA(Y,"events"),V=q0(J),B=q0(H)&&KK(H).isDirectory(),W=0;if(V)C8(J,Q);if(B)k_(X,{recursive:!0,mode:448}),W=YK(H,X);let N={schemaVersion:j$,kind:"memory.remoteSync.backup",backupId:K,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:[".git"]},z=MA(Y,"manifest.json");return XX(z,`${JSON.stringify(N,null,2)}
|
|
1683
|
+
`,{mode:384}),{backupId:K,backupPath:Y,manifestPath:z,createdAt:$,includesConfig:V,includesEvents:B,eventFileCount:W,excludedPaths:N.excludedPaths}}function qX(A,_,G){let $=G.configPathOverride??A0(),K=G.eventsDirOverride??CA(),Z=MA(A,"config.json"),Y=MA(A,"events");if(_.includesConfig){if(k_(VX($),{recursive:!0,mode:448}),!q0(Z))throw Error("Backup manifest declares config but config.json is missing");C8(Z,$)}else if(q0($))f8($,{force:!0});if(_.includesEvents){if(!q0(Y)||!KK(Y).isDirectory())throw Error("Backup manifest declares events but events directory is missing");k_(K,{recursive:!0,mode:448}),w8(K),YK(Y,K)}else if(q0(K))w8(K)}function UX(A){let _=MA(A,"manifest.json");if(!q0(_))throw Error("Remote backup manifest.json is missing");let G=JSON.parse(QX(_,"utf-8"));if(G.schemaVersion!==j$||G.kind!=="memory.remoteSync.backup"||typeof G.backupId!=="string"||typeof G.createdAt!=="string"||typeof G.includesConfig!=="boolean"||typeof G.includesEvents!=="boolean"||typeof G.eventFileCount!=="number"||!Array.isArray(G.excludedPaths))throw Error("Remote backup manifest is invalid or unsupported");return G}function YK(A,_){let G=0;for(let $ of b8(A)){if($===".git")continue;let K=MA(A,$),Z=MA(_,$),Y=KK(K);if(Y.isDirectory())k_(Z,{recursive:!0,mode:448}),G+=YK(K,Z);else if(Y.isFile())HX(K,Z),G+=1}return G}function w8(A){for(let _ of b8(A)){if(_===".git")continue;f8(MA(A,_),{recursive:!0,force:!0,maxRetries:10,retryDelay:50})}}function TX(A,_){let G=MA(A,_),$=2;while(q0(G))G=MA(A,`${_}-${$}`),$+=1;return G}function IX(A){return A.toISOString().replace(/[-:.]/g,"").replace("Z","Z")}function a(A,_,G,$,K=[],Z=[]){console.log(JSON.stringify({schemaVersion:j$,command:A,status:_,exitCode:G,data:$,errors:K,warnings:Z},null,2))}L_();import{Command as OX}from"commander";import{copyFileSync as jX,existsSync as p8,mkdirSync as RX}from"fs";import{dirname as FX,join as JK}from"path";function HK(){return new OX("install").description("Install Claude Code hooks for automatic session sync").option("-f, --force","Reinstall even if already installed").action(async(A)=>{let _=await n8(A);process.exitCode=_.exitCode})}async function n8(A,_={}){let G=bA(_.hookOverrides);if(G.sessionEnd&&G.preCompact&&!A.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let $=I0(_.hookOverrides);RX(FX($),{recursive:!0});let K=EX(_.hookScriptSourceOverride);if(!K)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};jX(K,$),console.log(`Copied hook script to ${$}`);let Z=O0(_.hookOverrides);if(console.log(Z.message),Z.success)console.log(`
|
|
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"),
|
|
1242
|
-
Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function
|
|
1243
|
-
Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}
|
|
1685
|
+
To check status: memory status`),console.log("To uninstall: memory uninstall"),SX(_.hookOverrides);else return{exitCode:1};return{exitCode:0}}function SX(A){let _=s0(A);if(!_.hooks)return;let G="memory-nexus",$=!1;for(let K of Object.values(_.hooks)){if(!Array.isArray(K))continue;for(let Z of K){if(!Z?.hooks)continue;for(let Y of Z.hooks)if(Y.command?.includes(G)){$=!0;break}if($)break}if($)break}if($)console.error(`
|
|
1686
|
+
Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function EX(A){if(A!==void 0)return p8(A)?A:null;let _=JK(import.meta.dir,"../../../../dist/sync-hook.js"),G=JK(process.cwd(),"dist/sync-hook.js"),$=JK(process.cwd(),"dist","sync-hook.js");return[_,G,$].find((Z)=>p8(Z))??null}L_();import{Command as DX}from"commander";import{existsSync as xX,unlinkSync as PX}from"fs";function QK(){return new DX("uninstall").description("Remove Claude Code hooks for automatic session sync").option("-r, --restore","Restore settings.json from backup").action(async(A)=>{let _=await i8(A);process.exitCode=_.exitCode})}async function i8(A,_={}){let G=bA(_.hookOverrides);if(!G.sessionEnd&&!G.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if(A.restore&&G.backupExists){if(w$(_.hookOverrides))console.log("Restored settings.json from backup.")}else{let K=j0(_.hookOverrides);console.log(K.message)}let $=I0(_.hookOverrides);if(xX($))PX($),console.log("Removed hook script.");return console.log(`
|
|
1687
|
+
Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}D_();import{Command as yX}from"commander";D_();c();u();W1();mA();u();c();X$();import{existsSync as XK,readFileSync as kX,unlinkSync as hX}from"fs";import{join as vX}from"path";function wX(A){let _=0;if(!A.database.exists)_++;if(A.database.exists&&!A.database.readable)_++;if(A.database.exists&&!A.database.writable)_++;if(A.database.integrity==="corrupted")_++;if(!A.permissions.configDir)_++;if(!A.permissions.logsDir)_++;if(!A.permissions.sourceDir)_++;if(_+=A.config.issues.length,A.llmExtraction&&!A.llmExtraction.ready)_++;return _}function VK(){return new yX("doctor").description("Check system health and diagnose issues").option("--json","Output as JSON").option("--fix","Attempt to fix common issues").option("--portability","Perform portability and path-dialect migration checks").action(async(A)=>{let _=await a8(A);process.exitCode=_.exitCode})}async function a8(A,_={}){if(A.portability)return bX(A,_);if(A.json){let $=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R$(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides,fix:A.fix,stats:!1}),K={database:$.health.database,permissions:$.health.permissions,hooks:{...$.health.hooks,lastRun:$.health.hooks.lastRun?.toISOString()??null},config:$.health.config,embedding:$.health.embedding,sqliteVec:$.health.sqliteVec,searchCapability:$.health.searchCapability,llmExtraction:$.health.llmExtraction,providerEgress:$.health.providerEgress,capabilityInterop:$.health.capabilityInterop,migration:$.migration,qmd:$.qmd};console.log(JSON.stringify(K,null,2));let Z=0;if(!$.health.database.exists||$.health.database.integrity==="corrupted")Z=2;else if(wX($.health)>0||!$.health.searchCapability.vectorReady)Z=1;return{exitCode:Z}}return p0({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:A.fix,json:A.json},{dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?R$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?R$(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides})}function CX(A,_=process.platform){if(_==="win32")return A.includes("/")&&(A.startsWith("/home")||A.startsWith("/mnt")||A.startsWith("/var")||A.startsWith("/usr")||A.startsWith("/"));return A.includes("\\")||/^[a-zA-Z]:/.test(A)}async function bX(A,_={}){let G=XK,$=_.healthOverrides?.dbPath??S(),K=_.healthOverrides?.sourceDir??n(),Z=A.json?!1:v(),Y,J=[],H=[],Q=[];if(!XK($)){if(A.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(d("Error: Database does not exist. Run 'memory sync' first.",Z));return{exitCode:1}}try{Y=D({path:$}).db;let O=await new m(Y).findFiltered({limit:1e5});for(let R of O){let y=R.projectPath.decoded;if(CX(y)&&!J.includes(y))J.push(y);let HA=H0.resolveExistingPath(y,G);if(!G(HA)){if(!H.includes(y))H.push(y)}}}catch(T){let M=L(T);if(A.json)console.log(JSON.stringify({error:`Portability scan failed: ${M}`},null,2));else console.error(d(`Portability scan failed: ${M}`,Z));return{exitCode:2}}finally{if(Y)E(Y)}let X=vX(K,"embedding.lock"),V=!1,B=!1;if(XK(X)){V=!0;try{let T=kX(X,"utf-8"),M=JSON.parse(T);if(M.pid)process.kill(M.pid,0);else B=!0}catch(T){B=!0}}if(V&&B){if(Q.push(X),A.fix)try{hX(X)}catch(T){}}let N=await(_.gatherStatus??(await Promise.resolve().then(() => (D_(),e2))).gatherStatus)({dbPath:$,fix:!1,stats:!1}),z=N.health.sqliteVec.available,q=N.health.sqliteVec.version;if(A.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:J,orphanedPaths:H,staleLocks:Q,sqliteVecAvailable:z,sqliteVecVersion:q,fixedStaleLocks:A.fix&&Q.length>0}},null,2)),{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0};if(console.log("Portability & Migration Diagnostics"),console.log("=================================="),console.log(""),J.length===0)console.log(` ${C("[OK]",Z)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${l("[WARN]",Z)} Path Dialects: ${J.length} mixed slash/drive formats detected.`);for(let T of J)console.log(` - ${T}`)}if(H.length===0)console.log(` ${C("[OK]",Z)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${l("[WARN]",Z)} Orphaned Workspaces: ${H.length} project folder(s) not found on active filesystem.`);for(let T of H)console.log(` - ${T}`)}if(Q.length===0)console.log(` ${C("[OK]",Z)} Active Locks: No stale sync/embedding lock files detected.`);else if(A.fix)console.log(` ${C("[FIXED]",Z)} Active Locks: Cleaned up ${Q.length} stale lock file(s).`);else{console.log(` ${l("[WARN]",Z)} Active Locks: ${Q.length} stale sync/embedding lock file(s) found.`);for(let T of Q)console.log(` - ${T}`)}if(z)console.log(` ${C("[OK]",Z)} sqlite-vec: Loadable (v${q}) for active architecture.`);else console.log(` ${d("[FAIL]",Z)} sqlite-vec: Not loadable on this system architecture.`);if(console.log(""),H.length>0)console.log("\uD83D\uDCA1 [TIP] Orphaned project paths detected. You can safely prune these stale database records by running: memory purge --orphans"),console.log("");return{exitCode:H.length>0||J.length>0||Q.length>0&&!A.fix||!z?1:0}}function R$(...A){if(A.some((_)=>_===void 0))return;return A.join("/")}u();c();Y$();pA();import{Command as fX}from"commander";import{existsSync as gX,mkdirSync as cX,writeFileSync as uX}from"fs";import{dirname as mX}from"path";function BK(){return new fX("audit-secrets").description("Scan memory database and event logs for likely leaked secrets").option("--json","Output as JSON").option("--db <path>","Database path override").option("--skip-db","Skip database scanning").option("--event-log <path...>","Specific event log path(s) to scan").option("--events-dir <path>","Events directory to scan").option("--skip-events","Skip event-log scanning").option("--redact-db","Rewrite mutable database fields with redacted values").option("--quarantine-events","Move raw event logs to quarantine and write sanitized active copies").option("--quarantine-dir <path>","Quarantine directory for raw event logs").option("--report <path>","Write a redacted evidence report").action(async(A)=>{let _=await r8(A);process.exitCode=_.exitCode})}async function r8(A={},_={}){let G=_.redactor??new t,$=_.createService?.(G)??new R_(G),K=_.getDefaultDbPath??S,Z=_.databaseExists??gX,Y=_.initializeDatabase??D,J=_.closeDatabase??E,H=_.getAllLogFiles??UA,Q=_.writeFile??((B,W)=>uX(B,W,"utf-8")),X=_.mkdir??((B)=>cX(B,{recursive:!0})),V;try{let B=A.db??K(),W=A.skipDb!==!0,N=W&&(B===":memory:"||Z(B));if(N)V=Y({path:B,create:!1,applySchema:!1,walMode:!1,quickCheck:!0}).db;let z=A.skipEvents===!0?[]:nX(A.eventLog??H(A.eventsDir)),q=await $.audit({db:V,eventLogPaths:z,redactDatabase:A.redactDb===!0,quarantineEvents:A.quarantineEvents===!0,quarantineDir:A.quarantineDir}),I=A.redactDb===!0||A.quarantineEvents===!0,T=I?await $.audit({db:V,eventLogPaths:z}):void 0,M={schemaVersion:1,command:"audit-secrets",generatedAt:q.generatedAt,targets:{database:{requested:W,scanned:N,path:W?B:void 0},eventLogs:{requested:A.skipEvents!==!0,scanned:z.length,paths:z}},scan:q,verification:T?{requested:!0,totalFindings:T.summary.totalFindings,databaseFindings:T.summary.databaseFindings,eventLogFindings:T.summary.eventLogFindings,findings:T.findings}:void 0},O=iX(G,M);if(A.report)X(mX(A.report)),Q(A.report,JSON.stringify(O,null,2)+`
|
|
1688
|
+
`);if(A.json)console.log(JSON.stringify(O,null,2));else console.log(dX(O));if((O.verification?.totalFindings??O.scan.summary.totalFindings)===0)return{exitCode:0};return{exitCode:I?2:1}}catch(B){let W=G.redactText(L(B)).text;if(A.json)console.log(JSON.stringify({error:W},null,2));else console.error(`Error: ${W}`);return{exitCode:2}}finally{if(V)J(V)}}function dX(A){let _=[],G=A.scan.summary;if(_.push("Secret audit"),_.push(` Database: ${lX(A)}`),_.push(` Event logs: ${A.targets.eventLogs.scanned} scanned`),_.push(` Findings: ${G.totalFindings} total (${G.databaseFindings} database, ${G.eventLogFindings} event log)`),G.totalFindings===0)_.push(""),_.push("No suspected secrets found.");else{_.push(""),_.push("Findings:");for(let $ of A.scan.findings.slice(0,20))_.push(` - ${pX($)}`);if(A.scan.findings.length>20)_.push(` - ... ${A.scan.findings.length-20} more`);_.push(""),_.push("No raw secret values are printed. Use --redact-db and/or --quarantine-events to remediate.")}if(A.scan.remediation.database.requested||A.scan.remediation.eventLogs.requested){if(_.push(""),_.push("Remediation:"),_.push(` Database fields updated: ${A.scan.remediation.database.updatedFields}`),_.push(` FTS indexes rebuilt: ${A.scan.remediation.database.rebuiltFtsIndexes.length}`),_.push(` Event logs sanitized: ${A.scan.remediation.eventLogs.sanitizedFiles.length}`),_.push(` Raw event logs quarantined: ${A.scan.remediation.eventLogs.quarantinedFiles.length}`),A.verification)_.push(` Verification remaining findings: ${A.verification.totalFindings}`)}return _.join(`
|
|
1689
|
+
`)}function lX(A){if(!A.targets.database.requested)return"skipped";if(!A.targets.database.scanned)return`not found (${A.targets.database.path??"unknown"})`;return`scanned (${A.targets.database.path??"unknown"})`}function pX(A){if(A.surface==="database")return`database ${A.table}.${A.column} row ${A.rowId}: ${A.kind} ${A.placeholder}`;return`event log ${A.filePath}:${A.lineNumber}: ${A.kind} ${A.placeholder}`}function nX(A){return[...new Set(A.filter((_)=>_.trim()!==""))]}function iX(A,_){return A.redactJson(_).value}mA();u();W1();import{Command as aX,Option as rX}from"commander";import*as t8 from"readline";import{existsSync as tX}from"fs";function WK(A){let _=A.match(/^(\d+)([dmy])$/i);if(!_)throw Error(`Invalid duration format: "${A}". Use format like "30d" (days), "6m" (months), or "1y" (years).`);let G=parseInt(_[1],10),$=_[2].toLowerCase();if(G<=0)throw Error("Duration value must be a positive number.");let K=new Date,Z;switch($){case"d":Z=new Date(K.getTime()-G*24*60*60*1000);break;case"m":Z=new Date(K.getFullYear(),K.getMonth()-G,K.getDate());break;case"y":Z=new Date(K.getFullYear()-G,K.getMonth(),K.getDate());break;default:throw Error(`Unknown duration unit: "${$}"`)}return Z}function SG(A){return A.toISOString().split("T")[0]}async function eX(A){let _=t8.createInterface({input:process.stdin,output:process.stdout});return new Promise((G)=>{_.question(A,($)=>{_.close(),G($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}function zK(){return new aX("purge").description("Remove old sessions from database").option("--older-than <duration>",'Delete sessions older than duration (e.g., "90d", "6m", "1y")').option("--orphans","Delete orphaned sessions whose project workspaces no longer exist").option("-f, --force","Skip confirmation prompt").option("--dry-run","Show what would be deleted without deleting").option("--json","Output as JSON").addOption(new rX("-q, --quiet","Minimal output").conflicts("json")).action(async(A)=>{let _=await e8(A);process.exitCode=_.exitCode})}async function e8(A,_={}){let G=_.askConfirmation??eX,$=_.existsSync??tX,K=_.getDefaultDbPath??S,Z=_.initializeDatabase??D,Y=_.closeDatabase??E,J=_.createSessionRepository??((V)=>new m(V));if(!A.olderThan&&!A.orphans){if(A.json)console.log(JSON.stringify({error:"Please specify either --older-than <duration> or --orphans."},null,2));else console.error("Error: Please specify either --older-than <duration> or --orphans.");return{exitCode:1}}let H;if(A.olderThan)try{H=WK(A.olderThan)}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:1}}let Q=_.dbPath??K(),X;try{X=Z({path:Q}).db}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:`Database error: ${B}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let V=J(X),B=new Map;if(H){let z=await V.findOlderThan(H);for(let q of z)B.set(q.id,q)}if(A.orphans){let z=await V.findFiltered({limit:1e5});for(let q of z){let I=q.projectPath.decoded,T=H0.resolveExistingPath(I,$);if(!$(T))B.set(q.id,q)}}let W=B.size;if(W===0){if(A.json)console.log(JSON.stringify({sessionsDeleted:0,cutoffDate:H?.toISOString()??null,dryRun:A.dryRun??!1,message:H&&!A.orphans?`No sessions older than ${SG(H)}`:"No sessions matched the purge criteria."},null,2));else if(!A.quiet)if(H&&!A.orphans)console.log(`No sessions older than ${SG(H)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if(A.dryRun){let z=Array.from(B.values());if(A.json)console.log(JSON.stringify({sessionsToDelete:W,cutoffDate:H?.toISOString()??null,dryRun:!0,sessions:z.map((q)=>({id:q.id,project:q.projectPath.projectName,startTime:q.startTime.toISOString(),messageCount:q.messageCount}))},null,2));else if(A.quiet)console.log(W.toString());else{if(H&&!A.orphans)console.log(`Would delete ${W} session(s) older than ${SG(H)}:
|
|
1244
1690
|
`);else console.log(`Would delete ${W} session(s):
|
|
1245
|
-
`);let
|
|
1246
|
-
`)}function
|
|
1247
|
-
`)}import{Command as
|
|
1691
|
+
`);let q=v();for(let I of z){let T=I.id.substring(0,16),M=I.projectPath.projectName,O=I.startTime.toISOString().split("T")[0],R=I.messageCount;if(q)console.log(` \x1B[33m${T}\x1B[0m ${M} ${O} (${R} messages)`);else console.log(` ${T} ${M} ${O} (${R} messages)`)}}return{exitCode:0}}if(!A.force){if(!await G(H&&!A.orphans?`Delete ${W} session(s) older than ${SG(H)}? This cannot be undone. (y/n) `:`Delete ${W} session(s)? This cannot be undone. (y/n) `)){if(A.json)console.log(JSON.stringify({cancelled:!0},null,2));else if(!A.quiet)console.log("Purge cancelled.");return{exitCode:0}}}if(X.transaction(()=>{for(let z of B.keys())V.delete(z)}).immediate(),A.json)console.log(JSON.stringify({sessionsDeleted:W,cutoffDate:H?.toISOString()??null,dryRun:!1},null,2));else if(A.quiet)console.log(W.toString());else if(H&&!A.orphans)console.log(`Deleted ${W} session(s) older than ${SG(H)}.`);else console.log(`Deleted ${W} session(s).`);return{exitCode:0}}catch(V){let B=L(V);if(A.json)console.log(JSON.stringify({error:B},null,2));else console.error(`Error: ${B}`);return{exitCode:2}}finally{if(X)Y(X)}}u();c();L_();import{Command as sX}from"commander";import{existsSync as s8,unlinkSync as oX}from"fs";import{join as AV}from"path";function NK(){return new sX("migrate").description("Migrate database across platform environments").option("--from-windows","Migrate database from native Windows/desktop host").action(async(A)=>{let _=await o8(A);process.exitCode=_.exitCode})}async function o8(A,_={}){let G=v(),$=_.dbPath??S(),K=_.dataDir??n(),Z=_.uninstallHooks??j0,Y=_.installHooks??O0;if(!s8($))return console.error(d(`Error: Database not found at ${$}. Run 'memory sync' first.`,G)),{exitCode:1};let J;try{J=D({path:$}).db;let X=J.prepare("PRAGMA integrity_check").get();if(!X||X.integrity_check!=="ok"){let V=X?.integrity_check??"unknown";throw Error(`Database integrity check failed: ${V}`)}J.prepare("PRAGMA wal_checkpoint(TRUNCATE)").run()}catch(Q){let X=L(Q);if(console.error(d(`Error during migration: ${X}`,G)),J)E(J);return{exitCode:2}}let H=AV(K,"embedding.lock");if(s8(H))try{oX(H),console.log(C("Cleaned up stale embedding lock file.",G))}catch(Q){}try{Z(),Y(),console.log(C("Successfully re-installed Git hooks natively.",G))}catch(Q){let X=L(Q);console.log(l(`Warning: Failed to re-install Git hooks: ${X}`,G))}try{let X=await new V0(J).getStats();if(console.log(""),console.log(C("Database migration successful!",G)),console.log("================================="),console.log(`Total sessions: ${X.totalSessions}`),console.log(`Total messages: ${X.totalMessages}`),console.log(""),console.log("Project Breakdown:"),X.projectBreakdown.length===0)console.log(" No projects found.");else for(let V of X.projectBreakdown)console.log(` - ${V.projectName}: ${V.sessionCount} sessions, ${V.messageCount} messages`);console.log("")}catch(Q){}finally{E(J)}return{exitCode:0}}u();import{Command as _V,Option as LK}from"commander";pA();import{existsSync as AZ}from"fs";import{dirname as GV}from"path";function MK(){return new _V("export").description("Export database to JSON file for backup").argument("<output-file>","Path to write the JSON backup file").addOption(new LK("-q, --quiet","Suppress output except the file path").conflicts("json")).addOption(new LK("--json","Output stats as JSON").conflicts("quiet")).addOption(new LK("--include-sensitive","Export raw sensitive values without redaction")).action(async(A,_)=>{let G=await _Z(A,_);process.exitCode=G.exitCode})}async function _Z(A,_={}){let G=GV(A);if(G!=="."&&!AZ(G))return console.error(`Error: Directory does not exist: ${G}`),{exitCode:1};let $=S();if(!AZ($))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:K}=D({path:$});try{let Z=await a$(K,A,{includeSensitive:_.includeSensitive,redactor:new t});if(_.json)console.log(JSON.stringify({success:!0,path:A,stats:Z},null,2));else if(_.quiet)console.log(A);else console.log($V(Z,A));return{exitCode:0}}catch(Z){let Y=L(Z);if(_.json)console.log(JSON.stringify({success:!1,error:Y},null,2));else console.error(`Error: ${Y}`);return{exitCode:1}}finally{E(K)}}function $V(A,_){let G=[];return G.push(`Exported ${A.sessions} sessions, ${A.messages} messages to ${_}`),G.push(""),G.push("Details:"),G.push(` Sessions: ${A.sessions}`),G.push(` Messages: ${A.messages}`),G.push(` Tool uses: ${A.toolUses}`),G.push(` Entities: ${A.entities}`),G.push(` Links: ${A.links}`),G.push(` File size: ${KV(A.bytes)}`),G.join(`
|
|
1692
|
+
`)}function KV(A){if(A===0)return"0 B";let _=["B","KB","MB","GB"],G=1024,$=Math.floor(Math.log(A)/Math.log(G));return`${(A/Math.pow(G,$)).toFixed($>0?1:0)} ${_[$]}`}u();import{Command as ZV,Option as GZ}from"commander";import{existsSync as YV}from"fs";function qK(){return new ZV("import").description("Import database from JSON backup file").argument("<input-file>","Path to the JSON backup file").option("--clear","Clear existing data before import").option("--force","Skip confirmation when merging with existing data").addOption(new GZ("-q, --quiet","Suppress output except errors").conflicts("json")).addOption(new GZ("--json","Output stats as JSON").conflicts("quiet")).action(async(A,_)=>{let G=await $Z(A,_);process.exitCode=G.exitCode})}async function $Z(A,_={}){if(!YV(A))return EG("File does not exist",A,_),{exitCode:1};let G=await fG(A);if(!G.valid)return EG(`Invalid backup file: ${G.error}`,A,_),{exitCode:1};let $=S(),{db:K}=D({path:$});try{if(t$(K)&&!_.clear&&!_.force){if(!_.json&&!_.quiet)console.log("Warning: Database contains existing data."),console.log("Use --clear to replace all data, or --force to merge without prompt.");if(!process.stdout.isTTY)return EG("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",A,_),{exitCode:1};return EG("Use --clear to replace data or --force to merge",A,_),{exitCode:1}}let Y=await r$(K,A,{clearExisting:_.clear});if(_.json){let J={success:!0,path:A,version:G.version,stats:Y,cleared:_.clear??!1};console.log(JSON.stringify(J,null,2))}else if(_.quiet);else console.log(JV(Y,A,_.clear??!1));return{exitCode:0}}catch(Z){let Y=L(Z);return EG(Y,A,_),{exitCode:1}}finally{E(K)}}function EG(A,_,G){if(G.json)console.log(JSON.stringify({success:!1,path:_,error:A},null,2));else console.error(`Error: ${A}`)}function JV(A,_,G){let $=[],K=G?"Replaced":"Imported";return $.push(`${K} ${A.sessions} sessions, ${A.messages} messages from ${_}`),$.push(""),$.push("Details:"),$.push(` Sessions: ${A.sessions}`),$.push(` Messages: ${A.messages}`),$.push(` Tool uses: ${A.toolUses}`),$.push(` Entities: ${A.entities}`),$.push(` Links: ${A.links}`),$.join(`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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((
|
|
1655
|
-
${
|
|
1656
|
-
`);switch(
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
`)}
|
|
1661
|
-
`+
|
|
1662
|
-
|
|
1663
|
-
${H.
|
|
1664
|
-
|
|
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();K$();$_();D0();import{Command as hV,Option as a0}from"commander";var h_=[...tG];function OK(){let A=new hV("governance").description("Inspect and control derived memory consent/provenance state");return A.command("list").description("List governed derived memory").addOption(new a0("--surface <surface>","Surface to list").choices(h_)).option("--project <project>","Project to filter by").option("--status <status>","Governance status to filter by").addOption(new a0("--limit <n>","Maximum entries").argParser(gV)).option("--json","Output as JSON").action(async(_)=>{process.exitCode=(await r0({action:"list",..._})).exitCode}),A.command("show").description("Show governance state for a target").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to inspect").choices(h_).default("fact")).option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"show",targetId:_,...G})).exitCode}),F$(A,"suppress","Suppress a target from future memory use"),F$(A,"unsuppress","Reactivate a suppressed target"),F$(A,"invalidate","Invalidate a target as wrong or unsafe"),F$(A,"review","Mark a target as reviewed"),A.command("expire").description("Expire a target now or at a supplied ISO timestamp").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--at <iso>","Expiry timestamp, defaults to now").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"expire",targetId:_,...G})).exitCode}),A.command("consent-grant").description("Grant consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-grant",targetId:_,...G})).exitCode}),A.command("consent-revoke").description("Revoke consent for a target and scope").argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--scope <scope...>","Consent scope(s)").option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await r0({action:"consent-revoke",targetId:_,...G})).exitCode}),A}async function r0(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return S$(A,"DB_CONNECTION_FAILED",zZ(K),1)}try{let K=new s($),Z=new cA({repository:K,writeEvent:_.writeEvents===!1?void 0:_$});if(A.action==="list"){let X=await Z.list({surface:A.surface,project:A.project,status:A.status,limit:A.limit});return IK(A,X.map((V)=>V.toJSON()))}let Y=CV(A.surface),J=bV(A.targetId);if(A.action==="show"){let X=await Z.show(Y,J);if(!X)return S$(A,"NOT_FOUND",`No governance entry found for ${Y}:${J}`,1);return IK(A,X.toJSON())}let H={surface:Y,targetId:J,actor:"user",reason:A.reason,expiresAt:A.at?fV(A.at):void 0,consentScopes:A.scope},Q=A.action==="suppress"?await Z.suppress(H):A.action==="unsuppress"?await Z.unsuppress(H):A.action==="invalidate"?await Z.invalidate(H):A.action==="expire"?await Z.expire(H):A.action==="review"?await Z.review(H):A.action==="consent-grant"?await Z.grantConsent(H):A.action==="consent-revoke"?await Z.revokeConsent(H):null;if(!Q)return S$(A,"INVALID_ACTION",`Unsupported governance action: ${A.action}`,2);return IK(A,Q.toJSON())}catch(K){return S$(A,"UNEXPECTED_ERROR",zZ(K),2)}finally{E($)}}function F$(A,_,G){A.command(_).description(G).argument("<targetId>","Target memory id").addOption(new a0("--surface <surface>","Surface to control").choices(h_).default("fact")).option("--reason <reason>","Reason for the control event").option("--json","Output as JSON").action(async($,K)=>{process.exitCode=(await r0({action:_,targetId:$,...K})).exitCode})}function IK(A,_){if(A.json)console.log(JSON.stringify({status:"success",data:_},null,2));else if(Array.isArray(_))if(_.length===0)console.log("No governed memory entries found.");else for(let G of _)console.log(vV(G));else console.log(wV(_));return{exitCode:0}}function S$(A,_,G,$){if(A.json)console.log(JSON.stringify({status:"error",error:{code:_,message:G}},null,2));else console.error(`Error: ${G}`);return{exitCode:$}}function vV(A){let _=A.blocked?"blocked":"active";return`${A.surface}:${A.target_id} [${A.status}/${_}] ${A.project??"global"} via ${A.transformation_method}`}function wV(A){return[`${A.surface}:${A.target_id}`,`Status: ${A.status}${A.blocked?" (blocked)":""}`,`Project: ${A.project??"global"}`,`Source events: ${A.source_event_ids.join(", ")}`,`Method: ${A.transformation_method}`,`Actor: ${A.actor}`,`Consent: ${A.consent_status} ${A.consent_scopes.join(", ")}`,`Redaction: ${A.redaction_state}`,A.status_reason?`Reason: ${A.status_reason}`:void 0].filter((_)=>_!==void 0).join(`
|
|
2220
|
+
`)}function CV(A){return A_(A??"fact")}function bV(A){if(!A||!A.trim())throw Error("targetId is required");return A}function fV(A){let _=new Date(A);if(Number.isNaN(_.getTime()))throw Error(`Invalid ISO date: ${A}`);return _}function gV(A){let _=Number.parseInt(A,10);if(!Number.isSafeInteger(_)||_<1)throw Error("Value must be a positive integer");return _}function zZ(A){return A instanceof Error?A.message:String(A)}A1();$_();e_();u();P0();$G();k0();H_();import{Command as cV,Option as E$}from"commander";var NZ=[...eG];function FK(){let A=new cV("profile").description("Inspect and rebuild governed persona/procedural memory");return A.command("show").description("Show persona/procedural memory for a project").argument("[project]","Project name to show; omitted shows global persona only").addOption(new E$("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E$("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Show every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"show",project:_,...G})).exitCode}),A.command("export").description("Export governed persona/procedural memory as stable JSON").argument("[project]","Project name to export; omitted exports global persona only").addOption(new E$("--kind <kind>","Persona entry kind").choices(NZ)).addOption(new E$("--limit <n>","Maximum entries").argParser(LZ)).option("--all","Export every project scope instead of global-only when no project is supplied").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"export",project:_,...G})).exitCode}),A.command("rebuild").description("Rebuild persona/procedural memory from governed source facts and friction").argument("[project]","Project name to rebuild").option("--all","Rebuild all profile entries").option("--json","Output as JSON").action(async(_,G)=>{process.exitCode=(await D$({action:"rebuild",project:_,...G})).exitCode}),A}async function D$(A,_={}){let G=_.dbPath??S(),$;try{({db:$}=D({path:G}))}catch(K){return RK(A,"DB_CONNECTION_FAILED",MZ(K),1)}try{let K=new FA($),Z=new RA($),Y=new SA($),J=new s($),H=new cA({repository:J,..._.now?{now:_.now}:{}});if(A.action==="rebuild"){if(!A.project&&!A.all)return RK(A,"INVALID_ARGUMENT","Provide a project or --all for profile rebuild.",1);let N=await new oG({factRepo:K,frictionRepo:Z,personaRepo:Y,governanceRepo:J,..._.now?{now:_.now}:{}}).rebuildProfile(A.project?{project:A.project}:{});return jK(A,{project:A.project??null,all:A.all===!0,entry_count:N.entries.length,fact_count:N.factCount,friction_pattern_count:N.frictionPatternCount,entries:N.entries.map((z)=>z.toJSON())})}let Q=await uV(Y,A),X=await H.filterAllowed("persona",Q,(W)=>W.entryId),V=A.kind?X.filter((W)=>W.kind===A.kind):X,B=V.slice(0,A.limit??V.length);if(A.action==="export")return jK(A,{schema_version:1,generated_at:(_.now?.()??new Date).toISOString(),project:A.project??null,all:A.all===!0,entries:B.map((W)=>W.toJSON())});return jK(A,B)}catch(K){return RK(A,"UNEXPECTED_ERROR",MZ(K),2)}finally{E($)}}async function uV(A,_){let G=_.limit??100;if(_.project)return A.findForContext(_.project,{limit:G});if(_.all)return A.findAll({kind:_.kind,limit:G});return A.findAll({kind:_.kind,visibility:"global",limit:G})}function jK(A,_){if(A.json||A.action==="export")return console.log(JSON.stringify({status:"success",data:_},null,2)),{exitCode:0};if(A.action==="rebuild"){let K=_;return console.log(`Profile rebuilt for ${K.project??"all projects"}.`),console.log(`Entries: ${K.entry_count} | Facts scanned: ${K.fact_count} | Friction patterns scanned: ${K.friction_pattern_count}`),{exitCode:0}}let G=_,$=A.project?`Persona Profile for Project: ${A.project}`:A.all?"Persona Profile for All Projects":"Global Persona Profile";if(console.log(`
|
|
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(() => (o$(),aK)),{getDefaultDbPath:Q}=await Promise.resolve().then(() => (u(),Z2)),{loadConfig:X}=await Promise.resolve().then(() => (JA(),j1)),V=X(),B=A.writeMemoryFiles===!0||V.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1";if(!A.dryRun&&!B){console.error("Legacy memory-file backfill is disabled by default. Re-run with --write-memory-files or set legacyMemoryFiles.enabled=true to write ~/.memory / MEMORY_HOME daily logs."),process.exitCode=1;return}let W=Q(),z=_({path:W}).db;try{let q=new $(z),I=new K(z),T=new Z(z),M=new Y,O=J(),R=new IZ(O),y=new H(q,I,T,M,R),HA=await OZ(A,y);process.exitCode=HA.exitCode}finally{G(z)}})}async function sV(A){return new Promise((_)=>{let G=pV({input:process.stdin,output:process.stderr});G.question(A,($)=>{G.close(),_($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}u();P0();mA();Y_();JA();import{Command as AB}from"commander";_G();K$();l_();var oV={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class EK{db;factRepo;logRepo;messageRepo;extractionProvider;embeddingProvider;eventLogPath;redactor;constructor(A,_,G,$,K,Z,Y,J=oV){this.db=A;this.factRepo=_;this.logRepo=G;this.messageRepo=$;this.extractionProvider=K;this.embeddingProvider=Z;this.eventLogPath=Y;this.redactor=J}async extractFromSession(A,_,G){if(await this.logRepo.findById(A)&&!G?.force)return{skippedSession:!0,added:0,updated:0,superseded:0,skipped:0};let K=await this.messageRepo.findBySession(A);if(K.length===0)return{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let Z=K.map((q)=>TA.create({id:q.id,role:q.role,content:this.redactor.redactText(q.content).text,timestamp:q.timestamp,toolUseIds:q.toolUses})),Y=(await this.extractionProvider.extract(Z)).map((q)=>({...q,content:this.redactor.redactText(q.content).text,metadata:this.redactor.redactJson(q.metadata).value}));if(Y.length===0)return await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:0,factsUpdated:0,factsSuperseded:0,factsSkipped:0,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:0,updated:0,superseded:0,skipped:0};let H=(await this.factRepo.findByProject(_)).filter((q)=>q.supersededAt===null),Q=Boolean(this.embeddingProvider&&this.embeddingProvider.isReady()),X=[],V=[];if(Q&&this.embeddingProvider)try{X=(await this.embeddingProvider.embedBatch(H.map((T)=>this.redactor.redactText(T.content).text))).map((T)=>T.embedding),V=(await this.embeddingProvider.embedBatch(Y.map((T)=>T.content))).map((T)=>T.embedding)}catch(q){let I=this.redactor.redactText(L(q)).text;console.warn("Failed to generate vector embeddings during extraction comparison, falling back to Jaccard:",I)}let B=0,W=0,N=0,z=0;for(let q=0;q<Y.length;q++){let I=Y[q];if(!I)continue;let T=0,M=null;for(let O=0;O<H.length;O++){let R=H[O];if(!R)continue;let y=0;if(I.content.trim().toLowerCase()===R.content.trim().toLowerCase())y=1;else{let HA=V[q],tA=X[O];if(Q&&HA&&tA)y=this.cosineSimilarity(HA,tA);else y=this.jaccardWordSimilarity(I.content,R.content)}if(y>T)T=y,M=R}if(T>=0.95||M&&I.content.trim().toLowerCase()===M.content.trim().toLowerCase())z++;else if(T>=0.85&&M){B++,W++,N++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath);let R=YA.create({type:"supersedence",project:_,content:`Superseded ${M.uuid} by ${O.uuid}`,metadata:{superseded_uuid:M.uuid,superseded_by_uuid:O.uuid},observedAt:new Date});await UG(R,this.eventLogPath)}else{B++;let O=YA.create({type:I.type,project:_,content:I.content,metadata:{confidence:I.confidence,...I.metadata},observedAt:new Date});await UG(O,this.eventLogPath)}}return await l2(this.db,this.eventLogPath),await this.logRepo.save({sessionId:A,mode:"manual",factsAdded:B,factsUpdated:W,factsSuperseded:N,factsSkipped:z,provider:this.extractionProvider.providerId,model:this.extractionProvider.modelName,tokensConsumed:0,extractedAt:new Date}),{skippedSession:!1,added:B,updated:W,superseded:N,skipped:z}}cosineSimilarity(A,_){let G=0,$=0,K=0;for(let Z=0;Z<A.length;Z++){let Y=A[Z]??0,J=_[Z]??0;G+=Y*J,$+=Y*Y,K+=J*J}if($===0||K===0)return 0;return G/(Math.sqrt($)*Math.sqrt(K))}jaccardWordSimilarity(A,_){let G=(J)=>new Set(J.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()?"']/g,"").split(/\s+/).filter((H)=>H.length>0)),$=G(A),K=G(_),Z=new Set([...$].filter((J)=>K.has(J))),Y=new Set([...$,...K]);if(Y.size===0)return 0;return Z.size/Y.size}}zA();pA();WG();class jZ{current=0;total=0;isTty=process.stdout.isTTY;quiet=!1;constructor(A,_=!1){if(this.total=A,this.quiet=_,this.quiet)return;if(this.isTty)process.stdout.write(`\rExtracting facts... [0/${A}] \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 0%`);else console.log(`Extracting facts from ${A} sessions...`)}update(A){if(this.quiet)return;this.current++;let _=Math.round(this.current/this.total*100),G=Math.min(10,Math.max(0,Math.floor(_/10))),$="\u2588".repeat(G)+"\u2591".repeat(10-G);if(this.isTty){let K=A.length>25?A.substring(0,22)+"...":A;process.stdout.write(`\rExtracting facts... [${this.current}/${this.total}] [${$}] ${_}% - Session: ${K}`)}else console.log(`[${this.current}/${this.total}] Processed session: ${A}`)}stop(){if(this.quiet)return;if(this.isTty)process.stdout.write(`
|
|
2227
|
+
`)}}async function _B(A){let{EmbeddingProviderFactory:_}=await Promise.resolve().then(() => (o1(),b2)),$=new _().createFromConfig(A);if(!$)return;return await $.initialize(),$}function DK(){return new AB("extract").description("Extract facts from session messages using LLM").argument("<project>","Project name or path to process").option("--all","Process all sessions matching this project").option("--since <duration>","Filter sessions by age (e.g. '24h', '7d', '30d')").option("-f, --force","Force extraction even on previously processed sessions").option("--json","Output result as JSON").option("-q, --quiet","Minimal output").action(async(A,_)=>{let G=await RZ({project:A,..._});process.exitCode=G.exitCode})}async function RZ(A,_={}){let G=performance.now(),$=_.dbPath??S(),K=f(),Z;if(_.mockExtractor)Z=_.mockExtractor;else try{Z=G9(K)}catch(H){let Q=L(H);if(A.json)h({command:"extract",code:"PROVIDER_INIT_FAILED",message:Q});else console.error(`Error: Provider initialization failed: ${Q}`);return{exitCode:1}}let Y=_.mockEmbedder;if(!_.mockEmbedder&&K.embedding?.enabled)try{Y=await(_.createEmbedder??_B)(K)}catch(H){}let J;try{J=D({path:$}).db}catch(H){if(A.json)h({command:"extract",code:"DB_CONNECTION_FAILED",message:H.message});else console.error(`Error: Database connection failed: ${H.message}`);return{exitCode:1}}try{let H=new FA(J),Q=new M1(J),X=new m(J),V=new WA(J),B=await X.findFiltered({projectFilter:A.project,limit:1e4}),W=B;if(A.since&&!A.all)try{let R=WK(A.since);W=B.filter((y)=>y.startTime>=R)}catch(R){if(A.json)h({command:"extract",code:"INVALID_ARGUMENT",message:R.message});else console.error(`Error: ${R.message}`);return{exitCode:1}}let N=new EK(J,H,Q,V,Z,Y,_.eventLogPath,new t),z=[];for(let R of W)if(!await Q.findById(R.id)||A.force)z.push(R);if(z.length===0){if(A.json)console.log(JSON.stringify({status:"success",data:{added:0,updated:0,superseded:0,skipped:0},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:0}},null,2));else if(!A.quiet)console.log("No new sessions to extract for project:",A.project);return{exitCode:0}}let q=new jZ(z.length,!!A.quiet||!!A.json),I=0,T=0,M=0,O=0;for(let R of z){let y=await N.extractFromSession(R.id,A.project,A.force?{force:!0}:void 0);I+=y.added,T+=y.updated,M+=y.superseded,O+=y.skipped,q.update(R.id.substring(0,8))}if(q.stop(),A.json)console.log(JSON.stringify({status:"success",data:{added:I,updated:T,superseded:M,skipped:O},meta:{timing_ms:Math.round(performance.now()-G),sessions_processed:z.length}},null,2));else if(A.quiet)console.log(`added: ${I}, updated: ${T}, superseded: ${M}, skipped: ${O}`);else{let R=v();console.log(`
|
|
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(T$());w.addCommand(I$());w.addCommand(L$());w.addCommand(V$());w.addCommand(W$());w.addCommand(q$());w.addCommand(N$());w.addCommand(xK());w.addCommand(OK());w.addCommand(FK());w.commandsGroup("Data Commands:");w.addCommand(p2());w.addCommand(SK());w.addCommand(MK());w.addCommand(qK());w.addCommand(zK());w.addCommand(NK());w.addCommand(DK());w.addCommand(ZK());w.commandsGroup("System Commands:");w.addCommand(HK());w.addCommand(QK());w.addCommand(z$());w.addCommand(VK());w.addCommand(BK());w.addCommand(UK());w.addCommand($K());w.commandsGroup("Feedback Commands:");w.addCommand(TK());if(import.meta.main){if(bK())fK();w.parse()}export{w as program};
|