@indexnetwork/protocol 4.16.0-rc.358.1 → 4.17.0-rc.360.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/dist/contact/contact.inviter.d.ts.map +1 -1
  3. package/dist/contact/contact.inviter.js +12 -5
  4. package/dist/contact/contact.inviter.js.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/opportunity/delivery-card.cache.d.ts.map +1 -1
  10. package/dist/opportunity/delivery-card.cache.js +7 -3
  11. package/dist/opportunity/delivery-card.cache.js.map +1 -1
  12. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts +22 -15
  13. package/dist/opportunity/discriminator/discriminator.adjustments.d.ts.map +1 -1
  14. package/dist/opportunity/discriminator/discriminator.adjustments.js +39 -20
  15. package/dist/opportunity/discriminator/discriminator.adjustments.js.map +1 -1
  16. package/dist/opportunity/feed/feed.categorizer.d.ts.map +1 -1
  17. package/dist/opportunity/feed/feed.categorizer.js +6 -0
  18. package/dist/opportunity/feed/feed.categorizer.js.map +1 -1
  19. package/dist/opportunity/feed/feed.graph.d.ts +2 -0
  20. package/dist/opportunity/feed/feed.graph.d.ts.map +1 -1
  21. package/dist/opportunity/feed/feed.graph.js +53 -28
  22. package/dist/opportunity/feed/feed.graph.js.map +1 -1
  23. package/dist/opportunity/feed/feed.state.d.ts +3 -1
  24. package/dist/opportunity/feed/feed.state.d.ts.map +1 -1
  25. package/dist/opportunity/feed/feed.state.js.map +1 -1
  26. package/dist/opportunity/opportunity.claim-safety.d.ts +25 -0
  27. package/dist/opportunity/opportunity.claim-safety.d.ts.map +1 -0
  28. package/dist/opportunity/opportunity.claim-safety.js +89 -0
  29. package/dist/opportunity/opportunity.claim-safety.js.map +1 -0
  30. package/dist/opportunity/opportunity.discover.d.ts.map +1 -1
  31. package/dist/opportunity/opportunity.discover.js +6 -1
  32. package/dist/opportunity/opportunity.discover.js.map +1 -1
  33. package/dist/opportunity/opportunity.evaluator.d.ts.map +1 -1
  34. package/dist/opportunity/opportunity.evaluator.js +13 -8
  35. package/dist/opportunity/opportunity.evaluator.js.map +1 -1
  36. package/dist/opportunity/opportunity.graph.d.ts +23 -0
  37. package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
  38. package/dist/opportunity/opportunity.graph.js +172 -17
  39. package/dist/opportunity/opportunity.graph.js.map +1 -1
  40. package/dist/opportunity/opportunity.persist.d.ts +8 -1
  41. package/dist/opportunity/opportunity.persist.d.ts.map +1 -1
  42. package/dist/opportunity/opportunity.persist.js +23 -2
  43. package/dist/opportunity/opportunity.persist.js.map +1 -1
  44. package/dist/opportunity/opportunity.presentation-cache.d.ts +7 -0
  45. package/dist/opportunity/opportunity.presentation-cache.d.ts.map +1 -0
  46. package/dist/opportunity/opportunity.presentation-cache.js +15 -0
  47. package/dist/opportunity/opportunity.presentation-cache.js.map +1 -0
  48. package/dist/opportunity/opportunity.presentation.d.ts.map +1 -1
  49. package/dist/opportunity/opportunity.presentation.js +8 -5
  50. package/dist/opportunity/opportunity.presentation.js.map +1 -1
  51. package/dist/opportunity/opportunity.presenter.d.ts +4 -4
  52. package/dist/opportunity/opportunity.presenter.d.ts.map +1 -1
  53. package/dist/opportunity/opportunity.presenter.js +55 -14
  54. package/dist/opportunity/opportunity.presenter.js.map +1 -1
  55. package/dist/opportunity/opportunity.safe-presentation.d.ts +1 -1
  56. package/dist/opportunity/opportunity.safe-presentation.d.ts.map +1 -1
  57. package/dist/opportunity/opportunity.safe-presentation.js +22 -9
  58. package/dist/opportunity/opportunity.safe-presentation.js.map +1 -1
  59. package/dist/opportunity/opportunity.tools.d.ts +1 -17
  60. package/dist/opportunity/opportunity.tools.d.ts.map +1 -1
  61. package/dist/opportunity/opportunity.tools.js +32 -2
  62. package/dist/opportunity/opportunity.tools.js.map +1 -1
  63. package/dist/shared/interfaces/database.interface.d.ts +46 -2
  64. package/dist/shared/interfaces/database.interface.d.ts.map +1 -1
  65. package/dist/shared/interfaces/database.interface.js.map +1 -1
  66. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"feed.graph.js","sourceRoot":"/","sources":["opportunity/feed/feed.graph.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Home Graph: Build the opportunity home view with dynamic sections.\n *\n * Independent of ChatGraph. Flow:\n * loadOpportunities → checkPresenterCache → [generateCardText if misses] → cachePresenterResults\n * → checkCategorizerCache → [categorizeDynamically if miss] → cacheCategorizerResults → normalizeAndSort\n *\n * Uses OpportunityPresenter for card text and an LLM to categorize cards into dynamic sections\n * with titles and Lucide icon names. Caches presenter and categorizer results via OpportunityCache.\n */\n\nimport { createHash } from 'crypto';\n\nimport { StateGraph, START, END } from '@langchain/langgraph';\n\nimport type { HomeGraphDatabase, OpportunityStatus } from '../../shared/interfaces/database.interface.js';\nimport type { OpportunityCache } from '../../shared/interfaces/cache.interface.js';\nimport { HomeGraphState, type HomeCardItem, type HomeSection, type HomeSectionProposal, type HomeSectionItem } from './feed.state.js';\nimport { OpportunityPresenter, gatherPresenterContext, type PresenterDatabase } from '../opportunity.presenter.js';\nimport { loadNegotiationContext } from '../negotiation-context.loader.js';\nimport { HomeCategorizerAgent } from './feed.categorizer.js';\nimport { canUserSeeOpportunity, isActionableForViewer, selectByComposition } from '../opportunity.utils.js';\nimport { resolveHomeSectionIcon, DEFAULT_HOME_SECTION_ICON } from '../../shared/ui/lucide.icon-catalog.js';\nimport { getPrimaryActionLabel, SECONDARY_ACTION_LABEL } from '../opportunity.labels.js';\nimport { safeFallbackSummary } from '../opportunity.safe-presentation.js';\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\nimport { protocolLogger } from '../../shared/observability/protocol.logger.js';\nimport { timed } from '../../shared/observability/performance.js';\nimport { requestContext } from \"../../shared/observability/request-context.js\";\nimport { adjustedConfidence, latestPoolDemotionDetail } from '../discriminator/discriminator.adjustments.js';\nimport { poolQuestionsRanking } from '../discriminator/discriminator.env.js';\n\nconst logger = protocolLogger('HomeGraph');\nconst checkCategorizerCacheLog = protocolLogger('HomeGraph:checkCategorizerCache');\nconst cacheCategorizerResultsLog = protocolLogger('HomeGraph:cacheCategorizerResults');\nconst checkPresenterCacheLog = protocolLogger('HomeGraph:checkPresenterCache');\nconst cachePresenterResultsLog = protocolLogger('HomeGraph:cachePresenterResults');\nconst categorizeDynamicallyLog = protocolLogger('HomeGraph:categorizeDynamically');\nconst normalizeAndSortLog = protocolLogger('HomeGraph:normalizeAndSort');\nconst generateCardTextLog = protocolLogger('HomeGraph:generateCardText');\n\n/** Database must satisfy both HomeGraphDatabase and presenter context (getProfile, getActiveIntents, getNetwork, getUser). */\ntype HomeGraphDb = HomeGraphDatabase;\n\nexport type HomeGraphInvokeInput = {\n userId: string;\n networkId?: string;\n scopeType?: 'intent';\n scopeId?: string;\n limit?: number;\n noCache?: boolean;\n /**\n * 'skeleton' returns immediately without LLM work: cached cards complete,\n * uncached cards with identity fields only + `presentationPending: true`,\n * single flat section (no categorizer). Meant as the fast first phase of a\n * two-phase fetch — follow up with a full request to fill in the text.\n */\n presentation?: 'full' | 'skeleton';\n /**\n * When set, filter loaded opportunities to these lifecycle statuses. Defaults to `DEFAULT_HOME_STATUSES`.\n * Explicit statuses switch the graph to \"lifecycle view\" mode: terminal/internal\n * statuses pass through (only latent/pending stay gated by viewer actionability),\n * ordering is newest-first, and feed composition capping is skipped.\n */\n statuses?: OpportunityStatus[];\n};\n\nexport type HomeGraphInvokeResult = {\n sections: HomeSection[];\n meta: { totalOpportunities: number; totalSections: number };\n error?: string;\n};\n\n/** Default home-feed statuses: the lifecycle stages a viewer can act on today. */\nexport const DEFAULT_HOME_STATUSES: OpportunityStatus[] = ['latent', 'pending'];\n\n// Exhaustive registry — keys must cover every OpportunityStatus union member.\n// Adding a new status to OpportunityStatus without adding a key here is a TS error,\n// which is the whole point: prevents ALL_OPPORTUNITY_STATUSES from silently drifting.\nconst OPPORTUNITY_STATUS_REGISTRY: Record<OpportunityStatus, true> = {\n latent: true,\n draft: true,\n negotiating: true,\n pending: true,\n stalled: true,\n accepted: true,\n rejected: true,\n expired: true,\n};\n\n/** Full status enumeration. Pass this to `HomeGraphInvokeInput.statuses` to restore pre-Issue-3 (unfiltered) behavior. */\nexport const ALL_OPPORTUNITY_STATUSES: OpportunityStatus[] = Object.keys(\n OPPORTUNITY_STATUS_REGISTRY,\n) as OpportunityStatus[];\n\nconst MAX_ITEMS_PER_SECTION = 20;\nconst PRESENTATION_CONCURRENCY = 50;\nconst MAX_REASONING_SNIPPET_LENGTH = 240;\nconst HOME_CACHE_TTL = 24 * 60 * 60; // 24 hours in seconds\n\n/** Redis key for the categorizer cache, derived from the user and the ordered opportunity-id set. */\nfunction buildCategorizerCacheKey(userId: string, cards: HomeCardItem[]): string {\n const oppIds = cards.map((c) => c.opportunityId).join(',');\n const hash = createHash('sha256').update(oppIds).digest('hex').slice(0, 16);\n return `home:categories:${userId}:${hash}`;\n}\n\n/**\n * Strip leading narrator name from remark when the UI already prepends \"Name: \" to the chip.\n * Avoids duplication like \"Yankı Ekin Yüksel: Yankı Ekin Yüksel introduced you two...\"\n * Repeats until no leading name (handles \"Name: Name rest\").\n */\nexport function stripLeadingNarratorName(remark: string, narratorName: string): string {\n let t = remark.trim();\n if (!t || !narratorName.trim()) return remark;\n const name = narratorName.trim();\n const nameLower = name.toLowerCase();\n for (;;) {\n const lower = t.toLowerCase();\n if (!lower.startsWith(nameLower)) break;\n const rest = t.slice(name.length).replace(/^\\s*[:,\\-–—]\\s*/i, '').trim();\n if (rest.length === 0 || rest === t) break;\n t = rest;\n }\n return t;\n}\n\n/** Normalize timestamp for sorting; returns numeric ms or 0 for invalid/missing. */\nconst safeParseDate = (value: unknown): number => {\n if (value == null) return 0;\n if (value instanceof Date) {\n const t = value.getTime();\n return Number.isFinite(t) ? t : 0;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const t = new Date(value).getTime();\n return Number.isFinite(t) ? t : 0;\n }\n return 0;\n};\n\n/** Confidence score for sorting (interpretation.confidence or opportunity.confidence). */\nconst getRawConfidence = (opp: typeof HomeGraphState.State['opportunities'][number]): number => {\n const fromInterp = opp.interpretation?.confidence;\n if (typeof fromInterp === 'number' && !Number.isNaN(fromInterp)) return fromInterp;\n if (typeof fromInterp === 'string') {\n const n = parseFloat(fromInterp);\n if (!Number.isNaN(n)) return n;\n }\n const fromRow = opp.confidence;\n if (typeof fromRow === 'number' && !Number.isNaN(fromRow)) return fromRow;\n if (typeof fromRow === 'string') {\n const n = parseFloat(fromRow);\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n};\n\n/**\n * Sort confidence, optionally pool-adjusted (IND-419): when\n * POOL_QUESTIONS_RANKING=on, answered discriminators multiply confidence by\n * their stored factors (floor 0.3) so the user's answers re-rank the feed.\n * Flag off → identical to raw confidence (adjustments are write-only).\n */\nconst getConfidence = (opp: typeof HomeGraphState.State['opportunities'][number]): number => {\n const raw = getRawConfidence(opp);\n if (poolQuestionsRanking() !== 'on') return raw;\n return adjustedConfidence(raw, (opp as { metadata?: Record<string, unknown> | null }).metadata);\n};\n\n/** Unique non-introducer, non-viewer userIds for an opportunity (actors can repeat). */\nconst getUniqueCounterpartUserIds = (\n opp: typeof HomeGraphState.State['opportunities'][number],\n viewerId: string\n): Set<string> => {\n const ids = new Set<string>();\n for (const a of opp.actors) {\n if (a.role !== 'introducer' && a.userId !== viewerId && a.userId) {\n ids.add(a.userId);\n }\n }\n return ids;\n};\n\nconst pickDisplayCounterpartActor = (\n opportunity: typeof HomeGraphState.State['opportunities'][number],\n viewerId: string\n): { userId: string; role: string } | null => {\n const candidates = opportunity.actors.filter(\n (actor) => actor.userId !== viewerId && actor.role !== 'introducer'\n );\n if (candidates.length === 0) {\n return null;\n }\n\n // Prefer direct counterpart roles when available, then stable sort by user id.\n const rolePriority = new Map<string, number>([\n ['patient', 0],\n ['party', 1],\n ['agent', 2],\n ['peer', 3],\n ]);\n\n const sorted = [...candidates].sort((a, b) => {\n const aPriority = rolePriority.get(a.role) ?? 99;\n const bPriority = rolePriority.get(b.role) ?? 99;\n if (aPriority !== bPriority) return aPriority - bPriority;\n return a.userId.localeCompare(b.userId);\n });\n return sorted[0] ?? null;\n};\n\nexport class HomeGraphFactory {\n constructor(private database: HomeGraphDb, private cache: OpportunityCache) {}\n\n createGraph() {\n const presenter = new OpportunityPresenter();\n const categorizer = new HomeCategorizerAgent();\n\n const loadOpportunitiesNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.loadOpportunities\", async () => {\n if (!state.userId) {\n return { error: 'userId is required' };\n }\n try {\n // Minimum of 50 ensures enough candidates across all feed categories\n // (connection, connector-flow, expired) for selectByComposition to fill\n // its soft targets, even after visibility filtering and dedup.\n const fetchLimit = Math.min(150, Math.max(50, state.limit * 3));\n const statuses = state.statuses ?? DEFAULT_HOME_STATUSES;\n const options: { limit?: number; networkId?: string; scopeType?: 'intent'; scopeId?: string; statuses?: OpportunityStatus[] } = {\n limit: fetchLimit,\n statuses,\n };\n if (state.networkId) options.networkId = state.networkId;\n if (state.scopeType === 'intent' && state.scopeId) {\n options.scopeType = 'intent';\n options.scopeId = state.scopeId;\n }\n // Do not pass conversationId: home view excludes draft opportunities (chat-only drafts).\n const raw = await this.database.getOpportunitiesForUser(state.userId, options);\n const visible = raw.filter((opp) =>\n canUserSeeOpportunity(opp.actors, opp.status, state.userId)\n );\n // Actionability only gates the live statuses a viewer could act on:\n // latent/pending cards the viewer cannot act on are noise, but\n // terminal/internal statuses (accepted, rejected, expired, negotiating,\n // stalled, draft) are deliberate history — when a caller explicitly\n // requests them via `statuses`, they must pass through (they are never\n // actionable by rule 5, so filtering them here would return nothing).\n // The requested-status membership check is defense-in-depth: rows\n // outside the requested set are dropped even if the adapter drifts.\n const requestedStatuses = new Set<OpportunityStatus>(statuses);\n const visibleForFeed = visible.filter((opp) => {\n if (!requestedStatuses.has(opp.status)) return false;\n if (opp.status === 'latent' || opp.status === 'pending') {\n return isActionableForViewer(opp.actors, opp.status, state.userId);\n }\n return true;\n });\n const explicitStatuses = (state.statuses?.length ?? 0) > 0;\n if (explicitStatuses) {\n // Lifecycle view (e.g. intent radar): newest-first so counterpart\n // dedup keeps each person's most recent state (an accepted\n // opportunity supersedes an older pending one), no composition\n // capping — the caller wants the full pipeline up to `limit`.\n const newestFirst = [...visibleForFeed].sort(\n (a, b) => safeParseDate(b.updatedAt) - safeParseDate(a.updatedAt)\n );\n const seenIds = new Set<string>();\n const dedupedByCounterpart = newestFirst.filter((opp) => {\n const counterpartIds = getUniqueCounterpartUserIds(opp, state.userId);\n const hasOverlap = [...counterpartIds].some((id) => seenIds.has(id));\n if (hasOverlap) return false;\n for (const id of counterpartIds) seenIds.add(id);\n return true;\n });\n // Preserve byte-identical newest-first behavior while the flag is\n // off. When on, re-order the already-deduped lifecycle set by\n // adjusted confidence so each client-side radar bucket reflects\n // pool answers immediately.\n if (poolQuestionsRanking() !== 'on') {\n return { opportunities: dedupedByCounterpart.slice(0, state.limit) };\n }\n const adjustedOrder = [...dedupedByCounterpart].sort((a, b) => {\n const confidenceDelta = getConfidence(b) - getConfidence(a);\n if (confidenceDelta !== 0) return confidenceDelta;\n return safeParseDate(b.updatedAt) - safeParseDate(a.updatedAt);\n });\n return { opportunities: adjustedOrder.slice(0, state.limit) };\n }\n const sorted = [...visibleForFeed].sort((a, b) => {\n // Connections before connector-flow so dedup claims counterpart IDs\n // for direct connections first — prevents introducer cards from\n // shadowing a user's own connection opportunities.\n const aIsIntroducer = a.actors.some((ac) => ac.userId === state.userId && ac.role === 'introducer');\n const bIsIntroducer = b.actors.some((ac) => ac.userId === state.userId && ac.role === 'introducer');\n if (aIsIntroducer !== bIsIntroducer) return aIsIntroducer ? 1 : -1;\n const confA = getConfidence(a);\n const confB = getConfidence(b);\n if (confB !== confA) return confB - confA;\n const aTime = safeParseDate(a.updatedAt);\n const bTime = safeParseDate(b.updatedAt);\n return bTime - aTime;\n });\n const seenUserIds = new Set<string>();\n const deduped = sorted.filter((opp) => {\n const counterpartIds = getUniqueCounterpartUserIds(opp, state.userId);\n const hasOverlap = [...counterpartIds].some((id) => seenUserIds.has(id));\n if (hasOverlap) return false;\n for (const id of counterpartIds) seenUserIds.add(id);\n return true;\n });\n const opportunities = selectByComposition(deduped, state.userId);\n return { opportunities };\n } catch (e) {\n logger.error('HomeGraph loadOpportunities failed', { error: e });\n return { error: 'Failed to load opportunities', opportunities: [] };\n }\n });\n };\n\n const checkPresenterCacheNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.checkPresenterCache\", async () => {\n const { opportunities, userId } = state;\n if (opportunities.length === 0) {\n return { cachedCards: new Map(), uncachedOpportunities: [] };\n }\n\n if (state.noCache) {\n checkPresenterCacheLog.verbose('noCache=true, skipping cache');\n return { cachedCards: new Map(), uncachedOpportunities: opportunities };\n }\n\n try {\n // Negotiating cards are templated (no LLM call) and their text\n // depends on the live turn count, which changes between requests\n // without changing the opportunity status. Skip cache entirely\n // for them so each render reflects the current turn.\n //\n // For all other statuses, include status in the key so status\n // transitions (e.g. negotiating → pending) don't serve stale cards.\n const cacheable = opportunities.filter((opp) => opp.status !== 'negotiating');\n const liveNegotiating = opportunities.filter((opp) => opp.status === 'negotiating');\n\n const keys = cacheable.map(\n (opp) => `home:card:${opp.id}:${opp.status}:${userId}`\n );\n const results = keys.length > 0 ? await this.cache.mget<HomeCardItem>(keys) : [];\n\n const cachedCards = new Map<string, HomeCardItem>();\n const uncachedOpportunities: typeof opportunities = [...liveNegotiating];\n\n for (let i = 0; i < cacheable.length; i++) {\n const cached = results[i];\n if (cached) {\n const originalIndex = opportunities.indexOf(cacheable[i]);\n // Stamp the live status: pre-status cache entries lack the field,\n // and the key already guarantees it matches the current status.\n const deprioritizedReason = poolQuestionsRanking() === 'on'\n ? latestPoolDemotionDetail((cacheable[i] as { metadata?: Record<string, unknown> | null }).metadata)\n : undefined;\n cachedCards.set(cacheable[i].id, {\n ...cached,\n status: cacheable[i].status,\n deprioritizedReason,\n _cardIndex: originalIndex,\n });\n } else {\n uncachedOpportunities.push(cacheable[i]);\n }\n }\n\n checkPresenterCacheLog.verbose('', {\n total: opportunities.length,\n cacheHits: cachedCards.size,\n cacheMisses: uncachedOpportunities.length,\n });\n\n return { cachedCards, uncachedOpportunities };\n } catch (e) {\n checkPresenterCacheLog.warn('cache unavailable, skipping', { error: e });\n return { cachedCards: new Map(), uncachedOpportunities: opportunities };\n }\n });\n };\n\n const shouldGenerateCards = (state: typeof HomeGraphState.State): string => {\n if (state.uncachedOpportunities.length > 0) {\n return 'generate';\n }\n logger.verbose('All presenter results cached, skipping generation');\n return 'skip';\n };\n\n const generateCardTextNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.generateCardText\", async () => {\n const opportunities = state.uncachedOpportunities.length > 0\n ? state.uncachedOpportunities\n : state.opportunities;\n generateCardTextLog.verbose('entry', { opportunitiesLength: opportunities.length, userId: state.userId });\n if (opportunities.length === 0) {\n generateCardTextLog.verbose('exit', { totalOpportunities: 0, totalSections: 0 });\n return { cards: [], agentTimings: [], meta: { totalOpportunities: 0, totalSections: 0 } };\n }\n const db = this.database as PresenterDatabase & HomeGraphDb;\n const cards: HomeCardItem[] = [];\n const relevantActorIds = new Set<string>();\n for (const opp of opportunities) {\n for (const a of opp.actors) {\n if (a.userId) relevantActorIds.add(a.userId);\n }\n }\n\n const userEntries = await Promise.all(\n Array.from(relevantActorIds).map(async (userId) => {\n try {\n const user = await this.database.getUser(userId);\n return [userId, user ?? null] as const;\n } catch {\n return [userId, null] as const;\n }\n })\n );\n const userMap = new Map(userEntries);\n\n const oppIndexMap = new Map(\n state.opportunities.map((opp, idx) => [opp.id, idx])\n );\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n for (let i = 0; i < opportunities.length; i += PRESENTATION_CONCURRENCY) {\n const chunk = opportunities.slice(i, i + PRESENTATION_CONCURRENCY);\n const chunkCards = await Promise.all(\n chunk.map(async (opportunity, offset) => {\n const cardIndex = oppIndexMap.get(opportunity.id) ?? (i + offset);\n const viewerActor = opportunity.actors.find((a) => a.userId === state.userId);\n const viewerRole = viewerActor?.role ?? 'party';\n const isIntroducer = viewerRole === 'introducer';\n const preferredActor = pickDisplayCounterpartActor(opportunity, state.userId)\n ?? opportunity.actors.find((a) => a.userId !== state.userId && a.role !== 'introducer');\n const actorWithProfile = opportunity.actors.find(\n (a) => a.userId !== state.userId && a.role !== 'introducer' && !!userMap.get(a.userId)\n );\n const introducer = opportunity.actors.find((a) => a.role === 'introducer');\n let otherActor = (preferredActor && userMap.get(preferredActor.userId))\n ? preferredActor\n : (actorWithProfile ?? preferredActor);\n // When the only other participant is the introducer (no separate party), use introducer as display counterpart so the card shows a name instead of \"Unknown\"\n if (!otherActor && introducer && introducer.userId !== state.userId && introducer.userId) {\n otherActor = { userId: introducer.userId, role: introducer.role };\n }\n const otherUser = otherActor ? userMap.get(otherActor.userId) ?? null : null;\n const introducerCounterparts = opportunity.actors.filter(\n (a) => a.userId !== state.userId && a.role !== 'introducer'\n );\n // Deduplicate by userId — actors array can contain multiple rows per user\n // (e.g. from different intents), which would produce repeated names.\n const uniqueCounterpartIds = [...new Set(introducerCounterparts.map((a) => a.userId))];\n const participantNames = uniqueCounterpartIds\n .map((uid) => userMap.get(uid)?.name ?? 'Unknown')\n .sort();\n // When secondPartyData will be present (2+ counterparts), use single counterpart name\n // because the frontend arrow layout renders \"card.name → secondParty.name\".\n // Using the joined \"A ↔ B\" format here would produce redundant \"A ↔ B → B\".\n // Only use the joined format when there is a single counterpart (no arrow layout).\n const willHaveSecondParty = isIntroducer && uniqueCounterpartIds.length > 1;\n let userName = isIntroducer && participantNames.length > 0 && !willHaveSecondParty\n ? participantNames.join(' ↔ ')\n : (otherUser?.name ?? 'Unknown');\n // Fallback to profile identity name when users.name is missing (e.g. profile has display name, users row does not)\n if ((userName === 'Unknown' || !userName?.trim()) && otherActor?.userId && db.getProfile) {\n const profile = await db.getProfile(otherActor.userId).catch((err) => {\n logger.debug('getProfile fallback failed', { otherActorUserId: otherActor.userId, error: err });\n return null;\n });\n const profileName = profile?.identity?.name?.trim();\n if (profileName) userName = profileName;\n }\n // Unresolvable display counterpart (deleted user: no users row, no\n // profile fallback). Drop the card entirely instead of rendering an\n // \"Unknown\" placeholder: such cards are unusable, excluded from the\n // presenter cache (see cachePresenterResults), and would otherwise\n // trigger a fresh presenter LLM call on every request — a permanent\n // cache miss that keeps the whole feed slow (~9s per load).\n if (userName === 'Unknown' || !userName?.trim()) {\n logger.verbose('[HomeGraph:generateCardText] dropping card with unresolvable counterpart', {\n opportunityId: opportunity.id,\n otherActorUserId: otherActor?.userId,\n });\n return null;\n }\n const userAvatar = otherUser?.avatar ?? null;\n // Shared sanitization standard (UUID strip, viewer-centric rewrite,\n // boundary truncation) — raw reasoning must never render verbatim.\n const reasoningSnippet = safeFallbackSummary(\n typeof opportunity.interpretation?.reasoning === 'string'\n ? opportunity.interpretation.reasoning\n : '',\n {\n counterpartName: userName !== 'Unknown' ? userName : undefined,\n maxChars: MAX_REASONING_SNIPPET_LENGTH,\n emptyText: 'A promising connection.',\n },\n );\n\n // Build secondParty for introducer arrow layout (the party that isn't the display counterpart)\n let secondPartyData: { name: string; avatar?: string | null; userId?: string } | undefined;\n if (isIntroducer && introducerCounterparts.length > 1 && otherActor) {\n const secondActor = introducerCounterparts.find((a) => a.userId !== otherActor.userId);\n if (secondActor) {\n const secondUser = userMap.get(secondActor.userId) ?? null;\n secondPartyData = {\n name: secondUser?.name ?? 'Unknown',\n avatar: secondUser?.avatar ?? null,\n userId: secondActor.userId,\n };\n }\n }\n\n const isCounterpartGhost = otherUser?.isGhost ?? false;\n // Skeleton presentation: return an identity-only card without the\n // presenter LLM or negotiation-context load. Name resolution and\n // the unresolvable-counterpart drop above still apply, so the card\n // set matches what the follow-up full request will return.\n if (state.presentation === 'skeleton') {\n return {\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: '',\n cta: '',\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: isIntroducer ? 'Connector match' : 'Shared interests',\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n presentationPending: true,\n _cardIndex: cardIndex,\n } satisfies HomeCardItem;\n }\n const isPendingIntroducerFallback = isIntroducer && opportunity.status !== 'latent';\n const fallbackCard = (): HomeCardItem => ({\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: reasoningSnippet,\n cta: isIntroducer\n ? (isPendingIntroducerFallback ? 'Share this introduction to get things started.' : 'Take a look and decide if this is a good match.')\n : 'Take a look and decide whether to reach out.',\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: isIntroducer ? 'Connector match' : 'Shared interests',\n narratorChip: isIntroducer\n ? { name: 'You', text: 'Worth a look.', userId: state.userId }\n : { name: 'Index', text: 'Worth a look.' },\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n _cardIndex: cardIndex,\n });\n\n try {\n const [ctx, negotiationContext] = await Promise.all([\n gatherPresenterContext(\n db,\n opportunity,\n state.userId,\n otherActor?.userId,\n ),\n loadNegotiationContext(db, opportunity.id, opportunity.status),\n ]);\n const homeInput = {\n ...ctx,\n mutualIntentCount: undefined,\n opportunityStatus: opportunity.status,\n ...(negotiationContext ? { negotiationContext } : {}),\n };\n const _traceEmitterPresenter = requestContext.getStore()?.traceEmitter;\n const presenterStart = Date.now();\n _traceEmitterPresenter?.({ type: \"agent_start\", name: \"opportunity-presenter\" });\n const presentation = await presenter.presentHomeCard(homeInput);\n const _presenterDuration = Date.now() - presenterStart;\n agentTimingsAccum.push({ name: 'opportunity.presenter', durationMs: _presenterDuration });\n _traceEmitterPresenter?.({ type: \"agent_end\", name: \"opportunity-presenter\", durationMs: _presenterDuration, summary: `Presented: ${userName}` });\n let narratorChip: { name: string; text: string; avatar?: string | null; userId?: string } | undefined;\n // Only show a person as narrator when they are the introducer and not the display counterpart\n // (bad data can have same user as introducer and party, e.g. \"Amina introduced you to Amina\")\n const introducerIsCounterpart = introducer && otherActor && introducer.userId === otherActor.userId;\n if (introducer && introducer.userId !== state.userId && !introducerIsCounterpart) {\n const introUser = userMap.get(introducer.userId) ?? null;\n const narratorName = introUser?.name ?? 'Someone';\n narratorChip = {\n name: narratorName,\n text: stripLeadingNarratorName(presentation.narratorRemark, narratorName),\n avatar: introUser?.avatar ?? null,\n userId: introducer.userId,\n };\n } else if (introducer?.userId === state.userId) {\n narratorChip = { name: 'You', text: presentation.narratorRemark, userId: state.userId };\n } else {\n narratorChip = { name: 'Index', text: presentation.narratorRemark };\n }\n return {\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: presentation.personalizedSummary,\n cta: presentation.suggestedAction,\n headline: presentation.headline,\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: presentation.mutualIntentsLabel,\n narratorChip,\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n _cardIndex: cardIndex,\n } satisfies HomeCardItem;\n } catch (e) {\n logger.warn('HomeGraph presenter failed for opportunity', { opportunityId: opportunity.id, error: e });\n return fallbackCard();\n }\n })\n );\n cards.push(...chunkCards.filter((c): c is HomeCardItem => c !== null));\n }\n generateCardTextLog.verbose('exit', { totalOpportunities: state.opportunities.length, totalSections: 0 });\n return {\n cards,\n agentTimings: agentTimingsAccum,\n meta: { totalOpportunities: state.opportunities.length, totalSections: 0 },\n };\n });\n };\n\n const cachePresenterResultsNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.cachePresenterResults\", async () => {\n const { cards, cachedCards, userId, opportunities } = state;\n const liveById = new Map(opportunities.map((opportunity) => [opportunity.id, opportunity]));\n const cardsWithAdjustments = cards.map((card) => {\n const opportunity = liveById.get(card.opportunityId);\n const deprioritizedReason = poolQuestionsRanking() === 'on'\n ? latestPoolDemotionDetail((opportunity as { metadata?: Record<string, unknown> | null } | undefined)?.metadata)\n : undefined;\n return { ...card, deprioritizedReason };\n });\n\n // Only cache cards that weren't already from cache\n const newCards = cardsWithAdjustments.filter((card) => !cachedCards.has(card.opportunityId));\n const statusById = new Map(opportunities.map((opp) => [opp.id, opp.status]));\n\n try {\n await Promise.all(\n newCards.map((card) => {\n const status = statusById.get(card.opportunityId);\n // Skip persisting negotiating cards — see read-side note.\n if (!status || status === 'negotiating') return Promise.resolve();\n // Never cache skeleton cards — they carry no presenter text and\n // would otherwise be served as \"complete\" for the full TTL.\n if (card.presentationPending) return Promise.resolve();\n // Skip caching cards with unresolved names — transient DB failures\n // would persist \"Unknown\" placeholders for the full TTL.\n if (!card.name || card.name === 'Unknown') return Promise.resolve();\n return this.cache.set(\n `home:card:${card.opportunityId}:${status}:${userId}`,\n card,\n { ttl: HOME_CACHE_TTL }\n );\n })\n );\n } catch (e) {\n cachePresenterResultsLog.warn('cache write failed, continuing', { error: e });\n }\n\n // Merge cached cards into full card list\n const allCards: HomeCardItem[] = [...cardsWithAdjustments];\n for (const [oppId, cachedCard] of cachedCards) {\n if (!cardsWithAdjustments.some((card) => card.opportunityId === oppId)) {\n allCards.push(cachedCard);\n }\n }\n\n // Re-sort by _cardIndex to maintain original ordering\n allCards.sort((a, b) => a._cardIndex - b._cardIndex);\n\n cachePresenterResultsLog.verbose('', {\n newlyCached: newCards.length,\n totalCards: allCards.length,\n });\n\n return {\n cards: allCards,\n meta: { totalOpportunities: state.opportunities.length, totalSections: 0 },\n };\n });\n };\n\n const checkCategorizerCacheNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.checkCategorizerCache\", async () => {\n if (state.cards.length === 0) {\n return { categoryCacheHit: false };\n }\n\n // Skeleton runs never categorize (some cards have no text to categorize\n // and the response must stay LLM-free). Ranking-enabled lifecycle views\n // also stay flat: the intent Radar flattens sections and buckets by\n // status, so dynamic categorization would erase the adjusted order on\n // the full second-phase response. Flag off retains the legacy path.\n // Chunk by MAX_ITEMS_PER_SECTION because normalizeAndSort caps sections.\n const preserveAdjustedLifecycleOrder =\n (state.statuses?.length ?? 0) > 0 && poolQuestionsRanking() === 'on';\n if (state.presentation === 'skeleton' || preserveAdjustedLifecycleOrder) {\n const sectionProposals: HomeSectionProposal[] = [];\n for (let start = 0; start < state.cards.length; start += MAX_ITEMS_PER_SECTION) {\n sectionProposals.push({\n id: `all-${sectionProposals.length + 1}`,\n title: 'All matches',\n iconName: DEFAULT_HOME_SECTION_ICON,\n itemIndices: state.cards.slice(start, start + MAX_ITEMS_PER_SECTION).map((_, i) => start + i),\n });\n }\n return { sectionProposals, categoryCacheHit: true };\n }\n\n if (state.noCache) {\n checkCategorizerCacheLog.verbose('noCache=true, skipping cache');\n return { categoryCacheHit: false };\n }\n\n try {\n const key = buildCategorizerCacheKey(state.userId, state.cards);\n\n const cached = await this.cache.get<HomeSectionProposal[]>(key);\n if (cached) {\n checkCategorizerCacheLog.verbose('cache hit');\n return { sectionProposals: cached, categoryCacheHit: true };\n }\n\n checkCategorizerCacheLog.verbose('cache miss');\n } catch (e) {\n checkCategorizerCacheLog.warn('cache unavailable, skipping', { error: e });\n }\n return { categoryCacheHit: false };\n });\n };\n\n const shouldCategorize = (state: typeof HomeGraphState.State): string => {\n if (state.categoryCacheHit) {\n logger.verbose('Categorizer results cached, skipping');\n return 'skip';\n }\n return 'categorize';\n };\n\n const categorizeDynamicallyNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.categorizeDynamically\", async () => {\n categorizeDynamicallyLog.verbose('entry', { cardsLength: state.cards.length });\n if (state.cards.length === 0) {\n categorizeDynamicallyLog.verbose('exit', { sectionProposalsCount: 0 });\n return { sectionProposals: [], agentTimings: [] };\n }\n const agentTimingsAccum: DebugMetaAgent[] = [];\n const categorizerInput = state.cards.map((c) => ({\n index: c._cardIndex,\n headline: c.headline,\n mainText: c.mainText,\n name: c.name,\n viewerRole: c.viewerRole === 'introducer' ? 'introducer' : undefined,\n opportunityStatus: c.viewerRole === 'introducer' ? 'pending' : undefined,\n }));\n const _traceEmitterCategorizer = requestContext.getStore()?.traceEmitter;\n const categorizerStart = Date.now();\n _traceEmitterCategorizer?.({ type: \"agent_start\", name: \"home-categorizer\" });\n const { sections } = await categorizer.categorize(categorizerInput);\n const _categorizerDuration = Date.now() - categorizerStart;\n agentTimingsAccum.push({ name: 'home.categorizer', durationMs: _categorizerDuration });\n _traceEmitterCategorizer?.({ type: \"agent_end\", name: \"home-categorizer\", durationMs: _categorizerDuration, summary: `Categorized into ${sections.length} section(s)` });\n const proposals: HomeSectionProposal[] = sections.map((s) => ({\n ...s,\n itemIndices: s.itemIndices.filter((i) => i >= 0 && i < state.cards.length),\n }));\n categorizeDynamicallyLog.verbose('exit', { sectionProposalsCount: proposals.length });\n return { sectionProposals: proposals, agentTimings: agentTimingsAccum };\n });\n };\n\n const cacheCategorizerResultsNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.cacheCategorizerResults\", async () => {\n if (state.categoryCacheHit || state.sectionProposals.length === 0) {\n return {};\n }\n\n try {\n const key = buildCategorizerCacheKey(state.userId, state.cards);\n\n await this.cache.set(key, state.sectionProposals, { ttl: HOME_CACHE_TTL });\n\n cacheCategorizerResultsLog.verbose('cached', {\n sectionCount: state.sectionProposals.length,\n });\n } catch (e) {\n cacheCategorizerResultsLog.warn('cache write failed, continuing', { error: e });\n }\n\n return {};\n });\n };\n\n const normalizeAndSortNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.normalizeAndSort\", async () => {\n const cards = state.cards;\n const proposals = state.sectionProposals;\n normalizeAndSortLog.verbose('entry', { cardsLength: cards.length, proposalsLength: proposals.length });\n if (cards.length === 0) {\n normalizeAndSortLog.verbose('exit', { totalOpportunities: 0, totalSections: 0 });\n return { sections: [], meta: { totalOpportunities: 0, totalSections: 0 } };\n }\n const usedIndices = new Set<number>();\n const sections: HomeSection[] = proposals.map((p) => {\n const iconName = resolveHomeSectionIcon(p.iconName);\n const items: HomeSectionItem[] = p.itemIndices\n .filter((i) => i >= 0 && i < cards.length && !usedIndices.has(i))\n .slice(0, MAX_ITEMS_PER_SECTION)\n .map((i) => {\n usedIndices.add(i);\n const card = cards[i];\n const { _cardIndex, ...rest } = card;\n return rest;\n });\n return {\n id: p.id,\n title: p.title,\n subtitle: p.subtitle,\n iconName,\n items,\n };\n });\n\n // Enforce category ordering: sections with connections first, then\n // connector-flow only, then expired only. This prevents the LLM\n // categorizer from placing introducer sections before connection sections.\n const sectionCategoryPriority = (section: HomeSection): number => {\n const hasConnection = section.items.some((item) => item.viewerRole !== 'introducer');\n if (hasConnection) return 0; // mixed or connection-only sections first\n const hasConnectorFlow = section.items.some((item) => item.viewerRole === 'introducer');\n if (hasConnectorFlow) return 1; // connector-flow only sections next\n return 2; // empty or expired sections last\n };\n sections.sort((a, b) => sectionCategoryPriority(a) - sectionCategoryPriority(b));\n const meta = {\n totalOpportunities: state.opportunities.length,\n totalSections: sections.length,\n };\n normalizeAndSortLog.verbose('exit', { totalOpportunities: meta.totalOpportunities, totalSections: meta.totalSections });\n return { sections, meta };\n });\n };\n\n const graph = new StateGraph(HomeGraphState)\n .addNode('loadOpportunities', loadOpportunitiesNode)\n .addNode('checkPresenterCache', checkPresenterCacheNode)\n .addNode('generateCardText', generateCardTextNode)\n .addNode('cachePresenterResults', cachePresenterResultsNode)\n .addNode('checkCategorizerCache', checkCategorizerCacheNode)\n .addNode('categorizeDynamically', categorizeDynamicallyNode)\n .addNode('cacheCategorizerResults', cacheCategorizerResultsNode)\n .addNode('normalizeAndSort', normalizeAndSortNode)\n .addEdge(START, 'loadOpportunities')\n .addEdge('loadOpportunities', 'checkPresenterCache')\n .addConditionalEdges('checkPresenterCache', shouldGenerateCards, {\n generate: 'generateCardText',\n skip: 'cachePresenterResults',\n })\n .addEdge('generateCardText', 'cachePresenterResults')\n .addEdge('cachePresenterResults', 'checkCategorizerCache')\n .addConditionalEdges('checkCategorizerCache', shouldCategorize, {\n categorize: 'categorizeDynamically',\n skip: 'normalizeAndSort',\n })\n .addEdge('categorizeDynamically', 'cacheCategorizerResults')\n .addEdge('cacheCategorizerResults', 'normalizeAndSort')\n .addEdge('normalizeAndSort', END);\n\n return graph.compile();\n }\n}\n"]}
