@@ -179,9 +179,7 @@ import {
179179 buildEmptyExplicitToolAllowlistError ,
180180 collectExplicitToolAllowlistSources ,
181181} from "../../tool-allowlist-guard.js" ;
182- import {
183- filterRuntimeCompatibleTools ,
184- } from "../../tool-schema-projection.js" ;
182+ import { filterRuntimeCompatibleTools } from "../../tool-schema-projection.js" ;
185183import { logRuntimeToolSchemaQuarantine } from "../../tool-schema-quarantine.js" ;
186184import {
187185 addClientToolsToToolSearchCatalog ,
@@ -266,6 +264,7 @@ import {
266264} from "../tool-result-context-guard.js" ;
267265import {
268266 resolveLiveToolResultMaxChars ,
267+ truncateOversizedToolResultsInMessages ,
269268 truncateOversizedToolResultsInSessionManager ,
270269} from "../tool-result-truncation.js" ;
271270import { splitSdkTools } from "../tool-split.js" ;
@@ -460,6 +459,7 @@ export {
460459} ;
461460
462461const MAX_BTW_SNAPSHOT_MESSAGES = 100 ;
462+ const PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER = 4 ;
463463
464464function summarizeMessagePayload ( msg : AgentMessage ) : { textChars : number ; imageBlocks : number } {
465465 const content = ( msg as { content ?: unknown } ) . content ;
@@ -3434,6 +3434,31 @@ export async function runEmbeddedAttempt(
34343434 activeSession . agent . state . messages = filteredMessages ;
34353435 }
34363436 prePromptMessageCount = activeSession . messages . length ;
3437+ const contextTokenBudget = params . contextTokenBudget ?? DEFAULT_CONTEXT_TOKENS ;
3438+ const promptToolResultMaxChars = resolveLiveToolResultMaxChars ( {
3439+ contextWindowTokens : contextTokenBudget ,
3440+ cfg : params . config ,
3441+ agentId : sessionAgentId ,
3442+ } ) ;
3443+ let promptHistoryMessages = activeSession . messages ;
3444+ const promptToolResultTruncation = truncateOversizedToolResultsInMessages (
3445+ activeSession . messages ,
3446+ contextTokenBudget ,
3447+ promptToolResultMaxChars ,
3448+ promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER ,
3449+ ) ;
3450+ if ( promptToolResultTruncation . truncatedCount > 0 ) {
3451+ promptHistoryMessages = promptToolResultTruncation . messages ;
3452+ log . info (
3453+ `[tool-result-truncation] Truncated ${ promptToolResultTruncation . truncatedCount } ` +
3454+ `tool result(s) for prompt history ` +
3455+ `(maxChars=${ promptToolResultMaxChars } ` +
3456+ `aggregateBudgetChars=${
3457+ promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER
3458+ } ) ` +
3459+ `sessionKey=${ params . sessionKey ?? params . sessionId ?? "unknown" } ` ,
3460+ ) ;
3461+ }
34373462
34383463 const promptSubmission = resolveRuntimeContextPromptParts ( {
34393464 effectivePrompt : promptForRuntimeContextSplit ,
@@ -3470,8 +3495,8 @@ export async function runEmbeddedAttempt(
34703495 const runtimeContextMessageForCurrentTurn =
34713496 buildRuntimeContextCustomMessage ( runtimeContextForHook ) ;
34723497 const messagesForCurrentPrompt = runtimeContextMessageForCurrentTurn
3473- ? [ ...activeSession . messages , runtimeContextMessageForCurrentTurn ]
3474- : activeSession . messages ;
3498+ ? [ ...promptHistoryMessages , runtimeContextMessageForCurrentTurn ]
3499+ : promptHistoryMessages ;
34753500 const hookMessagesForCurrentPrompt = normalizeMessagesForCurrentPromptBoundary ( {
34763501 messages : messagesForCurrentPrompt ,
34773502 prompt : promptForModel ,
@@ -3705,7 +3730,6 @@ export async function runEmbeddedAttempt(
37053730 const promptLen = effectivePrompt . length ;
37063731 const sessionSummary = summarizeSessionContext ( activeSession . messages ) ;
37073732 const reserveTokens = settingsManager . getCompactionReserveTokens ( ) ;
3708- const contextTokenBudget = params . contextTokenBudget ?? DEFAULT_CONTEXT_TOKENS ;
37093733 emitTrustedDiagnosticEvent ( {
37103734 type : "context.assembled" ,
37113735 runId : params . runId ,
@@ -3789,11 +3813,7 @@ export async function runEmbeddedAttempt(
37893813 prompt : promptForModel ,
37903814 contextTokenBudget,
37913815 reserveTokens,
3792- toolResultMaxChars : resolveLiveToolResultMaxChars ( {
3793- contextWindowTokens : contextTokenBudget ,
3794- cfg : params . config ,
3795- agentId : sessionAgentId ,
3796- } ) ,
3816+ toolResultMaxChars : promptToolResultMaxChars ,
37973817 } ) ;
37983818 if ( preemptiveCompaction ) {
37993819 contextBudgetStatus = buildPrePromptContextBudgetStatus ( {
@@ -3901,6 +3921,29 @@ export async function runEmbeddedAttempt(
39013921 if ( normalizedReplayMessages !== activeSession . messages ) {
39023922 activeSession . agent . state . messages = normalizedReplayMessages ;
39033923 }
3924+ const installProviderPromptHistoryTransform = ( ) : ( ( ) => void ) => {
3925+ const baseStreamFn = activeSession . agent . streamFn ;
3926+ const providerPromptStreamFn = wrapStreamFnWithMessageTransform (
3927+ baseStreamFn ,
3928+ ( messages ) => {
3929+ const providerPromptHistoryTruncation = truncateOversizedToolResultsInMessages (
3930+ messages ,
3931+ contextTokenBudget ,
3932+ promptToolResultMaxChars ,
3933+ promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER ,
3934+ ) ;
3935+ return providerPromptHistoryTruncation . truncatedCount > 0
3936+ ? providerPromptHistoryTruncation . messages
3937+ : messages ;
3938+ } ,
3939+ ) ;
3940+ activeSession . agent . streamFn = providerPromptStreamFn ;
3941+ return ( ) => {
3942+ if ( activeSession . agent . streamFn === providerPromptStreamFn ) {
3943+ activeSession . agent . streamFn = baseStreamFn ;
3944+ }
3945+ } ;
3946+ } ;
39043947 finalPromptText = promptForSession ;
39053948 trajectoryRecorder ?. recordEvent ( "prompt.submitted" , {
39063949 prompt : promptForModel ,
@@ -3928,6 +3971,7 @@ export async function runEmbeddedAttempt(
39283971 captureCurrentPromptForModel = true ;
39293972 }
39303973 } ;
3974+ const cleanupProviderPromptHistoryTransform = installProviderPromptHistoryTransform ( ) ;
39313975 try {
39323976 if ( promptSubmission . runtimeOnly ) {
39333977 await promptActiveSession ( promptForSession , {
@@ -3956,6 +4000,7 @@ export async function runEmbeddedAttempt(
39564000 }
39574001 }
39584002 } finally {
4003+ cleanupProviderPromptHistoryTransform ( ) ;
39594004 cleanupModelPromptTransform ( ) ;
39604005 }
39614006 }
0 commit comments