import { type ActionLedgerRequestContextValues } from "@voyant-travel/action-ledger"; import type { FanOutAvailabilityResult } from "@voyant-travel/catalog"; import type { AnyDrizzleDb } from "@voyant-travel/db"; import type { ToolHandlerActionPolicyContext } from "@voyant-travel/tools"; import type { PostgresJsDatabase } from "drizzle-orm/postgres-js"; import { type TripRequirementSourcingOperation } from "./schema.js"; import { type SourceRequirementCandidatesDeps, type SourceRequirementCandidatesInput } from "./service-requirements.js"; export declare const TRIP_REQUIREMENT_SOURCING_REQUESTED_EVENT = "trip.requirement-sourcing-requested"; export declare const TRIP_REQUIREMENT_SOURCING_COMPLETED_EVENT = "trip.requirement-sourcing-completed"; export declare const TRIP_REQUIREMENT_SOURCING_DEAD_LETTERED_EVENT = "trip.requirement-sourcing-dead-lettered"; export declare const TRIP_REQUIREMENT_SOURCING_STATUS_TOOL: "get_trip_requirement_sourcing_operation"; export interface SourceTripCandidatesAcceptedResult extends Record { status: "accepted"; operationId: string; requirementId: string; statusTool: typeof TRIP_REQUIREMENT_SOURCING_STATUS_TOOL; } export type TripRequirementSourcingOutcome = { status: "completed"; candidateCount: number; requirementStatus: "candidates_ready" | "no_availability"; } | { status: "dead_letter"; error: string; }; export interface TripRequirementSourcingOperationView { operationId: string; requirementId: string; status: TripRequirementSourcingOperation["status"]; result: SourceTripCandidatesAcceptedResult; outcome: TripRequirementSourcingOutcome | null; error: string | null; attempts: number; maxAttempts: number; nextAttemptAt: Date; completedAt: Date | null; createdAt: Date; updatedAt: Date; } export interface ExecuteDurableTripRequirementSourcingInput { db: AnyDrizzleDb; context: ActionLedgerRequestContextValues; admitted: ToolHandlerActionPolicyContext; input: SourceRequirementCandidatesInput; testHooks?: { afterPrepare?: (tx: AnyDrizzleDb, operationId: string) => Promise; }; } /** * Admit one sourcing command and atomically record its immutable request, * accepted Tool result, and requested outbox event. Provider code never runs * on the request path. */ export declare function executeDurableTripRequirementSourcingCommand(input: ExecuteDurableTripRequirementSourcingInput): Promise>; /** * Read one durable operation without leaking its existence across organization * or requirement boundaries. The accepted result remains immutable while * outcome/error make terminal success and failure unambiguous. */ export declare function getTripRequirementSourcingOperation(db: AnyDrizzleDb, input: { operationId: string; requirementId: string; organizationId: string | null; }): Promise; export interface DrainTripRequirementSourcingOptions { limit?: number; now?: Date; visibilityTimeoutMs?: number; retryBaseMs?: number; testHooks?: { afterSearch?: (operation: TripRequirementSourcingOperation, result: FanOutAvailabilityResult) => Promise; beforeCompletionEvent?: (tx: AnyDrizzleDb, operation: TripRequirementSourcingOperation) => Promise; }; } export interface DrainTripRequirementSourcingResult { claimed: number; completed: number; retried: number; deadLettered: number; leaseLost: number; } /** * Claim due operations, execute read-only provider fan-out outside a database * transaction, then atomically replace candidates and settle the operation. */ export declare function drainTripRequirementSourcing(db: PostgresJsDatabase, deps: SourceRequirementCandidatesDeps, options?: DrainTripRequirementSourcingOptions): Promise; export declare function requestedEventId(operationId: string): string; export declare function completedEventId(operationId: string): string; export declare function deadLetteredEventId(operationId: string): string;