@ai-agent-forge/agent-forge 0.86.0 → 0.86.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.86.1] - 2026-09-30
6
+ ### Added
7
+
8
+ - Overflow trim ladder: when context overflow persists after the compact-and-retry attempt, the runtime projection is trimmed at turn boundaries in up to 3 escalating stages (`keepRecentTokens` → 10000 → last user message only) and retried before failing; canonical session history is never modified; when the projection can no longer be reduced the failure surfaces immediately instead of burning futile retries. Deterministic coverage in `test/suite/agent-session-compaction.test.ts`.
9
+
10
+ ### Changed
11
+
12
+ - Compaction summary requests clamp the session thinking level to `low` (`off` stays `off`): structured summarization is a mechanical task, higher thinking levels only add cost.
13
+
5
14
  ## [0.86.0] - 2026-09-30
6
15
  ### Removed
7
16
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-09-30T14:04:54.835Z",
2
+ "generatedAt": "2026-09-30T15:42:35.919Z",
3
3
  "inputCount": 3560,
4
4
  "inputs": {
5
5
  "node_modules/@anthropic-ai/sdk/_vendor/partial-json-parser/parser.mjs": "717f9403f2d3ee0f2077aeb7f0ca7eaff7cc9bcdbb054ac23c6c0361fa03cd1f",
@@ -2103,7 +2103,7 @@
2103
2103
  "packages/agent-forge/dist/config.js": "d5385bbd45014dd43ec334ca75d5061d32bf5e8313be63c271701d4adfc47f73",
2104
2104
  "packages/agent-forge/dist/core/agent-capability-contract.js": "40ca2bb245646233e9299f16281ff8ce4cc318639e63d77181a1d81996b1b0e8",
2105
2105
  "packages/agent-forge/dist/core/agent-session-bash.js": "be1e6ba94a28ee0bb34e5156b8a00312ce2c1dda8c703c7180b940a7e5f00f5d",
2106
- "packages/agent-forge/dist/core/agent-session-compaction.js": "380884770bebdc40669666995fba012a8e1aa2dcaf0d58cc270bba1547e9bd65",
2106
+ "packages/agent-forge/dist/core/agent-session-compaction.js": "c14f8697b176c7ff089d357014449320e1b1b2b3155110f9a151f82360d6ab29",
2107
2107
  "packages/agent-forge/dist/core/agent-session-context.js": "ce15ea36a1730153b82e15210cf384e70fecdd16d49108ba055101958e51e984",
2108
2108
  "packages/agent-forge/dist/core/agent-session-extensions.js": "341572c1ca3be22e968b3772c39db2f2fbfba9d67eba589618a3dbbefdeb9655",
2109
2109
  "packages/agent-forge/dist/core/agent-session-internal.js": "e1d42c9083684aa87f5f4f0c2e8d2057449c81ff93e45d9c7c9fa42fd3a6b956",
@@ -2118,13 +2118,13 @@
2118
2118
  "packages/agent-forge/dist/core/agent-session-services.js": "47e621b46b72904a3e3d922e5a8e598c8a40e0d6528580687cb7a85e3c086b0b",
2119
2119
  "packages/agent-forge/dist/core/agent-session-store.js": "3ac69a593fce5e207cda7963ba38a9bc3f3ef046e0b6f3780993cdba00ccffc9",
2120
2120
  "packages/agent-forge/dist/core/agent-session-tools.js": "f15911cd387fd202a0573f49c3916cc4cc9498ac3c168473c60e6989b117ad0c",
2121
- "packages/agent-forge/dist/core/agent-session.js": "8aeafcf223608ef4e40b64733b62429d4f3eaaf1d23ee0fa433cc35d9e3a2d30",
2121
+ "packages/agent-forge/dist/core/agent-session.js": "2087e2a9d55ebdfff9d8f1ea7b13e270cee2465c7eec4aaa6545052985b2bf04",
2122
2122
  "packages/agent-forge/dist/core/auth-guidance.js": "990e8295236ab4c87763b8e47e0ffa20c2958fd1827d17caf5ddf36d601e5fb4",
2123
2123
  "packages/agent-forge/dist/core/auth-storage.js": "a033465e077d3c6598d8dbd126f7538247ea4c12298bebea0cbda8e4b568ef05",
2124
2124
  "packages/agent-forge/dist/core/bash-executor.js": "078b0dd8afe6174b2e4be117673a28c8aff280e9cbd52a970db2290f71431784",
2125
2125
  "packages/agent-forge/dist/core/cache-stats.js": "41ee75d3f00cdba413d6ca71dd931d6d1f9eec57a41e84ce5a5d0c7534bbaedf",
2126
2126
  "packages/agent-forge/dist/core/compaction/branch-summarization.js": "7f717ff113d217bd1de7ea85dab2213a8fac233bb76627779520eafd7001a105",
2127
- "packages/agent-forge/dist/core/compaction/compaction.js": "14c5208bc8c3a313148cee14322fb974c0495ae417d0ddb38766574e47d5589d",
2127
+ "packages/agent-forge/dist/core/compaction/compaction.js": "42f730ad557504583e22316e09d57d9ae69fcd1021cb8795b82d0c8b566d1201",
2128
2128
  "packages/agent-forge/dist/core/compaction/index.js": "2ab40284c2650bf3c3f195442be00497f0ee3cb726ac47c29bfa4b3ae209697e",
2129
2129
  "packages/agent-forge/dist/core/compaction/utils.js": "3e3c8f2bd2f23f5f77c1cbf23dc3840c10e494150440b287dc523a535a599fa5",
2130
2130
  "packages/agent-forge/dist/core/defaults.js": "13196dce2ddb143f6f4c28af2e34374f84004e50c7b71ba7b900e1acf84479b6",
@@ -2442,10 +2442,10 @@
2442
2442
  "packages/agent-forge/src/config.ts": "449583f59742dea75d03642f9d1b9defec2945b19d822854df984edd0f5872f0",
2443
2443
  "packages/agent-forge/src/core/agent-capability-contract.ts": "c74c49b7233cbc64aaaf80f1302e344225d8c53e840b117a3fbfaf038ec88bfd",
2444
2444
  "packages/agent-forge/src/core/agent-session-bash.ts": "4e094f86a7ed9d1afebbbf946858a3196d8c4e3ede8e1cd841e621a8a0ff1d4b",
2445
- "packages/agent-forge/src/core/agent-session-compaction.ts": "4e9f0b1d68d25a5fa6ab96eb16b2e708672ffa64e57d7e63c4e718b247b96683",
2445
+ "packages/agent-forge/src/core/agent-session-compaction.ts": "e727145f4f573ddbf257c4df16551e37052476237d42fc315ce3bd221b6207b2",
2446
2446
  "packages/agent-forge/src/core/agent-session-context.ts": "1270a7dba505079f890c2c2e286679812b388500ce6c8972753e6fccfe706201",
2447
2447
  "packages/agent-forge/src/core/agent-session-extensions.ts": "d4f96cd48bd3210ea6315f013fa3ea24a3fb8902fe9727f88b8dea511cf6c9d9",
2448
- "packages/agent-forge/src/core/agent-session-internal.ts": "acd8e48aa4a2f281abe30c02335d5fce02772d3332b501bdaa6cf4fa510dd4e8",
2448
+ "packages/agent-forge/src/core/agent-session-internal.ts": "9793c680eac40fc290af783e12533e6b46b4657b3398aaceba482045931c26bc",
2449
2449
  "packages/agent-forge/src/core/agent-session-lifecycle.ts": "71f8194c44958e0e96f3276c170b5ae6d2c629e91b38e55375363ae955a4e871",
2450
2450
  "packages/agent-forge/src/core/agent-session-loop-runner.ts": "36abdb5ba1dc1a9dac516d837875d469acc391c20cfcbb4b487828ce7320227e",
2451
2451
  "packages/agent-forge/src/core/agent-session-loop.ts": "61a66b2a3ef401a0fe88b504c1367c6906ddb55cef7ce51a297410726c0e84ea",
@@ -2457,13 +2457,13 @@
2457
2457
  "packages/agent-forge/src/core/agent-session-services.ts": "d7ff11e50353509ff4ce55039baf3733279400fa06272fcaf028bfec9665deb4",
2458
2458
  "packages/agent-forge/src/core/agent-session-store.ts": "9bc26c7328004b0742347572ad54479bda113b54516d8de7fc1ad73963d2c651",
2459
2459
  "packages/agent-forge/src/core/agent-session-tools.ts": "b09a156b085a12ca59f43df6ba05b7375442304614ced9fa9e1214d8579b50de",
2460
- "packages/agent-forge/src/core/agent-session.ts": "15f70954eb7994c4d31656690645a183cc81b5defd396e695dfba3526b086fa9",
2460
+ "packages/agent-forge/src/core/agent-session.ts": "c0109790772b0f65b6763fc1c8693ae80ef7fba5457b9d6c14bb816a363c8f74",
2461
2461
  "packages/agent-forge/src/core/auth-guidance.ts": "8fbee7c272953bf881f22e9ce4b163bb0df9c091f63ee823dbfe32186991efe0",
2462
2462
  "packages/agent-forge/src/core/auth-storage.ts": "c3b53cd49af9e98bbec1c3ab15fedd065cabda94f0cd35673742f5a2b8bb057c",
2463
2463
  "packages/agent-forge/src/core/bash-executor.ts": "c905c5014c83b4429b3e722ba8d940fef70e15eef8f1747ce90985c6a9085e0c",
2464
2464
  "packages/agent-forge/src/core/cache-stats.ts": "41af3954a8e5f9b577f339c5ee94bd61c9777dca286c276ed1bdec2931f4d7c9",
2465
2465
  "packages/agent-forge/src/core/compaction/branch-summarization.ts": "ef393dde5169e9bbbe5f5429d7ab077cd9d17859d949d62ded6ba1a726bd2758",
2466
- "packages/agent-forge/src/core/compaction/compaction.ts": "927036d7f7ef8b7434da652776171f3d100491693c693fd5ce867dc11410e962",
2466
+ "packages/agent-forge/src/core/compaction/compaction.ts": "119ec1ad77feff0744f3b2f2245472db47b43ba2c4aad1d5c8ce927f0462dfbc",
2467
2467
  "packages/agent-forge/src/core/compaction/index.ts": "f82bde781410ae1a638989ff91bde9cc7045341a76bb9757de2ea6beea4c077d",
2468
2468
  "packages/agent-forge/src/core/compaction/utils.ts": "700b2594931e0a93c6dcce2d5b453dc9d916f6e11418a93da6a09f6cc06f4728",
2469
2469
  "packages/agent-forge/src/core/defaults.ts": "b6a3004da77e5133cffd41ffe503f3f2854725abd7ac942c1f724829867c39df",
@@ -982,7 +982,7 @@ ${getProviderLoginHelp()}
982
982
 
983
983
  Then use /model to select a model.`}function formatNoApiKeyFoundMessage(provider){return`No API key found for ${provider===UNKNOWN_PROVIDER?"the selected model":provider}.
984
984
 
985
- ${getProviderLoginHelp()}`}function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function estimateMessagesTokens(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}async function getRequiredRequestAuth(session,model){let result;try{result=await session._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result&&(result.auth.apiKey||result.auth.headers))return{model:result.auth.baseUrl?{...model,baseUrl:result.auth.baseUrl}:model,apiKey:result.auth.apiKey,headers:withoutDeletedHeaders(result.auth.headers),env:result.env};throw session._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async function getSummarizationRequestAuth(session,model){if(session.agent.streamFunction===streamSimple)return getRequiredRequestAuth(session,model);try{let result=await session._modelRuntime.getAuth(model);return result?{model:result.auth.baseUrl?{...model,baseUrl:result.auth.baseUrl}:model,apiKey:result.auth.apiKey,headers:withoutDeletedHeaders(result.auth.headers),env:result.env}:{model}}catch{return{model}}}function summaryModelFacts(model){return{id:model.id,contextWindow:model.contextWindow,maxTokens:model.maxTokens,reasoning:model.reasoning}}function createSummaryModelInvocationV1(session,auth,retry,callbacks,options={}){return{invoke:async(input,signal)=>{let maxTokens=input.maxTokens===void 0||auth.model.maxTokens<=0?input.maxTokens:Math.min(input.maxTokens,auth.model.maxTokens),requestOptions={...maxTokens===void 0?{}:{maxTokens},signal,apiKey:auth.apiKey,headers:auth.headers,env:auth.env,cacheRetention:"none",sessionId:options.routingSessionId??uuidv7()};auth.model.reasoning&&input.thinkingLevel&&input.thinkingLevel!=="off"&&(requestOptions.reasoning=input.thinkingLevel);let context={systemPrompt:input.systemPrompt,messages:[{role:"user",content:[{type:"text",text:input.prompt}],timestamp:Date.now()}]},produce=async()=>{let streamFn=session.agent.streamFunction;return streamFn?(await streamFn(auth.model,context,requestOptions)).result():completeSimple(auth.model,context,requestOptions)},response2;try{response2=await retryAssistantCall(produce,retry,requestOptions.signal,callbacks)}catch(error2){return error2 instanceof Error&&error2.name==="AbortError"?{version:1,status:"aborted"}:{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.transportError,message:error2 instanceof Error?error2.message:String(error2)}}}return response2.stopReason==="aborted"?{version:1,status:"aborted"}:response2.stopReason==="error"?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.providerError,message:response2.errorMessage||"Unknown error"}}:response2.stopReason==="length"?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.lengthCap,message:"generation hit the token cap and the summary is incomplete"}}:response2.content.some(block=>block.type==="toolCall")?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.toolCall,message:"attempted to call a tool"}}:{version:1,status:"completed",text:contentText(response2.content),usage:response2.usage}}}}async function compactBeforeNextAssistantResponse(session,context,signal){let model=session.model,settings2=session.settingsManager.getCompactionSettings();if(!model||model.contextWindow<=0)return context;let contextTokens=estimateContextTokens2(context.messages).tokens,decision=await decideCompaction(session,{reason:"threshold",contextOverflow:!1,recoverableLength:!1,contextUsage:{contextTokens,contextWindow:model.contextWindow,reserveTokens:settings2.reserveTokens},canContinue:!1,signal:signal??session._policyDecisionAbortController?.signal});return await dispatchCompactionDecisionLifecycle(session,{reason:"threshold",compact:decision.compact,willRetry:!1,contextTokens,contextWindow:model.contextWindow,reserveTokens:settings2.reserveTokens,...decision.failureMessage===void 0?{}:{failureMessage:decision.failureMessage}}),decision.compact?(await session._runAutoCompaction("threshold",!1),{...context,messages:session.agent.state.messages.slice()}):context}function executionFacts(session,phase,operationId,revision){let inputRevision=detachedSessionSnapshot(revision??session.sessionManager.getRevision());return Object.freeze({version:1,operationId:operationId??`${phase}:${inputRevision.sessionId}:${inputRevision.sequence}:${inputRevision.leafId??"root"}`,sessionId:session.sessionId,inputRevision,phase})}async function runCompactionSummary(session,preparation,auth,customInstructions,signal,reason,execution){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let result=await runtime.summarizeCompaction(session._compactionPolicyName,{preparation,model:summaryModelFacts(auth.model),invocation:createSummaryModelInvocationV1(session,auth,summarizationRetryPolicy(session,execution.operationId,execution.inputRevision,signal),summarizationRetryCallbacks(session,{source:"compaction",reason}),{routingSessionId:session.sessionId}),customInstructions,signal,reason,thinkingLevel:session.thinkingLevel,sessionId:session.sessionId,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution});return{...result,usage:result.usage}}async function decideCompaction(session,input){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return session._compactionPolicyName===DEFAULT_COMPACTION_POLICY_NAME&&!runtime.hasCompactionPolicy(session._compactionPolicyName)?(session._hostLogger?.warn("compaction","no compaction policy registered; skipping automatic compaction",{fields:{policyName:session._compactionPolicyName,reason:input.reason}}),{compact:!1,retry:!1}):runtime.decideCompaction(session._compactionPolicyName,{enabled:session.settingsManager.getCompactionSettings().enabled,recoveryAttempted:session._overflowRecoveryAttempted,...input,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution:input.execution??executionFacts(session,"compaction"),signal:input.signal})}async function prepareCompaction3(session,pathEntries,settings2,execution,signal){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let preparation=await runtime.prepareCompaction(session._compactionPolicyName,{entries:pathEntries,settings:settings2,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution:execution??executionFacts(session,"compaction"),signal});if(preparation===void 0)return;let value=preparation;if(!preparation||typeof preparation!="object"||typeof value.firstKeptEntryId!="string"||!Array.isArray(value.messagesToSummarize)||!Array.isArray(value.turnPrefixMessages)||typeof value.isSplitTurn!="boolean"||!Number.isFinite(value.tokensBefore)||typeof value.fileOps!="object"||typeof value.settings!="object")throw new Error(`Compaction policy returned an invalid preparation: ${session._compactionPolicyName}`);return preparation}function captureCompactionCommitBoundary(session,reason){let pathEntries=session.sessionManager.getBranch(),expectedRevision=session.sessionManager.getRevision();return{pathEntries,expectedRevision,operationId:`compaction:${reason}:${expectedRevision.sessionId}:${expectedRevision.sequence}:${expectedRevision.leafId??"root"}`}}function enqueueCompaction(session,operation){let previous=session._compactionQueue,release;session._compactionQueue=new Promise(resolve25=>{release=resolve25});let queued=previous.then(()=>{if(session._reloadInProgress)throw new Error("Session reload in progress; compaction was not started");return operation()}).finally(release);return session._activeCompactionPromise=queued,queued.then(()=>{session._activeCompactionPromise===queued&&(session._activeCompactionPromise=void 0)},()=>{session._activeCompactionPromise===queued&&(session._activeCompactionPromise=void 0)}),queued}function commitCompaction(session,input){let commit=session.sessionManager.commitCompaction({version:1,operationId:input.operationId,expectedRevision:input.expectedRevision,summary:input.summary,firstKeptEntryId:input.firstKeptEntryId,tokensBefore:input.tokensBefore,details:input.details,fromHook:!1,usage:input.usage});if(commit.status==="revision_conflict")throw new Error(`Compaction commit revision conflict: expected ${input.expectedRevision.sequence}/${input.expectedRevision.leafId??"root"}, current ${commit.currentRevision.sequence}/${commit.currentRevision.leafId??"root"}`);let entry=session.sessionManager.getEntry(commit.entryId);if(entry?.type!=="compaction"||entry.operationId!==input.operationId)throw new Error(`Compaction commit entry is unavailable: ${commit.entryId}`);return{entry,status:commit.status,revision:commit.revision}}async function dispatchCompactionCommitLifecycle(session,reason,commit){try{let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let entry=commit.entry,data={version:1,status:commit.status,entryId:entry.id,operationId:entry.operationId??"",revision:commit.revision,reason,summary:entry.summary,firstKeptEntryId:entry.firstKeptEntryId,tokensBefore:entry.tokensBefore,fromHook:entry.fromHook===!0,...entry.usage===void 0?{}:{usage:entry.usage},...entry.details===void 0?{}:{details:entry.details}},delivery=await runtime.dispatchLifecycle({type:SESSION_COMPACTION_COMMIT_EVENT_ID,version:SESSION_COMPACTION_COMMIT_EVENT_VERSION,phase:"committed",data,operationId:entry.operationId,source:"agent-session"});for(let failure2 of delivery.report.failures)session._observeLifecycleDeliveryError(failure2.error,failure2.pluginId,`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}/${failure2.kind}`)}catch(error2){let report=error2.report;if(report?.failures)for(let failure2 of report.failures)session._observeLifecycleDeliveryError(failure2.error,failure2.pluginId,`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}/${failure2.kind}`);else session._observeLifecycleDeliveryError(error2,"<capability-lifecycle>",`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}`)}}async function decideOverflow(session,message,execution,signal){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return runtime.decideOverflow(session._overflowPolicyName,{message,contextWindow:session.model?.contextWindow,desiredMaxOutput:session.model?.maxTokens??0,context:{version:1,sessionId:session.sessionId,phase:"overflow"},execution:execution??executionFacts(session,"overflow"),signal})}function clearManualCompactionState(session){session._compactionAbortController=void 0,session._resolveIdleWaitIfIdle()}async function compactInternal(session,customInstructions){if(await session._abortInternal(),session._reloadInProgress)return{cancelled:!0,aborted:!0};session._compactionAbortController=new AbortController,session._emit({type:"compaction_start",reason:"manual"});try{if(!session.model)throw new Error(formatNoModelSelectedMessage());let auth=await getSummarizationRequestAuth(session,session.model),{pathEntries,expectedRevision,operationId}=captureCompactionCommitBoundary(session,"manual"),settings2=session.settingsManager.getCompactionSettings(),execution=executionFacts(session,"compaction",operationId),preparation=await prepareCompaction3(session,pathEntries,settings2,execution,session._compactionAbortController.signal);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");let{summary,firstKeptEntryId,tokensBefore,usage,details}=await runCompactionSummary(session,preparation,auth,customInstructions,session._compactionAbortController.signal,"manual",execution);if(session._compactionAbortController.signal.aborted||session._reloadInProgress)throw new SessionCancelledError("signal");let compactionCommit=commitCompaction(session,{expectedRevision,operationId,summary,firstKeptEntryId,tokensBefore,details,usage});await dispatchCompactionCommitLifecycle(session,"manual",compactionCommit);let sessionContext=session.sessionManager.buildSessionContext();await session._applyContextTransition(sessionContext.messages,"compaction");let estimatedTokensAfter=estimateMessagesTokens(session.agent.state.messages),compactionResult={summary,firstKeptEntryId,tokensBefore,estimatedTokensAfter,usage,details};return clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:compactionResult,aborted:!1,willRetry:!1}),compactionResult}catch(error2){if(error2 instanceof SessionCancelledError||error2 instanceof Error&&error2.name==="AbortError")return clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!0,willRetry:!1}),{cancelled:!0,aborted:!0};let errorMessage2=`Compaction failed: ${error2 instanceof Error?error2.message:String(error2)}`;throw clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"manual"},cause:error2}),await dispatchCompactionFailedLifecycle(session,{reason:"manual",errorMessage:errorMessage2}),error2}finally{clearManualCompactionState(session)}}async function checkCompaction(session,assistantMessage,skipAbortedCheck=!0,signal){if(signal?.aborted)return!1;let settings2=session.settingsManager.getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=session.model?.contextWindow??0,sameModel=session.model!==void 0&&assistantMessage.provider===session.model.provider&&assistantMessage.model===session.model.id,compactionEntry=getLatestCompactionEntry(session.sessionManager.getBranch());if(compactionEntry!==null&&assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime())return!1;let overflow=sameModel?await decideOverflow(session,assistantMessage,void 0,signal):{contextOverflow:!1,recoverableLength:!1},{contextOverflow,recoverableLength}=overflow;if(contextOverflow||recoverableLength){let decision2=await decideCompaction(session,{reason:"overflow",contextOverflow,recoverableLength,canContinue:assistantMessage.stopReason!=="stop",signal});if(await dispatchCompactionDecisionLifecycle(session,{reason:"overflow",compact:decision2.compact,willRetry:decision2.retry===!0,...decision2.failureMessage===void 0?{}:{failureMessage:decision2.failureMessage}}),!decision2.compact){if(decision2.failureMessage){let errorMessage2=decision2.failureMessage;session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"overflow"},cause:errorMessage2}),await dispatchCompactionFailedLifecycle(session,{reason:"overflow",errorMessage:errorMessage2})}return!1}let willRetry=decision2.retry===!0;return willRetry&&(session._overflowRecoveryAttempted=!0),await session._runAutoCompaction("overflow",willRetry)}let contextTokens,directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason==="error"||directContextTokens===0){let messages=session.agent.state.messages,estimate=estimateContextTokens2(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&usageMsg.timestamp<=new Date(compactionEntry.timestamp).getTime())return!1}contextTokens=estimate.tokens}else contextTokens=directContextTokens;let decision=await decideCompaction(session,{reason:"threshold",contextOverflow:!1,recoverableLength:!1,contextUsage:{contextTokens,contextWindow,reserveTokens:settings2.reserveTokens},canContinue:!1,branchEntries:session.sessionManager.getBranch(),keepRecentTokens:settings2.keepRecentTokens,signal});if(await dispatchCompactionDecisionLifecycle(session,{reason:"threshold",compact:decision.compact,willRetry:decision.retry===!0,contextTokens,contextWindow,reserveTokens:settings2.reserveTokens,...decision.failureMessage===void 0?{}:{failureMessage:decision.failureMessage}}),decision.relief!==void 0&&!decision.compact){session.sessionManager.appendCustomEntry(decision.relief.customType,decision.relief.data);let sessionContext=session.sessionManager.buildSessionContext();return await session._applyContextTransition(sessionContext.messages,"compaction"),session._hostLogger?.info("compaction","policy relief applied",{fields:{customType:decision.relief.customType}}),session.agent.hasQueuedMessages()}return decision.compact?session._runAutoCompaction("threshold",decision.retry===!0):!1}async function runAutoCompaction(session,reason,willRetry){return session._reloadInProgress?!1:enqueueCompaction(session,()=>runAutoCompactionInternal(session,reason,willRetry))}async function runAutoCompactionInternal(session,reason,willRetry){session._autoCompactionAbortController=new AbortController;let autoCompactionSignal=session._autoCompactionAbortController.signal;try{try{if(willRetry){let messages=session.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&await session._applyContextTransition(messages.slice(0,-1),"overflow_recovery")}if(autoCompactionSignal.aborted||session._reloadInProgress)return!1}catch(error2){throw session._autoCompactionAbortController=void 0,error2}let settings2=session.settingsManager.getCompactionSettings(),started=!1;try{if(!session.model)return!1;let auth=await getSummarizationRequestAuth(session,session.model),{pathEntries,expectedRevision,operationId}=captureCompactionCommitBoundary(session,reason),execution=executionFacts(session,"compaction",operationId),preparation=await prepareCompaction3(session,pathEntries,settings2,execution,autoCompactionSignal);if(!preparation)return session._emit({type:"compaction_skipped",reason,cause:"nothing_to_compact"}),!1;session._emit({type:"compaction_start",reason}),started=!0;let{summary,firstKeptEntryId,tokensBefore,usage,details}=await runCompactionSummary(session,preparation,auth,void 0,autoCompactionSignal,reason,execution);if(autoCompactionSignal.aborted||session._reloadInProgress)return session._emit({type:"compaction_end",reason,result:void 0,aborted:!0,willRetry:!1}),!1;let compactionCommit=commitCompaction(session,{expectedRevision,operationId,summary,firstKeptEntryId,tokensBefore,details,usage});await dispatchCompactionCommitLifecycle(session,reason,compactionCommit);let sessionContext=session.sessionManager.buildSessionContext();await session._applyContextTransition(sessionContext.messages,"compaction");let estimatedTokensAfter=estimateMessagesTokens(session.agent.state.messages),result={summary,firstKeptEntryId,tokensBefore,estimatedTokensAfter,usage,details};if(session._emit({type:"compaction_end",reason,result,aborted:!1,willRetry}),willRetry){let messages=session.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&await session._applyContextTransition(messages.slice(0,-1),"overflow_recovery"),!0}return session.agent.hasQueuedMessages()}catch(error2){let errorMessage2=error2 instanceof Error?error2.message:"compaction failed";if(started){let formattedErrorMessage=reason==="overflow"?`Context overflow recovery failed: ${errorMessage2}`:`Auto-compaction failed: ${errorMessage2}`;session._emit({type:"compaction_end",reason,result:void 0,aborted:!1,willRetry:!1,errorMessage:formattedErrorMessage}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason},cause:error2}),await dispatchCompactionFailedLifecycle(session,{reason,errorMessage:formattedErrorMessage})}return!1}}finally{session._autoCompactionAbortController=void 0,session._resolveIdleWaitIfIdle()}}function summarizationRetryCallbacks(session,source){let attempts=[];return{onRetryScheduled:(attempt2,_maxAttempts,delayMs,errorMessage2)=>{attempts.push({attempt:attempt2,at:Date.now(),ok:!1,failure:errorMessage2,waitedMs:delayMs}),session._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts:_maxAttempts,delayMs,errorMessage:errorMessage2})},onRetryAttemptStart:()=>{session._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:(success,attempt2,finalError)=>{attempts.push(success?{attempt:attempt2+1,at:Date.now(),ok:!0,waitedMs:0}:{attempt:attempt2+1,at:Date.now(),ok:!1,waitedMs:0,...finalError===void 0?{}:{failure:finalError}}),session._emit({type:"summarization_retry_finished",source,attempts})}}}function summarizationRetryPolicy(session,operationId,inputRevision,signal){let settings2=session.settingsManager.getRetrySettings(),runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let execution=executionFacts(session,"retry",operationId?`${operationId}:retry`:void 0,inputRevision);return{...settings2,classify:message=>runtime.classifyRetry(session._retryPolicyName,{message,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution}),decide:({message,retryable,attempt:attempt2,maxAttempts,baseDelayMs})=>runtime.decideRetry(session._retryPolicyName,{retryable,enabled:settings2.enabled,attempt:attempt2,maxAttempts,baseDelayMs,errorMessage:message.errorMessage,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution})}}async function navigateTree(session,targetId,options={}){if(session.isStreaming)throw new Error("Wait for the current response to finish before navigating the session tree.");if(session._compactionAbortController!==void 0||session._autoCompactionAbortController!==void 0)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=session.sessionManager.getLeafId();if(targetId===oldLeafId)return{cancelled:!1};if(options.summarize&&!session.model)throw new Error("No model available for summarization");let targetEntry=session.sessionManager.getEntry(targetId);if(!targetEntry)throw new Error(`Entry ${targetId} not found`);let{entries:entriesToSummarize}=collectEntriesForBranchSummary2(session.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label=options.label;if(session._reloadInProgress)throw new Error("Session reload in progress; tree navigation is unavailable");if(session._branchSummaryAbortController)throw new Error("Branch navigation is already in progress");session._branchSummaryAbortController=new AbortController;let branchSummaryPromise=new Promise(resolve25=>{session._resolveBranchSummaryPromise=resolve25});session._branchSummaryPromise=branchSummaryPromise;try{let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0){let model=session.model,auth=await getSummarizationRequestAuth(session,model),branchSummarySettings=session.settingsManager.getBranchSummarySettings(),runtime=session._capabilityRuntime;if(!runtime||!runtime.hasBranchSummaryPolicy(session._branchSummaryPolicyName))throw new Error(`Branch summary policy is not registered: ${session._branchSummaryPolicyName}`);let execution=executionFacts(session,"branch_summary",`branch_summary:${session.sessionId}:${oldLeafId??"root"}:${targetId}`),result=await runtime.summarizeBranch(session._branchSummaryPolicyName,{entries:entriesToSummarize,model:summaryModelFacts(auth.model),invocation:createSummaryModelInvocationV1(session,auth,summarizationRetryPolicy(session,execution.operationId,execution.inputRevision,session._branchSummaryAbortController.signal),summarizationRetryCallbacks(session,{source:"branchSummary"})),signal:session._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,context:{version:1,sessionId:session.sessionId,phase:"branch_summary"},execution});if(result.aborted)return{cancelled:!0,aborted:!0};if(result.error)throw new Error(result.error);summaryText=result.summary,summaryUsage=result.usage,summaryDetails={readFiles:result.readFiles||[],modifiedFiles:result.modifiedFiles||[]}}if(session._branchSummaryAbortController.signal.aborted||session._reloadInProgress)return{cancelled:!0,aborted:!0};let newLeafId,editorText;targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=session.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,!1,summaryUsage);summaryEntry=session.sessionManager.getEntry(summaryId),label&&session.sessionManager.appendLabelChange(summaryId,label)}else newLeafId===null?session.sessionManager.resetLeaf():session.sessionManager.branch(newLeafId);label&&!summaryText&&session.sessionManager.appendLabelChange(targetId,label);let sessionContext=session.sessionManager.buildSessionContext();return await session._applyContextTransition(sessionContext.messages,"tree"),{editorText,cancelled:!1,summaryEntry}}finally{session._branchSummaryAbortController=void 0,session._resolveIdleWaitIfIdle(),session._resolveBranchSummaryPromise?.(),session._resolveBranchSummaryPromise=void 0,session._branchSummaryPromise===branchSummaryPromise&&(session._branchSummaryPromise=void 0)}}function requireContextStrategy(session){let name=session._contextStrategyName;if(!name)throw new Error("Context strategy is not configured");let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");if(!runtime.hasContextStrategy(name))throw new Error(`Configured context strategy is not registered: ${name}`);return{runtime,name}}function requireIdleContextOperation(session,operation){if(!session.isIdle)throw new Error(`Cannot ${operation} while the session is running`)}function beginContextTransitionFence(session){session._contextEpoch+=1,session._contextTransitionAbortController.abort("context runtime replaced"),session._contextTransitionAbortController=new AbortController}function isContextTransitionCurrent(session,epoch,allowReload){return!session.isDisposed&&epoch===session._contextEpoch&&(allowReload||!session._reloadInProgress)}function assertContextTransitionCurrent(session,epoch,allowReload){if(!session._isContextTransitionCurrent(epoch,allowReload))throw new Error(session.isDisposed?"Session is disposed; context transition was cancelled":session._reloadInProgress?"Session reload in progress; context transition was cancelled":"Context transition was superseded")}function enqueueContextTransition(session,operation,options){let allowReload=options?.allowReload??!1;if(session.isDisposed)return Promise.reject(new Error("Session is disposed; context transition is unavailable"));if(session._reloadInProgress&&!allowReload)return Promise.reject(new Error("Session reload in progress; context transition is unavailable"));let epoch=session._contextEpoch,fenceSignal=session._contextTransitionAbortController.signal,signal=options?.signal?AbortSignal.any([fenceSignal,options.signal]):fenceSignal,queued=(session._activeContextTransition?.catch(()=>{})??Promise.resolve()).then(()=>(session._assertContextTransitionCurrent(epoch,allowReload),operation(epoch,signal)));return session._activeContextTransition=queued,queued.then(()=>{session._activeContextTransition===queued&&(session._activeContextTransition=void 0)},()=>{session._activeContextTransition===queued&&(session._activeContextTransition=void 0)}),queued}function copyContextMessages(value,strategyName,direction){if(!Array.isArray(value)||value.some(message=>typeof message!="object"||message===null||!("role"in message)||typeof message.role!="string"))throw new Error(direction==="result"?`Context strategy must return an AgentMessage array: ${strategyName}`:`Context transition requires an AgentMessage array: ${strategyName}`);try{return structuredClone(value)}catch(error2){throw new Error(direction==="result"?`Context strategy must return structured-cloneable AgentMessage values: ${strategyName}`:`Context transition requires structured-cloneable AgentMessage values: ${strategyName}`,{cause:error2})}}function applyContextTransition(session,messages,reason="session_replace",signal,options){return session._enqueueContextTransition(async(epoch,transitionSignal)=>{let name=session._contextStrategyName,runtime=session._capabilityRuntime;if(name){if(!runtime)throw new Error("Capability runtime is not available");if(!runtime.hasContextStrategy(name))throw new Error(`Configured context strategy is not registered: ${name}`);let replaced=await runtime.replaceContext(name,session._copyContextMessages(messages,name,"input"),{signal:transitionSignal,reason,sessionId:session.sessionId});session._assertContextTransitionCurrent(epoch,options?.allowReload??!1);let committed=session._copyContextMessages(replaced,name,"result");return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=committed,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason,name),committed}return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=messages,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason),messages},{signal,allowReload:options?.allowReload})}function restoreContextTransition(session,snapshot2,reason,options){return session._enqueueContextTransition(async(epoch,signal)=>{let{runtime,name}=session._requireContextStrategy(),restored=await runtime.restoreContext(name,snapshot2,{signal,reason,sessionId:session.sessionId});session._assertContextTransitionCurrent(epoch,options?.allowReload??!1);let committed=session._copyContextMessages(restored,name,"result");return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=committed,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason,name),committed},{allowReload:options?.allowReload})}async function snapshotContext(session){session._requireIdleContextOperation("snapshot context");let{runtime,name}=session._requireContextStrategy();return runtime.snapshotContext(name,session._copyContextMessages(session.agent.state.messages,name,"input"),{reason:"reload",sessionId:session.sessionId})}async function restoreContext(session,snapshot2){return session._requireIdleContextOperation("restore context"),session._restoreContextTransition(snapshot2,"session_replace")}async function replaceContext(session,context){session._requireIdleContextOperation("replace context");let{name}=session._requireContextStrategy();return session._applyContextTransition(session._copyContextMessages(context,name,"input"),"session_replace")}import{basename as basename7,dirname as dirname17}from"node:path";async function extendResourcesFromExtensions(session,reason){dispatchResourcesDiscoverV1Lifecycle(session,{cwd:session._cwd,reason});let contributed=await dispatchResourcesDiscoverV2Lifecycle(session,reason),{skillPaths,promptPaths,themePaths}=contributed;if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0)return;let extensionPaths={skillPaths:session.buildExtensionResourcePaths(skillPaths),promptPaths:session.buildExtensionResourcePaths(promptPaths),themePaths:session.buildExtensionResourcePaths(themePaths)};session._resourceLoader.extendResources(extensionPaths),await session._refreshBootstrapSkills(),session._baseSystemPrompt=session._rebuildSystemPrompt(session.getActiveToolNames()),session.agent.state.systemPrompt=session._baseSystemPrompt}function buildExtensionResourcePaths(session,entries){return entries.map(entry=>{let source=session.getExtensionSourceLabel(entry.extensionPath),baseDir=entry.extensionPath.startsWith("<")?void 0:dirname17(entry.extensionPath);return{path:entry.path,metadata:{source,scope:"temporary",origin:"top-level",baseDir}}})}function getExtensionSourceLabel(extensionPath){return extensionPath.startsWith("<")?`extension:${extensionPath.replace(/[<>]/g,"")}`:`extension:${basename7(extensionPath).replace(/\.(ts|js)$/,"")}`}function collectCommandInfos(session){let templates=session.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=session._getAvailableSkills().map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...templates,...skills]}function wireDefaultLoop(session){let previousPrepareNextTurnWithContext=session.agent.prepareNextTurnWithContext??(session.agent.prepareNextTurn?async(_turn,signal)=>await session.agent.prepareNextTurn?.(signal):void 0);session._initialPrepareNextTurn=previousPrepareNextTurnWithContext;let previousTransform=session.agent.transformContext,transformHead=previousTransform?async(messages,signal)=>await previousTransform(messages,signal):void 0;session.agent.beforeToolCall=async({toolCall,args},signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("beforeToolCall")??[],currentArgs=args,replaced=!1;for(let link of chain){let result=await link({toolCallId:toolCall.id,toolName:toolCall.name,args:currentArgs,signal});if(result){if(result.block){let reason=typeof result.reason=="string"&&result.reason.trim()!==""?result.reason:void 0;return await dispatchToolGateBlockedLifecycle(session,toolCall.id,toolCall.name,reason),result}"args"in result&&(currentArgs=result.args,replaced=!0)}}return replaced?{args:currentArgs}:void 0},session.agent.afterToolCall=async({toolCall,args,result,isError},signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("afterToolCall")??[],current=result,override;for(let link of chain){let linkResult=await link({toolCallId:toolCall.id,toolName:toolCall.name,args,result:current,isError,signal});linkResult!==void 0&&(current=linkResult,override=linkResult)}return override},session.agent.transformContext=async(messages,signal)=>{let current=messages;if(transformHead){let transformed=await transformHead(current,signal);transformed!==void 0&&(current=transformed)}let chain=session._capabilityRuntime?.getLoopHookChain("transformContext")??[];for(let link of chain){let transformed=await link(current,signal);transformed!==void 0&&(current=transformed)}return current},session.agent.prepareNextTurnWithContext=async(turn,signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("prepareNextTurn")??[],current=turn;for(let link of chain){let revised=await link(current,signal);revised!==void 0&&(current=revised)}return current};let previousShouldStopAfterTurn=session.agent.shouldStopAfterTurn;session.agent.shouldStopAfterTurn=async(context,signal)=>{if(previousShouldStopAfterTurn&&await previousShouldStopAfterTurn(context,signal))return!0;let chain=session._capabilityRuntime?.getLoopHookChain("shouldStopAfterTurn")??[];for(let link of chain)if(await link(context,signal))return!0;return!1}}function createLoopWiring(session){return{getSessionId:()=>session.sessionId,getRevision:()=>detachedSessionSnapshot(session.sessionManager.getRevision()),getTurnCorrelationId:()=>session._turnCorrelationId,observeError:(error2,source,event)=>{session._observeLifecycleDeliveryError(error2,source,event)},getImageAutoResize:()=>session.settingsManager.getImageAutoResize(),compactBeforeNextAssistantResponse:(context,signal)=>session._compactBeforeNextAssistantResponse(context,signal),getTurnRefresh:()=>({systemPrompt:session._systemPromptOverride??session._baseSystemPrompt,tools:session.agent.state.tools.slice(),model:session.agent.state.model,thinkingLevel:session.agent.state.thinkingLevel}),getInitialPrepareNextTurn:()=>session._initialPrepareNextTurn,getContextStrategyName:()=>session._contextStrategyName}}async function runPromptLoop(session,messages){return session._loopExecutor?session._loopExecutor(session,messages):runDefaultLoop(session,messages)}async function runDefaultLoop(session,messages,drive=postAgentRun){let policyDecisionController=new AbortController,previousPolicyDecisionController=session._policyDecisionAbortController;session._policyDecisionAbortController=policyDecisionController,session._isAgentRunActive=!0,session._currentRunAborted=!1;let turnCorrelationId=`turn:${++session._turnCorrelationCounter}`;session._turnCorrelationId=turnCorrelationId;try{for(await session.agent.prompt(messages);await drive(session);)await session.agent.continue();return session._currentRunAborted?{status:"aborted",reason:session._lastAbortReason??"interrupted"}:{status:"done"}}finally{session._turnCorrelationId===turnCorrelationId&&(session._turnCorrelationId=void 0);try{session._systemPromptOverride=void 0,session._flushPendingBashMessages(),session._flushPendingCustomMessages(),await session._emitAgentSettled()}finally{session._policyDecisionAbortController===policyDecisionController&&(session._policyDecisionAbortController=previousPolicyDecisionController)}}}async function postAgentRun(session){let msg=session._lastAssistantMessage;if(session._lastAssistantMessage=void 0,!msg)return session._pendingRetryDecision=void 0,!1;let pendingDecision=session._pendingRetryDecision;session._pendingRetryDecision=void 0;let policySignal=session._policyDecisionAbortController?.signal;try{if(pendingDecision?!policySignal?.aborted&&await session._prepareRetry(msg,pendingDecision.decision):await session._isRetryableError(msg,void 0,policySignal)&&await session._prepareRetry(msg))return await decideRunLoop(session,{willRetry:!0,willCompact:!1,queuedFollowUp:session.agent.hasQueuedMessages(),hostWillContinue:!0},policySignal)}catch(error2){if(!policySignal?.aborted)throw error2}msg.stopReason==="error"&&session._retryAttempt>0&&(session._emit({type:"auto_retry_end",success:!1,attempt:session._retryAttempt,finalError:msg.errorMessage}),session._retryAttempt=0);try{if(await session._checkCompaction(msg,!0,policySignal))return await decideRunLoop(session,{willRetry:!1,willCompact:!0,queuedFollowUp:session.agent.hasQueuedMessages(),hostWillContinue:!0},policySignal)}catch(error2){if(!policySignal?.aborted)throw error2}let queuedFollowUp=session.agent.hasQueuedMessages();return decideRunLoop(session,{willRetry:!1,willCompact:!1,queuedFollowUp,hostWillContinue:queuedFollowUp},policySignal)}async function decideRunLoop(session,facts,signal){let runtime=session._capabilityRuntime;if(!runtime?.hasRunLoopStrategy(session._runLoopStrategyName))return facts.hostWillContinue;try{let decision=await runtime.decideRunLoop(session._runLoopStrategyName,{...facts,signal});return facts.hostWillContinue&&decision.continueLoop}catch(error2){if(!signal?.aborted)throw error2;return facts.hostWillContinue}}async function emitModelSelect(session,nextModel,previousModel,source){modelsAreEqual(previousModel,nextModel)||await dispatchModelSelectLifecycle(session,{provider:nextModel.provider,id:nextModel.id},source)}async function setModel(session,model,options={}){if(!await session._modelRuntime.checkAuth(model.provider))throw new Error(`No API key for ${model.provider}/${model.id}`);let previousModel=session.model,thinkingLevel=session._getThinkingLevelForModelSwitch(model);session.agent.state.model=model,session.sessionManager.appendModelChange(model.provider,model.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(model.provider,model.id),session._addPersistedDefaultToNonEmptyScope(model)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(model,previousModel,"set")}function addPersistedDefaultToNonEmptyScope(session,model){if(session._scopedModels.length===0||session._scopedModels.some(scoped=>modelsAreEqual(scoped.model,model)))return;session._scopedModels=[...session._scopedModels,{model}];let enabledModels=session.settingsManager.getEnabledModels();if(!enabledModels?.length)return;let modelReference=`${model.provider}/${model.id}`;enabledModels.some(pattern=>pattern.toLowerCase()===modelReference.toLowerCase())||session.settingsManager.setEnabledModels([...enabledModels,modelReference])}async function cycleModel(session,direction="forward",options={}){return session._scopedModels.length>0?session._cycleScopedModel(direction,options):session._cycleAvailableModel(direction,options)}async function cycleScopedModel(session,direction,options){let availableIds=new Set(session._modelRuntime.getAvailableSnapshot().map(model=>`${model.provider}\0${model.id}`)),scopedModels=session._scopedModels.filter(scoped=>availableIds.has(`${scoped.model.provider}\0${scoped.model.id}`));if(scopedModels.length<=1)return;let currentModel=session.model,currentIndex=scopedModels.findIndex(sm=>modelsAreEqual(sm.model,currentModel));currentIndex===-1&&(currentIndex=0);let len=scopedModels.length,nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len,next=scopedModels[nextIndex],thinkingLevel=session._getThinkingLevelForModelSwitch(next.model,next.thinkingLevel);return session.agent.state.model=next.model,session.sessionManager.appendModelChange(next.model.provider,next.model.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),session._addPersistedDefaultToNonEmptyScope(next.model)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(next.model,currentModel,"cycle"),{model:next.model,thinkingLevel:session.thinkingLevel,isScoped:!0}}async function cycleAvailableModel(session,direction,options){let availableModels=session._modelRuntime.getAvailableSnapshot();if(availableModels.length<=1)return;let currentModel=session.model,currentIndex=availableModels.findIndex(m2=>modelsAreEqual(m2,currentModel));currentIndex===-1&&(currentIndex=0);let len=availableModels.length,nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len,nextModel=availableModels[nextIndex],thinkingLevel=session._getThinkingLevelForModelSwitch(nextModel);return session.agent.state.model=nextModel,session.sessionManager.appendModelChange(nextModel.provider,nextModel.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(nextModel.provider,nextModel.id),session._addPersistedDefaultToNonEmptyScope(nextModel)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(nextModel,currentModel,"cycle"),{model:nextModel,thinkingLevel:session.thinkingLevel,isScoped:!1}}function getScopedModels(session){return session._scopedModels}function modelFactsView(model){return{provider:model.provider,id:model.id,contextWindow:model.contextWindow,maxTokens:model.maxTokens,reasoning:model.reasoning}}function setScopedModels(session,scopedModels){session._scopedModels=scopedModels}function getThinkingLevelForModelSwitch(session,targetModel,explicitLevel){if(explicitLevel!==void 0)return explicitLevel;if(targetModel){let perModel=session.settingsManager.getModelThinkingLevel(targetModel.provider,targetModel.id);if(perModel!==void 0)return perModel}return session.settingsManager.getDefaultThinkingLevel()??session.thinkingLevel??DEFAULT_THINKING_LEVEL}import{existsSync as existsSync10,readFileSync as readFileSync9,writeFileSync as writeFileSync7}from"fs";import{basename as basename8,join as join36}from"path";function parseColor(color){let hexMatch=color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(hexMatch)return{r:Number.parseInt(hexMatch[1],16),g:Number.parseInt(hexMatch[2],16),b:Number.parseInt(hexMatch[3],16)};let rgbMatch=color.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);if(rgbMatch)return{r:Number.parseInt(rgbMatch[1],10),g:Number.parseInt(rgbMatch[2],10),b:Number.parseInt(rgbMatch[3],10)}}function getLuminance(r,g2,b2){let toLinear=c2=>{let s=c2/255;return s<=.03928?s/12.92:((s+.055)/1.055)**2.4};return .2126*toLinear(r)+.7152*toLinear(g2)+.0722*toLinear(b2)}function adjustBrightness(color,factor){let parsed=parseColor(color);if(!parsed)return color;let adjust=c2=>Math.min(255,Math.max(0,Math.round(c2*factor)));return`rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`}function deriveExportColors(baseColor){let parsed=parseColor(baseColor);return parsed?getLuminance(parsed.r,parsed.g,parsed.b)>.5?{pageBg:adjustBrightness(baseColor,.96),cardBg:baseColor,infoBg:`rgb(${Math.min(255,parsed.r+10)}, ${Math.min(255,parsed.g+5)}, ${Math.max(0,parsed.b-20)})`}:{pageBg:adjustBrightness(baseColor,.7),cardBg:adjustBrightness(baseColor,.85),infoBg:`rgb(${Math.min(255,parsed.r+20)}, ${Math.min(255,parsed.g+15)}, ${parsed.b})`}:{pageBg:"rgb(24, 24, 30)",cardBg:"rgb(30, 30, 36)",infoBg:"rgb(60, 55, 40)"}}function generateThemeVars(themeName){let colors=getResolvedThemeColors(themeName),lines=[];for(let[key,value]of Object.entries(colors))lines.push(`--${key}: ${value};`);let themeExport=getThemeExportColors(themeName),userMessageBg=colors.userMessageBg||"#343541",derivedColors=deriveExportColors(userMessageBg);return lines.push(`--exportPageBg: ${themeExport.pageBg??derivedColors.pageBg};`),lines.push(`--exportCardBg: ${themeExport.cardBg??derivedColors.cardBg};`),lines.push(`--exportInfoBg: ${themeExport.infoBg??derivedColors.infoBg};`),lines.join(`
985
+ ${getProviderLoginHelp()}`}function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function estimateMessagesTokens(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}var OVERFLOW_TRIM_MAX_STAGES=3,OVERFLOW_TRIM_STAGE2_TARGET_TOKENS=1e4;function overflowTrimFailureMessage(attempts,failureMessage){return attempts>0?`Context overflow persists after compaction and ${attempts} trim attempts. ${failureMessage}`:failureMessage}function trimOverflowProjection(messages,stage,keepRecentTokens){if(stage>=2){for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user")return i===0?messages:messages.slice(i);for(let i=messages.length-1;i>=0;i--)if(isTurnStartMessage(messages[i]))return i===0?messages:messages.slice(i);return messages}let target=stage===0?keepRecentTokens:OVERFLOW_TRIM_STAGE2_TARGET_TOKENS,turnStarts=[];for(let i=0;i<messages.length;i++)isTurnStartMessage(messages[i])&&turnStarts.push(i);if(turnStarts.length===0)return messages;let suffixTokens=new Array(messages.length+1).fill(0);for(let i=messages.length-1;i>=0;i--)suffixTokens[i]=suffixTokens[i+1]+estimateTokens2(messages[i]);if(suffixTokens[0]<=target)return messages;for(let start of turnStarts)if(suffixTokens[start]<=target)return messages.slice(start);let floorStart=turnStarts[turnStarts.length-1];return floorStart===0?messages:messages.slice(floorStart)}async function getRequiredRequestAuth(session,model){let result;try{result=await session._modelRuntime.getAuth(model)}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result&&(result.auth.apiKey||result.auth.headers))return{model:result.auth.baseUrl?{...model,baseUrl:result.auth.baseUrl}:model,apiKey:result.auth.apiKey,headers:withoutDeletedHeaders(result.auth.headers),env:result.env};throw session._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async function getSummarizationRequestAuth(session,model){if(session.agent.streamFunction===streamSimple)return getRequiredRequestAuth(session,model);try{let result=await session._modelRuntime.getAuth(model);return result?{model:result.auth.baseUrl?{...model,baseUrl:result.auth.baseUrl}:model,apiKey:result.auth.apiKey,headers:withoutDeletedHeaders(result.auth.headers),env:result.env}:{model}}catch{return{model}}}function summaryModelFacts(model){return{id:model.id,contextWindow:model.contextWindow,maxTokens:model.maxTokens,reasoning:model.reasoning}}function createSummaryModelInvocationV1(session,auth,retry,callbacks,options={}){return{invoke:async(input,signal)=>{let maxTokens=input.maxTokens===void 0||auth.model.maxTokens<=0?input.maxTokens:Math.min(input.maxTokens,auth.model.maxTokens),requestOptions={...maxTokens===void 0?{}:{maxTokens},signal,apiKey:auth.apiKey,headers:auth.headers,env:auth.env,cacheRetention:"none",sessionId:options.routingSessionId??uuidv7()};auth.model.reasoning&&input.thinkingLevel&&input.thinkingLevel!=="off"&&(requestOptions.reasoning=input.thinkingLevel);let context={systemPrompt:input.systemPrompt,messages:[{role:"user",content:[{type:"text",text:input.prompt}],timestamp:Date.now()}]},produce=async()=>{let streamFn=session.agent.streamFunction;return streamFn?(await streamFn(auth.model,context,requestOptions)).result():completeSimple(auth.model,context,requestOptions)},response2;try{response2=await retryAssistantCall(produce,retry,requestOptions.signal,callbacks)}catch(error2){return error2 instanceof Error&&error2.name==="AbortError"?{version:1,status:"aborted"}:{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.transportError,message:error2 instanceof Error?error2.message:String(error2)}}}return response2.stopReason==="aborted"?{version:1,status:"aborted"}:response2.stopReason==="error"?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.providerError,message:response2.errorMessage||"Unknown error"}}:response2.stopReason==="length"?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.lengthCap,message:"generation hit the token cap and the summary is incomplete"}}:response2.content.some(block=>block.type==="toolCall")?{version:1,status:"failed",error:{code:SUMMARY_MODEL_INVOCATION_ERROR_CODES.toolCall,message:"attempted to call a tool"}}:{version:1,status:"completed",text:contentText(response2.content),usage:response2.usage}}}}async function compactBeforeNextAssistantResponse(session,context,signal){let model=session.model,settings2=session.settingsManager.getCompactionSettings();if(!model||model.contextWindow<=0)return context;let contextTokens=estimateContextTokens2(context.messages).tokens,decision=await decideCompaction(session,{reason:"threshold",contextOverflow:!1,recoverableLength:!1,contextUsage:{contextTokens,contextWindow:model.contextWindow,reserveTokens:settings2.reserveTokens},canContinue:!1,signal:signal??session._policyDecisionAbortController?.signal});return await dispatchCompactionDecisionLifecycle(session,{reason:"threshold",compact:decision.compact,willRetry:!1,contextTokens,contextWindow:model.contextWindow,reserveTokens:settings2.reserveTokens,...decision.failureMessage===void 0?{}:{failureMessage:decision.failureMessage}}),decision.compact?(await session._runAutoCompaction("threshold",!1),{...context,messages:session.agent.state.messages.slice()}):context}function executionFacts(session,phase,operationId,revision){let inputRevision=detachedSessionSnapshot(revision??session.sessionManager.getRevision());return Object.freeze({version:1,operationId:operationId??`${phase}:${inputRevision.sessionId}:${inputRevision.sequence}:${inputRevision.leafId??"root"}`,sessionId:session.sessionId,inputRevision,phase})}async function runCompactionSummary(session,preparation,auth,customInstructions,signal,reason,execution){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let result=await runtime.summarizeCompaction(session._compactionPolicyName,{preparation,model:summaryModelFacts(auth.model),invocation:createSummaryModelInvocationV1(session,auth,summarizationRetryPolicy(session,execution.operationId,execution.inputRevision,signal),summarizationRetryCallbacks(session,{source:"compaction",reason}),{routingSessionId:session.sessionId}),customInstructions,signal,reason,thinkingLevel:session.thinkingLevel==="off"?"off":"low",sessionId:session.sessionId,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution});return{...result,usage:result.usage}}async function decideCompaction(session,input){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return session._compactionPolicyName===DEFAULT_COMPACTION_POLICY_NAME&&!runtime.hasCompactionPolicy(session._compactionPolicyName)?(session._hostLogger?.warn("compaction","no compaction policy registered; skipping automatic compaction",{fields:{policyName:session._compactionPolicyName,reason:input.reason}}),{compact:!1,retry:!1}):runtime.decideCompaction(session._compactionPolicyName,{enabled:session.settingsManager.getCompactionSettings().enabled,recoveryAttempted:session._overflowRecoveryAttempted,...input,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution:input.execution??executionFacts(session,"compaction"),signal:input.signal})}async function prepareCompaction3(session,pathEntries,settings2,execution,signal){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let preparation=await runtime.prepareCompaction(session._compactionPolicyName,{entries:pathEntries,settings:settings2,context:{version:1,sessionId:session.sessionId,phase:"compaction"},execution:execution??executionFacts(session,"compaction"),signal});if(preparation===void 0)return;let value=preparation;if(!preparation||typeof preparation!="object"||typeof value.firstKeptEntryId!="string"||!Array.isArray(value.messagesToSummarize)||!Array.isArray(value.turnPrefixMessages)||typeof value.isSplitTurn!="boolean"||!Number.isFinite(value.tokensBefore)||typeof value.fileOps!="object"||typeof value.settings!="object")throw new Error(`Compaction policy returned an invalid preparation: ${session._compactionPolicyName}`);return preparation}function captureCompactionCommitBoundary(session,reason){let pathEntries=session.sessionManager.getBranch(),expectedRevision=session.sessionManager.getRevision();return{pathEntries,expectedRevision,operationId:`compaction:${reason}:${expectedRevision.sessionId}:${expectedRevision.sequence}:${expectedRevision.leafId??"root"}`}}function enqueueCompaction(session,operation){let previous=session._compactionQueue,release;session._compactionQueue=new Promise(resolve25=>{release=resolve25});let queued=previous.then(()=>{if(session._reloadInProgress)throw new Error("Session reload in progress; compaction was not started");return operation()}).finally(release);return session._activeCompactionPromise=queued,queued.then(()=>{session._activeCompactionPromise===queued&&(session._activeCompactionPromise=void 0)},()=>{session._activeCompactionPromise===queued&&(session._activeCompactionPromise=void 0)}),queued}function commitCompaction(session,input){let commit=session.sessionManager.commitCompaction({version:1,operationId:input.operationId,expectedRevision:input.expectedRevision,summary:input.summary,firstKeptEntryId:input.firstKeptEntryId,tokensBefore:input.tokensBefore,details:input.details,fromHook:!1,usage:input.usage});if(commit.status==="revision_conflict")throw new Error(`Compaction commit revision conflict: expected ${input.expectedRevision.sequence}/${input.expectedRevision.leafId??"root"}, current ${commit.currentRevision.sequence}/${commit.currentRevision.leafId??"root"}`);let entry=session.sessionManager.getEntry(commit.entryId);if(entry?.type!=="compaction"||entry.operationId!==input.operationId)throw new Error(`Compaction commit entry is unavailable: ${commit.entryId}`);return{entry,status:commit.status,revision:commit.revision}}async function dispatchCompactionCommitLifecycle(session,reason,commit){try{let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let entry=commit.entry,data={version:1,status:commit.status,entryId:entry.id,operationId:entry.operationId??"",revision:commit.revision,reason,summary:entry.summary,firstKeptEntryId:entry.firstKeptEntryId,tokensBefore:entry.tokensBefore,fromHook:entry.fromHook===!0,...entry.usage===void 0?{}:{usage:entry.usage},...entry.details===void 0?{}:{details:entry.details}},delivery=await runtime.dispatchLifecycle({type:SESSION_COMPACTION_COMMIT_EVENT_ID,version:SESSION_COMPACTION_COMMIT_EVENT_VERSION,phase:"committed",data,operationId:entry.operationId,source:"agent-session"});for(let failure2 of delivery.report.failures)session._observeLifecycleDeliveryError(failure2.error,failure2.pluginId,`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}/${failure2.kind}`)}catch(error2){let report=error2.report;if(report?.failures)for(let failure2 of report.failures)session._observeLifecycleDeliveryError(failure2.error,failure2.pluginId,`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}/${failure2.kind}`);else session._observeLifecycleDeliveryError(error2,"<capability-lifecycle>",`${SESSION_COMPACTION_COMMIT_EVENT_ID}@${SESSION_COMPACTION_COMMIT_EVENT_VERSION}`)}}async function decideOverflow(session,message,execution,signal){let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return runtime.decideOverflow(session._overflowPolicyName,{message,contextWindow:session.model?.contextWindow,desiredMaxOutput:session.model?.maxTokens??0,context:{version:1,sessionId:session.sessionId,phase:"overflow"},execution:execution??executionFacts(session,"overflow"),signal})}function clearManualCompactionState(session){session._compactionAbortController=void 0,session._resolveIdleWaitIfIdle()}async function compactInternal(session,customInstructions){if(await session._abortInternal(),session._reloadInProgress)return{cancelled:!0,aborted:!0};session._compactionAbortController=new AbortController,session._emit({type:"compaction_start",reason:"manual"});try{if(!session.model)throw new Error(formatNoModelSelectedMessage());let auth=await getSummarizationRequestAuth(session,session.model),{pathEntries,expectedRevision,operationId}=captureCompactionCommitBoundary(session,"manual"),settings2=session.settingsManager.getCompactionSettings(),execution=executionFacts(session,"compaction",operationId),preparation=await prepareCompaction3(session,pathEntries,settings2,execution,session._compactionAbortController.signal);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");let{summary,firstKeptEntryId,tokensBefore,usage,details}=await runCompactionSummary(session,preparation,auth,customInstructions,session._compactionAbortController.signal,"manual",execution);if(session._compactionAbortController.signal.aborted||session._reloadInProgress)throw new SessionCancelledError("signal");let compactionCommit=commitCompaction(session,{expectedRevision,operationId,summary,firstKeptEntryId,tokensBefore,details,usage});await dispatchCompactionCommitLifecycle(session,"manual",compactionCommit);let sessionContext=session.sessionManager.buildSessionContext();await session._applyContextTransition(sessionContext.messages,"compaction");let estimatedTokensAfter=estimateMessagesTokens(session.agent.state.messages),compactionResult={summary,firstKeptEntryId,tokensBefore,estimatedTokensAfter,usage,details};return clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:compactionResult,aborted:!1,willRetry:!1}),compactionResult}catch(error2){if(error2 instanceof SessionCancelledError||error2 instanceof Error&&error2.name==="AbortError")return clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!0,willRetry:!1}),{cancelled:!0,aborted:!0};let errorMessage2=`Compaction failed: ${error2 instanceof Error?error2.message:String(error2)}`;throw clearManualCompactionState(session),session._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"manual"},cause:error2}),await dispatchCompactionFailedLifecycle(session,{reason:"manual",errorMessage:errorMessage2}),error2}finally{clearManualCompactionState(session)}}async function checkCompaction(session,assistantMessage,skipAbortedCheck=!0,signal){if(signal?.aborted)return!1;let settings2=session.settingsManager.getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=session.model?.contextWindow??0,sameModel=session.model!==void 0&&assistantMessage.provider===session.model.provider&&assistantMessage.model===session.model.id,compactionEntry=getLatestCompactionEntry(session.sessionManager.getBranch());if(compactionEntry!==null&&assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime())return!1;let overflow=sameModel?await decideOverflow(session,assistantMessage,void 0,signal):{contextOverflow:!1,recoverableLength:!1},{contextOverflow,recoverableLength}=overflow;if(contextOverflow||recoverableLength){let decision2=await decideCompaction(session,{reason:"overflow",contextOverflow,recoverableLength,canContinue:assistantMessage.stopReason!=="stop",signal});if(await dispatchCompactionDecisionLifecycle(session,{reason:"overflow",compact:decision2.compact,willRetry:decision2.retry===!0,...decision2.failureMessage===void 0?{}:{failureMessage:decision2.failureMessage}}),!decision2.compact){if(decision2.failureMessage&&contextOverflow&&session._overflowRecoveryAttempted&&session._overflowTrimStage<OVERFLOW_TRIM_MAX_STAGES){let stage=session._overflowTrimStage,failureMessage=decision2.failureMessage;return session._enqueueCompaction(async()=>{session._autoCompactionAbortController=new AbortController;let autoCompactionSignal=session._autoCompactionAbortController.signal;try{if(autoCompactionSignal.aborted||session._reloadInProgress)return!1;let messages=session.agent.state.messages,base=messages.length>0&&messages[messages.length-1].role==="assistant"?messages.slice(0,-1):messages,trimmed=trimOverflowProjection(base,stage,settings2.keepRecentTokens);if(trimmed.length===0||trimmed===base){let errorMessage2=overflowTrimFailureMessage(stage,failureMessage);return session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"overflow"},cause:errorMessage2}),await dispatchCompactionFailedLifecycle(session,{reason:"overflow",errorMessage:errorMessage2}),!1}return session._overflowTrimStage=stage+1,session._emit({type:"compaction_start",reason:"overflow"}),await session._applyContextTransition(trimmed,"overflow_recovery"),autoCompactionSignal.aborted||session._reloadInProgress?(session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!0,willRetry:!1}),!1):(session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!0}),!0)}catch(error2){let errorMessage2=error2 instanceof Error?error2.message:String(error2);return session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"overflow"},cause:errorMessage2}),await dispatchCompactionFailedLifecycle(session,{reason:"overflow",errorMessage:errorMessage2}),!1}finally{session._autoCompactionAbortController=void 0,session._resolveIdleWaitIfIdle()}})}if(decision2.failureMessage){let errorMessage2=contextOverflow?overflowTrimFailureMessage(session._overflowTrimStage,decision2.failureMessage):decision2.failureMessage;session._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage2}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason:"overflow"},cause:errorMessage2}),await dispatchCompactionFailedLifecycle(session,{reason:"overflow",errorMessage:errorMessage2})}return!1}let willRetry=decision2.retry===!0;return willRetry&&(session._overflowRecoveryAttempted=!0),await session._runAutoCompaction("overflow",willRetry)}let contextTokens,directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason==="error"||directContextTokens===0){let messages=session.agent.state.messages,estimate=estimateContextTokens2(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&usageMsg.timestamp<=new Date(compactionEntry.timestamp).getTime())return!1}contextTokens=estimate.tokens}else contextTokens=directContextTokens;let decision=await decideCompaction(session,{reason:"threshold",contextOverflow:!1,recoverableLength:!1,contextUsage:{contextTokens,contextWindow,reserveTokens:settings2.reserveTokens},canContinue:!1,branchEntries:session.sessionManager.getBranch(),keepRecentTokens:settings2.keepRecentTokens,signal});if(await dispatchCompactionDecisionLifecycle(session,{reason:"threshold",compact:decision.compact,willRetry:decision.retry===!0,contextTokens,contextWindow,reserveTokens:settings2.reserveTokens,...decision.failureMessage===void 0?{}:{failureMessage:decision.failureMessage}}),decision.relief!==void 0&&!decision.compact){session.sessionManager.appendCustomEntry(decision.relief.customType,decision.relief.data);let sessionContext=session.sessionManager.buildSessionContext();return await session._applyContextTransition(sessionContext.messages,"compaction"),session._hostLogger?.info("compaction","policy relief applied",{fields:{customType:decision.relief.customType}}),session.agent.hasQueuedMessages()}return decision.compact?session._runAutoCompaction("threshold",decision.retry===!0):!1}async function runAutoCompaction(session,reason,willRetry){return session._reloadInProgress?!1:enqueueCompaction(session,()=>runAutoCompactionInternal(session,reason,willRetry))}async function runAutoCompactionInternal(session,reason,willRetry){session._autoCompactionAbortController=new AbortController;let autoCompactionSignal=session._autoCompactionAbortController.signal;try{try{if(willRetry){let messages=session.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&await session._applyContextTransition(messages.slice(0,-1),"overflow_recovery")}if(autoCompactionSignal.aborted||session._reloadInProgress)return!1}catch(error2){throw session._autoCompactionAbortController=void 0,error2}let settings2=session.settingsManager.getCompactionSettings(),started=!1;try{if(!session.model)return!1;let auth=await getSummarizationRequestAuth(session,session.model),{pathEntries,expectedRevision,operationId}=captureCompactionCommitBoundary(session,reason),execution=executionFacts(session,"compaction",operationId),preparation=await prepareCompaction3(session,pathEntries,settings2,execution,autoCompactionSignal);if(!preparation)return session._emit({type:"compaction_skipped",reason,cause:"nothing_to_compact"}),!1;session._emit({type:"compaction_start",reason}),started=!0;let{summary,firstKeptEntryId,tokensBefore,usage,details}=await runCompactionSummary(session,preparation,auth,void 0,autoCompactionSignal,reason,execution);if(autoCompactionSignal.aborted||session._reloadInProgress)return session._emit({type:"compaction_end",reason,result:void 0,aborted:!0,willRetry:!1}),!1;let compactionCommit=commitCompaction(session,{expectedRevision,operationId,summary,firstKeptEntryId,tokensBefore,details,usage});await dispatchCompactionCommitLifecycle(session,reason,compactionCommit);let sessionContext=session.sessionManager.buildSessionContext();await session._applyContextTransition(sessionContext.messages,"compaction");let estimatedTokensAfter=estimateMessagesTokens(session.agent.state.messages),result={summary,firstKeptEntryId,tokensBefore,estimatedTokensAfter,usage,details};if(session._emit({type:"compaction_end",reason,result,aborted:!1,willRetry}),willRetry){let messages=session.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&await session._applyContextTransition(messages.slice(0,-1),"overflow_recovery"),!0}return session.agent.hasQueuedMessages()}catch(error2){let errorMessage2=error2 instanceof Error?error2.message:"compaction failed";if(started){let formattedErrorMessage=reason==="overflow"?`Context overflow recovery failed: ${errorMessage2}`:`Auto-compaction failed: ${errorMessage2}`;session._emit({type:"compaction_end",reason,result:void 0,aborted:!1,willRetry:!1,errorMessage:formattedErrorMessage}),session._hostLogger?.error("compaction","compaction failed",{fields:{reason},cause:error2}),await dispatchCompactionFailedLifecycle(session,{reason,errorMessage:formattedErrorMessage})}return!1}}finally{session._autoCompactionAbortController=void 0,session._resolveIdleWaitIfIdle()}}function summarizationRetryCallbacks(session,source){let attempts=[];return{onRetryScheduled:(attempt2,_maxAttempts,delayMs,errorMessage2)=>{attempts.push({attempt:attempt2,at:Date.now(),ok:!1,failure:errorMessage2,waitedMs:delayMs}),session._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts:_maxAttempts,delayMs,errorMessage:errorMessage2})},onRetryAttemptStart:()=>{session._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:(success,attempt2,finalError)=>{attempts.push(success?{attempt:attempt2+1,at:Date.now(),ok:!0,waitedMs:0}:{attempt:attempt2+1,at:Date.now(),ok:!1,waitedMs:0,...finalError===void 0?{}:{failure:finalError}}),session._emit({type:"summarization_retry_finished",source,attempts})}}}function summarizationRetryPolicy(session,operationId,inputRevision,signal){let settings2=session.settingsManager.getRetrySettings(),runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let execution=executionFacts(session,"retry",operationId?`${operationId}:retry`:void 0,inputRevision);return{...settings2,classify:message=>runtime.classifyRetry(session._retryPolicyName,{message,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution}),decide:({message,retryable,attempt:attempt2,maxAttempts,baseDelayMs})=>runtime.decideRetry(session._retryPolicyName,{retryable,enabled:settings2.enabled,attempt:attempt2,maxAttempts,baseDelayMs,errorMessage:message.errorMessage,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution})}}async function navigateTree(session,targetId,options={}){if(session.isStreaming)throw new Error("Wait for the current response to finish before navigating the session tree.");if(session._compactionAbortController!==void 0||session._autoCompactionAbortController!==void 0)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=session.sessionManager.getLeafId();if(targetId===oldLeafId)return{cancelled:!1};if(options.summarize&&!session.model)throw new Error("No model available for summarization");let targetEntry=session.sessionManager.getEntry(targetId);if(!targetEntry)throw new Error(`Entry ${targetId} not found`);let{entries:entriesToSummarize}=collectEntriesForBranchSummary2(session.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label=options.label;if(session._reloadInProgress)throw new Error("Session reload in progress; tree navigation is unavailable");if(session._branchSummaryAbortController)throw new Error("Branch navigation is already in progress");session._branchSummaryAbortController=new AbortController;let branchSummaryPromise=new Promise(resolve25=>{session._resolveBranchSummaryPromise=resolve25});session._branchSummaryPromise=branchSummaryPromise;try{let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0){let model=session.model,auth=await getSummarizationRequestAuth(session,model),branchSummarySettings=session.settingsManager.getBranchSummarySettings(),runtime=session._capabilityRuntime;if(!runtime||!runtime.hasBranchSummaryPolicy(session._branchSummaryPolicyName))throw new Error(`Branch summary policy is not registered: ${session._branchSummaryPolicyName}`);let execution=executionFacts(session,"branch_summary",`branch_summary:${session.sessionId}:${oldLeafId??"root"}:${targetId}`),result=await runtime.summarizeBranch(session._branchSummaryPolicyName,{entries:entriesToSummarize,model:summaryModelFacts(auth.model),invocation:createSummaryModelInvocationV1(session,auth,summarizationRetryPolicy(session,execution.operationId,execution.inputRevision,session._branchSummaryAbortController.signal),summarizationRetryCallbacks(session,{source:"branchSummary"})),signal:session._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,context:{version:1,sessionId:session.sessionId,phase:"branch_summary"},execution});if(result.aborted)return{cancelled:!0,aborted:!0};if(result.error)throw new Error(result.error);summaryText=result.summary,summaryUsage=result.usage,summaryDetails={readFiles:result.readFiles||[],modifiedFiles:result.modifiedFiles||[]}}if(session._branchSummaryAbortController.signal.aborted||session._reloadInProgress)return{cancelled:!0,aborted:!0};let newLeafId,editorText;targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=session.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,!1,summaryUsage);summaryEntry=session.sessionManager.getEntry(summaryId),label&&session.sessionManager.appendLabelChange(summaryId,label)}else newLeafId===null?session.sessionManager.resetLeaf():session.sessionManager.branch(newLeafId);label&&!summaryText&&session.sessionManager.appendLabelChange(targetId,label);let sessionContext=session.sessionManager.buildSessionContext();return await session._applyContextTransition(sessionContext.messages,"tree"),{editorText,cancelled:!1,summaryEntry}}finally{session._branchSummaryAbortController=void 0,session._resolveIdleWaitIfIdle(),session._resolveBranchSummaryPromise?.(),session._resolveBranchSummaryPromise=void 0,session._branchSummaryPromise===branchSummaryPromise&&(session._branchSummaryPromise=void 0)}}function requireContextStrategy(session){let name=session._contextStrategyName;if(!name)throw new Error("Context strategy is not configured");let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");if(!runtime.hasContextStrategy(name))throw new Error(`Configured context strategy is not registered: ${name}`);return{runtime,name}}function requireIdleContextOperation(session,operation){if(!session.isIdle)throw new Error(`Cannot ${operation} while the session is running`)}function beginContextTransitionFence(session){session._contextEpoch+=1,session._contextTransitionAbortController.abort("context runtime replaced"),session._contextTransitionAbortController=new AbortController}function isContextTransitionCurrent(session,epoch,allowReload){return!session.isDisposed&&epoch===session._contextEpoch&&(allowReload||!session._reloadInProgress)}function assertContextTransitionCurrent(session,epoch,allowReload){if(!session._isContextTransitionCurrent(epoch,allowReload))throw new Error(session.isDisposed?"Session is disposed; context transition was cancelled":session._reloadInProgress?"Session reload in progress; context transition was cancelled":"Context transition was superseded")}function enqueueContextTransition(session,operation,options){let allowReload=options?.allowReload??!1;if(session.isDisposed)return Promise.reject(new Error("Session is disposed; context transition is unavailable"));if(session._reloadInProgress&&!allowReload)return Promise.reject(new Error("Session reload in progress; context transition is unavailable"));let epoch=session._contextEpoch,fenceSignal=session._contextTransitionAbortController.signal,signal=options?.signal?AbortSignal.any([fenceSignal,options.signal]):fenceSignal,queued=(session._activeContextTransition?.catch(()=>{})??Promise.resolve()).then(()=>(session._assertContextTransitionCurrent(epoch,allowReload),operation(epoch,signal)));return session._activeContextTransition=queued,queued.then(()=>{session._activeContextTransition===queued&&(session._activeContextTransition=void 0)},()=>{session._activeContextTransition===queued&&(session._activeContextTransition=void 0)}),queued}function copyContextMessages(value,strategyName,direction){if(!Array.isArray(value)||value.some(message=>typeof message!="object"||message===null||!("role"in message)||typeof message.role!="string"))throw new Error(direction==="result"?`Context strategy must return an AgentMessage array: ${strategyName}`:`Context transition requires an AgentMessage array: ${strategyName}`);try{return structuredClone(value)}catch(error2){throw new Error(direction==="result"?`Context strategy must return structured-cloneable AgentMessage values: ${strategyName}`:`Context transition requires structured-cloneable AgentMessage values: ${strategyName}`,{cause:error2})}}function applyContextTransition(session,messages,reason="session_replace",signal,options){return session._enqueueContextTransition(async(epoch,transitionSignal)=>{let name=session._contextStrategyName,runtime=session._capabilityRuntime;if(name){if(!runtime)throw new Error("Capability runtime is not available");if(!runtime.hasContextStrategy(name))throw new Error(`Configured context strategy is not registered: ${name}`);let replaced=await runtime.replaceContext(name,session._copyContextMessages(messages,name,"input"),{signal:transitionSignal,reason,sessionId:session.sessionId});session._assertContextTransitionCurrent(epoch,options?.allowReload??!1);let committed=session._copyContextMessages(replaced,name,"result");return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=committed,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason,name),committed}return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=messages,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason),messages},{signal,allowReload:options?.allowReload})}function restoreContextTransition(session,snapshot2,reason,options){return session._enqueueContextTransition(async(epoch,signal)=>{let{runtime,name}=session._requireContextStrategy(),restored=await runtime.restoreContext(name,snapshot2,{signal,reason,sessionId:session.sessionId});session._assertContextTransitionCurrent(epoch,options?.allowReload??!1);let committed=session._copyContextMessages(restored,name,"result");return session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),session.agent.state.messages=committed,session._contextRevision+=1,session._assertContextTransitionCurrent(epoch,options?.allowReload??!1),await session._dispatchContextReplacedLifecycle(reason,name),committed},{allowReload:options?.allowReload})}async function snapshotContext(session){session._requireIdleContextOperation("snapshot context");let{runtime,name}=session._requireContextStrategy();return runtime.snapshotContext(name,session._copyContextMessages(session.agent.state.messages,name,"input"),{reason:"reload",sessionId:session.sessionId})}async function restoreContext(session,snapshot2){return session._requireIdleContextOperation("restore context"),session._restoreContextTransition(snapshot2,"session_replace")}async function replaceContext(session,context){session._requireIdleContextOperation("replace context");let{name}=session._requireContextStrategy();return session._applyContextTransition(session._copyContextMessages(context,name,"input"),"session_replace")}import{basename as basename7,dirname as dirname17}from"node:path";async function extendResourcesFromExtensions(session,reason){dispatchResourcesDiscoverV1Lifecycle(session,{cwd:session._cwd,reason});let contributed=await dispatchResourcesDiscoverV2Lifecycle(session,reason),{skillPaths,promptPaths,themePaths}=contributed;if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0)return;let extensionPaths={skillPaths:session.buildExtensionResourcePaths(skillPaths),promptPaths:session.buildExtensionResourcePaths(promptPaths),themePaths:session.buildExtensionResourcePaths(themePaths)};session._resourceLoader.extendResources(extensionPaths),await session._refreshBootstrapSkills(),session._baseSystemPrompt=session._rebuildSystemPrompt(session.getActiveToolNames()),session.agent.state.systemPrompt=session._baseSystemPrompt}function buildExtensionResourcePaths(session,entries){return entries.map(entry=>{let source=session.getExtensionSourceLabel(entry.extensionPath),baseDir=entry.extensionPath.startsWith("<")?void 0:dirname17(entry.extensionPath);return{path:entry.path,metadata:{source,scope:"temporary",origin:"top-level",baseDir}}})}function getExtensionSourceLabel(extensionPath){return extensionPath.startsWith("<")?`extension:${extensionPath.replace(/[<>]/g,"")}`:`extension:${basename7(extensionPath).replace(/\.(ts|js)$/,"")}`}function collectCommandInfos(session){let templates=session.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=session._getAvailableSkills().map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...templates,...skills]}function wireDefaultLoop(session){let previousPrepareNextTurnWithContext=session.agent.prepareNextTurnWithContext??(session.agent.prepareNextTurn?async(_turn,signal)=>await session.agent.prepareNextTurn?.(signal):void 0);session._initialPrepareNextTurn=previousPrepareNextTurnWithContext;let previousTransform=session.agent.transformContext,transformHead=previousTransform?async(messages,signal)=>await previousTransform(messages,signal):void 0;session.agent.beforeToolCall=async({toolCall,args},signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("beforeToolCall")??[],currentArgs=args,replaced=!1;for(let link of chain){let result=await link({toolCallId:toolCall.id,toolName:toolCall.name,args:currentArgs,signal});if(result){if(result.block){let reason=typeof result.reason=="string"&&result.reason.trim()!==""?result.reason:void 0;return await dispatchToolGateBlockedLifecycle(session,toolCall.id,toolCall.name,reason),result}"args"in result&&(currentArgs=result.args,replaced=!0)}}return replaced?{args:currentArgs}:void 0},session.agent.afterToolCall=async({toolCall,args,result,isError},signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("afterToolCall")??[],current=result,override;for(let link of chain){let linkResult=await link({toolCallId:toolCall.id,toolName:toolCall.name,args,result:current,isError,signal});linkResult!==void 0&&(current=linkResult,override=linkResult)}return override},session.agent.transformContext=async(messages,signal)=>{let current=messages;if(transformHead){let transformed=await transformHead(current,signal);transformed!==void 0&&(current=transformed)}let chain=session._capabilityRuntime?.getLoopHookChain("transformContext")??[];for(let link of chain){let transformed=await link(current,signal);transformed!==void 0&&(current=transformed)}return current},session.agent.prepareNextTurnWithContext=async(turn,signal)=>{let chain=session._capabilityRuntime?.getLoopHookChain("prepareNextTurn")??[],current=turn;for(let link of chain){let revised=await link(current,signal);revised!==void 0&&(current=revised)}return current};let previousShouldStopAfterTurn=session.agent.shouldStopAfterTurn;session.agent.shouldStopAfterTurn=async(context,signal)=>{if(previousShouldStopAfterTurn&&await previousShouldStopAfterTurn(context,signal))return!0;let chain=session._capabilityRuntime?.getLoopHookChain("shouldStopAfterTurn")??[];for(let link of chain)if(await link(context,signal))return!0;return!1}}function createLoopWiring(session){return{getSessionId:()=>session.sessionId,getRevision:()=>detachedSessionSnapshot(session.sessionManager.getRevision()),getTurnCorrelationId:()=>session._turnCorrelationId,observeError:(error2,source,event)=>{session._observeLifecycleDeliveryError(error2,source,event)},getImageAutoResize:()=>session.settingsManager.getImageAutoResize(),compactBeforeNextAssistantResponse:(context,signal)=>session._compactBeforeNextAssistantResponse(context,signal),getTurnRefresh:()=>({systemPrompt:session._systemPromptOverride??session._baseSystemPrompt,tools:session.agent.state.tools.slice(),model:session.agent.state.model,thinkingLevel:session.agent.state.thinkingLevel}),getInitialPrepareNextTurn:()=>session._initialPrepareNextTurn,getContextStrategyName:()=>session._contextStrategyName}}async function runPromptLoop(session,messages){return session._loopExecutor?session._loopExecutor(session,messages):runDefaultLoop(session,messages)}async function runDefaultLoop(session,messages,drive=postAgentRun){let policyDecisionController=new AbortController,previousPolicyDecisionController=session._policyDecisionAbortController;session._policyDecisionAbortController=policyDecisionController,session._isAgentRunActive=!0,session._currentRunAborted=!1;let turnCorrelationId=`turn:${++session._turnCorrelationCounter}`;session._turnCorrelationId=turnCorrelationId;try{for(await session.agent.prompt(messages);await drive(session);)await session.agent.continue();return session._currentRunAborted?{status:"aborted",reason:session._lastAbortReason??"interrupted"}:{status:"done"}}finally{session._turnCorrelationId===turnCorrelationId&&(session._turnCorrelationId=void 0);try{session._systemPromptOverride=void 0,session._flushPendingBashMessages(),session._flushPendingCustomMessages(),await session._emitAgentSettled()}finally{session._policyDecisionAbortController===policyDecisionController&&(session._policyDecisionAbortController=previousPolicyDecisionController)}}}async function postAgentRun(session){let msg=session._lastAssistantMessage;if(session._lastAssistantMessage=void 0,!msg)return session._pendingRetryDecision=void 0,!1;let pendingDecision=session._pendingRetryDecision;session._pendingRetryDecision=void 0;let policySignal=session._policyDecisionAbortController?.signal;try{if(pendingDecision?!policySignal?.aborted&&await session._prepareRetry(msg,pendingDecision.decision):await session._isRetryableError(msg,void 0,policySignal)&&await session._prepareRetry(msg))return await decideRunLoop(session,{willRetry:!0,willCompact:!1,queuedFollowUp:session.agent.hasQueuedMessages(),hostWillContinue:!0},policySignal)}catch(error2){if(!policySignal?.aborted)throw error2}msg.stopReason==="error"&&session._retryAttempt>0&&(session._emit({type:"auto_retry_end",success:!1,attempt:session._retryAttempt,finalError:msg.errorMessage}),session._retryAttempt=0);try{if(await session._checkCompaction(msg,!0,policySignal))return await decideRunLoop(session,{willRetry:!1,willCompact:!0,queuedFollowUp:session.agent.hasQueuedMessages(),hostWillContinue:!0},policySignal)}catch(error2){if(!policySignal?.aborted)throw error2}let queuedFollowUp=session.agent.hasQueuedMessages();return decideRunLoop(session,{willRetry:!1,willCompact:!1,queuedFollowUp,hostWillContinue:queuedFollowUp},policySignal)}async function decideRunLoop(session,facts,signal){let runtime=session._capabilityRuntime;if(!runtime?.hasRunLoopStrategy(session._runLoopStrategyName))return facts.hostWillContinue;try{let decision=await runtime.decideRunLoop(session._runLoopStrategyName,{...facts,signal});return facts.hostWillContinue&&decision.continueLoop}catch(error2){if(!signal?.aborted)throw error2;return facts.hostWillContinue}}async function emitModelSelect(session,nextModel,previousModel,source){modelsAreEqual(previousModel,nextModel)||await dispatchModelSelectLifecycle(session,{provider:nextModel.provider,id:nextModel.id},source)}async function setModel(session,model,options={}){if(!await session._modelRuntime.checkAuth(model.provider))throw new Error(`No API key for ${model.provider}/${model.id}`);let previousModel=session.model,thinkingLevel=session._getThinkingLevelForModelSwitch(model);session.agent.state.model=model,session.sessionManager.appendModelChange(model.provider,model.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(model.provider,model.id),session._addPersistedDefaultToNonEmptyScope(model)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(model,previousModel,"set")}function addPersistedDefaultToNonEmptyScope(session,model){if(session._scopedModels.length===0||session._scopedModels.some(scoped=>modelsAreEqual(scoped.model,model)))return;session._scopedModels=[...session._scopedModels,{model}];let enabledModels=session.settingsManager.getEnabledModels();if(!enabledModels?.length)return;let modelReference=`${model.provider}/${model.id}`;enabledModels.some(pattern=>pattern.toLowerCase()===modelReference.toLowerCase())||session.settingsManager.setEnabledModels([...enabledModels,modelReference])}async function cycleModel(session,direction="forward",options={}){return session._scopedModels.length>0?session._cycleScopedModel(direction,options):session._cycleAvailableModel(direction,options)}async function cycleScopedModel(session,direction,options){let availableIds=new Set(session._modelRuntime.getAvailableSnapshot().map(model=>`${model.provider}\0${model.id}`)),scopedModels=session._scopedModels.filter(scoped=>availableIds.has(`${scoped.model.provider}\0${scoped.model.id}`));if(scopedModels.length<=1)return;let currentModel=session.model,currentIndex=scopedModels.findIndex(sm=>modelsAreEqual(sm.model,currentModel));currentIndex===-1&&(currentIndex=0);let len=scopedModels.length,nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len,next=scopedModels[nextIndex],thinkingLevel=session._getThinkingLevelForModelSwitch(next.model,next.thinkingLevel);return session.agent.state.model=next.model,session.sessionManager.appendModelChange(next.model.provider,next.model.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),session._addPersistedDefaultToNonEmptyScope(next.model)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(next.model,currentModel,"cycle"),{model:next.model,thinkingLevel:session.thinkingLevel,isScoped:!0}}async function cycleAvailableModel(session,direction,options){let availableModels=session._modelRuntime.getAvailableSnapshot();if(availableModels.length<=1)return;let currentModel=session.model,currentIndex=availableModels.findIndex(m2=>modelsAreEqual(m2,currentModel));currentIndex===-1&&(currentIndex=0);let len=availableModels.length,nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len,nextModel=availableModels[nextIndex],thinkingLevel=session._getThinkingLevelForModelSwitch(nextModel);return session.agent.state.model=nextModel,session.sessionManager.appendModelChange(nextModel.provider,nextModel.id),options.persist&&(session.settingsManager.setDefaultModelAndProvider(nextModel.provider,nextModel.id),session._addPersistedDefaultToNonEmptyScope(nextModel)),session.setThinkingLevel(thinkingLevel),await session._emitModelSelect(nextModel,currentModel,"cycle"),{model:nextModel,thinkingLevel:session.thinkingLevel,isScoped:!1}}function getScopedModels(session){return session._scopedModels}function modelFactsView(model){return{provider:model.provider,id:model.id,contextWindow:model.contextWindow,maxTokens:model.maxTokens,reasoning:model.reasoning}}function setScopedModels(session,scopedModels){session._scopedModels=scopedModels}function getThinkingLevelForModelSwitch(session,targetModel,explicitLevel){if(explicitLevel!==void 0)return explicitLevel;if(targetModel){let perModel=session.settingsManager.getModelThinkingLevel(targetModel.provider,targetModel.id);if(perModel!==void 0)return perModel}return session.settingsManager.getDefaultThinkingLevel()??session.thinkingLevel??DEFAULT_THINKING_LEVEL}import{existsSync as existsSync10,readFileSync as readFileSync9,writeFileSync as writeFileSync7}from"fs";import{basename as basename8,join as join36}from"path";function parseColor(color){let hexMatch=color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(hexMatch)return{r:Number.parseInt(hexMatch[1],16),g:Number.parseInt(hexMatch[2],16),b:Number.parseInt(hexMatch[3],16)};let rgbMatch=color.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);if(rgbMatch)return{r:Number.parseInt(rgbMatch[1],10),g:Number.parseInt(rgbMatch[2],10),b:Number.parseInt(rgbMatch[3],10)}}function getLuminance(r,g2,b2){let toLinear=c2=>{let s=c2/255;return s<=.03928?s/12.92:((s+.055)/1.055)**2.4};return .2126*toLinear(r)+.7152*toLinear(g2)+.0722*toLinear(b2)}function adjustBrightness(color,factor){let parsed=parseColor(color);if(!parsed)return color;let adjust=c2=>Math.min(255,Math.max(0,Math.round(c2*factor)));return`rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`}function deriveExportColors(baseColor){let parsed=parseColor(baseColor);return parsed?getLuminance(parsed.r,parsed.g,parsed.b)>.5?{pageBg:adjustBrightness(baseColor,.96),cardBg:baseColor,infoBg:`rgb(${Math.min(255,parsed.r+10)}, ${Math.min(255,parsed.g+5)}, ${Math.max(0,parsed.b-20)})`}:{pageBg:adjustBrightness(baseColor,.7),cardBg:adjustBrightness(baseColor,.85),infoBg:`rgb(${Math.min(255,parsed.r+20)}, ${Math.min(255,parsed.g+15)}, ${parsed.b})`}:{pageBg:"rgb(24, 24, 30)",cardBg:"rgb(30, 30, 36)",infoBg:"rgb(60, 55, 40)"}}function generateThemeVars(themeName){let colors=getResolvedThemeColors(themeName),lines=[];for(let[key,value]of Object.entries(colors))lines.push(`--${key}: ${value};`);let themeExport=getThemeExportColors(themeName),userMessageBg=colors.userMessageBg||"#343541",derivedColors=deriveExportColors(userMessageBg);return lines.push(`--exportPageBg: ${themeExport.pageBg??derivedColors.pageBg};`),lines.push(`--exportCardBg: ${themeExport.cardBg??derivedColors.cardBg};`),lines.push(`--exportInfoBg: ${themeExport.infoBg??derivedColors.infoBg};`),lines.join(`
986
986
  `)}function generateHtml(sessionData,themeName){let templateDir=getExportTemplateDir(),template=readFileSync9(join36(templateDir,"template.html"),"utf-8"),templateCss=readFileSync9(join36(templateDir,"template.css"),"utf-8"),templateJs=readFileSync9(join36(templateDir,"template.js"),"utf-8"),markedJs=readFileSync9(join36(templateDir,"vendor","marked.min.js"),"utf-8"),hljsJs=readFileSync9(join36(templateDir,"vendor","highlight.min.js"),"utf-8"),themeVars=generateThemeVars(themeName),colors=getResolvedThemeColors(themeName),themeExport=getThemeExportColors(themeName),derivedExportColors=deriveExportColors(colors.userMessageBg||"#343541"),bodyBg=themeExport.pageBg??derivedExportColors.pageBg,containerBg=themeExport.cardBg??derivedExportColors.cardBg,infoBg=themeExport.infoBg??derivedExportColors.infoBg,sessionDataBase64=Buffer.from(JSON.stringify(sessionData)).toString("base64"),css=templateCss.replace("{{THEME_VARS}}",themeVars).replace("{{BODY_BG}}",bodyBg).replace("{{CONTAINER_BG}}",containerBg).replace("{{INFO_BG}}",infoBg);return template.replace("{{CSS}}",css).replace("{{JS}}",templateJs).replace("{{SESSION_DATA}}",sessionDataBase64).replace("{{MARKED_JS}}",markedJs).replace("{{HIGHLIGHT_JS}}",hljsJs)}var TEMPLATE_RENDERED_TOOLS=new Set(["bash","read","write","edit","ls"]);function preRenderCustomTools(entries,toolRenderer){let renderedTools={};for(let entry of entries){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"&&!TEMPLATE_RENDERED_TOOLS.has(block.name)){let callHtml=toolRenderer.renderCall(block.id,block.name,block.arguments);callHtml&&(renderedTools[block.id]={callHtml})}}if(msg.role==="toolResult"&&msg.toolCallId){let toolName=msg.toolName||"",existing=renderedTools[msg.toolCallId];if(existing||!TEMPLATE_RENDERED_TOOLS.has(toolName)){let rendered=toolRenderer.renderResult(msg.toolCallId,toolName,msg.content,msg.details,msg.isError||!1);rendered&&(renderedTools[msg.toolCallId]={...existing,resultHtmlCollapsed:rendered.collapsed,resultHtmlExpanded:rendered.expanded})}}}return renderedTools}async function exportSessionToHtml(sm,state2,options){let opts=typeof options=="string"?{outputPath:options}:options||{},sessionFile=sm.getSessionFile();if(!sessionFile)throw new Error("Cannot export in-memory session to HTML");if(!existsSync10(sessionFile))throw new Error("Nothing to export yet - start a conversation first");let entries=sm.getEntries(),renderedTools;opts.toolRenderer&&(renderedTools=preRenderCustomTools(entries,opts.toolRenderer),Object.keys(renderedTools).length===0&&(renderedTools=void 0));let sessionData={header:sm.getHeader(),entries,leafId:sm.getLeafId(),systemPrompt:state2?.systemPrompt,tools:state2?.tools?.map(t=>({name:t.name,description:t.description,parameters:t.parameters})),renderedTools},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(!outputPath){let sessionBasename=basename8(sessionFile,".jsonl");outputPath=`${APP_NAME}-session-${sessionBasename}.html`}return writeFileSync7(outputPath,html,"utf8"),outputPath}async function exportFromFile(inputPath,options){let opts=typeof options=="string"?{outputPath:options}:options||{},resolvedInputPath=resolvePath(inputPath);if(!existsSync10(resolvedInputPath))throw new Error(`File not found: ${resolvedInputPath}`);let sm=SessionManager.open(resolvedInputPath),sessionData={header:sm.getHeader(),entries:sm.getEntries(),leafId:sm.getLeafId(),systemPrompt:void 0,tools:void 0},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(!outputPath){let inputBasename=basename8(resolvedInputPath,".jsonl");outputPath=`${APP_NAME}-session-${inputBasename}.html`}return writeFileSync7(outputPath,html,"utf8"),outputPath}var ANSI_COLORS=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];function color256ToHex(index3){if(index3<16)return ANSI_COLORS[index3];if(index3<232){let cubeIndex=index3-16,r=Math.floor(cubeIndex/36),g2=Math.floor(cubeIndex%36/6),b2=cubeIndex%6,toComponent=n=>n===0?0:55+n*40,toHex=n=>toComponent(n).toString(16).padStart(2,"0");return`#${toHex(r)}${toHex(g2)}${toHex(b2)}`}let grayHex=(8+(index3-232)*10).toString(16).padStart(2,"0");return`#${grayHex}${grayHex}${grayHex}`}function escapeHtml(text){return text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function createEmptyStyle(){return{fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1}}function styleToInlineCSS(style){let parts=[];return style.fg&&parts.push(`color:${style.fg}`),style.bg&&parts.push(`background-color:${style.bg}`),style.bold&&parts.push("font-weight:bold"),style.dim&&parts.push("opacity:0.6"),style.italic&&parts.push("font-style:italic"),style.underline&&parts.push("text-decoration:underline"),parts.join(";")}function hasStyle(style){return style.fg!==null||style.bg!==null||style.bold||style.dim||style.italic||style.underline}function applySgrCode(params,style){let i=0;for(;i<params.length;){let code=params[i];if(code===0)style.fg=null,style.bg=null,style.bold=!1,style.dim=!1,style.italic=!1,style.underline=!1;else if(code===1)style.bold=!0;else if(code===2)style.dim=!0;else if(code===3)style.italic=!0;else if(code===4)style.underline=!0;else if(code===22)style.bold=!1,style.dim=!1;else if(code===23)style.italic=!1;else if(code===24)style.underline=!1;else if(code>=30&&code<=37)style.fg=ANSI_COLORS[code-30];else if(code===38){if(params[i+1]===5&&params.length>i+2)style.fg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g2=params[i+3],b2=params[i+4];style.fg=`rgb(${r},${g2},${b2})`,i+=4}}else if(code===39)style.fg=null;else if(code>=40&&code<=47)style.bg=ANSI_COLORS[code-40];else if(code===48){if(params[i+1]===5&&params.length>i+2)style.bg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g2=params[i+3],b2=params[i+4];style.bg=`rgb(${r},${g2},${b2})`,i+=4}}else code===49?style.bg=null:code>=90&&code<=97?style.fg=ANSI_COLORS[code-90+8]:code>=100&&code<=107&&(style.bg=ANSI_COLORS[code-100+8]);i++}}var ANSI_REGEX=/\x1b\[([\d;]*)m/g;function ansiToHtml(text){let style=createEmptyStyle(),result="",lastIndex=0,inSpan=!1;ANSI_REGEX.lastIndex=0;let match2=ANSI_REGEX.exec(text);for(;match2!==null;){let beforeText=text.slice(lastIndex,match2.index);beforeText&&(result+=escapeHtml(beforeText));let paramStr=match2[1],params=paramStr?paramStr.split(";").map(p=>parseInt(p,10)||0):[0];inSpan&&(result+="</span>",inSpan=!1),applySgrCode(params,style),hasStyle(style)&&(result+=`<span style="${styleToInlineCSS(style)}">`,inSpan=!0),lastIndex=match2.index+match2[0].length,match2=ANSI_REGEX.exec(text)}let remainingText=text.slice(lastIndex);return remainingText&&(result+=escapeHtml(remainingText)),inSpan&&(result+="</span>"),result}function ansiLinesToHtml(lines){return lines.map(line=>`<div class="ansi-line">${ansiToHtml(line)||"&nbsp;"}</div>`).join("")}var ANSI_ESCAPE_REGEX=/\x1b\[[\d;]*m/g;function isBlankRenderedLine(line){return line.replace(ANSI_ESCAPE_REGEX,"").trim().length===0}function trimRenderedResultLines(lines){let start=0,end=lines.length;for(;start<end&&isBlankRenderedLine(lines[start]);)start++;for(;end>start&&isBlankRenderedLine(lines[end-1]);)end--;return lines.slice(start,end)}function createToolHtmlRenderer(deps){let{getToolDefinition:getToolDefinition2,theme:theme2,cwd,width=100}=deps,renderedCallComponents=new Map,renderedResultComponents=new Map,renderedStates=new Map,renderedArgs=new Map,getState=toolCallId=>{let state2=renderedStates.get(toolCallId);return state2||(state2={},renderedStates.set(toolCallId,state2)),state2},createRenderContext=(toolCallId,lastComponent,expanded,isPartial,isError)=>({args:renderedArgs.get(toolCallId),toolCallId,invalidate:()=>{},lastComponent,state:getState(toolCallId),cwd,executionStarted:!0,argsComplete:!0,isPartial,expanded,showImages:!1,isError});return{renderCall(toolCallId,toolName,args){try{renderedArgs.set(toolCallId,args);let toolDef=getToolDefinition2(toolName);if(!toolDef?.renderCall)return;let component=toolDef.renderCall(args,theme2,createRenderContext(toolCallId,renderedCallComponents.get(toolCallId),!1,!0,!1));renderedCallComponents.set(toolCallId,component);let lines=component.render(width);return ansiLinesToHtml(lines)}catch{return}},renderResult(toolCallId,toolName,result,details,isError){try{let toolDef=getToolDefinition2(toolName);if(!toolDef?.renderResult)return;let agentToolResult={content:result,details,isError},collapsedComponent=toolDef.renderResult(agentToolResult,{expanded:!1,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!1,!1,isError));renderedResultComponents.set(toolCallId,collapsedComponent);let collapsed=ansiLinesToHtml(trimRenderedResultLines(collapsedComponent.render(width))),expandedComponent=toolDef.renderResult(agentToolResult,{expanded:!0,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!0,!1,isError));renderedResultComponents.set(toolCallId,expandedComponent);let expanded=ansiLinesToHtml(trimRenderedResultLines(expandedComponent.render(width)));return{...collapsed&&collapsed!==expanded?{collapsed}:{},expanded}}catch{return}}}}import{existsSync as existsSync11,mkdirSync as mkdirSync9,writeFileSync as writeFileSync8}from"node:fs";import{dirname as dirname18}from"node:path";function serializeSessionBranch(sessionManager,header,createTrailingEntries){let lines=[JSON.stringify(header)],parentId=null;for(let entry of sessionManager.getBranch())lines.push(JSON.stringify({...entry,parentId})),parentId=entry.id;for(let entry of createTrailingEntries?.(parentId,header.timestamp)??[])lines.push(JSON.stringify(entry));return`${lines.join(`
