@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
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var T2=Object.create;var{getPrototypeOf:R2,defineProperty:N9,getOwnPropertyNames:F2}=Object;var M2=Object.prototype.hasOwnProperty;var JZ=($,Z,K)=>{K=$!=null?T2(R2($)):{};let X=Z||!$||!$.__esModule?N9(K,"default",{value:$,enumerable:!0}):K;for(let Y of F2($))if(!M2.call(X,Y))N9(X,Y,{get:()=>$[Y],enumerable:!0});return X};var w=($,Z)=>{for(var K in Z)N9($,K,{get:Z[K],enumerable:!0,configurable:!0,set:(X)=>Z[K]=()=>X})};var U=($,Z)=>()=>($&&(Z=$($=0)),Z);var e0=import.meta.require;class e{_id;_type;_name;_confidence;_metadata;_createdAt;constructor($){this._id=$.id,this._type=$.type,this._name=$.name,this._confidence=$.confidence,this._metadata=$.metadata?structuredClone($.metadata):void 0,this._createdAt=$.createdAt?new Date($.createdAt.getTime()):void 0}static create($){if(!$.name||$.name.trim()==="")throw Error("Entity name cannot be empty");if($.confidence<0||$.confidence>1)throw Error("Confidence must be between 0 and 1");if(!j2.includes($.type))throw Error("Invalid entity type");if($.type==="decision"){let Z=$.metadata;if(!Z||!Z.subject||!Z.decision)throw Error("Decision metadata requires subject and decision fields")}return new e($)}get id(){return this._id}get type(){return this._type}get name(){return this._name}get confidence(){return this._confidence}get metadata(){return this._metadata?structuredClone(this._metadata):void 0}get createdAt(){return this._createdAt?new Date(this._createdAt.getTime()):void 0}get isConcept(){return this._type==="concept"}get isFile(){return this._type==="file"}get isDecision(){return this._type==="decision"}get isTerm(){return this._type==="term"}equals($){if(this._id!==void 0&&$._id!==void 0)return this._id===$._id;return this._type===$._type&&this._name===$._name}withId($){return new e({id:$,type:this._type,name:this._name,confidence:this._confidence,metadata:this._metadata,createdAt:this._createdAt})}}var j2;var k$=U(()=>{j2=["concept","file","decision","term"]});class $0{_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&&!x2.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 $0($)}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 $0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"in_progress",messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}complete($){return new $0({id:this._id,sessionPath:this._sessionPath,startedAt:this._startedAt,status:"complete",completedAt:$,messagesExtracted:this._messagesExtracted,fileMtime:this._fileMtime,fileSize:this._fileSize})}fail($){return new $0({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 $0({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 $0({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 x2;var HZ=U(()=>{x2=["pending","in_progress","complete","error"]});class $${_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(!q5.includes($.sourceType))throw Error("Invalid source type");if(!q5.includes($.targetType))throw Error("Invalid target type");if(!P2.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 $$($)}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 $$({sourceType:this._sourceType,sourceId:this._sourceId,targetType:this._targetType,targetId:this._targetId,relationship:this._relationship,weight:$})}}var q5,P2;var q9=U(()=>{q5=["session","message","topic"],P2=["mentions","related_to","continues"]});class W0{_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(!E2.includes($.role))throw Error("Invalid message role");return new W0($)}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 W0({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,$]})}}var E2;var S$=U(()=>{E2=["user","assistant"]});class B0{_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 B0($)}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 B0({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 B0({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:$,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary($){return new B0({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:$,messageCount:this._messageCount})}}class z0{_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&&!D2.includes($.status))throw Error("Invalid tool use status");return new z0($)}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 z0({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:$})}completeError($){return new z0({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:$})}}var D2;var VZ=U(()=>{D2=["pending","success","error"]});class m0{_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(!k2.test($.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!O5.includes($.fileType))throw Error(`Invalid file type: "${$.fileType}". Must be one of: ${O5.join(", ")}`);return new m0($)}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 O5,k2;var WZ=U(()=>{O5=["daily_log","decisions","learnings","user_prefs"],k2=/^[a-f0-9]{64}$/});class x0{_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(!U5.includes($.severity))throw Error(`Invalid severity: "${$.severity}". Must be one of: ${U5.join(", ")}`);if(!$.category||$.category.trim()==="")throw Error("Category cannot be empty");if(!L5.includes($.status))throw Error(`Invalid status: "${$.status}". Must be one of: ${L5.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 x0($)}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 U5,L5;var BZ=U(()=>{U5=["low","medium","high","critical"],L5=["open","resolved","wont-fix"]});class c0{_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 c0($)}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}}import{randomUUID as S2}from"crypto";class A0{_id;_uuid;_type;_project;_content;_metadata;_observedAt;_supersededAt;_supersededBy;constructor($){this._id=$.id,this._uuid=$.uuid??S2(),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 A0($)}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 A0({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 A0({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 v$=()=>{};var I5=U(()=>{k$();HZ();q9();S$();VZ();WZ();BZ();v$()});class zZ{_enabled;_provider;_model;_dimensions;constructor($){this._enabled=$.enabled,this._provider=$.provider,this._model=$.model,this._dimensions=$.dimensions}static create($){let Z=$.provider.trim();if(Z==="")throw Error("Provider cannot be empty");let K=$.model.trim();if(K==="")throw Error("Model cannot be empty");if($.dimensions<=0||!Number.isInteger($.dimensions))throw Error("Dimensions must be a positive integer");return new zZ({enabled:$.enabled,provider:Z,model:K,dimensions:$.dimensions})}static defaults(){return new zZ({enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384})}get enabled(){return this._enabled}get provider(){return this._provider}get model(){return this._model}get dimensions(){return this._dimensions}equals($){return this._enabled===$._enabled&&this._provider===$._provider&&this._model===$._model&&this._dimensions===$._dimensions}}class X0{_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 X0({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 T5={};w(T5,{ProjectPath:()=>i});class i{_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=i.encode($);return new i($,Z)}static fromEncoded($){if(!$||$.trim()==="")throw Error("Path cannot be empty");let Z=i.decode($);return new i(Z,$)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName($){return new i(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 C${_value;constructor($){this._value=$}static from($){let Z=$.trim();if(Z==="")throw Error("Query cannot be empty");return new C$(Z)}get value(){return this._value}equals($){return this._value===$._value}}class Y0{_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 Y0($)}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 O9=()=>{};class N0{static extractMessageContent($){let Z=N0.parseJson($);if(!Z)return null;if(!N0.isMessageType(Z.type))return null;let K=Z.type==="human"?"user":"assistant",X=N0.extractTextContent(Z.message?.content);if(!X)return null;return{role:K,content:X}}static extractToolUses($){let Z=N0.parseJson($);if(!Z)return[];let K=Z.message?.content;if(!Array.isArray(K))return[];return K.filter((X)=>X.type==="tool_use").map((X)=>({id:X.id??"",name:X.name??"",input:X.input??{}}))}static extractToolResults($){let Z=N0.parseJson($);if(!Z)return[];let K=Z.message?.content;if(!Array.isArray(K))return[];return K.filter((X)=>X.type==="tool_result").map((X)=>({toolUseId:X.tool_use_id??"",content:X.content??"",isError:X.is_error??!1}))}static isMessageLine($){let Z=N0.parseJson($);if(!Z)return!1;return N0.isMessageType(Z.type)}static extractTimestamp($){let Z=N0.parseJson($);if(!Z||!Z.timestamp)return null;let K=new Date(Z.timestamp);if(isNaN(K.getTime()))return null;return K}static parseJson($){try{return JSON.parse($)}catch{return null}}static isMessageType($){return $==="human"||$==="assistant"}static extractTextContent($){if(!$)return null;if(typeof $==="string")return $;if(Array.isArray($)){let K=$.filter((X)=>X.type==="text"&&X.text).map((X)=>X.text).join(`
|
|
3
|
-
`);return
|
|
2
|
+
var hZ=Object.create;var{getPrototypeOf:vZ,defineProperty:r$,getOwnPropertyNames:wZ}=Object;var CZ=Object.prototype.hasOwnProperty;var YG=(A,_,G)=>{G=A!=null?hZ(vZ(A)):{};let $=_||!A||!A.__esModule?r$(G,"default",{value:A,enumerable:!0}):G;for(let K of wZ(A))if(!CZ.call($,K))r$($,K,{get:()=>A[K],enumerable:!0});return $};var y=(A,_)=>{for(var G in _)r$(A,G,{get:_[G],enumerable:!0,configurable:!0,set:($)=>_[G]=()=>$})};var L=(A,_)=>()=>(A&&(_=A(A=0)),_);var x_=import.meta.require;class KA{_id;_type;_name;_confidence;_metadata;_createdAt;constructor(A){this._id=A.id,this._type=A.type,this._name=A.name,this._confidence=A.confidence,this._metadata=A.metadata?structuredClone(A.metadata):void 0,this._createdAt=A.createdAt?new Date(A.createdAt.getTime()):void 0}static create(A){if(!A.name||A.name.trim()==="")throw Error("Entity name cannot be empty");if(A.confidence<0||A.confidence>1)throw Error("Confidence must be between 0 and 1");if(!fZ.includes(A.type))throw Error("Invalid entity type");if(A.type==="decision"){let _=A.metadata;if(!_||!_.subject||!_.decision)throw Error("Decision metadata requires subject and decision fields")}return new KA(A)}get id(){return this._id}get type(){return this._type}get name(){return this._name}get confidence(){return this._confidence}get metadata(){return this._metadata?structuredClone(this._metadata):void 0}get createdAt(){return this._createdAt?new Date(this._createdAt.getTime()):void 0}get isConcept(){return this._type==="concept"}get isFile(){return this._type==="file"}get isDecision(){return this._type==="decision"}get isTerm(){return this._type==="term"}equals(A){if(this._id!==void 0&&A._id!==void 0)return this._id===A._id;return this._type===A._type&&this._name===A._name}withId(A){return new KA({id:A,type:this._type,name:this._name,confidence:this._confidence,metadata:this._metadata,createdAt:this._createdAt})}}var fZ;var z0=L(()=>{fZ=["concept","file","decision","term"]});class ZA{_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&&!bZ.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 ZA(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 ZA({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 ZA({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 ZA({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 ZA({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 ZA({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 bZ;var JG=L(()=>{bZ=["pending","in_progress","complete","error"]});class P_{_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(!XK.includes(A.sourceType))throw Error("Invalid source type");if(!XK.includes(A.targetType))throw Error("Invalid target type");if(!gZ.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 P_(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 P_({sourceType:this._sourceType,sourceId:this._sourceId,targetType:this._targetType,targetId:this._targetId,relationship:this._relationship,weight:A})}}var XK,gZ;var t$=L(()=>{XK=["session","message","topic"],gZ=["mentions","related_to","continues"]});class MA{_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(!cZ.includes(A.role))throw Error("Invalid message role");return new MA(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 MA({id:this._id,role:this._role,content:this._content,timestamp:this._timestamp,toolUseIds:[...this._toolUseIds,A]})}}var cZ;var N0=L(()=>{cZ=["user","assistant"]});class UA{_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 UA(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 UA({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 UA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:A,messages:[...this._messages],summary:this._summary,messageCount:this._messageCount})}withSummary(A){return new UA({id:this._id,projectPath:this._projectPath,startTime:this._startTime,endTime:this._endTime,messages:[...this._messages],summary:A,messageCount:this._messageCount})}}class qA{_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&&!uZ.includes(A.status))throw Error("Invalid tool use status");return new qA(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 qA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"success",result:A})}completeError(A){return new qA({id:this._id,name:this._name,input:this._input,timestamp:this._timestamp,status:"error",result:A})}}var uZ;var HG=L(()=>{uZ=["pending","success","error"]});class Y_{_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(!mZ.test(A.contentHash))throw Error("Content hash must be 64 hexadecimal characters");if(!VK.includes(A.fileType))throw Error(`Invalid file type: "${A.fileType}". Must be one of: ${VK.join(", ")}`);return new Y_(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 VK,mZ;var QG=L(()=>{VK=["daily_log","decisions","learnings","user_prefs"],mZ=/^[a-f0-9]{64}$/});class mA{_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(!BK.includes(A.severity))throw Error(`Invalid severity: "${A.severity}". Must be one of: ${BK.join(", ")}`);if(!A.category||A.category.trim()==="")throw Error("Category cannot be empty");if(!WK.includes(A.status))throw Error(`Invalid status: "${A.status}". Must be one of: ${WK.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 mA(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 BK,WK;var XG=L(()=>{BK=["low","medium","high","critical"],WK=["open","resolved","wont-fix"]});class J_{_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 J_(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}}import{randomUUID as dZ}from"crypto";class XA{_id;_uuid;_type;_project;_content;_metadata;_observedAt;_supersededAt;_supersededBy;constructor(A){this._id=A.id,this._uuid=A.uuid??dZ(),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 XA(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 XA({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 XA({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 L0=()=>{};import{createHash as lZ,randomUUID as pZ}from"crypto";class YA{record;constructor(A){this.record=VA(A)}static create(A){let _=tZ(A);zK(_);let G=WG(BG(_.payload)),$={..._,integrity:{algorithm:"sha256",payloadHash:G}},K=WG(BG($));return new YA({..._,integrity:{algorithm:"sha256",payloadHash:G,envelopeHash:K}})}static fromJSON(A){let _=eZ(A);return zK(_),oZ(_),new YA(_)}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 VA(this.record.scope)}get provenance(){return VA(this.record.provenance)}get privacy(){return VA(this.record.privacy)}get consent(){return VA(this.record.consent)}get causality(){return VA(this.record.causality)}get payload(){return VA(this.record.payload)}get integrity(){return VA(this.record.integrity)}toJSON(){return VA(this.record)}}function tZ(A){return{schemaVersion:s$,eventId:A.eventId??pZ(),machineId:A.machineId,sequence:A.sequence,kind:A.kind,operation:A.operation,occurredAt:LK("occurredAt",A.occurredAt),observedAt:LK("observedAt",A.observedAt),scope:VA(A.scope),provenance:MK(A.provenance),privacy:UK(A.privacy),consent:qK(A.consent),causality:TK(A.causality),payload:VA(A.payload)}}function eZ(A){if(!TA(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:TA(_.scope)?sZ(_.scope):_.scope,provenance:MK(_.provenance),privacy:UK(_.privacy),consent:qK(_.consent),causality:TK(_.causality),payload:_.payload,integrity:{algorithm:_.integrity.algorithm,payloadHash:String(_.integrity.payloadHash??""),envelopeHash:String(_.integrity.envelopeHash??"")}}}function MK(A){let _=TA(A)?A:{};return{source:String(_.source??""),actor:String(_.actor??""),method:String(_.method??""),sourceIds:k_(_.sourceIds)}}function sZ(A){let _=TA(A)?A:{};return{project:typeof _.project==="string"?_.project:void 0,workspace:typeof _.workspace==="string"?_.workspace:void 0,visibility:_.visibility}}function UK(A){let _=TA(A)?A:{};return{redactionState:_.redactionState,containsSensitiveContent:_.containsSensitiveContent,policy:typeof _.policy==="string"?_.policy:void 0,redactedFields:Z8(_.redactedFields)}}function qK(A){let _=TA(A)?A:{};return{status:_.status,scopes:k_(_.scopes),grantedAt:NK(_.grantedAt),expiresAt:NK(_.expiresAt)}}function TK(A){if(!TA(A))return{parentEventIds:void 0,supersedesEventIds:void 0,relatedEventIds:void 0};let _=A;return{parentEventIds:k_(_.parentEventIds),supersedesEventIds:k_(_.supersedesEventIds),relatedEventIds:k_(_.relatedEventIds)}}function zK(A){if(A.schemaVersion!==s$)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(!nZ.includes(A.operation))throw Error("operation is invalid");if(VG("occurredAt",A.occurredAt),VG("observedAt",A.observedAt),_8(A.scope),G8(A.provenance),$8(A.privacy),K8(A.consent),y_("causality.parentEventIds",A.causality.parentEventIds),y_("causality.supersedesEventIds",A.causality.supersedesEventIds),y_("causality.relatedEventIds",A.causality.relatedEventIds),!TA(A.payload))throw Error("payload must be an object")}function oZ(A){if(A.integrity.algorithm!=="sha256")throw Error("integrity.algorithm must be sha256");let _=WG(BG(A.payload));if(A.integrity.payloadHash!==_)throw Error("payload integrity mismatch");let G=WG(BG({...A8(A),integrity:{algorithm:"sha256",payloadHash:A.integrity.payloadHash}}));if(A.integrity.envelopeHash!==G)throw Error("envelope integrity mismatch")}function A8(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 _8(A){if(!TA(A))throw Error("scope is required");if(!iZ.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 G8(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");y_("provenance.sourceIds",A.sourceIds??[])}function $8(A){if(!aZ.includes(A.redactionState))throw Error("privacy.redactionState is invalid");if(typeof A.containsSensitiveContent!=="boolean")throw Error("privacy.containsSensitiveContent must be boolean");y_("privacy.redactedFields",A.redactedFields??[])}function K8(A){if(!rZ.includes(A.status))throw Error("consent.status is invalid");if(y_("consent.scopes",A.scopes),A.grantedAt!==void 0)VG("consent.grantedAt",String(A.grantedAt));if(A.expiresAt!==void 0)VG("consent.expiresAt",String(A.expiresAt))}function VG(A,_){if(!_||Number.isNaN(new Date(_).getTime()))throw Error(`${A} must be a valid date`)}function k_(A){if(!Array.isArray(A))return[];return A.map((_)=>String(_))}function Z8(A){if(A===void 0)return;return k_(A)}function NK(A){if(A===void 0)return;return A instanceof Date?A.toISOString():String(A)}function LK(A,_){if(!(_ instanceof Date)||Number.isNaN(_.getTime()))throw Error(`${A} must be a valid date`);return _.toISOString()}function y_(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`${A} must be a string array`)}function BG(A){return JSON.stringify(e$(A))}function e$(A){if(A instanceof Date)return A.toISOString();if(Array.isArray(A))return A.map(e$);if(!TA(A))return A;let _={};for(let G of Object.keys(A).sort())_[G]=e$(A[G]);return _}function WG(A){return lZ("sha256").update(A).digest("hex")}function VA(A){if(A===void 0)return A;return JSON.parse(JSON.stringify(A))}function TA(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var s$=2,nZ,iZ,aZ,rZ;var M0=L(()=>{nZ=["add","update","delete","supersede","noop","migrate"],iZ=["project","workspace","global"],aZ=["none","redacted","quarantined"],rZ=["not_required","granted","denied","revoked"]});class e{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:OK(A.scope),status:A.status??"active",statusReason:A.statusReason,createdAt:dA(A.createdAt??new Date),updatedAt:dA(A.updatedAt??A.createdAt??new Date),reviewedAt:A.reviewedAt?dA(A.reviewedAt):null,expiresAt:A.expiresAt?dA(A.expiresAt):null,lastEventId:A.lastEventId}}static create(A){return Y8(A),new e(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 OK(this.params.scope)}get status(){return this.params.status}get statusReason(){return this.params.statusReason}get createdAt(){return dA(this.params.createdAt)}get updatedAt(){return dA(this.params.updatedAt)}get reviewedAt(){return this.params.reviewedAt?dA(this.params.reviewedAt):null}get expiresAt(){return this.params.expiresAt?dA(this.params.expiresAt):null}get lastEventId(){return this.params.lastEventId}withId(A){return e.create({...this.toParams(),id:A})}withControl(A){let _=this.toParams(),G=J8(A.control,this.status);return e.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 U0(A){if(!NG.includes(A))throw Error(`Invalid memory governance surface: ${A}`);return A}function o$(A){if(!jK.includes(A))throw Error(`Invalid memory governance control: ${A}`);return A}function Y8(A){if(U0(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(IK("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(IK("consentScopes",A.consentScopes),!A.scope||!["project","workspace","global"].includes(A.scope.visibility))throw Error("Memory governance scope.visibility is invalid");if(A.status&&!RK.includes(A.status))throw Error("Memory governance status is invalid");zG("createdAt",A.createdAt),zG("updatedAt",A.updatedAt),zG("reviewedAt",A.reviewedAt??void 0),zG("expiresAt",A.expiresAt??void 0)}function J8(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 IK(A,_){if(!Array.isArray(_)||_.some((G)=>typeof G!=="string"))throw Error(`Memory governance ${A} must be a string array`)}function zG(A,_){if(_!==void 0&&_!==null&&(!(_ instanceof Date)||Number.isNaN(_.getTime())))throw Error(`Memory governance ${A} must be a valid date`)}function dA(A){return new Date(A.getTime())}function OK(A){return JSON.parse(JSON.stringify(A))}var NG,RK,jK;var H_=L(()=>{NG=["fact","context","provider_egress","remote_sync","friction","evaluation","persona","graph","ranking","dream","projection"],RK=["active","pending_review","suppressed","invalidated","expired"],jK=["register","suppress","unsuppress","invalidate","expire","review","consent_grant","consent_revoke"]});class SA{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:FK(A.scope),reviewStatus:A.reviewStatus,reviewAfter:lA(A.reviewAfter),expiresAt:A.expiresAt?lA(A.expiresAt):null,why:A.why.trim(),createdAt:lA(A.createdAt??new Date),updatedAt:lA(A.updatedAt??A.createdAt??new Date)}}static create(A){return H8(A),new SA(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 FK(this.params.scope)}get reviewStatus(){return this.params.reviewStatus}get reviewAfter(){return lA(this.params.reviewAfter)}get expiresAt(){return this.params.expiresAt?lA(this.params.expiresAt):null}get why(){return this.params.why}get controls(){return[...SK]}get createdAt(){return lA(this.params.createdAt)}get updatedAt(){return lA(this.params.updatedAt)}withId(A){return SA.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 H8(A){if(!A.entryId||A.entryId.trim()==="")throw Error("entryId cannot be empty");if(!LG.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 lA(A){return new Date(A.getTime())}function FK(A){return JSON.parse(JSON.stringify(A))}var LG,SK;var q0=L(()=>{LG=["preference","procedure","correction","decision_pattern","friction_pattern"],SK=["suppress","invalidate","expire","review"]});import{createHash as Q8}from"crypto";class pA{_id;_edgeId;_source;_target;_relationship;_project;_visibility;_sourceEventIds;_sourceKinds;_confidence;_validFrom;_validTo;_why;_metadata;_createdAt;_updatedAt;constructor(A){this._id=A.id,this._source=UG(A.source),this._target=UG(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?DK(A.metadata):void 0,this._createdAt=new Date(A.createdAt.getTime()),this._updatedAt=new Date(A.updatedAt.getTime()),this._edgeId=A.edgeId?.trim()||B8(this)}static create(A){if(EK(A.source,"source"),EK(A.target,"target"),W8(A.relationship),z8(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(!MG(A.validFrom))throw Error("Graph edge validFrom must be a valid date");if(A.validTo!==void 0&&A.validTo!==null&&!MG(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(!MG(A.createdAt)||!MG(A.updatedAt))throw Error("Graph edge timestamps must be valid dates");return new pA(A)}get id(){return this._id}get edgeId(){return this._edgeId}get source(){return UG(this._source)}get target(){return UG(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?DK(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[...V8]}isCurrent(A,_=0.7){return this._validFrom<=A&&(!this._validTo||this._validTo>A)&&this._confidence>=_}withId(A){return pA.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 B8(A){let _=[A.source.type,A.source.id,A.relationship,A.target.type,A.target.id,A.project??"",A.visibility].join("|");return`graph-${Q8("sha256").update(_).digest("hex").slice(0,16)}`}function EK(A,_){if(!qG.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 W8(A){if(!A||!X8.test(A.trim()))throw Error(`Invalid graph relationship: ${A}`)}function z8(A){if(A!=="project"&&A!=="workspace"&&A!=="global")throw Error(`Invalid graph visibility: ${A}`)}function MG(A){return A instanceof Date&&!Number.isNaN(A.getTime())}function UG(A){return{type:A.type,id:A.id,label:A.label}}function DK(A){return JSON.parse(JSON.stringify(A))}var qG,X8,V8;var TG=L(()=>{qG=["project","tool","person","decision","error","plan","file","command","capability"],X8=/^[a-z][a-z0-9_-]*(?:[.:][a-z0-9_-]+)*$/,V8=["suppress","invalidate","expire","review"]});class EA{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?nA(A.lastAccessedAt):null,lastRankedAt:A.lastRankedAt?nA(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?PK(A.metadata):void 0,createdAt:nA(A.createdAt??_),updatedAt:nA(A.updatedAt??A.createdAt??_)}}static create(A){return N8(A),new EA(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?nA(this.params.lastAccessedAt):null}get lastRankedAt(){return this.params.lastRankedAt?nA(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?PK(this.params.metadata):void 0}get controls(){return[...yK]}get createdAt(){return nA(this.params.createdAt)}get updatedAt(){return nA(this.params.updatedAt)}withId(A){return EA.create({...this.toParams(),id:A})}recordAccess(A){return EA.create({...this.toParams(),accessCount:this.accessCount+1,lastAccessedAt:A,updatedAt:A})}markRanked(A){return EA.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 N8(A){if(!kK.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(xK(A.utilityScore??0.5,"utilityScore"),xK(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")}IG(A.lastAccessedAt,"lastAccessedAt"),IG(A.lastRankedAt,"lastRankedAt"),IG(A.createdAt,"createdAt"),IG(A.updatedAt,"updatedAt")}function xK(A,_){if(!Number.isFinite(A)||A<0||A>1)throw Error(`${_} must be between 0 and 1`)}function IG(A,_){if(A!==void 0&&A!==null&&(!(A instanceof Date)||Number.isNaN(A.getTime())))throw Error(`${_} must be a valid Date`)}function nA(A){return new Date(A.getTime())}function PK(A){return JSON.parse(JSON.stringify(A))}var kK,yK;var A5=L(()=>{kK=["fact","persona","graph","link","dream"],yK=["record_access","rank","pin","mark_evergreen"]});var hK=L(()=>{z0();JG();t$();N0();HG();QG();XG();L0();M0();H_();q0();TG();A5()});class OG{_enabled;_provider;_model;_dimensions;constructor(A){this._enabled=A.enabled,this._provider=A.provider,this._model=A.model,this._dimensions=A.dimensions}static create(A){let _=A.provider.trim();if(_==="")throw Error("Provider cannot be empty");let G=A.model.trim();if(G==="")throw Error("Model cannot be empty");if(A.dimensions<=0||!Number.isInteger(A.dimensions))throw Error("Dimensions must be a positive integer");return new OG({enabled:A.enabled,provider:_,model:G,dimensions:A.dimensions})}static defaults(){return new OG({enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384})}get enabled(){return this._enabled}get provider(){return this._provider}get model(){return this._model}get dimensions(){return this._dimensions}equals(A){return this._enabled===A._enabled&&this._provider===A._provider&&this._model===A._model&&this._dimensions===A._dimensions}}class IA{_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 IA({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 vK={};y(vK,{ProjectPath:()=>s});class s{_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 _=s.encode(A);return new s(A,_)}static fromEncoded(A){if(!A||A.trim()==="")throw Error("Path cannot be empty");let _=s.decode(A);return new s(_,A)}get decoded(){return this._decoded}get encoded(){return this._encoded}get projectName(){return this._projectName}withProjectName(A){return new s(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 T0{_value;constructor(A){this._value=A}static from(A){let _=A.trim();if(_==="")throw Error("Query cannot be empty");return new T0(_)}get value(){return this._value}equals(A){return this._value===A._value}}class BA{_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 BA(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 _5=()=>{};class OA{static extractMessageContent(A){let _=OA.parseJson(A);if(!_)return null;if(!OA.isMessageType(_.type))return null;let G=_.type==="human"?"user":"assistant",$=OA.extractTextContent(_.message?.content);if(!$)return null;return{role:G,content:$}}static extractToolUses(A){let _=OA.parseJson(A);if(!_)return[];let G=_.message?.content;if(!Array.isArray(G))return[];return G.filter(($)=>$.type==="tool_use").map(($)=>({id:$.id??"",name:$.name??"",input:$.input??{}}))}static extractToolResults(A){let _=OA.parseJson(A);if(!_)return[];let G=_.message?.content;if(!Array.isArray(G))return[];return G.filter(($)=>$.type==="tool_result").map(($)=>({toolUseId:$.tool_use_id??"",content:$.content??"",isError:$.is_error??!1}))}static isMessageLine(A){let _=OA.parseJson(A);if(!_)return!1;return OA.isMessageType(_.type)}static extractTimestamp(A){let _=OA.parseJson(A);if(!_||!_.timestamp)return null;let G=new Date(_.timestamp);if(isNaN(G.getTime()))return null;return G}static parseJson(A){try{return JSON.parse(A)}catch{return null}}static isMessageType(A){return A==="human"||A==="assistant"}static extractTextContent(A){if(!A)return null;if(typeof A==="string")return A;if(Array.isArray(A)){let G=A.filter(($)=>$.type==="text"&&$.text).map(($)=>$.text).join(`
|
|
3
|
+
`);return G.length>0?G:null}return null}}class iA{static decodeProjectDirectory(A){return s.fromEncoded(A)}static isEncodedPath(A){if(!A||A.length===0)return!1;if(L8.test(A))return!0;if(M8.test(A))return!0;return!1}static extractProjectName(A){return s.fromEncoded(A).projectName}static filterEncodedPaths(A){return A.filter((_)=>iA.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=iA.translatePath(A,G);if($(K))return K;return A}}var L8,M8;var RG=L(()=>{_5();L8=/^[A-Za-z]--/,M8=/^-[a-z]/i});class G5{static parse(A){let _=A,G={},$=[],K=[],Y=A.replace(q8,(J,H)=>{return K.push(H.toLowerCase()),""}).trim().split(/\s+/).filter(Boolean);for(let J of Y){let H=J.match(U8);if(H&&H[1]&&H[2]){let Q=H[1],X=H[2],B=Q.toLowerCase();G[B]=X.toLowerCase()}else{let Q=J.toLowerCase().replace(/"/g,"");if(Q.length>=2&&!$.includes(Q))$.push(Q)}}for(let J of K)if(!$.includes(J))$.push(J);return{terms:$,filters:G,originalQuery:_}}static toFts5Query(A){if(A.terms.length===0)return"";return A.terms.map((G)=>{if(G.includes(" "))return`"${G}"`;return G}).join(" AND ")}static isEmpty(A){return A.terms.length===0&&!G5.hasFilters(A)}static hasFilters(A){return Object.keys(A.filters).length>0}}var U8,q8;var wK=L(()=>{U8=/^(project|role|tool):(.+)$/i,q8=/"([^"]+)"/g});var CK=L(()=>{RG();wK()});var R;var fK=L(()=>{R={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 bK=L(()=>{j=class j extends Error{code;context;constructor(A,_,G){super(_);if(this.name="MemoryError",this.code=A,this.context=G,Error.captureStackTrace)Error.captureStackTrace(this,j)}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}}});function N(A){return A instanceof Error?A.message:String(A)}function I0(A){return A instanceof Error?A:Error(N(A))}var WA=L(()=>{fK();bK()});var O0=L(()=>{hK();_5();CK();WA()});class RA{static async extract(A){let{messages:_}=A;if(_.length===0)return{topics:[],terms:[],decisions:[],summary:""};return RA.createExtractionPrompt(_),{topics:[],terms:[],decisions:[],summary:""}}static createExtractionPrompt(A){return`Analyze this session and extract:
|
|
4
4
|
|
|
5
5
|
1. TOPICS: Key technical concepts discussed (1-5)
|
|
6
6
|
- Include only significant technical concepts, patterns, or technologies
|
|
@@ -32,23 +32,25 @@ Output as JSON:
|
|
|
32
32
|
|
|
33
33
|
--- SESSION CONTENT ---
|
|
34
34
|
|
|
35
|
-
${
|
|
36
|
-
${
|
|
35
|
+
${A.map((G)=>{return`${G.role==="user"?"[USER]":"[ASSISTANT]"}
|
|
36
|
+
${G.content}`}).join(`
|
|
37
37
|
|
|
38
38
|
`)}
|
|
39
39
|
|
|
40
40
|
--- END SESSION CONTENT ---
|
|
41
41
|
|
|
42
|
-
Extract the entities and summary from the session above. Output only valid JSON.`}static parseExtractionResponse(
|
|
42
|
+
Extract the entities and summary from the session above. Output only valid JSON.`}static parseExtractionResponse(A,_){let G={topics:[],terms:[],decisions:[],summary:""};if(!A||A.trim()==="")return G;let $=A.trim(),K=$.match(/```(?:json)?\s*([\s\S]*?)\s*```/);if(K&&K[1])$=K[1].trim();let Z;try{Z=JSON.parse($)}catch{return G}let Y=RA.parseTopics(Z.topics),J=RA.parseTerms(Z.terms),H=RA.parseDecisions(Z.decisions),Q=typeof Z.summary==="string"?Z.summary:"";return{topics:Y,terms:J,decisions:H,summary:Q}}static parseTopics(A){if(!A||!Array.isArray(A))return[];return A.filter((_)=>_!==null&&typeof _==="object").filter((_)=>_.name&&typeof _.name==="string"&&_.name.trim()!=="").map((_)=>{let G=RA.normalizeConfidence(_.confidence);return KA.create({type:"concept",name:_.name.trim(),confidence:G})})}static parseTerms(A){if(!A||!Array.isArray(A))return[];return A.filter((_)=>_!==null&&typeof _==="object").filter((_)=>_.name&&typeof _.name==="string"&&_.name.trim()!=="").map((_)=>{let G=RA.normalizeConfidence(_.confidence),$={};if(_.definition)$.definition=_.definition;return KA.create({type:"term",name:_.name.trim(),confidence:G,metadata:$})})}static parseDecisions(A){if(!A||!Array.isArray(A))return[];return A.filter((_)=>_!==null&&typeof _==="object").filter((_)=>{return _.subject&&typeof _.subject==="string"&&_.subject.trim()!==""&&_.decision&&typeof _.decision==="string"&&_.decision.trim()!==""}).map((_)=>{let G=RA.normalizeConfidence(_.confidence),$={subject:_.subject.trim(),decision:_.decision.trim(),rejected:Array.isArray(_.rejected)?_.rejected:[],rationale:typeof _.rationale==="string"?_.rationale:""};return KA.create({type:"decision",name:_.subject.trim(),confidence:G,metadata:$})})}static normalizeConfidence(A){if(A===void 0||A===null||typeof A!=="number")return 0.5;return Math.max(0,Math.min(1,A))}}var $5=L(()=>{z0()});function SG(A,_){return A instanceof FG&&(_===void 0||A.kind===_)}var FG;var K5=L(()=>{FG=class FG 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 lK={};y(lK,{computeModelHash:()=>Z5,EmbeddingService:()=>Y5});import{Buffer as mK}from"buffer";import{createHash as dK}from"crypto";function Z5(A){let _=`${A.provider}:${A.model}:${A.dimensions}`;return dK("sha256").update(_).digest("hex").slice(0,16)}class Y5{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??j8),this.modelHash=Z5(A.config),this.modelName=A.config.model,this.redactor=A.redactor??F8}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 B=await this.embedChunk(X);G+=B.embedded,$+=B.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 mK.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(!SG(_,"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:dK("sha256").update(A.rawContent).digest("hex"),contentBytes:mK.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 j8=800000,F8;var J5=L(()=>{K5();F8={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})}});function V5(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 Q_(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 nK{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*w8}}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),B=H.projectPath.decoded,W=B.split(/[/\\]/).filter(Boolean).pop()??B,V=await this.summaryGenerator.generateSummary(X,H.id,W,H.startTime.toISOString(),H.endTime?.toISOString()??H.startTime.toISOString()),z=`daily/${H.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(z,V+`
|
|
43
43
|
|
|
44
|
-
`))
|
|
44
|
+
`))Y.dailyLogsCreated++;else Y.dailyLogsUpdated++;await this.backfillStateRepo.save(J_.create({sessionId:H.id,backfilledAt:new Date,dailyLogPath:z,success:!0})),Y.sessionsProcessed++}catch(X){let B=N(X);Y.sessionsFailed++,Y.errors.push({sessionId:H.id,error:B});let W=H.startTime.toISOString().slice(0,10);await this.backfillStateRepo.save(J_.create({sessionId:H.id,backfilledAt:new Date,dailyLogPath:`daily/${W}.md`,success:!1,errorMessage:B})),$?.({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}
|
|
45
45
|
|
|
46
|
-
`;if(
|
|
47
|
-
`;break}
|
|
48
|
-
`)},
|
|
49
|
-
`)}
|
|
50
|
-
`)}
|
|
51
|
-
`)
|
|
46
|
+
`;if($.length+Y.length>C8){$+=`... [content truncated]
|
|
47
|
+
`;break}$+=Y}return $}}var w8=0.001,C8=16000;var iK=()=>{};function B5(A,_,G=4){if(_<=0){let Q=A.map((B)=>({...B,truncatedContent:B.content,allocated:B.content.length===0?0:Math.ceil(B.content.length/G),truncated:!1})),X=Q.reduce((B,W)=>B+W.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 B=Math.ceil(X/G);Y.push({...Q,truncatedContent:Q.content,allocated:B,truncated:!1}),Z-=X}else{let B=Q.content.slice(0,Z),W=Math.ceil(Z/G);Y.push({...Q,truncatedContent:B,allocated:W,truncated:!0}),Z=0,J=!0}}let H=Y.reduce((Q,X)=>Q+X.allocated,0);return{sections:Y,totalTokensUsed:H,budgetExceeded:J}}var rK={};y(rK,{candidateFromPersonaEntry:()=>yG,candidateFromGraphEdge:()=>hG,candidateFromFact:()=>kG,MemoryRankingService:()=>F0});class F0{now;policy;constructor(A={}){this.now=A.now??(()=>new Date),this.policy={defaultHalfLifeDays:A.policy?.defaultHalfLifeDays??90,halfLifeByKind:{...b8,...A.policy?.halfLifeByKind??{}},halfLifeByFactType:{...g8,...A.policy?.halfLifeByFactType??{}},halfLifeByPersonaKind:{...c8,...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&&f8.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,$=X_(G?.importanceScore??A.importance??m8(A)),K=X_(G?.utilityScore??A.utility??0.5),Z=X_(A.confidence??d8(G)),Y=Math.max(0,G?.accessCount??0),J=X_(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),B=A.observedAt??A.validFrom??G?.lastAccessedAt??_,W=Math.max(0,(_.getTime()-B.getTime())/86400000),V=H||Q?1:Math.pow(0.5,W/X),M=X_(A.recencyNoisePenalty??0),z=X_(0.34*$+0.26*K+0.18*Z+0.12*J+(H?0.06:0)+(Q?0.08:0)),T=X_(z*V-M),I={importance:$,utility:K,confidence:Z,accessBoost:J,accessCount:Y,halfLifeDays:X,ageDays:W,decayMultiplier:V,recencyNoisePenalty:M,baseScore:z,finalScore:T};return{...A,evergreen:H,pinned:Q,score:T,whyIncluded:u8(A,I,H,Q),components:I}}resolveHalfLifeDays(A){if(A.kind==="fact"&&l8(A.memoryType))return this.policy.halfLifeByFactType[A.memoryType]??this.policy.defaultHalfLifeDays;if(A.kind==="persona"&&p8(A.memoryType))return this.policy.halfLifeByPersonaKind[A.memoryType]??this.policy.defaultHalfLifeDays;return this.policy.halfLifeByKind[A.kind]??this.policy.defaultHalfLifeDays}}function kG(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:V_(G.confidence),importance:V_(G.importance),utility:V_(G.utility),evergreen:PG(G.evergreen),pinned:PG(G.pinned),recencyNoisePenalty:V_(G.recencyNoisePenalty),governanceStatus:aK(G.governanceStatus),metric:_}}function yG(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 hG(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:V_(G.importance),utility:V_(G.utility),evergreen:PG(G.evergreen),pinned:PG(G.pinned),recencyNoisePenalty:V_(G.recencyNoisePenalty),governanceStatus:aK(G.governanceStatus),metric:_}}function u8(A,_,G,$){return["active",`kind=${A.kind}`,A.memoryType?`type=${A.memoryType}`:null,`importance=${j0(_.importance)}`,`utility=${j0(_.utility)}`,`confidence=${j0(_.confidence)}`,`access_count=${_.accessCount}`,`decay=${j0(_.decayMultiplier)}`,G?"evergreen":null,$?"pinned":null,`score=${j0(_.finalScore)}`].filter((Z)=>Z!==null).join("; ")}function m8(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 d8(A){return A?Math.max(A.importanceScore,A.utilityScore,0.5):0.8}function X_(A){if(!Number.isFinite(A))return 0;return Math.min(1,Math.max(0,A))}function j0(A){return A.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function V_(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function PG(A){return typeof A==="boolean"?A:void 0}function aK(A){if(A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired")return A;return}function l8(A){return A==="decision"||A==="learning"||A==="preference"||A==="friction"||A==="observation"||A==="supersedence"}function p8(A){return A==="preference"||A==="procedure"||A==="correction"||A==="decision_pattern"||A==="friction_pattern"}var f8,b8,g8,c8;var S0=L(()=>{f8=new Set(["pending_review","suppressed","invalidated","expired"]),b8={fact:90,persona:180,graph:120,link:60,dream:30},g8={decision:365,learning:180,preference:365,friction:45,observation:14,supersedence:365},c8={preference:365,procedure:365,correction:240,decision_pattern:180,friction_pattern:120}});var eK={};y(eK,{SmartContextService:()=>E0});function i8(A){if(A.length===0)return 0;return Math.ceil(A.length/n8)}function a8(A){return`#${A.id} (${A.severity}/${A.category}): ${A.description}`}function r8(A,_){return`- ${A.content}${s8(_)}`}function t8(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()}${tK(_)})`].join(" ")}function e8(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}${tK(_)})`].join(" ")}function s8(A){return A?` (rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded})`:""}function tK(A){return A?`; rank: ${A.score.toFixed(3)}; why-ranked: ${A.whyIncluded}`:""}class E0{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:q})=>r8(I,q)).join(`
|
|
48
|
+
`)},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 B=await this.buildGraphContent(G);if(B)Y.push(this.buildSection("semantic_graph","Temporal Semantic Graph",4,B));let W=K.filter((z)=>z.type==="observation");if(W.length>0)Y.push(this.buildSection("observations","Observations",4,await Z(W)));if(A.crossProject){let z=await this.factRepo.findAll(),T=await this.filterAllowedFacts(z.filter((O)=>O.supersededAt===null&&O.project!==G&&o8(O))),I=T.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 q=T.filter((O)=>O.type==="decision");if(q.length>0)Y.push(this.buildSection("cross_project_decisions","Cross-Project Decisions",6,await Z(q)));let U=T.filter((O)=>O.type==="learning");if(U.length>0)Y.push(this.buildSection("cross_project_learnings","Cross-Project Learnings",7,await Z(U)))}let V=await this.buildFrictionContent(A.projectFilter);if(V)Y.push(this.buildSection("friction","Open Friction",8,V));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 M=Y.reduce((z,T)=>z+T.tokenEstimate,0);return{projectName:G,projectEncoded:_,sections:Y,totalTokensEstimate:M,truncated:!1}}buildSection(A,_,G,$){return{key:A,title:_,priority:G,content:$,truncated:!1,tokenEstimate:i8($)}}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(a8).join(`
|
|
49
|
+
`)}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})=>t8($,K)).join(`
|
|
50
|
+
`)}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})=>e8($,K)).join(`
|
|
51
|
+
`)}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(($)=>kG($,_.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(($)=>yG($,_.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(($)=>hG($,_.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=B5(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 o8(A){let _=A.metadata??{};if(_.visibility==="global")return!0;let $=_.scope;return typeof $==="object"&&$!==null&&!Array.isArray($)&&$.visibility==="global"}var n8=4;var vG=L(()=>{S0()});var sK={};y(sK,{AmbientContextService:()=>W5});class W5{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(`
|
|
52
|
+
`)}countSectionLines(A,_){let G=A.find(($)=>$.key===_);if(!G||!G.content)return 0;return G.content.split(`
|
|
53
|
+
`).filter(($)=>$.trim().length>0).length}}class wG{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:[...$]}}}import{createHash as A3}from"crypto";class z5{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=J3([...$,...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 oK(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 SA.create({entryId:A2("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:G2(Z,30),why:"Derived from recurring friction patterns.",createdAt:Z,updatedAt:Z})}governanceEntryFor(A){return e.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 oK(A,_=new Date){let G=_3(A);if(!G)return[];let $=A.metadata??{},K=$3($),Z=K3(A.project,K),Y=G3(A,$),J=G2(_,_2($.review_after_days,30));return[SA.create({entryId:A2(G,A.uuid),kind:G,content:A.content,project:A.project,visibility:K,sourceEventIds:[A.uuid],sourceKinds:Y,confidence:Z3(G,$),scope:Z,reviewStatus:"pending_review",reviewAfter:J,expiresAt:H3($.expires_at),why:Y3(G),createdAt:_,updatedAt:_})]}function N5(A,_=new Date){return oK(A,_)[0]??null}function _3(A){let _=A.metadata??{},G=CG(_.persona_kind);if(G&&Q3(G))return G;let $=CG(_.source_kind);if($==="correction")return"correction";if($==="validated_behavior")return"procedure";if(A.type==="preference")return"preference";return null}function G3(A,_){return[CG(_.source_kind)??A.type]}function $3(A){let _=CG(A.visibility);return _==="global"||_==="workspace"||_==="project"?_:"project"}function K3(A,_){if(_==="project")return{project:A,visibility:_};return{visibility:_}}function Z3(A,_){let G=_2(_.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 Y3(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 A2(A,_){return`persona-${A}-${A3("sha256").update(_).digest("hex").slice(0,12)}`}function J3(A){let _=new Set;return A.filter((G)=>{if(_.has(G.entryId))return!1;return _.add(G.entryId),!0})}function CG(A){return typeof A==="string"&&A.trim()?A:null}function _2(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function H3(A){if(typeof A!=="string"||!A.trim())return null;let _=new Date(A);return Number.isNaN(_.getTime())?null:_}function G2(A,_){return new Date(A.getTime()+_*24*60*60*1000)}function Q3(A){return["preference","procedure","correction","decision_pattern","friction_pattern"].includes(A)}var fG=L(()=>{H_();q0()});class Y2{deps;now;constructor(A){this.deps=A;this.now=A.now??(()=>new Date)}async rebuildGraph(A={}){if(!this.deps.factRepo)throw Error("TemporalGraphService requires factRepo to rebuild graph");let G=(A.project?await this.deps.factRepo.findByProject(A.project):await this.deps.factRepo.findAll()).filter((Z)=>Z.supersededAt===null),$=G.flatMap((Z)=>bG(Z,this.now()));if(A.project)await this.deps.graphRepo.deleteByProject(A.project);else await this.deps.graphRepo.clearAll();let K=await this.deps.graphRepo.saveMany(L3($));if(this.deps.governanceRepo)for(let Z of K)await this.deps.governanceRepo.save(gG(Z,"graph-service-rebuild"));return{edges:K,edgeCount:K.length,factCount:G.length}}async findContextEdges(A){let _=await this.deps.graphRepo.findCurrent({includeGlobal:!0,...A});if(!this.deps.governancePolicy||_.length===0)return _;return this.deps.governancePolicy.filterAllowed("graph",_,(G)=>G.edgeId)}formatContextLines(A){return A.map((_)=>{let G=_.visibility==="global"?"global":_.project??_.visibility,$=_.validTo?`${_.validFrom.toISOString()} to ${_.validTo.toISOString()}`:`from ${_.validFrom.toISOString()}`;return[`- ${_.source.label} --${_.relationship}--> ${_.target.label}`,`(id: ${_.edgeId}; confidence: ${_.confidence.toFixed(2)}; scope: ${G}; valid: ${$}; why: ${_.why})`].join(" ")})}}function bG(A,_=new Date){let G=A.metadata??{},$=X3(G.graph_edges??G.graphEdges??G.relationships),K=[];for(let Z of $)try{let Y=V3(Z.visibility)??"project",J=$2(Z.source,L5(Z.sourceType??Z.source_type),"project"),H=$2(Z.target,L5(Z.targetType??Z.target_type),"tool"),Q=B3(Z.validFrom??Z.valid_from,A.observedAt),X=J2(Z.validTo??Z.valid_to),B=K2(Z.confidence,K2(G.confidence,0.75)),W=DA(Z.relationship,""),V=DA(Z.project,A.project),M=Z2(Z.sourceKinds??Z.source_kinds,[z3(A,G)]),z=Z2(Z.sourceEventIds??Z.source_event_ids,[]),T=N3([A.uuid,...z]),I=DA(Z.why,`Derived from an active ${A.type} fact.`);K.push(pA.create({edgeId:DA(Z.id??Z.edgeId??Z.edge_id,void 0),source:J,target:H,relationship:W,project:Y==="project"?V:void 0,visibility:Y,sourceEventIds:T,sourceKinds:M,confidence:B,validFrom:Q,validTo:X,why:I,metadata:W3(Z.metadata),createdAt:_,updatedAt:_}))}catch{}return K}function gG(A,_){return e.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 X3(A){if(!Array.isArray(A))return[];return A.filter(M5)}function $2(A,_,G){if(M5(A)){let K=L5(A.type)??_??G,Z=DA(A.id,DA(A.label,"")),Y=DA(A.label,Z);return{type:K,id:Z,label:Y}}let $=DA(A,"");return{type:_??G,id:$,label:$}}function L5(A){return typeof A==="string"&&qG.includes(A)?A:void 0}function V3(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function DA(A,_){return typeof A==="string"&&A.trim()?A.trim():_}function K2(A,_){return typeof A==="number"&&Number.isFinite(A)?A:_}function B3(A,_){return J2(A)??_}function J2(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 Z2(A,_){if(!Array.isArray(A))return _;let G=A.map(($)=>String($)).filter(($)=>$.trim().length>0);return G.length>0?G:_}function W3(A){return M5(A)?JSON.parse(JSON.stringify(A)):void 0}function z3(A,_){return DA(_.source_kind,A.type)}function N3(A){return[...new Set(A.filter((_)=>_.trim().length>0))]}function L3(A){let _=new Set;return A.filter((G)=>{if(_.has(G.edgeId))return!1;return _.add(G.edgeId),!0})}function M5(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var U5=L(()=>{TG();H_()});var H2={};y(H2,{MemoryGovernanceService:()=>B_});class B_{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 YA.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 v_=L(()=>{M0()});var X2={};y(X2,{validateRemoteRepositoryUrl:()=>uG,validateRemoteRef:()=>cG,validateMachineIdentity:()=>mG,RemoteEventSyncService:()=>q5});function uG(A,_={}){let G=A.trim();if(!G)return{valid:!1,error:"Remote URL is required"};if(F3(G))return{valid:!1,error:"Remote URL contains control characters"};if(S3(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 cG(A){let _=A.trim();if(!_)return{valid:!1,error:"Remote ref is required"};if(q3.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 mG(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(!T3.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 q5{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??M3,G=A.branch??U3,$=A.autoPull??!0,K=A.autoPush??!0,Z=!1,Y=!1,J=!1,H=!1;try{let Q=I3(A,G,_);if(!Q.valid)return Q2(Q.error??"Remote sync request is invalid");let X=await this.privacyPreflight?.audit();if(X&&X.eventLogFindings>0)return Q2(`Remote synchronization blocked: active event logs contain ${X.eventLogFindings} likely secret finding(s).`);if(!await this.transport.isRepository()){let z=await this.transport.initRepository(O3(A.machineId));if(!z.success)return W_(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 W_(z.error??"Failed to configure Git remote repository URL",{initializedRepository:Z});Y=!0}let V=await this.transport.listEventLogFingerprints();if(await this.transport.hasEventLog(A.machineId)){let z=await this.transport.commitEventLog(A.machineId,R3(A.machineId,this.now()));if(!z.success)return W_(`Git commit failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y})}if($){let z=await this.transport.fetch(_);if(!z.success)return W_(`Git fetch failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});if(await this.transport.hasRemoteRef(_,G)){let T=await this.transport.pullRebase(_,G);if(!T.success)return await this.transport.abortRebase(),W_(`Git pull failed: ${T.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y});J=!0}}if(K){let z=await this.transport.push(_,G);if(!z.success){let T=await this.rebuildIfNeeded(V);return W_(`Git push failed: ${z.error??"unknown error"}`,{initializedRepository:Z,configuredRemote:Y,pulled:J,rebuildNeeded:T.rebuildNeeded,projectionRebuilt:T.projectionRebuilt})}H=!0}let M=await this.rebuildIfNeeded(V);return{success:!0,status:"synced",rebuildNeeded:M.rebuildNeeded,projectionRebuilt:M.projectionRebuilt,pulled:J,pushed:H,configuredRemote:Y,initializedRepository:Z,error:void 0}}catch(Q){return W_(N(Q),{initializedRepository:Z,configuredRemote:Y,pulled:J,pushed:H})}}async rebuildIfNeeded(A){let _=await this.transport.listEventLogFingerprints(),G=j3(A,_);if(G&&this.projectionRebuilder)return await this.projectionRebuilder.rebuild(),{rebuildNeeded:G,projectionRebuilt:!0};return{rebuildNeeded:G,projectionRebuilt:!1}}}function I3(A,_,G){let $=mG(A.machineId);if(!$.valid)return $;let K=uG(A.repositoryUrl,A.allowLocalPathRemote===void 0?{}:{allowLocalPathRemote:A.allowLocalPathRemote});if(!K.valid)return K;let Z=cG(_);if(!Z.valid)return Z;if(!cG(G).valid)return{valid:!1,error:"Remote name is not valid"};return{valid:!0}}function O3(A){return{machineId:A,userName:"Memory Sync",userEmail:"sync@memory.local"}}function R3(A,_){return`sync: ${A} observed at ${_.toISOString()}`}function Q2(A){return{success:!1,status:"blocked",rebuildNeeded:!1,projectionRebuilt:!1,pulled:!1,pushed:!1,configuredRemote:!1,initializedRepository:!1,error:A}}function W_(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 j3(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 F3(A){return/[\u0000-\u001F\u007F]/.test(A)}function S3(A){return A.startsWith("/")||A.startsWith("./")||A.startsWith("../")||A.startsWith("~")||A.startsWith("file://")||/^[A-Za-z]:[\\/]/.test(A)}var M3="origin",U3="main",q3,T3;var dG=L(()=>{q3=/[\s~^:?*[\]\\;]/,T3=/^[A-Za-z0-9._-]+$/});var B2={};y(B2,{trackDownloadTotal:()=>P3,isUnicodeSupported:()=>V2,getBarCharacters:()=>lG,createProgressReporter:()=>j5,createModelDownloadHandler:()=>k3,createEmbeddingProgressReporter:()=>x3,TtyProgressReporter:()=>I5,TtyEmbeddingProgressReporter:()=>F5,QuietProgressReporter:()=>R5,QuietEmbeddingProgressReporter:()=>E5,PlainProgressReporter:()=>O5,PlainEmbeddingProgressReporter:()=>S5});import T5 from"cli-progress";function V2(){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 lG(){return V2()?E3:D3}class I5{bar;verbose;total=0;currentValue=0;constructor(A=!1){this.verbose=A;let _=lG();this.bar=new T5.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 O5{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 R5{start(A){}update(A,_){}stop(){}log(A){}}function j5(A){if(A.quiet)return new R5;if(!process.stdout.isTTY)return new O5(A.verbose);return new I5(A.verbose)}class F5{bar;constructor(){let A=lG();this.bar=new T5.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 S5{start(A){console.log(`Embedding ${A} messages...`)}update(A){}stop(){console.log("Done.")}}class E5{start(A){}update(A){}stop(){}}function x3(A){if(A.quiet)return new E5;if(!process.stdout.isTTY)return new S5;return new F5}function P3(A,_){let G=Math.round(_/1048576);return G>A?G:A}function k3(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 _=lG(),G=new T5.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 E3,D3;var D5=L(()=>{E3={complete:"\u2588",incomplete:"\u2591"},D3={complete:"#",incomplete:"-"}});function pG(A){try{return A.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),A.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function x5(A,_){let{sqliteVecAvailable:G=!1}=_??{};if(!pG(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(`
|
|
52
54
|
CREATE TABLE friction_log_new (
|
|
53
55
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
54
56
|
description TEXT NOT NULL,
|
|
@@ -73,13 +75,13 @@ CREATE INDEX IF NOT EXISTS idx_friction_status ON friction_log(status);
|
|
|
73
75
|
CREATE INDEX IF NOT EXISTS idx_friction_severity ON friction_log(severity);
|
|
74
76
|
CREATE INDEX IF NOT EXISTS idx_friction_category ON friction_log(category);
|
|
75
77
|
CREATE INDEX IF NOT EXISTS idx_friction_tool ON friction_log(tool);
|
|
76
|
-
`)}catch{}for(let
|
|
78
|
+
`)}catch{}for(let Z of W2)A.exec(Z);if(!A.prepare("PRAGMA table_info(embedding_state)").all().some((Z)=>Z.name==="model_name"))A.exec(`
|
|
77
79
|
ALTER TABLE embedding_state ADD COLUMN model_name TEXT NOT NULL DEFAULT '';
|
|
78
|
-
`);if(
|
|
80
|
+
`);if(G)A.exec(`
|
|
79
81
|
CREATE VIRTUAL TABLE IF NOT EXISTS message_embeddings USING vec0(
|
|
80
82
|
embedding float[384]
|
|
81
83
|
);
|
|
82
|
-
`)}var
|
|
84
|
+
`)}var W2;var P5=L(()=>{W2=[`
|
|
83
85
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
84
86
|
id TEXT PRIMARY KEY,
|
|
85
87
|
project_path_encoded TEXT NOT NULL,
|
|
@@ -341,65 +343,199 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
341
343
|
tokens_consumed INTEGER DEFAULT 0,
|
|
342
344
|
extracted_at TEXT NOT NULL
|
|
343
345
|
);
|
|
344
|
-
|
|
346
|
+
`,`
|
|
347
|
+
CREATE TABLE IF NOT EXISTS memory_governance (
|
|
348
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
349
|
+
surface TEXT NOT NULL CHECK (surface IN ('fact', 'context', 'provider_egress', 'remote_sync', 'friction', 'evaluation', 'persona', 'graph', 'ranking', 'dream', 'projection')),
|
|
350
|
+
target_id TEXT NOT NULL,
|
|
351
|
+
project TEXT,
|
|
352
|
+
visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
|
|
353
|
+
source_event_ids TEXT NOT NULL,
|
|
354
|
+
transformation_method TEXT NOT NULL,
|
|
355
|
+
actor TEXT NOT NULL,
|
|
356
|
+
confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
|
|
357
|
+
redaction_state TEXT NOT NULL CHECK (redaction_state IN ('none', 'redacted', 'quarantined')),
|
|
358
|
+
consent_status TEXT NOT NULL CHECK (consent_status IN ('not_required', 'granted', 'denied', 'revoked')),
|
|
359
|
+
consent_scopes TEXT NOT NULL,
|
|
360
|
+
scope TEXT NOT NULL,
|
|
361
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'pending_review', 'suppressed', 'invalidated', 'expired')),
|
|
362
|
+
status_reason TEXT,
|
|
363
|
+
created_at TEXT NOT NULL,
|
|
364
|
+
updated_at TEXT NOT NULL,
|
|
365
|
+
reviewed_at TEXT,
|
|
366
|
+
expires_at TEXT,
|
|
367
|
+
last_event_id TEXT,
|
|
368
|
+
UNIQUE(surface, target_id)
|
|
369
|
+
);
|
|
370
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_surface ON memory_governance(surface);
|
|
371
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_project ON memory_governance(project);
|
|
372
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_status ON memory_governance(status);
|
|
373
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_target ON memory_governance(surface, target_id);
|
|
374
|
+
`,`
|
|
375
|
+
CREATE TABLE IF NOT EXISTS memory_governance_events (
|
|
376
|
+
event_id TEXT PRIMARY KEY,
|
|
377
|
+
kind TEXT NOT NULL CHECK (kind IN ('governance', 'consent')),
|
|
378
|
+
control TEXT NOT NULL,
|
|
379
|
+
surface TEXT NOT NULL,
|
|
380
|
+
target_id TEXT NOT NULL,
|
|
381
|
+
actor TEXT NOT NULL,
|
|
382
|
+
reason TEXT,
|
|
383
|
+
occurred_at TEXT NOT NULL,
|
|
384
|
+
payload TEXT NOT NULL
|
|
385
|
+
);
|
|
386
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_events_target ON memory_governance_events(surface, target_id);
|
|
387
|
+
CREATE INDEX IF NOT EXISTS idx_memory_governance_events_occurred ON memory_governance_events(occurred_at);
|
|
388
|
+
`,`
|
|
389
|
+
CREATE TABLE IF NOT EXISTS persona_entries (
|
|
390
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
391
|
+
entry_id TEXT UNIQUE NOT NULL,
|
|
392
|
+
kind TEXT NOT NULL CHECK (kind IN ('preference', 'procedure', 'correction', 'decision_pattern', 'friction_pattern')),
|
|
393
|
+
content TEXT NOT NULL,
|
|
394
|
+
project TEXT,
|
|
395
|
+
visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
|
|
396
|
+
source_event_ids TEXT NOT NULL,
|
|
397
|
+
source_kinds TEXT NOT NULL,
|
|
398
|
+
confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
|
|
399
|
+
scope TEXT NOT NULL,
|
|
400
|
+
review_status TEXT NOT NULL CHECK (review_status IN ('pending_review', 'reviewed')),
|
|
401
|
+
review_after TEXT NOT NULL,
|
|
402
|
+
expires_at TEXT,
|
|
403
|
+
why TEXT NOT NULL,
|
|
404
|
+
created_at TEXT NOT NULL,
|
|
405
|
+
updated_at TEXT NOT NULL
|
|
406
|
+
);
|
|
407
|
+
CREATE INDEX IF NOT EXISTS idx_persona_entries_project ON persona_entries(project);
|
|
408
|
+
CREATE INDEX IF NOT EXISTS idx_persona_entries_kind ON persona_entries(kind);
|
|
409
|
+
CREATE INDEX IF NOT EXISTS idx_persona_entries_visibility ON persona_entries(visibility);
|
|
410
|
+
`,`
|
|
411
|
+
CREATE TABLE IF NOT EXISTS graph_edges (
|
|
412
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
413
|
+
edge_id TEXT UNIQUE NOT NULL,
|
|
414
|
+
source_type TEXT NOT NULL CHECK (source_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
|
|
415
|
+
source_id TEXT NOT NULL,
|
|
416
|
+
source_label TEXT NOT NULL,
|
|
417
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('project', 'tool', 'person', 'decision', 'error', 'plan', 'file', 'command', 'capability')),
|
|
418
|
+
target_id TEXT NOT NULL,
|
|
419
|
+
target_label TEXT NOT NULL,
|
|
420
|
+
relationship TEXT NOT NULL,
|
|
421
|
+
project TEXT,
|
|
422
|
+
visibility TEXT NOT NULL CHECK (visibility IN ('project', 'workspace', 'global')),
|
|
423
|
+
source_event_ids TEXT NOT NULL,
|
|
424
|
+
source_kinds TEXT NOT NULL,
|
|
425
|
+
confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
|
|
426
|
+
valid_from TEXT NOT NULL,
|
|
427
|
+
valid_to TEXT,
|
|
428
|
+
why TEXT NOT NULL,
|
|
429
|
+
metadata TEXT,
|
|
430
|
+
created_at TEXT NOT NULL,
|
|
431
|
+
updated_at TEXT NOT NULL
|
|
432
|
+
);
|
|
433
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_edge_id ON graph_edges(edge_id);
|
|
434
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_project ON graph_edges(project);
|
|
435
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_scope ON graph_edges(project, visibility);
|
|
436
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges(source_type, source_id);
|
|
437
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges(target_type, target_id);
|
|
438
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_relationship ON graph_edges(relationship);
|
|
439
|
+
CREATE INDEX IF NOT EXISTS idx_graph_edges_temporal ON graph_edges(valid_from, valid_to, confidence);
|
|
440
|
+
`,`
|
|
441
|
+
CREATE TABLE IF NOT EXISTS memory_utility_metrics (
|
|
442
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
443
|
+
surface TEXT NOT NULL CHECK (surface IN ('fact', 'persona', 'graph', 'link', 'dream')),
|
|
444
|
+
target_id TEXT NOT NULL,
|
|
445
|
+
project TEXT,
|
|
446
|
+
access_count INTEGER NOT NULL DEFAULT 0 CHECK (access_count >= 0),
|
|
447
|
+
last_accessed_at TEXT,
|
|
448
|
+
last_ranked_at TEXT,
|
|
449
|
+
utility_score REAL NOT NULL DEFAULT 0.5 CHECK (utility_score >= 0 AND utility_score <= 1),
|
|
450
|
+
importance_score REAL NOT NULL DEFAULT 0.5 CHECK (importance_score >= 0 AND importance_score <= 1),
|
|
451
|
+
evergreen INTEGER NOT NULL DEFAULT 0 CHECK (evergreen IN (0, 1)),
|
|
452
|
+
pinned INTEGER NOT NULL DEFAULT 0 CHECK (pinned IN (0, 1)),
|
|
453
|
+
half_life_days REAL CHECK (half_life_days IS NULL OR half_life_days > 0),
|
|
454
|
+
metadata TEXT,
|
|
455
|
+
created_at TEXT NOT NULL,
|
|
456
|
+
updated_at TEXT NOT NULL,
|
|
457
|
+
UNIQUE(surface, target_id)
|
|
458
|
+
);
|
|
459
|
+
CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_target ON memory_utility_metrics(surface, target_id);
|
|
460
|
+
CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_project ON memory_utility_metrics(project);
|
|
461
|
+
CREATE INDEX IF NOT EXISTS idx_memory_utility_metrics_rank ON memory_utility_metrics(surface, evergreen, pinned, utility_score, importance_score);
|
|
462
|
+
`,`
|
|
463
|
+
CREATE TABLE IF NOT EXISTS embedding_skips (
|
|
464
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
465
|
+
message_id INTEGER NOT NULL,
|
|
466
|
+
model_hash TEXT NOT NULL,
|
|
467
|
+
model_name TEXT NOT NULL,
|
|
468
|
+
provider TEXT NOT NULL,
|
|
469
|
+
reason TEXT NOT NULL CHECK (reason IN ('payload_too_large')),
|
|
470
|
+
retryable INTEGER NOT NULL CHECK (retryable IN (0, 1)),
|
|
471
|
+
content_hash TEXT NOT NULL,
|
|
472
|
+
content_bytes INTEGER NOT NULL CHECK (content_bytes >= 0),
|
|
473
|
+
safe_error TEXT,
|
|
474
|
+
skipped_at TEXT NOT NULL,
|
|
475
|
+
FOREIGN KEY (message_id) REFERENCES messages_meta(rowid) ON DELETE CASCADE,
|
|
476
|
+
UNIQUE(message_id, model_hash, reason)
|
|
477
|
+
);
|
|
478
|
+
CREATE INDEX IF NOT EXISTS idx_embedding_skips_model ON embedding_skips(model_hash);
|
|
479
|
+
CREATE INDEX IF NOT EXISTS idx_embedding_skips_message_model ON embedding_skips(message_id, model_hash);
|
|
480
|
+
`]});var h5={};y(h5,{getMemoryDir:()=>D0,getMachineLogPath:()=>y5,getLogDir:()=>zA,getLegacyDir:()=>k5,getHookDir:()=>rG,getEventsDir:()=>w_,getEventLogPath:()=>h3,getDbPath:()=>aG,getDataDir:()=>n,getConfigPath:()=>x0,getConfigDir:()=>z_,getCheckpointPath:()=>tG,getBackupDir:()=>P0,getAllLogFiles:()=>xA});import{existsSync as z2,readdirSync as y3}from"fs";import{homedir as iG}from"os";import{join as p}from"path";function z_(){let A=process.env.XDG_CONFIG_HOME;if(A)return p(A,nG);return p(iG(),".config",nG)}function n(){let A=process.env.XDG_DATA_HOME;if(A)return p(A,nG);return p(iG(),".local","share",nG)}function k5(){return p(iG(),".memory-nexus")}function D0(){let A=process.env.MEMORY_HOME;if(A)return A;return p(iG(),".memory")}function x0(){return p(z_(),"config.json")}function aG(){return p(n(),"memory.db")}function zA(){return p(n(),"logs")}function rG(){return p(n(),"hooks")}function P0(){return p(n(),"backups")}function tG(){return p(n(),"sync-checkpoint.json")}function w_(){return p(n(),"events")}function h3(){return p(w_(),"events.jsonl")}function y5(A){return p(w_(),`events-${A}.jsonl`)}function xA(A){let _=A??w_();if(!z2(_))return[];let G=y3(_),$=[],K=p(_,"events.jsonl");if(z2(K))$.push(K);for(let Z of G)if(Z.startsWith("events-")&&Z.endsWith(".jsonl"))$.push(p(_,Z));return $}var nG="memory";var f=L(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{Database as v3}from"bun:sqlite";import{existsSync as w3,mkdirSync as C3}from"fs";import{dirname as N2}from"path";function f3(A){try{return x_("sqlite-vec").load(A),!0}catch{return!1}}function S(){return aG()}function P(A){let{path:_,create:G=!0,applySchema:$=!0,walMode:K=!0,cacheSize:Z=-64000,busyTimeout:Y=5000}=A,J=_!==":memory:",H=J&&w3(_),Q=A.quickCheck??(J&&H);if(J)try{C3(N2(_),{recursive:!0})}catch(W){let V=N(W);throw new j(R.DB_CONNECTION_FAILED,`Failed to create database directory: ${V}`,{path:N2(_)})}let X;try{X=new v3(_,{create:G})}catch(W){let V=N(W),M=W.code;throw new j(R.DB_CONNECTION_FAILED,`Failed to connect to database: ${V}`,{path:_,...M?{errno:M}:{}})}let B=(W)=>{X.close();let V=N(W);if(V.includes("not a database")||V.includes("SQLITE_NOTADB"))throw new j(R.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:_});throw new j(R.DB_CONNECTION_FAILED,`Failed to initialize database: ${V}`,{path:_})};try{X.exec("PRAGMA foreign_keys = ON;");let W=!1;if(K&&J){X.exec("PRAGMA journal_mode = WAL;");let z=X.query("PRAGMA journal_mode;").get();if(W=z.journal_mode==="wal",!W)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 V=pG(X);if(!V){let z=X.query("SELECT sqlite_version() as version").get();throw X.close(),new j(R.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 j(R.DB_CORRUPTED,"Database integrity check failed",{path:_,checkResult:z?.quick_check??"unknown"})}let M=f3(X);if($)x5(X,{sqliteVecAvailable:M});return{db:X,walEnabled:W,fts5Available:V,sqliteVecAvailable:M}}catch(W){if(W instanceof j)throw W;throw B(W)}}function D(A){try{A.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{A.exec("PRAGMA journal_mode = DELETE;")}catch{}A.close()}function v5(A){return A.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}var w5=L(()=>{P5();O0();f()});class d{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`
|
|
345
481
|
SELECT id, project_path_encoded, project_path_decoded, project_name,
|
|
346
482
|
start_time, end_time, message_count, summary
|
|
347
483
|
FROM sessions
|
|
348
484
|
WHERE id = $id
|
|
349
|
-
`),this.findByProjectStmt
|
|
485
|
+
`),this.findByProjectStmt=A.prepare(`
|
|
350
486
|
SELECT id, project_path_encoded, project_path_decoded, project_name,
|
|
351
487
|
start_time, end_time, message_count, summary
|
|
352
488
|
FROM sessions
|
|
353
489
|
WHERE project_path_encoded = $projectPath
|
|
354
490
|
ORDER BY start_time DESC
|
|
355
|
-
`),this.findRecentStmt
|
|
491
|
+
`),this.findRecentStmt=A.prepare(`
|
|
356
492
|
SELECT id, project_path_encoded, project_path_decoded, project_name,
|
|
357
493
|
start_time, end_time, message_count, summary
|
|
358
494
|
FROM sessions
|
|
359
495
|
ORDER BY start_time DESC
|
|
360
496
|
LIMIT $limit
|
|
361
|
-
`),this.insertStmt
|
|
497
|
+
`),this.insertStmt=A.prepare(`
|
|
362
498
|
INSERT OR IGNORE INTO sessions
|
|
363
499
|
(id, project_path_encoded, project_path_decoded, project_name,
|
|
364
500
|
start_time, end_time, message_count)
|
|
365
501
|
VALUES
|
|
366
502
|
($id, $projectPathEncoded, $projectPathDecoded, $projectName,
|
|
367
503
|
$startTime, $endTime, $messageCount)
|
|
368
|
-
`),this.deleteStmt
|
|
504
|
+
`),this.deleteStmt=A.prepare(`
|
|
369
505
|
DELETE FROM sessions WHERE id = $id
|
|
370
|
-
`),this.updateSummaryStmt
|
|
506
|
+
`),this.updateSummaryStmt=A.prepare(`
|
|
371
507
|
UPDATE sessions SET summary = $summary, updated_at = datetime('now')
|
|
372
508
|
WHERE id = $id
|
|
373
|
-
`),this.updateProjectNameStmt
|
|
509
|
+
`),this.updateProjectNameStmt=A.prepare(`
|
|
374
510
|
UPDATE sessions SET project_name = $projectName, updated_at = datetime('now')
|
|
375
511
|
WHERE project_path_encoded = $encodedPath
|
|
376
|
-
`),this.findDistinctEncodedPathsStmt
|
|
512
|
+
`),this.findDistinctEncodedPathsStmt=A.prepare(`
|
|
377
513
|
SELECT DISTINCT project_path_encoded FROM sessions
|
|
378
514
|
ORDER BY project_path_encoded
|
|
379
|
-
`)}rowToSession(
|
|
515
|
+
`)}rowToSession(A){let _=s.fromDecoded(A.project_path_decoded);return UA.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(`
|
|
380
516
|
SELECT id, project_path_encoded, project_path_decoded, project_name,
|
|
381
517
|
start_time, end_time, message_count, summary
|
|
382
518
|
FROM sessions
|
|
383
519
|
WHERE updated_at < $cutoffDate
|
|
384
520
|
ORDER BY updated_at ASC
|
|
385
|
-
`).all({$cutoffDate
|
|
521
|
+
`).all({$cutoffDate:A.toISOString()}).map((K)=>this.rowToSession(K))}async countOlderThan(A){return this.db.prepare(`
|
|
386
522
|
SELECT COUNT(*) as count
|
|
387
523
|
FROM sessions
|
|
388
524
|
WHERE updated_at < $cutoffDate
|
|
389
|
-
`).get({$cutoffDate
|
|
525
|
+
`).get({$cutoffDate:A.toISOString()}).count}async deleteOlderThan(A){let _=await this.countOlderThan(A),G=`
|
|
390
526
|
DELETE FROM sessions
|
|
391
527
|
WHERE updated_at < $cutoffDate
|
|
392
528
|
`;return this.db.prepare(`
|
|
393
529
|
DELETE FROM sessions
|
|
394
530
|
WHERE updated_at < $cutoffDate
|
|
395
|
-
`).run({$cutoffDate
|
|
531
|
+
`).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=`
|
|
396
532
|
SELECT id, project_path_encoded, project_path_decoded, project_name,
|
|
397
533
|
start_time, end_time, message_count, summary
|
|
398
534
|
FROM sessions
|
|
399
|
-
${
|
|
535
|
+
${$}
|
|
400
536
|
ORDER BY start_time DESC
|
|
401
537
|
LIMIT $limit
|
|
402
|
-
`;return this.db.prepare(
|
|
538
|
+
`;return this.db.prepare(Z).all(G).map((H)=>this.rowToSession(H))}async searchSummaries(A,_=20){let G=Q_(A);if(!G)return[];let $=`
|
|
403
539
|
SELECT s.id, s.project_path_encoded, s.project_path_decoded, s.project_name,
|
|
404
540
|
s.start_time, s.end_time, s.message_count, s.summary
|
|
405
541
|
FROM sessions s
|
|
@@ -407,56 +543,56 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
407
543
|
WHERE sessions_fts MATCH $query
|
|
408
544
|
ORDER BY rank
|
|
409
545
|
LIMIT $limit
|
|
410
|
-
`;return this.db.prepare(
|
|
546
|
+
`;return this.db.prepare($).all({$query:G,$limit:_}).map((Y)=>this.rowToSession(Y))}}var aA=()=>{};class PA{db;findByIdStmt;findBySessionStmt;existsStmt;insertStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
|
|
411
547
|
FROM messages_meta
|
|
412
|
-
WHERE id = ?`),this.findBySessionStmt
|
|
548
|
+
WHERE id = ?`),this.findBySessionStmt=A.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
|
|
413
549
|
FROM messages_meta
|
|
414
550
|
WHERE session_id = ?
|
|
415
|
-
ORDER BY timestamp ASC`),this.existsStmt
|
|
416
|
-
VALUES ($id, $session_id, $role, $content, $timestamp, $tool_use_ids)`)}async findById(
|
|
551
|
+
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)
|
|
552
|
+
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:N(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 MA.create({id:A.id,role:A.role,content:A.content,timestamp:new Date(A.timestamp),toolUseIds:_})}}var k0=L(()=>{N0()});class N_{findByIdStmt;findBySessionPathStmt;findPendingStmt;saveStmt;constructor(A){this.findByIdStmt=A.prepare(`
|
|
417
553
|
SELECT id, session_path, started_at, status, completed_at,
|
|
418
554
|
messages_extracted, error_message, file_mtime, file_size
|
|
419
555
|
FROM extraction_state
|
|
420
556
|
WHERE id = $id
|
|
421
|
-
`),this.findBySessionPathStmt
|
|
557
|
+
`),this.findBySessionPathStmt=A.prepare(`
|
|
422
558
|
SELECT id, session_path, started_at, status, completed_at,
|
|
423
559
|
messages_extracted, error_message, file_mtime, file_size
|
|
424
560
|
FROM extraction_state
|
|
425
561
|
WHERE session_path = $sessionPath
|
|
426
|
-
`),this.findPendingStmt
|
|
562
|
+
`),this.findPendingStmt=A.prepare(`
|
|
427
563
|
SELECT id, session_path, started_at, status, completed_at,
|
|
428
564
|
messages_extracted, error_message, file_mtime, file_size
|
|
429
565
|
FROM extraction_state
|
|
430
566
|
WHERE status IN ('pending', 'in_progress')
|
|
431
567
|
ORDER BY started_at ASC
|
|
432
|
-
`),this.saveStmt
|
|
568
|
+
`),this.saveStmt=A.prepare(`
|
|
433
569
|
INSERT OR REPLACE INTO extraction_state
|
|
434
570
|
(id, session_path, started_at, status, completed_at,
|
|
435
571
|
messages_extracted, error_message, file_mtime, file_size)
|
|
436
572
|
VALUES
|
|
437
573
|
($id, $sessionPath, $startedAt, $status, $completedAt,
|
|
438
574
|
$messagesExtracted, $errorMessage, $fileMtime, $fileSize)
|
|
439
|
-
`)}rowToExtractionState(
|
|
575
|
+
`)}rowToExtractionState(A){return ZA.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 L2=L(()=>{JG()});class L_{db;findByIdStmt;findBySessionStmt;insertStmt;constructor(A){this.db=A,this.findByIdStmt=A.prepare(`SELECT id, session_id, name, input, timestamp, status, result
|
|
440
576
|
FROM tool_uses
|
|
441
|
-
WHERE id = ?`),this.findBySessionStmt
|
|
577
|
+
WHERE id = ?`),this.findBySessionStmt=A.prepare(`SELECT id, session_id, name, input, timestamp, status, result
|
|
442
578
|
FROM tool_uses
|
|
443
579
|
WHERE session_id = ?
|
|
444
|
-
ORDER BY timestamp ASC`),this.insertStmt
|
|
580
|
+
ORDER BY timestamp ASC`),this.insertStmt=A.prepare(`INSERT OR IGNORE INTO tool_uses
|
|
445
581
|
(id, session_id, name, input, timestamp, status, result)
|
|
446
|
-
VALUES ($id, $session_id, $name, $input, $timestamp, $status, $result)`)}async findById(
|
|
582
|
+
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:N(X)})}}).immediate(Z),_?.onProgress?.({inserted:$.inserted,total:A.length})}return $}rowToEntity(A){return qA.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 C5=L(()=>{HG()});class y0{db;findBySourceStmt;findByTargetStmt;insertStmt;constructor(A){this.db=A,this.findBySourceStmt=A.prepare(`
|
|
447
583
|
SELECT source_type, source_id, target_type, target_id, relationship, weight
|
|
448
584
|
FROM links
|
|
449
585
|
WHERE source_type = $sourceType AND source_id = $sourceId
|
|
450
|
-
`),this.findByTargetStmt
|
|
586
|
+
`),this.findByTargetStmt=A.prepare(`
|
|
451
587
|
SELECT source_type, source_id, target_type, target_id, relationship, weight
|
|
452
588
|
FROM links
|
|
453
589
|
WHERE target_type = $targetType AND target_id = $targetId
|
|
454
|
-
`),this.insertStmt
|
|
590
|
+
`),this.insertStmt=A.prepare(`
|
|
455
591
|
INSERT OR REPLACE INTO links
|
|
456
592
|
(source_type, source_id, target_type, target_id, relationship, weight)
|
|
457
593
|
VALUES
|
|
458
594
|
($sourceType, $sourceId, $targetType, $targetId, $relationship, $weight)
|
|
459
|
-
`)}rowToLink(
|
|
595
|
+
`)}rowToLink(A){return P_.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(`
|
|
460
596
|
WITH RECURSIVE related(
|
|
461
597
|
source_type, source_id, target_type, target_id,
|
|
462
598
|
relationship, weight, hop, path
|
|
@@ -485,37 +621,70 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
485
621
|
SELECT DISTINCT source_type, source_id, target_type, target_id, relationship, weight, hop
|
|
486
622
|
FROM related
|
|
487
623
|
ORDER BY hop ASC, weight DESC
|
|
488
|
-
`).all({$entityType
|
|
624
|
+
`).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 M2=L(()=>{t$()});var f5=L(()=>{z0()});var U2={};y(U2,{EmbeddingRepository:()=>rA});class rA{db;constructor(A){this.db=A}findUnembedded(A,_){if(_)return this.db.prepare(`
|
|
625
|
+
SELECT m.rowid AS rowid, m.content AS content
|
|
626
|
+
FROM messages_meta m
|
|
627
|
+
LEFT JOIN embedding_state es ON m.rowid = es.message_id
|
|
628
|
+
LEFT JOIN embedding_skips esk
|
|
629
|
+
ON m.rowid = esk.message_id
|
|
630
|
+
AND esk.model_hash = ?
|
|
631
|
+
WHERE es.message_id IS NULL
|
|
632
|
+
AND esk.message_id IS NULL
|
|
633
|
+
ORDER BY m.rowid ASC
|
|
634
|
+
LIMIT ?
|
|
635
|
+
`).all(_,A);return this.db.prepare(`
|
|
489
636
|
SELECT m.rowid AS rowid, m.content AS content
|
|
490
637
|
FROM messages_meta m
|
|
491
638
|
LEFT JOIN embedding_state es ON m.rowid = es.message_id
|
|
492
639
|
WHERE es.message_id IS NULL
|
|
493
640
|
ORDER BY m.rowid ASC
|
|
494
641
|
LIMIT ?
|
|
495
|
-
`).all(
|
|
642
|
+
`).all(A)}markSkipped(A){let _=A.skippedAt instanceof Date?A.skippedAt.toISOString():A.skippedAt??new Date().toISOString();this.db.prepare(`
|
|
643
|
+
INSERT INTO embedding_skips (
|
|
644
|
+
message_id,
|
|
645
|
+
model_hash,
|
|
646
|
+
model_name,
|
|
647
|
+
provider,
|
|
648
|
+
reason,
|
|
649
|
+
retryable,
|
|
650
|
+
content_hash,
|
|
651
|
+
content_bytes,
|
|
652
|
+
safe_error,
|
|
653
|
+
skipped_at
|
|
654
|
+
)
|
|
655
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
656
|
+
ON CONFLICT(message_id, model_hash, reason) DO UPDATE SET
|
|
657
|
+
model_name = excluded.model_name,
|
|
658
|
+
provider = excluded.provider,
|
|
659
|
+
retryable = excluded.retryable,
|
|
660
|
+
content_hash = excluded.content_hash,
|
|
661
|
+
content_bytes = excluded.content_bytes,
|
|
662
|
+
safe_error = excluded.safe_error,
|
|
663
|
+
skipped_at = excluded.skipped_at
|
|
664
|
+
`).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(`
|
|
496
665
|
SELECT rowid, distance
|
|
497
666
|
FROM message_embeddings
|
|
498
667
|
WHERE embedding MATCH ?
|
|
499
668
|
ORDER BY distance
|
|
500
669
|
LIMIT ?
|
|
501
|
-
`).all(
|
|
502
|
-
embedding float[${
|
|
503
|
-
)`),this.db.exec("DELETE FROM embedding_state")}}class
|
|
670
|
+
`).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(
|
|
671
|
+
embedding float[${A}]
|
|
672
|
+
)`),this.db.exec("DELETE FROM embedding_state")}}class eG{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(q2).run(A.filePath,A.fileType,A.projectEncoded??null,A.content,A.contentHash,A.lastIndexedAt.toISOString())}async saveMany(A){let _=this.db.prepare(q2);this.db.transaction(()=>{for(let $ of A)_.run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())})()}async searchContent(A,_=20){let G=Q_(A);if(!G)return[];return this.db.prepare(`
|
|
504
673
|
SELECT m.* FROM memory_files m
|
|
505
674
|
JOIN memory_files_fts f ON f.rowid = m.id
|
|
506
675
|
WHERE memory_files_fts MATCH ?
|
|
507
676
|
ORDER BY rank
|
|
508
677
|
LIMIT ?
|
|
509
|
-
`).all(
|
|
678
|
+
`).all(G,_).map((K)=>this.toEntity(K))}async findCrossProjectLearnings(A,_=20){if(A)return this.db.prepare(`SELECT * FROM memory_files
|
|
510
679
|
WHERE file_type = 'learnings'
|
|
511
680
|
AND content LIKE '%Applies to: cross-project%'
|
|
512
681
|
AND (project_encoded IS NULL OR project_encoded != ?)
|
|
513
682
|
ORDER BY last_indexed_at DESC
|
|
514
|
-
LIMIT ?`).all(
|
|
683
|
+
LIMIT ?`).all(A,_).map((K)=>this.toEntity(K));return this.db.prepare(`SELECT * FROM memory_files
|
|
515
684
|
WHERE file_type = 'learnings'
|
|
516
685
|
AND content LIKE '%Applies to: cross-project%'
|
|
517
686
|
ORDER BY last_indexed_at DESC
|
|
518
|
-
LIMIT ?`).all(
|
|
687
|
+
LIMIT ?`).all(_).map(($)=>this.toEntity($))}toEntity(A){return Y_.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 q2=`
|
|
519
688
|
INSERT INTO memory_files (file_path, file_type, project_encoded, content, content_hash, last_indexed_at)
|
|
520
689
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
521
690
|
ON CONFLICT(file_path) DO UPDATE SET
|
|
@@ -524,10 +693,10 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
524
693
|
content = excluded.content,
|
|
525
694
|
content_hash = excluded.content_hash,
|
|
526
695
|
last_indexed_at = excluded.last_indexed_at
|
|
527
|
-
`;var
|
|
696
|
+
`;var b5=L(()=>{QG()});var I2={};y(I2,{SqliteFrictionRepository:()=>kA});class kA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
528
697
|
INSERT INTO friction_log (description, severity, category, tool, tags, status, context, source_project, logged_at, resolved_at, resolution, last_reviewed_at)
|
|
529
698
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
530
|
-
`).run(
|
|
699
|
+
`).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 mA.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}=b3(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(`
|
|
531
700
|
SELECT
|
|
532
701
|
COUNT(*) as total,
|
|
533
702
|
COALESCE(SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END), 0) as open_count,
|
|
@@ -536,60 +705,202 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
536
705
|
AVG(CASE WHEN resolved_at IS NOT NULL
|
|
537
706
|
THEN julianday(resolved_at) - julianday(logged_at) END) as avg_resolve_days
|
|
538
707
|
FROM friction_log
|
|
539
|
-
`).get(),
|
|
708
|
+
`).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(`
|
|
540
709
|
SELECT id, description,
|
|
541
710
|
julianday('now') - julianday(logged_at) as days_open
|
|
542
711
|
FROM friction_log
|
|
543
712
|
WHERE status = 'open'
|
|
544
713
|
ORDER BY logged_at ASC
|
|
545
714
|
LIMIT 1
|
|
546
|
-
`).get(),J
|
|
715
|
+
`).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),B=Math.ceil((H.getTime()-X.getTime())/86400000),W=Math.ceil((B+X.getDay())/7),V=`${Q}-W${String(W).padStart(2,"0")}`;_.push(V)}let $=this.db.prepare(`
|
|
547
716
|
SELECT strftime('%Y-W', logged_at) || printf('%02d', CAST(strftime('%W', logged_at) AS INTEGER)) as week,
|
|
548
717
|
COUNT(*) as count
|
|
549
718
|
FROM friction_log
|
|
550
719
|
WHERE logged_at >= ?
|
|
551
720
|
GROUP BY week
|
|
552
|
-
`).all(new Date(
|
|
721
|
+
`).all(new Date(G.getTime()-A*7*86400000).toISOString()),K=new Map($.map((J)=>[J.week,J.count])),Z=this.db.prepare(`
|
|
553
722
|
SELECT strftime('%Y-W', resolved_at) || printf('%02d', CAST(strftime('%W', resolved_at) AS INTEGER)) as week,
|
|
554
723
|
COUNT(*) as count
|
|
555
724
|
FROM friction_log
|
|
556
725
|
WHERE resolved_at IS NOT NULL AND resolved_at >= ?
|
|
557
726
|
GROUP BY week
|
|
558
|
-
`).all(new Date(
|
|
727
|
+
`).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(`
|
|
559
728
|
SELECT tool, category, COUNT(*) as count
|
|
560
729
|
FROM friction_log
|
|
561
730
|
WHERE status = 'open'
|
|
562
731
|
GROUP BY tool, category
|
|
563
732
|
HAVING COUNT(*) >= ?
|
|
564
733
|
ORDER BY count DESC
|
|
565
|
-
`).all(
|
|
734
|
+
`).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 mA.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 b3(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(`%${T2(A.descriptionContains)}%`);if(A.contextContains)_.push("LOWER(COALESCE(context, '')) LIKE LOWER(?) ESCAPE '\\'"),G.push(`%${T2(A.contextContains)}%`);return{whereClause:_.length>0?`WHERE ${_.join(" AND ")}`:"",params:G}}function T2(A){return A.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}var h0=L(()=>{XG()});var O2=()=>{};var R2={};y(R2,{SqliteFactRepository:()=>tA});class tA{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(`
|
|
566
735
|
UPDATE facts
|
|
567
736
|
SET type = ?, project = ?, content = ?, metadata = ?, observed_at = ?, superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
|
|
568
737
|
WHERE uuid = ?
|
|
569
|
-
`).run(
|
|
738
|
+
`).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(`
|
|
570
739
|
INSERT INTO facts (
|
|
571
740
|
uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
|
|
572
741
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
573
|
-
`).run(
|
|
742
|
+
`).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(`
|
|
574
743
|
UPDATE facts
|
|
575
744
|
SET type = ?, project = ?, content = ?, metadata = ?, observed_at = ?, superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
|
|
576
745
|
WHERE uuid = ?
|
|
577
|
-
`).run(
|
|
746
|
+
`).run($.type,$.project,$.content,K,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy,$.uuid),_.push($.withId(Z.id));else{let Y=this.db.prepare(`
|
|
578
747
|
INSERT INTO facts (
|
|
579
748
|
uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
|
|
580
749
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
581
|
-
`).run(
|
|
750
|
+
`).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(`
|
|
582
751
|
SELECT f.* FROM facts f
|
|
583
752
|
JOIN facts_fts fts ON f.id = fts.rowid
|
|
584
753
|
WHERE facts_fts MATCH ?
|
|
585
754
|
ORDER BY f.observed_at DESC
|
|
586
755
|
LIMIT ?
|
|
587
|
-
`).all(
|
|
756
|
+
`).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 XA.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 M_=L(()=>{L0()});var E2={};y(E2,{governanceEntryFromFactEvent:()=>A$,SqliteMemoryGovernanceRepository:()=>GA});class GA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
757
|
+
INSERT INTO memory_governance (
|
|
758
|
+
surface, target_id, project, visibility, source_event_ids,
|
|
759
|
+
transformation_method, actor, confidence, redaction_state,
|
|
760
|
+
consent_status, consent_scopes, scope, status, status_reason,
|
|
761
|
+
created_at, updated_at, reviewed_at, expires_at, last_event_id
|
|
762
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
763
|
+
ON CONFLICT(surface, target_id) DO UPDATE SET
|
|
764
|
+
project = excluded.project,
|
|
765
|
+
visibility = excluded.visibility,
|
|
766
|
+
source_event_ids = excluded.source_event_ids,
|
|
767
|
+
transformation_method = excluded.transformation_method,
|
|
768
|
+
actor = excluded.actor,
|
|
769
|
+
confidence = excluded.confidence,
|
|
770
|
+
redaction_state = excluded.redaction_state,
|
|
771
|
+
consent_status = excluded.consent_status,
|
|
772
|
+
consent_scopes = excluded.consent_scopes,
|
|
773
|
+
scope = excluded.scope,
|
|
774
|
+
status = excluded.status,
|
|
775
|
+
status_reason = excluded.status_reason,
|
|
776
|
+
updated_at = excluded.updated_at,
|
|
777
|
+
reviewed_at = excluded.reviewed_at,
|
|
778
|
+
expires_at = excluded.expires_at,
|
|
779
|
+
last_event_id = excluded.last_event_id
|
|
780
|
+
`).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 _=sG(A.payload.governance);if(!_)return null;let G=o$(U_(_.control,"register")),$=U0(U_(_.surface,"fact")),K=U_(_.targetId??_.target_id,"");if(!K.trim())throw Error("Governance event targetId is required");if(this.recordGovernanceEvent(A,G,$,K,_),G==="register")return this.save(j2(A,_,$,K));let J=(await this.findByTarget($,K)??j2(A,_,$,K)).withControl({control:G,actor:U_(_.actor,A.provenance.actor),reason:oG(_.reason),occurredAt:A.occurredAt,expiresAt:v0(_.expiresAt??_.expires_at),consentStatus:S2(_.consentStatus??_.consent_status),consentScopes:g5(_.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 e.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(`
|
|
781
|
+
INSERT INTO memory_governance_events (
|
|
782
|
+
event_id, kind, control, surface, target_id, actor, reason, occurred_at, payload
|
|
783
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
784
|
+
ON CONFLICT(event_id) DO NOTHING
|
|
785
|
+
`).run(A.eventId,A.kind,_,G,$,U_(K.actor,A.provenance.actor),oG(K.reason)??null,A.occurredAt.toISOString(),JSON.stringify(A.payload))}}function A$(A,_,G){return e.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:g3(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:v0(A.consent.expiresAt),lastEventId:A.eventId})}function j2(A,_,G,$){let K=oG(_.project)??A.scope.project,Z=c3(_.visibility)??A.scope.visibility,Y=sG(_.scope),J={surface:G,targetId:$,project:K,visibility:Z,sourceEventIds:g5(_.sourceEventIds??_.source_event_ids)??A.provenance.sourceIds??[A.eventId],transformationMethod:U_(_.transformationMethod??_.transformation_method,A.provenance.method),actor:U_(_.actor,A.provenance.actor),confidence:F2(_.confidence)??1,redactionState:u3(_.redactionState??_.redaction_state)??A.privacy.redactionState,consentStatus:S2(_.consentStatus??_.consent_status)??A.consent.status,consentScopes:g5(_.consentScopes??_.consent_scopes)??A.consent.scopes,scope:Y??A.scope,status:m3(_.status)??"active",statusReason:oG(_.reason??_.statusReason??_.status_reason),createdAt:v0(_.createdAt??_.created_at)??A.observedAt,updatedAt:A.observedAt,reviewedAt:v0(_.reviewedAt??_.reviewed_at)??null,expiresAt:v0(_.expiresAt??_.expires_at??A.consent.expiresAt)??null,lastEventId:A.eventId};return e.create(J)}function g3(A){let _=sG(A),G=sG(_?.metadata);return F2(G?.confidence)??1}function sG(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)?A:void 0}function U_(A,_){return typeof A==="string"&&A.trim()?A:_}function oG(A){return typeof A==="string"&&A.trim()?A:void 0}function g5(A){if(!Array.isArray(A))return;return A.map((_)=>String(_))}function F2(A){return typeof A==="number"&&Number.isFinite(A)?A:void 0}function v0(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 c3(A){return A==="project"||A==="workspace"||A==="global"?A:void 0}function u3(A){return A==="none"||A==="redacted"||A==="quarantined"?A:void 0}function S2(A){return A==="not_required"||A==="granted"||A==="denied"||A==="revoked"?A:void 0}function m3(A){return A==="active"||A==="pending_review"||A==="suppressed"||A==="invalidated"||A==="expired"?A:void 0}var q_=L(()=>{H_()});var D2={};y(D2,{SqlitePersonaRepository:()=>yA});class yA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
786
|
+
INSERT INTO persona_entries (
|
|
787
|
+
entry_id, kind, content, project, visibility, source_event_ids,
|
|
788
|
+
source_kinds, confidence, scope, review_status, review_after,
|
|
789
|
+
expires_at, why, created_at, updated_at
|
|
790
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
791
|
+
ON CONFLICT(entry_id) DO UPDATE SET
|
|
792
|
+
kind = excluded.kind,
|
|
793
|
+
content = excluded.content,
|
|
794
|
+
project = excluded.project,
|
|
795
|
+
visibility = excluded.visibility,
|
|
796
|
+
source_event_ids = excluded.source_event_ids,
|
|
797
|
+
source_kinds = excluded.source_kinds,
|
|
798
|
+
confidence = excluded.confidence,
|
|
799
|
+
scope = excluded.scope,
|
|
800
|
+
review_status = excluded.review_status,
|
|
801
|
+
review_after = excluded.review_after,
|
|
802
|
+
expires_at = excluded.expires_at,
|
|
803
|
+
why = excluded.why,
|
|
804
|
+
updated_at = excluded.updated_at
|
|
805
|
+
`).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(`
|
|
806
|
+
INSERT INTO persona_entries (
|
|
807
|
+
entry_id, kind, content, project, visibility, source_event_ids,
|
|
808
|
+
source_kinds, confidence, scope, review_status, review_after,
|
|
809
|
+
expires_at, why, created_at, updated_at
|
|
810
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
811
|
+
ON CONFLICT(entry_id) DO UPDATE SET
|
|
812
|
+
kind = excluded.kind,
|
|
813
|
+
content = excluded.content,
|
|
814
|
+
project = excluded.project,
|
|
815
|
+
visibility = excluded.visibility,
|
|
816
|
+
source_event_ids = excluded.source_event_ids,
|
|
817
|
+
source_kinds = excluded.source_kinds,
|
|
818
|
+
confidence = excluded.confidence,
|
|
819
|
+
scope = excluded.scope,
|
|
820
|
+
review_status = excluded.review_status,
|
|
821
|
+
review_after = excluded.review_after,
|
|
822
|
+
expires_at = excluded.expires_at,
|
|
823
|
+
why = excluded.why,
|
|
824
|
+
updated_at = excluded.updated_at
|
|
825
|
+
`).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 SA.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 C_=L(()=>{q0()});var x2={};y(x2,{SqliteGraphRepository:()=>eA});class eA{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
826
|
+
INSERT INTO graph_edges (
|
|
827
|
+
edge_id, source_type, source_id, source_label, target_type, target_id,
|
|
828
|
+
target_label, relationship, project, visibility, source_event_ids,
|
|
829
|
+
source_kinds, confidence, valid_from, valid_to, why, metadata,
|
|
830
|
+
created_at, updated_at
|
|
831
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
832
|
+
ON CONFLICT(edge_id) DO UPDATE SET
|
|
833
|
+
source_type = excluded.source_type,
|
|
834
|
+
source_id = excluded.source_id,
|
|
835
|
+
source_label = excluded.source_label,
|
|
836
|
+
target_type = excluded.target_type,
|
|
837
|
+
target_id = excluded.target_id,
|
|
838
|
+
target_label = excluded.target_label,
|
|
839
|
+
relationship = excluded.relationship,
|
|
840
|
+
project = excluded.project,
|
|
841
|
+
visibility = excluded.visibility,
|
|
842
|
+
source_event_ids = excluded.source_event_ids,
|
|
843
|
+
source_kinds = excluded.source_kinds,
|
|
844
|
+
confidence = excluded.confidence,
|
|
845
|
+
valid_from = excluded.valid_from,
|
|
846
|
+
valid_to = excluded.valid_to,
|
|
847
|
+
why = excluded.why,
|
|
848
|
+
metadata = excluded.metadata,
|
|
849
|
+
updated_at = excluded.updated_at
|
|
850
|
+
`).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(`
|
|
851
|
+
INSERT INTO graph_edges (
|
|
852
|
+
edge_id, source_type, source_id, source_label, target_type, target_id,
|
|
853
|
+
target_label, relationship, project, visibility, source_event_ids,
|
|
854
|
+
source_kinds, confidence, valid_from, valid_to, why, metadata,
|
|
855
|
+
created_at, updated_at
|
|
856
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
857
|
+
ON CONFLICT(edge_id) DO UPDATE SET
|
|
858
|
+
source_type = excluded.source_type,
|
|
859
|
+
source_id = excluded.source_id,
|
|
860
|
+
source_label = excluded.source_label,
|
|
861
|
+
target_type = excluded.target_type,
|
|
862
|
+
target_id = excluded.target_id,
|
|
863
|
+
target_label = excluded.target_label,
|
|
864
|
+
relationship = excluded.relationship,
|
|
865
|
+
project = excluded.project,
|
|
866
|
+
visibility = excluded.visibility,
|
|
867
|
+
source_event_ids = excluded.source_event_ids,
|
|
868
|
+
source_kinds = excluded.source_kinds,
|
|
869
|
+
confidence = excluded.confidence,
|
|
870
|
+
valid_from = excluded.valid_from,
|
|
871
|
+
valid_to = excluded.valid_to,
|
|
872
|
+
why = excluded.why,
|
|
873
|
+
metadata = excluded.metadata,
|
|
874
|
+
updated_at = excluded.updated_at
|
|
875
|
+
`).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(`
|
|
876
|
+
SELECT * FROM graph_edges
|
|
877
|
+
WHERE ${Z.join(" AND ")}
|
|
878
|
+
ORDER BY confidence DESC, updated_at DESC, edge_id ASC
|
|
879
|
+
LIMIT ?
|
|
880
|
+
`).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 pA.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 w0=L(()=>{TG()});var P2={};y(P2,{SqliteMemoryUtilityRepository:()=>f_});class f_{db;constructor(A){this.db=A}async save(A){let _=this.db.prepare(`
|
|
881
|
+
INSERT INTO memory_utility_metrics (
|
|
882
|
+
surface, target_id, project, access_count, last_accessed_at,
|
|
883
|
+
last_ranked_at, utility_score, importance_score, evergreen, pinned,
|
|
884
|
+
half_life_days, metadata, created_at, updated_at
|
|
885
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
886
|
+
ON CONFLICT(surface, target_id) DO UPDATE SET
|
|
887
|
+
project = excluded.project,
|
|
888
|
+
access_count = excluded.access_count,
|
|
889
|
+
last_accessed_at = excluded.last_accessed_at,
|
|
890
|
+
last_ranked_at = excluded.last_ranked_at,
|
|
891
|
+
utility_score = excluded.utility_score,
|
|
892
|
+
importance_score = excluded.importance_score,
|
|
893
|
+
evergreen = excluded.evergreen,
|
|
894
|
+
pinned = excluded.pinned,
|
|
895
|
+
half_life_days = excluded.half_life_days,
|
|
896
|
+
metadata = excluded.metadata,
|
|
897
|
+
updated_at = excluded.updated_at
|
|
898
|
+
`).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(EA.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 EA.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 _$=L(()=>{A5()});var c5=L(()=>{aA();k0();L2();C5();M2();f5();b5();h0();O2();M_();q_();C_();w0();_$()});class C0{db;constructor(A){this.db=A}async search(A,_){let G=_?.limit??20,$=Q_(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)=>BA.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=`
|
|
588
899
|
FROM messages_fts f
|
|
589
900
|
JOIN messages_meta m ON f.rowid = m.rowid
|
|
590
|
-
`;if(
|
|
901
|
+
`;if(G?.projectFilter)Z+=`
|
|
591
902
|
JOIN sessions s ON m.session_id = s.id
|
|
592
|
-
`,
|
|
903
|
+
`,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:`
|
|
593
904
|
SELECT
|
|
594
905
|
m.id,
|
|
595
906
|
m.session_id,
|
|
@@ -598,16 +909,16 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
598
909
|
m.timestamp,
|
|
599
910
|
bm25(messages_fts) as score,
|
|
600
911
|
snippet(messages_fts, 0, '<mark>', '</mark>', '...', 64) as snippet
|
|
601
|
-
${
|
|
602
|
-
WHERE ${
|
|
912
|
+
${Z}
|
|
913
|
+
WHERE ${K.join(" AND ")}
|
|
603
914
|
ORDER BY score
|
|
604
915
|
LIMIT ?
|
|
605
|
-
`,params
|
|
916
|
+
`,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 k2=()=>{};class f0{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,B;try{switch(H.effectiveMode){case"fts":B=await this.ftsSearch(A,_);break;case"vector":B=await this.vectorSearch(A,_);break;case"hybrid":{let T=await this.hybridSearch(A,_);if(B=T.results,T.degraded)Q=!0,X=T.degradationReason}break}}catch(T){if(H.effectiveMode!=="vector"&&!(T instanceof j))B=await this.ftsSearch(A,_),Q=!0,X="provider_failure";else throw T}B=this.applyDecayToResults(B,_);let W=H.degraded||Q,V=X??(H.degraded?H.reason:void 0),M=W&&!H.degraded?"fts":H.effectiveMode,z=performance.now()-G;return this.lastSearchMeta={mode:M,modeReason:W?V??H.reason:H.reason,degraded:W,degradationReason:W?V:void 0,embeddingCoverage:Z,capabilities:J,timingMs:z},B}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 j(R.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(_===0)throw new j(R.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/$),B=Math.max(0,Math.min(1,H.score*X));return{result:H,decayedScore:B}});return J.sort((H,Q)=>Q.decayedScore-H.decayedScore),J.map(({result:H,decayedScore:Q})=>BA.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(($)=>BA.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 j(R.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!_.isReady())await _.initialize();return _}catch(_){if(A){if(_ instanceof j)throw _;throw new j(R.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${N(_)}`)}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 j(R.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let $=this.checkDimensionMismatch(G);if($)throw new j(R.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${$}`);let K=await this.embedQuery(A.value,G),Z=_?.limit??20,Y=Z*y2,J=this.embeddingRepo.vectorKnnSearch(K,Y);if(J.length===0)return[];let H=J.map((B)=>B.rowid),Q=this.hydrateByRowids(H),X=[];for(let B=0;B<J.length&&X.length<Z;B++){let W=J[B];if(!W)continue;let V=Q.get(W.rowid);if(!V)continue;if(!this.passesFilters(V,_))continue;let M=this.vectorSnippet(V.content),z=Math.max(0,Math.min(1,1-W.distance/2));X.push(BA.create({sessionId:V.session_id,messageId:V.id,snippet:M,score:z,timestamp:new Date(V.timestamp),role:V.role,source:"vector",rawScores:{cosine:W.distance}}))}return X}async hybridSearch(A,_){let G=_?.limit??20,$=G*y2,K={..._,limit:$},Z=await this.fts5Service.search(A,K),Y=[],J=null,H=!1,Q;try{if(J=await this.getProvider(!1),J){let U=this.checkDimensionMismatch(J);if(U)J=null,H=!0,Q=U;else{let O=await this.embedQuery(A.value,J);Y=this.embeddingRepo.vectorKnnSearch(O,$)}}else H=!0,Q="provider_unavailable"}catch(U){Y=[],H=!0,Q=`provider_failure: ${N(U)}`}if(Y.length===0&&Z.length>0)return{results:Z.map((O)=>BA.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),B=Z.map((U,O)=>({rowid:X.get(U.messageId)??0,rank:O+1,source:"fts",rawScore:U.score})),W=Y.map((U,O)=>({rowid:U.rowid,rank:O+1,source:"vector",rawScore:U.distance})),V=V5(B,W,G);if(V.length===0)return{results:[],degraded:H,degradationReason:Q};let M=V.map((U)=>U.rowid),z=this.hydrateByRowids(M),T=new Map;for(let U of V){let O=U.sources.some((C)=>C.source==="fts"),k=U.sources.some((C)=>C.source==="vector");if(O&&k)T.set(U.rowid,"both");else if(O)T.set(U.rowid,"fts");else T.set(U.rowid,"vector")}let I=V.map((U)=>({...U,score:U.normalizedScore})),q=[];for(let U of I){let O=z.get(U.rowid);if(!O)continue;if(!this.passesFilters(O,_))continue;let k=T.get(U.rowid)??"fts",C=Z.find((uA)=>uA.messageId===O.id),gA=C?C.snippet:this.vectorSnippet(O.content),B0=Math.max(0,Math.min(1,U.score)),cA={rrf:U.rrfScore};for(let uA of U.sources){if(uA.source==="fts")cA.bm25=uA.rawScore;if(uA.source==="vector")cA.cosine=uA.rawScore}q.push(BA.create({sessionId:O.session_id,messageId:O.id,snippet:gA,score:B0,timestamp:new Date(O.timestamp),role:O.role,source:k,rawScores:cA}))}return{results:q,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
|
|
606
917
|
FROM messages_meta
|
|
607
|
-
WHERE rowid IN (${
|
|
918
|
+
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 y2=4;var h2=L(()=>{O0()});class b_{db;constructor(A){this.db=A}async getStats(A=10){let _=this.db.prepare(`
|
|
608
919
|
SELECT page_size * page_count as size
|
|
609
920
|
FROM pragma_page_count(), pragma_page_size()
|
|
610
|
-
`).get(),
|
|
921
|
+
`).get(),G=this.db.prepare(`
|
|
611
922
|
SELECT
|
|
612
923
|
s.project_name as projectName,
|
|
613
924
|
COUNT(DISTINCT s.id) as sessionCount,
|
|
@@ -617,15 +928,15 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
617
928
|
GROUP BY s.project_name
|
|
618
929
|
ORDER BY sessionCount DESC
|
|
619
930
|
LIMIT ?
|
|
620
|
-
`).all(
|
|
931
|
+
`).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 v2={};y(v2,{SqliteProjectResolver:()=>c_,SqliteContextService:()=>g_});class g_{db;constructor(A){this.db=A}async getProjectContext(A,_={}){let G=_.topicsLimit??10,$=_.toolsLimit??10,K;if(_.days){let T=new Date,I=new Date(T.getFullYear(),T.getMonth(),T.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
|
|
621
932
|
FROM sessions
|
|
622
933
|
WHERE LOWER(project_name) = LOWER(?)
|
|
623
|
-
LIMIT 1`).get(
|
|
934
|
+
LIMIT 1`).get(A)??this.db.prepare(`SELECT project_name, project_path_decoded, project_path_encoded
|
|
624
935
|
FROM sessions
|
|
625
936
|
WHERE project_name LIKE '%' || ? || '%'
|
|
626
937
|
GROUP BY project_name
|
|
627
938
|
ORDER BY COUNT(*) DESC
|
|
628
|
-
LIMIT 1`).get(
|
|
939
|
+
LIMIT 1`).get(A);if(!Z)return null;let Y=Z.project_path_encoded,H=`
|
|
629
940
|
SELECT
|
|
630
941
|
COUNT(DISTINCT s.id) as sessionCount,
|
|
631
942
|
MAX(s.start_time) as lastActivity,
|
|
@@ -634,20 +945,20 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
634
945
|
FROM sessions s
|
|
635
946
|
LEFT JOIN messages_meta m ON m.session_id = s.id
|
|
636
947
|
WHERE s.project_path_encoded = ?
|
|
637
|
-
${
|
|
638
|
-
`,
|
|
948
|
+
${K?"AND s.start_time >= ?":""}
|
|
949
|
+
`,Q=K?this.db.prepare(H).get(Y,K.toISOString()):this.db.prepare(H).get(Y);if(!Q||Q.sessionCount===0)return null;let B=`
|
|
639
950
|
SELECT t.name, COUNT(*) as count
|
|
640
951
|
FROM tool_uses t
|
|
641
952
|
JOIN sessions s ON t.session_id = s.id
|
|
642
953
|
WHERE s.project_path_encoded = ?
|
|
643
|
-
${
|
|
954
|
+
${K?"AND t.timestamp >= ?":""}
|
|
644
955
|
GROUP BY t.name
|
|
645
956
|
ORDER BY count DESC
|
|
646
957
|
LIMIT ?
|
|
647
|
-
`,
|
|
958
|
+
`,W=K?this.db.prepare(B).all(Y,K.toISOString(),$):this.db.prepare(B).all(Y,$),M=`
|
|
648
959
|
SELECT DISTINCT l.target_id as topic
|
|
649
960
|
FROM links l
|
|
650
|
-
${
|
|
961
|
+
${K?`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
|
|
651
962
|
WHERE s.project_path_encoded = ?
|
|
652
963
|
AND l.target_type = 'topic'
|
|
653
964
|
AND s.start_time >= ?`:`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
|
|
@@ -655,299 +966,314 @@ CREATE TABLE IF NOT EXISTS extraction_log (
|
|
|
655
966
|
AND l.target_type = 'topic'`}
|
|
656
967
|
ORDER BY l.weight DESC
|
|
657
968
|
LIMIT ?
|
|
658
|
-
`,
|
|
969
|
+
`,z=K?this.db.prepare(M).all(Y,K.toISOString(),G):this.db.prepare(M).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((T)=>T.topic),recentToolUses:W.map((T)=>({name:T.name,count:T.count})),lastActivity:Q.lastActivity?new Date(Q.lastActivity):null}}}class c_{db;constructor(A){this.db=A}resolveProjectEncoded(A){let _=this.db.prepare(`SELECT DISTINCT project_path_encoded
|
|
659
970
|
FROM sessions
|
|
660
971
|
WHERE LOWER(project_name) = LOWER(?)
|
|
661
|
-
LIMIT 1`).get(
|
|
972
|
+
LIMIT 1`).get(A);if(_)return _.project_path_encoded;return this.db.prepare(`SELECT project_path_encoded
|
|
662
973
|
FROM sessions
|
|
663
974
|
WHERE project_name LIKE '%' || ? || '%'
|
|
664
975
|
GROUP BY project_path_encoded
|
|
665
976
|
ORDER BY COUNT(*) DESC
|
|
666
|
-
LIMIT 1`).get(
|
|
977
|
+
LIMIT 1`).get(A)?.project_path_encoded??null}resolveProjectName(A){let _=this.db.prepare(`SELECT DISTINCT project_name
|
|
667
978
|
FROM sessions
|
|
668
979
|
WHERE LOWER(project_name) = LOWER(?)
|
|
669
|
-
LIMIT 1`).get(
|
|
980
|
+
LIMIT 1`).get(A);if(_)return _.project_name;return this.db.prepare(`SELECT project_name
|
|
670
981
|
FROM sessions
|
|
671
982
|
WHERE project_name LIKE '%' || ? || '%'
|
|
672
983
|
GROUP BY project_name
|
|
673
984
|
ORDER BY COUNT(*) DESC
|
|
674
|
-
LIMIT 1`).get(
|
|
675
|
-
`)}var
|
|
676
|
-
`).filter((
|
|
677
|
-
`),{success:!0,message:"Hooks installed successfully"}}function
|
|
678
|
-
`),{success:!0,message:"Hooks uninstalled successfully"}}function
|
|
985
|
+
LIMIT 1`).get(A)?.project_name??null}}var w2=L(()=>{k2();h2()});var NA,u_;var u5=L(()=>{NA={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}},u_={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var n5={};y(n5,{saveConfig:()=>sA,resolveProviderDefaults:()=>c2,resolveEmbeddingApiKey:()=>g0,loadConfig:()=>g,getConfigPath:()=>d_,getConfigDir:()=>T_,PROVIDER_DEFAULTS:()=>g2,DEFAULT_SEARCH_CONFIG:()=>G$,DEFAULT_REMOTE_SYNC_CONFIG:()=>l5,DEFAULT_PROVIDER_EGRESS_POLICY:()=>a,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>p5,DEFAULT_EMBEDDING_CONFIG:()=>m_,DEFAULT_CONFIG:()=>b0,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>d5});import{randomUUID as m5}from"crypto";import{existsSync as C2,mkdirSync as n3,readFileSync as f2,writeFileSync as i3}from"fs";import{dirname as b2}from"path";function c2(A,_){let G=A.provider;if(G==="local"||!_)return A;let $=g2[G],K={...A};if(!("model"in _))K.model=$?.model??A.model;if(!("dimensions"in _))K.dimensions=$?.dimensions??A.dimensions;return K}function g0(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 T_(A){if(A!==void 0)return b2(A);return z_()}function d_(A){if(A!==void 0)return A;return x0()}function g(A){let _=d_(A);if(!C2(_)){let G=process.env.MEMORY_TEST_MACHINE_ID??m5(),$={...b0,machineId:G};try{sA($,A)}catch{}return $}try{let G=f2(_,"utf-8"),$=JSON.parse(G),K=$.machineId,Z=!1;if(!K)K=process.env.MEMORY_TEST_MACHINE_ID??m5(),Z=!0;let Y=$.embedding,J={...m_,...Y??{}},H={...l5,...$.remoteSync??{}},Q={...a,...$.providerEgress??{},allowedHosts:Array.isArray($.providerEgress?.allowedHosts)?$.providerEgress.allowedHosts.map(String):[...a.allowedHosts],allowedProviders:Array.isArray($.providerEgress?.allowedProviders)?$.providerEgress.allowedProviders.map(String):[...a.allowedProviders]},X={...p5,...$.legacyMemoryFiles??{}},B={...b0,...$,machineId:K,remoteSync:H,providerEgress:Q,legacyMemoryFiles:X,embedding:c2(J,Y),search:{...G$,...$.search??{},temporalDecay:{...G$.temporalDecay,...$.search?.temporalDecay??{}}},ambientContext:{...d5,...$.ambientContext??{}}};if(Z)try{sA(B,A)}catch{}return B}catch{console.warn("Invalid config.json, using defaults");let G=process.env.MEMORY_TEST_MACHINE_ID??m5();return{...b0,machineId:G}}}function sA(A,_){let G=d_(_),$=b2(G);n3($,{recursive:!0});let K={};if(C2(G))try{let Y=f2(G,"utf-8");K=JSON.parse(Y)}catch{}let Z={...K,...A};i3(G,JSON.stringify(Z,null,2)+`
|
|
986
|
+
`)}var G$,d5,l5,a,p5,g2,m_,b0;var $A=L(()=>{f();u5();G$={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},d5={enabled:!0,budget:800},l5={enabled:!1,autoPush:!0,autoPull:!0},a={consent:"unset",allowedHosts:["api.openai.com","api.anthropic.com"],allowedProviders:["anthropic","openai","claude-cli"]},p5={enabled:!1},g2={...NA};m_={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100,maxBatchBytes:800000},b0={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:m_,search:G$,ambientContext:d5,machineId:"",remoteSync:l5,providerEgress:a,legacyMemoryFiles:p5}});var d2={};y(d2,{PatternRedactor:()=>o,PATTERN_REDACTOR_RULE_VERSION:()=>m2});import{createHash as a3}from"crypto";class o{redactText(A){let _=A,G=[];for(let $ of r3)_=_.replace($.pattern,(K)=>{let Z=$.secretValue?.(K)??K,Y=i5($.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"&&e3.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(t3.test(A)&&_.trim()!==""&&!u2.test(_)){let Z=i5(s3(A),_);return G.push(Z),Z.placeholder}return _}redactFlagAdjacentValue(A,_){if(A.trim()===""||u2.test(A))return A;let G=this.redactText(A);if(G.findings.length>0)return _.push(...G.findings),G.text;let $=i5("env_secret",A);return _.push($),$.placeholder}}function i5(A,_){let G=a3("sha256").update(_).digest("hex").slice(0,8);return{kind:A,hash:G,ruleVersion:m2,placeholder:`[REDACTED:${A}:${G}]`}}function s3(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 m2="pattern-redactor-v2",r3,t3,e3,u2;var hA=L(()=>{r3=[{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,"")}],t3=/(?:api[-_]?key|auth[-_]?key|authorization|bearer|token|secret|password|passwd|pwd|credential)/i,e3=/^--?(?:api[-_]?key|auth[-_]?key|token|secret|password|passwd|pwd|credential)$/i,u2=/^\[REDACTED:[a-z_]+(?::[a-f0-9]{8})?\]$/});import{appendFileSync as VW,existsSync as o3,mkdirSync as BW,readFileSync as AY,renameSync as WW,statSync as zW}from"fs";import{dirname as _Y,join as GY}from"path";function l_(A){if(A!==void 0)return _Y(A);return zA()}function l2(A){if(A!==void 0)return A;return GY(zA(),"sync.log")}function p_(A=100,_){let G=l2(_);if(!o3(G))return[];try{let K=AY(G,"utf-8").split(`
|
|
987
|
+
`).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 UW;var $$=L(()=>{f();hA();UW=new o});var a5=L(()=>{f();$5();f5();k0()});var n2=L(()=>{$A();$$();a5()});var i2=L(()=>{$$()});import{copyFileSync as a2,existsSync as c0,mkdirSync as r5,readFileSync as KY,writeFileSync as r2}from"fs";import{dirname as t5,join as e5}from"path";import{homedir as ZY}from"os";function n_(A){return A?.settingsPath??e5(ZY(),".claude","settings.json")}function K$(A){return A?.backupPath??e5(P0(),"settings.json.backup")}function I_(A){return A?.hookScriptPath??e5(rG(),"sync-hook.js")}function i_(A){let _=n_(A);if(!c0(_))return{};try{let G=KY(_,"utf-8");return JSON.parse(G)}catch{return{}}}function t2(A){let _=n_(A),G=K$(A);if(!c0(_))return!1;return r5(t5(G),{recursive:!0}),a2(_,G),!0}function s5(A){let _=n_(A),G=K$(A);if(!c0(G))return!1;return r5(t5(_),{recursive:!0}),a2(G,_),!0}function d0(A){let _=n_(A),G=I_(A);t2(A);let $=i_(A),K=`bun run "${G.replace(/\\/g,"/")}"`;if($.hooks=$.hooks??{},$.hooks.SessionEnd?.some((Y)=>Y.hooks.some((J)=>J.command.includes(u0)||J.command.includes(m0))))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}]}),r5(t5(_),{recursive:!0}),r2(_,JSON.stringify($,null,2)+`
|
|
988
|
+
`),{success:!0,message:"Hooks installed successfully"}}function l0(A){let _=n_(A),G=i_(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(u0)||K.command.includes(m0))),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(u0)||K.command.includes(m0))),G.hooks.PreCompact.length===0)delete G.hooks.PreCompact}if(Object.keys(G.hooks).length===0)delete G.hooks;return r2(_,JSON.stringify(G,null,2)+`
|
|
989
|
+
`),{success:!0,message:"Hooks uninstalled successfully"}}function vA(A){let _=i_(A),G=I_(A),$=K$(A);return{sessionEnd:_.hooks?.SessionEnd?.some((K)=>K.hooks.some((Z)=>Z.command.includes(u0)||Z.command.includes(m0)))??!1,preCompact:_.hooks?.PreCompact?.some((K)=>K.hooks.some((Z)=>Z.command.includes(u0)||Z.command.includes(m0)))??!1,hookScriptExists:c0(G),backupExists:c0($)}}var u0="memory",m0="memory-nexus";var o5=L(()=>{f()});var a_=L(()=>{$A();$$();a5();n2();i2();o5()});class A1{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: ${N(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: ${N(K)}. WASM: ${N(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 IA.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 e2=()=>{};class Z${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 IA.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)=>IA.create({embedding:new Float32Array(K.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var s2=()=>{};class _1{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 $=N(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&&SG(_,"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(($)=>IA.create({embedding:new Float32Array($),model:this.model,dimensions:this.dimensions}))}throwWithHint(A,_,G){if(A===413)throw new FG({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 o2=L(()=>{K5()});function oA(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(`
|
|
679
990
|
|
|
680
991
|
`)].join(`
|
|
681
|
-
`)}function C0($){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 F7 from"@anthropic-ai/sdk";class W4{providerId="anthropic";modelName;anthropic;constructor($){this.modelName=$.model??"claude-3-5-sonnet-20241022",this.anthropic=new F7({apiKey:$.apiKey})}async extract($){if($.length===0)return[];let Z=v0($);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 C0(Y)}catch(K){throw console.error("Anthropic fact extraction API failed:",K),Error(`Anthropic API error: ${K.message}`)}}}var N1=()=>{};import{spawn as M7}from"child_process";class B4{providerId="claude-cli";modelName="claude-cli-print";async extract($){if($.length===0)return[];let Z=v0($);return new Promise((K,X)=>{let Y={...process.env};delete Y.CLAUDECODE;let Q=M7("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(C0(G));else X(Error(`claude -p exited with code ${J}: ${_.trim()}`))}),Q.stdin.write(Z),Q.stdin.end()})}}var q1=()=>{};class z4{providerId="ollama";modelName;baseUrl;constructor($){this.baseUrl=$.baseUrl??"http://localhost:11434",this.modelName=$.model??"llama3"}async extract($){if($.length===0)return[];let Z=v0($);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 C0(Q)}catch(K){throw console.error("Ollama fact extraction API failed:",K),Error(`Ollama API error: ${K.message}`)}}}var O1=()=>{};class yZ{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=v0($);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 C0(Y)}catch(K){throw console.error("OpenAI fact extraction API failed:",K),Error(`OpenAI API error: ${K.message}`)}}}var U1=()=>{};function A$($){return{ready:!0,readyReason:$}}function t$($){return{ready:!1,readyReason:$}}function r$($,Z,K){let X=d$($,Z);if(X.source==="missing")return t$(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 A$("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return A$()}function o$($,Z,K){let X=d$($,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 L1($,Z){if(!$.baseUrl)throw Error(`openai-compatible ${Z} provider requires embedding.baseUrl`);return $.baseUrl}function j7(){return I1.map(($)=>$.id)}function x7(){return T1.map(($)=>$.id)}function M1($){return`Unsupported embedding provider: "${$}". Supported: ${j7().join(", ")}`}function P7($){return`Unsupported extraction provider: "${$}". Supported: ${x7().join(", ")}`}function j1($){let Z=R1.get($.provider);if(!Z)return t$(M1($.provider));return Z.checkReadiness($)}function x1($){let Z=R1.get($.provider);if(!Z)throw Error(M1($.provider));return Z.create($)}function A4($,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 P1($,Z,K=process.env){let X=F1.get(Z);if(!X)return"";return K.LLM_MODEL?.trim()||X.defaultModel}function E1($,Z=A4($)){let K=F1.get(Z);if(!K)return t$(P7(Z));return K.checkReadiness($.embedding)}var I1,T1,R1,F1;var wZ=U(()=>{Z0();B1();z1();A1();N1();q1();O1();U1();t9();I1=[{id:"local",defaultModel:G0.local.model,defaultDimensions:G0.local.dimensions,checkReadiness:()=>A$(),create:($)=>new H4({model:$.model,dimensions:$.dimensions})},{id:"openai",defaultModel:G0.openai.model,defaultDimensions:G0.openai.dimensions,checkReadiness:($)=>r$($,["OPENAI_API_KEY"],"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:($)=>new CZ({apiKey:o$($,["OPENAI_API_KEY"],"OpenAI embedding"),model:$.model,dimensions:$.dimensions,baseUrl:$.baseUrl})},{id:"ollama",defaultModel:G0.ollama.model,defaultDimensions:G0.ollama.dimensions,checkReadiness:()=>A$("Server reachability verified at sync time"),create:($)=>new V4({model:$.model,dimensions:$.dimensions,baseUrl:$.baseUrl})},{id:"openai-compatible",defaultModel:G0["openai-compatible"].model,defaultDimensions:G0["openai-compatible"].dimensions,checkReadiness:($)=>{if(!$.baseUrl)return t$("openai-compatible embedding provider requires embedding.baseUrl");return r$($,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:($)=>new CZ({apiKey:o$($,[],"openai-compatible embedding"),model:$.model,dimensions:$.dimensions,baseUrl:L1($,"embedding"),providerId:"openai-compatible"})}],T1=[{id:"anthropic",defaultModel:_$.anthropic,checkReadiness:($)=>r$($,["ANTHROPIC_API_KEY"],"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:($,Z)=>new W4({apiKey:o$($,["ANTHROPIC_API_KEY"],"Anthropic extraction"),model:Z})},{id:"openai",defaultModel:_$.openai,checkReadiness:($)=>r$($,["OPENAI_API_KEY"],"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:($,Z)=>new yZ({apiKey:o$($,["OPENAI_API_KEY"],"OpenAI extraction"),model:Z})},{id:"ollama",defaultModel:_$.ollama,checkReadiness:()=>A$(),create:($,Z)=>new z4({baseUrl:$.baseUrl,model:Z})},{id:"claude-cli",defaultModel:_$["claude-cli"],checkReadiness:()=>A$(),create:()=>new B4},{id:"openai-compatible",defaultModel:_$["openai-compatible"],checkReadiness:($)=>{if(!$.baseUrl)return t$("openai-compatible extraction provider requires embedding.baseUrl");return r$($,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:($,Z)=>new yZ({apiKey:o$($,[],"openai-compatible extraction"),model:Z,baseUrl:L1($,"extraction"),providerId:"openai-compatible"})}],R1=new Map(I1.map(($)=>[$.id,$])),F1=new Map(T1.map(($)=>[$.id,$]))});import{Database as q4}from"bun:sqlite";import{accessSync as D1,constants as k1,existsSync as O4,statSync as E7}from"fs";import{homedir as D7}from"os";import{join as N4}from"path";function v1($){try{return $.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function s$($){if(!O4($))return{readable:!1,writable:!1};let Z=!1,K=!1;try{D1($,k1.R_OK),Z=!0}catch{}try{D1($,k1.W_OK),K=!0}catch{}return{readable:Z,writable:K}}function C1($,Z,K,X){let Y=X??R0(K),Q=m(Z),_=V$(1,$)[0];return{installed:Y.sessionEnd&&Y.preCompact,enabled:Q.autoSync,lastRun:_?new Date(_.timestamp):null}}function y1($){let Z=[];try{let K=m($);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(!S1.includes(K.logLevel))Z.push(`logLevel "${K.logLevel}" is not valid (expected: ${S1.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 w1(){try{let $=e0("sqlite-vec"),Z=new q4(":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 b1($){let K=m($).embedding,X=j1(K);return{configured:!0,provider:K.provider,model:K.model,dimensions:K.dimensions,enabled:K.enabled,ready:X.ready,readyReason:X.readyReason}}function k7($){let Z=m($),K=A4(Z),X=E1(Z,K);return{provider:K,model:P1(Z,K),ready:X.ready,readyReason:X.readyReason}}function U4($){let Z=$?.dbPath??E(),K=v7(Z),X=$?.configDir??n0(),Y=$?.logsDir??H$(),Q=$?.sourceDir??N4(D7(),".claude","projects"),G=$?.logsDir?N4($.logsDir,"sync.log"):void 0,_=$?.configDir?N4($.configDir,"config.json"):void 0,J=s$(X),H=s$(Y),V=s$(Q),B={configDir:J.readable&&J.writable,logsDir:H.readable&&H.writable,sourceDir:V.readable},z=C1(G,_,$?.hookOverrides,$?.preCalculatedHookStatus),W=y1(_),N=m(_),q=b1(_),I=w1(),F=S7(Z,I,N),L=k7(_);return{database:K,permissions:B,hooks:z,config:W,embedding:q,sqliteVec:I,searchCapability:F,llmExtraction:L}}function S7($,Z,K){let X=0,Y=0;try{if(O4($)){let G=new q4($,{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 v7($){if(!O4($))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let K=s$($),X=0;try{X=E7($).size}catch{}let Y="unknown";if(K.readable)try{let Q=new q4($,{create:!1,readonly:!0});try{Y=v1(Q)}finally{Q.close()}}catch{Y="corrupted"}return{exists:!0,readable:K.readable,writable:K.writable,integrity:Y,size:X}}var S1;var f1=U(()=>{n9();z$();wZ();S1=["debug","info","warn","error"]});var u=U(()=>{g9();n9();o9();e5();f1()});import{readdir as L4,stat as e$}from"fs/promises";import{join as $Z}from"path";import{homedir as C7}from"os";class y0{claudeProjectsDir;resolver;constructor($){this.claudeProjectsDir=$?.claudeDir??$Z(C7(),".claude","projects"),this.resolver=$?.projectNameResolver}async discoverSessions(){let $=[];try{await e$(this.claudeProjectsDir)}catch{return $}let Z;try{Z=await L4(this.claudeProjectsDir)}catch{return $}for(let K of Z){let X=$Z(this.claudeProjectsDir,K);try{if(!(await e$(X)).isDirectory())continue}catch{continue}let Y;try{if(Y=i.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 L4($)}catch{return}for(let Y of X){let Q=$Z($,Y);try{let G=await e$(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=$Z($,"subagents");try{if(!(await e$(X)).isDirectory())return}catch{return}let Y;try{Y=await L4(X)}catch{return}for(let Q of Y){if(!Q.endsWith(".jsonl"))continue;let G=$Z(X,Q);try{let _=await e$(G);if(_.isFile()){let J=Q.slice(0,-6);K.push({id:J,path:G,projectPath:Z,modifiedTime:_.mtime,size:_.size})}}catch{continue}}}}var h1=()=>{};import{readdirSync as y7,statSync as w7}from"fs";function b7($){return $.replace(/ /g,"-").replace(/-/g,"-")}class bZ{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=b7(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 w7($).isDirectory()}catch{return!1}}listSubdirectories($){let Z=this.dirCache.get($);if(Z!==void 0)return Z;try{let X=y7($,{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 g1=()=>{};import{readdir as f7,readFile as h7,stat as g7}from"fs/promises";import{join as m7,relative as c7}from"path";import{createHash as u7}from"crypto";class fZ{async discoverFiles(){let $=MZ();try{await g7($)}catch{return[]}let Z=[];return await this.scanDirectory($,$,Z),Z}async scanDirectory($,Z,K){let X;try{X=await f7($,{withFileTypes:!0})}catch{return}for(let Y of X){let Q=m7($,Y.name);if(Y.isDirectory())await this.scanDirectory(Q,Z,K);else if(Y.isFile()&&Y.name.endsWith(".md")){let G=c7(Z,Q).split("\\").join("/"),_=this.classifyFileType(G);if(!_)continue;let J=await h7(Q,"utf8"),H=u7("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 m1=U(()=>{p()});var ZZ=U(()=>{h1();g1();m1()});function _0($,Z){let K=Z??new Date,X=$.getTime()-K.getTime(),Y=Math.abs(X);if(Y<3600000){let G=Math.round(X/60000);return KZ.format(G,"minute")}if(Y<86400000){let G=Math.round(X/3600000);return KZ.format(G,"hour")}if(Y<604800000){let G=Math.round(X/86400000);return KZ.format(G,"day")}if(Y<2592000000){let G=Math.round(X/604800000);return KZ.format(G,"week")}let Q=Math.round(X/2592000000);return KZ.format(Q,"month")}function i0($){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 U0($,Z){let K=_0($,Z),X=i0($);return`${K} (${X})`}var KZ;var w0=U(()=>{KZ=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function k($){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 O$($,Z,K){if(!K)return $;return`\x1B[${Z}m${$}\x1B[0m`}function r($,Z){return O$($,"1",Z??k())}function P($,Z){return O$($,"2",Z??k())}function b($,Z){return O$($,"32",Z??k())}function f($,Z){return O$($,"31",Z??k())}function d($,Z){return O$($,"33",Z??k())}function s1($,Z){return O$($,"36",Z??k())}import e1 from"string-width";function R4($){return e1($)}function F4($,Z){if(Z<=0)return"";if(R4($)<=Z)return $;let K="...",X=3;if(Z<=X)return".".repeat(Z);let Y=Z-X,Q="",G=0;for(let _ of $){let J=e1(_);if(G+J>Y)break;Q+=_,G+=J}return Q+K}function dZ($,Z){let K=R4($);if(K>=Z)return $;return $+" ".repeat(Z-K)}function M4(){return process.stdout.columns||80}function j4($,Z,K=20){let X=M4(),Y=R4(Z),Q=X-Y;return F4($,Q>K?Q:K)}var x4=()=>{};function pZ($,Z={}){let K=Y3($.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 $3($){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 lZ($){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 Z3($){return{session:lZ($.session),messages:$.messages.map(G6),toolUses:Array.from($.toolUses.values()).map(_6)}}function G6($){return{id:$.id,role:$.role,timestamp:$.timestamp.toISOString(),content:$.content}}function _6($){let Z={id:$.id,name:$.name,status:$.status,input:$.input};if($.result!==void 0)Z.result=$.result;return Z}function K3($){return{session:lZ($.session),weight:$.weight,hops:$.hops}}function P4($){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 X3($){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 b0=U(()=>{nZ()});function E4($,Z){switch($){case"json":return new J3;case"quiet":return new H3;case"verbose":return new V3(Z);case"brief":return new _3;default:return new G3(Z)}}function Y3($){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 Q3($,Z){if(!Z)return $.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return $.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class G3{useColor;constructor($){this.useColor=$}formatResults($,Z){let K=Z?.contextBudget??U$;if($.length===0)return`No results found for: ${Z?.query??"query"}`;let X=`Found ${$.length} result(s):
|
|
682
|
-
|
|
683
|
-
`;for(let
|
|
684
|
-
(Output truncated - ${
|
|
685
|
-
`;break}
|
|
686
|
-
${
|
|
687
|
-
${
|
|
688
|
-
|
|
689
|
-
`}formatError(
|
|
690
|
-
`)}formatError(
|
|
691
|
-
`)}formatError(
|
|
692
|
-
`}if(
|
|
693
|
-
`,
|
|
694
|
-
`;if(
|
|
695
|
-
`;if(
|
|
696
|
-
|
|
697
|
-
`}
|
|
698
|
-
|
|
699
|
-
`;for(let
|
|
700
|
-
(Output truncated - ${
|
|
701
|
-
`;break}
|
|
702
|
-
${
|
|
703
|
-
${
|
|
704
|
-
`;if(
|
|
705
|
-
`;if(
|
|
706
|
-
`}return
|
|
707
|
-
`,
|
|
708
|
-
${
|
|
709
|
-
Found ${
|
|
710
|
-
|
|
711
|
-
`;for(let
|
|
712
|
-
`}formatError(
|
|
713
|
-
`)}formatError(
|
|
714
|
-
`)}formatError(
|
|
715
|
-
`,
|
|
716
|
-
`;if(
|
|
717
|
-
`;
|
|
718
|
-
`}let
|
|
719
|
-
|
|
720
|
-
`;for(let
|
|
721
|
-
`;return
|
|
722
|
-
`,
|
|
723
|
-
`,
|
|
724
|
-
|
|
725
|
-
`,
|
|
726
|
-
${
|
|
727
|
-
`)}formatError(
|
|
992
|
+
`)}function A_(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 YY from"@anthropic-ai/sdk";class G1{providerId="anthropic";modelName;anthropic;constructor(A){this.modelName=A.model??"claude-3-5-sonnet-20241022",this.anthropic=new YY({apiKey:A.apiKey})}async extract(A){if(A.length===0)return[];let _=oA(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 A_(K)}catch(G){throw console.error("Anthropic fact extraction API failed:",G),Error(`Anthropic API error: ${G.message}`)}}}var A6=()=>{};import{spawn as JY}from"child_process";class $1{providerId="claude-cli";modelName="claude-cli-print";async extract(A){if(A.length===0)return[];let _=oA(A);return new Promise((G,$)=>{let K={...process.env};delete K.CLAUDECODE;let Z=JY("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(A_(Y));else $(Error(`claude -p exited with code ${H}: ${J.trim()}`))}),Z.stdin.write(_),Z.stdin.end()})}}var _6=()=>{};class K1{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 _=oA(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 A_(Z)}catch(G){throw console.error("Ollama fact extraction API failed:",G),Error(`Ollama API error: ${G.message}`)}}}var G6=()=>{};class Y${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 _=oA(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 A_(K)}catch(G){throw console.error("OpenAI fact extraction API failed:",G),Error(`OpenAI API error: ${G.message}`)}}}var $6=()=>{};function p0(A,_=a){let G=HY(A);return Y6({capability:"embedding",provider:A.provider,policy:_,target:G})}function J$(A,_){let G=A.providerEgress??a,$=QY(_,A.embedding);return Y6({capability:"extraction",provider:_,policy:G,target:$})}function Z6(A){if(!A.allowed)throw Error(A.reason??"Provider egress is not allowed by policy")}function Y6(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 HY(A){switch(A.provider){case"local":return{required:!1,target:"local"};case"ollama":return O_(A.baseUrl??"http://localhost:11434","ollama");case"openai":return O_(A.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return O_(A.baseUrl,"openai-compatible");default:return{required:!0,target:A.provider}}}function QY(A,_){switch(A){case"ollama":return O_(_.baseUrl??"http://localhost:11434","ollama");case"anthropic":return O_("https://api.anthropic.com","anthropic");case"openai":return O_(_.baseUrl??"https://api.openai.com/v1","openai");case"openai-compatible":return O_(_.baseUrl,"openai-compatible");case"claude-cli":return{required:!0,target:"claude-cli"};default:return{required:!0,target:A}}}function O_(A,_){if(!A)return{required:!0,target:_};try{let $=new URL(A).hostname;return{required:!K6($),target:$,host:!K6($)?$:void 0}}catch{return{required:!0,target:_}}}function K6(A){let _=A.toLowerCase();return _==="localhost"||_==="127.0.0.1"||_==="::1"||_.endsWith(".localhost")}var Mz,Uz;var Z1=L(()=>{$A();Mz=[...a.allowedHosts],Uz=[...a.allowedProviders]});function t_(A){return{ready:!0,readyReason:A}}function R_(A){return{ready:!1,readyReason:A}}function n0(A,_,G){let $=g0(A,_);if($.source==="missing")return R_($.ref?"API key reference configured but not available at runtime; run through a secret injector or set embedding.apiKeyEnv":G);if($.deprecatedPlaintext)return t_("Using deprecated plaintext config; prefer environment injection or embedding.apiKeyEnv");return t_()}function i0(A,_,G){let $=g0(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 J6(A,_){if(!A.baseUrl)throw Error(`openai-compatible ${_} provider requires embedding.baseUrl`);return A.baseUrl}function XY(){return H6.map((A)=>A.id)}function VY(){return Q6.map((A)=>A.id)}function X6(A){return`Unsupported embedding provider: "${A}". Supported: ${XY().join(", ")}`}function BY(A){return`Unsupported extraction provider: "${A}". Supported: ${VY().join(", ")}`}function V6(A){return[...J1.get(A)?.secretEnvVars??[]]}function B6(A){return[...H1.get(A)?.secretEnvVars??[]]}function W6(A,_=a){let G=J1.get(A.provider);if(!G)return R_(X6(A.provider));let $=G.checkReadiness(A);if(!$.ready)return $;let K=p0(A,_);if(!K.allowed)return R_(K.reason??"Provider egress is not allowed by policy");return $}function z6(A,_=a){let G=J1.get(A.provider);if(!G)throw Error(X6(A.provider));if(G.checkReadiness(A).ready)Z6(p0(A,_));return G.create(A)}function e_(A,_=process.env){let G=_.LLM_PROVIDER?.trim();if(G)return G;let $=A.embedding?.provider??"claude-cli";return $==="local"?"claude-cli":$}function N6(A,_,G=process.env){let $=H1.get(_);if(!$)return"";return G.LLM_MODEL?.trim()||$.defaultModel}function L6(A,_=e_(A)){let G=H1.get(_);if(!G)return R_(BY(_));let $=G.checkReadiness(A.embedding);if(!$.ready)return $;let K=J$(A,_);if(!K.allowed)return R_(K.reason??"Provider egress is not allowed by policy");return $}var r_,Y1,H6,Q6,J1,H1;var a0=L(()=>{$A();e2();s2();o2();A6();_6();G6();$6();u5();Z1();r_=["OPENAI_API_KEY"],Y1=["ANTHROPIC_API_KEY"],H6=[{id:"local",defaultModel:NA.local.model,defaultDimensions:NA.local.dimensions,secretEnvVars:[],checkReadiness:()=>t_(),create:(A)=>new A1({model:A.model,dimensions:A.dimensions})},{id:"openai",defaultModel:NA.openai.model,defaultDimensions:NA.openai.dimensions,secretEnvVars:r_,checkReadiness:(A)=>n0(A,r_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A)=>new Z$({apiKey:i0(A,r_,"OpenAI embedding"),model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"ollama",defaultModel:NA.ollama.model,defaultDimensions:NA.ollama.dimensions,secretEnvVars:[],checkReadiness:()=>t_("Server reachability verified at sync time"),create:(A)=>new _1({model:A.model,dimensions:A.dimensions,baseUrl:A.baseUrl})},{id:"openai-compatible",defaultModel:NA["openai-compatible"].model,defaultDimensions:NA["openai-compatible"].dimensions,secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return R_("openai-compatible embedding provider requires embedding.baseUrl");return n0(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A)=>new Z$({apiKey:i0(A,[],"openai-compatible embedding"),model:A.model,dimensions:A.dimensions,baseUrl:J6(A,"embedding"),providerId:"openai-compatible"})}],Q6=[{id:"anthropic",defaultModel:u_.anthropic,secretEnvVars:Y1,checkReadiness:(A)=>n0(A,Y1,"API key not available at runtime; set ANTHROPIC_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new G1({apiKey:i0(A,Y1,"Anthropic extraction"),model:_})},{id:"openai",defaultModel:u_.openai,secretEnvVars:r_,checkReadiness:(A)=>n0(A,r_,"API key not available at runtime; set OPENAI_API_KEY or embedding.apiKeyEnv"),create:(A,_)=>new Y$({apiKey:i0(A,r_,"OpenAI extraction"),model:_})},{id:"ollama",defaultModel:u_.ollama,secretEnvVars:[],checkReadiness:()=>t_(),create:(A,_)=>new K1({baseUrl:A.baseUrl,model:_})},{id:"claude-cli",defaultModel:u_["claude-cli"],secretEnvVars:[],checkReadiness:()=>t_(),create:()=>new $1},{id:"openai-compatible",defaultModel:u_["openai-compatible"],secretEnvVars:[],checkReadiness:(A)=>{if(!A.baseUrl)return R_("openai-compatible extraction provider requires embedding.baseUrl");return n0(A,[],"API key not available at runtime; set embedding.apiKeyEnv for openai-compatible")},create:(A,_)=>new Y$({apiKey:i0(A,[],"openai-compatible extraction"),model:_,baseUrl:J6(A,"extraction"),providerId:"openai-compatible"})}],J1=new Map(H6.map((A)=>[A.id,A])),H1=new Map(Q6.map((A)=>[A.id,A]))});import{createHash as WY}from"crypto";import{existsSync as zY}from"fs";import{delimiter as NY,join as LY}from"path";function Q1(A,_={}){let G=_.env??process.env,$=_.commandResolver??((Y)=>jY(Y,G,_.platform)),K=MY(A,G),Z=new Map;for(let Y of M6){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 H$(A){let _=WY("sha256").update(A).digest("hex").slice(0,12),G=UY(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 MY(A,_){let G=A.embedding.apiKeyRef;if(!G)return[];let $=H$(G),K=TY(A,_),Z=OY(K.source);return[{source:"embedding.apiKeyRef",provider:$.provider,scheme:$.scheme,maskedReference:$.maskedReference,fingerprint:$.fingerprint,runtimeSecretSource:K.source,envVar:K.envVar,status:Z,note:RY(Z)}]}function UY(A){let _=/^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(A);if(!_?.[1])return null;let G=_[1].toLowerCase(),$=qY(G);return{scheme:G,provider:$}}function qY(A){return M6.find((G)=>G.schemes.includes(A))?.provider??A}function TY(A,_){let G=IY(A,_);for(let $ of G)if(_[$])return{source:"environment",envVar:$};if(A.embedding.apiKey)return{source:"plaintext-config"};return{source:"missing"}}function IY(A,_){let G=new Set;if(A.embedding.apiKeyEnv)G.add(A.embedding.apiKeyEnv);for(let K of V6(A.embedding.provider))G.add(K);let $=e_(A,_);for(let K of B6($))G.add(K);return Array.from(G)}function OY(A){switch(A){case"environment":return"env_available";case"plaintext-config":return"plaintext_config_deprecated";case"missing":return"reference_only"}}function RY(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 jY(A,_,G=process.platform){let $=_.PATH??"";if(!$)return null;let K=G==="win32"?FY(_.PATHEXT):[""];for(let Z of $.split(NY)){if(!Z)continue;for(let Y of K){let J=LY(Z,`${A}${Y}`);if(zY(J))return J}}return null}function FY(A){let _=A?.split(";").filter((G)=>G.trim()!=="");return _&&_.length>0?_:[".EXE",".CMD",".BAT",".COM"]}var M6;var U6=L(()=>{a0();M6=[{provider:"authkey",schemes:["authkey"],command:"authkey",optional:!0,allowedSignals:["env-injection","masked-metadata","proofs","fingerprints"]}]});var X1=L(()=>{U6()});import{Database as B1}from"bun:sqlite";import{accessSync as q6,constants as T6,existsSync as X$,readFileSync as SY,statSync as EY}from"fs";import{homedir as DY}from"os";import{join as V1}from"path";function j6(A){try{return A.query("PRAGMA quick_check(1);").get()?.quick_check==="ok"?"ok":"corrupted"}catch{return"corrupted"}}function r0(A){if(!X$(A))return{readable:!1,writable:!1};let _=!1,G=!1;try{q6(A,T6.R_OK),_=!0}catch{}try{q6(A,T6.W_OK),G=!0}catch{}return{readable:_,writable:G}}function F6(A,_,G,$){let K=$??vA(G),Z=g(_),J=p_(1,A)[0];return{installed:K.sessionEnd&&K.preCompact,enabled:Z.autoSync,lastRun:J?new Date(J.timestamp):null}}function S6(A){let _=[];try{let G=xY(A),$=g(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(!I6.includes($.logLevel))_.push(`logLevel "${$.logLevel}" is not valid (expected: ${I6.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(!Q$.includes($.providerEgress.consent))_.push(`providerEgress.consent "${$.providerEgress.consent}" is not valid (expected: ${Q$.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 $=N(G);return _.push(`Failed to load config: ${$}`),{valid:!1,issues:_}}}function xY(A){let _=[],G=d_(A);if(!X$(G))return _;try{let $=JSON.parse(SY(G,"utf-8"));if(!R6($)||$.providerEgress===void 0)return _;let K=$.providerEgress;if(!R6(K))return["providerEgress must be an object"];if("consent"in K&&(typeof K.consent!=="string"||!Q$.includes(K.consent)))_.push(`providerEgress.consent "${String(K.consent)}" is not valid (expected: ${Q$.join(", ")})`);if("allowedHosts"in K&&!O6(K.allowedHosts))_.push("providerEgress.allowedHosts must be an array of non-empty strings");if("allowedProviders"in K&&!O6(K.allowedProviders))_.push("providerEgress.allowedProviders must be an array of non-empty strings")}catch{return _}return _}function O6(A){return Array.isArray(A)&&A.every((_)=>typeof _==="string"&&_.trim()!=="")}function R6(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function E6(){try{let A=x_("sqlite-vec"),_=new B1(":memory:");try{return A.load(_),{available:!0,version:_.query("SELECT vec_version()").get()["vec_version()"]}}finally{_.close()}}catch{return{available:!1,version:null}}}function D6(A){let _=g(A),G=_.embedding,$=W6(G,_.providerEgress);return{configured:!0,provider:G.provider,model:G.model,dimensions:G.dimensions,enabled:G.enabled,ready:$.ready,readyReason:$.readyReason}}function PY(A){let _=g(A),G=e_(_),$=L6(_,G);return{provider:G,model:N6(_,G),ready:$.ready,readyReason:$.readyReason}}function x6(A){let _=g(A),G=e_(_),$=_.embedding.enabled?p0(_.embedding,_.providerEgress):{required:!1,allowed:!0,target:"disabled",capability:"embedding",provider:_.embedding.provider,warnings:[]},K=J$(_,G);return{consent:_.providerEgress.consent,embedding:$,llmExtraction:K,warnings:[...$.warnings,...K.warnings]}}function W1(A){let _=A?.dbPath??S(),G=yY(_),$=A?.configDir??T_(),K=A?.logsDir??l_(),Z=A?.sourceDir??V1(DY(),".claude","projects"),Y=A?.logsDir?V1(A.logsDir,"sync.log"):void 0,J=A?.configDir?V1(A.configDir,"config.json"):void 0,H=r0($),Q=r0(K),X=r0(Z),B={configDir:H.readable&&H.writable,logsDir:Q.readable&&Q.writable,sourceDir:X.readable},W=F6(Y,J,A?.hookOverrides,A?.preCalculatedHookStatus),V=S6(J),M=g(J),z=D6(J),T=E6(),I=kY(_,T,M),q=PY(J),U=x6(J),O=Q1(M,A?.capabilityInterop);return{database:G,permissions:B,hooks:W,config:V,embedding:z,sqliteVec:T,searchCapability:I,llmExtraction:q,providerEgress:U,capabilityInterop:O}}function kY(A,_,G){let $=0,K=0;try{if(X$(A)){let Y=new B1(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 yY(A){if(!X$(A))return{exists:!1,readable:!1,writable:!1,integrity:"unknown",size:0};let G=r0(A),$=0;try{$=EY(A).size}catch{}let K="unknown";if(G.readable)try{let Z=new B1(A,{create:!1,readonly:!0});try{K=j6(Z)}finally{Z.close()}}catch{K="corrupted"}return{exists:!0,readable:G.readable,writable:G.writable,integrity:K,size:$}}var I6,Q$;var P6=L(()=>{w5();a_();a0();Z1();X1();I6=["debug","info","warn","error"],Q$=["unset","granted","denied"]});var c=L(()=>{P5();w5();c5();w2();P6()});import{readdir as z1,stat as t0}from"fs/promises";import{join as e0}from"path";import{homedir as hY}from"os";class __{claudeProjectsDir;resolver;constructor(A){this.claudeProjectsDir=A?.claudeDir??e0(hY(),".claude","projects"),this.resolver=A?.projectNameResolver}async discoverSessions(){let A=[];try{await t0(this.claudeProjectsDir)}catch{return A}let _;try{_=await z1(this.claudeProjectsDir)}catch{return A}for(let G of _){let $=e0(this.claudeProjectsDir,G);try{if(!(await t0($)).isDirectory())continue}catch{continue}let K;try{if(K=s.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 z1(A)}catch{return}for(let K of $){let Z=e0(A,K);try{let Y=await t0(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 $=e0(A,"subagents");try{if(!(await t0($)).isDirectory())return}catch{return}let K;try{K=await z1($)}catch{return}for(let Z of K){if(!Z.endsWith(".jsonl"))continue;let Y=e0($,Z);try{let J=await t0(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 k6=()=>{};import{readdirSync as vY,statSync as wY}from"fs";function CY(A){return A.replace(/ /g,"-").replace(/-/g,"-")}class V${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=CY(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 wY(A).isDirectory()}catch{return!1}}listSubdirectories(A){let _=this.dirCache.get(A);if(_!==void 0)return _;try{let $=vY(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 y6=()=>{};import{readdir as fY,readFile as bY,stat as gY}from"fs/promises";import{join as cY,relative as uY}from"path";import{createHash as mY}from"crypto";class B${async discoverFiles(){let A=D0();try{await gY(A)}catch{return[]}let _=[];return await this.scanDirectory(A,A,_),_}async scanDirectory(A,_,G){let $;try{$=await fY(A,{withFileTypes:!0})}catch{return}for(let K of $){let Z=cY(A,K.name);if(K.isDirectory())await this.scanDirectory(Z,_,G);else if(K.isFile()&&K.name.endsWith(".md")){let Y=uY(_,Z).split("\\").join("/"),J=this.classifyFileType(Y);if(!J)continue;let H=await bY(Z,"utf8"),Q=mY("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 h6=L(()=>{f()});var s0=L(()=>{k6();y6();h6()});function LA(A,_){let G=_??new Date,$=A.getTime()-G.getTime(),K=Math.abs($);if(K<3600000){let Y=Math.round($/60000);return o0.format(Y,"minute")}if(K<86400000){let Y=Math.round($/3600000);return o0.format(Y,"hour")}if(K<604800000){let Y=Math.round($/86400000);return o0.format(Y,"day")}if(K<2592000000){let Y=Math.round($/604800000);return o0.format(Y,"week")}let Z=Math.round($/2592000000);return o0.format(Z,"month")}function j_(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 jA(A,_){let G=LA(A,_),$=j_(A);return`${G} (${$})`}var o0;var G_=L(()=>{o0=new Intl.RelativeTimeFormat("en",{numeric:"auto",style:"long"})});function h(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 A0(A,_,G){if(!G)return A;return`\x1B[${_}m${A}\x1B[0m`}function AA(A,_){return A0(A,"1",_??h())}function E(A,_){return A0(A,"2",_??h())}function b(A,_){return A0(A,"32",_??h())}function u(A,_){return A0(A,"31",_??h())}function m(A,_){return A0(A,"33",_??h())}function p6(A,_){return A0(A,"36",_??h())}import n6 from"string-width";function M1(A){return n6(A)}function U1(A,_){if(_<=0)return"";if(M1(A)<=_)return A;let G="...",$=3;if(_<=$)return".".repeat(_);let K=_-$,Z="",Y=0;for(let J of A){let H=n6(J);if(Y+H>K)break;Z+=J,Y+=H}return Z+G}function U$(A,_){let G=M1(A);if(G>=_)return A;return A+" ".repeat(_-G)}function q1(){return process.stdout.columns||80}function T1(A,_,G=20){let $=q1(),K=M1(_),Z=$-K;return U1(A,Z>G?Z:G)}var I1=()=>{};function q$(A,_={}){let G=e6(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 i6(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 T$(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 a6(A){return{session:T$(A.session),messages:A.messages.map(Y7),toolUses:Array.from(A.toolUses.values()).map(J7)}}function Y7(A){return{id:A.id,role:A.role,timestamp:A.timestamp.toISOString(),content:A.content}}function J7(A){let _={id:A.id,name:A.name,status:A.status,input:A.input};if(A.result!==void 0)_.result=A.result;return _}function r6(A){return{session:T$(A.session),weight:A.weight,hops:A.hops}}function O1(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 t6(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 $_=L(()=>{I$()});function R1(A,_){switch(A){case"json":return new _4;case"quiet":return new G4;case"verbose":return new $4(_);case"brief":return new A4;default:return new o6(_)}}function e6(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 s6(A,_){if(!_)return A.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*");return A.replace(/<mark>/g,"\x1B[1;36m").replace(/<\/mark>/g,"\x1B[0m")}class o6{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??_0;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $=`Found ${A.length} result(s):
|
|
993
|
+
|
|
994
|
+
`;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){$+=`
|
|
995
|
+
(Output truncated - ${_0.toLocaleString()} char limit)
|
|
996
|
+
`;break}$+=Y}return $}formatResult(A,_){let G=(A.score*100).toFixed(0),$=A.sessionId.substring(0,16),K=jA(A.timestamp),Z=s6(A.snippet,this.useColor),Y=A.role.charAt(0).toUpperCase()+A.role.slice(1),J=T1(Z," ");return`${_}. [${G}%] [${Y}] ${$}...
|
|
997
|
+
${K}
|
|
998
|
+
${J}
|
|
999
|
+
|
|
1000
|
+
`}formatError(A){return`Error: ${N(A)}`}formatSummary(A){let _=`Found ${A.found} results (showing ${A.shown})`;if(A.truncated)_+=" - truncated";return _}}class A4{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(`
|
|
1001
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatSummary(A){return""}}class _4{formatResults(A,_){let G=_?.contextBudget??_0,$=A.map((Z,Y)=>q$(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 _=N(A);return JSON.stringify({error:_})}formatSummary(A){return""}}class G4{formatResults(A,_){if(A.length===0)return"";let G=q1();return A.map(($)=>{let K=$.sessionId.substring(0,16),Z=$.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),Y=`${K} ${Z}`;return U1(Y,G)}).join(`
|
|
1002
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatSummary(A){return""}}class $4{useColor;constructor(A){this.useColor=A}formatResults(A,_){let G=_?.contextBudget??_0;if(A.length===0)return`No results found for: ${_?.query??"query"}`;let $="";if(_?.searchMeta){if($+=`Mode: ${_.searchMeta.mode}`,_.searchMeta.degraded)$+=` (degraded: ${_.searchMeta.degradationReason??"unknown"})`;$+=`
|
|
1003
|
+
`}if(_?.executionDetails){let K=_.executionDetails;if($+=`=== Execution Details ===
|
|
1004
|
+
`,K.timeMs!==void 0)$+=`Time: ${K.timeMs}ms
|
|
1005
|
+
`;if(K.ftsQuery)$+=`FTS5 Query: ${K.ftsQuery}
|
|
1006
|
+
`;if(K.filtersApplied&&K.filtersApplied.length>0)$+=`Filters: ${K.filtersApplied.join(", ")}
|
|
1007
|
+
`;$+=`
|
|
1008
|
+
`}$+=`Found ${A.length} result(s):
|
|
1009
|
+
|
|
1010
|
+
`;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){$+=`
|
|
1011
|
+
(Output truncated - ${_0.toLocaleString()} char limit)
|
|
1012
|
+
`;break}$+=Y}return $}formatResult(A,_,G){let $=(A.score*100).toFixed(0),K=jA(A.timestamp),Z=s6(A.snippet,this.useColor),Y=A.role.charAt(0).toUpperCase()+A.role.slice(1),J=T1(Z," "),H=`${_}. [${$}%] [${Y}] ${A.sessionId}
|
|
1013
|
+
${K}
|
|
1014
|
+
${J}
|
|
1015
|
+
`;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(", ")}
|
|
1016
|
+
`;if(A.source)H+=` Source: ${A.source}
|
|
1017
|
+
`}return H+=`
|
|
1018
|
+
`,H}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1019
|
+
${G??""}`}formatSummary(A){let _=`=== Summary ===
|
|
1020
|
+
Found ${A.found} results (showing ${A.shown})`;if(A.truncated)_+=" - truncated due to context budget";return _}}var _0=50000;var I$=L(()=>{G_();I1();$_()});function j1(A,_){switch(A){case"json":return new Y4;case"quiet":return new J4;case"verbose":return new H4(_);case"brief":return new Z4;default:return new K4(_)}}function O$(A,_,G){return A===1?_:G}class K4{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G=A.length,$=`Sessions (${G} ${O$(G,"result","results")}):
|
|
1021
|
+
|
|
1022
|
+
`;for(let K of A)$+=this.formatSession(K);return $}formatSession(A){let _=A.id.substring(0,8),G=A.projectPath.projectName,$=LA(A.startTime),K=A.messageCount,Z=`${K} ${O$(K,"message","messages")}`,Y=U$(_,10),J=U$(G,20),H=U$($,18);return` ${Y}${J}${H}${E(Z,this.useColor)}
|
|
1023
|
+
`}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}class Z4{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=LA(G.startTime);return`${$} ${K} ${Z} ${Y}`}).join(`
|
|
1024
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return"No sessions found."}}class Y4{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 _=N(A);return JSON.stringify({error:_})}formatEmpty(){return"[]"}}class J4{formatSessions(A,_){if(A.length===0)return"";return A.map((G)=>G.id).join(`
|
|
1025
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return""}}class H4{useColor;constructor(A){this.useColor=A}formatSessions(A,_){let G="";if(_){if(G+=`=== Execution Details ===
|
|
1026
|
+
`,_.executionTimeMs!==void 0)G+=`Time: ${_.executionTimeMs}ms
|
|
1027
|
+
`;if(_.filtersApplied&&_.filtersApplied.length>0)G+=`Filters: ${_.filtersApplied.join(", ")}
|
|
1028
|
+
`;G+=`
|
|
1029
|
+
`}let $=A.length;G+=`Sessions (${$} ${O$($,"result","results")}):
|
|
1030
|
+
|
|
1031
|
+
`;for(let K of A)G+=this.formatSession(K);return G}formatSession(A){let _=A.projectPath.projectName,G=A.projectPath.decoded,$=jA(A.startTime),K=A.messageCount,Z=`${K} ${O$(K,"message","messages")}`,Y=` ${A.id}
|
|
1032
|
+
`;return Y+=` Project: ${_} (${G})
|
|
1033
|
+
`,Y+=` Started: ${$}
|
|
1034
|
+
`,Y+=` ${E(Z,this.useColor)}
|
|
1035
|
+
|
|
1036
|
+
`,Y}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1037
|
+
${G??""}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}var F1=L(()=>{G_();I1()});function S1(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 _A(A){return new Intl.NumberFormat("en-US").format(A)}function E1(A,_){switch(A){case"json":return new V4;case"quiet":return new B4;case"verbose":return new W4(_);case"brief":return new Q4;default:return new X4(_)}}class Q4{formatStats(A,_){return[`${_A(A.totalSessions)} sessions`,`${_A(A.totalMessages)} messages`,`${_A(A.totalToolUses)} tool uses`,`${_A(A.projectBreakdown.length)} projects`,`${S1(A.databaseSizeBytes)}`].join(`
|
|
1038
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return`0 sessions
|
|
728
1039
|
0 messages
|
|
729
1040
|
0 tool uses
|
|
730
1041
|
0 projects
|
|
731
|
-
0 B`}}class
|
|
732
|
-
|
|
733
|
-
`,
|
|
734
|
-
`,
|
|
735
|
-
`,
|
|
736
|
-
`,
|
|
737
|
-
`,
|
|
738
|
-
|
|
1042
|
+
0 B`}}class X4{constructor(A){}formatStats(A,_){let G="";if(G+=`=== Database Statistics ===
|
|
1043
|
+
|
|
1044
|
+
`,G+=`Totals:
|
|
1045
|
+
`,G+=` Sessions: ${_A(A.totalSessions)}
|
|
1046
|
+
`,G+=` Messages: ${_A(A.totalMessages)}
|
|
1047
|
+
`,G+=` Tool Uses: ${_A(A.totalToolUses)}
|
|
1048
|
+
`,G+=` Size: ${S1(A.databaseSizeBytes)}
|
|
1049
|
+
`,A.projectBreakdown.length>0){G+=`
|
|
739
1050
|
Projects:
|
|
740
|
-
`;for(let
|
|
741
|
-
`,
|
|
742
|
-
`}if(
|
|
1051
|
+
`;for(let $ of A.projectBreakdown)G+=` ${$.projectName}
|
|
1052
|
+
`,G+=` Sessions: ${_A($.sessionCount)}`,G+=`, Messages: ${_A($.messageCount)}
|
|
1053
|
+
`}if(A.hooks){if(G+=`
|
|
743
1054
|
Hooks:
|
|
744
|
-
`,
|
|
745
|
-
`,
|
|
746
|
-
`,
|
|
747
|
-
|
|
1055
|
+
`,G+=` Installed: ${A.hooks.installed?"yes":"no"}
|
|
1056
|
+
`,G+=` Auto-sync: ${A.hooks.autoSync?"enabled":"disabled"}
|
|
1057
|
+
`,G+=` Pending sessions: ${A.hooks.pendingSessions}
|
|
1058
|
+
`,!A.hooks.installed)G+=`
|
|
748
1059
|
Run 'aidev memory install' to enable automatic sync
|
|
749
|
-
`}return
|
|
750
|
-
`)}formatError(
|
|
1060
|
+
`}return G}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}class V4{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 _=N(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 B4{formatStats(A,_){return[`Sessions: ${A.totalSessions}`,`Messages: ${A.totalMessages}`,`Tool uses: ${A.totalToolUses}`,`Size: ${A.databaseSizeBytes}`].join(`
|
|
1061
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatEmpty(){return`Sessions: 0
|
|
751
1062
|
Messages: 0
|
|
752
1063
|
Tool uses: 0
|
|
753
|
-
Size: 0`}}class
|
|
754
|
-
`,
|
|
755
|
-
|
|
756
|
-
`;if(
|
|
757
|
-
|
|
758
|
-
`,
|
|
759
|
-
`,
|
|
760
|
-
`,
|
|
761
|
-
`,
|
|
762
|
-
`,
|
|
763
|
-
|
|
764
|
-
Projects (${
|
|
765
|
-
`;for(let
|
|
766
|
-
`,
|
|
767
|
-
`}}if(
|
|
1064
|
+
Size: 0`}}class W4{constructor(A){}formatStats(A,_){let G="";if(_?.executionTimeMs!==void 0)G+=`=== Execution Details ===
|
|
1065
|
+
`,G+=`Time: ${_.executionTimeMs}ms
|
|
1066
|
+
|
|
1067
|
+
`;if(G+=`=== Database Statistics ===
|
|
1068
|
+
|
|
1069
|
+
`,G+=`Totals:
|
|
1070
|
+
`,G+=` Sessions: ${_A(A.totalSessions)}
|
|
1071
|
+
`,G+=` Messages: ${_A(A.totalMessages)}
|
|
1072
|
+
`,G+=` Tool Uses: ${_A(A.totalToolUses)}
|
|
1073
|
+
`,G+=` Size: ${S1(A.databaseSizeBytes)} (${_A(A.databaseSizeBytes)} bytes)
|
|
1074
|
+
`,A.projectBreakdown.length>0){G+=`
|
|
1075
|
+
Projects (${A.projectBreakdown.length}):
|
|
1076
|
+
`;for(let $ of A.projectBreakdown){let K=$.sessionCount>0?($.messageCount/$.sessionCount).toFixed(1):"0";G+=` ${$.projectName}
|
|
1077
|
+
`,G+=` Sessions: ${_A($.sessionCount)}`,G+=`, Messages: ${_A($.messageCount)}`,G+=` (avg ${K}/session)
|
|
1078
|
+
`}}if(A.hooks){if(G+=`
|
|
768
1079
|
Hooks:
|
|
769
|
-
`,
|
|
770
|
-
`,
|
|
771
|
-
`,
|
|
772
|
-
|
|
1080
|
+
`,G+=` Installed: ${A.hooks.installed?"yes":"no"}
|
|
1081
|
+
`,G+=` Auto-sync: ${A.hooks.autoSync?"enabled":"disabled"}
|
|
1082
|
+
`,G+=` Pending sessions: ${A.hooks.pendingSessions}
|
|
1083
|
+
`,!A.hooks.installed)G+=`
|
|
773
1084
|
Run 'aidev memory install' to enable automatic sync
|
|
774
|
-
`}return
|
|
775
|
-
${
|
|
776
|
-
|
|
777
|
-
`).trim()}var
|
|
778
|
-
`;let
|
|
779
|
-
`;let
|
|
780
|
-
`;let
|
|
781
|
-
`;return
|
|
782
|
-
`,
|
|
783
|
-
|
|
784
|
-
`,
|
|
785
|
-
`,
|
|
786
|
-
`,
|
|
787
|
-
|
|
788
|
-
`;else
|
|
789
|
-
`;if(
|
|
1085
|
+
`}return G}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1086
|
+
${G??""}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}var D1=()=>{};function z4(A){return A.replace(H7,"")}function t(A){return z4(A).replace(/\n{3,}/g,`
|
|
1087
|
+
|
|
1088
|
+
`).trim()}var H7;var wA=L(()=>{H7=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?\x07|\x1b\(B/g});var q4={};y(q4,{createContextFormatter:()=>R$});function R$(A,_){switch(A){case"json":return new N4;case"quiet":return new L4;case"verbose":return new M4(_);case"detailed":return new P1(_);case"ai":return new U4;case"brief":case"default":default:return new x1(_)}}function K_(A){return new Intl.NumberFormat("en-US").format(A)}function Q7(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 X7(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 x1{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";G+=AA(`${A.projectName} Context`,this.useColor)+`
|
|
1089
|
+
`;let $=A.lastActivity?LA(A.lastActivity):"never";G+=`Sessions: ${K_(A.sessionCount)} | `,G+=`Messages: ${K_(A.totalMessages)} | `,G+=`Last active: ${$}
|
|
1090
|
+
`;let K=X7(A.recentTopics);if(K)G+=`Topics: ${K}
|
|
1091
|
+
`;let Z=Q7(A.recentToolUses);if(Z)G+=`Tools: ${Z}
|
|
1092
|
+
`;return G}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return E("No topics extracted yet",this.useColor)}}class P1{useColor;constructor(A){this.useColor=A}formatContext(A,_){let G="";if(G+=AA(`${A.projectName} Context`,this.useColor)+`
|
|
1093
|
+
`,G+="=".repeat(40)+`
|
|
1094
|
+
|
|
1095
|
+
`,G+=`Project: ${A.projectPathDecoded}
|
|
1096
|
+
`,G+=`Sessions: ${K_(A.sessionCount)}
|
|
1097
|
+
`,G+=`Messages: ${K_(A.totalMessages)}`,G+=` (user: ${K_(A.userMessages)}, assistant: ${K_(A.assistantMessages)})
|
|
1098
|
+
`,A.lastActivity)G+=`Last active: ${jA(A.lastActivity)}
|
|
1099
|
+
`;else G+=`Last active: never
|
|
1100
|
+
`;if(G+=`
|
|
790
1101
|
Topics:
|
|
791
|
-
|
|
792
|
-
`;else
|
|
793
|
-
`,this.useColor);if(
|
|
1102
|
+
`,A.recentTopics.length>0)for(let $ of A.recentTopics)G+=` - ${$}
|
|
1103
|
+
`;else G+=E(` (no topics extracted yet)
|
|
1104
|
+
`,this.useColor);if(G+=`
|
|
794
1105
|
Tool Usage:
|
|
795
|
-
|
|
796
|
-
`;else
|
|
797
|
-
`,this.useColor);return
|
|
798
|
-
`,
|
|
799
|
-
`;if(
|
|
800
|
-
`;
|
|
801
|
-
`}return
|
|
802
|
-
${
|
|
803
|
-
${
|
|
804
|
-
[truncated]`;
|
|
805
|
-
|
|
806
|
-
`+
|
|
1106
|
+
`,A.recentToolUses.length>0)for(let $ of A.recentToolUses)G+=` - ${$.name}: ${K_($.count)} times
|
|
1107
|
+
`;else G+=E(` (no tool usage recorded)
|
|
1108
|
+
`,this.useColor);return G}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return E("(no topics extracted yet)",this.useColor)}}class N4{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 _=N(A);return JSON.stringify({error:_})}formatEmpty(A){return JSON.stringify({error:`No sessions found for project matching '${A}'`})}formatNoTopics(){return JSON.stringify({topics:[]})}}class L4{formatContext(A,_){return`${A.projectName}: ${A.sessionCount} sessions, ${K_(A.totalMessages)} messages`}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return""}formatNoTopics(){return""}}class M4{detailed;constructor(A){this.detailed=new P1(A)}formatContext(A,_){let G="";if(_){if(G+=`=== Execution Details ===
|
|
1109
|
+
`,_.executionTimeMs!==void 0)G+=`Time: ${_.executionTimeMs}ms
|
|
1110
|
+
`;if(_.filtersApplied&&_.filtersApplied.length>0)G+=`Filters: ${_.filtersApplied.join(", ")}
|
|
1111
|
+
`;G+=`
|
|
1112
|
+
`}return G+=this.detailed.formatContext(A,_),G}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1113
|
+
${G??""}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return this.detailed.formatNoTopics()}}class U4{formatContext(A,_){let G=new x1(!1);return t(G.formatContext(A,_))}formatSmartContext(A){let _=[];for(let $ of A.sections){if($.content.trim()==="")continue;let K=`### ${$.title}
|
|
1114
|
+
${$.content}`;if($.truncated)K+=`
|
|
1115
|
+
[truncated]`;_.push(K)}let G=`## ${A.projectName} context
|
|
1116
|
+
|
|
1117
|
+
`+_.join(`
|
|
807
1118
|
|
|
808
1119
|
---
|
|
809
1120
|
|
|
810
|
-
`);if(
|
|
811
|
-
|
|
812
|
-
(budget: ~${
|
|
813
|
-
`;return
|
|
814
|
-
`})
|
|
815
|
-
`;return
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
`})
|
|
824
|
-
`)}formatError(
|
|
825
|
-
`,
|
|
826
|
-
`,
|
|
827
|
-
`;return
|
|
828
|
-
${
|
|
829
|
-
`).length:0;return`${
|
|
830
|
-
`).filter(Boolean).length??0} files`;case"Grep":return
|
|
831
|
-
`)}function
|
|
832
|
-
`;if(
|
|
833
|
-
${
|
|
834
|
-
`)}formatError(
|
|
835
|
-
`)}formatError(
|
|
836
|
-
`)}formatError(
|
|
837
|
-
${
|
|
838
|
-
`)}formatError(
|
|
839
|
-
`)}function
|
|
840
|
-
${
|
|
841
|
-
${
|
|
842
|
-
`;if(
|
|
1121
|
+
`);if(A.truncated)G+=`
|
|
1122
|
+
|
|
1123
|
+
(budget: ~${A.totalTokensEstimate} tokens)`;return G.trim()}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return`No sessions found for project matching '${A}'`}formatNoTopics(){return"No topics extracted yet"}}var j$=L(()=>{G_();wA()});function k1(A,_){switch(A){case"json":return new O4;case"quiet":return new R4;case"verbose":return new j4(_);case"detailed":return new y1(_);case"brief":case"default":default:return new I4(_)}}function T4(A,_){let G=`${Math.round(A*100)}%`;if(!_)return G;if(A>0.75)return b(G,_);if(A>=0.5)return m(G,_);return G}function V7(A){return A===1?"1 hop":`${A} hops`}function B7(A){return`${A===1?"1":`${A}`} (${A===1?"direct":"indirect"})`}class I4{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
|
|
1124
|
+
`;return A.forEach((K,Z)=>{let Y=K.session.projectPath.projectName,J=LA(K.session.startTime),H=T4(K.weight,this.useColor),Q=V7(K.hops);$+=`${Z+1}. ${Y} (${H}) - ${J} [${Q}]
|
|
1125
|
+
`}),$}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return`No relationships found for '${A}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class y1{useColor;constructor(A){this.useColor=A}formatRelated(A,_){if(A.length===0)return"";let $=`Related to session ${_?.sourceId??"unknown"}...
|
|
1126
|
+
`;return $+="=".repeat(40)+`
|
|
1127
|
+
|
|
1128
|
+
`,A.forEach((K,Z)=>{let Y=K.session,J=Y.projectPath.projectName,H=Y.projectPath.decoded,Q=T4(K.weight,this.useColor),X=B7(K.hops),B=jA(Y.startTime),W=Y.messages.length;$+=`${Z+1}. ${J}
|
|
1129
|
+
`,$+=` Weight: ${Q} | Hops: ${X}
|
|
1130
|
+
`,$+=` Path: ${H}
|
|
1131
|
+
`,$+=` Last active: ${B}
|
|
1132
|
+
`,$+=` Messages: ${W}
|
|
1133
|
+
|
|
1134
|
+
`}),$}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return`No relationships found for '${A}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class O4{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 _=N(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 R4{formatRelated(A,_){if(A.length===0)return"";return A.map((G)=>G.session.id).join(`
|
|
1135
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatEmpty(A){return""}formatNoLinks(){return""}}class j4{detailed;constructor(A){this.detailed=new y1(A)}formatRelated(A,_){let G="";if(_?.executionTimeMs!==void 0)G+=`=== Execution Details ===
|
|
1136
|
+
`,G+=`Time: ${_.executionTimeMs}ms
|
|
1137
|
+
`,G+=`
|
|
1138
|
+
`;return G+=this.detailed.formatRelated(A,_),G}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1139
|
+
${G??""}`}formatEmpty(A){return this.detailed.formatEmpty(A)}formatNoLinks(){return this.detailed.formatNoLinks()}}var h1=L(()=>{G_()});function S$(A,_){switch(A){case"json":return new D4;case"quiet":return new x4;case"verbose":return new P4(_);case"tools":return new F$(_);case"brief":return new S4;default:return new E4(_)}}function v1(A){let _=A.replace(/\\/g,"/").split("/");return _[_.length-1]||A}function F4(A){switch(A.name){case"Read":{let _=A.input.file_path,G=A.result?A.result.split(`
|
|
1140
|
+
`).length:0;return`${v1(_)} -> ${G} lines`}case"Write":{let _=A.input.file_path;return v1(_)}case"Edit":{let _=A.input.file_path;return`${v1(_)} 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(`
|
|
1141
|
+
`).filter(Boolean).length??0} files`;case"Grep":return A.isSuccess?"matches":"no matches";default:return A.status}}function W7(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 w1(A,_){let{session:G,messages:$,toolUses:K}=A,Z=[];Z.push(`Session: ${G.id}`),Z.push(`Project: ${G.projectPath.projectName}`);let Y=j_(G.startTime),J=G.endTime?j_(G.endTime):"ongoing";if(Z.push(`Date: ${Y} - ${J}`),G.durationMs!==void 0)Z.push(`Duration: ${W7(G.durationMs)}`);else Z.push("Duration: ongoing");let H=K.size;return Z.push(`Messages: ${$.length} | Tools: ${H}`),Z.push("---"),Z.join(`
|
|
1142
|
+
`)}function C1(A,_,G,$){let K=A.role==="user"?AA("[USER]",G):AA("[ASSISTANT]",G),Z=j_(A.timestamp),Y=`${K} ${E(Z,G)}
|
|
1143
|
+
`;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}: ${F4(Q)}]`)}if(J.length>0)Y+=`
|
|
1144
|
+
${J.join(" ")}`}return Y}class S4{formatSession(A,_){let{session:G,messages:$}=A,K=j_(G.startTime);return`${G.id} | ${G.projectPath.projectName} | ${$.length} messages | ${K}`}formatError(A){return`Error: ${N(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class E4{useColor;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(w1(A,this.useColor)),G.push("");for(let $ of A.messages)G.push(C1($,A.toolUses,this.useColor,!0)),G.push("");return G.join(`
|
|
1145
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class D4{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 _=N(A);return JSON.stringify({error:_})}formatNotFound(A){return JSON.stringify({error:`Session not found: ${A}`})}}class x4{formatSession(A,_){let G=[];for(let $ of A.messages){let K=$.role==="user"?"U:":"A:";G.push(`${K} ${$.content}`)}return G.join(`
|
|
1146
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatNotFound(A){return`Session not found: ${A}`}}class P4{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(w1(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(C1($,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(`
|
|
1147
|
+
`)}formatError(A){let _=N(A),G=A instanceof Error?A.stack:"";return`Error: ${_}
|
|
1148
|
+
${G??""}`}formatNotFound(A){return`Session not found: ${A}`}}class F${useColor;static RESULT_TRUNCATE_LENGTH=500;constructor(A){this.useColor=A}formatSession(A,_){let G=[];G.push(w1(A,this.useColor)),G.push("");for(let $ of A.messages){if(G.push(C1($,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>F$.RESULT_TRUNCATE_LENGTH?Z.result.substring(0,F$.RESULT_TRUNCATE_LENGTH)+"...":Z.result;G.push(` Result: ${Y}`)}G.push(` Status: ${Z.status}`)}}G.push("")}return G.join(`
|
|
1149
|
+
`)}formatError(A){return`Error: ${N(A)}`}formatNotFound(A){return`Session not found: ${A}`}}var f1=L(()=>{G_()});function k4(A){switch(A){case R.DB_CONNECTION_FAILED:return"Check database file permissions";case R.DB_CORRUPTED:return"Run 'memory doctor' to diagnose or recreate database";case R.DB_LOCKED:return"Wait and retry, or check for other running processes";case R.INVALID_SESSION_ID:return"Check session ID format (expected UUID)";case R.SESSION_NOT_FOUND:return"Run 'memory list' to see available sessions";case R.SOURCE_INACCESSIBLE:return"Check that ~/.claude/projects exists and is readable";case R.DISK_FULL:return"Free up disk space and retry";case R.INVALID_JSON:return"Check file for JSON syntax errors";case R.UNKNOWN_FORMAT:return"File may be incompatible with current version";case R.SYNC_INTERRUPTED:return"Run 'memory sync' again to resume";case R.SYNC_FAILED:return`Check logs at ${zA()} for details`;case R.INVALID_ARGUMENT:return"Run command with --help to see valid options";case R.MISSING_ARGUMENT:return"Run command with --help to see required arguments";case R.VECTOR_UNAVAILABLE:return"Run 'memory sync --embed' to generate embeddings, or use '--mode fts' for keyword-only search";case R.PROVIDER_TIMEOUT:return"Check network connection or switch to local provider in config";case R.PROVIDER_CONFIG_INVALID:return"Check embedding config in ~/.config/memory/config.json";case R.EMBEDDING_DIMENSION_MISMATCH:return"Run 'memory sync --embed' to re-embed with the current model";case R.MODEL_CORRUPTED:return"Delete cached model files and run 'memory sync --embed' to re-download";case R.NOT_FOUND:return"Check the ID and try again";case R.INVALID_STATE:return"The entity is not in a valid state for this operation";case R.UNKNOWN:default:return null}}function z7(A,_){if(typeof _==="string"||typeof _==="number")return` ${A}: ${_}`;return` ${A}: ${JSON.stringify(_)}`}function l(A,_={}){let G=_.useColor??h(),$=[];if(A instanceof j){let K=u(`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(z7(Y,J));let Z=k4(A.code);if(Z)$.push(""),$.push(`Suggestion: ${Z}`)}else{let K=u("Error:",G);$.push(`${K} ${A.message}`)}if(_.verbose&&A.stack)$.push(""),$.push("Stack trace:"),$.push(A.stack);return $.join(`
|
|
1150
|
+
`)}function AG(A){if(A instanceof j)return JSON.stringify(A.toJSON());let _={error:{code:"UNKNOWN",message:A.message}};return JSON.stringify(_)}var CA=L(()=>{O0();f()});function y4(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 h4(A){return{schema_version:"1",command:A.command,error:{code:A.code,message:A.message,...A.context!==void 0?{context:A.context}:{}}}}function i(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(y4({...A,command:_}),null,2))}function x(A){let _=process.env.MEMORY_JSON_COMMAND_OVERRIDE||A.command;console.log(JSON.stringify(h4({...A,command:_}),null,2))}var JA=()=>{};var D$={};y(D$,{writeLock:()=>f4,spawnBackgroundEmbedding:()=>j7,removeLock:()=>E$,readLock:()=>m1,isProcessAlive:()=>d1,isBackgroundEmbedding:()=>S7,cleanupLock:()=>F7,acquireLock:()=>b4});import{spawn as q7}from"child_process";import{existsSync as T7,readFileSync as I7,writeFileSync as O7,unlinkSync as R7,mkdirSync as w4,openSync as v4}from"fs";import{join as C4}from"path";function u1(A){return C4(A??n(),"embedding.lock")}function f4(A,_){let G=u1(_),$=_??n();w4($,{recursive:!0}),O7(G,JSON.stringify(A))}function m1(A){let _=u1(A);if(!T7(_))return null;try{return JSON.parse(I7(_,"utf-8"))}catch{return null}}function E$(A){let _=u1(A);try{R7(_)}catch{}}function d1(A){try{return process.kill(A,0),!0}catch{return!1}}function b4(A,_,G){let $=m1(G);if($){if(d1($.pid))return{acquired:!1,existingPid:$.pid,startedAt:$.startedAt};E$(G)}return f4({pid:A,startedAt:new Date().toISOString(),totalMessages:_},G),{acquired:!0,staleRemoved:$!==null}}function j7(A){let{dataDir:_,logDir:G,command:$=process.execPath}=A??{},K=m1(_);if(K&&d1(K.pid))return{started:!1,reason:"already_running",pid:K.pid};if(K)E$(_);let Z=G??zA();w4(Z,{recursive:!0});let Y=C4(Z,"sync.log"),J=v4(Y,"a"),H=v4(Y,"a"),X=[process.argv[1]??"","sync","--embed","--quiet"],B=q7($,X,{detached:!0,stdio:["ignore",J,H],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(B.unref(),B.pid===void 0)return{started:!1,reason:"spawn_failed"};let W=b4(B.pid,0,_);if(!W.acquired)return{started:!1,reason:"already_running",pid:W.existingPid};return{started:!0,pid:B.pid}}function F7(A){E$(A)}function S7(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var x$=L(()=>{f()});var g4={};y(g4,{EmbeddingProviderFactory:()=>P$});import{createHash as D7}from"crypto";class P${cache=new Map;cacheKey(A,_){let G=A.apiKey?D7("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,_=a){let G=this.cacheKey(A,_),$=this.cache.get(G);if($)return $;let K=z6(A,_);return this.cache.set(G,K),K}createFromConfig(A){let _=A.embedding??m_;if(!_.enabled)return null;return this.create(_,A.providerEgress??a)}async dispose(){for(let A of this.cache.values())await A.dispose();this.cache.clear()}}var p1=L(()=>{$A();a0()});var o4={};y(o4,{mergeMemoryBlock:()=>e4,AutoMemoryWriter:()=>s4});import{existsSync as x7,mkdirSync as r4,readFileSync as P7,writeFileSync as a1}from"fs";import{join as t4}from"path";function e4(A,_){let G=`${r1}
|
|
1151
|
+
${_}
|
|
1152
|
+
${k$}
|
|
1153
|
+
`;if(A.length===0)return G;let $=A.indexOf(r1),K=A.indexOf(k$);if($!==-1&&K!==-1){let Y=A.substring(0,$),J=A.substring(K+k$.length);return`${Y}${G}${J}`}let Z=A.endsWith(`
|
|
843
1154
|
`)?`
|
|
844
1155
|
`:`
|
|
845
1156
|
|
|
846
|
-
`;return`${
|
|
847
|
-
${
|
|
848
|
-
${
|
|
849
|
-
`;if(!
|
|
850
|
-
`,"utf-8")}async function*
|
|
1157
|
+
`;return`${A}${Z}${G}`}class s4{async writeContextFile(A,_){r4(A,{recursive:!0}),a1(t4(A,"context.md"),_,"utf-8")}async updateMemoryBlock(A,_){r4(A,{recursive:!0});let G=t4(A,"MEMORY.md"),$=`${r1}
|
|
1158
|
+
${_}
|
|
1159
|
+
${k$}
|
|
1160
|
+
`;if(!x7(G)){a1(G,$,"utf-8");return}let K=P7(G,"utf-8"),Z=e4(K,_);a1(G,Z,"utf-8")}}var r1="<!-- memory-cli:start -->",k$="<!-- memory-cli:end -->";var A9=()=>{};var Z9={};y(Z9,{sanitizeGitEnvironment:()=>G9,runGitCommand:()=>$9,GitRemoteEventTransport:()=>K9});import{createHash as y7}from"crypto";import{existsSync as h7,mkdirSync as v7,readFileSync as w7}from"fs";import{basename as C7,join as _9}from"path";var{spawn:f7}=globalThis.Bun;function G9(A=process.env){let _={};for(let G of b7){let $=A[G];if($!==void 0)_[G]=$}return _.GIT_TERMINAL_PROMPT="0",_.GIT_PAGER="cat",_.GIT_OPTIONAL_LOCKS="0",_}async function $9(A,_,G={}){let $=f7(["git",...A],{cwd:_,stdout:"pipe",stderr:"pipe",env:G9(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 K9{eventsDir;runGit;deps;constructor(A,_={}){this.eventsDir=A;let G=_.env??process.env;this.runGit=_.runGit??(($,K)=>$9($,K,{env:G})),this.deps={existsSync:h7,mkdirSync:v7,readFileSync:w7,getAllLogFiles:xA,..._}}async isRepository(){return this.deps.existsSync(_9(this.eventsDir,".git"))}async initRepository(A){this.deps.mkdirSync(this.eventsDir,{recursive:!0});let _=await this.runGit(["init"],this.eventsDir);if(!_.success)return HA(_,"Failed to initialize Git repository in events directory");let G=await this.runGit(["config","user.name",A.userName],this.eventsDir);if(!G.success)return HA(G,"Failed to configure Git user.name");let $=await this.runGit(["config","user.email",A.userEmail],this.eventsDir);if(!$.success)return HA($,"Failed to configure Git user.email");let K=await this.runGit(["symbolic-ref","HEAD","refs/heads/main"],this.eventsDir);if(!K.success)return HA(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}:HA(_,"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[C7(G)]=g7(this.deps.readFileSync(G,"utf-8"));return A}async hasEventLog(A){return this.deps.existsSync(_9(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 HA($,"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 HA(K,"Git diff failed");let Z=await this.runGit(["commit","--no-gpg-sign","-m",_,"--",G],this.eventsDir);return Z.success?{success:!0}:HA(Z,"Git commit failed")}async fetch(A){let _=await this.runGit(["fetch","--prune",A],this.eventsDir);return _.success?{success:!0}:HA(_,"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}:HA(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 HA(A,"Git rebase abort failed")}async push(A,_){let G=await this.runGit(["push","-u",A,_],this.eventsDir);return G.success?{success:!0}:HA(G,"Git push failed")}}function HA(A,_){return{success:!1,error:A.stderr||A.stdout||_}}function g7(A){return y7("sha256").update(A).digest("hex")}var b7;var Y9=L(()=>{f();b7=new Set(["PATH","Path","HOME","USERPROFILE","XDG_CONFIG_HOME","SSH_AUTH_SOCK","TEMP","TMP","TMPDIR","SystemRoot","WINDIR"])});var M9={};y(M9,{rebuildProjectionsWithReport:()=>X9,rebuildProjections:()=>Q9,readMemoryEventsWithReport:()=>i7,readMemoryEvents:()=>n7,readEvents:()=>a7,appendMemoryEvent:()=>s1,appendEvent:()=>H9});import{appendFile as c7,mkdir as u7}from"fs/promises";import{basename as m7,dirname as d7}from"path";import{existsSync as l7,createReadStream as p7}from"fs";import*as J9 from"readline";async function H9(A,_){await s1(e7(A,ZJ(_)),_)}async function s1(A,_){let G=KJ(_);await u7(d7(G),{recursive:!0}),await c7(G,`${JSON.stringify(A.toJSON())}
|
|
1161
|
+
`,"utf-8")}async function*n7(A,_){let G=await y$(A,_,{reportInvalidToConsole:!1});for(let $ of G.events)yield $}async function i7(A,_){return y$(A,_,{reportInvalidToConsole:!1})}async function*a7(A,_){let G=await y$(A,_,{reportInvalidToConsole:!0});for(let $ of G.events)try{yield h$($)}catch(K){console.error("Skipping malformed event log line:",K)}}async function Q9(A,_,G){await X9(A,_,G)}async function X9(A,_,G){let $=await y$(_,G,{reportInvalidToConsole:!1}),K=B9($.events),Y=await new wG([AJ(),GJ(),$J(),_J()]).replay(K,{db:A});return{invalidEvents:$.invalidEvents.length,invalidEventLines:$.invalidEvents,replay:Y}}async function y$(A,_,G){let $=A?[A]:xA(_),K=[],Z=[];for(let Y of $){let J=await r7(Y,G);K.push(...J.events),Z.push(...J.invalidEvents)}return{events:A?K:B9(K),invalidEvents:Z}}async function r7(A,_){let G=[],$=[];if(!l7(A))return{events:G,invalidEvents:$};let K=p7(A,"utf-8"),Z=J9.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(t7(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 t7(A,_,G){if(S_(A)&&A.schemaVersion===2)return YA.fromJSON(A);return s7(A,_,G)}function e7(A,_){let G=N9(A.metadata);return YA.create({eventId:A.uuid,machineId:_,sequence:A.id??HJ(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:z9(A),payload:{fact:W9(A)}})}function s7(A,_,G){if(!S_(A))throw Error("Legacy event record must be an object");let $=o7(A);return YA.create({eventId:$.uuid,machineId:V9(_),sequence:JJ(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:N9($.metadata),consent:{status:"not_required",scopes:[]},causality:z9($),payload:{fact:W9($)}})}function o7(A){let _=F_(A,"uuid"),G=F_(A,"type"),$=F_(A,"project"),K=F_(A,"content"),Z=QJ(A,"observedAt"),Y=XJ(A,"supersededAt"),J=typeof A.supersededBy==="string"?A.supersededBy:null,H=S_(A.metadata)?L9(A.metadata):void 0;if(!_.trim())throw Error("Legacy event uuid is required");return XA.create({uuid:_,type:G,project:$,content:K,metadata:H,observedAt:Z,supersededAt:Y,supersededBy:J})}function h$(A){let _=A.payload.fact;if(!S_(_))throw Error(`Memory event ${A.eventId} does not contain a fact payload`);let G={uuid:F_(_,"uuid"),type:typeof _.type==="string"?_.type:A.kind,project:typeof _.project==="string"?_.project:A.scope.project??"",content:F_(_,"content"),metadata:S_(_.metadata)?L9(_.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},$=XA.create(G);return typeof _.id==="number"?$.withId(_.id):$}function AJ(){let A=(_,G)=>{_.prepare(`
|
|
851
1162
|
INSERT INTO facts (
|
|
852
1163
|
uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by
|
|
853
1164
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
854
|
-
|
|
1165
|
+
ON CONFLICT(uuid) DO UPDATE SET
|
|
1166
|
+
type = excluded.type,
|
|
1167
|
+
project = excluded.project,
|
|
1168
|
+
content = excluded.content,
|
|
1169
|
+
metadata = excluded.metadata,
|
|
1170
|
+
observed_at = excluded.observed_at,
|
|
1171
|
+
superseded_at = excluded.superseded_at,
|
|
1172
|
+
superseded_by = excluded.superseded_by,
|
|
1173
|
+
updated_at = datetime('now')
|
|
1174
|
+
`).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:e1,reset:(_)=>{_.db.run("DELETE FROM facts;")},apply:async(_,G)=>{let $=h$(_);A(G.db,$);let K=new GA(G.db);if(!await K.findByTarget("fact",$.uuid))await K.save(A$(_,$.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(`
|
|
855
1175
|
UPDATE facts
|
|
856
1176
|
SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now')
|
|
857
1177
|
WHERE uuid = ?
|
|
858
|
-
`).run(G.observedAt.toISOString(),J,_)}})()}var Y5=U(()=>{v$();p();Z0()});import*as I8 from"chrono-node";function L$($,Z){if(!$||$.trim()==="")throw new I0("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let K=Z??new Date,X=I8.parseDate($,K);if(!X)throw new I0(`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 I0(`Future dates not allowed: '${$}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return X}var I0;var Q5=U(()=>{I0=class I0 extends Error{constructor($){super($);this.name="DateParseError"}}});function K0($){if($.json)return;let Z=`${$.command}:--format=${$.alias}`;if(T8.has(Z))return;T8.add(Z),console.error(`warning: --format ${$.alias} is deprecated and will be removed in the next minor release. ${$.replacement}`)}var T8;var t0=U(()=>{T8=new Set});import{spawn as l6,execSync as X9}from"child_process";class Y9{search($){return new Promise((Z,K)=>{let X=l6("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 X9("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:X9("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function G5(){try{return X9("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function Q9(){try{return{available:!0,path:X9("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var R8=()=>{};var G9=U(()=>{R8()});var j8={};w(j8,{runShowInternal:()=>i6,executeShowCommand:()=>I$,createShowCommand:()=>M8});import{Command as n6,Option as _5}from"commander";function M8(){return new n6("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new _5("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new _5("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new _5("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async($,Z)=>{let K=await I$($,Z);process.exitCode=K.exitCode})}function F8($){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 a6($,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 I$($,Z,K={}){let{executeQueryCommand:X}=await Promise.resolve().then(() => (s0(),T$));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 i6($,Z,K={}){let X=performance.now();if(Z.format==="default")K0({command:"show",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:Z.json});let Y=K.dbPath??E(),{db:Q}=v({path:Y});try{let G=new g(Q),_=new T0(Q),J=new p0(Q),H=await a6(G,$,Q);if(!H){if(Z.json)S({command:"show",code:"NOT_FOUND",message:`Session not found: ${$}`,context:{session_id:$}});else{let L=F8(Z),O=tZ(L,k());console.log(O.formatNotFound($))}return{exitCode:1}}let V=await _.findBySession(H.id),B=await J.findBySession(H.id),z=new Map;for(let L of B)z.set(L.id,L);let W={session:H,messages:V,toolUses:z};if(Z.json){let L=performance.now();return s({command:"show",kind:"session",data:Z3(W),meta:{session_id:H.id,message_count:V.length,timing_ms:Math.round(L-X)}}),{exitCode:0}}let N=F8(Z),q=tZ(N,k()),I=performance.now(),F=q.formatSession(W,{executionTimeMs:Math.round(I-X)});if(Z.format==="ai")F=a(F);return console.log(F),{exitCode:0}}catch(G){let _=G instanceof R?G:new R(T.DB_CONNECTION_FAILED,A(G));if(Z.json)S({command:"show",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(c(_));return{exitCode:1}}finally{D(Q)}}var _9=U(()=>{Q0();E0();h$();a9();u();u4();F0();M0();L0();b0();t0()});var P8={};w(P8,{runListInternal:()=>o6,executeListCommand:()=>J9,createListCommand:()=>x8});import{Command as r6,Option as R$}from"commander";function x8(){return new r6("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new R$("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new R$("--before <date>","Sessions before date").conflicts("days")).addOption(new R$("--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 R$("--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 R$("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new R$("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async($)=>{let Z=await J9($);process.exitCode=Z.exitCode})}async function J9($,Z={}){let{executeQueryCommand:K}=await Promise.resolve().then(() => (s0(),T$)),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 o6($,Z={}){let K=performance.now();if($.format==="default")K0({command:"list",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:$.json});let X=Z.dbPath??E(),Y=parseInt($.limit??"20",10);if(isNaN(Y)||Y<1){if($.json)S({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=L$($.since)}catch(J){if(J instanceof I0){if($.json)S({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=L$($.before)}catch(J){if(J instanceof I0){if($.json)S({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:_}=v({path:X});try{let J=new g(_),H={limit:Y,projectFilter:$.project,sinceDate:Q,beforeDate:G},V=await J.findFiltered(H),B=t6($);if($.json){let L=performance.now(),O=V.map(lZ);return s({command:"list",kind:"session",data:O,meta:{filters_applied:B,count:O.length,timing_ms:Math.round(L-K)}}),{exitCode:0}}let z="default";if($.quiet)z="quiet";else if($.verbose)z="verbose";else if($.format==="brief")z="brief";let W=k(),N=D4(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},F=N.formatSessions(V,I);if($.format==="ai")F=a(F);return console.log(F),{exitCode:0}}catch(J){let H=J instanceof R?J:new R(T.DB_CONNECTION_FAILED,A(J));if($.json)S({command:"list",code:H.code,message:H.message,...H.context!==void 0?{context:H.context}:{}});else console.error(c(H));return{exitCode:1}}finally{D(_)}}function t6($){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 J5=U(()=>{E0();Q0();u();k4();F0();Q5();M0();L0();b0();t0()});import{copyFileSync as mW,cpSync as cW,existsSync as H5,mkdirSync as uW,readdirSync as dW,renameSync as pW,rmSync as lW,statSync as nW,unlinkSync as aW}from"fs";function E8(){let $=H5(g5()),Z=H5(K$())||H5(t()),K;if(!$&&!Z)K="not-needed";else if($&&!Z)K="pending";else if(!$&&Z)K="complete";else K="partial";return{legacyExists:$,newExists:Z,status:K}}var D8=U(()=>{p();J4()});var V5={};w(V5,{gatherStatus:()=>C8,formatTimeAgo:()=>b8,formatStatusOutput:()=>w8,executeStatusCommand:()=>h0,createStatusCommand:()=>v8,attemptFixes:()=>y8});import{Command as s6,Option as e6}from"commander";import{existsSync as $K,mkdirSync as k8}from"fs";import{dirname as S8}from"path";function v8(){return new s6("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 e6("--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 h0($);process.exitCode=Z.exitCode})}async function C8($={}){let Z=R0($.hookOverrides),K=m($.configPath),X=V$(1,$.logPath),Y=$.dbPath??E(),G=$K(Y)||$.stats,_=0,J,H=0,V=0,B=U4({dbPath:Y,configDir:$.configPath?S8($.configPath):void 0,logsDir:$.logPath?S8($.logPath):void 0,hookOverrides:$.hookOverrides,preCalculatedHookStatus:Z});if(G)try{let{db:F}=v({path:Y});try{let L=new y0,O=new d0(F),M=await L.discoverSessions();for(let g0 of M){let H0=await O.findBySessionPath(g0.path);if(!H0||H0.status!=="complete")_++}let x=new Y$(F),y=$.projects??10;J=await x.getStats(y);let J0=new D0(F);H=J0.getEmbeddedCount(),V=J0.getTotalMessageCount()}finally{D(F)}}catch{}let z={active:!1};try{let{readLock:F,isProcessAlive:L}=await Promise.resolve().then(() => ($9(),eZ)),O=F();if(O&&L(O.pid))z={active:!0,pid:O.pid,startedAt:O.startedAt,embeddedCount:H,totalMessages:V}}catch{}let W=E8(),N=Q9(),q;if(J)q={...J,hooks:{installed:Z.sessionEnd&&Z.preCompact,autoSync:K.autoSync,pendingSessions:_}};let I=[];if($.fix)I=y8(B,k());return{hooks:Z,config:ZK(K),lastSync:X.length>0?X[0]?.timestamp??null:null,pendingSessions:_,recentLogs:V$(100,$.logPath).length,embedding:z,health:B,stats:q,migration:W,qmd:N,fixes:I}}function ZK($){let Z={...$.embedding};if(Z.apiKey)Z.apiKey="[REDACTED:api_key]";return{...$,embedding:Z}}async function h0($,Z={}){let K=performance.now();if($.format==="default")K0({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)S({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??C8)({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=WK(_.health);else if($.stats)J=_.stats?0:1;else J=0;if($.json){if($.stats&&!$.db&&!$.hooks&&!$.config&&!$.embedding&&!$.all){if(!_.stats)return S({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return s({command:"stats",kind:"stats",data:P4(_.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?P4(_.stats):void 0,migration:_.migration,qmd:_.qmd,fixes:_.fixes};return console.log(JSON.stringify(W,null,2)),{exitCode:J}}let V=k();if(!($.db||$.hooks||$.embedding||$.config||$.stats||$.all)){if(w8(_),$.fix&&_.fixes.length>0){console.log(`
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
`)}function YK($,Z){let K=[];if(K.push("Configuration"),$.health.config.valid)K.push(` ${h(!0,Z)} Valid`);else{K.push(` ${h(!1,Z)} Invalid`);for(let X of $.health.config.issues)K.push(` ${f("-",Z)} ${X}`)}return K.join(`
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
`)}function
|
|
866
|
-
`)}function
|
|
867
|
-
`),
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
${
|
|
871
|
-
|
|
872
|
-
`);console.log(W)}}return{exitCode:0}}var V9=U(()=>{Q0();X$();EZ();u();LZ();rZ();M0();L0();b0();t0()});var p8={};w(p8,{runRelatedInternal:()=>UK,executeRelatedCommand:()=>x$,createRelatedCommand:()=>d8});import{Command as OK,Option as j$}from"commander";function d8(){return new OK("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new j$("--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 j$("--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 j$("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new j$("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new j$("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new j$("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async($,Z)=>{let K=await x$($,Z);process.exitCode=K.exitCode})}async function x$($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (s0(),T$));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await K($,{...Z,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function UK($,Z,K){let X=performance.now();if(Z.format==="detailed")K0({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:Z.json});let Y=K?.dbPath??Z.dbPath??E(),{db:Q}=v({path:Y});try{let G=new g$(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=k(),z=b4(V,B);if(H.length===0){let O=await G.findBySource(J,$),M=await G.findByTarget(J,$);if(O.length===0&&M.length===0){if(Z.json)S({command:"related",code:"NOT_FOUND",message:`No related items found for ${$}`,context:{source_id:$,source_type:J}});else{let x=z.formatEmpty($);if(V!=="quiet"||x)console.error(x)}return{exitCode:1}}}let W=new Map;for(let{link:O,hop:M}of H)if(O.targetType==="session"){let x=W.get(O.targetId);if(!x||O.weight>x.weight)W.set(O.targetId,{weight:O.weight,hops:M})}W.delete($);let N=Array.from(W.entries()).sort((O,M)=>M[1].weight-O[1].weight||O[1].hops-M[1].hops).slice(0,Z.limit??10),q=[];for(let[O,{weight:M,hops:x}]of N){let y=await _.findById(O);if(y)q.push({session:y,weight:M,hops:x})}if(q.length===0){if(Z.json)S({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 s({command:"related",kind:"related",data:q.map(K3),meta:{source_id:$,source_type:J,count:q.length,timing_ms:Math.round(O-X)}}),{exitCode:0}}let I=performance.now(),F={sourceId:$,executionTimeMs:Math.round(I-X)},L=z.formatRelated(q,F);if(Z.format==="ai")L=a(L);return console.log(L),{exitCode:0}}catch(G){let _=G instanceof R?G:new R(T.DB_CONNECTION_FAILED,A(G));if(Z.json)S({command:"related",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(c(_));return{exitCode:1}}finally{D(Q)}}var W9=U(()=>{Q0();o9();u();h4();F0();M0();L0();b0();t0()});var T$={};w(T$,{executeQueryCommand:()=>B9,createQueryCommand:()=>l8});import{Command as LK,Option as P$}from"commander";function l8(){return new LK("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",($)=>{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 P$("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new P$("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async($,Z)=>{let K=await B9($,Z);process.exitCode=K.exitCode})}async function B9($,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(() => (QZ(),z5));return await G($||"",{...Z,project:X,files:!1})}case"file":{let{runSearchInternal:G}=await Promise.resolve().then(() => (QZ(),z5));return await G($||"",{...Z,project:X,files:!0})}case"session":if($){let{runShowInternal:G}=await Promise.resolve().then(() => (_9(),j8));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(() => (J5(),P8));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(() => (B5(),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)S({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(() => (V9(),u8));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)S({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(() => (W9(),p8));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)S({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 s0=U(()=>{L0()});var z5={};w(z5,{runSearchInternal:()=>TK,resolveSearchMode:()=>n8,filterCaseSensitive:()=>i8,executeSearchCommand:()=>E$,createSearchCommand:()=>a8});import{Command as IK,Option as j0}from"commander";function n8($){if($.vector===!1)return"fts";if(!$.mode||$.mode==="auto")return;return $.mode}function a8(){return new IK("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 j0("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new j0("--before <date>","Results before date").conflicts("days")).addOption(new j0("--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 j0("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new j0("--no-vector","Disable vector search (same as --mode fts)")).addOption(new j0("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new j0("--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 j0("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new j0("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async($,Z)=>{let K=await E$($,Z);process.exitCode=K.exitCode})}async function E$($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (s0(),T$)),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 TK($,Z){let K=performance.now();if(Z.format==="default")K0({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:Z.json});let X;try{X=C$.from($)}catch(J){if(Z.json)S({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 RK($,Z);let Y=Z.dbPath??E(),{db:Q,sqliteVecAvailable:G}=v({path:Y}),_=new Z9;try{let J=m(),H=new m$(Q),V=new D0(Q),B=new c$({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)S({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 C=Z.role.split(",").map((D$)=>D$.trim().toLowerCase());if(C.length===1)W=C[0];else W=C}let N,q;if(Z.days){let C=new Date,D$=new Date(C.getFullYear(),C.getMonth(),C.getDate());N=new Date(D$.getTime()-(Z.days-1)*24*60*60*1000)}else{if(Z.since)try{N=L$(Z.since)}catch(C){if(C instanceof I0){if(Z.json)S({command:"search",code:"INVALID_ARGUMENT",message:C.message,context:{flag:"since",value:Z.since}});else console.error(`Error: ${C.message}`);return{exitCode:1}}throw C}if(Z.before)try{q=L$(Z.before)}catch(C){if(C instanceof I0){if(Z.json)S({command:"search",code:"INVALID_ARGUMENT",message:C.message,context:{flag:"before",value:Z.before}});else console.error(`Error: ${C.message}`);return{exitCode:1}}throw C}}let I=n8(Z),L={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,L),M=!1;if(Z.caseSensitive&&O.length>0){let C=O.length;O=i8(O,$,z),M=C>O.length||O.length<z}else O=O.slice(0,z);let x=B.getLastSearchMeta(),y="default";if(Z.json)y="json";else if(Z.quiet)y="quiet";else if(Z.verbose)y="verbose";else if(Z.format==="brief")y="brief";let J0=k(),g0=E4(y,J0),H0=performance.now(),V0={query:$,executionDetails:{timeMs:Math.round(H0-K),ftsQuery:$,filtersApplied:MK(Z,M)},searchMeta:x??void 0},L2=Math.round(performance.now()-K),I2=()=>{let C={query:$,total_results:O.length,timing_ms:L2};if(x){if(C.mode=x.mode,C.mode_reason=x.modeReason,C.embedding_coverage=x.embeddingCoverage,C.degraded=x.degraded,x.degradationReason)C.degradation_reason=x.degradationReason}return C};if(Z.json){if(s({command:"search",kind:"message",data:O.map((C,D$)=>pZ(C,{rank:D$+1,includeSearchMetaFields:!!x})),meta:I2()}),x&&x.embeddingCoverage===0&&!J.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),S0({search:{...J.search,hintShown:!0}});return{exitCode:0}}if(O.length===0&&x?.mode==="vector")return console.log(`No semantic matches for "${$}"`),{exitCode:0};let A9=g0.formatResults(O,V0);if(Z.format==="ai")A9=a(A9);if(console.log(A9),x&&x.embeddingCoverage===0&&!J.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),S0({search:{...J.search,hintShown:!0}});return{exitCode:0}}catch(J){let H=J instanceof R?J:new R(T.DB_CONNECTION_FAILED,A(J));if(Z.json)S({command:"search",code:H.code,message:H.message,...H.context!==void 0?{context:H.context}:{}});else console.error(c(H));return{exitCode:1}}finally{await _.dispose(),D(Q)}}async function RK($,Z){if(!G5()){if(Z.json)S({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 Y9().search($);if(Z.json)return s({command:"search",kind:"file",data:X.map($3),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=k(),Q=FK(X,Y);if(Z.format==="ai")Q=a(Q);return console.log(Q),{exitCode:0}}catch(K){let X=A(K);if(Z.json)S({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${X}`});else console.error(`Error: qmd search failed: ${X}`);return{exitCode:1}}}function FK($,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(` ${b(X.title,Z)}`),K.push(` ${P(`${Y} (score: ${X.score})`,Z)}`);let Q=X.snippet||X.context;if(Q)K.push(` ${Q}`);K.push("")}return K.join(`
|
|
873
|
-
`)
|
|
874
|
-
|
|
875
|
-
|
|
1178
|
+
`).run($.observedAt.toISOString(),J,Y)}}}}function _J(){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 GA(_.db).applyMemoryEvent(A)}}}function GJ(){return{name:"persona",consumedKinds:e1,reset:(A)=>{A.db.run("DELETE FROM persona_entries;")},apply:async(A,_)=>{let G=h$(A),$=N5(G,A.observedAt);if(!$)return!1;let Z=await new yA(_.db).save($),Y=new GA(_.db);if(!await Y.findByTarget("persona",Z.entryId))await Y.save(e.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 $J(){return{name:"graph",consumedKinds:e1,reset:(A)=>{A.db.run("DELETE FROM graph_edges;")},apply:async(A,_)=>{let G=h$(A),$=bG(G,A.observedAt);if($.length===0)return!1;let Z=await new eA(_.db).saveMany($),Y=new GA(_.db);for(let J of Z)if(!await Y.findByTarget("graph",J.edgeId))await Y.save(gG(J,"graph-event-projection"));return!0}}}function KJ(A){if(A)return A;let _=g();return y5(_.machineId)}function ZJ(A){if(A){let _=V9(A);return _==="legacy"?"local":_}try{let _=g();if(_.machineId&&_.machineId.trim())return _.machineId}catch{}return"local"}function V9(A){let _=m7(A),G=/^events-(.+)\.jsonl$/.exec(_);return G?.[1]&&G[1].trim()?G[1]:"legacy"}function B9(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 W9(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 z9(A){let _=A.metadata,G=_?.superseded_uuid,$=_?.superseded_by_uuid;return{parentEventIds:[],supersedesEventIds:typeof G==="string"?[G]:[],relatedEventIds:typeof $==="string"?[$]:[]}}function N9(A){let _=S_(A?.redaction)?A.redaction:void 0,G=S_(A?.privacy)?A.privacy:void 0,$=A?.redactionState??_?.state??G?.redactionState??"none",K=A?.redactedFields??_?.fields??G?.redactedFields;return{redactionState:YJ($),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 YJ(A){if(A==="redacted"||A==="quarantined")return A;return"none"}function JJ(A,_){if(typeof A.sequence==="number"&&Number.isSafeInteger(A.sequence)&&A.sequence>0)return A.sequence;return _}function HJ(A){return Math.max(1,Math.floor(A.getTime()))}function F_(A,_){let G=A[_];if(typeof G!=="string")throw Error(`${_} must be a string`);return G}function QJ(A,_){let G=F_(A,_),$=new Date(G);if(Number.isNaN($.getTime()))throw Error(`${_} must be a valid date`);return $}function XJ(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 L9(A){return JSON.parse(JSON.stringify(A))}function S_(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var e1;var v$=L(()=>{L0();M0();q_();C_();fG();w0();U5();H_();f();$A();e1=["decision","learning","preference","friction","observation","supersedence"]});var j9={};y(j9,{SecretAuditService:()=>_G});import{existsSync as VJ,mkdirSync as U9,readFileSync as BJ,renameSync as WJ,writeFileSync as q9}from"fs";import{basename as zJ,dirname as NJ,join as T9}from"path";class _G{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=qJ(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:R9(_),summary:{totalFindings:_.length,databaseFindings:_.filter((K)=>K.surface==="database").length,eventLogFindings:_.filter((K)=>K.surface==="event_log").length},findings:_,remediation:G};if(A.reportPath)U9(NJ(A.reportPath),{recursive:!0}),q9(A.reportPath,JSON.stringify($,null,2)+`
|
|
1179
|
+
`,"utf-8");return $}scanDatabase(A,_,G){let $=0;for(let K of LJ){if(!w$(A,K.table))continue;let Z=K.columns.filter((Q)=>O9(A,K.table,Q));if(Z.length===0||!O9(A,K.table,K.idColumn))continue;let Y="__memory_audit_row_id",J=[`${fA(K.idColumn)} AS ${Y}`,...Z.map((Q)=>fA(Q))].join(", "),H=A.prepare(`SELECT ${J} FROM ${fA(K.table)}`).all();for(let Q of H){let X=Q[Y];for(let B of Z){let W=Q[B];if(typeof W!=="string"||W.length===0)continue;let V=MJ(this.redactor,W,K.jsonColumns?.includes(B)===!0);if(V.findings.length===0)continue;if(G.push(...V.findings.map((M)=>({surface:"database",table:K.table,column:B,rowId:X,...I9(M)}))),_&&V.value!==W&&X!==void 0)A.prepare(`UPDATE ${fA(K.table)} SET ${fA(B)} = ? WHERE ${fA(K.idColumn)} = ?`).run(V.value,X),$+=1}}}return $}scanEventLogs(A,_,G,$){let K=[],Z=[];for(let Y of A){if(!VJ(Y))continue;let J=BJ(Y,"utf-8"),H=J.includes(`\r
|
|
1180
|
+
`)?`\r
|
|
1181
|
+
`:`
|
|
1182
|
+
`,Q=J.split(/\r?\n/),X=[],B=!1;for(let W=0;W<Q.length;W+=1){let V=Q[W];if(V.trim()===""&&W===Q.length-1)continue;let M=this.redactEventLine(V);if(X.push(M.line),M.findings.length>0)B=!0,$.push(...M.findings.map((z)=>({surface:"event_log",filePath:Y,lineNumber:W+1,...I9(z)})))}if(_&&B){let W=G??T9(n(),"quarantine","event-logs");U9(W,{recursive:!0});let V=T9(W,`${new Date().toISOString().replace(/[:.]/g,"-")}-${zJ(Y)}.raw`);WJ(Y,V),q9(Y,X.join(H)+H,"utf-8"),K.push(Y),Z.push({originalPath:Y,quarantinedPath:V})}}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(UJ(G.value)),findings:G.findings}}catch{let _=this.redactor.redactText(A);return{line:_.text,findings:_.findings}}}}function MJ(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 UJ(A){if(!TJ(A)||A.schemaVersion!==2)return A;let _=A;try{let G=new Set([...Array.isArray(_.privacy?.redactedFields)?_.privacy.redactedFields:[],"event"]);return YA.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??R9([]),redactedFields:[...G]},consent:_.consent,causality:_.causality,payload:_.payload}).toJSON()}catch{return A}}function qJ(A){let _=[],G=["messages_fts","facts_fts","memory_files_fts"];for(let $ of G){if(!w$(A,$))continue;A.exec(`INSERT INTO ${fA($)}(${fA($)}) VALUES('rebuild')`),_.push($)}if(w$(A,"sessions_fts")&&w$(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 I9(A){return{kind:A.kind,placeholder:A.placeholder,hash:A.hash,ruleVersion:A.ruleVersion}}function R9(A){return A.find((_)=>_.ruleVersion)?.ruleVersion??"pattern-redactor-v2"}function w$(A,_){let G=A.prepare("SELECT name FROM sqlite_master WHERE name = ?").get(_);return Boolean(G)}function O9(A,_,G){return A.prepare(`PRAGMA table_info(${fA(_)})`).all().some((K)=>K.name===G)}function fA(A){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(A))throw Error(`Unsafe SQL identifier: ${A}`);return`"${A}"`}function TJ(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}var LJ;var C$=L(()=>{M0();f();LJ=[{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 S9 from"chrono-node";function G0(A,_){if(!A||A.trim()==="")throw new FA("Invalid date format: ''. Examples: 'yesterday', '2 weeks ago', '2026-01-15'");let G=_??new Date,$=S9.parseDate(A,G);if(!$)throw new FA(`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 FA(`Future dates not allowed: '${A}'. Examples: 'yesterday', '2 weeks ago', '2026-01-15'`);return $}var FA;var o1=L(()=>{FA=class FA extends Error{constructor(A){super(A);this.name="DateParseError"}}});function QA(A){if(A.json)return;let _=`${A.command}:--format=${A.alias}`;if(E9.has(_))return;E9.add(_),console.error(`warning: --format ${A.alias} is deprecated and will be removed in the next minor release. ${A.replacement}`)}var E9;var E_=L(()=>{E9=new Set});import{spawn as jJ,execSync as f$}from"child_process";class b${search(A){return new Promise((_,G)=>{let $=jJ("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 f$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}getHealthInfo(){try{return{available:!0,path:f$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}}function AK(){try{return f$("which qmd",{stdio:"ignore"}),!0}catch{return!1}}function g$(){try{return{available:!0,path:f$("which qmd",{encoding:"utf-8"}).trim()}}catch{return{available:!1,path:null}}}var D9=()=>{};var c$=L(()=>{D9()});var k9={};y(k9,{runShowInternal:()=>EJ,executeShowCommand:()=>$0,createShowCommand:()=>P9});import{Command as FJ,Option as _K}from"commander";function P9(){return new FJ("show").description("Show session details").argument("<session-id>","Session ID to display").option("--json","Output as JSON").addOption(new _K("--format <type>","Output format: brief (single-line summary) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new _K("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new _K("-q, --quiet","Minimal output (message content only)").conflicts("verbose")).option("--tools","Show detailed tool inputs and outputs").action(async(A,_)=>{let G=await $0(A,_);process.exitCode=G.exitCode})}function x9(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 SJ(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 $0(A,_,G={}){let{executeQueryCommand:$}=await Promise.resolve().then(() => (D_(),K0));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 EJ(A,_,G={}){let $=performance.now();if(_.format==="default")QA({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}=P({path:K});try{let Y=new d(Z),J=new PA(Z),H=new L_(Z),Q=await SJ(Y,A,Z);if(!Q){if(_.json)x({command:"show",code:"NOT_FOUND",message:`Session not found: ${A}`,context:{session_id:A}});else{let q=x9(_),U=S$(q,h());console.log(U.formatNotFound(A))}return{exitCode:1}}let X=await J.findBySession(Q.id),B=await H.findBySession(Q.id),W=new Map;for(let q of B)W.set(q.id,q);let V={session:Q,messages:X,toolUses:W};if(_.json){let q=performance.now();return i({command:"show",kind:"session",data:a6(V),meta:{session_id:Q.id,message_count:X.length,timing_ms:Math.round(q-$)}}),{exitCode:0}}let M=x9(_),z=S$(M,h()),T=performance.now(),I=z.formatSession(V,{executionTimeMs:Math.round(T-$)});if(_.format==="ai")I=t(I);return console.log(I),{exitCode:0}}catch(Y){let J=Y instanceof j?Y:new j(R.DB_CONNECTION_FAILED,N(Y));if(_.json)x({command:"show",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(l(J));return{exitCode:1}}finally{D(Z)}}var u$=L(()=>{WA();aA();k0();C5();c();f1();wA();CA();JA();$_();E_()});var h9={};y(h9,{runListInternal:()=>xJ,executeListCommand:()=>m$,createListCommand:()=>y9});import{Command as DJ,Option as Z0}from"commander";function y9(){return new DJ("list").description("List sessions").option("-l, --limit <count>","Maximum sessions to return","20").option("-p, --project <name>","Filter by project name").addOption(new Z0("--since <date>","Sessions after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new Z0("--before <date>","Sessions before date").conflicts("days")).addOption(new Z0("--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 Z0("--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 Z0("-v, --verbose","Show detailed output").conflicts("quiet")).addOption(new Z0("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A)=>{let _=await m$(A);process.exitCode=_.exitCode})}async function m$(A,_={}){let{executeQueryCommand:G}=await Promise.resolve().then(() => (D_(),K0)),$=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 xJ(A,_={}){let G=performance.now();if(A.format==="default")QA({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)x({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=G0(A.since)}catch(H){if(H instanceof FA){if(A.json)x({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=G0(A.before)}catch(H){if(H instanceof FA){if(A.json)x({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}=P({path:$});try{let H=new d(J),Q={limit:K,projectFilter:A.project,sinceDate:Z,beforeDate:Y},X=await H.findFiltered(Q),B=PJ(A);if(A.json){let q=performance.now(),U=X.map(T$);return i({command:"list",kind:"session",data:U,meta:{filters_applied:B,count:U.length,timing_ms:Math.round(q-G)}}),{exitCode:0}}let W="default";if(A.quiet)W="quiet";else if(A.verbose)W="verbose";else if(A.format==="brief")W="brief";let V=h(),M=j1(W,V);if(X.length===0)return console.log(M.formatEmpty()),{exitCode:0};let z=performance.now(),T={executionTimeMs:Math.round(z-G),filtersApplied:B},I=M.formatSessions(X,T);if(A.format==="ai")I=t(I);return console.log(I),{exitCode:0}}catch(H){let Q=H instanceof j?H:new j(R.DB_CONNECTION_FAILED,N(H));if(A.json)x({command:"list",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(l(Q));return{exitCode:1}}finally{D(J)}}function PJ(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 GK=L(()=>{aA();WA();c();F1();wA();o1();CA();JA();$_();E_()});import{copyFileSync as Hq,cpSync as Qq,existsSync as $K,mkdirSync as Xq,readdirSync as Vq,renameSync as Bq,rmSync as Wq,statSync as zq,unlinkSync as Nq}from"fs";function v9(){let A=$K(k5()),_=$K(z_())||$K(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}}var w9=L(()=>{f();o5()});var KK={};y(KK,{gatherStatus:()=>c9,formatTimeAgo:()=>p9,formatStatusOutput:()=>l9,executeStatusCommand:()=>Z_,createStatusCommand:()=>g9,attemptFixes:()=>d9});import{Command as kJ,Option as yJ}from"commander";import{existsSync as hJ,mkdirSync as C9}from"fs";import{dirname as f9}from"path";function g9(){return new kJ("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 yJ("--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 Z_(A);process.exitCode=_.exitCode})}async function c9(A={}){let _=vA(A.hookOverrides),G=g(A.configPath),$=p_(1,A.logPath),K=A.dbPath??S(),Y=hJ(K)||A.stats,J=0,H,Q=0,X=0,B=W1({dbPath:K,configDir:A.configPath?f9(A.configPath):void 0,logsDir:A.logPath?f9(A.logPath):void 0,hookOverrides:A.hookOverrides,preCalculatedHookStatus:_});if(Y)try{let{db:I}=P({path:K});try{let q=new __,U=new N_(I),O=await q.discoverSessions();for(let B0 of O){let cA=await U.findBySessionPath(B0.path);if(!cA||cA.status!=="complete")J++}let k=new b_(I),C=A.projects??10;H=await k.getStats(C);let gA=new rA(I);Q=gA.getEmbeddedCount(),X=gA.getTotalMessageCount()}finally{D(I)}}catch{}let W={active:!1};try{let{readLock:I,isProcessAlive:q}=await Promise.resolve().then(() => (x$(),D$)),U=I();if(U&&q(U.pid))W={active:!0,pid:U.pid,startedAt:U.startedAt,embeddedCount:Q,totalMessages:X}}catch{}let V=v9(),M=g$(),z;if(H)z={...H,hooks:{installed:_.sessionEnd&&_.preCompact,autoSync:G.autoSync,pendingSessions:J}};let T=[];if(A.fix)T=d9(B,h());return{hooks:_,config:vJ(G),lastSync:$.length>0?$[0]?.timestamp??null:null,pendingSessions:J,recentLogs:p_(100,A.logPath).length,embedding:W,health:B,stats:z,migration:V,qmd:M,fixes:T}}function vJ(A){let _={...A.embedding};if(_.apiKey)_.apiKey="[REDACTED:api_key]";if(_.apiKeyRef)_.apiKeyRef=H$(_.apiKeyRef).maskedReference;return{...A,embedding:_}}async function Z_(A,_={}){let G=performance.now();if(A.format==="default")QA({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)x({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??c9)({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=nJ(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 x({command:"stats",code:"DB_CONNECTION_FAILED",message:"Database stats could not be gathered"}),{exitCode:1};return i({command:"stats",kind:"stats",data:O1(J.stats),meta:{generated_at:new Date().toISOString(),timing_ms:Math.round(performance.now()-G)}}),{exitCode:0}}let V={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?O1(J.stats):void 0,migration:J.migration,qmd:J.qmd,fixes:J.fixes};return console.log(JSON.stringify(V,null,2)),{exitCode:H}}let X=h();if(!(A.db||A.hooks||A.embedding||A.config||A.stats||A.all)){if(l9(J),A.fix&&J.fixes.length>0){console.log(`
|
|
1183
|
+
Applied fixes:`);for(let V of J.fixes)console.log(V)}return{exitCode:0}}let W=[];if(A.hooks||A.all)W.push(CJ(J,X));if(A.config||A.all)W.push(fJ(J,X));if(A.db||A.all)W.push(bJ(J,X));if(A.embedding||A.all)W.push(gJ(J,X)),W.push(cJ(J,X)),W.push(uJ(J,X)),W.push(mJ(J,X));if(A.stats||A.all)if(!J.stats)W.push(u("Database statistics are not available.",X));else{let V="default";if(A.quiet)V="quiet";else if(A.verbose)V="verbose";else if(A.format==="brief")V="brief";let M=E1(V,X);if(J.stats.totalSessions===0)W.push(M.formatEmpty());else{let z=M.formatStats(J.stats,{executionTimeMs:Math.round(performance.now()-G)});if(A.format==="ai")z=t(z);W.push(z)}}if(console.log(W.join(`
|
|
1184
|
+
|
|
1185
|
+
`)),A.all||A.db){if(J.migration.status==="pending")console.log(""),console.log(m("Legacy data found at ~/.memory-nexus/. Run any memory command to auto-migrate.",X));else if(J.migration.status==="partial")console.log(""),console.log(m("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(E("No automatic fixes available.",X));else for(let V of J.fixes)console.log(V);return{exitCode:H}}function wJ(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 CJ(A,_){let G=[];if(G.push("Hooks"),G.push(` ${w(A.health.hooks.installed,_)} Installed: ${A.health.hooks.installed?"yes":"no"}`),G.push(` ${w(A.health.hooks.enabled,_)} Enabled (autoSync): ${A.health.hooks.enabled?"yes":"no"}`),A.health.hooks.lastRun)G.push(` ${E(`Last run: ${wJ(A.health.hooks.lastRun)}`,_)}`);else G.push(` ${E("Last run: never",_)}`);return G.join(`
|
|
1186
|
+
`)}function fJ(A,_){let G=[];if(G.push("Configuration"),A.health.config.valid)G.push(` ${w(!0,_)} Valid`);else{G.push(` ${w(!1,_)} Invalid`);for(let $ of A.health.config.issues)G.push(` ${u("-",_)} ${$}`)}return G.join(`
|
|
1187
|
+
`)}function bJ(A,_){let G=[];G.push("Database");let $=S();if(A.health.database.exists)G.push(` ${w(A.health.database.exists,_)} Exists: ${$}`),G.push(` ${w(A.health.database.readable,_)} Readable`),G.push(` ${w(A.health.database.writable,_)} Writable`),G.push(` ${w(A.health.database.integrity==="ok",_)} Integrity: ${lJ(A.health.database.integrity,_)}`),G.push(` ${E(`Size: ${dJ(A.health.database.size)}`,_)}`);else G.push(` ${w(!1,_)} Database not found: ${$}`),G.push(` ${E("Run 'memory sync' to create database",_)}`);if(A.health.sqliteVec.available)G.push(` ${w(!0,_)} sqlite-vec: v${A.health.sqliteVec.version}`);else G.push(` ${w(!1,_)} sqlite-vec: not available`);if(G.push(""),G.push("Permissions"),G.push(` ${w(A.health.permissions.configDir,_)} Config directory: ${T_()}`),G.push(` ${w(A.health.permissions.logsDir,_)} Logs directory: ${l_()}`),G.push(` ${w(A.health.permissions.sourceDir,_)} Source directory: ~/.claude/projects`),G.push(""),G.push("Search Capability"),G.push(` ${w(A.health.searchCapability.fts5,_)} FTS5: available`),G.push(` ${w(A.health.searchCapability.sqliteVec,_)} sqlite-vec: ${A.health.searchCapability.sqliteVec?"available":"not available"}`),G.push(` ${E(`Embeddings: ${A.health.searchCapability.embeddedCount}/${A.health.searchCapability.totalMessages} (${A.health.searchCapability.coveragePercent}%)`,_)}`),G.push(` ${E(`Default mode: ${A.health.searchCapability.defaultMode}`,_)}`),G.push(` ${w(A.health.searchCapability.vectorReady,_)} Vector search: ${A.health.searchCapability.vectorReady?"ready":"not ready"}`),G.push(""),G.push("Optional Tools"),A.qmd.available)G.push(` ${E("[INFO]",_)} qmd: installed at ${A.qmd.path} (enables --files search)`);else G.push(` ${E("[INFO]",_)} qmd: not found (optional -- install with: bun add -g @tobilu/qmd)`);return G.join(`
|
|
1188
|
+
`)}function gJ(A,_){let G=[];if(G.push("Embeddings"),G.push(` ${w(A.health.embedding.enabled,_)} Enabled: ${A.health.embedding.enabled?"yes":"no"}`),G.push(` ${E(`Provider: ${A.health.embedding.provider}`,_)}`),G.push(` ${E(`Model: ${A.health.embedding.model}`,_)}`),G.push(` ${E(`Dimensions: ${A.health.embedding.dimensions}`,_)}`),G.push(` ${w(A.health.embedding.ready,_)} Ready: ${A.health.embedding.ready?"yes":"no"}`),A.health.embedding.readyReason)if(A.health.embedding.ready)G.push(` ${E(`Note: ${A.health.embedding.readyReason}`,_)}`);else G.push(` ${u(`Reason: ${A.health.embedding.readyReason}`,_)}`);return G.join(`
|
|
1189
|
+
`)}function cJ(A,_){let G=[];if(G.push("LLM Fact Extraction"),G.push(` ${w(A.health.llmExtraction.ready,_)} Ready: ${A.health.llmExtraction.ready?"yes":"no"}`),G.push(` ${E(`Provider: ${A.health.llmExtraction.provider}`,_)}`),G.push(` ${E(`Model: ${A.health.llmExtraction.model}`,_)}`),A.health.llmExtraction.readyReason)if(A.health.llmExtraction.ready)G.push(` ${E(`Note: ${A.health.llmExtraction.readyReason}`,_)}`);else G.push(` ${u(`Reason: ${A.health.llmExtraction.readyReason}`,_)}`);return G.join(`
|
|
1190
|
+
`)}function uJ(A,_){let G=u9(A),$=[];if($.push("Provider Egress"),$.push(` ${w(G.consent==="granted",_)} Consent: ${G.consent}`),$.push(b9("Embeddings",G.embedding,_)),$.push(b9("LLM Extraction",G.llmExtraction,_)),G.warnings.length>0)for(let K of G.warnings)$.push(` ${m(`Warning: ${K}`,_)}`);return $.join(`
|
|
1191
|
+
`)}function mJ(A,_){let G=m9(A),$=["Capability Interop"];for(let K of G.providers){let Z=K.status==="optional_unavailable"?"optional unavailable":K.status.replace(/_/g," "),Y=K.available?w(!0,_):E("[INFO]",_);$.push(` ${Y} ${K.provider}: ${Z}`)}if(G.references.length===0)$.push(` ${E("References: none configured",_)}`);else for(let K of G.references){let Z=K.envVar?` via ${K.envVar}`:"";$.push(` ${E(`${K.source}: ${K.maskedReference} (${K.status}${Z})`,_)}`)}for(let K of G.warnings)$.push(` ${m(`Warning: ${K}`,_)}`);return $.join(`
|
|
1192
|
+
`)}function b9(A,_,G){let $=_.host??_.target;if(!_.required)return` ${w(!0,G)} ${A}: local/none (${$})`;if(_.allowed)return` ${w(!0,G)} ${A}: allowed (${$})`;return` ${w(!1,G)} ${A}: blocked - ${_.reason}`}function u9(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 m9(A){return A.health?.capabilityInterop??{providers:[],references:[],warnings:[]}}function w(A,_){if(A)return b("[OK]",_);return u("[FAIL]",_)}function dJ(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 lJ(A,_){switch(A){case"ok":return b("ok",_);case"corrupted":return u("CORRUPTED",_);default:return m("unknown",_)}}function pJ(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 nJ(A){if(!A.database.exists||A.database.integrity==="corrupted")return 2;if(pJ(A)>0||!A.searchCapability.vectorReady)return 1;return 0}function d9(A,_){let G=[];if(!A.permissions.configDir){let $=T_();try{C9($,{recursive:!0}),G.push(b(`Created config directory: ${$}`,_))}catch(K){let Z=N(K);G.push(u(`Failed to create config directory: ${Z}`,_))}}if(!A.permissions.logsDir){let $=l_();try{C9($,{recursive:!0}),G.push(b(`Created logs directory: ${$}`,_))}catch(K){let Z=N(K);G.push(u(`Failed to create logs directory: ${Z}`,_))}}if(A.database.integrity==="corrupted")G.push(m("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(m("Hooks not installed. Run 'memory install' to enable automatic sync.",_));return G}function l9(A){console.log("Memory Status"),console.log(`=============
|
|
1193
|
+
`),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 _=u9(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=m9(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?p9(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(`
|
|
1194
|
+
Recommendation: Run 'memory install' to enable automatic sync.`);if(A.pendingSessions>0)console.log(`
|
|
1195
|
+
Note: ${A.pendingSessions} session(s) pending sync. Run 'memory sync' to sync now.`)}function p9(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 Y0=L(()=>{a_();c();s0();w9();c$();D1();wA();E_();JA();$_();X1()});var i9={};y(i9,{executeStatsCommand:()=>d$,createStatsCommand:()=>n9});import{Command as iJ,Option as ZK}from"commander";function n9(){return new iJ("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new ZK("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new ZK("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new ZK("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async(A)=>{let _=await d$(A);process.exitCode=_.exitCode})}async function d$(A,_={}){return Z_({stats:!0,projects:A.projects,format:A.format,verbose:A.verbose,quiet:A.quiet,json:A.json},{dbPath:_.dbPath})}var YK=L(()=>{Y0()});var e9={};y(e9,{runContextInternal:()=>tJ,executeContextCommand:()=>J0,createContextCommand:()=>t9});import*as a9 from"fs";import*as r9 from"os";import{join as aJ}from"path";import{Command as rJ,Option as GG}from"commander";function t9(){return new rJ("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new GG("--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 GG("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new GG("--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 GG("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new GG("-q, --quiet","Minimal output").conflicts("verbose")).action(async(A,_)=>{let G=await J0(A,_);process.exitCode=G.exitCode})}async function J0(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (D_(),K0));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 tJ(A,_,G){if(_.format==="detailed")QA({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let $=aJ(r9.homedir(),".memory");if(a9.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}=P({path:K});try{return await eJ(Z,A,_)}catch(Y){let J=Y instanceof j?Y:new j(R.DB_CONNECTION_FAILED,N(Y));if(_.json)x({command:"context",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(l(J));return{exitCode:1}}finally{D(Z)}}async function eJ(A,_,G){let $=new c_(A),K=new tA(A),Z=new kA(A),Y=new yA(A),J=new eA(A),H=new f_(A),Q=new GA(A),X=new B_({repository:Q}),B=new F0,W=new g_(A),M=await new E0({projectResolver:$,factRepo:K,frictionRepo:Z,personaRepo:Y,graphRepo:J,governancePolicy:X,rankingService:B,utilityRepo:H,getSessionSummary:async(q,U)=>{let O=await W.getProjectContext(q,{days:U});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(!M)return x({command:"context",code:"NOT_FOUND",message:`Project not found: ${_}`,context:{project:_}}),{exitCode:1};let q=await W.getProjectContext(_,{days:G.days});return i({command:"context",kind:"context",data:q?t6(q):null,meta:{project:_,days:G.days,budget:G.budget,cross_project:!!G.crossProject,mode:"smart",sections:M.sections.map((U)=>({key:U.key,title:U.title}))}}),{exitCode:0}}let z=G.format==="ai"?"ai":G.verbose?"verbose":G.quiet?"quiet":G.format==="detailed"?"detailed":"brief",T=h(),I=R$(z,T);if(!M){let q=I.formatEmpty(_);if(z!=="quiet"||q)console.error(q);return{exitCode:1}}if(I.formatSmartContext){let q=I.formatSmartContext(M);console.log(q)}else{let q=M.sections.find((U)=>U.key==="session_summary");if(q)console.log(q.content);else{let U=M.sections.map((O)=>`${O.title}:
|
|
1196
|
+
${O.content}`).join(`
|
|
1197
|
+
|
|
1198
|
+
`);console.log(U)}}return{exitCode:0}}var l$=L(()=>{WA();M_();h0();q_();C_();w0();_$();c();vG();v_();S0();j$();CA();JA();$_();E_()});var o9={};y(o9,{runRelatedInternal:()=>oJ,executeRelatedCommand:()=>Q0,createRelatedCommand:()=>s9});import{Command as sJ,Option as H0}from"commander";function s9(){return new sJ("related").description("Find sessions related through shared topics/entities").argument("<id>","Session ID, message ID, or topic name").addOption(new H0("--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 H0("--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 H0("--type <type>","Entity type of the ID").choices(["session","message","topic"]).default("session")).addOption(new H0("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).option("--json","Output as JSON").addOption(new H0("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new H0("-q, --quiet","Minimal output (session IDs only)").conflicts("verbose")).action(async(A,_)=>{let G=await Q0(A,_);process.exitCode=G.exitCode})}async function Q0(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (D_(),K0));process.env.MEMORY_JSON_COMMAND_OVERRIDE="related";try{return await G(A,{..._,kind:"related"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function oJ(A,_,G){let $=performance.now();if(_.format==="detailed")QA({command:"related",alias:"detailed",replacement:"Use --format brief or --format ai.",json:_.json});let K=G?.dbPath??_.dbPath??S(),{db:Z}=P({path:K});try{let Y=new y0(Z),J=new d(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 B=h(),W=k1(X,B);if(Q.length===0){let U=await Y.findBySource(H,A),O=await Y.findByTarget(H,A);if(U.length===0&&O.length===0){if(_.json)x({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let k=W.formatEmpty(A);if(X!=="quiet"||k)console.error(k)}return{exitCode:1}}}let V=new Map;for(let{link:U,hop:O}of Q)if(U.targetType==="session"){let k=V.get(U.targetId);if(!k||U.weight>k.weight)V.set(U.targetId,{weight:U.weight,hops:O})}V.delete(A);let M=Array.from(V.entries()).sort((U,O)=>O[1].weight-U[1].weight||U[1].hops-O[1].hops).slice(0,_.limit??10),z=[];for(let[U,{weight:O,hops:k}]of M){let C=await J.findById(U);if(C)z.push({session:C,weight:O,hops:k})}if(z.length===0){if(_.json)x({command:"related",code:"NOT_FOUND",message:`No related items found for ${A}`,context:{source_id:A,source_type:H}});else{let U=W.formatEmpty(A);if(X!=="quiet"||U)console.error(U)}return{exitCode:1}}if(_.json){let U=performance.now();return i({command:"related",kind:"related",data:z.map(r6),meta:{source_id:A,source_type:H,count:z.length,timing_ms:Math.round(U-$)}}),{exitCode:0}}let T=performance.now(),I={sourceId:A,executionTimeMs:Math.round(T-$)},q=W.formatRelated(z,I);if(_.format==="ai")q=t(q);return console.log(q),{exitCode:0}}catch(Y){let J=Y instanceof j?Y:new j(R.DB_CONNECTION_FAILED,N(Y));if(_.json)x({command:"related",code:J.code,message:J.message,...J.context!==void 0?{context:J.context}:{}});else console.error(l(J));return{exitCode:1}}finally{D(Z)}}var p$=L(()=>{WA();c5();c();h1();wA();CA();JA();$_();E_()});var K0={};y(K0,{executeQueryCommand:()=>n$,createQueryCommand:()=>AZ});import{Command as AH,Option as X0}from"commander";function AZ(){return new AH("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 X0("--scope <scope>","Query scope: global or project").choices(["global","project"])).option("-p, --project <name>","Filter by project name").addOption(new X0("--kind <kind>","Resource kind to query").choices(["message","session","file","stats","context","related"]).default("message")).addOption(new X0("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"])).option("-l, --limit <count>","Maximum results to return").addOption(new X0("--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 X0("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new X0("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await n$(A,_);process.exitCode=G.exitCode})}async function n$(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(() => ($G(),JK));return await Y(A||"",{..._,project:$,files:!1})}case"file":{let{runSearchInternal:Y}=await Promise.resolve().then(() => ($G(),JK));return await Y(A||"",{..._,project:$,files:!0})}case"session":if(A){let{runShowInternal:Y}=await Promise.resolve().then(() => (u$(),k9));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(() => (GK(),h9));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(() => (YK(),i9));return await Y({json:_.json,verbose:_.verbose,quiet:_.quiet,projects:_.projects,format:_.format},{dbPath:_.dbPath})}case"context":{let Y=$||A;if(!Y){if(_.json)x({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(() => (l$(),e9));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)x({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(() => (p$(),o9));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)x({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 D_=L(()=>{JA()});var JK={};y(JK,{runSearchInternal:()=>GH,resolveSearchMode:()=>_Z,filterCaseSensitive:()=>$Z,executeSearchCommand:()=>V0,createSearchCommand:()=>GZ});import{Command as _H,Option as bA}from"commander";function _Z(A){if(A.vector===!1)return"fts";if(!A.mode||A.mode==="auto")return;return A.mode}function GZ(){return new _H("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 bA("--since <date>","Results after date (e.g., 'yesterday', '2 weeks ago')").conflicts("days")).addOption(new bA("--before <date>","Results before date").conflicts("days")).addOption(new bA("--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 bA("--mode <mode>","Search mode: auto, fts, vector, hybrid").choices(["auto","fts","vector","hybrid"]).default("auto")).addOption(new bA("--no-vector","Disable vector search (same as --mode fts)")).addOption(new bA("--no-decay","Disable temporal decay scoring")).option("--files","Search markdown files via qmd (requires qmd installed)").addOption(new bA("--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 bA("-v, --verbose","Show detailed output with execution info").conflicts("quiet")).addOption(new bA("-q, --quiet","Suppress headers and decorations").conflicts("verbose")).action(async(A,_)=>{let G=await V0(A,_);process.exitCode=G.exitCode})}async function V0(A,_){let{executeQueryCommand:G}=await Promise.resolve().then(() => (D_(),K0)),$=_.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 GH(A,_){let G=performance.now();if(_.format==="default")QA({command:"search",alias:"default",replacement:"Omit --format for default behavior, or use --format brief / --format ai.",json:_.json});let $;try{$=T0.from(A)}catch(H){if(_.json)x({command:"search",code:"INVALID_QUERY",message:"Query cannot be empty"});else console.error("Error: Query cannot be empty");return{exitCode:1}}if(_.files)return $H(A,_);let K=_.dbPath??S(),{db:Z,sqliteVecAvailable:Y}=P({path:K}),J=new P$;try{let H=g(),Q=new C0(Z),X=new rA(Z),B=new f0({db:Z,fts5Service:Q,embeddingRepo:X,providerFactory:J,config:H,sqliteVecAvailable:Y}),W=parseInt(_.limit??"10",10);if(isNaN(W)||W<1){if(_.json)x({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 V;if(_.role){let v=_.role.split(",").map((W0)=>W0.trim().toLowerCase());if(v.length===1)V=v[0];else V=v}let M,z;if(_.days){let v=new Date,W0=new Date(v.getFullYear(),v.getMonth(),v.getDate());M=new Date(W0.getTime()-(_.days-1)*24*60*60*1000)}else{if(_.since)try{M=G0(_.since)}catch(v){if(v instanceof FA){if(_.json)x({command:"search",code:"INVALID_ARGUMENT",message:v.message,context:{flag:"since",value:_.since}});else console.error(`Error: ${v.message}`);return{exitCode:1}}throw v}if(_.before)try{z=G0(_.before)}catch(v){if(v instanceof FA){if(_.json)x({command:"search",code:"INVALID_ARGUMENT",message:v.message,context:{flag:"before",value:_.before}});else console.error(`Error: ${v.message}`);return{exitCode:1}}throw v}}let T=_Z(_),q={limit:_.caseSensitive?W*2:W,projectFilter:_.project,roleFilter:V,sinceDate:M,beforeDate:z,sessionFilter:_.session,mode:T,noDecay:_.decay===!1},U=await B.search($,q),O=!1;if(_.caseSensitive&&U.length>0){let v=U.length;U=$Z(U,A,W),O=v>U.length||U.length<W}else U=U.slice(0,W);let k=B.getLastSearchMeta(),C="default";if(_.json)C="json";else if(_.quiet)C="quiet";else if(_.verbose)C="verbose";else if(_.format==="brief")C="brief";let gA=h(),B0=R1(C,gA),cA=performance.now(),uA={query:A,executionDetails:{timeMs:Math.round(cA-G),ftsQuery:A,filtersApplied:ZH(_,O)},searchMeta:k??void 0},kZ=Math.round(performance.now()-G),yZ=()=>{let v={query:A,total_results:U.length,timing_ms:kZ};if(k){if(v.mode=k.mode,v.mode_reason=k.modeReason,v.embedding_coverage=k.embeddingCoverage,v.degraded=k.degraded,k.degradationReason)v.degradation_reason=k.degradationReason}return v};if(_.json){if(i({command:"search",kind:"message",data:U.map((v,W0)=>q$(v,{rank:W0+1,includeSearchMetaFields:!!k})),meta:yZ()}),k&&k.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),sA({search:{...H.search,hintShown:!0}});return{exitCode:0}}if(U.length===0&&k?.mode==="vector")return console.log(`No semantic matches for "${A}"`),{exitCode:0};let a$=B0.formatResults(U,uA);if(_.format==="ai")a$=t(a$);if(console.log(a$),k&&k.embeddingCoverage===0&&!H.search?.hintShown)console.error("Tip: run 'memory sync --embed' to enable semantic search"),sA({search:{...H.search,hintShown:!0}});return{exitCode:0}}catch(H){let Q=H instanceof j?H:new j(R.DB_CONNECTION_FAILED,N(H));if(_.json)x({command:"search",code:Q.code,message:Q.message,...Q.context!==void 0?{context:Q.context}:{}});else console.error(l(Q));return{exitCode:1}}finally{await J.dispose(),D(Z)}}async function $H(A,_){if(!AK()){if(_.json)x({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 b$().search(A);if(_.json)return i({command:"search",kind:"file",data:$.map(i6),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=h(),Z=KH($,K);if(_.format==="ai")Z=t(Z);return console.log(Z),{exitCode:0}}catch(G){let $=N(G);if(_.json)x({command:"search",code:"QMD_FAILED",message:`qmd search failed: ${$}`});else console.error(`Error: qmd search failed: ${$}`);return{exitCode:1}}}function KH(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(` ${b($.title,_)}`),G.push(` ${E(`${K} (score: ${$.score})`,_)}`);let Z=$.snippet||$.context;if(Z)G.push(` ${Z}`);G.push("")}return G.join(`
|
|
1199
|
+
`)}function ZH(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 $Z(A,_,G){return A.filter((K)=>{return K.snippet.replace(/<\/?mark>/g,"").includes(_)}).slice(0,G)}var $G=L(()=>{WA();c();p1();$A();I$();wA();o1();CA();JA();$_();E_();c$()});O0();N0();HG();JG();WA();var T8={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class jG{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor(A,_,G,$,K,Z,Y,J,H,Q=T8){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 j(R.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:N(X)})}$.sessionsDiscovered=Y.length;let J=await this.filterSessions(Y,A);if(Z.size>0){let X=J.length;J=J.filter((B)=>!Z.has(B.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 B=J[X];if(!B)continue;A.onProgress?.({current:X+1+Z.size,total:H,sessionId:B.id,phase:"extracting"});try{let W=await this.extractSession(B);if($.sessionsProcessed++,$.messagesInserted+=W.messages,$.toolUsesInserted+=W.toolUses,G)Q.completedSessions++,Q.completedSessionIds.push(B.id),Q.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(Q);A.onSessionComplete?.(B.id)}catch(W){let V=this.wrapError(W,B.path);$.errors.push({sessionPath:B.path,error:V.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 j)return A;let G=N(A);if(G.includes("ENOENT")||G.includes("no such file"))return new j(R.SOURCE_INACCESSIBLE,`Cannot access session file: ${G}`,{path:_});if(G.includes("JSON")||G.includes("parse"))return new j(R.INVALID_JSON,`Failed to parse session file: ${G}`,{path:_});if(G.includes("locked")||G.includes("SQLITE_BUSY"))return new j(R.DB_LOCKED,`Database is locked: ${G}`,{path:_});if(G.includes("database")||G.includes("SQLITE"))return new j(R.DB_CONNECTION_FAILED,`Database error: ${G}`,{path:_});return new j(R.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=ZA.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=UA.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((B)=>({message:B,sessionId:A.id})));if(Z.length>0)this.toolUseRepo.saveMany(Z.map((B)=>({toolUse:B,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(N($));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=MA.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((B)=>B.type==="text").map((B)=>B.text).join(`
|
|
1200
|
+
`),H=this.redactor.redactText(J).text,Q=Y.data.message.content.filter((B)=>B.type==="tool_use").map((B)=>B.id);for(let B of Y.data.message.content)if(B.type==="tool_use"){let W=qA.create({id:B.id,name:B.name,input:this.redactor.redactJson(B.input).value,timestamp:new Date(Y.data.timestamp),status:"pending"});$.set(B.id,W)}let X=MA.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=qA.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}}}class gK{sessionSource;extractionStateRepo;syncService;syncLogger;recoveryEnabled;constructor(A,_,G,$,K){this.sessionSource=A;this.extractionStateRepo=_;this.syncService=G;this.syncLogger=$;this.recoveryEnabled=K}async recover(A={}){if(!this.recoveryEnabled&&!A.dryRun)return{pendingSessions:[],syncedSessions:0,errors:[],skipped:!0};let _=await this.sessionSource.discoverSessions(),G=[];for(let Y of _){let J=await this.extractionStateRepo.findBySessionPath(Y.path);if(!J||J.status!=="complete")G.push(Y.path)}if(this.syncLogger.log({level:"info",message:`Recovery scan found ${G.length} pending sessions`}),A.dryRun)return{pendingSessions:G,syncedSessions:0,errors:[],skipped:!1};let $=A.maxSessions?G.slice(0,A.maxSessions):G,K=0,Z=[];for(let Y of $)try{let J=cK(Y);await this.syncService.sync({sessionFilter:J}),K++,this.syncLogger.log({level:"info",message:`Recovery synced session ${J}`,sessionId:J})}catch(J){let H=N(J);Z.push({sessionPath:Y,error:H}),this.syncLogger.log({level:"error",message:`Recovery failed for ${Y}: ${H}`,error:H})}return{pendingSessions:G,syncedSessions:K,errors:Z,skipped:!1}}async getPendingCount(){let A=await this.sessionSource.discoverSessions(),_=0;for(let G of A){let $=await this.extractionStateRepo.findBySessionPath(G.path);if(!$||$.status!=="complete")_++}return _}}function cK(A){let _=A.split(/[/\\]/);return _[_.length-1].replace(/\.jsonl$/,"")}z0();var I8=["Read","Write","Edit","NotebookEdit"],O8=["Glob","Grep"],R8=["Write","Edit","NotebookEdit"];class uK{static extractFilePaths(A){let _=new Set;for(let G of A){let $=G.input;if(I8.includes(G.name)){let K=$.file_path;if(K)_.add(K)}if(O8.includes(G.name)){let K=$.path;if(K)_.add(K)}if(G.name==="Glob"&&G.result){let K=G.result.split(`
|
|
1201
|
+
`);for(let Z of K){let Y=Z.trim();if(Y)_.add(Y)}}}return Array.from(_)}static extractFileModifications(A){let _=[];for(let G of A){if(!R8.includes(G.name))continue;if(G.status!=="success")continue;let $=G.input.file_path;if($)_.push({path:$,operation:G.name,timestamp:G.timestamp})}return _}static extractToolStats(A){let _=new Map;for(let G of A){let $=_.get(G.name);if($){if($.count++,G.status==="success")$.successCount++;else if(G.status==="error")$.errorCount++}else _.set(G.name,{count:1,successCount:G.status==="success"?1:0,errorCount:G.status==="error"?1:0})}return Array.from(_.entries()).map(([G,$])=>({name:G,...$}))}static extractToolNames(A){let _=new Set;for(let G of A)_.add(G.name);return Array.from(_)}static toFileEntities(A){return A.map((_)=>KA.create({type:"file",name:_,confidence:1}))}static toFileModificationEntities(A){return A.map((_)=>{let G={operation:_.operation.toLowerCase()};return KA.create({type:"file",name:_.path,confidence:1,metadata:G})})}}$5();J5();import{existsSync as S8}from"fs";var pK={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};function h_(A,_){return A.redactText(_).text}function R0(A,_){return _===null?null:h_(A,_)}async function H5(A,_,G={}){let $=G.includeSensitive?pK:G.redactor??pK,K=A.query(`SELECT id, project_path_encoded as projectPathEncoded,
|
|
876
1202
|
project_path_decoded as projectPathDecoded,
|
|
877
1203
|
project_name as projectName,
|
|
878
1204
|
start_time as startTime, end_time as endTime,
|
|
879
1205
|
message_count as messageCount, summary
|
|
880
|
-
FROM sessions`).all().map((
|
|
1206
|
+
FROM sessions`).all().map((z)=>({...z,summary:R0($,z.summary)})),Z=A.query(`SELECT id, session_id as sessionId, role, content, timestamp,
|
|
881
1207
|
tool_use_ids as toolUseIds
|
|
882
|
-
FROM messages_meta`).all().map((
|
|
883
|
-
FROM tool_uses`).all().map((
|
|
884
|
-
FROM entities`).all().map((
|
|
1208
|
+
FROM messages_meta`).all().map((z)=>({...z,content:h_($,z.content)})),Y=A.query(`SELECT id, session_id as sessionId, name, input, timestamp, status, result
|
|
1209
|
+
FROM tool_uses`).all().map((z)=>({...z,input:h_($,z.input),result:R0($,z.result)})),J=A.query(`SELECT id, type, name, metadata, confidence
|
|
1210
|
+
FROM entities`).all().map((z)=>({...z,name:h_($,z.name),metadata:R0($,z.metadata)})),H=A.query(`SELECT source_type as sourceType, source_id as sourceId,
|
|
885
1211
|
target_type as targetType, target_id as targetId,
|
|
886
1212
|
relationship, weight
|
|
887
|
-
FROM links`).all(),
|
|
888
|
-
FROM session_entities`).all(),
|
|
889
|
-
FROM entity_links`).all(),B
|
|
1213
|
+
FROM links`).all(),Q=A.query(`SELECT session_id as sessionId, entity_id as entityId, frequency
|
|
1214
|
+
FROM session_entities`).all(),X=A.query(`SELECT source_id as sourceId, target_id as targetId, relationship, weight
|
|
1215
|
+
FROM entity_links`).all(),B=A.query(`SELECT id, session_path as sessionPath, started_at as startedAt,
|
|
890
1216
|
status, completed_at as completedAt,
|
|
891
1217
|
messages_extracted as messagesExtracted,
|
|
892
1218
|
error_message as errorMessage,
|
|
893
1219
|
file_mtime as fileMtime, file_size as fileSize
|
|
894
|
-
FROM extraction_state`).all().map((
|
|
1220
|
+
FROM extraction_state`).all().map((z)=>({...z,sessionPath:h_($,z.sessionPath),errorMessage:R0($,z.errorMessage)})),W=A.query(`SELECT uuid, type, project, content, metadata,
|
|
895
1221
|
observed_at as observedAt, superseded_at as supersededAt,
|
|
896
1222
|
superseded_by as supersededBy
|
|
897
|
-
FROM facts`).all().map((
|
|
1223
|
+
FROM facts`).all().map((z)=>({...z,content:h_($,z.content),metadata:R0($,z.metadata)})),V={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:B.length,facts:W.length},sessions:K,messages:Z,toolUses:Y,entities:J,links:H,sessionEntities:Q,entityLinks:X,extractionStates:B,facts:W},M=JSON.stringify(V,null,2);return await Bun.write(_,M),{sessions:K.length,messages:Z.length,toolUses:Y.length,entities:J.length,links:H.length,bytes:M.length,facts:W.length}}async function EG(A){if(!S8(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: ${N(_)}`}}}async function Q5(A,_,G={}){let $=await EG(_);if(!$.valid)throw Error(`Invalid export file: ${$.error}`);let Z=await Bun.file(_).text(),Y=JSON.parse(Z);if(G.clearExisting)E8(A);return A.transaction(()=>{let H=A.prepare(`
|
|
898
1224
|
INSERT OR IGNORE INTO sessions
|
|
899
1225
|
(id, project_path_encoded, project_path_decoded, project_name,
|
|
900
1226
|
start_time, end_time, message_count, summary)
|
|
901
1227
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
902
|
-
`);for(let
|
|
1228
|
+
`);for(let V of Y.sessions)H.run(V.id,V.projectPathEncoded,V.projectPathDecoded,V.projectName,V.startTime,V.endTime,V.messageCount,V.summary);let Q=A.prepare(`
|
|
903
1229
|
INSERT OR IGNORE INTO messages_meta
|
|
904
1230
|
(id, session_id, role, content, timestamp, tool_use_ids)
|
|
905
1231
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
906
|
-
`);for(let
|
|
1232
|
+
`);for(let V of Y.messages)Q.run(V.id,V.sessionId,V.role,V.content,V.timestamp,V.toolUseIds);let X=A.prepare(`
|
|
907
1233
|
INSERT OR IGNORE INTO tool_uses
|
|
908
1234
|
(id, session_id, name, input, timestamp, status, result)
|
|
909
1235
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
910
|
-
`);for(let
|
|
1236
|
+
`);for(let V of Y.toolUses)X.run(V.id,V.sessionId,V.name,V.input,V.timestamp,V.status,V.result);let B=A.prepare(`
|
|
911
1237
|
INSERT OR IGNORE INTO entities
|
|
912
1238
|
(id, type, name, metadata, confidence)
|
|
913
1239
|
VALUES (?, ?, ?, ?, ?)
|
|
914
|
-
`);for(let
|
|
1240
|
+
`);for(let V of Y.entities)B.run(V.id,V.type,V.name,V.metadata,V.confidence);let W=A.prepare(`
|
|
915
1241
|
INSERT OR IGNORE INTO links
|
|
916
1242
|
(source_type, source_id, target_type, target_id, relationship, weight)
|
|
917
1243
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
918
|
-
`);for(let
|
|
1244
|
+
`);for(let V of Y.links)W.run(V.sourceType,V.sourceId,V.targetType,V.targetId,V.relationship,V.weight);if(Y.sessionEntities&&Y.sessionEntities.length>0){let V=A.prepare(`
|
|
919
1245
|
INSERT OR IGNORE INTO session_entities
|
|
920
1246
|
(session_id, entity_id, frequency)
|
|
921
1247
|
VALUES (?, ?, ?)
|
|
922
|
-
`);for(let
|
|
1248
|
+
`);for(let M of Y.sessionEntities)V.run(M.sessionId,M.entityId,M.frequency)}if(Y.entityLinks&&Y.entityLinks.length>0){let V=A.prepare(`
|
|
923
1249
|
INSERT OR IGNORE INTO entity_links
|
|
924
1250
|
(source_id, target_id, relationship, weight)
|
|
925
1251
|
VALUES (?, ?, ?, ?)
|
|
926
|
-
`);for(let
|
|
1252
|
+
`);for(let M of Y.entityLinks)V.run(M.sourceId,M.targetId,M.relationship,M.weight)}if(Y.extractionStates&&Y.extractionStates.length>0){let V=A.prepare(`
|
|
927
1253
|
INSERT OR IGNORE INTO extraction_state
|
|
928
1254
|
(id, session_path, started_at, status, completed_at,
|
|
929
1255
|
messages_extracted, error_message, file_mtime, file_size)
|
|
930
1256
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
931
|
-
`);for(let
|
|
1257
|
+
`);for(let M of Y.extractionStates)V.run(M.id,M.sessionPath,M.startedAt,M.status,M.completedAt,M.messagesExtracted,M.errorMessage,M.fileMtime,M.fileSize)}if(Y.facts&&Y.facts.length>0){let V=A.prepare(`
|
|
932
1258
|
INSERT OR IGNORE INTO facts
|
|
933
1259
|
(uuid, type, project, content, metadata, observed_at, superseded_at, superseded_by)
|
|
934
1260
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
935
|
-
`);for(let
|
|
936
|
-
(SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}function
|
|
937
|
-
`).filter(Boolean)
|
|
938
|
-
`)}try{
|
|
939
|
-
`)}return
|
|
940
|
-
`);return""}function
|
|
941
|
-
`)}catch(
|
|
942
|
-
Interrupt received. Choose action:`),console.log(" 1) Abort immediately"),console.log(" 2) Abort after current session (saves progress)"),console.log(" 3) Cancel abort (continue)")
|
|
943
|
-
Force exiting...`),await
|
|
944
|
-
Interrupt received, shutting down after current operation...`),
|
|
945
|
-
`)}function
|
|
946
|
-
<td>${
|
|
947
|
-
<td class="severity-${
|
|
948
|
-
<td>${
|
|
949
|
-
<td>${
|
|
950
|
-
<td>${
|
|
1261
|
+
`);for(let M of Y.facts)V.run(M.uuid,M.type,M.project,M.content,M.metadata,M.observedAt,M.supersededAt,M.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 E8(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 X5(A){return(A.query(`SELECT (SELECT COUNT(*) FROM sessions) +
|
|
1262
|
+
(SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}function D8(A,_,G=30,$=new Date){let K=$.getTime(),Z=86400000;return A.map((J)=>{let H=_.get(J.rowid);if(!H)return{...J,decayedScore:J.score};let Q=(K-H.getTime())/86400000,X=Math.pow(0.5,Q/G);return{...J,decayedScore:J.score*X}}).sort((J,H)=>H.decayedScore-J.decayedScore)}var x8=["decisions","learnings","user_prefs"];function P8(A,_,G,$=30,K=new Date){let Z=K.getTime(),Y=86400000;return A.map((H)=>{if(G.has(H.rowid))return{...H,decayedScore:H.score};let Q=_.get(H.rowid);if(!Q)return{...H,decayedScore:H.score};let X=(Z-Q.getTime())/86400000,B=Math.pow(0.5,X/$);return{...H,decayedScore:H.score*B}}).sort((H,Q)=>Q.decayedScore-H.decayedScore)}QG();class DG{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:N($)}),_}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=Y_.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:N(Z)})}}return _}}XG();WA();import{existsSync as k8,readFileSync as y8,unlinkSync as h8}from"fs";var v8={redactText:(A)=>({text:A,findings:[]}),redactJson:(A)=>({value:A,findings:[]})};class xG{repository;redactor;constructor(A,_=v8){this.repository=A;this.redactor=_}async log(A){let _=mA.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 j(R.NOT_FOUND,`Friction entry #${A} not found`,{id:A});if(G.status!=="open")throw new j(R.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 j(R.NOT_FOUND,`Friction entry #${A} not found`,{id:A});if(G.status!=="open")throw new j(R.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(!k8(A))return 0;let G=y8(A,"utf-8").split(`
|
|
1263
|
+
`).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}
|
|
1264
|
+
`)}try{h8(A)}catch{process.stderr.write(`Warning: could not delete ${A} (entries already ingested)
|
|
1265
|
+
`)}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)}}iK();vG();fG();U5();S0();v_();dG();import{Command as JU,Option as HU}from"commander";D5();c();s0();import{createReadStream as tY}from"fs";import{createInterface as eY}from"readline";function s_(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 dY=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function v6(A){if(typeof A!=="object"||A===null)return!1;return typeof A.type==="string"}function N1(A){if(!v6(A))return{type:"skipped",reason:"Invalid event structure"};let _=A.type;if(dY.has(_))return{type:"skipped",reason:`Event type "${_}" not extracted`};switch(_){case"user":return lY(A);case"assistant":return nY(A);case"summary":return aY(A);case"system":return rY(A);default:return{type:"skipped",reason:`Event type "${_}" not classified`}}}function lY(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"User event missing required fields"};let _={uuid:A.uuid,message:{content:pY(A.message.content)},timestamp:s_(A.timestamp)};if(A.cwd)_.cwd=A.cwd;if(A.gitBranch)_.gitBranch=A.gitBranch;return{type:"user",data:_}}function pY(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(`
|
|
1266
|
+
`);return""}function nY(A){if(!A.uuid||!A.timestamp||!A.message)return{type:"skipped",reason:"Assistant event missing required fields"};let _=iY(A.message.content||[]),G={uuid:A.uuid,message:{content:_},timestamp:s_(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 iY(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 aY(A){if(!A.summary)return{type:"skipped",reason:"Summary event missing summary field"};let _={content:A.summary,timestamp:s_(A.timestamp)};if(A.leafUuid)_.leafUuid=A.leafUuid;return{type:"summary",data:_}}function rY(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:s_(A.timestamp)}}}class W${async*parse(A){let _=tY(A,{encoding:"utf8"}),G=eY({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 N1(Y)}catch(Y){let J=N(Y);yield{type:"skipped",reason:`Malformed JSON at line ${$}: ${J}`}}}}}f();import{existsSync as L1,mkdirSync as sY,readFileSync as oY,unlinkSync as A7,writeFileSync as _7}from"fs";import{dirname as G7}from"path";function z$(A){return A??tG()}function w6(A,_){let G=z$(_),$=G7(G);try{sY($,{recursive:!0}),_7(G,JSON.stringify(A,null,2)+`
|
|
1267
|
+
`)}catch(K){console.warn("Failed to save checkpoint:",K.message)}}function o_(A){let _=z$(A);if(!L1(_))return null;try{let G=oY(_,"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 C6(A){let _=z$(A);if(L1(_))try{A7(_)}catch(G){console.warn("Failed to clear checkpoint:",G.message)}}function f6(A){return L1(z$(A))}import*as g6 from"readline";var r={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function $7(){if(r.ttyOverride!==null)return r.ttyOverride;return process.stdin.isTTY??!1}function N$(A){if(r.exitOverride!==null){r.exitOverride(A);return}process.exit(A)}async function c6(){for(let A of r.cleanupFunctions)try{await A()}catch(_){console.warn("Cleanup error:",_.message)}}async function K7(){let A=g6.createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{let G=()=>{console.log(`
|
|
1268
|
+
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 Z7(A){switch(A){case 1:console.log("Aborting immediately..."),await c6(),N$(130);break;case 2:console.log("Will abort after current session..."),r.isShuttingDown=!0;break;case 3:console.log("Continuing..."),r.interruptCount=0;break}}async function b6(){if(r.interruptCount++,r.interruptCount>=2){console.log(`
|
|
1269
|
+
Force exiting...`),await c6(),N$(130);return}if($7()){let A=await K7();await Z7(A)}else console.log(`
|
|
1270
|
+
Interrupt received, shutting down after current operation...`),r.isShuttingDown=!0}function u6(){if(r.handlersRegistered)return;process.on("SIGINT",()=>{b6().catch((A)=>{console.error("Signal handler error:",A),N$(1)})}),process.on("SIGTERM",()=>{b6().catch((A)=>{console.error("Signal handler error:",A),N$(1)})}),r.handlersRegistered=!0}function m6(){return r.isShuttingDown}function d6(A){r.cleanupFunctions.push(A)}function l6(A){let _=r.cleanupFunctions.indexOf(A);if(_!==-1)r.cleanupFunctions.splice(_,1)}class L${shouldAbort(){return m6()}}class M${path;constructor(A){this.path=A}load(){return o_(this.path)}save(A){w6(A,this.path)}clear(){C6(this.path)}}G_();I$();F1();D1();j$();h1();f1();CA();import{readFileSync as N7}from"fs";import{resolve as L7}from"path";function g1(A,_,G,$,K){if(A.total===0)return"No friction entries logged yet.";let Z=[];Z.push(AA("Friction Dashboard",$)),Z.push("=================="),Z.push(""),Z.push(AA(" Overview",$)),Z.push(" --------"),Z.push(` Total: ${A.total} Open: ${m(String(A.open),$)} Resolved: ${b(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(AA(" 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],B=Math.round(X/H*20),W="=".repeat(B)+" ".repeat(20-B),V=Q.padEnd(10),M=Q==="critical"||Q==="high"?u(V,$):Q==="medium"?m(V,$):b(V,$);Z.push(` ${M}[${W}] ${X}`)}Z.push(""),Z.push(AA(" By Category",$)),Z.push(" -----------");for(let[Q,X]of Object.entries(A.byCategory))Z.push(` ${p6(Q.padEnd(14),$)}${X}`);if(Z.push(""),A.byTool&&Object.keys(A.byTool).length>0){Z.push(AA(" By Tool",$)),Z.push(" -------");for(let[Q,X]of Object.entries(A.byTool)){let B="=".repeat(Math.min(X,40));Z.push(` ${Q.padEnd(15)} ${B} ${X}`)}Z.push("")}if(K&&K.length>0){Z.push(AA(" 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(AA(" Trends",$)),Z.push(" ------"),Z.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let Q of _)Z.push(` ${E(Q.week.padEnd(12),$)}${String(Q.newCount).padEnd(6)}${Q.resolvedCount}`)}return Z.join(`
|
|
1271
|
+
`)}function M7(){let A=L7(import.meta.dirname,"../../../../node_modules/chart.js/dist/chart.umd.js");return N7(A,"utf-8")}function U7(A){return A.map((_)=>({id:_.id,severity:_.severity,category:_.category,description:_.description,daysOpen:Math.floor((Date.now()-_.loggedAt.getTime())/86400000)}))}function c1(A,_,G,$){let K=M7(),Z=U7(G),Y=A.meanTimeToResolve!==null?`${A.meanTimeToResolve.toFixed(1)} days`:"N/A",J=Z.map((H)=>`<tr>
|
|
1272
|
+
<td>${H.id??"-"}</td>
|
|
1273
|
+
<td class="severity-${H.severity}">${H.severity}</td>
|
|
1274
|
+
<td>${H.category}</td>
|
|
1275
|
+
<td>${b1(H.description)}</td>
|
|
1276
|
+
<td>${H.daysOpen}d</td>
|
|
951
1277
|
</tr>`).join(`
|
|
952
1278
|
`);return`<!DOCTYPE html>
|
|
953
1279
|
<html lang="en">
|
|
@@ -976,30 +1302,30 @@ Interrupt received, shutting down after current operation...`),n.isShuttingDown=
|
|
|
976
1302
|
.resolved { color: #44bb44; }
|
|
977
1303
|
.generated { color: #666; font-size: 0.8em; margin-top: 48px; text-align: center; }
|
|
978
1304
|
</style>
|
|
979
|
-
<script>${
|
|
1305
|
+
<script>${K}</script>
|
|
980
1306
|
</head>
|
|
981
1307
|
<body>
|
|
982
1308
|
<h1>Friction Dashboard</h1>
|
|
983
1309
|
|
|
984
1310
|
<div class="stats-grid">
|
|
985
1311
|
<div class="stat-card">
|
|
986
|
-
<div class="stat-value">${
|
|
1312
|
+
<div class="stat-value">${A.total}</div>
|
|
987
1313
|
<div class="stat-label">Total</div>
|
|
988
1314
|
</div>
|
|
989
1315
|
<div class="stat-card">
|
|
990
|
-
<div class="stat-value open">${
|
|
1316
|
+
<div class="stat-value open">${A.open}</div>
|
|
991
1317
|
<div class="stat-label">Open</div>
|
|
992
1318
|
</div>
|
|
993
1319
|
<div class="stat-card">
|
|
994
|
-
<div class="stat-value resolved">${
|
|
1320
|
+
<div class="stat-value resolved">${A.resolved}</div>
|
|
995
1321
|
<div class="stat-label">Resolved</div>
|
|
996
1322
|
</div>
|
|
997
1323
|
<div class="stat-card">
|
|
998
|
-
<div class="stat-value">${
|
|
1324
|
+
<div class="stat-value">${A.wontFix}</div>
|
|
999
1325
|
<div class="stat-label">Won't Fix</div>
|
|
1000
1326
|
</div>
|
|
1001
1327
|
<div class="stat-card">
|
|
1002
|
-
<div class="stat-value">${
|
|
1328
|
+
<div class="stat-value">${Y}</div>
|
|
1003
1329
|
<div class="stat-label">MTTR</div>
|
|
1004
1330
|
</div>
|
|
1005
1331
|
</div>
|
|
@@ -1024,10 +1350,10 @@ Interrupt received, shutting down after current operation...`),n.isShuttingDown=
|
|
|
1024
1350
|
<canvas id="byToolChart"></canvas>
|
|
1025
1351
|
</div>
|
|
1026
1352
|
|
|
1027
|
-
${
|
|
1353
|
+
${$&&$.length>0?` <div class="alerts">
|
|
1028
1354
|
<h2>Pattern Alerts</h2>
|
|
1029
1355
|
<ul>
|
|
1030
|
-
${
|
|
1356
|
+
${$.map((H)=>`<li>Pattern detected: ${H.count} open entries for ${b1(H.tool)}/${b1(H.category)}</li>`).join(`
|
|
1031
1357
|
`)}
|
|
1032
1358
|
</ul>
|
|
1033
1359
|
</div>`:""}
|
|
@@ -1038,16 +1364,16 @@ ${X&&X.length>0?` <div class="alerts">
|
|
|
1038
1364
|
<tr><th>ID</th><th>Severity</th><th>Category</th><th>Description</th><th>Age</th></tr>
|
|
1039
1365
|
</thead>
|
|
1040
1366
|
<tbody>
|
|
1041
|
-
${
|
|
1367
|
+
${J||'<tr><td colspan="5">No open items</td></tr>'}
|
|
1042
1368
|
</tbody>
|
|
1043
1369
|
</table>
|
|
1044
1370
|
|
|
1045
1371
|
<div class="generated">Generated ${new Date().toISOString().split("T")[0]}</div>
|
|
1046
1372
|
|
|
1047
1373
|
<script>
|
|
1048
|
-
const stats = ${JSON.stringify(
|
|
1049
|
-
const trends = ${JSON.stringify(
|
|
1050
|
-
const openItems = ${JSON.stringify(
|
|
1374
|
+
const stats = ${JSON.stringify(A)};
|
|
1375
|
+
const trends = ${JSON.stringify(_)};
|
|
1376
|
+
const openItems = ${JSON.stringify(Z)};
|
|
1051
1377
|
|
|
1052
1378
|
const chartDefaults = {
|
|
1053
1379
|
color: '#e0e0e0',
|
|
@@ -1129,30 +1455,33 @@ ${X&&X.length>0?` <div class="alerts">
|
|
|
1129
1455
|
}
|
|
1130
1456
|
</script>
|
|
1131
1457
|
</body>
|
|
1132
|
-
</html>`}function
|
|
1133
|
-
`),console.log(`Discovered: ${
|
|
1134
|
-
`),
|
|
1458
|
+
</html>`}function b1(A){return A.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}wA();JA();async function l1(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 E7(),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 E7(){let A=await Promise.resolve().then(() => (x$(),D$));return{spawnBackgroundEmbedding:A.spawnBackgroundEmbedding,readLock:A.readLock,isProcessAlive:A.isProcessAlive}}s0();async function c4(){let{EmbeddingProviderFactory:A}=await Promise.resolve().then(() => (p1(),g4));return new A}async function u4(){let{loadConfig:A}=await Promise.resolve().then(() => ($A(),n5));return A()}async function m4(A){let{EmbeddingRepository:_}=await Promise.resolve().then(() => U2);return new _(A)}async function d4(A){let _=new __;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=o_(),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
|
|
1459
|
+
`),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
|
|
1460
|
+
`),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 n1(G,A),{exitCode:1}}}function n1(A,_){let G=I0(A);if(_.json)console.error(AG(G));else console.error(l(G,{verbose:!!_.verbose}))}function l4(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(`
|
|
1135
1461
|
Sync aborted (progress saved)`);else console.log(`
|
|
1136
|
-
Sync complete in ${
|
|
1137
|
-
Errors (${
|
|
1138
|
-
All messages already embedded
|
|
1139
|
-
|
|
1140
|
-
|
|
1462
|
+
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(`
|
|
1463
|
+
Errors (${A.errors.length}):`);for(let K of A.errors)console.log(` ${K.sessionPath}: ${K.error}`)}}function p4(){let A=process.platform==="win32"?"C:\\":"/";return new V$(A)}async function i1(A,_,G={}){let $=G.factory??await c4(),K=G.config??await u4(),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 m4(A),{EmbeddingService:J}=await Promise.resolve().then(() => (J5(),lK)),{PatternRedactor:H}=await Promise.resolve().then(() => (hA(),d2)),{createEmbeddingProgressReporter:Q,createModelDownloadHandler:X}=await Promise.resolve().then(() => (D5(),B2)),B=new J({repository:Y,provider:Z,config:K.embedding,redactor:new H}),W=B.checkModelState();if(W.modelChanged&&W.needsReEmbed){if(!await n4(W,_)){await $.dispose();return}let q=Y.getStoredEmbeddingDimensions(),U=K.embedding.dimensions;if(q!==null&&q!==U){if(!_.quiet)console.log(`Recreating embedding table for ${U}-dimensional vectors...`);Y.recreateVecTable(U)}if(!_.quiet)console.log("Clearing existing embeddings for re-embedding...")}let V=X({quiet:!!_.quiet});await Z.initialize(V);let M=typeof Y.getSkippedCount==="function"?Y.getSkippedCount(W.currentHash):0,z=Math.max(0,Y.getTotalMessageCount()-Y.getEmbeddedCount()-M);if(z===0){if(!_.quiet)if(M>0)console.log(`
|
|
1464
|
+
All embeddable messages already embedded (${M} skipped for current model).`);else console.log(`
|
|
1465
|
+
All messages already embedded.`);await $.dispose();return}let T=Q({quiet:!!_.quiet});T.start(z);try{let I;if(W.modelChanged&&W.needsReEmbed)I=await B.clearAndReembed({onProgress:(q)=>T.update(q.current)});else I=await B.embedUnembedded({onProgress:(q)=>T.update(q.current)});if(T.stop(),!_.quiet){let q=Math.max(1,Math.round(I.durationMs/1000)),U=I.rate.toFixed(1),O=I.skipped>0?`, skipped ${I.skipped}`:"";console.log(`
|
|
1466
|
+
Embedded ${I.embedded} messages${O} in ${q}s (${U} msg/s)`)}}catch(I){T.stop();let q=Y.getEmbeddedCount(),U=Y.getTotalMessageCount();if(!_.quiet)console.error(`
|
|
1467
|
+
Embedding failed at ${q}/${U} messages. Run memory sync --embed to resume from where it stopped.`);throw I}finally{await $.dispose()}}async function n4(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")})})}b5();s0();async function i4(A,_){try{let G=new eG(A),$=new B$,Z=await new DG(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 (${N(G)})`);return null}}function a4(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 t1(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(() => ($A(),n5));if($=H(),!$.ambientContext.enabled)return;let Q=process.cwd(),{ProjectPath:X}=await Promise.resolve().then(() => vK),B=X.fromDecoded(Q),W=B.encoded;Z=B.projectName;let{homedir:V}=await import("os"),{join:M}=await import("path");K=M(V(),".claude","projects",W,"memory"),Y=await k7(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 (${N($)})`)}}async function k7(A){let{SqliteProjectResolver:_}=await Promise.resolve().then(() => v2),{SqliteFactRepository:G}=await Promise.resolve().then(() => (M_(),R2)),{SqliteFrictionRepository:$}=await Promise.resolve().then(() => (h0(),I2)),{SqlitePersonaRepository:K}=await Promise.resolve().then(() => (C_(),D2)),{SqliteGraphRepository:Z}=await Promise.resolve().then(() => (w0(),x2)),{SqliteMemoryGovernanceRepository:Y}=await Promise.resolve().then(() => (q_(),E2)),{SqliteMemoryUtilityRepository:J}=await Promise.resolve().then(() => (_$(),P2)),{AutoMemoryWriter:H}=await Promise.resolve().then(() => (A9(),o4)),{SmartContextService:Q}=await Promise.resolve().then(() => (vG(),eK)),{MemoryGovernanceService:X}=await Promise.resolve().then(() => (v_(),H2)),{MemoryRankingService:B}=await Promise.resolve().then(() => (S0(),rK)),{AmbientContextService:W}=await Promise.resolve().then(() => sK),{createContextFormatter:V}=await Promise.resolve().then(() => (j$(),q4)),M=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:M}),rankingService:new B,utilityRepo:new J(A)}),T=V("ai",!1);return new W(z,new H,T)}$A();hA();function IJ({db:A,resolver:_}){let G=new __({projectNameResolver:_}),$=new W$,K=new d(A),Z=new PA(A),Y=new L_(A),J=new N_(A),H=new jG(G,$,K,Z,Y,J,A,new L$,new M$,new o);return{fixProjectNames:(Q)=>H.fixProjectNames(Q),sync:(Q)=>H.sync(Q)}}function OJ(A){return{handleBackgroundMode:l1,setupSignalHandlers:u6,hasCheckpoint:f6,loadCheckpoint:o_,createProgressReporter:j5,getDefaultDbPath:S,executeDryRun:d4,handleError:n1,reportResults:l4,createDriveResolver:p4,initializeDatabase:P,closeDatabase:D,bulkOperationCheckpoint:v5,registerCleanup:d6,unregisterCleanup:l6,createSyncService:IJ,loadConfig:g,createRemoteEventSyncService:RJ,runMemoryFileSync:i4,reportMemoryFileResults:a4,runAmbientContextGeneration:t1,runEmbeddingPass:i1,...A}}async function F9(A,_={}){let G=OJ(_);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)}}},B=await Q.sync(X);G.bulkOperationCheckpoint(Y),K.stop(),G.reportResults(B,$,A);let W=G.loadConfig(),V=W.remoteSync?.repositoryUrl,M=W.remoteSync?.enabled===!0&&typeof V==="string"&&V.trim().length>0;if(M&&A.remote===!0){if(!A.quiet)console.log("Synchronizing events with remote Git repository...");try{let q=await(await G.createRemoteEventSyncService({db:Y})).sync({machineId:W.machineId,repositoryUrl:V,autoPull:W.remoteSync.autoPull,autoPush:W.remoteSync.autoPush});if(q.success){if(q.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(q.status==="blocked"){let U=[q.error??"Remote synchronization blocked.","Run 'memory audit-secrets --skip-db --quarantine-events' and retry after reviewing the quarantine output."].join(" ");return console.error(U),{exitCode:1}}else console.error(`Warning: Remote synchronization failed: ${q.error}`)}catch(I){console.error(`Warning: Remote synchronization failed to execute: ${N(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(M&&!A.quiet)console.warn("Remote synchronization is configured but skipped. Run 'memory sync --remote' to synchronize canonical event logs.");if(A.includeMemoryFiles===!0||W.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 T=B.errors.length>0||B.aborted?1:0;if(A.embed&&!A.dryRun){let I=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await G.runEmbeddingPass(Y,A)}catch(q){if(A.json)console.error(AG(I0(q)));else if(!A.quiet)console.error(l(I0(q),{verbose:A.verbose}));return{exitCode:1}}finally{if(I)if(G.removeBackgroundLock)G.removeBackgroundLock();else{let{removeLock:q}=await Promise.resolve().then(() => (x$(),D$));q()}}}return{exitCode:T}}catch(H){return K.stop(),G.handleError(H,A),{exitCode:1}}finally{G.unregisterCleanup(J),G.closeDatabase(Y)}}async function RJ({db:A}){let{RemoteEventSyncService:_}=await Promise.resolve().then(() => (dG(),X2)),{GitRemoteEventTransport:G}=await Promise.resolve().then(() => (Y9(),Z9)),{getEventsDir:$}=await Promise.resolve().then(() => (f(),h5)),{rebuildProjections:K}=await Promise.resolve().then(() => (v$(),M9)),{SecretAuditService:Z}=await Promise.resolve().then(() => (C$(),j9)),{getAllLogFiles:Y}=await Promise.resolve().then(() => (f(),h5));return new _({transport:new G($()),privacyPreflight:{audit:async()=>{return{eventLogFindings:(await new Z(new o).audit({eventLogPaths:Y()})).summary.eventLogFindings}}},projectionRebuilder:{rebuild:async()=>{await K(A)}}})}$G();GK();YK();l$();p$();u$();WA();import{Command as uT}from"commander";G_();import YH from"@inquirer/search";import JH from"@inquirer/select";import HH from"fuzzy";var KZ=null,QH=null,XH=null;function ZZ(){if(KZ!==null)return KZ;return process.stdout.isTTY===!0}function YZ(){return ZZ()}async function JZ(A){if(!ZZ())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} (${LA(X.startTime)})`,description:`${X.id.substring(0,8)}... | ${X.messages.length} messages`})),J=await(QH??YH)({message:"Search sessions (type to filter):",source:async(X,{signal:B})=>{if(B.aborted)return[];if(!X)return K;return HH.filter(X,K,{extract:(V)=>`${V.name} ${V.description}`}).map((V)=>V.original)},pageSize:10}),Q=await(XH??JH)({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}}aA();u$();$G();l$();p$();c();CA();function VH(A){return{dbPath:S(),show:$0,search:V0,context:J0,related:Q0,...A}}async function HZ(A,_={}){if(!YZ())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=VH(_),$={limit:"100",...A},K=parseInt($.limit,10),Z=G.dbPath,{db:Y}=P({path:Z});try{let J=new d(Y),H=await JZ({sessionRepo:J,limit:K});if(!H)return D(Y),{exitCode:0};switch(D(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}=P({path:Z}),B=await new d(Q).findById(H.sessionId);if(D(Q),B)await G.context(B.projectPath.projectName,{});break}case"related":await G.related(H.sessionId,{});break}return{exitCode:0}}catch(J){let H=J instanceof j?J:new j(R.DB_CONNECTION_FAILED,N(J));console.error(l(H));try{D(Y)}catch{}return{exitCode:1}}}D_();import{Command as KI}from"commander";$A();f();dG();C$();hA();f();a_();import{Command as zI}from"commander";import{copyFileSync as BH,existsSync as QZ,mkdirSync as WH}from"fs";import{dirname as zH,join as HK}from"path";async function XZ(A,_={}){let G=vA(_.hookOverrides);if(G.sessionEnd&&G.preCompact&&!A.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let $=I_(_.hookOverrides);WH(zH($),{recursive:!0});let K=LH(_.hookScriptSourceOverride);if(!K)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};BH(K,$),console.log(`Copied hook script to ${$}`);let Z=d0(_.hookOverrides);if(console.log(Z.message),Z.success)console.log(`
|
|
1141
1468
|
Hook installation complete!`),console.log("Sessions will now sync automatically when they end."),console.log(`
|
|
1142
|
-
To check status: memory status`),console.log("To uninstall: memory uninstall"),
|
|
1143
|
-
Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function
|
|
1144
|
-
Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}
|
|
1145
|
-
`);else console.log(`
|
|
1146
|
-
`)
|
|
1147
|
-
`)
|
|
1148
|
-
`)}import{Command as
|
|
1469
|
+
To check status: memory status`),console.log("To uninstall: memory uninstall"),NH(_.hookOverrides);else return{exitCode:1};return{exitCode:0}}function NH(A){let _=i_(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(`
|
|
1470
|
+
Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function LH(A){if(A!==void 0)return QZ(A)?A:null;let _=HK(import.meta.dir,"../../../../dist/sync-hook.js"),G=HK(process.cwd(),"dist/sync-hook.js"),$=HK(process.cwd(),"dist","sync-hook.js");return[_,G,$].find((Z)=>QZ(Z))??null}a_();import{Command as TI}from"commander";import{existsSync as MH,unlinkSync as UH}from"fs";async function VZ(A,_={}){let G=vA(_.hookOverrides);if(!G.sessionEnd&&!G.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if(A.restore&&G.backupExists){if(s5(_.hookOverrides))console.log("Restored settings.json from backup.")}else{let K=l0(_.hookOverrides);console.log(K.message)}let $=I_(_.hookOverrides);if(MH($))UH($),console.log("Removed hook script.");return console.log(`
|
|
1471
|
+
Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}Y0();import{Command as FI}from"commander";Y0();f();c();RG();aA();c();f();c$();import{existsSync as QK,readFileSync as qH,unlinkSync as TH}from"fs";import{join as IH}from"path";function OH(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 _}async function BZ(A,_={}){if(A.portability)return jH(A,_);if(A.json){let $=await(_.gatherStatus??(await Promise.resolve().then(() => (Y0(),KK))).gatherStatus)({dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?i$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?i$(_.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(OH($.health)>0||!$.health.searchCapability.vectorReady)Z=1;return{exitCode:Z}}return Z_({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:A.fix,json:A.json},{dbPath:_.healthOverrides?.dbPath,logPath:_.healthOverrides?.logsDir?i$(_.healthOverrides.logsDir,"sync.log"):void 0,configPath:_.healthOverrides?.configDir?i$(_.healthOverrides.configDir,"config.json"):void 0,hookOverrides:_.healthOverrides?.hookOverrides})}function RH(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 jH(A,_={}){let G=QK,$=_.healthOverrides?.dbPath??S(),K=_.healthOverrides?.sourceDir??n(),Z=A.json?!1:h(),Y,J=[],H=[],Q=[];if(!QK($)){if(A.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(u("Error: Database does not exist. Run 'memory sync' first.",Z));return{exitCode:1}}try{Y=P({path:$}).db;let O=await new d(Y).findFiltered({limit:1e5});for(let k of O){let C=k.projectPath.decoded;if(RH(C)&&!J.includes(C))J.push(C);let gA=iA.resolveExistingPath(C,G);if(!G(gA)){if(!H.includes(C))H.push(C)}}}catch(q){let U=N(q);if(A.json)console.log(JSON.stringify({error:`Portability scan failed: ${U}`},null,2));else console.error(u(`Portability scan failed: ${U}`,Z));return{exitCode:2}}finally{if(Y)D(Y)}let X=IH(K,"embedding.lock"),B=!1,W=!1;if(QK(X)){B=!0;try{let q=qH(X,"utf-8"),U=JSON.parse(q);if(U.pid)process.kill(U.pid,0);else W=!0}catch(q){W=!0}}if(B&&W){if(Q.push(X),A.fix)try{TH(X)}catch(q){}}let M=await(_.gatherStatus??(await Promise.resolve().then(() => (Y0(),KK))).gatherStatus)({dbPath:$,fix:!1,stats:!1}),z=M.health.sqliteVec.available,T=M.health.sqliteVec.version;if(A.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:J,orphanedPaths:H,staleLocks:Q,sqliteVecAvailable:z,sqliteVecVersion:T,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(` ${b("[OK]",Z)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${m("[WARN]",Z)} Path Dialects: ${J.length} mixed slash/drive formats detected.`);for(let q of J)console.log(` - ${q}`)}if(H.length===0)console.log(` ${b("[OK]",Z)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${m("[WARN]",Z)} Orphaned Workspaces: ${H.length} project folder(s) not found on active filesystem.`);for(let q of H)console.log(` - ${q}`)}if(Q.length===0)console.log(` ${b("[OK]",Z)} Active Locks: No stale sync/embedding lock files detected.`);else if(A.fix)console.log(` ${b("[FIXED]",Z)} Active Locks: Cleaned up ${Q.length} stale lock file(s).`);else{console.log(` ${m("[WARN]",Z)} Active Locks: ${Q.length} stale sync/embedding lock file(s) found.`);for(let q of Q)console.log(` - ${q}`)}if(z)console.log(` ${b("[OK]",Z)} sqlite-vec: Loadable (v${T}) for active architecture.`);else console.log(` ${u("[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 i$(...A){if(A.some((_)=>_===void 0))return;return A.join("/")}c();f();C$();hA();import{Command as cI}from"commander";import{existsSync as FH,mkdirSync as SH,writeFileSync as EH}from"fs";import{dirname as DH}from"path";async function WZ(A={},_={}){let G=_.redactor??new o,$=_.createService?.(G)??new _G(G),K=_.getDefaultDbPath??S,Z=_.databaseExists??FH,Y=_.initializeDatabase??P,J=_.closeDatabase??D,H=_.getAllLogFiles??xA,Q=_.writeFile??((W,V)=>EH(W,V,"utf-8")),X=_.mkdir??((W)=>SH(W,{recursive:!0})),B;try{let W=A.db??K(),V=A.skipDb!==!0,M=V&&(W===":memory:"||Z(W));if(M)B=Y({path:W,create:!1,applySchema:!1,walMode:!1,quickCheck:!0}).db;let z=A.skipEvents===!0?[]:yH(A.eventLog??H(A.eventsDir)),T=await $.audit({db:B,eventLogPaths:z,redactDatabase:A.redactDb===!0,quarantineEvents:A.quarantineEvents===!0,quarantineDir:A.quarantineDir}),I=A.redactDb===!0||A.quarantineEvents===!0,q=I?await $.audit({db:B,eventLogPaths:z}):void 0,U={schemaVersion:1,command:"audit-secrets",generatedAt:T.generatedAt,targets:{database:{requested:V,scanned:M,path:V?W:void 0},eventLogs:{requested:A.skipEvents!==!0,scanned:z.length,paths:z}},scan:T,verification:q?{requested:!0,totalFindings:q.summary.totalFindings,databaseFindings:q.summary.databaseFindings,eventLogFindings:q.summary.eventLogFindings,findings:q.findings}:void 0},O=hH(G,U);if(A.report)X(DH(A.report)),Q(A.report,JSON.stringify(O,null,2)+`
|
|
1472
|
+
`);if(A.json)console.log(JSON.stringify(O,null,2));else console.log(xH(O));if((O.verification?.totalFindings??O.scan.summary.totalFindings)===0)return{exitCode:0};return{exitCode:I?2:1}}catch(W){let V=G.redactText(N(W)).text;if(A.json)console.log(JSON.stringify({error:V},null,2));else console.error(`Error: ${V}`);return{exitCode:2}}finally{if(B)J(B)}}function xH(A){let _=[],G=A.scan.summary;if(_.push("Secret audit"),_.push(` Database: ${PH(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(` - ${kH($)}`);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(`
|
|
1473
|
+
`)}function PH(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 kH(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 yH(A){return[...new Set(A.filter((_)=>_.trim()!==""))]}function hH(A,_){return A.redactJson(_).value}aA();c();RG();import{Command as tI,Option as eI}from"commander";import*as zZ from"readline";import{existsSync as vH}from"fs";function NZ(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 KG(A){return A.toISOString().split("T")[0]}async function wH(A){let _=zZ.createInterface({input:process.stdin,output:process.stdout});return new Promise((G)=>{_.question(A,($)=>{_.close(),G($.toLowerCase()==="y"||$.toLowerCase()==="yes")})})}async function LZ(A,_={}){let G=_.askConfirmation??wH,$=_.existsSync??vH,K=_.getDefaultDbPath??S,Z=_.initializeDatabase??P,Y=_.closeDatabase??D,J=_.createSessionRepository??((B)=>new d(B));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=NZ(A.olderThan)}catch(B){let W=N(B);if(A.json)console.log(JSON.stringify({error:W},null,2));else console.error(`Error: ${W}`);return{exitCode:1}}let Q=_.dbPath??K(),X;try{X=Z({path:Q}).db}catch(B){let W=N(B);if(A.json)console.log(JSON.stringify({error:`Database error: ${W}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let B=J(X),W=new Map;if(H){let z=await B.findOlderThan(H);for(let T of z)W.set(T.id,T)}if(A.orphans){let z=await B.findFiltered({limit:1e5});for(let T of z){let I=T.projectPath.decoded,q=iA.resolveExistingPath(I,$);if(!$(q))W.set(T.id,T)}}let V=W.size;if(V===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 ${KG(H)}`:"No sessions matched the purge criteria."},null,2));else if(!A.quiet)if(H&&!A.orphans)console.log(`No sessions older than ${KG(H)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if(A.dryRun){let z=Array.from(W.values());if(A.json)console.log(JSON.stringify({sessionsToDelete:V,cutoffDate:H?.toISOString()??null,dryRun:!0,sessions:z.map((T)=>({id:T.id,project:T.projectPath.projectName,startTime:T.startTime.toISOString(),messageCount:T.messageCount}))},null,2));else if(A.quiet)console.log(V.toString());else{if(H&&!A.orphans)console.log(`Would delete ${V} session(s) older than ${KG(H)}:
|
|
1474
|
+
`);else console.log(`Would delete ${V} session(s):
|
|
1475
|
+
`);let T=h();for(let I of z){let q=I.id.substring(0,16),U=I.projectPath.projectName,O=I.startTime.toISOString().split("T")[0],k=I.messageCount;if(T)console.log(` \x1B[33m${q}\x1B[0m ${U} ${O} (${k} messages)`);else console.log(` ${q} ${U} ${O} (${k} messages)`)}}return{exitCode:0}}if(!A.force){if(!await G(H&&!A.orphans?`Delete ${V} session(s) older than ${KG(H)}? This cannot be undone. (y/n) `:`Delete ${V} 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 W.keys())B.delete(z)}).immediate(),A.json)console.log(JSON.stringify({sessionsDeleted:V,cutoffDate:H?.toISOString()??null,dryRun:!1},null,2));else if(A.quiet)console.log(V.toString());else if(H&&!A.orphans)console.log(`Deleted ${V} session(s) older than ${KG(H)}.`);else console.log(`Deleted ${V} session(s).`);return{exitCode:0}}catch(B){let W=N(B);if(A.json)console.log(JSON.stringify({error:W},null,2));else console.error(`Error: ${W}`);return{exitCode:2}}finally{if(X)Y(X)}}import{Command as YO}from"commander";c();f();a_();c();import{Command as NO,Option as LO}from"commander";hA();import{existsSync as MZ}from"fs";import{dirname as CH}from"path";async function UZ(A,_={}){let G=CH(A);if(G!=="."&&!MZ(G))return console.error(`Error: Directory does not exist: ${G}`),{exitCode:1};let $=S();if(!MZ($))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:K}=P({path:$});try{let Z=await H5(K,A,{includeSensitive:_.includeSensitive,redactor:new o});if(_.json)console.log(JSON.stringify({success:!0,path:A,stats:Z},null,2));else if(_.quiet)console.log(A);else console.log(fH(Z,A));return{exitCode:0}}catch(Z){let Y=N(Z);if(_.json)console.log(JSON.stringify({success:!1,error:Y},null,2));else console.error(`Error: ${Y}`);return{exitCode:1}}finally{D(K)}}function fH(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: ${bH(A.bytes)}`),G.join(`
|
|
1476
|
+
`)}function bH(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)} ${_[$]}`}c();import{Command as FO,Option as SO}from"commander";import{existsSync as gH}from"fs";async function qZ(A,_={}){if(!gH(A))return ZG("File does not exist",A,_),{exitCode:1};let G=await EG(A);if(!G.valid)return ZG(`Invalid backup file: ${G.error}`,A,_),{exitCode:1};let $=S(),{db:K}=P({path:$});try{if(X5(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 ZG("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",A,_),{exitCode:1};return ZG("Use --clear to replace data or --force to merge",A,_),{exitCode:1}}let Y=await Q5(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(cH(Y,A,_.clear??!1));return{exitCode:0}}catch(Z){let Y=N(Z);return ZG(Y,A,_),{exitCode:1}}finally{D(K)}}function ZG(A,_,G){if(G.json)console.log(JSON.stringify({success:!1,path:_,error:A},null,2));else console.error(`Error: ${A}`)}function cH(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(`
|
|
1477
|
+
`)}import{Command as hO}from"commander";function uH(A){return A==="bash"||A==="zsh"||A==="fish"}function mH(){return`# memory bash completion
|
|
1149
1478
|
# Add to ~/.bashrc: eval "$(memory completion bash)"
|
|
1150
1479
|
|
|
1151
1480
|
_memory_completion() {
|
|
1152
1481
|
local cur prev words cword
|
|
1153
1482
|
_init_completion || return
|
|
1154
1483
|
|
|
1155
|
-
local commands="sync search list stats context related show browse install uninstall status doctor purge export import completion"
|
|
1484
|
+
local commands="sync search list stats context related show browse governance profile remote install uninstall status doctor audit-secrets purge export import completion"
|
|
1156
1485
|
local search_opts="--limit --project --role --session --after --before --case-sensitive --json --verbose --quiet"
|
|
1157
1486
|
local list_opts="--limit --project --after --before --sort --json --verbose --quiet"
|
|
1158
1487
|
local stats_opts="--projects --json --verbose --quiet"
|
|
@@ -1160,10 +1489,14 @@ _memory_completion() {
|
|
|
1160
1489
|
local related_opts="--limit --depth --json --verbose --quiet"
|
|
1161
1490
|
local show_opts="--json --verbose --quiet"
|
|
1162
1491
|
local browse_opts="--project"
|
|
1163
|
-
local
|
|
1492
|
+
local governance_opts="--surface --project --status --limit --reason --at --scope --json"
|
|
1493
|
+
local profile_opts="show export rebuild --kind --limit --all --json"
|
|
1494
|
+
local sync_opts="--force --dry-run --remote --verbose --quiet"
|
|
1495
|
+
local remote_opts="set remove status preflight doctor backup restore rollback --json --allow-local-path --no-auto-pull --no-auto-push --confirm"
|
|
1164
1496
|
local install_opts="--force"
|
|
1165
1497
|
local uninstall_opts="--restore"
|
|
1166
1498
|
local doctor_opts="--json --fix"
|
|
1499
|
+
local audit_secrets_opts="--json --db --skip-db --event-log --events-dir --skip-events --redact-db --quarantine-events --quarantine-dir --report"
|
|
1167
1500
|
local purge_opts="--before --dry-run --force --json --verbose --quiet"
|
|
1168
1501
|
local export_opts="--json --verbose --quiet --include-sensitive"
|
|
1169
1502
|
local import_opts="--force --dry-run --json --verbose --quiet"
|
|
@@ -1202,10 +1535,22 @@ _memory_completion() {
|
|
|
1202
1535
|
COMPREPLY=( $(compgen -W "\${browse_opts}" -- "\${cur}") )
|
|
1203
1536
|
return 0
|
|
1204
1537
|
;;
|
|
1538
|
+
governance)
|
|
1539
|
+
COMPREPLY=( $(compgen -W "list show suppress unsuppress invalidate expire review consent-grant consent-revoke \${governance_opts}" -- "\${cur}") )
|
|
1540
|
+
return 0
|
|
1541
|
+
;;
|
|
1542
|
+
profile)
|
|
1543
|
+
COMPREPLY=( $(compgen -W "\${profile_opts}" -- "\${cur}") )
|
|
1544
|
+
return 0
|
|
1545
|
+
;;
|
|
1205
1546
|
sync)
|
|
1206
1547
|
COMPREPLY=( $(compgen -W "\${sync_opts}" -- "\${cur}") )
|
|
1207
1548
|
return 0
|
|
1208
1549
|
;;
|
|
1550
|
+
remote)
|
|
1551
|
+
COMPREPLY=( $(compgen -W "\${remote_opts}" -- "\${cur}") )
|
|
1552
|
+
return 0
|
|
1553
|
+
;;
|
|
1209
1554
|
install)
|
|
1210
1555
|
COMPREPLY=( $(compgen -W "\${install_opts}" -- "\${cur}") )
|
|
1211
1556
|
return 0
|
|
@@ -1218,6 +1563,10 @@ _memory_completion() {
|
|
|
1218
1563
|
COMPREPLY=( $(compgen -W "\${doctor_opts}" -- "\${cur}") )
|
|
1219
1564
|
return 0
|
|
1220
1565
|
;;
|
|
1566
|
+
audit-secrets)
|
|
1567
|
+
COMPREPLY=( $(compgen -W "\${audit_secrets_opts}" -- "\${cur}") )
|
|
1568
|
+
return 0
|
|
1569
|
+
;;
|
|
1221
1570
|
purge)
|
|
1222
1571
|
COMPREPLY=( $(compgen -W "\${purge_opts}" -- "\${cur}") )
|
|
1223
1572
|
return 0
|
|
@@ -1253,10 +1602,14 @@ _memory_completion() {
|
|
|
1253
1602
|
related) COMPREPLY=( $(compgen -W "\${related_opts}" -- "\${cur}") ) ;;
|
|
1254
1603
|
show) COMPREPLY=( $(compgen -W "\${show_opts}" -- "\${cur}") ) ;;
|
|
1255
1604
|
browse) COMPREPLY=( $(compgen -W "\${browse_opts}" -- "\${cur}") ) ;;
|
|
1605
|
+
governance) COMPREPLY=( $(compgen -W "list show suppress unsuppress invalidate expire review consent-grant consent-revoke \${governance_opts}" -- "\${cur}") ) ;;
|
|
1606
|
+
profile) COMPREPLY=( $(compgen -W "\${profile_opts}" -- "\${cur}") ) ;;
|
|
1256
1607
|
sync) COMPREPLY=( $(compgen -W "\${sync_opts}" -- "\${cur}") ) ;;
|
|
1608
|
+
remote) COMPREPLY=( $(compgen -W "\${remote_opts}" -- "\${cur}") ) ;;
|
|
1257
1609
|
install) COMPREPLY=( $(compgen -W "\${install_opts}" -- "\${cur}") ) ;;
|
|
1258
1610
|
uninstall) COMPREPLY=( $(compgen -W "\${uninstall_opts}" -- "\${cur}") ) ;;
|
|
1259
1611
|
doctor) COMPREPLY=( $(compgen -W "\${doctor_opts}" -- "\${cur}") ) ;;
|
|
1612
|
+
audit-secrets) COMPREPLY=( $(compgen -W "\${audit_secrets_opts}" -- "\${cur}") ) ;;
|
|
1260
1613
|
purge) COMPREPLY=( $(compgen -W "\${purge_opts}" -- "\${cur}") ) ;;
|
|
1261
1614
|
export) COMPREPLY=( $(compgen -W "\${export_opts}" -- "\${cur}") ) ;;
|
|
1262
1615
|
import) COMPREPLY=( $(compgen -W "\${import_opts}" -- "\${cur}") ) ;;
|
|
@@ -1268,7 +1621,7 @@ _memory_completion() {
|
|
|
1268
1621
|
}
|
|
1269
1622
|
|
|
1270
1623
|
complete -F _memory_completion memory
|
|
1271
|
-
`}function
|
|
1624
|
+
`}function dH(){return`#compdef memory
|
|
1272
1625
|
# memory zsh completion
|
|
1273
1626
|
# Add to ~/.zshrc: eval "$(memory completion zsh)"
|
|
1274
1627
|
|
|
@@ -1283,18 +1636,22 @@ _memory() {
|
|
|
1283
1636
|
'related:Find sessions related to a given session'
|
|
1284
1637
|
'show:Show session details and conversation'
|
|
1285
1638
|
'browse:Browse and select sessions interactively'
|
|
1639
|
+
'governance:Inspect and control derived memory consent/provenance state'
|
|
1640
|
+
'profile:Inspect and rebuild governed persona/procedural memory'
|
|
1641
|
+
'remote:Manage remote event-log synchronization'
|
|
1286
1642
|
'install:Install automatic sync hook'
|
|
1287
1643
|
'uninstall:Remove automatic sync hook'
|
|
1288
1644
|
'status:Show hook installation status'
|
|
1289
1645
|
'doctor:Check system health and diagnose issues'
|
|
1646
|
+
'audit-secrets:Scan database and event logs for likely leaked secrets'
|
|
1290
1647
|
'purge:Remove old sessions from database'
|
|
1291
1648
|
'export:Export database to JSON file'
|
|
1292
1649
|
'import:Import database from JSON file'
|
|
1293
1650
|
'completion:Generate shell completion script'
|
|
1294
1651
|
)
|
|
1295
1652
|
|
|
1296
|
-
local -a search_opts list_opts stats_opts context_opts related_opts show_opts browse_opts
|
|
1297
|
-
local -a sync_opts install_opts uninstall_opts doctor_opts purge_opts export_opts import_opts completion_shells
|
|
1653
|
+
local -a search_opts list_opts stats_opts context_opts related_opts show_opts browse_opts governance_opts profile_opts
|
|
1654
|
+
local -a sync_opts remote_opts install_opts uninstall_opts doctor_opts audit_secrets_opts purge_opts export_opts import_opts completion_shells
|
|
1298
1655
|
|
|
1299
1656
|
search_opts=(
|
|
1300
1657
|
'--limit[Maximum number of results]:number'
|
|
@@ -1352,13 +1709,42 @@ _memory() {
|
|
|
1352
1709
|
'--project[Filter by project name]:project'
|
|
1353
1710
|
)
|
|
1354
1711
|
|
|
1712
|
+
governance_opts=(
|
|
1713
|
+
'--surface[Governance surface]:surface:(fact context provider_egress remote_sync friction evaluation persona graph ranking dream projection)'
|
|
1714
|
+
'--project[Filter by project name]:project'
|
|
1715
|
+
'--status[Governance status]:status:(active pending_review suppressed invalidated expired)'
|
|
1716
|
+
'--limit[Maximum number of entries]:number'
|
|
1717
|
+
'--reason[Reason for the control event]:reason'
|
|
1718
|
+
'--at[Expiry timestamp]:iso-date'
|
|
1719
|
+
'--scope[Consent scope]:scope'
|
|
1720
|
+
'--json[Output as JSON]'
|
|
1721
|
+
)
|
|
1722
|
+
|
|
1723
|
+
profile_opts=(
|
|
1724
|
+
'1:action:(show export rebuild)'
|
|
1725
|
+
'--kind[Persona entry kind]:kind:(preference procedure correction decision_pattern friction_pattern)'
|
|
1726
|
+
'--limit[Maximum number of entries]:number'
|
|
1727
|
+
'--all[Use every project scope where supported]'
|
|
1728
|
+
'--json[Output as JSON]'
|
|
1729
|
+
)
|
|
1730
|
+
|
|
1355
1731
|
sync_opts=(
|
|
1356
1732
|
'--force[Force re-sync all sessions]'
|
|
1357
1733
|
'--dry-run[Preview changes without syncing]'
|
|
1734
|
+
'--remote[Synchronize canonical event logs with configured remote]'
|
|
1358
1735
|
'--verbose[Show detailed output]'
|
|
1359
1736
|
'--quiet[Minimal output]'
|
|
1360
1737
|
)
|
|
1361
1738
|
|
|
1739
|
+
remote_opts=(
|
|
1740
|
+
'1:action:(set remove status preflight doctor backup restore rollback)'
|
|
1741
|
+
'--json[Output stable JSON]'
|
|
1742
|
+
'--allow-local-path[Allow local path remotes]'
|
|
1743
|
+
'--no-auto-pull[Disable automatic remote pull]'
|
|
1744
|
+
'--no-auto-push[Disable automatic remote push]'
|
|
1745
|
+
'--confirm[Confirm restore or rollback mutation]'
|
|
1746
|
+
)
|
|
1747
|
+
|
|
1362
1748
|
install_opts=(
|
|
1363
1749
|
'--force[Overwrite existing hook]'
|
|
1364
1750
|
)
|
|
@@ -1372,6 +1758,19 @@ _memory() {
|
|
|
1372
1758
|
'--fix[Attempt to fix common issues]'
|
|
1373
1759
|
)
|
|
1374
1760
|
|
|
1761
|
+
audit_secrets_opts=(
|
|
1762
|
+
'--json[Output as JSON]'
|
|
1763
|
+
'--db[Database path override]:path:_files'
|
|
1764
|
+
'--skip-db[Skip database scanning]'
|
|
1765
|
+
'--event-log[Specific event log path]:path:_files'
|
|
1766
|
+
'--events-dir[Events directory to scan]:directory:_files -/'
|
|
1767
|
+
'--skip-events[Skip event-log scanning]'
|
|
1768
|
+
'--redact-db[Rewrite mutable database fields with redacted values]'
|
|
1769
|
+
'--quarantine-events[Quarantine raw event logs and write sanitized active copies]'
|
|
1770
|
+
'--quarantine-dir[Quarantine directory]:directory:_files -/'
|
|
1771
|
+
'--report[Write a redacted evidence report]:path:_files'
|
|
1772
|
+
)
|
|
1773
|
+
|
|
1375
1774
|
purge_opts=(
|
|
1376
1775
|
'--before[Delete sessions before date]:date'
|
|
1377
1776
|
'--dry-run[Preview deletions without removing]'
|
|
@@ -1415,10 +1814,14 @@ _memory() {
|
|
|
1415
1814
|
related) _arguments "$related_opts[@]" ':session:' ;;
|
|
1416
1815
|
show) _arguments "$show_opts[@]" ':session:' ;;
|
|
1417
1816
|
browse) _arguments "$browse_opts[@]" ;;
|
|
1817
|
+
governance) _arguments '1:action:(list show suppress unsuppress invalidate expire review consent-grant consent-revoke)' "$governance_opts[@]" ':target:' ;;
|
|
1818
|
+
profile) _arguments "$profile_opts[@]" ':project:' ;;
|
|
1418
1819
|
sync) _arguments "$sync_opts[@]" ;;
|
|
1820
|
+
remote) _arguments "$remote_opts[@]" ':repository-url:' ;;
|
|
1419
1821
|
install) _arguments "$install_opts[@]" ;;
|
|
1420
1822
|
uninstall) _arguments "$uninstall_opts[@]" ;;
|
|
1421
1823
|
doctor) _arguments "$doctor_opts[@]" ;;
|
|
1824
|
+
audit-secrets) _arguments "$audit_secrets_opts[@]" ;;
|
|
1422
1825
|
purge) _arguments "$purge_opts[@]" ;;
|
|
1423
1826
|
export) _arguments "$export_opts[@]" ':output-file:_files' ;;
|
|
1424
1827
|
import) _arguments "$import_opts[@]" ':input-file:_files' ;;
|
|
@@ -1429,7 +1832,7 @@ _memory() {
|
|
|
1429
1832
|
}
|
|
1430
1833
|
|
|
1431
1834
|
_memory "$@"
|
|
1432
|
-
`}function
|
|
1835
|
+
`}function lH(){return`# memory fish completion
|
|
1433
1836
|
# Save to ~/.config/fish/completions/memory.fish:
|
|
1434
1837
|
# memory completion fish > ~/.config/fish/completions/memory.fish
|
|
1435
1838
|
|
|
@@ -1445,10 +1848,14 @@ complete -c memory -n "__fish_use_subcommand" -a context -d "Get context for a p
|
|
|
1445
1848
|
complete -c memory -n "__fish_use_subcommand" -a related -d "Find sessions related to a given session"
|
|
1446
1849
|
complete -c memory -n "__fish_use_subcommand" -a show -d "Show session details and conversation"
|
|
1447
1850
|
complete -c memory -n "__fish_use_subcommand" -a browse -d "Browse and select sessions interactively"
|
|
1851
|
+
complete -c memory -n "__fish_use_subcommand" -a governance -d "Inspect and control derived memory consent/provenance state"
|
|
1852
|
+
complete -c memory -n "__fish_use_subcommand" -a profile -d "Inspect and rebuild governed persona/procedural memory"
|
|
1853
|
+
complete -c memory -n "__fish_use_subcommand" -a remote -d "Manage remote event-log synchronization"
|
|
1448
1854
|
complete -c memory -n "__fish_use_subcommand" -a install -d "Install automatic sync hook"
|
|
1449
1855
|
complete -c memory -n "__fish_use_subcommand" -a uninstall -d "Remove automatic sync hook"
|
|
1450
1856
|
complete -c memory -n "__fish_use_subcommand" -a status -d "Show hook installation status"
|
|
1451
1857
|
complete -c memory -n "__fish_use_subcommand" -a doctor -d "Check system health and diagnose issues"
|
|
1858
|
+
complete -c memory -n "__fish_use_subcommand" -a audit-secrets -d "Scan database and event logs for likely leaked secrets"
|
|
1452
1859
|
complete -c memory -n "__fish_use_subcommand" -a purge -d "Remove old sessions from database"
|
|
1453
1860
|
complete -c memory -n "__fish_use_subcommand" -a export -d "Export database to JSON file"
|
|
1454
1861
|
complete -c memory -n "__fish_use_subcommand" -a import -d "Import database from JSON file"
|
|
@@ -1503,12 +1910,39 @@ complete -c memory -n "__fish_seen_subcommand_from show" -l quiet -d "Minimal ou
|
|
|
1503
1910
|
# browse options
|
|
1504
1911
|
complete -c memory -n "__fish_seen_subcommand_from browse" -l project -d "Filter by project name"
|
|
1505
1912
|
|
|
1913
|
+
# governance actions and options
|
|
1914
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -a "list show suppress unsuppress invalidate expire review consent-grant consent-revoke"
|
|
1915
|
+
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"
|
|
1916
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l project -d "Filter by project name"
|
|
1917
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l status -d "Governance status" -a "active pending_review suppressed invalidated expired"
|
|
1918
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l limit -d "Maximum number of entries"
|
|
1919
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l reason -d "Reason for the control event"
|
|
1920
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l at -d "Expiry timestamp"
|
|
1921
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l scope -d "Consent scope"
|
|
1922
|
+
complete -c memory -n "__fish_seen_subcommand_from governance" -l json -d "Output as JSON"
|
|
1923
|
+
|
|
1924
|
+
# profile actions and options
|
|
1925
|
+
complete -c memory -n "__fish_seen_subcommand_from profile" -a "show export rebuild"
|
|
1926
|
+
complete -c memory -n "__fish_seen_subcommand_from profile" -l kind -d "Persona entry kind" -a "preference procedure correction decision_pattern friction_pattern"
|
|
1927
|
+
complete -c memory -n "__fish_seen_subcommand_from profile" -l limit -d "Maximum number of entries"
|
|
1928
|
+
complete -c memory -n "__fish_seen_subcommand_from profile" -l all -d "Use every project scope where supported"
|
|
1929
|
+
complete -c memory -n "__fish_seen_subcommand_from profile" -l json -d "Output as JSON"
|
|
1930
|
+
|
|
1506
1931
|
# sync options
|
|
1507
1932
|
complete -c memory -n "__fish_seen_subcommand_from sync" -l force -d "Force re-sync all sessions"
|
|
1508
1933
|
complete -c memory -n "__fish_seen_subcommand_from sync" -l dry-run -d "Preview changes without syncing"
|
|
1934
|
+
complete -c memory -n "__fish_seen_subcommand_from sync" -l remote -d "Synchronize canonical event logs with configured remote"
|
|
1509
1935
|
complete -c memory -n "__fish_seen_subcommand_from sync" -l verbose -d "Show detailed output"
|
|
1510
1936
|
complete -c memory -n "__fish_seen_subcommand_from sync" -l quiet -d "Minimal output"
|
|
1511
1937
|
|
|
1938
|
+
# remote actions and options
|
|
1939
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -a "set remove status preflight doctor backup restore rollback"
|
|
1940
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -l json -d "Output stable JSON"
|
|
1941
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -l allow-local-path -d "Allow local path remotes"
|
|
1942
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -l no-auto-pull -d "Disable automatic remote pull"
|
|
1943
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -l no-auto-push -d "Disable automatic remote push"
|
|
1944
|
+
complete -c memory -n "__fish_seen_subcommand_from remote" -l confirm -d "Confirm restore or rollback mutation"
|
|
1945
|
+
|
|
1512
1946
|
# install options
|
|
1513
1947
|
complete -c memory -n "__fish_seen_subcommand_from install" -l force -d "Overwrite existing hook"
|
|
1514
1948
|
|
|
@@ -1519,6 +1953,18 @@ complete -c memory -n "__fish_seen_subcommand_from uninstall" -l restore -d "Res
|
|
|
1519
1953
|
complete -c memory -n "__fish_seen_subcommand_from doctor" -l json -d "Output as JSON"
|
|
1520
1954
|
complete -c memory -n "__fish_seen_subcommand_from doctor" -l fix -d "Attempt to fix common issues"
|
|
1521
1955
|
|
|
1956
|
+
# audit-secrets options
|
|
1957
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l json -d "Output as JSON"
|
|
1958
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l db -d "Database path override" -r
|
|
1959
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l skip-db -d "Skip database scanning"
|
|
1960
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l event-log -d "Specific event log path" -r
|
|
1961
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l events-dir -d "Events directory to scan" -r
|
|
1962
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l skip-events -d "Skip event-log scanning"
|
|
1963
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l redact-db -d "Rewrite mutable database fields with redacted values"
|
|
1964
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l quarantine-events -d "Quarantine raw event logs and write sanitized active copies"
|
|
1965
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l quarantine-dir -d "Quarantine directory" -r
|
|
1966
|
+
complete -c memory -n "__fish_seen_subcommand_from audit-secrets" -l report -d "Write a redacted evidence report" -r
|
|
1967
|
+
|
|
1522
1968
|
# purge options
|
|
1523
1969
|
complete -c memory -n "__fish_seen_subcommand_from purge" -l before -d "Delete sessions before date"
|
|
1524
1970
|
complete -c memory -n "__fish_seen_subcommand_from purge" -l dry-run -d "Preview deletions without removing"
|
|
@@ -1542,7 +1988,7 @@ complete -c memory -n "__fish_seen_subcommand_from import" -l quiet -d "Minimal
|
|
|
1542
1988
|
|
|
1543
1989
|
# completion shells
|
|
1544
1990
|
complete -c memory -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"
|
|
1545
|
-
`}function
|
|
1546
|
-
${
|
|
1547
|
-
`);switch(
|
|
1548
|
-
`)}}
|
|
1991
|
+
`}function pH(A){switch(A){case"bash":return mH();case"zsh":return dH();case"fish":return lH();default:throw Error(`Unknown shell type: ${A}`)}}function TZ(A){if(!uH(A))return console.error(`Error: Invalid shell type '${A}'`),console.error("Valid shells: bash, zsh, fish"),{exitCode:1};let _=pH(A);return console.log(_),{exitCode:0}}WA();c();import{Command as sO,Option as oO}from"commander";import{join as JQ}from"path";import{homedir as HQ}from"os";CA();JA();async function IZ(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}}JA();import{createHash as nH}from"crypto";var iH=["low","medium","high","critical"],aH=["open","resolved","wont-fix"];async function jZ(A,_){let G=tH(_);if("error"in G)return sH(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=oH(_,Z,K.length,G);if(_.count)i({command:"friction",kind:"friction",data:{count:Z},meta:J});else i({command:"friction",kind:"friction",data:K.map(_Q),meta:J})}else if(_.count)console.log(String(Z));else rH(K,_);if(_.tool&&!_.count)await A.markReviewed(_.tool);return{exitCode:Y}}function rH(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,B=Date.now()-J.loggedAt.getTime(),W=Math.floor(B/86400000),V=W===0?"today":`${W}d`;console.log(`${Q}${String(J.id).padEnd(6)}${J.severity.padEnd(10)}${J.category.padEnd(14)}${X.padEnd(62)}${V}`)}let K=Object.entries($).map(([J,H])=>`${H} ${J}`).join(", "),Z=_.tool?` for ${_.tool}`:"",Y=G>0?` -- ${G} new since last review`:"";console.log(`
|
|
1992
|
+
${A.length} ${_.all?"total":"open"} entries${Z} (${K})${Y}`)}function tH(A){let _=A.limit?OZ(A.limit):void 0;if(_===null)return{error:"Limit must be a positive integer"};let G=A.min?OZ(A.min):void 0;if(G===null)return{error:"Min must be a positive integer"};if(A.severity&&!iH.includes(A.severity))return{error:"Severity must be one of: low, medium, high, critical"};if(A.status&&!aH.includes(A.status))return{error:"Status must be one of: open, resolved, wont-fix"};let $=A.since?eH(A.since):void 0;if($===null)return{error:"Since must use YYYY-MM-DD"};return{limit:_,min:G,since:$}}function OZ(A){if(!/^[1-9]\d*$/.test(A))return null;return Number(A)}function eH(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 sH(A,_){if(_.json)x({command:"friction",code:"INVALID_ARGUMENT",message:A});else console.error(`Error: ${A}`);return{exitCode:2}}function oH(A,_,G,$){return{count:_,returned:A.count?0:G,mode:A.count?"count":"list",filters_applied:AQ(A,$),...$.min!==void 0?{min:$.min,threshold_met:_>=$.min}:{},...$.limit!==void 0&&!A.count?{limit:$.limit}:{}}}function AQ(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:${RZ(A.descriptionContains)}`);if(A.contextContains)G.push(`context_contains:${RZ(A.contextContains)}`);return G}function RZ(A){return`[redacted:${nH("sha256").update(A).digest("hex").slice(0,8)}]`}function _Q(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 FZ(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 SZ(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 GQ}from"child_process";import{mkdirSync as $Q,writeFileSync as KQ}from"fs";import{join as ZQ}from"path";import{platform as EZ}from"os";wA();f();async function DZ(A,_,G=YQ){let $=await A.getStats(),K=await A.getWeeklyTrends(12),Z=await A.list({tool:_.tool}),Y=await A.detectPatterns();if(_.html){let J=c1($,K,Z,Y),H=D0();$Q(H,{recursive:!0});let Q=ZQ(H,"dashboard.html");if(KQ(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=g1($,K,Z,h(),Y);if(_.format==="ai")J=t(J);console.log(J)}return{exitCode:0}}function YQ(A){let _=EZ()==="win32"?"start":EZ()==="darwin"?"open":"xdg-open";GQ(`${_} "${A}"`)}async function xZ(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}}hA();var QQ=new Set([R.NOT_FOUND,R.INVALID_STATE]);async function PZ(A,_={}){let G;try{let $=_.dbPath??S();G=P({path:$}).db;let K=new kA(G),Z=new xG(K,new o),Y=JQ(HQ(),".claude","friction.jsonl"),J=await Z.ingestFallbackFile(Y);if(J>0)process.stderr.write(`Ingested ${J} friction entries from fallback file
|
|
1993
|
+
`);switch(A.action){case"log":return await IZ(Z,A);case"list":return await jZ(Z,A);case"resolve":return await FZ(Z,A);case"wont-fix":return await SZ(Z,A);case"dashboard":return await DZ(Z,A,_.openInBrowser);case"purge":return await xZ(Z,A);default:return console.error(`Unknown friction action: ${A.action}`),{exitCode:2}}}catch($){let K=$ instanceof j?$:new j(R.UNKNOWN,N($));if(A.json)x({command:"friction",code:K.code,message:K.message,...K.context!==void 0?{context:K.context}:{}});else console.error(l(K));return{exitCode:QQ.has(K.code)?1:3}}finally{if(G)D(G)}}c();q_();v$();v_();H_();import{Command as MR,Option as UR}from"commander";var jR=[...NG];fG();v_();q0();c();M_();h0();q_();C_();import{Command as ER,Option as DR}from"commander";var fR=[...LG];import{Command as cR}from"commander";c();M_();aA();k0();$A();import{Command as tR}from"commander";L0();v$();N0();JA();hA();a0();class XQ{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(`
|
|
1994
|
+
`)}}c();M_();import{Command as Bj}from"commander";export{uG as validateRemoteRepositoryUrl,cG as validateRemoteRef,mG as validateMachineIdentity,EG as validateExportFile,N as unknownErrorMessage,Q_ as sanitizeFtsQuery,V5 as reciprocalRankFusion,N5 as personaEntryFromFactEvent,Q5 as importFromJson,X5 as hasExistingData,bG as graphEdgesFromFact,gG as governanceEntryForGraphEdge,cK as extractSessionId,H5 as exportToJson,VZ as executeUninstallCommand,F9 as executeSyncCommand,Z_ as executeStatusCommand,d$ as executeStatsCommand,$0 as executeShowCommand,V0 as executeSearchCommand,Q0 as executeRelatedCommand,n$ as executeQueryCommand,LZ as executePurgeCommand,m$ as executeListCommand,XZ as executeInstallCommand,qZ as executeImportCommand,PZ as executeFrictionCommand,UZ as executeExportCommand,BZ as executeDoctorCommand,J0 as executeContextCommand,TZ as executeCompletionCommand,HZ as executeBrowseCommand,WZ as executeAuditSecretsCommand,Z5 as computeModelHash,yG as candidateFromPersonaEntry,hG as candidateFromGraphEdge,kG as candidateFromFact,U0 as assertMemoryGovernanceSurface,o$ as assertMemoryGovernanceControl,P8 as applyTemporalDecayWithExemptions,D8 as applyTemporalDecay,B5 as allocateBudget,qA as ToolUse,Y2 as TemporalGraphService,jG as SyncService,E0 as SmartContextService,UA as Session,BA as SearchResult,T0 as SearchQuery,q5 as RemoteEventSyncService,gK as RecoveryService,G5 as QueryParser,wG as ProjectionRegistry,s as ProjectPath,z5 as PersonaProfileService,SA as PersonaEntry,uK as PatternExtractor,iA as PathDecoder,LG as PERSONA_ENTRY_KINDS,SK as PERSONA_ENTRY_CONTROLS,MA as Message,EA as MemoryUtilityMetric,F0 as MemoryRankingService,B_ as MemoryGovernanceService,e as MemoryGovernanceEntry,DG as MemoryFileSyncService,Y_ as MemoryFile,YA as MemoryEventEnvelope,j as MemoryError,kK as MEMORY_UTILITY_SURFACES,yK as MEMORY_UTILITY_CONTROLS,NG as MEMORY_GOVERNANCE_SURFACES,RK as MEMORY_GOVERNANCE_STATUSES,jK as MEMORY_GOVERNANCE_CONTROLS,s$ as MEMORY_EVENT_SCHEMA_VERSION,RA as LlmExtractor,P_ as Link,pA as GraphEdge,qG as GRAPH_NODE_TYPES,xG as FrictionService,mA as FrictionEntry,XA as Fact,ZA as ExtractionState,R as ErrorCode,KA as Entity,Y5 as EmbeddingService,IA as EmbeddingResult,OG as EmbeddingConfig,OA as ContentExtractor,x8 as CURATED_FILE_TYPES,J_ as BackfillState,nK as BackfillService,W5 as AmbientContextService};
|