import type { ModelMessage } from "ai";
import { type AlsContext } from "#context/container.js";
import { type CurrentDynamicToolMetadata } from "#context/dynamic-tool-metadata.js";
import type { HarnessToolDefinition } from "#harness/execute-tool.js";
import type { SessionStartedStreamEvent, StepStartedStreamEvent, UnstampedMessageStreamEvent } from "#protocol/message.js";
import { type DynamicToolEntry } from "#tools/dynamic.js";
import { type DynamicToolCallbackOwner, type DurableDynamicToolCallbacks } from "#tools/durable-callbacks.js";
import type { ResolvedDynamicToolResolver } from "#runtime/types.js";
/** Kept as the session-specific entry point for existing runtime consumers. */
export declare function replayDynamicSessionTools(metadata: readonly CurrentDynamicToolMetadata[], _resolvers: readonly ResolvedDynamicToolResolver[], sessionId: string): readonly HarnessToolDefinition[];
export declare function validateDurableDynamicToolCallbacks(name: string, entry: DynamicToolEntry, owner: DynamicToolCallbackOwner): DurableDynamicToolCallbacks;
/** Resolves step-scoped tools once for one internal policy/model pass. */
export declare function resolveStepDynamicTools(input: {
    readonly ctx: AlsContext;
    readonly resolvers: readonly ResolvedDynamicToolResolver[];
    readonly event: StepStartedStreamEvent;
    readonly messages: readonly ModelMessage[];
}): Promise<void>;
/** Converts persisted step metadata before any approval replay can read it. */
export declare function preparePersistedStepDynamicToolMetadata(input: {
    readonly ctx: AlsContext;
    readonly resolvers: readonly ResolvedDynamicToolResolver[];
    readonly event: StepStartedStreamEvent;
    readonly messages: readonly ModelMessage[];
}): Promise<void>;
export declare function dispatchDynamicToolEvent(input: {
    readonly ctx: AlsContext;
    readonly resolvers: readonly ResolvedDynamicToolResolver[];
    readonly event: UnstampedMessageStreamEvent;
    readonly messages: readonly ModelMessage[];
}): Promise<void>;
/**
 * Refreshes session-scoped definitions when the deployed code revision changes
 * or when persisted callbacks have no registered binding (fresh process after
 * a crash, or a redeploy), so replay always resolves against current code.
 */
export declare function refreshDynamicSessionToolsForRuntimeRevision(input: {
    readonly ctx: AlsContext;
    readonly resolvers: readonly ResolvedDynamicToolResolver[];
    readonly event: SessionStartedStreamEvent;
    readonly messages: readonly ModelMessage[];
    readonly runtimeRevision: string;
}): Promise<void>;
/** Re-registers callbacks for compiled resolvers that explicitly support cold replay. */
export declare function rebindMissingCompiledDynamicToolCallbacks(input: {
    readonly ctx: AlsContext;
    readonly event: UnstampedMessageStreamEvent;
    readonly messages: readonly ModelMessage[];
    readonly resolvers: readonly ResolvedDynamicToolResolver[];
}): Promise<void>;
