{"version":3,"sources":["../src/server/handlers/author-enrichment.ts"],"names":[],"mappings":"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","file":"chunk-M3UP3Z3G.cjs","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { IUserProvider, User } from '@mastra/core/auth';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { MastraAuthProvider } from '@mastra/core/server';\n\n/**\n * Public-safe resolved author shape — same fields exposed by `/auth/me`.\n * Provider-specific extras are intentionally stripped to avoid leaking\n * unexpected data through the stored-agent (and future stored-resource) APIs.\n */\nexport type ResolvedAuthor = {\n id: string;\n name?: string;\n email?: string;\n avatarUrl?: string;\n};\n\n/**\n * Locate the auth provider from a Mastra instance using the same\n * private helper pattern as `auth.ts`. Returns null when:\n * - no server config is registered;\n * - `server.auth` is a `MastraAuthConfig`, not a `MastraAuthProvider`.\n */\nfunction getAuthProvider(mastra: Mastra): MastraAuthProvider | null {\n const serverConfig = (mastra as { getServer?: () => { auth?: unknown } }).getServer?.();\n if (!serverConfig?.auth) return null;\n if (typeof (serverConfig.auth as { authenticateToken?: unknown }).authenticateToken === 'function') {\n return serverConfig.auth as MastraAuthProvider;\n }\n return null;\n}\n\nfunction isUserProvider(p: unknown): p is IUserProvider {\n return (\n p !== null &&\n typeof p === 'object' &&\n typeof (p as { getCurrentUser?: unknown }).getCurrentUser === 'function' &&\n typeof (p as { getUser?: unknown }).getUser === 'function'\n );\n}\n\nfunction dedupeIds(authorIds: ReadonlyArray): string[] {\n const set = new Set();\n for (const id of authorIds) {\n if (typeof id === 'string' && id.length > 0) set.add(id);\n }\n return Array.from(set);\n}\n\nfunction projectUser(user: User | null): Omit | null {\n if (!user) return null;\n const out: Omit = {};\n if (typeof user.name === 'string') out.name = user.name;\n if (typeof user.email === 'string') out.email = user.email;\n if (typeof user.avatarUrl === 'string') out.avatarUrl = user.avatarUrl;\n return out;\n}\n\n/**\n * Resolve a set of author IDs against the configured auth provider in one\n * shot. Soft-gated: returns `null` when there is no auth provider, the\n * provider does not implement `IUserProvider`, or the input has no valid\n * IDs to look up. Callers should treat `null` as \"do not attach an `author`\n * field\" so behavior matches setups without user awareness.\n *\n * When the provider exposes the optional `getUsers` batch method, the helper\n * calls it once with the deduped ID list. Otherwise it falls back to\n * `Promise.all(getUser(id))`, parallelized per unique ID. Provider errors\n * per ID are caught and treated as \"unresolved\" — they do not reject the\n * enrichment call.\n *\n * The returned map is keyed by the **requested** ID (not the user's `id`\n * field) to be robust against providers that normalize identifiers.\n */\nexport async function prepareAuthorEnrichment(\n mastra: Mastra,\n _requestContext: RequestContext,\n authorIds: ReadonlyArray,\n): Promise | null> {\n const provider = getAuthProvider(mastra);\n if (!provider || !isUserProvider(provider)) return null;\n\n const uniqueIds = dedupeIds(authorIds);\n if (uniqueIds.length === 0) return new Map();\n\n let users: Array;\n if (typeof provider.getUsers === 'function') {\n try {\n users = await provider.getUsers(uniqueIds);\n } catch {\n // Batch lookup failed entirely — degrade gracefully to \"no enrichment\"\n return new Map();\n }\n } else {\n users = await Promise.all(uniqueIds.map(id => provider.getUser(id).catch((): User | null => null)));\n }\n\n const map = new Map();\n uniqueIds.forEach((id, index) => {\n const projected = projectUser(users[index] ?? null);\n if (projected !== null) {\n map.set(id, { id, ...projected });\n }\n });\n return map;\n}\n\n/**\n * Attach a resolved `author` to a record by looking it up in the map by\n * `record.authorId`. When `authors` is `null` (feature off) or the id is\n * missing from the map, the record passes through unchanged.\n */\nexport function attachAuthor(\n record: T,\n authors: Map | null,\n): T & { author?: ResolvedAuthor } {\n if (!authors) return record;\n const id = record.authorId;\n if (typeof id !== 'string' || id.length === 0) return record;\n const author = authors.get(id);\n if (!author) return record;\n return { ...record, author };\n}\n"]}