@xenosystem/agent-sdk 0.9.13 → 0.9.14
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/control-plane/index.cjs +1 -1
- package/dist/control-plane/index.js +1 -1
- package/dist/electron/index.d.cts +7 -0
- package/dist/electron/index.d.ts +7 -0
- 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 +340 -322
- package/dist/index.d.cts +106 -2
- package/dist/index.d.ts +106 -2
- package/dist/index.js +320 -302
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/session/index.cjs +2 -2
- package/dist/session/index.d.cts +7 -0
- package/dist/session/index.d.ts +7 -0
- package/dist/session/index.js +2 -2
- package/dist/session/metafile-cjs.json +1 -1
- package/dist/session/metafile-esm.json +1 -1
- package/package.json +1 -1
package/dist/session/index.cjs
CHANGED
|
@@ -46,10 +46,10 @@ ${this.stringify(t.data)}
|
|
|
46
46
|
`)+`
|
|
47
47
|
`;await f(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await f(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await f(c,u)}catch(u){this.workspaceMirrorDisabled=!0,b("Transcript workspace mirror disabled",u)}}}async truncateAfterMessageCount(t){let e=await m(this.transcriptPath);if(!e)return;let r=W(e),i=Math.max(0,t),s=0,o=[];for(let c of r){if(c.type==="user_message"||c.type==="assistant_message"){if(s>=i)break;s+=1}o.push(c)}let a=o.length>0?o.map(c=>JSON.stringify(c)).join(`
|
|
48
48
|
`)+`
|
|
49
|
-
`:"";await f(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await f(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await f(c,u)}catch(u){this.workspaceMirrorDisabled=!0,b("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let t=await m(this.transcriptPath);if(!t){this.sequence=0;return}let e=W(t);if(e.length===0){this.sequence=0;return}let r=e[e.length-1];this.sequence=r.sequence+1}catch(t){let e=t instanceof Error?t.message:String(t);b(`Transcript initialization warning: ${e}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};var U=k(require("path"),1),Bt=require("crypto"),Ft=require("fs/promises");var de={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit"};function it(n){return de[n]??n}var A=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(t,e){this.sessionDir=t,this.checkpointsDir=U.join(t,"checkpoints"),this.autoInterval=e?.autoInterval??10}async initialize(){let t=await this.list();t.length>0&&(this.lastCheckpointMessageCount=t[0].messageCount)}async create(t){await B(this.checkpointsDir);let e=(0,Bt.randomUUID)(),r={id:e,name:t.description,trigger:t.trigger,createdAt:new Date().toISOString(),messageCount:t.messages.length,tokenCount:this.estimateTokens(t.messages)},i={info:r,messages:t.messages},s=U.join(this.checkpointsDir,`${e}.json`);return await f(s,JSON.stringify(i,null,2)),this.lastCheckpointMessageCount=t.messages.length,r}async list(){let t=await _t(this.checkpointsDir,/\.json$/),e=[];for(let r of t){let i=await m(r);if(i){let s=y(i,null);if(s){let o=await(0,Ft.stat)(r);e.push({info:s.info,modifiedAtMs:o.mtimeMs})}}}return e.sort((r,i)=>new Date(i.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||i.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(t){let e=U.join(this.checkpointsDir,`${t}.json`),r;try{r=await m(e)}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${t}: ${o}`)}if(!r)throw new Error(`Checkpoint not found: ${t} (path: ${e})`);let i=y(r,null);if(!i)throw new Error(`Invalid checkpoint data for ${t}: JSON parse failed`);if(!i.messages||!Array.isArray(i.messages))throw new Error(`Invalid checkpoint data for ${t}: missing or invalid messages array`);if(!i.info)throw new Error(`Invalid checkpoint data for ${t}: missing info object`);return{messages:i.messages,info:i.info}}shouldAutoCheckpoint(t){return t-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(t,e){if(t=it(t),t==="Write")return!0;if(t==="Bash"){let i=e.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(o=>i.includes(o))}return!1}async delete(t){let e=U.join(this.checkpointsDir,`${t}.json`);await E(e)}estimateTokens(t){let e=0;for(let r of t)if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let i of r.content)"text"in i&&(e+=Math.ceil(i.text.length/4));return e}};var R=k(require("path"),1),kt=k(require("os"),1),F=k(require("fs"),1);var ge=Symbol.for("@xenosystem/agent-sdk/shutdown-registry"),me=globalThis,wt=me[ge]??={cleanups:new Set,exitHandlerRegistered:!1,signalHandlersInstalled:!1},yt=wt.cleanups;function fe(){for(let n of yt)try{n()}catch{}}function jt(n){return yt.add(n),!wt.exitHandlerRegistered&&typeof process<"u"&&typeof process.on=="function"&&(wt.exitHandlerRegistered=!0,process.on("exit",fe)),()=>{yt.delete(n)}}var Gt="0.9.
|
|
49
|
+
`:"";await f(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await f(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await f(c,u)}catch(u){this.workspaceMirrorDisabled=!0,b("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let t=await m(this.transcriptPath);if(!t){this.sequence=0;return}let e=W(t);if(e.length===0){this.sequence=0;return}let r=e[e.length-1];this.sequence=r.sequence+1}catch(t){let e=t instanceof Error?t.message:String(t);b(`Transcript initialization warning: ${e}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};var U=k(require("path"),1),Bt=require("crypto"),Ft=require("fs/promises");var de={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit"};function it(n){return de[n]??n}var A=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(t,e){this.sessionDir=t,this.checkpointsDir=U.join(t,"checkpoints"),this.autoInterval=e?.autoInterval??10}async initialize(){let t=await this.list();t.length>0&&(this.lastCheckpointMessageCount=t[0].messageCount)}async create(t){await B(this.checkpointsDir);let e=(0,Bt.randomUUID)(),r={id:e,name:t.description,trigger:t.trigger,createdAt:new Date().toISOString(),messageCount:t.messages.length,tokenCount:this.estimateTokens(t.messages)},i={info:r,messages:t.messages},s=U.join(this.checkpointsDir,`${e}.json`);return await f(s,JSON.stringify(i,null,2)),this.lastCheckpointMessageCount=t.messages.length,r}async list(){let t=await _t(this.checkpointsDir,/\.json$/),e=[];for(let r of t){let i=await m(r);if(i){let s=y(i,null);if(s){let o=await(0,Ft.stat)(r);e.push({info:s.info,modifiedAtMs:o.mtimeMs})}}}return e.sort((r,i)=>new Date(i.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||i.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(t){let e=U.join(this.checkpointsDir,`${t}.json`),r;try{r=await m(e)}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${t}: ${o}`)}if(!r)throw new Error(`Checkpoint not found: ${t} (path: ${e})`);let i=y(r,null);if(!i)throw new Error(`Invalid checkpoint data for ${t}: JSON parse failed`);if(!i.messages||!Array.isArray(i.messages))throw new Error(`Invalid checkpoint data for ${t}: missing or invalid messages array`);if(!i.info)throw new Error(`Invalid checkpoint data for ${t}: missing info object`);return{messages:i.messages,info:i.info}}shouldAutoCheckpoint(t){return t-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(t,e){if(t=it(t),t==="Write")return!0;if(t==="Bash"){let i=e.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(o=>i.includes(o))}return!1}async delete(t){let e=U.join(this.checkpointsDir,`${t}.json`);await E(e)}estimateTokens(t){let e=0;for(let r of t)if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let i of r.content)"text"in i&&(e+=Math.ceil(i.text.length/4));return e}};var R=k(require("path"),1),kt=k(require("os"),1),F=k(require("fs"),1);var ge=Symbol.for("@xenosystem/agent-sdk/shutdown-registry"),me=globalThis,wt=me[ge]??={cleanups:new Set,exitHandlerRegistered:!1,signalHandlersInstalled:!1},yt=wt.cleanups;function fe(){for(let n of yt)try{n()}catch{}}function jt(n){return yt.add(n),!wt.exitHandlerRegistered&&typeof process<"u"&&typeof process.on=="function"&&(wt.exitHandlerRegistered=!0,process.on("exit",fe)),()=>{yt.delete(n)}}var Gt="0.9.14";var he=1e4,we=6e4,ye="session.lock",ke="lock.json",J=new Set;function Se(){for(let n of J)try{F.unlinkSync(n)}catch{}J.clear()}jt(Se);var O=class n{sessionDir;lockPath;legacyLockPath;sessionId;heartbeatTimer;constructor(t){this.sessionDir=t,this.lockPath=R.join(t,ye),this.legacyLockPath=R.join(t,ke),this.sessionId=R.basename(t)}async acquire(){let t=new Date().toISOString(),e={schemaVersion:1,name:`session:${this.sessionId}`,sessionId:this.sessionId,pid:process.pid,hostname:kt.hostname(),processStartedAt:new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString(),version:Gt,acquiredAt:t,updatedAt:t,heartbeat:t},r=R.dirname(this.lockPath);await F.promises.mkdir(r,{recursive:!0});let i=await this.findExistingLockPath();if(i){if(!await this.isStalePath(i)){let o=await this.readLockAt(i);throw new Error(`Session ${this.sessionId} is already locked by PID ${o?.pid} on ${o?.hostname}`)}await E(i)}try{await F.promises.writeFile(this.lockPath,JSON.stringify(e,null,2),{flag:"wx",encoding:"utf-8"}),J.add(this.lockPath)}catch(s){if(s.code==="EEXIST"){if(!await this.isStalePath(this.lockPath)){let l=await this.readLockAt(this.lockPath);throw new Error(`Session ${this.sessionId} is already locked by PID ${l?.pid} on ${l?.hostname}`)}await E(this.lockPath);try{await F.promises.writeFile(this.lockPath,JSON.stringify(e,null,2),{flag:"wx",encoding:"utf-8"})}catch(l){throw l.code==="EEXIST"?new Error(`Session ${this.sessionId} lock was acquired by another process during stale recovery`):l}J.add(this.lockPath)}else throw s}}async release(){this.stopHeartbeat(),J.delete(this.lockPath),await E(this.lockPath)}async isLocked(){let t=await this.findExistingLockPath();return t?!await this.isStalePath(t):!1}async isStale(){let t=await this.findExistingLockPath();return t?this.isStalePath(t):!1}async isStalePath(t){let e=await this.readLockAt(t);if(!e)return!1;let r=new Date(e.heartbeat).getTime();return Date.now()-r>we}startHeartbeat(t=he){this.heartbeatTimer&&this.stopHeartbeat(),this.heartbeatTimer=setInterval(async()=>{try{await this.updateHeartbeat()}catch(e){let r=e instanceof Error?e.message:String(e);if(e?.code==="ENOENT"){C("SessionLock: Session directory removed, stopping heartbeat"),this.stopHeartbeat();return}C(`SessionLock: Failed to update heartbeat: ${r}`)}},t),this.heartbeatTimer.unref()}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0)}async updateHeartbeat(){let t=await this.readLockAt(this.lockPath);t&&(t.pid!==process.pid||t.hostname!==kt.hostname()||(t.heartbeat=new Date().toISOString(),t.updatedAt=t.heartbeat,await f(this.lockPath,JSON.stringify(t,null,2))))}async readLock(){let t=await this.findExistingLockPath();return t?this.readLockAt(t):null}async readLockAt(t){let e=await m(t);return e?y(e,null):null}async findExistingLockPath(){return await m(this.lockPath)?this.lockPath:await m(this.legacyLockPath)?this.legacyLockPath:null}static async cleanStale(t){let e=await tt(t),r=[];for(let i of e){let s=new n(i);if(await s.isStale()){let a=await s.findExistingLockPath();a&&await E(a),r.push(R.basename(i))}}return r}};var v=k(require("path"),1);var P=k(require("path"),1);function xe(n,t){let e=P.resolve(n),r=P.resolve(n,t);return r===e?!0:e===P.parse(e).root?r.startsWith(e):r.startsWith(e+P.sep)}function $(n,t){if(P.isAbsolute(t))return P.resolve(t);if(!xe(n,t))throw new Error(`PathSecurity: Path traversal attempt detected: ${t}`);return P.resolve(n,t)}var D=k(require("path"),1),Wt=k(require("os"),1);var N=require("node:os");var St=require("node:path"),rr=(0,N.platform)();var nr=(0,N.release)(),ir=(0,N.homedir)();function st(){let n=process.env.XENO_AGENT_HOME?.trim();return n?(0,St.resolve)(n):(0,St.resolve)((0,N.homedir)(),".xeno-agent")}var xt=1,Ht="recent.json";function j(n){return n===void 0?D.join(st(),Ht):D.join(n,".xeno-agent",Ht)}function q(n){let t=D.normalize(n).replace(/[\\/]+$/,""),e=t.length>0?t:D.parse(D.normalize(n)).root;return process.platform==="win32"?e.toLowerCase():e}async function G(n=Wt.homedir()){let t={version:xt,entries:{}},e=j(n);if(!Z(e))return t;let r=await m(e);if(!r)return t;let i=y(r,null);if(!i||typeof i!="object")return t;let s=i;if(s.version!==xt||!s.entries||typeof s.entries!="object")return t;let o={};for(let[a,l]of Object.entries(s.entries)){if(!l||typeof l!="object")continue;let c=l;typeof c.sessionId!="string"||c.sessionId.length===0||typeof c.endedAt=="string"&&(o[a]={sessionId:c.sessionId,endedAt:c.endedAt,role:typeof c.role=="string"?c.role:void 0})}return{version:xt,entries:o}}async function ot(n,t={}){let e=await G(t.homeDir),r=q(n),i=e.entries[r];if(i&&!(t.role&&i.role&&i.role!==t.role))return i}async function at(n,t={}){let e=await G(t.homeDir),r=q(n.cwd);e.entries[r]={sessionId:n.sessionId,role:n.role,endedAt:n.endedAt??new Date().toISOString()};let i=j(t.homeDir);await f(i,JSON.stringify(e,null,2)+`
|
|
50
50
|
`)}async function Ut(n,t={}){let e=await G(t.homeDir),r=q(n);if(!(r in e.entries))return;delete e.entries[r];let i=j(t.homeDir);await f(i,JSON.stringify(e,null,2)+`
|
|
51
51
|
`)}async function z(n,t={}){let e=await G(t.homeDir),r=!1;for(let[s,o]of Object.entries(e.entries))o.sessionId===n&&(delete e.entries[s],r=!0);if(!r)return;let i=j(t.homeDir);await f(i,JSON.stringify(e,null,2)+`
|
|
52
|
-
`)}var L=class{static getSessionsDir(){let t=st();return v.join(t,"sessions")}static async list(t){let e=this.getSessionsDir(),r=typeof t?.limit=="number"&&Number.isFinite(t.limit)?Math.max(0,Math.floor(t.limit)):void 0;if(r===0)return[];let i=t?.workingDirectory?this.normalizeWorkingDirectory(t.workingDirectory):void 0;if(!Z(e))return[];let s=await tt(e),o=[];for(let a of s){let l=await this.loadMeta(a);l&&(t?.status&&!t.status.includes(l.status)||t?.role&&l.role!==t.role||i&&this.normalizeWorkingDirectory(l.workingDirectory)!==i||o.push(l))}return o.sort((a,l)=>new Date(l.lastActivity).getTime()-new Date(a.lastActivity).getTime()),r!==void 0?o.slice(0,r):o}static async find(t){let e=this.getSessionsDir(),r=$(e,t);return await this.loadMeta(r)}static async findMostRecent(t){let e=typeof t=="string"?{role:t}:t??{};if(e.workingDirectory){let s=await ot(e.workingDirectory,{...e.role!==void 0?{role:e.role}:{}});if(s){let o=await this.find(s.sessionId);if(o){if(!(e.role&&o.role!==e.role)){if(this.normalizeWorkingDirectory(o.workingDirectory)===this.normalizeWorkingDirectory(e.workingDirectory))return o}}else await z(s.sessionId)}}let i=(await this.list({...e.role!==void 0?{role:e.role}:{},...e.workingDirectory!==void 0?{workingDirectory:e.workingDirectory}:{},limit:1}))[0]??null;if(i&&e.workingDirectory)try{await at({cwd:i.workingDirectory,sessionId:i.id,role:i.role,endedAt:i.lastActivity})}catch{}return i}static async delete(t){let e=this.getSessionsDir(),r=$(e,t);await At(r),await z(t)}static async purgeWorkingDirectory(t,e){let r=new Set(e?.excludeSessionIds??[]),i=await this.list({workingDirectory:t}),s=[],o=[];for(let a of i){if(r.has(a.id)){o.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(t,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:o}}static async updateMeta(t,e){let r=this.getSessionsDir(),i=$(r,t),s=v.join(i,"meta.json"),o=await m(s);if(!o)throw new Error(`Session not found: ${t}`);let a=y(o,null);if(!a)throw new Error(`Invalid session metadata: ${t}`);let l={...a,...e,updatedAt:new Date().toISOString()};return await f(s,JSON.stringify(l,null,2)),l}static async loadMeta(t){let e=v.join(t,"meta.json"),r=await m(e);if(!r)return null;let i=y(r,null);if(!i)return null;let s=i.formatVersion;return{...i,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:1}}static getSessionDir(t){return $(this.getSessionsDir(),t)}static normalizeWorkingDirectory(t){let e=v.normalize(t).replace(/[\\/]+$/,""),r=e.length>0?e:v.parse(v.normalize(t)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(t,e){let r=v.join(t,".xeno","sessions",`${e}.md`);await E(r)}};var lt=k(require("path"),1);var ut=class n{sessionDir;_meta;_transcript;_checkpoints;_lock;constructor(t,e,r,i,s){this.sessionDir=t,this._meta=e,this._transcript=r,this._checkpoints=i,this._lock=s}static async create(t){let e=t.role??"default",r=Y(e),i=L.getSessionDir(r),s=null,o=null;try{await B(i);let a={id:r,role:e,status:"creating",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),lastActivity:new Date().toISOString(),workingDirectory:t.workingDirectory,model:t.model,parentSession:t.parentSession,checkpoints:[],messageCount:0,tokenUsage:{input:0,output:0,total:0},formatVersion:1},l=lt.join(i,"meta.json");await f(l,JSON.stringify(a,null,2)),o=new _(i);let c=new A(i);s=new O(i),await s.acquire(),s.startHeartbeat(),await o.append({type:"session_start",data:{sessionId:r,role:e,workingDirectory:t.workingDirectory,model:t.model,formatVersion:1}});let u=new n(i,a,o,c,s);return await u.updateMeta({status:"active"}),u}catch(a){if(s)try{s.stopHeartbeat(),await s.release()}catch(l){C("Error releasing lock during cleanup",l)}throw a}}static async resume(t){let e=L.getSessionDir(t.sessionId),r=null,i=null;try{let s=lt.join(e,"meta.json"),o=await m(s);if(!o)throw new Error(`SessionManager: Session not found: ${t.sessionId}`);let a=y(o,null);if(!a)throw new Error(`SessionManager: Invalid session metadata: ${t.sessionId}`);a.formatVersion=Pt(a),i=new _(e),await i.initialize();let l=new A(e);if(r=new O(e),await r.acquire(),r.startHeartbeat(),t.fromCheckpoint){let{info:u}=await l.restore(t.fromCheckpoint);a.messageCount=u.messageCount,await i.append({type:"checkpoint",data:{id:t.fromCheckpoint,trigger:"manual",messageCount:u.messageCount}})}let c=new n(e,a,i,l,r);return await c.updateMeta({status:"active",lastActivity:new Date().toISOString()}),c}catch(s){if(r)try{r.stopHeartbeat(),await r.release()}catch(o){C("Error releasing lock during cleanup",o)}throw s}}get meta(){return{...this._meta}}get transcript(){return this._transcript}get checkpoints(){return this._checkpoints}async updateMeta(t){this._meta={...this._meta,...t,updatedAt:new Date().toISOString()};let e=lt.join(this.sessionDir,"meta.json"),r=3,i=null;for(let s=0;s<r;s++)try{await f(e,JSON.stringify(this._meta,null,2));return}catch(o){i=o instanceof Error?o:new Error(String(o)),b(`Failed to write session metadata (attempt ${s+1}/${r}): ${i.message}`),s<r-1&&await new Promise(a=>setTimeout(a,Math.pow(2,s)*100))}C(`Failed to write session metadata after ${r} attempts. Session will continue but metadata may be stale.`)}async end(t="completed"){await this._transcript.append({type:"session_end",data:{reason:t==="completed"?"completed":"user_exit",messageCount:this._meta.messageCount,totalTokens:this._meta.tokenUsage.total}}),await this._transcript.flush(),await this.updateMeta({status:t}),this._lock.stopHeartbeat(),await this._lock.release()}async recordUserMessage(t){await this._transcript.append({type:"user_message",data:{role:"user",content:t}}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordDirectShellResult(t){let e=rt(t);return await this._transcript.append({type:"user_message",data:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()}),e}async recordAssistantMessage(t,e){await this._transcript.append({type:"assistant_message",data:{role:"assistant",content:t},tokenCount:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordTokenUsage(t,e){let r={input:this._meta.tokenUsage.input+t,output:this._meta.tokenUsage.output+e,total:this._meta.tokenUsage.total+t+e};await this.updateMeta({tokenUsage:r})}async recordDelegationSummary(t){await this._transcript.append({type:"delegation_summary",data:t}),await this.updateMeta({lastActivity:new Date().toISOString()})}async updateMessageCount(t){t!==this._meta.messageCount&&await this.updateMeta({messageCount:t,lastActivity:new Date().toISOString()})}};function Pt(n){let t=n?.formatVersion;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:1}var V=require("node:crypto"),te=require("node:child_process"),p=require("node:fs/promises"),ee=require("node:os"),d=k(require("node:path"),1);var vt=2,Jt=400,Tt=80,bt=12,qt=3e4,Et=64*1024*1024;function zt(n){let t=n.replace(/\r\n/g,`
|
|
52
|
+
`)}var L=class{static getSessionsDir(){let t=st();return v.join(t,"sessions")}static async list(t){let e=this.getSessionsDir(),r=typeof t?.limit=="number"&&Number.isFinite(t.limit)?Math.max(0,Math.floor(t.limit)):void 0;if(r===0)return[];let i=t?.workingDirectory?this.normalizeWorkingDirectory(t.workingDirectory):void 0;if(!Z(e))return[];let s=await tt(e),o=[];for(let a of s){let l=await this.loadMeta(a);l&&(t?.status&&!t.status.includes(l.status)||t?.role&&l.role!==t.role||i&&this.normalizeWorkingDirectory(l.workingDirectory)!==i||o.push(l))}return o.sort((a,l)=>new Date(l.lastActivity).getTime()-new Date(a.lastActivity).getTime()),r!==void 0?o.slice(0,r):o}static async find(t){let e=this.getSessionsDir(),r=$(e,t);return await this.loadMeta(r)}static async findMostRecent(t){let e=typeof t=="string"?{role:t}:t??{};if(e.workingDirectory){let s=await ot(e.workingDirectory,{...e.role!==void 0?{role:e.role}:{}});if(s){let o=await this.find(s.sessionId);if(o){if(!(e.role&&o.role!==e.role)){if(this.normalizeWorkingDirectory(o.workingDirectory)===this.normalizeWorkingDirectory(e.workingDirectory))return o}}else await z(s.sessionId)}}let i=(await this.list({...e.role!==void 0?{role:e.role}:{},...e.workingDirectory!==void 0?{workingDirectory:e.workingDirectory}:{},limit:1}))[0]??null;if(i&&e.workingDirectory)try{await at({cwd:i.workingDirectory,sessionId:i.id,role:i.role,endedAt:i.lastActivity})}catch{}return i}static async delete(t){let e=this.getSessionsDir(),r=$(e,t);await At(r),await z(t)}static async purgeWorkingDirectory(t,e){let r=new Set(e?.excludeSessionIds??[]),i=await this.list({workingDirectory:t}),s=[],o=[];for(let a of i){if(r.has(a.id)){o.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(t,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:o}}static async updateMeta(t,e){let r=this.getSessionsDir(),i=$(r,t),s=v.join(i,"meta.json"),o=await m(s);if(!o)throw new Error(`Session not found: ${t}`);let a=y(o,null);if(!a)throw new Error(`Invalid session metadata: ${t}`);let l={...a,...e,updatedAt:new Date().toISOString()};return await f(s,JSON.stringify(l,null,2)),l}static async loadMeta(t){let e=v.join(t,"meta.json"),r=await m(e);if(!r)return null;let i=y(r,null);if(!i)return null;let s=i.formatVersion;return{...i,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:1}}static getSessionDir(t){return $(this.getSessionsDir(),t)}static normalizeWorkingDirectory(t){let e=v.normalize(t).replace(/[\\/]+$/,""),r=e.length>0?e:v.parse(v.normalize(t)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(t,e){let r=v.join(t,".xeno","sessions",`${e}.md`);await E(r)}};var lt=k(require("path"),1);var ut=class n{sessionDir;_meta;_transcript;_checkpoints;_lock;constructor(t,e,r,i,s){this.sessionDir=t,this._meta=e,this._transcript=r,this._checkpoints=i,this._lock=s}static async create(t){let e=t.role??"default",r=Y(e),i=L.getSessionDir(r),s=null,o=null;try{await B(i);let a={id:r,role:e,status:"creating",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),lastActivity:new Date().toISOString(),workingDirectory:t.workingDirectory,model:t.model,parentSession:t.parentSession,...t.hostBinding?{hostBinding:structuredClone(t.hostBinding)}:{},checkpoints:[],messageCount:0,tokenUsage:{input:0,output:0,total:0},formatVersion:1},l=lt.join(i,"meta.json");await f(l,JSON.stringify(a,null,2)),o=new _(i);let c=new A(i);s=new O(i),await s.acquire(),s.startHeartbeat(),await o.append({type:"session_start",data:{sessionId:r,role:e,workingDirectory:t.workingDirectory,model:t.model,formatVersion:1}});let u=new n(i,a,o,c,s);return await u.updateMeta({status:"active"}),u}catch(a){if(s)try{s.stopHeartbeat(),await s.release()}catch(l){C("Error releasing lock during cleanup",l)}throw a}}static async resume(t){let e=L.getSessionDir(t.sessionId),r=null,i=null;try{let s=lt.join(e,"meta.json"),o=await m(s);if(!o)throw new Error(`SessionManager: Session not found: ${t.sessionId}`);let a=y(o,null);if(!a)throw new Error(`SessionManager: Invalid session metadata: ${t.sessionId}`);a.formatVersion=Pt(a),i=new _(e),await i.initialize();let l=new A(e);if(r=new O(e),await r.acquire(),r.startHeartbeat(),t.fromCheckpoint){let{info:u}=await l.restore(t.fromCheckpoint);a.messageCount=u.messageCount,await i.append({type:"checkpoint",data:{id:t.fromCheckpoint,trigger:"manual",messageCount:u.messageCount}})}let c=new n(e,a,i,l,r);return await c.updateMeta({status:"active",lastActivity:new Date().toISOString()}),c}catch(s){if(r)try{r.stopHeartbeat(),await r.release()}catch(o){C("Error releasing lock during cleanup",o)}throw s}}get meta(){return{...this._meta}}get transcript(){return this._transcript}get checkpoints(){return this._checkpoints}async updateMeta(t){this._meta={...this._meta,...t,updatedAt:new Date().toISOString()};let e=lt.join(this.sessionDir,"meta.json"),r=3,i=null;for(let s=0;s<r;s++)try{await f(e,JSON.stringify(this._meta,null,2));return}catch(o){i=o instanceof Error?o:new Error(String(o)),b(`Failed to write session metadata (attempt ${s+1}/${r}): ${i.message}`),s<r-1&&await new Promise(a=>setTimeout(a,Math.pow(2,s)*100))}C(`Failed to write session metadata after ${r} attempts. Session will continue but metadata may be stale.`)}async end(t="completed"){await this._transcript.append({type:"session_end",data:{reason:t==="completed"?"completed":"user_exit",messageCount:this._meta.messageCount,totalTokens:this._meta.tokenUsage.total}}),await this._transcript.flush(),await this.updateMeta({status:t}),this._lock.stopHeartbeat(),await this._lock.release()}async recordUserMessage(t){await this._transcript.append({type:"user_message",data:{role:"user",content:t}}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordDirectShellResult(t){let e=rt(t);return await this._transcript.append({type:"user_message",data:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()}),e}async recordAssistantMessage(t,e){await this._transcript.append({type:"assistant_message",data:{role:"assistant",content:t},tokenCount:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordTokenUsage(t,e){let r={input:this._meta.tokenUsage.input+t,output:this._meta.tokenUsage.output+e,total:this._meta.tokenUsage.total+t+e};await this.updateMeta({tokenUsage:r})}async recordDelegationSummary(t){await this._transcript.append({type:"delegation_summary",data:t}),await this.updateMeta({lastActivity:new Date().toISOString()})}async updateMessageCount(t){t!==this._meta.messageCount&&await this.updateMeta({messageCount:t,lastActivity:new Date().toISOString()})}};function Pt(n){let t=n?.formatVersion;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:1}var V=require("node:crypto"),te=require("node:child_process"),p=require("node:fs/promises"),ee=require("node:os"),d=k(require("node:path"),1);var vt=2,Jt=400,Tt=80,bt=12,qt=3e4,Et=64*1024*1024;function zt(n){let t=n.replace(/\r\n/g,`
|
|
53
53
|
`).replace(/\r/g,`
|
|
54
54
|
`);if(t.length===0)return[];let e=t.endsWith(`
|
|
55
55
|
`)?t.slice(0,-1):t;return e.length===0?[]:e.split(`
|
package/dist/session/index.d.cts
CHANGED
|
@@ -139,6 +139,11 @@ interface Message {
|
|
|
139
139
|
metadata?: DirectShellMessageMetadata;
|
|
140
140
|
}
|
|
141
141
|
type SessionStatus = "creating" | "active" | "paused" | "completed" | "abandoned" | "archived";
|
|
142
|
+
interface AgentSessionHostBindingV1 {
|
|
143
|
+
schemaVersion: 1;
|
|
144
|
+
conversationId: string;
|
|
145
|
+
hostStorageIdentity: string;
|
|
146
|
+
}
|
|
142
147
|
interface SessionMeta {
|
|
143
148
|
id: string;
|
|
144
149
|
role: string;
|
|
@@ -158,6 +163,7 @@ interface SessionMeta {
|
|
|
158
163
|
total: number;
|
|
159
164
|
};
|
|
160
165
|
formatVersion?: number;
|
|
166
|
+
hostBinding?: AgentSessionHostBindingV1;
|
|
161
167
|
}
|
|
162
168
|
type TranscriptEventType = "session_start" | "user_message" | "assistant_message" | "tool_call" | "tool_result" | "delegation_summary" | "checkpoint" | "context_compressed" | "session_end" | "error";
|
|
163
169
|
interface SessionStartData {
|
|
@@ -270,6 +276,7 @@ interface SessionCreateOptions {
|
|
|
270
276
|
parentSession?: string;
|
|
271
277
|
workingDirectory: string;
|
|
272
278
|
model: string;
|
|
279
|
+
hostBinding?: AgentSessionHostBindingV1;
|
|
273
280
|
}
|
|
274
281
|
interface SessionResumeOptions {
|
|
275
282
|
sessionId: string;
|
package/dist/session/index.d.ts
CHANGED
|
@@ -139,6 +139,11 @@ interface Message {
|
|
|
139
139
|
metadata?: DirectShellMessageMetadata;
|
|
140
140
|
}
|
|
141
141
|
type SessionStatus = "creating" | "active" | "paused" | "completed" | "abandoned" | "archived";
|
|
142
|
+
interface AgentSessionHostBindingV1 {
|
|
143
|
+
schemaVersion: 1;
|
|
144
|
+
conversationId: string;
|
|
145
|
+
hostStorageIdentity: string;
|
|
146
|
+
}
|
|
142
147
|
interface SessionMeta {
|
|
143
148
|
id: string;
|
|
144
149
|
role: string;
|
|
@@ -158,6 +163,7 @@ interface SessionMeta {
|
|
|
158
163
|
total: number;
|
|
159
164
|
};
|
|
160
165
|
formatVersion?: number;
|
|
166
|
+
hostBinding?: AgentSessionHostBindingV1;
|
|
161
167
|
}
|
|
162
168
|
type TranscriptEventType = "session_start" | "user_message" | "assistant_message" | "tool_call" | "tool_result" | "delegation_summary" | "checkpoint" | "context_compressed" | "session_end" | "error";
|
|
163
169
|
interface SessionStartData {
|
|
@@ -270,6 +276,7 @@ interface SessionCreateOptions {
|
|
|
270
276
|
parentSession?: string;
|
|
271
277
|
workingDirectory: string;
|
|
272
278
|
model: string;
|
|
279
|
+
hostBinding?: AgentSessionHostBindingV1;
|
|
273
280
|
}
|
|
274
281
|
interface SessionResumeOptions {
|
|
275
282
|
sessionId: string;
|
package/dist/session/index.js
CHANGED
|
@@ -46,10 +46,10 @@ ${this.stringify(t.data)}
|
|
|
46
46
|
`)+`
|
|
47
47
|
`;await m(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await m(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await m(c,u)}catch(u){this.workspaceMirrorDisabled=!0,T("Transcript workspace mirror disabled",u)}}}async truncateAfterMessageCount(t){let e=await g(this.transcriptPath);if(!e)return;let r=B(e),i=Math.max(0,t),s=0,o=[];for(let c of r){if(c.type==="user_message"||c.type==="assistant_message"){if(s>=i)break;s+=1}o.push(c)}let a=o.length>0?o.map(c=>JSON.stringify(c)).join(`
|
|
48
48
|
`)+`
|
|
49
|
-
`:"";await m(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await m(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await m(c,u)}catch(u){this.workspaceMirrorDisabled=!0,T("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let t=await g(this.transcriptPath);if(!t){this.sequence=0;return}let e=B(t);if(e.length===0){this.sequence=0;return}let r=e[e.length-1];this.sequence=r.sequence+1}catch(t){let e=t instanceof Error?t.message:String(t);T(`Transcript initialization warning: ${e}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};import*as F from"path";import{randomUUID as ie}from"crypto";import{stat as se}from"fs/promises";var ne={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit"};function K(n){return ne[n]??n}var A=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(t,e){this.sessionDir=t,this.checkpointsDir=F.join(t,"checkpoints"),this.autoInterval=e?.autoInterval??10}async initialize(){let t=await this.list();t.length>0&&(this.lastCheckpointMessageCount=t[0].messageCount)}async create(t){await M(this.checkpointsDir);let e=ie(),r={id:e,name:t.description,trigger:t.trigger,createdAt:new Date().toISOString(),messageCount:t.messages.length,tokenCount:this.estimateTokens(t.messages)},i={info:r,messages:t.messages},s=F.join(this.checkpointsDir,`${e}.json`);return await m(s,JSON.stringify(i,null,2)),this.lastCheckpointMessageCount=t.messages.length,r}async list(){let t=await Tt(this.checkpointsDir,/\.json$/),e=[];for(let r of t){let i=await g(r);if(i){let s=w(i,null);if(s){let o=await se(r);e.push({info:s.info,modifiedAtMs:o.mtimeMs})}}}return e.sort((r,i)=>new Date(i.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||i.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(t){let e=F.join(this.checkpointsDir,`${t}.json`),r;try{r=await g(e)}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${t}: ${o}`)}if(!r)throw new Error(`Checkpoint not found: ${t} (path: ${e})`);let i=w(r,null);if(!i)throw new Error(`Invalid checkpoint data for ${t}: JSON parse failed`);if(!i.messages||!Array.isArray(i.messages))throw new Error(`Invalid checkpoint data for ${t}: missing or invalid messages array`);if(!i.info)throw new Error(`Invalid checkpoint data for ${t}: missing info object`);return{messages:i.messages,info:i.info}}shouldAutoCheckpoint(t){return t-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(t,e){if(t=K(t),t==="Write")return!0;if(t==="Bash"){let i=e.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(o=>i.includes(o))}return!1}async delete(t){let e=F.join(this.checkpointsDir,`${t}.json`);await v(e)}estimateTokens(t){let e=0;for(let r of t)if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let i of r.content)"text"in i&&(e+=Math.ceil(i.text.length/4));return e}};import*as E from"path";import*as ut from"os";import*as O from"fs";var oe=Symbol.for("@xenosystem/agent-sdk/shutdown-registry"),ae=globalThis,ct=ae[oe]??={cleanups:new Set,exitHandlerRegistered:!1,signalHandlersInstalled:!1},lt=ct.cleanups;function ce(){for(let n of lt)try{n()}catch{}}function Mt(n){return lt.add(n),!ct.exitHandlerRegistered&&typeof process<"u"&&typeof process.on=="function"&&(ct.exitHandlerRegistered=!0,process.on("exit",ce)),()=>{lt.delete(n)}}var _t="0.9.
|
|
49
|
+
`:"";await m(this.transcriptPath,a);let l=this.buildMarkdownDocument(o,"session store");if(await m(this.markdownPath,l),!this.workspaceMirrorDisabled){let c=await this.resolveWorkspaceMarkdownPath();if(c)try{let u=this.buildMarkdownDocument(o,"workspace mirror");await m(c,u)}catch(u){this.workspaceMirrorDisabled=!0,T("Transcript workspace mirror disabled",u)}}}getSequence(){return this.sequence}async initialize(){try{let t=await g(this.transcriptPath);if(!t){this.sequence=0;return}let e=B(t);if(e.length===0){this.sequence=0;return}let r=e[e.length-1];this.sequence=r.sequence+1}catch(t){let e=t instanceof Error?t.message:String(t);T(`Transcript initialization warning: ${e}. Starting with empty transcript.`),this.sequence=0}}async flush(){await this.writeQueue}};import*as F from"path";import{randomUUID as ie}from"crypto";import{stat as se}from"fs/promises";var ne={View:"Read",Replace:"Write",GlobTool:"Glob",GrepTool:"Grep",SQLiteAnalyze:"SqliteAnalyze",ReadNotebook:"NotebookRead",NotebookEditCell:"NotebookEdit"};function K(n){return ne[n]??n}var A=class{sessionDir;checkpointsDir;autoInterval;lastCheckpointMessageCount=0;constructor(t,e){this.sessionDir=t,this.checkpointsDir=F.join(t,"checkpoints"),this.autoInterval=e?.autoInterval??10}async initialize(){let t=await this.list();t.length>0&&(this.lastCheckpointMessageCount=t[0].messageCount)}async create(t){await M(this.checkpointsDir);let e=ie(),r={id:e,name:t.description,trigger:t.trigger,createdAt:new Date().toISOString(),messageCount:t.messages.length,tokenCount:this.estimateTokens(t.messages)},i={info:r,messages:t.messages},s=F.join(this.checkpointsDir,`${e}.json`);return await m(s,JSON.stringify(i,null,2)),this.lastCheckpointMessageCount=t.messages.length,r}async list(){let t=await Tt(this.checkpointsDir,/\.json$/),e=[];for(let r of t){let i=await g(r);if(i){let s=w(i,null);if(s){let o=await se(r);e.push({info:s.info,modifiedAtMs:o.mtimeMs})}}}return e.sort((r,i)=>new Date(i.info.createdAt).getTime()-new Date(r.info.createdAt).getTime()||i.modifiedAtMs-r.modifiedAtMs).map(({info:r})=>r)}async restore(t){let e=F.join(this.checkpointsDir,`${t}.json`),r;try{r=await g(e)}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to read checkpoint ${t}: ${o}`)}if(!r)throw new Error(`Checkpoint not found: ${t} (path: ${e})`);let i=w(r,null);if(!i)throw new Error(`Invalid checkpoint data for ${t}: JSON parse failed`);if(!i.messages||!Array.isArray(i.messages))throw new Error(`Invalid checkpoint data for ${t}: missing or invalid messages array`);if(!i.info)throw new Error(`Invalid checkpoint data for ${t}: missing info object`);return{messages:i.messages,info:i.info}}shouldAutoCheckpoint(t){return t-this.lastCheckpointMessageCount>=this.autoInterval}static isDangerousOperation(t,e){if(t=K(t),t==="Write")return!0;if(t==="Bash"){let i=e.command?.toLowerCase()||"";return["rm ","del ","git push","git reset","drop ","truncate"].some(o=>i.includes(o))}return!1}async delete(t){let e=F.join(this.checkpointsDir,`${t}.json`);await v(e)}estimateTokens(t){let e=0;for(let r of t)if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let i of r.content)"text"in i&&(e+=Math.ceil(i.text.length/4));return e}};import*as E from"path";import*as ut from"os";import*as O from"fs";var oe=Symbol.for("@xenosystem/agent-sdk/shutdown-registry"),ae=globalThis,ct=ae[oe]??={cleanups:new Set,exitHandlerRegistered:!1,signalHandlersInstalled:!1},lt=ct.cleanups;function ce(){for(let n of lt)try{n()}catch{}}function Mt(n){return lt.add(n),!ct.exitHandlerRegistered&&typeof process<"u"&&typeof process.on=="function"&&(ct.exitHandlerRegistered=!0,process.on("exit",ce)),()=>{lt.delete(n)}}var _t="0.9.14";var le=1e4,ue=6e4,pe="session.lock",de="lock.json",j=new Set;function ge(){for(let n of j)try{O.unlinkSync(n)}catch{}j.clear()}Mt(ge);var $=class n{sessionDir;lockPath;legacyLockPath;sessionId;heartbeatTimer;constructor(t){this.sessionDir=t,this.lockPath=E.join(t,pe),this.legacyLockPath=E.join(t,de),this.sessionId=E.basename(t)}async acquire(){let t=new Date().toISOString(),e={schemaVersion:1,name:`session:${this.sessionId}`,sessionId:this.sessionId,pid:process.pid,hostname:ut.hostname(),processStartedAt:new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString(),version:_t,acquiredAt:t,updatedAt:t,heartbeat:t},r=E.dirname(this.lockPath);await O.promises.mkdir(r,{recursive:!0});let i=await this.findExistingLockPath();if(i){if(!await this.isStalePath(i)){let o=await this.readLockAt(i);throw new Error(`Session ${this.sessionId} is already locked by PID ${o?.pid} on ${o?.hostname}`)}await v(i)}try{await O.promises.writeFile(this.lockPath,JSON.stringify(e,null,2),{flag:"wx",encoding:"utf-8"}),j.add(this.lockPath)}catch(s){if(s.code==="EEXIST"){if(!await this.isStalePath(this.lockPath)){let l=await this.readLockAt(this.lockPath);throw new Error(`Session ${this.sessionId} is already locked by PID ${l?.pid} on ${l?.hostname}`)}await v(this.lockPath);try{await O.promises.writeFile(this.lockPath,JSON.stringify(e,null,2),{flag:"wx",encoding:"utf-8"})}catch(l){throw l.code==="EEXIST"?new Error(`Session ${this.sessionId} lock was acquired by another process during stale recovery`):l}j.add(this.lockPath)}else throw s}}async release(){this.stopHeartbeat(),j.delete(this.lockPath),await v(this.lockPath)}async isLocked(){let t=await this.findExistingLockPath();return t?!await this.isStalePath(t):!1}async isStale(){let t=await this.findExistingLockPath();return t?this.isStalePath(t):!1}async isStalePath(t){let e=await this.readLockAt(t);if(!e)return!1;let r=new Date(e.heartbeat).getTime();return Date.now()-r>ue}startHeartbeat(t=le){this.heartbeatTimer&&this.stopHeartbeat(),this.heartbeatTimer=setInterval(async()=>{try{await this.updateHeartbeat()}catch(e){let r=e instanceof Error?e.message:String(e);if(e?.code==="ENOENT"){D("SessionLock: Session directory removed, stopping heartbeat"),this.stopHeartbeat();return}D(`SessionLock: Failed to update heartbeat: ${r}`)}},t),this.heartbeatTimer.unref()}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0)}async updateHeartbeat(){let t=await this.readLockAt(this.lockPath);t&&(t.pid!==process.pid||t.hostname!==ut.hostname()||(t.heartbeat=new Date().toISOString(),t.updatedAt=t.heartbeat,await m(this.lockPath,JSON.stringify(t,null,2))))}async readLock(){let t=await this.findExistingLockPath();return t?this.readLockAt(t):null}async readLockAt(t){let e=await g(t);return e?w(e,null):null}async findExistingLockPath(){return await g(this.lockPath)?this.lockPath:await g(this.legacyLockPath)?this.legacyLockPath:null}static async cleanStale(t){let e=await V(t),r=[];for(let i of e){let s=new n(i);if(await s.isStale()){let a=await s.findExistingLockPath();a&&await v(a),r.push(E.basename(i))}}return r}};import*as x from"path";import*as S from"path";function me(n,t){let e=S.resolve(n),r=S.resolve(n,t);return r===e?!0:e===S.parse(e).root?r.startsWith(e):r.startsWith(e+S.sep)}function C(n,t){if(S.isAbsolute(t))return S.resolve(t);if(!me(n,t))throw new Error(`PathSecurity: Path traversal attempt detected: ${t}`);return S.resolve(n,t)}import*as b from"path";import*as Nt from"os";import{homedir as Ot,platform as fe,release as he}from"node:os";import{resolve as At}from"node:path";var ar=fe();var cr=he(),lr=Ot();function Q(){let n=process.env.XENO_AGENT_HOME?.trim();return n?At(n):At(Ot(),".xeno-agent")}var pt=1,$t="recent.json";function G(n){return n===void 0?b.join(Q(),$t):b.join(n,".xeno-agent",$t)}function Y(n){let t=b.normalize(n).replace(/[\\/]+$/,""),e=t.length>0?t:b.parse(b.normalize(n)).root;return process.platform==="win32"?e.toLowerCase():e}async function H(n=Nt.homedir()){let t={version:pt,entries:{}},e=G(n);if(!z(e))return t;let r=await g(e);if(!r)return t;let i=w(r,null);if(!i||typeof i!="object")return t;let s=i;if(s.version!==pt||!s.entries||typeof s.entries!="object")return t;let o={};for(let[a,l]of Object.entries(s.entries)){if(!l||typeof l!="object")continue;let c=l;typeof c.sessionId!="string"||c.sessionId.length===0||typeof c.endedAt=="string"&&(o[a]={sessionId:c.sessionId,endedAt:c.endedAt,role:typeof c.role=="string"?c.role:void 0})}return{version:pt,entries:o}}async function dt(n,t={}){let e=await H(t.homeDir),r=Y(n),i=e.entries[r];if(i&&!(t.role&&i.role&&i.role!==t.role))return i}async function gt(n,t={}){let e=await H(t.homeDir),r=Y(n.cwd);e.entries[r]={sessionId:n.sessionId,role:n.role,endedAt:n.endedAt??new Date().toISOString()};let i=G(t.homeDir);await m(i,JSON.stringify(e,null,2)+`
|
|
50
50
|
`)}async function we(n,t={}){let e=await H(t.homeDir),r=Y(n);if(!(r in e.entries))return;delete e.entries[r];let i=G(t.homeDir);await m(i,JSON.stringify(e,null,2)+`
|
|
51
51
|
`)}async function Z(n,t={}){let e=await H(t.homeDir),r=!1;for(let[s,o]of Object.entries(e.entries))o.sessionId===n&&(delete e.entries[s],r=!0);if(!r)return;let i=G(t.homeDir);await m(i,JSON.stringify(e,null,2)+`
|
|
52
|
-
`)}var N=class{static getSessionsDir(){let t=Q();return x.join(t,"sessions")}static async list(t){let e=this.getSessionsDir(),r=typeof t?.limit=="number"&&Number.isFinite(t.limit)?Math.max(0,Math.floor(t.limit)):void 0;if(r===0)return[];let i=t?.workingDirectory?this.normalizeWorkingDirectory(t.workingDirectory):void 0;if(!z(e))return[];let s=await V(e),o=[];for(let a of s){let l=await this.loadMeta(a);l&&(t?.status&&!t.status.includes(l.status)||t?.role&&l.role!==t.role||i&&this.normalizeWorkingDirectory(l.workingDirectory)!==i||o.push(l))}return o.sort((a,l)=>new Date(l.lastActivity).getTime()-new Date(a.lastActivity).getTime()),r!==void 0?o.slice(0,r):o}static async find(t){let e=this.getSessionsDir(),r=C(e,t);return await this.loadMeta(r)}static async findMostRecent(t){let e=typeof t=="string"?{role:t}:t??{};if(e.workingDirectory){let s=await dt(e.workingDirectory,{...e.role!==void 0?{role:e.role}:{}});if(s){let o=await this.find(s.sessionId);if(o){if(!(e.role&&o.role!==e.role)){if(this.normalizeWorkingDirectory(o.workingDirectory)===this.normalizeWorkingDirectory(e.workingDirectory))return o}}else await Z(s.sessionId)}}let i=(await this.list({...e.role!==void 0?{role:e.role}:{},...e.workingDirectory!==void 0?{workingDirectory:e.workingDirectory}:{},limit:1}))[0]??null;if(i&&e.workingDirectory)try{await gt({cwd:i.workingDirectory,sessionId:i.id,role:i.role,endedAt:i.lastActivity})}catch{}return i}static async delete(t){let e=this.getSessionsDir(),r=C(e,t);await Et(r),await Z(t)}static async purgeWorkingDirectory(t,e){let r=new Set(e?.excludeSessionIds??[]),i=await this.list({workingDirectory:t}),s=[],o=[];for(let a of i){if(r.has(a.id)){o.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(t,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:o}}static async updateMeta(t,e){let r=this.getSessionsDir(),i=C(r,t),s=x.join(i,"meta.json"),o=await g(s);if(!o)throw new Error(`Session not found: ${t}`);let a=w(o,null);if(!a)throw new Error(`Invalid session metadata: ${t}`);let l={...a,...e,updatedAt:new Date().toISOString()};return await m(s,JSON.stringify(l,null,2)),l}static async loadMeta(t){let e=x.join(t,"meta.json"),r=await g(e);if(!r)return null;let i=w(r,null);if(!i)return null;let s=i.formatVersion;return{...i,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:1}}static getSessionDir(t){return C(this.getSessionsDir(),t)}static normalizeWorkingDirectory(t){let e=x.normalize(t).replace(/[\\/]+$/,""),r=e.length>0?e:x.parse(x.normalize(t)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(t,e){let r=x.join(t,".xeno","sessions",`${e}.md`);await v(r)}};import*as et from"path";var mt=class n{sessionDir;_meta;_transcript;_checkpoints;_lock;constructor(t,e,r,i,s){this.sessionDir=t,this._meta=e,this._transcript=r,this._checkpoints=i,this._lock=s}static async create(t){let e=t.role??"default",r=st(e),i=N.getSessionDir(r),s=null,o=null;try{await M(i);let a={id:r,role:e,status:"creating",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),lastActivity:new Date().toISOString(),workingDirectory:t.workingDirectory,model:t.model,parentSession:t.parentSession,checkpoints:[],messageCount:0,tokenUsage:{input:0,output:0,total:0},formatVersion:1},l=et.join(i,"meta.json");await m(l,JSON.stringify(a,null,2)),o=new _(i);let c=new A(i);s=new $(i),await s.acquire(),s.startHeartbeat(),await o.append({type:"session_start",data:{sessionId:r,role:e,workingDirectory:t.workingDirectory,model:t.model,formatVersion:1}});let u=new n(i,a,o,c,s);return await u.updateMeta({status:"active"}),u}catch(a){if(s)try{s.stopHeartbeat(),await s.release()}catch(l){D("Error releasing lock during cleanup",l)}throw a}}static async resume(t){let e=N.getSessionDir(t.sessionId),r=null,i=null;try{let s=et.join(e,"meta.json"),o=await g(s);if(!o)throw new Error(`SessionManager: Session not found: ${t.sessionId}`);let a=w(o,null);if(!a)throw new Error(`SessionManager: Invalid session metadata: ${t.sessionId}`);a.formatVersion=Lt(a),i=new _(e),await i.initialize();let l=new A(e);if(r=new $(e),await r.acquire(),r.startHeartbeat(),t.fromCheckpoint){let{info:u}=await l.restore(t.fromCheckpoint);a.messageCount=u.messageCount,await i.append({type:"checkpoint",data:{id:t.fromCheckpoint,trigger:"manual",messageCount:u.messageCount}})}let c=new n(e,a,i,l,r);return await c.updateMeta({status:"active",lastActivity:new Date().toISOString()}),c}catch(s){if(r)try{r.stopHeartbeat(),await r.release()}catch(o){D("Error releasing lock during cleanup",o)}throw s}}get meta(){return{...this._meta}}get transcript(){return this._transcript}get checkpoints(){return this._checkpoints}async updateMeta(t){this._meta={...this._meta,...t,updatedAt:new Date().toISOString()};let e=et.join(this.sessionDir,"meta.json"),r=3,i=null;for(let s=0;s<r;s++)try{await m(e,JSON.stringify(this._meta,null,2));return}catch(o){i=o instanceof Error?o:new Error(String(o)),T(`Failed to write session metadata (attempt ${s+1}/${r}): ${i.message}`),s<r-1&&await new Promise(a=>setTimeout(a,Math.pow(2,s)*100))}D(`Failed to write session metadata after ${r} attempts. Session will continue but metadata may be stale.`)}async end(t="completed"){await this._transcript.append({type:"session_end",data:{reason:t==="completed"?"completed":"user_exit",messageCount:this._meta.messageCount,totalTokens:this._meta.tokenUsage.total}}),await this._transcript.flush(),await this.updateMeta({status:t}),this._lock.stopHeartbeat(),await this._lock.release()}async recordUserMessage(t){await this._transcript.append({type:"user_message",data:{role:"user",content:t}}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordDirectShellResult(t){let e=ot(t);return await this._transcript.append({type:"user_message",data:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()}),e}async recordAssistantMessage(t,e){await this._transcript.append({type:"assistant_message",data:{role:"assistant",content:t},tokenCount:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordTokenUsage(t,e){let r={input:this._meta.tokenUsage.input+t,output:this._meta.tokenUsage.output+e,total:this._meta.tokenUsage.total+t+e};await this.updateMeta({tokenUsage:r})}async recordDelegationSummary(t){await this._transcript.append({type:"delegation_summary",data:t}),await this.updateMeta({lastActivity:new Date().toISOString()})}async updateMessageCount(t){t!==this._meta.messageCount&&await this.updateMeta({messageCount:t,lastActivity:new Date().toISOString()})}};function Lt(n){let t=n?.formatVersion;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:1}import{randomUUID as nt}from"node:crypto";import{spawn as ye}from"node:child_process";import{mkdir as U,readFile as W,readdir as Bt,realpath as it,rm as rt,stat as ke,unlink as Ft,writeFile as ft}from"node:fs/promises";import{tmpdir as Se}from"node:os";import p from"node:path";var ht=2,jt=400,wt=80,kt=12,Gt=3e4,yt=64*1024*1024;function Ht(n){let t=n.replace(/\r\n/g,`
|
|
52
|
+
`)}var N=class{static getSessionsDir(){let t=Q();return x.join(t,"sessions")}static async list(t){let e=this.getSessionsDir(),r=typeof t?.limit=="number"&&Number.isFinite(t.limit)?Math.max(0,Math.floor(t.limit)):void 0;if(r===0)return[];let i=t?.workingDirectory?this.normalizeWorkingDirectory(t.workingDirectory):void 0;if(!z(e))return[];let s=await V(e),o=[];for(let a of s){let l=await this.loadMeta(a);l&&(t?.status&&!t.status.includes(l.status)||t?.role&&l.role!==t.role||i&&this.normalizeWorkingDirectory(l.workingDirectory)!==i||o.push(l))}return o.sort((a,l)=>new Date(l.lastActivity).getTime()-new Date(a.lastActivity).getTime()),r!==void 0?o.slice(0,r):o}static async find(t){let e=this.getSessionsDir(),r=C(e,t);return await this.loadMeta(r)}static async findMostRecent(t){let e=typeof t=="string"?{role:t}:t??{};if(e.workingDirectory){let s=await dt(e.workingDirectory,{...e.role!==void 0?{role:e.role}:{}});if(s){let o=await this.find(s.sessionId);if(o){if(!(e.role&&o.role!==e.role)){if(this.normalizeWorkingDirectory(o.workingDirectory)===this.normalizeWorkingDirectory(e.workingDirectory))return o}}else await Z(s.sessionId)}}let i=(await this.list({...e.role!==void 0?{role:e.role}:{},...e.workingDirectory!==void 0?{workingDirectory:e.workingDirectory}:{},limit:1}))[0]??null;if(i&&e.workingDirectory)try{await gt({cwd:i.workingDirectory,sessionId:i.id,role:i.role,endedAt:i.lastActivity})}catch{}return i}static async delete(t){let e=this.getSessionsDir(),r=C(e,t);await Et(r),await Z(t)}static async purgeWorkingDirectory(t,e){let r=new Set(e?.excludeSessionIds??[]),i=await this.list({workingDirectory:t}),s=[],o=[];for(let a of i){if(r.has(a.id)){o.push(a.id);continue}await this.delete(a.id),await this.deleteWorkspaceMirror(t,a.id),s.push(a.id)}return{deletedIds:s,skippedIds:o}}static async updateMeta(t,e){let r=this.getSessionsDir(),i=C(r,t),s=x.join(i,"meta.json"),o=await g(s);if(!o)throw new Error(`Session not found: ${t}`);let a=w(o,null);if(!a)throw new Error(`Invalid session metadata: ${t}`);let l={...a,...e,updatedAt:new Date().toISOString()};return await m(s,JSON.stringify(l,null,2)),l}static async loadMeta(t){let e=x.join(t,"meta.json"),r=await g(e);if(!r)return null;let i=w(r,null);if(!i)return null;let s=i.formatVersion;return{...i,formatVersion:typeof s=="number"&&Number.isFinite(s)&&s>0?s:1}}static getSessionDir(t){return C(this.getSessionsDir(),t)}static normalizeWorkingDirectory(t){let e=x.normalize(t).replace(/[\\/]+$/,""),r=e.length>0?e:x.parse(x.normalize(t)).root;return process.platform==="win32"?r.toLowerCase():r}static async deleteWorkspaceMirror(t,e){let r=x.join(t,".xeno","sessions",`${e}.md`);await v(r)}};import*as et from"path";var mt=class n{sessionDir;_meta;_transcript;_checkpoints;_lock;constructor(t,e,r,i,s){this.sessionDir=t,this._meta=e,this._transcript=r,this._checkpoints=i,this._lock=s}static async create(t){let e=t.role??"default",r=st(e),i=N.getSessionDir(r),s=null,o=null;try{await M(i);let a={id:r,role:e,status:"creating",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),lastActivity:new Date().toISOString(),workingDirectory:t.workingDirectory,model:t.model,parentSession:t.parentSession,...t.hostBinding?{hostBinding:structuredClone(t.hostBinding)}:{},checkpoints:[],messageCount:0,tokenUsage:{input:0,output:0,total:0},formatVersion:1},l=et.join(i,"meta.json");await m(l,JSON.stringify(a,null,2)),o=new _(i);let c=new A(i);s=new $(i),await s.acquire(),s.startHeartbeat(),await o.append({type:"session_start",data:{sessionId:r,role:e,workingDirectory:t.workingDirectory,model:t.model,formatVersion:1}});let u=new n(i,a,o,c,s);return await u.updateMeta({status:"active"}),u}catch(a){if(s)try{s.stopHeartbeat(),await s.release()}catch(l){D("Error releasing lock during cleanup",l)}throw a}}static async resume(t){let e=N.getSessionDir(t.sessionId),r=null,i=null;try{let s=et.join(e,"meta.json"),o=await g(s);if(!o)throw new Error(`SessionManager: Session not found: ${t.sessionId}`);let a=w(o,null);if(!a)throw new Error(`SessionManager: Invalid session metadata: ${t.sessionId}`);a.formatVersion=Lt(a),i=new _(e),await i.initialize();let l=new A(e);if(r=new $(e),await r.acquire(),r.startHeartbeat(),t.fromCheckpoint){let{info:u}=await l.restore(t.fromCheckpoint);a.messageCount=u.messageCount,await i.append({type:"checkpoint",data:{id:t.fromCheckpoint,trigger:"manual",messageCount:u.messageCount}})}let c=new n(e,a,i,l,r);return await c.updateMeta({status:"active",lastActivity:new Date().toISOString()}),c}catch(s){if(r)try{r.stopHeartbeat(),await r.release()}catch(o){D("Error releasing lock during cleanup",o)}throw s}}get meta(){return{...this._meta}}get transcript(){return this._transcript}get checkpoints(){return this._checkpoints}async updateMeta(t){this._meta={...this._meta,...t,updatedAt:new Date().toISOString()};let e=et.join(this.sessionDir,"meta.json"),r=3,i=null;for(let s=0;s<r;s++)try{await m(e,JSON.stringify(this._meta,null,2));return}catch(o){i=o instanceof Error?o:new Error(String(o)),T(`Failed to write session metadata (attempt ${s+1}/${r}): ${i.message}`),s<r-1&&await new Promise(a=>setTimeout(a,Math.pow(2,s)*100))}D(`Failed to write session metadata after ${r} attempts. Session will continue but metadata may be stale.`)}async end(t="completed"){await this._transcript.append({type:"session_end",data:{reason:t==="completed"?"completed":"user_exit",messageCount:this._meta.messageCount,totalTokens:this._meta.tokenUsage.total}}),await this._transcript.flush(),await this.updateMeta({status:t}),this._lock.stopHeartbeat(),await this._lock.release()}async recordUserMessage(t){await this._transcript.append({type:"user_message",data:{role:"user",content:t}}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordDirectShellResult(t){let e=ot(t);return await this._transcript.append({type:"user_message",data:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()}),e}async recordAssistantMessage(t,e){await this._transcript.append({type:"assistant_message",data:{role:"assistant",content:t},tokenCount:e}),await this.updateMeta({messageCount:this._meta.messageCount+1,lastActivity:new Date().toISOString()})}async recordTokenUsage(t,e){let r={input:this._meta.tokenUsage.input+t,output:this._meta.tokenUsage.output+e,total:this._meta.tokenUsage.total+t+e};await this.updateMeta({tokenUsage:r})}async recordDelegationSummary(t){await this._transcript.append({type:"delegation_summary",data:t}),await this.updateMeta({lastActivity:new Date().toISOString()})}async updateMessageCount(t){t!==this._meta.messageCount&&await this.updateMeta({messageCount:t,lastActivity:new Date().toISOString()})}};function Lt(n){let t=n?.formatVersion;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:1}import{randomUUID as nt}from"node:crypto";import{spawn as ye}from"node:child_process";import{mkdir as U,readFile as W,readdir as Bt,realpath as it,rm as rt,stat as ke,unlink as Ft,writeFile as ft}from"node:fs/promises";import{tmpdir as Se}from"node:os";import p from"node:path";var ht=2,jt=400,wt=80,kt=12,Gt=3e4,yt=64*1024*1024;function Ht(n){let t=n.replace(/\r\n/g,`
|
|
53
53
|
`).replace(/\r/g,`
|
|
54
54
|
`);if(t.length===0)return[];let e=t.endsWith(`
|
|
55
55
|
`)?t.slice(0,-1):t;return e.length===0?[]:e.split(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/session/id-generator.ts":{"bytes":870,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":9993,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/json.ts":{"bytes":804,"imports":[],"format":"esm"},"src/utils/logger.ts":{"bytes":3719,"imports":[],"format":"esm"},"src/session/direct-shell.ts":{"bytes":2317,"imports":[],"format":"esm"},"src/session/transcript.ts":{"bytes":14636,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"}],"format":"esm"},"src/tools/tool-names.ts":{"bytes":2604,"imports":[],"format":"esm"},"src/session/checkpoint.ts":{"bytes":5786,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"fs/promises","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"}],"format":"esm"},"src/runtime/shutdown.ts":{"bytes":7260,"imports":[],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/session/lock.ts":{"bytes":9029,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/runtime/shutdown.ts","kind":"import-statement","original":"../runtime/shutdown.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"}],"format":"esm"},"src/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/session/id-generator.ts":{"bytes":870,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":9993,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/json.ts":{"bytes":804,"imports":[],"format":"esm"},"src/utils/logger.ts":{"bytes":3719,"imports":[],"format":"esm"},"src/session/direct-shell.ts":{"bytes":2317,"imports":[],"format":"esm"},"src/session/transcript.ts":{"bytes":14636,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"}],"format":"esm"},"src/tools/tool-names.ts":{"bytes":2604,"imports":[],"format":"esm"},"src/session/checkpoint.ts":{"bytes":5786,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"fs/promises","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"}],"format":"esm"},"src/runtime/shutdown.ts":{"bytes":7260,"imports":[],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/session/lock.ts":{"bytes":9029,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/runtime/shutdown.ts","kind":"import-statement","original":"../runtime/shutdown.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"}],"format":"esm"},"src/types.ts":{"bytes":26059,"imports":[],"format":"esm"},"src/utils/path-security.ts":{"bytes":993,"imports":[{"path":"path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/platform.ts":{"bytes":5600,"imports":[{"path":"node:os","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/session/recent-sessions.ts":{"bytes":7412,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/session/registry.ts":{"bytes":9603,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/types.ts","kind":"import-statement","original":"../types.js"},{"path":"src/utils/path-security.ts","kind":"import-statement","original":"../utils/path-security.js"},{"path":"src/session/recent-sessions.ts","kind":"import-statement","original":"./recent-sessions.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/session/manager.ts":{"bytes":11984,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/session/transcript.ts","kind":"import-statement","original":"./transcript.js"},{"path":"src/session/checkpoint.ts","kind":"import-statement","original":"./checkpoint.js"},{"path":"src/session/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/session/registry.ts","kind":"import-statement","original":"./registry.js"},{"path":"src/session/id-generator.ts","kind":"import-statement","original":"./id-generator.js"},{"path":"src/types.ts","kind":"import-statement","original":"../types.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"}],"format":"esm"},"src/session/turn-restore.ts":{"bytes":30241,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"},{"path":"src/utils/path-security.ts","kind":"import-statement","original":"../utils/path-security.js"}],"format":"esm"},"src/session/index.ts":{"bytes":1182,"imports":[{"path":"src/session/id-generator.ts","kind":"import-statement","original":"./id-generator.js"},{"path":"src/session/transcript.ts","kind":"import-statement","original":"./transcript.js"},{"path":"src/session/checkpoint.ts","kind":"import-statement","original":"./checkpoint.js"},{"path":"src/session/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/session/registry.ts","kind":"import-statement","original":"./registry.js"},{"path":"src/session/manager.ts","kind":"import-statement","original":"./manager.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"},{"path":"src/session/recent-sessions.ts","kind":"import-statement","original":"./recent-sessions.js"},{"path":"src/session/turn-restore.ts","kind":"import-statement","original":"./turn-restore.js"}],"format":"esm"}},"outputs":{"dist/session/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"crypto","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"crypto","kind":"require-call","external":true},{"path":"fs/promises","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"os","kind":"require-call","external":true},{"path":"fs","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"os","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:child_process","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/session/index.ts","inputs":{"src/session/index.ts":{"bytesInOutput":689},"src/session/id-generator.ts":{"bytesInOutput":340},"src/session/transcript.ts":{"bytesInOutput":6602},"src/utils/fs.ts":{"bytesInOutput":1173},"src/utils/json.ts":{"bytesInOutput":170},"src/utils/logger.ts":{"bytesInOutput":489},"src/session/direct-shell.ts":{"bytesInOutput":1071},"src/session/checkpoint.ts":{"bytesInOutput":2302},"src/tools/tool-names.ts":{"bytesInOutput":190},"src/session/lock.ts":{"bytesInOutput":3195},"src/runtime/shutdown.ts":{"bytesInOutput":400},"src/version.ts":{"bytesInOutput":16},"src/session/registry.ts":{"bytesInOutput":2697},"src/utils/path-security.ts":{"bytesInOutput":314},"src/session/recent-sessions.ts":{"bytesInOutput":1560},"src/utils/platform.ts":{"bytesInOutput":244},"src/session/manager.ts":{"bytesInOutput":4166},"src/session/turn-restore.ts":{"bytesInOutput":13491}},"bytes":40213}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/session/id-generator.ts":{"bytes":870,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":9993,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/json.ts":{"bytes":804,"imports":[],"format":"esm"},"src/utils/logger.ts":{"bytes":3719,"imports":[],"format":"esm"},"src/session/direct-shell.ts":{"bytes":2317,"imports":[],"format":"esm"},"src/session/transcript.ts":{"bytes":14636,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"}],"format":"esm"},"src/tools/tool-names.ts":{"bytes":2604,"imports":[],"format":"esm"},"src/session/checkpoint.ts":{"bytes":5786,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"fs/promises","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"}],"format":"esm"},"src/runtime/shutdown.ts":{"bytes":7260,"imports":[],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/session/lock.ts":{"bytes":9029,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/runtime/shutdown.ts","kind":"import-statement","original":"../runtime/shutdown.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"}],"format":"esm"},"src/types.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/session/id-generator.ts":{"bytes":870,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":9993,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/json.ts":{"bytes":804,"imports":[],"format":"esm"},"src/utils/logger.ts":{"bytes":3719,"imports":[],"format":"esm"},"src/session/direct-shell.ts":{"bytes":2317,"imports":[],"format":"esm"},"src/session/transcript.ts":{"bytes":14636,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"}],"format":"esm"},"src/tools/tool-names.ts":{"bytes":2604,"imports":[],"format":"esm"},"src/session/checkpoint.ts":{"bytes":5786,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"fs/promises","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"}],"format":"esm"},"src/runtime/shutdown.ts":{"bytes":7260,"imports":[],"format":"esm"},"src/version.ts":{"bytes":37,"imports":[],"format":"esm"},"src/session/lock.ts":{"bytes":9029,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"},{"path":"src/runtime/shutdown.ts","kind":"import-statement","original":"../runtime/shutdown.js"},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"}],"format":"esm"},"src/types.ts":{"bytes":26059,"imports":[],"format":"esm"},"src/utils/path-security.ts":{"bytes":993,"imports":[{"path":"path","kind":"import-statement","external":true}],"format":"esm"},"src/utils/platform.ts":{"bytes":5600,"imports":[{"path":"node:os","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/session/recent-sessions.ts":{"bytes":7412,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/session/registry.ts":{"bytes":9603,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/types.ts","kind":"import-statement","original":"../types.js"},{"path":"src/utils/path-security.ts","kind":"import-statement","original":"../utils/path-security.js"},{"path":"src/session/recent-sessions.ts","kind":"import-statement","original":"./recent-sessions.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/session/manager.ts":{"bytes":11984,"imports":[{"path":"path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/utils/json.ts","kind":"import-statement","original":"../utils/json.js"},{"path":"src/session/transcript.ts","kind":"import-statement","original":"./transcript.js"},{"path":"src/session/checkpoint.ts","kind":"import-statement","original":"./checkpoint.js"},{"path":"src/session/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/session/registry.ts","kind":"import-statement","original":"./registry.js"},{"path":"src/session/id-generator.ts","kind":"import-statement","original":"./id-generator.js"},{"path":"src/types.ts","kind":"import-statement","original":"../types.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"},{"path":"src/utils/logger.ts","kind":"import-statement","original":"../utils/logger.js"}],"format":"esm"},"src/session/turn-restore.ts":{"bytes":30241,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/tools/tool-names.ts","kind":"import-statement","original":"../tools/tool-names.js"},{"path":"src/utils/path-security.ts","kind":"import-statement","original":"../utils/path-security.js"}],"format":"esm"},"src/session/index.ts":{"bytes":1182,"imports":[{"path":"src/session/id-generator.ts","kind":"import-statement","original":"./id-generator.js"},{"path":"src/session/transcript.ts","kind":"import-statement","original":"./transcript.js"},{"path":"src/session/checkpoint.ts","kind":"import-statement","original":"./checkpoint.js"},{"path":"src/session/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/session/registry.ts","kind":"import-statement","original":"./registry.js"},{"path":"src/session/manager.ts","kind":"import-statement","original":"./manager.js"},{"path":"src/session/direct-shell.ts","kind":"import-statement","original":"./direct-shell.js"},{"path":"src/session/recent-sessions.ts","kind":"import-statement","original":"./recent-sessions.js"},{"path":"src/session/turn-restore.ts","kind":"import-statement","original":"./turn-restore.js"}],"format":"esm"}},"outputs":{"dist/session/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"crypto","kind":"import-statement","external":true},{"path":"fs/promises","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"os","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["CheckpointManager","DIRECT_SHELL_CONTEXT_WARNING","MAX_DIRECT_SHELL_OUTPUT_CHARS","SessionLock","SessionManager","SessionRegistry","TranscriptWriter","TurnRestoreManager","createDirectShellMessage","forgetRecentSession","forgetRecentSessionById","formatDirectShellContext","generateSessionId","getRecentSessionsIndexPath","isDirectShellMessage","isValidSessionId","loadRecentSessionsIndex","lookupRecentSession","normalizeDirectShellResultRecord","normalizeWorkingDirectory","parseSessionId","readSessionFormatVersion","recordRecentSession"],"entryPoint":"src/session/index.ts","inputs":{"src/session/id-generator.ts":{"bytesInOutput":338},"src/session/index.ts":{"bytesInOutput":0},"src/session/transcript.ts":{"bytesInOutput":6599},"src/utils/fs.ts":{"bytesInOutput":1185},"src/utils/json.ts":{"bytesInOutput":170},"src/utils/logger.ts":{"bytesInOutput":484},"src/session/direct-shell.ts":{"bytesInOutput":1071},"src/session/checkpoint.ts":{"bytesInOutput":2300},"src/tools/tool-names.ts":{"bytesInOutput":189},"src/session/lock.ts":{"bytesInOutput":3190},"src/runtime/shutdown.ts":{"bytesInOutput":400},"src/version.ts":{"bytesInOutput":16},"src/session/registry.ts":{"bytesInOutput":2691},"src/utils/path-security.ts":{"bytesInOutput":310},"src/session/recent-sessions.ts":{"bytesInOutput":1555},"src/utils/platform.ts":{"bytesInOutput":226},"src/session/manager.ts":{"bytesInOutput":4163},"src/session/turn-restore.ts":{"bytesInOutput":13081}},"bytes":38603}}}
|