1
+ {"version":3,"file":"feed.graph.js","sourceRoot":"/","sources":["opportunity/feed/feed.graph.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Home Graph: Build the opportunity home view with dynamic sections.\n *\n * Independent of ChatGraph. Flow:\n * loadOpportunities → checkPresenterCache → [generateCardText if misses] → cachePresenterResults\n * → checkCategorizerCache → [categorizeDynamically if miss] → cacheCategorizerResults → normalizeAndSort\n *\n * Uses OpportunityPresenter for card text and an LLM to categorize cards into dynamic sections\n * with titles and Lucide icon names. Caches presenter and categorizer results via OpportunityCache.\n */\n\nimport { createHash } from 'crypto';\n\nimport { StateGraph, START, END } from '@langchain/langgraph';\n\nimport type { HomeGraphDatabase, OpportunityStatus } from '../../shared/interfaces/database.interface.js';\nimport type { OpportunityCache } from '../../shared/interfaces/cache.interface.js';\nimport { HomeGraphState, type HomeCardItem, type HomeSection, type HomeSectionProposal, type HomeSectionItem } from './feed.state.js';\nimport { OpportunityPresenter, gatherPresenterContext, type PresenterDatabase } from '../opportunity.presenter.js';\nimport { loadNegotiationContext } from '../negotiation-context.loader.js';\nimport { HomeCategorizerAgent } from './feed.categorizer.js';\nimport { canUserSeeOpportunity, isActionableForViewer, selectByComposition } from '../opportunity.utils.js';\nimport { resolveHomeSectionIcon, DEFAULT_HOME_SECTION_ICON } from '../../shared/ui/lucide.icon-catalog.js';\nimport { getPrimaryActionLabel, SECONDARY_ACTION_LABEL } from '../opportunity.labels.js';\nimport { safeFallbackSummary } from '../opportunity.safe-presentation.js';\nimport { buildHomeCardPresentationCacheKey, buildHomeCategoryPresentationCacheKey } from '../opportunity.presentation-cache.js';\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\nimport { protocolLogger } from '../../shared/observability/protocol.logger.js';\nimport { timed } from '../../shared/observability/performance.js';\nimport { requestContext } from \"../../shared/observability/request-context.js\";\nimport { adjustedConfidence, latestPoolDemotionDetail, readPoolAdjustments } from '../discriminator/discriminator.adjustments.js';\nimport type { PoolAdjustmentProvenance } from '../discriminator/discriminator.adjustments.js';\nimport { poolQuestionsRanking } from '../discriminator/discriminator.env.js';\n\nconst logger = protocolLogger('HomeGraph');\nconst checkCategorizerCacheLog = protocolLogger('HomeGraph:checkCategorizerCache');\nconst cacheCategorizerResultsLog = protocolLogger('HomeGraph:cacheCategorizerResults');\nconst checkPresenterCacheLog = protocolLogger('HomeGraph:checkPresenterCache');\nconst cachePresenterResultsLog = protocolLogger('HomeGraph:cachePresenterResults');\nconst categorizeDynamicallyLog = protocolLogger('HomeGraph:categorizeDynamically');\nconst normalizeAndSortLog = protocolLogger('HomeGraph:normalizeAndSort');\nconst generateCardTextLog = protocolLogger('HomeGraph:generateCardText');\n\n/** Database must satisfy both HomeGraphDatabase and presenter context (getProfile, getActiveIntents, getNetwork, getUser). */\ntype HomeGraphDb = HomeGraphDatabase;\n\nexport type HomeGraphInvokeInput = {\n userId: string;\n networkId?: string;\n scopeType?: 'intent';\n scopeId?: string;\n limit?: number;\n noCache?: boolean;\n /**\n * 'skeleton' returns immediately without LLM work: cached cards complete,\n * uncached cards with identity fields only + `presentationPending: true`,\n * single flat section (no categorizer). Meant as the fast first phase of a\n * two-phase fetch — follow up with a full request to fill in the text.\n */\n presentation?: 'full' | 'skeleton';\n /**\n * When set, filter loaded opportunities to these lifecycle statuses. Defaults to `DEFAULT_HOME_STATUSES`.\n * Explicit statuses switch the graph to \"lifecycle view\" mode: terminal/internal\n * statuses pass through (only latent/pending stay gated by viewer actionability),\n * ordering is newest-first, and feed composition capping is skipped.\n */\n statuses?: OpportunityStatus[];\n};\n\nexport type HomeGraphInvokeResult = {\n sections: HomeSection[];\n meta: { totalOpportunities: number; totalSections: number };\n error?: string;\n};\n\n/** Default home-feed statuses: the lifecycle stages a viewer can act on today. */\nexport const DEFAULT_HOME_STATUSES: OpportunityStatus[] = ['latent', 'pending'];\n\n// Exhaustive registry — keys must cover every OpportunityStatus union member.\n// Adding a new status to OpportunityStatus without adding a key here is a TS error,\n// which is the whole point: prevents ALL_OPPORTUNITY_STATUSES from silently drifting.\nconst OPPORTUNITY_STATUS_REGISTRY: Record<OpportunityStatus, true> = {\n latent: true,\n draft: true,\n negotiating: true,\n pending: true,\n stalled: true,\n accepted: true,\n rejected: true,\n expired: true,\n};\n\n/** Full status enumeration. Pass this to `HomeGraphInvokeInput.statuses` to restore pre-Issue-3 (unfiltered) behavior. */\nexport const ALL_OPPORTUNITY_STATUSES: OpportunityStatus[] = Object.keys(\n OPPORTUNITY_STATUS_REGISTRY,\n) as OpportunityStatus[];\n\nconst MAX_ITEMS_PER_SECTION = 20;\nconst PRESENTATION_CONCURRENCY = 50;\nconst MAX_REASONING_SNIPPET_LENGTH = 240;\nconst HOME_CACHE_TTL = 24 * 60 * 60; // 24 hours in seconds\n\n/** Pure cache policy for presenter cards; degraded current-request copy retries later. */\nexport function isHomePresentationCacheable(\n card: Pick<HomeCardItem, 'presentationPending' | '_presentationFallback' | 'name'>,\n status: OpportunityStatus | undefined,\n): boolean {\n return Boolean(\n status &&\n status !== 'negotiating' &&\n !card.presentationPending &&\n !card._presentationFallback &&\n card.name &&\n card.name !== 'Unknown',\n );\n}\n\n/** Redis key for the categorizer cache, derived from the user and the ordered opportunity-id set. */\nfunction buildCategorizerCacheKey(userId: string, cards: HomeCardItem[]): string {\n const oppIds = cards.map((c) => c.opportunityId).join(',');\n const hash = createHash('sha256').update(oppIds).digest('hex').slice(0, 16);\n return buildHomeCategoryPresentationCacheKey(userId, hash);\n}\n\n/**\n * Strip leading narrator name from remark when the UI already prepends \"Name: \" to the chip.\n * Avoids duplication like \"Yankı Ekin Yüksel: Yankı Ekin Yüksel introduced you two...\"\n * Repeats until no leading name (handles \"Name: Name rest\").\n */\nexport function stripLeadingNarratorName(remark: string, narratorName: string): string {\n let t = remark.trim();\n if (!t || !narratorName.trim()) return remark;\n const name = narratorName.trim();\n const nameLower = name.toLowerCase();\n for (;;) {\n const lower = t.toLowerCase();\n if (!lower.startsWith(nameLower)) break;\n const rest = t.slice(name.length).replace(/^\\s*[:,\\-–—]\\s*/i, '').trim();\n if (rest.length === 0 || rest === t) break;\n t = rest;\n }\n return t;\n}\n\n/** Normalize timestamp for sorting; returns numeric ms or 0 for invalid/missing. */\nconst safeParseDate = (value: unknown): number => {\n if (value == null) return 0;\n if (value instanceof Date) {\n const t = value.getTime();\n return Number.isFinite(t) ? t : 0;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const t = new Date(value).getTime();\n return Number.isFinite(t) ? t : 0;\n }\n return 0;\n};\n\n/** Confidence score for sorting (interpretation.confidence or opportunity.confidence). */\nconst getRawConfidence = (opp: typeof HomeGraphState.State['opportunities'][number]): number => {\n const fromInterp = opp.interpretation?.confidence;\n if (typeof fromInterp === 'number' && !Number.isNaN(fromInterp)) return fromInterp;\n if (typeof fromInterp === 'string') {\n const n = parseFloat(fromInterp);\n if (!Number.isNaN(n)) return n;\n }\n const fromRow = opp.confidence;\n if (typeof fromRow === 'number' && !Number.isNaN(fromRow)) return fromRow;\n if (typeof fromRow === 'string') {\n const n = parseFloat(fromRow);\n if (!Number.isNaN(n)) return n;\n }\n return 0;\n};\n\n/**\n * Sort confidence, optionally pool-adjusted (IND-419): when\n * POOL_QUESTIONS_RANKING=on, answered discriminators multiply confidence by\n * their stored factors (floor 0.3) so the user's answers re-rank the feed.\n * Flag off → identical to raw confidence (adjustments are write-only).\n */\nconst getPoolRankingProvenance = (\n state: typeof HomeGraphState.State,\n): PoolAdjustmentProvenance | null => {\n if (\n poolQuestionsRanking() !== 'on' ||\n !state.userId ||\n state.scopeType !== 'intent' ||\n !state.scopeId\n ) return null;\n return { recipientUserId: state.userId, intentId: state.scopeId };\n};\n\nconst hasPoolAdjustment = (\n opp: typeof HomeGraphState.State['opportunities'][number],\n provenance: PoolAdjustmentProvenance,\n): boolean => readPoolAdjustments(\n (opp as { metadata?: Record<string, unknown> | null }).metadata,\n provenance,\n).length > 0;\n\nconst getConfidence = (\n opp: typeof HomeGraphState.State['opportunities'][number],\n provenance: PoolAdjustmentProvenance | null,\n): number => {\n const raw = getRawConfidence(opp);\n if (!provenance) return raw;\n return adjustedConfidence(\n raw,\n (opp as { metadata?: Record<string, unknown> | null }).metadata,\n provenance,\n );\n};\n\n/** Unique non-introducer, non-viewer userIds for an opportunity (actors can repeat). */\nconst getUniqueCounterpartUserIds = (\n opp: typeof HomeGraphState.State['opportunities'][number],\n viewerId: string\n): Set<string> => {\n const ids = new Set<string>();\n for (const a of opp.actors) {\n if (a.role !== 'introducer' && a.userId !== viewerId && a.userId) {\n ids.add(a.userId);\n }\n }\n return ids;\n};\n\nconst pickDisplayCounterpartActor = (\n opportunity: typeof HomeGraphState.State['opportunities'][number],\n viewerId: string\n): { userId: string; role: string } | null => {\n const candidates = opportunity.actors.filter(\n (actor) => actor.userId !== viewerId && actor.role !== 'introducer'\n );\n if (candidates.length === 0) {\n return null;\n }\n\n // Prefer direct counterpart roles when available, then stable sort by user id.\n const rolePriority = new Map<string, number>([\n ['patient', 0],\n ['party', 1],\n ['agent', 2],\n ['peer', 3],\n ]);\n\n const sorted = [...candidates].sort((a, b) => {\n const aPriority = rolePriority.get(a.role) ?? 99;\n const bPriority = rolePriority.get(b.role) ?? 99;\n if (aPriority !== bPriority) return aPriority - bPriority;\n return a.userId.localeCompare(b.userId);\n });\n return sorted[0] ?? null;\n};\n\nexport class HomeGraphFactory {\n constructor(private database: HomeGraphDb, private cache: OpportunityCache) {}\n\n createGraph() {\n const presenter = new OpportunityPresenter();\n const categorizer = new HomeCategorizerAgent();\n\n const loadOpportunitiesNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.loadOpportunities\", async () => {\n if (!state.userId) {\n return { error: 'userId is required' };\n }\n try {\n // Minimum of 50 ensures enough candidates across all feed categories\n // (connection, connector-flow, expired) for selectByComposition to fill\n // its soft targets, even after visibility filtering and dedup.\n const fetchLimit = Math.min(150, Math.max(50, state.limit * 3));\n const statuses = state.statuses ?? DEFAULT_HOME_STATUSES;\n const poolRankingProvenance = getPoolRankingProvenance(state);\n const options: { limit?: number; networkId?: string; scopeType?: 'intent'; scopeId?: string; statuses?: OpportunityStatus[] } = {\n limit: fetchLimit,\n statuses,\n };\n if (state.networkId) options.networkId = state.networkId;\n if (state.scopeType === 'intent' && state.scopeId) {\n options.scopeType = 'intent';\n options.scopeId = state.scopeId;\n }\n // Do not pass conversationId: home view excludes draft opportunities (chat-only drafts).\n const raw = await this.database.getOpportunitiesForUser(state.userId, options);\n const visible = raw.filter((opp) =>\n canUserSeeOpportunity(opp.actors, opp.status, state.userId)\n );\n // Actionability only gates the live statuses a viewer could act on:\n // latent/pending cards the viewer cannot act on are noise, but\n // terminal/internal statuses (accepted, rejected, expired, negotiating,\n // stalled, draft) are deliberate history — when a caller explicitly\n // requests them via `statuses`, they must pass through (they are never\n // actionable by rule 5, so filtering them here would return nothing).\n // The requested-status membership check is defense-in-depth: rows\n // outside the requested set are dropped even if the adapter drifts.\n const requestedStatuses = new Set<OpportunityStatus>(statuses);\n const visibleForFeed = visible.filter((opp) => {\n if (!requestedStatuses.has(opp.status)) return false;\n if (opp.status === 'latent' || opp.status === 'pending') {\n return isActionableForViewer(opp.actors, opp.status, state.userId);\n }\n return true;\n });\n const explicitStatuses = (state.statuses?.length ?? 0) > 0;\n if (explicitStatuses) {\n // Lifecycle view (e.g. intent radar): newest-first so counterpart\n // dedup keeps each person's most recent state (an accepted\n // opportunity supersedes an older pending one), no composition\n // capping — the caller wants the full pipeline up to `limit`.\n const newestFirst = [...visibleForFeed].sort(\n (a, b) => safeParseDate(b.updatedAt) - safeParseDate(a.updatedAt)\n );\n const seenIds = new Set<string>();\n const dedupedByCounterpart = newestFirst.filter((opp) => {\n const counterpartIds = getUniqueCounterpartUserIds(opp, state.userId);\n const hasOverlap = [...counterpartIds].some((id) => seenIds.has(id));\n if (hasOverlap) return false;\n for (const id of counterpartIds) seenIds.add(id);\n return true;\n });\n // Preserve byte-identical newest-first behavior while the flag is\n // off. When on, re-order the already-deduped lifecycle set by\n // adjusted confidence so each client-side radar bucket reflects\n // pool answers immediately.\n if (\n !poolRankingProvenance ||\n !dedupedByCounterpart.some((opportunity) => hasPoolAdjustment(opportunity, poolRankingProvenance))\n ) {\n return { opportunities: dedupedByCounterpart.slice(0, state.limit) };\n }\n const adjustedOrder = [...dedupedByCounterpart].sort((a, b) => {\n const confidenceDelta = getConfidence(b, poolRankingProvenance) - getConfidence(a, poolRankingProvenance);\n if (confidenceDelta !== 0) return confidenceDelta;\n return safeParseDate(b.updatedAt) - safeParseDate(a.updatedAt);\n });\n return { opportunities: adjustedOrder.slice(0, state.limit) };\n }\n const sorted = [...visibleForFeed].sort((a, b) => {\n // Connections before connector-flow so dedup claims counterpart IDs\n // for direct connections first — prevents introducer cards from\n // shadowing a user's own connection opportunities.\n const aIsIntroducer = a.actors.some((ac) => ac.userId === state.userId && ac.role === 'introducer');\n const bIsIntroducer = b.actors.some((ac) => ac.userId === state.userId && ac.role === 'introducer');\n if (aIsIntroducer !== bIsIntroducer) return aIsIntroducer ? 1 : -1;\n const confA = getConfidence(a, poolRankingProvenance);\n const confB = getConfidence(b, poolRankingProvenance);\n if (confB !== confA) return confB - confA;\n const aTime = safeParseDate(a.updatedAt);\n const bTime = safeParseDate(b.updatedAt);\n return bTime - aTime;\n });\n const seenUserIds = new Set<string>();\n const deduped = sorted.filter((opp) => {\n const counterpartIds = getUniqueCounterpartUserIds(opp, state.userId);\n const hasOverlap = [...counterpartIds].some((id) => seenUserIds.has(id));\n if (hasOverlap) return false;\n for (const id of counterpartIds) seenUserIds.add(id);\n return true;\n });\n const opportunities = selectByComposition(deduped, state.userId);\n return { opportunities };\n } catch (e) {\n logger.error('HomeGraph loadOpportunities failed', { error: e });\n return { error: 'Failed to load opportunities', opportunities: [] };\n }\n });\n };\n\n const checkPresenterCacheNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.checkPresenterCache\", async () => {\n const { opportunities, userId } = state;\n const poolRankingProvenance = getPoolRankingProvenance(state);\n if (opportunities.length === 0) {\n return { cachedCards: new Map(), uncachedOpportunities: [] };\n }\n\n if (state.noCache) {\n checkPresenterCacheLog.verbose('noCache=true, skipping cache');\n return { cachedCards: new Map(), uncachedOpportunities: opportunities };\n }\n\n try {\n // Negotiating cards are templated (no LLM call) and their text\n // depends on the live turn count, which changes between requests\n // without changing the opportunity status. Skip cache entirely\n // for them so each render reflects the current turn.\n //\n // For all other statuses, include status in the key so status\n // transitions (e.g. negotiating → pending) don't serve stale cards.\n const cacheable = opportunities.filter((opp) => opp.status !== 'negotiating');\n const liveNegotiating = opportunities.filter((opp) => opp.status === 'negotiating');\n\n const keys = cacheable.map((opp) =>\n buildHomeCardPresentationCacheKey(opp.id, opp.status, userId)\n );\n const results = keys.length > 0 ? await this.cache.mget<HomeCardItem>(keys) : [];\n\n const cachedCards = new Map<string, HomeCardItem>();\n const uncachedOpportunities: typeof opportunities = [...liveNegotiating];\n\n for (let i = 0; i < cacheable.length; i++) {\n const cached = results[i];\n if (cached) {\n const originalIndex = opportunities.indexOf(cacheable[i]);\n // Stamp the live status: pre-status cache entries lack the field,\n // and the key already guarantees it matches the current status.\n const deprioritizedReason = poolRankingProvenance\n ? latestPoolDemotionDetail(\n (cacheable[i] as { metadata?: Record<string, unknown> | null }).metadata,\n poolRankingProvenance,\n )\n : undefined;\n cachedCards.set(cacheable[i].id, {\n ...cached,\n status: cacheable[i].status,\n deprioritizedReason,\n _cardIndex: originalIndex,\n });\n } else {\n uncachedOpportunities.push(cacheable[i]);\n }\n }\n\n checkPresenterCacheLog.verbose('', {\n total: opportunities.length,\n cacheHits: cachedCards.size,\n cacheMisses: uncachedOpportunities.length,\n });\n\n return { cachedCards, uncachedOpportunities };\n } catch (e) {\n checkPresenterCacheLog.warn('cache unavailable, skipping', { error: e });\n return { cachedCards: new Map(), uncachedOpportunities: opportunities };\n }\n });\n };\n\n const shouldGenerateCards = (state: typeof HomeGraphState.State): string => {\n if (state.uncachedOpportunities.length > 0) {\n return 'generate';\n }\n logger.verbose('All presenter results cached, skipping generation');\n return 'skip';\n };\n\n const generateCardTextNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.generateCardText\", async () => {\n const opportunities = state.uncachedOpportunities.length > 0\n ? state.uncachedOpportunities\n : state.opportunities;\n generateCardTextLog.verbose('entry', { opportunitiesLength: opportunities.length, userId: state.userId });\n if (opportunities.length === 0) {\n generateCardTextLog.verbose('exit', { totalOpportunities: 0, totalSections: 0 });\n return { cards: [], agentTimings: [], meta: { totalOpportunities: 0, totalSections: 0 } };\n }\n const db = this.database as PresenterDatabase & HomeGraphDb;\n const cards: HomeCardItem[] = [];\n const relevantActorIds = new Set<string>();\n for (const opp of opportunities) {\n for (const a of opp.actors) {\n if (a.userId) relevantActorIds.add(a.userId);\n }\n }\n\n const userEntries = await Promise.all(\n Array.from(relevantActorIds).map(async (userId) => {\n try {\n const user = await this.database.getUser(userId);\n return [userId, user ?? null] as const;\n } catch {\n return [userId, null] as const;\n }\n })\n );\n const userMap = new Map(userEntries);\n\n const oppIndexMap = new Map(\n state.opportunities.map((opp, idx) => [opp.id, idx])\n );\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n for (let i = 0; i < opportunities.length; i += PRESENTATION_CONCURRENCY) {\n const chunk = opportunities.slice(i, i + PRESENTATION_CONCURRENCY);\n const chunkCards = await Promise.all(\n chunk.map(async (opportunity, offset) => {\n const cardIndex = oppIndexMap.get(opportunity.id) ?? (i + offset);\n const viewerActor = opportunity.actors.find((a) => a.userId === state.userId);\n const viewerRole = viewerActor?.role ?? 'party';\n const isIntroducer = viewerRole === 'introducer';\n const preferredActor = pickDisplayCounterpartActor(opportunity, state.userId)\n ?? opportunity.actors.find((a) => a.userId !== state.userId && a.role !== 'introducer');\n const actorWithProfile = opportunity.actors.find(\n (a) => a.userId !== state.userId && a.role !== 'introducer' && !!userMap.get(a.userId)\n );\n const introducer = opportunity.actors.find((a) => a.role === 'introducer');\n let otherActor = (preferredActor && userMap.get(preferredActor.userId))\n ? preferredActor\n : (actorWithProfile ?? preferredActor);\n // When the only other participant is the introducer (no separate party), use introducer as display counterpart so the card shows a name instead of \"Unknown\"\n if (!otherActor && introducer && introducer.userId !== state.userId && introducer.userId) {\n otherActor = { userId: introducer.userId, role: introducer.role };\n }\n const otherUser = otherActor ? userMap.get(otherActor.userId) ?? null : null;\n const introducerCounterparts = opportunity.actors.filter(\n (a) => a.userId !== state.userId && a.role !== 'introducer'\n );\n // Deduplicate by userId — actors array can contain multiple rows per user\n // (e.g. from different intents), which would produce repeated names.\n const uniqueCounterpartIds = [...new Set(introducerCounterparts.map((a) => a.userId))];\n const participantNames = uniqueCounterpartIds\n .map((uid) => userMap.get(uid)?.name ?? 'Unknown')\n .sort();\n // When secondPartyData will be present (2+ counterparts), use single counterpart name\n // because the frontend arrow layout renders \"card.name → secondParty.name\".\n // Using the joined \"A ↔ B\" format here would produce redundant \"A ↔ B → B\".\n // Only use the joined format when there is a single counterpart (no arrow layout).\n const willHaveSecondParty = isIntroducer && uniqueCounterpartIds.length > 1;\n let userName = isIntroducer && participantNames.length > 0 && !willHaveSecondParty\n ? participantNames.join(' ↔ ')\n : (otherUser?.name ?? 'Unknown');\n // Fallback to profile identity name when users.name is missing (e.g. profile has display name, users row does not)\n if ((userName === 'Unknown' || !userName?.trim()) && otherActor?.userId && db.getProfile) {\n const profile = await db.getProfile(otherActor.userId).catch((err) => {\n logger.debug('getProfile fallback failed', { otherActorUserId: otherActor.userId, error: err });\n return null;\n });\n const profileName = profile?.identity?.name?.trim();\n if (profileName) userName = profileName;\n }\n // Unresolvable display counterpart (deleted user: no users row, no\n // profile fallback). Drop the card entirely instead of rendering an\n // \"Unknown\" placeholder: such cards are unusable, excluded from the\n // presenter cache (see cachePresenterResults), and would otherwise\n // trigger a fresh presenter LLM call on every request — a permanent\n // cache miss that keeps the whole feed slow (~9s per load).\n if (userName === 'Unknown' || !userName?.trim()) {\n logger.verbose('[HomeGraph:generateCardText] dropping card with unresolvable counterpart', {\n opportunityId: opportunity.id,\n otherActorUserId: otherActor?.userId,\n });\n return null;\n }\n const userAvatar = otherUser?.avatar ?? null;\n // Shared sanitization standard (UUID strip, viewer-centric rewrite,\n // boundary truncation) — raw reasoning must never render verbatim.\n const reasoningSnippet = safeFallbackSummary(\n typeof opportunity.interpretation?.reasoning === 'string'\n ? opportunity.interpretation.reasoning\n : '',\n {\n counterpartName: userName !== 'Unknown' ? userName : undefined,\n maxChars: MAX_REASONING_SNIPPET_LENGTH,\n emptyText: 'A promising connection.',\n },\n );\n\n // Build secondParty for introducer arrow layout (the party that isn't the display counterpart)\n let secondPartyData: { name: string; avatar?: string | null; userId?: string } | undefined;\n if (isIntroducer && introducerCounterparts.length > 1 && otherActor) {\n const secondActor = introducerCounterparts.find((a) => a.userId !== otherActor.userId);\n if (secondActor) {\n const secondUser = userMap.get(secondActor.userId) ?? null;\n secondPartyData = {\n name: secondUser?.name ?? 'Unknown',\n avatar: secondUser?.avatar ?? null,\n userId: secondActor.userId,\n };\n }\n }\n\n const isCounterpartGhost = otherUser?.isGhost ?? false;\n // Skeleton presentation: return an identity-only card without the\n // presenter LLM or negotiation-context load. Name resolution and\n // the unresolvable-counterpart drop above still apply, so the card\n // set matches what the follow-up full request will return.\n if (state.presentation === 'skeleton') {\n return {\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: '',\n cta: '',\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: isIntroducer ? 'Connector match' : 'Shared interests',\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n presentationPending: true,\n _cardIndex: cardIndex,\n } satisfies HomeCardItem;\n }\n const isPendingIntroducerFallback = isIntroducer && opportunity.status !== 'latent';\n const fallbackCard = (): HomeCardItem => ({\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: reasoningSnippet,\n cta: isIntroducer\n ? (isPendingIntroducerFallback ? 'Share this introduction to get things started.' : 'Take a look and decide if this is a good match.')\n : 'Take a look and decide whether to reach out.',\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: isIntroducer ? 'Connector match' : 'Shared interests',\n narratorChip: isIntroducer\n ? { name: 'You', text: 'Worth a look.', userId: state.userId }\n : { name: 'Index', text: 'Worth a look.' },\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n _presentationFallback: true,\n _cardIndex: cardIndex,\n });\n\n try {\n const [ctx, negotiationContext] = await Promise.all([\n gatherPresenterContext(\n db,\n opportunity,\n state.userId,\n otherActor?.userId,\n ),\n loadNegotiationContext(db, opportunity.id, opportunity.status),\n ]);\n const homeInput = {\n ...ctx,\n mutualIntentCount: undefined,\n opportunityStatus: opportunity.status,\n ...(negotiationContext ? { negotiationContext } : {}),\n };\n const _traceEmitterPresenter = requestContext.getStore()?.traceEmitter;\n const presenterStart = Date.now();\n _traceEmitterPresenter?.({ type: \"agent_start\", name: \"opportunity-presenter\" });\n const presentation = await presenter.presentHomeCard(homeInput);\n const _presenterDuration = Date.now() - presenterStart;\n agentTimingsAccum.push({ name: 'opportunity.presenter', durationMs: _presenterDuration });\n _traceEmitterPresenter?.({ type: \"agent_end\", name: \"opportunity-presenter\", durationMs: _presenterDuration, summary: `Presented: ${userName}` });\n if (presentation.isFallback) {\n return fallbackCard();\n }\n let narratorChip: { name: string; text: string; avatar?: string | null; userId?: string } | undefined;\n // Only show a person as narrator when they are the introducer and not the display counterpart\n // (bad data can have same user as introducer and party, e.g. \"Amina introduced you to Amina\")\n const introducerIsCounterpart = introducer && otherActor && introducer.userId === otherActor.userId;\n if (introducer && introducer.userId !== state.userId && !introducerIsCounterpart) {\n const introUser = userMap.get(introducer.userId) ?? null;\n const narratorName = introUser?.name ?? 'Someone';\n narratorChip = {\n name: narratorName,\n text: stripLeadingNarratorName(presentation.narratorRemark, narratorName),\n avatar: introUser?.avatar ?? null,\n userId: introducer.userId,\n };\n } else if (introducer?.userId === state.userId) {\n narratorChip = { name: 'You', text: presentation.narratorRemark, userId: state.userId };\n } else {\n narratorChip = { name: 'Index', text: presentation.narratorRemark };\n }\n return {\n opportunityId: opportunity.id,\n status: opportunity.status,\n userId: otherActor?.userId ?? '',\n name: userName,\n avatar: userAvatar,\n mainText: presentation.personalizedSummary,\n cta: presentation.suggestedAction,\n headline: presentation.headline,\n primaryActionLabel: getPrimaryActionLabel(viewerRole),\n secondaryActionLabel: SECONDARY_ACTION_LABEL,\n mutualIntentsLabel: presentation.mutualIntentsLabel,\n narratorChip,\n viewerRole,\n isGhost: isCounterpartGhost,\n ...(secondPartyData ? { secondParty: secondPartyData } : {}),\n _cardIndex: cardIndex,\n } satisfies HomeCardItem;\n } catch (e) {\n logger.warn('HomeGraph presenter failed for opportunity', { opportunityId: opportunity.id, error: e });\n return fallbackCard();\n }\n })\n );\n cards.push(...chunkCards.filter((c): c is HomeCardItem => c !== null));\n }\n generateCardTextLog.verbose('exit', { totalOpportunities: state.opportunities.length, totalSections: 0 });\n return {\n cards,\n agentTimings: agentTimingsAccum,\n meta: { totalOpportunities: state.opportunities.length, totalSections: 0 },\n };\n });\n };\n\n const cachePresenterResultsNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.cachePresenterResults\", async () => {\n const { cards, cachedCards, userId, opportunities } = state;\n const poolRankingProvenance = getPoolRankingProvenance(state);\n const liveById = new Map(opportunities.map((opportunity) => [opportunity.id, opportunity]));\n const cardsWithAdjustments = cards.map((card) => {\n const opportunity = liveById.get(card.opportunityId);\n const deprioritizedReason = poolRankingProvenance\n ? latestPoolDemotionDetail(\n (opportunity as { metadata?: Record<string, unknown> | null } | undefined)?.metadata,\n poolRankingProvenance,\n )\n : undefined;\n return { ...card, deprioritizedReason };\n });\n\n // Only cache cards that weren't already from cache\n const newCards = cardsWithAdjustments.filter((card) => !cachedCards.has(card.opportunityId));\n const statusById = new Map(opportunities.map((opp) => [opp.id, opp.status]));\n\n try {\n await Promise.all(\n newCards.map((card) => {\n const status = statusById.get(card.opportunityId);\n // Negotiating, skeleton, fallback, and unresolved-name cards are\n // safe for the current response but must not become 24h entries.\n if (!status || !isHomePresentationCacheable(card, status)) return Promise.resolve();\n return this.cache.set(\n buildHomeCardPresentationCacheKey(card.opportunityId, status, userId),\n card,\n { ttl: HOME_CACHE_TTL }\n );\n })\n );\n } catch (e) {\n cachePresenterResultsLog.warn('cache write failed, continuing', { error: e });\n }\n\n // Merge cached cards into full card list\n const allCards: HomeCardItem[] = [...cardsWithAdjustments];\n for (const [oppId, cachedCard] of cachedCards) {\n if (!cardsWithAdjustments.some((card) => card.opportunityId === oppId)) {\n allCards.push(cachedCard);\n }\n }\n\n // Re-sort by _cardIndex to maintain original ordering\n allCards.sort((a, b) => a._cardIndex - b._cardIndex);\n\n cachePresenterResultsLog.verbose('', {\n newlyCached: newCards.length,\n totalCards: allCards.length,\n });\n\n return {\n cards: allCards,\n meta: { totalOpportunities: state.opportunities.length, totalSections: 0 },\n };\n });\n };\n\n const checkCategorizerCacheNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.checkCategorizerCache\", async () => {\n if (state.cards.length === 0) {\n return { categoryCacheHit: false };\n }\n\n // Skeleton runs never categorize (some cards have no text to categorize\n // and the response must stay LLM-free). Ranking-enabled lifecycle views\n // also stay flat: the intent Radar flattens sections and buckets by\n // status, so dynamic categorization would erase the adjusted order on\n // the full second-phase response. Flag off retains the legacy path.\n // Chunk by MAX_ITEMS_PER_SECTION because normalizeAndSort caps sections.\n const poolRankingProvenance = getPoolRankingProvenance(state);\n const preserveAdjustedLifecycleOrder =\n (state.statuses?.length ?? 0) > 0 &&\n poolRankingProvenance !== null &&\n state.opportunities.some((opportunity) => hasPoolAdjustment(opportunity, poolRankingProvenance));\n if (state.presentation === 'skeleton' || preserveAdjustedLifecycleOrder) {\n const sectionProposals: HomeSectionProposal[] = [];\n for (let start = 0; start < state.cards.length; start += MAX_ITEMS_PER_SECTION) {\n sectionProposals.push({\n id: `all-${sectionProposals.length + 1}`,\n title: 'All matches',\n iconName: DEFAULT_HOME_SECTION_ICON,\n itemIndices: state.cards.slice(start, start + MAX_ITEMS_PER_SECTION).map((_, i) => start + i),\n });\n }\n return { sectionProposals, categoryCacheHit: true };\n }\n\n if (state.noCache) {\n checkCategorizerCacheLog.verbose('noCache=true, skipping cache');\n return { categoryCacheHit: false };\n }\n\n try {\n const key = buildCategorizerCacheKey(state.userId, state.cards);\n\n const cached = await this.cache.get<HomeSectionProposal[]>(key);\n if (cached) {\n checkCategorizerCacheLog.verbose('cache hit');\n return { sectionProposals: cached, categoryCacheHit: true };\n }\n\n checkCategorizerCacheLog.verbose('cache miss');\n } catch (e) {\n checkCategorizerCacheLog.warn('cache unavailable, skipping', { error: e });\n }\n return { categoryCacheHit: false };\n });\n };\n\n const shouldCategorize = (state: typeof HomeGraphState.State): string => {\n if (state.categoryCacheHit) {\n logger.verbose('Categorizer results cached, skipping');\n return 'skip';\n }\n return 'categorize';\n };\n\n const categorizeDynamicallyNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.categorizeDynamically\", async () => {\n categorizeDynamicallyLog.verbose('entry', { cardsLength: state.cards.length });\n if (state.cards.length === 0) {\n categorizeDynamicallyLog.verbose('exit', { sectionProposalsCount: 0 });\n return { sectionProposals: [], agentTimings: [] };\n }\n const agentTimingsAccum: DebugMetaAgent[] = [];\n const categorizerInput = state.cards.map((c) => ({\n index: c._cardIndex,\n headline: c.headline,\n mainText: c.mainText,\n name: c.name,\n viewerRole: c.viewerRole === 'introducer' ? 'introducer' : undefined,\n opportunityStatus: c.viewerRole === 'introducer' ? 'pending' : undefined,\n }));\n const _traceEmitterCategorizer = requestContext.getStore()?.traceEmitter;\n const categorizerStart = Date.now();\n _traceEmitterCategorizer?.({ type: \"agent_start\", name: \"home-categorizer\" });\n const { sections } = await categorizer.categorize(categorizerInput);\n const _categorizerDuration = Date.now() - categorizerStart;\n agentTimingsAccum.push({ name: 'home.categorizer', durationMs: _categorizerDuration });\n _traceEmitterCategorizer?.({ type: \"agent_end\", name: \"home-categorizer\", durationMs: _categorizerDuration, summary: `Categorized into ${sections.length} section(s)` });\n const proposals: HomeSectionProposal[] = sections.map((s) => ({\n ...s,\n itemIndices: s.itemIndices.filter((i) => i >= 0 && i < state.cards.length),\n }));\n categorizeDynamicallyLog.verbose('exit', { sectionProposalsCount: proposals.length });\n return { sectionProposals: proposals, agentTimings: agentTimingsAccum };\n });\n };\n\n const cacheCategorizerResultsNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.cacheCategorizerResults\", async () => {\n if (\n state.categoryCacheHit ||\n state.sectionProposals.length === 0 ||\n state.cards.some((card) => card._presentationFallback)\n ) {\n return {};\n }\n\n try {\n const key = buildCategorizerCacheKey(state.userId, state.cards);\n\n await this.cache.set(key, state.sectionProposals, { ttl: HOME_CACHE_TTL });\n\n cacheCategorizerResultsLog.verbose('cached', {\n sectionCount: state.sectionProposals.length,\n });\n } catch (e) {\n cacheCategorizerResultsLog.warn('cache write failed, continuing', { error: e });\n }\n\n return {};\n });\n };\n\n const normalizeAndSortNode = async (state: typeof HomeGraphState.State) => {\n return timed(\"HomeGraph.normalizeAndSort\", async () => {\n const cards = state.cards;\n const proposals = state.sectionProposals;\n normalizeAndSortLog.verbose('entry', { cardsLength: cards.length, proposalsLength: proposals.length });\n if (cards.length === 0) {\n normalizeAndSortLog.verbose('exit', { totalOpportunities: 0, totalSections: 0 });\n return { sections: [], meta: { totalOpportunities: 0, totalSections: 0 } };\n }\n const usedIndices = new Set<number>();\n const sections: HomeSection[] = proposals.map((p) => {\n const iconName = resolveHomeSectionIcon(p.iconName);\n const items: HomeSectionItem[] = p.itemIndices\n .filter((i) => i >= 0 && i < cards.length && !usedIndices.has(i))\n .slice(0, MAX_ITEMS_PER_SECTION)\n .map((i) => {\n usedIndices.add(i);\n const card = cards[i];\n const { _cardIndex, _presentationFallback, ...rest } = card;\n return rest;\n });\n return {\n id: p.id,\n title: p.title,\n subtitle: p.subtitle,\n iconName,\n items,\n };\n });\n\n // Enforce category ordering: sections with connections first, then\n // connector-flow only, then expired only. This prevents the LLM\n // categorizer from placing introducer sections before connection sections.\n const sectionCategoryPriority = (section: HomeSection): number => {\n const hasConnection = section.items.some((item) => item.viewerRole !== 'introducer');\n if (hasConnection) return 0; // mixed or connection-only sections first\n const hasConnectorFlow = section.items.some((item) => item.viewerRole === 'introducer');\n if (hasConnectorFlow) return 1; // connector-flow only sections next\n return 2; // empty or expired sections last\n };\n sections.sort((a, b) => sectionCategoryPriority(a) - sectionCategoryPriority(b));\n const meta = {\n totalOpportunities: state.opportunities.length,\n totalSections: sections.length,\n };\n normalizeAndSortLog.verbose('exit', { totalOpportunities: meta.totalOpportunities, totalSections: meta.totalSections });\n return { sections, meta };\n });\n };\n\n const graph = new StateGraph(HomeGraphState)\n .addNode('loadOpportunities', loadOpportunitiesNode)\n .addNode('checkPresenterCache', checkPresenterCacheNode)\n .addNode('generateCardText', generateCardTextNode)\n .addNode('cachePresenterResults', cachePresenterResultsNode)\n .addNode('checkCategorizerCache', checkCategorizerCacheNode)\n .addNode('categorizeDynamically', categorizeDynamicallyNode)\n .addNode('cacheCategorizerResults', cacheCategorizerResultsNode)\n .addNode('normalizeAndSort', normalizeAndSortNode)\n .addEdge(START, 'loadOpportunities')\n .addEdge('loadOpportunities', 'checkPresenterCache')\n .addConditionalEdges('checkPresenterCache', shouldGenerateCards, {\n generate: 'generateCardText',\n skip: 'cachePresenterResults',\n })\n .addEdge('generateCardText', 'cachePresenterResults')\n .addEdge('cachePresenterResults', 'checkCategorizerCache')\n .addConditionalEdges('checkCategorizerCache', shouldCategorize, {\n categorize: 'categorizeDynamically',\n skip: 'normalizeAndSort',\n })\n .addEdge('categorizeDynamically', 'cacheCategorizerResults')\n .addEdge('cacheCategorizerResults', 'normalizeAndSort')\n .addEdge('normalizeAndSort', END);\n\n return graph.compile();\n }\n}\n"]}
@@ -44,6 +44,8 @@ export interface HomeCardItem {
44
44
  * full view. Skeleton cards are never written to the presenter cache.
45
45
  */
46
46
  presentationPending?: boolean;
47
+ /** Internal marker: safe deterministic fallback rendered, but must not be cached. */
48
+ _presentationFallback?: boolean;
47
49
  /** For section assignment from LLM */
48
50
  _cardIndex: number;
49
51
  }
