@robota-sdk/agent-session 3.0.0-beta.64

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.
@@ -0,0 +1,6 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@robota-sdk/agent-core`),t=require(`node:crypto`),n=require(`node:fs`),r=require(`node:path`),i=require(`fs`),a=require(`path`);const o=`unknown_tool`;function s(e){return{knownToolNames:new Set(e.knownToolNames),unknownToolCallIds:new Set,...e.onToolExecution&&{onToolExecution:e.onToolExecution}}}function c(e,t,n){if(e.onToolExecution){if(t===`tool_execution_request`){l(e,n);return}t===`tool_execution_result`&&u(e,n)}}function l(e,t){let n=f(t.toolName),r=f(t.toolCallId);!n||!r||e.knownToolNames.has(n)||(e.unknownToolCallIds.add(r),e.onToolExecution?.({type:`start`,toolName:n,toolArgs:d(t.parameters)}))}function u(e,t){let n=f(t.toolName),r=f(t.toolCallId);if(!n||!r)return;let i=p(t.metadata);if(!(e.unknownToolCallIds.has(r)||i?.errorCode===o))return;e.unknownToolCallIds.delete(r);let a=f(t.error)??`Tool "${n}" is not registered.`;e.onToolExecution?.({type:`end`,toolName:n,success:!1,toolResultData:JSON.stringify({success:!1,error:a,errorCode:o,requestedTool:f(i?.requestedTool)??n,availableTools:m(i?.availableTools)})})}function d(e){let t=p(e);if(!t)return;let n={};for(let[e,r]of Object.entries(t))(typeof r==`string`||typeof r==`number`||typeof r==`boolean`||typeof r==`object`&&r)&&(n[e]=r);return n}function f(e){return typeof e==`string`&&e.length>0?e:void 0}function p(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function m(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}async function h(t,n,r,i){if(r.contextTracker.updateFromHistory(r.robota.getHistory()),r.contextTracker.shouldAutoCompact()){let e=r.aiProvider,t=e.onTextDelta;e.onTextDelta=void 0;try{await r.compact()}finally{e.onTextDelta=t}}r.log(`user`,{content:t});let a=await(0,e.runHooks)(r.hooks,`UserPromptSubmit`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`UserPromptSubmit`,user_message:n??t,prompt:n??t,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors),o=[r.sessionStartStdout,a.stdout].filter(Boolean).join(`
2
+ `),l=o?`<system-reminder>\n${o}\n</system-reminder>\n${t}`:t;r.clearSessionStartStdout();let u=r.robota.getHistory(),d=JSON.stringify(u),f=(0,e.getProviderCapabilities)(r.aiProvider);r.log(`pre_run`,{historyLength:u.length,historyChars:d.length,historyEstTokens:Math.ceil(d.length/4),input:l,history:u,model:r.model,provider:r.aiProvider.name,maxTokens:r.contextTracker.getContextState().maxTokens,nativeWebSearchSupported:f.nativeWebTools.webSearch.supported,nativeWebSearchEnabled:f.nativeWebTools.webSearch.enabled,nativeWebFetchSupported:f.nativeWebTools.webFetch.supported,nativeWebFetchEnabled:f.nativeWebTools.webFetch.enabled}),r.contextTracker.updateFromHistory([...u,(0,e.createUserMessage)(l)]),r.onContextUpdate?.(r.contextTracker.getContextState());let p;try{let e=s({knownToolNames:r.knownToolNames??[],...r.onToolExecution&&{onToolExecution:r.onToolExecution}}),t=r.onTextDelta?e=>{r.log(`text_delta`,{delta:e}),r.onTextDelta?.(e)}:void 0;if(p=await r.robota.run(l,{signal:i,maxExecutionRounds:r.maxTurns??0,onExecutionEvent:(t,n)=>{r.log(t,n),c(e,t,n)},...t&&{onTextDelta:t}}),i.aborted)throw new DOMException(`Aborted`,`AbortError`)}catch(t){throw r.log(`error`,{message:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack??``:``,historyLength:r.robota.getHistory().length}),(0,e.runHooks)(r.hooks,`StopFailure`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`StopFailure`,reason:t instanceof Error?t.message:String(t),stop_hook_active:!1,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors).catch(()=>{}),t}let m=r.robota.getHistory(),h=m.map(e=>{let t=`toolCalls`in e&&Array.isArray(e.toolCalls)&&e.toolCalls.length>0,n=t?e.toolCalls.map(e=>e.function.name):[];return{role:e.role,contentLength:typeof e.content==`string`?e.content.length:0,hasToolCalls:t,toolCallNames:n,...e.metadata?{metadata:e.metadata}:{}}});r.log(`assistant`,{content:p,historyLength:m.length,estimatedChars:JSON.stringify(m).length,history:m,historyStructure:h}),r.contextTracker.updateFromHistory(m);let g=r.contextTracker.getContextState();return r.onContextUpdate?.(g),r.log(`context`,{maxTokens:g.maxTokens,usedTokens:g.usedTokens,usedPercentage:g.usedPercentage,remainingPercentage:g.remainingPercentage}),(0,e.runHooks)(r.hooks,`Stop`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`Stop`,response:p.substring(0,500),last_assistant_message:p,stop_hook_active:!1,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors).catch(()=>{}),r.getSessionStore()&&r.persistSession(),p}async function g(t,n){let r=n.robota.getHistory();if(r.length===0)return;n.contextTracker.updateFromHistory(r);let i=n.contextTracker.getContextState(),a=r.filter(e=>e.role!==`system`),o=await n.compactionOrchestrator.compact(n.aiProvider,a,t);n.robota.clearHistory(),n.robota.injectMessage(`system`,n.systemMessage),n.robota.injectMessage(`assistant`,`[Context Summary]\n${o}`),n.contextTracker.updateFromHistory(n.robota.getHistory());let s={session_id:n.sessionId,cwd:n.cwd,hook_event_name:`PostCompact`,trigger:n.trigger,compact_summary:o};(0,e.runHooks)(n.hooks,`PostCompact`,s,n.hookTypeExecutors).catch(()=>{});let c=n.contextTracker.getContextState();n.log(`context_compact`,{trigger:n.trigger,before:i,after:c}),n.onCompactEventCallback?.({trigger:n.trigger,before:i,after:c}),n.onCompactCallback&&n.onCompactCallback(o)}function _(e){let t=e.robota.getHistory(),n=new Date().toISOString(),r=e.sessionStore.load(e.sessionId),i={id:e.sessionId,name:r?.name,cwd:e.cwd,createdAt:r?.createdAt??n,updatedAt:n,messages:t,history:e.getFullHistory(),systemPrompt:e.systemPrompt,toolSchemas:e.toolSchemas};e.sessionStore.save(i)}function v(e,t,n){e.configureNativeWebTools?.({webSearch:!0}),`onServerToolUse`in e&&(e.onServerToolUse=(e,t)=>{n(`server_tool`,{tool:e,...t})})}function y(t,n,r,i,a,o,s){(0,e.runHooks)(r,`SessionStart`,{session_id:t,cwd:n,hook_event_name:`SessionStart`,...o!==void 0&&{permission_mode:o},...s!==void 0&&{transcript_path:s},env:{CLAUDE_PROJECT_DIR:n,CLAUDE_SESSION_ID:t}},i).then(e=>{e.stdout&&a(e.stdout)}).catch(()=>{})}async function ee(t,n,r,i,a,o,s){await(0,e.runHooks)(i,`SessionEnd`,{session_id:t,cwd:n,hook_event_name:`SessionEnd`,reason:r,...o!==void 0&&{permission_mode:o},...s!==void 0&&{transcript_path:s},env:{CLAUDE_PROJECT_DIR:n,CLAUDE_SESSION_ID:t}},a)}var b=class{getPermissionMode(){return this.permissionMode}setPermissionMode(e){this.permissionMode=e}getSessionId(){return this.sessionId}getSystemMessage(){return this.systemMessage}updateSystemMessage(e){this.systemMessage=e,this.robota.setModel({provider:this.aiProvider.name,model:this.model,systemMessage:e})}getToolSchemas(){return this.toolSchemas}getMessageCount(){return this.messageCount}getSessionAllowedTools(){return this.permissionEnforcer.getSessionAllowedTools()}clearSessionAllowedTools(){this.permissionEnforcer.clearSessionAllowedTools()}abort(){this.abortController&&=(this.abortController.abort(),null)}isRunning(){return this.abortController!==null}getContextState(){return this.contextTracker.getContextState()}getAutoCompactThreshold(){return this.contextTracker.getAutoCompactThreshold()}setAutoCompactThreshold(e){this.contextTracker.setAutoCompactThreshold(e)}getHistory(){return this.robota.getHistory()}getFullHistory(){return this.robota.getFullHistory()}addHistoryEntry(e){this.robota.addHistoryEntry(e)}injectMessage(e,t,n){this.robota.injectMessage(e,t,n)}clearHistory(){this.robota.clearHistory(),this.contextTracker.reset()}};const x={success:!0,data:JSON.stringify({success:!1,output:``,error:`Permission denied. The user did not approve this action.`}),metadata:{}};function S(e){if(typeof e.data!=`string`||e.data.length<=3e4)return e;let t=15e3,n=e.data.substring(0,t),r=e.data.substring(e.data.length-t),i=`${n}\n\n[... output truncated: ${e.data.length.toLocaleString()} chars total, showing first and last ${t.toLocaleString()} chars ...]\n\n${r}`;return{...e,data:i}}function te(e,t,n,r,i,a){return{session_id:e,cwd:t,hook_event_name:`PreToolUse`,tool_name:n,tool_input:r,...i!==void 0&&{permission_mode:i},...a!==void 0&&{transcript_path:a}}}async function C(t,n,r){let i=await(0,e.runHooks)(t,`PreToolUse`,n,r);return i.blocked?{success:!0,data:JSON.stringify({blocked:!0,reason:i.reason??`Blocked by hook`}),metadata:{}}:null}function w(t,n,r,i){(0,e.runHooks)(t,`PostToolUse`,{...n,hook_event_name:`PostToolUse`,tool_output:typeof r.data==`string`?r.data:JSON.stringify(r.data)},i).catch(()=>{})}var T=class{sessionId;cwd;getPermissionMode;config;terminal;permissionHandler;promptForApprovalFn;sessionLogger;onToolExecution;hookTypeExecutors;transcriptPath;sessionAllowedTools=new Set;constructor(e){this.sessionId=e.sessionId,this.cwd=e.cwd,this.getPermissionMode=e.getPermissionMode,this.config=e.config,this.terminal=e.terminal,this.permissionHandler=e.permissionHandler,this.promptForApprovalFn=e.promptForApprovalFn,this.sessionLogger=e.sessionLogger,this.onToolExecution=e.onToolExecution,this.hookTypeExecutors=e.hookTypeExecutors,this.transcriptPath=e.transcriptPath}wrapTools(e){return e.map(e=>this.wrapToolWithPermission(e))}getSessionAllowedTools(){return[...this.sessionAllowedTools]}clearSessionAllowedTools(){this.sessionAllowedTools.clear()}wrapToolWithPermission(e){let t=this,n=e.execute.bind(e),r=Object.create(e);return r.execute=async(r,i)=>{try{let a=e.getName();t.log(`tool_call`,{tool:a,args:r});let o=te(t.sessionId,t.cwd,a,r,t.getPermissionMode(),t.transcriptPath),s=await C(t.config.hooks,o,t.hookTypeExecutors);if(s)return t.log(`tool_blocked`,{tool:a,reason:`hook`}),s;if(!await t.checkPermission(a,r))return t.log(`tool_denied`,{tool:a,reason:`permission`}),t.onToolExecution?.({type:`end`,toolName:a,toolArgs:r,success:!1,denied:!0}),x;t.onToolExecution?.({type:`start`,toolName:a,toolArgs:r});let c=await n(r,i),l=S(c);t.onToolExecution?.({type:`end`,toolName:a,toolArgs:r,success:l.success,toolResultData:typeof l.data==`string`?l.data:JSON.stringify(l.data)});let u=typeof l.data==`string`?l.data.length:JSON.stringify(l.data).length;return t.log(`tool_result`,{tool:a,success:l.success,dataChars:u,truncated:l!==c}),w(t.config.hooks,o,l,t.hookTypeExecutors),l}catch(e){let t=e instanceof Error?e.message:String(e);return{success:!0,data:JSON.stringify({success:!1,output:``,error:t}),metadata:{}}}},r}async checkPermission(t,n){let r=(0,e.evaluatePermission)(t,n,this.getPermissionMode(),{allow:this.config.permissions.allow,deny:this.config.permissions.deny});if(r===`auto`)return!0;if(r===`deny`)return!1;if(this.sessionAllowedTools.has(t))return!0;if(this.permissionHandler){let e=await this.permissionHandler(t,n);return e===`allow-session`?(this.sessionAllowedTools.add(t),!0):e}return this.promptForApprovalFn?this.promptForApprovalFn(this.terminal,t,n):!1}log(e,t){this.sessionLogger?.log(this.sessionId,e,t)}};const E=.835;var D=class{contextUsedTokens=0;contextMaxTokens;autoCompactThreshold;constructor(t,n,r){this.contextMaxTokens=n??(0,e.getModelContextWindow)(t),this.autoCompactThreshold=O(r)}getContextState(){let e=Math.min(100,this.contextUsedTokens/this.contextMaxTokens*100);return{maxTokens:this.contextMaxTokens,usedTokens:this.contextUsedTokens,usedPercentage:Math.round(e*100)/100,remainingPercentage:Math.round((100-e)*100)/100}}shouldAutoCompact(){return this.autoCompactThreshold===!1?!1:this.getContextState().usedPercentage>=this.autoCompactThreshold*100}getAutoCompactThreshold(){return this.autoCompactThreshold}setAutoCompactThreshold(e){this.autoCompactThreshold=O(e)}updateFromHistory(t){this.contextUsedTokens=(0,e.estimateContextTokensFromMessages)(t).usedTokens}reset(){this.contextUsedTokens=0}};function O(e){if(e===void 0)return E;if(e===!1)return!1;if(!Number.isFinite(e)||e<=0||e>1)throw RangeError(`autoCompactThreshold must be a number greater than 0 and at most 1.`);return e}var k=class{sessionId;cwd;model;hooks;compactInstructions;hookTypeExecutors;constructor(e){this.sessionId=e.sessionId,this.cwd=e.cwd,this.model=e.model,this.hooks=e.hooks,this.compactInstructions=e.compactInstructions,this.hookTypeExecutors=e.hookTypeExecutors}async compact(n,r,i){if(r.length===0)return``;let a=i===void 0?`auto`:`manual`,o={session_id:this.sessionId,cwd:this.cwd,hook_event_name:`PreCompact`,trigger:a};await(0,e.runHooks)(this.hooks,`PreCompact`,o,this.hookTypeExecutors);let s=this.buildCompactionPrompt(r,i),c=await n.chat([{id:(0,t.randomUUID)(),role:`user`,content:s,state:`complete`,timestamp:new Date}],{model:this.model});return typeof c.content==`string`?c.content:`(compaction failed)`}buildCompactionPrompt(e,t){let n=t??this.compactInstructions??``;return[`Summarize the following conversation concisely, preserving:`,`- User's original requests and goals`,`- Key decisions and conclusions`,`- Important code changes and file paths`,`- Current task status and next steps`,n?`\nAdditional focus:\n${n}\n`:``,`Drop verbose tool outputs, debugging steps, and exploratory work that didn't lead to results.`,``,`Conversation:`,e.map(e=>{let t=typeof e.content==`string`?e.content:JSON.stringify(e.content);return`${e.role}: ${t}`}).join(`
3
+ `)].join(`
4
+ `)}};function A(e,t,n,r,i){return new T({sessionId:t,cwd:n,getPermissionMode:r,config:{permissions:e.permissions??{allow:[],deny:[]},hooks:e.hooks},terminal:e.terminal,permissionHandler:e.permissionHandler,promptForApprovalFn:e.promptForApproval,sessionLogger:e.sessionLogger,onToolExecution:e.onToolExecution,hookTypeExecutors:e.hookTypeExecutors,transcriptPath:i})}function j(e,t,n,r){return{contextTracker:new D(t,e.contextMaxTokens,e.autoCompactThreshold),compactionOrchestrator:new k({sessionId:n,cwd:r,model:t,hooks:e.hooks,compactInstructions:e.compactInstructions,hookTypeExecutors:e.hookTypeExecutors})}}function M(t,n,r,i,a,o){let s=n.wrapTools(r);return new e.Robota({name:t.agentName??`agent`,aiProviders:[i],defaultModel:{provider:i.name,model:a,systemMessage:o},systemMessage:o,tools:s,logging:{enabled:!1},...t.providerTimeout!==void 0&&{timeout:t.providerTimeout}})}var N=class extends b{robota;permissionEnforcer;contextTracker;permissionMode;sessionId;aiProvider;toolSchemas;model;systemMessage;messageCount=0;abortController=null;terminal;sessionStore;cwd;hooks;hookTypeExecutors;onTextDeltaCallback;onContextUpdateCallback;onToolExecutionCallback;onCompactCallback;onCompactEventCallback;sessionLogger;maxTurns;compactionOrchestrator;shutdownPromise=null;sessionStartStdout=``;transcriptPath;constructor(t){super();let{tools:n,provider:r,systemMessage:i}=t;this.terminal=t.terminal,this.sessionStore=t.sessionStore,this.systemMessage=i,this.toolSchemas=n.map(e=>e.schema),this.cwd=process.cwd(),this.sessionLogger=t.sessionLogger,this.hooks=t.hooks,this.hookTypeExecutors=t.hookTypeExecutors,this.onTextDeltaCallback=t.onTextDelta,this.onContextUpdateCallback=t.onContextUpdate,this.onToolExecutionCallback=t.onToolExecution,this.onCompactCallback=t.onCompact,this.onCompactEventCallback=t.onCompactEvent,this.maxTurns=t.maxTurns,this.model=t.model??`claude-sonnet-4-5`,this.sessionId=t.sessionId??`session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,this.permissionMode=t.permissionMode??(t.defaultTrustLevel?e.TRUST_TO_MODE[t.defaultTrustLevel]:void 0)??`default`,this.transcriptPath=t.sessionStore?.getFilePath?.(this.sessionId),this.log(`session_init`,{cwd:this.cwd,systemPromptLength:i.length,systemPrompt:i,toolSchemas:this.toolSchemas,model:this.model,provider:r.name}),this.aiProvider=r,v(r,t,(e,t)=>this.log(e,t)),this.permissionEnforcer=A(t,this.sessionId,this.cwd,()=>this.permissionMode,this.transcriptPath);let{contextTracker:a,compactionOrchestrator:o}=j(t,this.model,this.sessionId,this.cwd);this.contextTracker=a,this.compactionOrchestrator=o,this.robota=M(t,this.permissionEnforcer,n,r,this.model,i),y(this.sessionId,this.cwd,this.hooks,this.hookTypeExecutors,e=>void(this.sessionStartStdout=e),this.permissionMode,this.transcriptPath)}async run(e,t){this.abortController=new AbortController;let{signal:n}=this.abortController;try{let r=await h(e,t,this.buildRunContext(),n);return this.messageCount+=1,r}finally{this.abortController=null}}log(e,t){this.sessionLogger?.log(this.sessionId,e,t)}persistSessionInternal(){this.sessionStore&&_({sessionId:this.sessionId,cwd:this.cwd,systemPrompt:this.systemMessage,toolSchemas:this.toolSchemas,sessionStore:this.sessionStore,robota:this.robota,getFullHistory:()=>this.getFullHistory()})}shutdown(e={}){if(this.shutdownPromise)return this.shutdownPromise;let t=e.reason??`other`;return this.shutdownPromise=(async()=>{this.abort(),this.log(`session_shutdown`,{reason:t}),this.persistSessionInternal(),await ee(this.sessionId,this.cwd,t,this.hooks,this.hookTypeExecutors,this.permissionMode,this.transcriptPath)})(),this.shutdownPromise}async compact(e,t=`manual`){await g(e,{sessionId:this.sessionId,cwd:this.cwd,systemMessage:this.systemMessage,robota:this.robota,aiProvider:this.aiProvider,compactionOrchestrator:this.compactionOrchestrator,contextTracker:this.contextTracker,hooks:this.hooks,hookTypeExecutors:this.hookTypeExecutors,onCompactCallback:this.onCompactCallback,onCompactEventCallback:this.onCompactEventCallback,trigger:t,log:(e,t)=>this.log(e,t)})}buildRunContext(){return{sessionId:this.sessionId,cwd:this.cwd,model:this.model,robota:this.robota,aiProvider:this.aiProvider,contextTracker:this.contextTracker,hooks:this.hooks,hookTypeExecutors:this.hookTypeExecutors,sessionStartStdout:this.sessionStartStdout,log:(e,t)=>this.log(e,t),compact:()=>this.compact(void 0,`auto`),persistSession:()=>this.persistSessionInternal(),getSessionStore:()=>!!this.sessionStore,clearSessionStartStdout:()=>void(this.sessionStartStdout=``),permissionMode:this.permissionMode,transcriptPath:this.transcriptPath,maxTurns:this.maxTurns,onTextDelta:this.onTextDeltaCallback,onContextUpdate:this.onContextUpdateCallback,onToolExecution:this.onToolExecutionCallback,knownToolNames:this.toolSchemas.map(e=>e.name)}}};const P=/^(api[-_]?key|authorization|access[-_]?token|refresh[-_]?token|secret|password|x[-_]?api[-_]?key)$/i;var F=class{logDir;options;constructor(e,t={}){this.logDir=e,this.options={externalPayloadThresholdBytes:t.externalPayloadThresholdBytes??32768,redactedValue:t.redactedValue??`[REDACTED]`};try{(0,n.mkdirSync)(e,{recursive:!0})}catch{}}log(e,t,i){try{let a=I(e,this.logDir,i,this.options),o=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e,event:t,...a});(0,n.appendFileSync)((0,r.join)(this.logDir,`${e}.jsonl`),o+`
5
+ `)}catch{}}};function I(e,t,n,r){let i={};for(let[a,o]of Object.entries(n))i[a]=L(e,t,a,o,r);return i}function L(e,t,n,r,i){if(P.test(n))return i.redactedValue;if(r==null||typeof r==`string`||typeof r==`number`)return R(e,t,r,i);if(typeof r==`boolean`)return r;if(r instanceof Date)return r.toISOString();if(Array.isArray(r))return R(e,t,r.map(r=>L(e,t,n,r,i)),i);if(typeof r==`object`){let n=r,a={};for(let[r,o]of Object.entries(n))a[r]=L(e,t,r,o,i);return R(e,t,a,i)}return String(r)}function R(e,i,a,o){let s=JSON.stringify(a);if(s===void 0)return a;let c=Buffer.byteLength(s);if(c<=o.externalPayloadThresholdBytes)return a;let l=(0,t.createHash)(`sha256`).update(s).digest(`hex`),u=`${e}.payloads`,d=(0,r.join)(u,`${l}.json`),f=(0,r.join)(i,u),p=(0,r.join)(i,d);return(0,n.mkdirSync)(f,{recursive:!0}),(0,n.existsSync)(p)||(0,n.writeFileSync)(p,s,`utf-8`),{kind:`external-payload`,encoding:`json`,sha256:l,byteLength:c,relativePath:d}}var z=class{log(){}};function B(e){let t=[],n=V(),r=ne();return e.forEach((e,i)=>{J(e,i,t),H(n,e,i),U(r,e,i)}),W(n,t),G(r,t),{ok:t.length===0,issues:t}}function V(){return{requests:new Map,nativeRawPayloads:new Set,rawResponses:new Set,normalizedResponses:new Set}}function ne(){return{requests:new Map,results:new Set}}function H(e,t,n){let r=K(t);r&&(t.event===`provider_request`&&e.requests.set(r.key,{executionId:r.executionId,round:r.round,index:n}),t.event===`provider_response_raw`&&e.rawResponses.add(r.key),t.event===`provider_native_raw_payload`&&(t.payloadKind===`response`||t.payloadKind===`stream_event`)&&e.nativeRawPayloads.add(r.key),t.event===`provider_response_normalized`&&e.normalizedResponses.add(r.key))}function U(e,t,n){let r=q(t);r&&(t.event===`tool_execution_request`&&e.requests.set(r.key,{executionId:r.executionId,toolCallId:r.toolCallId,index:n}),t.event===`tool_execution_result`&&e.results.add(r.key))}function W(e,t){for(let[n,r]of e.requests)e.nativeRawPayloads.has(n)||t.push({code:`PROVIDER_NATIVE_RAW_PAYLOAD_MISSING`,message:`Provider request ${n} has no provider-native raw response or stream payload event.`,eventIndex:r.index,executionId:r.executionId,round:r.round}),e.rawResponses.has(n)||t.push({code:`PROVIDER_RESPONSE_RAW_MISSING`,message:`Provider request ${n} has no raw response event.`,eventIndex:r.index,executionId:r.executionId,round:r.round}),e.normalizedResponses.has(n)||t.push({code:`PROVIDER_RESPONSE_NORMALIZED_MISSING`,message:`Provider request ${n} has no normalized response event.`,eventIndex:r.index,executionId:r.executionId,round:r.round})}function G(e,t){for(let[n,r]of e.requests)e.results.has(n)||t.push({code:`TOOL_RESULT_MISSING`,message:`Tool request ${n} has no terminal result event.`,eventIndex:r.index,executionId:r.executionId,toolCallId:r.toolCallId})}function K(e){if(typeof e.executionId!=`string`)return;let t=typeof e.round==`number`?e.round:Number(e.round);if(Number.isFinite(t))return{key:`${e.executionId}:${t}`,executionId:e.executionId,round:t}}function q(e){if(typeof e.executionId!=`string`)return;let t=typeof e.toolCallId==`string`?e.toolCallId:typeof e.toolExecutionId==`string`?e.toolExecutionId:void 0;if(t)return{key:`${e.executionId}:${t}`,executionId:e.executionId,toolCallId:t}}function J(e,t,n){if(Array.isArray(e)){e.forEach(e=>J(e,t,n));return}if(Y(e)){if(e.kind===`external-payload`){(e.encoding!==`json`||typeof e.sha256!=`string`||typeof e.relativePath!=`string`||typeof e.byteLength!=`number`)&&n.push({code:`PAYLOAD_REFERENCE_INVALID`,message:`External payload reference is missing required replay fields.`,eventIndex:t});return}Object.values(e).forEach(e=>J(e,t,n))}}function Y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function X(e){return(0,n.existsSync)(e)?(0,n.readFileSync)(e,`utf-8`).split(`
6
+ `).map(e=>e.trim()).filter(e=>e.length>0).map(e=>JSON.parse(e)):[]}function Z(t){let n=[],r=[],i={backgroundTaskEvents:[],backgroundJobGroupEvents:[],memoryEvents:[]},a,o,s,c;for(let l of t){if(a??=l.sessionId,s??=l.timestamp,c=l.timestamp,l.event===`session_init`&&(o=typeof l.cwd==`string`?l.cwd:o),l.event===`history_mutation`&&l.mutation===`append_message`){let t=ie(l.message);t&&(n.push(t),r.push((0,e.messageToHistoryEntry)(t)))}re(l,i)}return{sessionId:a,cwd:o,createdAt:s,updatedAt:c,messages:n,history:r,backgroundTaskEvents:i.backgroundTaskEvents,backgroundJobGroupEvents:i.backgroundJobGroupEvents,memoryEvents:i.memoryEvents}}function re(e,t){if(e.event===`background_task_event`){$(t.backgroundTaskEvents,e,`backgroundEvent`,`data`);return}if(e.event===`background_job_group_event`){$(t.backgroundJobGroupEvents,e,`backgroundJobGroupEvent`,`data`);return}e.event===`memory_event`&&$(t.memoryEvents,e,`memoryEvent`,`data`)}function ie(e){if(!ae(e))return;let t=e.role;if(t!==`user`&&t!==`assistant`&&t!==`system`&&t!==`tool`)return;let n=typeof e.id==`string`?e.id:`${t}-${Date.now()}`,r=e.timestamp instanceof Date?e.timestamp:new Date(typeof e.timestamp==`string`?e.timestamp:Date.now());return{...e,id:n,role:t,timestamp:r}}function ae(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Q(e,t){let n=e[t];if(!(typeof n!=`object`||!n||Array.isArray(n)||n instanceof Date))return n}function $(e,t,n,r){let i=Q(t,n)??Q(t,r);i&&e.push(i)}function oe(){return process.env.HOME??process.env.USERPROFILE??`/`}var se=class{baseDir;constructor(e){this.baseDir=e??(0,a.join)(oe(),`.robota`,`sessions`)}ensureDir(){(0,i.existsSync)(this.baseDir)||(0,i.mkdirSync)(this.baseDir,{recursive:!0})}filePath(e){return(0,a.join)(this.baseDir,`${e}.json`)}getFilePath(e){return this.filePath(e)}save(e){this.ensureDir(),(0,i.writeFileSync)(this.filePath(e.id),JSON.stringify(e,null,2),`utf-8`)}load(e){let t=this.filePath(e);if(!(0,i.existsSync)(t))return;let n=(0,i.readFileSync)(t,`utf-8`);return JSON.parse(n)}list(){if(!(0,i.existsSync)(this.baseDir))return[];let e=(0,i.readdirSync)(this.baseDir).filter(e=>e.endsWith(`.json`)),t=[];for(let n of e)try{let e=(0,i.readFileSync)((0,a.join)(this.baseDir,n),`utf-8`),r=JSON.parse(e);t.push(r)}catch{}return t.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime())}delete(e){let t=this.filePath(e);(0,i.existsSync)(t)&&(0,i.unlinkSync)(t)}};exports.AUTO_COMPACT_THRESHOLD=E,exports.CompactionOrchestrator=k,exports.ContextWindowTracker=D,exports.FileSessionLogger=F,exports.PermissionEnforcer=T,exports.Session=N,exports.SessionStore=se,exports.SilentSessionLogger=z,exports.loadSessionLogEntries=X,exports.replaySessionLogEntries=Z,exports.validateSessionReplayLogEntries=B;
@@ -0,0 +1,466 @@
1
+ import { IAIProvider, IContextWindowState, IContextWindowState as IContextWindowState$1, IHistoryEntry, IHookTypeExecutor, ISession, ISpinner, ITerminalOutput, IToolSchema, IToolWithEventService, Robota, TPermissionMode, TSessionEndReason, TToolArgs, TUniversalMessage, TUniversalValue } from "@robota-sdk/agent-core";
2
+
3
+ //#region src/session-logger.d.ts
4
+ /**
5
+ * Session Logger — pluggable logging interface for session events.
6
+ *
7
+ * ISessionLogger defines the contract. FileSessionLogger is the default
8
+ * implementation that writes JSONL to disk. Consumers can implement their
9
+ * own (e.g., remote, database, silent) and inject via Session constructor.
10
+ */
11
+ /** Session log event data — extensible record of event metadata. */
12
+ type TSessionLogValue = string | number | boolean | object | null | undefined;
13
+ type TSessionLogData = Record<string, TSessionLogValue>;
14
+ interface IExternalPayloadReference {
15
+ kind: 'external-payload';
16
+ encoding: 'json';
17
+ sha256: string;
18
+ byteLength: number;
19
+ relativePath: string;
20
+ }
21
+ interface IFileSessionLoggerOptions {
22
+ externalPayloadThresholdBytes?: number;
23
+ redactedValue?: string;
24
+ }
25
+ /**
26
+ * Session logger interface — injected into Session for pluggable logging.
27
+ *
28
+ * Implementations decide where and how to persist session events.
29
+ * The Session class calls log() for every significant action.
30
+ */
31
+ interface ISessionLogger {
32
+ /** Log a session event with structured data. */
33
+ log(sessionId: string, event: string, data: TSessionLogData): void;
34
+ }
35
+ /**
36
+ * File-based session logger — writes JSONL to {logDir}/{sessionId}.jsonl.
37
+ *
38
+ * This is the default implementation used by the CLI.
39
+ * Each line is a self-contained JSON object with timestamp, sessionId, event, and data.
40
+ */
41
+ declare class FileSessionLogger implements ISessionLogger {
42
+ private readonly logDir;
43
+ private readonly options;
44
+ constructor(logDir: string, options?: IFileSessionLoggerOptions);
45
+ log(sessionId: string, event: string, data: TSessionLogData): void;
46
+ }
47
+ /** No-op logger — used when logging is disabled. */
48
+ declare class SilentSessionLogger implements ISessionLogger {
49
+ log(): void;
50
+ }
51
+ //#endregion
52
+ //#region src/permission-types.d.ts
53
+ /**
54
+ * Permission handler result:
55
+ * - true: allow this invocation
56
+ * - false: deny this invocation
57
+ * - 'allow-session': allow this invocation and auto-approve this tool for the rest of the session
58
+ */
59
+ type TPermissionResult = boolean | 'allow-session';
60
+ /**
61
+ * Custom permission handler — called when a tool needs user approval.
62
+ * Returns true to allow, false to deny, or 'allow-session' to remember for the session.
63
+ */
64
+ type TPermissionHandler = (toolName: string, toolArgs: TToolArgs) => Promise<TPermissionResult>;
65
+ interface IPermissionEnforcerOptions {
66
+ sessionId: string;
67
+ cwd: string;
68
+ getPermissionMode: () => TPermissionMode;
69
+ config: {
70
+ permissions: {
71
+ allow: string[];
72
+ deny: string[];
73
+ };
74
+ hooks?: Record<string, unknown>;
75
+ };
76
+ terminal: ITerminalOutput;
77
+ permissionHandler?: TPermissionHandler;
78
+ promptForApprovalFn?: (terminal: ITerminalOutput, toolName: string, toolArgs: TToolArgs) => Promise<boolean>;
79
+ sessionLogger?: ISessionLogger;
80
+ onToolExecution?: (event: {
81
+ type: 'start' | 'end';
82
+ toolName: string;
83
+ toolArgs?: TToolArgs;
84
+ success?: boolean;
85
+ denied?: boolean;
86
+ toolResultData?: string;
87
+ }) => void;
88
+ /** Additional hook type executors (e.g. prompt, agent) beyond the core defaults. */
89
+ hookTypeExecutors?: IHookTypeExecutor[];
90
+ /** Absolute path to session transcript file — passed to PreToolUse hook inputs as transcript_path */
91
+ transcriptPath?: string;
92
+ }
93
+ //#endregion
94
+ //#region src/permission-enforcer.d.ts
95
+ declare class PermissionEnforcer {
96
+ private readonly sessionId;
97
+ private readonly cwd;
98
+ private readonly getPermissionMode;
99
+ private readonly config;
100
+ private readonly terminal;
101
+ private readonly permissionHandler?;
102
+ private readonly promptForApprovalFn?;
103
+ private readonly sessionLogger?;
104
+ private readonly onToolExecution?;
105
+ private readonly hookTypeExecutors?;
106
+ private readonly transcriptPath?;
107
+ private readonly sessionAllowedTools;
108
+ constructor(options: IPermissionEnforcerOptions);
109
+ /** Wrap all tools with permission checking */
110
+ wrapTools(tools: IToolWithEventService[]): IToolWithEventService[];
111
+ /** Get tools that have been session-approved (via "Allow always" choice). */
112
+ getSessionAllowedTools(): string[];
113
+ /** Clear all session-scoped allow rules. */
114
+ clearSessionAllowedTools(): void;
115
+ /**
116
+ * Wrap a tool with permission checking.
117
+ * The wrapper intercepts execute() and runs permission evaluation before delegating.
118
+ * If denied, returns a tool result indicating the action was blocked.
119
+ */
120
+ private wrapToolWithPermission;
121
+ /** Evaluate permission for a tool call using the current mode and config */
122
+ checkPermission(toolName: string, toolArgs: TToolArgs): Promise<boolean>;
123
+ /** Delegate session event to the injected logger. */
124
+ private log;
125
+ }
126
+ //#endregion
127
+ //#region src/context-window-tracker.d.ts
128
+ /** Auto-compact when context usage reaches this fraction */
129
+ declare const AUTO_COMPACT_THRESHOLD = 0.835;
130
+ type TAutoCompactThreshold = number | false;
131
+ declare class ContextWindowTracker {
132
+ private contextUsedTokens;
133
+ private readonly contextMaxTokens;
134
+ private autoCompactThreshold;
135
+ constructor(model: string, contextMaxTokens?: number, autoCompactThreshold?: TAutoCompactThreshold);
136
+ /** Get current context window state */
137
+ getContextState(): IContextWindowState$1;
138
+ /** Whether auto-compaction threshold has been exceeded */
139
+ shouldAutoCompact(): boolean;
140
+ /** The auto-compaction policy for this tracker. */
141
+ getAutoCompactThreshold(): TAutoCompactThreshold;
142
+ /** Update the auto-compaction policy for this tracker. */
143
+ setAutoCompactThreshold(autoCompactThreshold: TAutoCompactThreshold): void;
144
+ /**
145
+ * Estimate token usage from conversation history.
146
+ *
147
+ * Uses the shared core estimator so session display, /context, auto-compact, and core
148
+ * execution guards reason about the same effective token state.
149
+ */
150
+ updateFromHistory(history: TUniversalMessage[]): void;
151
+ /** Reset token tracking */
152
+ reset(): void;
153
+ }
154
+ //#endregion
155
+ //#region src/session-store.d.ts
156
+ /** A persisted session record */
157
+ interface ISessionRecord {
158
+ /** Unique session identifier */
159
+ id: string;
160
+ /** Optional human-readable session name */
161
+ name?: string;
162
+ /** Working directory when the session was created */
163
+ cwd: string;
164
+ /** ISO-8601 creation timestamp */
165
+ createdAt: string;
166
+ /** ISO-8601 last-updated timestamp */
167
+ updatedAt: string;
168
+ /** Conversation messages (opaque to the store) */
169
+ messages: unknown[];
170
+ /** Full UI timeline (chat + events) for rendering restoration */
171
+ history?: unknown[];
172
+ /** Exact system prompt used to create the session. */
173
+ systemPrompt?: string;
174
+ /** Tool schemas registered for the session. */
175
+ toolSchemas?: IToolSchema[];
176
+ /** Latest background task snapshots for resume/debugging. */
177
+ backgroundTasks?: unknown[];
178
+ /** Durable non-streaming background task events for resume/debugging. */
179
+ backgroundTaskEvents?: unknown[];
180
+ /** Latest background job group snapshots for resume/debugging. */
181
+ backgroundJobGroups?: unknown[];
182
+ /** Durable background job group events for resume/debugging. */
183
+ backgroundJobGroupEvents?: unknown[];
184
+ /** Durable skill activation events for resume/debugging. */
185
+ skillActivationEvents?: unknown[];
186
+ /** Durable automatic memory events for resume/debugging. */
187
+ memoryEvents?: unknown[];
188
+ /** Memory references used by the latest prompt turn. */
189
+ usedMemoryReferences?: unknown[];
190
+ /** SDK-owned context reference inventory for resume/debugging. */
191
+ contextReferences?: unknown[];
192
+ /** Provider sandbox snapshot identifier for workspace hydration on resume. */
193
+ sandboxSnapshotId?: string;
194
+ }
195
+ /** Minimal persistence port consumed by Session. */
196
+ interface ISessionStore {
197
+ save(session: ISessionRecord): void;
198
+ load(id: string): ISessionRecord | undefined;
199
+ list(): ISessionRecord[];
200
+ delete(id: string): void;
201
+ /** Return the absolute file path for a session file, if the store is file-backed. */
202
+ getFilePath?(id: string): string;
203
+ }
204
+ /**
205
+ * Persistent session store backed by individual JSON files.
206
+ *
207
+ * Construct with a custom `baseDir` to redirect storage (useful in tests).
208
+ */
209
+ declare class SessionStore implements ISessionStore {
210
+ private readonly baseDir;
211
+ constructor(baseDir?: string);
212
+ /** Ensure the storage directory exists */
213
+ private ensureDir;
214
+ /** Absolute path to a session's JSON file */
215
+ private filePath;
216
+ /** Return the absolute file path for a session — implements ISessionStore.getFilePath */
217
+ getFilePath(id: string): string;
218
+ /**
219
+ * Persist a session record to disk.
220
+ * Creates the storage directory if needed.
221
+ */
222
+ save(session: ISessionRecord): void;
223
+ /**
224
+ * Load a session by its ID.
225
+ * Returns `undefined` when the session file does not exist.
226
+ */
227
+ load(id: string): ISessionRecord | undefined;
228
+ /**
229
+ * List all persisted sessions, sorted by `updatedAt` descending (most recent first).
230
+ */
231
+ list(): ISessionRecord[];
232
+ /**
233
+ * Delete a session by its ID.
234
+ * No-ops silently if the session does not exist.
235
+ */
236
+ delete(id: string): void;
237
+ }
238
+ //#endregion
239
+ //#region src/session-types.d.ts
240
+ type TCompactTrigger = 'manual' | 'auto';
241
+ interface ICompactEvent {
242
+ trigger: TCompactTrigger;
243
+ before: IContextWindowState$1;
244
+ after: IContextWindowState$1;
245
+ }
246
+ /** Options for graceful session shutdown. */
247
+ interface ISessionShutdownOptions {
248
+ reason?: TSessionEndReason;
249
+ }
250
+ /** Options for constructing a Session */
251
+ interface ISessionOptions {
252
+ /** Pre-constructed tools to register with the agent */
253
+ tools: IToolWithEventService[];
254
+ /** Pre-constructed AI provider */
255
+ provider: IAIProvider;
256
+ /** Pre-built system message string */
257
+ systemMessage: string;
258
+ /** Terminal I/O for permission prompts */
259
+ terminal: ITerminalOutput;
260
+ /** Permission and hook configuration */
261
+ permissions?: {
262
+ allow: string[];
263
+ deny: string[];
264
+ };
265
+ hooks?: Record<string, unknown>;
266
+ /** Initial permission mode */
267
+ permissionMode?: TPermissionMode;
268
+ /** Default trust level — used to derive permissionMode if not given */
269
+ defaultTrustLevel?: 'safe' | 'moderate' | 'full';
270
+ /** Model name (for context window sizing and Robota config) */
271
+ model?: string;
272
+ /** Provider idle timeout in milliseconds for each model call */
273
+ providerTimeout?: number;
274
+ /** Maximum number of agentic turns per run() call. Undefined = unlimited. */
275
+ maxTurns?: number;
276
+ /** Optional session store for persistence */
277
+ sessionStore?: ISessionStore;
278
+ /** Override session ID (used when resuming a session to reuse the original ID) */
279
+ sessionId?: string;
280
+ /** Custom permission handler (overrides terminal-based prompts, used by Ink UI) */
281
+ permissionHandler?: TPermissionHandler;
282
+ /** Callback for text deltas — enables streaming text to the UI in real-time */
283
+ onTextDelta?: (delta: string) => void;
284
+ /** Callback when context window usage is refreshed */
285
+ onContextUpdate?: (state: IContextWindowState$1) => void;
286
+ /** Custom prompt-for-approval function (injected from CLI) */
287
+ promptForApproval?: (terminal: ITerminalOutput, toolName: string, toolArgs: TToolArgs) => Promise<boolean>;
288
+ /** Callback when a tool starts or finishes execution — enables real-time tool display in UI */
289
+ onToolExecution?: (event: {
290
+ type: 'start' | 'end';
291
+ toolName: string;
292
+ toolArgs?: TToolArgs;
293
+ success?: boolean;
294
+ denied?: boolean;
295
+ toolResultData?: string;
296
+ }) => void;
297
+ /** Callback when context is compacted */
298
+ onCompact?: (summary: string) => void;
299
+ /** Callback with structured compaction metadata */
300
+ onCompactEvent?: (event: ICompactEvent) => void;
301
+ /** Instructions to include in the compaction prompt (e.g. from CLAUDE.md) */
302
+ compactInstructions?: string;
303
+ /** Override context max tokens (otherwise derived from model name) */
304
+ contextMaxTokens?: number;
305
+ /** Auto-compact threshold as a 0-1 fraction. Set false to disable automatic compaction. */
306
+ autoCompactThreshold?: TAutoCompactThreshold;
307
+ /** Session logger — injected for pluggable session event logging. */
308
+ sessionLogger?: ISessionLogger;
309
+ /** Additional hook type executors (e.g. prompt, agent) beyond the core defaults. */
310
+ hookTypeExecutors?: IHookTypeExecutor[];
311
+ /** Name reported to the Robota agent config. Defaults to 'agent' if not provided. */
312
+ agentName?: string;
313
+ }
314
+ //#endregion
315
+ //#region src/session-base.d.ts
316
+ declare abstract class SessionBase {
317
+ protected abstract readonly robota: Robota;
318
+ protected abstract readonly permissionEnforcer: PermissionEnforcer;
319
+ protected abstract readonly contextTracker: ContextWindowTracker;
320
+ protected abstract permissionMode: TPermissionMode;
321
+ protected abstract readonly sessionId: string;
322
+ protected abstract readonly aiProvider: IAIProvider;
323
+ protected abstract readonly toolSchemas: IToolSchema[];
324
+ protected abstract readonly model: string;
325
+ protected abstract systemMessage: string;
326
+ protected abstract messageCount: number;
327
+ protected abstract abortController: AbortController | null;
328
+ getPermissionMode(): TPermissionMode;
329
+ /** Change the active permission mode — future tool calls will use the new mode. */
330
+ setPermissionMode(mode: TPermissionMode): void;
331
+ getSessionId(): string;
332
+ getSystemMessage(): string;
333
+ /** Replace the active system message and propagate to the agent (used by staleness detection). */
334
+ updateSystemMessage(newMessage: string): void;
335
+ getToolSchemas(): IToolSchema[];
336
+ getMessageCount(): number;
337
+ /** Get tools that have been session-approved (via "Allow always" choice). */
338
+ getSessionAllowedTools(): string[];
339
+ clearSessionAllowedTools(): void;
340
+ /** Abort the currently running execution. No-op if nothing is running. */
341
+ abort(): void;
342
+ isRunning(): boolean;
343
+ getContextState(): import("@robota-sdk/agent-core").IContextWindowState;
344
+ getAutoCompactThreshold(): TAutoCompactThreshold;
345
+ setAutoCompactThreshold(threshold: number | false): void;
346
+ getHistory(): import("@robota-sdk/agent-core").TUniversalMessage[];
347
+ getFullHistory(): IHistoryEntry[];
348
+ /** Add an event entry to history (not a chat message) */
349
+ addHistoryEntry(entry: IHistoryEntry): void;
350
+ /** Inject a message into conversation history without execution (used for session restore). */
351
+ injectMessage(role: 'user' | 'assistant' | 'system' | 'tool', content: string, options?: {
352
+ toolCallId?: string;
353
+ name?: string;
354
+ }): void;
355
+ clearHistory(): void;
356
+ }
357
+ //#endregion
358
+ //#region src/session.d.ts
359
+ /** Wraps a Robota agent with project context, permission state, and optional persistence. */
360
+ declare class Session extends SessionBase {
361
+ protected readonly robota: Robota;
362
+ protected readonly permissionEnforcer: PermissionEnforcer;
363
+ protected readonly contextTracker: ContextWindowTracker;
364
+ protected permissionMode: TPermissionMode;
365
+ protected readonly sessionId: string;
366
+ protected readonly aiProvider: IAIProvider;
367
+ protected readonly toolSchemas: IToolSchema[];
368
+ protected readonly model: string;
369
+ protected systemMessage: string;
370
+ protected messageCount: number;
371
+ protected abortController: AbortController | null;
372
+ private readonly terminal;
373
+ private readonly sessionStore?;
374
+ private readonly cwd;
375
+ private readonly hooks?;
376
+ private readonly hookTypeExecutors?;
377
+ private readonly onTextDeltaCallback?;
378
+ private readonly onContextUpdateCallback?;
379
+ private readonly onToolExecutionCallback?;
380
+ private readonly onCompactCallback?;
381
+ private readonly onCompactEventCallback?;
382
+ private readonly sessionLogger?;
383
+ private readonly maxTurns?;
384
+ private readonly compactionOrchestrator;
385
+ private shutdownPromise;
386
+ /** Stdout collected from SessionStart hooks, injected on first run(). */
387
+ private sessionStartStdout;
388
+ /** Absolute path to the session transcript file, if file-backed storage is active. */
389
+ private readonly transcriptPath;
390
+ constructor(options: ISessionOptions);
391
+ run(message: string, rawInput?: string): Promise<string>;
392
+ private log;
393
+ private persistSessionInternal;
394
+ /** Gracefully end the session and fire SessionEnd hooks once. */
395
+ shutdown(options?: ISessionShutdownOptions): Promise<void>;
396
+ compact(instructions?: string, trigger?: TCompactTrigger): Promise<void>;
397
+ private buildRunContext;
398
+ }
399
+ //#endregion
400
+ //#region src/compaction-orchestrator.d.ts
401
+ interface ICompactionOptions {
402
+ sessionId: string;
403
+ cwd: string;
404
+ model: string;
405
+ hooks?: Record<string, unknown>;
406
+ compactInstructions?: string;
407
+ /** Additional hook type executors (e.g. prompt, agent) beyond the core defaults. */
408
+ hookTypeExecutors?: IHookTypeExecutor[];
409
+ }
410
+ declare class CompactionOrchestrator {
411
+ private readonly sessionId;
412
+ private readonly cwd;
413
+ private readonly model;
414
+ private readonly hooks?;
415
+ private readonly compactInstructions?;
416
+ private readonly hookTypeExecutors?;
417
+ constructor(options: ICompactionOptions);
418
+ /**
419
+ * Run compaction — summarize the conversation to free context space.
420
+ * @param provider - The AI provider to use for summarization
421
+ * @param history - Current conversation history
422
+ * @param instructions - Optional focus instructions for the summary
423
+ * @returns The generated summary string
424
+ */
425
+ compact(provider: IAIProvider, history: TUniversalMessage[], instructions?: string): Promise<string>;
426
+ /** Build the compaction prompt from conversation history */
427
+ private buildCompactionPrompt;
428
+ }
429
+ //#endregion
430
+ //#region src/session-log-validation.d.ts
431
+ interface ISessionReplayValidationIssue {
432
+ code: 'PROVIDER_RESPONSE_RAW_MISSING' | 'PROVIDER_NATIVE_RAW_PAYLOAD_MISSING' | 'PROVIDER_RESPONSE_NORMALIZED_MISSING' | 'TOOL_RESULT_MISSING' | 'PAYLOAD_REFERENCE_INVALID';
433
+ message: string;
434
+ eventIndex?: number;
435
+ executionId?: string;
436
+ round?: number;
437
+ toolCallId?: string;
438
+ }
439
+ interface ISessionReplayValidationResult {
440
+ ok: boolean;
441
+ issues: ISessionReplayValidationIssue[];
442
+ }
443
+ declare function validateSessionReplayLogEntries(entries: readonly ISessionLogEntry[]): ISessionReplayValidationResult;
444
+ //#endregion
445
+ //#region src/session-log-replay.d.ts
446
+ interface ISessionLogEntry extends Record<string, TUniversalValue> {
447
+ timestamp: string;
448
+ sessionId: string;
449
+ event: string;
450
+ }
451
+ interface ISessionReplayRecord {
452
+ sessionId: string | undefined;
453
+ cwd: string | undefined;
454
+ createdAt: string | undefined;
455
+ updatedAt: string | undefined;
456
+ messages: TUniversalMessage[];
457
+ history: IHistoryEntry[];
458
+ backgroundTaskEvents: object[];
459
+ backgroundJobGroupEvents: object[];
460
+ memoryEvents: object[];
461
+ }
462
+ declare function loadSessionLogEntries(logFile: string): ISessionLogEntry[];
463
+ declare function replaySessionLogEntries(entries: readonly ISessionLogEntry[]): ISessionReplayRecord;
464
+ //#endregion
465
+ export { AUTO_COMPACT_THRESHOLD, CompactionOrchestrator, ContextWindowTracker, FileSessionLogger, type ICompactEvent, type IContextWindowState, type IExternalPayloadReference, type IFileSessionLoggerOptions, type ISession, type ISessionLogEntry, type ISessionLogger, type ISessionOptions, type ISessionRecord, type ISessionReplayRecord, type ISessionReplayValidationIssue, type ISessionReplayValidationResult, type ISessionShutdownOptions, type ISessionStore, type ISpinner, type ITerminalOutput, PermissionEnforcer, Session, SessionStore, SilentSessionLogger, type TAutoCompactThreshold, type TCompactTrigger, type TPermissionHandler, type TPermissionResult, type TSessionLogData, type TSessionLogValue, loadSessionLogEntries, replaySessionLogEntries, validateSessionReplayLogEntries };
466
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/session-logger.ts","../../src/permission-types.ts","../../src/permission-enforcer.ts","../../src/context-window-tracker.ts","../../src/session-store.ts","../../src/session-types.ts","../../src/session-base.ts","../../src/session.ts","../../src/compaction-orchestrator.ts","../../src/session-log-validation.ts","../../src/session-log-replay.ts"],"mappings":";;;;;;AAaA;;;;AAA4B;AAAA,KAAhB,gBAAA;AAAA,KACA,eAAA,GAAkB,MAAM,SAAS,gBAAA;AAAA,UAE5B,yBAAA;EACf,IAAA;EACA,QAAA;EACA,MAAA;EACA,UAAA;EACA,YAAA;AAAA;AAAA,UAGe,yBAAA;EACf,6BAAA;EACA,aAAa;AAAA;;;AALD;AAGd;;;UAmBiB,cAAA;EAjBF;EAmBb,GAAA,CAAI,SAAA,UAAmB,KAAA,UAAe,IAAA,EAAM,eAAe;AAAA;;;;;;;cAShD,iBAAA,YAA6B,cAAA;EAAA,iBACvB,MAAA;EAAA,iBACA,OAAA;cAEL,MAAA,UAAgB,OAAA,GAAS,yBAAA;EAcrC,GAAA,CAAI,SAAA,UAAmB,KAAA,UAAe,IAAA,EAAM,eAAA;AAAA;;cAgHjC,mBAAA,YAA+B,cAAc;EACxD,GAAG,CAAA;AAAA;;;AA5KuB;AAC5B;;;;AAA6D;AADjC,KCGhB,iBAAA;;;;;KAMA,kBAAA,IACV,QAAA,UACA,QAAA,EAAU,SAAA,KACP,OAAA,CAAQ,iBAAA;AAAA,UAEI,0BAAA;EACf,SAAA;EACA,GAAA;EACA,iBAAA,QAAyB,eAAA;EACzB,MAAA;IACE,WAAA;MAAe,KAAA;MAAiB,IAAA;IAAA;IAChC,KAAA,GAAQ,MAAA;EAAA;EAEV,QAAA,EAAU,eAAA;EACV,iBAAA,GAAoB,kBAAA;EACpB,mBAAA,IACE,QAAA,EAAU,eAAA,EACV,QAAA,UACA,QAAA,EAAU,SAAA,KACP,OAAA;EACL,aAAA,GAAgB,cAAA;EAChB,eAAA,IAAmB,KAAA;IACjB,IAAA;IACA,QAAA;IACA,QAAA,GAAW,SAAA;IACX,OAAA;IACA,MAAA;IACA,cAAA;EAAA;;EAGF,iBAAA,GAAoB,iBAAA;EDoBwB;EClB5C,cAAA;AAAA;;;cCnBW,kBAAA;EAAA,iBACM,SAAA;EAAA,iBACA,GAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,MAAA;EAAA,iBACA,QAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,aAAA;EAAA,iBACA,eAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,cAAA;EAAA,iBACA,mBAAA;cAEL,OAAA,EAAS,0BAAA;EFzBmB;EEwCxC,SAAA,CAAU,KAAA,EAAO,qBAAA,KAA0B,qBAAA;EFvC3C;EE4CA,sBAAA,CAAA;EF1Be;EE+Bf,wBAAA,CAAA;;;;;;UASQ,sBAAA;EFtC8B;EE0IhC,eAAA,CAAgB,QAAA,UAAkB,QAAA,EAAU,SAAA,GAAY,OAAA;EF1IH;EAAA,QEuKnD,GAAA;AAAA;;;;cCvMG,sBAAA;AAAA,KAED,qBAAA;AAAA,cAEC,oBAAA;EAAA,QACH,iBAAA;EAAA,iBACS,gBAAA;EAAA,QACT,oBAAA;cAGN,KAAA,UACA,gBAAA,WACA,oBAAA,GAAuB,qBAAA;EHTe;EGgBxC,eAAA,CAAA,GAAmB,qBAAA;EHhBqB;EG8BxC,iBAAA,CAAA;EH5BA;EGoCA,uBAAA,CAAA,GAA2B,qBAAA;EHlC3B;EGuCA,uBAAA,CAAwB,oBAAA,EAAsB,qBAAA;EHtClC;AAAA;AAGd;;;;EG6CE,iBAAA,CAAkB,OAAA,EAAS,iBAAA;EH1BZ;EG+Bf,KAAA,CAAA;AAAA;;;AH5DF;AAAA,UIDiB,cAAA;;EAEf,EAAA;EJD2D;EIG3D,IAAA;EJDwC;EIGxC,GAAA;EJHwC;EIKxC,SAAA;EJHA;EIKA,SAAA;EJHA;EIKA,QAAA;EJJY;EIMZ,OAAA;EJHe;EIKf,YAAA;;EAEA,WAAA,GAAc,WAAW;EJLZ;EIOb,eAAA;EJU6B;EIR7B,oBAAA;EJU2D;EIR3D,mBAAA;EJQI;EINJ,wBAAA;EJM4C;EIJ5C,qBAAA;EJI2D;EIF3D,YAAA;EJWW;EITX,oBAAA;;EAEA,iBAAA;EJyB4C;EIvB5C,iBAAA;AAAA;;UAIe,aAAA;EACf,IAAA,CAAK,OAAA,EAAS,cAAA;EACd,IAAA,CAAK,EAAA,WAAa,cAAA;EAClB,IAAA,IAAQ,cAAA;EACR,MAAA,CAAO,EAAA;EJC8B;EICrC,WAAA,EAAa,EAAA;AAAA;;;;;;cAgBF,YAAA,YAAwB,aAAA;EAAA,iBAClB,OAAA;cAEL,OAAA;;UAKJ,SAAA;EJsGL;EAAA,QI/FK,QAAA;;EAKR,WAAA,CAAY,EAAA;EH/EF;;;;EGuFV,IAAA,CAAK,OAAA,EAAS,cAAA;EHjFJ;;;;EG0FV,IAAA,CAAK,EAAA,WAAa,cAAA;EHvFf;;;EGmGH,IAAA,CAAA,GAAQ,cAAA;EHpGE;;;;EG+HV,MAAA,CAAO,EAAA;AAAA;;;KC9HG,eAAA;AAAA,UAEK,aAAA;EACf,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,qBAAA;EACR,KAAA,EAAO,qBAAA;AAAA;;UAIQ,uBAAA;EACf,MAAA,GAAS,iBAAiB;AAAA;;UAIX,eAAA;ELlBH;EKoBZ,KAAA,EAAO,qBAAA;ELjBQ;EKmBf,QAAA,EAAU,WAAA;;EAEV,aAAA;ELnBa;EKqBb,QAAA,EAAU,eAAA;ELJmB;EKM7B,WAAA;IAAgB,KAAA;IAAiB,IAAA;EAAA;EACjC,KAAA,GAAQ,MAAA;ELLoC;EKO5C,cAAA,GAAiB,eAAA;ELP0C;EKS3D,iBAAA;ELAW;EKEX,KAAA;;EAEA,eAAA;ELc4C;EKZ5C,QAAA;ELNsD;EKQtD,YAAA,GAAe,aAAA;ELRyB;EKUxC,SAAA;ELRiB;EKUjB,iBAAA,GAAoB,kBAAA;ELRR;EKUZ,WAAA,IAAe,KAAA;ELVa;EKY5B,eAAA,IAAmB,KAAA,EAAO,qBAAA;ELEtB;EKAJ,iBAAA,IACE,QAAA,EAAU,eAAA,EACV,QAAA,UACA,QAAA,EAAU,SAAA,KACP,OAAA;ELJuC;EKM5C,eAAA,IAAmB,KAAA;IACjB,IAAA;IACA,QAAA;IACA,QAAA,GAAW,SAAA;IACX,OAAA;IACA,MAAA;IACA,cAAA;EAAA;;EAGF,SAAA,IAAa,OAAA;;EAEb,cAAA,IAAkB,KAAA,EAAO,aAAA;EJzEE;EI2E3B,mBAAA;EJ3E2B;EI6E3B,gBAAA;EJvEU;EIyEV,oBAAA,GAAuB,qBAAA;;EAEvB,aAAA,GAAgB,cAAA;EJxEL;EI0EX,iBAAA,GAAoB,iBAAA;EJ1EV;EI4EV,SAAA;AAAA;;;uBC3FoB,WAAA;EAAA,4BACQ,MAAA,EAAQ,MAAA;EAAA,4BACR,kBAAA,EAAoB,kBAAA;EAAA,4BACpB,cAAA,EAAgB,oBAAA;EAAA,mBACzB,cAAA,EAAgB,eAAA;EAAA,4BACP,SAAA;EAAA,4BACA,UAAA,EAAY,WAAA;EAAA,4BACZ,WAAA,EAAa,WAAA;EAAA,4BACb,KAAA;EAAA,mBACT,aAAA;EAAA,mBACA,YAAA;EAAA,mBACA,eAAA,EAAiB,eAAA;EAEpC,iBAAA,CAAA,GAAqB,eAAA;ENPmB;EMYxC,iBAAA,CAAkB,IAAA,EAAM,eAAA;EAIxB,YAAA,CAAA;EAIA,gBAAA,CAAA;ENhBA;EMqBA,mBAAA,CAAoB,UAAA;EASpB,cAAA,CAAA,GAAkB,WAAA;EAIlB,eAAA,CAAA;EN9Be;EMmCf,sBAAA,CAAA;EAIA,wBAAA,CAAA;ENtCA;EM2CA,KAAA,CAAA;EAOA,SAAA,CAAA;EAIA,eAAA,CAAA,oCAAe,mBAAA;EAIf,uBAAA,CAAA,GAjC6B,qBAAA;EAqC7B,uBAAA,CAAwB,SAAA;EAIxB,UAAA,CAAA,oCAAU,iBAAA;EAIV,cAAA,CAAA,GAAkB,aAAA;ENlDK;EMuDvB,eAAA,CAAgB,KAAA,EAAO,aAAA;ENvDe;EM4DtC,aAAA,CACE,IAAA,4CACA,OAAA,UACA,OAAA;IAAY,UAAA;IAAqB,IAAA;EAAA;EAKnC,YAAA,CAAA;AAAA;;;;cCzDW,OAAA,SAAgB,WAAA;EAAA,mBACR,MAAA,EAAQ,MAAA;EAAA,mBACR,kBAAA,EAAoB,kBAAA;EAAA,mBACpB,cAAA,EAAgB,oBAAA;EAAA,UACzB,cAAA,EAAgB,eAAA;EAAA,mBACP,SAAA;EAAA,mBACA,UAAA,EAAY,WAAA;EAAA,mBACZ,WAAA,EAAa,WAAA;EAAA,mBACb,KAAA;EAAA,UACT,aAAA;EAAA,UACA,YAAA;EAAA,UACA,eAAA,EAAiB,eAAA;EAAA,iBACV,QAAA;EAAA,iBACA,YAAA;EAAA,iBACA,GAAA;EAAA,iBACA,KAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,uBAAA;EAAA,iBACA,uBAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,sBAAA;EAAA,iBACA,aAAA;EAAA,iBACA,QAAA;EAAA,iBACA,sBAAA;EAAA,QACT,eAAA;EPpCoC;EAAA,QOsCpC,kBAAA;EPtCmD;EAAA,iBOwC1C,cAAA;cAEL,OAAA,EAAS,eAAA;EAuEf,GAAA,CAAI,OAAA,UAAiB,QAAA,YAAoB,OAAA;EAAA,QAYvC,GAAA;EAAA,QAIA,sBAAA;EPtGoC;EOoH5C,QAAA,CAAS,OAAA,GAAS,uBAAA,GAA+B,OAAA;EAoB3C,OAAA,CAAQ,YAAA,WAAuB,OAAA,GAAS,eAAA,GAA6B,OAAA;EAAA,QAkBnE,eAAA;AAAA;;;UCjNO,kBAAA;EACf,SAAA;EACA,GAAA;EACA,KAAA;EACA,KAAA,GAAQ,MAAA;EACR,mBAAA;ERNe;EQQf,iBAAA,GAAoB,iBAAiB;AAAA;AAAA,cAG1B,sBAAA;EAAA,iBACM,SAAA;EAAA,iBACA,GAAA;EAAA,iBACA,KAAA;EAAA,iBACA,KAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,iBAAA;cAEL,OAAA,EAAS,kBAAA;ERXN;;;;AAEF;AAiBf;;EQQQ,OAAA,CACJ,QAAA,EAAU,WAAA,EACV,OAAA,EAAS,iBAAA,IACT,YAAA,YACC,OAAA;ERVwD;EAAA,QQoDnD,qBAAA;AAAA;;;UC9FO,6BAAA;EACf,IAAA;EAMA,OAAA;EACA,UAAA;EACA,WAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,UAGe,8BAAA;EACf,EAAA;EACA,MAAA,EAAQ,6BAA6B;AAAA;AAAA,iBAGvB,+BAAA,CACd,OAAA,WAAkB,gBAAA,KACjB,8BAA8B;;;UCpBhB,gBAAA,SAAyB,MAAM,SAAS,eAAA;EACvD,SAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,oBAAA;EACf,SAAA;EACA,GAAA;EACA,SAAA;EACA,SAAA;EACA,QAAA,EAAU,iBAAA;EACV,OAAA,EAAS,aAAa;EACtB,oBAAA;EACA,wBAAA;EACA,YAAA;AAAA;AAAA,iBASc,qBAAA,CAAsB,OAAA,WAAkB,gBAAgB;AAAA,iBAWxD,uBAAA,CACd,OAAA,WAAkB,gBAAA,KACjB,oBAAoB"}
@@ -0,0 +1,7 @@
1
+ import{Robota as e,TRUST_TO_MODE as t,createUserMessage as n,estimateContextTokensFromMessages as r,evaluatePermission as i,getModelContextWindow as a,getProviderCapabilities as o,messageToHistoryEntry as s,runHooks as c}from"@robota-sdk/agent-core";import{createHash as l,randomUUID as u}from"node:crypto";import{appendFileSync as d,existsSync as f,mkdirSync as p,readFileSync as m,writeFileSync as h}from"node:fs";import{join as g}from"node:path";import{existsSync as _,mkdirSync as v,readFileSync as y,readdirSync as b,unlinkSync as ee,writeFileSync as te}from"fs";import{join as x}from"path";const S=`unknown_tool`;function C(e){return{knownToolNames:new Set(e.knownToolNames),unknownToolCallIds:new Set,...e.onToolExecution&&{onToolExecution:e.onToolExecution}}}function w(e,t,n){if(e.onToolExecution){if(t===`tool_execution_request`){T(e,n);return}t===`tool_execution_result`&&ne(e,n)}}function T(e,t){let n=E(t.toolName),r=E(t.toolCallId);!n||!r||e.knownToolNames.has(n)||(e.unknownToolCallIds.add(r),e.onToolExecution?.({type:`start`,toolName:n,toolArgs:re(t.parameters)}))}function ne(e,t){let n=E(t.toolName),r=E(t.toolCallId);if(!n||!r)return;let i=D(t.metadata);if(!(e.unknownToolCallIds.has(r)||i?.errorCode===S))return;e.unknownToolCallIds.delete(r);let a=E(t.error)??`Tool "${n}" is not registered.`;e.onToolExecution?.({type:`end`,toolName:n,success:!1,toolResultData:JSON.stringify({success:!1,error:a,errorCode:S,requestedTool:E(i?.requestedTool)??n,availableTools:ie(i?.availableTools)})})}function re(e){let t=D(e);if(!t)return;let n={};for(let[e,r]of Object.entries(t))(typeof r==`string`||typeof r==`number`||typeof r==`boolean`||typeof r==`object`&&r)&&(n[e]=r);return n}function E(e){return typeof e==`string`&&e.length>0?e:void 0}function D(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function ie(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}async function ae(e,t,r,i){if(r.contextTracker.updateFromHistory(r.robota.getHistory()),r.contextTracker.shouldAutoCompact()){let e=r.aiProvider,t=e.onTextDelta;e.onTextDelta=void 0;try{await r.compact()}finally{e.onTextDelta=t}}r.log(`user`,{content:e});let a=await c(r.hooks,`UserPromptSubmit`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`UserPromptSubmit`,user_message:t??e,prompt:t??e,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors),s=[r.sessionStartStdout,a.stdout].filter(Boolean).join(`
2
+ `),l=s?`<system-reminder>\n${s}\n</system-reminder>\n${e}`:e;r.clearSessionStartStdout();let u=r.robota.getHistory(),d=JSON.stringify(u),f=o(r.aiProvider);r.log(`pre_run`,{historyLength:u.length,historyChars:d.length,historyEstTokens:Math.ceil(d.length/4),input:l,history:u,model:r.model,provider:r.aiProvider.name,maxTokens:r.contextTracker.getContextState().maxTokens,nativeWebSearchSupported:f.nativeWebTools.webSearch.supported,nativeWebSearchEnabled:f.nativeWebTools.webSearch.enabled,nativeWebFetchSupported:f.nativeWebTools.webFetch.supported,nativeWebFetchEnabled:f.nativeWebTools.webFetch.enabled}),r.contextTracker.updateFromHistory([...u,n(l)]),r.onContextUpdate?.(r.contextTracker.getContextState());let p;try{let e=C({knownToolNames:r.knownToolNames??[],...r.onToolExecution&&{onToolExecution:r.onToolExecution}}),t=r.onTextDelta?e=>{r.log(`text_delta`,{delta:e}),r.onTextDelta?.(e)}:void 0;if(p=await r.robota.run(l,{signal:i,maxExecutionRounds:r.maxTurns??0,onExecutionEvent:(t,n)=>{r.log(t,n),w(e,t,n)},...t&&{onTextDelta:t}}),i.aborted)throw new DOMException(`Aborted`,`AbortError`)}catch(e){throw r.log(`error`,{message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack??``:``,historyLength:r.robota.getHistory().length}),c(r.hooks,`StopFailure`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`StopFailure`,reason:e instanceof Error?e.message:String(e),stop_hook_active:!1,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors).catch(()=>{}),e}let m=r.robota.getHistory(),h=m.map(e=>{let t=`toolCalls`in e&&Array.isArray(e.toolCalls)&&e.toolCalls.length>0,n=t?e.toolCalls.map(e=>e.function.name):[];return{role:e.role,contentLength:typeof e.content==`string`?e.content.length:0,hasToolCalls:t,toolCallNames:n,...e.metadata?{metadata:e.metadata}:{}}});r.log(`assistant`,{content:p,historyLength:m.length,estimatedChars:JSON.stringify(m).length,history:m,historyStructure:h}),r.contextTracker.updateFromHistory(m);let g=r.contextTracker.getContextState();return r.onContextUpdate?.(g),r.log(`context`,{maxTokens:g.maxTokens,usedTokens:g.usedTokens,usedPercentage:g.usedPercentage,remainingPercentage:g.remainingPercentage}),c(r.hooks,`Stop`,{session_id:r.sessionId,cwd:r.cwd,hook_event_name:`Stop`,response:p.substring(0,500),last_assistant_message:p,stop_hook_active:!1,...r.permissionMode!==void 0&&{permission_mode:r.permissionMode},...r.transcriptPath!==void 0&&{transcript_path:r.transcriptPath},env:{CLAUDE_PROJECT_DIR:r.cwd,CLAUDE_SESSION_ID:r.sessionId}},r.hookTypeExecutors).catch(()=>{}),r.getSessionStore()&&r.persistSession(),p}async function O(e,t){let n=t.robota.getHistory();if(n.length===0)return;t.contextTracker.updateFromHistory(n);let r=t.contextTracker.getContextState(),i=n.filter(e=>e.role!==`system`),a=await t.compactionOrchestrator.compact(t.aiProvider,i,e);t.robota.clearHistory(),t.robota.injectMessage(`system`,t.systemMessage),t.robota.injectMessage(`assistant`,`[Context Summary]\n${a}`),t.contextTracker.updateFromHistory(t.robota.getHistory());let o={session_id:t.sessionId,cwd:t.cwd,hook_event_name:`PostCompact`,trigger:t.trigger,compact_summary:a};c(t.hooks,`PostCompact`,o,t.hookTypeExecutors).catch(()=>{});let s=t.contextTracker.getContextState();t.log(`context_compact`,{trigger:t.trigger,before:r,after:s}),t.onCompactEventCallback?.({trigger:t.trigger,before:r,after:s}),t.onCompactCallback&&t.onCompactCallback(a)}function k(e){let t=e.robota.getHistory(),n=new Date().toISOString(),r=e.sessionStore.load(e.sessionId),i={id:e.sessionId,name:r?.name,cwd:e.cwd,createdAt:r?.createdAt??n,updatedAt:n,messages:t,history:e.getFullHistory(),systemPrompt:e.systemPrompt,toolSchemas:e.toolSchemas};e.sessionStore.save(i)}function A(e,t,n){e.configureNativeWebTools?.({webSearch:!0}),`onServerToolUse`in e&&(e.onServerToolUse=(e,t)=>{n(`server_tool`,{tool:e,...t})})}function j(e,t,n,r,i,a,o){c(n,`SessionStart`,{session_id:e,cwd:t,hook_event_name:`SessionStart`,...a!==void 0&&{permission_mode:a},...o!==void 0&&{transcript_path:o},env:{CLAUDE_PROJECT_DIR:t,CLAUDE_SESSION_ID:e}},r).then(e=>{e.stdout&&i(e.stdout)}).catch(()=>{})}async function M(e,t,n,r,i,a,o){await c(r,`SessionEnd`,{session_id:e,cwd:t,hook_event_name:`SessionEnd`,reason:n,...a!==void 0&&{permission_mode:a},...o!==void 0&&{transcript_path:o},env:{CLAUDE_PROJECT_DIR:t,CLAUDE_SESSION_ID:e}},i)}var N=class{getPermissionMode(){return this.permissionMode}setPermissionMode(e){this.permissionMode=e}getSessionId(){return this.sessionId}getSystemMessage(){return this.systemMessage}updateSystemMessage(e){this.systemMessage=e,this.robota.setModel({provider:this.aiProvider.name,model:this.model,systemMessage:e})}getToolSchemas(){return this.toolSchemas}getMessageCount(){return this.messageCount}getSessionAllowedTools(){return this.permissionEnforcer.getSessionAllowedTools()}clearSessionAllowedTools(){this.permissionEnforcer.clearSessionAllowedTools()}abort(){this.abortController&&=(this.abortController.abort(),null)}isRunning(){return this.abortController!==null}getContextState(){return this.contextTracker.getContextState()}getAutoCompactThreshold(){return this.contextTracker.getAutoCompactThreshold()}setAutoCompactThreshold(e){this.contextTracker.setAutoCompactThreshold(e)}getHistory(){return this.robota.getHistory()}getFullHistory(){return this.robota.getFullHistory()}addHistoryEntry(e){this.robota.addHistoryEntry(e)}injectMessage(e,t,n){this.robota.injectMessage(e,t,n)}clearHistory(){this.robota.clearHistory(),this.contextTracker.reset()}};const P={success:!0,data:JSON.stringify({success:!1,output:``,error:`Permission denied. The user did not approve this action.`}),metadata:{}};function F(e){if(typeof e.data!=`string`||e.data.length<=3e4)return e;let t=15e3,n=e.data.substring(0,t),r=e.data.substring(e.data.length-t),i=`${n}\n\n[... output truncated: ${e.data.length.toLocaleString()} chars total, showing first and last ${t.toLocaleString()} chars ...]\n\n${r}`;return{...e,data:i}}function I(e,t,n,r,i,a){return{session_id:e,cwd:t,hook_event_name:`PreToolUse`,tool_name:n,tool_input:r,...i!==void 0&&{permission_mode:i},...a!==void 0&&{transcript_path:a}}}async function L(e,t,n){let r=await c(e,`PreToolUse`,t,n);return r.blocked?{success:!0,data:JSON.stringify({blocked:!0,reason:r.reason??`Blocked by hook`}),metadata:{}}:null}function R(e,t,n,r){c(e,`PostToolUse`,{...t,hook_event_name:`PostToolUse`,tool_output:typeof n.data==`string`?n.data:JSON.stringify(n.data)},r).catch(()=>{})}var z=class{sessionId;cwd;getPermissionMode;config;terminal;permissionHandler;promptForApprovalFn;sessionLogger;onToolExecution;hookTypeExecutors;transcriptPath;sessionAllowedTools=new Set;constructor(e){this.sessionId=e.sessionId,this.cwd=e.cwd,this.getPermissionMode=e.getPermissionMode,this.config=e.config,this.terminal=e.terminal,this.permissionHandler=e.permissionHandler,this.promptForApprovalFn=e.promptForApprovalFn,this.sessionLogger=e.sessionLogger,this.onToolExecution=e.onToolExecution,this.hookTypeExecutors=e.hookTypeExecutors,this.transcriptPath=e.transcriptPath}wrapTools(e){return e.map(e=>this.wrapToolWithPermission(e))}getSessionAllowedTools(){return[...this.sessionAllowedTools]}clearSessionAllowedTools(){this.sessionAllowedTools.clear()}wrapToolWithPermission(e){let t=this,n=e.execute.bind(e),r=Object.create(e);return r.execute=async(r,i)=>{try{let a=e.getName();t.log(`tool_call`,{tool:a,args:r});let o=I(t.sessionId,t.cwd,a,r,t.getPermissionMode(),t.transcriptPath),s=await L(t.config.hooks,o,t.hookTypeExecutors);if(s)return t.log(`tool_blocked`,{tool:a,reason:`hook`}),s;if(!await t.checkPermission(a,r))return t.log(`tool_denied`,{tool:a,reason:`permission`}),t.onToolExecution?.({type:`end`,toolName:a,toolArgs:r,success:!1,denied:!0}),P;t.onToolExecution?.({type:`start`,toolName:a,toolArgs:r});let c=await n(r,i),l=F(c);t.onToolExecution?.({type:`end`,toolName:a,toolArgs:r,success:l.success,toolResultData:typeof l.data==`string`?l.data:JSON.stringify(l.data)});let u=typeof l.data==`string`?l.data.length:JSON.stringify(l.data).length;return t.log(`tool_result`,{tool:a,success:l.success,dataChars:u,truncated:l!==c}),R(t.config.hooks,o,l,t.hookTypeExecutors),l}catch(e){let t=e instanceof Error?e.message:String(e);return{success:!0,data:JSON.stringify({success:!1,output:``,error:t}),metadata:{}}}},r}async checkPermission(e,t){let n=i(e,t,this.getPermissionMode(),{allow:this.config.permissions.allow,deny:this.config.permissions.deny});if(n===`auto`)return!0;if(n===`deny`)return!1;if(this.sessionAllowedTools.has(e))return!0;if(this.permissionHandler){let n=await this.permissionHandler(e,t);return n===`allow-session`?(this.sessionAllowedTools.add(e),!0):n}return this.promptForApprovalFn?this.promptForApprovalFn(this.terminal,e,t):!1}log(e,t){this.sessionLogger?.log(this.sessionId,e,t)}};const B=.835;var V=class{contextUsedTokens=0;contextMaxTokens;autoCompactThreshold;constructor(e,t,n){this.contextMaxTokens=t??a(e),this.autoCompactThreshold=H(n)}getContextState(){let e=Math.min(100,this.contextUsedTokens/this.contextMaxTokens*100);return{maxTokens:this.contextMaxTokens,usedTokens:this.contextUsedTokens,usedPercentage:Math.round(e*100)/100,remainingPercentage:Math.round((100-e)*100)/100}}shouldAutoCompact(){return this.autoCompactThreshold===!1?!1:this.getContextState().usedPercentage>=this.autoCompactThreshold*100}getAutoCompactThreshold(){return this.autoCompactThreshold}setAutoCompactThreshold(e){this.autoCompactThreshold=H(e)}updateFromHistory(e){this.contextUsedTokens=r(e).usedTokens}reset(){this.contextUsedTokens=0}};function H(e){if(e===void 0)return B;if(e===!1)return!1;if(!Number.isFinite(e)||e<=0||e>1)throw RangeError(`autoCompactThreshold must be a number greater than 0 and at most 1.`);return e}var U=class{sessionId;cwd;model;hooks;compactInstructions;hookTypeExecutors;constructor(e){this.sessionId=e.sessionId,this.cwd=e.cwd,this.model=e.model,this.hooks=e.hooks,this.compactInstructions=e.compactInstructions,this.hookTypeExecutors=e.hookTypeExecutors}async compact(e,t,n){if(t.length===0)return``;let r=n===void 0?`auto`:`manual`,i={session_id:this.sessionId,cwd:this.cwd,hook_event_name:`PreCompact`,trigger:r};await c(this.hooks,`PreCompact`,i,this.hookTypeExecutors);let a=this.buildCompactionPrompt(t,n),o=await e.chat([{id:u(),role:`user`,content:a,state:`complete`,timestamp:new Date}],{model:this.model});return typeof o.content==`string`?o.content:`(compaction failed)`}buildCompactionPrompt(e,t){let n=t??this.compactInstructions??``;return[`Summarize the following conversation concisely, preserving:`,`- User's original requests and goals`,`- Key decisions and conclusions`,`- Important code changes and file paths`,`- Current task status and next steps`,n?`\nAdditional focus:\n${n}\n`:``,`Drop verbose tool outputs, debugging steps, and exploratory work that didn't lead to results.`,``,`Conversation:`,e.map(e=>{let t=typeof e.content==`string`?e.content:JSON.stringify(e.content);return`${e.role}: ${t}`}).join(`
3
+ `)].join(`
4
+ `)}};function W(e,t,n,r,i){return new z({sessionId:t,cwd:n,getPermissionMode:r,config:{permissions:e.permissions??{allow:[],deny:[]},hooks:e.hooks},terminal:e.terminal,permissionHandler:e.permissionHandler,promptForApprovalFn:e.promptForApproval,sessionLogger:e.sessionLogger,onToolExecution:e.onToolExecution,hookTypeExecutors:e.hookTypeExecutors,transcriptPath:i})}function G(e,t,n,r){return{contextTracker:new V(t,e.contextMaxTokens,e.autoCompactThreshold),compactionOrchestrator:new U({sessionId:n,cwd:r,model:t,hooks:e.hooks,compactInstructions:e.compactInstructions,hookTypeExecutors:e.hookTypeExecutors})}}function K(t,n,r,i,a,o){let s=n.wrapTools(r);return new e({name:t.agentName??`agent`,aiProviders:[i],defaultModel:{provider:i.name,model:a,systemMessage:o},systemMessage:o,tools:s,logging:{enabled:!1},...t.providerTimeout!==void 0&&{timeout:t.providerTimeout}})}var q=class extends N{robota;permissionEnforcer;contextTracker;permissionMode;sessionId;aiProvider;toolSchemas;model;systemMessage;messageCount=0;abortController=null;terminal;sessionStore;cwd;hooks;hookTypeExecutors;onTextDeltaCallback;onContextUpdateCallback;onToolExecutionCallback;onCompactCallback;onCompactEventCallback;sessionLogger;maxTurns;compactionOrchestrator;shutdownPromise=null;sessionStartStdout=``;transcriptPath;constructor(e){super();let{tools:n,provider:r,systemMessage:i}=e;this.terminal=e.terminal,this.sessionStore=e.sessionStore,this.systemMessage=i,this.toolSchemas=n.map(e=>e.schema),this.cwd=process.cwd(),this.sessionLogger=e.sessionLogger,this.hooks=e.hooks,this.hookTypeExecutors=e.hookTypeExecutors,this.onTextDeltaCallback=e.onTextDelta,this.onContextUpdateCallback=e.onContextUpdate,this.onToolExecutionCallback=e.onToolExecution,this.onCompactCallback=e.onCompact,this.onCompactEventCallback=e.onCompactEvent,this.maxTurns=e.maxTurns,this.model=e.model??`claude-sonnet-4-5`,this.sessionId=e.sessionId??`session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,this.permissionMode=e.permissionMode??(e.defaultTrustLevel?t[e.defaultTrustLevel]:void 0)??`default`,this.transcriptPath=e.sessionStore?.getFilePath?.(this.sessionId),this.log(`session_init`,{cwd:this.cwd,systemPromptLength:i.length,systemPrompt:i,toolSchemas:this.toolSchemas,model:this.model,provider:r.name}),this.aiProvider=r,A(r,e,(e,t)=>this.log(e,t)),this.permissionEnforcer=W(e,this.sessionId,this.cwd,()=>this.permissionMode,this.transcriptPath);let{contextTracker:a,compactionOrchestrator:o}=G(e,this.model,this.sessionId,this.cwd);this.contextTracker=a,this.compactionOrchestrator=o,this.robota=K(e,this.permissionEnforcer,n,r,this.model,i),j(this.sessionId,this.cwd,this.hooks,this.hookTypeExecutors,e=>void(this.sessionStartStdout=e),this.permissionMode,this.transcriptPath)}async run(e,t){this.abortController=new AbortController;let{signal:n}=this.abortController;try{let r=await ae(e,t,this.buildRunContext(),n);return this.messageCount+=1,r}finally{this.abortController=null}}log(e,t){this.sessionLogger?.log(this.sessionId,e,t)}persistSessionInternal(){this.sessionStore&&k({sessionId:this.sessionId,cwd:this.cwd,systemPrompt:this.systemMessage,toolSchemas:this.toolSchemas,sessionStore:this.sessionStore,robota:this.robota,getFullHistory:()=>this.getFullHistory()})}shutdown(e={}){if(this.shutdownPromise)return this.shutdownPromise;let t=e.reason??`other`;return this.shutdownPromise=(async()=>{this.abort(),this.log(`session_shutdown`,{reason:t}),this.persistSessionInternal(),await M(this.sessionId,this.cwd,t,this.hooks,this.hookTypeExecutors,this.permissionMode,this.transcriptPath)})(),this.shutdownPromise}async compact(e,t=`manual`){await O(e,{sessionId:this.sessionId,cwd:this.cwd,systemMessage:this.systemMessage,robota:this.robota,aiProvider:this.aiProvider,compactionOrchestrator:this.compactionOrchestrator,contextTracker:this.contextTracker,hooks:this.hooks,hookTypeExecutors:this.hookTypeExecutors,onCompactCallback:this.onCompactCallback,onCompactEventCallback:this.onCompactEventCallback,trigger:t,log:(e,t)=>this.log(e,t)})}buildRunContext(){return{sessionId:this.sessionId,cwd:this.cwd,model:this.model,robota:this.robota,aiProvider:this.aiProvider,contextTracker:this.contextTracker,hooks:this.hooks,hookTypeExecutors:this.hookTypeExecutors,sessionStartStdout:this.sessionStartStdout,log:(e,t)=>this.log(e,t),compact:()=>this.compact(void 0,`auto`),persistSession:()=>this.persistSessionInternal(),getSessionStore:()=>!!this.sessionStore,clearSessionStartStdout:()=>void(this.sessionStartStdout=``),permissionMode:this.permissionMode,transcriptPath:this.transcriptPath,maxTurns:this.maxTurns,onTextDelta:this.onTextDeltaCallback,onContextUpdate:this.onContextUpdateCallback,onToolExecution:this.onToolExecutionCallback,knownToolNames:this.toolSchemas.map(e=>e.name)}}};const oe=/^(api[-_]?key|authorization|access[-_]?token|refresh[-_]?token|secret|password|x[-_]?api[-_]?key)$/i;var se=class{logDir;options;constructor(e,t={}){this.logDir=e,this.options={externalPayloadThresholdBytes:t.externalPayloadThresholdBytes??32768,redactedValue:t.redactedValue??`[REDACTED]`};try{p(e,{recursive:!0})}catch{}}log(e,t,n){try{let r=ce(e,this.logDir,n,this.options),i=JSON.stringify({timestamp:new Date().toISOString(),sessionId:e,event:t,...r});d(g(this.logDir,`${e}.jsonl`),i+`
5
+ `)}catch{}}};function ce(e,t,n,r){let i={};for(let[a,o]of Object.entries(n))i[a]=J(e,t,a,o,r);return i}function J(e,t,n,r,i){if(oe.test(n))return i.redactedValue;if(r==null||typeof r==`string`||typeof r==`number`)return Y(e,t,r,i);if(typeof r==`boolean`)return r;if(r instanceof Date)return r.toISOString();if(Array.isArray(r))return Y(e,t,r.map(r=>J(e,t,n,r,i)),i);if(typeof r==`object`){let n=r,a={};for(let[r,o]of Object.entries(n))a[r]=J(e,t,r,o,i);return Y(e,t,a,i)}return String(r)}function Y(e,t,n,r){let i=JSON.stringify(n);if(i===void 0)return n;let a=Buffer.byteLength(i);if(a<=r.externalPayloadThresholdBytes)return n;let o=l(`sha256`).update(i).digest(`hex`),s=`${e}.payloads`,c=g(s,`${o}.json`),u=g(t,s),d=g(t,c);return p(u,{recursive:!0}),f(d)||h(d,i,`utf-8`),{kind:`external-payload`,encoding:`json`,sha256:o,byteLength:a,relativePath:c}}var le=class{log(){}};function ue(e){let t=[],n=de(),r=fe();return e.forEach((e,i)=>{X(e,i,t),pe(n,e,i),me(r,e,i)}),he(n,t),ge(r,t),{ok:t.length===0,issues:t}}function de(){return{requests:new Map,nativeRawPayloads:new Set,rawResponses:new Set,normalizedResponses:new Set}}function fe(){return{requests:new Map,results:new Set}}function pe(e,t,n){let r=_e(t);r&&(t.event===`provider_request`&&e.requests.set(r.key,{executionId:r.executionId,round:r.round,index:n}),t.event===`provider_response_raw`&&e.rawResponses.add(r.key),t.event===`provider_native_raw_payload`&&(t.payloadKind===`response`||t.payloadKind===`stream_event`)&&e.nativeRawPayloads.add(r.key),t.event===`provider_response_normalized`&&e.normalizedResponses.add(r.key))}function me(e,t,n){let r=ve(t);r&&(t.event===`tool_execution_request`&&e.requests.set(r.key,{executionId:r.executionId,toolCallId:r.toolCallId,index:n}),t.event===`tool_execution_result`&&e.results.add(r.key))}function he(e,t){for(let[n,r]of e.requests)e.nativeRawPayloads.has(n)||t.push({code:`PROVIDER_NATIVE_RAW_PAYLOAD_MISSING`,message:`Provider request ${n} has no provider-native raw response or stream payload event.`,eventIndex:r.index,executionId:r.executionId,round:r.round}),e.rawResponses.has(n)||t.push({code:`PROVIDER_RESPONSE_RAW_MISSING`,message:`Provider request ${n} has no raw response event.`,eventIndex:r.index,executionId:r.executionId,round:r.round}),e.normalizedResponses.has(n)||t.push({code:`PROVIDER_RESPONSE_NORMALIZED_MISSING`,message:`Provider request ${n} has no normalized response event.`,eventIndex:r.index,executionId:r.executionId,round:r.round})}function ge(e,t){for(let[n,r]of e.requests)e.results.has(n)||t.push({code:`TOOL_RESULT_MISSING`,message:`Tool request ${n} has no terminal result event.`,eventIndex:r.index,executionId:r.executionId,toolCallId:r.toolCallId})}function _e(e){if(typeof e.executionId!=`string`)return;let t=typeof e.round==`number`?e.round:Number(e.round);if(Number.isFinite(t))return{key:`${e.executionId}:${t}`,executionId:e.executionId,round:t}}function ve(e){if(typeof e.executionId!=`string`)return;let t=typeof e.toolCallId==`string`?e.toolCallId:typeof e.toolExecutionId==`string`?e.toolExecutionId:void 0;if(t)return{key:`${e.executionId}:${t}`,executionId:e.executionId,toolCallId:t}}function X(e,t,n){if(Array.isArray(e)){e.forEach(e=>X(e,t,n));return}if(ye(e)){if(e.kind===`external-payload`){(e.encoding!==`json`||typeof e.sha256!=`string`||typeof e.relativePath!=`string`||typeof e.byteLength!=`number`)&&n.push({code:`PAYLOAD_REFERENCE_INVALID`,message:`External payload reference is missing required replay fields.`,eventIndex:t});return}Object.values(e).forEach(e=>X(e,t,n))}}function ye(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function be(e){return f(e)?m(e,`utf-8`).split(`
6
+ `).map(e=>e.trim()).filter(e=>e.length>0).map(e=>JSON.parse(e)):[]}function xe(e){let t=[],n=[],r={backgroundTaskEvents:[],backgroundJobGroupEvents:[],memoryEvents:[]},i,a,o,c;for(let l of e){if(i??=l.sessionId,o??=l.timestamp,c=l.timestamp,l.event===`session_init`&&(a=typeof l.cwd==`string`?l.cwd:a),l.event===`history_mutation`&&l.mutation===`append_message`){let e=Z(l.message);e&&(t.push(e),n.push(s(e)))}Se(l,r)}return{sessionId:i,cwd:a,createdAt:o,updatedAt:c,messages:t,history:n,backgroundTaskEvents:r.backgroundTaskEvents,backgroundJobGroupEvents:r.backgroundJobGroupEvents,memoryEvents:r.memoryEvents}}function Se(e,t){if(e.event===`background_task_event`){$(t.backgroundTaskEvents,e,`backgroundEvent`,`data`);return}if(e.event===`background_job_group_event`){$(t.backgroundJobGroupEvents,e,`backgroundJobGroupEvent`,`data`);return}e.event===`memory_event`&&$(t.memoryEvents,e,`memoryEvent`,`data`)}function Z(e){if(!Ce(e))return;let t=e.role;if(t!==`user`&&t!==`assistant`&&t!==`system`&&t!==`tool`)return;let n=typeof e.id==`string`?e.id:`${t}-${Date.now()}`,r=e.timestamp instanceof Date?e.timestamp:new Date(typeof e.timestamp==`string`?e.timestamp:Date.now());return{...e,id:n,role:t,timestamp:r}}function Ce(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Q(e,t){let n=e[t];if(!(typeof n!=`object`||!n||Array.isArray(n)||n instanceof Date))return n}function $(e,t,n,r){let i=Q(t,n)??Q(t,r);i&&e.push(i)}function we(){return process.env.HOME??process.env.USERPROFILE??`/`}var Te=class{baseDir;constructor(e){this.baseDir=e??x(we(),`.robota`,`sessions`)}ensureDir(){_(this.baseDir)||v(this.baseDir,{recursive:!0})}filePath(e){return x(this.baseDir,`${e}.json`)}getFilePath(e){return this.filePath(e)}save(e){this.ensureDir(),te(this.filePath(e.id),JSON.stringify(e,null,2),`utf-8`)}load(e){let t=this.filePath(e);if(!_(t))return;let n=y(t,`utf-8`);return JSON.parse(n)}list(){if(!_(this.baseDir))return[];let e=b(this.baseDir).filter(e=>e.endsWith(`.json`)),t=[];for(let n of e)try{let e=y(x(this.baseDir,n),`utf-8`),r=JSON.parse(e);t.push(r)}catch{}return t.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime())}delete(e){let t=this.filePath(e);_(t)&&ee(t)}};export{B as AUTO_COMPACT_THRESHOLD,U as CompactionOrchestrator,V as ContextWindowTracker,se as FileSessionLogger,z as PermissionEnforcer,q as Session,Te as SessionStore,le as SilentSessionLogger,be as loadSessionLogEntries,xe as replaySessionLogEntries,ue as validateSessionReplayLogEntries};
7
+ //# sourceMappingURL=index.js.map