@xenosystem/agent-sdk 0.10.28 → 0.10.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/index.cjs +1 -1
- package/dist/artifacts/index.js +1 -1
- package/dist/automation/index.cjs +1 -1
- package/dist/automation/index.js +1 -1
- package/dist/control-plane/index.cjs +1 -1
- package/dist/control-plane/index.js +1 -1
- package/dist/electron/index.cjs +1 -1
- package/dist/electron/index.d.cts +13 -0
- package/dist/electron/index.d.ts +13 -0
- package/dist/electron/index.js +1 -1
- package/dist/electron/metafile-cjs.json +1 -1
- package/dist/electron/metafile-esm.json +1 -1
- package/dist/hosted/index.cjs +1 -1
- package/dist/hosted/index.js +1 -1
- package/dist/hosted/metafile-cjs.json +1 -1
- package/dist/hosted/metafile-esm.json +1 -1
- package/dist/index.cjs +303 -303
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +280 -280
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/session/index.cjs +26 -26
- package/dist/session/index.d.cts +15 -0
- package/dist/session/index.d.ts +15 -0
- package/dist/session/index.js +25 -25
- package/dist/session/metafile-cjs.json +1 -1
- package/dist/session/metafile-esm.json +1 -1
- package/package.json +1 -1
package/dist/electron/index.js
CHANGED
|
@@ -56,7 +56,7 @@ ${this.stringify(e.data)}
|
|
|
56
56
|
`)+`
|
|
57
57
|
`;await me(this.transcriptPath,a);let c=this.buildMarkdownDocument(i,"session store");if(await me(this.markdownPath,c),!this.workspaceMirrorDisabled){let l=await this.resolveWorkspaceMarkdownPath();if(l)try{let u=this.buildMarkdownDocument(i,"workspace mirror");await me(l,u)}catch(u){this.workspaceMirrorDisabled=!0,At("Transcript workspace mirror disabled",u)}}}async truncateAfterMessageCount(e){let n=await ce(this.transcriptPath);if(!n)return;let r=fr(n),o=Math.max(0,e),s=0,i=[];for(let l of r){if(l.type==="user_message"||l.type==="assistant_message"){if(s>=o)break;s+=1}i.push(l)}let a=i.length>0?i.map(l=>JSON.stringify(l)).join(`
|
|
58
58
|
`)+`
|
|
59
|
-
`:"";await me(this.transcriptPath,a);let c=this.buildMarkdownDocument(i,"session store");if(await me(this.markdownPath,c),!this.workspaceMirrorDisabled){let l=await this.resolveWorkspaceMarkdownPath();if(l)try{let u=this.buildMarkdownDocument(i,"workspace mirror");await me(l,u)}catch(u){this.workspaceMirrorDisabled=!0,At("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let e=await ce(this.transcriptPath);if(!e){this.sequence=0;return}let n=fr(e);if(n.length===0){this.sequence=0;return}let r=n[n.length-1];this.sequence=r.sequence+1}catch(e){let n=e instanceof Error?e.message:String(e);At(`Transcript initialization warning: ${n}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};import*as hr from"path";import{randomUUID as ox}from"crypto";import{stat as sx}from"fs/promises";var Z0={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit",CoordinationSend:"Send",CoordinationQuery:"Receive"};function V(t){return Z0[t]??t}var ex=new Set(["Read","ToolOutput","Glob","Grep","LS","MemoryRead","Think","dispatch_agent","ElfAnalyze","Receive","ListAgents","ListSessions","CoordinationQuery"]),tx=new Set(["Write","Edit","Patch","MemoryWrite","Send","CoordinationSend"]),nx=new Set(["Bash"]),rx=new Set(["Read","ToolOutput","ReadImage","ElfAnalyze","LS","Glob","Grep","WebSearch","WebFetch","GitStatus","GitDiff","GitLog","GitBranch"]);function Po(t){return rx.has(V(t))}function Io(t){let e=V(t);return nx.has(e)?"high":ex.has(e)?"low":(tx.has(e),"medium")}function pt(t,e,n){return{definition:{...e.definition,name:t,...n?{description:n}:{}},execute:e.execute,...e.readOnly!==void 0?{readOnly:e.readOnly}:{}}}var Ao=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(e,n){this.sessionDir=e,this.checkpointsDir=hr.join(e,"checkpoints"),this.autoInterval=n?.autoInterval??10}async initialize(){let e=await this.list();e.length>0&&(this.lastCheckpointMessageCount=e[0].messageCount)}async create(e){await dt(this.checkpointsDir);let n=ox(),r={id:n,name:e.description,trigger:e.trigger,createdAt:new Date().toISOString(),messageCount:e.messages.length,tokenCount:this.estimateTokens(e.messages)},o={info:r,messages:e.messages},s=hr.join(this.checkpointsDir,`${n}.json`);return await me(s,JSON.stringify(o,null,2)),this.lastCheckpointMessageCount=e.messages.length,r}async list(){let e=await Ed(this.checkpointsDir,/\.json$/),n=[];for(let r of e){let o=await ce(r);if(o){let s=Re(o,null);if(s){let i=await sx(r);n.push({info:s.info,modifiedAtMs:i.mtimeMs})}}}return n.sort((r,o)=>new Date(o.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||o.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(e){let n=hr.join(this.checkpointsDir,`${e}.json`),r;try{r=await ce(n)}catch(s){let i=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${e}: ${i}`)}if(!r)throw new Error(`Checkpoint not found: ${e} (path: ${n})`);let o=Re(r,null);if(!o)throw new Error(`Invalid checkpoint data for ${e}: JSON parse failed`);if(!o.messages||!Array.isArray(o.messages))throw new Error(`Invalid checkpoint data for ${e}: missing or invalid messages array`);if(!o.info)throw new Error(`Invalid checkpoint data for ${e}: missing info object`);return{messages:o.messages,info:o.info}}shouldAutoCheckpoint(e){return e-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(e,n){if(e=V(e),e==="Write")return!0;if(e==="Bash"){let o=n.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(i=>o.includes(i))}return!1}async delete(e){let n=hr.join(this.checkpointsDir,`${e}.json`);await vo(n)}estimateTokens(e){let n=0;for(let r of e)if(typeof r.content=="string")n+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let o of r.content)"text"in o&&(n+=Math.ceil(o.text.length/4));return n}};var br=class{static async fork(e,n){let r=await this.find(e);if(!r)throw new Error(`Session not found: ${e}`);let o=this.getSessionDir(e),s=new gr(o),i=n?.checkpointId?await new Ao(o).restore(n.checkpointId):null,a=i?.messages??await s.getMessages(),c=await s.read(),l=0,u=!1,d=c.filter(b=>{if(b.type==="session_start"||b.type==="session_end"||b.type==="checkpoint"||u)return!1;if(b.type==="user_message"||b.type==="assistant_message"){if(i&&l>=i.info.messageCount)return u=!0,!1;l+=1}return!0}),m=Ud(r.role),p=this.getSessionDir(m);await dt(p);let g=new Date().toISOString(),f={...r,id:m,name:n?.name??(r.name?`${r.name} (fork)`:void 0),status:"completed",parentSession:r.id,createdAt:g,updatedAt:g,lastActivity:g,checkpoints:[],messageCount:a.length,tokenUsage:{...r.tokenUsage}};await me(Ge.join(p,"meta.json"),JSON.stringify(f,null,2));let h=new gr(p);await h.append({type:"session_start",data:{sessionId:m,role:r.role,workingDirectory:r.workingDirectory,model:r.model,formatVersion:r.formatVersion,forkedFrom:r.id,...n?.checkpointId?{checkpointId:n.checkpointId}:{}}});for(let b of d)await h.append({type:b.type,data:b.data});return await h.flush(),f}static async setTitle(e,n){let r=typeof n=="string"?n.replace(/\s+/g," ").trim().slice(0,200):"";return this.updateMeta(e,{name:r||void 0})}static async setPinned(e,n){return this.updateMeta(e,n?{pinned:!0,pinnedAt:new Date().toISOString()}:{pinned:void 0,pinnedAt:void 0})}static async setArchived(e,n){let r=await this.find(e);if(!r)throw new Error(`Session not found: ${e}`);return n?this.updateMeta(e,{status:"archived"}):r.status!=="archived"?r:this.updateMeta(e,{status:"completed"})}static getSessionsDir(){let e=Ne();return Ge.join(e,"sessions")}static async list(e){let n=this.getSessionsDir(),r=typeof e?.limit=="number"&&Number.isFinite(e.limit)?Math.max(0,Math.floor(e.limit)):void 0;if(r===0)return[];let o=e?.workingDirectory?this.normalizeWorkingDirectory(e.workingDirectory):void 0;if(!To(n))return[];let s=await Sd(n),i=[];for(let a of s){let c=await this.loadMeta(a);c&&(e?.status&&!e.status.includes(c.status)||c.status==="archived"&&!e?.includeArchived&&!e?.status?.includes("archived")||e?.role&&c.role!==e.role||o&&this.normalizeWorkingDirectory(c.workingDirectory)!==o||i.push(c))}return i.sort((a,c)=>{if(!!a.pinned!=!!c.pinned)return a.pinned?-1:1;if(a.pinned&&c.pinned){let l=new Date(c.pinnedAt??0).getTime()-new Date(a.pinnedAt??0).getTime();if(l!==0)return l}return new Date(c.lastActivity).getTime()-new Date(a.lastActivity).getTime()}),r!==void 0?i.slice(0,r):i}static async find(e){let n=this.getSessionsDir(),r=F(n,e);return await this.loadMeta(r)}static async findMostRecent(e){let n=typeof e=="string"?{role:e}:e??{};if(n.workingDirectory){let s=await Bd(n.workingDirectory,{...n.role!==void 0?{role:n.role}:{}});if(s){let i=await this.find(s.sessionId);if(i){if(!(n.role&&i.role!==n.role)){if(this.normalizeWorkingDirectory(i.workingDirectory)===this.normalizeWorkingDirectory(n.workingDirectory))return i}}else await la(s.sessionId)}}let o=(await this.list({...n.role!==void 0?{role:n.role}:{},...n.workingDirectory!==void 0?{workingDirectory:n.workingDirectory}:{},limit:1}))[0]??null;if(o&&n.workingDirectory)try{await $d({cwd:o.workingDirectory,sessionId:o.id,role:o.role,endedAt:o.lastActivity})}catch{}return o}static async delete(e){let n=this.getSessionsDir(),r=F(n,e);await _d(r),await la(e)}static async purgeWorkingDirectory(e,n){let r=new Set(n?.excludeSessionIds??[]),o=await this.list({workingDirectory:e}),s=[],i=[];for(let a of o){if(r.has(a.id)){i.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(e,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:i}}static async updateMeta(e,n){let r=this.getSessionsDir(),o=F(r,e),s=Ge.join(o,"meta.json"),i=await ce(s);if(!i)throw new Error(`Session not found: ${e}`);let a=Re(i,null);if(!a)throw new Error(`Invalid session metadata: ${e}`);let c={...a,...n,updatedAt:new Date().toISOString()};return aa(c.executionMode),await me(s,JSON.stringify(c,null,2)),c}static async loadMeta(e){let n=Ge.join(e,"meta.json"),r=await ce(n);if(!r)return null;let o=Re(r,null);if(!o)return null;aa(o.executionMode);let s=o.formatVersion;return{...o,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:bd}}static getSessionDir(e){return F(this.getSessionsDir(),e)}static normalizeWorkingDirectory(e){let n=Ge.normalize(e).replace(/[\\/]+$/,""),r=n.length>0?n:Ge.parse(Ge.normalize(e)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(e,n){let r=Ge.join(e,".xeno","sessions",`${n}.md`);await vo(r)}};var Ro=class{cwd;globalDir;role;sessionDir;scope;budgets;projectSessionContextDefaults;constructor(e){this.cwd=e.cwd,this.globalDir=e.globalDir||Ne(),this.role=e.role,this.sessionDir=e.sessionDir,this.scope=e.scope??"user",this.budgets={...yd,...e.budgets},this.projectSessionContextDefaults={limit:e.projectSessionContext?.limit??3,maxTokens:e.projectSessionContext?.maxTokens??700,maxCharsPerSession:e.projectSessionContext?.maxCharsPerSession??2400}}get accessScope(){return this.scope}canAccessLevel(e){return this.scope==="none"?!1:this.scope==="session"?e==="session":this.scope==="project"?e==="project"||e==="role"||e==="session":!0}assertLevelAccess(e){if(!this.canAccessLevel(e))throw new Error(`MemoryManager: Memory level '${e}' exceeds active '${this.scope}' memory scope`)}getProjectSessionContextDefaults(){return{...this.projectSessionContextDefaults}}getPath(e){this.assertLevelAccess(e);let n=wd[e];switch(e){case"global":return F(ft.join(this.globalDir,"memory"),n);case"project":return F(ft.join(this.cwd,".xeno","memory"),n);case"role":if(!this.role)throw new Error("MemoryManager: Role configuration required but not provided");return F(ft.join(this.cwd,".xeno","roles",this.role),n);case"session":if(!this.sessionDir)throw new Error("MemoryManager: Session directory configuration required but not provided");return F(this.sessionDir,n);default:throw new Error(`MemoryManager: Unknown memory level: ${e}`)}}async loadForPrompt(){let e=[];this.canAccessLevel("global")&&e.push("global"),this.canAccessLevel("project")&&e.push("project"),this.role&&this.canAccessLevel("role")&&e.push("role"),this.sessionDir&&this.canAccessLevel("session")&&e.push("session");let n=[],r={global:"",project:"",role:"",session:""},o=0,s=!1;for(let i of e)try{let a=this.getPath(i),c=await ce(a);if(c){let l=this.budgets[i],u=ue(c),d=c;u>l&&(d=this.truncateContent(c,l),s=!0);let m=ue(d);n.push({level:i,path:a,content:d,tokenCount:m}),r[i]=d,o+=m}}catch(a){Ee(`Failed to load ${i} memory`,a)}if(o>this.budgets.total){let i=this.budgets.total/o;for(let a of n){let c=Math.max(1,Math.floor(a.tokenCount*i));a.content=Xe(a.content,c),a.tokenCount=ue(a.content),r[a.level]=a.content}o=n.reduce((a,c)=>a+c.tokenCount,0),s=!0}return{files:n,byLevel:r,totalTokens:o,truncated:s}}async loadProjectSessionContext(e){if(!this.canAccessLevel("project"))return{entries:[],totalTokens:0,truncated:!1,content:""};let n=Math.max(1,Math.min(e?.limit??this.projectSessionContextDefaults.limit,10)),r=Math.max(n*20,120),o=Math.max(120,e?.maxTokens??this.projectSessionContextDefaults.maxTokens),s=Math.max(200,e?.maxCharsPerSession??this.projectSessionContextDefaults.maxCharsPerSession),i=e?.excludeSessionId,a={entries:[],totalTokens:0,truncated:!1,content:""};try{let c=await br.list({limit:r}),l=this.filterProjectSessions(c,i),u=[],d=[],m=0,p=!1;for(let f of l){if(u.length>=n)break;let h=ft.join(br.getSessionDir(f.id),"transcript.md"),b=await ce(h);if(!b)continue;let w=this.extractRecentTranscriptExcerpt(b,s);if(!w)continue;let x={sessionId:f.id,model:f.model,lastActivity:f.lastActivity,messageCount:f.messageCount,excerpt:w},y=this.formatProjectSessionEntry(x),T=ue(y);if(m+T>o){if(u.length===0){let v=Xe(y,o);v.trim().length>0&&(u.push(x),d.push(v),m+=ue(v))}p=!0;break}u.push(x),d.push(y),m+=T}if(u.length===0)return a;let g=["# Project Session History","",...d].join(`
|
|
59
|
+
`:"";await me(this.transcriptPath,a);let c=this.buildMarkdownDocument(i,"session store");if(await me(this.markdownPath,c),!this.workspaceMirrorDisabled){let l=await this.resolveWorkspaceMarkdownPath();if(l)try{let u=this.buildMarkdownDocument(i,"workspace mirror");await me(l,u)}catch(u){this.workspaceMirrorDisabled=!0,At("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let e=await ce(this.transcriptPath);if(!e){this.sequence=0;return}let n=fr(e);if(n.length===0){this.sequence=0;return}let r=n[n.length-1];this.sequence=r.sequence+1}catch(e){let n=e instanceof Error?e.message:String(e);At(`Transcript initialization warning: ${n}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};import*as hr from"path";import{randomUUID as ox}from"crypto";import{stat as sx}from"fs/promises";var Z0={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit",CoordinationSend:"Send",CoordinationQuery:"Receive"};function V(t){return Z0[t]??t}var ex=new Set(["Read","ToolOutput","Glob","Grep","LS","MemoryRead","Think","dispatch_agent","ElfAnalyze","Receive","ListAgents","ListSessions","CoordinationQuery"]),tx=new Set(["Write","Edit","Patch","MemoryWrite","Send","CoordinationSend"]),nx=new Set(["Bash"]),rx=new Set(["Read","ToolOutput","ReadImage","ElfAnalyze","LS","Glob","Grep","WebSearch","WebFetch","GitStatus","GitDiff","GitLog","GitBranch"]);function Po(t){return rx.has(V(t))}function Io(t){let e=V(t);return nx.has(e)?"high":ex.has(e)?"low":(tx.has(e),"medium")}function pt(t,e,n){return{definition:{...e.definition,name:t,...n?{description:n}:{}},execute:e.execute,...e.readOnly!==void 0?{readOnly:e.readOnly}:{}}}var Ao=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(e,n){this.sessionDir=e,this.checkpointsDir=hr.join(e,"checkpoints"),this.autoInterval=n?.autoInterval??10}async initialize(){let e=await this.list();e.length>0&&(this.lastCheckpointMessageCount=e[0].messageCount)}async create(e){await dt(this.checkpointsDir);let n=ox(),r={id:n,name:e.description,trigger:e.trigger,createdAt:new Date().toISOString(),messageCount:e.messages.length,tokenCount:this.estimateTokens(e.messages)},o={info:r,messages:e.messages},s=hr.join(this.checkpointsDir,`${n}.json`);return await me(s,JSON.stringify(o,null,2)),this.lastCheckpointMessageCount=e.messages.length,r}async list(){let e=await Ed(this.checkpointsDir,/\.json$/),n=[];for(let r of e){let o=await ce(r);if(o){let s=Re(o,null);if(s){let i=await sx(r);n.push({info:s.info,modifiedAtMs:i.mtimeMs})}}}return n.sort((r,o)=>new Date(o.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||o.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(e){let n=hr.join(this.checkpointsDir,`${e}.json`),r;try{r=await ce(n)}catch(s){let i=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${e}: ${i}`)}if(!r)throw new Error(`Checkpoint not found: ${e} (path: ${n})`);let o=Re(r,null);if(!o)throw new Error(`Invalid checkpoint data for ${e}: JSON parse failed`);if(!o.messages||!Array.isArray(o.messages))throw new Error(`Invalid checkpoint data for ${e}: missing or invalid messages array`);if(!o.info)throw new Error(`Invalid checkpoint data for ${e}: missing info object`);return{messages:o.messages,info:o.info}}shouldAutoCheckpoint(e){return e-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(e,n){if(e=V(e),e==="Write")return!0;if(e==="Bash"){let o=n.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(i=>o.includes(i))}return!1}async delete(e){let n=hr.join(this.checkpointsDir,`${e}.json`);await vo(n)}estimateTokens(e){let n=0;for(let r of e)if(typeof r.content=="string")n+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let o of r.content)"text"in o&&(n+=Math.ceil(o.text.length/4));return n}};var br=class{static async fork(e,n){let r=n?.workingTree??"shared";if(r!=="shared"&&r!=="isolated")throw new Error(`Unknown fork working tree: ${String(r)} (expected shared or isolated)`);if(r==="isolated"&&!n?.worktree?.path?.trim())throw new Error("An isolated fork needs the worktree it will work in.");if(r==="shared"&&n?.worktree)throw new Error("A shared fork works in the source directory; it cannot also name a worktree.");let o=await this.find(e);if(!o)throw new Error(`Session not found: ${e}`);let s=this.getSessionDir(e),i=new gr(s),a=n?.checkpointId?await new Ao(s).restore(n.checkpointId):null,c=a?.messages??await i.getMessages(),l=await i.read(),u=0,d=!1,m=l.filter(y=>{if(y.type==="session_start"||y.type==="session_end"||y.type==="checkpoint"||d)return!1;if(y.type==="user_message"||y.type==="assistant_message"){if(a&&u>=a.info.messageCount)return d=!0,!1;u+=1}return!0}),p=Ud(o.role),g=this.getSessionDir(p);await dt(g);let f=new Date().toISOString(),h={history:n?.checkpointId?"checkpoint":"full",...n?.checkpointId?{checkpointId:n.checkpointId}:{},workingTree:r,...r==="isolated"&&n?.worktree?{worktree:{...n.worktree}}:{}},b=h.worktree?.path??o.workingDirectory,w={...o,id:p,workingDirectory:b,fork:h,name:n?.name??(o.name?`${o.name} (fork)`:void 0),status:"completed",parentSession:o.id,createdAt:f,updatedAt:f,lastActivity:f,checkpoints:[],messageCount:c.length,tokenUsage:{...o.tokenUsage}};await me(Ge.join(g,"meta.json"),JSON.stringify(w,null,2));let x=new gr(g);await x.append({type:"session_start",data:{sessionId:p,role:o.role,workingDirectory:b,model:o.model,formatVersion:o.formatVersion,forkedFrom:o.id,...n?.checkpointId?{checkpointId:n.checkpointId}:{},workingTree:r}});for(let y of m)await x.append({type:y.type,data:y.data});return await x.flush(),w}static async setTitle(e,n){let r=typeof n=="string"?n.replace(/\s+/g," ").trim().slice(0,200):"";return this.updateMeta(e,{name:r||void 0})}static async setPinned(e,n){return this.updateMeta(e,n?{pinned:!0,pinnedAt:new Date().toISOString()}:{pinned:void 0,pinnedAt:void 0})}static async setArchived(e,n){let r=await this.find(e);if(!r)throw new Error(`Session not found: ${e}`);return n?this.updateMeta(e,{status:"archived"}):r.status!=="archived"?r:this.updateMeta(e,{status:"completed"})}static getSessionsDir(){let e=Ne();return Ge.join(e,"sessions")}static async list(e){let n=this.getSessionsDir(),r=typeof e?.limit=="number"&&Number.isFinite(e.limit)?Math.max(0,Math.floor(e.limit)):void 0;if(r===0)return[];let o=e?.workingDirectory?this.normalizeWorkingDirectory(e.workingDirectory):void 0;if(!To(n))return[];let s=await Sd(n),i=[];for(let a of s){let c=await this.loadMeta(a);c&&(e?.status&&!e.status.includes(c.status)||c.status==="archived"&&!e?.includeArchived&&!e?.status?.includes("archived")||e?.role&&c.role!==e.role||o&&this.normalizeWorkingDirectory(c.workingDirectory)!==o||i.push(c))}return i.sort((a,c)=>{if(!!a.pinned!=!!c.pinned)return a.pinned?-1:1;if(a.pinned&&c.pinned){let l=new Date(c.pinnedAt??0).getTime()-new Date(a.pinnedAt??0).getTime();if(l!==0)return l}return new Date(c.lastActivity).getTime()-new Date(a.lastActivity).getTime()}),r!==void 0?i.slice(0,r):i}static async find(e){let n=this.getSessionsDir(),r=F(n,e);return await this.loadMeta(r)}static async findMostRecent(e){let n=typeof e=="string"?{role:e}:e??{};if(n.workingDirectory){let s=await Bd(n.workingDirectory,{...n.role!==void 0?{role:n.role}:{}});if(s){let i=await this.find(s.sessionId);if(i){if(!(n.role&&i.role!==n.role)){if(this.normalizeWorkingDirectory(i.workingDirectory)===this.normalizeWorkingDirectory(n.workingDirectory))return i}}else await la(s.sessionId)}}let o=(await this.list({...n.role!==void 0?{role:n.role}:{},...n.workingDirectory!==void 0?{workingDirectory:n.workingDirectory}:{},limit:1}))[0]??null;if(o&&n.workingDirectory)try{await $d({cwd:o.workingDirectory,sessionId:o.id,role:o.role,endedAt:o.lastActivity})}catch{}return o}static async delete(e){let n=this.getSessionsDir(),r=F(n,e);await _d(r),await la(e)}static async purgeWorkingDirectory(e,n){let r=new Set(n?.excludeSessionIds??[]),o=await this.list({workingDirectory:e}),s=[],i=[];for(let a of o){if(r.has(a.id)){i.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(e,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:i}}static async updateMeta(e,n){let r=this.getSessionsDir(),o=F(r,e),s=Ge.join(o,"meta.json"),i=await ce(s);if(!i)throw new Error(`Session not found: ${e}`);let a=Re(i,null);if(!a)throw new Error(`Invalid session metadata: ${e}`);let c={...a,...n,updatedAt:new Date().toISOString()};return aa(c.executionMode),await me(s,JSON.stringify(c,null,2)),c}static async loadMeta(e){let n=Ge.join(e,"meta.json"),r=await ce(n);if(!r)return null;let o=Re(r,null);if(!o)return null;aa(o.executionMode);let s=o.formatVersion;return{...o,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:bd}}static getSessionDir(e){return F(this.getSessionsDir(),e)}static normalizeWorkingDirectory(e){let n=Ge.normalize(e).replace(/[\\/]+$/,""),r=n.length>0?n:Ge.parse(Ge.normalize(e)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(e,n){let r=Ge.join(e,".xeno","sessions",`${n}.md`);await vo(r)}};var Ro=class{cwd;globalDir;role;sessionDir;scope;budgets;projectSessionContextDefaults;constructor(e){this.cwd=e.cwd,this.globalDir=e.globalDir||Ne(),this.role=e.role,this.sessionDir=e.sessionDir,this.scope=e.scope??"user",this.budgets={...yd,...e.budgets},this.projectSessionContextDefaults={limit:e.projectSessionContext?.limit??3,maxTokens:e.projectSessionContext?.maxTokens??700,maxCharsPerSession:e.projectSessionContext?.maxCharsPerSession??2400}}get accessScope(){return this.scope}canAccessLevel(e){return this.scope==="none"?!1:this.scope==="session"?e==="session":this.scope==="project"?e==="project"||e==="role"||e==="session":!0}assertLevelAccess(e){if(!this.canAccessLevel(e))throw new Error(`MemoryManager: Memory level '${e}' exceeds active '${this.scope}' memory scope`)}getProjectSessionContextDefaults(){return{...this.projectSessionContextDefaults}}getPath(e){this.assertLevelAccess(e);let n=wd[e];switch(e){case"global":return F(ft.join(this.globalDir,"memory"),n);case"project":return F(ft.join(this.cwd,".xeno","memory"),n);case"role":if(!this.role)throw new Error("MemoryManager: Role configuration required but not provided");return F(ft.join(this.cwd,".xeno","roles",this.role),n);case"session":if(!this.sessionDir)throw new Error("MemoryManager: Session directory configuration required but not provided");return F(this.sessionDir,n);default:throw new Error(`MemoryManager: Unknown memory level: ${e}`)}}async loadForPrompt(){let e=[];this.canAccessLevel("global")&&e.push("global"),this.canAccessLevel("project")&&e.push("project"),this.role&&this.canAccessLevel("role")&&e.push("role"),this.sessionDir&&this.canAccessLevel("session")&&e.push("session");let n=[],r={global:"",project:"",role:"",session:""},o=0,s=!1;for(let i of e)try{let a=this.getPath(i),c=await ce(a);if(c){let l=this.budgets[i],u=ue(c),d=c;u>l&&(d=this.truncateContent(c,l),s=!0);let m=ue(d);n.push({level:i,path:a,content:d,tokenCount:m}),r[i]=d,o+=m}}catch(a){Ee(`Failed to load ${i} memory`,a)}if(o>this.budgets.total){let i=this.budgets.total/o;for(let a of n){let c=Math.max(1,Math.floor(a.tokenCount*i));a.content=Xe(a.content,c),a.tokenCount=ue(a.content),r[a.level]=a.content}o=n.reduce((a,c)=>a+c.tokenCount,0),s=!0}return{files:n,byLevel:r,totalTokens:o,truncated:s}}async loadProjectSessionContext(e){if(!this.canAccessLevel("project"))return{entries:[],totalTokens:0,truncated:!1,content:""};let n=Math.max(1,Math.min(e?.limit??this.projectSessionContextDefaults.limit,10)),r=Math.max(n*20,120),o=Math.max(120,e?.maxTokens??this.projectSessionContextDefaults.maxTokens),s=Math.max(200,e?.maxCharsPerSession??this.projectSessionContextDefaults.maxCharsPerSession),i=e?.excludeSessionId,a={entries:[],totalTokens:0,truncated:!1,content:""};try{let c=await br.list({limit:r}),l=this.filterProjectSessions(c,i),u=[],d=[],m=0,p=!1;for(let f of l){if(u.length>=n)break;let h=ft.join(br.getSessionDir(f.id),"transcript.md"),b=await ce(h);if(!b)continue;let w=this.extractRecentTranscriptExcerpt(b,s);if(!w)continue;let x={sessionId:f.id,model:f.model,lastActivity:f.lastActivity,messageCount:f.messageCount,excerpt:w},y=this.formatProjectSessionEntry(x),T=ue(y);if(m+T>o){if(u.length===0){let v=Xe(y,o);v.trim().length>0&&(u.push(x),d.push(v),m+=ue(v))}p=!0;break}u.push(x),d.push(y),m+=T}if(u.length===0)return a;let g=["# Project Session History","",...d].join(`
|
|
60
60
|
`);return p&&(g+=`
|
|
61
61
|
|
|
62
62
|
*Note: Some prior session history was omitted to fit token budget.*`),{entries:u,totalTokens:ue(g),truncated:p,content:g}}catch(c){return Ee("Failed to load project session context",c),a}}filterProjectSessions(e,n){let r=this.normalizePath(this.cwd);return e.filter(o=>n&&o.id===n||!o.workingDirectory?!1:this.normalizePath(o.workingDirectory)===r)}normalizePath(e){return ft.resolve(e).replace(/[\\/]+/g,ft.sep).toLowerCase()}extractRecentTranscriptExcerpt(e,n){let r=e.replace(/\r\n/g,`
|