( sanitizedInput: string, userId: string | undefined, threadExternalId: string, isAuthenticated: boolean, threadId?: string )
| 443 | * Also retrieves relevant SI agents for RAG-style context injection |
| 444 | */ |
| 445 | export async function prepareRequestWithMemberTools( |
| 446 | sanitizedInput: string, |
| 447 | userId: string | undefined, |
| 448 | threadExternalId: string, |
| 449 | isAuthenticated: boolean, |
| 450 | threadId?: string |
| 451 | ): Promise<PreparedRequest> { |
| 452 | const messageToProcess = sanitizedInput; |
| 453 | let memberContext: MemberContext | null = null; |
| 454 | let siRetrievalTimeMs: number | null = null; |
| 455 | |
| 456 | // Run member context fetch and SI retrieval in parallel |
| 457 | const [memberContextResult, siRetrievalResult] = await Promise.all([ |
| 458 | // Get member context |
| 459 | (async () => { |
| 460 | try { |
| 461 | if (userId) { |
| 462 | return await getWebMemberContext(userId); |
| 463 | } |
| 464 | return null; |
| 465 | } catch (error) { |
| 466 | logger.warn({ error, userId }, "Addie Chat: Failed to get member context"); |
| 467 | return null; |
| 468 | } |
| 469 | })(), |
| 470 | // Retrieve relevant SI agents |
| 471 | siRetriever.retrieve(sanitizedInput), |
| 472 | ]); |
| 473 | |
| 474 | memberContext = memberContextResult; |
| 475 | siRetrievalTimeMs = siRetrievalResult.retrieval_time_ms; |
| 476 | |
| 477 | // Build per-request context for system prompt (member info, SI agents) |
| 478 | const contextSections: string[] = []; |
| 479 | |
| 480 | if (memberContext) { |
| 481 | const memberContextText = formatMemberContextForPrompt(memberContext, 'web'); |
| 482 | if (memberContextText) { |
| 483 | contextSections.push(memberContextText); |
| 484 | logger.debug( |
| 485 | { userId, hasContext: true, orgName: memberContext.organization?.name }, |
| 486 | "Addie Chat: Added member context" |
| 487 | ); |
| 488 | } |
| 489 | } else { |
| 490 | const anonymousContext = { is_mapped: false, is_member: false, slack_linked: false }; |
| 491 | const memberContextText = formatMemberContextForPrompt(anonymousContext, 'web'); |
| 492 | if (memberContextText) { |
| 493 | contextSections.push(memberContextText); |
| 494 | logger.debug("Addie Chat: Added anonymous web context"); |
| 495 | } |
| 496 | } |
| 497 | |
| 498 | // Include SI agent context if relevant agents were found |
| 499 | if (siRetrievalResult.agents.length > 0) { |
| 500 | const siContext = siRetriever.formatContext(siRetrievalResult.agents); |
| 501 | contextSections.push(siContext); |
| 502 | logger.debug( |
no test coverage detected