@ai-agent-forge/agent-forge 0.85.23 → 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 +18 -0
- package/dist/bundle/.build-manifest.json +14 -14
- package/dist/bundle/chunks/{chunk-OTAKR2WB.js → chunk-S3YLY4MG.js} +4 -4
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +159 -3
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-internal.d.ts +2 -0
- package/dist/core/agent-session-internal.d.ts.map +1 -1
- package/dist/core/agent-session-internal.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +2 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -10
- package/dist/core/sdk.js.map +1 -1
- package/package.json +1 -1
|
@@ -612,7 +612,7 @@ Summarize the prefix to provide context for the retained suffix:
|
|
|
612
612
|
## Context for Suffix
|
|
613
613
|
- [Information needed to understand the retained recent work]
|
|
614
614
|
|
|
615
|
-
Be concise. Focus on what's needed to understand the kept suffix
|
|
615
|
+
Be concise. Focus on what's needed to understand the kept suffix.`;var BRANCH_SUMMARY_PROMPT=`Create a structured summary of this conversation branch for context when returning later.
|
|
616
616
|
|
|
617
617
|
Use this EXACT format:
|
|
618
618
|
|
|
@@ -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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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&¶ms.length>i+2)style.fg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&¶ms.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&¶ms.length>i+2)style.bg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&¶ms.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)||" "}</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}
|
|
@@ -1066,7 +1066,7 @@ ${issue.fallbackCwd}`}var MissingSessionCwdError=class extends Error{issue;const
|
|
|
1066
1066
|
`,1)[0]??"";return{header:parseHeader3(firstLine),bytes}}function readAgentSession(options){if(!isAgentSessionId2(options.sessionId))return;let dir=agentSessionsDir2(options.agentDir),filePath=findSessionFile2(dir,options.sessionId);if(filePath===void 0)return;let text,bytes;try{bytes=statSync16(filePath).size,text=readFileSync19(filePath,{encoding:"utf-8",flag:"r"})}catch{return}let maxBytes=options.maxBytes??DEFAULT_MAX_BYTES4,truncated=text.length>maxBytes,lines=(truncated?text.slice(0,maxBytes):text).split(`
|
|
1067
1067
|
`).filter(line=>line.trim()!==""),header=lines.length>0?parseHeader3(lines[0]):void 0,entries=[];for(let line of lines.slice(header===void 0?0:1))try{entries.push(JSON.parse(line))}catch{}let parentAgentSession=typeof header?.parentAgentSession=="string"?header.parentAgentSession:void 0,agentRole=typeof header?.agentRole=="string"?header.agentRole:void 0,cwd=typeof header?.cwd=="string"?header.cwd:void 0,createdAt=typeof header?.timestamp=="string"?header.timestamp:void 0;return{sessionId:options.sessionId,...parentAgentSession===void 0?{}:{parentAgentSession},...agentRole===void 0?{}:{agentRole},...cwd===void 0?{}:{cwd},...createdAt===void 0?{}:{createdAt},bytes,entryCount:entries.length,truncated,entries:Object.freeze(entries)}}function listAgentSessions(options){let names2,dir;try{dir=agentSessionsDir2(options.agentDir),names2=readdirSync14(dir).filter(name=>name.endsWith(".jsonl"))}catch{return Object.freeze([])}let summaries=[];for(let name of names2){let stem=name.slice(0,-6),separator=stem.lastIndexOf("_"),sessionId=separator===-1?stem:stem.slice(separator+1);if(!isAgentSessionId2(sessionId))continue;let filePath=join48(dir,name),scanned,modifiedAt;try{scanned=readHeader(filePath),modifiedAt=statSync16(filePath).mtimeMs}catch{continue}let parentAgentSession=typeof scanned.header?.parentAgentSession=="string"?scanned.header.parentAgentSession:void 0;if(options.parentAgentSession!==void 0&&parentAgentSession!==options.parentAgentSession)continue;let agentRole=typeof scanned.header?.agentRole=="string"?scanned.header.agentRole:void 0,createdAt=typeof scanned.header?.timestamp=="string"?scanned.header.timestamp:void 0;summaries.push({sessionId,...parentAgentSession===void 0?{}:{parentAgentSession},...agentRole===void 0?{}:{agentRole},...createdAt===void 0?{}:{createdAt},modifiedAt,bytes:scanned.bytes})}return summaries.sort((left,right)=>right.modifiedAt-left.modifiedAt),Object.freeze(summaries.slice(0,options.limit??DEFAULT_LIST_LIMIT))}function createCodingAgentFacade(session){return{version:1,prompt:(text,options)=>session.prompt(text,options),steer:(text,images,options)=>session.steer(text,images,options),abort:()=>session.abort(),waitForIdle:()=>session.waitForIdle(),compact:customInstructions=>session.compact(customInstructions),navigateTree:(targetId,options)=>session.navigateTree(targetId,options),reload:options=>session.reload(options),setModel:(model,options)=>session.setModel(model,options),setThinkingLevel:(level,options)=>session.setThinkingLevel(level,options),setActiveToolsByName:toolNames=>session.setActiveToolsByName(toolNames),getQueuedMessages:()=>({steering:session.getSteeringMessages(),followUp:session.getFollowUpMessages()}),clearQueue:()=>session.clearQueue(),recordSuiteMismatch:(originalSuiteId,currentSuiteId)=>session.recordSuiteMismatch(originalSuiteId,currentSuiteId),getSessionAPI:()=>session.getSessionAPI(),isIdle:()=>session.isIdle,getState:()=>session.state,getModel:()=>session.model,getToolNames:()=>session.getActiveToolNames(),getSessionId:()=>session.sessionId,getHeader:()=>session.sessionManager.getHeader(),subscribe:listener=>session.subscribe(listener),subscribeRawEventGate:listener=>session.agent.subscribe(()=>listener()),getSessionName:()=>session.sessionName,isCompacting:()=>session.isCompacting,isStreaming:()=>session.isStreaming,getContextUsage:()=>session.getContextUsage(),getSystemPrompt:()=>session.systemPrompt,getScopedModels:()=>session.scopedModels,getTree:()=>session.sessionManager.getTree(),getLeafId:()=>session.sessionManager.getLeafId(),getPromptTemplates:()=>session.promptTemplates,getToolDefinition:name=>session.getToolDefinition(name),getCwd:()=>session.sessionManager.getCwd(),getEntries:()=>session.sessionManager.getEntries(),getPendingMessageCount:()=>session.pendingMessageCount,followUp:(text,images,options)=>session.followUp(text,images,options),setScopedModels:scopedModels=>session.setScopedModels(scopedModels),cycleModel:(direction,options)=>session.cycleModel(direction,options),cycleThinkingLevel:options=>session.cycleThinkingLevel(options),setSteeringMode:mode=>session.setSteeringMode(mode),setFollowUpMode:mode=>session.setFollowUpMode(mode),setAutoCompactionEnabled:enabled=>session.setAutoCompactionEnabled(enabled),setSessionName:name=>session.setSessionName(name),abortBash:()=>session.abortBash(),abortCompaction:()=>session.abortCompaction(),abortRetry:()=>session.abortRetry(),abortBranchSummary:()=>session.abortBranchSummary(),captureBashEpoch:()=>session.captureBashEpoch(),isBashEpochCurrent:epoch=>session.isBashEpochCurrent(epoch),emitUserBash:excludeFromContext=>session.emitUserBash(excludeFromContext),executeBash:(command,onChunk,options)=>session.executeBash(command,onChunk,options),recordBashResult:(command,result,options)=>session.recordBashResult(command,result,options),getThinkingLevel:()=>session.thinkingLevel,getSteeringMode:()=>session.steeringMode,getFollowUpMode:()=>session.followUpMode,getSessionFile:()=>session.sessionFile,isAutoCompactionEnabled:()=>session.autoCompactionEnabled,getAvailableThinkingLevels:()=>session.getAvailableThinkingLevels(),getUserMessagesForForking:()=>session.getUserMessagesForForking(),getLastAssistantText:()=>session.getLastAssistantText(),getSessionStats:()=>session.getSessionStats(),setAutoRetryEnabled:enabled=>session.setAutoRetryEnabled(enabled),exportToHtml:(outputPath,options)=>session.exportToHtml(outputPath,options),appendLabelChange:(entryId,label)=>session.sessionManager.appendLabelChange(entryId,label),getSkills:()=>session.resourceLoader.getSkills(),getPrompts:()=>session.resourceLoader.getPrompts(),getThemes:()=>session.resourceLoader.getThemes(),getAgentsFiles:()=>session.resourceLoader.getAgentsFiles(),getSystemPromptSource:()=>session.resourceLoader.getSystemPromptSource(),getAppendSystemPromptSources:()=>session.resourceLoader.getAppendSystemPromptSources(),getSuiteId:()=>readSessionSuiteBinding(session.getSessionAPI().getBranchEntries())?.suiteId,getAvailableModels:()=>session.modelRuntime.getAvailableSnapshot(),isUsingSubscription:providerId=>session.modelRuntime.isUsingSubscription(providerId),getModelsError:()=>session.modelRuntime.getError(),getModelCatalog:()=>session.modelRuntime,checkProviderAuth:providerId=>session.modelRuntime.checkAuth(providerId),getProviderAuth:providerId=>session.modelRuntime.getAuth(providerId),getModelPriceSource:()=>session.modelRuntime,getModelAuthRuntime:()=>session.modelRuntime,getContextEntries:()=>session.sessionManager.buildContextEntries(),getSteeringMessages:()=>session.getSteeringMessages(),getFollowUpMessages:()=>session.getFollowUpMessages(),getRetryAttempt:()=>session.retryAttempt,isBashRunning:()=>session.isBashRunning,exportToJsonl:outputPath=>session.exportToJsonl(outputPath),dispose:()=>session.dispose()}}function createCodingAgentRuntimeFacade(runtime){let sessionManager=()=>runtime.session.sessionManager;return{version:1,newSession:(...args)=>runtime.newSession(...args),fork:(...args)=>runtime.fork(...args),switchSession:(...args)=>runtime.switchSession(...args),importFromJsonl:(...args)=>runtime.importFromJsonl(...args),dispose:()=>runtime.dispose(),setBeforeSessionInvalidate:beforeSessionInvalidate=>runtime.setBeforeSessionInvalidate(beforeSessionInvalidate),setRebindSession:rebindSession=>runtime.setRebindSession(rebindSession),getSessionFacade:()=>createCodingAgentFacade(runtime.session),listSessions:onProgress=>SessionManager.list(sessionManager().getCwd(),sessionManager().getSessionDir(),onProgress),listAllSessions:onProgress=>sessionManager().usesDefaultSessionDir()?SessionManager.listAll(onProgress):SessionManager.listAll(sessionManager().getSessionDir(),onProgress),getSessionFile:()=>sessionManager().getSessionFile(),getSessionDir:()=>sessionManager().getSessionDir(),usesDefaultSessionDir:()=>sessionManager().usesDefaultSessionDir(),isPersisted:()=>sessionManager().isPersisted(),getSessionId:()=>sessionManager().getSessionId()}}function areTimingsEnabled(){let configuredValue=process.env.AGENT_FORGE_TIMING;return configuredValue===void 0?process.env.PI_TIMING==="1":configuredValue==="1"}var ENABLED=areTimingsEnabled(),timingNamespaces=new Map;function resetTimings(namespace="main"){ENABLED&&timingNamespaces.set(namespace,{timings:[],lastTime:Date.now()})}function time(label,namespace="main"){if(!ENABLED)return;let now=Date.now();timingNamespaces.has(namespace)||resetTimings(namespace);let timingNamespace=timingNamespaces.get(namespace);timingNamespace.timings.push({label,ms:now-timingNamespace.lastTime}),timingNamespace.lastTime=now}function printTimingGroup(title,timings){let printableTimings=timings.filter(timing=>timing.ms>=0);if(printableTimings.length!==0){console.error(`
|
|
1068
1068
|
--- ${title} ---`);for(let t of printableTimings)console.error(` ${t.label}: ${t.ms}ms`);console.error(` TOTAL: ${printableTimings.reduce((a,b2)=>a+b2.ms,0)}ms`),console.error(`${"-".repeat(title.length+8)}
|
|
1069
|
-
`)}}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}setDefaultStreamFn(streamSimple);var AGENT_TASK_SETTLED_STATUSES=new Set(["queued","admitted","running","succeeded","failed","cancelled","timed_out","drain_timeout","runner_lost"]);function parseAgentTaskSettledDigestLine(line){let parsed;try{parsed=JSON.parse(line)}catch{return}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let record=parsed;if(!(typeof record.taskId!="string"||record.taskId==="")&&!(typeof record.sessionId!="string"||record.sessionId==="")&&!(typeof record.status!="string"||!AGENT_TASK_SETTLED_STATUSES.has(record.status))&&!(record.reasonCode!==void 0&&(typeof record.reasonCode!="string"||record.reasonCode==="")))return{taskId:record.taskId,taskSessionId:record.sessionId,status:record.status,...record.reasonCode===void 0?{}:{reasonCode:record.reasonCode}}}function deliverAgentTaskSettledDigestLine(session,line,hostLogger){let facts=parseAgentTaskSettledDigestLine(line);if(facts===void 0){hostLogger?.warn("sdk","background delegation settlement line is not a valid agent.task.settled source",{cause:line});return}session?.dispatchAgentTaskSettled(facts)}var OBSERVABILITY_PACKAGE_ID="agent-forge.plugin.observability",SUBAGENT_DELEGATE_PACKAGE_ID="agent-forge.plugin.subagent-delegate",MEMORY_PACKAGE_ID="agent-forge.plugin.memory",isMemoryModeV1=value=>value==="off"||value==="light"||value==="full";function resolveSdkMemoryMode(explicitMode,env2,settingsMode){if(explicitMode!==void 0)return isMemoryModeV1(explicitMode)?{mode:explicitMode}:{mode:"off",invalidEnvValue:explicitMode};let configured=env2.AGENT_FORGE_MEMORY_MODE?.trim().toLowerCase();if(configured!==void 0&&configured!=="")return isMemoryModeV1(configured)?{mode:configured}:{mode:"off",invalidEnvValue:configured};let fromSettings=settingsMode?.trim().toLowerCase();if(fromSettings!==void 0&&fromSettings!=="")return isMemoryModeV1(fromSettings)?{mode:fromSettings}:{mode:"off",invalidSettingsValue:fromSettings};let legacy=env2.AGENT_FORGE_MEMORY_VECTOR?.trim().toLowerCase();return legacy!==void 0&&legacy!==""?isMemoryModeV1(legacy)?{mode:legacy}:{mode:"off",invalidEnvValue:legacy}:{mode:"off"}}function getDefaultAgentDir(){return getAgentDir()}function injectAfterLastUserMessage(messages,injection){for(let index3=messages.length-1;index3>=0;index3-=1)if(messages[index3]?.role==="user")return[...messages.slice(0,index3+1),injection,...messages.slice(index3+1)];return messages}async function readCapabilityPluginManifestForOrdering(manifestPath){let raw;try{raw=JSON.parse(await readFile9(manifestPath,"utf8"))}catch(error2){throw new Error(`Failed to read capability plugin manifest ${manifestPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}return parseCapabilityPluginManifest(raw,manifestPath)}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join49(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join49(agentDir,"models.json"):void 0,modelRuntime=options.modelRuntime??await ModelRuntime.create({authPath,modelsPath,credentials:options.credentials}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),suiteId=resolveSuiteId({explicit:options.suite,envSuite:process.env[SUITE_ENV_VAR],settings:settingsManager,agentDir}),suiteAssembly=createSuiteAssembly({cwd,agentDir,suiteId,pluginProfileId:options.pluginProfileId,selectedPluginIds:options.selectedPluginIds,disabledPluginIds:options.disabledPluginIds,pluginHost:options.pluginHost,verifiedPlugins:options.verifiedPlugins,manifestOverrides:options.manifestOverrides,pluginProfile:options.pluginProfile}),suiteWorkspace=suiteAssembly.workspace,resolvedAgentProfile=buildResolvedAgentProfileV1({suiteId,workspace:suiteWorkspace,...suiteAssembly.pluginProfile===void 0?{}:{pluginProfile:suiteAssembly.pluginProfile}}),capabilityWiring=options.suiteCapabilityWiring??!options.resourceLoader,capabilityDiagnostics=[],suitePreferenceDiagnostics=[],capabilitySkillsFilter,communicationMailbox,selfMailbox=()=>(communicationMailbox??=createSubagentMailbox({agentDir,ownerParentSessionId:()=>agentSessionRef.current?.sessionId}),communicationMailbox),communicationWiring=options.enableAgentTasks===!1&&options.subagentCommunicationWiring===void 0?void 0:{drainEscalations:sessionId=>selfMailbox().drainEscalations(sessionId),...options.subagentCommunicationWiring??{}},backgroundDigest={pending:[]},settingsMemoryMode=settingsManager.getMemoryModeSetting(),memoryModeOption=options.memoryCapability?.mode,memoryModeResolution=resolveSdkMemoryMode(memoryModeOption,process.env,settingsMemoryMode);if(capabilityWiring){suiteWorkspace.suite.capabilities.includes("builtin.memory")&&(memoryModeResolution.invalidEnvValue!==void 0&&capabilityDiagnostics.push(`invalid AGENT_FORGE_MEMORY_MODE value "${memoryModeResolution.invalidEnvValue}"; memory stays off (fail-closed)`),memoryModeResolution.invalidSettingsValue!==void 0&&capabilityDiagnostics.push(`invalid memory.mode setting "${memoryModeResolution.invalidSettingsValue}"; memory stays off (fail-closed)`),memoryModeResolution.mode==="off"&&capabilityDiagnostics.push("memory disabled (mode=off) \u2014 set memory.mode (light|full) in settings.json to enable"));let suiteDefinition=suiteWorkspace.suite,suiteLocalSkillsDir=suiteAssembly.localSkillsDir;capabilitySkillsFilter=skills=>filterSuiteSkills(suiteDefinition,skills,{localSkillsDir:suiteLocalSkillsDir}).kept}let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),hostLogger=options.hostLogger,traceOptions=options.traceOptions,observabilityCapture={},observabilityLogMirror={},observabilityGetMetrics={},traceService;options.traceEnabled!==!1&&(traceService={adapter:{getTraceFilePath:()=>{let sessionFilePath=sessionManager.getSessionFile();return sessionFilePath===void 0?null:getTraceFilePathForSession(sessionFilePath)},captureProviderPayload:(payload2,model2)=>{observabilityCapture.current?.(payload2,model2)},onSinkFailure:error2=>{hostLogger?.error("observability","trace sink failure",{cause:error2})},getTurnCorrelationId:()=>agentSessionRef.current?.getTurnCorrelationId(),getParentAgentSessionId:()=>sessionManager.getHeader()?.parentAgentSession,getParentTraceId:()=>sessionManager.getHeader()?.parentTraceId,registerFacade:facade=>{observabilityCapture.current=facade?.captureProviderPayload,observabilityLogMirror.current=facade?.mirrorPluginLog,observabilityGetMetrics.current=facade?.getMetrics}},...traceOptions===void 0?{}:{options:traceOptions}}),resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager,...suiteAssembly.loaderOverrides,...suiteAssembly.localSkillsDir===void 0?{}:{additionalSkillPaths:[suiteAssembly.localSkillsDir]}}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,branchEntries=sessionManager.getBranch(),sessionSuiteBinding=readSessionSuiteBinding(branchEntries),hasConversation=branchEntries.some(entry=>entry.type==="message"&&entry.message?.role==="user");if(hasConversation&&sessionSuiteBinding!==void 0&&!options.allowSuiteRebind){if(sessionSuiteBinding.suiteId!==suiteId)throw new SuiteRebindError(`Session is bound to suite "${sessionSuiteBinding.suiteId}" and cannot resume with "${suiteId}"; rerun with --rebind-suite to adopt the new suite, or create a new session`);if(sessionSuiteBinding.profileIdentity!==void 0&&!profileIdentitiesCompatible(sessionSuiteBinding.profileIdentity,suiteWorkspace.identity))throw new SuiteRebindError("Session Profile identity drift detected (the active plugin set changed since the conversation started); rerun with --rebind-suite to adopt the new plugin set, or create a new session")}let hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,modelFallbackMessage;if(!model&&hasExistingSession&&existingSession.model){let restoredModel=modelRuntime.getModel(existingSession.model.provider,existingSession.model.modelId);restoredModel&&modelRuntime.hasConfiguredAuth(restoredModel.provider)&&(model=restoredModel),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}let suiteModelPreference=suiteWorkspace.suite.model;if(!model&&suiteModelPreference!==null){let suiteModel=findExactModelReferenceMatch(suiteModelPreference,[...modelRuntime.getModels()]);suiteModel&&modelRuntime.hasConfiguredAuth(suiteModel.provider)?model=suiteModel:suitePreferenceDiagnostics.push(`Suite "${suiteId}" model "${suiteModelPreference}" does not resolve to an authenticated model; using the normal model resolution instead.`)}model||(model=(await findInitialModel({scopedModels:[],isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime})).model,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage());let thinkingLevel=options.thinkingLevel;thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel);let suiteThinkingPreference=suiteWorkspace.suite.thinking;if(thinkingLevel===void 0&&suiteThinkingPreference!==null&&(isValidThinkingLevel(suiteThinkingPreference)?thinkingLevel=suiteThinkingPreference:suitePreferenceDiagnostics.push(`Suite "${suiteId}" thinking "${suiteThinkingPreference}" is not a valid thinking level; using the normal thinking resolution instead.`)),thinkingLevel===void 0&&hasExistingSession&&(thinkingLevel=settingsManager.getDefaultThinkingLevel()??DEFAULT_THINKING_LEVEL),thinkingLevel===void 0&&model){let perModel=settingsManager.getModelThinkingLevel(model.provider,model.id);perModel&&(thinkingLevel=perModel)}thinkingLevel===void 0&&(thinkingLevel=settingsManager.getDefaultThinkingLevel()??DEFAULT_THINKING_LEVEL),model?thinkingLevel=clampThinkingLevel(model,thinkingLevel):thinkingLevel="off";let defaultActiveToolNames=options.capabilityMode==="readonly"?["read","grep","find","ls"]:["read","bash","edit","write"],configuredDefaultToolNames=settingsManager.getDefaultTools(),allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=((options.tools===void 0&&options.noTools===void 0&&options.capabilityMode!=="readonly"?[...suiteWorkspace.suite.tools]:void 0)??options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,convertToLlmWithBlockImages=messages=>{let expired=expireStaleImageParts(messages),converted=convertToLlm2(expired);return settingsManager.getBlockImages()?converted.map(msg=>{if(msg.role==="user"||msg.role==="toolResult"){let content=msg.content;if(Array.isArray(content)&&content.some(c2=>c2.type==="image")){let filteredContent=content.map(c2=>c2.type==="image"?{type:"text",text:"Image reading is disabled."}:c2).filter((c2,i,arr)=>!(c2.type==="text"&&c2.text==="Image reading is disabled."&&i>0&&arr[i-1].type==="text"&&arr[i-1].text==="Image reading is disabled."));return{...msg,content:filteredContent}}}return msg}):converted},agentSessionRef={},customStreamFn=options.streamFn;agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:customStreamFn?(model2,context,streamOptions)=>customStreamFn(model2,context,streamOptions):async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs();try{return modelRuntime.streamSimple(model2,context,{...options2,timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??providerRetrySettings.maxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let session2=agentSessionRef.current;if(!session2)throw new Error("Capability runtime is not initialized for provider request");return session2.getCapabilityRuntime().transformProviderHeaders({model:model2,...options2?.sessionId===void 0?{}:{sessionId:options2.sessionId},headers:requestHeaders})}})}catch(error2){throw hostLogger?.error("sdk","provider stream failed",{cause:error2}),error2}},onPayload:async(payload2,model2)=>{try{traceService?.adapter.captureProviderPayload(payload2,model2?.id)}catch(error2){hostLogger?.warn("sdk","trace payload capture failed",{cause:error2})}},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let result=messages;if(backgroundDigest.pending.length>0){let drained=backgroundDigest.pending.splice(0);result=injectAfterLastUserMessage(result,{role:"user",content:["Background subagent tasks settled:",...drained.map(line=>`- ${line}`)].join(`
|
|
1069
|
+
`)}}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}setDefaultStreamFn(streamSimple);var AGENT_TASK_SETTLED_STATUSES=new Set(["queued","admitted","running","succeeded","failed","cancelled","timed_out","drain_timeout","runner_lost"]);function parseAgentTaskSettledDigestLine(line){let parsed;try{parsed=JSON.parse(line)}catch{return}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let record=parsed;if(!(typeof record.taskId!="string"||record.taskId==="")&&!(typeof record.sessionId!="string"||record.sessionId==="")&&!(typeof record.status!="string"||!AGENT_TASK_SETTLED_STATUSES.has(record.status))&&!(record.reasonCode!==void 0&&(typeof record.reasonCode!="string"||record.reasonCode==="")))return{taskId:record.taskId,taskSessionId:record.sessionId,status:record.status,...record.reasonCode===void 0?{}:{reasonCode:record.reasonCode}}}function deliverAgentTaskSettledDigestLine(session,line,hostLogger){let facts=parseAgentTaskSettledDigestLine(line);if(facts===void 0){hostLogger?.warn("sdk","background delegation settlement line is not a valid agent.task.settled source",{cause:line});return}session?.dispatchAgentTaskSettled(facts)}var OBSERVABILITY_PACKAGE_ID="agent-forge.plugin.observability",SUBAGENT_DELEGATE_PACKAGE_ID="agent-forge.plugin.subagent-delegate",MEMORY_PACKAGE_ID="agent-forge.plugin.memory",isMemoryModeV1=value=>value==="off"||value==="light"||value==="full";function resolveSdkMemoryMode(explicitMode,env2,settingsMode){if(explicitMode!==void 0)return isMemoryModeV1(explicitMode)?{mode:explicitMode}:{mode:"off",invalidEnvValue:explicitMode};let configured=env2.AGENT_FORGE_MEMORY_MODE?.trim().toLowerCase();if(configured!==void 0&&configured!=="")return isMemoryModeV1(configured)?{mode:configured}:{mode:"off",invalidEnvValue:configured};let fromSettings=settingsMode?.trim().toLowerCase();if(fromSettings!==void 0&&fromSettings!=="")return isMemoryModeV1(fromSettings)?{mode:fromSettings}:{mode:"off",invalidSettingsValue:fromSettings};let legacy=env2.AGENT_FORGE_MEMORY_VECTOR?.trim().toLowerCase();return legacy!==void 0&&legacy!==""?isMemoryModeV1(legacy)?{mode:legacy}:{mode:"off",invalidEnvValue:legacy}:{mode:"off"}}function getDefaultAgentDir(){return getAgentDir()}function injectAfterLastUserMessage(messages,injection){for(let index3=messages.length-1;index3>=0;index3-=1)if(messages[index3]?.role==="user")return[...messages.slice(0,index3+1),injection,...messages.slice(index3+1)];return messages}async function readCapabilityPluginManifestForOrdering(manifestPath){let raw;try{raw=JSON.parse(await readFile9(manifestPath,"utf8"))}catch(error2){throw new Error(`Failed to read capability plugin manifest ${manifestPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}return parseCapabilityPluginManifest(raw,manifestPath)}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join49(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join49(agentDir,"models.json"):void 0,modelRuntime=options.modelRuntime??await ModelRuntime.create({authPath,modelsPath,credentials:options.credentials}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),suiteId=resolveSuiteId({explicit:options.suite,envSuite:process.env[SUITE_ENV_VAR],settings:settingsManager,agentDir}),suiteAssembly=createSuiteAssembly({cwd,agentDir,suiteId,pluginProfileId:options.pluginProfileId,selectedPluginIds:options.selectedPluginIds,disabledPluginIds:options.disabledPluginIds,pluginHost:options.pluginHost,verifiedPlugins:options.verifiedPlugins,manifestOverrides:options.manifestOverrides,pluginProfile:options.pluginProfile}),suiteWorkspace=suiteAssembly.workspace,resolvedAgentProfile=buildResolvedAgentProfileV1({suiteId,workspace:suiteWorkspace,...suiteAssembly.pluginProfile===void 0?{}:{pluginProfile:suiteAssembly.pluginProfile}}),capabilityWiring=options.suiteCapabilityWiring??!options.resourceLoader,capabilityDiagnostics=[],suitePreferenceDiagnostics=[],capabilitySkillsFilter,communicationMailbox,selfMailbox=()=>(communicationMailbox??=createSubagentMailbox({agentDir,ownerParentSessionId:()=>agentSessionRef.current?.sessionId}),communicationMailbox),communicationWiring=options.enableAgentTasks===!1&&options.subagentCommunicationWiring===void 0?void 0:{drainEscalations:sessionId=>selfMailbox().drainEscalations(sessionId),...options.subagentCommunicationWiring??{}},backgroundDigest={pending:[]},settingsMemoryMode=settingsManager.getMemoryModeSetting(),memoryModeOption=options.memoryCapability?.mode,memoryModeResolution=resolveSdkMemoryMode(memoryModeOption,process.env,settingsMemoryMode);if(capabilityWiring){suiteWorkspace.suite.capabilities.includes("builtin.memory")&&(memoryModeResolution.invalidEnvValue!==void 0&&capabilityDiagnostics.push(`invalid AGENT_FORGE_MEMORY_MODE value "${memoryModeResolution.invalidEnvValue}"; memory stays off (fail-closed)`),memoryModeResolution.invalidSettingsValue!==void 0&&capabilityDiagnostics.push(`invalid memory.mode setting "${memoryModeResolution.invalidSettingsValue}"; memory stays off (fail-closed)`),memoryModeResolution.mode==="off"&&capabilityDiagnostics.push("memory disabled (mode=off) \u2014 set memory.mode (light|full) in settings.json to enable"));let suiteDefinition=suiteWorkspace.suite,suiteLocalSkillsDir=suiteAssembly.localSkillsDir;capabilitySkillsFilter=skills=>filterSuiteSkills(suiteDefinition,skills,{localSkillsDir:suiteLocalSkillsDir}).kept}let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),hostLogger=options.hostLogger,traceOptions=options.traceOptions,observabilityCapture={},observabilityLogMirror={},observabilityGetMetrics={},traceService;options.traceEnabled!==!1&&(traceService={adapter:{getTraceFilePath:()=>{let sessionFilePath=sessionManager.getSessionFile();return sessionFilePath===void 0?null:getTraceFilePathForSession(sessionFilePath)},captureProviderPayload:(payload2,model2)=>{observabilityCapture.current?.(payload2,model2)},onSinkFailure:error2=>{hostLogger?.error("observability","trace sink failure",{cause:error2})},getTurnCorrelationId:()=>agentSessionRef.current?.getTurnCorrelationId(),getParentAgentSessionId:()=>sessionManager.getHeader()?.parentAgentSession,getParentTraceId:()=>sessionManager.getHeader()?.parentTraceId,registerFacade:facade=>{observabilityCapture.current=facade?.captureProviderPayload,observabilityLogMirror.current=facade?.mirrorPluginLog,observabilityGetMetrics.current=facade?.getMetrics}},...traceOptions===void 0?{}:{options:traceOptions}}),resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager,...suiteAssembly.loaderOverrides,...suiteAssembly.localSkillsDir===void 0?{}:{additionalSkillPaths:[suiteAssembly.localSkillsDir]}}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,branchEntries=sessionManager.getBranch(),sessionSuiteBinding=readSessionSuiteBinding(branchEntries),hasConversation=branchEntries.some(entry=>entry.type==="message"&&entry.message?.role==="user");if(hasConversation&&sessionSuiteBinding!==void 0&&!options.allowSuiteRebind){if(sessionSuiteBinding.suiteId!==suiteId)throw new SuiteRebindError(`Session is bound to suite "${sessionSuiteBinding.suiteId}" and cannot resume with "${suiteId}"; rerun with --rebind-suite to adopt the new suite, or create a new session`);if(sessionSuiteBinding.profileIdentity!==void 0&&!profileIdentitiesCompatible(sessionSuiteBinding.profileIdentity,suiteWorkspace.identity))throw new SuiteRebindError("Session Profile identity drift detected (the active plugin set changed since the conversation started); rerun with --rebind-suite to adopt the new plugin set, or create a new session")}let hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,modelFallbackMessage;if(!model&&hasExistingSession&&existingSession.model){let restoredModel=modelRuntime.getModel(existingSession.model.provider,existingSession.model.modelId);restoredModel&&modelRuntime.hasConfiguredAuth(restoredModel.provider)&&(model=restoredModel),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}let suiteModelPreference=suiteWorkspace.suite.model;if(!model&&suiteModelPreference!==null){let suiteModel=findExactModelReferenceMatch(suiteModelPreference,[...modelRuntime.getModels()]);suiteModel&&modelRuntime.hasConfiguredAuth(suiteModel.provider)?model=suiteModel:suitePreferenceDiagnostics.push(`Suite "${suiteId}" model "${suiteModelPreference}" does not resolve to an authenticated model; using the normal model resolution instead.`)}model||(model=(await findInitialModel({scopedModels:[],isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime})).model,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage());let thinkingLevel=options.thinkingLevel;thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel);let suiteThinkingPreference=suiteWorkspace.suite.thinking;if(thinkingLevel===void 0&&suiteThinkingPreference!==null&&(isValidThinkingLevel(suiteThinkingPreference)?thinkingLevel=suiteThinkingPreference:suitePreferenceDiagnostics.push(`Suite "${suiteId}" thinking "${suiteThinkingPreference}" is not a valid thinking level; using the normal thinking resolution instead.`)),thinkingLevel===void 0&&hasExistingSession&&(thinkingLevel=settingsManager.getDefaultThinkingLevel()??DEFAULT_THINKING_LEVEL),thinkingLevel===void 0&&model){let perModel=settingsManager.getModelThinkingLevel(model.provider,model.id);perModel&&(thinkingLevel=perModel)}thinkingLevel===void 0&&(thinkingLevel=settingsManager.getDefaultThinkingLevel()??DEFAULT_THINKING_LEVEL),model?thinkingLevel=clampThinkingLevel(model,thinkingLevel):thinkingLevel="off";let defaultActiveToolNames=options.capabilityMode==="readonly"?["read","grep","find","ls"]:["read","bash","edit","write"],configuredDefaultToolNames=settingsManager.getDefaultTools(),allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=((options.tools===void 0&&options.noTools===void 0&&options.capabilityMode!=="readonly"?[...suiteWorkspace.suite.tools]:void 0)??options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,convertToLlmWithBlockImages=messages=>{let converted=convertToLlm2(messages);return settingsManager.getBlockImages()?converted.map(msg=>{if(msg.role==="user"||msg.role==="toolResult"){let content=msg.content;if(Array.isArray(content)&&content.some(c2=>c2.type==="image")){let filteredContent=content.map(c2=>c2.type==="image"?{type:"text",text:"Image reading is disabled."}:c2).filter((c2,i,arr)=>!(c2.type==="text"&&c2.text==="Image reading is disabled."&&i>0&&arr[i-1].type==="text"&&arr[i-1].text==="Image reading is disabled."));return{...msg,content:filteredContent}}}return msg}):converted},agentSessionRef={},customStreamFn=options.streamFn;agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:customStreamFn?(model2,context,streamOptions)=>customStreamFn(model2,context,streamOptions):async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs();try{return modelRuntime.streamSimple(model2,context,{...options2,timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??providerRetrySettings.maxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let session2=agentSessionRef.current;if(!session2)throw new Error("Capability runtime is not initialized for provider request");return session2.getCapabilityRuntime().transformProviderHeaders({model:model2,...options2?.sessionId===void 0?{}:{sessionId:options2.sessionId},headers:requestHeaders})}})}catch(error2){throw hostLogger?.error("sdk","provider stream failed",{cause:error2}),error2}},onPayload:async(payload2,model2)=>{try{traceService?.adapter.captureProviderPayload(payload2,model2?.id)}catch(error2){hostLogger?.warn("sdk","trace payload capture failed",{cause:error2})}},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let result=messages;if(backgroundDigest.pending.length>0){let drained=backgroundDigest.pending.splice(0);result=injectAfterLastUserMessage(result,{role:"user",content:["Background subagent tasks settled:",...drained.map(line=>`- ${line}`)].join(`
|
|
1070
1070
|
`),timestamp:Date.now()})}return result},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs}),hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel));let session=new AgentSession({agent,sessionManager,settingsManager,cwd,scopedModels:options.scopedModels,resourceLoader,customTools:options.customTools,modelRuntime,initialActiveToolNames,allowedToolNames,excludedToolNames,sessionStartEvent:options.sessionStartEvent,capabilityMode:options.capabilityMode,contextStrategyName:options.contextStrategyName,retryPolicyName:options.retryPolicyName,compactionPolicyName:options.compactionPolicyName,overflowPolicyName:options.overflowPolicyName,branchSummaryPolicyName:options.branchSummaryPolicyName,runLoopStrategyName:options.runLoopStrategyName,agentTaskAdapter:options.enableAgentTasks===!1?void 0:options.agentTaskAdapter,...options.agentTaskResults===void 0?{}:{agentTaskResults:options.agentTaskResults},...options.enableAgentTasks===!1?{}:{agentSessionReader:async sessionId=>{let parentSession=agentSessionRef.current;if(parentSession===void 0)return;let read=readAgentSession({agentDir,sessionId});if(!(read===void 0||read.parentAgentSession!==parentSession.sessionId))return{sessionId:read.sessionId,...read.parentAgentSession===void 0?{}:{parentAgentSession:read.parentAgentSession},...read.agentRole===void 0?{}:{agentRole:read.agentRole},...read.createdAt===void 0?{}:{createdAt:read.createdAt},bytes:read.bytes,entryCount:read.entryCount,truncated:read.truncated,entries:read.entries}},agentSessionLister:async()=>{let parentSession=agentSessionRef.current;return parentSession===void 0?[]:listAgentSessions({agentDir,parentAgentSession:parentSession.sessionId}).map(summary=>({sessionId:summary.sessionId,...summary.agentRole===void 0?{}:{agentRole:summary.agentRole},...summary.createdAt===void 0?{}:{createdAt:summary.createdAt},modifiedAt:summary.modifiedAt,bytes:summary.bytes}))}},agentComposition:options.agentComposition,interactionHost:options.interactionHost,hostLogger:options.hostLogger,logRecordMirrorRef:observabilityLogMirror,observabilityGetMetricsRef:observabilityGetMetrics,agentDir,...communicationWiring===void 0?{}:{communication:communicationWiring},...options.enableAgentTasks===!1?{}:{turnContext:{backgroundDigestSink:line=>{backgroundDigest.pending.length>=20&&backgroundDigest.pending.shift(),backgroundDigest.pending.push(line),deliverAgentTaskSettledDigestLine(agentSessionRef.current,line,hostLogger)},getTurnCorrelationId:()=>agentSessionRef.current?.getTurnCorrelationId()}},...options.enableAgentTasks===!1?{}:{roleAssociations:suiteWorkspace.suite.associations.roles},...traceService===void 0?{}:{traceService},...options.memoryCapability?.storage===void 0?{}:{memoryStorage:options.memoryCapability.storage},orientationPrompt:ORIENTATION_PROMPTS[suiteWorkspace.suite.orientation],...capabilitySkillsFilter===void 0?{}:{capabilitySkillsFilter}});agentSessionRef.current=session,(!hasExistingSession||sessionSuiteBinding!==void 0&&!hasConversation||options.allowSuiteRebind)&&session.sessionManager.appendCustomEntry(SUITE_SESSION_ENTRY_TYPE,{suiteId,profileIdentity:suiteWorkspace.identity});let pluginRejections=[],recordRejection=async(code,manifestPath,pluginId,message)=>{let rejection=Object.freeze({code,manifestPath,...pluginId===void 0?{}:{pluginId},message});pluginRejections.push(rejection),hostLogger?.error("sdk",`capability plugin rejected: ${message}`,{sessionId:session.sessionId,fields:{code:rejection.code,pluginId:rejection.pluginId,manifestPath:rejection.manifestPath}});try{await session.getCapabilityRuntime().recordPluginRejection(rejection)}catch{}},rejectionMessage=error2=>error2 instanceof Error?error2.message:String(error2);try{let discoveredManifestPaths=options.discoverCapabilityPlugins===!1?[]:discoverCapabilityPluginManifests([join49(agentDir,"plugins"),join49(cwd,CONFIG_DIR_NAME,"plugins")]),suiteLocalManifestPaths=capabilityWiring&&options.discoverCapabilityPlugins!==!1&&suiteAssembly.localPluginsDir!==void 0?discoverCapabilityPluginManifests([suiteAssembly.localPluginsDir]):[],disabledPluginIdSet=new Set(options.disabledPluginIds??[]),profilePluginIds=suiteAssembly.pluginProfile!==void 0&&suiteAssembly.pluginProfile.status==="resolved"?new Set(suiteAssembly.pluginProfile.profile.pluginIds.filter(pluginId=>!disabledPluginIdSet.has(pluginId))):new Set,passthroughCapabilityPluginIds=[],capabilityPackageIds=suiteWorkspace.suite.capabilities.flatMap(entry=>{let mappedPluginId=BUILTIN_CAPABILITY_PACKAGE_IDS[entry];return mappedPluginId!==void 0?[mappedPluginId]:(passthroughCapabilityPluginIds.push(entry),[entry])});if(options.traceEnabled!==!1&&capabilityPackageIds.push(OBSERVABILITY_PACKAGE_ID),memoryModeResolution.mode==="off"){let memoryIndex=capabilityPackageIds.indexOf(MEMORY_PACKAGE_ID);memoryIndex>=0&&capabilityPackageIds.splice(memoryIndex,1)}for(let pluginId of capabilityPackageIds)disabledPluginIdSet.has(pluginId)||profilePluginIds.add(pluginId);if(capabilityWiring&&passthroughCapabilityPluginIds.length>0){let installedPluginIdSet=new Set((options.installedCapabilityPlugins??[]).map(plugin=>plugin.pluginId));for(let pluginId of passthroughCapabilityPluginIds)installedPluginIdSet.has(pluginId)||capabilityDiagnostics.push(`Suite "${suiteId}" capability "${pluginId}" has no installed active plugin; install it with agent-forge plugin install or remove the declaration`)}let installedPluginManifestPaths=[],skippedInstalledPluginIds=[];for(let plugin of options.installedCapabilityPlugins??[])profilePluginIds.has(plugin.pluginId)?installedPluginManifestPaths.push(plugin.manifestPath):skippedInstalledPluginIds.push(plugin.pluginId);skippedInstalledPluginIds.length>0&&capabilityDiagnostics.push(`Installed capability plugins stay unloaded because the active profile did not select them: ${skippedInstalledPluginIds.sort().join(", ")}`);let manifestPaths=[...suiteLocalManifestPaths,...installedPluginManifestPaths,...discoveredManifestPaths,...options.capabilityPluginPaths??[]],explicitCandidatePaths=new Set([...suiteLocalManifestPaths,...installedPluginManifestPaths,...options.capabilityPluginPaths??[]]),loadedManifestPaths=new Set,explicitManifestPaths=new Set,candidatePaths=[];for(let manifestPath of manifestPaths){let resolvedManifestPath=resolve18(cwd,manifestPath),manifestIdentity=existsSync22(resolvedManifestPath)?realpathSync4(resolvedManifestPath):resolvedManifestPath;loadedManifestPaths.has(manifestIdentity)||(loadedManifestPaths.add(manifestIdentity),explicitCandidatePaths.has(manifestPath)&&explicitManifestPaths.add(manifestIdentity),candidatePaths.push(manifestIdentity))}let manifestEntries=[];for(let manifestPath of candidatePaths)try{let manifest=await readCapabilityPluginManifestForOrdering(manifestPath);if(manifest.hostVersion!==void 0){if(!(0,import_semver5.satisfies)(VERSION,manifest.hostVersion)){await recordRejection("host_version_incompatible",manifestPath,manifest.id,`Plugin ${manifest.id} declares host version range "${manifest.hostVersion}", but the host is ${VERSION}. Upgrade the host into the declared range, or install a plugin version that supports host ${VERSION}.`);continue}}else capabilityDiagnostics.push(`Capability plugin ${manifest.id} (${manifestPath}) does not declare "hostVersion"; it loads, but published plugins must declare a host semver range (e.g. ">=${VERSION}").`);manifestEntries.push({path:manifestPath,manifest})}catch(error2){await recordRejection("invalid_manifest",manifestPath,void 0,rejectionMessage(error2))}let poolFilter=capabilityWiring?{suite:suiteWorkspace.suite,decide:(manifestId,manifestPath)=>decideSuiteCapabilityPlugin(suiteWorkspace.suite,{manifestId,manifestPath},{cwd})}:void 0,seenPluginIds=new Set,uniqueEntries=[],discoveredPluginIds=[];for(let entry of manifestEntries){if(discoveredPluginIds.push(entry.manifest.id),poolFilter&&!explicitManifestPaths.has(entry.path)){let decision=poolFilter.decide(entry.manifest.id,entry.path);if(!decision.keep){decision.diagnostic&&capabilityDiagnostics.push(decision.diagnostic);continue}}if(seenPluginIds.has(entry.manifest.id)){await recordRejection("duplicate_plugin_id",entry.path,entry.manifest.id,`Capability plugin is already loaded: ${entry.manifest.id}; the first manifest in discovery order wins`);continue}seenPluginIds.add(entry.manifest.id),uniqueEntries.push(entry)}poolFilter&&capabilityDiagnostics.push(...suiteDanglingPluginAssociations(poolFilter.suite,discoveredPluginIds));let capabilityIdentity=(id,version)=>`${id}\0${version}`,survivors=new Set(uniqueEntries),removedInLastPass=!0;for(;removedInLastPass;){removedInLastPass=!1;let providers=new Set;for(let entry of survivors)for(let declaration of entry.manifest.provides??[])providers.add(capabilityIdentity(declaration.id,declaration.version));for(let entry of[...survivors]){let missing=(entry.manifest.requires??[]).filter(requirement=>!requirement.optional&&!providers.has(capabilityIdentity(requirement.id,requirement.version)));missing.length!==0&&(await recordRejection("missing_dependency",entry.path,entry.manifest.id,`Plugin capability is required but unavailable: ${missing.map(requirement=>`${requirement.id}@${requirement.version}`).join(", ")} (${entry.manifest.id})`),survivors.delete(entry),removedInLastPass=!0)}}let pathByManifest=new Map([...survivors].map(entry=>[entry.manifest,entry.path]));for(let manifest of resolvePluginCapabilityOrder([...survivors].map(entry=>entry.manifest))){let manifestPath=pathByManifest.get(manifest);if(!manifestPath)throw new Error(`Capability plugin manifest path is unavailable: ${manifest.id}`);try{await session.loadCapabilityPluginManifest(manifestPath,{...manifest.id===SUBAGENT_DELEGATE_PACKAGE_ID&&options.subagentPoolFromSelfInvocation===!0?{configOverride:{runnerEntryAuto:!0}}:{},...manifest.id===MEMORY_PACKAGE_ID?{configOverride:{...memoryModeOption===void 0?{}:{memoryMode:memoryModeOption},...settingsMemoryMode===void 0?{}:{memorySettingsMode:settingsMemoryMode}}}:{}})}catch(error2){await recordRejection("plugin_load_failed",manifestPath,manifest.id,rejectionMessage(error2))}}hasExistingSession&&options.contextStrategyName&&await session.replaceContext(existingSession.messages)}catch(error2){throw await session.dispose(),error2}return hostLogger?.info("sdk","agent session created",{sessionId:session.sessionId,fields:{suite:suiteId,...model===void 0?{}:{model:`${model.provider}/${model.id}`},trace:options.traceEnabled!==!1}}),{session,modelFallbackMessage,pluginRejections:Object.freeze(pluginRejections.slice()),suiteDiagnostics:Object.freeze([...suiteAssembly.collectDiagnostics(),...capabilityDiagnostics,...suitePreferenceDiagnostics]),...suiteAssembly.pluginProfile===void 0?{}:{pluginProfile:suiteAssembly.pluginProfile},resolvedAgentProfile}}async function createStableAgentSession(options={}){let result=await createAgentSession(options);return{facade:createCodingAgentFacade(result.session),sessionAPI:result.session.getSessionAPI(),modelFallbackMessage:result.modelFallbackMessage}}async function createStableAgentSessionRuntime(createRuntime,options){let runtime=await createAgentSessionRuntime(createRuntime,options);return{runtimeFacade:createCodingAgentRuntimeFacade(runtime)}}var MCP_CONFIG_FILENAME="mcp.json",MCP_POOL_DIR="mcp/pool",MCP_POOL_BRIDGE_DIR="_bridge",MCP_SERVER_NAME_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,MCP_HTTP_PLUGIN_SOURCE_PATH=fileURLToPath5(new URL("../plugins/mcp-http.ts",import.meta.url)),MCP_HTTP_PLUGIN_DIST_PATH=fileURLToPath5(new URL("../../dist/plugins/mcp-http.js",import.meta.url));function isHttpUrl(value){try{let protocol=new URL(value).protocol;return protocol==="http:"||protocol==="https:"}catch{return!1}}function parseMcpConfig(path15){let servers=new Map,diagnostics=[],value;try{value=JSON.parse(readFileSync20(path15,"utf8"))}catch(error2){return error2.code==="ENOENT"?{servers,diagnostics}:(diagnostics.push(`MCP config at ${path15} is unreadable; ignoring it. Errors: ${error2 instanceof Error?error2.message:String(error2)}`),{servers,diagnostics})}if(typeof value!="object"||value===null||Array.isArray(value))return diagnostics.push(`MCP config at ${path15} must be an object with an "mcpServers" map; ignoring it.`),{servers,diagnostics};let mcpServers=value.mcpServers;if(mcpServers===void 0)return{servers,diagnostics};if(typeof mcpServers!="object"||mcpServers===null||Array.isArray(mcpServers))return diagnostics.push(`MCP config at ${path15} must carry an "mcpServers" object; ignoring it.`),{servers,diagnostics};for(let[name,entry]of Object.entries(mcpServers)){if(!MCP_SERVER_NAME_PATTERN.test(name)){diagnostics.push(`MCP server name "${name}" in ${path15} is invalid (must match ${MCP_SERVER_NAME_PATTERN.source}); ignoring it.`);continue}if(typeof entry!="object"||entry===null||Array.isArray(entry)){diagnostics.push(`MCP server "${name}" in ${path15} must be an object with a "command" or "url"; ignoring it.`);continue}let config=entry;if(config.url!==void 0&&(typeof config.url!="string"||config.url.trim().length===0)){diagnostics.push(`MCP server "${name}" in ${path15} requires "url" to be a non-empty string; ignoring it.`);continue}let hasCommand=typeof config.command=="string"&&config.command.trim().length>0,hasUrl=typeof config.url=="string"&&config.url.trim().length>0;if(hasCommand&&hasUrl){diagnostics.push(`MCP server "${name}" in ${path15} accepts either "command" (stdio server) or "url" (remote HTTP server), not both; ignoring it.`);continue}if(!hasCommand&&!hasUrl){diagnostics.push(`MCP server "${name}" in ${path15} requires a non-empty string "command" (stdio server) or "url" (remote HTTP server); ignoring it.`);continue}if(hasUrl&&!isHttpUrl(config.url)){diagnostics.push(`MCP server "${name}" in ${path15} requires "url" to be a valid http:// or https:// URL; ignoring it.`);continue}if(config.args!==void 0&&(!Array.isArray(config.args)||!config.args.every(arg=>typeof arg=="string"))){diagnostics.push(`MCP server "${name}" in ${path15} requires "args" to be a string array; ignoring it.`);continue}if(config.deferredTools!==void 0&&typeof config.deferredTools!="boolean"){diagnostics.push(`MCP server "${name}" in ${path15} requires "deferredTools" to be a boolean; ignoring it.`);continue}if(config.headers!==void 0){if(hasCommand)diagnostics.push(`MCP server "${name}" in ${path15} carries "headers" but headers only apply to remote "url" (HTTP) servers; ignoring them.`);else if(!(typeof config.headers=="object"&&config.headers!==null&&!Array.isArray(config.headers)&&Object.values(config.headers).every(headerValue=>typeof headerValue=="string"&&headerValue.length>0))){diagnostics.push(`MCP server "${name}" in ${path15} requires "headers" to be an object with non-empty string values; ignoring it.`);continue}}servers.set(name,{args:config.args??[],deferredTools:config.deferredTools===!0?!0:void 0,...hasCommand?{command:config.command}:{url:config.url,...config.headers===void 0?{}:{headers:config.headers}}})}return{servers,diagnostics}}var MCP_POOL_BRIDGE_SOURCE=`// Generated by the suite MCP registration pool (agent-session-services). Do not edit.
|
|
1071
1071
|
import { spawn } from 'node:child_process';
|
|
1072
1072
|
import { existsSync } from 'node:fs';
|