/** * Opportunity Graph: Linear Multi-Step Workflow for Opportunity Discovery * * Architecture: Follows intent graph pattern with Annotation-based state. * Flow: Prep → Scope → Discovery → Evaluation → Ranking → Persist → END * * Key Constraints: * - Opportunities only between intents sharing the same index * - Both intents must have hyde documents for semantic matching * - Non-indexed intents cannot participate in discovery * * Constructor injects Database, Embedder, and compiled HyDE graph. */ import type { Id, NegotiationContinuationReceipt } from '../../shared/interfaces/database.interface.js'; import type { DebugMetaAgent } from '../../capabilities/participant-agents.debug.facade.js'; import { type IndexedIntent, type SourceProfileData, type TargetNetwork, type CandidateMatch, type EvaluatedOpportunity, type EvaluatedOpportunityActor } from '../domain/opportunity.state.js'; import { type CandidateProfile, type EvaluatorEntity, type EvaluatorInput } from './opportunity.evaluator.js'; import type { OpportunityGraphDatabase } from '../../shared/interfaces/database.interface.js'; /** Optional evaluator for testing (avoids LLM calls). */ export type OpportunityEvaluatorLike = { invoke?: (sourceProfileContext: string, candidates: CandidateProfile[], options: { minScore?: number; }) => Promise>; invokeEntityBundle?: (input: EvaluatorInput, options: { minScore?: number; returnAll?: boolean; signal?: AbortSignal; }) => Promise; }>>; }; import type { Embedder } from '../../shared/interfaces/embedder.interface.js'; import type { Opportunity, OpportunityStatus } from '../../shared/interfaces/database.interface.js'; import type { NegotiationGraphLike } from "../../capabilities/negotiation.discovery.facade.js"; import type { AgentDispatcher } from "../../shared/interfaces/agent-dispatcher.interface.js"; import { type QueueOpportunityNotificationFn } from './opportunity.lifecycle.js'; import { type StampNewbornOpportunitiesFn } from './opportunity.newborn-stamping.js'; export type { QueueOpportunityNotificationFn } from './opportunity.lifecycle.js'; export type { StampNewbornOpportunitiesFn, StampNewbornOpportunitiesInput } from './opportunity.newborn-stamping.js'; export { buildPrioritizedNegotiationIntents } from './opportunity.existing-negotiation.js'; export interface OpportunityGraphThresholdOverrides { retrievalMinSimilarity?: number; evaluatorMinScore?: number; } /** * Error text can include provider response bodies, URLs, and credentials. Keep * observability useful by retaining only a conservative error class at this * boundary; detailed errors are intentionally not emitted from graph traces. */ export declare function safeOpportunityGraphError(_error: unknown): string; /** Input shape for the HyDE graph invoke call (query-based embedding). */ export interface HydeGeneratorInvokeInput { sourceType: 'query'; sourceText: string; forceRegenerate?: boolean; profileContext?: string; } /** * Builds a compact text summary of the discoverer's profile and active intents * for use as profileContext in HyDE generation. * @param profile - The discoverer's profile data (identity, attributes) * @param intents - The discoverer's indexed intents (capped at 5) * @returns A context string, or undefined if no meaningful data is available */ export declare function buildDiscovererContext(profile: SourceProfileData | null | undefined, intents: IndexedIntent[] | undefined): string | undefined; /** * Factory class to build and compile the Opportunity Graph. * Uses dependency injection for testability. */ export declare class OpportunityGraphFactory { private database; private embedder; private hydeGenerator; private optionalEvaluator?; private queueNotification?; private negotiationGraph?; /** * Used on the chat path to decide whether to wait for the user's personal * agent (long timeout) or fall back to the system agent immediately * (short timeout). Without it, the chat path always uses a short timeout. */ private agentDispatcher?; /** * Callback to enqueue a negotiate_existing job for an opportunity. * When provided, negotiate_existing mode uses this to queue follow-up * negotiations after introducer approval. */ private queueNegotiateExisting?; /** Host-side P4b stamper. Omitted by manual/introducer/enrichment roots. */ private stampNewbornOpportunities?; /** Eval/test-only overrides; production composition resolves from environment. */ private thresholdOverrides?; constructor(database: OpportunityGraphDatabase, embedder: Embedder, hydeGenerator: { invoke: (input: HydeGeneratorInvokeInput) => Promise<{ hydeEmbeddings: Record; lenses?: Array<{ label: string; corpus: 'profiles' | 'intents' | 'premises'; }>; hydeDocuments?: Record; }>; }, optionalEvaluator?: OpportunityEvaluatorLike | undefined, queueNotification?: QueueOpportunityNotificationFn | undefined, negotiationGraph?: NegotiationGraphLike | undefined, /** * Used on the chat path to decide whether to wait for the user's personal * agent (long timeout) or fall back to the system agent immediately * (short timeout). Without it, the chat path always uses a short timeout. */ agentDispatcher?: Pick | undefined, /** * Callback to enqueue a negotiate_existing job for an opportunity. * When provided, negotiate_existing mode uses this to queue follow-up * negotiations after introducer approval. */ queueNegotiateExisting?: ((opportunityId: string, userId: string) => Promise) | undefined, /** Host-side P4b stamper. Omitted by manual/introducer/enrichment roots. */ stampNewbornOpportunities?: StampNewbornOpportunitiesFn | undefined, /** Eval/test-only overrides; production composition resolves from environment. */ thresholdOverrides?: OpportunityGraphThresholdOverrides | undefined); createGraph(): import("@langchain/langgraph").CompiledStateGraph<{ userId: Id<"users">; searchQuery: string | undefined; networkId: Id<"networks"> | undefined; indexScope: Id<"networks">[] | undefined; triggerIntentId: Id<"intents"> | undefined; targetUserId: Id<"users"> | undefined; onBehalfOfUserId: Id<"users"> | undefined; options: import("../domain/opportunity.state.js").OpportunityGraphOptions; operationMode: "delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction"; introductionEntities: EvaluatorEntity[]; introductionHint: string | undefined; requiredNetworkId: Id<"networks"> | undefined; introductionContext: { createdByName?: string; } | undefined; opportunityId: string | undefined; newStatus: string | undefined; indexedIntents: IndexedIntent[]; userNetworks: Id<"networks">[]; targetNetworks: TargetNetwork[]; indexRelevancyScores: Record; discoverySource: "intent" | "context"; resolvedTriggerIntentId: Id<"intents"> | undefined; sourceProfile: SourceProfileData | null; sourcePremises: { premiseId: Id<"premises">; embedding: number[]; }[]; sourceContexts: { contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[]; resolvedIntentInIndex: boolean; createIntentSuggested: boolean; suggestedIntentDescription: string | undefined; hydeEmbeddings: Record; candidates: CandidateMatch[]; remainingCandidates: CandidateMatch[]; discoveryId: string | null; evaluatedCandidates: import("../domain/opportunity.state.js").EvaluatedCandidate[]; evaluatedOpportunities: EvaluatedOpportunity[]; opportunities: Opportunity[]; existingBetweenActors: { candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[]; persistenceOutcome: import("../domain/opportunity.state.js").OpportunityPersistenceOutcome | undefined; negotiationContinuationReceipt: NegotiationContinuationReceipt | undefined; error: string | undefined; readResult: { count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined; mutationResult: { success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined; trace: { node: string; detail?: string; data?: Record; }[]; agentTimings: DebugMetaAgent[]; discoveryNegotiations: { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]; discoverySummary: import("../../index.js").DiscoverySummary | null; }, { userId?: Id<"users"> | import("@langchain/langgraph").OverwriteValue> | undefined; searchQuery?: string | import("@langchain/langgraph").OverwriteValue | undefined; networkId?: Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; indexScope?: Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[] | undefined> | undefined; triggerIntentId?: Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; targetUserId?: Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; onBehalfOfUserId?: Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; options?: import("../domain/opportunity.state.js").OpportunityGraphOptions | import("@langchain/langgraph").OverwriteValue | undefined; operationMode?: "delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction" | import("@langchain/langgraph").OverwriteValue<"delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction"> | undefined; introductionEntities?: EvaluatorEntity[] | import("@langchain/langgraph").OverwriteValue | undefined; introductionHint?: string | import("@langchain/langgraph").OverwriteValue | undefined; requiredNetworkId?: Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; introductionContext?: { createdByName?: string; } | import("@langchain/langgraph").OverwriteValue<{ createdByName?: string; } | undefined> | undefined; opportunityId?: string | import("@langchain/langgraph").OverwriteValue | undefined; newStatus?: string | import("@langchain/langgraph").OverwriteValue | undefined; indexedIntents?: IndexedIntent[] | import("@langchain/langgraph").OverwriteValue | undefined; userNetworks?: Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[]> | undefined; targetNetworks?: TargetNetwork[] | import("@langchain/langgraph").OverwriteValue | undefined; indexRelevancyScores?: Record | import("@langchain/langgraph").OverwriteValue> | undefined; discoverySource?: "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context"> | undefined; resolvedTriggerIntentId?: Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined; sourceProfile?: SourceProfileData | import("@langchain/langgraph").OverwriteValue | null | undefined; sourcePremises?: { premiseId: Id<"premises">; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ premiseId: Id<"premises">; embedding: number[]; }[]> | undefined; sourceContexts?: { contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[]> | undefined; resolvedIntentInIndex?: boolean | import("@langchain/langgraph").OverwriteValue | undefined; createIntentSuggested?: boolean | import("@langchain/langgraph").OverwriteValue | undefined; suggestedIntentDescription?: string | import("@langchain/langgraph").OverwriteValue | undefined; hydeEmbeddings?: Record | import("@langchain/langgraph").OverwriteValue> | undefined; candidates?: CandidateMatch[] | import("@langchain/langgraph").OverwriteValue | undefined; remainingCandidates?: CandidateMatch[] | import("@langchain/langgraph").OverwriteValue | undefined; discoveryId?: string | import("@langchain/langgraph").OverwriteValue | null | undefined; evaluatedCandidates?: import("../domain/opportunity.state.js").EvaluatedCandidate[] | import("@langchain/langgraph").OverwriteValue | undefined; evaluatedOpportunities?: EvaluatedOpportunity[] | import("@langchain/langgraph").OverwriteValue | undefined; opportunities?: Opportunity[] | import("@langchain/langgraph").OverwriteValue | undefined; existingBetweenActors?: { candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[] | import("@langchain/langgraph").OverwriteValue<{ candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[]> | undefined; persistenceOutcome?: import("../domain/opportunity.state.js").OpportunityPersistenceOutcome | import("@langchain/langgraph").OverwriteValue | undefined; negotiationContinuationReceipt?: NegotiationContinuationReceipt | import("@langchain/langgraph").OverwriteValue | undefined; error?: string | import("@langchain/langgraph").OverwriteValue | undefined; readResult?: { count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | import("@langchain/langgraph").OverwriteValue<{ count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined> | undefined; mutationResult?: { success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | import("@langchain/langgraph").OverwriteValue<{ success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined> | undefined; trace?: { node: string; detail?: string; data?: Record; }[] | import("@langchain/langgraph").OverwriteValue<{ node: string; detail?: string; data?: Record; }[]> | undefined; agentTimings?: DebugMetaAgent[] | import("@langchain/langgraph").OverwriteValue | undefined; discoveryNegotiations?: { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[] | import("@langchain/langgraph").OverwriteValue<{ counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]> | undefined; discoverySummary?: import("../../index.js").DiscoverySummary | import("@langchain/langgraph").OverwriteValue | null | undefined; }, "scope" | "discovery" | "send" | "update" | "__start__" | "read" | "prep" | "negotiate_existing" | "approve_introduction" | "persist" | "resolve" | "evaluation" | "ranking" | "intro_validation" | "intro_evaluation" | "delete_opp" | "negotiate", { userId: import("@langchain/langgraph").BaseChannel, Id<"users"> | import("@langchain/langgraph").OverwriteValue>, unknown>; searchQuery: import("@langchain/langgraph").BaseChannel | undefined, unknown>; networkId: import("@langchain/langgraph").BaseChannel | undefined, Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; indexScope: import("@langchain/langgraph").BaseChannel[] | undefined, Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[] | undefined> | undefined, unknown>; triggerIntentId: import("@langchain/langgraph").BaseChannel | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; targetUserId: import("@langchain/langgraph").BaseChannel | undefined, Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; onBehalfOfUserId: import("@langchain/langgraph").BaseChannel | undefined, Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; options: import("@langchain/langgraph").BaseChannel, unknown>; operationMode: import("@langchain/langgraph").BaseChannel<"delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction", "delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction" | import("@langchain/langgraph").OverwriteValue<"delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction">, unknown>; introductionEntities: import("@langchain/langgraph").BaseChannel, unknown>; introductionHint: import("@langchain/langgraph").BaseChannel | undefined, unknown>; requiredNetworkId: import("@langchain/langgraph").BaseChannel | undefined, Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; introductionContext: import("@langchain/langgraph").BaseChannel<{ createdByName?: string; } | undefined, { createdByName?: string; } | import("@langchain/langgraph").OverwriteValue<{ createdByName?: string; } | undefined> | undefined, unknown>; opportunityId: import("@langchain/langgraph").BaseChannel | undefined, unknown>; newStatus: import("@langchain/langgraph").BaseChannel | undefined, unknown>; indexedIntents: import("@langchain/langgraph").BaseChannel, unknown>; userNetworks: import("@langchain/langgraph").BaseChannel[], Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[]>, unknown>; targetNetworks: import("@langchain/langgraph").BaseChannel, unknown>; indexRelevancyScores: import("@langchain/langgraph").BaseChannel, Record | import("@langchain/langgraph").OverwriteValue>, unknown>; discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "context", "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context">, unknown>; resolvedTriggerIntentId: import("@langchain/langgraph").BaseChannel | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; sourceProfile: import("@langchain/langgraph").BaseChannel | null, unknown>; sourcePremises: import("@langchain/langgraph").BaseChannel<{ premiseId: Id<"premises">; embedding: number[]; }[], { premiseId: Id<"premises">; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ premiseId: Id<"premises">; embedding: number[]; }[]>, unknown>; sourceContexts: import("@langchain/langgraph").BaseChannel<{ contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[], { contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[]>, unknown>; resolvedIntentInIndex: import("@langchain/langgraph").BaseChannel, unknown>; createIntentSuggested: import("@langchain/langgraph").BaseChannel, unknown>; suggestedIntentDescription: import("@langchain/langgraph").BaseChannel | undefined, unknown>; hydeEmbeddings: import("@langchain/langgraph").BaseChannel, Record | import("@langchain/langgraph").OverwriteValue>, unknown>; candidates: import("@langchain/langgraph").BaseChannel, unknown>; remainingCandidates: import("@langchain/langgraph").BaseChannel, unknown>; discoveryId: import("@langchain/langgraph").BaseChannel | null, unknown>; evaluatedCandidates: import("@langchain/langgraph").BaseChannel, unknown>; evaluatedOpportunities: import("@langchain/langgraph").BaseChannel, unknown>; opportunities: import("@langchain/langgraph").BaseChannel, unknown>; existingBetweenActors: import("@langchain/langgraph").BaseChannel<{ candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[], { candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[] | import("@langchain/langgraph").OverwriteValue<{ candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[]>, unknown>; persistenceOutcome: import("@langchain/langgraph").BaseChannel | undefined, unknown>; negotiationContinuationReceipt: import("@langchain/langgraph").BaseChannel | undefined, unknown>; error: import("@langchain/langgraph").BaseChannel | undefined, unknown>; readResult: import("@langchain/langgraph").BaseChannel<{ count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined, { count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | import("@langchain/langgraph").OverwriteValue<{ count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined> | undefined, unknown>; mutationResult: import("@langchain/langgraph").BaseChannel<{ success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined, { success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | import("@langchain/langgraph").OverwriteValue<{ success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined> | undefined, unknown>; trace: import("@langchain/langgraph").BaseChannel<{ node: string; detail?: string; data?: Record; }[], { node: string; detail?: string; data?: Record; }[] | import("@langchain/langgraph").OverwriteValue<{ node: string; detail?: string; data?: Record; }[]>, unknown>; agentTimings: import("@langchain/langgraph").BaseChannel, unknown>; discoveryNegotiations: import("@langchain/langgraph").BaseChannel<{ counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[], { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[] | import("@langchain/langgraph").OverwriteValue<{ counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]>, unknown>; discoverySummary: import("@langchain/langgraph").BaseChannel | null, unknown>; }, { userId: import("@langchain/langgraph").BaseChannel, Id<"users"> | import("@langchain/langgraph").OverwriteValue>, unknown>; searchQuery: import("@langchain/langgraph").BaseChannel | undefined, unknown>; networkId: import("@langchain/langgraph").BaseChannel | undefined, Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; indexScope: import("@langchain/langgraph").BaseChannel[] | undefined, Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[] | undefined> | undefined, unknown>; triggerIntentId: import("@langchain/langgraph").BaseChannel | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; targetUserId: import("@langchain/langgraph").BaseChannel | undefined, Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; onBehalfOfUserId: import("@langchain/langgraph").BaseChannel | undefined, Id<"users"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; options: import("@langchain/langgraph").BaseChannel, unknown>; operationMode: import("@langchain/langgraph").BaseChannel<"delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction", "delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction" | import("@langchain/langgraph").OverwriteValue<"delete" | "send" | "update" | "create" | "read" | "create_introduction" | "continue_discovery" | "negotiate_existing" | "approve_introduction">, unknown>; introductionEntities: import("@langchain/langgraph").BaseChannel, unknown>; introductionHint: import("@langchain/langgraph").BaseChannel | undefined, unknown>; requiredNetworkId: import("@langchain/langgraph").BaseChannel | undefined, Id<"networks"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; introductionContext: import("@langchain/langgraph").BaseChannel<{ createdByName?: string; } | undefined, { createdByName?: string; } | import("@langchain/langgraph").OverwriteValue<{ createdByName?: string; } | undefined> | undefined, unknown>; opportunityId: import("@langchain/langgraph").BaseChannel | undefined, unknown>; newStatus: import("@langchain/langgraph").BaseChannel | undefined, unknown>; indexedIntents: import("@langchain/langgraph").BaseChannel, unknown>; userNetworks: import("@langchain/langgraph").BaseChannel[], Id<"networks">[] | import("@langchain/langgraph").OverwriteValue[]>, unknown>; targetNetworks: import("@langchain/langgraph").BaseChannel, unknown>; indexRelevancyScores: import("@langchain/langgraph").BaseChannel, Record | import("@langchain/langgraph").OverwriteValue>, unknown>; discoverySource: import("@langchain/langgraph").BaseChannel<"intent" | "context", "intent" | "context" | import("@langchain/langgraph").OverwriteValue<"intent" | "context">, unknown>; resolvedTriggerIntentId: import("@langchain/langgraph").BaseChannel | undefined, Id<"intents"> | import("@langchain/langgraph").OverwriteValue | undefined> | undefined, unknown>; sourceProfile: import("@langchain/langgraph").BaseChannel | null, unknown>; sourcePremises: import("@langchain/langgraph").BaseChannel<{ premiseId: Id<"premises">; embedding: number[]; }[], { premiseId: Id<"premises">; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ premiseId: Id<"premises">; embedding: number[]; }[]>, unknown>; sourceContexts: import("@langchain/langgraph").BaseChannel<{ contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[], { contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[] | import("@langchain/langgraph").OverwriteValue<{ contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[]>, unknown>; resolvedIntentInIndex: import("@langchain/langgraph").BaseChannel, unknown>; createIntentSuggested: import("@langchain/langgraph").BaseChannel, unknown>; suggestedIntentDescription: import("@langchain/langgraph").BaseChannel | undefined, unknown>; hydeEmbeddings: import("@langchain/langgraph").BaseChannel, Record | import("@langchain/langgraph").OverwriteValue>, unknown>; candidates: import("@langchain/langgraph").BaseChannel, unknown>; remainingCandidates: import("@langchain/langgraph").BaseChannel, unknown>; discoveryId: import("@langchain/langgraph").BaseChannel | null, unknown>; evaluatedCandidates: import("@langchain/langgraph").BaseChannel, unknown>; evaluatedOpportunities: import("@langchain/langgraph").BaseChannel, unknown>; opportunities: import("@langchain/langgraph").BaseChannel, unknown>; existingBetweenActors: import("@langchain/langgraph").BaseChannel<{ candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[], { candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[] | import("@langchain/langgraph").OverwriteValue<{ candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[]>, unknown>; persistenceOutcome: import("@langchain/langgraph").BaseChannel | undefined, unknown>; negotiationContinuationReceipt: import("@langchain/langgraph").BaseChannel | undefined, unknown>; error: import("@langchain/langgraph").BaseChannel | undefined, unknown>; readResult: import("@langchain/langgraph").BaseChannel<{ count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined, { count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | import("@langchain/langgraph").OverwriteValue<{ count: number; message?: string; opportunities: Array<{ id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: string; category: string; confidence: number | null; source: string | null; }>; } | undefined> | undefined, unknown>; mutationResult: import("@langchain/langgraph").BaseChannel<{ success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined, { success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | import("@langchain/langgraph").OverwriteValue<{ success: boolean; message?: string; opportunityId?: string; notified?: string[]; conversationId?: string; error?: string; } | undefined> | undefined, unknown>; trace: import("@langchain/langgraph").BaseChannel<{ node: string; detail?: string; data?: Record; }[], { node: string; detail?: string; data?: Record; }[] | import("@langchain/langgraph").OverwriteValue<{ node: string; detail?: string; data?: Record; }[]>, unknown>; agentTimings: import("@langchain/langgraph").BaseChannel, unknown>; discoveryNegotiations: import("@langchain/langgraph").BaseChannel<{ counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[], { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[] | import("@langchain/langgraph").OverwriteValue<{ counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]>, unknown>; discoverySummary: import("@langchain/langgraph").BaseChannel | null, unknown>; }, import("@langchain/langgraph").StateDefinition, { prep: { userNetworks: Id<"networks">[]; sourceProfile: null; error: string; indexedIntents?: undefined; sourcePremises?: undefined; sourceContexts?: undefined; trace?: undefined; } | { userNetworks: Id<"networks">[]; indexedIntents: IndexedIntent[]; sourceProfile: { identity: { name: string; bio: string; location: string; }; context: string; } | null; sourcePremises: { premiseId: Id<"premises">; embedding: number[]; }[]; sourceContexts: { contextId: string; networkId: Id<"networks">; text: string; embedding: number[]; }[]; trace: { node: string; detail: string; }[]; error?: undefined; } | { error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; }; scope: { targetNetworks: never[]; error: string; indexRelevancyScores?: undefined; agentTimings?: undefined; trace?: undefined; } | { targetNetworks: TargetNetwork[]; indexRelevancyScores: Record; agentTimings: DebugMetaAgent[]; trace: { node: string; detail: string; data: { totalMembers: number; }; }[]; error?: undefined; } | { targetNetworks: TargetNetwork[]; indexRelevancyScores: Record; trace: { node: string; detail: string; data: { totalMembers: number; }; }[]; error?: undefined; agentTimings?: undefined; } | { targetNetworks: never[]; error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; indexRelevancyScores?: undefined; agentTimings?: undefined; }; resolve: { resolvedTriggerIntentId: undefined; resolvedIntentInIndex: boolean; discoverySource: "context"; error: string; trace?: undefined; } | { resolvedTriggerIntentId: Id<"intents">; resolvedIntentInIndex: boolean; discoverySource: "intent" | "context"; error?: undefined; trace?: undefined; } | { resolvedTriggerIntentId: undefined; resolvedIntentInIndex: boolean; discoverySource: "context"; error?: undefined; trace?: undefined; } | { resolvedTriggerIntentId: undefined; resolvedIntentInIndex: boolean; discoverySource: "context"; error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; }; discovery: { candidates: never[]; trace?: undefined; hydeEmbeddings?: undefined; error?: undefined; } | { candidates: CandidateMatch[]; trace: { node: string; detail?: string; data?: Record; }[]; hydeEmbeddings?: undefined; error?: undefined; } | { hydeEmbeddings: Record; candidates: never[]; trace?: undefined; error?: undefined; } | { hydeEmbeddings: Record; candidates: CandidateMatch[]; trace: { node: string; detail?: string; data?: Record; }[]; error?: undefined; } | { candidates: never[]; error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; hydeEmbeddings?: undefined; }; evaluation: { evaluatedOpportunities: never[]; agentTimings: never[]; candidates?: undefined; remainingCandidates?: undefined; error?: undefined; trace?: undefined; } | { candidates: never[]; evaluatedOpportunities: never[]; remainingCandidates: never[]; error: string; agentTimings: never[]; trace?: undefined; } | { candidates: never[]; evaluatedOpportunities: never[]; remainingCandidates: never[]; agentTimings: never[]; error?: undefined; trace?: undefined; } | { candidates: CandidateMatch[]; evaluatedOpportunities: EvaluatedOpportunity[]; remainingCandidates: CandidateMatch[]; trace: { node: string; detail?: string; data?: Record; }[]; agentTimings: DebugMetaAgent[]; error?: undefined; } | { evaluatedOpportunities: never[]; error: string; trace: { node: string; detail: string; data: { error: string; candidateCount: number; durationMs: number; }; }[]; agentTimings: DebugMetaAgent[]; candidates?: undefined; remainingCandidates?: undefined; }; ranking: { evaluatedOpportunities: EvaluatedOpportunity[]; error?: undefined; trace?: undefined; } | { evaluatedOpportunities: never[]; error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; }; intro_validation: { error: string; trace?: undefined; } | { error?: undefined; trace?: undefined; } | { error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; }; intro_evaluation: { evaluatedOpportunities: never[]; agentTimings: never[]; error?: undefined; introductionContext?: undefined; options?: undefined; trace?: undefined; } | { evaluatedOpportunities: never[]; error: string; agentTimings: never[]; introductionContext?: undefined; options?: undefined; trace?: undefined; } | { evaluatedOpportunities: { actors: EvaluatedOpportunityActor[]; score: number; reasoning: string; }[]; introductionContext: { createdByName: string | undefined; }; options: { initialStatus: OpportunityStatus; negotiationContinuation?: import("../../shared/interfaces/database.interface.js").NegotiationContinuationExecution; limit?: number; lenses?: import("../../shared/hyde/lens.inferrer.js").Lens[]; hydeDescription?: string; existingOpportunities?: string; conversationId?: string; negotiateTimeoutMs?: number; }; agentTimings: DebugMetaAgent[]; trace: { node: string; detail: string; data: { error: string; }; }[]; error?: undefined; } | { evaluatedOpportunities: EvaluatedOpportunity[]; introductionContext: { createdByName: string | undefined; }; options: { initialStatus: OpportunityStatus; negotiationContinuation?: import("../../shared/interfaces/database.interface.js").NegotiationContinuationExecution; limit?: number; lenses?: import("../../shared/hyde/lens.inferrer.js").Lens[]; hydeDescription?: string; existingOpportunities?: string; conversationId?: string; negotiateTimeoutMs?: number; }; agentTimings: DebugMetaAgent[]; error?: undefined; trace?: undefined; }; persist: { opportunities: never[]; persistenceOutcome: { evaluatedCount: number; createdCount: number; reactivatedCount: number; sameTriggerDuplicateSuppressions: number; pairActiveNegotiationSuppressions: number; crossTriggerAllowedCount: number; finalAtomicConflictCount: number; }; existingBetweenActors?: undefined; trace?: undefined; error?: undefined; } | { opportunities: never[]; persistenceOutcome?: undefined; existingBetweenActors?: undefined; trace?: undefined; error?: undefined; } | { opportunities: Opportunity[]; existingBetweenActors: { candidateUserId: Id<"users">; networkId: Id<"networks">; existingOpportunityId?: Id<"opportunities">; existingStatus?: OpportunityStatus; reason?: "same_trigger_recent_duplicate" | "pair_active_negotiation" | "final_atomic_conflict"; existingTriggerIntentId?: string; }[]; persistenceOutcome: { evaluatedCount: number; createdCount: number; reactivatedCount: number; sameTriggerDuplicateSuppressions: number; pairActiveNegotiationSuppressions: number; crossTriggerAllowedCount: number; finalAtomicConflictCount: number; }; trace: { node: string; detail: string; data: { created: number; reactivated: number; existingSkipped: number; totalOutput: number; persistenceOutcome: { evaluatedCount: number; createdCount: number; reactivatedCount: number; sameTriggerDuplicateSuppressions: number; pairActiveNegotiationSuppressions: number; crossTriggerAllowedCount: number; finalAtomicConflictCount: number; }; durationMs: number; }; }[]; error?: undefined; } | { opportunities: never[]; existingBetweenActors: never[]; error: string; trace: { node: string; detail: string; data: { error: string; }; }[]; persistenceOutcome?: undefined; }; read: { readResult: { count: number; message: string; opportunities: { id: string; indexName: string; connectedWith: string[]; suggestedBy: string | null; reasoning: string; status: OpportunityStatus; category: string; confidence: number | null; source: string | null; }[]; }; }; update: { mutationResult: import("./opportunity.lifecycle.js").OpportunityMutationResult; }; delete_opp: { mutationResult: import("./opportunity.lifecycle.js").OpportunityMutationResult; }; send: { mutationResult: import("./opportunity.lifecycle.js").OpportunityMutationResult; }; negotiate_existing: { negotiationContinuationReceipt?: undefined; error?: undefined; } | { negotiationContinuationReceipt: NegotiationContinuationReceipt; error?: undefined; } | { error: string; negotiationContinuationReceipt?: undefined; }; approve_introduction: { mutationResult: import("./opportunity.lifecycle.js").OpportunityMutationResult; }; negotiate: { trace?: undefined; discoveryNegotiations?: undefined; discoverySummary?: undefined; } | { trace: { node: string; detail: string; data: { negotiateTimeoutMs: number; candidateCount: number; durationMs: number; }; }[]; discoveryNegotiations: { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]; discoverySummary: import("../../index.js").DiscoverySummary; } | { trace: ({ node: string; detail: string; data: { userId: string; opportunityId: string | undefined; name: string; outcome: string; turns: number; }; } | { node: string; detail: string; data: { durationMs: number; candidateCount: number; acceptedCount: number; otherCount: number; }; })[]; discoveryNegotiations: { counterpartyHint: string; indexContext: string; counterpartyId: string; turns: { reasoning: string; suggestedRoles: { ownUser: "agent" | "patient" | "peer"; otherUser: "agent" | "patient" | "peer"; }; action: "propose" | "accept" | "reject" | "counter" | "question" | "outreach" | "withdraw" | "decline" | "ask_user"; }[]; outcome: { reasoning: string; hasOpportunity: boolean; reason?: "timeout" | "turn_cap" | "screened_out" | undefined; agreedRoles?: { userId: string; role: "agent" | "patient" | "peer"; }[] | undefined; }; seedAssessmentScore?: number | undefined; }[]; discoverySummary: import("../../index.js").DiscoverySummary; } | { trace: { node: string; detail: string; data: { durationMs: number; error: boolean; }; }[]; discoveryNegotiations: never[]; discoverySummary: import("../../index.js").DiscoverySummary; }; }, unknown, unknown, []>; }