@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.
Files changed (56) hide show
  1. package/README.md +58 -11
  2. package/dist/application/services/embedding-service.d.ts +8 -1
  3. package/dist/application/services/friction-service.d.ts +18 -2
  4. package/dist/application/services/index.d.ts +11 -1
  5. package/dist/application/services/memory-governance-service.d.ts +65 -0
  6. package/dist/application/services/memory-ranking-service.d.ts +65 -0
  7. package/dist/application/services/persona-profile-service.d.ts +29 -0
  8. package/dist/application/services/projection-registry.d.ts +18 -0
  9. package/dist/application/services/remote-event-sync-service.d.ts +76 -0
  10. package/dist/application/services/smart-context-service.d.ts +34 -1
  11. package/dist/application/services/temporal-graph-service.d.ts +30 -0
  12. package/dist/domain/entities/graph-edge.d.ts +87 -0
  13. package/dist/domain/entities/index.d.ts +5 -0
  14. package/dist/domain/entities/memory-event.d.ts +101 -0
  15. package/dist/domain/entities/memory-governance.d.ts +100 -0
  16. package/dist/domain/entities/memory-utility-metric.d.ts +65 -0
  17. package/dist/domain/entities/persona-entry.d.ts +67 -0
  18. package/dist/domain/ports/capability.d.ts +35 -0
  19. package/dist/domain/ports/embedding.d.ts +21 -0
  20. package/dist/domain/ports/index.d.ts +1 -0
  21. package/dist/domain/ports/redactor.d.ts +3 -0
  22. package/dist/domain/ports/repositories.d.ts +155 -1
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +774 -328
  25. package/dist/infrastructure/capabilities/capability-status.d.ts +10 -0
  26. package/dist/infrastructure/capabilities/index.d.ts +1 -0
  27. package/dist/infrastructure/database/event-log.d.ts +40 -8
  28. package/dist/infrastructure/database/health-checker.d.ts +22 -1
  29. package/dist/infrastructure/database/index.d.ts +3 -3
  30. package/dist/infrastructure/database/repositories/embedding-repository.d.ts +18 -4
  31. package/dist/infrastructure/database/repositories/friction-repository.d.ts +2 -1
  32. package/dist/infrastructure/database/repositories/graph-repository.d.ts +17 -0
  33. package/dist/infrastructure/database/repositories/index.d.ts +4 -0
  34. package/dist/infrastructure/database/repositories/memory-governance-repository.d.ts +21 -0
  35. package/dist/infrastructure/database/repositories/memory-utility-repository.d.ts +15 -0
  36. package/dist/infrastructure/database/repositories/persona-repository.d.ts +16 -0
  37. package/dist/infrastructure/database/schema.d.ts +40 -0
  38. package/dist/infrastructure/embedding/embedding-provider-factory.d.ts +3 -2
  39. package/dist/infrastructure/embedding/ollama-provider.d.ts +1 -0
  40. package/dist/infrastructure/hooks/config-manager.d.ts +17 -0
  41. package/dist/infrastructure/providers/provider-egress-policy.d.ts +21 -0
  42. package/dist/infrastructure/providers/provider-registry.d.ts +8 -4
  43. package/dist/infrastructure/remote/git-remote-event-transport.d.ts +40 -0
  44. package/dist/infrastructure/security/pattern-redactor.d.ts +3 -0
  45. package/dist/infrastructure/security/secret-audit-service.d.ts +57 -0
  46. package/dist/presentation/cli/commands/audit-secrets.d.ts +54 -0
  47. package/dist/presentation/cli/commands/friction/types.d.ts +13 -0
  48. package/dist/presentation/cli/commands/governance.d.ts +27 -0
  49. package/dist/presentation/cli/commands/index.d.ts +6 -0
  50. package/dist/presentation/cli/commands/profile.d.ts +23 -0
  51. package/dist/presentation/cli/commands/remote.d.ts +21 -3
  52. package/dist/presentation/cli/commands/sync/ambient.d.ts +7 -0
  53. package/dist/presentation/cli/commands/sync/types.d.ts +8 -12
  54. package/dist/presentation/cli/formatters/envelope.d.ts +2 -2
  55. package/dist/presentation/cli/index.js +918 -351
  56. 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 K.length>0?K:null}return null}}class P0{static decodeProjectDirectory($){return i.fromEncoded($)}static isEncodedPath($){if(!$||$.length===0)return!1;if(v2.test($))return!0;if(C2.test($))return!0;return!1}static extractProjectName($){return i.fromEncoded($).projectName}static filterEncodedPaths($){return $.filter((Z)=>P0.isEncodedPath(Z))}static translatePath($,Z=process.platform){if(!$||$.trim()==="")return $;if(Z==="win32"){let K=$.match(/^\/mnt\/([a-zA-Z])([\/]?)(.*)$/);if(K){let X=K[1].toUpperCase(),Y=K[3].replace(/\//g,"\\");return`${X}:\\${Y}`}return $}else{let K=$.match(/^([a-zA-Z]):([\\/]?)(.*)$/);if(K){let X=K[1].toLowerCase(),Y=K[3].replace(/\\/g,"/");return`/mnt/${X}/${Y}`}return $}}static resolveExistingPath($,Z,K=process.platform){if(!$)return $;let X=Z??(()=>!1);if(X($))return $;let Y=P0.translatePath($,K);if(X(Y))return Y;return $}}var v2,C2;var AZ=U(()=>{O9();v2=/^[A-Za-z]--/,C2=/^-[a-z]/i});class U9{static parse($){let Z=$,K={},X=[],Y=[],G=$.replace(w2,(_,J)=>{return Y.push(J.toLowerCase()),""}).trim().split(/\s+/).filter(Boolean);for(let _ of G){let J=_.match(y2);if(J&&J[1]&&J[2]){let H=J[1],V=J[2],B=H.toLowerCase();K[B]=V.toLowerCase()}else{let H=_.toLowerCase().replace(/"/g,"");if(H.length>=2&&!X.includes(H))X.push(H)}}for(let _ of Y)if(!X.includes(_))X.push(_);return{terms:X,filters:K,originalQuery:Z}}static toFts5Query($){if($.terms.length===0)return"";return $.terms.map((K)=>{if(K.includes(" "))return`"${K}"`;return K}).join(" AND ")}static isEmpty($){return $.terms.length===0&&!U9.hasFilters($)}static hasFilters($){return Object.keys($.filters).length>0}}var y2,w2;var R5=U(()=>{y2=/^(project|role|tool):(.+)$/i,w2=/"([^"]+)"/g});var F5=U(()=>{AZ();R5()});var T;var M5=U(()=>{T={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 R;var j5=U(()=>{R=class R extends Error{code;context;constructor($,Z,K){super(Z);if(this.name="MemoryError",this.code=$,this.context=K,Error.captureStackTrace)Error.captureStackTrace(this,R)}toJSON(){let $={error:{code:this.code,message:this.message}};if(this.context&&Object.keys(this.context).length>0)$.error.context=this.context;return $}}});function A($){return $ instanceof Error?$.message:String($)}function y$($){return $ instanceof Error?$:Error(A($))}var Q0=U(()=>{M5();j5()});var w$=U(()=>{I5();O9();F5();Q0()});class q0{static async extract($){let{messages:Z}=$;if(Z.length===0)return{topics:[],terms:[],decisions:[],summary:""};return q0.createExtractionPrompt(Z),{topics:[],terms:[],decisions:[],summary:""}}static createExtractionPrompt($){return`Analyze this session and extract:
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
- ${$.map((K)=>{return`${K.role==="user"?"[USER]":"[ASSISTANT]"}
36
- ${K.content}`}).join(`
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($,Z){let K={topics:[],terms:[],decisions:[],summary:""};if(!$||$.trim()==="")return K;let X=$.trim(),Y=X.match(/```(?:json)?\s*([\s\S]*?)\s*```/);if(Y&&Y[1])X=Y[1].trim();let Q;try{Q=JSON.parse(X)}catch{return K}let G=q0.parseTopics(Q.topics),_=q0.parseTerms(Q.terms),J=q0.parseDecisions(Q.decisions),H=typeof Q.summary==="string"?Q.summary:"";return{topics:G,terms:_,decisions:J,summary:H}}static parseTopics($){if(!$||!Array.isArray($))return[];return $.filter((Z)=>Z!==null&&typeof Z==="object").filter((Z)=>Z.name&&typeof Z.name==="string"&&Z.name.trim()!=="").map((Z)=>{let K=q0.normalizeConfidence(Z.confidence);return e.create({type:"concept",name:Z.name.trim(),confidence:K})})}static parseTerms($){if(!$||!Array.isArray($))return[];return $.filter((Z)=>Z!==null&&typeof Z==="object").filter((Z)=>Z.name&&typeof Z.name==="string"&&Z.name.trim()!=="").map((Z)=>{let K=q0.normalizeConfidence(Z.confidence),X={};if(Z.definition)X.definition=Z.definition;return e.create({type:"term",name:Z.name.trim(),confidence:K,metadata:X})})}static parseDecisions($){if(!$||!Array.isArray($))return[];return $.filter((Z)=>Z!==null&&typeof Z==="object").filter((Z)=>{return Z.subject&&typeof Z.subject==="string"&&Z.subject.trim()!==""&&Z.decision&&typeof Z.decision==="string"&&Z.decision.trim()!==""}).map((Z)=>{let K=q0.normalizeConfidence(Z.confidence),X={subject:Z.subject.trim(),decision:Z.decision.trim(),rejected:Array.isArray(Z.rejected)?Z.rejected:[],rationale:typeof Z.rationale==="string"?Z.rationale:""};return e.create({type:"decision",name:Z.subject.trim(),confidence:K,metadata:X})})}static normalizeConfidence($){if($===void 0||$===null||typeof $!=="number")return 0.5;return Math.max(0,Math.min(1,$))}}var L9=U(()=>{k$()});var D5={};w(D5,{computeModelHash:()=>I9,EmbeddingService:()=>T9});import{createHash as m2}from"crypto";function I9($){let Z=`${$.provider}:${$.model}:${$.dimensions}`;return m2("sha256").update(Z).digest("hex").slice(0,16)}class T9{repository;provider;batchSize;modelHash;modelName;redactor;constructor($){this.repository=$.repository,this.provider=$.provider,this.batchSize=$.config.batchSize,this.modelHash=I9($.config),this.modelName=$.config.model,this.redactor=$.redactor??c2}checkModelState(){let $=this.repository.getStoredModelHash(),Z=this.modelHash,K=this.modelName;if($===null)return{modelChanged:!1,needsReEmbed:!1,currentHash:Z,currentModelName:K};if($===Z)return{modelChanged:!1,needsReEmbed:!1,currentHash:Z,currentModelName:K};let X=this.repository.getStoredModelName()??$;return{modelChanged:!0,needsReEmbed:!0,storedHash:$,currentHash:Z,storedModelName:X,currentModelName:K,embeddedCount:this.repository.getEmbeddedCount()}}async embedUnembedded($={}){let Z=Date.now(),K=0,X=this.repository.getTotalMessageCount()-this.repository.getEmbeddedCount();if(X<=0)return{embedded:0,skipped:0,durationMs:0,rate:0};let Y=this.repository.findUnembedded(this.batchSize);while(Y.length>0){let _=Y.map((V)=>this.redactor.redactText(V.content).text),J=await this.provider.embedBatch(_),H=Y.map((V,B)=>({rowid:V.rowid,embedding:J[B].embedding}));this.repository.storeBatch(H,this.modelHash,this.modelName),K+=Y.length,$.onProgress?.({current:K,total:X}),Y=this.repository.findUnembedded(this.batchSize)}let Q=Date.now()-Z,G=Q>0?K/(Q/1000):0;return{embedded:K,skipped:0,durationMs:Q,rate:G}}async clearAndReembed($={}){return this.repository.clearAllEmbeddings(),this.embedUnembedded($)}}var c2;var R9=U(()=>{c2={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})}});function x9($,Z,K){let X=new Map;for(let Q of $){let G=X.get(Q.rowid)??{rowid:Q.rowid,rrfScore:0,normalizedScore:0,sources:[]};G.rrfScore+=1/(60+Q.rank),G.sources.push({source:"fts",rank:Q.rank,rawScore:Q.rawScore}),X.set(Q.rowid,G)}for(let Q of Z){let G=X.get(Q.rowid)??{rowid:Q.rowid,rrfScore:0,normalizedScore:0,sources:[]};G.rrfScore+=1/(60+Q.rank),G.sources.push({source:"vector",rank:Q.rank,rawScore:Q.rawScore}),X.set(Q.rowid,G)}let Y=Array.from(X.values()).sort((Q,G)=>G.rrfScore-Q.rrfScore);if(Y=Y.filter((Q)=>Q.rrfScore>=0.001),Y=Y.slice(0,K),Y.length>0){let Q=Y[0].rrfScore;if(Q>0)for(let G of Y)G.normalizedScore=G.rrfScore/Q}return Y}function u0($){let Z=($.match(/"/g)||[]).length,K=Z>0&&Z%2===0,X;if(K)X=$.replace(/[.:\-()[\]{}^~@/\\]/gu," ").replace(/\s+/g," ").trim();else X=$.replace(/[.:\-()[\]{}^"~@/\\]/gu," ").replace(/\s+/g," ").trim();if(X)return X;let Y=($.match(/"/g)||[]).length,G=Y>0&&Y%2===0?/[.:\-()[\]{}^~@/\\]/gu:/[.:\-()[\]{}^"~@/\\]/gu;return $.replace(G," ").replace(/\s+/g," ").trim()}class S5{sessionRepo;messageRepo;backfillStateRepo;summaryGenerator;dailyLogWriter;constructor($,Z,K,X,Y){this.sessionRepo=$;this.messageRepo=Z;this.backfillStateRepo=K;this.summaryGenerator=X;this.dailyLogWriter=Y}async dryRun($={}){let Z=await this.getUnprocessedSessions($.project);return{unprocessedCount:Z.length,estimatedCost:Z.length*o2}}async backfill($={}){let{batch:Z=50,project:K,onProgress:X}=$,Q=(await this.getUnprocessedSessions(K)).slice(0,Z),G={sessionsProcessed:0,sessionsFailed:0,sessionsSkipped:0,dailyLogsCreated:0,dailyLogsUpdated:0,errors:[]};for(let _=0;_<Q.length;_++){let J=Q[_];if(!J)continue;if(await this.backfillStateRepo.findBySessionId(J.id)){G.sessionsSkipped++,X?.({current:_+1,total:Q.length,sessionId:J.id,action:"skipped"});continue}try{X?.({current:_+1,total:Q.length,sessionId:J.id,action:"processing"});let V=await this.extractContent(J.id),B=J.projectPath.decoded,z=B.split(/[/\\]/).filter(Boolean).pop()??B,W=await this.summaryGenerator.generateSummary(V,J.id,z,J.startTime.toISOString(),J.endTime?.toISOString()??J.startTime.toISOString()),q=`daily/${J.startTime.toISOString().slice(0,10)}.md`;if(await this.dailyLogWriter.writeOrAppend(q,W+`
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
- `))G.dailyLogsCreated++;else G.dailyLogsUpdated++;await this.backfillStateRepo.save(c0.create({sessionId:J.id,backfilledAt:new Date,dailyLogPath:q,success:!0})),G.sessionsProcessed++}catch(V){let B=A(V);G.sessionsFailed++,G.errors.push({sessionId:J.id,error:B});let z=J.startTime.toISOString().slice(0,10);await this.backfillStateRepo.save(c0.create({sessionId:J.id,backfilledAt:new Date,dailyLogPath:`daily/${z}.md`,success:!1,errorMessage:B})),X?.({current:_+1,total:Q.length,sessionId:J.id,action:"error"})}}return G}async getUnprocessedSessions($){let Z=await this.sessionRepo.findFiltered({projectFilter:$,limit:1e4}),K=[];for(let X of Z)if(!await this.backfillStateRepo.findBySessionId(X.id))K.push(X);return K.sort((X,Y)=>X.startTime.getTime()-Y.startTime.getTime()),K}async extractContent($){let K=(await this.messageRepo.findBySession($)).filter((Y)=>Y.role==="user"||Y.role==="assistant"),X="";for(let Y of K){let G=`${Y.role==="user"?"User":"Assistant"}: ${Y.content}
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(X.length+G.length>t2){X+=`... [content truncated]
47
- `;break}X+=G}return X}}var o2=0.001,t2=16000;var v5=()=>{};function P9($,Z,K=4){if(Z<=0){let H=$.map((B)=>({...B,truncatedContent:B.content,allocated:B.content.length===0?0:Math.ceil(B.content.length/K),truncated:!1})),V=H.reduce((B,z)=>B+z.allocated,0);return{sections:H,totalTokensUsed:V,budgetExceeded:!1}}let X=Z*K,Y=[...$].sort((H,V)=>H.priority-V.priority),Q=X,G=[],_=!1;for(let H of Y){if(H.content.length===0){G.push({...H,truncatedContent:"",allocated:0,truncated:!1});continue}if(Q<=0){G.push({...H,truncatedContent:"",allocated:0,truncated:!0}),_=!0;continue}let V=H.content.length;if(V<=Q){let B=Math.ceil(V/K);G.push({...H,truncatedContent:H.content,allocated:B,truncated:!1}),Q-=V}else{let B=H.content.slice(0,Q),z=Math.ceil(Q/K);G.push({...H,truncatedContent:B,allocated:z,truncated:!0}),Q=0,_=!0}}let J=G.reduce((H,V)=>H+V.allocated,0);return{sections:G,totalTokensUsed:J,budgetExceeded:_}}var C5={};w(C5,{SmartContextService:()=>f$});function e2($){if($.length===0)return 0;return Math.ceil($.length/s2)}function $7($){return`#${$.id} (${$.severity}/${$.category}): ${$.description}`}class f${projectResolver;factRepo;frictionRepo;getSessionSummary;constructor($){if(this.projectResolver=$.projectResolver,this.factRepo=$.factRepo,this.frictionRepo=$.frictionRepo,$.getSessionSummary)this.getSessionSummary=$.getSessionSummary}async getContext($){let Z=this.projectResolver.resolveProjectEncoded($.projectFilter),K=this.projectResolver.resolveProjectName($.projectFilter);if(!Z||!K)return null;let Y=(await this.factRepo.findByProject(K)).filter((W)=>W.supersededAt===null),Q=(W)=>{return W.map((N)=>`- ${N.content}`).join(`
48
- `)},G=[],_=Y.filter((W)=>W.type==="decision");if(_.length>0)G.push(this.buildSection("decisions","Active Decisions",1,Q(_)));let J=Y.filter((W)=>W.type==="learning");if(J.length>0)G.push(this.buildSection("learnings","Recent Learnings",2,Q(J)));let H=Y.filter((W)=>W.type==="preference");if(H.length>0)G.push(this.buildSection("preferences","User Preferences",3,Q(H)));let V=Y.filter((W)=>W.type==="observation");if(V.length>0)G.push(this.buildSection("observations","Observations",4,Q(V)));if($.crossProject){let N=(await this.factRepo.findAll()).filter((L)=>L.supersededAt===null&&L.project!==K),q=N.filter((L)=>L.type==="preference");if(q.length>0)G.push(this.buildSection("cross_project_preferences","Global/Cross-Project User Preferences",5,Q(q)));let I=N.filter((L)=>L.type==="decision");if(I.length>0)G.push(this.buildSection("cross_project_decisions","Cross-Project Decisions",6,Q(I)));let F=N.filter((L)=>L.type==="learning");if(F.length>0)G.push(this.buildSection("cross_project_learnings","Cross-Project Learnings",7,Q(F)))}let B=await this.buildFrictionContent($.projectFilter);if(B)G.push(this.buildSection("friction","Open Friction",8,B));if(this.getSessionSummary){let W=await this.getSessionSummary($.projectFilter,$.days);if(W)G.push(this.buildSection("session_summary","Session Summary",9,W))}if($.budget&&$.budget>0)return this.applyBudget(K,Z,G,$.budget);let z=G.reduce((W,N)=>W+N.tokenEstimate,0);return{projectName:K,projectEncoded:Z,sections:G,totalTokensEstimate:z,truncated:!1}}buildSection($,Z,K,X){return{key:$,title:Z,priority:K,content:X,truncated:!1,tokenEstimate:e2(X)}}async buildFrictionContent($){let Z=await this.frictionRepo.findOpen();if(Z.length===0)return null;let K=Z.filter((Y)=>Y.description.includes($)||Y.context&&Y.context.includes($));return(K.length>0?K:Z).map($7).join(`
49
- `)}applyBudget($,Z,K,X){let Y=K.map((_)=>({key:_.key,priority:_.priority,content:_.content})),Q=P9(Y,X),G=Q.sections.map((_)=>{let J=K.find((H)=>H.key===_.key);return{key:_.key,title:J.title,priority:_.priority,content:_.truncatedContent,truncated:_.truncated,tokenEstimate:_.allocated}});return{projectName:$,projectEncoded:Z,sections:G,totalTokensEstimate:Q.totalTokensUsed,truncated:Q.budgetExceeded}}}var s2=4;var LZ=()=>{};var y5={};w(y5,{AmbientContextService:()=>E9});class E9{smartContext;contextWriter;formatter;constructor($,Z,K){this.smartContext=$;this.contextWriter=Z;this.formatter=K}async generateAmbientContext($){let Z=await this.smartContext.getContext({projectFilter:$.projectName,budget:$.budget,crossProject:!0});if(Z===null)return{success:!1,reason:"project-not-found"};if(Z.sections.length===0)return{success:!1,reason:"no-context"};let K=this.formatter.formatSmartContext(Z),X=this.buildSummaryBlock(Z);return await this.contextWriter.writeContextFile($.autoMemoryDir,K),await this.contextWriter.updateMemoryBlock($.autoMemoryDir,X),{success:!0,contextTokens:Z.totalTokensEstimate}}buildSummaryBlock($){let Z=this.countSectionLines($.sections,"decisions"),K=this.countSectionLines($.sections,"learnings"),X=this.countSectionLines($.sections,"friction"),Y=new Date().toISOString().split("T")[0];return["## Cross-Project Context",`Run \`memory context ${$.projectName}\` for full briefing. See [context.md](context.md) for latest snapshot.`,`- ${Z} active decisions, ${K} learnings`,`- Open friction: ${X}`,`- Last synced: ${Y}`].join(`
50
- `)}countSectionLines($,Z){let K=$.find((X)=>X.key===Z);if(!K||!K.content)return 0;return K.content.split(`
51
- `).filter((X)=>X.trim().length>0).length}}var b5={};w(b5,{trackDownloadTotal:()=>Y7,isUnicodeSupported:()=>w5,getBarCharacters:()=>IZ,createProgressReporter:()=>C9,createModelDownloadHandler:()=>Q7,createEmbeddingProgressReporter:()=>X7,TtyProgressReporter:()=>k9,TtyEmbeddingProgressReporter:()=>y9,QuietProgressReporter:()=>v9,QuietEmbeddingProgressReporter:()=>b9,PlainProgressReporter:()=>S9,PlainEmbeddingProgressReporter:()=>w9});import D9 from"cli-progress";function w5(){let{env:$}=process;if(process.platform!=="win32")return $.TERM!=="linux";return Boolean($.MSYSTEM)||Boolean($.WT_SESSION)||Boolean($.TERMINUS_SUBLIME)||$.ConEmuTask==="{cmd::Cmder}"||$.TERM_PROGRAM==="vscode"||$.TERM==="xterm-256color"||$.TERM==="alacritty"||$.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function IZ(){return w5()?Z7:K7}class k9{bar;verbose;total=0;currentValue=0;constructor($=!1){this.verbose=$;let Z=IZ();this.bar=new D9.SingleBar({format:"Syncing |{bar}| {percentage}% | {value}/{total} sessions",barCompleteChar:Z.complete,barIncompleteChar:Z.incomplete,hideCursor:!0})}start($){this.total=$,this.currentValue=0,this.bar.start($,0)}update($,Z){if(this.currentValue=$,this.bar.update($),this.verbose)this.bar.stop(),console.log(` Processing: ${Z}`),this.bar.start(this.total,$)}stop(){this.bar.stop()}log($){if(this.verbose)this.bar.stop(),console.log($),this.bar.start(this.total,this.currentValue)}}class S9{verbose;constructor($=!1){this.verbose=$}start($){console.log(`Processing ${$} sessions...`)}update($,Z){if(this.verbose)console.log(` [${$}] Processing: ${Z}`)}stop(){console.log("Done.")}log($){if(this.verbose)console.log($)}}class v9{start($){}update($,Z){}stop(){}log($){}}function C9($){if($.quiet)return new v9;if(!process.stdout.isTTY)return new S9($.verbose);return new k9($.verbose)}class y9{bar;constructor(){let $=IZ();this.bar=new D9.SingleBar({format:"Embedding |{bar}| {percentage}% | {value}/{total} messages | ETA: {eta_formatted}",barCompleteChar:$.complete,barIncompleteChar:$.incomplete,hideCursor:!0,etaBuffer:20})}start($){this.bar.start($,0)}update($){this.bar.update($)}stop(){this.bar.stop()}}class w9{start($){console.log(`Embedding ${$} messages...`)}update($){}stop(){console.log("Done.")}}class b9{start($){}update($){}stop(){}}function X7($){if($.quiet)return new b9;if(!process.stdout.isTTY)return new w9;return new y9}function Y7($,Z){let K=Math.round(Z/1048576);return K>$?K:$}function Q7($){if($.quiet||!process.stdout.isTTY){let Q=!1;return(G)=>{if(!Q&&G.status==="downloading"&&!$.quiet)console.log("Downloading embedding model (one-time setup)..."),Q=!0}}let Z=IZ(),K=new D9.SingleBar({format:"Downloading model |{bar}| {percentage}% | {value}/{total} MB",barCompleteChar:Z.complete,barIncompleteChar:Z.incomplete,hideCursor:!0}),X=!1,Y=0;return(Q)=>{if(Q.status==="downloading"){let G=Math.round(Q.loaded/1048576),_=Math.round(Q.total/1048576);if(_>Y)Y=_;if(!X&&Y>0)K.start(Y,G),X=!0;else if(X){if(_>0&&K.getTotal()!==Y)K.setTotal(Y);K.update(G)}}else if(Q.status==="ready"&&X)K.stop()}}var Z7,K7;var f9=U(()=>{Z7={complete:"\u2588",incomplete:"\u2591"},K7={complete:"#",incomplete:"-"}});function TZ($){try{return $.exec("CREATE VIRTUAL TABLE _fts5_check USING fts5(test)"),$.exec("DROP TABLE _fts5_check"),!0}catch{return!1}}function h9($,Z){let{sqliteVecAvailable:K=!1}=Z??{};if(!TZ($))throw Error("FTS5 extension is not available. Ensure you are using Bun with FTS5 support enabled.");try{let Q=$.prepare("PRAGMA table_info(friction_log)").all();if(!Q.some((_)=>_.name==="tool")&&Q.length>0)$.exec(`
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 Q of f5)$.exec(Q);if(!$.prepare("PRAGMA table_info(embedding_state)").all().some((Q)=>Q.name==="model_name"))$.exec(`
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(K)$.exec(`
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 f5;var g9=U(()=>{f5=[`
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
- `]});import{existsSync as h5,readdirSync as G7}from"fs";import{homedir as FZ}from"os";import{join as l}from"path";function K$(){let $=process.env.XDG_CONFIG_HOME;if($)return l($,RZ);return l(FZ(),".config",RZ)}function t(){let $=process.env.XDG_DATA_HOME;if($)return l($,RZ);return l(FZ(),".local","share",RZ)}function g5(){return l(FZ(),".memory-nexus")}function MZ(){let $=process.env.MEMORY_HOME;if($)return $;return l(FZ(),".memory")}function m9(){return l(K$(),"config.json")}function c9(){return l(t(),"memory.db")}function O0(){return l(t(),"logs")}function u9(){return l(t(),"hooks")}function d9(){return l(t(),"backups")}function p9(){return l(t(),"sync-checkpoint.json")}function jZ(){return l(t(),"events")}function m5($){return l(jZ(),`events-${$}.jsonl`)}function xZ($){let Z=$??jZ();if(!h5(Z))return[];let K=G7(Z),X=[],Y=l(Z,"events.jsonl");if(h5(Y))X.push(Y);for(let Q of K)if(Q.startsWith("events-")&&Q.endsWith(".jsonl"))X.push(l(Z,Q));return X}var RZ="memory";var p=U(()=>{if(process.platform==="win32"&&!process.env.HOME)process.env.HOME=process.env.USERPROFILE});import{Database as _7}from"bun:sqlite";import{existsSync as J7,mkdirSync as H7}from"fs";import{dirname as c5}from"path";function V7($){try{return e0("sqlite-vec").load($),!0}catch{return!1}}function E(){return c9()}function v($){let{path:Z,create:K=!0,applySchema:X=!0,walMode:Y=!0,cacheSize:Q=-64000,busyTimeout:G=5000}=$,_=Z!==":memory:",J=_&&J7(Z),H=$.quickCheck??(_&&J);if(_)try{H7(c5(Z),{recursive:!0})}catch(z){let W=A(z);throw new R(T.DB_CONNECTION_FAILED,`Failed to create database directory: ${W}`,{path:c5(Z)})}let V;try{V=new _7(Z,{create:K})}catch(z){let W=A(z),N=z.code;throw new R(T.DB_CONNECTION_FAILED,`Failed to connect to database: ${W}`,{path:Z,...N?{errno:N}:{}})}let B=(z)=>{V.close();let W=A(z);if(W.includes("not a database")||W.includes("SQLITE_NOTADB"))throw new R(T.DB_CORRUPTED,"Database file is corrupted or not a valid SQLite database",{path:Z});throw new R(T.DB_CONNECTION_FAILED,`Failed to initialize database: ${W}`,{path:Z})};try{V.exec("PRAGMA foreign_keys = ON;");let z=!1;if(Y&&_){V.exec("PRAGMA journal_mode = WAL;");let q=V.query("PRAGMA journal_mode;").get();if(z=q.journal_mode==="wal",!z)console.warn(`Warning: WAL mode not enabled. Current mode: ${q.journal_mode}`)}V.exec(`PRAGMA busy_timeout = ${G};`),V.exec("PRAGMA synchronous = NORMAL;"),V.exec(`PRAGMA cache_size = ${Q};`),V.exec("PRAGMA temp_store = MEMORY;");let W=TZ(V);if(!W){let q=V.query("SELECT sqlite_version() as version").get();throw V.close(),new R(T.DB_CONNECTION_FAILED,"FTS5 is not available. memory requires FTS5 for full-text search.",{sqliteVersion:q?.version??"unknown"})}if(H){let q=V.query("PRAGMA quick_check(1);").get();if(q?.quick_check!=="ok")throw V.close(),new R(T.DB_CORRUPTED,"Database integrity check failed",{path:Z,checkResult:q?.quick_check??"unknown"})}let N=V7(V);if(X)h9(V,{sqliteVecAvailable:N});return{db:V,walEnabled:z,fts5Available:W,sqliteVecAvailable:N}}catch(z){if(z instanceof R)throw z;throw B(z)}}function D($){try{$.exec("PRAGMA wal_checkpoint(TRUNCATE);")}catch{}try{$.exec("PRAGMA journal_mode = DELETE;")}catch{}$.close()}function l9($){return $.query("PRAGMA wal_checkpoint(TRUNCATE);").get()??{busy:0,log:0,checkpointed:0}}var n9=U(()=>{g9();w$();p()});class g{db;findByIdStmt;findByProjectStmt;findRecentStmt;insertStmt;deleteStmt;updateSummaryStmt;updateProjectNameStmt;findDistinctEncodedPathsStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`
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=$.prepare(`
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=$.prepare(`
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=$.prepare(`
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=$.prepare(`
504
+ `),this.deleteStmt=A.prepare(`
369
505
  DELETE FROM sessions WHERE id = $id
370
- `),this.updateSummaryStmt=$.prepare(`
506
+ `),this.updateSummaryStmt=A.prepare(`
371
507
  UPDATE sessions SET summary = $summary, updated_at = datetime('now')
372
508
  WHERE id = $id
373
- `),this.updateProjectNameStmt=$.prepare(`
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=$.prepare(`
512
+ `),this.findDistinctEncodedPathsStmt=A.prepare(`
377
513
  SELECT DISTINCT project_path_encoded FROM sessions
378
514
  ORDER BY project_path_encoded
379
- `)}rowToSession($){let Z=i.fromDecoded($.project_path_decoded);return B0.create({id:$.id,projectPath:Z,startTime:new Date($.start_time),endTime:$.end_time?new Date($.end_time):void 0,summary:$.summary??void 0,messageCount:$.message_count})}async findById($){let Z=this.findByIdStmt.get({$id:$});if(!Z)return null;return this.rowToSession(Z)}async findByProject($){return this.findByProjectStmt.all({$projectPath:$.encoded}).map((K)=>this.rowToSession(K))}async findRecent($){return this.findRecentStmt.all({$limit:$}).map((K)=>this.rowToSession(K))}async save($){this.insertStmt.run({$id:$.id,$projectPathEncoded:$.projectPath.encoded,$projectPathDecoded:$.projectPath.decoded,$projectName:$.projectPath.projectName,$startTime:$.startTime.toISOString(),$endTime:$.endTime?.toISOString()??null,$messageCount:$.messages.length})}async saveMany($){this.db.transaction(()=>{for(let K of $)this.insertStmt.run({$id:K.id,$projectPathEncoded:K.projectPath.encoded,$projectPathDecoded:K.projectPath.decoded,$projectName:K.projectPath.projectName,$startTime:K.startTime.toISOString(),$endTime:K.endTime?.toISOString()??null,$messageCount:K.messages.length})}).immediate()}async delete($){this.deleteStmt.run({$id:$})}async updateSummary($,Z){this.updateSummaryStmt.run({$id:$,$summary:Z})}async findOlderThan($){return this.db.prepare(`
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:$.toISOString()}).map((Y)=>this.rowToSession(Y))}async countOlderThan($){return this.db.prepare(`
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:$.toISOString()}).count}async deleteOlderThan($){let Z=await this.countOlderThan($),K=`
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:$.toISOString()}),Z}async updateProjectName($,Z){let X=this.db.prepare("SELECT COUNT(*) as count FROM sessions WHERE project_path_encoded = $encodedPath").get({$encodedPath:$}).count;if(X>0)this.updateProjectNameStmt.run({$encodedPath:$,$projectName:Z});return X}async findDistinctEncodedPaths(){return this.findDistinctEncodedPathsStmt.all().map((Z)=>Z.project_path_encoded)}async findFiltered($){let Z=[],K={};if($.projectFilter)Z.push("project_name LIKE $projectFilter"),K.$projectFilter=`%${$.projectFilter}%`;if($.sinceDate)Z.push("start_time >= $sinceDate"),K.$sinceDate=$.sinceDate.toISOString();if($.beforeDate)Z.push("start_time <= $beforeDate"),K.$beforeDate=$.beforeDate.toISOString();let X=Z.length>0?`WHERE ${Z.join(" AND ")}`:"",Y=$.limit??20;K.$limit=Y;let Q=`
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
- ${X}
535
+ ${$}
400
536
  ORDER BY start_time DESC
401
537
  LIMIT $limit
402
- `;return this.db.prepare(Q).all(K).map((J)=>this.rowToSession(J))}async searchSummaries($,Z=20){let K=u0($);if(!K)return[];let X=`
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(X).all({$query:K,$limit:Z}).map((G)=>this.rowToSession(G))}}var E0=()=>{};class T0{db;findByIdStmt;findBySessionStmt;existsStmt;insertStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
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=$.prepare(`SELECT id, session_id, role, content, timestamp, tool_use_ids
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=$.prepare("SELECT id FROM messages_meta WHERE id = ?"),this.insertStmt=$.prepare(`INSERT OR IGNORE INTO messages_meta (id, session_id, role, content, timestamp, tool_use_ids)
416
- VALUES ($id, $session_id, $role, $content, $timestamp, $tool_use_ids)`)}async findById($){let Z=this.findByIdStmt.get($);if(!Z)return null;return this.rowToMessage(Z)}async findBySession($){return this.findBySessionStmt.all($).map((K)=>this.rowToMessage(K))}async save($,Z){this.insertStmt.run({$id:$.id,$session_id:Z,$role:$.role,$content:$.content,$timestamp:$.timestamp.toISOString(),$tool_use_ids:$.toolUses.length>0?JSON.stringify($.toolUses):null})}async saveMany($,Z){let X={inserted:0,skipped:0,errors:[]};for(let Y=0;Y<$.length;Y+=100){let Q=$.slice(Y,Y+100);this.db.transaction((_)=>{for(let{message:J,sessionId:H}of _)try{if(this.existsStmt.get(J.id)){X.skipped++;continue}this.insertStmt.run({$id:J.id,$session_id:H,$role:J.role,$content:J.content,$timestamp:J.timestamp.toISOString(),$tool_use_ids:J.toolUses.length>0?JSON.stringify(J.toolUses):null}),X.inserted++}catch(V){X.skipped++,X.errors.push({id:J.id,reason:A(V)})}}).immediate(Q),Z?.onProgress?.({inserted:X.inserted,total:$.length})}return X}rowToMessage($){let Z=$.tool_use_ids?JSON.parse($.tool_use_ids):void 0;return W0.create({id:$.id,role:$.role,content:$.content,timestamp:new Date($.timestamp),toolUseIds:Z})}}var h$=U(()=>{S$()});class d0{findByIdStmt;findBySessionPathStmt;findPendingStmt;saveStmt;constructor($){this.findByIdStmt=$.prepare(`
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=$.prepare(`
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=$.prepare(`
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=$.prepare(`
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($){return $0.create({id:$.id,sessionPath:$.session_path,startedAt:new Date($.started_at),status:$.status,completedAt:$.completed_at?new Date($.completed_at):void 0,messagesExtracted:$.messages_extracted,errorMessage:$.error_message??void 0,fileMtime:$.file_mtime?new Date($.file_mtime):void 0,fileSize:$.file_size??void 0})}async findById($){let Z=this.findByIdStmt.get({$id:$});if(!Z)return null;return this.rowToExtractionState(Z)}async findBySessionPath($){let Z=this.findBySessionPathStmt.get({$sessionPath:$});if(!Z)return null;return this.rowToExtractionState(Z)}async findPending(){return this.findPendingStmt.all().map((Z)=>this.rowToExtractionState(Z))}async save($){this.saveStmt.run({$id:$.id,$sessionPath:$.sessionPath,$startedAt:$.startedAt.toISOString(),$status:$.status,$completedAt:$.completedAt?.toISOString()??null,$messagesExtracted:$.messagesExtracted,$errorMessage:$.errorMessage??null,$fileMtime:$.fileMtime?.toISOString()??null,$fileSize:$.fileSize??null})}}var u5=U(()=>{HZ()});class p0{db;findByIdStmt;findBySessionStmt;insertStmt;constructor($){this.db=$,this.findByIdStmt=$.prepare(`SELECT id, session_id, name, input, timestamp, status, result
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=$.prepare(`SELECT id, session_id, name, input, timestamp, status, result
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=$.prepare(`INSERT OR IGNORE INTO tool_uses
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($){let Z=this.findByIdStmt.get($);if(!Z)return null;return this.rowToEntity(Z)}async findBySession($){return this.findBySessionStmt.all($).map((K)=>this.rowToEntity(K))}async save($,Z){this.insertStmt.run({$id:$.id,$session_id:Z,$name:$.name,$input:JSON.stringify($.input),$timestamp:$.timestamp.toISOString(),$status:$.status,$result:$.result??null})}async saveMany($,Z){let X={inserted:0,skipped:0,errors:[]};for(let Y=0;Y<$.length;Y+=100){let Q=$.slice(Y,Y+100);this.db.transaction((_)=>{for(let{toolUse:J,sessionId:H}of _)try{if(this.insertStmt.run({$id:J.id,$session_id:H,$name:J.name,$input:JSON.stringify(J.input),$timestamp:J.timestamp.toISOString(),$status:J.status,$result:J.result??null}).changes>0)X.inserted++;else X.skipped++}catch(V){X.skipped++,X.errors.push({id:J.id,reason:A(V)})}}).immediate(Q),Z?.onProgress?.({inserted:X.inserted,total:$.length})}return X}rowToEntity($){return z0.create({id:$.id,name:$.name,input:JSON.parse($.input),timestamp:new Date($.timestamp),status:$.status,result:$.result??void 0})}}var a9=U(()=>{VZ()});class g${db;findBySourceStmt;findByTargetStmt;insertStmt;constructor($){this.db=$,this.findBySourceStmt=$.prepare(`
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=$.prepare(`
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=$.prepare(`
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($){return $$.create({sourceType:$.source_type,sourceId:$.source_id,targetType:$.target_type,targetId:$.target_id,relationship:$.relationship,weight:$.weight})}async findBySource($,Z){return this.findBySourceStmt.all({$sourceType:$,$sourceId:Z}).map((X)=>this.rowToLink(X))}async findByTarget($,Z){return this.findByTargetStmt.all({$targetType:$,$targetId:Z}).map((X)=>this.rowToLink(X))}async findRelated($,Z,K=2){return(await this.findRelatedWithHops($,Z,K)).map((Y)=>Y.link)}async findRelatedWithHops($,Z,K=2){return this.db.prepare(`
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:$,$entityId:Z,$maxHops:K}).map((G)=>({link:this.rowToLink(G),hop:G.hop}))}async save($){this.insertStmt.run({$sourceType:$.sourceType,$sourceId:$.sourceId,$targetType:$.targetType,$targetId:$.targetId,$relationship:$.relationship,$weight:$.weight})}async saveMany($){this.db.transaction(()=>{for(let K of $)this.insertStmt.run({$sourceType:K.sourceType,$sourceId:K.sourceId,$targetType:K.targetType,$targetId:K.targetId,$relationship:K.relationship,$weight:K.weight})}).immediate()}}var d5=U(()=>{q9()});var i9=U(()=>{k$()});var p5={};w(p5,{EmbeddingRepository:()=>D0});class D0{db;constructor($){this.db=$}findUnembedded($){return this.db.prepare(`
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($)}storeBatch($,Z,K){let X=this.db.prepare("INSERT INTO message_embeddings(rowid, embedding) VALUES (?, vec_f32(?))"),Y=this.db.prepare("INSERT INTO embedding_state(message_id, embedded_at, model_hash, model_name) VALUES (?, ?, ?, ?)");this.db.transaction((G)=>{let _=new Date().toISOString();for(let J of G)X.run(J.rowid,J.embedding),Y.run(J.rowid,_,Z,K)})($)}getStoredModelHash(){return this.db.prepare("SELECT DISTINCT model_hash FROM embedding_state LIMIT 1").get()?.model_hash??null}getStoredModelName(){return this.db.prepare("SELECT DISTINCT model_name FROM embedding_state WHERE model_name != '' LIMIT 1").get()?.model_name??null}clearAllEmbeddings(){this.db.exec("DELETE FROM message_embeddings"),this.db.exec("DELETE FROM embedding_state")}getEmbeddedCount(){return this.db.prepare("SELECT COUNT(*) as count FROM embedding_state").get()?.count??0}getTotalMessageCount(){return this.db.prepare("SELECT COUNT(*) as count FROM messages_meta").get()?.count??0}vectorKnnSearch($,Z){if(Z<=0)return[];return this.db.prepare(`
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($,Z)}getStoredEmbeddingDimensions(){let $=this.db.prepare("SELECT COUNT(*) as count FROM message_embeddings").get();if(!$||$.count===0)return null;let Z=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!Z||!Z.embedding)return null;return Z.embedding.byteLength/4}recreateVecTable($){this.db.exec("DROP TABLE IF EXISTS message_embeddings"),this.db.exec(`CREATE VIRTUAL TABLE message_embeddings USING vec0(
502
- embedding float[${$}]
503
- )`),this.db.exec("DELETE FROM embedding_state")}}class PZ{db;constructor($){this.db=$}async findByPath($){let Z=this.db.prepare("SELECT * FROM memory_files WHERE file_path = ?").get($);return Z?this.toEntity(Z):null}async findByType($){return this.db.prepare("SELECT * FROM memory_files WHERE file_type = ? ORDER BY last_indexed_at DESC").all($).map((K)=>this.toEntity(K))}async findByProject($){return this.db.prepare("SELECT * FROM memory_files WHERE project_encoded = ? ORDER BY file_path").all($).map((K)=>this.toEntity(K))}async save($){this.db.prepare(l5).run($.filePath,$.fileType,$.projectEncoded??null,$.content,$.contentHash,$.lastIndexedAt.toISOString())}async saveMany($){let Z=this.db.prepare(l5);this.db.transaction(()=>{for(let X of $)Z.run(X.filePath,X.fileType,X.projectEncoded??null,X.content,X.contentHash,X.lastIndexedAt.toISOString())})()}async searchContent($,Z=20){let K=u0($);if(!K)return[];return this.db.prepare(`
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(K,Z).map((Y)=>this.toEntity(Y))}async findCrossProjectLearnings($,Z=20){if($)return this.db.prepare(`SELECT * FROM memory_files
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($,Z).map((Y)=>this.toEntity(Y));return this.db.prepare(`SELECT * FROM memory_files
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(Z).map((X)=>this.toEntity(X))}toEntity($){return m0.create({id:$.id,filePath:$.file_path,fileType:$.file_type,projectEncoded:$.project_encoded??void 0,content:$.content,contentHash:$.content_hash,lastIndexedAt:new Date($.last_indexed_at),createdAt:new Date($.created_at)})}}var l5=`
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 r9=U(()=>{WZ()});var n5={};w(n5,{SqliteFrictionRepository:()=>k0});class k0{db;constructor($){this.db=$}async save($){let Z=this.db.prepare(`
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($.description,$.severity,$.category,$.tool,$.tags?JSON.stringify($.tags):null,$.status,$.context??null,$.sourceProject??null,$.loggedAt.toISOString(),$.resolvedAt?.toISOString()??null,$.resolution??null,$.lastReviewedAt?.toISOString()??null);return x0.create({id:Number(Z.lastInsertRowid),description:$.description,severity:$.severity,category:$.category,status:$.status,tool:$.tool,tags:$.tags,lastReviewedAt:$.lastReviewedAt,context:$.context,sourceProject:$.sourceProject,loggedAt:$.loggedAt,resolvedAt:$.resolvedAt,resolution:$.resolution})}async findById($){let Z=this.db.prepare("SELECT * FROM friction_log WHERE id = ?").get($);return Z?this.toEntity(Z):null}async findOpen(){return this.db.prepare("SELECT * FROM friction_log WHERE status = 'open' ORDER BY logged_at DESC").all().map((Z)=>this.toEntity(Z))}async findAll($){let Z=[],K=[];if($?.status)Z.push("status = ?"),K.push($.status);if($?.category)Z.push("category = ?"),K.push($.category);if($?.tool)Z.push("tool = ?"),K.push($.tool);if($?.sourceProject)Z.push("source_project = ?"),K.push($.sourceProject);let X=Z.length>0?`WHERE ${Z.join(" AND ")}`:"",Y=$?.limit??100;K.push(Y);let Q=`SELECT * FROM friction_log ${X} ORDER BY logged_at DESC LIMIT ?`;return this.db.prepare(Q).all(...K).map((_)=>this.toEntity(_))}async resolve($,Z){if(this.db.prepare("UPDATE friction_log SET status = 'resolved', resolution = ?, resolved_at = ? WHERE id = ?").run(Z,new Date().toISOString(),$).changes===0)throw Error(`Friction entry with id ${$} not found`)}async updateStatus($,Z){if(this.db.prepare("UPDATE friction_log SET status = ? WHERE id = ?").run(Z,$).changes===0)throw Error(`Friction entry with id ${$} not found`)}async getStats(){let $=this.db.prepare(`
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(),Z=this.db.prepare("SELECT severity, COUNT(*) as count FROM friction_log GROUP BY severity").all(),K={low:0,medium:0,high:0,critical:0};for(let H of Z)K[H.severity]=H.count;let X=this.db.prepare("SELECT category, COUNT(*) as count FROM friction_log GROUP BY category").all(),Y={};for(let H of X)Y[H.category]=H.count;let Q=this.db.prepare("SELECT tool, COUNT(*) as count FROM friction_log GROUP BY tool").all(),G={};for(let H of Q)G[H.tool]=H.count;let _=this.db.prepare(`
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=_?{id:_.id,description:_.description,daysOpen:Math.floor(_.days_open)}:null;return{total:$.total,open:$.open_count,resolved:$.resolved_count,wontFix:$.wont_fix_count,bySeverity:K,byCategory:Y,byTool:G,meanTimeToResolve:$.avg_resolve_days??null,oldestOpen:J}}async getWeeklyTrends($){let Z=[],K=new Date;for(let _=$-1;_>=0;_--){let J=new Date(K);J.setDate(J.getDate()-_*7);let H=J.getFullYear(),V=new Date(H,0,1),B=Math.ceil((J.getTime()-V.getTime())/86400000),z=Math.ceil((B+V.getDay())/7),W=`${H}-W${String(z).padStart(2,"0")}`;Z.push(W)}let X=this.db.prepare(`
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(K.getTime()-$*7*86400000).toISOString()),Y=new Map(X.map((_)=>[_.week,_.count])),Q=this.db.prepare(`
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(K.getTime()-$*7*86400000).toISOString()),G=new Map(Q.map((_)=>[_.week,_.count]));return Z.map((_)=>({week:_,newCount:Y.get(_)??0,resolvedCount:G.get(_)??0}))}async markReviewed($,Z){this.db.prepare("UPDATE friction_log SET last_reviewed_at = ? WHERE tool = ? AND status = 'open'").run(Z.toISOString(),$)}async findPatterns($){let Z=this.db.prepare(`
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($),K=[];for(let X of Z){let Y=this.db.prepare("SELECT * FROM friction_log WHERE tool = ? AND category = ? AND status = 'open'").all(X.tool,X.category);K.push({tool:X.tool,category:X.category,count:X.count,entries:Y.map((Q)=>this.toEntity(Q))})}return K}async deleteByPattern($){return this.db.prepare("DELETE FROM friction_log WHERE description LIKE $pattern").run({$pattern:$}),this.db.query("SELECT changes() as count").get().count}toEntity($){return x0.create({id:$.id,description:$.description,severity:$.severity,category:$.category,status:$.status,tool:$.tool,tags:$.tags?JSON.parse($.tags):void 0,lastReviewedAt:$.last_reviewed_at?new Date($.last_reviewed_at):void 0,context:$.context??void 0,sourceProject:$.source_project??void 0,loggedAt:new Date($.logged_at),resolvedAt:$.resolved_at?new Date($.resolved_at):void 0,resolution:$.resolution??void 0})}}var EZ=U(()=>{BZ()});var a5=()=>{};var i5={};w(i5,{SqliteFactRepository:()=>l0});class l0{db;constructor($){this.db=$}async findById($){let Z=this.db.prepare("SELECT * FROM facts WHERE id = ?").get($);if(!Z)return null;return this.toEntity(Z)}async findByUuid($){let Z=this.db.prepare("SELECT * FROM facts WHERE uuid = ?").get($);if(!Z)return null;return this.toEntity(Z)}async findByProject($){return this.db.prepare("SELECT * FROM facts WHERE project = ? ORDER BY observed_at DESC").all($).map((K)=>this.toEntity(K))}async findRecent($){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC LIMIT ?").all($).map((K)=>this.toEntity(K))}async save($){let Z=$.metadata?JSON.stringify($.metadata):null,K=await this.findByUuid($.uuid);if(K)return this.db.prepare(`
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($.type,$.project,$.content,Z,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy,$.uuid),$.withId(K.id);else{let X=this.db.prepare(`
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($.uuid,$.type,$.project,$.content,Z,$.observedAt.toISOString(),$.supersededAt?$.supersededAt.toISOString():null,$.supersededBy);return $.withId(Number(X.lastInsertRowid))}}async saveMany($){let Z=[];return this.db.transaction(()=>{for(let X of $){let Y=X.metadata?JSON.stringify(X.metadata):null,Q=this.db.prepare("SELECT id FROM facts WHERE uuid = ?").get(X.uuid);if(Q)this.db.prepare(`
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(X.type,X.project,X.content,Y,X.observedAt.toISOString(),X.supersededAt?X.supersededAt.toISOString():null,X.supersededBy,X.uuid),Z.push(X.withId(Q.id));else{let G=this.db.prepare(`
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(X.uuid,X.type,X.project,X.content,Y,X.observedAt.toISOString(),X.supersededAt?X.supersededAt.toISOString():null,X.supersededBy);Z.push(X.withId(Number(G.lastInsertRowid)))}}})(),Z}async search($,Z=20){return this.db.prepare(`
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($,Z).map((X)=>this.toEntity(X))}async superseded($,Z,K){this.db.prepare("UPDATE facts SET superseded_at = ?, superseded_by = ?, updated_at = datetime('now') WHERE uuid = ?").run(Z.toISOString(),K,$)}async supersede($,Z,K){await this.superseded($,Z,K)}async findAll(){return this.db.prepare("SELECT * FROM facts ORDER BY observed_at DESC").all().map((Z)=>this.toEntity(Z))}async clearAll(){this.db.exec("DELETE FROM facts;")}toEntity($){return A0.create({id:$.id,uuid:$.uuid,type:$.type,project:$.project,content:$.content,metadata:$.metadata?JSON.parse($.metadata):void 0,observedAt:new Date($.observed_at),supersededAt:$.superseded_at?new Date($.superseded_at):null,supersededBy:$.superseded_by??null})}}var X$=U(()=>{v$()});var o9=U(()=>{E0();h$();u5();a9();d5();i9();r9();EZ();a5();X$()});class m${db;constructor($){this.db=$}async search($,Z){let K=Z?.limit??20,X=u0($.value);if(!X)return[];let{sql:Y,params:Q}=this.buildSearchQuery(X,K,Z),_=this.db.prepare(Y).all(...Q);if(_.length===0)return[];return this.normalizeBm25Scores(_).map((H)=>Y0.create({sessionId:H.session_id,messageId:H.id,snippet:H.snippet,score:H.normalizedScore,timestamp:new Date(H.timestamp),role:H.role}))}buildSearchQuery($,Z,K){let X=[$],Y=["messages_fts MATCH ?"],Q=`
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(K?.projectFilter)Q+=`
901
+ `;if(G?.projectFilter)Z+=`
591
902
  JOIN sessions s ON m.session_id = s.id
592
- `,Y.push("LOWER(s.project_name) LIKE LOWER(?)"),X.push(`%${K.projectFilter}%`);if(K?.roleFilter)if(Array.isArray(K.roleFilter)){let _=K.roleFilter.map(()=>"?").join(", ");Y.push(`m.role IN (${_})`),X.push(...K.roleFilter)}else Y.push("m.role = ?"),X.push(K.roleFilter);if(K?.sessionFilter)Y.push("m.session_id = ?"),X.push(K.sessionFilter);if(K?.sinceDate)Y.push("m.timestamp >= ?"),X.push(K.sinceDate.toISOString());if(K?.beforeDate)Y.push("m.timestamp <= ?"),X.push(K.beforeDate.toISOString());return X.push(Z),{sql:`
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
- ${Q}
602
- WHERE ${Y.join(" AND ")}
912
+ ${Z}
913
+ WHERE ${K.join(" AND ")}
603
914
  ORDER BY score
604
915
  LIMIT ?
605
- `,params:X}}normalizeBm25Scores($){if($.length===0)return[];let Z=$[0];if($.length===1&&Z)return[{...Z,normalizedScore:1}];let K=$.map((G)=>G.score),X=Math.min(...K),Y=Math.max(...K);if(X===Y)return $.map((G)=>({...G,normalizedScore:1}));let Q=Y-X;return $.map((G)=>({...G,normalizedScore:(Y-G.score)/Q}))}}var r5=()=>{};class c${db;fts5Service;embeddingRepo;providerFactory;config;sqliteVecAvailable;lastSearchMeta=null;constructor($){this.db=$.db,this.fts5Service=$.fts5Service,this.embeddingRepo=$.embeddingRepo,this.providerFactory=$.providerFactory,this.config=$.config,this.sqliteVecAvailable=$.sqliteVecAvailable}getLastSearchMeta(){return this.lastSearchMeta}async search($,Z){let K=performance.now(),X=this.embeddingRepo.getEmbeddedCount(),Y=this.embeddingRepo.getTotalMessageCount(),Q=Y>0?X/Y:0,G=this.sqliteVecAvailable&&X>0,_={fts:!0,vector:G,hybrid:G},J=this.resolveMode(Z?.mode,X),H=!1,V,B;try{switch(J.effectiveMode){case"fts":B=await this.ftsSearch($,Z);break;case"vector":B=await this.vectorSearch($,Z);break;case"hybrid":{let I=await this.hybridSearch($,Z);if(B=I.results,I.degraded)H=!0,V=I.degradationReason}break}}catch(I){if(J.effectiveMode!=="vector"&&!(I instanceof R))B=await this.ftsSearch($,Z),H=!0,V="provider_failure";else throw I}B=this.applyDecayToResults(B,Z);let z=J.degraded||H,W=V??(J.degraded?J.reason:void 0),N=z&&!J.degraded?"fts":J.effectiveMode,q=performance.now()-K;return this.lastSearchMeta={mode:N,modeReason:z?W??J.reason:J.reason,degraded:z,degradationReason:z?W:void 0,embeddingCoverage:Q,capabilities:_,timingMs:q},B}resolveMode($,Z=0){let K=this.config.search?.defaultMode??"auto",X=$??K;if(X==="fts")return{effectiveMode:"fts",degraded:!1,reason:"explicit"};if(X==="vector"){if(!this.sqliteVecAvailable)throw new R(T.VECTOR_UNAVAILABLE,"Vector search requires sqlite-vec extension",{suggestion:"Run 'memory doctor' to check extension status"});if(Z===0)throw new R(T.VECTOR_UNAVAILABLE,"No embeddings found in database",{suggestion:"Run 'memory sync --embed' to generate embeddings"});return{effectiveMode:"vector",degraded:!1,reason:"explicit"}}if(X==="hybrid"){if(!this.sqliteVecAvailable||Z===0)return{effectiveMode:"fts",degraded:!0,reason:!this.sqliteVecAvailable?"sqlite_vec_unavailable":"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"explicit"}}if(!this.sqliteVecAvailable||Z===0)return{effectiveMode:"fts",degraded:!1,reason:"no_embeddings"};return{effectiveMode:"hybrid",degraded:!1,reason:"auto_hybrid"}}applyDecayToResults($,Z){if(!(this.config.search?.temporalDecay?.enabled!==!1&&!Z?.noDecay)||$.length===0)return $;let X=this.config.search?.temporalDecay?.halfLifeDays??30,Q=new Date().getTime(),G=86400000,_=$.map((J)=>{let H=(Q-J.timestamp.getTime())/G,V=Math.pow(0.5,H/X),B=Math.max(0,Math.min(1,J.score*V));return{result:J,decayedScore:B}});return _.sort((J,H)=>H.decayedScore-J.decayedScore),_.map(({result:J,decayedScore:H})=>Y0.create({sessionId:J.sessionId,messageId:J.messageId,snippet:J.snippet,score:H,timestamp:J.timestamp,role:J.role,source:J.source,rawScores:J.rawScores}))}async ftsSearch($,Z){return(await this.fts5Service.search($,Z)).map((X)=>Y0.create({sessionId:X.sessionId,messageId:X.messageId,snippet:X.snippet,score:X.score,timestamp:X.timestamp,role:X.role,source:"fts",rawScores:{bm25:X.score}}))}async getProvider($){try{let Z=this.providerFactory.createFromConfig(this.config);if(!Z){if($)throw new R(T.VECTOR_UNAVAILABLE,"Embedding provider is disabled in configuration");return null}if(!Z.isReady())await Z.initialize();return Z}catch(Z){if($){if(Z instanceof R)throw Z;throw new R(T.VECTOR_UNAVAILABLE,`Embedding provider failed to initialize: ${A(Z)}`)}return null}}async embedQuery($,Z){return(await Z.embed($)).embedding}checkDimensionMismatch($){if(this.embeddingRepo.getEmbeddedCount()===0)return null;let K=this.getStoredEmbeddingDimensions();if(K===null)return null;let X=$.dimensions;if(X!==K)return`dimension_mismatch (stored: ${K}, provider: ${X})`;return null}getStoredEmbeddingDimensions(){try{let $=this.db.prepare("SELECT embedding FROM message_embeddings LIMIT 1").get();if(!$||!$.embedding)return null;let Z=$.embedding;if(Z instanceof Float32Array)return Z.length;if(Z instanceof ArrayBuffer||Z.byteLength!==void 0)return Z.byteLength/4;return null}catch{return null}}async vectorSearch($,Z){let K=await this.getProvider(!0);if(!K)throw new R(T.VECTOR_UNAVAILABLE,"Embedding provider unavailable");let X=this.checkDimensionMismatch(K);if(X)throw new R(T.EMBEDDING_DIMENSION_MISMATCH,`Cannot run vector search: ${X}`);let Y=await this.embedQuery($.value,K),Q=Z?.limit??20,G=Q*o5,_=this.embeddingRepo.vectorKnnSearch(Y,G);if(_.length===0)return[];let J=_.map((B)=>B.rowid),H=this.hydrateByRowids(J),V=[];for(let B=0;B<_.length&&V.length<Q;B++){let z=_[B];if(!z)continue;let W=H.get(z.rowid);if(!W)continue;if(!this.passesFilters(W,Z))continue;let N=this.vectorSnippet(W.content),q=Math.max(0,Math.min(1,1-z.distance/2));V.push(Y0.create({sessionId:W.session_id,messageId:W.id,snippet:N,score:q,timestamp:new Date(W.timestamp),role:W.role,source:"vector",rawScores:{cosine:z.distance}}))}return V}async hybridSearch($,Z){let K=Z?.limit??20,X=K*o5,Y={...Z,limit:X},Q=await this.fts5Service.search($,Y),G=[],_=null,J=!1,H;try{if(_=await this.getProvider(!1),_){let O=this.checkDimensionMismatch(_);if(O)_=null,J=!0,H=O;else{let M=await this.embedQuery($.value,_);G=this.embeddingRepo.vectorKnnSearch(M,X)}}else J=!0,H="provider_unavailable"}catch(O){G=[],J=!0,H=`provider_failure: ${A(O)}`}if(G.length===0&&Q.length>0)return{results:Q.map((M)=>Y0.create({sessionId:M.sessionId,messageId:M.messageId,snippet:M.snippet,score:M.score,timestamp:M.timestamp,role:M.role,source:"fts",rawScores:{bm25:M.score}})).slice(0,K),degraded:J,degradationReason:H};if(Q.length===0&&G.length===0)return{results:[],degraded:J,degradationReason:H};let V=this.buildFtsRowidMap(Q),B=Q.map((O,M)=>({rowid:V.get(O.messageId)??0,rank:M+1,source:"fts",rawScore:O.score})),z=G.map((O,M)=>({rowid:O.rowid,rank:M+1,source:"vector",rawScore:O.distance})),W=x9(B,z,K);if(W.length===0)return{results:[],degraded:J,degradationReason:H};let N=W.map((O)=>O.rowid),q=this.hydrateByRowids(N),I=new Map;for(let O of W){let M=O.sources.some((y)=>y.source==="fts"),x=O.sources.some((y)=>y.source==="vector");if(M&&x)I.set(O.rowid,"both");else if(M)I.set(O.rowid,"fts");else I.set(O.rowid,"vector")}let F=W.map((O)=>({...O,score:O.normalizedScore})),L=[];for(let O of F){let M=q.get(O.rowid);if(!M)continue;if(!this.passesFilters(M,Z))continue;let x=I.get(O.rowid)??"fts",y=Q.find((V0)=>V0.messageId===M.id),J0=y?y.snippet:this.vectorSnippet(M.content),g0=Math.max(0,Math.min(1,O.score)),H0={rrf:O.rrfScore};for(let V0 of O.sources){if(V0.source==="fts")H0.bm25=V0.rawScore;if(V0.source==="vector")H0.cosine=V0.rawScore}L.push(Y0.create({sessionId:M.session_id,messageId:M.id,snippet:J0,score:g0,timestamp:new Date(M.timestamp),role:M.role,source:x,rawScores:H0}))}return{results:L,degraded:J,degradationReason:H}}buildFtsRowidMap($){if($.length===0)return new Map;let Z=$.map((Y)=>Y.messageId),K=Z.map(()=>"?").join(","),X=this.db.prepare(`SELECT rowid, id FROM messages_meta WHERE id IN (${K})`).all(...Z);return new Map(X.map((Y)=>[Y.id,Y.rowid]))}hydrateByRowids($){if($.length===0)return new Map;let Z=$.map(()=>"?").join(","),K=this.db.prepare(`SELECT rowid, id, session_id, content, timestamp, role
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 (${Z})`).all(...$);return new Map(K.map((X)=>[X.rowid,X]))}vectorSnippet($){if($.length<=200)return $;return $.slice(0,200)+"..."}passesFilters($,Z){if(!Z)return!0;if(Z.projectFilter){let K=this.db.prepare("SELECT project_name FROM sessions WHERE id = ?").get($.session_id);if(!K||!K.project_name.toLowerCase().includes(Z.projectFilter.toLowerCase()))return!1}if(Z.roleFilter){if(Array.isArray(Z.roleFilter)){if(!Z.roleFilter.includes($.role))return!1}else if($.role!==Z.roleFilter)return!1}if(Z.sessionFilter&&$.session_id!==Z.sessionFilter)return!1;if(Z.sinceDate){if(new Date($.timestamp)<Z.sinceDate)return!1}if(Z.beforeDate){if(new Date($.timestamp)>Z.beforeDate)return!1}return!0}}var o5=4;var t5=U(()=>{w$()});class Y${db;constructor($){this.db=$}async getStats($=10){let Z=this.db.prepare(`
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(),K=this.db.prepare(`
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($),X=K.reduce((G,_)=>G+_.sessionCount,0),Y=K.reduce((G,_)=>G+_.messageCount,0),Q=this.db.prepare("SELECT COUNT(*) as totalToolUses FROM tool_uses").get();return{totalSessions:X,totalMessages:Y,totalToolUses:Q?.totalToolUses??0,databaseSizeBytes:Z?.size??0,projectBreakdown:K.map((G)=>({projectName:G.projectName,sessionCount:G.sessionCount,messageCount:G.messageCount}))}}}var s5={};w(s5,{SqliteProjectResolver:()=>G$,SqliteContextService:()=>Q$});class Q${db;constructor($){this.db=$}async getProjectContext($,Z={}){let K=Z.topicsLimit??10,X=Z.toolsLimit??10,Y;if(Z.days){let I=new Date,F=new Date(I.getFullYear(),I.getMonth(),I.getDate());Y=new Date(F.getTime()-(Z.days-1)*24*60*60*1000)}let Q=this.db.prepare(`SELECT DISTINCT project_name, project_path_decoded, project_path_encoded
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($)??this.db.prepare(`SELECT project_name, project_path_decoded, project_path_encoded
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($);if(!Q)return null;let G=Q.project_path_encoded,J=`
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
- ${Y?"AND s.start_time >= ?":""}
638
- `,H=Y?this.db.prepare(J).get(G,Y.toISOString()):this.db.prepare(J).get(G);if(!H||H.sessionCount===0)return null;let B=`
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
- ${Y?"AND t.timestamp >= ?":""}
954
+ ${K?"AND t.timestamp >= ?":""}
644
955
  GROUP BY t.name
645
956
  ORDER BY count DESC
646
957
  LIMIT ?
647
- `,z=Y?this.db.prepare(B).all(G,Y.toISOString(),X):this.db.prepare(B).all(G,X),N=`
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
- ${Y?`JOIN sessions s ON l.source_type = 'session' AND l.source_id = s.id
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
- `,q=Y?this.db.prepare(N).all(G,Y.toISOString(),K):this.db.prepare(N).all(G,K);return{projectName:Q.project_name,projectPathDecoded:Q.project_path_decoded,sessionCount:H.sessionCount,totalMessages:H.userMessages+H.assistantMessages,userMessages:H.userMessages,assistantMessages:H.assistantMessages,recentTopics:q.map((I)=>I.topic),recentToolUses:z.map((I)=>({name:I.name,count:I.count})),lastActivity:H.lastActivity?new Date(H.lastActivity):null}}}class G${db;constructor($){this.db=$}resolveProjectEncoded($){let Z=this.db.prepare(`SELECT DISTINCT project_path_encoded
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($);if(Z)return Z.project_path_encoded;return this.db.prepare(`SELECT project_path_encoded
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($)?.project_path_encoded??null}resolveProjectName($){let Z=this.db.prepare(`SELECT DISTINCT project_name
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($);if(Z)return Z.project_name;return this.db.prepare(`SELECT project_name
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($)?.project_name??null}}var e5=U(()=>{r5();t5()});var G0,_$;var t9=U(()=>{G0={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}},_$={anthropic:"claude-3-5-sonnet-20241022",openai:"gpt-4o",ollama:"llama3","claude-cli":"claude-cli-print","openai-compatible":"gpt-4o"}});var K4={};w(K4,{saveConfig:()=>S0,resolveProviderDefaults:()=>Y1,resolveEmbeddingApiKey:()=>d$,loadConfig:()=>m,getConfigPath:()=>kZ,getConfigDir:()=>n0,PROVIDER_DEFAULTS:()=>X1,DEFAULT_SEARCH_CONFIG:()=>DZ,DEFAULT_REMOTE_SYNC_CONFIG:()=>$4,DEFAULT_LEGACY_MEMORY_FILES_CONFIG:()=>Z4,DEFAULT_EMBEDDING_CONFIG:()=>J$,DEFAULT_CONFIG:()=>u$,DEFAULT_AMBIENT_CONTEXT_CONFIG:()=>e9});import{randomUUID as s9}from"crypto";import{existsSync as $1,mkdirSync as A7,readFileSync as Z1,writeFileSync as N7}from"fs";import{dirname as K1}from"path";function Y1($,Z){let K=$.provider;if(K==="local"||!Z)return $;let X=X1[K],Y={...$};if(!("model"in Z))Y.model=X?.model??$.model;if(!("dimensions"in Z))Y.dimensions=X?.dimensions??$.dimensions;return Y}function d$($,Z){let K=[$.apiKeyEnv,...Z].filter((Y)=>Boolean(Y));for(let Y of K){let Q=process.env[Y];if(Q){let G={apiKey:Q,source:"environment",envVar:Y,deprecatedPlaintext:!1};if($.apiKeyRef)G.ref=$.apiKeyRef;return G}}if($.apiKey){let Y={apiKey:$.apiKey,source:"plaintext-config",deprecatedPlaintext:!0};if($.apiKeyRef)Y.ref=$.apiKeyRef;return Y}let X={source:"missing",deprecatedPlaintext:!1};if($.apiKeyRef)X.ref=$.apiKeyRef;return X}function n0($){if($!==void 0)return K1($);return K$()}function kZ($){if($!==void 0)return $;return m9()}function m($){let Z=kZ($);if(!$1(Z)){let K=process.env.MEMORY_TEST_MACHINE_ID??s9(),X={...u$,machineId:K};try{S0(X,$)}catch{}return X}try{let K=Z1(Z,"utf-8"),X=JSON.parse(K),Y=X.machineId,Q=!1;if(!Y)Y=process.env.MEMORY_TEST_MACHINE_ID??s9(),Q=!0;let G=X.embedding,_={...J$,...G??{}},J={...$4,...X.remoteSync??{}},H={...Z4,...X.legacyMemoryFiles??{}},V={...u$,...X,machineId:Y,remoteSync:J,legacyMemoryFiles:H,embedding:Y1(_,G),search:{...DZ,...X.search??{},temporalDecay:{...DZ.temporalDecay,...X.search?.temporalDecay??{}}},ambientContext:{...e9,...X.ambientContext??{}}};if(Q)try{S0(V,$)}catch{}return V}catch{console.warn("Invalid config.json, using defaults");let K=process.env.MEMORY_TEST_MACHINE_ID??s9();return{...u$,machineId:K}}}function S0($,Z){let K=kZ(Z),X=K1(K);A7(X,{recursive:!0});let Y={};if($1(K))try{let G=Z1(K,"utf-8");Y=JSON.parse(G)}catch{}let Q={...Y,...$};N7(K,JSON.stringify(Q,null,2)+`
675
- `)}var DZ,e9,$4,Z4,X1,J$,u$;var Z0=U(()=>{p();t9();DZ={defaultMode:"auto",temporalDecay:{enabled:!0,halfLifeDays:30}},e9={enabled:!0,budget:800},$4={enabled:!1,autoPush:!0,autoPull:!0},Z4={enabled:!1},X1={...G0};J$={enabled:!0,provider:"local",model:"Xenova/all-MiniLM-L6-v2",dimensions:384,batchSize:100},u$={autoSync:!0,recoveryOnStartup:!0,syncOnCompaction:!0,timeout:5000,logLevel:"info",logRetentionDays:7,showFailures:!1,embedding:J$,search:DZ,ambientContext:e9,machineId:"",remoteSync:$4,legacyMemoryFiles:Z4}});import{appendFileSync as MG,existsSync as q7,mkdirSync as jG,readFileSync as O7,renameSync as xG,statSync as PG}from"fs";import{dirname as U7,join as L7}from"path";function H$($){if($!==void 0)return U7($);return O0()}function Q1($){if($!==void 0)return $;return L7(O0(),"sync.log")}function V$($=100,Z){let K=Q1(Z);if(!q7(K))return[];try{let Y=O7(K,"utf-8").split(`
676
- `).filter((G)=>G.trim()!==""),Q=[];for(let G of Y)try{let _=JSON.parse(G);Q.push(_)}catch{continue}return Q.slice(-$)}catch{return[]}}var SZ=U(()=>{p()});var X4=U(()=>{p();L9();i9();h$()});var _1=U(()=>{Z0();SZ();X4()});var J1=U(()=>{SZ()});import{copyFileSync as H1,existsSync as p$,mkdirSync as Y4,readFileSync as T7,writeFileSync as V1}from"fs";import{dirname as Q4,join as G4}from"path";import{homedir as R7}from"os";function W$($){return $?.settingsPath??G4(R7(),".claude","settings.json")}function vZ($){return $?.backupPath??G4(d9(),"settings.json.backup")}function a0($){return $?.hookScriptPath??G4(u9(),"sync-hook.js")}function B$($){let Z=W$($);if(!p$(Z))return{};try{let K=T7(Z,"utf-8");return JSON.parse(K)}catch{return{}}}function W1($){let Z=W$($),K=vZ($);if(!p$(Z))return!1;return Y4(Q4(K),{recursive:!0}),H1(Z,K),!0}function _4($){let Z=W$($),K=vZ($);if(!p$(K))return!1;return Y4(Q4(Z),{recursive:!0}),H1(K,Z),!0}function a$($){let Z=W$($),K=a0($);W1($);let X=B$($),Y=`bun run "${K.replace(/\\/g,"/")}"`;if(X.hooks=X.hooks??{},X.hooks.SessionEnd?.some((G)=>G.hooks.some((_)=>_.command.includes(l$)||_.command.includes(n$))))return{success:!0,message:"Hooks already installed"};return X.hooks.SessionEnd=X.hooks.SessionEnd??[],X.hooks.SessionEnd.push({hooks:[{type:"command",command:Y,timeout:5}]}),X.hooks.PreCompact=X.hooks.PreCompact??[],X.hooks.PreCompact.push({matcher:"auto",hooks:[{type:"command",command:Y,timeout:5}]}),Y4(Q4(Z),{recursive:!0}),V1(Z,JSON.stringify(X,null,2)+`
677
- `),{success:!0,message:"Hooks installed successfully"}}function i$($){let Z=W$($),K=B$($);if(!K.hooks)return{success:!0,message:"No hooks to uninstall"};if(K.hooks.SessionEnd){if(K.hooks.SessionEnd=K.hooks.SessionEnd.filter((X)=>!X.hooks.some((Y)=>Y.command.includes(l$)||Y.command.includes(n$))),K.hooks.SessionEnd.length===0)delete K.hooks.SessionEnd}if(K.hooks.PreCompact){if(K.hooks.PreCompact=K.hooks.PreCompact.filter((X)=>!X.hooks.some((Y)=>Y.command.includes(l$)||Y.command.includes(n$))),K.hooks.PreCompact.length===0)delete K.hooks.PreCompact}if(Object.keys(K.hooks).length===0)delete K.hooks;return V1(Z,JSON.stringify(K,null,2)+`
678
- `),{success:!0,message:"Hooks uninstalled successfully"}}function R0($){let Z=B$($),K=a0($),X=vZ($);return{sessionEnd:Z.hooks?.SessionEnd?.some((Y)=>Y.hooks.some((Q)=>Q.command.includes(l$)||Q.command.includes(n$)))??!1,preCompact:Z.hooks?.PreCompact?.some((Y)=>Y.hooks.some((Q)=>Q.command.includes(l$)||Q.command.includes(n$)))??!1,hookScriptExists:p$(K),backupExists:p$(X)}}var l$="memory",n$="memory-nexus";var J4=U(()=>{p()});var z$=U(()=>{Z0();SZ();X4();_1();J1();J4()});class H4{name="transformers-js";model;dimensions;_pipeline=null;constructor($){this.model=$?.model??"Xenova/all-MiniLM-L6-v2",this.dimensions=$?.dimensions??384}async initialize($){if(this._pipeline)return;let{pipeline:Z,env:K}=await import("@huggingface/transformers");K.allowLocalModels=!1;let X={dtype:"q8"};if($)X.progress_callback=(Y)=>{$({status:Y.status==="ready"?"ready":"downloading",file:Y.file??"",loaded:Y.loaded??0,total:Y.total??0})};try{this._pipeline=await Z("feature-extraction",this.model,X)}catch(Y){if(console.warn(`Native ONNX runtime failed: ${A(Y)}`),console.warn("Falling back to WASM backend (slower but universal)"),K.backends?.onnx?.wasm)K.backends.onnx.wasm.numThreads=1;try{this._pipeline=await Z("feature-extraction",this.model,{dtype:"q8",device:"wasm"})}catch(Q){throw Error(`Embedding initialization failed. Native: ${A(Y)}. WASM: ${A(Q)}`)}}}async embed($){if(!this._pipeline)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await this._pipeline($,{pooling:"mean",normalize:!0}),K=new Float32Array(Z.tolist()[0]);return X0.create({embedding:K,model:this.model,dimensions:this.dimensions})}async embedBatch($){let Z=[];for(let K of $)Z.push(await this.embed(K));return Z}isReady(){return this._pipeline!==null}async dispose(){this._pipeline=null}}var B1=()=>{};class CZ{name;model;dimensions;apiKey;baseUrl;_ready=!1;constructor($){this.apiKey=$.apiKey,this.name=$.providerId??"openai",this.model=$.model??"text-embedding-3-small",this.dimensions=$.dimensions??1536,this.baseUrl=$.baseUrl??"https://api.openai.com/v1"}async initialize($){this._ready=!0}async embed($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:$,dimensions:this.dimensions})});if(!Z.ok){let Q=await Z.text();throw Error(`OpenAI API error ${Z.status}: ${Q}`)}let X=(await Z.json()).data?.[0];if(!X)throw Error("OpenAI returned empty embeddings response");let Y=new Float32Array(X.embedding);return X0.create({embedding:Y,model:this.model,dimensions:this.dimensions})}async embedBatch($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/embeddings`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:$,dimensions:this.dimensions})});if(!Z.ok){let Y=await Z.text();throw Error(`OpenAI API error ${Z.status}: ${Y}`)}return[...(await Z.json()).data].sort((Y,Q)=>Y.index-Q.index).map((Y)=>X0.create({embedding:new Float32Array(Y.embedding),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}}var z1=()=>{};class V4{name="ollama";model;dimensions;baseUrl;_ready=!1;constructor($){this.model=$?.model??"nomic-embed-text",this.dimensions=$?.dimensions??768,this.baseUrl=$?.baseUrl??"http://localhost:11434"}async initialize($){let Z;try{Z=await fetch(`${this.baseUrl}/api/tags`,{method:"GET"})}catch(K){let X=A(K);throw Error(`Cannot reach Ollama server at ${this.baseUrl}. Ensure Ollama is running: ollama serve (${X})`)}if(!Z.ok)throw Error(`Ollama server returned ${Z.status} from ${this.baseUrl}/api/tags`);this._ready=!0}async embed($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:$})});if(!Z.ok){let Q=await Z.text();this.throwWithHint(Z.status,Q)}let X=(await Z.json()).embeddings?.[0];if(!X)throw Error("Ollama returned empty embeddings response");let Y=new Float32Array(X);return X0.create({embedding:Y,model:this.model,dimensions:this.dimensions})}async embedBatch($){if(!this._ready)throw Error("Provider not initialized. Call initialize() before embed().");let Z=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,input:$})});if(!Z.ok){let X=await Z.text();this.throwWithHint(Z.status,X)}return(await Z.json()).embeddings.map((X)=>X0.create({embedding:new Float32Array(X),model:this.model,dimensions:this.dimensions}))}isReady(){return this._ready}async dispose(){this._ready=!1}throwWithHint($,Z){if($===404||Z.includes("not found"))throw Error(`Ollama error ${$}: ${Z}. Model '${this.model}' not found. Run: ollama pull ${this.model}`);throw Error(`Ollama error ${$}: ${Z}`)}}var A1=()=>{};function v0($){return["You are an expert developer assistant. Analyze the following conversation transcript between a user and an AI coding assistant.","Your task is to extract a structured JSON list of key facts that occurred during this conversation.","","Specifically, you should identify and classify facts into these categories:",'1. "decision": Key architectural choices, technology selections, conventions, or design decisions made.','2. "learning": Lessons learned, discoveries about tools, APIs, bugs found, environment specific issues, or workarounds.','3. "preference": User guidelines, rules, stylistic/operational preferences, or explicit constraints.','4. "friction": Pain points, slow processes, build issues, sync locks, file system access issues, command timeouts, or system bottlenecks.','5. "observation": Key metrics, observed state, runtime configurations, or general context findings.',"","For each fact, assign a confidence score between 0.0 and 1.0 based on how explicitly and clearly it was stated or agreed upon in the transcript.",'Provide optional structured "metadata" for additional context (e.g. rationale, severity, file path, system version, etc.).',"","CRITICAL: Your output MUST be a valid JSON array of objects. Do not include any explanation, markdown formatting outside of a JSON code block, or preambles. Output ONLY the JSON.","","Format:","["," {",' "type": "decision" | "learning" | "preference" | "friction" | "observation",',' "content": "Description of the fact",',' "metadata": { "key": "value" },',' "confidence": 0.95'," }","]","","Transcript:",$.map((K)=>`[${K.timestamp.toISOString()}] ${K.role.toUpperCase()}: ${K.content}`).join(`
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 Y=0;Y<$.length;Y++){let Q=$[Y];if(!Q)continue;let G=this.formatResult(Q,Y+1);if(X.length+G.length>K){X+=`
684
- (Output truncated - ${U$.toLocaleString()} char limit)
685
- `;break}X+=G}return X}formatResult($,Z){let K=($.score*100).toFixed(0),X=$.sessionId.substring(0,16),Y=U0($.timestamp),Q=Q3($.snippet,this.useColor),G=$.role.charAt(0).toUpperCase()+$.role.slice(1),_=j4(Q," ");return`${Z}. [${K}%] [${G}] ${X}...
686
- ${Y}
687
- ${_}
688
-
689
- `}formatError($){return`Error: ${A($)}`}formatSummary($){let Z=`Found ${$.found} results (showing ${$.shown})`;if($.truncated)Z+=" - truncated";return Z}}class _3{formatResults($,Z){if($.length===0)return`No results for "${Z?.query??""}"`;return $.map((K)=>{let X=K.snippet.replace(/<\/?mark>/g,"").replace(/\s+/g," ").trim().slice(0,80),Y=Math.round(K.score*100);return`${K.sessionId} [${Y}%] ${X}`}).join(`
690
- `)}formatError($){return`Error: ${A($)}`}formatSummary($){return""}}class J3{formatResults($,Z){let K=Z?.contextBudget??U$,X=$.map((Q,G)=>pZ(Q,{rank:G+1,includeSearchMetaFields:!!Z?.searchMeta}));if(Z?.searchMeta){let Q={query:Z.query??"",mode:Z.searchMeta.mode,mode_reason:Z.searchMeta.modeReason,total_results:$.length,embedding_coverage:Z.searchMeta.embeddingCoverage,degraded:Z.searchMeta.degraded,capabilities:Z.searchMeta.capabilities,timing_ms:Z.searchMeta.timingMs};if(Z.searchMeta.degradationReason)Q.degradation_reason=Z.searchMeta.degradationReason;return JSON.stringify({meta:Q,results:X},null,2)}let Y=JSON.stringify(X,null,2);if(Y.length>K){let Q=X.length;while(Q>0){let G=X.slice(0,Q);if(Y=JSON.stringify(G,null,2),Y.length<=K)break;Q--}}return Y}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatSummary($){return""}}class H3{formatResults($,Z){if($.length===0)return"";let K=M4();return $.map((X)=>{let Y=X.sessionId.substring(0,16),Q=X.snippet.replace(/<mark>/g,"*").replace(/<\/mark>/g,"*"),G=`${Y} ${Q}`;return F4(G,K)}).join(`
691
- `)}formatError($){return`Error: ${A($)}`}formatSummary($){return""}}class V3{useColor;constructor($){this.useColor=$}formatResults($,Z){let K=Z?.contextBudget??U$;if($.length===0)return`No results found for: ${Z?.query??"query"}`;let X="";if(Z?.searchMeta){if(X+=`Mode: ${Z.searchMeta.mode}`,Z.searchMeta.degraded)X+=` (degraded: ${Z.searchMeta.degradationReason??"unknown"})`;X+=`
692
- `}if(Z?.executionDetails){let Y=Z.executionDetails;if(X+=`=== Execution Details ===
693
- `,Y.timeMs!==void 0)X+=`Time: ${Y.timeMs}ms
694
- `;if(Y.ftsQuery)X+=`FTS5 Query: ${Y.ftsQuery}
695
- `;if(Y.filtersApplied&&Y.filtersApplied.length>0)X+=`Filters: ${Y.filtersApplied.join(", ")}
696
- `;X+=`
697
- `}X+=`Found ${$.length} result(s):
698
-
699
- `;for(let Y=0;Y<$.length;Y++){let Q=$[Y];if(!Q)continue;let G=this.formatResult(Q,Y+1,!!Z?.searchMeta);if(X.length+G.length>K){X+=`
700
- (Output truncated - ${U$.toLocaleString()} char limit)
701
- `;break}X+=G}return X}formatResult($,Z,K){let X=($.score*100).toFixed(0),Y=U0($.timestamp),Q=Q3($.snippet,this.useColor),G=$.role.charAt(0).toUpperCase()+$.role.slice(1),_=j4(Q," "),J=`${Z}. [${X}%] [${G}] ${$.sessionId}
702
- ${Y}
703
- ${_}
704
- `;if(K&&$.rawScores){let H=[];if($.rawScores.bm25!==void 0)H.push(`bm25: ${$.rawScores.bm25}`);if($.rawScores.cosine!==void 0)H.push(`cosine: ${$.rawScores.cosine}`);if($.rawScores.rrf!==void 0)H.push(`rrf: ${$.rawScores.rrf}`);if(H.length>0)J+=` Scores: ${H.join(", ")}
705
- `;if($.source)J+=` Source: ${$.source}
706
- `}return J+=`
707
- `,J}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
708
- ${K??""}`}formatSummary($){let Z=`=== Summary ===
709
- Found ${$.found} results (showing ${$.shown})`;if($.truncated)Z+=" - truncated due to context budget";return Z}}var U$=50000;var nZ=U(()=>{w0();x4();b0()});function D4($,Z){switch($){case"json":return new z3;case"quiet":return new A3;case"verbose":return new N3(Z);case"brief":return new B3;default:return new W3(Z)}}function aZ($,Z,K){return $===1?Z:K}class W3{useColor;constructor($){this.useColor=$}formatSessions($,Z){let K=$.length,X=`Sessions (${K} ${aZ(K,"result","results")}):
710
-
711
- `;for(let Y of $)X+=this.formatSession(Y);return X}formatSession($){let Z=$.id.substring(0,8),K=$.projectPath.projectName,X=_0($.startTime),Y=$.messageCount,Q=`${Y} ${aZ(Y,"message","messages")}`,G=dZ(Z,10),_=dZ(K,20),J=dZ(X,18);return` ${G}${_}${J}${P(Q,this.useColor)}
712
- `}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}class B3{formatSessions($,Z){if($.length===0)return this.formatEmpty();return $.map((K)=>{let X=K.id.substring(0,8),Y=K.projectPath.projectName,Q=K.messageCount,G=_0(K.startTime);return`${X} ${Y} ${Q} ${G}`}).join(`
713
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions found."}}class z3{formatSessions($,Z){let K=$.map((X)=>({id:X.id,projectPath:X.projectPath.decoded,projectName:X.projectPath.projectName,startTime:X.startTime.toISOString(),endTime:X.endTime?.toISOString()??null,messageCount:X.messageCount}));return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty(){return"[]"}}class A3{formatSessions($,Z){if($.length===0)return"";return $.map((K)=>K.id).join(`
714
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return""}}class N3{useColor;constructor($){this.useColor=$}formatSessions($,Z){let K="";if(Z){if(K+=`=== Execution Details ===
715
- `,Z.executionTimeMs!==void 0)K+=`Time: ${Z.executionTimeMs}ms
716
- `;if(Z.filtersApplied&&Z.filtersApplied.length>0)K+=`Filters: ${Z.filtersApplied.join(", ")}
717
- `;K+=`
718
- `}let X=$.length;K+=`Sessions (${X} ${aZ(X,"result","results")}):
719
-
720
- `;for(let Y of $)K+=this.formatSession(Y);return K}formatSession($){let Z=$.projectPath.projectName,K=$.projectPath.decoded,X=U0($.startTime),Y=$.messageCount,Q=`${Y} ${aZ(Y,"message","messages")}`,G=` ${$.id}
721
- `;return G+=` Project: ${Z} (${K})
722
- `,G+=` Started: ${X}
723
- `,G+=` ${P(Q,this.useColor)}
724
-
725
- `,G}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
726
- ${K??""}`}formatEmpty(){return"No sessions found. Run 'memory sync' to import sessions."}}var k4=U(()=>{w0();x4()});function S4($){if($<1024)return`${$} B`;else if($<1048576)return`${($/1024).toFixed(1)} KB`;else if($<1073741824)return`${($/1048576).toFixed(1)} MB`;else return`${($/1073741824).toFixed(1)} GB`}function o($){return new Intl.NumberFormat("en-US").format($)}function v4($,Z){switch($){case"json":return new U3;case"quiet":return new L3;case"verbose":return new I3(Z);case"brief":return new q3;default:return new O3(Z)}}class q3{formatStats($,Z){return[`${o($.totalSessions)} sessions`,`${o($.totalMessages)} messages`,`${o($.totalToolUses)} tool uses`,`${o($.projectBreakdown.length)} projects`,`${S4($.databaseSizeBytes)}`].join(`
727
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return`0 sessions
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 O3{constructor($){}formatStats($,Z){let K="";if(K+=`=== Database Statistics ===
732
-
733
- `,K+=`Totals:
734
- `,K+=` Sessions: ${o($.totalSessions)}
735
- `,K+=` Messages: ${o($.totalMessages)}
736
- `,K+=` Tool Uses: ${o($.totalToolUses)}
737
- `,K+=` Size: ${S4($.databaseSizeBytes)}
738
- `,$.projectBreakdown.length>0){K+=`
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 X of $.projectBreakdown)K+=` ${X.projectName}
741
- `,K+=` Sessions: ${o(X.sessionCount)}`,K+=`, Messages: ${o(X.messageCount)}
742
- `}if($.hooks){if(K+=`
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
- `,K+=` Installed: ${$.hooks.installed?"yes":"no"}
745
- `,K+=` Auto-sync: ${$.hooks.autoSync?"enabled":"disabled"}
746
- `,K+=` Pending sessions: ${$.hooks.pendingSessions}
747
- `,!$.hooks.installed)K+=`
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 K}formatError($){return`Error: ${A($)}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}class U3{formatStats($,Z){let K={totalSessions:$.totalSessions,totalMessages:$.totalMessages,totalToolUses:$.totalToolUses,databaseSizeBytes:$.databaseSizeBytes,projectBreakdown:$.projectBreakdown.map((X)=>({projectName:X.projectName,sessionCount:X.sessionCount,messageCount:X.messageCount}))};if(Z?.executionTimeMs!==void 0)K.executionTimeMs=Z.executionTimeMs;if($.hooks)K.hooks={installed:$.hooks.installed,autoSync:$.hooks.autoSync,pendingSessions:$.hooks.pendingSessions};return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty(){return JSON.stringify({totalSessions:0,totalMessages:0,totalToolUses:0,databaseSizeBytes:0,projectBreakdown:[],empty:!0,message:"No sessions synced. Run 'memory sync' to import data."})}}class L3{formatStats($,Z){return[`Sessions: ${$.totalSessions}`,`Messages: ${$.totalMessages}`,`Tool uses: ${$.totalToolUses}`,`Size: ${$.databaseSizeBytes}`].join(`
750
- `)}formatError($){return`Error: ${A($)}`}formatEmpty(){return`Sessions: 0
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 I3{constructor($){}formatStats($,Z){let K="";if(Z?.executionTimeMs!==void 0)K+=`=== Execution Details ===
754
- `,K+=`Time: ${Z.executionTimeMs}ms
755
-
756
- `;if(K+=`=== Database Statistics ===
757
-
758
- `,K+=`Totals:
759
- `,K+=` Sessions: ${o($.totalSessions)}
760
- `,K+=` Messages: ${o($.totalMessages)}
761
- `,K+=` Tool Uses: ${o($.totalToolUses)}
762
- `,K+=` Size: ${S4($.databaseSizeBytes)} (${o($.databaseSizeBytes)} bytes)
763
- `,$.projectBreakdown.length>0){K+=`
764
- Projects (${$.projectBreakdown.length}):
765
- `;for(let X of $.projectBreakdown){let Y=X.sessionCount>0?(X.messageCount/X.sessionCount).toFixed(1):"0";K+=` ${X.projectName}
766
- `,K+=` Sessions: ${o(X.sessionCount)}`,K+=`, Messages: ${o(X.messageCount)}`,K+=` (avg ${Y}/session)
767
- `}}if($.hooks){if(K+=`
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
- `,K+=` Installed: ${$.hooks.installed?"yes":"no"}
770
- `,K+=` Auto-sync: ${$.hooks.autoSync?"enabled":"disabled"}
771
- `,K+=` Pending sessions: ${$.hooks.pendingSessions}
772
- `,!$.hooks.installed)K+=`
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 K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
775
- ${K??""}`}formatEmpty(){return"No sessions synced. Run 'memory sync' to import data."}}var C4=()=>{};function T3($){return $.replace(J6,"")}function a($){return T3($).replace(/\n{3,}/g,`
776
-
777
- `).trim()}var J6;var F0=U(()=>{J6=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?\x07|\x1b\(B/g});var x3={};w(x3,{createContextFormatter:()=>iZ});function iZ($,Z){switch($){case"json":return new R3;case"quiet":return new F3;case"verbose":return new M3(Z);case"detailed":return new w4(Z);case"ai":return new j3;case"brief":case"default":default:return new y4(Z)}}function f0($){return new Intl.NumberFormat("en-US").format($)}function H6($,Z=3){if($.length===0)return"";let K=$.slice(0,Z),X=$.length-Z,Y=K.map((Q)=>`${Q.name} (${Q.count})`).join(", ");if(X>0)return`${Y} (+${X} more)`;return Y}function V6($,Z=3){if($.length===0)return"";let K=$.slice(0,Z),X=$.length-Z,Y=K.join(", ");if(X>0)return`${Y} (+${X} more)`;return Y}class y4{useColor;constructor($){this.useColor=$}formatContext($,Z){let K="";K+=r(`${$.projectName} Context`,this.useColor)+`
778
- `;let X=$.lastActivity?_0($.lastActivity):"never";K+=`Sessions: ${f0($.sessionCount)} | `,K+=`Messages: ${f0($.totalMessages)} | `,K+=`Last active: ${X}
779
- `;let Y=V6($.recentTopics);if(Y)K+=`Topics: ${Y}
780
- `;let Q=H6($.recentToolUses);if(Q)K+=`Tools: ${Q}
781
- `;return K}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return P("No topics extracted yet",this.useColor)}}class w4{useColor;constructor($){this.useColor=$}formatContext($,Z){let K="";if(K+=r(`${$.projectName} Context`,this.useColor)+`
782
- `,K+="=".repeat(40)+`
783
-
784
- `,K+=`Project: ${$.projectPathDecoded}
785
- `,K+=`Sessions: ${f0($.sessionCount)}
786
- `,K+=`Messages: ${f0($.totalMessages)}`,K+=` (user: ${f0($.userMessages)}, assistant: ${f0($.assistantMessages)})
787
- `,$.lastActivity)K+=`Last active: ${U0($.lastActivity)}
788
- `;else K+=`Last active: never
789
- `;if(K+=`
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
- `,$.recentTopics.length>0)for(let X of $.recentTopics)K+=` - ${X}
792
- `;else K+=P(` (no topics extracted yet)
793
- `,this.useColor);if(K+=`
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
- `,$.recentToolUses.length>0)for(let X of $.recentToolUses)K+=` - ${X.name}: ${f0(X.count)} times
796
- `;else K+=P(` (no tool usage recorded)
797
- `,this.useColor);return K}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return P("(no topics extracted yet)",this.useColor)}}class R3{formatContext($,Z){let K={projectName:$.projectName,projectPath:$.projectPathDecoded,sessionCount:$.sessionCount,totalMessages:$.totalMessages,userMessages:$.userMessages,assistantMessages:$.assistantMessages,lastActivity:$.lastActivity?.toISOString()??null,topics:$.recentTopics,toolUsage:$.recentToolUses};return JSON.stringify(K,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty($){return JSON.stringify({error:`No sessions found for project matching '${$}'`})}formatNoTopics(){return JSON.stringify({topics:[]})}}class F3{formatContext($,Z){return`${$.projectName}: ${$.sessionCount} sessions, ${f0($.totalMessages)} messages`}formatError($){return`Error: ${A($)}`}formatEmpty($){return""}formatNoTopics(){return""}}class M3{detailed;constructor($){this.detailed=new w4($)}formatContext($,Z){let K="";if(Z){if(K+=`=== Execution Details ===
798
- `,Z.executionTimeMs!==void 0)K+=`Time: ${Z.executionTimeMs}ms
799
- `;if(Z.filtersApplied&&Z.filtersApplied.length>0)K+=`Filters: ${Z.filtersApplied.join(", ")}
800
- `;K+=`
801
- `}return K+=this.detailed.formatContext($,Z),K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
802
- ${K??""}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return this.detailed.formatNoTopics()}}class j3{formatContext($,Z){let K=new y4(!1);return a(K.formatContext($,Z))}formatSmartContext($){let Z=[];for(let X of $.sections){if(X.content.trim()==="")continue;let Y=`### ${X.title}
803
- ${X.content}`;if(X.truncated)Y+=`
804
- [truncated]`;Z.push(Y)}let K=`## ${$.projectName} context
805
-
806
- `+Z.join(`
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($.truncated)K+=`
811
-
812
- (budget: ~${$.totalTokensEstimate} tokens)`;return K.trim()}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No sessions found for project matching '${$}'`}formatNoTopics(){return"No topics extracted yet"}}var rZ=U(()=>{w0();F0()});function b4($,Z){switch($){case"json":return new D3;case"quiet":return new k3;case"verbose":return new S3(Z);case"detailed":return new f4(Z);case"brief":case"default":default:return new E3(Z)}}function P3($,Z){let K=`${Math.round($*100)}%`;if(!Z)return K;if($>0.75)return b(K,Z);if($>=0.5)return d(K,Z);return K}function W6($){return $===1?"1 hop":`${$} hops`}function B6($){return`${$===1?"1":`${$}`} (${$===1?"direct":"indirect"})`}class E3{useColor;constructor($){this.useColor=$}formatRelated($,Z){if($.length===0)return"";let X=`Related to session ${Z?.sourceId??"unknown"}...
813
- `;return $.forEach((Y,Q)=>{let G=Y.session.projectPath.projectName,_=_0(Y.session.startTime),J=P3(Y.weight,this.useColor),H=W6(Y.hops);X+=`${Q+1}. ${G} (${J}) - ${_} [${H}]
814
- `}),X}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No relationships found for '${$}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class f4{useColor;constructor($){this.useColor=$}formatRelated($,Z){if($.length===0)return"";let X=`Related to session ${Z?.sourceId??"unknown"}...
815
- `;return X+="=".repeat(40)+`
816
-
817
- `,$.forEach((Y,Q)=>{let G=Y.session,_=G.projectPath.projectName,J=G.projectPath.decoded,H=P3(Y.weight,this.useColor),V=B6(Y.hops),B=U0(G.startTime),z=G.messages.length;X+=`${Q+1}. ${_}
818
- `,X+=` Weight: ${H} | Hops: ${V}
819
- `,X+=` Path: ${J}
820
- `,X+=` Last active: ${B}
821
- `,X+=` Messages: ${z}
822
-
823
- `}),X}formatError($){return`Error: ${A($)}`}formatEmpty($){return`No relationships found for '${$}'`}formatNoLinks(){return"No relationships extracted yet. Run 'memory sync' to extract session data."}}class D3{formatRelated($,Z){let X={sourceId:Z?.sourceId??"unknown",related:$.map((Y)=>({sessionId:Y.session.id,projectName:Y.session.projectPath.projectName,weight:Y.weight,hops:Y.hops,lastActivity:Y.session.startTime.toISOString(),messageCount:Y.session.messages.length}))};return JSON.stringify(X,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatEmpty($){return JSON.stringify({error:`No relationships found for '${$}'`})}formatNoLinks(){return JSON.stringify({error:"No relationships extracted yet"})}}class k3{formatRelated($,Z){if($.length===0)return"";return $.map((K)=>K.session.id).join(`
824
- `)}formatError($){return`Error: ${A($)}`}formatEmpty($){return""}formatNoLinks(){return""}}class S3{detailed;constructor($){this.detailed=new f4($)}formatRelated($,Z){let K="";if(Z?.executionTimeMs!==void 0)K+=`=== Execution Details ===
825
- `,K+=`Time: ${Z.executionTimeMs}ms
826
- `,K+=`
827
- `;return K+=this.detailed.formatRelated($,Z),K}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
828
- ${K??""}`}formatEmpty($){return this.detailed.formatEmpty($)}formatNoLinks(){return this.detailed.formatNoLinks()}}var h4=U(()=>{w0()});function tZ($,Z){switch($){case"json":return new w3;case"quiet":return new b3;case"verbose":return new f3(Z);case"tools":return new oZ(Z);case"brief":return new C3;default:return new y3(Z)}}function g4($){let Z=$.replace(/\\/g,"/").split("/");return Z[Z.length-1]||$}function v3($){switch($.name){case"Read":{let Z=$.input.file_path,K=$.result?$.result.split(`
829
- `).length:0;return`${g4(Z)} -> ${K} lines`}case"Write":{let Z=$.input.file_path;return g4(Z)}case"Edit":{let Z=$.input.file_path;return`${g4(Z)} edited`}case"Bash":{if(!$.isSuccess)return"FAILED";let Z=$.input.command.substring(0,20);return Z.length<$.input.command.length?`${Z}...`:Z}case"Glob":return`${$.result?.split(`
830
- `).filter(Boolean).length??0} files`;case"Grep":return $.isSuccess?"matches":"no matches";default:return $.status}}function z6($){let Z=Math.floor($/3600000),K=Math.floor($%3600000/60000);if(Z>0)return`${Z}h ${K}m`;if(K>0)return`${K}m`;return"< 1m"}function m4($,Z){let{session:K,messages:X,toolUses:Y}=$,Q=[];Q.push(`Session: ${K.id}`),Q.push(`Project: ${K.projectPath.projectName}`);let G=i0(K.startTime),_=K.endTime?i0(K.endTime):"ongoing";if(Q.push(`Date: ${G} - ${_}`),K.durationMs!==void 0)Q.push(`Duration: ${z6(K.durationMs)}`);else Q.push("Duration: ongoing");let J=Y.size;return Q.push(`Messages: ${X.length} | Tools: ${J}`),Q.push("---"),Q.join(`
831
- `)}function c4($,Z,K,X){let Y=$.role==="user"?r("[USER]",K):r("[ASSISTANT]",K),Q=i0($.timestamp),G=`${Y} ${P(Q,K)}
832
- `;if(G+=$.content,X&&$.role==="assistant"&&$.hasToolUses){let _=[];for(let J of $.toolUses){let H=Z.get(J);if(H)_.push(`[${H.name}: ${v3(H)}]`)}if(_.length>0)G+=`
833
- ${_.join(" ")}`}return G}class C3{formatSession($,Z){let{session:K,messages:X}=$,Y=i0(K.startTime);return`${K.id} | ${K.projectPath.projectName} | ${X.length} messages | ${Y}`}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class y3{useColor;constructor($){this.useColor=$}formatSession($,Z){let K=[];K.push(m4($,this.useColor)),K.push("");for(let X of $.messages)K.push(c4(X,$.toolUses,this.useColor,!0)),K.push("");return K.join(`
834
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class w3{formatSession($,Z){let{session:K,messages:X,toolUses:Y}=$,Q={session:{id:K.id,projectPath:K.projectPath.decoded,projectName:K.projectPath.projectName,startTime:K.startTime.toISOString(),endTime:K.endTime?.toISOString()??null,durationMs:K.durationMs??null},messages:X.map((G)=>({id:G.id,role:G.role,content:G.content,timestamp:G.timestamp.toISOString(),toolUseIds:G.toolUses})),toolUses:Object.fromEntries(Array.from(Y.entries()).map(([G,_])=>[G,{id:_.id,name:_.name,input:_.input,timestamp:_.timestamp.toISOString(),status:_.status,result:_.result??null}]))};return JSON.stringify(Q,null,2)}formatError($){let Z=A($);return JSON.stringify({error:Z})}formatNotFound($){return JSON.stringify({error:`Session not found: ${$}`})}}class b3{formatSession($,Z){let K=[];for(let X of $.messages){let Y=X.role==="user"?"U:":"A:";K.push(`${Y} ${X.content}`)}return K.join(`
835
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}class f3{useColor;constructor($){this.useColor=$}formatSession($,Z){let K=[];if(Z?.executionTimeMs!==void 0)K.push("=== Execution Details ==="),K.push(`Time: ${Z.executionTimeMs}ms`),K.push("");K.push(m4($,this.useColor)),K.push("");for(let X of $.messages){if(K.push(c4(X,$.toolUses,this.useColor,!0)),X.role==="assistant"&&X.hasToolUses)for(let Y of X.toolUses){let Q=$.toolUses.get(Y);if(Q){if(K.push(""),K.push(` [TOOL: ${Q.name}]`),K.push(` Input: ${JSON.stringify(Q.input)}`),Q.result)K.push(` Result: ${Q.result}`);K.push(` Status: ${Q.status}`)}}K.push("")}return K.join(`
836
- `)}formatError($){let Z=A($),K=$ instanceof Error?$.stack:"";return`Error: ${Z}
837
- ${K??""}`}formatNotFound($){return`Session not found: ${$}`}}class oZ{useColor;static RESULT_TRUNCATE_LENGTH=500;constructor($){this.useColor=$}formatSession($,Z){let K=[];K.push(m4($,this.useColor)),K.push("");for(let X of $.messages){if(K.push(c4(X,$.toolUses,this.useColor,!1)),X.role==="assistant"&&X.hasToolUses)for(let Y of X.toolUses){let Q=$.toolUses.get(Y);if(Q){if(K.push(""),K.push(` [TOOL: ${Q.name}]`),K.push(` Input: ${JSON.stringify(Q.input)}`),Q.result){let G=Q.result.length>oZ.RESULT_TRUNCATE_LENGTH?Q.result.substring(0,oZ.RESULT_TRUNCATE_LENGTH)+"...":Q.result;K.push(` Result: ${G}`)}K.push(` Status: ${Q.status}`)}}K.push("")}return K.join(`
838
- `)}formatError($){return`Error: ${A($)}`}formatNotFound($){return`Session not found: ${$}`}}var u4=U(()=>{w0()});function h3($){switch($){case T.DB_CONNECTION_FAILED:return"Check database file permissions";case T.DB_CORRUPTED:return"Run 'memory doctor' to diagnose or recreate database";case T.DB_LOCKED:return"Wait and retry, or check for other running processes";case T.INVALID_SESSION_ID:return"Check session ID format (expected UUID)";case T.SESSION_NOT_FOUND:return"Run 'memory list' to see available sessions";case T.SOURCE_INACCESSIBLE:return"Check that ~/.claude/projects exists and is readable";case T.DISK_FULL:return"Free up disk space and retry";case T.INVALID_JSON:return"Check file for JSON syntax errors";case T.UNKNOWN_FORMAT:return"File may be incompatible with current version";case T.SYNC_INTERRUPTED:return"Run 'memory sync' again to resume";case T.SYNC_FAILED:return`Check logs at ${O0()} for details`;case T.INVALID_ARGUMENT:return"Run command with --help to see valid options";case T.MISSING_ARGUMENT:return"Run command with --help to see required arguments";case T.VECTOR_UNAVAILABLE:return"Run 'memory sync --embed' to generate embeddings, or use '--mode fts' for keyword-only search";case T.PROVIDER_TIMEOUT:return"Check network connection or switch to local provider in config";case T.PROVIDER_CONFIG_INVALID:return"Check embedding config in ~/.config/memory/config.json";case T.EMBEDDING_DIMENSION_MISMATCH:return"Run 'memory sync --embed' to re-embed with the current model";case T.MODEL_CORRUPTED:return"Delete cached model files and run 'memory sync --embed' to re-download";case T.NOT_FOUND:return"Check the ID and try again";case T.INVALID_STATE:return"The entity is not in a valid state for this operation";case T.UNKNOWN:default:return null}}function A6($,Z){if(typeof Z==="string"||typeof Z==="number")return` ${$}: ${Z}`;return` ${$}: ${JSON.stringify(Z)}`}function c($,Z={}){let K=Z.useColor??k(),X=[];if($ instanceof R){let Y=f(`Error [${$.code}]:`,K);if(X.push(`${Y} ${$.message}`),$.context&&Object.keys($.context).length>0)for(let[G,_]of Object.entries($.context))X.push(A6(G,_));let Q=h3($.code);if(Q)X.push(""),X.push(`Suggestion: ${Q}`)}else{let Y=f("Error:",K);X.push(`${Y} ${$.message}`)}if(Z.verbose&&$.stack)X.push(""),X.push("Stack trace:"),X.push($.stack);return X.join(`
839
- `)}function r0($){if($ instanceof R)return JSON.stringify($.toJSON());let Z={error:{code:"UNKNOWN",message:$.message}};return JSON.stringify(Z)}var M0=U(()=>{w$();p()});function g3($){return{schema_version:"1",command:$.command,kind:$.kind,...$.scope!==void 0?{scope:$.scope}:{},...$.meta!==void 0?{meta:$.meta}:{},data:$.data}}function m3($){return{schema_version:"1",command:$.command,error:{code:$.code,message:$.message,...$.context!==void 0?{context:$.context}:{}}}}function s($){let Z=process.env.MEMORY_JSON_COMMAND_OVERRIDE||$.command;console.log(JSON.stringify(g3({...$,command:Z}),null,2))}function S($){let Z=process.env.MEMORY_JSON_COMMAND_OVERRIDE||$.command;console.log(JSON.stringify(m3({...$,command:Z}),null,2))}var L0=()=>{};var eZ={};w(eZ,{writeLock:()=>p3,spawnBackgroundEmbedding:()=>M6,removeLock:()=>sZ,readLock:()=>a4,isProcessAlive:()=>i4,isBackgroundEmbedding:()=>x6,cleanupLock:()=>j6,acquireLock:()=>l3});import{spawn as L6}from"child_process";import{existsSync as I6,readFileSync as T6,writeFileSync as R6,unlinkSync as F6,mkdirSync as u3,openSync as c3}from"fs";import{join as d3}from"path";function n4($){return d3($??t(),"embedding.lock")}function p3($,Z){let K=n4(Z),X=Z??t();u3(X,{recursive:!0}),R6(K,JSON.stringify($))}function a4($){let Z=n4($);if(!I6(Z))return null;try{return JSON.parse(T6(Z,"utf-8"))}catch{return null}}function sZ($){let Z=n4($);try{F6(Z)}catch{}}function i4($){try{return process.kill($,0),!0}catch{return!1}}function l3($,Z,K){let X=a4(K);if(X){if(i4(X.pid))return{acquired:!1,existingPid:X.pid,startedAt:X.startedAt};sZ(K)}return p3({pid:$,startedAt:new Date().toISOString(),totalMessages:Z},K),{acquired:!0,staleRemoved:X!==null}}function M6($){let{dataDir:Z,logDir:K,command:X=process.execPath}=$??{},Y=a4(Z);if(Y&&i4(Y.pid))return{started:!1,reason:"already_running",pid:Y.pid};if(Y)sZ(Z);let Q=K??O0();u3(Q,{recursive:!0});let G=d3(Q,"sync.log"),_=c3(G,"a"),J=c3(G,"a"),V=[process.argv[1]??"","sync","--embed","--quiet"],B=L6(X,V,{detached:!0,stdio:["ignore",_,J],env:{...process.env,MEMORY_EMBED_BACKGROUND:"1"}});if(B.unref(),B.pid===void 0)return{started:!1,reason:"spawn_failed"};let z=l3(B.pid,0,Z);if(!z.acquired)return{started:!1,reason:"already_running",pid:z.existingPid};return{started:!0,pid:B.pid}}function j6($){sZ($)}function x6(){return process.env.MEMORY_EMBED_BACKGROUND==="1"}var $9=U(()=>{p()});var n3={};w(n3,{EmbeddingProviderFactory:()=>Z9});import{createHash as E6}from"crypto";class Z9{cache=new Map;cacheKey($){let Z=$.apiKey?E6("sha256").update($.apiKey).digest("hex").slice(0,16):"";return[$.provider,$.model,String($.dimensions),$.baseUrl??"",$.apiKeyEnv??"",$.apiKeyRef??"",Z].join(":")}create($){let Z=this.cacheKey($),K=this.cache.get(Z);if(K)return K;let X=x1($);return this.cache.set(Z,X),X}createFromConfig($){let Z=$.embedding??J$;if(!Z.enabled)return null;return this.create(Z)}async dispose(){for(let $ of this.cache.values())await $.dispose();this.cache.clear()}}var o4=U(()=>{Z0();wZ()});var e3={};w(e3,{PatternRedactor:()=>o0});class o0{redactText($){let Z=$,K=[];for(let X of D6)Z=Z.replace(X.pattern,(Y)=>{let Q=`[REDACTED:${X.kind}]`;return K.push({kind:X.kind,placeholder:Q}),`${X.preservePrefix?.(Y)??""}${Q}`});return{text:Z,findings:K}}redactJson($){let Z=[];return{value:this.redactUnknown($,Z,new WeakSet),findings:Z}}redactUnknown($,Z,K){if(typeof $==="string"){let X=this.redactText($);return Z.push(...X.findings),X.text}if(Array.isArray($))return $.map((X)=>this.redactUnknown(X,Z,K));if($&&typeof $==="object"){if(K.has($))return"[REDACTED:circular]";K.add($);let X={};for(let[Y,Q]of Object.entries($))X[Y]=this.redactUnknown(Q,Z,K);return X}return $}}var D6;var XZ=U(()=>{D6=[{kind:"private_key",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{kind:"api_key",pattern:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{kind:"api_key",pattern:/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g},{kind:"aws_access_key",pattern:/\b(A3T[A-Z0-9]|AKIA|ASIA)[A-Z0-9]{16}\b/g},{kind:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{kind:"bearer_token",pattern:/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}/g,preservePrefix:()=>"Bearer "},{kind:"env_secret",pattern:/\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASS|CREDENTIAL)[A-Z0-9_]*)\s*=\s*(?:"[^"]+"|'[^']+'|[^\s]+)/g,preservePrefix:($)=>`${$.split("=")[0].trim()}=`}]});var _8={};w(_8,{mergeMemoryBlock:()=>Q8,AutoMemoryWriter:()=>G8});import{existsSync as k6,mkdirSync as X8,readFileSync as S6,writeFileSync as e4}from"fs";import{join as Y8}from"path";function Q8($,Z){let K=`${$5}
840
- ${Z}
841
- ${K9}
842
- `;if($.length===0)return K;let X=$.indexOf($5),Y=$.indexOf(K9);if(X!==-1&&Y!==-1){let G=$.substring(0,X),_=$.substring(Y+K9.length);return`${G}${K}${_}`}let Q=$.endsWith(`
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`${$}${Q}${K}`}class G8{async writeContextFile($,Z){X8($,{recursive:!0}),e4(Y8($,"context.md"),Z,"utf-8")}async updateMemoryBlock($,Z){X8($,{recursive:!0});let K=Y8($,"MEMORY.md"),X=`${$5}
847
- ${Z}
848
- ${K9}
849
- `;if(!k6(K)){e4(K,X,"utf-8");return}let Y=S6(K,"utf-8"),Q=Q8(Y,Z);e4(K,Q,"utf-8")}}var $5="<!-- memory-cli:start -->",K9="<!-- memory-cli:end -->";var J8=()=>{};var B8={};w(B8,{runGit:()=>W8,GitSyncer:()=>K5});import{readFileSync as v6,existsSync as C6}from"fs";import{join as H8}from"path";var{spawn:y6}=globalThis.Bun;async function W8($,Z,K=process.env){let X=y6(["git",...$],{cwd:Z,stdout:"pipe",stderr:"pipe",env:K}),Y=await new Response(X.stdout).text(),Q=await new Response(X.stderr).text(),G=await X.exited;return{success:G===0,stdout:Y.trim(),stderr:Q.trim(),exitCode:G}}function V8($,Z){let K={};for(let X of $)if(Z.existsSync(X))try{let Y=Z.readFileSync(X,"utf-8");K[X]=Bun.hash(Y).toString()}catch{K[X]="error"}return K}class K5{eventsDir;deps;constructor($,Z={}){this.eventsDir=$??jZ(),this.deps={runGit:W8,existsSync:C6,readFileSync:v6,getAllLogFiles:xZ,now:()=>new Date,...Z}}async isGitRepo(){let $=H8(this.eventsDir,".git");return this.deps.existsSync($)}async initRepo(){if(!(await this.deps.runGit(["init"],this.eventsDir)).success)return!1;let Z=await this.deps.runGit(["config","user.name"],this.eventsDir);if(!Z.success||!Z.stdout)await this.deps.runGit(["config","user.name","Memory Nexus"],this.eventsDir),await this.deps.runGit(["config","user.email","sync@memory-nexus.local"],this.eventsDir);return await this.deps.runGit(["checkout","-b","main"],this.eventsDir),!0}async configureRemote($){if(!$.trim())return!1;return await this.deps.runGit(["remote","remove","origin"],this.eventsDir),(await this.deps.runGit(["remote","add","origin",$],this.eventsDir)).success}async removeRemote(){let $=await this.deps.runGit(["remote","remove","origin"],this.eventsDir);return $.success||$.stderr.includes("No such remote")}async getRemoteUrl(){let $=await this.deps.runGit(["remote","get-url","origin"],this.eventsDir);return $.success?$.stdout:null}async sync($,Z,K=!0,X=!0){try{if(!await this.isGitRepo()){if(!await this.initRepo())return{success:!1,rebuildNeeded:!1,error:"Failed to initialize Git repository in events directory"}}if(await this.getRemoteUrl()!==Z){if(!await this.configureRemote(Z))return{success:!1,rebuildNeeded:!1,error:"Failed to configure Git remote repository URL"}}let G=this.deps.getAllLogFiles(this.eventsDir),_=V8(G,this.deps),J=`events-${$}.jsonl`,H=H8(this.eventsDir,J);if(this.deps.existsSync(H))await this.deps.runGit(["add",J],this.eventsDir),await this.deps.runGit(["commit","-m",`sync: ${$} observed at ${this.deps.now().toISOString()}`],this.eventsDir);let V=!0;if(K){if(await this.deps.runGit(["fetch","origin"],this.eventsDir),(await this.deps.runGit(["rev-parse","--verify","origin/main"],this.eventsDir)).success){let q=await this.deps.runGit(["pull","--rebase","origin","main"],this.eventsDir);if(!q.success)return V=!1,await this.deps.runGit(["rebase","--abort"],this.eventsDir),{success:!1,rebuildNeeded:!1,error:`Git pull failed: ${q.stderr}`}}}if(X&&V){let N=await this.deps.runGit(["push","-u","origin","main"],this.eventsDir);if(!N.success)return{success:!1,rebuildNeeded:!1,error:`Git push failed: ${N.stderr}`}}let B=this.deps.getAllLogFiles(this.eventsDir),z=V8(B,this.deps),W=!1;if(G.length!==B.length)W=!0;else for(let N of B)if(_[N]!==z[N]){W=!0;break}return{success:!0,rebuildNeeded:W}}catch(Y){return{success:!1,rebuildNeeded:!1,error:A(Y)}}}}var X5=U(()=>{p()});var U8={};w(U8,{rebuildProjections:()=>O8,readEvents:()=>q8,appendEvent:()=>N8});import{appendFile as w6,mkdir as b6}from"fs/promises";import{dirname as f6}from"path";import{existsSync as h6,createReadStream as g6}from"fs";import*as A8 from"readline";async function N8($,Z){let K=Z;if(!K){let Q=m();K=m5(Q.machineId)}let X=f6(K);await b6(X,{recursive:!0});let Y={id:$.id,uuid:$.uuid,type:$.type,project:$.project,content:$.content,metadata:$.metadata,observedAt:$.observedAt.toISOString(),supersededAt:$.supersededAt?$.supersededAt.toISOString():null,supersededBy:$.supersededBy,version:1};await w6(K,JSON.stringify(Y)+`
850
- `,"utf-8")}async function*q8($,Z){if($){yield*z8($);return}let K=xZ(Z),X=[];for(let Y of K)for await(let Q of z8(Y))X.push(Q);X.sort((Y,Q)=>{let G=Y.observedAt.getTime()-Q.observedAt.getTime();if(G!==0)return G;return Y.uuid.localeCompare(Q.uuid)});for(let Y of X)yield Y}async function*z8($){if(!h6($))return;let Z=g6($,"utf-8"),K=A8.createInterface({input:Z,crlfDelay:1/0});for await(let X of K){if(!X.trim())continue;try{let Y=JSON.parse(X),Q=A0.create({uuid:Y.uuid,type:Y.type,project:Y.project,content:Y.content,metadata:Y.metadata,observedAt:new Date(Y.observedAt),supersededAt:Y.supersededAt?new Date(Y.supersededAt):null,supersededBy:Y.supersededBy??null});yield Y.id!==void 0?Q.withId(Y.id):Q}catch(Y){console.error("Skipping malformed event log line:",Y)}}}async function O8($,Z,K){let X=[];for await(let Q of q8(Z,K))X.push(Q);$.transaction(()=>{$.run("DELETE FROM facts;");let Q=$.prepare(`
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
- `);for(let G of X)if(Q.run(G.uuid,G.type,G.project,G.content,G.metadata?JSON.stringify(G.metadata):null,G.observedAt.toISOString(),G.supersededAt?G.supersededAt.toISOString():null,G.supersededBy),G.type==="supersedence"){let _=G.metadata?.superseded_uuid,J=G.metadata?.superseded_by_uuid;if(_&&J)$.prepare(`
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
- Applied fixes:`);for(let W of _.fixes)console.log(W)}return{exitCode:0}}let z=[];if($.hooks||$.all)z.push(XK(_,V));if($.config||$.all)z.push(YK(_,V));if($.db||$.all)z.push(QK(_,V));if($.embedding||$.all)z.push(GK(_,V)),z.push(_K(_,V));if($.stats||$.all)if(!_.stats)z.push(f("Database statistics are not available.",V));else{let W="default";if($.quiet)W="quiet";else if($.verbose)W="verbose";else if($.format==="brief")W="brief";let N=v4(W,V);if(_.stats.totalSessions===0)z.push(N.formatEmpty());else{let q=N.formatStats(_.stats,{executionTimeMs:Math.round(performance.now()-K)});if($.format==="ai")q=a(q);z.push(q)}}if(console.log(z.join(`
860
-
861
- `)),$.all||$.db){if(_.migration.status==="pending")console.log(""),console.log(d("Legacy data found at ~/.memory-nexus/. Run any memory command to auto-migrate.",V));else if(_.migration.status==="partial")console.log(""),console.log(d("Partial migration detected. Some data in ~/.memory-nexus/ and some in new paths. Re-run migration or check manually.",V))}if($.fix)if(console.log(""),console.log("Attempting fixes..."),_.fixes.length===0)console.log(P("No automatic fixes available.",V));else for(let W of _.fixes)console.log(W);return{exitCode:J}}function KK($){let K=Date.now()-$.getTime(),X=Math.floor(K/1000),Y=Math.floor(X/60),Q=Math.floor(Y/60),G=Math.floor(Q/24);if(G>0)return`${G} day${G>1?"s":""} ago`;if(Q>0)return`${Q} hour${Q>1?"s":""} ago`;if(Y>0)return`${Y} minute${Y>1?"s":""} ago`;return"just now"}function XK($,Z){let K=[];if(K.push("Hooks"),K.push(` ${h($.health.hooks.installed,Z)} Installed: ${$.health.hooks.installed?"yes":"no"}`),K.push(` ${h($.health.hooks.enabled,Z)} Enabled (autoSync): ${$.health.hooks.enabled?"yes":"no"}`),$.health.hooks.lastRun)K.push(` ${P(`Last run: ${KK($.health.hooks.lastRun)}`,Z)}`);else K.push(` ${P("Last run: never",Z)}`);return K.join(`
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
- `)}function QK($,Z){let K=[];K.push("Database");let X=E();if($.health.database.exists)K.push(` ${h($.health.database.exists,Z)} Exists: ${X}`),K.push(` ${h($.health.database.readable,Z)} Readable`),K.push(` ${h($.health.database.writable,Z)} Writable`),K.push(` ${h($.health.database.integrity==="ok",Z)} Integrity: ${HK($.health.database.integrity,Z)}`),K.push(` ${P(`Size: ${JK($.health.database.size)}`,Z)}`);else K.push(` ${h(!1,Z)} Database not found: ${X}`),K.push(` ${P("Run 'memory sync' to create database",Z)}`);if($.health.sqliteVec.available)K.push(` ${h(!0,Z)} sqlite-vec: v${$.health.sqliteVec.version}`);else K.push(` ${h(!1,Z)} sqlite-vec: not available`);if(K.push(""),K.push("Permissions"),K.push(` ${h($.health.permissions.configDir,Z)} Config directory: ${n0()}`),K.push(` ${h($.health.permissions.logsDir,Z)} Logs directory: ${H$()}`),K.push(` ${h($.health.permissions.sourceDir,Z)} Source directory: ~/.claude/projects`),K.push(""),K.push("Search Capability"),K.push(` ${h($.health.searchCapability.fts5,Z)} FTS5: available`),K.push(` ${h($.health.searchCapability.sqliteVec,Z)} sqlite-vec: ${$.health.searchCapability.sqliteVec?"available":"not available"}`),K.push(` ${P(`Embeddings: ${$.health.searchCapability.embeddedCount}/${$.health.searchCapability.totalMessages} (${$.health.searchCapability.coveragePercent}%)`,Z)}`),K.push(` ${P(`Default mode: ${$.health.searchCapability.defaultMode}`,Z)}`),K.push(` ${h($.health.searchCapability.vectorReady,Z)} Vector search: ${$.health.searchCapability.vectorReady?"ready":"not ready"}`),K.push(""),K.push("Optional Tools"),$.qmd.available)K.push(` ${P("[INFO]",Z)} qmd: installed at ${$.qmd.path} (enables --files search)`);else K.push(` ${P("[INFO]",Z)} qmd: not found (optional -- install with: bun add -g @tobilu/qmd)`);return K.join(`
864
- `)}function GK($,Z){let K=[];if(K.push("Embeddings"),K.push(` ${h($.health.embedding.enabled,Z)} Enabled: ${$.health.embedding.enabled?"yes":"no"}`),K.push(` ${P(`Provider: ${$.health.embedding.provider}`,Z)}`),K.push(` ${P(`Model: ${$.health.embedding.model}`,Z)}`),K.push(` ${P(`Dimensions: ${$.health.embedding.dimensions}`,Z)}`),K.push(` ${h($.health.embedding.ready,Z)} Ready: ${$.health.embedding.ready?"yes":"no"}`),$.health.embedding.readyReason)if($.health.embedding.ready)K.push(` ${P(`Note: ${$.health.embedding.readyReason}`,Z)}`);else K.push(` ${f(`Reason: ${$.health.embedding.readyReason}`,Z)}`);return K.join(`
865
- `)}function _K($,Z){let K=[];if(K.push("LLM Fact Extraction"),K.push(` ${h($.health.llmExtraction.ready,Z)} Ready: ${$.health.llmExtraction.ready?"yes":"no"}`),K.push(` ${P(`Provider: ${$.health.llmExtraction.provider}`,Z)}`),K.push(` ${P(`Model: ${$.health.llmExtraction.model}`,Z)}`),$.health.llmExtraction.readyReason)if($.health.llmExtraction.ready)K.push(` ${P(`Note: ${$.health.llmExtraction.readyReason}`,Z)}`);else K.push(` ${f(`Reason: ${$.health.llmExtraction.readyReason}`,Z)}`);return K.join(`
866
- `)}function h($,Z){if($)return b("[OK]",Z);return f("[FAIL]",Z)}function JK($){if($===0)return"0 B";let Z=["B","KB","MB","GB"],K=1024,X=Math.floor(Math.log($)/Math.log(K));return`${($/Math.pow(K,X)).toFixed(X>0?1:0)} ${Z[X]}`}function HK($,Z){switch($){case"ok":return b("ok",Z);case"corrupted":return f("CORRUPTED",Z);default:return d("unknown",Z)}}function VK($){let Z=0;if(!$.database.readable)Z++;if(!$.database.writable)Z++;if(!$.permissions.configDir)Z++;if(!$.permissions.logsDir)Z++;if(!$.permissions.sourceDir)Z++;return Z+=$.config.issues.length,Z}function WK($){if(!$.database.exists||$.database.integrity==="corrupted")return 2;if(VK($)>0||!$.searchCapability.vectorReady)return 1;return 0}function y8($,Z){let K=[];if(!$.permissions.configDir){let X=n0();try{k8(X,{recursive:!0}),K.push(b(`Created config directory: ${X}`,Z))}catch(Y){let Q=A(Y);K.push(f(`Failed to create config directory: ${Q}`,Z))}}if(!$.permissions.logsDir){let X=H$();try{k8(X,{recursive:!0}),K.push(b(`Created logs directory: ${X}`,Z))}catch(Y){let Q=A(Y);K.push(f(`Failed to create logs directory: ${Q}`,Z))}}if($.database.integrity==="corrupted")K.push(d("Database corruption detected. Consider:",Z)),K.push(" 1. Backup your database file"),K.push(` 2. Delete the database: rm ${E()}`),K.push(" 3. Re-sync: memory sync");if(!$.hooks.installed)K.push(d("Hooks not installed. Run 'memory install' to enable automatic sync.",Z));return K}function w8($){if(console.log("Memory Status"),console.log(`=============
867
- `),console.log("Hooks:"),console.log(` SessionEnd: ${$.hooks.sessionEnd?"installed":"not installed"}`),console.log(` PreCompact: ${$.hooks.preCompact?"installed":"not installed"}`),console.log(` Hook script: ${$.hooks.hookScriptExists?"present":"missing"}`),console.log(` Backup: ${$.hooks.backupExists?"available":"none"}`),console.log(""),console.log("Configuration:"),console.log(` autoSync: ${$.config.autoSync}`),console.log(` syncOnCompaction: ${$.config.syncOnCompaction}`),console.log(` recoveryOnStartup: ${$.config.recoveryOnStartup}`),console.log(` timeout: ${$.config.timeout}ms`),console.log(` logLevel: ${$.config.logLevel}`),console.log(` showFailures: ${$.config.showFailures}`),console.log(""),console.log("Activity:"),console.log(` Last sync: ${$.lastSync??"never"}`),console.log(` Pending sessions: ${$.pendingSessions}`),console.log(` Recent log entries: ${$.recentLogs}`),console.log(""),console.log("Embedding:"),$.embedding.active){let Z=$.embedding.startedAt?b8($.embedding.startedAt):"unknown",K=$.embedding.embeddedCount!==void 0&&$.embedding.totalMessages!==void 0?`, ${$.embedding.embeddedCount}/${$.embedding.totalMessages} messages`:"";console.log(` Status: active (PID ${$.embedding.pid}${K}, started ${Z})`)}else console.log(" Status: idle");if(!$.hooks.sessionEnd||!$.hooks.preCompact)console.log(`
868
- Recommendation: Run 'memory install' to enable automatic sync.`);if($.pendingSessions>0)console.log(`
869
- Note: ${$.pendingSessions} session(s) pending sync. Run 'memory sync' to sync now.`)}function b8($){let Z=Date.now()-new Date($).getTime(),K=Math.floor(Z/60000);if(K<1)return"just now";if(K<60)return`${K} min ago`;let X=Math.floor(K/60);if(X<24)return`${X}h ago`;return`${Math.floor(X/24)}d ago`}var F$=U(()=>{z$();u();ZZ();D8();G9();C4();F0();t0();L0();b0()});var h8={};w(h8,{executeStatsCommand:()=>H9,createStatsCommand:()=>f8});import{Command as BK,Option as W5}from"commander";function f8(){return new BK("stats").description("Show database statistics").option("--json","Output as JSON").addOption(new W5("--format <type>","Output format: brief (top-line counters) or ai (AI-optimized text). 'default' accepted as deprecated alias.").choices(["brief","ai","default"])).addOption(new W5("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new W5("-q, --quiet","Minimal output").conflicts("verbose")).option("--projects <count>","Number of projects to show in breakdown","10").action(async($)=>{let Z=await H9($);process.exitCode=Z.exitCode})}async function H9($,Z={}){return h0({stats:!0,projects:$.projects,format:$.format,verbose:$.verbose,quiet:$.quiet,json:$.json},{dbPath:Z.dbPath})}var B5=U(()=>{F$()});var u8={};w(u8,{runContextInternal:()=>NK,executeContextCommand:()=>M$,createContextCommand:()=>c8});import*as g8 from"fs";import*as m8 from"os";import{join as zK}from"path";import{Command as AK,Option as YZ}from"commander";function c8(){return new AK("context").description("Show aggregated context for a project").argument("<project>","Project name or substring to filter by").addOption(new YZ("--days <n>","Sessions from last N days (includes today)").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Days must be a positive number");return Z})).addOption(new YZ("--format <type>","Output format: brief, ai. 'detailed' accepted as deprecated alias.").choices(["brief","ai","detailed"])).addOption(new YZ("--budget <tokens>","Maximum token budget for context").argParser(($)=>{let Z=parseInt($,10);if(isNaN(Z)||Z<1)throw Error("Budget must be a positive number");return Z})).option("--cross-project","Include cross-project learnings and decisions").option("--json","Output as JSON").addOption(new YZ("-v, --verbose","Show detailed output with timing").conflicts("quiet")).addOption(new YZ("-q, --quiet","Minimal output").conflicts("verbose")).action(async($,Z)=>{let K=await M$($,Z);process.exitCode=K.exitCode})}async function M$($,Z){let{executeQueryCommand:K}=await Promise.resolve().then(() => (s0(),T$));process.env.MEMORY_JSON_COMMAND_OVERRIDE="context";try{return await K($,{...Z,kind:"context",scope:"project"})}finally{delete process.env.MEMORY_JSON_COMMAND_OVERRIDE}}async function NK($,Z,K){if(Z.format==="detailed")K0({command:"context",alias:"detailed",replacement:"Use --format brief or --format ai.",json:Z.json});let X=zK(m8.homedir(),".memory");if(g8.existsSync(X)&&!Z.quiet&&!Z.json)console.error("[DEPRECATION WARNING] Legacy memory directory ~/.memory/ is deprecated. Your knowledge and decisions are now stored safely in the SQLite database.");let Y=K?.dbPath??Z.dbPath??E(),{db:Q}=v({path:Y});try{return await qK(Q,$,Z)}catch(G){let _=G instanceof R?G:new R(T.DB_CONNECTION_FAILED,A(G));if(Z.json)S({command:"context",code:_.code,message:_.message,..._.context!==void 0?{context:_.context}:{}});else console.error(c(_));return{exitCode:1}}finally{D(Q)}}async function qK($,Z,K){let X=new G$($),Y=new l0($),Q=new k0($),G=new Q$($),J=await new f$({projectResolver:X,factRepo:Y,frictionRepo:Q,getSessionSummary:async(z,W)=>{let N=await G.getProjectContext(z,{days:W});if(!N)return null;return`Sessions: ${N.sessionCount} | Messages: ${N.totalMessages} | Last active: ${N.lastActivity?.toISOString()??"never"}`}}).getContext({projectFilter:Z,budget:K.budget,days:K.days,crossProject:K.crossProject});if(K.json){if(!J)return S({command:"context",code:"NOT_FOUND",message:`Project not found: ${Z}`,context:{project:Z}}),{exitCode:1};let z=await G.getProjectContext(Z,{days:K.days});return s({command:"context",kind:"context",data:z?X3(z):null,meta:{project:Z,days:K.days,budget:K.budget,cross_project:!!K.crossProject,mode:"smart",sections:J.sections.map((W)=>({key:W.key,title:W.title}))}}),{exitCode:0}}let H=K.format==="ai"?"ai":K.verbose?"verbose":K.quiet?"quiet":K.format==="detailed"?"detailed":"brief",V=k(),B=iZ(H,V);if(!J){let z=B.formatEmpty(Z);if(H!=="quiet"||z)console.error(z);return{exitCode:1}}if(B.formatSmartContext){let z=B.formatSmartContext(J);console.log(z)}else{let z=J.sections.find((W)=>W.key==="session_summary");if(z)console.log(z.content);else{let W=J.sections.map((N)=>`${N.title}:
870
- ${N.content}`).join(`
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
- `)}function MK($,Z){let K=[];if($.limit)K.push(`limit: ${$.limit}`);if($.project)K.push(`project: ${$.project}`);if($.session)K.push(`session: ${$.session}`);if($.role)K.push(`role: ${$.role}`);if($.days)K.push(`days: ${$.days}`);if($.since)K.push(`since: ${$.since}`);if($.before)K.push(`before: ${$.before}`);if($.caseSensitive)K.push("case-sensitive");if(Z)K.push("case-sensitive filter applied");if($.mode&&$.mode!=="auto")K.push(`mode: ${$.mode}`);if($.vector===!1)K.push("no-vector");if($.decay===!1)K.push("no-decay");return K}function i8($,Z,K){return $.filter((Y)=>{return Y.snippet.replace(/<\/?mark>/g,"").includes(Z)}).slice(0,K)}var QZ=U(()=>{Q0();u();o4();Z0();nZ();F0();Q5();M0();L0();b0();t0();G9()});w$();S$();VZ();HZ();Q0();var b2={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})};class NZ{sessionSource;eventParser;sessionRepo;messageRepo;toolUseRepo;extractionStateRepo;db;abortSignal;checkpointManager;redactor;constructor($,Z,K,X,Y,Q,G,_,J,H=b2){this.sessionSource=$;this.eventParser=Z;this.sessionRepo=K;this.messageRepo=X;this.toolUseRepo=Y;this.extractionStateRepo=Q;this.db=G;this.abortSignal=_;this.checkpointManager=J;this.redactor=H}async sync($={}){let Z=Date.now(),K=$.checkpointEnabled!==!1,X={success:!0,sessionsDiscovered:0,sessionsProcessed:0,sessionsSkipped:0,messagesInserted:0,toolUsesInserted:0,errors:[],durationMs:0,aborted:!1},Y=null,Q=new Set;if(K){if(Y=this.checkpointManager.load(),Y){X.recoveredFromCheckpoint=Y.completedSessions;for(let V of Y.completedSessionIds)Q.add(V)}}$.onProgress?.({current:0,total:0,sessionId:"",phase:"discovering"});let G;try{G=await this.sessionSource.discoverSessions()}catch(V){throw new R(T.SOURCE_INACCESSIBLE,"Failed to discover sessions",{reason:A(V)})}X.sessionsDiscovered=G.length;let _=await this.filterSessions(G,$);if(Q.size>0){let V=_.length;_=_.filter((B)=>!Q.has(B.id)),X.sessionsSkipped+=V-_.length}if(X.sessionsSkipped=X.sessionsDiscovered-_.length-Q.size,X.sessionsSkipped<0)X.sessionsSkipped=X.sessionsDiscovered-_.length;let J=_.length+Q.size,H=Y??{startedAt:new Date().toISOString(),totalSessions:J,completedSessions:Q.size,completedSessionIds:[...Q],lastCompletedAt:null};for(let V=0;V<_.length;V++){if(this.abortSignal.shouldAbort()){if(X.aborted=!0,K)this.checkpointManager.save(H);break}let B=_[V];if(!B)continue;$.onProgress?.({current:V+1+Q.size,total:J,sessionId:B.id,phase:"extracting"});try{let z=await this.extractSession(B);if(X.sessionsProcessed++,X.messagesInserted+=z.messages,X.toolUsesInserted+=z.toolUses,K)H.completedSessions++,H.completedSessionIds.push(B.id),H.lastCompletedAt=new Date().toISOString(),this.checkpointManager.save(H);$.onSessionComplete?.(B.id)}catch(z){let W=this.wrapError(z,B.path);X.errors.push({sessionPath:B.path,error:W.message}),X.success=!1}}if(K&&!X.aborted&&X.success)this.checkpointManager.clear();return $.onProgress?.({current:J,total:J,sessionId:"",phase:"complete"}),X.durationMs=Date.now()-Z,X}async fixProjectNames($){let Z=await this.sessionRepo.findDistinctEncodedPaths(),K=0;for(let X of Z){let Y=$.resolveFromEncodedPath(X),Q=await this.sessionRepo.updateProjectName(X,Y);K+=Q}return K}wrapError($,Z){if($ instanceof R)return $;let K=A($);if(K.includes("ENOENT")||K.includes("no such file"))return new R(T.SOURCE_INACCESSIBLE,`Cannot access session file: ${K}`,{path:Z});if(K.includes("JSON")||K.includes("parse"))return new R(T.INVALID_JSON,`Failed to parse session file: ${K}`,{path:Z});if(K.includes("locked")||K.includes("SQLITE_BUSY"))return new R(T.DB_LOCKED,`Database is locked: ${K}`,{path:Z});if(K.includes("database")||K.includes("SQLITE"))return new R(T.DB_CONNECTION_FAILED,`Database error: ${K}`,{path:Z});return new R(T.SYNC_FAILED,K,{path:Z})}async filterSessions($,Z){let K=$;if(Z.projectFilter)K=K.filter((Y)=>Y.projectPath.decoded.includes(Z.projectFilter));if(Z.sessionFilter)K=K.filter((Y)=>Y.id===Z.sessionFilter);let X=[];for(let Y of K){let Q=await this.extractionStateRepo.findBySessionPath(Y.path);if(this.needsExtraction(Y,Q,Z.force??!1))X.push(Y)}return X}needsExtraction($,Z,K){if(K)return!0;if(!Z)return!0;if(Z.status!=="complete")return!0;let{fileMtime:X,fileSize:Y}=Z;if(!X||Y===void 0||Y===null)return!0;return $.modifiedTime.getTime()!==X.getTime()||$.size!==Y}async extractSession($){let Z=crypto.randomUUID(),K=$0.create({id:Z,sessionPath:$.path,startedAt:new Date,status:"pending"}).withFileMetadata($.modifiedTime,$.size);try{let X=[];for await(let V of this.eventParser.parse($.path))X.push(V);let{messages:Y,toolUses:Q,firstTimestamp:G,lastTimestamp:_}=this.extractEntities(X),J=B0.create({id:$.id,projectPath:$.projectPath,startTime:G??new Date,endTime:_,messageCount:Y.length});return this.db.transaction(()=>{if(this.sessionRepo.save(J),Y.length>0)this.messageRepo.saveMany(Y.map((B)=>({message:B,sessionId:$.id})));if(Q.length>0)this.toolUseRepo.saveMany(Q.map((B)=>({toolUse:B,sessionId:$.id})));let V=K.startProcessing().incrementMessages(Y.length).complete(new Date);this.extractionStateRepo.save(V)}).immediate(),{messages:Y.length,toolUses:Q.length}}catch(X){let Y=K.fail(A(X));throw await this.extractionStateRepo.save(Y),X}}extractEntities($){let Z=[],K=[],X=new Map,Y,Q;for(let G of $){if(G.type==="skipped")continue;if("data"in G&&G.data.timestamp){let _=new Date(G.data.timestamp);if(!Y||_<Y)Y=_;if(!Q||_>Q)Q=_}switch(G.type){case"user":{let _=W0.create({id:G.data.uuid,role:"user",content:this.redactor.redactText(G.data.message.content).text,timestamp:new Date(G.data.timestamp)});Z.push(_);break}case"assistant":{let _=G.data.message.content.filter((B)=>B.type==="text").map((B)=>B.text).join(`
874
- `),J=this.redactor.redactText(_).text,H=G.data.message.content.filter((B)=>B.type==="tool_use").map((B)=>B.id);for(let B of G.data.message.content)if(B.type==="tool_use"){let z=z0.create({id:B.id,name:B.name,input:this.redactor.redactJson(B.input).value,timestamp:new Date(G.data.timestamp),status:"pending"});X.set(B.id,z)}let V=W0.create({id:G.data.uuid,role:"assistant",content:J,timestamp:new Date(G.data.timestamp),toolUseIds:H});Z.push(V);break}case"tool_use":{let _=z0.create({id:G.data.uuid,name:G.data.name,input:this.redactor.redactJson(G.data.input).value,timestamp:new Date(G.data.timestamp),status:"pending"});X.set(G.data.uuid,_);break}case"tool_result":{let _=X.get(G.data.toolUseId);if(_){let J=G.data.isError?_.completeError(this.redactor.redactText(G.data.content).text):_.completeSuccess(this.redactor.redactText(G.data.content).text);X.set(G.data.toolUseId,J)}break}case"summary":case"system":break}}return K.push(...X.values()),{messages:Z,toolUses:K,firstTimestamp:Y,lastTimestamp:Q}}}class x5{sessionSource;extractionStateRepo;syncService;syncLogger;recoveryEnabled;constructor($,Z,K,X,Y){this.sessionSource=$;this.extractionStateRepo=Z;this.syncService=K;this.syncLogger=X;this.recoveryEnabled=Y}async recover($={}){if(!this.recoveryEnabled&&!$.dryRun)return{pendingSessions:[],syncedSessions:0,errors:[],skipped:!0};let Z=await this.sessionSource.discoverSessions(),K=[];for(let G of Z){let _=await this.extractionStateRepo.findBySessionPath(G.path);if(!_||_.status!=="complete")K.push(G.path)}if(this.syncLogger.log({level:"info",message:`Recovery scan found ${K.length} pending sessions`}),$.dryRun)return{pendingSessions:K,syncedSessions:0,errors:[],skipped:!1};let X=$.maxSessions?K.slice(0,$.maxSessions):K,Y=0,Q=[];for(let G of X)try{let _=P5(G);await this.syncService.sync({sessionFilter:_}),Y++,this.syncLogger.log({level:"info",message:`Recovery synced session ${_}`,sessionId:_})}catch(_){let J=A(_);Q.push({sessionPath:G,error:J}),this.syncLogger.log({level:"error",message:`Recovery failed for ${G}: ${J}`,error:J})}return{pendingSessions:K,syncedSessions:Y,errors:Q,skipped:!1}}async getPendingCount(){let $=await this.sessionSource.discoverSessions(),Z=0;for(let K of $){let X=await this.extractionStateRepo.findBySessionPath(K.path);if(!X||X.status!=="complete")Z++}return Z}}function P5($){let Z=$.split(/[/\\]/);return Z[Z.length-1].replace(/\.jsonl$/,"")}k$();var f2=["Read","Write","Edit","NotebookEdit"],h2=["Glob","Grep"],g2=["Write","Edit","NotebookEdit"];class E5{static extractFilePaths($){let Z=new Set;for(let K of $){let X=K.input;if(f2.includes(K.name)){let Y=X.file_path;if(Y)Z.add(Y)}if(h2.includes(K.name)){let Y=X.path;if(Y)Z.add(Y)}if(K.name==="Glob"&&K.result){let Y=K.result.split(`
875
- `);for(let Q of Y){let G=Q.trim();if(G)Z.add(G)}}}return Array.from(Z)}static extractFileModifications($){let Z=[];for(let K of $){if(!g2.includes(K.name))continue;if(K.status!=="success")continue;let X=K.input.file_path;if(X)Z.push({path:X,operation:K.name,timestamp:K.timestamp})}return Z}static extractToolStats($){let Z=new Map;for(let K of $){let X=Z.get(K.name);if(X){if(X.count++,K.status==="success")X.successCount++;else if(K.status==="error")X.errorCount++}else Z.set(K.name,{count:1,successCount:K.status==="success"?1:0,errorCount:K.status==="error"?1:0})}return Array.from(Z.entries()).map(([K,X])=>({name:K,...X}))}static extractToolNames($){let Z=new Set;for(let K of $)Z.add(K.name);return Array.from(Z)}static toFileEntities($){return $.map((Z)=>e.create({type:"file",name:Z,confidence:1}))}static toFileModificationEntities($){return $.map((Z)=>{let K={operation:Z.operation.toLowerCase()};return e.create({type:"file",name:Z.path,confidence:1,metadata:K})})}}L9();R9();import{existsSync as u2}from"fs";var k5={redactText:($)=>({text:$,findings:[]}),redactJson:($)=>({value:$,findings:[]})};function Z$($,Z){return $.redactText(Z).text}function b$($,Z){return Z===null?null:Z$($,Z)}async function F9($,Z,K={}){let X=K.includeSensitive?k5:K.redactor??k5,Y=$.query(`SELECT id, project_path_encoded as projectPathEncoded,
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((q)=>({...q,summary:b$(X,q.summary)})),Q=$.query(`SELECT id, session_id as sessionId, role, content, timestamp,
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((q)=>({...q,content:Z$(X,q.content)})),G=$.query(`SELECT id, session_id as sessionId, name, input, timestamp, status, result
883
- FROM tool_uses`).all().map((q)=>({...q,input:Z$(X,q.input),result:b$(X,q.result)})),_=$.query(`SELECT id, type, name, metadata, confidence
884
- FROM entities`).all().map((q)=>({...q,name:Z$(X,q.name),metadata:b$(X,q.metadata)})),J=$.query(`SELECT source_type as sourceType, source_id as sourceId,
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(),H=$.query(`SELECT session_id as sessionId, entity_id as entityId, frequency
888
- FROM session_entities`).all(),V=$.query(`SELECT source_id as sourceId, target_id as targetId, relationship, weight
889
- FROM entity_links`).all(),B=$.query(`SELECT id, session_path as sessionPath, started_at as startedAt,
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((q)=>({...q,sessionPath:Z$(X,q.sessionPath),errorMessage:b$(X,q.errorMessage)})),z=$.query(`SELECT uuid, type, project, content, metadata,
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((q)=>({...q,content:Z$(X,q.content),metadata:b$(X,q.metadata)})),W={version:"1.0",exportedAt:new Date().toISOString(),stats:{sessions:Y.length,messages:Q.length,toolUses:G.length,entities:_.length,links:J.length,sessionEntities:H.length,entityLinks:V.length,extractionStates:B.length,facts:z.length},sessions:Y,messages:Q,toolUses:G,entities:_,links:J,sessionEntities:H,entityLinks:V,extractionStates:B,facts:z},N=JSON.stringify(W,null,2);return await Bun.write(Z,N),{sessions:Y.length,messages:Q.length,toolUses:G.length,entities:_.length,links:J.length,bytes:N.length,facts:z.length}}async function qZ($){if(!u2($))return{valid:!1,error:"File does not exist"};try{let K=await Bun.file($).text(),X=JSON.parse(K);if(!X.version||typeof X.version!=="string")return{valid:!1,error:"Missing or invalid version field"};let Y=["sessions","messages","toolUses","entities","links"];for(let Q of Y)if(!Array.isArray(X[Q]))return{valid:!1,error:`Missing or invalid ${Q} array`};if(!X.stats||typeof X.stats!=="object")return{valid:!1,error:"Missing or invalid stats object"};return{valid:!0,version:X.version}}catch(Z){return{valid:!1,error:`Failed to parse file: ${A(Z)}`}}}async function M9($,Z,K={}){let X=await qZ(Z);if(!X.valid)throw Error(`Invalid export file: ${X.error}`);let Q=await Bun.file(Z).text(),G=JSON.parse(Q);if(K.clearExisting)d2($);return $.transaction(()=>{let J=$.prepare(`
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 W of G.sessions)J.run(W.id,W.projectPathEncoded,W.projectPathDecoded,W.projectName,W.startTime,W.endTime,W.messageCount,W.summary);let H=$.prepare(`
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 W of G.messages)H.run(W.id,W.sessionId,W.role,W.content,W.timestamp,W.toolUseIds);let V=$.prepare(`
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 W of G.toolUses)V.run(W.id,W.sessionId,W.name,W.input,W.timestamp,W.status,W.result);let B=$.prepare(`
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 W of G.entities)B.run(W.id,W.type,W.name,W.metadata,W.confidence);let z=$.prepare(`
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 W of G.links)z.run(W.sourceType,W.sourceId,W.targetType,W.targetId,W.relationship,W.weight);if(G.sessionEntities&&G.sessionEntities.length>0){let W=$.prepare(`
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 N of G.sessionEntities)W.run(N.sessionId,N.entityId,N.frequency)}if(G.entityLinks&&G.entityLinks.length>0){let W=$.prepare(`
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 N of G.entityLinks)W.run(N.sourceId,N.targetId,N.relationship,N.weight)}if(G.extractionStates&&G.extractionStates.length>0){let W=$.prepare(`
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 N of G.extractionStates)W.run(N.id,N.sessionPath,N.startedAt,N.status,N.completedAt,N.messagesExtracted,N.errorMessage,N.fileMtime,N.fileSize)}if(G.facts&&G.facts.length>0){let W=$.prepare(`
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 N of G.facts)W.run(N.uuid,N.type,N.project,N.content,N.metadata,N.observedAt,N.supersededAt,N.supersededBy)}return{sessions:G.sessions.length,messages:G.messages.length,toolUses:G.toolUses.length,entities:G.entities.length,links:G.links.length,facts:G.facts?G.facts.length:0}}).immediate()}function d2($){$.exec("PRAGMA foreign_keys = OFF;");try{$.exec("DELETE FROM session_entities;"),$.exec("DELETE FROM entity_links;"),$.exec("DELETE FROM links;"),$.exec("DELETE FROM messages_meta;"),$.exec("DELETE FROM sessions_fts;"),$.exec("DELETE FROM facts;"),$.exec("DELETE FROM tool_uses;"),$.exec("DELETE FROM sessions;"),$.exec("DELETE FROM entities;"),$.exec("DELETE FROM extraction_state;"),$.exec("DELETE FROM topics;")}finally{$.exec("PRAGMA foreign_keys = ON;")}}function j9($){return($.query(`SELECT (SELECT COUNT(*) FROM sessions) +
936
- (SELECT COUNT(*) FROM messages_meta) as count`).get()?.count??0)>0}function p2($,Z,K=30,X=new Date){let Y=X.getTime(),Q=86400000;return $.map((_)=>{let J=Z.get(_.rowid);if(!J)return{..._,decayedScore:_.score};let H=(Y-J.getTime())/86400000,V=Math.pow(0.5,H/K);return{..._,decayedScore:_.score*V}}).sort((_,J)=>J.decayedScore-_.decayedScore)}var l2=["decisions","learnings","user_prefs"];function n2($,Z,K,X=30,Y=new Date){let Q=Y.getTime(),G=86400000;return $.map((J)=>{if(K.has(J.rowid))return{...J,decayedScore:J.score};let H=Z.get(J.rowid);if(!H)return{...J,decayedScore:J.score};let V=(Q-H.getTime())/86400000,B=Math.pow(0.5,V/X);return{...J,decayedScore:J.score*B}}).sort((J,H)=>H.decayedScore-J.decayedScore)}WZ();class OZ{repository;scanner;constructor($,Z){this.repository=$;this.scanner=Z}async syncMemoryFiles($={}){let Z={filesIndexed:0,filesSkipped:0,errors:[]},K;try{K=await this.scanner.discoverFiles()}catch(X){return Z.errors.push({filePath:"~/.memory/",error:A(X)}),Z}for(let X=0;X<K.length;X++){let Y=K[X];if(!Y)continue;try{let Q=await this.repository.findByPath(Y.filePath);if(Q&&Q.contentHash===Y.contentHash){Z.filesSkipped++,$.onProgress?.({current:X+1,total:K.length,filePath:Y.filePath,action:"skipped"});continue}let G=m0.create({filePath:Y.filePath,fileType:Y.fileType,projectEncoded:Y.projectEncoded,content:Y.content,contentHash:Y.contentHash,lastIndexedAt:new Date});await this.repository.save(G),Z.filesIndexed++,$.onProgress?.({current:X+1,total:K.length,filePath:Y.filePath,action:"indexing"})}catch(Q){Z.errors.push({filePath:Y.filePath,error:A(Q)})}}return Z}}BZ();Q0();import{existsSync as a2,readFileSync as i2,unlinkSync as r2}from"fs";class UZ{repository;constructor($){this.repository=$}async log($){let Z=x0.create({description:$.description,severity:$.severity??"medium",category:$.category??"cli",tool:$.tool??"memory",status:"open",context:$.context,sourceProject:$.sourceProject,loggedAt:$.loggedAt??new Date});return this.repository.save(Z)}async list($){if($?.all||$?.tool||$?.category||$?.sourceProject)return this.repository.findAll({status:$?.all?$.status:"open",category:$?.category,tool:$?.tool,sourceProject:$?.sourceProject,limit:$?.limit});return this.repository.findOpen()}async resolve($,Z){let K=await this.repository.findById($);if(!K)throw new R(T.NOT_FOUND,`Friction entry #${$} not found`,{id:$});if(K.status!=="open")throw new R(T.INVALID_STATE,`Friction entry #${$} is already ${K.status}`,{id:$,currentStatus:K.status});await this.repository.resolve($,Z)}async wontFix($,Z){let K=await this.repository.findById($);if(!K)throw new R(T.NOT_FOUND,`Friction entry #${$} not found`,{id:$});if(K.status!=="open")throw new R(T.INVALID_STATE,`Friction entry #${$} is already ${K.status}`,{id:$,currentStatus:K.status});await this.repository.resolve($,Z),await this.repository.updateStatus($,"wont-fix")}async getStats(){return this.repository.getStats()}async getWeeklyTrends($=4){return this.repository.getWeeklyTrends($)}async ingestFallbackFile($){if(!a2($))return 0;let K=i2($,"utf-8").split(`
937
- `).filter(Boolean),X=0;for(let Y of K)try{let Q=JSON.parse(Y);await this.log({description:Q.description,severity:Q.severity??"medium",category:Q.category??"cli",tool:Q.tool??"unknown",context:Q.context,sourceProject:Q.project,loggedAt:Q.date?new Date(Q.date+"T00:00:00Z"):new Date}),X++}catch{process.stderr.write(`Warning: skipping malformed friction entry in ${$}
938
- `)}try{r2($)}catch{process.stderr.write(`Warning: could not delete ${$} (entries already ingested)
939
- `)}return X}async detectPatterns($=3){return this.repository.findPatterns($)}async markReviewed($){await this.repository.markReviewed($,new Date)}async purge($){return this.repository.deleteByPattern($)}}v5();LZ();import{Command as gV,Option as mV}from"commander";f9();u();ZZ();import{createReadStream as o7}from"fs";import{createInterface as t7}from"readline";function N$($){if(typeof $==="string"){if(/^\d{4}-\d{2}-\d{2}T/.test($))return $;let Z=new Date($);if(!isNaN(Z.getTime()))return Z.toISOString()}if(typeof $==="number"&&!isNaN($)){let Z=$>1000000000000?$:$*1000,K=new Date(Z);if(!isNaN(K.getTime()))return K.toISOString()}if($ instanceof Date&&!isNaN($.getTime()))return $.toISOString();return new Date().toISOString()}var d7=new Set(["progress","agent_progress","bash_progress","mcp_progress","hook_progress","base64","image","file-history-snapshot","waiting_for_task","create","update","queue-operation"]);function c1($){if(typeof $!=="object"||$===null)return!1;return typeof $.type==="string"}function I4($){if(!c1($))return{type:"skipped",reason:"Invalid event structure"};let Z=$.type;if(d7.has(Z))return{type:"skipped",reason:`Event type "${Z}" not extracted`};switch(Z){case"user":return p7($);case"assistant":return n7($);case"summary":return i7($);case"system":return r7($);default:return{type:"skipped",reason:`Event type "${Z}" not classified`}}}function p7($){if(!$.uuid||!$.timestamp||!$.message)return{type:"skipped",reason:"User event missing required fields"};let Z={uuid:$.uuid,message:{content:l7($.message.content)},timestamp:N$($.timestamp)};if($.cwd)Z.cwd=$.cwd;if($.gitBranch)Z.gitBranch=$.gitBranch;return{type:"user",data:Z}}function l7($){if(typeof $==="string")return $;if(Array.isArray($))return $.filter((K)=>K.type==="tool_result").map((K)=>{if(typeof K.content==="string")return K.content;return JSON.stringify(K.content)}).join(`
940
- `);return""}function n7($){if(!$.uuid||!$.timestamp||!$.message)return{type:"skipped",reason:"Assistant event missing required fields"};let Z=a7($.message.content||[]),K={uuid:$.uuid,message:{content:Z},timestamp:N$($.timestamp)};if($.message.model)K.message.model=$.message.model;if($.message.usage)K.usage={inputTokens:$.message.usage.input_tokens,outputTokens:$.message.usage.output_tokens};return{type:"assistant",data:K}}function a7($){if(!Array.isArray($))return[];return $.filter((Z)=>{return Z.type!=="thinking"}).map((Z)=>{if(Z.type==="text")return{type:"text",text:Z.text};if(Z.type==="tool_use")return{type:"tool_use",id:Z.id,name:Z.name,input:Z.input};return{type:"text",text:""}})}function i7($){if(!$.summary)return{type:"skipped",reason:"Summary event missing summary field"};let Z={content:$.summary,timestamp:N$($.timestamp)};if($.leafUuid)Z.leafUuid=$.leafUuid;return{type:"summary",data:Z}}function r7($){if(!$.subtype)return{type:"skipped",reason:"System event missing subtype field"};return{type:"system",data:{subtype:$.subtype,data:$.durationMs??$.data??null,timestamp:N$($.timestamp)}}}class hZ{async*parse($){let Z=o7($,{encoding:"utf8"}),K=t7({input:Z,crlfDelay:1/0}),X=0;for await(let Y of K){X++;let Q=Y.trim();if(Q===""){yield{type:"skipped",reason:`Empty line at ${X}`};continue}try{let G=JSON.parse(Q);yield I4(G)}catch(G){let _=A(G);yield{type:"skipped",reason:`Malformed JSON at line ${X}: ${_}`}}}}}p();import{existsSync as T4,mkdirSync as s7,readFileSync as e7,unlinkSync as $6,writeFileSync as Z6}from"fs";import{dirname as K6}from"path";function gZ($){return $??p9()}function u1($,Z){let K=gZ(Z),X=K6(K);try{s7(X,{recursive:!0}),Z6(K,JSON.stringify($,null,2)+`
941
- `)}catch(Y){console.warn("Failed to save checkpoint:",Y.message)}}function q$($){let Z=gZ($);if(!T4(Z))return null;try{let K=e7(Z,"utf-8"),X=JSON.parse(K);if(typeof X.startedAt!=="string"||typeof X.totalSessions!=="number"||typeof X.completedSessions!=="number"||!Array.isArray(X.completedSessionIds))return console.warn("Invalid checkpoint format, ignoring"),null;return X}catch{return console.warn("Invalid checkpoint JSON, ignoring"),null}}function d1($){let Z=gZ($);if(T4(Z))try{$6(Z)}catch(K){console.warn("Failed to clear checkpoint:",K.message)}}function p1($){return T4(gZ($))}import*as n1 from"readline";var n={isShuttingDown:!1,interruptCount:0,cleanupFunctions:[],handlersRegistered:!1,ttyOverride:null,exitOverride:null};function X6(){if(n.ttyOverride!==null)return n.ttyOverride;return process.stdin.isTTY??!1}function mZ($){if(n.exitOverride!==null){n.exitOverride($);return}process.exit($)}async function a1(){for(let $ of n.cleanupFunctions)try{await $()}catch(Z){console.warn("Cleanup error:",Z.message)}}async function Y6(){let $=n1.createInterface({input:process.stdin,output:process.stdout});return new Promise((Z)=>{let K=()=>{console.log(`
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)"),$.question("> ",(X)=>{let Y=parseInt(X.trim(),10);if(Y===1||Y===2||Y===3)$.close(),Z(Y);else console.log("Invalid choice. Enter 1, 2, or 3."),K()})};K()})}async function Q6($){switch($){case 1:console.log("Aborting immediately..."),await a1(),mZ(130);break;case 2:console.log("Will abort after current session..."),n.isShuttingDown=!0;break;case 3:console.log("Continuing..."),n.interruptCount=0;break}}async function l1(){if(n.interruptCount++,n.interruptCount>=2){console.log(`
943
- Force exiting...`),await a1(),mZ(130);return}if(X6()){let $=await Y6();await Q6($)}else console.log(`
944
- Interrupt received, shutting down after current operation...`),n.isShuttingDown=!0}function i1(){if(n.handlersRegistered)return;process.on("SIGINT",()=>{l1().catch(($)=>{console.error("Signal handler error:",$),mZ(1)})}),process.on("SIGTERM",()=>{l1().catch(($)=>{console.error("Signal handler error:",$),mZ(1)})}),n.handlersRegistered=!0}function r1(){return n.isShuttingDown}function o1($){n.cleanupFunctions.push($)}function t1($){let Z=n.cleanupFunctions.indexOf($);if(Z!==-1)n.cleanupFunctions.splice(Z,1)}class cZ{shouldAbort(){return r1()}}class uZ{path;constructor($){this.path=$}load(){return q$(this.path)}save($){u1($,this.path)}clear(){d1(this.path)}}w0();nZ();k4();C4();rZ();h4();u4();M0();import{readFileSync as N6}from"fs";import{resolve as q6}from"path";function p4($,Z,K,X,Y){if($.total===0)return"No friction entries logged yet.";let Q=[];Q.push(r("Friction Dashboard",X)),Q.push("=================="),Q.push(""),Q.push(r(" Overview",X)),Q.push(" --------"),Q.push(` Total: ${$.total} Open: ${d(String($.open),X)} Resolved: ${b(String($.resolved),X)} Won't Fix: ${$.wontFix}`),Q.push("");let G=$.meanTimeToResolve!==null?`MTTR: ${$.meanTimeToResolve.toFixed(1)} days`:"MTTR: N/A";if($.oldestOpen)Q.push(` ${G} Oldest Open: #${$.oldestOpen.id} (${$.oldestOpen.daysOpen} days)`);else Q.push(` ${G}`);Q.push(""),Q.push(r(" By Severity",X)),Q.push(" -----------");let _=["critical","high","medium","low"],J=Math.max(..._.map((H)=>$.bySeverity[H]),1);for(let H of _){let V=$.bySeverity[H],B=Math.round(V/J*20),z="=".repeat(B)+" ".repeat(20-B),W=H.padEnd(10),N=H==="critical"||H==="high"?f(W,X):H==="medium"?d(W,X):b(W,X);Q.push(` ${N}[${z}] ${V}`)}Q.push(""),Q.push(r(" By Category",X)),Q.push(" -----------");for(let[H,V]of Object.entries($.byCategory))Q.push(` ${s1(H.padEnd(14),X)}${V}`);if(Q.push(""),$.byTool&&Object.keys($.byTool).length>0){Q.push(r(" By Tool",X)),Q.push(" -------");for(let[H,V]of Object.entries($.byTool)){let B="=".repeat(Math.min(V,40));Q.push(` ${H.padEnd(15)} ${B} ${V}`)}Q.push("")}if(Y&&Y.length>0){Q.push(r(" Pattern Alerts",X)),Q.push(" --------------");for(let H of Y)Q.push(` [!] Pattern detected: ${H.count} open entries for ${H.tool}/${H.category}`);Q.push("")}if(Z.length===0)Q.push(" No trend data available.");else{Q.push(r(" Trends",X)),Q.push(" ------"),Q.push(` ${"Week".padEnd(12)}${"New".padEnd(6)}Resolved`);for(let H of Z)Q.push(` ${P(H.week.padEnd(12),X)}${String(H.newCount).padEnd(6)}${H.resolvedCount}`)}return Q.join(`
945
- `)}function O6(){let $=q6(import.meta.dirname,"../../../../node_modules/chart.js/dist/chart.umd.js");return N6($,"utf-8")}function U6($){return $.map((Z)=>({id:Z.id,severity:Z.severity,category:Z.category,description:Z.description,daysOpen:Math.floor((Date.now()-Z.loggedAt.getTime())/86400000)}))}function l4($,Z,K,X){let Y=O6(),Q=U6(K),G=$.meanTimeToResolve!==null?`${$.meanTimeToResolve.toFixed(1)} days`:"N/A",_=Q.map((J)=>`<tr>
946
- <td>${J.id??"-"}</td>
947
- <td class="severity-${J.severity}">${J.severity}</td>
948
- <td>${J.category}</td>
949
- <td>${d4(J.description)}</td>
950
- <td>${J.daysOpen}d</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>${Y}</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">${$.total}</div>
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">${$.open}</div>
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">${$.resolved}</div>
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">${$.wontFix}</div>
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">${G}</div>
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
- ${X&&X.length>0?` <div class="alerts">
1353
+ ${$&&$.length>0?` <div class="alerts">
1028
1354
  <h2>Pattern Alerts</h2>
1029
1355
  <ul>
1030
- ${X.map((J)=>`<li>Pattern detected: ${J.count} open entries for ${d4(J.tool)}/${d4(J.category)}</li>`).join(`
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
- ${_||'<tr><td colspan="5">No open items</td></tr>'}
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(Z)};
1050
- const openItems = ${JSON.stringify(Q)};
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 d4($){return $.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}F0();L0();async function r4($,Z){if(!$.embed)return console.log("--background requires --embed flag"),console.log(" Usage: memory sync --embed --background"),{exitCode:0};let{spawnBackgroundEmbedding:K,readLock:X,isProcessAlive:Y}=Z??await P6(),Q=X();if(Q&&Y(Q.pid))return console.log(`Embedding already in progress (PID ${Q.pid}). Use 'memory status' to check progress.`),{exitCode:0};let G=K();if(G.started)console.log(`Background embedding started (PID ${G.pid}). Use 'memory status' to check progress.`);else return console.error(`Failed to start background embedding: ${G.reason}`),{exitCode:1};return{exitCode:0}}async function P6(){let $=await Promise.resolve().then(() => ($9(),eZ));return{spawnBackgroundEmbedding:$.spawnBackgroundEmbedding,readLock:$.readLock,isProcessAlive:$.isProcessAlive}}ZZ();async function a3(){let{EmbeddingProviderFactory:$}=await Promise.resolve().then(() => (o4(),n3));return new $}async function i3(){let{loadConfig:$}=await Promise.resolve().then(() => (Z0(),K4));return $()}async function r3($){let{EmbeddingRepository:Z}=await Promise.resolve().then(() => p5);return new Z($)}async function o3($){let Z=new y0;try{let K=await Z.discoverSessions(),X=K;if($.project)X=X.filter((_)=>_.projectPath.decoded.includes($.project));if($.session)X=X.filter((_)=>_.id===$.session);let Y=q$(),Q=new Set(Y?.completedSessionIds??[]),G=X.filter((_)=>!Q.has(_.id));if($.json){let _={dryRun:!0,discovered:K.length,filtered:X.length,toProcess:G.length,recoveredFromCheckpoint:Y?.completedSessions??0,sessions:G.map((J)=>({id:J.id,project:J.projectPath.decoded,size:J.size,modified:J.modifiedTime.toISOString()}))};console.log(JSON.stringify(_,null,2))}else{if(console.log(`Dry run - no changes will be made
1133
- `),console.log(`Discovered: ${K.length} sessions`),console.log(`After filter: ${X.length} sessions`),Y)console.log(`Checkpoint: ${Y.completedSessions} already done`);if(console.log(`To process: ${G.length} sessions
1134
- `),G.length>0){console.log("Sessions to sync:");for(let _ of G.slice(0,20)){let J=_.projectPath.decoded.split(/[/\\]/).pop()??"unknown";console.log(` ${_.id.slice(0,16)}... ${J}`)}if(G.length>20)console.log(` ... and ${G.length-20} more`)}}return{exitCode:0}}catch(K){return t4(K,$),{exitCode:1}}}function t4($,Z){let K=y$($);if(Z.json)console.error(r0(K));else console.error(c(K,{verbose:!!Z.verbose}))}function t3($,Z,K){let X=Date.now()-Z;if(K.json){let Y={success:$.success,aborted:$.aborted??!1,duration:X,discovered:$.sessionsDiscovered,processed:$.sessionsProcessed,skipped:$.sessionsSkipped,messages:$.messagesInserted,toolUses:$.toolUsesInserted,recoveredFromCheckpoint:$.recoveredFromCheckpoint,errors:$.errors};console.log(JSON.stringify(Y,null,2));return}if(K.quiet)return;if($.aborted)console.log(`
1458
+ </html>`}function b1(A){return A.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}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 ${X}ms`);if(console.log(` Discovered: ${$.sessionsDiscovered}`),console.log(` Processed: ${$.sessionsProcessed}`),console.log(` Skipped: ${$.sessionsSkipped}`),console.log(` Messages: ${$.messagesInserted}`),console.log(` Tool uses: ${$.toolUsesInserted}`),$.recoveredFromCheckpoint)console.log(` Recovered: ${$.recoveredFromCheckpoint} from checkpoint`);if($.errors.length>0){console.log(`
1137
- Errors (${$.errors.length}):`);for(let Y of $.errors)console.log(` ${Y.sessionPath}: ${Y.error}`)}}function s3(){let $=process.platform==="win32"?"C:\\":"/";return new bZ($)}async function s4($,Z,K={}){let X=K.factory??await a3(),Y=K.config??await i3(),Q=X.createFromConfig(Y);if(!Q){if(!Z.quiet)console.error("Embedding is disabled in configuration. Enable it in ~/.config/memory/config.json");return}let G=K.repositoryOverride??await r3($),{EmbeddingService:_}=await Promise.resolve().then(() => (R9(),D5)),{PatternRedactor:J}=await Promise.resolve().then(() => (XZ(),e3)),{createEmbeddingProgressReporter:H,createModelDownloadHandler:V}=await Promise.resolve().then(() => (f9(),b5)),B=new _({repository:G,provider:Q,config:Y.embedding,redactor:new J}),z=B.checkModelState();if(z.modelChanged&&z.needsReEmbed){if(!await $8(z,Z)){await X.dispose();return}let F=G.getStoredEmbeddingDimensions(),L=Y.embedding.dimensions;if(F!==null&&F!==L){if(!Z.quiet)console.log(`Recreating embedding table for ${L}-dimensional vectors...`);G.recreateVecTable(L)}if(!Z.quiet)console.log("Clearing existing embeddings for re-embedding...")}let W=V({quiet:!!Z.quiet});await Q.initialize(W);let N=G.getTotalMessageCount()-G.getEmbeddedCount();if(N===0){if(!Z.quiet)console.log(`
1138
- All messages already embedded.`);await X.dispose();return}let q=H({quiet:!!Z.quiet});q.start(N);try{let I;if(z.modelChanged&&z.needsReEmbed)I=await B.clearAndReembed({onProgress:(F)=>q.update(F.current)});else I=await B.embedUnembedded({onProgress:(F)=>q.update(F.current)});if(q.stop(),!Z.quiet){let F=Math.max(1,Math.round(I.durationMs/1000)),L=I.rate.toFixed(1);console.log(`
1139
- Embedded ${I.embedded} messages in ${F}s (${L} msg/s)`)}}catch(I){q.stop();let F=G.getEmbeddedCount(),L=G.getTotalMessageCount();if(!Z.quiet)console.error(`
1140
- Embedding failed at ${F}/${L} messages. Run memory sync --embed to resume from where it stopped.`);throw I}finally{await X.dispose()}}async function $8($,Z){let K=$.embeddedCount??0,X=$.storedModelName??$.storedHash??"unknown",Y=$.currentModelName;if(Z.force)return!0;if(!process.stdin.isTTY||Z.quiet)return console.error(`Model changed from ${X} to ${Y}. Skipping re-embedding in non-interactive mode. Run 'memory sync --embed' interactively to re-embed.`),!1;let G=(await import("readline")).createInterface({input:process.stdin,output:process.stdout});return new Promise((_)=>{G.question(`Model changed from ${X} to ${Y}. Re-embed all ${K} messages? [y/N] `,(J)=>{G.close(),_(J.trim().toLowerCase()==="y")})})}r9();ZZ();async function Z8($,Z){try{let K=new PZ($),X=new fZ,Q=await new OZ(K,X).syncMemoryFiles();if(Q.filesIndexed>0||Q.filesSkipped>0||Q.errors.length>0)return Q;return null}catch(K){if(!Z.quiet)console.error(` Memory files: error (${A(K)})`);return null}}function K8($,Z){if(Z.json){let K={memoryFiles:{indexed:$.filesIndexed,skipped:$.filesSkipped,errors:$.errors}};console.log(JSON.stringify(K,null,2));return}if(Z.quiet)return;if(console.log(` Memory files: ${$.filesIndexed} indexed, ${$.filesSkipped} skipped`),$.errors.length>0)for(let K of $.errors)console.log(` Error: ${K.filePath}: ${K.error}`)}async function Z5($,Z,K){try{let X,Y,Q,G;if(K){if(X=K.loadConfig(),!X.ambientContext.enabled)return;Y=K.resolveAutoMemoryDir(),Q=K.resolveProjectName(),G=K.createAmbientService()}else{let{loadConfig:J}=await Promise.resolve().then(() => (Z0(),K4));if(X=J(),!X.ambientContext.enabled)return;let H=process.cwd(),{ProjectPath:V}=await Promise.resolve().then(() => T5),B=V.fromDecoded(H),z=B.encoded;Q=B.projectName;let{homedir:W}=await import("os"),{join:N}=await import("path");Y=N(W(),".claude","projects",z,"memory");let{SqliteProjectResolver:q}=await Promise.resolve().then(() => s5),{SqliteFactRepository:I}=await Promise.resolve().then(() => (X$(),i5)),{SqliteFrictionRepository:F}=await Promise.resolve().then(() => (EZ(),n5)),{AutoMemoryWriter:L}=await Promise.resolve().then(() => (J8(),_8)),{SmartContextService:O}=await Promise.resolve().then(() => (LZ(),C5)),{AmbientContextService:M}=await Promise.resolve().then(() => y5),{createContextFormatter:x}=await Promise.resolve().then(() => (rZ(),x3)),y=new q($),J0=new I($),g0=new F($),H0=x("ai",!1),V0=new O({projectResolver:y,factRepo:J0,frictionRepo:g0});G=new M(V0,new L,H0)}let _=await G.generateAmbientContext({projectName:Q,autoMemoryDir:Y,budget:X.ambientContext.budget});if(_.success&&!Z.quiet)console.log(` Ambient context: updated (~${_.contextTokens} tokens)`);else if(!_.success&&!Z.quiet)console.log(` Ambient context: skipped (${_.reason})`)}catch(X){if(!Z.quiet)console.error(` Ambient context: error (${A(X)})`)}}Z0();XZ();function m6({db:$,resolver:Z}){let K=new y0({projectNameResolver:Z}),X=new hZ,Y=new g($),Q=new T0($),G=new p0($),_=new d0($),J=new NZ(K,X,Y,Q,G,_,$,new cZ,new uZ,new o0);return{fixProjectNames:(H)=>J.fixProjectNames(H),sync:(H)=>J.sync(H)}}async function c6($){await(await p6())($)}function u6($){return{handleBackgroundMode:r4,setupSignalHandlers:i1,hasCheckpoint:p1,loadCheckpoint:q$,createProgressReporter:C9,getDefaultDbPath:E,executeDryRun:o3,handleError:t4,reportResults:t3,createDriveResolver:s3,initializeDatabase:v,closeDatabase:D,bulkOperationCheckpoint:l9,registerCleanup:o1,unregisterCleanup:t1,createSyncService:m6,loadConfig:m,createGitSyncer:d6,rebuildProjections:c6,experimentalRemoteSync:process.env.MEMORY_EXPERIMENTAL_REMOTE_SYNC==="1",runMemoryFileSync:Z8,reportMemoryFileResults:K8,runAmbientContextGeneration:Z5,runEmbeddingPass:s4,...$}}async function L8($,Z={}){let K=u6(Z);if($.background)return await K.handleBackgroundMode($);K.setupSignalHandlers();let X=Date.now(),Y=K.createProgressReporter($);if(!$.quiet&&K.hasCheckpoint()){let J=K.loadCheckpoint();if(J)console.log(`Resuming from previous interrupted sync (${J.completedSessions}/${J.totalSessions} sessions done)`)}let Q=K.getDefaultDbPath();if($.dryRun)return await K.executeDryRun($);let G;try{G=K.initializeDatabase({path:Q}).db}catch(J){return K.handleError(J,$),{exitCode:1}}let _=async()=>{K.closeDatabase(G)};K.registerCleanup(_);try{let J=K.createDriveResolver(),H=K.createSyncService({db:G,resolver:J});if($.fixNames){Y.log("Fixing project names...");let L=await H.fixProjectNames(J);if(!$.quiet)console.log(`Fixed project names: ${L} sessions updated`)}let V={force:$.force,projectFilter:$.project,sessionFilter:$.session,checkpointEnabled:!0,onProgress:(L)=>{if(L.phase==="discovering")Y.log("Discovering sessions...");else if(L.phase==="extracting"){if(L.current===1)Y.start(L.total);Y.update(L.current,L.sessionId)}}},B=await H.sync(V);K.bulkOperationCheckpoint(G),Y.stop(),K.reportResults(B,X,$);let z=K.loadConfig(),W=z.remoteSync?.repositoryUrl,N=z.remoteSync?.enabled===!0&&typeof W==="string"&&W.trim().length>0,q=K.experimentalRemoteSync;if(N&&q){if(!$.quiet)console.log("Synchronizing events with remote Git repository...");try{let O=await(await K.createGitSyncer()).sync(z.machineId,W,z.remoteSync.autoPull,z.remoteSync.autoPush);if(O.success){if(O.rebuildNeeded){if(!$.quiet)console.log("Remote events pulled. Rebuilding database projections...");await K.rebuildProjections(G)}else if(!$.quiet)console.log("Git events are already up to date.")}else console.error(`Warning: Remote synchronization failed: ${O.error}`)}catch(L){console.error(`Warning: Remote synchronization failed to execute: ${A(L)}`)}}else if(N&&!$.quiet)console.warn("Remote synchronization is configured but disabled until Phase 38 readiness. Set MEMORY_EXPERIMENTAL_REMOTE_SYNC=1 only for explicit prototype testing.");if($.includeMemoryFiles===!0||z.legacyMemoryFiles?.enabled===!0||process.env.MEMORY_LEGACY_MEMORY_FILES==="1"){let L=await K.runMemoryFileSync(G,$);if(L)K.reportMemoryFileResults(L,$)}else if($.verbose&&!$.quiet)console.log(" Memory files: skipped (legacy opt-in disabled)");if(!$.dryRun)await K.runAmbientContextGeneration(G,$);let F=B.errors.length>0||B.aborted?1:0;if($.embed&&!$.dryRun){let L=process.env.MEMORY_EMBED_BACKGROUND==="1";try{await K.runEmbeddingPass(G,$)}catch(O){if($.json)console.error(r0(y$(O)));else if(!$.quiet)console.error(c(y$(O),{verbose:$.verbose}));return{exitCode:1}}finally{if(L)if(K.removeBackgroundLock)K.removeBackgroundLock();else{let{removeLock:O}=await Promise.resolve().then(() => ($9(),eZ));O()}}}return{exitCode:F}}catch(J){return Y.stop(),K.handleError(J,$),{exitCode:1}}finally{K.unregisterCleanup(_),K.closeDatabase(G)}}async function d6(){let{GitSyncer:$}=await Promise.resolve().then(() => (X5(),B8));return new $}async function p6(){let{rebuildProjections:$}=await Promise.resolve().then(() => (Y5(),U8));return $}QZ();J5();B5();V9();W9();_9();Q0();import{Command as Bz}from"commander";w0();import jK from"@inquirer/search";import xK from"@inquirer/select";import PK from"fuzzy";var r8=null,EK=null,DK=null;function o8(){if(r8!==null)return r8;return process.stdout.isTTY===!0}function t8(){return o8()}async function s8($){if(!o8())throw Error("Interactive picker requires TTY. Use --session <id> instead.");let{sessionRepo:Z,limit:K=100}=$,Y=(await Z.findFiltered({limit:K})).map((V)=>({value:V.id,name:`${V.projectPath.projectName} (${_0(V.startTime)})`,description:`${V.id.substring(0,8)}... | ${V.messages.length} messages`})),_=await(EK??jK)({message:"Search sessions (type to filter):",source:async(V,{signal:B})=>{if(B.aborted)return[];if(!V)return Y;return PK.filter(V,Y,{extract:(W)=>`${W.name} ${W.description}`}).map((W)=>W.original)},pageSize:10}),H=await(DK??xK)({message:"Action:",choices:[{value:"show",name:"Show session details"},{value:"search",name:"Search within session"},{value:"context",name:"Get project context"},{value:"related",name:"Find related sessions"},{value:"cancel",name:"Cancel"}]});if(H==="cancel")return null;return{sessionId:_,action:H}}E0();_9();QZ();V9();W9();u();M0();function kK($){return{dbPath:E(),show:I$,search:E$,context:M$,related:x$,...$}}async function e8($,Z={}){if(!t8())return console.error("Error: Interactive mode requires a terminal."),console.error("Use specific commands instead:"),console.error(" memory list - List sessions"),console.error(" memory show <id> - Show session details"),console.error(" memory search <q> - Search sessions"),{exitCode:1};let K=kK(Z),X={limit:"100",...$},Y=parseInt(X.limit,10),Q=K.dbPath,{db:G}=v({path:Q});try{let _=new g(G),J=await s8({sessionRepo:_,limit:Y});if(!J)return D(G),{exitCode:0};switch(D(G),J.action){case"show":await K.show(J.sessionId,{});break;case"search":await K.search("*",{session:J.sessionId});break;case"context":{let{db:H}=v({path:Q}),B=await new g(H).findById(J.sessionId);if(D(H),B)await K.context(B.projectPath.projectName,{});break}case"related":await K.related(J.sessionId,{});break}return{exitCode:0}}catch(_){let J=_ instanceof R?_:new R(T.DB_CONNECTION_FAILED,A(_));console.error(c(J));try{D(G)}catch{}return{exitCode:1}}}s0();Z0();X5();import{Command as jz}from"commander";z$();import{Command as Sz}from"commander";import{copyFileSync as SK,existsSync as $2,mkdirSync as vK}from"fs";import{dirname as CK,join as A5}from"path";async function Z2($,Z={}){let K=R0(Z.hookOverrides);if(K.sessionEnd&&K.preCompact&&!$.force)return console.log("Hooks are already installed."),console.log("Use --force to reinstall."),{exitCode:0};let X=a0(Z.hookOverrides);vK(CK(X),{recursive:!0});let Y=wK(Z.hookScriptSourceOverride);if(!Y)return console.error("Error: Hook script not found. Run 'bun run build:hook' first."),{exitCode:1};SK(Y,X),console.log(`Copied hook script to ${X}`);let Q=a$(Z.hookOverrides);if(console.log(Q.message),Q.success)console.log(`
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"),yK(Z.hookOverrides);else return{exitCode:1};return{exitCode:0}}function yK($){let Z=B$($);if(!Z.hooks)return;let K="memory-nexus",X=!1;for(let Y of Object.values(Z.hooks)){if(!Array.isArray(Y))continue;for(let Q of Y){if(!Q?.hooks)continue;for(let G of Q.hooks)if(G.command?.includes(K)){X=!0;break}if(X)break}if(X)break}if(X)console.error(`
1143
- Warning: Stale memory-nexus hook references detected in settings.json.`),console.error("Run 'memory uninstall' then 'memory install' to clean up.")}function wK($){if($!==void 0)return $2($)?$:null;let Z=A5(import.meta.dir,"../../../../dist/sync-hook.js"),K=A5(process.cwd(),"dist/sync-hook.js"),X=A5(process.cwd(),"dist","sync-hook.js");return[Z,K,X].find((Q)=>$2(Q))??null}z$();import{Command as fz}from"commander";import{existsSync as bK,unlinkSync as fK}from"fs";async function K2($,Z={}){let K=R0(Z.hookOverrides);if(!K.sessionEnd&&!K.preCompact)return console.log("Hooks are not installed."),{exitCode:0};if($.restore&&K.backupExists){if(_4(Z.hookOverrides))console.log("Restored settings.json from backup.")}else{let Y=i$(Z.hookOverrides);console.log(Y.message)}let X=a0(Z.hookOverrides);if(bK(X))fK(X),console.log("Removed hook script.");return console.log(`
1144
- Hooks uninstalled successfully.`),console.log("Sessions will no longer sync automatically."),console.log("Manual sync still available: memory sync"),{exitCode:0}}F$();import{Command as uz}from"commander";F$();p();u();AZ();E0();u();p();G9();import{existsSync as N5,readFileSync as hK,unlinkSync as gK}from"fs";import{join as mK}from"path";function cK($){let Z=0;if(!$.database.exists)Z++;if($.database.exists&&!$.database.readable)Z++;if($.database.exists&&!$.database.writable)Z++;if($.database.integrity==="corrupted")Z++;if(!$.permissions.configDir)Z++;if(!$.permissions.logsDir)Z++;if(!$.permissions.sourceDir)Z++;if(Z+=$.config.issues.length,$.llmExtraction&&!$.llmExtraction.ready)Z++;return Z}async function X2($,Z={}){if($.portability)return dK($,Z);if($.json){let X=await(Z.gatherStatus??(await Promise.resolve().then(() => (F$(),V5))).gatherStatus)({dbPath:Z.healthOverrides?.dbPath,logPath:Z.healthOverrides?.logsDir?z9(Z.healthOverrides.logsDir,"sync.log"):void 0,configPath:Z.healthOverrides?.configDir?z9(Z.healthOverrides.configDir,"config.json"):void 0,hookOverrides:Z.healthOverrides?.hookOverrides,fix:$.fix,stats:!1}),Y={database:X.health.database,permissions:X.health.permissions,hooks:{...X.health.hooks,lastRun:X.health.hooks.lastRun?.toISOString()??null},config:X.health.config,embedding:X.health.embedding,sqliteVec:X.health.sqliteVec,searchCapability:X.health.searchCapability,llmExtraction:X.health.llmExtraction,migration:X.migration,qmd:X.qmd};console.log(JSON.stringify(Y,null,2));let Q=0;if(!X.health.database.exists||X.health.database.integrity==="corrupted")Q=2;else if(cK(X.health)>0||!X.health.searchCapability.vectorReady)Q=1;return{exitCode:Q}}return h0({db:!0,hooks:!0,config:!0,embedding:!0,all:!0,fix:$.fix,json:$.json},{dbPath:Z.healthOverrides?.dbPath,logPath:Z.healthOverrides?.logsDir?z9(Z.healthOverrides.logsDir,"sync.log"):void 0,configPath:Z.healthOverrides?.configDir?z9(Z.healthOverrides.configDir,"config.json"):void 0,hookOverrides:Z.healthOverrides?.hookOverrides})}function uK($,Z=process.platform){if(Z==="win32")return $.includes("/")&&($.startsWith("/home")||$.startsWith("/mnt")||$.startsWith("/var")||$.startsWith("/usr")||$.startsWith("/"));return $.includes("\\")||/^[a-zA-Z]:/.test($)}async function dK($,Z={}){let K=N5,X=Z.healthOverrides?.dbPath??E(),Y=Z.healthOverrides?.sourceDir??t(),Q=$.json?!1:k(),G,_=[],J=[],H=[];if(!N5(X)){if($.json)console.log(JSON.stringify({error:"Database does not exist. Run 'memory sync' first."},null,2));else console.error(f("Error: Database does not exist. Run 'memory sync' first.",Q));return{exitCode:1}}try{G=v({path:X}).db;let M=await new g(G).findFiltered({limit:1e5});for(let x of M){let y=x.projectPath.decoded;if(uK(y)&&!_.includes(y))_.push(y);let J0=P0.resolveExistingPath(y,K);if(!K(J0)){if(!J.includes(y))J.push(y)}}}catch(L){let O=A(L);if($.json)console.log(JSON.stringify({error:`Portability scan failed: ${O}`},null,2));else console.error(f(`Portability scan failed: ${O}`,Q));return{exitCode:2}}finally{if(G)D(G)}let V=mK(Y,"embedding.lock"),B=!1,z=!1;if(N5(V)){B=!0;try{let L=hK(V,"utf-8"),O=JSON.parse(L);if(O.pid)process.kill(O.pid,0);else z=!0}catch(L){z=!0}}if(B&&z){if(H.push(V),$.fix)try{gK(V)}catch(L){}}let N=await(Z.gatherStatus??(await Promise.resolve().then(() => (F$(),V5))).gatherStatus)({dbPath:X,fix:!1,stats:!1}),q=N.health.sqliteVec.available,I=N.health.sqliteVec.version;if($.json)return console.log(JSON.stringify({portability:{mixedDialectPaths:_,orphanedPaths:J,staleLocks:H,sqliteVecAvailable:q,sqliteVecVersion:I,fixedStaleLocks:$.fix&&H.length>0}},null,2)),{exitCode:J.length>0||_.length>0||H.length>0&&!$.fix||!q?1:0};if(console.log("Portability & Migration Diagnostics"),console.log("=================================="),console.log(""),_.length===0)console.log(` ${b("[OK]",Q)} Path Dialects: No mixed path slashes/drive dialects detected.`);else{console.log(` ${d("[WARN]",Q)} Path Dialects: ${_.length} mixed slash/drive formats detected.`);for(let L of _)console.log(` - ${L}`)}if(J.length===0)console.log(` ${b("[OK]",Q)} Orphaned Workspaces: All session folders exist physically on disk.`);else{console.log(` ${d("[WARN]",Q)} Orphaned Workspaces: ${J.length} project folder(s) not found on active filesystem.`);for(let L of J)console.log(` - ${L}`)}if(H.length===0)console.log(` ${b("[OK]",Q)} Active Locks: No stale sync/embedding lock files detected.`);else if($.fix)console.log(` ${b("[FIXED]",Q)} Active Locks: Cleaned up ${H.length} stale lock file(s).`);else{console.log(` ${d("[WARN]",Q)} Active Locks: ${H.length} stale sync/embedding lock file(s) found.`);for(let L of H)console.log(` - ${L}`)}if(q)console.log(` ${b("[OK]",Q)} sqlite-vec: Loadable (v${I}) for active architecture.`);else console.log(` ${f("[FAIL]",Q)} sqlite-vec: Not loadable on this system architecture.`);if(console.log(""),J.length>0)console.log("\uD83D\uDCA1 [TIP] Orphaned project paths detected. You can safely prune these stale database records by running: memory purge --orphans"),console.log("");return{exitCode:J.length>0||_.length>0||H.length>0&&!$.fix||!q?1:0}}function z9(...$){if($.some((Z)=>Z===void 0))return;return $.join("/")}E0();u();AZ();import{Command as XA,Option as YA}from"commander";import*as Y2 from"readline";import{existsSync as pK}from"fs";function Q2($){let Z=$.match(/^(\d+)([dmy])$/i);if(!Z)throw Error(`Invalid duration format: "${$}". Use format like "30d" (days), "6m" (months), or "1y" (years).`);let K=parseInt(Z[1],10),X=Z[2].toLowerCase();if(K<=0)throw Error("Duration value must be a positive number.");let Y=new Date,Q;switch(X){case"d":Q=new Date(Y.getTime()-K*24*60*60*1000);break;case"m":Q=new Date(Y.getFullYear(),Y.getMonth()-K,Y.getDate());break;case"y":Q=new Date(Y.getFullYear()-K,Y.getMonth(),Y.getDate());break;default:throw Error(`Unknown duration unit: "${X}"`)}return Q}function GZ($){return $.toISOString().split("T")[0]}async function lK($){let Z=Y2.createInterface({input:process.stdin,output:process.stdout});return new Promise((K)=>{Z.question($,(X)=>{Z.close(),K(X.toLowerCase()==="y"||X.toLowerCase()==="yes")})})}async function G2($,Z={}){let K=Z.askConfirmation??lK,X=Z.existsSync??pK,Y=Z.getDefaultDbPath??E,Q=Z.initializeDatabase??v,G=Z.closeDatabase??D,_=Z.createSessionRepository??((B)=>new g(B));if(!$.olderThan&&!$.orphans){if($.json)console.log(JSON.stringify({error:"Please specify either --older-than <duration> or --orphans."},null,2));else console.error("Error: Please specify either --older-than <duration> or --orphans.");return{exitCode:1}}let J;if($.olderThan)try{J=Q2($.olderThan)}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:z},null,2));else console.error(`Error: ${z}`);return{exitCode:1}}let H=Z.dbPath??Y(),V;try{V=Q({path:H}).db}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:`Database error: ${z}`},null,2));else console.error("Error: Database not found or could not be opened.");return{exitCode:1}}try{let B=_(V),z=new Map;if(J){let q=await B.findOlderThan(J);for(let I of q)z.set(I.id,I)}if($.orphans){let q=await B.findFiltered({limit:1e5});for(let I of q){let F=I.projectPath.decoded,L=P0.resolveExistingPath(F,X);if(!X(L))z.set(I.id,I)}}let W=z.size;if(W===0){if($.json)console.log(JSON.stringify({sessionsDeleted:0,cutoffDate:J?.toISOString()??null,dryRun:$.dryRun??!1,message:J&&!$.orphans?`No sessions older than ${GZ(J)}`:"No sessions matched the purge criteria."},null,2));else if(!$.quiet)if(J&&!$.orphans)console.log(`No sessions older than ${GZ(J)}.`);else console.log("No sessions matched the purge criteria.");return{exitCode:0}}if($.dryRun){let q=Array.from(z.values());if($.json)console.log(JSON.stringify({sessionsToDelete:W,cutoffDate:J?.toISOString()??null,dryRun:!0,sessions:q.map((I)=>({id:I.id,project:I.projectPath.projectName,startTime:I.startTime.toISOString(),messageCount:I.messageCount}))},null,2));else if($.quiet)console.log(W.toString());else{if(J&&!$.orphans)console.log(`Would delete ${W} session(s) older than ${GZ(J)}:
1145
- `);else console.log(`Would delete ${W} session(s):
1146
- `);let I=k();for(let F of q){let L=F.id.substring(0,16),O=F.projectPath.projectName,M=F.startTime.toISOString().split("T")[0],x=F.messageCount;if(I)console.log(` \x1B[33m${L}\x1B[0m ${O} ${M} (${x} messages)`);else console.log(` ${L} ${O} ${M} (${x} messages)`)}}return{exitCode:0}}if(!$.force){if(!await K(J&&!$.orphans?`Delete ${W} session(s) older than ${GZ(J)}? This cannot be undone. (y/n) `:`Delete ${W} session(s)? This cannot be undone. (y/n) `)){if($.json)console.log(JSON.stringify({cancelled:!0},null,2));else if(!$.quiet)console.log("Purge cancelled.");return{exitCode:0}}}if(V.transaction(()=>{for(let q of z.keys())B.delete(q)}).immediate(),$.json)console.log(JSON.stringify({sessionsDeleted:W,cutoffDate:J?.toISOString()??null,dryRun:!1},null,2));else if($.quiet)console.log(W.toString());else if(J&&!$.orphans)console.log(`Deleted ${W} session(s) older than ${GZ(J)}.`);else console.log(`Deleted ${W} session(s).`);return{exitCode:0}}catch(B){let z=A(B);if($.json)console.log(JSON.stringify({error:z},null,2));else console.error(`Error: ${z}`);return{exitCode:2}}finally{if(V)G(V)}}import{Command as zA}from"commander";u();p();z$();u();import{Command as RA,Option as FA}from"commander";XZ();import{existsSync as _2}from"fs";import{dirname as nK}from"path";async function J2($,Z={}){let K=nK($);if(K!=="."&&!_2(K))return console.error(`Error: Directory does not exist: ${K}`),{exitCode:1};let X=E();if(!_2(X))return console.error("Error: Database does not exist. Run 'memory sync' first."),{exitCode:1};let{db:Y}=v({path:X});try{let Q=await F9(Y,$,{includeSensitive:Z.includeSensitive,redactor:new o0});if(Z.json)console.log(JSON.stringify({success:!0,path:$,stats:Q},null,2));else if(Z.quiet)console.log($);else console.log(aK(Q,$));return{exitCode:0}}catch(Q){let G=A(Q);if(Z.json)console.log(JSON.stringify({success:!1,error:G},null,2));else console.error(`Error: ${G}`);return{exitCode:1}}finally{D(Y)}}function aK($,Z){let K=[];return K.push(`Exported ${$.sessions} sessions, ${$.messages} messages to ${Z}`),K.push(""),K.push("Details:"),K.push(` Sessions: ${$.sessions}`),K.push(` Messages: ${$.messages}`),K.push(` Tool uses: ${$.toolUses}`),K.push(` Entities: ${$.entities}`),K.push(` Links: ${$.links}`),K.push(` File size: ${iK($.bytes)}`),K.join(`
1147
- `)}function iK($){if($===0)return"0 B";let Z=["B","KB","MB","GB"],K=1024,X=Math.floor(Math.log($)/Math.log(K));return`${($/Math.pow(K,X)).toFixed(X>0?1:0)} ${Z[X]}`}u();import{Command as vA,Option as CA}from"commander";import{existsSync as rK}from"fs";async function H2($,Z={}){if(!rK($))return _Z("File does not exist",$,Z),{exitCode:1};let K=await qZ($);if(!K.valid)return _Z(`Invalid backup file: ${K.error}`,$,Z),{exitCode:1};let X=E(),{db:Y}=v({path:X});try{if(j9(Y)&&!Z.clear&&!Z.force){if(!Z.json&&!Z.quiet)console.log("Warning: Database contains existing data."),console.log("Use --clear to replace all data, or --force to merge without prompt.");if(!process.stdout.isTTY)return _Z("Cannot merge with existing data in non-interactive mode. Use --clear or --force.",$,Z),{exitCode:1};return _Z("Use --clear to replace data or --force to merge",$,Z),{exitCode:1}}let G=await M9(Y,$,{clearExisting:Z.clear});if(Z.json){let _={success:!0,path:$,version:K.version,stats:G,cleared:Z.clear??!1};console.log(JSON.stringify(_,null,2))}else if(Z.quiet);else console.log(oK(G,$,Z.clear??!1));return{exitCode:0}}catch(Q){let G=A(Q);return _Z(G,$,Z),{exitCode:1}}finally{D(Y)}}function _Z($,Z,K){if(K.json)console.log(JSON.stringify({success:!1,path:Z,error:$},null,2));else console.error(`Error: ${$}`)}function oK($,Z,K){let X=[],Y=K?"Replaced":"Imported";return X.push(`${Y} ${$.sessions} sessions, ${$.messages} messages from ${Z}`),X.push(""),X.push("Details:"),X.push(` Sessions: ${$.sessions}`),X.push(` Messages: ${$.messages}`),X.push(` Tool uses: ${$.toolUses}`),X.push(` Entities: ${$.entities}`),X.push(` Links: ${$.links}`),X.join(`
1148
- `)}import{Command as mA}from"commander";function tK($){return $==="bash"||$==="zsh"||$==="fish"}function sK(){return`# memory bash completion
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 sync_opts="--force --dry-run --verbose --quiet"
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 eK(){return`#compdef memory
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 $X(){return`# memory fish completion
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 ZX($){switch($){case"bash":return sK();case"zsh":return eK();case"fish":return $X();default:throw Error(`Unknown shell type: ${$}`)}}function V2($){if(!tK($))return console.error(`Error: Invalid shell type '${$}'`),console.error("Valid shells: bash, zsh, fish"),{exitCode:1};let Z=ZX($);return console.log(Z),{exitCode:0}}Q0();u();import{Command as XN,Option as YN}from"commander";import{join as _X}from"path";import{homedir as JX}from"os";M0();async function W2($,Z){if(!Z.description)return console.error("Error: description is required for log action"),{exitCode:1};let K=await $.log({description:Z.description,severity:Z.severity,category:Z.category,tool:Z.tool,context:Z.context,sourceProject:Z.source});if(Z.json)console.log(JSON.stringify({id:K.id,description:K.description,severity:K.severity,category:K.category,tool:K.tool,status:K.status,loggedAt:K.loggedAt.toISOString(),context:K.context??null,sourceProject:K.sourceProject??null}));else console.log(`Logged friction #${K.id} (${K.severity}/${K.category})`);return{exitCode:0}}async function B2($,Z){let K=Z.limit?parseInt(Z.limit,10):void 0,X=await $.list({all:Z.all,status:Z.status,category:Z.category,tool:Z.tool,limit:K});if(Z.json)console.log(JSON.stringify(X.map((Y)=>({id:Y.id,description:Y.description,severity:Y.severity,category:Y.category,tool:Y.tool,status:Y.status,loggedAt:Y.loggedAt.toISOString(),resolvedAt:Y.resolvedAt?.toISOString()??null,resolution:Y.resolution??null,context:Y.context??null,sourceProject:Y.sourceProject??null,lastReviewedAt:Y.lastReviewedAt?.toISOString()??null}))));else if(X.length===0)console.log(Z.all?"No friction entries found.":"No open friction entries.");else{console.log(`${"".padEnd(5)}${"ID".padEnd(6)}${"Severity".padEnd(10)}${"Category".padEnd(14)}${"Description".padEnd(62)}Age`),console.log("-".repeat(101));let Y=0,Q={};for(let H of X){let V=!H.lastReviewedAt||H.lastReviewedAt<H.loggedAt;if(V)Y++;Q[H.severity]=(Q[H.severity]??0)+1;let B=V?"[NEW]":" ",z=H.description.length>60?H.description.slice(0,57)+"...":H.description,W=Date.now()-H.loggedAt.getTime(),N=Math.floor(W/86400000),q=N===0?"today":`${N}d`;console.log(`${B}${String(H.id).padEnd(6)}${H.severity.padEnd(10)}${H.category.padEnd(14)}${z.padEnd(62)}${q}`)}let G=Object.entries(Q).map(([H,V])=>`${V} ${H}`).join(", "),_=Z.tool?` for ${Z.tool}`:"",J=Y>0?` -- ${Y} new since last review`:"";console.log(`
1546
- ${X.length} ${Z.all?"total":"open"} entries${_} (${G})${J}`)}if(Z.tool)await $.markReviewed(Z.tool);return{exitCode:0}}async function z2($,Z){if(!Z.id||!Z.resolution)return console.error("Error: id and --resolution are required for resolve action"),{exitCode:1};let K=parseInt(Z.id,10);if(isNaN(K))return console.error("Error: id must be a number"),{exitCode:1};if(await $.resolve(K,Z.resolution),Z.json)console.log(JSON.stringify({id:K,status:"resolved",resolution:Z.resolution}));else console.log(`Resolved friction #${K}`);return{exitCode:0}}async function A2($,Z){if(!Z.id||!Z.resolution)return console.error("Error: id and --resolution are required for wont-fix action"),{exitCode:1};let K=parseInt(Z.id,10);if(isNaN(K))return console.error("Error: id must be a number"),{exitCode:1};if(await $.wontFix(K,Z.resolution),Z.json)console.log(JSON.stringify({id:K,status:"wont-fix",resolution:Z.resolution}));else console.log(`Marked friction #${K} as won't fix`);return{exitCode:0}}import{exec as KX}from"child_process";import{mkdirSync as XX,writeFileSync as YX}from"fs";import{join as QX}from"path";import{platform as N2}from"os";F0();p();async function q2($,Z,K=GX){let X=await $.getStats(),Y=await $.getWeeklyTrends(12),Q=await $.list({tool:Z.tool}),G=await $.detectPatterns();if(Z.html){let _=l4(X,Y,Q,G),J=MZ();XX(J,{recursive:!0});let H=QX(J,"dashboard.html");if(YX(H,_,"utf-8"),!Z.json)console.log(`Dashboard written to ${H}`),K(H)}else if(Z.json)console.log(JSON.stringify({stats:X,trends:Y,patterns:G},null,2));else{let _=p4(X,Y,Q,k(),G);if(Z.format==="ai")_=a(_);console.log(_)}return{exitCode:0}}function GX($){let Z=N2()==="win32"?"start":N2()==="darwin"?"open":"xdg-open";KX(`${Z} "${$}"`)}async function O2($,Z){if(!Z.pattern)return console.error("Error: pattern is required for purge action"),{exitCode:1};if(Z.dryRun){let Y=(await $.list({all:!0})).filter((Q)=>{return new RegExp("^"+Z.pattern.replace(/%/g,".*").replace(/_/g,".")+"$").test(Q.description)});if(Y.length===0)if(Z.json)console.log(JSON.stringify({wouldDelete:0,pattern:Z.pattern}));else console.log(`No entries match pattern: "${Z.pattern}"`);else if(Z.json)console.log(JSON.stringify({wouldDelete:Y.length,pattern:Z.pattern}));else{console.log(`Would delete ${Y.length} entries matching "${Z.pattern}":`);for(let Q of Y.slice(0,10))console.log(` #${Q.id}: ${Q.description}`);if(Y.length>10)console.log(` ... and ${Y.length-10} more`)}return{exitCode:0}}if(!Z.force)return console.error(`Use --dry-run to preview or --force to delete entries matching "${Z.pattern}".`),{exitCode:1};let K=await $.purge(Z.pattern);if(K===0)if(Z.json)console.log(JSON.stringify({deleted:0,pattern:Z.pattern}));else console.log(`No entries match pattern: "${Z.pattern}"`);else if(Z.json)console.log(JSON.stringify({deleted:K,pattern:Z.pattern}));else console.log(`Purged ${K} friction entries matching "${Z.pattern}"`);return{exitCode:0}}async function U2($,Z={}){let K;try{let X=Z.dbPath??E();K=v({path:X}).db;let Y=new k0(K),Q=new UZ(Y),G=_X(JX(),".claude","friction.jsonl"),_=await Q.ingestFallbackFile(G);if(_>0)process.stderr.write(`Ingested ${_} friction entries from fallback file
1547
- `);switch($.action){case"log":return await W2(Q,$);case"list":return await B2(Q,$);case"resolve":return await z2(Q,$);case"wont-fix":return await A2(Q,$);case"dashboard":return await q2(Q,$,Z.openInBrowser);case"purge":return await O2(Q,$);default:return console.error(`Unknown friction action: ${$.action}`),{exitCode:1}}}catch(X){let Y=X instanceof R?X:new R(T.UNKNOWN,A(X));if($.json)console.log(r0(Y));else console.error(c(Y));return{exitCode:1}}finally{if(K)D(K)}}import{Command as IN}from"commander";u();X$();E0();h$();Z0();import{Command as DN}from"commander";v$();Y5();S$();L0();XZ();wZ();class HX{current=0;total=0;isTty=process.stdout.isTTY;quiet=!1;constructor($,Z=!1){if(this.total=$,this.quiet=Z,this.quiet)return;if(this.isTty)process.stdout.write(`\rExtracting facts... [0/${$}] \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 0%`);else console.log(`Extracting facts from ${$} sessions...`)}update($){if(this.quiet)return;this.current++;let Z=Math.round(this.current/this.total*100),K=Math.min(10,Math.max(0,Math.floor(Z/10))),X="\u2588".repeat(K)+"\u2591".repeat(10-K);if(this.isTty){let Y=$.length>25?$.substring(0,22)+"...":$;process.stdout.write(`\rExtracting facts... [${this.current}/${this.total}] [${X}] ${Z}% - Session: ${Y}`)}else console.log(`[${this.current}/${this.total}] Processed session: ${$}`)}stop(){if(this.quiet)return;if(this.isTty)process.stdout.write(`
1548
- `)}}u();X$();import{Command as lN}from"commander";export{qZ as validateExportFile,A as unknownErrorMessage,u0 as sanitizeFtsQuery,x9 as reciprocalRankFusion,M9 as importFromJson,j9 as hasExistingData,P5 as extractSessionId,F9 as exportToJson,K2 as executeUninstallCommand,L8 as executeSyncCommand,h0 as executeStatusCommand,H9 as executeStatsCommand,I$ as executeShowCommand,E$ as executeSearchCommand,x$ as executeRelatedCommand,B9 as executeQueryCommand,G2 as executePurgeCommand,J9 as executeListCommand,Z2 as executeInstallCommand,H2 as executeImportCommand,U2 as executeFrictionCommand,J2 as executeExportCommand,X2 as executeDoctorCommand,M$ as executeContextCommand,V2 as executeCompletionCommand,e8 as executeBrowseCommand,I9 as computeModelHash,n2 as applyTemporalDecayWithExemptions,p2 as applyTemporalDecay,P9 as allocateBudget,z0 as ToolUse,NZ as SyncService,f$ as SmartContextService,B0 as Session,Y0 as SearchResult,C$ as SearchQuery,x5 as RecoveryService,U9 as QueryParser,i as ProjectPath,E5 as PatternExtractor,P0 as PathDecoder,W0 as Message,OZ as MemoryFileSyncService,m0 as MemoryFile,R as MemoryError,q0 as LlmExtractor,$$ as Link,UZ as FrictionService,x0 as FrictionEntry,A0 as Fact,$0 as ExtractionState,T as ErrorCode,e as Entity,T9 as EmbeddingService,X0 as EmbeddingResult,zZ as EmbeddingConfig,N0 as ContentExtractor,l2 as CURATED_FILE_TYPES,c0 as BackfillState,S5 as BackfillService,E9 as AmbientContextService};
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};