import type { ChatMessage, CompletionResult, ToolCall, ToolResult } from "../../../types.js"; import type { LoopGuardStopInfo } from "../../turn-outcome.js"; export interface SequenceBoundCall { readonly id: string; readonly index: number; readonly call: ToolCall; } export interface SequenceVerdict { readonly suppress: boolean; readonly terminal?: boolean | undefined; readonly oscillation?: boolean | undefined; } export interface SequenceSuppressionPorts { readonly messages: ChatMessage[]; readonly notify: (level: "info" | "warn", message: string) => void; readonly queuedEventId: (index: number) => string | undefined; readonly allocateEventId: () => string; readonly writeToolCall: (eventId: string, call: ToolCall) => void; readonly markPrinted: (eventId: string) => void; readonly emitToolStart: (eventId: string) => void; readonly writeToolOutput: (eventId: string, chunk: string) => void; readonly emitToolResult: (eventId: string, result: ToolResult, contextOutput: string) => void; readonly priorObservation: (call: ToolCall) => string | undefined; readonly pushAssistantHistory: (text: string) => void; readonly upsertActionCycleRecovery: (content: string) => void; readonly unreadResponderResults: () => boolean; readonly currentSignature: () => string | undefined; } export interface SequenceSuppressionInput { readonly verdict: SequenceVerdict; readonly bound: readonly SequenceBoundCall[]; readonly runIds: ReadonlySet; readonly deferReason: string; readonly beforeTool: string | undefined; readonly historyNativeCalls: readonly { id: string; name: string; args: Record; }[]; readonly completion: Pick; readonly assistantThinkContent: string; readonly hasThinking: boolean; } export interface SequenceStop { readonly kind: "stop"; readonly answer: string; readonly remainingCriteria: readonly string[]; readonly reason: string; readonly loopGuardStop: LoopGuardStopInfo; } export type SequenceSuppressionDecision = { readonly kind: "continue-round"; } | SequenceStop; export declare const suppressRepeatedActionSequence: (ports: SequenceSuppressionPorts, input: SequenceSuppressionInput) => SequenceSuppressionDecision;