import { isEnvTruthy } from '../../utils/envUtils.js' import { isMediaSizeErrorMessage, isPromptTooLongMessage, } from '../api/errors.js' import type { AssistantMessage, Message } from '../../types/message.js' import { type CompactionResult, compactConversation } from './compact.js' import { logError } from '../../utils/log.js' import { logForDebugging } from '../../utils/debug.js' import type { CacheSafeParams } from '../../utils/forkedAgent.js' export const isReactiveOnlyMode: () => boolean = () => false export const reactiveCompactOnPromptTooLong: ( messages: Message[], cacheSafeParams: Record, options: { customInstructions?: string; trigger?: string }, ) => Promise<{ ok: boolean; reason?: string; result?: CompactionResult }> = async (messages, cacheSafeParams, options) => { const params = cacheSafeParams as unknown as CacheSafeParams try { const result = await compactConversation( messages, params.toolUseContext, params, true, options.customInstructions, true, { isRecompactionInChain: false, turnsSincePreviousCompact: 0, autoCompactThreshold: 0, querySource: 'compact', }, ) return { ok: true, result } } catch (error) { logError(error) return { ok: false, reason: String(error) } } } export const isReactiveCompactEnabled: () => boolean = () => { if (isEnvTruthy(process.env.DISABLE_COMPACT)) return false return true } export const isWithheldPromptTooLong: (message: Message) => boolean = message => { if (message.type !== 'assistant' || !message.isApiErrorMessage) return false return isPromptTooLongMessage(message as AssistantMessage) } export const isWithheldMediaSizeError: (message: Message) => boolean = message => { if (message.type !== 'assistant' || !message.isApiErrorMessage) return false return isMediaSizeErrorMessage(message as AssistantMessage) } export const tryReactiveCompact: (params: { hasAttempted: boolean querySource: string aborted: boolean messages: Message[] cacheSafeParams: Record }) => Promise = async ({ hasAttempted, aborted, messages, cacheSafeParams, }) => { if (hasAttempted || aborted) return null const params = cacheSafeParams as unknown as CacheSafeParams try { const result = await compactConversation( messages, params.toolUseContext, params, true, undefined, true, { isRecompactionInChain: false, turnsSincePreviousCompact: 0, autoCompactThreshold: 0, }, ) return result } catch (error) { logForDebugging( `reactiveCompact: emergency compaction failed — ${String(error)}`, { level: 'warn' }, ) logError(error) return null } }