import type { A2aPart } from "../a2a/types.ts"; export interface NativeActivation { readonly principal: string; readonly source: string; readonly providerEventId: string; readonly nativeLocator: Readonly>; readonly receivedAt: string; readonly providerDedupeKey: string; readonly conversationKey?: string; readonly nativeDisplayUrl?: string; readonly parts: readonly A2aPart[]; /** Extensions activated by a trusted protocol binding for this message. */ readonly extensions?: readonly string[]; readonly contentDigest: string; readonly evidenceLocator?: string; } export interface NativeContinuation extends NativeActivation { readonly taskId?: string; readonly directReplyToProviderResponseId?: string; readonly sourceSupportsReplyAnchors?: boolean; } /** Native provider input. An explicit Task selector is never accepted here. */ export interface NativeSourceContinuation extends NativeActivation { readonly directReplyToProviderResponseId?: string; readonly sourceSupportsReplyAnchors?: boolean; } export interface ActivationAcceptance { readonly activationId: string; readonly taskId: string; readonly contextId: string; readonly disposition: "created" | "continued" | "duplicate"; } export interface TaskActivationSink { accept(input: NativeActivation): Promise; continue(input: NativeContinuation): Promise; /** Journal and queue a Task already created by a trusted protocol binding. */ claim(input: NativeActivation, taskId: string): Promise; } /** The deliberately narrower sink injected into untrusted provider sources. */ export interface SourceTaskActivationSink { accept(input: NativeActivation): Promise; continue(input: NativeSourceContinuation): Promise; checkpoint?(principal: string, source: string): Promise; advanceCheckpoint?(principal: string, source: string, checkpoint: T): Promise; /** Return the active Task represented by an exact native channel locator. */ taskForLocator?(source: string, locator: string): Promise; /** Report whether a task selected through a native locator is durably terminal. */ taskIsTerminal?(taskId: string): Promise; /** Persist source-level evidence that does not create or belong to a Task. */ recordEvidence?(input: SourceEvidenceInput): Promise; deliver?( input: OutboundDeliveryInput, send: () => Promise, reconcile?: () => Promise, ): Promise; } export interface SourceEvidenceInput { readonly evidenceId: string; readonly source: string; readonly kind: string; readonly detail?: Readonly>; /** Update one bounded durable counter instead of appending per-envelope evidence. */ readonly aggregation?: "counter"; } export interface OutboundDelivery { readonly deliveryId: string; readonly taskId: string; readonly source: string; readonly operationId: string; readonly payloadDigest: string; readonly recovery: "idempotent" | "lookup" | "ambiguous"; /** Bind this operation ID to one payload digest. */ readonly payloadPolicy?: "fixed"; readonly state: "prepared" | "sending" | "delivered" | "failed" | "ambiguous"; readonly updatedAt: string; readonly providerResponseId?: string; readonly error?: string; } export interface OutboundDeliveryInput { readonly taskId: string; readonly source: string; readonly operationId: string; readonly payloadDigest: string; readonly recovery: "idempotent" | "lookup" | "ambiguous"; /** Reject reuse of the operation ID with a different payload digest. */ readonly payloadPolicy?: "fixed"; }