import type { NormalizedAiUsage } from './usage.js'; export type AiOperation = 'generate' | 'embed' | 'rerank' | 'moderate' | 'transcribe' | 'synthesize' | 'other'; export type AiFinishReason = 'stop' | 'length' | 'tool_call' | 'content_filter' | 'error' | 'cancelled' | 'unknown'; export type AiScalar = string | number | boolean | null; export interface AiPayloadDescriptor { schemaVersion: number; sha256: string; /** Protected payload reference. Raw payload bytes never enter ledger metadata. */ ref?: string; } export interface AiPriceSnapshot { currency: string; source: string; version: string; estimatedCostNanos?: number; settledCostNanos?: number; } export interface AiRetryAndRateLimit { retryCount?: number; retryAfterMs?: number; limit?: number; remaining?: number; resetAt?: Date; } export interface AiProviderExtension { schemaVersion: number; fields: Record; } export interface StartAiInvocation { invocationId?: string; idempotencyKey?: string; providerFamily: string; modelIdentifier: string; modelRevision?: string; operation: AiOperation; prompt: AiPayloadDescriptor; parameters: AiPayloadDescriptor; promptTemplateId?: string; promptTemplateVersion?: string; toolDefinitions?: { version: string; sha256: string; }; providerExtension?: AiProviderExtension; startedAt?: Date; } export interface CompleteAiInvocation { response?: AiPayloadDescriptor; finishReason?: AiFinishReason; usage?: NormalizedAiUsage; price?: AiPriceSnapshot; latencyMs?: number; retry?: AiRetryAndRateLimit; providerExtension?: AiProviderExtension; completedAt?: Date; } export interface StartAiToolEffect { toolCallId: string; toolName: string; toolVersion: string; arguments: AiPayloadDescriptor; requestedAt?: Date; } export interface CompleteAiToolEffect { result?: AiPayloadDescriptor; completedAt?: Date; } export type AiInvocationTransitionStatus = 'started' | 'succeeded' | 'failed' | 'outcome_unknown'; export type AiToolEffectTransitionStatus = 'requested' | 'succeeded' | 'failed' | 'outcome_unknown'; export interface AiInvocationTransitionRecord { schemaVersion: 1; invocationId: string; idempotencyKey: string; status: AiInvocationTransitionStatus; providerFamily: string; modelIdentifier: string; modelRevision?: string; operation: AiOperation; promptTemplateId?: string; promptTemplateVersion?: string; prompt: AiPayloadDescriptor; parameters: AiPayloadDescriptor; response?: AiPayloadDescriptor; finishReason?: AiFinishReason; usage: NormalizedAiUsage; price?: AiPriceSnapshot; latencyMs?: number; retry: AiRetryAndRateLimit; toolDefinitions?: { version: string; sha256: string; }; providerExtension?: AiProviderExtension; startedAt: Date; completedAt?: Date; } export interface AiToolEffectTransitionRecord { invocationId: string; toolCallId: string; toolName: string; toolVersion: string; status: AiToolEffectTransitionStatus; arguments: AiPayloadDescriptor; result?: AiPayloadDescriptor; requestedAt: Date; completedAt?: Date; } export interface AiMutationSender { recordInvocation(record: AiInvocationTransitionRecord, transitionEventId: string, transitionIdempotencyKey: string): Promise; recordToolEffect(record: AiToolEffectTransitionRecord, transitionEventId: string, transitionIdempotencyKey: string): Promise; } export declare function beginAiInvocation(input: StartAiInvocation, sender: AiMutationSender, newId: () => string): Promise; export declare class AiInvocationHandle { private readonly started; private readonly sender; private readonly newId; private terminal; constructor(started: AiInvocationTransitionRecord, sender: AiMutationSender, newId: () => string); get invocationId(): string; succeed(outcome?: CompleteAiInvocation): Promise; fail(outcome?: CompleteAiInvocation): Promise; markOutcomeUnknown(outcome?: CompleteAiInvocation): Promise; startToolEffect(input: StartAiToolEffect): Promise; private finish; } export declare class AiToolEffectHandle { private readonly requested; private readonly sender; private readonly newId; private terminal; constructor(requested: AiToolEffectTransitionRecord, sender: AiMutationSender, newId: () => string); succeed(outcome?: CompleteAiToolEffect): Promise; fail(outcome?: CompleteAiToolEffect): Promise; markOutcomeUnknown(outcome?: CompleteAiToolEffect): Promise; private finish; }