@@ -58,7 +60,7 @@ export interface HomeSectionProposal {
58
60
  itemIndices: number[];
59
61
  }
60
62
  /** Card item as returned in API (no internal _cardIndex). */
61
- export type HomeSectionItem = Omit<HomeCardItem, '_cardIndex'>;
63
+ export type HomeSectionItem = Omit<HomeCardItem, '_cardIndex' | '_presentationFallback'>;
62
64
  /**
63
65
  * Final section for API response.
64
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"feed.state.d.ts","sourceRoot":"/","sources":["opportunity/feed/feed.state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;IAsBzB,gEAAgE;;IAMhE;;;;;OAKG;;IAMH,sFAAsF;;IAMtF,yEAAyE;;IAMzE,qDAAqD;;IAMrD,+DAA+D;;IAM/D,mCAAmC;;IAMnC,6EAA6E;;IAM7E,yEAAyE;;IAMzE,uDAAuD;;;IAWvD,kEAAkE;;4BAC3B,MAAM;uBAAiB,MAAM;;4BAA7B,MAAM;uBAAiB,MAAM;;4BAA7B,MAAM;uBAAiB,MAAM;;IAKpE,sEAAsE;;EAKtE,CAAC"}
1
+ {"version":3,"file":"feed.state.d.ts","sourceRoot":"/","sources":["opportunity/feed/feed.state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wFAAwF;IACxF,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,uBAAuB,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;IAsBzB,gEAAgE;;IAMhE;;;;;OAKG;;IAMH,sFAAsF;;IAMtF,yEAAyE;;IAMzE,qDAAqD;;IAMrD,+DAA+D;;IAM/D,mCAAmC;;IAMnC,6EAA6E;;IAM7E,yEAAyE;;IAMzE,uDAAuD;;;IAWvD,kEAAkE;;4BAC3B,MAAM;uBAAiB,MAAM;;4BAA7B,MAAM;uBAAiB,MAAM;;4BAA7B,MAAM;uBAAiB,MAAM;;IAKpE,sEAAsE;;EAKtE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"feed.state.js","sourceRoot":"/","sources":["opportunity/feed/feed.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from '@langchain/langgraph';\nimport type { Opportunity, OpportunityStatus } from '../../shared/interfaces/database.interface.js';\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\n\n/**\n * Home view card item: one opportunity with full presenter-driven display contract.\n */\nexport interface HomeCardItem {\n opportunityId: string;\n /** Lifecycle status of the underlying opportunity at render time (client bucketing, e.g. intent radar). */\n status?: OpportunityStatus;\n userId: string;\n name: string;\n avatar: string | null;\n mainText: string;\n cta: string;\n headline?: string;\n /** Presenter-generated; primary button (accept) and secondary button (dismiss). */\n primaryActionLabel: string;\n secondaryActionLabel: string;\n /** Presenter-generated subtitle under the other party name (e.g. \"1 mutual intent\"). */\n mutualIntentsLabel: string;\n /** Narrator chip for human-introduced opportunities; avatar set when narrator is a user */\n narratorChip?: { name: string; text: string; avatar?: string | null; userId?: string };\n /** Viewer's role in this opportunity (e.g. 'introducer', 'party', 'agent', 'patient', 'peer'). */\n viewerRole?: string;\n /** Whether the counterpart is a ghost (not yet onboarded) user. */\n isGhost?: boolean;\n /** Template-only explanation for a pool-answer demotion (never evaluator reasoning). */\n deprioritizedReason?: string;\n /** Second party in introducer arrow layout. Present when viewerRole is 'introducer'. */\n secondParty?: { name: string; avatar?: string | null; userId?: string };\n /**\n * True when this card was produced by a skeleton-presentation run: identity\n * fields (name/avatar/status) are real but mainText/cta are empty because the\n * presenter LLM was skipped. Clients render a shimmer body and re-fetch the\n * full view. Skeleton cards are never written to the presenter cache.\n */\n presentationPending?: boolean;\n /** For section assignment from LLM */\n _cardIndex: number;\n}\n\n/**\n * Dynamic section from LLM categorization.\n */\nexport interface HomeSectionProposal {\n id: string;\n title: string;\n subtitle?: string;\n iconName: string;\n itemIndices: number[];\n}\n\n/** Card item as returned in API (no internal _cardIndex). */\nexport type HomeSectionItem = Omit<HomeCardItem, '_cardIndex'>;\n\n/**\n * Final section for API response.\n */\nexport interface HomeSection {\n id: string;\n title: string;\n subtitle?: string;\n iconName: string;\n items: HomeSectionItem[];\n}\n\n/**\n * Home Graph State (Annotation-based).\n * Flow: loadOpportunities → generateCardText → categorizeDynamically → normalizeAndSort → finalizeResponse.\n */\nexport const HomeGraphState = Annotation.Root({\n userId: Annotation<string>({\n reducer: (curr, next) => next ?? curr,\n default: () => '',\n }),\n networkId: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n scopeType: Annotation<'intent' | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n scopeId: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n limit: Annotation<number>({\n reducer: (curr, next) => next ?? curr,\n default: () => 50,\n }),\n\n /** When true, bypass presenter and categorizer Redis caches. */\n noCache: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Presentation depth. 'full' (default) runs the presenter LLM and categorizer.\n * 'skeleton' skips both for cache misses: uncached cards come back with\n * resolved identity (name/avatar/status) and `presentationPending: true`,\n * cached cards come back complete, and all cards land in one flat section.\n */\n presentation: Annotation<'full' | 'skeleton'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'full',\n }),\n\n /** Optional status filter. When undefined, the graph uses `DEFAULT_HOME_STATUSES`. */\n statuses: Annotation<OpportunityStatus[] | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n\n /** Raw opportunities visible to the viewer (after visibility filter). */\n opportunities: Annotation<Opportunity[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Cards with presenter output and narrator chip. */\n cards: Annotation<HomeCardItem[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** LLM output: dynamic sections with icon and item indices. */\n sectionProposals: Annotation<HomeSectionProposal[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Final sections for response. */\n sections: Annotation<HomeSection[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Presenter results retrieved from cache (opportunityId → HomeCardItem). */\n cachedCards: Annotation<Map<string, HomeCardItem>>({\n reducer: (curr, next) => next ?? curr,\n default: () => new Map(),\n }),\n\n /** Opportunities that had no cache hit and need presenter generation. */\n uncachedOpportunities: Annotation<Opportunity[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Whether categorizer results were found in cache. */\n categoryCacheHit: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n error: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n\n /** Meta for response (e.g. totalOpportunities, totalSections). */\n meta: Annotation<{ totalOpportunities: number; totalSections: number }>({\n reducer: (curr, next) => next ?? curr,\n default: () => ({ totalOpportunities: 0, totalSections: 0 }),\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n});\n"]}
1
+ {"version":3,"file":"feed.state.js","sourceRoot":"/","sources":["opportunity/feed/feed.state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Annotation } from '@langchain/langgraph';\nimport type { Opportunity, OpportunityStatus } from '../../shared/interfaces/database.interface.js';\nimport type { DebugMetaAgent } from '../../chat/chat-streaming.types.js';\n\n/**\n * Home view card item: one opportunity with full presenter-driven display contract.\n */\nexport interface HomeCardItem {\n opportunityId: string;\n /** Lifecycle status of the underlying opportunity at render time (client bucketing, e.g. intent radar). */\n status?: OpportunityStatus;\n userId: string;\n name: string;\n avatar: string | null;\n mainText: string;\n cta: string;\n headline?: string;\n /** Presenter-generated; primary button (accept) and secondary button (dismiss). */\n primaryActionLabel: string;\n secondaryActionLabel: string;\n /** Presenter-generated subtitle under the other party name (e.g. \"1 mutual intent\"). */\n mutualIntentsLabel: string;\n /** Narrator chip for human-introduced opportunities; avatar set when narrator is a user */\n narratorChip?: { name: string; text: string; avatar?: string | null; userId?: string };\n /** Viewer's role in this opportunity (e.g. 'introducer', 'party', 'agent', 'patient', 'peer'). */\n viewerRole?: string;\n /** Whether the counterpart is a ghost (not yet onboarded) user. */\n isGhost?: boolean;\n /** Template-only explanation for a pool-answer demotion (never evaluator reasoning). */\n deprioritizedReason?: string;\n /** Second party in introducer arrow layout. Present when viewerRole is 'introducer'. */\n secondParty?: { name: string; avatar?: string | null; userId?: string };\n /**\n * True when this card was produced by a skeleton-presentation run: identity\n * fields (name/avatar/status) are real but mainText/cta are empty because the\n * presenter LLM was skipped. Clients render a shimmer body and re-fetch the\n * full view. Skeleton cards are never written to the presenter cache.\n */\n presentationPending?: boolean;\n /** Internal marker: safe deterministic fallback rendered, but must not be cached. */\n _presentationFallback?: boolean;\n /** For section assignment from LLM */\n _cardIndex: number;\n}\n\n/**\n * Dynamic section from LLM categorization.\n */\nexport interface HomeSectionProposal {\n id: string;\n title: string;\n subtitle?: string;\n iconName: string;\n itemIndices: number[];\n}\n\n/** Card item as returned in API (no internal _cardIndex). */\nexport type HomeSectionItem = Omit<HomeCardItem, '_cardIndex' | '_presentationFallback'>;\n\n/**\n * Final section for API response.\n */\nexport interface HomeSection {\n id: string;\n title: string;\n subtitle?: string;\n iconName: string;\n items: HomeSectionItem[];\n}\n\n/**\n * Home Graph State (Annotation-based).\n * Flow: loadOpportunities → generateCardText → categorizeDynamically → normalizeAndSort → finalizeResponse.\n */\nexport const HomeGraphState = Annotation.Root({\n userId: Annotation<string>({\n reducer: (curr, next) => next ?? curr,\n default: () => '',\n }),\n networkId: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n scopeType: Annotation<'intent' | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n scopeId: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n limit: Annotation<number>({\n reducer: (curr, next) => next ?? curr,\n default: () => 50,\n }),\n\n /** When true, bypass presenter and categorizer Redis caches. */\n noCache: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n /**\n * Presentation depth. 'full' (default) runs the presenter LLM and categorizer.\n * 'skeleton' skips both for cache misses: uncached cards come back with\n * resolved identity (name/avatar/status) and `presentationPending: true`,\n * cached cards come back complete, and all cards land in one flat section.\n */\n presentation: Annotation<'full' | 'skeleton'>({\n reducer: (curr, next) => next ?? curr,\n default: () => 'full',\n }),\n\n /** Optional status filter. When undefined, the graph uses `DEFAULT_HOME_STATUSES`. */\n statuses: Annotation<OpportunityStatus[] | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n\n /** Raw opportunities visible to the viewer (after visibility filter). */\n opportunities: Annotation<Opportunity[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Cards with presenter output and narrator chip. */\n cards: Annotation<HomeCardItem[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** LLM output: dynamic sections with icon and item indices. */\n sectionProposals: Annotation<HomeSectionProposal[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Final sections for response. */\n sections: Annotation<HomeSection[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Presenter results retrieved from cache (opportunityId → HomeCardItem). */\n cachedCards: Annotation<Map<string, HomeCardItem>>({\n reducer: (curr, next) => next ?? curr,\n default: () => new Map(),\n }),\n\n /** Opportunities that had no cache hit and need presenter generation. */\n uncachedOpportunities: Annotation<Opportunity[]>({\n reducer: (curr, next) => next ?? curr,\n default: () => [],\n }),\n\n /** Whether categorizer results were found in cache. */\n categoryCacheHit: Annotation<boolean>({\n reducer: (curr, next) => next ?? curr,\n default: () => false,\n }),\n\n error: Annotation<string | undefined>({\n reducer: (curr, next) => next ?? curr,\n default: () => undefined,\n }),\n\n /** Meta for response (e.g. totalOpportunities, totalSections). */\n meta: Annotation<{ totalOpportunities: number; totalSections: number }>({\n reducer: (curr, next) => next ?? curr,\n default: () => ({ totalOpportunities: 0, totalSections: 0 }),\n }),\n\n /** Timing records for each agent invocation within this graph run. */\n agentTimings: Annotation<DebugMetaAgent[]>({\n reducer: (acc, val) => [...acc, ...val],\n default: () => [],\n }),\n});\n"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Deterministic guard for unsupported person-affiliation and presence claims.
3
+ *
4
+ * Opportunity presentation contracts currently do not carry typed provenance
5
+ * proving attendance, membership, residence, or shared presence. The guard
6
+ * therefore fails closed: a sentence making one of those claims is rejected
7
+ * rather than loosely "grounded" against network/context text.
8
+ *
9
+ * The patterns are deliberately phrase-based. They target factual claims such
10
+ * as "Alice is a member of..." while leaving generic domain phrases such as
11
+ * "membership model" and "team members" alone. This is not a general factuality
12
+ * checker and does not attempt semantic inference beyond the listed claim
13
+ * families.
14
+ */
15
+ /** Returns true when text contains an unsupported affiliation/presence claim. */
16
+ export declare function hasUnsupportedOpportunityClaim(text: string | null | undefined): boolean;
17
+ /** Returns true when one sentence contains an unsupported claim family. */
18
+ export declare function isUnsupportedOpportunityClaimSentence(sentence: string): boolean;
19
+ /**
20
+ * Removes complete sentences containing unsupported claims and preserves the
21
+ * remaining sentence order. An all-unsafe input becomes an empty string so the
22
+ * caller can apply a field-specific deterministic default.
23
+ */
24
+ export declare function stripUnsupportedOpportunityClaims(text: string | null | undefined): string;
25
+ //# sourceMappingURL=opportunity.claim-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opportunity.claim-safety.d.ts","sourceRoot":"/","sources":["opportunity/opportunity.claim-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkDH,iFAAiF;AACjF,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGvF;AAED,2EAA2E;AAC3E,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAOzF"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Deterministic guard for unsupported person-affiliation and presence claims.
3
+ *
4
+ * Opportunity presentation contracts currently do not carry typed provenance
5
+ * proving attendance, membership, residence, or shared presence. The guard
6
+ * therefore fails closed: a sentence making one of those claims is rejected
7
+ * rather than loosely "grounded" against network/context text.
8
+ *
9
+ * The patterns are deliberately phrase-based. They target factual claims such
10
+ * as "Alice is a member of..." while leaving generic domain phrases such as
11
+ * "membership model" and "team members" alone. This is not a general factuality
12
+ * checker and does not attempt semantic inference beyond the listed claim
13
+ * families.
14
+ */
15
+ const UNSUPPORTED_CLAIM_PATTERNS = [
16
+ // Attendance and co-attendance claims. Relational grammar avoids product
17
+ // phrases such as "attendee management".
18
+ /\b(?:co[-\s]?attendance|co[-\s]?attendee(?:s)?|co[-\s]?attend(?:ed|ing)?|(?:another|fellow)\s+(?:(?:event|session|conference|summit|gathering|meetup)\s+)?attendees?)\b/i,
19
+ /\b(?:is|are|was|were|will be|has been|have been|as)\s+(?:an?\s+)?attendees?\b/i,
20
+ /\b(?:a|an|this|that)\s+attendee\s+(?:of|at)\b/i,
21
+ /\b(?:will\s+|plans?\s+to\s+)?attend(?:ed|ing)?\s+(?!to\b)(?:(?:at|in)\s+)?(?:the\s+)?[\p{L}\p{N}&'’.-]+\b/iu,
22
+ /\b(?:is|are|was|were|will be)\s+going\s+to\s+(?:the\s+)?(?:event|session|conference|summit|gathering|meetup|[A-Z][\p{L}\p{N}&'’.-]*)\b/u,
23
+ /\b(?:[Pp]articipat(?:ed|ing)|[Pp]articipants?)\b(?=.{0,40}\b(?:in|at)\s+(?:the\s+)?(?:event|session|conference|summit|gathering|meetup|[A-Z][\p{L}\p{N}&'’.-]*))/u,
24
+ /\b(?:[Ww]ent\s+to|[Tt]ook\s+part\s+in|(?:[Ww]as|[Ww]ere|[Ii]s|[Aa]re)\s+present\s+at)\s+(?:the\s+)?(?:event|session|conference|summit|gathering|meetup|[A-Z][\p{L}\p{N}&'’.-]*)\b/u,
25
+ /\b(?:session\s+attendance|attendance\s+(?:at|in)\s+(?:the\s+)?(?:event|session|conference|summit|gathering|meetup))\b/i,
26
+ // Shared event/session/place/time claims, including "both were at ...".
27
+ /\b(?:same|the same)\s+(?:event|session|place|location|venue|time)\b/i,
28
+ /\b(?:share|shared|sharing)\s+(?:an?\s+|the\s+)?(?:event|session|workshop|conference|summit|gathering|meetup|place|location|venue|time)\b/i,
29
+ /\bboth\s+(?:were|are|will be|have been)\s+(?:at|in|during)\b/i,
30
+ /\b(?:were|are|will be|have been)\s+both\s+(?:at|in|during)\b/i,
31
+ /\b(?:will|would|are|were)\s+both\s+be?\s*(?:at|in|during)\b/i,
32
+ /\bboth\b.{0,80}\b(?:attend(?:ed|ing)?|participat(?:e|ed|ing)|met|meet|meeting|stayed|stay)\b.{0,60}\b(?:event|session|place|location|venue|time)\b/i,
33
+ // Factual membership/affiliation claims. Generic descriptions of product
34
+ // users ("members of cooperatives") and "team members" stay untouched.
35
+ /\b(?:is|are|was|were|be|being|been|became|become|as)\s+(?:an?\s+)?(?:fellow\s+)?members?\s+(?:of|in)\b/i,
36
+ /\b(?:another|fellow)\s+members?\b/i,
37
+ /\b(?:is|are|was|were|be|being|been|as)\s+(?:an?\s+)?(?:community|network|event)\s+members?\b/i,
38
+ /\b(?:a|an|this|that)\s+(?:fellow\s+)?member\s+(?:of|in)\b/i,
39
+ /\b(?:is|are|was|were|be|being|been)\s+(?:an?\s+)?part\s+of\s+(?:the\s+)?[^.!?]{0,60}\b(?:community|network|event)\b/i,
40
+ /\bfellow\s+members?\s+(?:of|in)\b/i,
41
+ /\b(?:a|an)\s+(?:[A-Z][\p{L}\p{N}&'’.-]*\s+){1,6}(?:community\s+|network\s+)?member\b/u,
42
+ /\b(?:[Bb]elongs?|[Bb]elonged)\s+to\s+(?:the\s+)?(?:[Nn]etwork|[Cc]ommunity|[Ee]vent|(?:[A-Z][\p{L}\p{N}&'’.-]*\s+){1,5}[A-Z][\p{L}\p{N}&'’.-]*)\b/u,
43
+ /\b[Jj]oined\s+(?:the\s+)?(?:[Nn]etwork|[Cc]ommunity|[Ee]vent|(?:[A-Z][\p{L}\p{N}&'’.-]*\s+){1,5}[A-Z][\p{L}\p{N}&'’.-]*)\b/u,
44
+ /\b[Aa]ffiliated\s+with\s+(?:the\s+)?(?:[Nn]etwork|[Cc]ommunity|[Ee]vent|[A-Z][\p{L}\p{N}&'’.-]*)\b/u,
45
+ // Residence/co-residence claims. Require person-claim grammar so generic
46
+ // audience descriptions such as "tools for residents of Berlin" survive.
47
+ /\b(?:is|are|was|were|be|being|been|as)\s+(?:an?\s+)?(?:local\s+|long[-\s]?time\s+|co[-\s]?)?residents?\b/i,
48
+ /\bco[-\s]?(?:reside|resides|resided|residing)\b/i,
49
+ /\b(?:another|fellow)\s+residents?\b/i,
50
+ /\b(?:a|an|this|that)\s+(?:co[-\s]?)?resident\s+(?:of|in)\b/i,
51
+ /\b(?:a|an)\s+(?:[A-Z][\p{L}\p{N}&'’.-]*\s+){1,6}(?:co[-\s]?)?resident\b/u,
52
+ /\b(?:[Hh]e|[Ss]he|[Tt]hey|[A-Z][\p{L}'’.-]+)\s+(?:reside|resides|resided|residing|live|lives|lived|living|(?:is|are|was|were)\s+based)\s+in\b/u,
53
+ /\b(?:[Hh]e|[Ss]he|[Tt]hey|[A-Z][\p{L}'’.-]+)\s+calls?\s+[A-Z][\p{L}\p{N}&'’.-]*(?:\s+[A-Z][\p{L}\p{N}&'’.-]*){0,5}\s+home\b/u,
54
+ // Relationship claims inferred from shared network/event placement.
55
+ /\b(?:know|knows|knew|met|meet)\b.{0,60}\b(?:through|from|at)\s+(?:the\s+)?(?:network|community|event|session)\b/i,
56
+ /\bcrossed\s+paths\s+(?:at|during)\b/i,
57
+ ];
58
+ /** Returns true when text contains an unsupported affiliation/presence claim. */
59
+ export function hasUnsupportedOpportunityClaim(text) {
60
+ if (!text?.trim())
61
+ return false;
62
+ return splitClaimSentences(text).some(isUnsupportedOpportunityClaimSentence);
63
+ }
64
+ /** Returns true when one sentence contains an unsupported claim family. */
65
+ export function isUnsupportedOpportunityClaimSentence(sentence) {
66
+ return UNSUPPORTED_CLAIM_PATTERNS.some((pattern) => pattern.test(sentence));
67
+ }
68
+ /**
69
+ * Removes complete sentences containing unsupported claims and preserves the
70
+ * remaining sentence order. An all-unsafe input becomes an empty string so the
71
+ * caller can apply a field-specific deterministic default.
72
+ */
73
+ export function stripUnsupportedOpportunityClaims(text) {
74
+ if (!text?.trim())
75
+ return "";
76
+ return splitClaimSentences(text)
77
+ .filter((sentence) => !isUnsupportedOpportunityClaimSentence(sentence))
78
+ .join(" ")
79
+ .replace(/\s+/g, " ")
80
+ .trim();
81
+ }
82
+ function splitClaimSentences(text) {
83
+ return text
84
+ .trim()
85
+ .split(/(?<=[.!?])\s+|\n+/)
86
+ .map((sentence) => sentence.trim())
87
+ .filter(Boolean);
88
+ }
89
+ //# sourceMappingURL=opportunity.claim-safety.js.map