987
987
  `)}
988
988
  `}function createSessionJsonlArtifact(sessionManager){let header=sessionManager.getHeader();if(!header)throw new Error("Cannot export a session without a session header");return{version:1,format:"jsonl",mediaType:"application/x-ndjson",fileName:`session-${header.id}.jsonl`,bytes:new TextEncoder().encode(serializeSessionBranch(sessionManager,{...header}))}}function exportSessionToJsonl(sessionManager,outputPath,createTrailingEntries){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname18(filePath);existsSync11(dir)||mkdirSync9(dir,{recursive:!0});let timestamp=new Date().toISOString(),header={type:"session",version:CURRENT_SESSION_VERSION,id:sessionManager.getSessionId(),timestamp,cwd:sessionManager.getCwd()};return writeFileSync8(filePath,serializeSessionBranch(sessionManager,header,createTrailingEntries)),filePath}function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage){totals.input+=usage.input,totals.output+=usage.output,totals.cacheRead+=usage.cacheRead,totals.cacheWrite+=usage.cacheWrite,totals.cost+=usage.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&(key="Tools/summaries",usage=entry.usage),!key||!usage)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite,totals})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b2)=>b2.cost-a.cost)}function getUserMessagesForForking(session){let entries=session.sessionManager.getEntries(),result=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text=contentText(entry.message.content,"");text&&result.push({entryId:entry.id,text})}return result}function getSessionStats(session){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of session.sessionManager.getEntries()){if((entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c2=>c2.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:session.sessionFile,sessionId:session.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:session.getContextUsage()}}function getContextUsage(session){let model=session.model;if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let branchEntries=session.sessionManager.getBranch(),latestCompaction=getLatestCompactionEntry(branchEntries);if(latestCompaction){let compactionIndex=branchEntries.lastIndexOf(latestCompaction),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage)return{tokens:null,contextWindow,percent:null}}let estimate=estimateContextTokens2(session.messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async function exportToHtml(session,outputPath,options={}){let themeName=[options.themeName,session.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>session.getToolDefinition(name),theme,cwd:session.sessionManager.getCwd()});return await exportSessionToHtml(session.sessionManager,session.agent.state,{outputPath,themeName,toolRenderer})}function exportToJsonl(session,outputPath){return exportSessionToJsonl(session.sessionManager,outputPath)}function getLastAssistantText(session){let lastAssistant=session.messages.slice().reverse().find(m2=>{if(m2.role!=="assistant")return!1;let msg=m2;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text="";for(let content of lastAssistant.content)content.type==="text"&&(text+=content.text);return text.trim()||void 0}function sleep3(ms,signal){return new Promise((resolve25,reject2)=>{if(signal?.aborted){reject2(new Error("Aborted"));return}let timeout=setTimeout(resolve25,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject2(new Error("Aborted"))})})}async function willRetryAfterAgentEnd(session,event,signal){if(signal?.aborted)return session._pendingRetryDecision=void 0,!1;let settings2=session.settingsManager.getRetrySettings();if(session._retryAttempt>=settings2.maxRetries)return session._pendingRetryDecision=void 0,!1;for(let i=event.messages.length-1;i>=0;i--){let message=event.messages[i];if(message.role==="assistant"){let assistantMessage=message;try{let decision=await decideRetry(session,assistantMessage,void 0,signal);return session._pendingRetryDecision={message:assistantMessage,decision},decision.retry}catch(error2){if(signal?.aborted)return session._pendingRetryDecision=void 0,!1;throw error2}}}return session._pendingRetryDecision=void 0,!1}async function isRetryableError(session,message,execution,signal){if((await decideOverflow(session,message,execution,signal)).contextOverflow)return!1;let runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return runtime.classifyRetry(session._retryPolicyName,{message,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution:execution??executionFacts(session,"retry")})}async function decideRetry(session,message,execution,signal){let settings2=session.settingsManager.getRetrySettings(),runtime=session._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");return runtime.decideRetry(session._retryPolicyName,{retryable:await session._isRetryableError(message,execution,signal),enabled:settings2.enabled,attempt:session._retryAttempt+1,maxAttempts:settings2.maxRetries,baseDelayMs:settings2.baseDelayMs,errorMessage:message.errorMessage,signal,context:{version:1,sessionId:session.sessionId,phase:"retry"},execution:execution??executionFacts(session,"retry")})}async function prepareRetry(session,message,precomputedDecision){let settings2=session.settingsManager.getRetrySettings(),decision=precomputedDecision??await decideRetry(session,message);if(!decision.retry)return!1;session._retryAttempt++;let baseDelayMs=Math.min(decision.delayMs??retryDelayMs(settings2,session._retryAttempt),settings2.maxAgentDelayMs),delayMs=Math.round(baseDelayMs*(.9+Math.random()*.2));session._retryAbortController=new AbortController,session._emit({type:"auto_retry_start",attempt:session._retryAttempt,maxAttempts:settings2.maxRetries,delayMs,errorMessage:message.errorMessage||"Unknown error"}),await dispatchAutoRetryLifecycle(session,{attempt:session._retryAttempt,maxAttempts:settings2.maxRetries,delayMs,errorMessage:message.errorMessage||"Unknown error"});let messages=session.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&await session._applyContextTransition(messages.slice(0,-1),"retry");try{await sleep3(delayMs,session._retryAbortController.signal)}catch{let attempt2=session._retryAttempt;return session._retryAttempt=0,session._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),!1}finally{session._retryAbortController=void 0}return!0}function buildSystemPrompt(options){let{customPrompt,orientationPrompt,preferenceCard,selectedTools,toolSnippets,promptGuidelines,appendSystemPrompt,cwd,contextFiles:providedContextFiles,skills:providedSkills}=options,promptCwd=cwd.replace(/\\/g,"/"),appendSection=appendSystemPrompt?`
@@ -1047,7 +1047,7 @@ Current working directory: ${promptCwd}`,prompt}function normalizePromptSnippet(
1047
1047
  `):void 0,loadedSkills=session._getAvailableSkills(),loadedContextFiles=session._resourceLoader.getAgentsFiles().agentsFiles;return session._baseSystemPromptOptions={cwd:session._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,customPrompt:loaderSystemPrompt,orientationPrompt:session._orientationPrompt,preferenceCard:session._preferenceCard,appendSystemPrompt,selectedTools:validToolNames,toolSnippets,promptGuidelines},buildSystemPrompt(session._baseSystemPromptOptions)}function refreshToolRegistry(session,options){let previousRegistryNames=new Set(session._toolRegistry.keys()),previousActiveToolNames=session.getActiveToolNames(),allowedToolNames=session._allowedToolNames,excludedToolNames=session._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),allCustomTools=session._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})})).filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(session._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:session._baseToolSources.get(name)??createSyntheticSourceInfo(`<bootstrap:${name}>`,{source:"agent-forge.bootstrap-tools"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});session._toolDefinitions=definitionRegistry,session._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),session._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let executeContext=()=>({cwd:session.sessionManager.getCwd(),model:session.model,sessionManager:session.sessionManager,thinkingLevel:session.thinkingLevel}),wrapWithDynamicToolTracking=({definition})=>{let tool=wrapToolDefinition(definition,executeContext),execute=tool.execute;return{...tool,execute:async(toolCallId,params,signal,onUpdate)=>{let activeBefore=session.getActiveToolNames(),result=await execute(toolCallId,params,signal,onUpdate),activeAfter=session.getActiveToolNames();if(!activeBefore.every(name=>activeAfter.includes(name)))return result;let beforeNames=new Set(activeBefore),addedToolNames=activeAfter.filter(name=>!beforeNames.has(name));return addedToolNames.length===0?result:{...result,addedToolNames:[...new Set([...result.addedToolNames??[],...addedToolNames])]}}}},wrappedExtensionTools=allCustomTools.map(wrapWithDynamicToolTracking),wrappedBuiltInTools=Array.from(session._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>wrapWithDynamicToolTracking({definition})),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);session._toolRegistry=toolRegistry;let nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...previousActiveToolNames]).filter(name=>isAllowedTool(name));if(allowedToolNames)for(let toolName of session._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of session._toolRegistry.keys())previousRegistryNames.has(toolName)||session._deferredToolPluginIds.has(session._baseToolSources.get(toolName)?.source??"")||nextActiveToolNames.push(toolName);session.setActiveToolsByName([...new Set(nextActiveToolNames)])}function syncCapabilityTools(session){let tools=session._capabilityRuntime?.listTools()??[];session._baseToolDefinitions=new Map(tools.map(({name,definition})=>[name,definition])),session._baseToolSources=new Map(tools.map(({name,source})=>[name,createSyntheticSourceInfo(`<plugin:${source}:${name}>`,{source})]))}function getCapabilitySkills(session){let runtime=session._capabilityRuntime;if(!runtime)return[];let contributed;try{contributed=runtime.listContributions(SKILL_CONTRIBUTION_POINT_ID,SKILL_CONTRIBUTION_POINT_VERSION)}catch(error2){if(!(error2 instanceof Error)||!error2.message.startsWith("Contribution point is not defined"))throw error2;return[]}let contributedSkills=contributed.filter(entry=>entry.value!==null&&typeof entry.value=="object"&&"name"in entry.value).map(entry=>({...entry.value,disableModelInvocation:entry.value.disableModelInvocation===!0,sourceInfo:createSyntheticSourceInfo(`<contribution:${entry.owner}:${entry.id}>`,{source:entry.owner,baseDir:entry.value.baseDir})})),contributedNames=new Set(contributedSkills.map(skill=>skill.name)),legacyFilter=session._capabilitySkillsFilter,legacy=runtime.listSkills().filter(({definition})=>!contributedNames.has(definition.name)).map(({definition,source})=>({...definition,disableModelInvocation:definition.disableModelInvocation===!0,sourceInfo:createSyntheticSourceInfo(`<plugin:${source}:${definition.name}>`,{source,baseDir:definition.baseDir})})).filter(skill=>legacyFilter?legacyFilter([skill]).length>0:!0);return[...contributedSkills,...legacy].sort((left,right)=>left.name.localeCompare(right.name)||left.sourceInfo.path.localeCompare(right.sourceInfo.path))}function validateCapabilitySkillConflicts(session){let resourceNames=new Set,resourceFilePaths=new Set;for(let skill of session._resourceLoader.getSkills().skills){if(resourceNames.has(skill.name))throw new Error(`Skill is duplicated in resources: ${skill.name}`);resourceNames.add(skill.name),resourceFilePaths.add(skill.filePath)}for(let skill of session._getCapabilitySkills())if(!(typeof skill.filePath=="string"&&resourceFilePaths.has(skill.filePath))&&resourceNames.has(skill.name))throw new Error(`Skill conflicts with a resource skill: ${skill.name}`)}async function refreshBootstrapSkills(session){let runtime=session._capabilityRuntime;runtime&&(session._validateCapabilitySkillConflicts(),session._bootstrapSkillsHandle?await refreshSessionBootstrapSkills(runtime,session._resourceLoader.getSkills().skills):session._bootstrapSkillsHandle=installSessionBootstrapSkills(runtime,session._resourceLoader.getSkills().skills),session._baseSystemPrompt=session._rebuildSystemPrompt(session.getActiveToolNames()),session.agent.state.systemPrompt=session._baseSystemPrompt)}import{existsSync as existsSync12,readdirSync as readdirSync10,readFileSync as readFileSync10,statSync as statSync10}from"fs";import{basename as basename9,dirname as dirname19,join as join37,resolve as resolve10,sep as sep7}from"path";function parseCommandArgs(argsString){let args=[],current="",inQuote=null;for(let i=0;i<argsString.length;i++){let char=argsString[i];inQuote?char===inQuote?inQuote=null:current+=char:char==='"'||char==="'"?inQuote=char:/\s/.test(char)?current&&(args.push(current),current=""):current+=char}return current&&args.push(current),args}function substituteArgs(content,args){let allArgs=args.join(" ");return content.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(_match,defaultTarget,defaultValue,sliceStart,sliceLength,simple)=>{if(defaultTarget){let value=defaultTarget==="@"||defaultTarget==="ARGUMENTS"?allArgs:args[parseInt(defaultTarget,10)-1];return value||defaultValue}if(sliceStart){let start=parseInt(sliceStart,10)-1;if(start<0&&(start=0),sliceLength){let length=parseInt(sliceLength,10);return args.slice(start,start+length).join(" ")}return args.slice(start).join(" ")}if(simple==="ARGUMENTS"||simple==="@")return allArgs;let index3=parseInt(simple,10)-1;return args[index3]??""})}function loadTemplateFromFile(filePath,sourceInfo){try{let rawContent=readFileSync10(filePath,"utf-8"),{frontmatter,body}=parseFrontmatter(rawContent),name=basename9(filePath).replace(/\.md$/,""),description=frontmatter.description||"";if(!description){let firstLine=body.split(`
1048
1048
  `).find(line=>line.trim());firstLine&&(description=firstLine.slice(0,60),firstLine.length>60&&(description+="..."))}return{name,description,...frontmatter["argument-hint"]&&{argumentHint:frontmatter["argument-hint"]},content:body,sourceInfo,filePath}}catch{return null}}function loadTemplatesFromDir(dir,getSourceInfo){let templates=[];if(!existsSync12(dir))return templates;try{let entries=readdirSync10(dir,{withFileTypes:!0});for(let entry of entries){let fullPath=join37(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync10(fullPath).isFile()}catch{continue}if(isFile&&entry.name.endsWith(".md")){let template=loadTemplateFromFile(fullPath,getSourceInfo(fullPath));template&&templates.push(template)}}}catch{return templates}return templates}function loadPromptTemplates(options){let resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(options.agentDir),promptPaths=options.promptPaths,includeDefaults=options.includeDefaults,templates=[],globalPromptsDir=join37(resolvedAgentDir,"prompts"),projectPromptsDir=resolve10(resolvedCwd,CONFIG_DIR_NAME,"prompts"),isUnderPath=(target,root)=>{let normalizedRoot=resolve10(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep7)?normalizedRoot:`${normalizedRoot}${sep7}`;return target.startsWith(prefix)},getSourceInfo=resolvedPath=>isUnderPath(resolvedPath,globalPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"user",baseDir:globalPromptsDir}):isUnderPath(resolvedPath,projectPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"project",baseDir:projectPromptsDir}):createSyntheticSourceInfo(resolvedPath,{source:"local",baseDir:statSync10(resolvedPath).isDirectory()?resolvedPath:dirname19(resolvedPath)});includeDefaults&&(templates.push(...loadTemplatesFromDir(globalPromptsDir,getSourceInfo)),templates.push(...loadTemplatesFromDir(projectPromptsDir,getSourceInfo)));for(let rawPath of promptPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(existsSync12(resolvedPath))try{let stats=statSync10(resolvedPath);if(stats.isDirectory())templates.push(...loadTemplatesFromDir(resolvedPath,getSourceInfo));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let template=loadTemplateFromFile(resolvedPath,getSourceInfo(resolvedPath));template&&templates.push(template)}}catch{}}return templates}function expandPromptTemplate(text,templates){if(!text.startsWith("/"))return text;let match2=text.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!match2)return text;let templateName=match2[1],argsString=match2[2]??"",template=templates.find(t=>t.name===templateName);if(template){let args=parseCommandArgs(argsString);return substituteArgs(template.content,args)}return text}var toolSearchParameters=typebox_exports.Object({query:typebox_exports.String({description:"Search text matched against tool names and descriptions."}),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of matches to activate. Defaults to 5.",minimum:1,maximum:20}))});function scoreTool(name,description,terms){let lowerName=name.toLowerCase(),lowerDescription=description.toLowerCase(),score=0;for(let term of terms)lowerName===term?score+=8:lowerName.startsWith(term)?score+=4:lowerName.includes(term)&&(score+=2),lowerDescription.includes(term)&&(score+=1);return score>0?score:void 0}function createToolSearchTool(deps){return{name:"tool_search",label:"Tool search",description:"Search for available tools by name or description and activate the matches so they can be called. Use this when a capability you need is not in the current tool list.",promptSnippet:"Search and activate deferred tools (used when a needed capability is not currently available)",parameters:toolSearchParameters,execute:async(_toolCallId,params)=>{let query=params.query.trim();if(query.length===0)return{content:[{type:"text",text:"Provide a non-empty query."}],details:{activated:[]}};let terms=query.toLowerCase().split(/\s+/).filter(term=>term.length>0),activeNames=new Set(deps.getActiveToolNames()),matches=[];for(let name of deps.listAllToolNames()){let info=deps.getToolInfo(name);if(!info||activeNames.has(name))continue;let score=scoreTool(name,info.description,terms);score!==void 0&&matches.push({name,score})}matches.sort((left,right)=>right.score-left.score||left.name.localeCompare(right.name));let limit=params.limit??5,activated=matches.slice(0,limit).map(match2=>match2.name);if(activated.length===0)return{content:[{type:"text",text:`No inactive tools match "${query}".`}],details:{activated:[]}};deps.setActiveToolsByName([...deps.getActiveToolNames(),...activated]);let lines=activated.map(name=>{let info=deps.getToolInfo(name);return`- ${name}: ${info?.description??""}`});return{content:[{type:"text",text:`Activated ${activated.length} tool(s). They are now available for tool calls:
1049
1049
  ${lines.join(`
1050
- `)}`}],details:{activated}}}}}function parseSkillBlock(text){let match2=text.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);return match2?{name:match2[1],location:match2[2],content:match2[3],userMessage:match2[4]?.trim()||void 0}:null}var SUITE_MISMATCH_SESSION_ENTRY_TYPE="suite_mismatch",AgentSession=class{agent;sessionManager;settingsManager;_scopedModels;_unsubscribeAgent;_eventListeners=[];_isAgentRunActive=!1;_idleWaitPromise;_resolveIdleWait;_steeringMessages=[];_followUpMessages=[];_pendingNextTurnMessages=[];_pendingCustomMessages=[];_compactionQueue=Promise.resolve();_compactionAbortController=void 0;_autoCompactionAbortController=void 0;_overflowRecoveryAttempted=!1;_branchSummaryAbortController=void 0;_branchSummaryPromise=void 0;_resolveBranchSummaryPromise=void 0;_retryAbortController=void 0;_policyDecisionAbortController=void 0;_retryAttempt=0;_commandAbortController=void 0;_agentTaskScopeAbortController=new AbortController;_activeCapabilityCommand;_activeCompactionPromise;_reloadInProgress=!1;_reloadGeneration=0;_contextEpoch=0;_contextTransitionAbortController=new AbortController;_activeContextTransition;_contextRevision=0;_contextCommitQueue=Promise.resolve();_bashAbortControllers=new Set;_activeBashPromises=new Set;_bashEpoch=0;_pendingBashMessages=[];_turnIndex=0;_resourceLoader;_customTools;_deferredToolPluginIds;_pendingAbortReason;_currentRunAborted=!1;_lastAbortReason;_baseToolDefinitions=new Map;_baseToolSources=new Map;_capabilityRuntime;_outputArtifactCommitListeners=new Set;_dispatchOutputArtifactCommit=artifact=>{for(let listener of[...this._outputArtifactCommitListeners])listener(artifact)};_bootstrapToolsHandle;_bootstrapSkillsHandle;_bootstrapRetryHandle;_bootstrapCompactionHandle;_bootstrapBranchSummaryHandle;_bootstrapOverflowHandle;_bootstrapAgentLoopHandle;_bootstrapLifecycleHandle;_capabilityPlugins=new Map;_inlineCapabilityPlugins=new Map;_isDisposingCapabilityPlugins=!1;_suspendToolRegistryHookRefresh=!1;_toolRegistryHookReady=!1;_disposePromise;_cwd;_initialActiveToolNames;_allowedToolNames;_excludedToolNames;_baseToolsOverride;_disabledBootstrapPlugins;_sessionStartEvent;_capabilityMode;_contextStrategyName;_retryPolicyName;_compactionPolicyName;_branchSummaryPolicyName;_overflowPolicyName;_runLoopStrategyName;_loopExecutor;_initialPrepareNextTurn;_agentTaskAdapter;_agentTaskResults;_agentSessionReader;_agentSessionLister;_agentComposition;_interactionHost;_modelRuntime;_modelStreamCounter=0;_modelStreamState;_turnCorrelationId;_turnCorrelationCounter=0;_toolRegistry=new Map;_toolDefinitions=new Map;_toolPromptSnippets=new Map;_toolPromptGuidelines=new Map;_baseSystemPrompt="";_baseSystemPromptOptions;_systemPromptOverride;_orientationPrompt;_preferenceCard;_capabilitySkillsFilter;_hostLogger;_logRecordMirrorRef;_observabilityGetMetricsRef;_agentDir;_communication;_turnContext;_roleAssociations;_memoryStorage;_traceService;constructor(config){this.agent=config.agent,this.sessionManager=config.sessionManager,this._contextRevision=this.sessionManager.getRevision().sequence,this.settingsManager=config.settingsManager,this._scopedModels=config.scopedModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._deferredToolPluginIds=new Set(config.deferredToolPluginIds??[]),this._deferredToolPluginIds.size>0&&this._customTools.push(createToolSearchTool({listAllToolNames:()=>Array.from(this._toolRegistry.keys()),getToolInfo:name=>{let definition=this._toolDefinitions.get(name)?.definition;return definition?{name:definition.name,description:definition.description}:void 0},getActiveToolNames:()=>this.getActiveToolNames(),setActiveToolsByName:toolNames=>this.setActiveToolsByName(toolNames)})),this._cwd=config.cwd,this._modelRuntime=config.modelRuntime,this._initialActiveToolNames=config.initialActiveToolNames,this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._disabledBootstrapPlugins=config.disabledBootstrapPlugins,this._sessionStartEvent=config.sessionStartEvent??{reason:"startup"},this._capabilityMode=config.capabilityMode??"full-control",this._contextStrategyName=config.contextStrategyName,this._retryPolicyName=config.retryPolicyName??DEFAULT_RETRY_POLICY_NAME,this._compactionPolicyName=config.compactionPolicyName??DEFAULT_COMPACTION_POLICY_NAME,this._branchSummaryPolicyName=config.branchSummaryPolicyName??DEFAULT_BRANCH_SUMMARY_POLICY_NAME,this._overflowPolicyName=config.overflowPolicyName??DEFAULT_OVERFLOW_POLICY_NAME,this._runLoopStrategyName=config.runLoopStrategyName??DEFAULT_RUN_LOOP_STRATEGY_NAME,this._agentTaskAdapter=config.agentTaskAdapter,this._agentTaskResults=config.agentTaskResults,this._agentSessionReader=config.agentSessionReader,this._agentSessionLister=config.agentSessionLister,this._agentComposition=config.agentComposition,this._interactionHost=config.interactionHost,this._orientationPrompt=config.orientationPrompt,this._preferenceCard=config.preferenceCard,this._capabilitySkillsFilter=config.capabilitySkillsFilter,this._hostLogger=config.hostLogger,this._logRecordMirrorRef=config.logRecordMirrorRef,this._observabilityGetMetricsRef=config.observabilityGetMetricsRef,this._agentDir=config.agentDir,this._communication=config.communication,this._turnContext=config.turnContext,this._roleAssociations=config.roleAssociations,this._memoryStorage=config.memoryStorage,this._traceService=config.traceService,this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._wireDefaultLoop()}getTurnCorrelationId(){return this._turnCorrelationId}dispatchAgentTaskSettled(facts){dispatchAgentTaskSettledLifecycle(this._internal,facts)}get modelRuntime(){return this._modelRuntime}get _internal(){return this}_wireDefaultLoop(){wireDefaultLoop(this._internal)}_createLoopWiring(){return createLoopWiring(this._internal)}_compactBeforeNextAssistantResponse(context,signal){return compactBeforeNextAssistantResponse(this._internal,context,signal)}_emit(event){for(let l3 of this._eventListeners)l3(event)}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages]})}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve25=>{this._resolveIdleWait=resolve25})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(!this.isIdle||!this._resolveIdleWait)return;let resolve25=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve25()}async _emitAgentSettled(){this._isAgentRunActive=!1;try{this._emit({type:"agent_settled"}),await dispatchAgentSettledLifecycle(this._internal)}finally{this._resolveIdleWaitIfIdle()}}_lastAssistantMessage=void 0;_pendingRetryDecision=void 0;_handleAgentEvent=async event=>{if(event.type==="message_start"&&event.message.role==="assistant"&&(this._modelStreamState={streamId:`model-stream:${++this._modelStreamCounter}`,sequence:0},await this._dispatchModelStreamLifecycle(event.message,"start","raw")),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1;let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._emitQueueUpdate())}}}if(await this._emitLifecycleEvents(event),event.type==="message_update"&&event.message.role==="assistant"&&await this._dispatchModelStreamLifecycle(event.message,event.assistantMessageEvent.type,"candidate"),this._emit(event.type==="agent_end"?{...event,willRetry:await this._willRetryAfterAgentEnd(event,this._policyDecisionAbortController?.signal)}:event),event.type==="message_end"){if(event.message.role==="custom")this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details);else if(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult"){let entryId=this.sessionManager.appendMessage(event.message);event.message.role==="assistant"?(event.message.stopReason==="aborted"&&(this._currentRunAborted=!0),await this._dispatchModelStreamLifecycle(event.message,event.message.stopReason==="error"||event.message.stopReason==="aborted"?"error":"done","committed"),this._modelStreamState=void 0,await this._dispatchModelResponseLifecycle(event.message,entryId)):event.message.role==="toolResult"&&(await this._dispatchToolCommitLifecycle(event.message,entryId),await this._dispatchToolResultLifecycle(event.message,entryId))}if(event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message;assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),assistantMsg.stopReason!=="error"&&this._retryAttempt>0&&(this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0)}}event.type==="turn_end"&&this._flushPendingCustomMessages()};async _dispatchModelStreamLifecycle(message,eventName,phase){await dispatchModelStreamLifecycle(this._internal,message,eventName,phase)}_willRetryAfterAgentEnd(event,signal){return willRetryAfterAgentEnd(this._internal,event,signal)}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}async _emitLifecycleEvents(event){if(event.type==="agent_start")this._turnIndex=0,await dispatchAgentStartLifecycle(this._internal);else if(event.type==="agent_end")await dispatchAgentEndLifecycle(this._internal);else if(event.type==="turn_start")await dispatchTurnStartLifecycle(this._internal,this._turnIndex);else if(event.type==="turn_end"){this._turnIndex++;let turnMessage=event.message,outcome=turnMessage.role==="assistant"&&(turnMessage.stopReason==="aborted"||turnMessage.stopReason==="error")?turnMessage.stopReason:void 0;await dispatchTurnEndLifecycle(this._internal,this._turnIndex,this.agent.state.messages.length,outcome)}else event.type==="message_start"?await dispatchMessageStartLifecycle(this._internal,event.message.role):event.type==="message_end"?await dispatchMessageEndLifecycle(this._internal,event.message.role):event.type==="tool_execution_start"&&await dispatchToolExecutionStartLifecycle(this._internal,event.toolCallId,event.toolName)}subscribe(listener){return this._eventListeners.push(listener),()=>{let index3=this._eventListeners.indexOf(listener);index3!==-1&&this._eventListeners.splice(index3,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}dispose(){return this._disposePromise?this._disposePromise:(this._disposePromise=(async()=>{let errors=[];this._beginContextTransitionFence(),this._bashEpoch+=1;for(let abort of[()=>this._abortActiveCapabilityCommand("session disposed"),()=>this.abortRetry(),()=>this.abortCompaction(),()=>this.abortBranchSummary(),()=>this.abortBash(),()=>this._agentTaskScopeAbortController.abort("session disposed"),()=>this.agent.abort()])try{await abort()}catch(error2){errors.push(error2)}await Promise.allSettled([this._activeContextTransition,...this._activeBashPromises,this.waitForIdle()].filter(operation=>operation!==void 0)),this._disconnectFromAgent(),this._eventListeners=[],await dispatchSessionEndLifecycle(this._internal);let disposals=[()=>this._disposeCapabilityPlugins(),()=>this._capabilityRuntime?.disposeAll(),()=>this._agentTaskAdapter?.dispose?.(),()=>this._interactionHost?.dispose?.(),()=>this._bootstrapToolsHandle?.dispose(),()=>this._bootstrapSkillsHandle?.dispose(),()=>this._bootstrapRetryHandle?.dispose(),()=>this._bootstrapCompactionHandle?.dispose(),()=>this._bootstrapOverflowHandle?.dispose(),()=>this._bootstrapBranchSummaryHandle?.dispose(),()=>this._bootstrapAgentLoopHandle?.dispose(),()=>this._bootstrapLifecycleHandle?.dispose()];for(let dispose of disposals)try{await dispose()}catch(error2){errors.push(error2)}if(this._capabilityRuntime?.revokeAllAPIs(),this._capabilityPlugins.clear(),this._inlineCapabilityPlugins.clear(),this._bootstrapToolsHandle=void 0,this._bootstrapSkillsHandle=void 0,this._bootstrapRetryHandle=void 0,this._bootstrapCompactionHandle=void 0,this._bootstrapOverflowHandle=void 0,this._bootstrapBranchSummaryHandle=void 0,this._bootstrapAgentLoopHandle=void 0,this._bootstrapLifecycleHandle=void 0,cleanupSessionResources(this.sessionId),errors.length===1)throw errors[0];if(errors.length>1)throw new AggregateError(errors,`Agent session disposal failed: ${this.sessionId}`)})(),this._disposePromise)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive&&!this.isCompacting}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCapabilityRuntime(){if(!this._capabilityRuntime)throw new Error("Capability runtime is not available");return this._capabilityRuntime}onOutputArtifactCommit(listener){return this._outputArtifactCommitListeners.add(listener),()=>{this._outputArtifactCommitListeners.delete(listener)}}get isDisposed(){return this._disposePromise!==void 0}getSessionAPI(){return{getSessionId:()=>this.sessionManager.getSessionId(),getRevision:()=>this.sessionManager.getRevision(),registerEntryProjection:projection=>this.sessionManager.registerEntryProjection(projection),getContextSnapshot:()=>({version:1,revision:this._contextRevision,value:detachedSessionSnapshot(this.agent.state.messages)}),commitContext:async request=>{let commit=this._contextCommitQueue.then(async()=>{if(request.signal?.aborted)throw new Error("Context commit cancelled");let currentRevision=this._contextRevision;if(request.operationId.trim()==="")throw new Error("Context commit operationId is required");if(request.expectedRevision!==currentRevision)throw new Error(`Context revision conflict: expected ${request.expectedRevision}, current ${currentRevision}`);if(!Array.isArray(request.value))throw new Error("Session context commit requires a message array");if(await this.replaceContext(request.value),request.signal?.aborted)throw new Error("Context commit cancelled");return{version:1,status:"committed",revision:this._contextRevision,value:detachedSessionSnapshot(this.agent.state.messages)}});return this._contextCommitQueue=commit.then(()=>{},()=>{}),commit},getMessages:()=>detachedSessionSnapshot(this.agent.state.messages),isIdle:()=>this.isIdle,prompt:text=>this.prompt(text),steer:text=>this.steer(text),queueFollowUp:text=>this.sendUserMessage(text,{deliverAs:"followUp"}),abort:()=>this.abort(),waitForIdle:()=>this.waitForIdle(),getActiveTools:()=>this.getActiveToolNames(),...this._capabilityMode==="readonly"?{}:{setActiveTools:toolNames=>this.setActiveToolsByName(toolNames)},compact:customInstructions=>this.compact(customInstructions),navigateTree:(targetId,options)=>this.navigateTree(targetId,options),appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data===void 0?void 0:detachedSessionSnapshot(data)),entry=this.sessionManager.getEntry(entryId);return entry&&(this._emit({type:"entry_appended",entry}),dispatchSessionEntryAppendedLifecycle(this._internal,entryId,entry.type)),entryId},setSessionName:name=>this.setSessionName(name),getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label)=>this.sessionManager.appendLabelChange(entryId,label),getLabel:entryId=>this.sessionManager.getLabel(entryId),getAllTools:()=>definitionSnapshot(this.getAllTools()),getCommands:()=>collectCommandInfos(this._internal),getModel:()=>this.model?detachedSnapshot(modelFactsView(this.model)):void 0,getScopedModels:()=>detachedSnapshot(this.scopedModels.map(entry=>({model:modelFactsView(entry.model),...entry.thinkingLevel===void 0?{}:{thinkingLevel:entry.thinkingLevel}}))),getThinkingLevel:()=>this.thinkingLevel,...this._capabilityMode==="readonly"?{}:{setThinkingLevel:level=>this.setThinkingLevel(level)},...this._capabilityMode==="readonly"?{}:{setModel:async modelId=>{let scoped=this.scopedModels.find(entry=>entry.model.id===modelId);return!scoped||!this._modelRuntime.hasConfiguredAuth(scoped.model.provider)?!1:(await this.setModel(scoped.model),!0)}},getSystemPrompt:()=>this.systemPrompt,getSystemPromptOptions:()=>detachedSnapshot(this._baseSystemPromptOptions),getContextUsage:()=>getContextUsage(this._internal),sendMessage:(message,options)=>this.sendCustomMessage(message,options),getBranchEntries:()=>detachedSessionSnapshot(this.sessionManager.getBranch().map(entry=>({id:entry.id,parentId:entry.parentId,timestamp:entry.timestamp,type:entry.type,...entry.type==="message"?{message:{role:entry.message.role,..."content"in entry.message?{content:entry.message.content}:{}}}:{},...entry.type==="custom"?{customType:entry.customType,data:entry.data}:{}}))),exportArtifact:request=>{if(request.format!=="jsonl")throw new Error(`Unsupported session export format: ${request.format}`);return createSessionJsonlArtifact(this.sessionManager)}}}getCapabilityPlugins(){let handles=Array.from(this._capabilityPlugins.values());for(let handle of[this._bootstrapToolsHandle,this._bootstrapSkillsHandle,this._bootstrapRetryHandle,this._bootstrapCompactionHandle,this._bootstrapOverflowHandle,this._bootstrapBranchSummaryHandle,this._bootstrapLifecycleHandle])handle&&handles.push(handle);return handles}get contextStrategyName(){return this._contextStrategyName}_requireContextStrategy(){return requireContextStrategy(this._internal)}_requireIdleContextOperation(operation){requireIdleContextOperation(this._internal,operation)}_beginContextTransitionFence(){beginContextTransitionFence(this._internal)}_isContextTransitionCurrent(epoch,allowReload){return isContextTransitionCurrent(this._internal,epoch,allowReload)}_assertContextTransitionCurrent(epoch,allowReload){assertContextTransitionCurrent(this._internal,epoch,allowReload)}_enqueueContextTransition(operation,options){return enqueueContextTransition(this._internal,operation,options)}_copyContextMessages(value,strategyName,direction){return copyContextMessages(value,strategyName,direction)}async _applyContextTransition(messages,reason="session_replace",signal,options){return applyContextTransition(this._internal,messages,reason,signal,options)}async _dispatchContextReplacedLifecycle(reason,strategyName){await dispatchContextReplacedLifecycle(this._internal,reason,strategyName)}async _dispatchModelResponseLifecycle(message,entryId){await dispatchModelResponseLifecycle(this._internal,message,entryId)}async _dispatchToolCommitLifecycle(message,entryId){await dispatchToolCommitLifecycle(this._internal,message,entryId)}async _dispatchToolResultLifecycle(message,entryId){await dispatchToolResultLifecycle(this._internal,message,entryId)}async _dispatchSessionReloadLifecycle(generation){await dispatchSessionReloadLifecycle(this._internal,generation)}async snapshotContext(){return snapshotContext(this._internal)}async restoreContext(snapshot2){return restoreContext(this._internal,snapshot2)}async replaceContext(context){return replaceContext(this._internal,context)}_restoreContextTransition(snapshot2,reason,options){return restoreContextTransition(this._internal,snapshot2,reason,options)}async _trackCapabilityPlugin(key,loaded,previousToolNames){try{this._validateCapabilitySkillConflicts()}catch(error2){throw await loaded.dispose(),error2}let disposed=!1,handle={manifest:loaded.manifest,api:loaded.api,ready:loaded.ready,dispose:async()=>{if(!disposed){disposed=!0,this._suspendToolRegistryHookRefresh=!0;try{await loaded.dispose()}finally{this._suspendToolRegistryHookRefresh=!1}this._capabilityPlugins.delete(key),this._inlineCapabilityPlugins.delete(key),this._isDisposingCapabilityPlugins||(this._syncCapabilityTools(),this._refreshToolRegistry({activeToolNames:this.getActiveToolNames()}))}}};this._capabilityPlugins.set(key,handle),this._syncCapabilityTools();let newToolNames=this._capabilityRuntime.listTools().filter(tool=>this._capabilityMode!=="readonly"||!tool.source.startsWith("agent-forge.builtin.")&&!tool.source.startsWith("agent-forge.plugin.")||tool.readonlySafe===!0).map(tool=>tool.name).filter(name=>!previousToolNames.has(name));return this._refreshToolRegistry({activeToolNames:[...this.getActiveToolNames(),...newToolNames]}),handle}async loadCapabilityPluginManifest(manifestPath,options){let runtime=this._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let resolvedManifestPath=resolve11(this._cwd,manifestPath);if(this._capabilityPlugins.has(resolvedManifestPath))throw new Error(`Capability plugin manifest is already loaded: ${resolvedManifestPath}`);let previousToolNames=new Set(runtime.listTools().map(tool=>tool.name)),loaded=await loadCapabilityPluginFromManifest(runtime,resolvedManifestPath,options);return this._trackCapabilityPlugin(resolvedManifestPath,loaded,previousToolNames)}async loadCapabilityPlugin(manifest,factory){let runtime=this._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let key=`inline:${manifest.id}`;if(this._capabilityPlugins.has(key))throw new Error(`Capability plugin is already loaded in this session: ${manifest.id}`);let previousToolNames=new Set(runtime.listTools().map(tool=>tool.name)),loaded=await loadCapabilityPlugin(runtime,manifest,factory);this._inlineCapabilityPlugins.set(key,{manifest,factory});try{return await this._trackCapabilityPlugin(key,loaded,previousToolNames)}catch(error2){throw this._inlineCapabilityPlugins.delete(key),error2}}getAllTools(){return getAllTools(this._internal)}getToolDefinition(name){return getToolDefinition(this._internal,name)}setActiveToolsByName(toolNames){setActiveToolsByName(this._internal,toolNames)}get isCompacting(){return this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get messages(){return this.agent.state.messages}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}get observabilityGetMetricsRef(){return this._observabilityGetMetricsRef}get sessionName(){return this.sessionManager.getSessionName()}getRevision(){return this.sessionManager.getRevision()}get scopedModels(){return getScopedModels(this._internal)}setScopedModels(scopedModels){setScopedModels(this._internal,scopedModels)}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text){return normalizePromptSnippet(text)}_normalizePromptGuidelines(guidelines){return normalizePromptGuidelines(guidelines)}_rebuildSystemPrompt(toolNames){return rebuildSystemPrompt(this._internal,toolNames)}async _runAgentPrompt(messages){return runPromptLoop(this._internal,messages)}_handlePostAgentRun(){return postAgentRun(this._internal)}async _runInputHandlers(text,images,source){let gateChain=this._capabilityRuntime?.getLoopHookChain("beforeInput")??[],currentText=text;for(let link of gateChain){let result=await link({text:currentText,source});if(result){if(result.block===!0){let reason=typeof result.reason=="string"&&result.reason.trim()!==""?result.reason:void 0;throw await dispatchInputGateBlockedLifecycle(this._internal,{source,textLength:currentText.length,reason}),new Error(reason===void 0?"Input rejected by an input gate":`Input rejected by an input gate: ${reason}`)}"text"in result&&typeof result.text=="string"&&(currentText=result.text)}}return dispatchInputReceivedLifecycle(this._internal,{source,textLength:currentText.length}),{text:currentText,images}}async prompt(text,options){if(this._reloadInProgress)throw new Error("Session reload in progress; prompts are unavailable");let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,messages;try{if(expandPromptTemplates&&text.startsWith("/")&&await this._tryExecuteExtensionCommand(text))return preflightResult?.(!0),{status:"done"};if(this._compactionAbortController!==void 0)throw new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let{text:currentText,images:currentImages}=await this._runInputHandlers(text,options?.images,options?.source??"interactive"),expandedText=currentText;if(expandPromptTemplates&&(expandedText=this._expandSkillCommand(expandedText),expandedText=expandPromptTemplate(expandedText,[...this.promptTemplates])),this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");return options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),preflightResult?.(!0),{status:"done"}}if(this._flushPendingBashMessages(),this._flushPendingCustomMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this.agent.streamFunction!==streamSimple||this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));let lastAssistant=this._findLastAssistantMessage();lastAssistant&&await this._checkCompaction(lastAssistant,!1),messages=[];let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now()});for(let msg of this._pendingNextTurnMessages)messages.push(msg);this._pendingNextTurnMessages=[],await dispatchBeforeAgentStartLifecycle(this._internal,(currentImages?.length??0)>0),this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt;let capabilitySystemPrompt=await dispatchBeforeAgentStartV2Lifecycle(this._internal,this._baseSystemPrompt,this._baseSystemPromptOptions);capabilitySystemPrompt!==void 0&&(this._systemPromptOverride=capabilitySystemPrompt,this.agent.state.systemPrompt=capabilitySystemPrompt)}catch(error2){throw preflightResult?.(!1),error2}return messages?(preflightResult?.(!0),this._runAgentPrompt(messages)):{status:"done"}}async _tryExecuteExtensionCommand(text){let spaceIndex=text.indexOf(" "),commandName=spaceIndex===-1?text.slice(1):text.slice(1,spaceIndex),args=spaceIndex===-1?"":text.slice(spaceIndex+1),runtime=this._capabilityRuntime;if(runtime?.hasCommand(commandName)){let templateConflict=this.promptTemplates.some(template=>template.name===commandName),skillName=commandName.startsWith("skill:")?commandName.slice(6):void 0,skillConflict=skillName!==void 0&&this._getAvailableSkills().some(skill=>skill.name===skillName);if(templateConflict||skillConflict){let source2=templateConflict?"prompt template":"skill";throw new Error(`Command is registered by both CapabilityAPI and ${source2}: ${commandName}`)}}else return!1;let source=runtime.listCommands().find(({definition})=>definition.name===commandName)?.source??"unknown",abortController=new AbortController;this._commandAbortController=abortController;let commandExecution=(async()=>{let result=await runtime.invokeCommand(commandName,args,{signal:abortController.signal,cwd:this._cwd});result!==void 0&&this._emit({type:"capability_command_result",command:commandName,source,result})})();this._activeCapabilityCommand=commandExecution;try{await commandExecution}finally{this._commandAbortController===abortController&&(this._commandAbortController=void 0),this._activeCapabilityCommand===commandExecution&&(this._activeCapabilityCommand=void 0)}return!0}_expandSkillCommand(text){if(!text.startsWith("/skill:"))return text;let spaceIndex=text.indexOf(" "),skillName=spaceIndex===-1?text.slice(7):text.slice(7,spaceIndex),args=spaceIndex===-1?"":text.slice(spaceIndex+1).trim(),skill=this._getAvailableSkills().find(s=>s.name===skillName);if(!skill)return text;try{let content=readFileSync11(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim(),skillBlock=`<skill name="${skill.name}" location="${skill.filePath}">
1050
+ `)}`}],details:{activated}}}}}function parseSkillBlock(text){let match2=text.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);return match2?{name:match2[1],location:match2[2],content:match2[3],userMessage:match2[4]?.trim()||void 0}:null}var SUITE_MISMATCH_SESSION_ENTRY_TYPE="suite_mismatch",AgentSession=class{agent;sessionManager;settingsManager;_scopedModels;_unsubscribeAgent;_eventListeners=[];_isAgentRunActive=!1;_idleWaitPromise;_resolveIdleWait;_steeringMessages=[];_followUpMessages=[];_pendingNextTurnMessages=[];_pendingCustomMessages=[];_compactionQueue=Promise.resolve();_compactionAbortController=void 0;_autoCompactionAbortController=void 0;_overflowRecoveryAttempted=!1;_overflowTrimStage=0;_branchSummaryAbortController=void 0;_branchSummaryPromise=void 0;_resolveBranchSummaryPromise=void 0;_retryAbortController=void 0;_policyDecisionAbortController=void 0;_retryAttempt=0;_commandAbortController=void 0;_agentTaskScopeAbortController=new AbortController;_activeCapabilityCommand;_activeCompactionPromise;_reloadInProgress=!1;_reloadGeneration=0;_contextEpoch=0;_contextTransitionAbortController=new AbortController;_activeContextTransition;_contextRevision=0;_contextCommitQueue=Promise.resolve();_bashAbortControllers=new Set;_activeBashPromises=new Set;_bashEpoch=0;_pendingBashMessages=[];_turnIndex=0;_resourceLoader;_customTools;_deferredToolPluginIds;_pendingAbortReason;_currentRunAborted=!1;_lastAbortReason;_baseToolDefinitions=new Map;_baseToolSources=new Map;_capabilityRuntime;_outputArtifactCommitListeners=new Set;_dispatchOutputArtifactCommit=artifact=>{for(let listener of[...this._outputArtifactCommitListeners])listener(artifact)};_bootstrapToolsHandle;_bootstrapSkillsHandle;_bootstrapRetryHandle;_bootstrapCompactionHandle;_bootstrapBranchSummaryHandle;_bootstrapOverflowHandle;_bootstrapAgentLoopHandle;_bootstrapLifecycleHandle;_capabilityPlugins=new Map;_inlineCapabilityPlugins=new Map;_isDisposingCapabilityPlugins=!1;_suspendToolRegistryHookRefresh=!1;_toolRegistryHookReady=!1;_disposePromise;_cwd;_initialActiveToolNames;_allowedToolNames;_excludedToolNames;_baseToolsOverride;_disabledBootstrapPlugins;_sessionStartEvent;_capabilityMode;_contextStrategyName;_retryPolicyName;_compactionPolicyName;_branchSummaryPolicyName;_overflowPolicyName;_runLoopStrategyName;_loopExecutor;_initialPrepareNextTurn;_agentTaskAdapter;_agentTaskResults;_agentSessionReader;_agentSessionLister;_agentComposition;_interactionHost;_modelRuntime;_modelStreamCounter=0;_modelStreamState;_turnCorrelationId;_turnCorrelationCounter=0;_toolRegistry=new Map;_toolDefinitions=new Map;_toolPromptSnippets=new Map;_toolPromptGuidelines=new Map;_baseSystemPrompt="";_baseSystemPromptOptions;_systemPromptOverride;_orientationPrompt;_preferenceCard;_capabilitySkillsFilter;_hostLogger;_logRecordMirrorRef;_observabilityGetMetricsRef;_agentDir;_communication;_turnContext;_roleAssociations;_memoryStorage;_traceService;constructor(config){this.agent=config.agent,this.sessionManager=config.sessionManager,this._contextRevision=this.sessionManager.getRevision().sequence,this.settingsManager=config.settingsManager,this._scopedModels=config.scopedModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._deferredToolPluginIds=new Set(config.deferredToolPluginIds??[]),this._deferredToolPluginIds.size>0&&this._customTools.push(createToolSearchTool({listAllToolNames:()=>Array.from(this._toolRegistry.keys()),getToolInfo:name=>{let definition=this._toolDefinitions.get(name)?.definition;return definition?{name:definition.name,description:definition.description}:void 0},getActiveToolNames:()=>this.getActiveToolNames(),setActiveToolsByName:toolNames=>this.setActiveToolsByName(toolNames)})),this._cwd=config.cwd,this._modelRuntime=config.modelRuntime,this._initialActiveToolNames=config.initialActiveToolNames,this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._disabledBootstrapPlugins=config.disabledBootstrapPlugins,this._sessionStartEvent=config.sessionStartEvent??{reason:"startup"},this._capabilityMode=config.capabilityMode??"full-control",this._contextStrategyName=config.contextStrategyName,this._retryPolicyName=config.retryPolicyName??DEFAULT_RETRY_POLICY_NAME,this._compactionPolicyName=config.compactionPolicyName??DEFAULT_COMPACTION_POLICY_NAME,this._branchSummaryPolicyName=config.branchSummaryPolicyName??DEFAULT_BRANCH_SUMMARY_POLICY_NAME,this._overflowPolicyName=config.overflowPolicyName??DEFAULT_OVERFLOW_POLICY_NAME,this._runLoopStrategyName=config.runLoopStrategyName??DEFAULT_RUN_LOOP_STRATEGY_NAME,this._agentTaskAdapter=config.agentTaskAdapter,this._agentTaskResults=config.agentTaskResults,this._agentSessionReader=config.agentSessionReader,this._agentSessionLister=config.agentSessionLister,this._agentComposition=config.agentComposition,this._interactionHost=config.interactionHost,this._orientationPrompt=config.orientationPrompt,this._preferenceCard=config.preferenceCard,this._capabilitySkillsFilter=config.capabilitySkillsFilter,this._hostLogger=config.hostLogger,this._logRecordMirrorRef=config.logRecordMirrorRef,this._observabilityGetMetricsRef=config.observabilityGetMetricsRef,this._agentDir=config.agentDir,this._communication=config.communication,this._turnContext=config.turnContext,this._roleAssociations=config.roleAssociations,this._memoryStorage=config.memoryStorage,this._traceService=config.traceService,this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._wireDefaultLoop()}getTurnCorrelationId(){return this._turnCorrelationId}dispatchAgentTaskSettled(facts){dispatchAgentTaskSettledLifecycle(this._internal,facts)}get modelRuntime(){return this._modelRuntime}get _internal(){return this}_wireDefaultLoop(){wireDefaultLoop(this._internal)}_createLoopWiring(){return createLoopWiring(this._internal)}_compactBeforeNextAssistantResponse(context,signal){return compactBeforeNextAssistantResponse(this._internal,context,signal)}_emit(event){for(let l3 of this._eventListeners)l3(event)}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages]})}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve25=>{this._resolveIdleWait=resolve25})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(!this.isIdle||!this._resolveIdleWait)return;let resolve25=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve25()}async _emitAgentSettled(){this._isAgentRunActive=!1;try{this._emit({type:"agent_settled"}),await dispatchAgentSettledLifecycle(this._internal)}finally{this._resolveIdleWaitIfIdle()}}_lastAssistantMessage=void 0;_pendingRetryDecision=void 0;_handleAgentEvent=async event=>{if(event.type==="message_start"&&event.message.role==="assistant"&&(this._modelStreamState={streamId:`model-stream:${++this._modelStreamCounter}`,sequence:0},await this._dispatchModelStreamLifecycle(event.message,"start","raw")),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._overflowTrimStage=0;let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._emitQueueUpdate())}}}if(await this._emitLifecycleEvents(event),event.type==="message_update"&&event.message.role==="assistant"&&await this._dispatchModelStreamLifecycle(event.message,event.assistantMessageEvent.type,"candidate"),this._emit(event.type==="agent_end"?{...event,willRetry:await this._willRetryAfterAgentEnd(event,this._policyDecisionAbortController?.signal)}:event),event.type==="message_end"){if(event.message.role==="custom")this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details);else if(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult"){let entryId=this.sessionManager.appendMessage(event.message);event.message.role==="assistant"?(event.message.stopReason==="aborted"&&(this._currentRunAborted=!0),await this._dispatchModelStreamLifecycle(event.message,event.message.stopReason==="error"||event.message.stopReason==="aborted"?"error":"done","committed"),this._modelStreamState=void 0,await this._dispatchModelResponseLifecycle(event.message,entryId)):event.message.role==="toolResult"&&(await this._dispatchToolCommitLifecycle(event.message,entryId),await this._dispatchToolResultLifecycle(event.message,entryId))}if(event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message;assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1,this._overflowTrimStage=0),assistantMsg.stopReason!=="error"&&this._retryAttempt>0&&(this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0)}}event.type==="turn_end"&&this._flushPendingCustomMessages()};async _dispatchModelStreamLifecycle(message,eventName,phase){await dispatchModelStreamLifecycle(this._internal,message,eventName,phase)}_willRetryAfterAgentEnd(event,signal){return willRetryAfterAgentEnd(this._internal,event,signal)}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}async _emitLifecycleEvents(event){if(event.type==="agent_start")this._turnIndex=0,await dispatchAgentStartLifecycle(this._internal);else if(event.type==="agent_end")await dispatchAgentEndLifecycle(this._internal);else if(event.type==="turn_start")await dispatchTurnStartLifecycle(this._internal,this._turnIndex);else if(event.type==="turn_end"){this._turnIndex++;let turnMessage=event.message,outcome=turnMessage.role==="assistant"&&(turnMessage.stopReason==="aborted"||turnMessage.stopReason==="error")?turnMessage.stopReason:void 0;await dispatchTurnEndLifecycle(this._internal,this._turnIndex,this.agent.state.messages.length,outcome)}else event.type==="message_start"?await dispatchMessageStartLifecycle(this._internal,event.message.role):event.type==="message_end"?await dispatchMessageEndLifecycle(this._internal,event.message.role):event.type==="tool_execution_start"&&await dispatchToolExecutionStartLifecycle(this._internal,event.toolCallId,event.toolName)}subscribe(listener){return this._eventListeners.push(listener),()=>{let index3=this._eventListeners.indexOf(listener);index3!==-1&&this._eventListeners.splice(index3,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}dispose(){return this._disposePromise?this._disposePromise:(this._disposePromise=(async()=>{let errors=[];this._beginContextTransitionFence(),this._bashEpoch+=1;for(let abort of[()=>this._abortActiveCapabilityCommand("session disposed"),()=>this.abortRetry(),()=>this.abortCompaction(),()=>this.abortBranchSummary(),()=>this.abortBash(),()=>this._agentTaskScopeAbortController.abort("session disposed"),()=>this.agent.abort()])try{await abort()}catch(error2){errors.push(error2)}await Promise.allSettled([this._activeContextTransition,...this._activeBashPromises,this.waitForIdle()].filter(operation=>operation!==void 0)),this._disconnectFromAgent(),this._eventListeners=[],await dispatchSessionEndLifecycle(this._internal);let disposals=[()=>this._disposeCapabilityPlugins(),()=>this._capabilityRuntime?.disposeAll(),()=>this._agentTaskAdapter?.dispose?.(),()=>this._interactionHost?.dispose?.(),()=>this._bootstrapToolsHandle?.dispose(),()=>this._bootstrapSkillsHandle?.dispose(),()=>this._bootstrapRetryHandle?.dispose(),()=>this._bootstrapCompactionHandle?.dispose(),()=>this._bootstrapOverflowHandle?.dispose(),()=>this._bootstrapBranchSummaryHandle?.dispose(),()=>this._bootstrapAgentLoopHandle?.dispose(),()=>this._bootstrapLifecycleHandle?.dispose()];for(let dispose of disposals)try{await dispose()}catch(error2){errors.push(error2)}if(this._capabilityRuntime?.revokeAllAPIs(),this._capabilityPlugins.clear(),this._inlineCapabilityPlugins.clear(),this._bootstrapToolsHandle=void 0,this._bootstrapSkillsHandle=void 0,this._bootstrapRetryHandle=void 0,this._bootstrapCompactionHandle=void 0,this._bootstrapOverflowHandle=void 0,this._bootstrapBranchSummaryHandle=void 0,this._bootstrapAgentLoopHandle=void 0,this._bootstrapLifecycleHandle=void 0,cleanupSessionResources(this.sessionId),errors.length===1)throw errors[0];if(errors.length>1)throw new AggregateError(errors,`Agent session disposal failed: ${this.sessionId}`)})(),this._disposePromise)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive&&!this.isCompacting}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCapabilityRuntime(){if(!this._capabilityRuntime)throw new Error("Capability runtime is not available");return this._capabilityRuntime}onOutputArtifactCommit(listener){return this._outputArtifactCommitListeners.add(listener),()=>{this._outputArtifactCommitListeners.delete(listener)}}get isDisposed(){return this._disposePromise!==void 0}getSessionAPI(){return{getSessionId:()=>this.sessionManager.getSessionId(),getRevision:()=>this.sessionManager.getRevision(),registerEntryProjection:projection=>this.sessionManager.registerEntryProjection(projection),getContextSnapshot:()=>({version:1,revision:this._contextRevision,value:detachedSessionSnapshot(this.agent.state.messages)}),commitContext:async request=>{let commit=this._contextCommitQueue.then(async()=>{if(request.signal?.aborted)throw new Error("Context commit cancelled");let currentRevision=this._contextRevision;if(request.operationId.trim()==="")throw new Error("Context commit operationId is required");if(request.expectedRevision!==currentRevision)throw new Error(`Context revision conflict: expected ${request.expectedRevision}, current ${currentRevision}`);if(!Array.isArray(request.value))throw new Error("Session context commit requires a message array");if(await this.replaceContext(request.value),request.signal?.aborted)throw new Error("Context commit cancelled");return{version:1,status:"committed",revision:this._contextRevision,value:detachedSessionSnapshot(this.agent.state.messages)}});return this._contextCommitQueue=commit.then(()=>{},()=>{}),commit},getMessages:()=>detachedSessionSnapshot(this.agent.state.messages),isIdle:()=>this.isIdle,prompt:text=>this.prompt(text),steer:text=>this.steer(text),queueFollowUp:text=>this.sendUserMessage(text,{deliverAs:"followUp"}),abort:()=>this.abort(),waitForIdle:()=>this.waitForIdle(),getActiveTools:()=>this.getActiveToolNames(),...this._capabilityMode==="readonly"?{}:{setActiveTools:toolNames=>this.setActiveToolsByName(toolNames)},compact:customInstructions=>this.compact(customInstructions),navigateTree:(targetId,options)=>this.navigateTree(targetId,options),appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data===void 0?void 0:detachedSessionSnapshot(data)),entry=this.sessionManager.getEntry(entryId);return entry&&(this._emit({type:"entry_appended",entry}),dispatchSessionEntryAppendedLifecycle(this._internal,entryId,entry.type)),entryId},setSessionName:name=>this.setSessionName(name),getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label)=>this.sessionManager.appendLabelChange(entryId,label),getLabel:entryId=>this.sessionManager.getLabel(entryId),getAllTools:()=>definitionSnapshot(this.getAllTools()),getCommands:()=>collectCommandInfos(this._internal),getModel:()=>this.model?detachedSnapshot(modelFactsView(this.model)):void 0,getScopedModels:()=>detachedSnapshot(this.scopedModels.map(entry=>({model:modelFactsView(entry.model),...entry.thinkingLevel===void 0?{}:{thinkingLevel:entry.thinkingLevel}}))),getThinkingLevel:()=>this.thinkingLevel,...this._capabilityMode==="readonly"?{}:{setThinkingLevel:level=>this.setThinkingLevel(level)},...this._capabilityMode==="readonly"?{}:{setModel:async modelId=>{let scoped=this.scopedModels.find(entry=>entry.model.id===modelId);return!scoped||!this._modelRuntime.hasConfiguredAuth(scoped.model.provider)?!1:(await this.setModel(scoped.model),!0)}},getSystemPrompt:()=>this.systemPrompt,getSystemPromptOptions:()=>detachedSnapshot(this._baseSystemPromptOptions),getContextUsage:()=>getContextUsage(this._internal),sendMessage:(message,options)=>this.sendCustomMessage(message,options),getBranchEntries:()=>detachedSessionSnapshot(this.sessionManager.getBranch().map(entry=>({id:entry.id,parentId:entry.parentId,timestamp:entry.timestamp,type:entry.type,...entry.type==="message"?{message:{role:entry.message.role,..."content"in entry.message?{content:entry.message.content}:{}}}:{},...entry.type==="custom"?{customType:entry.customType,data:entry.data}:{}}))),exportArtifact:request=>{if(request.format!=="jsonl")throw new Error(`Unsupported session export format: ${request.format}`);return createSessionJsonlArtifact(this.sessionManager)}}}getCapabilityPlugins(){let handles=Array.from(this._capabilityPlugins.values());for(let handle of[this._bootstrapToolsHandle,this._bootstrapSkillsHandle,this._bootstrapRetryHandle,this._bootstrapCompactionHandle,this._bootstrapOverflowHandle,this._bootstrapBranchSummaryHandle,this._bootstrapLifecycleHandle])handle&&handles.push(handle);return handles}get contextStrategyName(){return this._contextStrategyName}_requireContextStrategy(){return requireContextStrategy(this._internal)}_requireIdleContextOperation(operation){requireIdleContextOperation(this._internal,operation)}_beginContextTransitionFence(){beginContextTransitionFence(this._internal)}_isContextTransitionCurrent(epoch,allowReload){return isContextTransitionCurrent(this._internal,epoch,allowReload)}_assertContextTransitionCurrent(epoch,allowReload){assertContextTransitionCurrent(this._internal,epoch,allowReload)}_enqueueContextTransition(operation,options){return enqueueContextTransition(this._internal,operation,options)}_copyContextMessages(value,strategyName,direction){return copyContextMessages(value,strategyName,direction)}async _applyContextTransition(messages,reason="session_replace",signal,options){return applyContextTransition(this._internal,messages,reason,signal,options)}async _dispatchContextReplacedLifecycle(reason,strategyName){await dispatchContextReplacedLifecycle(this._internal,reason,strategyName)}async _dispatchModelResponseLifecycle(message,entryId){await dispatchModelResponseLifecycle(this._internal,message,entryId)}async _dispatchToolCommitLifecycle(message,entryId){await dispatchToolCommitLifecycle(this._internal,message,entryId)}async _dispatchToolResultLifecycle(message,entryId){await dispatchToolResultLifecycle(this._internal,message,entryId)}async _dispatchSessionReloadLifecycle(generation){await dispatchSessionReloadLifecycle(this._internal,generation)}async snapshotContext(){return snapshotContext(this._internal)}async restoreContext(snapshot2){return restoreContext(this._internal,snapshot2)}async replaceContext(context){return replaceContext(this._internal,context)}_restoreContextTransition(snapshot2,reason,options){return restoreContextTransition(this._internal,snapshot2,reason,options)}async _trackCapabilityPlugin(key,loaded,previousToolNames){try{this._validateCapabilitySkillConflicts()}catch(error2){throw await loaded.dispose(),error2}let disposed=!1,handle={manifest:loaded.manifest,api:loaded.api,ready:loaded.ready,dispose:async()=>{if(!disposed){disposed=!0,this._suspendToolRegistryHookRefresh=!0;try{await loaded.dispose()}finally{this._suspendToolRegistryHookRefresh=!1}this._capabilityPlugins.delete(key),this._inlineCapabilityPlugins.delete(key),this._isDisposingCapabilityPlugins||(this._syncCapabilityTools(),this._refreshToolRegistry({activeToolNames:this.getActiveToolNames()}))}}};this._capabilityPlugins.set(key,handle),this._syncCapabilityTools();let newToolNames=this._capabilityRuntime.listTools().filter(tool=>this._capabilityMode!=="readonly"||!tool.source.startsWith("agent-forge.builtin.")&&!tool.source.startsWith("agent-forge.plugin.")||tool.readonlySafe===!0).map(tool=>tool.name).filter(name=>!previousToolNames.has(name));return this._refreshToolRegistry({activeToolNames:[...this.getActiveToolNames(),...newToolNames]}),handle}async loadCapabilityPluginManifest(manifestPath,options){let runtime=this._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let resolvedManifestPath=resolve11(this._cwd,manifestPath);if(this._capabilityPlugins.has(resolvedManifestPath))throw new Error(`Capability plugin manifest is already loaded: ${resolvedManifestPath}`);let previousToolNames=new Set(runtime.listTools().map(tool=>tool.name)),loaded=await loadCapabilityPluginFromManifest(runtime,resolvedManifestPath,options);return this._trackCapabilityPlugin(resolvedManifestPath,loaded,previousToolNames)}async loadCapabilityPlugin(manifest,factory){let runtime=this._capabilityRuntime;if(!runtime)throw new Error("Capability runtime is not available");let key=`inline:${manifest.id}`;if(this._capabilityPlugins.has(key))throw new Error(`Capability plugin is already loaded in this session: ${manifest.id}`);let previousToolNames=new Set(runtime.listTools().map(tool=>tool.name)),loaded=await loadCapabilityPlugin(runtime,manifest,factory);this._inlineCapabilityPlugins.set(key,{manifest,factory});try{return await this._trackCapabilityPlugin(key,loaded,previousToolNames)}catch(error2){throw this._inlineCapabilityPlugins.delete(key),error2}}getAllTools(){return getAllTools(this._internal)}getToolDefinition(name){return getToolDefinition(this._internal,name)}setActiveToolsByName(toolNames){setActiveToolsByName(this._internal,toolNames)}get isCompacting(){return this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get messages(){return this.agent.state.messages}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}get observabilityGetMetricsRef(){return this._observabilityGetMetricsRef}get sessionName(){return this.sessionManager.getSessionName()}getRevision(){return this.sessionManager.getRevision()}get scopedModels(){return getScopedModels(this._internal)}setScopedModels(scopedModels){setScopedModels(this._internal,scopedModels)}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text){return normalizePromptSnippet(text)}_normalizePromptGuidelines(guidelines){return normalizePromptGuidelines(guidelines)}_rebuildSystemPrompt(toolNames){return rebuildSystemPrompt(this._internal,toolNames)}async _runAgentPrompt(messages){return runPromptLoop(this._internal,messages)}_handlePostAgentRun(){return postAgentRun(this._internal)}async _runInputHandlers(text,images,source){let gateChain=this._capabilityRuntime?.getLoopHookChain("beforeInput")??[],currentText=text;for(let link of gateChain){let result=await link({text:currentText,source});if(result){if(result.block===!0){let reason=typeof result.reason=="string"&&result.reason.trim()!==""?result.reason:void 0;throw await dispatchInputGateBlockedLifecycle(this._internal,{source,textLength:currentText.length,reason}),new Error(reason===void 0?"Input rejected by an input gate":`Input rejected by an input gate: ${reason}`)}"text"in result&&typeof result.text=="string"&&(currentText=result.text)}}return dispatchInputReceivedLifecycle(this._internal,{source,textLength:currentText.length}),{text:currentText,images}}async prompt(text,options){if(this._reloadInProgress)throw new Error("Session reload in progress; prompts are unavailable");let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,messages;try{if(expandPromptTemplates&&text.startsWith("/")&&await this._tryExecuteExtensionCommand(text))return preflightResult?.(!0),{status:"done"};if(this._compactionAbortController!==void 0)throw new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let{text:currentText,images:currentImages}=await this._runInputHandlers(text,options?.images,options?.source??"interactive"),expandedText=currentText;if(expandPromptTemplates&&(expandedText=this._expandSkillCommand(expandedText),expandedText=expandPromptTemplate(expandedText,[...this.promptTemplates])),this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");return options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),preflightResult?.(!0),{status:"done"}}if(this._flushPendingBashMessages(),this._flushPendingCustomMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this.agent.streamFunction!==streamSimple||this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));let lastAssistant=this._findLastAssistantMessage();lastAssistant&&await this._checkCompaction(lastAssistant,!1),messages=[];let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now()});for(let msg of this._pendingNextTurnMessages)messages.push(msg);this._pendingNextTurnMessages=[],await dispatchBeforeAgentStartLifecycle(this._internal,(currentImages?.length??0)>0),this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt;let capabilitySystemPrompt=await dispatchBeforeAgentStartV2Lifecycle(this._internal,this._baseSystemPrompt,this._baseSystemPromptOptions);capabilitySystemPrompt!==void 0&&(this._systemPromptOverride=capabilitySystemPrompt,this.agent.state.systemPrompt=capabilitySystemPrompt)}catch(error2){throw preflightResult?.(!1),error2}return messages?(preflightResult?.(!0),this._runAgentPrompt(messages)):{status:"done"}}async _tryExecuteExtensionCommand(text){let spaceIndex=text.indexOf(" "),commandName=spaceIndex===-1?text.slice(1):text.slice(1,spaceIndex),args=spaceIndex===-1?"":text.slice(spaceIndex+1),runtime=this._capabilityRuntime;if(runtime?.hasCommand(commandName)){let templateConflict=this.promptTemplates.some(template=>template.name===commandName),skillName=commandName.startsWith("skill:")?commandName.slice(6):void 0,skillConflict=skillName!==void 0&&this._getAvailableSkills().some(skill=>skill.name===skillName);if(templateConflict||skillConflict){let source2=templateConflict?"prompt template":"skill";throw new Error(`Command is registered by both CapabilityAPI and ${source2}: ${commandName}`)}}else return!1;let source=runtime.listCommands().find(({definition})=>definition.name===commandName)?.source??"unknown",abortController=new AbortController;this._commandAbortController=abortController;let commandExecution=(async()=>{let result=await runtime.invokeCommand(commandName,args,{signal:abortController.signal,cwd:this._cwd});result!==void 0&&this._emit({type:"capability_command_result",command:commandName,source,result})})();this._activeCapabilityCommand=commandExecution;try{await commandExecution}finally{this._commandAbortController===abortController&&(this._commandAbortController=void 0),this._activeCapabilityCommand===commandExecution&&(this._activeCapabilityCommand=void 0)}return!0}_expandSkillCommand(text){if(!text.startsWith("/skill:"))return text;let spaceIndex=text.indexOf(" "),skillName=spaceIndex===-1?text.slice(7):text.slice(7,spaceIndex),args=spaceIndex===-1?"":text.slice(spaceIndex+1).trim(),skill=this._getAvailableSkills().find(s=>s.name===skillName);if(!skill)return text;try{let content=readFileSync11(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim(),skillBlock=`<skill name="${skill.name}" location="${skill.filePath}">
1051
1051
  References are relative to ${skill.baseDir}.
1052
1052
 
1053
1053
  ${body}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
3
- import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-2L25YYPC.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=APP_NAME;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(process.argv.slice(2));
3
+ import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-S3YLY4MG.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=APP_NAME;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(process.argv.slice(2));