/** * Minimal shape consumed by buildOpportunityPresentation for prose rendering. * Card data objects in the codebase carry additional frontend-only fields; * only these are surfaced to MCP agents. */ export type OpportunityCardLike = Record & { opportunityId: string; userId?: string | undefined; name?: string | undefined; mainText?: string | undefined; digestSummary?: string | undefined; status?: string | undefined; feedCategory?: string | undefined; profileUrl?: string | undefined; /** Universal link that opens this opportunity's card (`/o/`). */ appUrl?: string | undefined; /** Deep-link to the A2A negotiation trace that produced this opportunity. */ negotiationUrl?: string | undefined; score?: number | undefined; /** Digest-mode cooldown re-show — the user has seen this card before. */ redelivery?: boolean | undefined; }; /** * Format opportunity cards into the "opportunities" portion of a tool response. * * Web chat (`isMcp=false`): emits ```opportunity``` code fences with an * "include EXACTLY as-is" directive so the frontend card renderer can parse * and render interactive cards. * * MCP (`isMcp=true`): emits prose (name, reason, status, appUrl and profileUrl * when present, feedCategory when present) and includes `opportunityId` for * every card so the agent can act via the tools. The trailing instruction * reminds the agent to synthesize in natural language, to surface the `appUrl` * verbatim as the one link that opens the card, and to fabricate no other URL. * MCP clients have no card renderer, so code fences would surface as raw JSON * to end users. */ export declare function buildOpportunityPresentation(inputCards: OpportunityCardLike[], opts: { isMcp: boolean; leadIn: string; label?: 'opportunity' | 'opportunities'; /** Include hidden digest metadata markers so scheduled brief tooling can confirm delivery. */ includeDigestMarkers?: boolean; }): string;