@learncard/partner-connect 0.5.1 → 0.6.0
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.
- package/README.md +395 -83
- package/dist/index.d.ts +257 -25
- package/dist/partner-connect.esm.js +3294 -431
- package/dist/partner-connect.esm.js.map +1 -1
- package/dist/partner-connect.js +3295 -430
- package/dist/partner-connect.js.map +1 -1
- package/dist/partner-connect.mjs +3294 -431
- package/dist/partner-connect.mjs.map +1 -1
- package/package.json +3 -2
- package/src/docs-snippets.test.ts +79 -0
- package/src/index.ts +496 -33
- package/src/mock-host.ts +2447 -523
- package/src/mock-mode.test.ts +1337 -7
- package/src/origin-resolution.test.ts +229 -0
- package/src/types.ts +130 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partner-connect.esm.js","sources":["../src/types.ts","../src/mock-host.ts","../src/index.ts"],"sourcesContent":["/**\n * LearnCard Partner Connect SDK - Type Definitions\n */\n\n// Re-export AppEvent types from shared types package\nexport type {\n AppEvent,\n SendCredentialEvent,\n CheckCredentialEvent,\n AppEventResponse,\n} from '@learncard/types';\n\n/**\n * Configuration options for initializing the SDK\n */\nexport interface PartnerConnectOptions {\n /**\n * The origin(s) of the LearnCard host.\n *\n * Each entry may be either an **exact origin** (`https://learncard.app`) or a\n * **wildcard pattern** where `*` stands in for a single DNS label portion in\n * the host portion of the origin (e.g. `https://*.learncard.app`,\n * `https://*.vetpass.app`). Wildcards are **only** allowed in the host and\n * only as label(s); the protocol and port must always match exactly.\n *\n * Wildcard patterns match any non-empty chain of labels. So\n * `https://*.learncard.app` matches both `https://staging.learncard.app` and\n * `https://pr-123.preview.learncard.app`, but **not** `https://learncard.app`\n * itself (include the bare origin explicitly if you need it) and **not**\n * `https://evil.learncard.app.attacker.com` (the suffix must match).\n *\n * **Origin Configuration Hierarchy at runtime:**\n * 1. `window.location.ancestorOrigins[0]` (when available) — the real parent\n * origin as reported by the browser, validated against the effective\n * whitelist. This source cannot be spoofed by a malicious query param.\n * 2. `?lc_host_override=<origin>` query parameter — validated against the\n * whitelist. Used by the LearnCard host to tell the SDK which origin it\n * is loading from.\n * 3. `sessionStorage['lc_host_override']` — a previously-validated override\n * persisted across in-iframe navigation.\n * 4. First value in the configured `hostOrigin` array / single string.\n * 5. `PartnerConnect.DEFAULT_HOST_ORIGIN` (`https://learncard.app`).\n *\n * The partner app's configured whitelist is combined with a small built-in\n * list of LearnCard tenant domains (see `disableDefaultTenants` to opt out).\n * This lets a partner app work out-of-the-box inside any current or future\n * `*.learncard.app`, `*.learncard.ai`, or `*.vetpass.app` tenant without a\n * re-deploy.\n *\n * **Examples:**\n *\n * Single origin (production only):\n * ```typescript\n * hostOrigin: 'https://learncard.app'\n * ```\n *\n * Wildcard whitelist (covers staging + preview):\n * ```typescript\n * hostOrigin: ['https://learncard.app', 'https://*.learncard.app']\n * ```\n *\n * Custom tenant alongside the built-in LearnCard defaults:\n * ```typescript\n * hostOrigin: ['https://partner.example.com']\n * // learncard.app / *.learncard.app / *.learncard.ai / vetpass.app / *.vetpass.app\n * // are ALSO trusted because disableDefaultTenants is false.\n * ```\n *\n * @default 'https://learncard.app'\n */\n hostOrigin?: string | string[];\n\n /**\n * Opt out of the built-in LearnCard tenant whitelist.\n *\n * By default, the SDK merges `hostOrigin` with a curated list of LearnCard\n * and tenant domains (see `PartnerConnect.DEFAULT_TRUSTED_TENANTS`) so that\n * partner apps work on any LearnCard-managed tenant without reconfiguration.\n *\n * Set to `true` if you want the partner app to **only** trust the origins\n * you pass in `hostOrigin`.\n *\n * @default false\n */\n disableDefaultTenants?: boolean;\n\n /**\n * Whether to allow native app origins (default: true)\n *\n * @default true\n */\n allowNativeAppOrigins?: boolean;\n\n /**\n * Protocol identifier (default: 'LEARNCARD_V1')\n */\n protocol?: string;\n\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n requestTimeout?: number;\n\n /**\n * Controls automatic **standalone mock mode**.\n *\n * When the SDK runs outside of a LearnCard host (i.e. as a top-level page,\n * not embedded in an iframe), there is no host to answer `postMessage`\n * requests, so every call would hang until it times out. Mock mode makes\n * the SDK simulate the host locally so your app is fully buildable,\n * demo-able, and testable without being embedded — and then behaves\n * identically (real host) once embedded, with no code changes.\n *\n * - `'auto'` **(default)**: mock only when **no LearnCard host is present\n * AND the app is running on a local dev host** (`localhost`,\n * `127.0.0.1`, `[::1]`, `*.localhost`, `*.local`). This covers local\n * dev and local Storybook, but deliberately never fabricates identity\n * or consent on a production or preview origin. Each mocked call\n * surfaces a labeled toast plus a console log so it's clear the host\n * is simulated.\n * - `'standalone'`: mock whenever **no LearnCard host is present**, on\n * any origin — including remote deploy previews (Netlify, Lovable,\n * Vercel, …) — and use the real host when embedded in LearnCard. The\n * one-flag setting for apps that must demo standalone anywhere. Only\n * choose it when a user opening your app's URL directly should see\n * simulated data.\n * - `true`: always mock, **even when embedded in a real LearnCard host**.\n * Use this for CI and tests; for previews that should go real once\n * embedded, prefer `'standalone'`.\n * - `false`: never mock. Standalone calls reject immediately with\n * `LC_NOT_EMBEDDED`. Set this in production builds meant to run only\n * inside LearnCard.\n *\n * @default 'auto'\n */\n mock?: boolean | 'auto' | 'standalone';\n\n /**\n * Fine-grained configuration for standalone mock mode. Ignored when mock\n * mode is not active. See {@link MockHostOptions}.\n */\n mockOptions?: MockHostOptions;\n\n /**\n * How long (ms) to wait for the host to answer the one-time presence\n * probe used when the SDK is embedded in an iframe whose parent cannot\n * be confirmed as LearnCard (e.g. a same-origin Storybook canvas on\n * localhost). Only used with `mock: 'auto'` on local dev hosts.\n *\n * @default 1500\n */\n hostProbeTimeout?: number;\n}\n\n/**\n * Options controlling the behavior of standalone mock mode.\n *\n * All fields are optional; mock mode works out-of-the-box with sensible\n * defaults (visible UI, console logging, and localStorage-backed counters).\n */\nexport interface MockHostOptions {\n /**\n * Render lightweight visual feedback in the page: a fake credential-claim\n * modal / toast for `sendCredential`, and a \"mock consent\" banner for\n * `requestConsent`. Set to `false` for a headless mock (logs only).\n *\n * @default true\n */\n ui?: boolean;\n\n /**\n * Log every simulated host interaction to the console with a clear\n * `[LearnCard SDK · MOCK]` prefix.\n *\n * @default true\n */\n log?: boolean;\n\n /**\n * Persist counters (`incrementCounter` / `getCounter` / `getCounters`) to\n * `localStorage` so values survive page reloads, mirroring the real host's\n * durable per-user counters. Falls back to in-memory storage when\n * `localStorage` is unavailable.\n *\n * @default true\n */\n persist?: boolean;\n\n /**\n * The fake DID returned by `requestIdentity()` (and used as the mock\n * user's identity) while in mock mode.\n *\n * @default 'did:web:mock.learncard.app:user'\n */\n did?: string;\n\n /**\n * Namespace used to scope persisted mock data (counters, claimed\n * credentials) in `localStorage`. Change this if you run multiple mock\n * apps on the same origin and want isolated state.\n *\n * @default 'lc-mock'\n */\n namespace?: string;\n\n /**\n * Seed the mock user's identity. Superseded per-field over the legacy\n * `did` option. Extra fields are returned as-is from `requestIdentity()`.\n */\n identity?: MockIdentitySeed;\n\n /**\n * Pre-populate the mock with credentials the user already holds (or has\n * issued to others). This lets you demo \"happy path\" states — e.g. a\n * \"you already earned this\" banner — without performing an action first.\n * Reads like `checkUserHasCredential`, `getTemplateRecipients`,\n * `requestLearnerContext`, and `askCredentialSearch` reflect these.\n */\n credentials?: MockCredentialSeed[];\n\n /**\n * Initial counter values, applied only when a counter has no persisted\n * value yet (so incremented values survive reloads).\n */\n counters?: Record<string, number>;\n}\n\n/**\n * Seed shape for the mock user's identity (see {@link MockHostOptions.identity}).\n */\nexport interface MockIdentitySeed {\n did?: string;\n name?: string;\n [key: string]: unknown;\n}\n\n/**\n * Seed shape for a pre-populated mock credential (see\n * {@link MockHostOptions.credentials}).\n */\nexport interface MockCredentialSeed {\n /** Template alias this credential was issued from. */\n templateAlias?: string;\n\n /** Boost URI this credential was issued from. */\n boostUri?: string;\n\n /** Human-readable credential name (used in toasts and mock VC data). */\n name?: string;\n\n /**\n * Recipient identifier (profileId or DID). Defaults to the mock user\n * (i.e. a credential the user holds). Set this to model credentials the\n * user has issued to other people.\n */\n recipient?: string;\n\n /** Claim status. @default 'claimed' */\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Identity information returned from REQUEST_IDENTITY\n */\nexport interface IdentityResponse {\n token: string;\n user: {\n did: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Response from SEND_CREDENTIAL action (raw credential)\n */\nexport interface SendCredentialResponse {\n credentialId: string;\n [key: string]: unknown;\n}\n\n/**\n * Template-based credential input for sendCredential\n * Uses a pre-configured boost template to issue a credential\n */\nexport interface TemplateCredentialInput {\n /** Alias of the boost template configured for this app */\n templateAlias: string;\n\n /** Optional template data for Mustache-style variable substitution */\n templateData?: Record<string, unknown>;\n\n /**\n * If true, the host will return an existing credential (if present) instead of issuing a duplicate.\n */\n preventDuplicateClaim?: boolean;\n}\n\n/**\n * Response from template-based credential issuance\n */\nexport interface TemplateCredentialResponse {\n /** URI of the issued credential */\n credentialUri: string;\n\n /** URI of the boost template used */\n boostUri: string;\n\n /** Whether the credential was already claimed (when preventDuplicateClaim is true) */\n alreadyClaimed?: boolean;\n\n /** Whether the user has the credential (when preventDuplicateClaim is true) */\n hasCredential?: boolean;\n\n /** The status of the credential (when preventDuplicateClaim is true) */\n status?: 'pending' | 'claimed' | 'revoked';\n\n /** The date the credential was received (when preventDuplicateClaim is true) */\n receivedDate?: string;\n\n [key: string]: unknown;\n}\n\n/**\n * Verifiable Presentation Request Query types\n */\nexport type VPRQuery =\n | {\n type: 'QueryByTitle';\n credentialQuery: {\n reason?: string;\n title: string;\n };\n }\n | {\n type: 'QueryByExample';\n credentialQuery: unknown;\n };\n\n/**\n * Verifiable Presentation Request structure\n */\nexport interface VerifiablePresentationRequest {\n query: VPRQuery[];\n challenge: string;\n domain: string;\n}\n\n/**\n * Response from ASK_CREDENTIAL_SEARCH action\n */\nexport interface CredentialSearchResponse {\n verifiablePresentation?: {\n verifiableCredential: unknown[];\n [key: string]: unknown;\n };\n}\n\n/**\n * Response from ASK_CREDENTIAL_SPECIFIC action\n */\nexport interface CredentialSpecificResponse {\n credential?: unknown;\n}\n\n/**\n * Options for REQUEST_CONSENT action\n */\nexport interface RequestConsentOptions {\n /**\n * If true, redirect to contract's redirectUrl with VP after consent.\n * Default: false\n */\n redirect?: boolean;\n}\n\n/**\n * Payload for REQUEST_CONSENT action\n */\nexport interface RequestConsentPayload {\n /**\n * URI of the consent contract. If not provided, the system will attempt\n * to use the contract configured for the current app listing.\n */\n contractUri?: string;\n redirect?: boolean;\n}\n\n/**\n * Response from REQUEST_CONSENT action\n */\nexport interface ConsentResponse {\n granted: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Response from INITIATE_TEMPLATE_ISSUE action\n */\nexport interface TemplateIssueResponse {\n issued: boolean;\n [key: string]: unknown;\n}\n\n// AppEvent, SendCredentialEvent, CheckCredentialEvent, and AppEventResponse are re-exported from @learncard/types above\n\n/**\n * Input used to check if the authenticated user already has a credential for a boost template\n */\nexport type CheckCredentialInput = { templateAlias: string } | { boostUri: string };\n\n/**\n * Response from checkUserHasCredential\n */\nexport interface CheckCredentialResponse {\n hasCredential: boolean;\n credentialUri?: string;\n receivedDate?: string;\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Input for checking template issuance status to a specific recipient.\n * The recipient can be either a DID (did:web:...) or a profileId.\n */\nexport type CheckIssuanceStatusInput =\n { templateAlias: string; recipient: string } | { boostUri: string; recipient: string };\n\n/**\n * Response from getTemplateIssuanceStatus\n */\nexport interface TemplateIssuanceStatusResponse {\n sent: boolean;\n credentialUri?: string;\n sentDate?: string;\n claimedDate?: string;\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Input for getting template recipients list\n */\nexport type GetTemplateRecipientsInput =\n | { templateAlias: string; limit?: number; cursor?: string }\n | { boostUri: string; limit?: number; cursor?: string };\n\n/**\n * Individual recipient record in the template recipients response\n */\nexport interface TemplateRecipientRecord {\n recipientProfileId: string;\n recipientDisplayName?: string;\n sentDate: string;\n claimedDate?: string;\n credentialUri?: string;\n status: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Response from getTemplateRecipients\n */\nexport interface TemplateRecipientsResponse {\n records: TemplateRecipientRecord[];\n hasMore: boolean;\n cursor?: string;\n total?: number;\n}\n\n/**\n * Options for REQUEST_LEARNER_CONTEXT action\n */\nexport interface RequestLearnerContextOptions {\n /**\n * Whether to include credentials in the context\n * @default true\n */\n includeCredentials?: boolean;\n\n /**\n * Whether to include personal data (name, bio, etc.) in the context\n * @default false\n */\n includePersonalData?: boolean;\n\n /**\n * Format of the response\n * - 'prompt': Returns LLM-ready formatted text\n * - 'structured': Returns structured data object\n * @default 'prompt'\n */\n format?: 'prompt' | 'structured';\n\n /**\n * Optional instructions to guide the LLM prompt generation\n */\n instructions?: string;\n\n /**\n * Level of detail in the generated prompt\n * @default 'compact'\n */\n detailLevel?: 'compact' | 'expanded';\n\n /**\n * Wait for LearnCard to finish background ConsentFlow data sync before returning context.\n * Apps that need a complete learner snapshot should set this to true.\n * @default false\n */\n waitForSync?: boolean;\n}\n\n/**\n * Raw data included in learner context response (when format is 'structured')\n */\nexport interface LearnerContextRawData {\n /** Array of Verifiable Credentials */\n credentials: unknown[];\n\n /** Personal data if requested and available (name, bio, etc.) */\n personalData?: Record<string, unknown>;\n}\n\nexport type LearnerContextCacheStatus = 'backend-hit' | 'backend-miss' | 'structured';\n\nexport interface LearnerContextTimingBreakdown {\n totalMs: number;\n sdkRoundTripMs?: number;\n appEventMs?: number;\n credentialReadMs?: number;\n promptizerMs?: number;\n}\n\n/**\n * Response from REQUEST_LEARNER_CONTEXT action\n */\nexport interface LearnerContextResponse {\n /** Whether the response used immediately available data or waited for a complete sync */\n status?: 'ready' | 'syncing';\n\n /** Current sync progress when available */\n progress?: SyncProgress;\n\n /** LLM-ready formatted prompt text */\n prompt: string;\n\n /** Raw structured data (only included when format is 'structured') */\n raw?: LearnerContextRawData;\n\n /** User's DID */\n did: string;\n\n /** User's display name if available */\n displayName?: string;\n\n /** Server authorization, server-cache, and request timing metadata. Prompts are not cached in the browser. */\n metadata?: {\n /** Current AI consent revision for a formatted prompt; absent for structured-only responses. */\n consentRevision?: string;\n cacheStatus?: LearnerContextCacheStatus;\n timings?: LearnerContextTimingBreakdown;\n backendMetadata?: Record<string, unknown>;\n };\n}\n\nexport interface SyncProgress {\n totalCredentials: number;\n completedCredentials: number;\n failedCredentials: number;\n retryCount: number;\n}\n\nexport interface SyncStatus {\n status: 'ready' | 'syncing' | 'error';\n progress: SyncProgress;\n eta?: number;\n lastError?: string;\n}\n\n/**\n * Keywords for next steps in summary credential data\n */\nexport interface SummaryCredentialKeyword {\n occupations: string[] | null;\n careers: string[] | null;\n jobs: string[] | null;\n skills: string[] | null;\n fieldOfStudy: string | null;\n}\n\n/**\n * Skill item in summary credential data\n */\nexport interface SummaryCredentialSkill {\n title: string;\n description: string;\n}\n\n/**\n * Next step item in summary credential data\n *\n * `keywords` is optional. Omit it entirely (or pass `undefined`) when you do not\n * have taxonomy data — you no longer need to pass a struct of `null` fields.\n */\nexport interface SummaryCredentialNextStep {\n title: string;\n description: string;\n keywords?: SummaryCredentialKeyword;\n}\n\n/**\n * Reflection item in summary credential data\n */\nexport interface SummaryCredentialReflection {\n title: string;\n description: string;\n}\n\n/**\n * Summary data for an AI Session credential\n * Contains structured information about what was learned\n */\nexport interface SummaryCredentialData {\n /** Short, concise title for the learning session or credential */\n title: string;\n /** Comprehensive summary of what happened during the session */\n summary: string;\n /** Bullet points of key knowledge gained */\n learned: string[];\n /** Categorized skills learned during the session */\n skills: SummaryCredentialSkill[];\n /** Recommended follow-up activities or learning modules */\n nextSteps: SummaryCredentialNextStep[];\n /** Reflections on the learning experience */\n reflections: SummaryCredentialReflection[];\n}\n\n/**\n * Input for creating and sending an AI Session credential\n */\nexport interface SendAiSessionCredentialInput {\n /** Title of this specific AI session */\n sessionTitle: string;\n /** Structured summary data about what was learned */\n summaryData: SummaryCredentialData;\n /** Optional metadata for the session */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Response from sending an AI Session credential\n */\nexport interface SendAiSessionCredentialResponse {\n /** URI of the AI Topic (parent) boost */\n topicUri: string;\n /** URI of the topic credential, if a new topic was created */\n topicCredentialUri?: string;\n /** URI of the created AI Session credential */\n sessionCredentialUri: string;\n /** URI of the session boost (child of topic) */\n sessionBoostUri: string;\n /** Whether a new topic was created (true) or existing was used (false) */\n isNewTopic: boolean;\n}\n\n/**\n * Input for sending a notification to the current user from this app.\n * The notification appears in the user's LearnCard notification inbox.\n */\nexport interface AppNotificationInput {\n /** Notification title */\n title?: string;\n\n /** Notification body text */\n body?: string;\n\n /** Deep link path within the app (e.g. '/prizes') */\n actionPath?: string;\n\n /** Grouping category (e.g. 'reward', 'announcement', 'status') */\n category?: string;\n\n /** Notification priority */\n priority?: 'normal' | 'high';\n}\n\n/**\n * Response from sendNotification\n */\nexport interface AppNotificationResponse {\n sent: boolean;\n}\n\n/**\n * Response from incrementCounter\n */\nexport interface IncrementCounterResponse {\n key: string;\n previousValue: number;\n newValue: number;\n}\n\n/**\n * Response from getCounter\n */\nexport interface GetCounterResponse {\n key: string;\n value: number;\n updatedAt: string | null;\n}\n\n/**\n * Response from getCounters\n */\nexport interface GetCountersResponse {\n counters: GetCounterResponse[];\n}\n\n/**\n * Error codes that can be returned by the LearnCard host\n */\nexport type ErrorCode =\n | 'LC_TIMEOUT'\n | 'LC_NOT_EMBEDDED'\n | 'LC_UNAUTHENTICATED'\n | 'CREDENTIAL_NOT_FOUND'\n | 'USER_REJECTED'\n | 'UNAUTHORIZED'\n | 'TEMPLATE_NOT_FOUND'\n | 'BOOST_NOT_FOUND'\n | 'INSUFFICIENT_PERMISSIONS'\n | string;\n\n/**\n * Error object returned when a request fails.\n *\n * Historically the SDK rejected with a plain `{ code, message }` object. As of\n * v0.3.0 we reject with a {@link PartnerConnectError} instance instead, which\n * still satisfies this interface (it has both `code` and `message` fields), so\n * existing consumers that do `if (err.code === '...')` continue to work\n * unchanged.\n */\nexport interface LearnCardError {\n code: ErrorCode;\n message: string;\n}\n\n/**\n * Typed error class for all Partner Connect SDK rejections.\n *\n * Use `instanceof PartnerConnectError` to narrow caught errors and unlock\n * exhaustive `switch` checks on `code`. Both `code` and `message` are present\n * (so the legacy `LearnCardError` object shape is preserved), and `name` is\n * always `'PartnerConnectError'`.\n *\n * @example\n * ```typescript\n * try {\n * await learnCard.requestLearnerContext();\n * } catch (err) {\n * if (err instanceof PartnerConnectError) {\n * switch (err.code) {\n * case 'LC_UNAUTHENTICATED': showLogin(); break;\n * case 'USER_REJECTED': showPrivacyNotice(); break;\n * case 'UNAUTHORIZED': showPermissionsError(); break;\n * default: console.error(err);\n * }\n * }\n * }\n * ```\n */\nexport class PartnerConnectError extends Error implements LearnCardError {\n public readonly code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = 'PartnerConnectError';\n this.code = code;\n\n // Restore prototype chain when transpiled to ES5 targets.\n Object.setPrototypeOf(this, PartnerConnectError.prototype);\n }\n\n /**\n * Wrap any incoming `LearnCardError`-shaped value into a `PartnerConnectError`.\n * Returns the value unchanged if it is already an instance.\n *\n * Used internally at every reject site so callers always receive a typed\n * `PartnerConnectError`, regardless of whether the failure originated from\n * the host (over postMessage), an SDK timeout, or `destroy()`.\n */\n public static from(input: LearnCardError | unknown): PartnerConnectError {\n if (input instanceof PartnerConnectError) return input;\n\n if (\n input &&\n typeof input === 'object' &&\n 'code' in input &&\n typeof (input as { code: unknown }).code === 'string'\n ) {\n const candidate = input as { code: string; message?: unknown };\n const message =\n typeof candidate.message === 'string'\n ? candidate.message\n : 'Partner Connect request failed';\n return new PartnerConnectError(candidate.code as ErrorCode, message);\n }\n\n return new PartnerConnectError(\n 'UNKNOWN_ERROR',\n input instanceof Error ? input.message : 'An unknown error occurred'\n );\n }\n}\n\n/**\n * Internal message structure sent via postMessage\n */\nexport interface PostMessageRequest {\n protocol: string;\n action: string;\n requestId: string;\n payload?: unknown;\n}\n\n/**\n * Internal message structure received via postMessage\n */\nexport interface PostMessageResponse {\n protocol: string;\n requestId: string;\n type: 'SUCCESS' | 'ERROR';\n data?: unknown;\n error?: LearnCardError;\n}\n\n/**\n * Pending request tracking structure\n */\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: LearnCardError) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n}\n","/**\n * Standalone mock host for the Partner Connect SDK.\n *\n * When the SDK is not embedded in a real LearnCard host there is nothing to\n * answer its `postMessage` requests. `MockHost` locally simulates the host so\n * partner apps are fully buildable, demo-able, and testable in isolation. It\n * intercepts the SDK's single `sendMessage(action, payload)` chokepoint and\n * returns responses that match the shapes the real host produces.\n *\n * This module is browser-oriented but SSR-safe: it never touches `document` at\n * import time and degrades to log-only behavior when the DOM is unavailable.\n */\n\nimport type { MockHostOptions } from './types';\n\nconst DEFAULT_DID = 'did:web:mock.learncard.app:user';\nconst DEFAULT_NAMESPACE = 'lc-mock';\nconst MOCK_PREFIX = '[LearnCard SDK · MOCK]';\n\ninterface ResolvedMockOptions {\n ui: boolean;\n log: boolean;\n persist: boolean;\n namespace: string;\n}\n\ninterface StoredCounter {\n value: number;\n updatedAt: string;\n}\n\ntype MockStatus = 'pending' | 'claimed' | 'revoked';\n\ninterface MockCredential {\n credentialUri: string;\n boostUri?: string;\n templateAlias?: string;\n name: string;\n recipient: string;\n status: MockStatus;\n sentDate: string;\n claimedDate?: string;\n receivedDate?: string;\n credential: unknown;\n}\n\ninterface TemplateQuery {\n templateAlias?: unknown;\n boostUri?: unknown;\n}\n\ntype ToastTone = 'default' | 'positive';\n\n/** A toast body is a list of plain strings and bold (`{ b }`) segments. */\ntype ToastSegment = string | { b: string };\n\ninterface ToastSpec {\n icon: string;\n segments: ToastSegment[];\n tone?: ToastTone;\n ttl?: number;\n}\n\ninterface ActiveToast {\n node: HTMLElement;\n timeoutId: ReturnType<typeof setTimeout>;\n count: number;\n countEl: HTMLElement;\n}\n\nconst hasDocument = (): boolean =>\n typeof document !== 'undefined' && typeof document.createElement === 'function';\n\nconst readAchievementName = (payload: unknown): string => {\n if (!payload || typeof payload !== 'object') return 'a credential';\n\n const record = payload as Record<string, unknown>;\n\n // Template-based issuance (APP_EVENT / send-credential).\n if (typeof record.templateAlias === 'string' && record.templateAlias) {\n const data = record.templateData;\n if (data && typeof data === 'object') {\n const fields = data as Record<string, unknown>;\n const named =\n fields.name ?? fields.achievementName ?? fields.courseName ?? fields.title;\n if (typeof named === 'string' && named) return named;\n }\n return record.templateAlias;\n }\n\n // Raw verifiable credential.\n const credential = (record.credential ?? record) as Record<string, unknown>;\n if (credential && typeof credential === 'object') {\n const subject = credential.credentialSubject as Record<string, unknown> | undefined;\n const achievement = subject?.achievement as Record<string, unknown> | undefined;\n if (achievement && typeof achievement.name === 'string' && achievement.name) {\n return achievement.name;\n }\n if (typeof credential.name === 'string' && credential.name) return credential.name;\n }\n\n return 'a credential';\n};\n\n/**\n * Simulates the LearnCard host for a single {@link PartnerConnect} instance.\n * All public methods route through `handle`, keeping the mock behind the same\n * `(action, payload)` contract the real host answers over `postMessage`.\n */\nexport class MockHost {\n private readonly options: ResolvedMockOptions;\n\n /** In-memory counter fallback used when persistence is off/unavailable. */\n private readonly memoryCounters = new Map<string, StoredCounter>();\n\n /** Session-scoped credential store; reads reflect writes and seeds. */\n private readonly credentials: MockCredential[] = [];\n\n private readonly identity: { did: string; [key: string]: unknown };\n\n /** DOM nodes injected for visual feedback, tracked for cleanup. */\n private readonly domNodes = new Set<HTMLElement>();\n\n /** The app's single AI Topic, created lazily by the first AI session. */\n private aiTopic: { topicUri: string; topicCredentialUri: string } | null = null;\n\n private styleEl: HTMLStyleElement | null = null;\n private stackEl: HTMLElement | null = null;\n private readonly activeToasts = new Map<string, ActiveToast>();\n /** Pending exit-animation timers, tracked so `destroy()` can cancel them. */\n private readonly exitTimers = new Set<ReturnType<typeof setTimeout>>();\n private idSeq = 0;\n private destroyed = false;\n\n constructor(options?: MockHostOptions) {\n this.options = {\n ui: options?.ui ?? true,\n log: options?.log ?? true,\n persist: options?.persist ?? true,\n namespace: options?.namespace || DEFAULT_NAMESPACE,\n };\n\n this.identity = {\n ...(options?.identity ?? {}),\n did: options?.identity?.did || options?.did || DEFAULT_DID,\n };\n\n for (const seed of options?.credentials ?? []) {\n this.addCredential({\n name: seed.name || seed.templateAlias || 'Mock Credential',\n templateAlias: seed.templateAlias,\n boostUri: seed.boostUri,\n recipient: seed.recipient,\n status: seed.status,\n });\n }\n\n for (const [key, value] of Object.entries(options?.counters ?? {})) {\n if (this.readCounter(key) === undefined) this.writeCounter(key, value);\n }\n\n this.announce();\n }\n\n /**\n * Resolve a simulated response for one SDK request. Mirrors the real host:\n * direct actions map 1:1, and `APP_EVENT` is dispatched by its `type`.\n */\n public handle(action: string, payload?: unknown): Promise<unknown> {\n if (this.destroyed) {\n return Promise.reject({\n code: 'SDK_DESTROYED',\n message: 'Mock host was destroyed before the request completed',\n });\n }\n\n this.log(action, payload);\n\n if (action === 'APP_EVENT') {\n return this.handleAppEvent(payload as Record<string, unknown>);\n }\n\n switch (action) {\n case 'REQUEST_IDENTITY':\n this.toast({\n icon: '👤',\n segments: ['In LearnCard, the user would sign in. Returning a mock identity.'],\n });\n return Promise.resolve({\n token: `mock-token-${Date.now()}`,\n user: { ...this.identity },\n });\n\n case 'SEND_CREDENTIAL': {\n const name = readAchievementName(payload);\n const credentialId = `mock-credential-${Date.now()}-${(this.idSeq += 1)}`;\n this.addCredential({\n name,\n credentialUri: credentialId,\n credential: (payload as { credential?: unknown } | undefined)?.credential,\n });\n this.showClaimToast(name);\n return Promise.resolve({ credentialId, stored: true });\n }\n\n case 'REQUEST_CONSENT': {\n const redirect = Boolean((payload as { redirect?: boolean } | undefined)?.redirect);\n this.showConsentBanner(redirect);\n return Promise.resolve({ granted: true });\n }\n\n case 'LAUNCH_FEATURE': {\n const featurePath =\n (payload as { featurePath?: string } | undefined)?.featurePath ?? '';\n this.toast({\n icon: '🚀',\n segments: featurePath\n ? ['In LearnCard, this would open ', { b: featurePath }, '.']\n : ['In LearnCard, this would open a feature screen.'],\n });\n return Promise.resolve({ launched: true, featurePath });\n }\n\n case 'ASK_CREDENTIAL_SEARCH': {\n const held = this.selfCredentials();\n this.toast({\n icon: '🔍',\n segments: held.length\n ? ['The user could share ', { b: String(held.length) }, ' credential(s).']\n : [\n 'In LearnCard, the user would be asked to share matching credentials. None in mock.',\n ],\n });\n return Promise.resolve({\n verifiablePresentation: {\n verifiableCredential: held.map(c => c.credential),\n },\n });\n }\n\n case 'ASK_CREDENTIAL_SPECIFIC': {\n const credentialId = (payload as { credentialId?: string } | undefined)\n ?.credentialId;\n const found = this.credentials.find(c => c.credentialUri === credentialId);\n this.toast({\n icon: '🔍',\n segments: found\n ? ['Sharing ', { b: found.name }, '.']\n : [\n 'In LearnCard, the user would be asked to share a credential. Not found in mock.',\n ],\n });\n return Promise.resolve({ credential: found?.credential });\n }\n\n case 'INITIATE_TEMPLATE_ISSUE': {\n const input = payload as\n | { templateId?: string; draftRecipients?: string[] }\n | undefined;\n const templateId = input?.templateId ?? '';\n const recipients = Array.isArray(input?.draftRecipients)\n ? (input?.draftRecipients as string[])\n : [];\n for (const recipient of recipients) {\n this.addCredential({\n name: templateId || 'Boost',\n boostUri: templateId,\n recipient,\n status: 'pending',\n });\n }\n this.toast({\n icon: '📤',\n segments: recipients.length\n ? [\n 'This would issue to ',\n { b: String(recipients.length) },\n ' recipient(s).',\n ]\n : ['In LearnCard, this would open the Send Boost flow.'],\n });\n return Promise.resolve({ issued: true });\n }\n\n case 'REQUEST_LEARNER_CONTEXT': {\n const opts = (payload ?? {}) as {\n includeCredentials?: boolean;\n format?: string;\n };\n const includeCredentials = opts.includeCredentials !== false;\n const structured = opts.format === 'structured';\n const held = includeCredentials ? this.selfCredentials() : [];\n this.toast({\n icon: '🧠',\n segments: !includeCredentials\n ? ['Learner profile requested with credentials excluded.']\n : held.length\n ? ['Learner profile: ', { b: String(held.length) }, ' credential(s).']\n : [\"In LearnCard, the user's learner profile would load. Empty in mock.\"],\n });\n const prompt = !includeCredentials\n ? 'Mock learner context: credentials were not requested.'\n : held.length\n ? `Mock learner context. Credentials held: ${held.map(c => c.name).join(', ')}.`\n : 'Mock learner context: this user has no credentials in standalone mode.';\n return Promise.resolve({\n status: 'ready',\n prompt,\n did: this.identity.did,\n // Matches the real host: `raw` only ships for format: 'structured'.\n ...(structured ? { raw: { credentials: held.map(c => c.credential) } } : {}),\n });\n }\n\n case 'GET_SYNC_STATUS':\n this.toast({\n icon: '🔄',\n segments: [\n 'In LearnCard, this reports data sync progress. Mock reports ready.',\n ],\n });\n return Promise.resolve({\n status: 'ready',\n progress: {\n totalCredentials: 0,\n completedCredentials: 0,\n failedCredentials: 0,\n retryCount: 0,\n },\n });\n\n default:\n this.toast({\n icon: '✨',\n segments: ['In LearnCard, this would run ', { b: action }, '.'],\n });\n return Promise.resolve({});\n }\n }\n\n /** Tear down injected UI and clear in-memory state. */\n public destroy(): void {\n this.destroyed = true;\n\n for (const entry of this.activeToasts.values()) clearTimeout(entry.timeoutId);\n this.activeToasts.clear();\n\n for (const timer of this.exitTimers) clearTimeout(timer);\n this.exitTimers.clear();\n\n for (const node of this.domNodes) node.remove();\n this.domNodes.clear();\n\n if (this.stackEl) {\n this.stackEl.remove();\n this.stackEl = null;\n }\n\n if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n this.memoryCounters.clear();\n this.credentials.length = 0;\n }\n\n private handleAppEvent(event: Record<string, unknown>): Promise<unknown> {\n const type = typeof event?.type === 'string' ? event.type : '';\n\n switch (type) {\n case 'send-credential': {\n const name = readAchievementName(event);\n const templateAlias =\n typeof event.templateAlias === 'string' ? event.templateAlias : undefined;\n const boostUri = `lc:mock:boost:${String(event.templateAlias ?? 'template')}`;\n\n if (event.preventDuplicateClaim) {\n const existing = this.selfCredentials().find(c =>\n this.matchesTemplate(c, { templateAlias, boostUri })\n );\n if (existing) {\n this.toast({\n icon: '✅',\n segments: ['The user already has ', { b: existing.name }, '.'],\n });\n return Promise.resolve({\n credentialUri: existing.credentialUri,\n boostUri: existing.boostUri ?? boostUri,\n alreadyClaimed: true,\n hasCredential: true,\n status: existing.status,\n receivedDate: existing.receivedDate,\n });\n }\n }\n\n const record = this.addCredential({\n name,\n templateAlias,\n boostUri,\n status: 'claimed',\n });\n this.showClaimToast(name);\n return Promise.resolve({\n credentialUri: record.credentialUri,\n boostUri: record.boostUri ?? boostUri,\n alreadyClaimed: false,\n hasCredential: true,\n status: 'claimed',\n receivedDate: record.receivedDate,\n });\n }\n\n case 'check-credential': {\n const held = this.selfCredentials().find(c => this.matchesTemplate(c, event));\n this.toast({\n icon: '🔎',\n segments: held\n ? ['The user already has ', { b: held.name }, '.']\n : [\"Mock: the user doesn't have this credential yet.\"],\n });\n return Promise.resolve(\n held\n ? {\n hasCredential: true,\n credentialUri: held.credentialUri,\n receivedDate: held.receivedDate,\n status: held.status,\n }\n : { hasCredential: false }\n );\n }\n\n case 'check-issuance-status': {\n const recipient = typeof event.recipient === 'string' ? event.recipient : '';\n const match = this.credentials.find(\n c => this.matchesTemplate(c, event) && c.recipient === recipient\n );\n this.toast({\n icon: '🔎',\n segments: match\n ? ['Issued to ', { b: recipient }, ' — ', { b: match.status }, '.']\n : ['Mock: not sent to this recipient yet.'],\n });\n return Promise.resolve(\n match\n ? {\n sent: true,\n credentialUri: match.credentialUri,\n sentDate: match.sentDate,\n claimedDate: match.claimedDate,\n status: match.status,\n }\n : { sent: false }\n );\n }\n\n case 'get-template-recipients': {\n const matched = this.credentials.filter(c => this.matchesTemplate(c, event));\n const limit =\n typeof event.limit === 'number' && event.limit > 0 ? event.limit : undefined;\n // Cursor pagination: the cursor is the offset of the next record,\n // issued by the previous page so callers can walk the full list.\n const parsedCursor =\n typeof event.cursor === 'string' ? Number.parseInt(event.cursor, 10) : 0;\n const offset = Number.isFinite(parsedCursor) && parsedCursor > 0 ? parsedCursor : 0;\n const page = limit ? matched.slice(offset, offset + limit) : matched.slice(offset);\n const nextOffset = offset + page.length;\n const hasMore = nextOffset < matched.length;\n this.toast({\n icon: '👥',\n segments: [\n 'In LearnCard, this lists recipients. ',\n { b: String(matched.length) },\n ' in mock.',\n ],\n });\n return Promise.resolve({\n records: page.map(c => this.toRecipientRecord(c)),\n hasMore,\n ...(hasMore ? { cursor: String(nextOffset) } : {}),\n total: matched.length,\n });\n }\n\n case 'send-notification': {\n const title = typeof event.title === 'string' ? event.title : '';\n const body = typeof event.body === 'string' ? event.body : '';\n const text = [title, body].filter(Boolean).join(' — ');\n this.toast({\n icon: '🔔',\n segments: text\n ? ['The user would be notified: ', { b: text }]\n : ['In LearnCard, the user would receive a notification.'],\n });\n return Promise.resolve({ sent: true });\n }\n\n case 'increment-counter': {\n const key = String(event.key ?? '');\n const amount = typeof event.amount === 'number' ? event.amount : 0;\n const previous = this.readCounter(key)?.value ?? 0;\n const next = previous + amount;\n this.writeCounter(key, next);\n this.toast({\n icon: '🔢',\n segments: ['Counter ', { b: key }, ' → ', { b: String(next) }, '.'],\n });\n return Promise.resolve({ key, previousValue: previous, newValue: next });\n }\n\n case 'get-counter': {\n const key = String(event.key ?? '');\n const stored = this.readCounter(key);\n const value = stored?.value ?? 0;\n this.toast({\n icon: '🔢',\n segments: ['Counter ', { b: key }, ' is ', { b: String(value) }, '.'],\n });\n return Promise.resolve({\n key,\n value,\n updatedAt: stored?.updatedAt ?? null,\n });\n }\n\n case 'get-counters': {\n const requested = Array.isArray(event.keys)\n ? (event.keys as unknown[]).map(String)\n : this.allCounterKeys();\n const counters = requested.map(key => {\n const stored = this.readCounter(key);\n return { key, value: stored?.value ?? 0, updatedAt: stored?.updatedAt ?? null };\n });\n this.toast({\n icon: '🔢',\n segments: ['Read ', { b: String(counters.length) }, ' counter(s).'],\n });\n return Promise.resolve({ counters });\n }\n\n case 'send-ai-session-credential': {\n const sessionTitle =\n typeof event.sessionTitle === 'string' && event.sessionTitle\n ? event.sessionTitle\n : 'AI session';\n const sessionBoostUri = this.nextUri('lc:mock:session-boost');\n const record = this.addCredential({\n name: sessionTitle,\n boostUri: sessionBoostUri,\n status: 'claimed',\n });\n this.toast({\n icon: '✅',\n segments: [\n 'In LearnCard, an AI session credential would be saved: ',\n { b: sessionTitle },\n ],\n });\n\n // Mirrors the real host's topic hierarchy: the first session\n // creates the app's AI Topic (returning its credential URI);\n // later sessions reuse it and report isNewTopic: false.\n const isNewTopic = this.aiTopic === null;\n if (!this.aiTopic) {\n this.aiTopic = {\n topicUri: this.nextUri('lc:mock:topic'),\n topicCredentialUri: this.nextUri('lc:mock:topic-credential'),\n };\n }\n\n return Promise.resolve({\n topicUri: this.aiTopic.topicUri,\n ...(isNewTopic ? { topicCredentialUri: this.aiTopic.topicCredentialUri } : {}),\n sessionCredentialUri: record.credentialUri,\n sessionBoostUri,\n isNewTopic,\n });\n }\n\n default:\n this.toast({\n icon: '✨',\n segments: ['In LearnCard, this would run ', { b: type }, '.'],\n });\n return Promise.resolve({});\n }\n }\n\n private nextUri(prefix: string): string {\n this.idSeq += 1;\n return `${prefix}:${Date.now()}-${this.idSeq}`;\n }\n\n private buildMockVc(name: string, id: string): Record<string, unknown> {\n return {\n '@context': ['https://www.w3.org/2018/credentials/v1'],\n id,\n type: ['VerifiableCredential'],\n issuer: this.identity.did,\n credentialSubject: { id: this.identity.did, achievement: { name } },\n _mock: true,\n };\n }\n\n private addCredential(input: {\n name: string;\n templateAlias?: string;\n boostUri?: string;\n recipient?: string;\n status?: MockStatus;\n credentialUri?: string;\n credential?: unknown;\n }): MockCredential {\n const now = new Date().toISOString();\n const status: MockStatus = input.status ?? 'claimed';\n const credentialUri = input.credentialUri ?? this.nextUri('lc:mock:credential');\n const record: MockCredential = {\n credentialUri,\n boostUri: input.boostUri,\n templateAlias: input.templateAlias,\n name: input.name,\n recipient: input.recipient || this.identity.did,\n status,\n sentDate: now,\n claimedDate: status === 'claimed' ? now : undefined,\n receivedDate: status === 'claimed' ? now : undefined,\n credential: input.credential ?? this.buildMockVc(input.name, credentialUri),\n };\n this.credentials.push(record);\n return record;\n }\n\n private selfCredentials(): MockCredential[] {\n return this.credentials.filter(c => c.recipient === this.identity.did);\n }\n\n private matchesTemplate(c: MockCredential, q: TemplateQuery): boolean {\n if (typeof q.templateAlias === 'string') return c.templateAlias === q.templateAlias;\n if (typeof q.boostUri === 'string') return c.boostUri === q.boostUri;\n return false;\n }\n\n private toRecipientRecord(c: MockCredential): {\n recipientProfileId: string;\n recipientDisplayName: string;\n sentDate: string;\n claimedDate?: string;\n credentialUri: string;\n status: MockStatus;\n } {\n return {\n recipientProfileId: c.recipient,\n recipientDisplayName: c.recipient,\n sentDate: c.sentDate,\n claimedDate: c.claimedDate,\n credentialUri: c.credentialUri,\n status: c.status,\n };\n }\n\n private counterStorageKey(): string {\n return `${this.options.namespace}:counters`;\n }\n\n private loadCounters(): Record<string, StoredCounter> {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const raw = localStorage.getItem(this.counterStorageKey());\n if (raw) return JSON.parse(raw) as Record<string, StoredCounter>;\n } catch {\n // Corrupt or unavailable storage: fall through to in-memory.\n }\n }\n\n const fromMemory: Record<string, StoredCounter> = {};\n for (const [key, value] of this.memoryCounters) fromMemory[key] = value;\n return fromMemory;\n }\n\n private readCounter(key: string): StoredCounter | undefined {\n return this.loadCounters()[key];\n }\n\n private allCounterKeys(): string[] {\n return Object.keys(this.loadCounters());\n }\n\n /**\n * The load → patch → save cycle below runs synchronously within one task,\n * so increments in the same tab can never interleave. Concurrent writes\n * from *other tabs* sharing the namespace can still be lost — acceptable\n * for a dev-only mock, and inherent to `localStorage` without web locks.\n */\n private writeCounter(key: string, value: number): void {\n const entry: StoredCounter = { value, updatedAt: new Date().toISOString() };\n\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const all = this.loadCounters();\n all[key] = entry;\n localStorage.setItem(this.counterStorageKey(), JSON.stringify(all));\n return;\n } catch {\n // Fall back to in-memory storage below.\n }\n }\n\n this.memoryCounters.set(key, entry);\n }\n\n private log(action: string, payload?: unknown): void {\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(`${MOCK_PREFIX} ${action}`, payload ?? '');\n }\n\n private announce(): void {\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(\n `${MOCK_PREFIX} Standalone mock mode is active. The SDK is simulating the ` +\n 'LearnCard host locally. When embedded in a real host, these calls run ' +\n 'against it unchanged.'\n );\n }\n\n private showClaimToast(credentialName: string): void {\n this.toast({\n icon: '✅',\n ttl: 5200,\n segments: ['In LearnCard, the user would receive ', { b: credentialName }, ' here.'],\n });\n }\n\n private showConsentBanner(redirectIgnored = false): void {\n this.toast({\n icon: '🔓',\n tone: 'positive',\n segments: redirectIgnored\n ? ['Consent auto-granted. Redirect ignored in mock.']\n : ['The user would review and grant consent. Auto-granted in mock.'],\n });\n\n if (redirectIgnored) {\n this.note(\n \"requestConsent: 'redirect' is ignored in mock mode — the real host would \" +\n \"navigate to the contract's redirectUrl with the VP in the URL.\"\n );\n }\n }\n\n private note(message: string): void {\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(`${MOCK_PREFIX} ${message}`);\n }\n\n /**\n * Show a branded toast describing what the real host would do. Identical\n * messages coalesce into one toast with a ×N counter so repeated or polled\n * calls never spam the screen.\n */\n private toast(spec: ToastSpec): void {\n if (!this.options.ui || !hasDocument()) return;\n\n const tone = spec.tone ?? 'default';\n const ttl = spec.ttl ?? 4200;\n const text = spec.segments.map(s => (typeof s === 'string' ? s : s.b)).join('');\n const key = `${tone}|${spec.icon}|${text}`;\n\n const existing = this.activeToasts.get(key);\n if (existing) {\n existing.count += 1;\n existing.countEl.textContent = `×${existing.count}`;\n existing.countEl.style.display = '';\n clearTimeout(existing.timeoutId);\n existing.timeoutId = setTimeout(() => this.dismissToast(key), ttl);\n return;\n }\n\n const stack = this.ensureStack();\n if (!stack) return;\n this.ensureStyles();\n\n const toast = document.createElement('div');\n toast.className = `lc-mock-toast lc-mock-toast--${tone}`;\n\n const badge = document.createElement('div');\n badge.className = 'lc-mock-badge';\n const name = document.createElement('span');\n name.className = 'lc-mock-badge-name';\n name.textContent = `${spec.icon} LearnCard`;\n const pill = document.createElement('span');\n pill.className = 'lc-mock-pill';\n pill.textContent = 'MOCK';\n badge.append(name, pill);\n\n const body = document.createElement('div');\n body.className = 'lc-mock-body';\n for (const seg of spec.segments) {\n if (typeof seg === 'string') {\n body.append(seg);\n } else {\n const strong = document.createElement('strong');\n strong.textContent = seg.b;\n body.appendChild(strong);\n }\n }\n\n const countEl = document.createElement('span');\n countEl.className = 'lc-mock-count';\n countEl.style.display = 'none';\n body.appendChild(countEl);\n\n toast.append(badge, body);\n stack.appendChild(toast);\n this.domNodes.add(toast);\n\n const timeoutId = setTimeout(() => this.dismissToast(key), ttl);\n this.activeToasts.set(key, { node: toast, timeoutId, count: 1, countEl });\n }\n\n private dismissToast(key: string): void {\n const entry = this.activeToasts.get(key);\n if (!entry) return;\n\n this.activeToasts.delete(key);\n clearTimeout(entry.timeoutId);\n\n const { node } = entry;\n node.classList.add('lc-mock-out');\n const exitTimer = setTimeout(() => {\n this.exitTimers.delete(exitTimer);\n node.remove();\n this.domNodes.delete(node);\n }, 200);\n this.exitTimers.add(exitTimer);\n }\n\n private ensureStack(): HTMLElement | null {\n if (!document.body) return null;\n if (this.stackEl && document.body.contains(this.stackEl)) return this.stackEl;\n\n const stack = document.createElement('div');\n stack.className = 'lc-mock-stack';\n document.body.appendChild(stack);\n this.stackEl = stack;\n return stack;\n }\n\n private ensureStyles(): void {\n if (!this.options.ui || !hasDocument() || this.styleEl || !document.head) return;\n\n const style = document.createElement('style');\n style.textContent = `\n@keyframes lc-mock-in { from { opacity: 0; transform: translateY(10px) scale(0.98); } to { opacity: 1; transform: none; } }\n@keyframes lc-mock-out { to { opacity: 0; transform: translateY(6px); } }\n.lc-mock-stack {\n position: fixed; bottom: 20px; right: 20px; z-index: 2147483647;\n display: flex; flex-direction: column; gap: 10px; align-items: flex-end;\n pointer-events: none; max-width: min(360px, calc(100vw - 40px));\n}\n.lc-mock-toast {\n pointer-events: auto; width: 100%; box-sizing: border-box; padding: 11px 14px; border-radius: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 13.5px;\n line-height: 1.45; box-shadow: 0 10px 30px rgba(24,34,78,0.22); animation: lc-mock-in 180ms cubic-bezier(0.2,0.8,0.2,1);\n}\n.lc-mock-toast.lc-mock-out { animation: lc-mock-out 180ms ease-in forwards; }\n.lc-mock-toast--default { background: #18224E; color: #fff; }\n.lc-mock-toast--positive { background: #ECFDF5; color: #065F46; border: 1px solid #A7F3D0; }\n.lc-mock-badge {\n display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 5px;\n font-size: 11px; letter-spacing: 0.02em; text-transform: uppercase; opacity: 0.72;\n}\n.lc-mock-badge-name { font-weight: 600; }\n.lc-mock-pill { font-size: 10px; font-weight: 700; padding: 2px 6px; border-radius: 999px; background: rgba(255,255,255,0.16); }\n.lc-mock-toast--positive .lc-mock-pill { background: rgba(6,95,70,0.12); }\n.lc-mock-body strong { font-weight: 700; }\n.lc-mock-count { margin-left: 6px; font-weight: 700; opacity: 0.75; }\n`.trim();\n\n document.head.appendChild(style);\n this.styleEl = style;\n }\n}\n","/**\n * LearnCard Partner Connect SDK\n *\n * A Promise-based JavaScript utility for managing cross-origin message communication\n * between partner apps and the LearnCard host application.\n *\n * @example\n * ```typescript\n * import { createPartnerConnect } from '@learncard/partner-connect';\n *\n * const learnCard = createPartnerConnect({\n * hostOrigin: 'https://learncard.app'\n * });\n *\n * // Request user identity (SSO)\n * const identity = await learnCard.requestIdentity();\n * console.log('User DID:', identity.user.did);\n * ```\n */\n\nimport { PartnerConnectError } from './types';\nimport { MockHost } from './mock-host';\nimport type {\n PartnerConnectOptions,\n IdentityResponse,\n SendCredentialResponse,\n TemplateCredentialInput,\n TemplateCredentialResponse,\n VerifiablePresentationRequest,\n CredentialSearchResponse,\n CredentialSpecificResponse,\n ConsentResponse,\n RequestConsentOptions,\n TemplateIssueResponse,\n CheckCredentialInput,\n CheckCredentialResponse,\n CheckIssuanceStatusInput,\n TemplateIssuanceStatusResponse,\n GetTemplateRecipientsInput,\n TemplateRecipientsResponse,\n RequestLearnerContextOptions,\n LearnerContextResponse,\n SyncStatus,\n SendAiSessionCredentialInput,\n SendAiSessionCredentialResponse,\n AppNotificationInput,\n AppNotificationResponse,\n IncrementCounterResponse,\n GetCounterResponse,\n GetCountersResponse,\n AppEvent,\n AppEventResponse,\n LearnCardError,\n PostMessageRequest,\n PostMessageResponse,\n PendingRequest,\n} from './types';\n\n// Re-export the class as a value plus all type exports.\n// `MockHost` is an internal implementation detail (constructed via\n// `createPartnerConnect({ mock, mockOptions })`); only its options type is public.\nexport { PartnerConnectError } from './types';\nexport type * from './types';\n\n/** Maximum time to poll for sync completion before giving up (10 minutes) */\nconst SYNC_STATUS_POLL_MAX_DURATION_MS = 10 * 60 * 1000;\n\n/** Default wait for the host presence probe (see `hostProbeTimeout`). */\nconst DEFAULT_HOST_PROBE_TIMEOUT_MS = 1500;\n\n/**\n * Whether a hostname is a local development host. `mock: 'auto'` only ever\n * activates on these, so a standalone page on a production or preview origin\n * never silently fabricates identity, consent, or credentials.\n */\nconst isLocalDevHost = (hostname: string): boolean =>\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === '[::1]' ||\n hostname === '::1' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.local');\n\n/**\n * Who is on the other side of our iframe boundary, as far as we can tell:\n * - 'learncard': ancestor origin matches a configured host pattern — real host.\n * - 'foreign': ancestor origin is known and matches nothing — an unrelated\n * wrapper (Storybook manager on another origin, preview shells, …). No\n * LearnCard host will ever answer.\n * - 'ambiguous': not embedded-verifiable — the ancestor origin is unavailable\n * (Firefox) or only matches the native-app localhost heuristic, which any\n * local wrapper (e.g. Storybook on localhost:6006) also matches.\n */\ntype ParentKind = 'learncard' | 'foreign' | 'ambiguous';\n\n/**\n * Detect whether the current page is running inside an embedded iframe.\n *\n * Returns `true` when the SDK is embedded (e.g. inside the LearnCard host) and\n * `false` when running as a standalone top-level page. Safe to call in any\n * environment: returns `false` during server-side rendering (no `window`).\n *\n * Partner apps can use this to change behavior without writing their own frame\n * detection — for example, showing a \"Open in LearnCard\" prompt when standalone.\n *\n * @example\n * ```typescript\n * import { isEmbedded } from '@learncard/partner-connect';\n *\n * if (isEmbedded()) {\n * // Running inside LearnCard — use the SDK against the real host.\n * } else {\n * // Standalone — show a preview banner, or rely on automatic mock mode.\n * }\n * ```\n */\nexport function isEmbedded(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // A cross-origin parent still lets us compare WindowProxy references;\n // when access is blocked entirely the throw means we ARE embedded.\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * LearnCard Partner Connect SDK class\n */\nexport class PartnerConnect {\n /** Default host origin (security anchor) */\n public static readonly DEFAULT_HOST_ORIGIN = 'https://learncard.app';\n\n /**\n * Built-in list of LearnCard-managed tenant origins.\n *\n * These are merged with the partner app's configured `hostOrigin` whitelist\n * unless `disableDefaultTenants: true` is passed. This lets a partner app\n * run inside any current or future LearnCard tenant (staging, preview,\n * VetPass, etc.) without needing a re-deploy each time a new tenant is\n * onboarded.\n *\n * Patterns follow the same rules as user-supplied `hostOrigin` entries:\n * `*` is a wildcard for one or more DNS labels in the host portion.\n */\n public static readonly DEFAULT_TRUSTED_TENANTS: readonly string[] = [\n 'https://learncard.app',\n 'https://*.learncard.app',\n 'https://*.learncard.ai',\n 'https://vetpass.app',\n 'https://*.vetpass.app',\n ];\n\n private hostOrigins: string[] = ['https://learncard.app'];\n private activeHostOrigin: string = 'https://learncard.app';\n private allowNativeAppOrigins: boolean = true;\n private protocol: string = 'LEARNCARD_V1';\n private requestTimeout: number = 30000;\n private pendingRequests: Map<string, PendingRequest>;\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private isInitialized = false;\n private syncCompleteCallbacks: Set<(status: SyncStatus) => void> = new Set();\n private syncStatusPollId: ReturnType<typeof setInterval> | null = null;\n private mockHost: MockHost | null = null;\n private embedded = false;\n private warnedNoHost = false;\n private hostProbeTimeout: number = DEFAULT_HOST_PROBE_TIMEOUT_MS;\n /** Whether a real LearnCard host is believed to be listening. */\n private hostReachable = false;\n /** Pending probe decision; requests queue behind it when set. */\n private activation: Promise<void> | null = null;\n\n constructor(options?: PartnerConnectOptions) {\n // Normalize hostOrigin to an array for whitelist validation\n const hostOrigin = options?.hostOrigin ?? PartnerConnect.DEFAULT_HOST_ORIGIN;\n const configured = Array.isArray(hostOrigin) ? hostOrigin : [hostOrigin];\n\n // Merge with the built-in tenant list unless the caller explicitly\n // opted out. De-duplicate while preserving order so the caller's\n // first entry remains the default active origin.\n const disableDefaults = options?.disableDefaultTenants === true;\n const merged = disableDefaults\n ? [...configured]\n : [...configured, ...PartnerConnect.DEFAULT_TRUSTED_TENANTS];\n this.hostOrigins = Array.from(new Set(merged));\n\n this.protocol = options?.protocol || 'LEARNCARD_V1';\n this.requestTimeout = options?.requestTimeout || 30000;\n this.allowNativeAppOrigins = options?.allowNativeAppOrigins ?? true;\n this.hostProbeTimeout = options?.hostProbeTimeout ?? DEFAULT_HOST_PROBE_TIMEOUT_MS;\n this.pendingRequests = new Map();\n this.configureActiveOrigin();\n this.setupMessageListener();\n this.embedded = isEmbedded();\n\n this.configureMockActivation(options);\n }\n\n /**\n * Decide whether this instance talks to a real host, simulates one, or\n * fails fast — the resolution of the `mock` option against the runtime\n * embed context. See the `mock` option docs for the contract.\n */\n private configureMockActivation(options?: PartnerConnectOptions): void {\n const mockSetting = options?.mock ?? 'auto';\n\n if (mockSetting === true) {\n this.mockHost = new MockHost(options?.mockOptions);\n return;\n }\n\n // Whether this origin may fall back to mocking when no host answers:\n // 'standalone' anywhere, 'auto' only on local dev hosts (a standalone\n // production page must never fabricate identity or consent), false\n // nowhere.\n const canAutoMock =\n mockSetting === 'standalone' || (mockSetting === 'auto' && this.isLocalDevContext());\n\n if (!this.embedded) {\n // Standalone page: no host can answer. hostReachable stays false,\n // so un-mocked calls fail fast with LC_NOT_EMBEDDED.\n if (canAutoMock) {\n this.mockHost = new MockHost(options?.mockOptions);\n }\n return;\n }\n\n switch (this.classifyParent()) {\n case 'learncard':\n this.hostReachable = true;\n return;\n\n case 'foreign':\n // Known non-LearnCard wrapper (e.g. cross-origin Storybook):\n // never postMessage into the 30s timeout. Mock where allowed,\n // fail fast everywhere else.\n if (canAutoMock) {\n this.mockHost = new MockHost(options?.mockOptions);\n }\n return;\n\n case 'ambiguous':\n if (canAutoMock) {\n // Could be a real (local/native) LearnCard host or an\n // unrelated wrapper. Ask: if the host answers a cheap\n // side-effect-free probe, stay real; otherwise mock.\n this.hostReachable = true;\n this.activation = this.probeHost(options);\n } else {\n // Mocking is off the table here anyway — preserve the\n // long-standing assumption that an unverifiable parent\n // is the real host.\n this.hostReachable = true;\n }\n return;\n }\n }\n\n private isLocalDevContext(): boolean {\n if (typeof window === 'undefined') return false;\n return isLocalDevHost(window.location.hostname);\n }\n\n private classifyParent(): ParentKind {\n const ancestorOrigin = this.readAncestorOrigin();\n\n if (!ancestorOrigin) return 'ambiguous';\n\n // Trust requires an explicit configured pattern match. The native-app\n // heuristic (any localhost origin) is NOT enough to call the parent\n // LearnCard — Storybook's manager frame matches it too.\n if (this.matchesConfiguredOrigin(ancestorOrigin)) return 'learncard';\n if (this.allowNativeAppOrigins && this.isOriginNativeApp(ancestorOrigin)) {\n return 'ambiguous';\n }\n\n return 'foreign';\n }\n\n private matchesConfiguredOrigin(origin: string): boolean {\n return this.hostOrigins.some(entry => PartnerConnect.matchesOriginPattern(origin, entry));\n }\n\n /**\n * One-time host presence probe for the ambiguous-parent case. Sends a\n * side-effect-free `GET_SYNC_STATUS`; an answer proves a live LearnCard\n * host (responses are origin-checked), a timeout means nobody is\n * listening and the mock takes over. Requests issued while the probe is\n * in flight queue behind the decision instead of racing it.\n */\n private probeHost(options?: PartnerConnectOptions): Promise<void> {\n return this.postToHost('GET_SYNC_STATUS', undefined, this.hostProbeTimeout)\n .then(() => {\n this.activation = null;\n })\n .catch(() => {\n this.activation = null;\n if (this.isInitialized) {\n this.hostReachable = false;\n this.mockHost = new MockHost(options?.mockOptions);\n console.warn(\n '[LearnCard SDK] Embedded in a frame, but no LearnCard host answered ' +\n `within ${this.hostProbeTimeout}ms — activating standalone mock mode. ` +\n 'If a real local host was just slow to boot, raise `hostProbeTimeout`.'\n );\n }\n });\n }\n\n /**\n * Whether this SDK instance is running inside an embedded iframe.\n * Instance-level convenience wrapper around the standalone {@link isEmbedded}.\n */\n public isEmbedded(): boolean {\n return isEmbedded();\n }\n\n /**\n * Whether the current page is running inside an embedded iframe.\n * Static convenience wrapper around the standalone {@link isEmbedded}.\n */\n public static isEmbedded(): boolean {\n return isEmbedded();\n }\n\n /**\n * Whether this instance is currently simulating the LearnCard host locally\n * instead of talking to a real host over `postMessage`.\n */\n public isMocked(): boolean {\n return this.mockHost !== null;\n }\n\n /**\n * Configure the active host origin using the following hierarchy:\n * 1. `window.location.ancestorOrigins[0]` (when supported) — the browser's\n * view of who our parent frame is. Cannot be forged by a malicious\n * `lc_host_override` query param and therefore takes precedence.\n * 2. `?lc_host_override=<origin>` query param (for staging / cross-tenant).\n * 3. `sessionStorage` value saved from a previously-validated override.\n * 4. First configured origin.\n * 5. `DEFAULT_HOST_ORIGIN`.\n *\n * When a valid override is found in the query parameter, it is persisted\n * to sessionStorage so subsequent in-iframe navigations in the same tab\n * continue to use the same active origin.\n */\n private static readonly SESSION_STORAGE_KEY = 'lc_host_override';\n\n /**\n * Read `window.location.ancestorOrigins[0]` without throwing if the\n * property is unavailable (Firefox) or the list is empty (top-level\n * context, e.g. running outside of an iframe).\n */\n private readAncestorOrigin(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const ancestors = window.location.ancestorOrigins;\n\n if (ancestors && ancestors.length > 0) {\n const parent = ancestors[0];\n\n if (typeof parent === 'string' && parent.length > 0) {\n return parent;\n }\n }\n } catch {\n // `ancestorOrigins` is a WebKit/Blink extension; accessing it\n // under unusual conditions can throw. Treat as unavailable.\n }\n\n return null;\n }\n\n private configureActiveOrigin(): void {\n if (typeof window === 'undefined') {\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n return;\n }\n\n try {\n const ancestorOrigin = this.readAncestorOrigin();\n const urlParams = new URLSearchParams(window.location.search);\n const hostOverride = urlParams.get('lc_host_override');\n\n // Priority 1: the real parent origin as reported by the browser.\n // This is unspoofable by query-param manipulation, so if it is\n // trusted we use it and ignore any override. If both are present\n // and disagree, we log and prefer the ancestor.\n if (ancestorOrigin && this.isOriginInWhitelist(ancestorOrigin)) {\n if (hostOverride && hostOverride !== ancestorOrigin) {\n console.warn(\n '[LearnCard SDK] lc_host_override does not match the real parent origin; preferring parent.',\n { override: hostOverride, parent: ancestorOrigin }\n );\n }\n\n this.activeHostOrigin = ancestorOrigin;\n this.persistOverride(ancestorOrigin);\n console.log('[LearnCard SDK] Using parent origin:', ancestorOrigin);\n return;\n }\n\n // Priority 2: lc_host_override query parameter.\n if (hostOverride) {\n if (this.isOriginInWhitelist(hostOverride)) {\n this.activeHostOrigin = hostOverride;\n this.persistOverride(hostOverride);\n console.log('[LearnCard SDK] Using lc_host_override:', hostOverride);\n return;\n }\n\n console.warn(\n '[LearnCard SDK] lc_host_override value is not in the configured whitelist:',\n hostOverride,\n 'Allowed:',\n this.hostOrigins\n );\n }\n\n // Priority 3: a previously-validated override from this tab session.\n let storedOverride: string | null = null;\n\n try {\n storedOverride = sessionStorage.getItem(PartnerConnect.SESSION_STORAGE_KEY);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n }\n\n if (storedOverride && this.isOriginInWhitelist(storedOverride)) {\n this.activeHostOrigin = storedOverride;\n console.log('[LearnCard SDK] Using stored lc_host_override:', storedOverride);\n return;\n }\n\n // Priority 4/5: fall back to the first configured origin or default.\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n console.log('[LearnCard SDK] Using configured origin:', this.activeHostOrigin);\n } catch (error) {\n console.error('[LearnCard SDK] Error configuring active origin:', error);\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n }\n }\n\n private persistOverride(origin: string): void {\n try {\n sessionStorage.setItem(PartnerConnect.SESSION_STORAGE_KEY, origin);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n }\n }\n\n private isOriginNativeApp(origin: string): boolean {\n return (\n origin.startsWith('capacitor://') ||\n origin.startsWith('ionic://') ||\n origin.startsWith('https://localhost') ||\n origin.startsWith('http://localhost') ||\n origin.startsWith('http://127.0.0.1')\n );\n }\n\n /**\n * Internal placeholder substituted in for `*` so that `new URL(...)` can\n * parse a wildcard pattern. Chosen to be a syntactically-valid DNS label\n * that cannot collide with a real hostname.\n */\n private static readonly WILDCARD_PLACEHOLDER = '__lc_wildcard__';\n\n /** `*` (any number of occurrences) for replacement in the pattern. */\n private static readonly WILDCARD_REGEX = /\\*/g;\n\n /** The required leading-label form a wildcard pattern must take. */\n private static readonly WILDCARD_LEADING_PREFIX = `${PartnerConnect.WILDCARD_PLACEHOLDER}.`;\n\n /**\n * Check whether a candidate origin matches a configured whitelist entry.\n *\n * Supports exact matches and wildcard patterns. A wildcard entry has the\n * form `<protocol>://*.<domain>` and matches any origin with the same\n * protocol, same port, and a host ending in `.<domain>` with at least\n * one non-empty DNS label in place of the `*`.\n *\n * Examples with pattern `https://*.learncard.app`:\n * - `https://staging.learncard.app` → match\n * - `https://pr-1.preview.learncard.app` → match\n * - `https://learncard.app` → no match (no subdomain)\n * - `http://staging.learncard.app` → no match (protocol mismatch)\n * - `https://learncard.app.attacker.com` → no match (suffix mismatch)\n *\n * Exposed as a public static so it can be unit-tested directly without\n * standing up a full SDK instance.\n */\n public static matchesOriginPattern(candidate: string, pattern: string): boolean {\n if (candidate === pattern) return true;\n if (!pattern.includes('*')) return false;\n\n let patternUrl: URL;\n let candidateUrl: URL;\n\n try {\n // Replace the wildcard labels with a syntactically-valid host so\n // URL() can parse it; we validate the real shape ourselves below.\n patternUrl = new URL(\n pattern.replace(PartnerConnect.WILDCARD_REGEX, PartnerConnect.WILDCARD_PLACEHOLDER)\n );\n candidateUrl = new URL(candidate);\n } catch {\n return false;\n }\n\n // Protocol, port, and (empty) path-origin must match exactly.\n if (patternUrl.protocol !== candidateUrl.protocol) return false;\n if (patternUrl.port !== candidateUrl.port) return false;\n\n const patternHost = patternUrl.hostname;\n const candidateHost = candidateUrl.hostname;\n\n // Only allow wildcards as leading label(s): `*.foo.bar`, not `a*.b` or\n // `foo.*.bar`. This keeps the matching rule predictable and safe.\n if (!patternHost.startsWith(PartnerConnect.WILDCARD_LEADING_PREFIX)) return false;\n\n const patternSuffix = patternHost.slice(PartnerConnect.WILDCARD_LEADING_PREFIX.length);\n\n if (patternSuffix.length === 0) return false;\n // No further wildcards anywhere else in the pattern.\n if (patternSuffix.includes(PartnerConnect.WILDCARD_PLACEHOLDER)) return false;\n\n // Candidate must end with `.<suffix>` and have at least one label\n // before the suffix (the portion that the `*` stands in for).\n const required = '.' + patternSuffix;\n\n if (!candidateHost.endsWith(required)) return false;\n\n const prefix = candidateHost.slice(0, candidateHost.length - required.length);\n\n if (prefix.length === 0) return false;\n // Labels in the prefix must themselves be non-empty (no `..`).\n if (prefix.startsWith('.') || prefix.endsWith('.')) return false;\n if (prefix.split('.').some(label => label.length === 0)) return false;\n\n return true;\n }\n\n /**\n * Check if an origin is in the effective whitelist (exact origins +\n * wildcard patterns + optional native-app origins).\n */\n private isOriginInWhitelist(origin: string): boolean {\n if (!origin) return false;\n\n for (const entry of this.hostOrigins) {\n if (PartnerConnect.matchesOriginPattern(origin, entry)) return true;\n }\n\n if (this.allowNativeAppOrigins && this.isOriginNativeApp(origin)) return true;\n\n return false;\n }\n\n /**\n * Check if an event origin is valid against the active host origin\n *\n * Security Rule: Incoming messages must exactly match the active host origin.\n * This prevents malicious actors from spoofing origins via query parameters.\n *\n * @param eventOrigin - The origin from the MessageEvent\n * @returns true if the origin is valid\n */\n private isValidOrigin(eventOrigin: string): boolean {\n // STRICT: Exact match with active host origin only\n return eventOrigin === this.activeHostOrigin;\n }\n\n /**\n * Set up the central message listener to handle responses from the LearnCard host\n */\n private setupMessageListener(): void {\n if (typeof window === 'undefined') {\n throw new Error('PartnerConnect SDK can only be used in a browser environment');\n }\n\n this.messageListener = (event: MessageEvent) => {\n // SECURITY CHECK 1: Strict origin validation - must exactly match active host origin\n if (!this.isValidOrigin(event.origin)) {\n // Silently ignore messages from unauthorized origins\n return;\n }\n\n const data = event.data as PostMessageResponse;\n\n // SECURITY CHECK 2: Validate protocol and requestId\n if (data.protocol !== this.protocol || !data.requestId) {\n return;\n }\n\n // Only responses may settle a pending request. Without this, an\n // echoed/looped-back copy of our own outbound request (same\n // requestId, no type) would evict the entry and leave the caller\n // hanging with its timeout already cleared.\n if (data.type !== 'SUCCESS' && data.type !== 'ERROR') {\n return;\n }\n\n // Look up the pending request\n const pending = this.pendingRequests.get(data.requestId);\n if (!pending) {\n return; // Ignore stale or unrecognized responses\n }\n\n // Clean up\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(data.requestId);\n\n // Resolve or reject the promise\n if (data.type === 'SUCCESS') {\n pending.resolve(data.data);\n } else if (data.type === 'ERROR') {\n pending.reject(\n PartnerConnectError.from(\n data.error || {\n code: 'UNKNOWN_ERROR',\n message: 'An unknown error occurred',\n }\n )\n );\n }\n };\n\n window.addEventListener('message', this.messageListener);\n this.isInitialized = true;\n }\n\n /**\n * Generate a unique request ID\n */\n private generateRequestId(action: string): string {\n return `${action}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Send a message to the parent window and return a Promise. While a host\n * presence probe is pending, requests queue behind its decision so they\n * are answered by whichever side (real host or mock) actually exists.\n */\n private sendMessage<T = unknown>(action: string, payload?: unknown): Promise<T> {\n if (this.activation) {\n return this.activation.then(() => this.dispatchMessage<T>(action, payload));\n }\n\n return this.dispatchMessage<T>(action, payload);\n }\n\n private dispatchMessage<T = unknown>(action: string, payload?: unknown): Promise<T> {\n if (!this.isInitialized) {\n return Promise.reject(\n new PartnerConnectError('SDK_NOT_INITIALIZED', 'SDK is not initialized')\n );\n }\n\n if (this.mockHost) {\n return this.mockHost\n .handle(action, payload)\n .then(data => data as T)\n .catch(error => {\n throw PartnerConnectError.from(error);\n });\n }\n\n // No reachable host and not mocking (standalone page, or embedded in\n // a non-LearnCard wrapper): no host will ever answer this message, so\n // fail immediately with an actionable error instead of hanging until\n // the request timeout fires.\n if (!this.hostReachable) {\n if (!this.warnedNoHost) {\n this.warnedNoHost = true;\n console.error(\n '[LearnCard SDK] No LearnCard host is present (the app is standalone or ' +\n 'inside a non-LearnCard frame), so SDK calls cannot complete. Embed ' +\n 'your app in LearnCard, or pass `mock: true` to simulate the host ' +\n 'during standalone development. Use isEmbedded() to branch your UI ' +\n 'before calling.'\n );\n }\n\n return Promise.reject(\n new PartnerConnectError(\n 'LC_NOT_EMBEDDED',\n `Cannot ${action}: the app is not embedded in a LearnCard host.`\n )\n );\n }\n\n return this.postToHost<T>(action, payload, this.requestTimeout);\n }\n\n private postToHost<T = unknown>(action: string, payload: unknown, timeout: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const requestId = this.generateRequestId(action);\n\n const timeoutId = setTimeout(() => {\n if (this.pendingRequests.has(requestId)) {\n this.pendingRequests.delete(requestId);\n reject(\n new PartnerConnectError(\n 'LC_TIMEOUT',\n `Request ${action} timed out after ${timeout}ms`\n )\n );\n }\n }, timeout);\n\n // Store the pending request\n this.pendingRequests.set(requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeoutId,\n });\n\n // Construct the message\n const message: PostMessageRequest = {\n protocol: this.protocol,\n action,\n requestId,\n payload,\n };\n\n // Send to parent window with the active host origin (configured or overridden)\n window.parent.postMessage(message, this.activeHostOrigin);\n });\n }\n\n /**\n * Request user identity (Single Sign-On)\n *\n * @returns Promise resolving to user identity including DID and JWT token\n * @throws {LearnCardError} When user is not authenticated or request fails\n *\n * @example\n * ```typescript\n * const identity = await learnCard.requestIdentity();\n * console.log('User DID:', identity.user.did);\n * console.log('JWT Token:', identity.token);\n * ```\n */\n public requestIdentity(): Promise<IdentityResponse> {\n return this.sendMessage<IdentityResponse>('REQUEST_IDENTITY', {\n challenge: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n });\n }\n\n /**\n * Send a credential to the user's LearnCard wallet\n *\n * Supports two modes:\n * 1. **Raw credential**: Pass a full verifiable credential object\n * 2. **Template-based**: Pass `{ templateAlias, templateData }` to issue from a pre-configured boost template\n *\n * @param input - Either a verifiable credential or a template-based input\n * @returns Promise resolving to credential response\n *\n * @example Raw credential\n * ```typescript\n * const response = await learnCard.sendCredential({\n * '@context': ['https://www.w3.org/2018/credentials/v1'],\n * type: ['VerifiableCredential'],\n * credentialSubject: { id: 'did:example:123' }\n * });\n * console.log('Credential ID:', response.credentialId);\n * ```\n *\n * @example Template-based (for App Store apps)\n * ```typescript\n * const response = await learnCard.sendCredential({\n * templateAlias: 'achievement-badge',\n * templateData: { score: '95', courseName: 'Web Dev 101' }\n * });\n * console.log('Credential URI:', response.credentialUri);\n * ```\n */\n public sendCredential(\n input: unknown | TemplateCredentialInput\n ): Promise<SendCredentialResponse | TemplateCredentialResponse> {\n if (\n input &&\n typeof input === 'object' &&\n 'templateAlias' in input &&\n typeof (input as TemplateCredentialInput).templateAlias === 'string'\n ) {\n const templateInput = input as TemplateCredentialInput;\n\n return this.sendAppEvent<TemplateCredentialResponse>({\n type: 'send-credential',\n templateAlias: templateInput.templateAlias,\n templateData: templateInput.templateData,\n preventDuplicateClaim: templateInput.preventDuplicateClaim,\n });\n }\n\n return this.sendMessage<SendCredentialResponse>('SEND_CREDENTIAL', { credential: input });\n }\n\n /**\n * Check whether the current user already has a credential from a given boost template.\n * This is a silent, non-interactive status check for installed app integrations.\n */\n public checkUserHasCredential(input: CheckCredentialInput): Promise<CheckCredentialResponse> {\n return this.sendAppEvent<CheckCredentialResponse>({\n type: 'check-credential',\n ...input,\n });\n }\n\n /**\n * Check if the current user has issued/sent a specific template to someone.\n * Returns issuance status including sent date and claim status.\n *\n * @param input - Template identifier (templateAlias or boostUri) and recipient identifier (recipientDid or recipientProfileId)\n * @returns Promise resolving to issuance status response\n *\n * @example\n * ```typescript\n * // Check if user already issued 'achievement-badge' to a specific person\n * const status = await learnCard.getTemplateIssuanceStatus({\n * templateAlias: 'achievement-badge',\n * recipientProfileId: 'user123'\n * });\n *\n * if (status.sent) {\n * console.log('Already issued on:', status.sentDate);\n * console.log('Status:', status.status); // 'pending', 'claimed', or 'revoked'\n * }\n * ```\n */\n public getTemplateIssuanceStatus(\n input: CheckIssuanceStatusInput\n ): Promise<TemplateIssuanceStatusResponse> {\n return this.sendAppEvent<TemplateIssuanceStatusResponse>({\n type: 'check-issuance-status',\n ...input,\n });\n }\n\n /**\n * Get the list of all recipients for a specific template/boost.\n * Useful for dashboards showing who has received a credential.\n *\n * @param input - Template identifier (templateAlias or boostUri) and optional pagination params\n * @returns Promise resolving to paginated list of recipients\n *\n * @example\n * ```typescript\n * // Get first 10 recipients of 'achievement-badge'\n * const recipients = await learnCard.getTemplateRecipients({\n * templateAlias: 'achievement-badge',\n * limit: 10\n * });\n *\n * console.log(`Found ${recipients.records.length} recipients`);\n * recipients.records.forEach(r => {\n * console.log(`${r.recipientDisplayName}: ${r.status}`);\n * });\n *\n * // Get next page if available\n * if (recipients.hasMore) {\n * const nextPage = await learnCard.getTemplateRecipients({\n * templateAlias: 'achievement-badge',\n * limit: 10,\n * cursor: recipients.cursor\n * });\n * }\n * ```\n */\n public getTemplateRecipients(\n input: GetTemplateRecipientsInput\n ): Promise<TemplateRecipientsResponse> {\n return this.sendAppEvent<TemplateRecipientsResponse>({\n type: 'get-template-recipients',\n ...input,\n });\n }\n\n /**\n * Launch a feature in the LearnCard host application\n *\n * @param featurePath - Path to the feature (e.g., '/ai/topics')\n * @param initialPrompt - Optional initial prompt or data\n *\n * @example\n * ```typescript\n * await learnCard.launchFeature(\n * '/ai/topics?shortCircuitStep=newTopic',\n * 'Help me understand cryptography'\n * );\n * ```\n */\n public launchFeature(featurePath: string, initialPrompt?: string): Promise<void> {\n return this.sendMessage<void>('LAUNCH_FEATURE', { featurePath, initialPrompt });\n }\n\n /**\n * Request credentials from the user's wallet using a query\n *\n * @param verifiablePresentationRequest - VPR with query criteria\n * @returns Promise resolving to verifiable presentation\n *\n * @example\n * ```typescript\n * const response = await learnCard.askCredentialSearch({\n * query: [{\n * type: 'QueryByTitle',\n * credentialQuery: {\n * reason: 'We need to verify your skills',\n * title: 'JavaScript Expert'\n * }\n * }],\n * challenge: 'challenge-123',\n * domain: window.location.hostname\n * });\n *\n * if (response.verifiablePresentation) {\n * console.log('Received credentials:', response.verifiablePresentation.verifiableCredential);\n * }\n * ```\n */\n public askCredentialSearch(\n verifiablePresentationRequest: VerifiablePresentationRequest\n ): Promise<CredentialSearchResponse> {\n return this.sendMessage<CredentialSearchResponse>('ASK_CREDENTIAL_SEARCH', {\n verifiablePresentationRequest,\n });\n }\n\n /**\n * Request a specific credential by ID\n *\n * @param credentialId - The ID of the credential to request\n * @returns Promise resolving to the credential\n *\n * @example\n * ```typescript\n * const response = await learnCard.askCredentialSpecific('credential-id-123');\n * if (response.credential) {\n * console.log('Received credential:', response.credential);\n * }\n * ```\n */\n public askCredentialSpecific(credentialId: string): Promise<CredentialSpecificResponse> {\n return this.sendMessage<CredentialSpecificResponse>('ASK_CREDENTIAL_SPECIFIC', {\n credentialId,\n });\n }\n\n /**\n * Request user consent for permissions\n *\n * @param contractUri - URI of the consent contract (optional for App Store apps with configured contracts)\n * @param options - Additional options including redirect behavior\n * @returns Promise resolving to consent response\n *\n * @example\n * ```typescript\n * // With explicit contract URI (for external/non-app store integrations)\n * const response = await learnCard.requestConsent('lc:network:network.learncard.com/trpc:contract:abc123');\n * if (response.granted) {\n * console.log('User granted consent');\n * }\n *\n * // Without contract URI (uses app's configured contract from integration)\n * // This works for App Store apps that have configured a contract in their integration\n * const response = await learnCard.requestConsent();\n * if (response.granted) {\n * console.log('User granted consent using listing contract');\n * }\n *\n * // With redirect - redirects to contract's redirectUrl with VP in URL params\n * const response = await learnCard.requestConsent(undefined, { redirect: true });\n * ```\n */\n public requestConsent(\n contractUri?: string,\n options: RequestConsentOptions = {}\n ): Promise<ConsentResponse> {\n const { redirect = false } = options;\n\n return this.sendMessage<ConsentResponse>('REQUEST_CONSENT', {\n contractUri,\n redirect,\n });\n }\n\n /**\n * Initiate a template-based credential issuance flow\n *\n * @param templateId - ID of the template/boost to issue\n * @param draftRecipients - Optional array of recipient DIDs\n * @returns Promise resolving to template issue response\n *\n * @example\n * ```typescript\n * const response = await learnCard.initiateTemplateIssue(\n * 'lc:network:network.learncard.com/trpc:boost:xyz789',\n * ['did:key:abc', 'did:key:def']\n * );\n *\n * if (response.issued) {\n * console.log('Template issued successfully');\n * }\n * ```\n */\n public initiateTemplateIssue(\n templateId: string,\n draftRecipients?: string[]\n ): Promise<TemplateIssueResponse> {\n return this.sendMessage<TemplateIssueResponse>('INITIATE_TEMPLATE_ISSUE', {\n templateId,\n draftRecipients: draftRecipients || [],\n });\n }\n\n /**\n * Request comprehensive learner context for AI tutoring systems.\n *\n * This method retrieves the user's credentials and personal data,\n * then formats them into an LLM-ready prompt that can be injected directly into\n * an AI system prompt.\n *\n * @param options - Configuration options for what data to include and how to format it\n * @returns Promise resolving to learner context with prompt and optional raw data\n *\n * @example\n * ```typescript\n * // Get LLM-ready prompt with credentials and personal data\n * const context = await learnCard.requestLearnerContext({\n * includeCredentials: true,\n * includePersonalData: true,\n * waitForSync: true,\n * format: 'prompt',\n * instructions: 'Focus on technical skills and certifications',\n * detailLevel: 'expanded'\n * });\n *\n * if (context.status === 'syncing') {\n * const unsubscribe = learnCard.onSyncComplete(async () => {\n * const readyContext = await learnCard.requestLearnerContext({ waitForSync: true });\n * unsubscribe();\n * });\n * }\n *\n * // Use in AI system prompt\n * const systemPrompt = `You are a helpful tutor. ${context.prompt}`;\n *\n * // Access structured data if needed\n * console.log('User DID:', context.did);\n * console.log('Credentials count:', context.raw?.credentials.length);\n * ```\n */\n public async requestLearnerContext(\n options?: RequestLearnerContextOptions\n ): Promise<LearnerContextResponse> {\n const startedAt = performance.now();\n const response = await this.sendMessage<LearnerContextResponse>('REQUEST_LEARNER_CONTEXT', {\n includeCredentials: options?.includeCredentials ?? true,\n includePersonalData: options?.includePersonalData ?? false,\n format: options?.format ?? 'prompt',\n instructions: options?.instructions,\n detailLevel: options?.detailLevel ?? 'compact',\n waitForSync: options?.waitForSync ?? false,\n });\n\n response.metadata ??= {};\n response.metadata.timings ??= { totalMs: 0 };\n response.metadata.timings.sdkRoundTripMs = performance.now() - startedAt;\n\n return response;\n }\n\n /**\n * Get the current LearnCard background data sync status.\n */\n public getSyncStatus(): Promise<SyncStatus> {\n return this.sendMessage<SyncStatus>('GET_SYNC_STATUS');\n }\n\n /**\n * Register a callback that fires when LearnCard reports background sync has reached a\n * terminal state ('ready' or 'error'). Check `status.status` to distinguish the two.\n * Polling stops once a terminal state is reached, all callbacks unsubscribe, or the\n * poll exceeds its maximum duration (reported to callbacks as an 'error' status).\n * Returns an unsubscribe function.\n */\n public onSyncComplete(callback: (status: SyncStatus) => void): () => void {\n this.syncCompleteCallbacks.add(callback);\n\n if (!this.syncStatusPollId) {\n const pollStartedAt = Date.now();\n\n const stopPolling = () => {\n if (this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n };\n\n this.syncStatusPollId = setInterval(() => {\n if (Date.now() - pollStartedAt > SYNC_STATUS_POLL_MAX_DURATION_MS) {\n stopPolling();\n const timeoutStatus: SyncStatus = {\n status: 'error',\n progress: {\n totalCredentials: 0,\n completedCredentials: 0,\n failedCredentials: 0,\n retryCount: 0,\n },\n lastError: 'Timed out waiting for sync to complete',\n };\n this.syncCompleteCallbacks.forEach(cb => cb(timeoutStatus));\n return;\n }\n\n this.getSyncStatus()\n .then(status => {\n if (status.status !== 'ready' && status.status !== 'error') return;\n\n stopPolling();\n this.syncCompleteCallbacks.forEach(cb => cb(status));\n })\n .catch(() => undefined);\n }, 1000);\n }\n\n return () => {\n this.syncCompleteCallbacks.delete(callback);\n if (this.syncCompleteCallbacks.size === 0 && this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n };\n }\n\n /**\n * Send a generic event to be processed by the brain service on behalf of this app.\n * This is used for backend-like operations such as issuing credentials.\n *\n * @param event - The event payload to send\n * @returns Promise resolving to the event response\n *\n * @example\n * ```typescript\n * // Issue a credential to the current user\n * const response = await learnCard.sendAppEvent({\n * type: 'send-credential',\n * templateAlias: 'achievement-badge',\n * templateData: { score: '95' }\n * });\n *\n * if (response.credentialUri) {\n * console.log('Credential issued:', response.credentialUri);\n * }\n * ```\n */\n public sendAppEvent<T = AppEventResponse>(event: AppEvent): Promise<T> {\n return this.sendMessage<T>('APP_EVENT', event);\n }\n\n /**\n * Create and send an AI Session credential to the user.\n *\n * This method manages the AI Topic → AI Session hierarchy:\n * - Ensures an AI Topic exists for this app (creates one if needed)\n * - Creates a new AI Session as a child of the topic\n * - The topic appears in the user's AI Sessions page with the app's name\n * - All sessions from this app are organized under that topic\n *\n * @param input - Session details including title and optional metadata\n * @returns Promise resolving to topic and session URIs\n */\n public sendAiSessionCredential(\n input: SendAiSessionCredentialInput\n ): Promise<SendAiSessionCredentialResponse> {\n return this.sendAppEvent<SendAiSessionCredentialResponse>({\n type: 'send-ai-session-credential',\n ...input,\n });\n }\n\n /**\n * Send a notification to the current user from this app.\n * The notification appears in the user's LearnCard notification inbox.\n */\n public sendNotification(input: AppNotificationInput): Promise<AppNotificationResponse> {\n return this.sendAppEvent<AppNotificationResponse>({\n type: 'send-notification',\n ...input,\n });\n }\n\n /**\n * Increment or decrement an app-scoped counter for the current user.\n */\n public incrementCounter(key: string, amount: number): Promise<IncrementCounterResponse> {\n return this.sendAppEvent<IncrementCounterResponse>({\n type: 'increment-counter',\n key,\n amount,\n });\n }\n\n /**\n * Read the current value of an app-scoped counter for the current user.\n */\n public getCounter(key: string): Promise<GetCounterResponse> {\n return this.sendAppEvent<GetCounterResponse>({\n type: 'get-counter',\n key,\n });\n }\n\n /**\n * Read multiple app-scoped counters at once for the current user.\n */\n public getCounters(keys?: string[]): Promise<GetCountersResponse> {\n return this.sendAppEvent<GetCountersResponse>({\n type: 'get-counters',\n ...(keys ? { keys } : {}),\n });\n }\n\n /**\n * Clean up the SDK and remove event listeners\n */\n public destroy(): void {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n // Reject all pending requests\n for (const [requestId, pending] of this.pendingRequests.entries()) {\n clearTimeout(pending.timeoutId);\n pending.reject(\n new PartnerConnectError(\n 'SDK_DESTROYED',\n 'SDK was destroyed before request completed'\n )\n );\n }\n\n this.pendingRequests.clear();\n\n if (this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n this.syncCompleteCallbacks.clear();\n\n if (this.mockHost) {\n this.mockHost.destroy();\n this.mockHost = null;\n }\n\n this.isInitialized = false;\n }\n}\n\n/**\n * Factory function to create a PartnerConnect instance\n *\n * @param options - Configuration options\n * @returns PartnerConnect instance\n *\n * @example\n * ```typescript\n * const learnCard = createPartnerConnect({\n * hostOrigin: 'https://learncard.app',\n * protocol: 'LEARNCARD_V1',\n * requestTimeout: 30000\n * });\n * ```\n */\nexport function createPartnerConnect(options?: PartnerConnectOptions): PartnerConnect {\n return new PartnerConnect(options);\n}\n\n// Default export for convenience\nexport default createPartnerConnect;\n"],"names":["__publicField","_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"partner-connect.esm.js","sources":["../../partner-connect-core/dist/partner-connect-core.esm.js","../src/types.ts","../src/mock-host.ts","../src/index.ts"],"sourcesContent":["const PREVIEW_HOST_SUFFIXES = [\n \".lovableproject.com\",\n // Lovable editor sandbox\n \".webcontainer-api.io\",\n // Bolt.new / StackBlitz WebContainers\n \".replit.dev\",\n // Replit development URLs (deployments use .replit.app)\n \".vusercontent.net\"\n // v0 generated previews (deployments use .vercel.app)\n];\nconst LOVABLE_PREVIEW_PREFIX = \"id-preview--\";\nconst LOVABLE_APP_SUFFIX = \".lovable.app\";\nconst EDITOR_HOSTS = [\n \"lovable.dev\",\n \"bolt.new\",\n \"stackblitz.com\",\n \"v0.dev\",\n \"v0.app\",\n \"replit.com\"\n];\nconst isAppBuilderPreviewHost = (hostname) => {\n const host = hostname.toLowerCase();\n if (host.startsWith(LOVABLE_PREVIEW_PREFIX) && host.endsWith(LOVABLE_APP_SUFFIX)) {\n return true;\n }\n return PREVIEW_HOST_SUFFIXES.some((suffix) => host.endsWith(suffix));\n};\nconst isAppBuilderEditorOrigin = (origin) => {\n try {\n const { protocol, hostname } = new URL(origin);\n if (protocol !== \"https:\") return false;\n const host = hostname.toLowerCase().replace(/^www\\./, \"\");\n return EDITOR_HOSTS.includes(host);\n } catch {\n return false;\n }\n};\n\nconst WALLET_CATEGORIES = [\n \"Achievement\",\n \"Skill\",\n \"ID\",\n \"Learning History\",\n \"Work History\",\n \"Social Badges\",\n \"Membership\",\n \"Accomplishment\",\n \"Experiences\",\n \"Accommodation\",\n \"Family\"\n];\nconst PERSONAL_FIELDS = [\n \"name\",\n \"email\",\n \"phone\",\n \"birthDate\",\n \"country\",\n \"avatar\"\n];\nconst RESERVED_TEMPLATE_VARIABLES = [\"issue_date\", \"issuer_did\", \"recipient_did\"];\nconst KNOWN_ACHIEVEMENT_TYPES = [\n \"Achievement\",\n \"Assessment\",\n \"Award\",\n \"Badge\",\n \"Certificate\",\n \"Certification\",\n \"CommunityService\",\n \"Competency\",\n \"Course\",\n \"Degree\",\n \"Diploma\",\n \"LearningProgram\",\n \"License\",\n \"Membership\",\n \"MicroCredential\",\n \"ProfessionalDevelopment\"\n];\nconst VC2_CONTEXT = \"https://www.w3.org/ns/credentials/v2\";\nconst OBV3_CONTEXT = \"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json\";\nconst TEMPLATE_VARIABLE_REGEX = /\\{\\{(\\w+)\\}\\}/g;\n\nconst VARIABLE_BRACES_REGEX = /\\{\\{([^{}]+)\\}\\}/g;\nconst BARE_VARIABLE_REGEX = /^\\{\\{(\\w+)\\}\\}$/;\nconst CUSTOM_ACHIEVEMENT_TYPE_REGEX = /^ext:[A-Za-z0-9]+$/;\nconst isPlainObject = (value) => {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n};\nconst isReservedTemplateVariable = (name) => {\n return RESERVED_TEMPLATE_VARIABLES.includes(name);\n};\nconst getBareVariableName = (value) => {\n if (typeof value !== \"string\") {\n return void 0;\n }\n const match = value.match(BARE_VARIABLE_REGEX);\n return match == null ? void 0 : match[1];\n};\nconst hasValidVariableInterpolation = (value) => {\n TEMPLATE_VARIABLE_REGEX.lastIndex = 0;\n return TEMPLATE_VARIABLE_REGEX.test(value);\n};\nconst isIsoDateString = (value) => {\n return !Number.isNaN(Date.parse(value));\n};\nconst deepClone = (value) => {\n if (Array.isArray(value)) {\n return value.map((item) => deepClone(item));\n }\n if (isPlainObject(value)) {\n const clone = {};\n Object.keys(value).forEach((key) => {\n clone[key] = deepClone(value[key]);\n });\n return clone;\n }\n return value;\n};\nconst normalizeForJson = (value) => {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeForJson(item));\n }\n if (isPlainObject(value)) {\n const normalized = {};\n Object.keys(value).sort((a, b) => a.localeCompare(b)).forEach((key) => {\n const child = normalizeForJson(value[key]);\n if (child !== void 0) {\n normalized[key] = child;\n }\n });\n return normalized;\n }\n return value;\n};\nconst stripEmpty = (value) => {\n if (Array.isArray(value)) {\n const items = value.map((item) => stripEmpty(item)).filter((item) => item !== void 0);\n return items.length > 0 ? items : void 0;\n }\n if (isPlainObject(value)) {\n const next = {};\n Object.keys(value).forEach((key) => {\n const child = stripEmpty(value[key]);\n if (child !== void 0) {\n next[key] = child;\n }\n });\n return Object.keys(next).length > 0 ? next : void 0;\n }\n return value === void 0 ? void 0 : value;\n};\nconst levenshteinDistance = (a, b) => {\n const rows = a.length + 1;\n const cols = b.length + 1;\n const dp = Array.from(\n { length: rows },\n () => Array.from({ length: cols }, () => 0)\n );\n for (let row = 0; row < rows; row += 1) {\n dp[row][0] = row;\n }\n for (let col = 0; col < cols; col += 1) {\n dp[0][col] = col;\n }\n for (let row = 1; row < rows; row += 1) {\n for (let col = 1; col < cols; col += 1) {\n const cost = a[row - 1] === b[col - 1] ? 0 : 1;\n dp[row][col] = Math.min(\n dp[row - 1][col] + 1,\n dp[row][col - 1] + 1,\n dp[row - 1][col - 1] + cost\n );\n }\n }\n return dp[a.length][b.length];\n};\nconst getDidYouMean = (input, options) => {\n if (options.length === 0) {\n return void 0;\n }\n const normalizedInput = input.toLowerCase();\n let bestOption;\n let bestScore = Number.POSITIVE_INFINITY;\n options.forEach((option) => {\n const normalizedOption = option.toLowerCase();\n if (normalizedOption.startsWith(normalizedInput) || normalizedInput.startsWith(normalizedOption) || normalizedOption.includes(normalizedInput)) {\n const prefixScore = 0;\n if (prefixScore < bestScore) {\n bestScore = prefixScore;\n bestOption = option;\n }\n return;\n }\n const score = levenshteinDistance(normalizedInput, normalizedOption);\n if (score < bestScore) {\n bestScore = score;\n bestOption = option;\n }\n });\n if (bestOption === void 0) {\n return void 0;\n }\n const threshold = Math.max(3, Math.floor(input.length / 2));\n return bestScore <= threshold ? bestOption : void 0;\n};\nconst validateAchievementType = (value) => {\n if (KNOWN_ACHIEVEMENT_TYPES.includes(value) || CUSTOM_ACHIEVEMENT_TYPE_REGEX.test(value)) {\n return void 0;\n }\n const suggestion = getDidYouMean(value, KNOWN_ACHIEVEMENT_TYPES);\n const suggestionText = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n return `template.achievementType \"${value}\" is not a known OBv3 achievementType${suggestionText} Custom types must use the \"ext:\" prefix`;\n};\nconst validateInterpolatedString = (value, path, errors) => {\n VARIABLE_BRACES_REGEX.lastIndex = 0;\n let match = VARIABLE_BRACES_REGEX.exec(value);\n while (match) {\n const variableName = match[1];\n if (!/^\\w+$/.test(variableName)) {\n errors.push({\n path,\n message: `${path} uses invalid variable {{${variableName}}}; variable names must match /^\\\\w+$/`\n });\n } else if (isReservedTemplateVariable(variableName)) {\n errors.push({\n path,\n message: `${path} uses reserved variable {{${variableName}}}; it is injected automatically by LearnCard`\n });\n }\n match = VARIABLE_BRACES_REGEX.exec(value);\n }\n};\nconst validateWalletCategory = (value) => {\n return typeof value === \"string\" && WALLET_CATEGORIES.includes(value);\n};\nconst validatePersonalField = (value) => {\n return typeof value === \"string\" && PERSONAL_FIELDS.includes(value);\n};\nconst sortUnique = (values) => {\n return Array.from(new Set(values)).sort((a, b) => a.localeCompare(b));\n};\n\nconst canonicalJsonString = (value) => {\n return JSON.stringify(normalizeForJson(value));\n};\n\nconst SIMPLE_TEMPLATE_KEYS = [\n \"name\",\n \"description\",\n \"image\",\n \"issuerName\",\n \"achievementType\",\n \"criteria\",\n \"alignments\",\n \"tags\",\n \"activity\",\n \"credits\",\n \"validUntil\",\n \"evidence\"\n];\nconst pushError = (errors, path, message) => {\n errors.push({ path, message });\n};\nconst validateHttpsOrVariableUrl = (value, path, errors) => {\n if (typeof value !== \"string\" || value.length === 0) {\n pushError(errors, path, `${path} must be a non-empty string`);\n return;\n }\n validateInterpolatedString(value, path, errors);\n if (!value.startsWith(\"https://\") && !hasValidVariableInterpolation(value)) {\n pushError(errors, path, `${path} must start with https:// or contain a {{variable}}`);\n }\n};\nconst validateTemplateDate = (value, path, errors) => {\n if (typeof value !== \"string\" || value.length === 0) {\n pushError(errors, path, `${path} must be an ISO-8601 date or a {{variable}} token`);\n return;\n }\n validateInterpolatedString(value, path, errors);\n if (getBareVariableName(value) !== void 0 || isIsoDateString(value)) {\n return;\n }\n pushError(errors, path, `${path} must be an ISO-8601 date or a {{variable}} token`);\n};\nconst validateTemplateNumber = (value, path, errors) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return;\n }\n if (typeof value === \"string\") {\n validateInterpolatedString(value, path, errors);\n if (getBareVariableName(value) !== void 0) {\n return;\n }\n }\n pushError(errors, path, `${path} must be a number or a {{variable}} token`);\n};\nconst validateStringArray = (value, path, errors) => {\n if (!Array.isArray(value)) {\n pushError(errors, path, `${path} must be an array of strings`);\n return false;\n }\n value.forEach((item, index) => {\n if (typeof item !== \"string\") {\n pushError(errors, `${path}[${index}]`, `${path}[${index}] must be a string`);\n return;\n }\n validateInterpolatedString(item, `${path}[${index}]`, errors);\n });\n return true;\n};\nconst validateWalletSkillTags = (value, path, errors) => {\n if (value === void 0) {\n return true;\n }\n if (!Array.isArray(value)) {\n pushError(errors, path, `${path} must be an array`);\n return false;\n }\n value.forEach((item, index) => {\n const itemPath = `${path}[${index}]`;\n if (!isPlainObject(item)) {\n pushError(errors, itemPath, `${itemPath} must be an object`);\n return;\n }\n if (typeof item.frameworkId !== \"string\" || item.frameworkId.length === 0) {\n pushError(\n errors,\n `${itemPath}.frameworkId`,\n `${itemPath}.frameworkId must be a non-empty string`\n );\n }\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushError(errors, `${itemPath}.id`, `${itemPath}.id must be a non-empty string`);\n }\n if (item.proficiencyLevel !== void 0 && typeof item.proficiencyLevel !== \"string\") {\n pushError(\n errors,\n `${itemPath}.proficiencyLevel`,\n `${itemPath}.proficiencyLevel must be a string`\n );\n }\n });\n return true;\n};\nconst validateAlignment = (value, path, errors) => {\n if (!isPlainObject(value)) {\n pushError(errors, path, `${path} must be an object`);\n return false;\n }\n if (typeof value.name !== \"string\" || value.name.trim().length === 0) {\n pushError(errors, `${path}.name`, `${path}.name is required`);\n } else {\n validateInterpolatedString(value.name, `${path}.name`, errors);\n }\n if (value.url === void 0) {\n pushError(errors, `${path}.url`, `${path}.url is required`);\n } else {\n validateHttpsOrVariableUrl(value.url, `${path}.url`, errors);\n }\n if (value.framework !== void 0) {\n if (typeof value.framework !== \"string\") {\n pushError(errors, `${path}.framework`, `${path}.framework must be a string`);\n } else {\n validateInterpolatedString(value.framework, `${path}.framework`, errors);\n }\n }\n if (value.code !== void 0) {\n if (typeof value.code !== \"string\") {\n pushError(errors, `${path}.code`, `${path}.code must be a string`);\n } else {\n validateInterpolatedString(value.code, `${path}.code`, errors);\n }\n }\n return true;\n};\nconst validateEvidence = (value, path, errors) => {\n if (!isPlainObject(value)) {\n pushError(errors, path, `${path} must be an object`);\n return false;\n }\n if (value.id !== void 0) {\n validateHttpsOrVariableUrl(value.id, `${path}.id`, errors);\n }\n if (value.name !== void 0) {\n if (typeof value.name !== \"string\") {\n pushError(errors, `${path}.name`, `${path}.name must be a string`);\n } else {\n validateInterpolatedString(value.name, `${path}.name`, errors);\n }\n }\n if (value.narrative !== void 0) {\n if (typeof value.narrative !== \"string\") {\n pushError(errors, `${path}.narrative`, `${path}.narrative must be a string`);\n } else {\n validateInterpolatedString(value.narrative, `${path}.narrative`, errors);\n }\n }\n return true;\n};\nconst validateRawCredentialVariables = (value, path, errors) => {\n if (typeof value === \"string\") {\n validateInterpolatedString(value, path, errors);\n return;\n }\n if (Array.isArray(value)) {\n value.forEach(\n (item, index) => validateRawCredentialVariables(item, `${path}[${index}]`, errors)\n );\n return;\n }\n if (isPlainObject(value)) {\n Object.keys(value).forEach((key) => {\n validateRawCredentialVariables(value[key], `${path}.${key}`, errors);\n });\n }\n};\nconst validateSimpleTemplate = (template, errors) => {\n if (typeof template.name !== \"string\" || template.name.trim().length === 0) {\n pushError(errors, \"template.name\", \"template.name is required\");\n } else {\n validateInterpolatedString(template.name, \"template.name\", errors);\n }\n if (template.description !== void 0) {\n if (typeof template.description !== \"string\") {\n pushError(errors, \"template.description\", \"template.description must be a string\");\n } else {\n validateInterpolatedString(template.description, \"template.description\", errors);\n }\n }\n if (template.image !== void 0) {\n validateHttpsOrVariableUrl(template.image, \"template.image\", errors);\n }\n if (template.issuerName !== void 0) {\n if (typeof template.issuerName !== \"string\") {\n pushError(errors, \"template.issuerName\", \"template.issuerName must be a string\");\n } else {\n validateInterpolatedString(template.issuerName, \"template.issuerName\", errors);\n }\n }\n if (template.achievementType !== void 0) {\n if (typeof template.achievementType !== \"string\") {\n pushError(\n errors,\n \"template.achievementType\",\n \"template.achievementType must be a string\"\n );\n } else {\n const message = validateAchievementType(template.achievementType);\n if (message !== void 0) {\n pushError(errors, \"template.achievementType\", message);\n }\n }\n }\n if (template.category !== void 0 && !validateWalletCategory(template.category)) {\n const suggestion = typeof template.category === \"string\" ? getDidYouMean(template.category, WALLET_CATEGORIES) : void 0;\n const suffix = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n pushError(\n errors,\n \"template.category\",\n `template.category must be one of ${WALLET_CATEGORIES.join(\", \")}${suffix}`\n );\n }\n if (template.criteria !== void 0) {\n if (!isPlainObject(template.criteria)) {\n pushError(errors, \"template.criteria\", \"template.criteria must be an object\");\n } else {\n if (template.criteria.narrative !== void 0) {\n if (typeof template.criteria.narrative !== \"string\") {\n pushError(\n errors,\n \"template.criteria.narrative\",\n \"template.criteria.narrative must be a string\"\n );\n } else {\n validateInterpolatedString(\n template.criteria.narrative,\n \"template.criteria.narrative\",\n errors\n );\n }\n }\n if (template.criteria.url !== void 0) {\n validateHttpsOrVariableUrl(template.criteria.url, \"template.criteria.url\", errors);\n }\n }\n }\n if (template.alignments !== void 0) {\n if (!Array.isArray(template.alignments)) {\n pushError(errors, \"template.alignments\", \"template.alignments must be an array\");\n } else {\n template.alignments.forEach((alignment, index) => {\n validateAlignment(alignment, `template.alignments[${index}]`, errors);\n });\n }\n }\n if (template.tags !== void 0) {\n validateStringArray(template.tags, \"template.tags\", errors);\n }\n if (template.activity !== void 0) {\n if (!isPlainObject(template.activity)) {\n pushError(errors, \"template.activity\", \"template.activity must be an object\");\n } else {\n if (template.activity.startDate !== void 0) {\n validateTemplateDate(\n template.activity.startDate,\n \"template.activity.startDate\",\n errors\n );\n }\n if (template.activity.endDate !== void 0) {\n validateTemplateDate(\n template.activity.endDate,\n \"template.activity.endDate\",\n errors\n );\n }\n }\n }\n if (template.credits !== void 0) {\n if (!isPlainObject(template.credits)) {\n pushError(errors, \"template.credits\", \"template.credits must be an object\");\n } else {\n if (template.credits.earned !== void 0) {\n validateTemplateNumber(template.credits.earned, \"template.credits.earned\", errors);\n }\n if (template.credits.available !== void 0) {\n validateTemplateNumber(\n template.credits.available,\n \"template.credits.available\",\n errors\n );\n }\n }\n }\n if (template.validUntil !== void 0) {\n validateTemplateDate(template.validUntil, \"template.validUntil\", errors);\n }\n if (template.evidence !== void 0) {\n if (!Array.isArray(template.evidence)) {\n pushError(errors, \"template.evidence\", \"template.evidence must be an array\");\n } else {\n template.evidence.forEach((evidence, index) => {\n validateEvidence(evidence, `template.evidence[${index}]`, errors);\n });\n }\n }\n validateWalletSkillTags(template.walletSkills, \"template.walletSkills\", errors);\n};\nconst validateRawTemplate = (template, errors) => {\n const invalidKeys = SIMPLE_TEMPLATE_KEYS.filter(\n (key) => Object.prototype.hasOwnProperty.call(template, key)\n );\n invalidKeys.forEach((key) => {\n pushError(\n errors,\n \"template.rawCredential\",\n `template.rawCredential cannot be combined with template.${key} \\u2014 use one or the other`\n );\n });\n if (!isPlainObject(template.rawCredential)) {\n pushError(\n errors,\n \"template.rawCredential\",\n \"template.rawCredential must be a plain object\"\n );\n return;\n }\n if (!Array.isArray(template.rawCredential[\"@context\"])) {\n pushError(\n errors,\n \"template.rawCredential.@context\",\n \"template.rawCredential.@context must be an array\"\n );\n }\n if (!Array.isArray(template.rawCredential.type)) {\n pushError(\n errors,\n \"template.rawCredential.type\",\n \"template.rawCredential.type must be an array\"\n );\n }\n if (template.category !== void 0 && !validateWalletCategory(template.category)) {\n const suggestion = typeof template.category === \"string\" ? getDidYouMean(template.category, WALLET_CATEGORIES) : void 0;\n const suffix = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n pushError(\n errors,\n \"template.category\",\n `template.category must be one of ${WALLET_CATEGORIES.join(\", \")}${suffix}`\n );\n }\n validateWalletSkillTags(template.walletSkills, \"template.walletSkills\", errors);\n validateRawCredentialVariables(template.rawCredential, \"template.rawCredential\", errors);\n};\nconst validateInlineTemplate = (template) => {\n const errors = [];\n if (!isPlainObject(template)) {\n return [{ path: \"template\", message: \"template must be a plain object\" }];\n }\n if (\"rawCredential\" in template && template.rawCredential !== void 0) {\n validateRawTemplate(template, errors);\n return errors;\n }\n validateSimpleTemplate(template, errors);\n return errors;\n};\n\nconst VARIABLE_SENTINEL_PREFIX = \"__LC_VAR__\";\nconst getStringVariablePaths = (value, path, variables) => {\n var _a;\n if (typeof value === \"string\") {\n TEMPLATE_VARIABLE_REGEX.lastIndex = 0;\n let match = TEMPLATE_VARIABLE_REGEX.exec(value);\n while (match) {\n const variableName = match[1];\n if (!isReservedTemplateVariable(variableName)) {\n variables[variableName] = (_a = variables[variableName]) != null ? _a : [];\n if (!variables[variableName].includes(path)) {\n variables[variableName].push(path);\n }\n }\n match = TEMPLATE_VARIABLE_REGEX.exec(value);\n }\n return;\n }\n if (Array.isArray(value)) {\n value.forEach(\n (item, index) => getStringVariablePaths(item, `${path}[${index}]`, variables)\n );\n return;\n }\n if (isPlainObject(value)) {\n Object.keys(value).forEach((key) => {\n const nextPath = path === \"$\" ? `$.${key}` : `${path}.${key}`;\n getStringVariablePaths(value[key], nextPath, variables);\n });\n }\n};\nconst findUnquotedVariableSpans = (json) => {\n const spans = [];\n let inString = false;\n for (let index = 0; index < json.length; index += 1) {\n const char = json[index];\n if (inString) {\n if (char === \"\\\\\") index += 1;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') {\n inString = true;\n continue;\n }\n if (char === \"{\" && json[index + 1] === \"{\") {\n const match = /^\\{\\{(\\w+)\\}\\}/.exec(json.slice(index));\n if (match) {\n spans.push({ name: match[1], start: index, end: index + match[0].length });\n index += match[0].length - 1;\n }\n }\n }\n return spans;\n};\nconst replaceUnquotedVariablesForParsing = (json) => {\n const spans = findUnquotedVariableSpans(json);\n let result = json;\n for (let index = spans.length - 1; index >= 0; index -= 1) {\n const span = spans[index];\n result = `${result.slice(0, span.start)}\"${VARIABLE_SENTINEL_PREFIX}${span.name}\"${result.slice(span.end)}`;\n }\n return result;\n};\nconst extractTemplateVariables = (json) => {\n const variables = /* @__PURE__ */ new Set();\n TEMPLATE_VARIABLE_REGEX.lastIndex = 0;\n let match = TEMPLATE_VARIABLE_REGEX.exec(json);\n while (match) {\n variables.add(match[1]);\n match = TEMPLATE_VARIABLE_REGEX.exec(json);\n }\n return Array.from(variables).sort((a, b) => a.localeCompare(b));\n};\nconst buildVariableManifest = (credentialTemplateJson) => {\n const numericVariables = /* @__PURE__ */ new Set();\n const stringPaths = {};\n findUnquotedVariableSpans(credentialTemplateJson).forEach((span) => {\n if (!isReservedTemplateVariable(span.name)) {\n numericVariables.add(span.name);\n }\n });\n try {\n const parsed = JSON.parse(\n replaceUnquotedVariablesForParsing(credentialTemplateJson)\n );\n getStringVariablePaths(parsed, \"$\", stringPaths);\n } catch {\n }\n const manifestVariables = {};\n extractTemplateVariables(credentialTemplateJson).forEach((variableName) => {\n var _a;\n if (isReservedTemplateVariable(variableName)) {\n return;\n }\n const paths = [...(_a = stringPaths[variableName]) != null ? _a : []].sort((a, b) => a.localeCompare(b));\n manifestVariables[variableName] = {\n type: numericVariables.has(variableName) ? \"number\" : \"string\",\n paths\n };\n });\n return { variables: manifestVariables };\n};\nconst validateTemplateData = (manifest, templateData) => {\n const errors = [];\n const data = templateData != null ? templateData : {};\n const manifestKeys = Object.keys(manifest.variables);\n manifestKeys.forEach((variableName) => {\n if (!Object.prototype.hasOwnProperty.call(data, variableName) || data[variableName] === void 0) {\n errors.push({\n path: `templateData.${variableName}`,\n message: `templateData.${variableName} is required`\n });\n return;\n }\n const expectedType = manifest.variables[variableName].type;\n const value = data[variableName];\n if (expectedType === \"number\") {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n errors.push({\n path: `templateData.${variableName}`,\n message: `templateData.${variableName} must be a finite number`\n });\n }\n return;\n }\n if (![\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n errors.push({\n path: `templateData.${variableName}`,\n message: `templateData.${variableName} must be a string, number, or boolean`\n });\n }\n });\n Object.keys(data).forEach((key) => {\n if (key === \"evidence\") {\n return;\n }\n if (RESERVED_TEMPLATE_VARIABLES.includes(key)) {\n errors.push({\n path: `templateData.${key}`,\n message: `templateData.${key} is injected automatically by LearnCard and cannot be supplied`\n });\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(manifest.variables, key)) {\n const suggestion = getDidYouMean(key, manifestKeys);\n const suffix = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n errors.push({\n path: `templateData.${key}`,\n message: `templateData.${key} is unused${suffix}`\n });\n }\n });\n return errors;\n};\n\nconst NUMERIC_SENTINEL_PREFIX = \"__LC_NUM__\";\nconst toNumericSentinel = (value) => {\n const variableName = getBareVariableName(value);\n return variableName !== void 0 ? `${NUMERIC_SENTINEL_PREFIX}{{${variableName}}}__` : value;\n};\nconst finalizeCredentialTemplateJson = (value) => {\n const canonical = canonicalJsonString(value);\n return canonical.replace(/\"__LC_NUM__(\\{\\{\\w+\\}\\})__\"/g, \"$1\");\n};\nconst compileSimpleTemplate = (template) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n const credential = stripEmpty({\n \"@context\": [VC2_CONTEXT, OBV3_CONTEXT],\n type: [\"VerifiableCredential\", \"OpenBadgeCredential\"],\n name: template.name,\n description: template.description,\n image: template.image,\n issuer: stripEmpty({\n id: \"{{issuer_did}}\",\n type: [\"Profile\"],\n name: template.issuerName\n }),\n validFrom: \"{{issue_date}}\",\n validUntil: template.validUntil,\n credentialSubject: stripEmpty({\n type: [\"AchievementSubject\"],\n id: \"{{recipient_did}}\",\n achievement: stripEmpty({\n type: [\"Achievement\"],\n name: template.name,\n description: template.description,\n achievementType: (_a = template.achievementType) != null ? _a : \"Badge\",\n image: template.image,\n criteria: stripEmpty({\n narrative: (_b = template.criteria) == null ? void 0 : _b.narrative,\n id: (_c = template.criteria) == null ? void 0 : _c.url\n }),\n alignment: (_d = template.alignments) == null ? void 0 : _d.map(\n (alignment) => stripEmpty({\n type: [\"Alignment\"],\n targetName: alignment.name,\n targetUrl: alignment.url,\n targetFramework: alignment.framework,\n targetCode: alignment.code\n })\n ),\n tag: template.tags\n }),\n activityStartDate: (_e = template.activity) == null ? void 0 : _e.startDate,\n activityEndDate: (_f = template.activity) == null ? void 0 : _f.endDate,\n creditsEarned: toNumericSentinel((_g = template.credits) == null ? void 0 : _g.earned),\n creditsAvailable: toNumericSentinel((_h = template.credits) == null ? void 0 : _h.available)\n }),\n evidence: (_i = template.evidence) == null ? void 0 : _i.map(\n (evidence) => stripEmpty({\n type: [\"Evidence\"],\n id: evidence.id,\n name: evidence.name,\n narrative: evidence.narrative\n })\n )\n });\n return finalizeCredentialTemplateJson(credential);\n};\nconst forceCredentialSubjectId = (credentialSubject) => {\n if (Array.isArray(credentialSubject)) {\n credentialSubject.forEach((subject) => {\n if (isPlainObject(subject)) {\n subject.id = \"{{recipient_did}}\";\n }\n });\n return;\n }\n if (isPlainObject(credentialSubject)) {\n credentialSubject.id = \"{{recipient_did}}\";\n }\n};\nconst compileRawTemplate = (template) => {\n const credential = deepClone(template.rawCredential);\n if (!isPlainObject(credential)) {\n throw new Error(\"template.rawCredential must be a plain object\");\n }\n if (isPlainObject(credential.issuer)) {\n credential.issuer.id = \"{{issuer_did}}\";\n } else {\n credential.issuer = { id: \"{{issuer_did}}\", type: [\"Profile\"] };\n }\n credential.validFrom = \"{{issue_date}}\";\n forceCredentialSubjectId(credential.credentialSubject);\n return finalizeCredentialTemplateJson(credential);\n};\nconst compileInlineTemplate = (template) => {\n var _a;\n const errors = validateInlineTemplate(template);\n if (errors.length > 0) {\n throw new Error(errors.map((error) => `${error.path}: ${error.message}`).join(\"\\n\"));\n }\n const credentialTemplateJson = \"rawCredential\" in template && template.rawCredential !== void 0 ? compileRawTemplate(template) : compileSimpleTemplate(template);\n return {\n credentialTemplateJson,\n variableManifest: buildVariableManifest(credentialTemplateJson),\n category: (_a = template.category) != null ? _a : \"Achievement\",\n walletSkills: template.walletSkills\n };\n};\n\nconst normalizeCategoryArray = (values, path) => {\n if (values === void 0) {\n return [];\n }\n if (!Array.isArray(values)) {\n throw new Error(`${path} must be an array`);\n }\n const normalized = values.map((value, index) => {\n if (!validateWalletCategory(value)) {\n const suggestion = typeof value === \"string\" ? getDidYouMean(value, WALLET_CATEGORIES) : void 0;\n const suffix = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n throw new Error(\n `${path}[${index}] has unknown wallet category \"${String(value)}\"${suffix}`\n );\n }\n return value;\n });\n return sortUnique(normalized);\n};\nconst normalizePersonalFieldArray = (values, path) => {\n if (values === void 0) {\n return [];\n }\n if (!Array.isArray(values)) {\n throw new Error(`${path} must be an array`);\n }\n const normalized = values.map((value, index) => {\n if (!validatePersonalField(value)) {\n const suggestion = typeof value === \"string\" ? getDidYouMean(value, PERSONAL_FIELDS) : void 0;\n const suffix = suggestion ? `; did you mean \"${suggestion}\"?` : \"\";\n throw new Error(\n `${path}[${index}] has unknown personal field \"${String(value)}\"${suffix}`\n );\n }\n return value;\n });\n return sortUnique(normalized);\n};\nconst normalizeConsentRequest = (req) => {\n var _a, _b, _c;\n return {\n read: {\n credentialCategories: normalizeCategoryArray(\n (_a = req.read) == null ? void 0 : _a.credentialCategories,\n \"consent.read.credentialCategories\"\n ),\n personalFields: normalizePersonalFieldArray(\n (_b = req.read) == null ? void 0 : _b.personalFields,\n \"consent.read.personalFields\"\n )\n },\n write: {\n credentialCategories: normalizeCategoryArray(\n (_c = req.write) == null ? void 0 : _c.credentialCategories,\n \"consent.write.credentialCategories\"\n )\n }\n };\n};\nconst canonicalConsentScopeString = (scopes) => {\n return canonicalJsonString(scopes);\n};\n\nconst getTextEncoder = () => {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder();\n return void 0;\n};\nconst getTextDecoder = () => {\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder();\n return void 0;\n};\nconst getBuffer = () => {\n const candidate = globalThis.Buffer;\n return candidate;\n};\nconst toBase64 = (value) => {\n const buffer = getBuffer();\n if (buffer) return buffer.from(value, \"utf8\").toString(\"base64\");\n const encoder = getTextEncoder();\n if (encoder && typeof btoa === \"function\") {\n const bytes = encoder.encode(value);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n }\n if (typeof btoa === \"function\") {\n return btoa(unescape(encodeURIComponent(value)));\n }\n throw new Error(\"No base64 encoder available in this environment\");\n};\nconst fromBase64 = (value) => {\n const buffer = getBuffer();\n if (buffer) return buffer.from(value, \"base64\").toString(\"utf8\");\n if (typeof atob === \"function\") {\n const binary = atob(value);\n const decoder = getTextDecoder();\n if (decoder) {\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return decoder.decode(bytes);\n }\n return decodeURIComponent(\n binary.split(\"\").map((char) => `%${char.charCodeAt(0).toString(16).padStart(2, \"0\")}`).join(\"\")\n );\n }\n throw new Error(\"No base64 decoder available in this environment\");\n};\nconst toBase64Url = (value) => toBase64(value).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\nconst fromBase64Url = (value) => {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const paddingLength = (4 - normalized.length % 4) % 4;\n return fromBase64(`${normalized}${\"=\".repeat(paddingLength)}`);\n};\nconst encodeManifestForUrl = (manifest) => toBase64Url(JSON.stringify(manifest));\nconst decodeManifestFromUrl = (value) => JSON.parse(fromBase64Url(value));\nconst createEmptyCapturedManifest = (appUrl) => {\n const now = (/* @__PURE__ */ new Date()).toISOString();\n return {\n manifestVersion: 1,\n appUrl,\n permissions: [],\n templates: [],\n consentRequests: [],\n featuresLaunched: [],\n counterKeys: [],\n usedLearnerContext: false,\n usedNotifications: false,\n firstCapturedAt: now,\n lastUpdatedAt: now\n };\n};\nconst addUnique = (arr, val) => {\n if (arr.includes(val)) return arr;\n return [...arr, val];\n};\nconst applyCapturedAction = (manifest, input) => {\n const next = JSON.parse(JSON.stringify(manifest));\n const now = input.timestamp || (/* @__PURE__ */ new Date()).toISOString();\n next.lastUpdatedAt = now;\n const { action, payload } = input;\n if (action === \"APP_EVENT\") {\n const event = payload;\n const type = typeof (event == null ? void 0 : event.type) === \"string\" ? event.type : \"\";\n if (type === \"send-credential\") {\n next.permissions = addUnique(next.permissions, \"send_credential\");\n if (typeof (event == null ? void 0 : event.alias) === \"string\" && event.alias && event.template && typeof event.template === \"object\") {\n const alias = event.alias;\n const template = event.template;\n const canonicalTemplate = canonicalJsonString(template);\n const existingIndex = next.templates.findIndex((t) => t.alias === alias);\n if (existingIndex >= 0) {\n const existing = next.templates[existingIndex];\n const existingCanonical = canonicalJsonString(existing.template);\n const version = existingCanonical === canonicalTemplate ? existing.version : existing.version + 1;\n next.templates[existingIndex] = {\n alias,\n template,\n version,\n lastUsedAt: now\n };\n } else {\n next.templates.push({\n alias,\n template,\n version: 1,\n lastUsedAt: now\n });\n }\n }\n } else if (type === \"send-notification\") {\n next.usedNotifications = true;\n } else if (type === \"increment-counter\" || type === \"get-counter\") {\n const key = event == null ? void 0 : event.key;\n if (typeof key === \"string\" && key) {\n next.counterKeys = addUnique(next.counterKeys, key);\n }\n } else if (type === \"get-counters\") {\n if (Array.isArray(event == null ? void 0 : event.keys)) {\n for (const key of event.keys) {\n if (typeof key === \"string\" && key) {\n next.counterKeys = addUnique(next.counterKeys, key);\n }\n }\n }\n }\n return next;\n }\n switch (action) {\n case \"REQUEST_IDENTITY\":\n next.permissions = addUnique(next.permissions, \"request_identity\");\n break;\n case \"SEND_CREDENTIAL\":\n next.permissions = addUnique(next.permissions, \"send_credential\");\n break;\n case \"REQUEST_CONSENT\": {\n next.permissions = addUnique(next.permissions, \"request_consent\");\n if (payload == null ? void 0 : payload.contractUri) {\n next.usedConsentContract = true;\n }\n const scopes = payload == null ? void 0 : payload.scopes;\n if (scopes && typeof scopes === \"object\" && !Array.isArray(scopes)) {\n try {\n const normalized = normalizeConsentRequest(scopes);\n const key = canonicalConsentScopeString(normalized);\n const existing = next.consentRequests.find(\n (record) => canonicalConsentScopeString(record.scopes) === key\n );\n if (existing) {\n existing.lastUsedAt = now;\n if (!existing.reason && typeof scopes.reason === \"string\" && scopes.reason) {\n existing.reason = scopes.reason;\n }\n } else {\n next.consentRequests.push({\n scopes: normalized,\n ...typeof scopes.reason === \"string\" && scopes.reason ? { reason: scopes.reason } : {},\n lastUsedAt: now\n });\n }\n } catch {\n }\n }\n break;\n }\n case \"LAUNCH_FEATURE\": {\n next.permissions = addUnique(next.permissions, \"launch_feature\");\n const featurePath = payload == null ? void 0 : payload.featurePath;\n if (typeof featurePath === \"string\" && featurePath) {\n next.featuresLaunched = addUnique(next.featuresLaunched, featurePath);\n }\n break;\n }\n case \"ASK_CREDENTIAL_SEARCH\":\n next.permissions = addUnique(next.permissions, \"credential_search\");\n break;\n case \"ASK_CREDENTIAL_SPECIFIC\":\n next.permissions = addUnique(next.permissions, \"credential_by_id\");\n break;\n case \"INITIATE_TEMPLATE_ISSUE\":\n next.permissions = addUnique(next.permissions, \"template_issuance\");\n break;\n case \"REQUEST_LEARNER_CONTEXT\":\n next.usedLearnerContext = true;\n break;\n }\n return next;\n};\nconst union = (base, next) => [.../* @__PURE__ */ new Set([...base, ...next])];\nconst isMoreRecent = (candidate, current) => Date.parse(candidate) > Date.parse(current);\nconst mergeByKey = (base, next, keyOf, shouldReplace) => {\n const byKey = new Map(base.map((record) => [keyOf(record), record]));\n for (const record of next) {\n const existing = byKey.get(keyOf(record));\n if (!existing || shouldReplace(existing, record)) byKey.set(keyOf(record), record);\n }\n return [...byKey.values()];\n};\nconst mergeCapturedManifests = (base, next) => ({\n ...base,\n ...next,\n permissions: union(base.permissions, next.permissions),\n templates: mergeByKey(\n base.templates,\n next.templates,\n (record) => record.alias,\n (existing, candidate) => canonicalJsonString(existing.template) !== canonicalJsonString(candidate.template) && isMoreRecent(candidate.lastUsedAt, existing.lastUsedAt)\n ),\n consentRequests: mergeByKey(\n base.consentRequests,\n next.consentRequests,\n (record) => canonicalJsonString(record.scopes),\n (existing, candidate) => isMoreRecent(candidate.lastUsedAt, existing.lastUsedAt)\n ),\n featuresLaunched: union(base.featuresLaunched, next.featuresLaunched),\n counterKeys: union(base.counterKeys, next.counterKeys),\n usedLearnerContext: base.usedLearnerContext || next.usedLearnerContext,\n usedNotifications: base.usedNotifications || next.usedNotifications,\n firstCapturedAt: isMoreRecent(next.firstCapturedAt, base.firstCapturedAt) ? base.firstCapturedAt : next.firstCapturedAt,\n lastUpdatedAt: isMoreRecent(base.lastUpdatedAt, next.lastUpdatedAt) ? base.lastUpdatedAt : next.lastUpdatedAt\n});\nconst needsConsentSetup = (manifest) => manifest.permissions.includes(\"request_consent\") && manifest.consentRequests.length === 0 && !manifest.usedConsentContract;\nconst suggestConsentScopes = (manifest) => ({\n read: {\n credentialCategories: manifest.usedLearnerContext ? [\"Achievement\", \"Skill\", \"Learning History\"] : [\"Achievement\"],\n personalFields: [\"name\"]\n },\n reason: \"Personalize your experience\"\n});\n\nconst renderCompiledTemplate = (credentialTemplateJson, templateData) => {\n const renderedJson = credentialTemplateJson.replace(\n /\\{\\{(\\w+)\\}\\}/g,\n (match, variableName) => {\n if (!Object.prototype.hasOwnProperty.call(templateData, variableName)) {\n return [\"issue_date\", \"issuer_did\", \"recipient_did\"].includes(variableName) ? match : \"\";\n }\n const value = templateData[variableName];\n if (value === null || value === void 0) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\\t/g, \"\\\\t\").replace(/\\f/g, \"\\\\f\").split(String.fromCharCode(8)).join(\"\\\\b\");\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return \"\";\n }\n );\n try {\n return JSON.parse(renderedJson);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown JSON parse error\";\n throw new Error(`Failed to render compiled template into valid JSON: ${message}`, {\n cause: error\n });\n }\n};\n\nexport { KNOWN_ACHIEVEMENT_TYPES, OBV3_CONTEXT, PERSONAL_FIELDS, RESERVED_TEMPLATE_VARIABLES, TEMPLATE_VARIABLE_REGEX, VC2_CONTEXT, WALLET_CATEGORIES, applyCapturedAction, buildVariableManifest, canonicalConsentScopeString, canonicalJsonString, compileInlineTemplate, createEmptyCapturedManifest, decodeManifestFromUrl, encodeManifestForUrl, extractTemplateVariables, isAppBuilderEditorOrigin, isAppBuilderPreviewHost, mergeCapturedManifests, needsConsentSetup, normalizeConsentRequest, renderCompiledTemplate, suggestConsentScopes, validateInlineTemplate, validateTemplateData };\n//# sourceMappingURL=partner-connect-core.esm.js.map\n","/**\n * LearnCard Partner Connect SDK - Type Definitions\n */\n\nimport type {\n AppEvent as BaseAppEvent,\n AppEventResponse as BaseAppEventResponse,\n CheckCredentialEvent,\n SendCredentialEvent as BaseSendCredentialEvent,\n} from '@learncard/types';\nimport type {\n CapturedAppManifest,\n ConsentRequest,\n InlineCredentialTemplate,\n InlineTemplateValidationError,\n} from '@learncard/partner-connect-core';\n\n// Re-export AppEvent types from shared types package\nexport type { CheckCredentialEvent };\nexport type {\n CapturedAppManifest,\n CapturedConsentRecord,\n CapturedTemplateRecord,\n CompiledInlineTemplate,\n ConsentRequest,\n InlineCredentialTemplate,\n InlineTemplateValidationError,\n PersonalField,\n RawInlineCredentialTemplate,\n SimpleInlineCredentialTemplate,\n VariableManifest,\n WalletCategory,\n} from '@learncard/partner-connect-core';\n\nexport interface PreviewCompiledTemplateResult {\n valid: boolean;\n errors: InlineTemplateValidationError[];\n compiled?: Record<string, unknown>;\n rendered?: Record<string, unknown>;\n}\n\n/**\n * Configuration options for initializing the SDK\n */\nexport interface PartnerConnectOptions {\n /**\n * The origin(s) of the LearnCard host.\n *\n * Each entry may be either an **exact origin** (`https://learncard.app`) or a\n * **wildcard pattern** where `*` stands in for a single DNS label portion in\n * the host portion of the origin (e.g. `https://*.learncard.app`,\n * `https://*.vetpass.app`). Wildcards are **only** allowed in the host and\n * only as label(s); the protocol and port must always match exactly.\n *\n * Wildcard patterns match any non-empty chain of labels. So\n * `https://*.learncard.app` matches both `https://staging.learncard.app` and\n * `https://pr-123.preview.learncard.app`, but **not** `https://learncard.app`\n * itself (include the bare origin explicitly if you need it) and **not**\n * `https://evil.learncard.app.attacker.com` (the suffix must match).\n *\n * **Origin Configuration Hierarchy at runtime:**\n * 1. `window.location.ancestorOrigins[0]` (when available) — the real parent\n * origin as reported by the browser, validated against the effective\n * whitelist. This source cannot be spoofed by a malicious query param.\n * 2. `?lc_host_override=<origin>` query parameter — validated against the\n * whitelist. Used by the LearnCard host to tell the SDK which origin it\n * is loading from.\n * 3. `sessionStorage['lc_host_override']` — a previously-validated override\n * persisted across in-iframe navigation.\n * 4. First value in the configured `hostOrigin` array / single string.\n * 5. `PartnerConnect.DEFAULT_HOST_ORIGIN` (`https://learncard.app`).\n *\n * The partner app's configured whitelist is combined with a small built-in\n * list of LearnCard tenant domains (see `disableDefaultTenants` to opt out).\n * This lets a partner app work out-of-the-box inside any current or future\n * `*.learncard.app`, `*.learncard.ai`, or `*.vetpass.app` tenant without a\n * re-deploy.\n *\n * **Examples:**\n *\n * Single origin (production only):\n * ```typescript\n * hostOrigin: 'https://learncard.app'\n * ```\n *\n * Wildcard whitelist (covers staging + preview):\n * ```typescript\n * hostOrigin: ['https://learncard.app', 'https://*.learncard.app']\n * ```\n *\n * Custom tenant alongside the built-in LearnCard defaults:\n * ```typescript\n * hostOrigin: ['https://partner.example.com']\n * // learncard.app / *.learncard.app / *.learncard.ai / vetpass.app / *.vetpass.app\n * // are ALSO trusted because disableDefaultTenants is false.\n * ```\n *\n * @default 'https://learncard.app'\n */\n hostOrigin?: string | string[];\n\n /**\n * Opt out of the built-in LearnCard tenant whitelist.\n *\n * By default, the SDK merges `hostOrigin` with a curated list of LearnCard\n * and tenant domains (see `PartnerConnect.DEFAULT_TRUSTED_TENANTS`) so that\n * partner apps work on any LearnCard-managed tenant without reconfiguration.\n *\n * Set to `true` if you want the partner app to **only** trust the origins\n * you pass in `hostOrigin`.\n *\n * @default false\n */\n disableDefaultTenants?: boolean;\n\n /**\n * Whether to allow native app origins (default: true)\n *\n * @default true\n */\n allowNativeAppOrigins?: boolean;\n\n /**\n * Protocol identifier (default: 'LEARNCARD_V1')\n */\n protocol?: string;\n\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n requestTimeout?: number;\n\n /**\n * Controls automatic **standalone mock mode**.\n *\n * When the SDK runs outside of a LearnCard host (i.e. as a top-level page,\n * not embedded in an iframe), there is no host to answer `postMessage`\n * requests, so every call would hang until it times out. Mock mode makes\n * the SDK simulate the host locally so your app is fully buildable,\n * demo-able, and testable without being embedded — and then behaves\n * identically (real host) once embedded, with no code changes.\n *\n * - `'auto'` **(default)**: mock only when **no LearnCard host is present\n * AND the app is running in local dev** (`localhost`, `127.0.0.1`,\n * `[::1]`, `*.localhost`, `*.local`) **or an AI app builder's editor\n * preview** (Lovable, Bolt, v0, Replit). This covers local dev, local\n * Storybook, and building in those tools, but deliberately never\n * fabricates identity or consent on a published or deploy-preview\n * origin. Each mocked call\n * surfaces a labeled toast plus a console log so it's clear the host\n * is simulated.\n * - `'standalone'`: mock whenever **no LearnCard host is present**, on\n * any origin — including remote deploy previews (Netlify, Vercel, …)\n * — and use the real host when embedded in LearnCard. The\n * one-flag setting for apps that must demo standalone anywhere. Only\n * choose it when a user opening your app's URL directly should see\n * simulated data.\n * - `true`: always mock, **even when embedded in a real LearnCard host**.\n * Use this for CI and tests; for previews that should go real once\n * embedded, prefer `'standalone'`.\n * - `false`: never mock. Standalone calls reject immediately with\n * `LC_NOT_EMBEDDED`. Set this in production builds meant to run only\n * inside LearnCard.\n *\n * @default 'auto'\n */\n mock?: boolean | 'auto' | 'standalone';\n\n /**\n * Fine-grained configuration for standalone mock mode. Ignored when mock\n * mode is not active. See {@link MockHostOptions}.\n */\n mockOptions?: MockHostOptions;\n\n /**\n * How long (ms) to wait for the host to answer the one-time presence\n * probe used when the SDK is embedded in an iframe whose parent cannot\n * be confirmed as LearnCard (e.g. a same-origin Storybook canvas on\n * localhost). Only used with `mock: 'auto'` on local dev hosts.\n *\n * @default 1500\n */\n hostProbeTimeout?: number;\n}\n\n/**\n * Options controlling the behavior of standalone mock mode.\n *\n * All fields are optional; mock mode works out-of-the-box with sensible\n * defaults (visible UI, console logging, and localStorage-backed counters).\n */\nexport interface MockHostOptions {\n /**\n * Render lightweight visual feedback in the page: a fake credential-claim\n * modal / toast for `sendCredential`, and a \"mock consent\" banner for\n * `requestConsent`. Set to `false` for a headless mock (logs only).\n *\n * @default true\n */\n ui?: boolean;\n\n /**\n * Log every simulated host interaction to the console with a clear\n * `[LearnCard SDK · MOCK]` prefix.\n *\n * @default true\n */\n log?: boolean;\n\n /**\n * Persist counters (`incrementCounter` / `getCounter` / `getCounters`) to\n * `localStorage` so values survive page reloads, mirroring the real host's\n * durable per-user counters. Falls back to in-memory storage when\n * `localStorage` is unavailable.\n *\n * @default true\n */\n persist?: boolean;\n\n /**\n * Show the mock-mode \"Publish to LearnCard\" nudge once the captured app\n * manifest becomes publishable.\n *\n * @default true\n */\n publishPrompt?: boolean;\n\n /**\n * LearnCard origin used to build the App Store submission URL.\n *\n * @default 'https://learncard.app'\n */\n publishOrigin?: string;\n\n /**\n * The fake DID returned by `requestIdentity()` (and used as the mock\n * user's identity) while in mock mode.\n *\n * @default 'did:web:mock.learncard.app:user'\n */\n did?: string;\n\n /**\n * Namespace used to scope persisted mock data (counters, claimed\n * credentials) in `localStorage`. Change this if you run multiple mock\n * apps on the same origin and want isolated state.\n *\n * @default 'lc-mock'\n */\n namespace?: string;\n\n /**\n * Distinguishes your app from other apps served on the same origin\n * (e.g. multiple projects on localhost:4321). Defaults to a fingerprint\n * of the initial document.title.\n */\n appId?: string;\n\n /**\n * Seed the mock user's identity. Superseded per-field over the legacy\n * `did` option. Extra fields are returned as-is from `requestIdentity()`.\n */\n identity?: MockIdentitySeed;\n\n /**\n * Pre-populate the mock with credentials the user already holds (or has\n * issued to others). This lets you demo \"happy path\" states — e.g. a\n * \"you already earned this\" banner — without performing an action first.\n * Reads like `checkUserHasCredential`, `getTemplateRecipients`,\n * `requestLearnerContext`, and `askCredentialSearch` reflect these.\n */\n credentials?: MockCredentialSeed[];\n\n /**\n * Initial counter values, applied only when a counter has no persisted\n * value yet (so incremented values survive reloads).\n */\n counters?: Record<string, number>;\n}\n\n/**\n * Seed shape for the mock user's identity (see {@link MockHostOptions.identity}).\n */\nexport interface MockIdentitySeed {\n did?: string;\n name?: string;\n [key: string]: unknown;\n}\n\n/**\n * Seed shape for a pre-populated mock credential (see\n * {@link MockHostOptions.credentials}).\n */\nexport interface MockCredentialSeed {\n /** Template alias this credential was issued from. */\n templateAlias?: string;\n\n /** Boost URI this credential was issued from. */\n boostUri?: string;\n\n /** Human-readable credential name (used in toasts and mock VC data). */\n name?: string;\n\n /**\n * Recipient identifier (profileId or DID). Defaults to the mock user\n * (i.e. a credential the user holds). Set this to model credentials the\n * user has issued to other people.\n */\n recipient?: string;\n\n /** Claim status. @default 'claimed' */\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/** Public manifest snapshot getter, available only while mock mode is active. */\nexport interface CapturedManifestReadable {\n getCapturedManifest(): CapturedAppManifest | undefined;\n getPublishUrl(): string | undefined;\n /** Start fresh for the current practice app; no-op outside mock mode. */\n resetPracticeMode(): void;\n getActiveHostOrigin(): string | null;\n getPublishOrigin(): string | null;\n}\n\n/**\n * Identity information returned from REQUEST_IDENTITY\n */\nexport interface IdentityResponse {\n token: string;\n user: {\n did: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Response from SEND_CREDENTIAL action (raw credential)\n */\nexport interface SendCredentialResponse {\n credentialId: string;\n [key: string]: unknown;\n}\n\n/**\n * Template-based credential input for sendCredential\n * Uses a pre-configured boost template to issue a credential\n */\nexport interface TemplateCredentialInput {\n /** Alias of the boost template configured for this app */\n templateAlias: string;\n\n /** Optional template data for Mustache-style variable substitution */\n templateData?: Record<string, unknown>;\n\n /**\n * If true, the host will return an existing credential (if present) instead of issuing a duplicate.\n */\n preventDuplicateClaim?: boolean;\n}\n\n/**\n * Inline credential template input for sendCredential.\n *\n * This sends the full template definition to LearnCard at runtime, with no\n * pre-configured host template required.\n *\n * @example\n * ```typescript\n * await learnCard.sendCredential({\n * alias: 'course-complete',\n * template: {\n * name: 'Completed {{courseName}}',\n * description: 'Awarded for finishing {{courseName}}.',\n * achievementType: 'Course',\n * criteria: { narrative: 'Finished all modules' }\n * },\n * templateData: { courseName: 'Intro to Baking' }\n * });\n * ```\n */\nexport interface InlineTemplateCredentialInput {\n /** App-scoped alias used for duplicate checks and inline template versioning. */\n alias: string;\n\n /** Inline credential template definition compiled by LearnCard at issuance time. */\n template: InlineCredentialTemplate;\n\n /** Runtime values for the template variables. */\n templateData?: Record<string, unknown>;\n\n /**\n * If true, the host will return an existing credential (if present) instead of issuing a duplicate.\n */\n preventDuplicateClaim?: boolean;\n}\n\n/** Inline `send-credential` app event for zero-config issuance. */\nexport interface InlineTemplateSendCredentialEvent {\n type: 'send-credential';\n alias: string;\n template: InlineCredentialTemplate;\n templateData?: Record<string, unknown>;\n preventDuplicateClaim?: boolean;\n}\n\nexport type SendCredentialEvent = BaseSendCredentialEvent | InlineTemplateSendCredentialEvent;\nexport type AppEvent = BaseAppEvent | InlineTemplateSendCredentialEvent;\nexport type AppEventResponse = BaseAppEventResponse;\nexport type SendCredentialInput = unknown | TemplateCredentialInput | InlineTemplateCredentialInput;\n\n/**\n * Response from template-based credential issuance\n */\nexport interface TemplateCredentialResponse {\n /** URI of the issued credential */\n credentialUri: string;\n\n /** URI of the boost template used */\n boostUri: string;\n\n /** Whether the credential was already claimed (when preventDuplicateClaim is true) */\n alreadyClaimed?: boolean;\n\n /** Whether the user has the credential (when preventDuplicateClaim is true) */\n hasCredential?: boolean;\n\n /** The status of the credential (when preventDuplicateClaim is true) */\n status?: 'pending' | 'claimed' | 'revoked';\n\n /** The date the credential was received (when preventDuplicateClaim is true) */\n receivedDate?: string;\n\n /** Version number for inline templates sharing the same alias. */\n templateVersion?: number;\n\n [key: string]: unknown;\n}\n\n/**\n * Verifiable Presentation Request Query types\n */\nexport type VPRQuery =\n | {\n type: 'QueryByTitle';\n credentialQuery: {\n reason?: string;\n title: string;\n };\n }\n | {\n type: 'QueryByExample';\n credentialQuery: unknown;\n };\n\n/**\n * Verifiable Presentation Request structure\n */\nexport interface VerifiablePresentationRequest {\n query: VPRQuery[];\n challenge: string;\n domain: string;\n}\n\n/**\n * Response from ASK_CREDENTIAL_SEARCH action\n */\nexport interface CredentialSearchResponse {\n verifiablePresentation?: {\n verifiableCredential: unknown[];\n [key: string]: unknown;\n };\n}\n\n/**\n * Response from ASK_CREDENTIAL_SPECIFIC action\n */\nexport interface CredentialSpecificResponse {\n credential?: unknown;\n}\n\n/**\n * Options for REQUEST_CONSENT action\n */\nexport interface RequestConsentOptions {\n /**\n * If true, redirect to contract's redirectUrl with VP after consent.\n * Default: false\n */\n redirect?: boolean;\n}\n\n/**\n * Payload for REQUEST_CONSENT action\n */\nexport interface RequestConsentPayload {\n /**\n * URI of the consent contract. If not provided, the system will attempt\n * to use the contract configured for the current app listing.\n */\n contractUri?: string;\n scopes?: ConsentRequest;\n redirect?: boolean;\n}\n\n/**\n * Response from REQUEST_CONSENT action\n */\nexport interface ConsentResponse {\n granted: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Response from INITIATE_TEMPLATE_ISSUE action\n */\nexport interface TemplateIssueResponse {\n issued: boolean;\n [key: string]: unknown;\n}\n\n// AppEvent, SendCredentialEvent, CheckCredentialEvent, and AppEventResponse are re-exported from @learncard/types above\n\n/**\n * Input used to check if the authenticated user already has a credential for a boost template\n */\nexport type CheckCredentialInput = { templateAlias: string } | { boostUri: string };\n\n/**\n * Response from checkUserHasCredential\n */\nexport interface CheckCredentialResponse {\n hasCredential: boolean;\n credentialUri?: string;\n receivedDate?: string;\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Input for checking template issuance status to a specific recipient.\n * The recipient can be either a DID (did:web:...) or a profileId.\n */\nexport type CheckIssuanceStatusInput =\n { templateAlias: string; recipient: string } | { boostUri: string; recipient: string };\n\n/**\n * Response from getTemplateIssuanceStatus\n */\nexport interface TemplateIssuanceStatusResponse {\n sent: boolean;\n credentialUri?: string;\n sentDate?: string;\n claimedDate?: string;\n status?: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Input for getting template recipients list\n */\nexport type GetTemplateRecipientsInput =\n | { templateAlias: string; limit?: number; cursor?: string }\n | { boostUri: string; limit?: number; cursor?: string };\n\n/**\n * Individual recipient record in the template recipients response\n */\nexport interface TemplateRecipientRecord {\n recipientProfileId: string;\n recipientDisplayName?: string;\n sentDate: string;\n claimedDate?: string;\n credentialUri?: string;\n status: 'pending' | 'claimed' | 'revoked';\n}\n\n/**\n * Response from getTemplateRecipients\n */\nexport interface TemplateRecipientsResponse {\n records: TemplateRecipientRecord[];\n hasMore: boolean;\n cursor?: string;\n total?: number;\n}\n\n/**\n * Options for REQUEST_LEARNER_CONTEXT action\n */\nexport interface RequestLearnerContextOptions {\n /**\n * Whether to include credentials in the context\n * @default true\n */\n includeCredentials?: boolean;\n\n /**\n * Whether to include personal data (name, bio, etc.) in the context\n * @default false\n */\n includePersonalData?: boolean;\n\n /**\n * Format of the response\n * - 'prompt': Returns LLM-ready formatted text\n * - 'structured': Returns structured data object\n * @default 'prompt'\n */\n format?: 'prompt' | 'structured';\n\n /**\n * Optional instructions to guide the LLM prompt generation\n */\n instructions?: string;\n\n /**\n * Level of detail in the generated prompt\n * @default 'compact'\n */\n detailLevel?: 'compact' | 'expanded';\n\n /**\n * Wait for LearnCard to finish background ConsentFlow data sync before returning context.\n * Apps that need a complete learner snapshot should set this to true.\n * @default false\n */\n waitForSync?: boolean;\n}\n\n/**\n * Raw data included in learner context response (when format is 'structured')\n */\nexport interface LearnerContextRawData {\n /** Array of Verifiable Credentials */\n credentials: unknown[];\n\n /** Personal data if requested and available (name, bio, etc.) */\n personalData?: Record<string, unknown>;\n}\n\nexport type LearnerContextCacheStatus = 'backend-hit' | 'backend-miss' | 'structured';\n\nexport interface LearnerContextTimingBreakdown {\n totalMs: number;\n sdkRoundTripMs?: number;\n appEventMs?: number;\n credentialReadMs?: number;\n promptizerMs?: number;\n}\n\n/**\n * Response from REQUEST_LEARNER_CONTEXT action\n */\nexport interface LearnerContextResponse {\n /** Whether the response used immediately available data or waited for a complete sync */\n status?: 'ready' | 'syncing';\n\n /** Current sync progress when available */\n progress?: SyncProgress;\n\n /** LLM-ready formatted prompt text */\n prompt: string;\n\n /** Raw structured data (only included when format is 'structured') */\n raw?: LearnerContextRawData;\n\n /** User's DID */\n did: string;\n\n /** User's display name if available */\n displayName?: string;\n\n /** Server authorization, server-cache, and request timing metadata. Prompts are not cached in the browser. */\n metadata?: {\n /** Current AI consent revision for a formatted prompt; absent for structured-only responses. */\n consentRevision?: string;\n cacheStatus?: LearnerContextCacheStatus;\n timings?: LearnerContextTimingBreakdown;\n backendMetadata?: Record<string, unknown>;\n };\n}\n\nexport interface SyncProgress {\n totalCredentials: number;\n completedCredentials: number;\n failedCredentials: number;\n retryCount: number;\n}\n\nexport interface SyncStatus {\n status: 'ready' | 'syncing' | 'error';\n progress: SyncProgress;\n eta?: number;\n lastError?: string;\n}\n\n/**\n * Keywords for next steps in summary credential data\n */\nexport interface SummaryCredentialKeyword {\n occupations: string[] | null;\n careers: string[] | null;\n jobs: string[] | null;\n skills: string[] | null;\n fieldOfStudy: string | null;\n}\n\n/**\n * Skill item in summary credential data\n */\nexport interface SummaryCredentialSkill {\n title: string;\n description: string;\n}\n\n/**\n * Next step item in summary credential data\n *\n * `keywords` is optional. Omit it entirely (or pass `undefined`) when you do not\n * have taxonomy data — you no longer need to pass a struct of `null` fields.\n */\nexport interface SummaryCredentialNextStep {\n title: string;\n description: string;\n keywords?: SummaryCredentialKeyword;\n}\n\n/**\n * Reflection item in summary credential data\n */\nexport interface SummaryCredentialReflection {\n title: string;\n description: string;\n}\n\n/**\n * Summary data for an AI Session credential\n * Contains structured information about what was learned\n */\nexport interface SummaryCredentialData {\n /** Short, concise title for the learning session or credential */\n title: string;\n /** Comprehensive summary of what happened during the session */\n summary: string;\n /** Bullet points of key knowledge gained */\n learned: string[];\n /** Categorized skills learned during the session */\n skills: SummaryCredentialSkill[];\n /** Recommended follow-up activities or learning modules */\n nextSteps: SummaryCredentialNextStep[];\n /** Reflections on the learning experience */\n reflections: SummaryCredentialReflection[];\n}\n\n/**\n * Input for creating and sending an AI Session credential\n */\nexport interface SendAiSessionCredentialInput {\n /** Title of this specific AI session */\n sessionTitle: string;\n /** Structured summary data about what was learned */\n summaryData: SummaryCredentialData;\n /** Optional metadata for the session */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Response from sending an AI Session credential\n */\nexport interface SendAiSessionCredentialResponse {\n /** URI of the AI Topic (parent) boost */\n topicUri: string;\n /** URI of the topic credential, if a new topic was created */\n topicCredentialUri?: string;\n /** URI of the created AI Session credential */\n sessionCredentialUri: string;\n /** URI of the session boost (child of topic) */\n sessionBoostUri: string;\n /** Whether a new topic was created (true) or existing was used (false) */\n isNewTopic: boolean;\n}\n\n/**\n * Input for sending a notification to the current user from this app.\n * The notification appears in the user's LearnCard notification inbox.\n */\nexport interface AppNotificationInput {\n /** Notification title */\n title?: string;\n\n /** Notification body text */\n body?: string;\n\n /** Deep link path within the app (e.g. '/prizes') */\n actionPath?: string;\n\n /** Grouping category (e.g. 'reward', 'announcement', 'status') */\n category?: string;\n\n /** Notification priority */\n priority?: 'normal' | 'high';\n}\n\n/**\n * Response from sendNotification\n */\nexport interface AppNotificationResponse {\n sent: boolean;\n}\n\n/**\n * Response from incrementCounter\n */\nexport interface IncrementCounterResponse {\n key: string;\n previousValue: number;\n newValue: number;\n}\n\n/**\n * Response from getCounter\n */\nexport interface GetCounterResponse {\n key: string;\n value: number;\n updatedAt: string | null;\n}\n\n/**\n * Response from getCounters\n */\nexport interface GetCountersResponse {\n counters: GetCounterResponse[];\n}\n\n/**\n * Error codes that can be returned by the LearnCard host\n */\nexport type ErrorCode =\n | 'LC_TIMEOUT'\n | 'LC_NOT_EMBEDDED'\n | 'LC_UNAUTHENTICATED'\n | 'CREDENTIAL_NOT_FOUND'\n | 'USER_REJECTED'\n | 'UNAUTHORIZED'\n | 'TEMPLATE_INVALID'\n | 'TEMPLATE_DATA_INVALID'\n | 'TEMPLATE_NOT_FOUND'\n | 'BOOST_NOT_FOUND'\n | 'INSUFFICIENT_PERMISSIONS'\n | string;\n\n/**\n * Error object returned when a request fails.\n *\n * Historically the SDK rejected with a plain `{ code, message }` object. As of\n * v0.3.0 we reject with a {@link PartnerConnectError} instance instead, which\n * still satisfies this interface (it has both `code` and `message` fields), so\n * existing consumers that do `if (err.code === '...')` continue to work\n * unchanged.\n */\nexport interface LearnCardError {\n code: ErrorCode;\n message: string;\n}\n\n/**\n * Typed error class for all Partner Connect SDK rejections.\n *\n * Use `instanceof PartnerConnectError` to narrow caught errors and unlock\n * exhaustive `switch` checks on `code`. Both `code` and `message` are present\n * (so the legacy `LearnCardError` object shape is preserved), and `name` is\n * always `'PartnerConnectError'`.\n *\n * @example\n * ```typescript\n * try {\n * await learnCard.requestLearnerContext();\n * } catch (err) {\n * if (err instanceof PartnerConnectError) {\n * switch (err.code) {\n * case 'LC_UNAUTHENTICATED': showLogin(); break;\n * case 'USER_REJECTED': showPrivacyNotice(); break;\n * case 'UNAUTHORIZED': showPermissionsError(); break;\n * default: console.error(err);\n * }\n * }\n * }\n * ```\n */\nexport class PartnerConnectError extends Error implements LearnCardError {\n public readonly code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = 'PartnerConnectError';\n this.code = code;\n\n // Restore prototype chain when transpiled to ES5 targets.\n Object.setPrototypeOf(this, PartnerConnectError.prototype);\n }\n\n /**\n * Wrap any incoming `LearnCardError`-shaped value into a `PartnerConnectError`.\n * Returns the value unchanged if it is already an instance.\n *\n * Used internally at every reject site so callers always receive a typed\n * `PartnerConnectError`, regardless of whether the failure originated from\n * the host (over postMessage), an SDK timeout, or `destroy()`.\n */\n public static from(input: LearnCardError | unknown): PartnerConnectError {\n if (input instanceof PartnerConnectError) return input;\n\n if (\n input &&\n typeof input === 'object' &&\n 'code' in input &&\n typeof (input as { code: unknown }).code === 'string'\n ) {\n const candidate = input as { code: string; message?: unknown };\n const message =\n typeof candidate.message === 'string'\n ? candidate.message\n : 'Partner Connect request failed';\n return new PartnerConnectError(candidate.code as ErrorCode, message);\n }\n\n return new PartnerConnectError(\n 'UNKNOWN_ERROR',\n input instanceof Error ? input.message : 'An unknown error occurred'\n );\n }\n}\n\n/**\n * Internal message structure sent via postMessage\n */\nexport interface PostMessageRequest {\n protocol: string;\n action: string;\n requestId: string;\n payload?: unknown;\n}\n\n/**\n * Internal message structure received via postMessage\n */\nexport interface PostMessageResponse {\n protocol: string;\n requestId: string;\n type: 'SUCCESS' | 'ERROR';\n data?: unknown;\n error?: LearnCardError;\n}\n\n/**\n * Pending request tracking structure\n */\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: LearnCardError) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n}\n","/**\n * Standalone mock host for the Partner Connect SDK.\n *\n * When the SDK is not embedded in a real LearnCard host there is nothing to\n * answer its `postMessage` requests. `MockHost` locally simulates the host so\n * partner apps are fully buildable, demo-able, and testable in isolation. It\n * intercepts the SDK's single `sendMessage(action, payload)` chokepoint and\n * returns responses that match the shapes the real host produces.\n *\n * This module is browser-oriented but SSR-safe: it never touches `document` at\n * import time and degrades to log-only behavior when the DOM is unavailable.\n */\n\nimport {\n canonicalConsentScopeString,\n canonicalJsonString,\n compileInlineTemplate,\n encodeManifestForUrl,\n needsConsentSetup,\n normalizeConsentRequest,\n renderCompiledTemplate,\n validateInlineTemplate,\n validateTemplateData,\n} from '@learncard/partner-connect-core';\nimport type {\n CapturedAppManifest,\n CapturedConsentRecord,\n CapturedTemplateRecord,\n ConsentRequest,\n InlineCredentialTemplate,\n MockHostOptions,\n} from './types';\nimport { PartnerConnectError } from './types';\n\nconst DEFAULT_DID = 'did:web:mock.learncard.app:user';\nconst DEFAULT_NAMESPACE = 'lc-mock';\nconst DEFAULT_PUBLISH_ORIGIN = 'https://learncard.app';\nconst MOCK_PREFIX = '[LearnCard SDK · MOCK]';\nconst PUBLISH_DISMISS_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * SDK-supplied context that is deliberately not part of the public\n * {@link MockHostOptions} surface.\n */\nexport interface MockHostContext {\n /**\n * Whether the publish origin was chosen deliberately (an explicit\n * `mockOptions.publishOrigin`, or an active override) rather than\n * inferred. Suppresses the \"point me at a local LearnCard\" HUD hint.\n */\n publishOriginPinned?: boolean;\n}\n\ninterface ResolvedMockOptions {\n ui: boolean;\n log: boolean;\n persist: boolean;\n namespace: string;\n appId?: string;\n publishPrompt: boolean;\n publishOrigin: string;\n}\n\ninterface StoredCounter {\n value: number;\n updatedAt: string;\n}\n\ntype StoredManifestMap = Record<string, CapturedAppManifest>;\n\ntype StoredPublishDismissedAtMap = Record<string, string>;\n\ntype StoredHudCollapsedMap = Record<string, string>;\n\ntype MockStatus = 'pending' | 'claimed' | 'revoked';\n\ninterface MockCredential {\n credentialUri: string;\n boostUri?: string;\n templateAlias?: string;\n name: string;\n recipient: string;\n status: MockStatus;\n sentDate: string;\n claimedDate?: string;\n receivedDate?: string;\n credential: unknown;\n}\n\ninterface InlineTemplateSessionState {\n canonicalTemplate: string;\n version: number;\n}\n\ninterface TemplateQuery {\n templateAlias?: unknown;\n boostUri?: unknown;\n}\n\ntype ToastTone = 'default' | 'positive' | 'publish' | 'warning';\n\n/** A toast body is a list of plain strings and bold (`{ b }`) segments. */\ntype ToastSegment = string | { b: string };\n\n/**\n * Line glyphs drawn on a 24×24 grid with `stroke=\"currentColor\"`, so they\n * inherit color and render identically everywhere (unlike emoji).\n */\nconst ICON_PATHS = {\n user: '<circle cx=\"12\" cy=\"8\" r=\"4\"/><path d=\"M4 21c0-4 3.6-6.5 8-6.5s8 2.5 8 6.5\"/>',\n award: '<circle cx=\"12\" cy=\"9\" r=\"6\"/><path d=\"M8.6 14 7 22l5-3 5 3-1.6-8\"/>',\n shield: '<path d=\"M12 3 5 6v6c0 4.4 3 7.6 7 9 4-1.4 7-4.6 7-9V6z\"/><path d=\"m9 12 2 2 4-4\"/>',\n open: '<path d=\"M7 17 17 7\"/><path d=\"M8 7h9v9\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5\"/>',\n send: '<path d=\"M21 3 10 14\"/><path d=\"M21 3 14.5 21l-4.5-7-7-4.5z\"/>',\n sparkles:\n '<path d=\"M12 3.5 13.9 9l5.6 2-5.6 2L12 18.5 10.1 13l-5.6-2 5.6-2z\"/><path d=\"M19 3v4M17 5h4\"/>',\n sync: '<path d=\"M20 12a8 8 0 0 1-14.3 4.9M4 12a8 8 0 0 1 14.3-4.9\"/><path d=\"M18.5 3v4h-4M5.5 21v-4h4\"/>',\n bell: '<path d=\"M6 9a6 6 0 1 1 12 0c0 6.5 2.5 8.5 2.5 8.5h-17S6 15.5 6 9\"/><path d=\"M10.3 20.5a2 2 0 0 0 3.4 0\"/>',\n hash: '<path d=\"M4 9h16M4 15h16M10 3 8 21M16 3l-2 18\"/>',\n users: '<circle cx=\"9\" cy=\"8\" r=\"3.5\"/><path d=\"M2.5 20c0-3.5 2.9-6 6.5-6s6.5 2.5 6.5 6\"/><path d=\"M16 4.5a3.5 3.5 0 0 1 0 7M21.5 20c0-2.8-1.6-4.9-4-5.7\"/>',\n publish: '<path d=\"M12 19V5\"/><path d=\"m5 12 7-7 7 7\"/>',\n mark: '<rect x=\"3\" y=\"5.5\" width=\"18\" height=\"13\" rx=\"3\"/><path d=\"M7 10h6M7 14h4\"/>',\n copy: '<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2.5\"/><path d=\"M5 15V6.5A2.5 2.5 0 0 1 7.5 4H15\"/>',\n check: '<path d=\"m5 12.5 4.5 4.5L19 7.5\"/>',\n close: '<path d=\"M17 7 7 17M7 7l10 10\"/>',\n chevronDown: '<path d=\"m6 9 6 6 6-6\"/>',\n} as const;\n\ntype IconName = keyof typeof ICON_PATHS;\n\ninterface ToastSpec {\n icon: IconName;\n segments: ToastSegment[];\n title?: string;\n tone?: ToastTone;\n ttl?: number;\n dismissible?: boolean;\n persistent?: boolean;\n action?: {\n label: string;\n href: string;\n };\n}\n\ninterface ActiveToast {\n node: HTMLElement;\n timeoutId: ReturnType<typeof setTimeout> | null;\n count: number;\n countEl: HTMLElement;\n ttl: number;\n persistent: boolean;\n}\n\ninterface HudFeature {\n icon: IconName;\n label: string;\n detail?: string;\n needsSetup?: boolean;\n}\n\nconst MAX_VISIBLE_TOASTS = 3;\n\nconst PERMISSION_FEATURES: Record<string, { icon: IconName; label: string }> = {\n request_identity: { icon: 'user', label: 'Sign in with LearnCard' },\n send_credential: { icon: 'award', label: 'Award credentials' },\n template_issuance: { icon: 'send', label: 'Send from your templates' },\n request_consent: { icon: 'shield', label: 'Ask for permission' },\n credential_search: { icon: 'search', label: 'Ask learners to share credentials' },\n credential_by_id: { icon: 'search', label: 'Request a specific credential' },\n launch_feature: { icon: 'open', label: 'Open LearnCard screens' },\n};\n\n/**\n * Practice-mode chrome is injected into arbitrary partner pages, so every rule\n * is scoped under `.lc-mock-stack` / `.lc-mock-hud` and resets the properties\n * host CSS most often overrides (button/link/list defaults, box-sizing).\n */\nconst MOCK_STYLES = `\n@keyframes lc-mock-in { from { opacity: 0; transform: translateY(14px) scale(0.96); filter: blur(6px); } to { opacity: 1; transform: none; filter: none; } }\n@keyframes lc-mock-in-top { from { opacity: 0; transform: translateY(-14px) scale(0.96); filter: blur(6px); } to { opacity: 1; transform: none; filter: none; } }\n@keyframes lc-mock-out { to { opacity: 0; transform: scale(0.94); filter: blur(4px); } }\n@keyframes lc-mock-pop { from { opacity: 0; transform: translateY(10px) scale(0.94); } to { opacity: 1; transform: none; } }\n@keyframes lc-mock-bump { 40% { transform: scale(1.18); } }\n@keyframes lc-mock-pulse { 0% { box-shadow: 0 0 0 0 rgba(16,185,129,0.5); } 70%, 100% { box-shadow: 0 0 0 6px rgba(16,185,129,0); } }\n\n.lc-mock-stack, .lc-mock-hud {\n --lc-glass: rgba(255,255,255,0.72);\n --lc-glass-solid: rgba(251,251,252,0.97);\n --lc-group: rgba(255,255,255,0.66);\n --lc-edge: rgba(255,255,255,0.7);\n --lc-hairline: rgba(24,34,78,0.08);\n --lc-fill: rgba(24,34,78,0.06);\n --lc-fill-hover: rgba(24,34,78,0.1);\n --lc-ink: #18224E;\n --lc-ink-2: #52597A;\n --lc-ink-3: #8B91A7;\n --lc-solid: #18224E;\n --lc-on-solid: #FFFFFF;\n --lc-shadow: 0 0 0 0.5px rgba(24,34,78,0.1), 0 2px 8px rgba(24,34,78,0.06), 0 24px 56px -16px rgba(24,34,78,0.32);\n font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 13px; line-height: 1.4; letter-spacing: -0.006em; text-align: left;\n color: var(--lc-ink); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;\n position: fixed; z-index: 2147483647;\n}\n@media (prefers-color-scheme: dark) {\n .lc-mock-stack, .lc-mock-hud {\n --lc-glass: rgba(30,37,68,0.62);\n --lc-glass-solid: rgba(30,37,68,0.97);\n --lc-group: rgba(255,255,255,0.06);\n --lc-edge: rgba(255,255,255,0.14);\n --lc-hairline: rgba(255,255,255,0.08);\n --lc-fill: rgba(255,255,255,0.1);\n --lc-fill-hover: rgba(255,255,255,0.16);\n --lc-ink: #FBFBFC;\n --lc-ink-2: #C5C8D3;\n --lc-ink-3: #A8ACBD;\n --lc-solid: #FBFBFC;\n --lc-on-solid: #18224E;\n --lc-shadow: 0 0 0 0.5px rgba(0,0,0,0.4), 0 2px 8px rgba(0,0,0,0.2), 0 24px 56px -16px rgba(0,0,0,0.6);\n }\n}\n.lc-mock-stack *, .lc-mock-hud * { box-sizing: border-box; }\n.lc-mock-stack svg, .lc-mock-hud svg { display: block; flex: none; }\n.lc-mock-stack button, .lc-mock-hud button {\n font: inherit; color: inherit; margin: 0; text-transform: none; letter-spacing: inherit;\n -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent;\n}\n.lc-mock-stack a, .lc-mock-hud a { -webkit-tap-highlight-color: transparent; }\n.lc-mock-stack :focus-visible, .lc-mock-hud :focus-visible { outline: 2px solid #10B981; outline-offset: 2px; }\n\n.lc-mock-glass {\n background: var(--lc-glass);\n -webkit-backdrop-filter: saturate(180%) blur(28px); backdrop-filter: saturate(180%) blur(28px);\n border: 0.5px solid var(--lc-edge);\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.35), var(--lc-shadow);\n}\n@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {\n .lc-mock-glass { background: var(--lc-glass-solid); }\n}\n\n.lc-mock-dot {\n width: 7px; height: 7px; border-radius: 999px; background: #10B981; flex: none;\n animation: lc-mock-pulse 2.4s ease-out infinite;\n}\n\n/* Notices */\n.lc-mock-stack {\n bottom: max(20px, calc(env(safe-area-inset-bottom, 0px) + 12px));\n right: max(20px, calc(env(safe-area-inset-right, 0px) + 12px));\n width: min(360px, calc(100vw - 40px));\n display: flex; flex-direction: column; gap: 10px; pointer-events: none;\n}\n.lc-mock-toast {\n position: relative; pointer-events: auto; display: flex; align-items: flex-start; gap: 12px;\n width: 100%; padding: 12px 14px 13px 12px; border-radius: 22px;\n animation: lc-mock-in 460ms cubic-bezier(0.22, 1, 0.36, 1) backwards;\n transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n.lc-mock-toast:hover { transform: translateY(-2px); }\n.lc-mock-toast.lc-mock-out { animation: lc-mock-out 200ms cubic-bezier(0.4, 0, 1, 1) forwards; pointer-events: none; }\n.lc-mock-toast--hidden { display: none; }\n.lc-mock-toast--publish { order: -1; padding: 14px 14px 14px 12px; }\n.lc-mock-toast--dismissible .lc-mock-content { padding-right: 22px; }\n\n.lc-mock-tile {\n width: 34px; height: 34px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex: none;\n color: #FFFFFF; background: linear-gradient(180deg, #353E64 0%, #18224E 100%);\n box-shadow: inset 0 0 0 0.5px rgba(255,255,255,0.18), 0 1px 2px rgba(24,34,78,0.24);\n}\n.lc-mock-tile svg { width: 18px; height: 18px; }\n.lc-mock-toast--positive .lc-mock-tile { background: linear-gradient(180deg, #34D399 0%, #059669 100%); }\n.lc-mock-toast--warning .lc-mock-tile { background: linear-gradient(180deg, #FBBF24 0%, #D97706 100%); }\n.lc-mock-hud-row-detail.is-setup { color: #B45309; font-weight: 500; }\n.lc-mock-hud-setup-dot { width: 8px; height: 8px; margin: 0 4px; border-radius: 999px; background: #F59E0B; flex: none; }\n\n.lc-mock-content { flex: 1; min-width: 0; }\n.lc-mock-meta { display: flex; align-items: center; gap: 6px; margin-bottom: 2px; font-size: 11.5px; font-weight: 600; color: var(--lc-ink-3); }\n.lc-mock-chip { padding: 1px 7px; border-radius: 999px; background: var(--lc-fill); color: var(--lc-ink-2); font-size: 10.5px; font-weight: 600; }\n.lc-mock-count {\n margin-left: auto; min-width: 22px; padding: 1px 7px; border-radius: 999px; text-align: center;\n background: var(--lc-solid); color: var(--lc-on-solid); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n.lc-mock-bump { animation: lc-mock-bump 260ms ease-out; }\n.lc-mock-title { font-size: 14.5px; font-weight: 600; letter-spacing: -0.012em; margin: 1px 0 2px; }\n.lc-mock-body { font-size: 13.5px; line-height: 1.42; color: var(--lc-ink); overflow-wrap: anywhere; white-space: pre-line; }\n.lc-mock-body strong { font-weight: 600; }\n.lc-mock-toast--publish .lc-mock-body { color: var(--lc-ink-2); }\n\n.lc-mock-action {\n display: inline-flex; align-items: center; gap: 6px; margin-top: 11px; padding: 9px 15px; border-radius: 999px;\n background: var(--lc-solid); color: var(--lc-on-solid) !important; text-decoration: none !important;\n font-size: 13px; font-weight: 600; line-height: 1;\n transition: transform 160ms ease, opacity 160ms ease;\n}\n.lc-mock-action svg { width: 14px; height: 14px; }\n.lc-mock-action:hover { opacity: 0.9; }\n.lc-mock-action:active { transform: scale(0.97); }\n\n.lc-mock-close {\n position: absolute; top: 10px; right: 10px; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 999px;\n display: flex; align-items: center; justify-content: center; cursor: pointer;\n background: var(--lc-fill); color: var(--lc-ink-2); transition: background 160ms ease, color 160ms ease;\n}\n.lc-mock-close svg { width: 13px; height: 13px; }\n.lc-mock-close:hover { background: var(--lc-fill-hover); color: var(--lc-ink); }\n\n/* Practice panel */\n.lc-mock-hud {\n left: max(20px, calc(env(safe-area-inset-left, 0px) + 12px));\n bottom: max(20px, calc(env(safe-area-inset-bottom, 0px) + 12px));\n}\n.lc-mock-hud.lc-mock-animate > * { animation: lc-mock-pop 380ms cubic-bezier(0.22, 1, 0.36, 1) backwards; transform-origin: bottom left; }\n\n.lc-mock-hud-pill {\n display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 8px 0 6px; border-radius: 999px;\n cursor: pointer; font-size: 13px; font-weight: 600; color: var(--lc-ink);\n transition: transform 240ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n.lc-mock-hud-pill:hover { transform: translateY(-2px); }\n.lc-mock-hud-pill:active { transform: scale(0.97); }\n.lc-mock-hud-pill .lc-mock-dot { margin-left: 2px; }\n.lc-mock-hud-mark {\n width: 28px; height: 28px; border-radius: 999px; display: flex; align-items: center; justify-content: center; flex: none;\n color: #FFFFFF; background: linear-gradient(180deg, #353E64 0%, #18224E 100%);\n box-shadow: inset 0 0 0 0.5px rgba(255,255,255,0.18);\n}\n.lc-mock-hud-mark svg { width: 15px; height: 15px; }\n.lc-mock-hud-mark--lg { width: 36px; height: 36px; border-radius: 11px; }\n.lc-mock-hud-mark--lg svg { width: 19px; height: 19px; }\n.lc-mock-hud-badge {\n min-width: 24px; height: 24px; padding: 0 7px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center;\n background: var(--lc-fill); color: var(--lc-ink-2); font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums;\n}\n\n.lc-mock-hud-card {\n width: min(328px, calc(100vw - 40px)); max-height: calc(100vh - 40px); overflow: auto;\n border-radius: 26px; padding: 8px 8px 10px; overscroll-behavior: contain;\n}\n.lc-mock-hud-header { display: flex; align-items: center; gap: 11px; padding: 6px 4px 12px 6px; }\n.lc-mock-hud-heading { flex: 1; min-width: 0; }\n.lc-mock-hud-title { display: flex; align-items: center; gap: 7px; font-size: 15px; font-weight: 600; letter-spacing: -0.014em; }\n.lc-mock-hud-subtitle { font-size: 12px; color: var(--lc-ink-3); margin-top: 1px; }\n.lc-mock-hud-minimize {\n width: 30px; height: 30px; padding: 0; border: 0; border-radius: 999px; flex: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: var(--lc-fill); color: var(--lc-ink-2); transition: background 160ms ease, color 160ms ease;\n}\n.lc-mock-hud-minimize svg { width: 16px; height: 16px; }\n.lc-mock-hud-minimize:hover { background: var(--lc-fill-hover); color: var(--lc-ink); }\n\n.lc-mock-hud-group { background: var(--lc-group); border: 0.5px solid var(--lc-hairline); border-radius: 18px; }\n.lc-mock-hud-app { display: flex; align-items: center; gap: 11px; padding: 10px 12px; }\n.lc-mock-hud-avatar {\n width: 36px; height: 36px; border-radius: 10px; flex: none; overflow: hidden;\n display: flex; align-items: center; justify-content: center;\n background: var(--lc-fill); color: var(--lc-ink-2); font-size: 15px; font-weight: 600;\n}\n.lc-mock-hud-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }\n.lc-mock-hud-app-name { font-size: 14px; font-weight: 600; letter-spacing: -0.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n\n.lc-mock-hud-section {\n padding: 14px 12px 6px; font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--lc-ink-3);\n}\n.lc-mock-hud-list { list-style: none; margin: 0; padding: 0; max-height: min(40vh, 320px); overflow: auto; }\n.lc-mock-hud-row { position: relative; display: flex; align-items: center; gap: 11px; padding: 9px 12px; margin: 0; }\n.lc-mock-hud-row + .lc-mock-hud-row::before {\n content: ''; position: absolute; top: 0; left: 50px; right: 0; height: 0.5px; background: var(--lc-hairline);\n}\n.lc-mock-hud-glyph {\n width: 28px; height: 28px; border-radius: 8px; flex: none; display: flex; align-items: center; justify-content: center;\n background: var(--lc-fill); color: var(--lc-ink);\n}\n.lc-mock-hud-glyph svg { width: 15px; height: 15px; }\n.lc-mock-hud-row-text { flex: 1; min-width: 0; }\n.lc-mock-hud-row-label { font-size: 13px; font-weight: 500; }\n.lc-mock-hud-row-detail { font-size: 12px; color: var(--lc-ink-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 1px; }\n.lc-mock-hud-check { color: #10B981; flex: none; }\n.lc-mock-hud-check svg { width: 16px; height: 16px; stroke-width: 2.4; }\n.lc-mock-hud-empty { padding: 14px; font-size: 13px; color: var(--lc-ink-3); line-height: 1.45; }\n\n.lc-mock-hud-footer { display: flex; gap: 8px; padding: 12px 2px 0; }\n.lc-mock-hud-publish {\n flex: 1; height: 42px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; gap: 7px;\n background: var(--lc-solid); color: var(--lc-on-solid) !important; text-decoration: none !important;\n font-size: 14px; font-weight: 600; transition: transform 160ms ease, opacity 160ms ease;\n}\n.lc-mock-hud-publish svg { width: 15px; height: 15px; }\n.lc-mock-hud-publish:hover { opacity: 0.9; }\n.lc-mock-hud-publish:active { transform: scale(0.98); }\n.lc-mock-hud-copy {\n width: 42px; height: 42px; padding: 0; border: 0; border-radius: 999px; flex: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: var(--lc-fill); color: var(--lc-ink); transition: background 160ms ease, color 160ms ease, transform 160ms ease;\n}\n.lc-mock-hud-copy svg { width: 17px; height: 17px; }\n.lc-mock-hud-copy:hover { background: var(--lc-fill-hover); }\n.lc-mock-hud-copy:active { transform: scale(0.94); }\n.lc-mock-hud-copy.is-copied { background: rgba(16,185,129,0.14); color: #059669; }\n.lc-mock-hud .lc-mock-hud-reset { display: block; margin: 10px auto 0; border: 0; background: transparent; color: var(--lc-ink-3); font-size: 12px; cursor: pointer; }\n.lc-mock-hud .lc-mock-hud-reset:hover { color: var(--lc-ink); }\n.lc-mock-hud .lc-mock-hud-confirm { padding: 12px 8px; color: var(--lc-ink); }\n.lc-mock-hud .lc-mock-hud-confirm p { color: var(--lc-ink-3); font-size: 13px; line-height: 1.5; }\n.lc-mock-hud .lc-mock-hud-confirm-actions { display: flex; gap: 8px; margin-top: 16px; }\n.lc-mock-hud .lc-mock-hud-confirm button { border-radius: 999px; padding: 10px 16px; border: 1px solid var(--lc-ink-3); background: transparent; color: var(--lc-ink); cursor: pointer; }\n.lc-mock-hud .lc-mock-hud-confirm .lc-mock-hud-reset-confirm { background: #DC2626; color: white; border-color: #DC2626; }\n.lc-mock-hud-publish-hint { padding: 10px 8px 0; font-size: 11.5px; line-height: 1.45; color: var(--lc-ink-3); overflow-wrap: anywhere; }\n.lc-mock-hud-publish-hint code {\n display: inline-block; max-width: 100%; margin-top: 3px; word-break: break-all;\n font-family: ui-monospace, 'SF Mono', Menlo, monospace; font-size: 11px; padding: 1px 5px; border-radius: 6px;\n background: var(--lc-fill); color: var(--lc-ink-2);\n}\n\n@media (max-width: 640px) {\n .lc-mock-stack {\n top: max(12px, calc(env(safe-area-inset-top, 0px) + 8px)); bottom: auto; left: 12px; right: 12px; width: auto;\n flex-direction: column-reverse;\n }\n .lc-mock-toast { animation-name: lc-mock-in-top; }\n .lc-mock-toast--older { display: none; }\n .lc-mock-hud { left: 12px; bottom: max(12px, calc(env(safe-area-inset-bottom, 0px) + 8px)); }\n .lc-mock-hud-card { width: calc(100vw - 24px); }\n}\n@media (prefers-reduced-motion: reduce) {\n .lc-mock-stack *, .lc-mock-hud *, .lc-mock-hud.lc-mock-animate > * { animation: none !important; transition: none !important; }\n}\n`.trim();\n\nconst hasDocument = (): boolean =>\n typeof document !== 'undefined' && typeof document.createElement === 'function';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Builds an inline SVG glyph. Paths are static constants, never user input. */\nconst createIcon = (name: IconName): SVGSVGElement => {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '1.9');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n svg.setAttribute('aria-hidden', 'true');\n svg.innerHTML = ICON_PATHS[name];\n return svg;\n};\n\nconst createEl = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n text?: string\n): HTMLElementTagNameMap[K] => {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (text !== undefined) el.textContent = text;\n return el;\n};\n\nconst plural = (count: number, noun: string): string => `${count} ${noun}${count === 1 ? '' : 's'}`;\n\nconst readablePath = (path: string): string => path.split(/[?#]/)[0] || path;\n\nconst readHost = (url: string | undefined): string => {\n if (!url) return '';\n try {\n return new URL(url).host;\n } catch {\n return '';\n }\n};\n\nconst readableTemplateName = (record: CapturedTemplateRecord): string => {\n const template = record.template as { name?: unknown } | undefined;\n const name = template?.name;\n return typeof name === 'string' && name.trim() && !name.includes('{{')\n ? name.trim()\n : record.alias;\n};\n\nconst MAX_APP_FINGERPRINT_LENGTH = 64;\n\nconst slugifyAppFingerprint = (value: string | undefined): string => {\n if (!value) return 'default';\n\n const slug = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, MAX_APP_FINGERPRINT_LENGTH)\n .replace(/-$/g, '');\n\n return slug || 'default';\n};\n\nconst readAchievementName = (payload: unknown): string => {\n if (!payload || typeof payload !== 'object') return 'a credential';\n\n const record = payload as Record<string, unknown>;\n\n // Template-based issuance (APP_EVENT / send-credential).\n if (typeof record.templateAlias === 'string' && record.templateAlias) {\n const data = record.templateData;\n if (data && typeof data === 'object') {\n const fields = data as Record<string, unknown>;\n const named =\n fields.name ?? fields.achievementName ?? fields.courseName ?? fields.title;\n if (typeof named === 'string' && named) return named;\n }\n return record.templateAlias;\n }\n\n // Raw verifiable credential.\n const credential = (record.credential ?? record) as Record<string, unknown>;\n if (credential && typeof credential === 'object') {\n const subject = credential.credentialSubject as Record<string, unknown> | undefined;\n const achievement = subject?.achievement as Record<string, unknown> | undefined;\n if (achievement && typeof achievement.name === 'string' && achievement.name) {\n return achievement.name;\n }\n if (typeof credential.name === 'string' && credential.name) return credential.name;\n }\n\n return 'a credential';\n};\n\nconst readRenderedCredentialName = (credential: Record<string, unknown>): string => {\n if (typeof credential.name === 'string' && credential.name) return credential.name;\n\n const subject = credential.credentialSubject;\n if (subject && typeof subject === 'object' && !Array.isArray(subject)) {\n const achievement = (subject as Record<string, unknown>).achievement;\n if (achievement && typeof achievement === 'object' && !Array.isArray(achievement)) {\n const name = (achievement as Record<string, unknown>).name;\n if (typeof name === 'string' && name) return name;\n }\n }\n\n return 'a credential';\n};\n\nconst buildConsentScopeToastSegments = (payload: unknown): ToastSegment[] => {\n const scopes = (payload as { scopes?: unknown } | undefined)?.scopes;\n\n if (!scopes || typeof scopes !== 'object' || Array.isArray(scopes)) {\n return [\n 'In LearnCard, the learner would review this request. Approved automatically here.',\n ];\n }\n\n const normalized = normalizeConsentRequest(scopes as ConsentRequest);\n const readCategories = normalized.read.credentialCategories;\n const personalFields = normalized.read.personalFields;\n const writeCategories = normalized.write.credentialCategories;\n const asks: ToastSegment[][] = [];\n\n if (readCategories.length > 0) {\n asks.push(['see their ', { b: readCategories.join(', ') }, ' credentials']);\n }\n\n if (personalFields.length > 0) {\n asks.push(['see their ', { b: personalFields.join(', ') }]);\n }\n\n if (writeCategories.length > 0) {\n asks.push(['add ', { b: writeCategories.join(', ') }, ' credentials']);\n }\n\n if (asks.length === 0) {\n return ['The learner would be asked for permission. Approved automatically here.'];\n }\n\n const parts: ToastSegment[] = ['The learner would be asked to let your app '];\n asks.forEach((ask, index) => {\n if (index > 0) parts.push(index === asks.length - 1 ? ' and ' : ', ');\n parts.push(...ask);\n });\n parts.push('. Approved automatically here.');\n\n return parts;\n};\n\n/**\n * Simulates the LearnCard host for a single {@link PartnerConnect} instance.\n * All public methods route through `handle`, keeping the mock behind the same\n * `(action, payload)` contract the real host answers over `postMessage`.\n */\nexport class MockHost {\n private readonly options: ResolvedMockOptions;\n\n private readonly context: MockHostContext;\n\n /** In-memory counter fallback used when persistence is off/unavailable. */\n private readonly memoryCounters = new Map<string, StoredCounter>();\n\n private readonly memoryManifests: StoredManifestMap = {};\n\n private readonly memoryPublishDismissedAt: StoredPublishDismissedAtMap = {};\n\n private readonly memoryHudCollapsed: StoredHudCollapsedMap = {};\n\n private initialDocumentTitle: string | null | undefined;\n private appFingerprint: string | undefined;\n private memoryAppKey: string | undefined;\n private iconSource: string | undefined;\n private iconGeneration = 0;\n private readonly iconCleanups = new Set<() => void>();\n private confirmingReset = false;\n\n /** Session-scoped credential store; reads reflect writes and seeds. */\n private readonly credentials: MockCredential[] = [];\n\n /** Session-scoped alias → inline template version state. */\n private readonly inlineTemplateVersions = new Map<string, InlineTemplateSessionState>();\n\n private readonly identity: { did: string; [key: string]: unknown };\n\n /** DOM nodes injected for visual feedback, tracked for cleanup. */\n private readonly domNodes = new Set<HTMLElement>();\n\n /** The app's single AI Topic, created lazily by the first AI session. */\n private aiTopic: { topicUri: string; topicCredentialUri: string } | null = null;\n\n private styleEl: HTMLStyleElement | null = null;\n private stackEl: HTMLElement | null = null;\n private hudEl: HTMLElement | null = null;\n private hudAnimateNext = true;\n private readonly activeToasts = new Map<string, ActiveToast>();\n /** Pending exit-animation timers, tracked so `destroy()` can cancel them. */\n private readonly exitTimers = new Set<ReturnType<typeof setTimeout>>();\n private idSeq = 0;\n private destroyed = false;\n private publishPromptShown = false;\n\n constructor(options?: MockHostOptions, context?: MockHostContext) {\n this.context = { ...context };\n this.options = {\n ui: options?.ui ?? true,\n log: options?.log ?? true,\n persist: options?.persist ?? true,\n namespace: options?.namespace || DEFAULT_NAMESPACE,\n appId: options?.appId,\n publishPrompt: options?.publishPrompt ?? true,\n publishOrigin: options?.publishOrigin || DEFAULT_PUBLISH_ORIGIN,\n };\n\n this.identity = {\n ...(options?.identity ?? {}),\n did: options?.identity?.did || options?.did || DEFAULT_DID,\n };\n\n for (const seed of options?.credentials ?? []) {\n this.addCredential({\n name: seed.name || seed.templateAlias || 'Mock Credential',\n templateAlias: seed.templateAlias,\n boostUri: seed.boostUri,\n recipient: seed.recipient,\n status: seed.status,\n });\n }\n\n for (const [key, value] of Object.entries(options?.counters ?? {})) {\n if (this.readCounter(key) === undefined) this.writeCounter(key, value);\n }\n\n this.announce();\n }\n\n /**\n * Resolve a simulated response for one SDK request. Mirrors the real host:\n * direct actions map 1:1, and `APP_EVENT` is dispatched by its `type`.\n */\n public handle(action: string, payload?: unknown): Promise<unknown> {\n if (this.destroyed) {\n return Promise.reject(\n new PartnerConnectError(\n 'SDK_DESTROYED',\n 'Mock host was destroyed before the request completed'\n )\n );\n }\n\n this.log(action, payload);\n\n if (action === 'APP_EVENT') {\n return this.handleAppEvent(payload as Record<string, unknown>);\n }\n\n const response = (() => {\n switch (action) {\n case 'REQUEST_IDENTITY':\n this.toast({\n icon: 'user',\n segments: [\n 'In LearnCard, the learner would sign in. Using a practice profile for now.',\n ],\n });\n return Promise.resolve({\n token: `mock-token-${Date.now()}`,\n user: { ...this.identity },\n });\n\n case 'SEND_CREDENTIAL': {\n const name = readAchievementName(payload);\n const credentialId = `mock-credential-${Date.now()}-${(this.idSeq += 1)}`;\n this.addCredential({\n name,\n credentialUri: credentialId,\n credential: (payload as { credential?: unknown } | undefined)?.credential,\n });\n this.showClaimToast(name);\n return Promise.resolve({ credentialId, stored: true });\n }\n\n case 'REQUEST_CONSENT': {\n const redirect = Boolean(\n (payload as { redirect?: boolean } | undefined)?.redirect\n );\n\n try {\n const scopes = (payload as { scopes?: unknown } | undefined)?.scopes;\n\n if (scopes !== undefined) {\n normalizeConsentRequest(scopes as ConsentRequest);\n }\n } catch (error) {\n return Promise.reject(\n new PartnerConnectError(\n 'CONSENT_SCOPES_INVALID',\n error instanceof Error ? error.message : 'Invalid consent scopes'\n )\n );\n }\n\n this.showConsentToast(payload, redirect);\n return Promise.resolve({ granted: true });\n }\n\n case 'LAUNCH_FEATURE': {\n const featurePath =\n (payload as { featurePath?: string } | undefined)?.featurePath ?? '';\n this.toast({\n icon: 'open',\n segments: featurePath\n ? [\n 'In LearnCard, this would open ',\n { b: readablePath(featurePath) },\n '.',\n ]\n : ['In LearnCard, this would open a feature screen.'],\n });\n return Promise.resolve({ launched: true, featurePath });\n }\n\n case 'ASK_CREDENTIAL_SEARCH': {\n const held = this.selfCredentials();\n this.toast({\n icon: 'search',\n segments: held.length\n ? [\n 'The learner could share ',\n { b: plural(held.length, 'credential') },\n '.',\n ]\n : [\n 'In LearnCard, the learner would choose credentials to share. None yet in practice.',\n ],\n });\n return Promise.resolve({\n verifiablePresentation: {\n verifiableCredential: held.map(c => c.credential),\n },\n });\n }\n\n case 'ASK_CREDENTIAL_SPECIFIC': {\n const credentialId = (payload as { credentialId?: string } | undefined)\n ?.credentialId;\n const found = this.credentials.find(c => c.credentialUri === credentialId);\n this.toast({\n icon: 'search',\n segments: found\n ? ['The learner would share ', { b: found.name }, '.']\n : [\n 'In LearnCard, the learner would be asked to share this credential. It isn’t in practice data yet.',\n ],\n });\n return Promise.resolve({ credential: found?.credential });\n }\n\n case 'INITIATE_TEMPLATE_ISSUE': {\n const input = payload as\n { templateId?: string; draftRecipients?: string[] } | undefined;\n const templateId = input?.templateId ?? '';\n const recipients = Array.isArray(input?.draftRecipients)\n ? (input?.draftRecipients as string[])\n : [];\n for (const recipient of recipients) {\n this.addCredential({\n name: templateId || 'Boost',\n boostUri: templateId,\n recipient,\n status: 'pending',\n });\n }\n this.toast({\n icon: 'send',\n segments: recipients.length\n ? [\n 'In LearnCard, this would send to ',\n { b: plural(recipients.length, 'person') },\n '.',\n ]\n : ['In LearnCard, this would open the send screen.'],\n });\n return Promise.resolve({ issued: true });\n }\n\n case 'REQUEST_LEARNER_CONTEXT': {\n const opts = (payload ?? {}) as {\n includeCredentials?: boolean;\n format?: string;\n };\n const includeCredentials = opts.includeCredentials !== false;\n const structured = opts.format === 'structured';\n const held = includeCredentials ? this.selfCredentials() : [];\n this.toast({\n icon: 'sparkles',\n segments: !includeCredentials\n ? [\n 'In LearnCard, the learner’s profile would load, without credentials.',\n ]\n : held.length\n ? [\n 'Learner profile loaded with ',\n { b: plural(held.length, 'credential') },\n '.',\n ]\n : [\n 'In LearnCard, the learner’s profile would load here. Empty in practice.',\n ],\n });\n const prompt = !includeCredentials\n ? 'Mock learner context: credentials were not requested.'\n : held.length\n ? `Mock learner context. Credentials held: ${held\n .map(c => c.name)\n .join(', ')}.`\n : 'Mock learner context: this user has no credentials in standalone mode.';\n return Promise.resolve({\n status: 'ready',\n prompt,\n did: this.identity.did,\n // Matches the real host: `raw` only ships for format: 'structured'.\n ...(structured\n ? { raw: { credentials: held.map(c => c.credential) } }\n : {}),\n });\n }\n\n case 'GET_SYNC_STATUS':\n this.toast({\n icon: 'sync',\n segments: [\n 'In LearnCard, this checks that the learner’s data is up to date. Ready in practice.',\n ],\n });\n return Promise.resolve({\n status: 'ready',\n progress: {\n totalCredentials: 0,\n completedCredentials: 0,\n failedCredentials: 0,\n retryCount: 0,\n },\n });\n\n default:\n this.toast({\n icon: 'sparkles',\n segments: ['In LearnCard, this would run ', { b: action }, '.'],\n });\n return Promise.resolve({});\n }\n })();\n\n return response.then(result => {\n this.captureHandledAction(action, payload);\n return result;\n });\n }\n\n /** Tear down injected UI and clear in-memory state. */\n public destroy(): void {\n this.destroyed = true;\n this.cancelIconCapture();\n\n for (const entry of this.activeToasts.values()) {\n if (entry.timeoutId) clearTimeout(entry.timeoutId);\n }\n this.activeToasts.clear();\n\n for (const timer of this.exitTimers) clearTimeout(timer);\n this.exitTimers.clear();\n\n for (const node of this.domNodes) node.remove();\n this.domNodes.clear();\n\n if (this.stackEl) {\n this.stackEl.remove();\n this.stackEl = null;\n }\n\n if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n this.memoryCounters.clear();\n for (const key of Object.keys(this.memoryManifests)) delete this.memoryManifests[key];\n for (const key of Object.keys(this.memoryPublishDismissedAt)) {\n delete this.memoryPublishDismissedAt[key];\n }\n for (const key of Object.keys(this.memoryHudCollapsed)) delete this.memoryHudCollapsed[key];\n this.credentials.length = 0;\n }\n\n public getCapturedManifest(): CapturedAppManifest | undefined {\n const manifest = this.loadManifest();\n return manifest ? this.cloneManifest(manifest) : undefined;\n }\n\n public getPublishOrigin(): string {\n return this.options.publishOrigin;\n }\n\n public resetPracticeMode(): void {\n if (this.destroyed) return;\n this.cancelIconCapture();\n const manifests = this.loadManifestMap();\n delete manifests[this.getAppFingerprint()];\n this.replaceMemoryManifestMap(manifests);\n if (this.options.persist) {\n try {\n localStorage.setItem(this.manifestStorageKey(), JSON.stringify(manifests));\n for (const key of [\n this.counterStorageKey(),\n this.publishDismissedStorageKey(),\n this.appKeyStorageKey(),\n ]) {\n localStorage.removeItem(key);\n }\n } catch {\n /* Storage may be unavailable. */\n }\n }\n this.memoryCounters.clear();\n this.memoryAppKey = undefined;\n delete this.memoryPublishDismissedAt[this.getAppFingerprint()];\n this.credentials.length = 0;\n this.inlineTemplateVersions.clear();\n this.aiTopic = null;\n this.publishPromptShown = false;\n this.confirmingReset = false;\n for (const [key, entry] of this.activeToasts) {\n if (entry.node.classList.contains('lc-mock-toast--publish')) this.dismissToast(key);\n }\n this.saveHudCollapsed(true);\n this.updateManifestHud();\n this.toast({ icon: 'sync', segments: ['Started fresh.'] });\n }\n\n private handleAppEvent(event: Record<string, unknown>): Promise<unknown> {\n const type = typeof event?.type === 'string' ? event.type : '';\n\n const response = (() => {\n switch (type) {\n case 'send-credential': {\n if (\n typeof event.alias === 'string' &&\n event.alias &&\n event.template &&\n typeof event.template === 'object'\n ) {\n const alias = event.alias;\n const template = event.template as InlineCredentialTemplate;\n const templateErrors = validateInlineTemplate(template);\n\n if (templateErrors.length > 0) {\n return Promise.reject(\n new PartnerConnectError(\n 'TEMPLATE_INVALID',\n templateErrors\n .map(error => `${error.path}: ${error.message}`)\n .join('\\n')\n )\n );\n }\n\n const compiled = compileInlineTemplate(template);\n const templateData =\n typeof event.templateData === 'object' && event.templateData !== null\n ? (event.templateData as Record<string, unknown>)\n : undefined;\n const dataErrors = validateTemplateData(\n compiled.variableManifest,\n templateData\n );\n\n if (dataErrors.length > 0) {\n return Promise.reject(\n new PartnerConnectError(\n 'TEMPLATE_DATA_INVALID',\n dataErrors\n .map(error => `${error.path}: ${error.message}`)\n .join('\\n')\n )\n );\n }\n\n const canonicalTemplate = canonicalJsonString(template);\n const previousState = this.inlineTemplateVersions.get(alias);\n const templateVersion = previousState\n ? previousState.canonicalTemplate === canonicalTemplate\n ? previousState.version\n : previousState.version + 1\n : 1;\n\n this.inlineTemplateVersions.set(alias, {\n canonicalTemplate,\n version: templateVersion,\n });\n\n const boostUri = `lc:mock:inline-boost:${alias}`;\n\n if (event.preventDuplicateClaim) {\n const existing = this.selfCredentials().find(c =>\n this.matchesTemplate(c, { templateAlias: alias, boostUri })\n );\n if (existing) {\n this.toast({\n icon: 'award',\n segments: [\n 'The learner already has ',\n { b: existing.name },\n '.',\n ],\n });\n return Promise.resolve({\n credentialUri: existing.credentialUri,\n boostUri: existing.boostUri ?? boostUri,\n alreadyClaimed: true,\n hasCredential: true,\n status: existing.status,\n receivedDate: existing.receivedDate,\n templateVersion,\n });\n }\n }\n\n const renderedCredential = renderCompiledTemplate(\n compiled.credentialTemplateJson,\n {\n ...(templateData ?? {}),\n issue_date: new Date().toISOString(),\n issuer_did: 'did:web:mock.learncard.app:app',\n recipient_did: this.identity.did,\n }\n );\n renderedCredential._mock = true;\n\n const renderedName = readRenderedCredentialName(renderedCredential);\n const record = this.addCredential({\n name: renderedName,\n templateAlias: alias,\n boostUri,\n status: 'claimed',\n credential: renderedCredential,\n });\n\n this.showClaimToast(renderedName, templateVersion);\n\n return Promise.resolve({\n credentialUri: record.credentialUri,\n boostUri: record.boostUri ?? boostUri,\n alreadyClaimed: false,\n hasCredential: true,\n status: 'claimed',\n receivedDate: record.receivedDate,\n templateVersion,\n });\n }\n\n const name = readAchievementName(event);\n const templateAlias =\n typeof event.templateAlias === 'string' ? event.templateAlias : undefined;\n const boostUri = `lc:mock:boost:${String(event.templateAlias ?? 'template')}`;\n\n if (event.preventDuplicateClaim) {\n const existing = this.selfCredentials().find(c =>\n this.matchesTemplate(c, { templateAlias, boostUri })\n );\n if (existing) {\n this.toast({\n icon: 'award',\n segments: ['The learner already has ', { b: existing.name }, '.'],\n });\n return Promise.resolve({\n credentialUri: existing.credentialUri,\n boostUri: existing.boostUri ?? boostUri,\n alreadyClaimed: true,\n hasCredential: true,\n status: existing.status,\n receivedDate: existing.receivedDate,\n });\n }\n }\n\n const record = this.addCredential({\n name,\n templateAlias,\n boostUri,\n status: 'claimed',\n });\n this.showClaimToast(name);\n return Promise.resolve({\n credentialUri: record.credentialUri,\n boostUri: record.boostUri ?? boostUri,\n alreadyClaimed: false,\n hasCredential: true,\n status: 'claimed',\n receivedDate: record.receivedDate,\n });\n }\n\n case 'check-credential': {\n const held = this.selfCredentials().find(c => this.matchesTemplate(c, event));\n this.toast({\n icon: 'search',\n segments: held\n ? ['The learner already has ', { b: held.name }, '.']\n : ['The learner doesn’t have this credential yet.'],\n });\n return Promise.resolve(\n held\n ? {\n hasCredential: true,\n credentialUri: held.credentialUri,\n receivedDate: held.receivedDate,\n status: held.status,\n }\n : { hasCredential: false }\n );\n }\n\n case 'check-issuance-status': {\n const recipient = typeof event.recipient === 'string' ? event.recipient : '';\n const match = this.credentials.find(\n c => this.matchesTemplate(c, event) && c.recipient === recipient\n );\n this.toast({\n icon: 'send',\n segments: match\n ? ['Sent to ', { b: recipient }, ' — ', { b: match.status }, '.']\n : ['Not sent to this person yet.'],\n });\n return Promise.resolve(\n match\n ? {\n sent: true,\n credentialUri: match.credentialUri,\n sentDate: match.sentDate,\n claimedDate: match.claimedDate,\n status: match.status,\n }\n : { sent: false }\n );\n }\n\n case 'get-template-recipients': {\n const matched = this.credentials.filter(c => this.matchesTemplate(c, event));\n const limit =\n typeof event.limit === 'number' && event.limit > 0\n ? event.limit\n : undefined;\n // Cursor pagination: the cursor is the offset of the next record,\n // issued by the previous page so callers can walk the full list.\n const parsedCursor =\n typeof event.cursor === 'string' ? Number.parseInt(event.cursor, 10) : 0;\n const offset =\n Number.isFinite(parsedCursor) && parsedCursor > 0 ? parsedCursor : 0;\n const page = limit\n ? matched.slice(offset, offset + limit)\n : matched.slice(offset);\n const nextOffset = offset + page.length;\n const hasMore = nextOffset < matched.length;\n this.toast({\n icon: 'users',\n segments: [\n 'In LearnCard, this lists who received it. ',\n { b: String(matched.length) },\n ' so far in practice.',\n ],\n });\n return Promise.resolve({\n records: page.map(c => this.toRecipientRecord(c)),\n hasMore,\n ...(hasMore ? { cursor: String(nextOffset) } : {}),\n total: matched.length,\n });\n }\n\n case 'send-notification': {\n const title = typeof event.title === 'string' ? event.title : '';\n const body = typeof event.body === 'string' ? event.body : '';\n const text = [title, body].filter(Boolean).join(' — ');\n this.toast({\n icon: 'bell',\n segments: text\n ? ['The learner would get a notification: ', { b: text }]\n : ['In LearnCard, the learner would get a notification.'],\n });\n return Promise.resolve({ sent: true });\n }\n\n case 'increment-counter': {\n const key = String(event.key ?? '');\n const amount = typeof event.amount === 'number' ? event.amount : 0;\n const previous = this.readCounter(key)?.value ?? 0;\n const next = previous + amount;\n this.writeCounter(key, next);\n this.toast({\n icon: 'hash',\n segments: ['Counter ', { b: key }, ' → ', { b: String(next) }, '.'],\n });\n return Promise.resolve({ key, previousValue: previous, newValue: next });\n }\n\n case 'get-counter': {\n const key = String(event.key ?? '');\n const stored = this.readCounter(key);\n const value = stored?.value ?? 0;\n this.toast({\n icon: 'hash',\n segments: ['Counter ', { b: key }, ' is ', { b: String(value) }, '.'],\n });\n return Promise.resolve({\n key,\n value,\n updatedAt: stored?.updatedAt ?? null,\n });\n }\n\n case 'get-counters': {\n const requested = Array.isArray(event.keys)\n ? (event.keys as unknown[]).map(String)\n : this.allCounterKeys();\n const counters = requested.map(key => {\n const stored = this.readCounter(key);\n return {\n key,\n value: stored?.value ?? 0,\n updatedAt: stored?.updatedAt ?? null,\n };\n });\n this.toast({\n icon: 'hash',\n segments: ['Read ', { b: plural(counters.length, 'counter') }, '.'],\n });\n return Promise.resolve({ counters });\n }\n\n case 'send-ai-session-credential': {\n const sessionTitle =\n typeof event.sessionTitle === 'string' && event.sessionTitle\n ? event.sessionTitle\n : 'AI session';\n const sessionBoostUri = this.nextUri('lc:mock:session-boost');\n const record = this.addCredential({\n name: sessionTitle,\n boostUri: sessionBoostUri,\n status: 'claimed',\n });\n this.toast({\n icon: 'award',\n tone: 'positive',\n segments: [\n 'In LearnCard, the learner would keep a record of ',\n { b: sessionTitle },\n '.',\n ],\n });\n\n // Mirrors the real host's topic hierarchy: the first session\n // creates the app's AI Topic (returning its credential URI);\n // later sessions reuse it and report isNewTopic: false.\n const isNewTopic = this.aiTopic === null;\n if (!this.aiTopic) {\n this.aiTopic = {\n topicUri: this.nextUri('lc:mock:topic'),\n topicCredentialUri: this.nextUri('lc:mock:topic-credential'),\n };\n }\n\n return Promise.resolve({\n topicUri: this.aiTopic.topicUri,\n ...(isNewTopic\n ? { topicCredentialUri: this.aiTopic.topicCredentialUri }\n : {}),\n sessionCredentialUri: record.credentialUri,\n sessionBoostUri,\n isNewTopic,\n });\n }\n\n default:\n this.toast({\n icon: 'sparkles',\n segments: ['In LearnCard, this would run ', { b: type }, '.'],\n });\n return Promise.resolve({});\n }\n })();\n\n return response.then(result => {\n this.captureHandledAppEvent(type, event);\n return result;\n });\n }\n\n private captureHandledAction(action: string, payload?: unknown): void {\n try {\n this.updateManifest(draft => {\n switch (action) {\n case 'REQUEST_IDENTITY':\n this.addPermission(draft, 'request_identity');\n break;\n case 'SEND_CREDENTIAL':\n this.addPermission(draft, 'send_credential');\n break;\n case 'REQUEST_CONSENT': {\n this.addPermission(draft, 'request_consent');\n const scopes = (payload as { scopes?: unknown } | undefined)?.scopes;\n if (scopes && typeof scopes === 'object' && !Array.isArray(scopes)) {\n this.captureConsentRecord(draft, scopes as ConsentRequest);\n }\n break;\n }\n case 'LAUNCH_FEATURE': {\n this.addPermission(draft, 'launch_feature');\n const featurePath = (payload as { featurePath?: unknown } | undefined)\n ?.featurePath;\n if (typeof featurePath === 'string' && featurePath) {\n this.addUnique(draft.featuresLaunched, featurePath);\n }\n break;\n }\n case 'ASK_CREDENTIAL_SEARCH':\n this.addPermission(draft, 'credential_search');\n break;\n case 'ASK_CREDENTIAL_SPECIFIC':\n this.addPermission(draft, 'credential_by_id');\n break;\n case 'INITIATE_TEMPLATE_ISSUE':\n this.addPermission(draft, 'template_issuance');\n break;\n case 'REQUEST_LEARNER_CONTEXT':\n draft.usedLearnerContext = true;\n break;\n default:\n break;\n }\n });\n } catch {\n // Capture must never affect mocked app behavior.\n }\n }\n\n private captureHandledAppEvent(type: string, event: Record<string, unknown>): void {\n try {\n this.updateManifest(draft => {\n switch (type) {\n case 'send-credential': {\n this.addPermission(draft, 'send_credential');\n if (\n typeof event.alias === 'string' &&\n event.alias &&\n event.template &&\n typeof event.template === 'object'\n ) {\n const version =\n this.inlineTemplateVersions.get(event.alias)?.version ?? 1;\n this.captureTemplateRecord(\n draft,\n event.alias,\n event.template as InlineCredentialTemplate,\n version\n );\n }\n break;\n }\n case 'send-notification':\n draft.usedNotifications = true;\n break;\n case 'increment-counter':\n case 'get-counter': {\n const key = event.key;\n if (typeof key === 'string' && key) this.addUnique(draft.counterKeys, key);\n break;\n }\n case 'get-counters': {\n if (Array.isArray(event.keys)) {\n for (const key of event.keys) {\n if (typeof key === 'string' && key) {\n this.addUnique(draft.counterKeys, key);\n }\n }\n }\n break;\n }\n default:\n break;\n }\n });\n } catch {\n // Capture must never affect mocked app behavior.\n }\n }\n\n private updateManifest(mutator: (manifest: CapturedAppManifest) => void): void {\n const manifest = this.loadManifest() ?? this.createManifestSkeleton();\n const next = this.cloneManifest(manifest);\n\n mutator(next);\n\n const now = new Date().toISOString();\n next.firstCapturedAt ||= now;\n next.lastUpdatedAt = now;\n\n this.saveManifest(next);\n this.updateManifestHud(next);\n this.refreshPublishPromptLink(next);\n this.maybeShowPublishPrompt(next);\n this.captureIcon();\n }\n\n private createManifestSkeleton(): CapturedAppManifest {\n const now = new Date().toISOString();\n const suggestedName = this.readSuggestedName();\n const suggestedIconUrl = this.readSuggestedIconUrl();\n\n return {\n manifestVersion: 1,\n appKey: this.getAppKey(),\n appUrl: this.readAppOrigin(),\n ...(suggestedName ? { suggestedName } : {}),\n ...(suggestedIconUrl ? { suggestedIconUrl } : {}),\n permissions: [],\n templates: [],\n consentRequests: [],\n featuresLaunched: [],\n counterKeys: [],\n usedLearnerContext: false,\n usedNotifications: false,\n firstCapturedAt: now,\n lastUpdatedAt: now,\n };\n }\n\n private readAppOrigin(): string {\n if (typeof window === 'undefined' || !window.location?.origin) return '';\n return `${window.location.origin}${window.location.pathname || ''}`;\n }\n\n private readSuggestedName(): string | undefined {\n const title = this.readInitialDocumentTitle();\n if (!title) return undefined;\n\n const trimmedTitle = title.trim();\n if (!trimmedTitle) return undefined;\n\n return trimmedTitle.slice(0, 100);\n }\n\n private readInitialDocumentTitle(): string | undefined {\n if (this.initialDocumentTitle !== undefined) {\n return this.initialDocumentTitle ?? undefined;\n }\n\n if (typeof document === 'undefined') {\n this.initialDocumentTitle = null;\n return undefined;\n }\n\n this.initialDocumentTitle = document.title;\n return this.initialDocumentTitle || undefined;\n }\n\n private getAppFingerprint(): string {\n if (this.appFingerprint) return this.appFingerprint;\n\n this.appFingerprint = slugifyAppFingerprint(\n this.options.appId ?? this.readInitialDocumentTitle() ?? undefined\n );\n\n return this.appFingerprint;\n }\n\n private readLegacyManifestFingerprint(manifest: CapturedAppManifest): string {\n return slugifyAppFingerprint(manifest.suggestedName);\n }\n\n private readSuggestedIconUrl(): string | undefined {\n return this.iconCandidates().find(url => /^https?:/.test(url));\n }\n\n private appKeyStorageKey(): string {\n return `${this.options.namespace}:app-key:${this.getAppFingerprint()}`;\n }\n\n private getAppKey(): string {\n if (this.options.appId !== undefined) return this.options.appId;\n if (this.options.persist) {\n try {\n this.memoryAppKey =\n localStorage.getItem(this.appKeyStorageKey()) || this.memoryAppKey;\n } catch {\n /* Use the session fallback. */\n }\n }\n this.memoryAppKey ??=\n globalThis.crypto?.randomUUID?.() ??\n `app-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n if (this.options.persist) {\n try {\n localStorage.setItem(this.appKeyStorageKey(), this.memoryAppKey);\n } catch {\n /* Use the session fallback. */\n }\n }\n return this.memoryAppKey;\n }\n\n private iconFallback(): string | undefined {\n return typeof window !== 'undefined'\n ? this.resolveIcon('/favicon.ico', window.location.origin)\n : undefined;\n }\n\n private resolveIcon(href: string, base: string): string | undefined {\n try {\n const url = new URL(href, base);\n return ['http:', 'https:', 'data:'].includes(url.protocol) ? url.href : undefined;\n } catch {\n return undefined;\n }\n }\n\n private iconSize(sizes: string, type: string): number {\n if (sizes.toLowerCase().split(/\\s+/).includes('any') || type === 'image/svg+xml')\n return Number.MAX_SAFE_INTEGER;\n return Math.max(\n 0,\n ...sizes.split(/\\s+/).map(size => {\n const match = /^(\\d+)x(\\d+)$/i.exec(size);\n return match ? Number(match[1]) * Number(match[2]) : 0;\n })\n );\n }\n\n private iconCandidates(): string[] {\n if (typeof document === 'undefined') return [];\n return Array.from(document.querySelectorAll<HTMLLinkElement>('link[rel]'))\n .map(link => {\n const rels = link.rel.toLowerCase().split(/\\s+/);\n const priority = rels.includes('mask-icon')\n ? 0\n : rels.some(\n rel =>\n rel === 'apple-touch-icon' || rel === 'apple-touch-icon-precomposed'\n )\n ? 2\n : rels.includes('icon')\n ? 1\n : 0;\n return {\n priority,\n size: this.iconSize(link.getAttribute('sizes') ?? '', link.type),\n url: this.resolveIcon(link.href, document.baseURI),\n };\n })\n .filter(candidate => candidate.priority > 0 && candidate.url)\n .sort((a, b) => b.priority - a.priority || b.size - a.size)\n .flatMap(candidate => (candidate.url ? [candidate.url] : []));\n }\n\n private cancelIconCapture(): void {\n this.iconGeneration++;\n for (const cleanup of this.iconCleanups) cleanup();\n this.iconCleanups.clear();\n this.iconSource = undefined;\n }\n\n private captureIcon(): void {\n if (this.destroyed || typeof document === 'undefined') return;\n const candidates = this.iconCandidates();\n const manifestHref = document.querySelector<HTMLLinkElement>('link[rel~=\"manifest\"]')?.href;\n const signature = JSON.stringify([candidates, manifestHref]);\n if (signature === this.iconSource) return;\n this.cancelIconCapture();\n this.iconSource = signature;\n const generation = this.iconGeneration;\n void (async () => {\n let source: string | undefined = candidates[0];\n let url = candidates.find(candidate => /^https?:/.test(candidate));\n if (\n (!source || !url) &&\n manifestHref &&\n new URL(manifestHref).origin === window.location.origin\n ) {\n const controller = new AbortController();\n let rejectPending: (reason: Error) => void = () => undefined;\n const timeout = new Promise<never>((_, reject) => {\n rejectPending = reject;\n });\n const cleanup = (): void => {\n clearTimeout(timer);\n controller.abort();\n rejectPending(new Error('Icon capture cancelled'));\n };\n const timer = setTimeout(cleanup, 4000);\n this.iconCleanups.add(cleanup);\n try {\n const data: unknown = await Promise.race([\n fetch(manifestHref, { signal: controller.signal, redirect: 'error' }).then(\n response => {\n if (!response.ok) return undefined;\n return response.json() as Promise<unknown>;\n }\n ),\n timeout,\n ]);\n {\n const icons =\n data && typeof data === 'object' && 'icons' in data\n ? data.icons\n : undefined;\n if (Array.isArray(icons)) {\n const ranked = icons\n .filter(\n (\n icon\n ): icon is { src: string; sizes?: string; type?: string } =>\n !!icon &&\n typeof icon === 'object' &&\n typeof icon.src === 'string'\n )\n .sort(\n (a, b) =>\n this.iconSize(\n typeof b.sizes === 'string' ? b.sizes : '',\n b.type ?? ''\n ) -\n this.iconSize(\n typeof a.sizes === 'string' ? a.sizes : '',\n a.type ?? ''\n )\n )\n .flatMap(icon => {\n const href = this.resolveIcon(icon.src, manifestHref);\n return href ? [href] : [];\n });\n source ??= ranked[0];\n url ??= ranked.find(href => /^https?:/.test(href));\n }\n }\n } catch {\n /* Icon discovery is best effort. */\n } finally {\n cleanup();\n this.iconCleanups.delete(cleanup);\n }\n }\n if (this.destroyed || generation !== this.iconGeneration) return;\n const fallback = url ? undefined : this.iconFallback();\n url ??= fallback;\n source ??= url;\n const result = source ? await this.rasterizeIcon(source) : undefined;\n if (this.destroyed || generation !== this.iconGeneration) return;\n const manifest = this.loadManifest();\n if (!manifest) return;\n // A guessed /favicon.ico, or a same-origin icon that fails to load, is broken.\n // Cross-origin failures stay: a missing CORS header looks like an error too.\n const isSameOrigin = (href: string): boolean =>\n href.startsWith(window.location.origin + '/');\n const broken =\n result?.status !== 'loaded' &&\n (url === fallback || (!!url && result?.status === 'failed' && isSameOrigin(url)));\n manifest.suggestedIconUrl = broken ? undefined : url;\n manifest.suggestedIconDataUrl = result?.dataUrl;\n this.saveManifest(manifest);\n this.updateManifestHud(manifest);\n this.refreshPublishPromptLink(manifest);\n })().catch(() => undefined);\n }\n\n private rasterizeIcon(\n source: string\n ): Promise<{ status: 'loaded' | 'failed' | 'timeout'; dataUrl?: string }> {\n return new Promise(resolve => {\n const image = new Image();\n const finish = (status: 'loaded' | 'failed' | 'timeout', dataUrl?: string): void => {\n clearTimeout(timer);\n image.onload = null;\n image.onerror = null;\n this.iconCleanups.delete(cancel);\n resolve({ status, dataUrl });\n };\n const cancel = (): void => {\n finish('timeout');\n image.removeAttribute('src');\n };\n const timer = setTimeout(cancel, 4000);\n this.iconCleanups.add(cancel);\n image.onerror = () => finish('failed');\n image.onload = () => {\n try {\n if (!image.naturalWidth || !image.naturalHeight) return finish('failed');\n const canvas = document.createElement('canvas');\n for (const size of [128, 96, 64]) {\n canvas.width = canvas.height = size;\n const context = canvas.getContext('2d');\n if (!context) break;\n const ratio = size / Math.max(image.naturalWidth, image.naturalHeight);\n const width = image.naturalWidth * ratio;\n const height = image.naturalHeight * ratio;\n context.drawImage(\n image,\n (size - width) / 2,\n (size - height) / 2,\n width,\n height\n );\n const data = canvas.toDataURL('image/webp', 0.85);\n if (data.startsWith('data:image/') && data.length <= 3000)\n return finish('loaded', data);\n }\n } catch {\n /* Tainted or unsupported canvas. */\n }\n finish('loaded');\n };\n if (/^https?:/.test(source) && new URL(source).origin !== window.location.origin)\n image.crossOrigin = 'anonymous';\n image.src = source;\n });\n }\n\n private manifestStorageKey(): string {\n return `${this.options.namespace}:manifests`;\n }\n\n private legacyManifestStorageKey(): string {\n return `${this.options.namespace}:manifest`;\n }\n\n private publishDismissedStorageKey(): string {\n return `${this.options.namespace}:publish-dismissed-at:${this.getAppFingerprint()}`;\n }\n\n private hudCollapsedStorageKey(): string {\n return `${this.options.namespace}:manifest-hud-collapsed:${this.getAppFingerprint()}`;\n }\n\n private loadManifestMap(): StoredManifestMap {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const rawMap = localStorage.getItem(this.manifestStorageKey());\n const rawLegacy = localStorage.getItem(this.legacyManifestStorageKey());\n\n if (!rawMap && !rawLegacy && Object.keys(this.memoryManifests).length > 0) {\n return this.cloneManifestMap(this.memoryManifests);\n }\n\n const manifests = rawMap ? this.parseManifestMap(rawMap) : {};\n\n if (rawLegacy) {\n try {\n const legacyManifest = JSON.parse(rawLegacy) as CapturedAppManifest;\n manifests[this.readLegacyManifestFingerprint(legacyManifest)] =\n this.cloneManifest(legacyManifest);\n localStorage.setItem(this.manifestStorageKey(), JSON.stringify(manifests));\n localStorage.removeItem(this.legacyManifestStorageKey());\n } catch {\n // Ignore corrupt legacy data and leave it in place.\n }\n }\n\n this.replaceMemoryManifestMap(manifests);\n return this.cloneManifestMap(manifests);\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n return this.cloneManifestMap(this.memoryManifests);\n }\n\n private parseManifestMap(raw: string): StoredManifestMap {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n\n const manifests: StoredManifestMap = {};\n for (const [fingerprint, manifest] of Object.entries(parsed)) {\n if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) continue;\n manifests[fingerprint] = this.cloneManifest(manifest as CapturedAppManifest);\n }\n\n return manifests;\n }\n\n private cloneManifestMap(manifests: StoredManifestMap): StoredManifestMap {\n const clone: StoredManifestMap = {};\n for (const [fingerprint, manifest] of Object.entries(manifests)) {\n clone[fingerprint] = this.cloneManifest(manifest);\n }\n\n return clone;\n }\n\n private replaceMemoryManifestMap(manifests: StoredManifestMap): void {\n for (const key of Object.keys(this.memoryManifests)) delete this.memoryManifests[key];\n for (const [key, manifest] of Object.entries(manifests)) {\n this.memoryManifests[key] = this.cloneManifest(manifest);\n }\n }\n\n private loadManifest(): CapturedAppManifest | undefined {\n const manifests = this.loadManifestMap();\n const manifest = manifests[this.getAppFingerprint()];\n if (\n manifest &&\n (!manifest.appKey ||\n (this.options.appId !== undefined && manifest.appKey !== this.options.appId))\n ) {\n manifest.appKey = this.getAppKey();\n this.saveManifest(manifest);\n }\n return manifest ? this.cloneManifest(manifest) : undefined;\n }\n\n private saveManifest(manifest: CapturedAppManifest): void {\n const manifests = this.loadManifestMap();\n manifests[this.getAppFingerprint()] = this.cloneManifest(manifest);\n\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(this.manifestStorageKey(), JSON.stringify(manifests));\n this.replaceMemoryManifestMap(manifests);\n return;\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n this.replaceMemoryManifestMap(manifests);\n }\n\n private loadPublishDismissedAt(): string | undefined {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const raw = localStorage.getItem(this.publishDismissedStorageKey());\n if (raw) return raw;\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n return this.memoryPublishDismissedAt[this.getAppFingerprint()];\n }\n\n private savePublishDismissedAt(value: string): void {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(this.publishDismissedStorageKey(), value);\n this.memoryPublishDismissedAt[this.getAppFingerprint()] = value;\n return;\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n this.memoryPublishDismissedAt[this.getAppFingerprint()] = value;\n }\n\n private loadHudCollapsed(): boolean {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const raw = localStorage.getItem(this.hudCollapsedStorageKey());\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n const raw = this.memoryHudCollapsed[this.getAppFingerprint()];\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n return true;\n }\n\n private saveHudCollapsed(value: boolean): void {\n const serialized = value ? 'true' : 'false';\n\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(this.hudCollapsedStorageKey(), serialized);\n this.memoryHudCollapsed[this.getAppFingerprint()] = serialized;\n return;\n } catch {\n // Ignore and fall back to memory.\n }\n }\n\n this.memoryHudCollapsed[this.getAppFingerprint()] = serialized;\n }\n\n private addPermission(manifest: CapturedAppManifest, permission: string): void {\n this.addUnique(manifest.permissions, permission);\n }\n\n private addUnique(values: string[], value: string): void {\n if (!values.includes(value)) values.push(value);\n }\n\n private captureTemplateRecord(\n manifest: CapturedAppManifest,\n alias: string,\n template: InlineCredentialTemplate,\n version: number\n ): void {\n const now = new Date().toISOString();\n const existingIndex = manifest.templates.findIndex(record => record.alias === alias);\n const nextRecord: CapturedTemplateRecord = {\n alias,\n template,\n version,\n lastUsedAt: now,\n };\n\n if (existingIndex >= 0) {\n manifest.templates[existingIndex] = nextRecord;\n return;\n }\n\n manifest.templates.push(nextRecord);\n }\n\n private captureConsentRecord(manifest: CapturedAppManifest, scopes: ConsentRequest): void {\n const normalized = normalizeConsentRequest(scopes);\n const key = canonicalConsentScopeString(normalized);\n const now = new Date().toISOString();\n const existing = manifest.consentRequests.find(\n record => canonicalConsentScopeString(record.scopes) === key\n );\n\n if (existing) {\n existing.lastUsedAt = now;\n if (!existing.reason && typeof scopes.reason === 'string' && scopes.reason) {\n existing.reason = scopes.reason;\n }\n return;\n }\n\n const nextRecord: CapturedConsentRecord = {\n scopes: normalized,\n ...(typeof scopes.reason === 'string' && scopes.reason\n ? { reason: scopes.reason }\n : {}),\n lastUsedAt: now,\n };\n manifest.consentRequests.push(nextRecord);\n }\n\n private cloneManifest(manifest: CapturedAppManifest): CapturedAppManifest {\n return JSON.parse(JSON.stringify(manifest)) as CapturedAppManifest;\n }\n\n private isManifestPublishable(manifest: CapturedAppManifest): boolean {\n return manifest.templates.length >= 1 || manifest.permissions.length >= 2;\n }\n\n /**\n * True when publish links would point at production LearnCard from a\n * machine that is almost certainly running LearnCard locally — the one\n * case where the developer probably wants the override.\n */\n private shouldHintLocalPublishOverride(): boolean {\n if (this.context.publishOriginPinned) return false;\n if (this.options.publishOrigin !== DEFAULT_PUBLISH_ORIGIN) return false;\n if (typeof window === 'undefined') return false;\n\n const hostname = window.location?.hostname;\n\n return hostname === 'localhost' || hostname === '127.0.0.1';\n }\n\n public getPublishUrl(manifest: CapturedAppManifest): string;\n public getPublishUrl(): string | undefined;\n public getPublishUrl(manifest = this.loadManifest()): string | undefined {\n if (!manifest) return undefined;\n const prefix = `${this.options.publishOrigin}/app-store/developer/submit?manifest=`;\n const url = prefix + encodeManifestForUrl(manifest);\n if (url.length <= 7000) return url;\n const compact = { ...manifest };\n delete compact.suggestedIconDataUrl;\n return prefix + encodeManifestForUrl(compact);\n }\n\n private maybeShowPublishPrompt(manifest: CapturedAppManifest): void {\n if (!this.options.publishPrompt || !this.options.ui || !hasDocument()) return;\n if (this.publishPromptShown || !this.isManifestPublishable(manifest)) return;\n\n const dismissedAt = this.loadPublishDismissedAt();\n if (dismissedAt) {\n const dismissedMs = Date.parse(dismissedAt);\n if (Number.isFinite(dismissedMs) && Date.now() - dismissedMs < PUBLISH_DISMISS_TTL_MS) {\n return;\n }\n }\n\n this.publishPromptShown = true;\n this.toast({\n icon: 'publish',\n tone: 'publish',\n persistent: true,\n dismissible: true,\n title: 'Ready to publish',\n action: {\n label: 'Publish to LearnCard',\n href: this.getPublishUrl(manifest),\n },\n segments: [\n 'Your app works with LearnCard. Put it in front of learners in a few steps.',\n ],\n });\n }\n\n private refreshPublishPromptLink(manifest: CapturedAppManifest): void {\n const link = this.stackEl?.querySelector<HTMLAnchorElement>(\n '.lc-mock-toast--publish .lc-mock-action'\n );\n if (link) link.href = this.getPublishUrl(manifest);\n }\n\n private describeFeatures(manifest: CapturedAppManifest): HudFeature[] {\n const features: HudFeature[] = [];\n\n for (const permission of manifest.permissions) {\n const known = PERMISSION_FEATURES[permission];\n const feature: HudFeature = known\n ? { ...known }\n : { icon: 'sparkles', label: permission.replace(/_/g, ' ') };\n\n if (permission === 'send_credential' && manifest.templates.length > 0) {\n feature.detail = manifest.templates.map(readableTemplateName).join(', ');\n }\n\n if (permission === 'request_consent') {\n if (needsConsentSetup(manifest)) {\n feature.detail = 'Not set up yet';\n feature.needsSetup = true;\n } else {\n feature.detail = this.formatConsentSummary(manifest);\n }\n }\n\n if (permission === 'launch_feature' && manifest.featuresLaunched.length > 0) {\n feature.detail = Array.from(\n new Set(manifest.featuresLaunched.map(readablePath))\n ).join(', ');\n }\n\n features.push(feature);\n }\n\n if (manifest.templates.length > 0 && !manifest.permissions.includes('send_credential')) {\n features.push({\n icon: 'award',\n label: 'Award credentials',\n detail: manifest.templates.map(readableTemplateName).join(', '),\n });\n }\n\n if (manifest.usedLearnerContext) {\n features.push({ icon: 'sparkles', label: 'Personalize with the learner’s profile' });\n }\n\n if (manifest.usedNotifications) {\n features.push({ icon: 'bell', label: 'Send notifications' });\n }\n\n if (manifest.counterKeys.length > 0) {\n features.push({\n icon: 'hash',\n label: 'Track progress',\n detail: manifest.counterKeys.join(', '),\n });\n }\n\n return features;\n }\n\n private formatConsentSummary(manifest: CapturedAppManifest): string | undefined {\n if (manifest.consentRequests.length === 0) return undefined;\n\n const readCategories = new Set<string>();\n const personalFields = new Set<string>();\n const writeCategories = new Set<string>();\n\n for (const request of manifest.consentRequests) {\n request.scopes.read.credentialCategories.forEach(category =>\n readCategories.add(category)\n );\n request.scopes.read.personalFields.forEach(field => personalFields.add(field));\n request.scopes.write.credentialCategories.forEach(category =>\n writeCategories.add(category)\n );\n }\n\n const parts: string[] = [];\n if (readCategories.size > 0) parts.push(`See ${[...readCategories].join(', ')}`);\n if (personalFields.size > 0) parts.push(`See ${[...personalFields].join(', ')}`);\n if (writeCategories.size > 0) parts.push(`Add ${[...writeCategories].join(', ')}`);\n\n return parts.join(' · ') || undefined;\n }\n\n private copyText(text: string): void {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(text).catch(() => undefined);\n return;\n }\n\n if (!hasDocument() || !document.body) return;\n\n const input = document.createElement('textarea');\n input.value = text;\n input.setAttribute('readonly', 'true');\n Object.assign(input.style, {\n position: 'fixed',\n opacity: '0',\n pointerEvents: 'none',\n });\n document.body.appendChild(input);\n input.select();\n\n try {\n document.execCommand('copy');\n } catch {\n // Ignore copy failures in sandboxed/older environments.\n }\n\n input.remove();\n }\n\n private warnIfFingerprintCollides(): void {\n const manifest = this.loadManifest();\n const currentAppUrl = this.readAppOrigin();\n\n if (!manifest || !currentAppUrl || manifest.appUrl === currentAppUrl) return;\n\n console.warn(\n `${MOCK_PREFIX} Existing manifest state for fingerprint \"${this.getAppFingerprint()}\" ` +\n `belongs to ${manifest.appUrl}, but this page is ${currentAppUrl}. ` +\n 'Two apps may be sharing mock state. Pass mockOptions.appId to isolate them.'\n );\n }\n\n private updateManifestHud(manifest?: CapturedAppManifest): void {\n if (!this.options.ui || !hasDocument() || !document.body) return;\n\n const currentManifest = manifest ?? this.loadManifest();\n if (!currentManifest) {\n if (this.hudEl) this.hudEl.style.display = 'none';\n return;\n }\n\n this.ensureStyles();\n\n if (!this.hudEl || !document.body.contains(this.hudEl)) {\n const hud = createEl('div', 'lc-mock-hud');\n hud.setAttribute('role', 'region');\n hud.setAttribute('aria-label', 'LearnCard practice mode');\n document.body.appendChild(hud);\n this.domNodes.add(hud);\n this.hudEl = hud;\n this.hudAnimateNext = true;\n }\n\n const hud = this.hudEl;\n hud.style.display = '';\n hud.replaceChildren(\n this.confirmingReset\n ? this.renderResetConfirmation()\n : this.loadHudCollapsed()\n ? this.renderHudPill(currentManifest)\n : this.renderHudCard(currentManifest)\n );\n\n hud.classList.toggle('lc-mock-animate', this.hudAnimateNext);\n this.hudAnimateNext = false;\n }\n\n private setHudCollapsed(collapsed: boolean, manifest: CapturedAppManifest): void {\n this.saveHudCollapsed(collapsed);\n this.hudAnimateNext = true;\n this.updateManifestHud(manifest);\n const focusTarget = this.hudEl?.querySelector<HTMLElement>(\n collapsed ? '.lc-mock-hud-pill' : '.lc-mock-hud-minimize'\n );\n focusTarget?.focus({ preventScroll: true });\n }\n\n private renderHudPill(manifest: CapturedAppManifest): HTMLElement {\n const count = this.describeFeatures(manifest).length;\n const pill = createEl('button', 'lc-mock-hud-pill lc-mock-glass');\n pill.type = 'button';\n pill.setAttribute('aria-expanded', 'false');\n pill.setAttribute(\n 'aria-label',\n `LearnCard practice mode. Your app uses ${plural(count, 'feature')}. Show details.`\n );\n\n const mark = createEl('span', 'lc-mock-hud-mark');\n mark.appendChild(createIcon('mark'));\n\n const label = createEl('span', 'lc-mock-hud-pill-label', 'Practice mode');\n const badge = createEl('span', 'lc-mock-hud-badge', String(count));\n\n pill.append(mark, createEl('span', 'lc-mock-dot'), label, badge);\n pill.addEventListener('click', () => this.setHudCollapsed(false, manifest));\n\n return pill;\n }\n\n private renderHudCard(manifest: CapturedAppManifest): HTMLElement {\n const card = createEl('div', 'lc-mock-hud-card lc-mock-glass');\n\n const header = createEl('div', 'lc-mock-hud-header');\n const mark = createEl('span', 'lc-mock-hud-mark lc-mock-hud-mark--lg');\n mark.appendChild(createIcon('mark'));\n\n const heading = createEl('div', 'lc-mock-hud-heading');\n const title = createEl('div', 'lc-mock-hud-title');\n title.append(createEl('span', undefined, 'Practice mode'), createEl('span', 'lc-mock-dot'));\n heading.append(\n title,\n createEl('div', 'lc-mock-hud-subtitle', 'LearnCard actions are simulated here.')\n );\n\n const minimize = createEl('button', 'lc-mock-hud-minimize');\n minimize.type = 'button';\n minimize.setAttribute('aria-label', 'Minimize');\n minimize.setAttribute('aria-expanded', 'true');\n minimize.title = 'Minimize';\n minimize.appendChild(createIcon('chevronDown'));\n minimize.addEventListener('click', () => this.setHudCollapsed(true, manifest));\n\n header.append(mark, heading, minimize);\n card.appendChild(header);\n\n card.appendChild(this.renderHudApp(manifest));\n\n const features = this.describeFeatures(manifest);\n card.appendChild(\n createEl(\n 'div',\n 'lc-mock-hud-section',\n features.length > 0 ? 'What your app uses' : 'Nothing yet'\n )\n );\n\n const list = createEl('ul', 'lc-mock-hud-group lc-mock-hud-list');\n if (features.length === 0) {\n list.appendChild(\n createEl(\n 'li',\n 'lc-mock-hud-empty',\n 'Use a LearnCard feature in your app and it will show up here.'\n )\n );\n }\n\n for (const feature of features) {\n const row = createEl('li', 'lc-mock-hud-row');\n const glyph = createEl('span', 'lc-mock-hud-glyph');\n glyph.appendChild(createIcon(feature.icon));\n\n const text = createEl('div', 'lc-mock-hud-row-text');\n text.appendChild(createEl('div', 'lc-mock-hud-row-label', feature.label));\n if (feature.detail) {\n const detail = createEl(\n 'div',\n `lc-mock-hud-row-detail${feature.needsSetup ? ' is-setup' : ''}`,\n feature.detail\n );\n detail.title = feature.needsSetup\n ? 'You can choose what to ask for when you publish.'\n : feature.detail;\n text.appendChild(detail);\n }\n\n const status = createEl(\n 'span',\n feature.needsSetup ? 'lc-mock-hud-setup-dot' : 'lc-mock-hud-check'\n );\n if (feature.needsSetup) status.setAttribute('aria-label', 'Needs setup');\n else status.appendChild(createIcon('check'));\n\n row.append(glyph, text, status);\n list.appendChild(row);\n }\n card.appendChild(list);\n\n card.appendChild(this.renderHudFooter(manifest));\n const reset = createEl('button', 'lc-mock-hud-reset', 'Start over');\n reset.type = 'button';\n reset.addEventListener('click', () => {\n this.confirmingReset = true;\n this.updateManifestHud();\n this.hudEl?.querySelector<HTMLButtonElement>('.lc-mock-hud-reset-cancel')?.focus();\n });\n card.appendChild(reset);\n\n if (this.shouldHintLocalPublishOverride()) {\n const hint = createEl('div', 'lc-mock-hud-publish-hint', 'Local LearnCard? Add ');\n hint.appendChild(\n createEl('code', undefined, '?lc_publish_override=http://localhost:3000')\n );\n card.appendChild(hint);\n }\n\n return card;\n }\n\n private renderResetConfirmation(): HTMLElement {\n const card = createEl('div', 'lc-mock-hud-card lc-mock-glass');\n const body = createEl('div', 'lc-mock-hud-confirm');\n body.append(\n createEl('div', 'lc-mock-hud-title', 'Start over with this app?'),\n createEl(\n 'p',\n undefined,\n \"This clears what LearnCard recorded here — features, practice credentials, and counters. Your code isn't touched, and nothing already in LearnCard changes.\"\n )\n );\n const actions = createEl('div', 'lc-mock-hud-confirm-actions');\n const cancel = createEl('button', 'lc-mock-hud-reset-cancel', 'Cancel');\n const confirm = createEl('button', 'lc-mock-hud-reset-confirm', 'Start Over');\n cancel.type = confirm.type = 'button';\n const restore = (): void => {\n this.confirmingReset = false;\n this.updateManifestHud();\n this.hudEl?.querySelector<HTMLButtonElement>('.lc-mock-hud-reset')?.focus();\n };\n cancel.addEventListener('click', restore);\n card.addEventListener('keydown', event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n restore();\n }\n });\n confirm.addEventListener('click', () => this.resetPracticeMode());\n actions.append(cancel, confirm);\n body.appendChild(actions);\n card.appendChild(body);\n return card;\n }\n\n private renderHudApp(manifest: CapturedAppManifest): HTMLElement {\n const app = createEl('div', 'lc-mock-hud-group lc-mock-hud-app');\n const name = manifest.suggestedName || 'Untitled app';\n\n const avatar = createEl('span', 'lc-mock-hud-avatar');\n const initial = name.trim().charAt(0).toUpperCase() || 'A';\n const icon = manifest.suggestedIconDataUrl ?? manifest.suggestedIconUrl;\n if (icon) {\n const img = createEl('img');\n img.alt = '';\n img.src = icon;\n img.addEventListener('error', () => {\n img.remove();\n avatar.textContent = initial;\n });\n avatar.appendChild(img);\n } else {\n avatar.textContent = initial;\n }\n\n const text = createEl('div', 'lc-mock-hud-row-text');\n text.appendChild(createEl('div', 'lc-mock-hud-app-name', name));\n\n const host = readHost(manifest.appUrl);\n if (host) text.appendChild(createEl('div', 'lc-mock-hud-row-detail', host));\n\n app.append(avatar, text);\n return app;\n }\n\n private renderHudFooter(manifest: CapturedAppManifest): HTMLElement {\n const publishUrl = this.getPublishUrl(manifest);\n const footer = createEl('div', 'lc-mock-hud-footer');\n\n const publish = createEl('a', 'lc-mock-hud-publish');\n publish.href = publishUrl;\n publish.target = '_blank';\n publish.rel = 'noopener';\n publish.append(createEl('span', undefined, 'Publish app'), createIcon('open'));\n\n const copy = createEl('button', 'lc-mock-hud-copy');\n copy.type = 'button';\n copy.title = 'Copy publish link';\n copy.setAttribute('aria-label', 'Copy publish link');\n copy.appendChild(createIcon('copy'));\n copy.addEventListener('click', () => {\n this.copyText(publishUrl);\n copy.classList.add('is-copied');\n copy.replaceChildren(createIcon('check'));\n copy.title = 'Link copied';\n copy.setAttribute('aria-label', 'Link copied');\n\n const reset = setTimeout(() => {\n this.exitTimers.delete(reset);\n copy.classList.remove('is-copied');\n copy.replaceChildren(createIcon('copy'));\n copy.title = 'Copy publish link';\n copy.setAttribute('aria-label', 'Copy publish link');\n }, 1800);\n this.exitTimers.add(reset);\n });\n\n footer.append(publish, copy);\n return footer;\n }\n\n private nextUri(prefix: string): string {\n this.idSeq += 1;\n return `${prefix}:${Date.now()}-${this.idSeq}`;\n }\n\n private buildMockVc(name: string, id: string): Record<string, unknown> {\n return {\n '@context': ['https://www.w3.org/2018/credentials/v1'],\n id,\n type: ['VerifiableCredential'],\n issuer: this.identity.did,\n credentialSubject: { id: this.identity.did, achievement: { name } },\n _mock: true,\n };\n }\n\n private addCredential(input: {\n name: string;\n templateAlias?: string;\n boostUri?: string;\n recipient?: string;\n status?: MockStatus;\n credentialUri?: string;\n credential?: unknown;\n }): MockCredential {\n const now = new Date().toISOString();\n const status: MockStatus = input.status ?? 'claimed';\n const credentialUri = input.credentialUri ?? this.nextUri('lc:mock:credential');\n const record: MockCredential = {\n credentialUri,\n boostUri: input.boostUri,\n templateAlias: input.templateAlias,\n name: input.name,\n recipient: input.recipient || this.identity.did,\n status,\n sentDate: now,\n claimedDate: status === 'claimed' ? now : undefined,\n receivedDate: status === 'claimed' ? now : undefined,\n credential: input.credential ?? this.buildMockVc(input.name, credentialUri),\n };\n this.credentials.push(record);\n return record;\n }\n\n private selfCredentials(): MockCredential[] {\n return this.credentials.filter(c => c.recipient === this.identity.did);\n }\n\n private matchesTemplate(c: MockCredential, q: TemplateQuery): boolean {\n if (typeof q.templateAlias === 'string') return c.templateAlias === q.templateAlias;\n if (typeof q.boostUri === 'string') return c.boostUri === q.boostUri;\n return false;\n }\n\n private toRecipientRecord(c: MockCredential): {\n recipientProfileId: string;\n recipientDisplayName: string;\n sentDate: string;\n claimedDate?: string;\n credentialUri: string;\n status: MockStatus;\n } {\n return {\n recipientProfileId: c.recipient,\n recipientDisplayName: c.recipient,\n sentDate: c.sentDate,\n claimedDate: c.claimedDate,\n credentialUri: c.credentialUri,\n status: c.status,\n };\n }\n\n private counterStorageKey(): string {\n return `${this.options.namespace}:counters:${this.getAppFingerprint()}`;\n }\n\n private loadCounters(): Record<string, StoredCounter> {\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const raw = localStorage.getItem(this.counterStorageKey());\n if (raw) return JSON.parse(raw) as Record<string, StoredCounter>;\n } catch {\n // Corrupt or unavailable storage: fall through to in-memory.\n }\n }\n\n const fromMemory: Record<string, StoredCounter> = {};\n for (const [key, value] of this.memoryCounters) fromMemory[key] = value;\n return fromMemory;\n }\n\n private readCounter(key: string): StoredCounter | undefined {\n return this.loadCounters()[key];\n }\n\n private allCounterKeys(): string[] {\n return Object.keys(this.loadCounters());\n }\n\n /**\n * The load → patch → save cycle below runs synchronously within one task,\n * so increments in the same tab can never interleave. Concurrent writes\n * from *other tabs* sharing the namespace can still be lost — acceptable\n * for a dev-only mock, and inherent to `localStorage` without web locks.\n */\n private writeCounter(key: string, value: number): void {\n const entry: StoredCounter = { value, updatedAt: new Date().toISOString() };\n\n if (this.options.persist && typeof localStorage !== 'undefined') {\n try {\n const all = this.loadCounters();\n all[key] = entry;\n localStorage.setItem(this.counterStorageKey(), JSON.stringify(all));\n return;\n } catch {\n // Fall back to in-memory storage below.\n }\n }\n\n this.memoryCounters.set(key, entry);\n }\n\n private log(action: string, payload?: unknown): void {\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(`${MOCK_PREFIX} ${action}`, payload ?? '');\n }\n\n private announce(): void {\n this.warnIfFingerprintCollides();\n this.updateManifestHud();\n\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(\n `${MOCK_PREFIX} Standalone mock mode is active. The SDK is simulating the ` +\n 'LearnCard host locally. When embedded in a real host, these calls run ' +\n 'against it unchanged.'\n );\n }\n\n private showClaimToast(credentialName: string, templateVersion?: number): void {\n const versionSuffix =\n typeof templateVersion === 'number' && templateVersion > 1\n ? ` Template updated to v${templateVersion}.`\n : '';\n\n this.toast({\n icon: 'award',\n tone: 'positive',\n ttl: 5200,\n segments: [\n 'In LearnCard, the learner would receive ',\n { b: credentialName },\n `.${versionSuffix}`,\n ],\n });\n }\n\n private showConsentToast(payload: unknown, redirectIgnored: boolean): void {\n const scopes = (payload as { scopes?: unknown } | undefined)?.scopes;\n const contractUri = (payload as { contractUri?: unknown } | undefined)?.contractUri;\n\n if (!scopes && !contractUri) {\n this.toast({\n icon: 'shield',\n tone: 'warning',\n ttl: 8000,\n title: 'Choose what to ask for',\n segments: [\n 'Approved here, but once published LearnCard needs to know what to ask the learner. You can choose it when you publish, or say it in code: ',\n { b: \"requestConsent({ read: { credentialCategories: ['Achievement'] } })\" },\n ],\n });\n } else {\n const segments = buildConsentScopeToastSegments(payload);\n if (redirectIgnored) segments.push(' Redirect skipped in practice.');\n this.toast({ icon: 'shield', tone: 'positive', segments });\n }\n\n if (redirectIgnored) {\n this.note(\n \"requestConsent: 'redirect' is ignored in mock mode — the real host would \" +\n \"navigate to the contract's redirectUrl with the VP in the URL.\"\n );\n }\n }\n\n private note(message: string): void {\n if (!this.options.log) return;\n // eslint-disable-next-line no-console\n console.log(`${MOCK_PREFIX} ${message}`);\n }\n\n /**\n * Show a branded toast describing what the real host would do. Identical\n * messages coalesce into one toast with a ×N counter so repeated or polled\n * calls never spam the screen.\n */\n private toast(spec: ToastSpec): void {\n if (!this.options.ui || !hasDocument()) return;\n\n const tone = spec.tone ?? 'default';\n const ttl = spec.ttl ?? 4200;\n const persistent = Boolean(spec.persistent);\n const text = spec.segments.map(s => (typeof s === 'string' ? s : s.b)).join('');\n const actionKey = spec.action ? `|${spec.action.href}|${spec.action.label}` : '';\n const key = `${tone}|${spec.icon}|${spec.title ?? ''}|${text}${actionKey}`;\n\n const existing = this.activeToasts.get(key);\n if (existing) {\n existing.count += 1;\n existing.countEl.textContent = `×${existing.count}`;\n existing.countEl.style.display = '';\n existing.countEl.classList.remove('lc-mock-bump');\n void existing.countEl.offsetWidth;\n existing.countEl.classList.add('lc-mock-bump');\n this.scheduleToastDismiss(key);\n return;\n }\n\n const stack = this.ensureStack();\n if (!stack) return;\n this.ensureStyles();\n\n const toast = createEl('div', `lc-mock-toast lc-mock-glass lc-mock-toast--${tone}`);\n if (spec.dismissible) toast.classList.add('lc-mock-toast--dismissible');\n\n const tile = createEl('span', 'lc-mock-tile');\n tile.appendChild(createIcon(spec.icon));\n\n const content = createEl('div', 'lc-mock-content');\n\n const meta = createEl('div', 'lc-mock-meta');\n const countEl = createEl('span', 'lc-mock-count');\n countEl.style.display = 'none';\n meta.append(\n createEl('span', 'lc-mock-meta-name', 'LearnCard'),\n createEl('span', 'lc-mock-chip', 'Practice'),\n countEl\n );\n content.appendChild(meta);\n\n if (spec.title) content.appendChild(createEl('div', 'lc-mock-title', spec.title));\n\n const body = createEl('div', 'lc-mock-body');\n for (const seg of spec.segments) {\n if (typeof seg === 'string') {\n body.append(seg);\n } else {\n body.appendChild(createEl('strong', undefined, seg.b));\n }\n }\n content.appendChild(body);\n\n if (spec.action) {\n const action = createEl('a', 'lc-mock-action');\n action.href = spec.action.href;\n action.target = '_blank';\n action.rel = 'noopener';\n action.append(createEl('span', undefined, spec.action.label), createIcon('open'));\n content.appendChild(action);\n }\n\n toast.append(tile, content);\n\n if (spec.dismissible) {\n const close = createEl('button', 'lc-mock-close');\n close.type = 'button';\n close.setAttribute('aria-label', 'Dismiss');\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n if (tone === 'publish') {\n this.savePublishDismissedAt(new Date().toISOString());\n }\n this.dismissToast(key);\n });\n toast.appendChild(close);\n }\n\n toast.addEventListener('mouseenter', () => {\n const entry = this.activeToasts.get(key);\n if (entry?.timeoutId) {\n clearTimeout(entry.timeoutId);\n entry.timeoutId = null;\n }\n });\n toast.addEventListener('mouseleave', () => this.scheduleToastDismiss(key));\n\n stack.appendChild(toast);\n this.domNodes.add(toast);\n\n this.activeToasts.set(key, {\n node: toast,\n timeoutId: null,\n count: 1,\n countEl,\n ttl,\n persistent,\n });\n this.scheduleToastDismiss(key);\n this.refreshToastVisibility();\n }\n\n private scheduleToastDismiss(key: string): void {\n const entry = this.activeToasts.get(key);\n if (!entry) return;\n\n if (entry.timeoutId) clearTimeout(entry.timeoutId);\n entry.timeoutId = entry.persistent\n ? null\n : setTimeout(() => this.dismissToast(key), entry.ttl);\n }\n\n private refreshToastVisibility(): void {\n const transient = Array.from(this.activeToasts.values()).filter(entry => !entry.persistent);\n const hiddenCount = Math.max(0, transient.length - MAX_VISIBLE_TOASTS);\n\n transient.forEach((entry, index) => {\n entry.node.classList.toggle('lc-mock-toast--hidden', index < hiddenCount);\n entry.node.classList.toggle('lc-mock-toast--older', index < transient.length - 1);\n });\n }\n\n private dismissToast(key: string): void {\n const entry = this.activeToasts.get(key);\n if (!entry) return;\n\n this.activeToasts.delete(key);\n if (entry.timeoutId) clearTimeout(entry.timeoutId);\n this.refreshToastVisibility();\n\n const { node } = entry;\n node.classList.add('lc-mock-out');\n const exitTimer = setTimeout(() => {\n this.exitTimers.delete(exitTimer);\n node.remove();\n this.domNodes.delete(node);\n }, 200);\n this.exitTimers.add(exitTimer);\n }\n\n private ensureStack(): HTMLElement | null {\n if (!document.body) return null;\n if (this.stackEl && document.body.contains(this.stackEl)) return this.stackEl;\n\n const stack = createEl('div', 'lc-mock-stack');\n stack.setAttribute('role', 'status');\n stack.setAttribute('aria-live', 'polite');\n document.body.appendChild(stack);\n this.stackEl = stack;\n return stack;\n }\n\n private ensureStyles(): void {\n if (!this.options.ui || !hasDocument() || this.styleEl || !document.head) return;\n\n const style = document.createElement('style');\n style.textContent = MOCK_STYLES;\n document.head.appendChild(style);\n this.styleEl = style;\n }\n}\n","/**\n * LearnCard Partner Connect SDK\n *\n * A Promise-based JavaScript utility for managing cross-origin message communication\n * between partner apps and the LearnCard host application.\n *\n * @example\n * ```typescript\n * import { createPartnerConnect } from '@learncard/partner-connect';\n *\n * const learnCard = createPartnerConnect({\n * hostOrigin: 'https://learncard.app'\n * });\n *\n * // Request user identity (SSO)\n * const identity = await learnCard.requestIdentity();\n * console.log('User DID:', identity.user.did);\n * ```\n */\n\nimport {\n compileInlineTemplate,\n isAppBuilderEditorOrigin,\n isAppBuilderPreviewHost,\n decodeManifestFromUrl,\n normalizeConsentRequest,\n renderCompiledTemplate,\n validateInlineTemplate,\n validateTemplateData,\n} from '@learncard/partner-connect-core';\nimport { PartnerConnectError } from './types';\nimport { MockHost } from './mock-host';\nimport type { MockHostContext } from './mock-host';\nimport type {\n InlineCredentialTemplate,\n InlineTemplateCredentialInput,\n InlineTemplateValidationError,\n PartnerConnectOptions,\n CapturedAppManifest,\n MockHostOptions,\n IdentityResponse,\n SendCredentialInput,\n SendCredentialResponse,\n TemplateCredentialInput,\n TemplateCredentialResponse,\n VerifiablePresentationRequest,\n CredentialSearchResponse,\n CredentialSpecificResponse,\n ConsentResponse,\n ConsentRequest,\n RequestConsentOptions,\n TemplateIssueResponse,\n CheckCredentialInput,\n CheckCredentialResponse,\n CheckIssuanceStatusInput,\n TemplateIssuanceStatusResponse,\n GetTemplateRecipientsInput,\n TemplateRecipientsResponse,\n RequestLearnerContextOptions,\n LearnerContextResponse,\n SyncStatus,\n SendAiSessionCredentialInput,\n SendAiSessionCredentialResponse,\n AppNotificationInput,\n AppNotificationResponse,\n IncrementCounterResponse,\n GetCounterResponse,\n GetCountersResponse,\n AppEvent,\n AppEventResponse,\n LearnCardError,\n PreviewCompiledTemplateResult,\n PostMessageRequest,\n PostMessageResponse,\n PendingRequest,\n} from './types';\n\nconst DEFAULT_PUBLISH_ORIGIN = 'https://learncard.app';\n\n// Re-export the class as a value plus all type exports.\n// `MockHost` is an internal implementation detail (constructed via\n// `createPartnerConnect({ mock, mockOptions })`); only its options type is public.\nexport { PartnerConnectError } from './types';\nexport { decodeManifestFromUrl };\nexport type * from './types';\n\n/** Maximum time to poll for sync completion before giving up (10 minutes) */\nconst SYNC_STATUS_POLL_MAX_DURATION_MS = 10 * 60 * 1000;\n\n/** Default wait for the host presence probe (see `hostProbeTimeout`). */\nconst DEFAULT_HOST_PROBE_TIMEOUT_MS = 1500;\n\nconst joinInlineTemplateErrors = (errors: InlineTemplateValidationError[]): string =>\n errors.map(error => `${error.path}: ${error.message}`).join('\\n');\n\nconst parseCompiledTemplateObject = (credentialTemplateJson: string): Record<string, unknown> => {\n return JSON.parse(\n credentialTemplateJson.replace(/:(\\s*)(\\{\\{\\w+\\}\\})(?=\\s*[,}\\]])/g, ':$1\"$2\"')\n ) as Record<string, unknown>;\n};\n\n/**\n * Compile and optionally render an inline credential template entirely offline.\n *\n * `compiled` contains the canonical OBv3 credential object with `{{variables}}`\n * preserved. If `templateData` is provided and valid, `rendered` contains the\n * same object with those variables substituted.\n */\nexport const previewCompiledTemplate = (\n template: InlineCredentialTemplate,\n templateData?: Record<string, unknown>\n): PreviewCompiledTemplateResult => {\n const templateErrors = validateInlineTemplate(template);\n\n if (templateErrors.length > 0) {\n return { valid: false, errors: templateErrors };\n }\n\n const compiledTemplate = compileInlineTemplate(template);\n const compiled = parseCompiledTemplateObject(compiledTemplate.credentialTemplateJson);\n\n if (templateData === undefined) {\n return { valid: true, errors: [], compiled };\n }\n\n const dataErrors = validateTemplateData(compiledTemplate.variableManifest, templateData);\n\n if (dataErrors.length > 0) {\n return { valid: false, errors: dataErrors, compiled };\n }\n\n return {\n valid: true,\n errors: [],\n compiled,\n rendered: renderCompiledTemplate(compiledTemplate.credentialTemplateJson, templateData),\n };\n};\n\nconst isTemplateAliasInput = (input: unknown): input is TemplateCredentialInput =>\n Boolean(\n input &&\n typeof input === 'object' &&\n 'templateAlias' in input &&\n typeof (input as TemplateCredentialInput).templateAlias === 'string'\n );\n\nconst isInlineTemplateInput = (input: unknown): input is InlineTemplateCredentialInput =>\n Boolean(\n input &&\n typeof input === 'object' &&\n 'alias' in input &&\n typeof (input as InlineTemplateCredentialInput).alias === 'string' &&\n 'template' in input\n );\n\nconst isConsentRequestInput = (input: unknown): input is ConsentRequest => {\n return Boolean(input && typeof input === 'object' && !Array.isArray(input));\n};\n\n/**\n * Whether a hostname is a local development host. `mock: 'auto'` only ever\n * activates on these, so a standalone page on a production or preview origin\n * never silently fabricates identity, consent, or credentials.\n */\nconst isLocalDevHost = (hostname: string): boolean =>\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === '[::1]' ||\n hostname === '::1' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.local');\n\n/**\n * Who is on the other side of our iframe boundary, as far as we can tell:\n * - 'learncard': ancestor origin matches a configured host pattern — real host.\n * - 'foreign': ancestor origin is known and matches nothing — an unrelated\n * wrapper (Storybook manager on another origin, preview shells, …). No\n * LearnCard host will ever answer.\n * - 'ambiguous': not embedded-verifiable — the ancestor origin is unavailable\n * (Firefox) or only matches the native-app localhost heuristic, which any\n * local wrapper (e.g. Storybook on localhost:6006) also matches.\n */\ntype ParentKind = 'learncard' | 'foreign' | 'ambiguous';\n\n/**\n * Detect whether the current page is running inside an embedded iframe.\n *\n * Returns `true` when the SDK is embedded (e.g. inside the LearnCard host) and\n * `false` when running as a standalone top-level page. Safe to call in any\n * environment: returns `false` during server-side rendering (no `window`).\n *\n * Partner apps can use this to change behavior without writing their own frame\n * detection — for example, showing a \"Open in LearnCard\" prompt when standalone.\n *\n * @example\n * ```typescript\n * import { isEmbedded } from '@learncard/partner-connect';\n *\n * if (isEmbedded()) {\n * // Running inside LearnCard — use the SDK against the real host.\n * } else {\n * // Standalone — show a preview banner, or rely on automatic mock mode.\n * }\n * ```\n */\nexport function isEmbedded(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n // A cross-origin parent still lets us compare WindowProxy references;\n // when access is blocked entirely the throw means we ARE embedded.\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\n/**\n * LearnCard Partner Connect SDK class\n */\nexport class PartnerConnect {\n /** Default host origin (security anchor) */\n public static readonly DEFAULT_HOST_ORIGIN = 'https://learncard.app';\n\n /**\n * Built-in list of LearnCard-managed tenant origins.\n *\n * These are merged with the partner app's configured `hostOrigin` whitelist\n * unless `disableDefaultTenants: true` is passed. This lets a partner app\n * run inside any current or future LearnCard tenant (staging, preview,\n * VetPass, etc.) without needing a re-deploy each time a new tenant is\n * onboarded.\n *\n * Patterns follow the same rules as user-supplied `hostOrigin` entries:\n * `*` is a wildcard for one or more DNS labels in the host portion.\n */\n public static readonly DEFAULT_TRUSTED_TENANTS: readonly string[] = [\n 'https://learncard.app',\n 'https://*.learncard.app',\n 'https://*.learncard.ai',\n 'https://vetpass.app',\n 'https://*.vetpass.app',\n ];\n\n private hostOrigins: string[] = ['https://learncard.app'];\n private activeHostOrigin: string = 'https://learncard.app';\n private allowNativeAppOrigins: boolean = true;\n private protocol: string = 'LEARNCARD_V1';\n private requestTimeout: number = 30000;\n private pendingRequests: Map<string, PendingRequest>;\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private isInitialized = false;\n private syncCompleteCallbacks: Set<(status: SyncStatus) => void> = new Set();\n private syncStatusPollId: ReturnType<typeof setInterval> | null = null;\n private mockHost: MockHost | null = null;\n /** Internal, non-public context handed to every {@link MockHost} we build. */\n private mockHostContext: MockHostContext = {};\n /**\n * Memoized override-derived publish origin. `undefined` means \"not looked\n * up yet\"; `null` means \"looked up, no usable override\". Caching keeps the\n * warning for an invalid value to a single log per instance.\n */\n private pinnedPublishOrigin: string | null | undefined;\n private embedded = false;\n private warnedNoHost = false;\n private hostProbeTimeout: number = DEFAULT_HOST_PROBE_TIMEOUT_MS;\n /** Whether a real LearnCard host is believed to be listening. */\n private hostReachable = false;\n /** Pending probe decision; requests queue behind it when set. */\n private activation: Promise<void> | null = null;\n\n constructor(options?: PartnerConnectOptions) {\n // Normalize hostOrigin to an array for whitelist validation\n const hostOrigin = options?.hostOrigin ?? PartnerConnect.DEFAULT_HOST_ORIGIN;\n const configured = Array.isArray(hostOrigin) ? hostOrigin : [hostOrigin];\n\n // Merge with the built-in tenant list unless the caller explicitly\n // opted out. De-duplicate while preserving order so the caller's\n // first entry remains the default active origin.\n const disableDefaults = options?.disableDefaultTenants === true;\n const merged = disableDefaults\n ? [...configured]\n : [...configured, ...PartnerConnect.DEFAULT_TRUSTED_TENANTS];\n this.hostOrigins = Array.from(new Set(merged));\n\n this.protocol = options?.protocol || 'LEARNCARD_V1';\n this.requestTimeout = options?.requestTimeout || 30000;\n this.allowNativeAppOrigins = options?.allowNativeAppOrigins ?? true;\n this.hostProbeTimeout = options?.hostProbeTimeout ?? DEFAULT_HOST_PROBE_TIMEOUT_MS;\n this.pendingRequests = new Map();\n this.configureActiveOrigin();\n this.setupMessageListener();\n this.embedded = isEmbedded();\n\n this.configureMockActivation(options);\n }\n\n private resolveMockOptions(options?: PartnerConnectOptions): MockHostOptions | undefined {\n if (options?.mockOptions?.publishOrigin) {\n this.mockHostContext = { publishOriginPinned: true };\n return options.mockOptions;\n }\n\n const publishOrigin = this.resolvePublishOrigin(options?.hostOrigin);\n\n this.mockHostContext = { publishOriginPinned: this.readPinnedPublishOrigin() !== null };\n\n return { ...(options?.mockOptions ?? {}), publishOrigin };\n }\n\n /**\n * Resolve the LearnCard origin that App Store publish links point at:\n * 1. `?lc_publish_override=` (query param, then this tab's stored value).\n * 2. `?lc_host_override=` (query param, then stored) when it names one\n * concrete http(s) origin — testing against a host implies publishing\n * to it.\n * 3. The first concrete configured `hostOrigin`.\n * 4. `DEFAULT_PUBLISH_ORIGIN`.\n *\n * `mockOptions.publishOrigin` outranks all of these and is applied by\n * {@link resolveMockOptions} before this runs.\n */\n private resolvePublishOrigin(hostOrigin?: string | string[]): string {\n return this.readPinnedPublishOrigin() ?? this.inferPublishOrigin(hostOrigin);\n }\n\n private readPinnedPublishOrigin(): string | null {\n if (this.pinnedPublishOrigin !== undefined) return this.pinnedPublishOrigin;\n\n this.pinnedPublishOrigin = this.readPublishOverride() ?? this.readHostOverrideForPublish();\n\n return this.pinnedPublishOrigin;\n }\n\n /**\n * Unlike `lc_host_override`, this is not a security boundary — it only\n * decides which LearnCard origin publish links target — so any parseable\n * http(s) origin is accepted rather than being whitelist-checked.\n */\n private readPublishOverride(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const param = new URLSearchParams(window.location.search).get('lc_publish_override');\n\n if (param) {\n const normalized = PartnerConnect.normalizePublishOrigin(param);\n\n if (normalized) {\n this.persistPublishOverride(normalized);\n console.log('[LearnCard SDK] Using lc_publish_override:', normalized);\n return normalized;\n }\n\n console.warn(\n '[LearnCard SDK] lc_publish_override is not a valid http(s) origin; ignoring:',\n param\n );\n }\n\n const stored = PartnerConnect.readSessionValue(\n PartnerConnect.PUBLISH_SESSION_STORAGE_KEY\n );\n\n if (stored) return PartnerConnect.normalizePublishOrigin(stored);\n } catch (error) {\n console.error('[LearnCard SDK] Error reading lc_publish_override:', error);\n }\n\n return null;\n }\n\n private readHostOverrideForPublish(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const candidates = [\n new URLSearchParams(window.location.search).get('lc_host_override'),\n PartnerConnect.readSessionValue(PartnerConnect.SESSION_STORAGE_KEY),\n ];\n\n for (const candidate of candidates) {\n // Wildcard patterns name a family of hosts, not one publishable origin.\n if (!candidate || candidate.includes('*')) continue;\n\n const normalized = PartnerConnect.normalizePublishOrigin(candidate);\n if (normalized) return normalized;\n }\n } catch {\n // A malformed location must never break initialization.\n }\n\n return null;\n }\n\n private static normalizePublishOrigin(value: string): string | null {\n try {\n const url = new URL(value);\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return null;\n\n return url.origin;\n } catch {\n return null;\n }\n }\n\n private static readSessionValue(key: string): string | null {\n try {\n return sessionStorage.getItem(key);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n return null;\n }\n }\n\n private inferPublishOrigin(hostOrigin?: string | string[]): string {\n const configuredOrigins = Array.isArray(hostOrigin)\n ? hostOrigin\n : hostOrigin\n ? [hostOrigin]\n : [];\n\n for (const origin of configuredOrigins) {\n if (origin.includes('*')) continue;\n if (this.isOriginNativeApp(origin)) continue;\n\n try {\n return new URL(origin).origin;\n } catch {\n // Ignore malformed configured origins and continue.\n }\n }\n\n return DEFAULT_PUBLISH_ORIGIN;\n }\n\n /**\n * Decide whether this instance talks to a real host, simulates one, or\n * fails fast — the resolution of the `mock` option against the runtime\n * embed context. See the `mock` option docs for the contract.\n */\n private configureMockActivation(options?: PartnerConnectOptions): void {\n const mockSetting = options?.mock ?? 'auto';\n const mockOptions = this.resolveMockOptions(options);\n\n if (mockSetting === true) {\n this.mockHost = new MockHost(mockOptions, this.mockHostContext);\n return;\n }\n\n // Whether this origin may fall back to mocking when no host answers:\n // 'standalone' anywhere, 'auto' only in local dev or an app builder's\n // editor preview (a standalone production page must never fabricate\n // identity or consent), false nowhere.\n const canAutoMock =\n mockSetting === 'standalone' ||\n (mockSetting === 'auto' && (this.isLocalDevContext() || this.isAppBuilderContext()));\n\n if (!this.embedded) {\n // Standalone page: no host can answer. hostReachable stays false,\n // so un-mocked calls fail fast with LC_NOT_EMBEDDED.\n if (canAutoMock) {\n this.mockHost = new MockHost(mockOptions, this.mockHostContext);\n }\n return;\n }\n\n switch (this.classifyParent()) {\n case 'learncard':\n this.hostReachable = true;\n return;\n\n case 'foreign':\n // Known non-LearnCard wrapper (e.g. cross-origin Storybook):\n // never postMessage into the 30s timeout. Mock where allowed,\n // fail fast everywhere else.\n if (canAutoMock) {\n this.mockHost = new MockHost(mockOptions, this.mockHostContext);\n }\n return;\n\n case 'ambiguous':\n if (canAutoMock) {\n // Could be a real (local/native) LearnCard host or an\n // unrelated wrapper. Ask: if the host answers a cheap\n // side-effect-free probe, stay real; otherwise mock.\n this.hostReachable = true;\n this.activation = this.probeHost(mockOptions);\n } else {\n // Mocking is off the table here anyway — preserve the\n // long-standing assumption that an unverifiable parent\n // is the real host.\n this.hostReachable = true;\n }\n return;\n }\n }\n\n private isLocalDevContext(): boolean {\n if (typeof window === 'undefined') return false;\n return isLocalDevHost(window.location.hostname);\n }\n\n /**\n * Whether the app is running inside an AI app builder's preview (Lovable,\n * Bolt, v0, Replit): either on a preview-only host, or framed by the\n * builder's editor. Firefox hides ancestor origins, so the referrer of an\n * embedded document stands in for the parent origin there.\n */\n private isAppBuilderContext(): boolean {\n if (typeof window === 'undefined') return false;\n if (isAppBuilderPreviewHost(window.location.hostname)) return true;\n if (!this.embedded) return false;\n\n const parentOrigin = this.readAncestorOrigin() ?? this.readReferrerOrigin();\n return parentOrigin !== null && isAppBuilderEditorOrigin(parentOrigin);\n }\n\n private readReferrerOrigin(): string | null {\n if (typeof document === 'undefined' || !document.referrer) return null;\n\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n\n private classifyParent(): ParentKind {\n const ancestorOrigin = this.readAncestorOrigin();\n\n if (!ancestorOrigin) return 'ambiguous';\n\n // Trust requires an explicit configured pattern match. The native-app\n // heuristic (any localhost origin) is NOT enough to call the parent\n // LearnCard — Storybook's manager frame matches it too.\n if (this.matchesConfiguredOrigin(ancestorOrigin)) return 'learncard';\n if (this.allowNativeAppOrigins && this.isOriginNativeApp(ancestorOrigin)) {\n return 'ambiguous';\n }\n\n return 'foreign';\n }\n\n private matchesConfiguredOrigin(origin: string): boolean {\n return this.hostOrigins.some(entry => PartnerConnect.matchesOriginPattern(origin, entry));\n }\n\n /**\n * One-time host presence probe for the ambiguous-parent case. Sends a\n * side-effect-free `GET_SYNC_STATUS`; an answer proves a live LearnCard\n * host (responses are origin-checked), a timeout means nobody is\n * listening and the mock takes over. Requests issued while the probe is\n * in flight queue behind the decision instead of racing it.\n */\n private probeHost(mockOptions?: MockHostOptions): Promise<void> {\n return this.postToHost('GET_SYNC_STATUS', undefined, this.hostProbeTimeout)\n .then(() => {\n this.activation = null;\n })\n .catch(() => {\n this.activation = null;\n if (this.isInitialized) {\n this.hostReachable = false;\n this.mockHost = new MockHost(mockOptions, this.mockHostContext);\n console.warn(\n '[LearnCard SDK] Embedded in a frame, but no LearnCard host answered ' +\n `within ${this.hostProbeTimeout}ms — activating standalone mock mode. ` +\n 'If a real local host was just slow to boot, raise `hostProbeTimeout`.'\n );\n }\n });\n }\n\n /**\n * Whether this SDK instance is running inside an embedded iframe.\n * Instance-level convenience wrapper around the standalone {@link isEmbedded}.\n */\n public isEmbedded(): boolean {\n return isEmbedded();\n }\n\n /**\n * Whether the current page is running inside an embedded iframe.\n * Static convenience wrapper around the standalone {@link isEmbedded}.\n */\n public static isEmbedded(): boolean {\n return isEmbedded();\n }\n\n /**\n * Whether this instance is currently simulating the LearnCard host locally\n * instead of talking to a real host over `postMessage`.\n */\n public isMocked(): boolean {\n return this.mockHost !== null;\n }\n\n /**\n * Read the app manifest captured by standalone mock mode.\n *\n * Returns `undefined` when this instance is talking to a real host, or when\n * mock mode has not captured anything yet.\n *\n * @example\n * ```typescript\n * const manifest = learnCard.getCapturedManifest();\n * if (manifest) {\n * console.log(manifest.permissions, manifest.templates);\n * }\n * ```\n */\n public getCapturedManifest(): CapturedAppManifest | undefined {\n return this.mockHost?.getCapturedManifest();\n }\n\n /**\n * Build the LearnCard App Store submission URL for the current captured manifest.\n *\n * Returns `undefined` unless mock mode is active and the SDK has captured at\n * least one manifest interaction. The publish prompt still uses a higher\n * threshold (at least 1 inline template or at least 2 distinct permissions)\n * before it auto-nudges the developer.\n *\n * @example\n * ```typescript\n * const publishUrl = learnCard.getPublishUrl();\n * if (publishUrl) {\n * window.open(publishUrl, '_blank', 'noopener');\n * }\n * ```\n */\n public getPublishUrl(): string | undefined {\n return this.mockHost?.getPublishUrl();\n }\n\n /** Clears this app's practice captures, credentials and counters. No-op outside mock mode. */\n public resetPracticeMode(): void {\n this.mockHost?.resetPracticeMode();\n }\n\n /**\n * Returns the currently active real-host origin, or `null` while standalone\n * mock mode is active.\n */\n public getActiveHostOrigin(): string | null {\n if (this.mockHost) return null;\n return this.activeHostOrigin || null;\n }\n\n /**\n * Returns the LearnCard origin used to build App Store publish URLs.\n *\n * Point this at a local or staging LearnCard with\n * `?lc_publish_override=<origin>`; see {@link resolvePublishOrigin} for\n * the full precedence order.\n */\n public getPublishOrigin(): string | null {\n if (this.mockHost) return this.mockHost.getPublishOrigin();\n return this.resolvePublishOrigin(this.hostOrigins);\n }\n\n /**\n * Configure the active host origin using the following hierarchy:\n * 1. `window.location.ancestorOrigins[0]` (when supported) — the browser's\n * view of who our parent frame is. Cannot be forged by a malicious\n * `lc_host_override` query param and therefore takes precedence.\n * 2. `?lc_host_override=<origin>` query param (for staging / cross-tenant).\n * 3. `sessionStorage` value saved from a previously-validated override.\n * 4. First configured origin.\n * 5. `DEFAULT_HOST_ORIGIN`.\n *\n * When a valid override is found in the query parameter, it is persisted\n * to sessionStorage so subsequent in-iframe navigations in the same tab\n * continue to use the same active origin.\n */\n private static readonly SESSION_STORAGE_KEY = 'lc_host_override';\n\n /** Persisted so the parameter only has to be typed once per tab. */\n private static readonly PUBLISH_SESSION_STORAGE_KEY = 'lc_publish_override';\n\n /**\n * Read `window.location.ancestorOrigins[0]` without throwing if the\n * property is unavailable (Firefox) or the list is empty (top-level\n * context, e.g. running outside of an iframe).\n */\n private readAncestorOrigin(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const ancestors = window.location.ancestorOrigins;\n\n if (ancestors && ancestors.length > 0) {\n const parent = ancestors[0];\n\n if (typeof parent === 'string' && parent.length > 0) {\n return parent;\n }\n }\n } catch {\n // `ancestorOrigins` is a WebKit/Blink extension; accessing it\n // under unusual conditions can throw. Treat as unavailable.\n }\n\n return null;\n }\n\n private configureActiveOrigin(): void {\n if (typeof window === 'undefined') {\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n return;\n }\n\n try {\n const ancestorOrigin = this.readAncestorOrigin();\n const urlParams = new URLSearchParams(window.location.search);\n const hostOverride = urlParams.get('lc_host_override');\n\n // Priority 1: the real parent origin as reported by the browser.\n // This is unspoofable by query-param manipulation, so if it is\n // trusted we use it and ignore any override. If both are present\n // and disagree, we log and prefer the ancestor.\n if (ancestorOrigin && this.isOriginInWhitelist(ancestorOrigin)) {\n if (hostOverride && hostOverride !== ancestorOrigin) {\n console.warn(\n '[LearnCard SDK] lc_host_override does not match the real parent origin; preferring parent.',\n { override: hostOverride, parent: ancestorOrigin }\n );\n }\n\n this.activeHostOrigin = ancestorOrigin;\n this.persistOverride(ancestorOrigin);\n console.log('[LearnCard SDK] Using parent origin:', ancestorOrigin);\n return;\n }\n\n // Priority 2: lc_host_override query parameter.\n if (hostOverride) {\n if (this.isOriginInWhitelist(hostOverride)) {\n this.activeHostOrigin = hostOverride;\n this.persistOverride(hostOverride);\n console.log('[LearnCard SDK] Using lc_host_override:', hostOverride);\n return;\n }\n\n console.warn(\n '[LearnCard SDK] lc_host_override value is not in the configured whitelist:',\n hostOverride,\n 'Allowed:',\n this.hostOrigins\n );\n }\n\n // Priority 3: a previously-validated override from this tab session.\n let storedOverride: string | null = null;\n\n try {\n storedOverride = sessionStorage.getItem(PartnerConnect.SESSION_STORAGE_KEY);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n }\n\n if (storedOverride && this.isOriginInWhitelist(storedOverride)) {\n this.activeHostOrigin = storedOverride;\n console.log('[LearnCard SDK] Using stored lc_host_override:', storedOverride);\n return;\n }\n\n // Priority 4/5: fall back to the first configured origin or default.\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n console.log('[LearnCard SDK] Using configured origin:', this.activeHostOrigin);\n } catch (error) {\n console.error('[LearnCard SDK] Error configuring active origin:', error);\n this.activeHostOrigin = this.hostOrigins[0] || PartnerConnect.DEFAULT_HOST_ORIGIN;\n }\n }\n\n private persistOverride(origin: string): void {\n try {\n sessionStorage.setItem(PartnerConnect.SESSION_STORAGE_KEY, origin);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n }\n }\n\n private persistPublishOverride(origin: string): void {\n try {\n sessionStorage.setItem(PartnerConnect.PUBLISH_SESSION_STORAGE_KEY, origin);\n } catch {\n // sessionStorage may be unavailable (e.g. sandboxed iframes)\n }\n }\n\n private isOriginNativeApp(origin: string): boolean {\n return (\n origin.startsWith('capacitor://') ||\n origin.startsWith('ionic://') ||\n origin.startsWith('https://localhost') ||\n origin.startsWith('http://localhost') ||\n origin.startsWith('http://127.0.0.1')\n );\n }\n\n /**\n * Internal placeholder substituted in for `*` so that `new URL(...)` can\n * parse a wildcard pattern. Chosen to be a syntactically-valid DNS label\n * that cannot collide with a real hostname.\n */\n private static readonly WILDCARD_PLACEHOLDER = '__lc_wildcard__';\n\n /** `*` (any number of occurrences) for replacement in the pattern. */\n private static readonly WILDCARD_REGEX = /\\*/g;\n\n /** The required leading-label form a wildcard pattern must take. */\n private static readonly WILDCARD_LEADING_PREFIX = `${PartnerConnect.WILDCARD_PLACEHOLDER}.`;\n\n /**\n * Check whether a candidate origin matches a configured whitelist entry.\n *\n * Supports exact matches and wildcard patterns. A wildcard entry has the\n * form `<protocol>://*.<domain>` and matches any origin with the same\n * protocol, same port, and a host ending in `.<domain>` with at least\n * one non-empty DNS label in place of the `*`.\n *\n * Examples with pattern `https://*.learncard.app`:\n * - `https://staging.learncard.app` → match\n * - `https://pr-1.preview.learncard.app` → match\n * - `https://learncard.app` → no match (no subdomain)\n * - `http://staging.learncard.app` → no match (protocol mismatch)\n * - `https://learncard.app.attacker.com` → no match (suffix mismatch)\n *\n * Exposed as a public static so it can be unit-tested directly without\n * standing up a full SDK instance.\n */\n public static matchesOriginPattern(candidate: string, pattern: string): boolean {\n if (candidate === pattern) return true;\n if (!pattern.includes('*')) return false;\n\n let patternUrl: URL;\n let candidateUrl: URL;\n\n try {\n // Replace the wildcard labels with a syntactically-valid host so\n // URL() can parse it; we validate the real shape ourselves below.\n patternUrl = new URL(\n pattern.replace(PartnerConnect.WILDCARD_REGEX, PartnerConnect.WILDCARD_PLACEHOLDER)\n );\n candidateUrl = new URL(candidate);\n } catch {\n return false;\n }\n\n // Protocol, port, and (empty) path-origin must match exactly.\n if (patternUrl.protocol !== candidateUrl.protocol) return false;\n if (patternUrl.port !== candidateUrl.port) return false;\n\n const patternHost = patternUrl.hostname;\n const candidateHost = candidateUrl.hostname;\n\n // Only allow wildcards as leading label(s): `*.foo.bar`, not `a*.b` or\n // `foo.*.bar`. This keeps the matching rule predictable and safe.\n if (!patternHost.startsWith(PartnerConnect.WILDCARD_LEADING_PREFIX)) return false;\n\n const patternSuffix = patternHost.slice(PartnerConnect.WILDCARD_LEADING_PREFIX.length);\n\n if (patternSuffix.length === 0) return false;\n // No further wildcards anywhere else in the pattern.\n if (patternSuffix.includes(PartnerConnect.WILDCARD_PLACEHOLDER)) return false;\n\n // Candidate must end with `.<suffix>` and have at least one label\n // before the suffix (the portion that the `*` stands in for).\n const required = '.' + patternSuffix;\n\n if (!candidateHost.endsWith(required)) return false;\n\n const prefix = candidateHost.slice(0, candidateHost.length - required.length);\n\n if (prefix.length === 0) return false;\n // Labels in the prefix must themselves be non-empty (no `..`).\n if (prefix.startsWith('.') || prefix.endsWith('.')) return false;\n if (prefix.split('.').some(label => label.length === 0)) return false;\n\n return true;\n }\n\n /**\n * Check if an origin is in the effective whitelist (exact origins +\n * wildcard patterns + optional native-app origins).\n */\n private isOriginInWhitelist(origin: string): boolean {\n if (!origin) return false;\n\n for (const entry of this.hostOrigins) {\n if (PartnerConnect.matchesOriginPattern(origin, entry)) return true;\n }\n\n if (this.allowNativeAppOrigins && this.isOriginNativeApp(origin)) return true;\n\n return false;\n }\n\n /**\n * Check if an event origin is valid against the active host origin\n *\n * Security Rule: Incoming messages must exactly match the active host origin.\n * This prevents malicious actors from spoofing origins via query parameters.\n *\n * @param eventOrigin - The origin from the MessageEvent\n * @returns true if the origin is valid\n */\n private isValidOrigin(eventOrigin: string): boolean {\n // STRICT: Exact match with active host origin only\n return eventOrigin === this.activeHostOrigin;\n }\n\n /**\n * Set up the central message listener to handle responses from the LearnCard host\n */\n private setupMessageListener(): void {\n if (typeof window === 'undefined') {\n throw new Error('PartnerConnect SDK can only be used in a browser environment');\n }\n\n this.messageListener = (event: MessageEvent) => {\n // SECURITY CHECK 1: Strict origin validation - must exactly match active host origin\n if (!this.isValidOrigin(event.origin)) {\n // Silently ignore messages from unauthorized origins\n return;\n }\n\n const data = event.data as PostMessageResponse;\n\n // SECURITY CHECK 2: Validate protocol and requestId\n if (data.protocol !== this.protocol || !data.requestId) {\n return;\n }\n\n // Only responses may settle a pending request. Without this, an\n // echoed/looped-back copy of our own outbound request (same\n // requestId, no type) would evict the entry and leave the caller\n // hanging with its timeout already cleared.\n if (data.type !== 'SUCCESS' && data.type !== 'ERROR') {\n return;\n }\n\n // Look up the pending request\n const pending = this.pendingRequests.get(data.requestId);\n if (!pending) {\n return; // Ignore stale or unrecognized responses\n }\n\n // Clean up\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(data.requestId);\n\n // Resolve or reject the promise\n if (data.type === 'SUCCESS') {\n pending.resolve(data.data);\n } else if (data.type === 'ERROR') {\n pending.reject(\n PartnerConnectError.from(\n data.error || {\n code: 'UNKNOWN_ERROR',\n message: 'An unknown error occurred',\n }\n )\n );\n }\n };\n\n window.addEventListener('message', this.messageListener);\n this.isInitialized = true;\n }\n\n /**\n * Generate a unique request ID\n */\n private generateRequestId(action: string): string {\n return `${action}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Send a message to the parent window and return a Promise. While a host\n * presence probe is pending, requests queue behind its decision so they\n * are answered by whichever side (real host or mock) actually exists.\n */\n private sendMessage<T = unknown>(action: string, payload?: unknown): Promise<T> {\n if (this.activation) {\n return this.activation.then(() => this.dispatchMessage<T>(action, payload));\n }\n\n return this.dispatchMessage<T>(action, payload);\n }\n\n private dispatchMessage<T = unknown>(action: string, payload?: unknown): Promise<T> {\n if (!this.isInitialized) {\n return Promise.reject(\n new PartnerConnectError('SDK_NOT_INITIALIZED', 'SDK is not initialized')\n );\n }\n\n if (this.mockHost) {\n return this.mockHost\n .handle(action, payload)\n .then(data => data as T)\n .catch(error => {\n throw PartnerConnectError.from(error);\n });\n }\n\n // No reachable host and not mocking (standalone page, or embedded in\n // a non-LearnCard wrapper): no host will ever answer this message, so\n // fail immediately with an actionable error instead of hanging until\n // the request timeout fires.\n if (!this.hostReachable) {\n if (!this.warnedNoHost) {\n this.warnedNoHost = true;\n console.error(\n '[LearnCard SDK] No LearnCard host is present (the app is standalone or ' +\n 'inside a non-LearnCard frame), so SDK calls cannot complete. Embed ' +\n 'your app in LearnCard, or pass `mock: true` to simulate the host ' +\n 'during standalone development. Use isEmbedded() to branch your UI ' +\n 'before calling.'\n );\n }\n\n return Promise.reject(\n new PartnerConnectError(\n 'LC_NOT_EMBEDDED',\n `Cannot ${action}: the app is not embedded in a LearnCard host.`\n )\n );\n }\n\n return this.postToHost<T>(action, payload, this.requestTimeout);\n }\n\n private postToHost<T = unknown>(action: string, payload: unknown, timeout: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const requestId = this.generateRequestId(action);\n\n const timeoutId = setTimeout(() => {\n if (this.pendingRequests.has(requestId)) {\n this.pendingRequests.delete(requestId);\n reject(\n new PartnerConnectError(\n 'LC_TIMEOUT',\n `Request ${action} timed out after ${timeout}ms`\n )\n );\n }\n }, timeout);\n\n // Store the pending request\n this.pendingRequests.set(requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeoutId,\n });\n\n // Construct the message\n const message: PostMessageRequest = {\n protocol: this.protocol,\n action,\n requestId,\n payload,\n };\n\n // Send to parent window with the active host origin (configured or overridden)\n window.parent.postMessage(message, this.activeHostOrigin);\n });\n }\n\n /**\n * Request user identity (Single Sign-On)\n *\n * @returns Promise resolving to user identity including DID and JWT token\n * @throws {LearnCardError} When user is not authenticated or request fails\n *\n * @example\n * ```typescript\n * const identity = await learnCard.requestIdentity();\n * console.log('User DID:', identity.user.did);\n * console.log('JWT Token:', identity.token);\n * ```\n */\n public requestIdentity(): Promise<IdentityResponse> {\n return this.sendMessage<IdentityResponse>('REQUEST_IDENTITY', {\n challenge: `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n });\n }\n\n /**\n * Validate an inline credential template entirely offline.\n *\n * This performs the same local checks that {@link sendCredential} runs for\n * inline templates before posting any message to LearnCard.\n *\n * @param template - Inline credential template to validate\n * @param templateData - Optional runtime variable values to validate against the compiled manifest\n * @returns Validation status plus path-based errors suitable for UI display\n *\n * @example\n * ```typescript\n * const result = learnCard.validateCredentialTemplate(\n * {\n * name: 'Completed {{courseName}}',\n * description: 'Awarded for finishing {{courseName}}.',\n * achievementType: 'Course',\n * criteria: { narrative: 'Finished all modules' }\n * },\n * { courseName: 'Intro to Baking' }\n * );\n *\n * if (!result.valid) {\n * console.error(result.errors.map(error => `${error.path}: ${error.message}`).join('\\n'));\n * }\n * ```\n */\n public validateCredentialTemplate(\n template: InlineCredentialTemplate,\n templateData?: Record<string, unknown>\n ): { valid: boolean; errors: InlineTemplateValidationError[] } {\n const templateErrors = validateInlineTemplate(template);\n\n if (templateErrors.length > 0) {\n return { valid: false, errors: templateErrors };\n }\n\n const compiled = compileInlineTemplate(template);\n const dataErrors = validateTemplateData(compiled.variableManifest, templateData);\n\n if (dataErrors.length > 0) {\n return { valid: false, errors: dataErrors };\n }\n\n return { valid: true, errors: [] };\n }\n\n /**\n * Compile and optionally render an inline credential template entirely offline.\n */\n public previewCompiledTemplate(\n template: InlineCredentialTemplate,\n templateData?: Record<string, unknown>\n ): PreviewCompiledTemplateResult {\n return previewCompiledTemplate(template, templateData);\n }\n\n /**\n * Send a credential to the user's LearnCard wallet\n *\n * Supports two modes:\n * 1. **Raw credential**: Pass a full verifiable credential object\n * 2. **Template-based**: Pass `{ templateAlias, templateData }` to issue from a pre-configured boost template\n * 3. **Inline template**: Pass `{ alias, template, templateData }` to issue from a zero-config inline template\n *\n * @param input - Either a verifiable credential or a template-based input\n * @returns Promise resolving to credential response\n *\n * @example Raw credential\n * ```typescript\n * const response = await learnCard.sendCredential({\n * '@context': ['https://www.w3.org/2018/credentials/v1'],\n * type: ['VerifiableCredential'],\n * credentialSubject: { id: 'did:example:123' }\n * });\n * console.log('Credential ID:', response.credentialId);\n * ```\n *\n * @example Template-based (for App Store apps)\n * ```typescript\n * const response = await learnCard.sendCredential({\n * templateAlias: 'achievement-badge',\n * templateData: { score: '95', courseName: 'Web Dev 101' }\n * });\n * console.log('Credential URI:', response.credentialUri);\n * ```\n *\n * @example Inline template (zero-config)\n * ```typescript\n * await learnCard.sendCredential({\n * alias: 'course-complete',\n * template: {\n * name: 'Completed {{courseName}}',\n * description: 'Awarded for finishing {{courseName}}.',\n * achievementType: 'Course',\n * criteria: { narrative: 'Finished all modules' }\n * },\n * templateData: { courseName: 'Intro to Baking' }\n * });\n * ```\n */\n public sendCredential(\n input: SendCredentialInput\n ): Promise<SendCredentialResponse | TemplateCredentialResponse> {\n if (isInlineTemplateInput(input)) {\n const templateErrors = validateInlineTemplate(input.template);\n\n if (templateErrors.length > 0) {\n return Promise.reject(\n new PartnerConnectError(\n 'TEMPLATE_INVALID',\n joinInlineTemplateErrors(templateErrors)\n )\n );\n }\n\n const compiled = compileInlineTemplate(input.template);\n const dataErrors = validateTemplateData(compiled.variableManifest, input.templateData);\n\n if (dataErrors.length > 0) {\n return Promise.reject(\n new PartnerConnectError(\n 'TEMPLATE_DATA_INVALID',\n joinInlineTemplateErrors(dataErrors)\n )\n );\n }\n\n return this.sendAppEvent<TemplateCredentialResponse>({\n type: 'send-credential',\n alias: input.alias,\n template: input.template,\n templateData: input.templateData,\n preventDuplicateClaim: input.preventDuplicateClaim,\n });\n }\n\n if (isTemplateAliasInput(input)) {\n const templateInput = input;\n\n return this.sendAppEvent<TemplateCredentialResponse>({\n type: 'send-credential',\n templateAlias: templateInput.templateAlias,\n templateData: templateInput.templateData,\n preventDuplicateClaim: templateInput.preventDuplicateClaim,\n });\n }\n\n return this.sendMessage<SendCredentialResponse>('SEND_CREDENTIAL', { credential: input });\n }\n\n /**\n * Check whether the current user already has a credential from a given boost template.\n * This is a silent, non-interactive status check for installed app integrations.\n */\n public checkUserHasCredential(input: CheckCredentialInput): Promise<CheckCredentialResponse> {\n return this.sendAppEvent<CheckCredentialResponse>({\n type: 'check-credential',\n ...input,\n });\n }\n\n /**\n * Check if the current user has issued/sent a specific template to someone.\n * Returns issuance status including sent date and claim status.\n *\n * @param input - Template identifier (templateAlias or boostUri) and recipient identifier (recipientDid or recipientProfileId)\n * @returns Promise resolving to issuance status response\n *\n * @example\n * ```typescript\n * // Check if user already issued 'achievement-badge' to a specific person\n * const status = await learnCard.getTemplateIssuanceStatus({\n * templateAlias: 'achievement-badge',\n * recipientProfileId: 'user123'\n * });\n *\n * if (status.sent) {\n * console.log('Already issued on:', status.sentDate);\n * console.log('Status:', status.status); // 'pending', 'claimed', or 'revoked'\n * }\n * ```\n */\n public getTemplateIssuanceStatus(\n input: CheckIssuanceStatusInput\n ): Promise<TemplateIssuanceStatusResponse> {\n return this.sendAppEvent<TemplateIssuanceStatusResponse>({\n type: 'check-issuance-status',\n ...input,\n });\n }\n\n /**\n * Get the list of all recipients for a specific template/boost.\n * Useful for dashboards showing who has received a credential.\n *\n * @param input - Template identifier (templateAlias or boostUri) and optional pagination params\n * @returns Promise resolving to paginated list of recipients\n *\n * @example\n * ```typescript\n * // Get first 10 recipients of 'achievement-badge'\n * const recipients = await learnCard.getTemplateRecipients({\n * templateAlias: 'achievement-badge',\n * limit: 10\n * });\n *\n * console.log(`Found ${recipients.records.length} recipients`);\n * recipients.records.forEach(r => {\n * console.log(`${r.recipientDisplayName}: ${r.status}`);\n * });\n *\n * // Get next page if available\n * if (recipients.hasMore) {\n * const nextPage = await learnCard.getTemplateRecipients({\n * templateAlias: 'achievement-badge',\n * limit: 10,\n * cursor: recipients.cursor\n * });\n * }\n * ```\n */\n public getTemplateRecipients(\n input: GetTemplateRecipientsInput\n ): Promise<TemplateRecipientsResponse> {\n return this.sendAppEvent<TemplateRecipientsResponse>({\n type: 'get-template-recipients',\n ...input,\n });\n }\n\n /**\n * Launch a feature in the LearnCard host application\n *\n * @param featurePath - Path to the feature (e.g., '/ai/topics')\n * @param initialPrompt - Optional initial prompt or data\n *\n * @example\n * ```typescript\n * await learnCard.launchFeature(\n * '/ai/topics?shortCircuitStep=newTopic',\n * 'Help me understand cryptography'\n * );\n * ```\n */\n public launchFeature(featurePath: string, initialPrompt?: string): Promise<void> {\n return this.sendMessage<void>('LAUNCH_FEATURE', { featurePath, initialPrompt });\n }\n\n /**\n * Request credentials from the user's wallet using a query\n *\n * @param verifiablePresentationRequest - VPR with query criteria\n * @returns Promise resolving to verifiable presentation\n *\n * @example\n * ```typescript\n * const response = await learnCard.askCredentialSearch({\n * query: [{\n * type: 'QueryByTitle',\n * credentialQuery: {\n * reason: 'We need to verify your skills',\n * title: 'JavaScript Expert'\n * }\n * }],\n * challenge: 'challenge-123',\n * domain: window.location.hostname\n * });\n *\n * if (response.verifiablePresentation) {\n * console.log('Received credentials:', response.verifiablePresentation.verifiableCredential);\n * }\n * ```\n */\n public askCredentialSearch(\n verifiablePresentationRequest: VerifiablePresentationRequest\n ): Promise<CredentialSearchResponse> {\n return this.sendMessage<CredentialSearchResponse>('ASK_CREDENTIAL_SEARCH', {\n verifiablePresentationRequest,\n });\n }\n\n /**\n * Request a specific credential by ID\n *\n * @param credentialId - The ID of the credential to request\n * @returns Promise resolving to the credential\n *\n * @example\n * ```typescript\n * const response = await learnCard.askCredentialSpecific('credential-id-123');\n * if (response.credential) {\n * console.log('Received credential:', response.credential);\n * }\n * ```\n */\n public askCredentialSpecific(credentialId: string): Promise<CredentialSpecificResponse> {\n return this.sendMessage<CredentialSpecificResponse>('ASK_CREDENTIAL_SPECIFIC', {\n credentialId,\n });\n }\n\n /**\n * Request user consent for permissions.\n *\n * Pass either a pre-created consent contract URI, or a declarative consent\n * request and let LearnCard resolve or create the backing contract.\n *\n * @param requestOrContractUri - Consent scope request or explicit contract URI\n * @param options - Additional options including redirect behavior\n * @returns Promise resolving to consent response\n *\n * @example\n * ```typescript\n * // With explicit contract URI (for external/non-app store integrations)\n * const response = await learnCard.requestConsent('lc:network:network.learncard.com/trpc:contract:abc123');\n *\n * // Declarative scopes (LearnCard upserts the contract automatically)\n * const { granted } = await learnCard.requestConsent({\n * read: { credentialCategories: ['Achievement', 'Skill'], personalFields: ['name'] },\n * write: { credentialCategories: ['Achievement'] },\n * reason: 'Personalize your training plan',\n * });\n * ```\n */\n public requestConsent(\n request: ConsentRequest,\n options?: RequestConsentOptions\n ): Promise<ConsentResponse>;\n public requestConsent(\n contractUri?: string,\n options?: RequestConsentOptions\n ): Promise<ConsentResponse>;\n public requestConsent(\n requestOrContractUri?: string | ConsentRequest,\n options: RequestConsentOptions = {}\n ): Promise<ConsentResponse> {\n const { redirect = false } = options;\n\n if (isConsentRequestInput(requestOrContractUri)) {\n try {\n normalizeConsentRequest(requestOrContractUri);\n } catch (error) {\n return Promise.reject(\n new PartnerConnectError(\n 'CONSENT_SCOPES_INVALID',\n error instanceof Error ? error.message : 'Invalid consent scopes'\n )\n );\n }\n\n return this.sendMessage<ConsentResponse>('REQUEST_CONSENT', {\n scopes: requestOrContractUri,\n redirect,\n });\n }\n\n return this.sendMessage<ConsentResponse>('REQUEST_CONSENT', {\n contractUri: requestOrContractUri,\n redirect,\n });\n }\n\n /**\n * Initiate a template-based credential issuance flow\n *\n * @param templateId - ID of the template/boost to issue\n * @param draftRecipients - Optional array of recipient DIDs\n * @returns Promise resolving to template issue response\n *\n * @example\n * ```typescript\n * const response = await learnCard.initiateTemplateIssue(\n * 'lc:network:network.learncard.com/trpc:boost:xyz789',\n * ['did:key:abc', 'did:key:def']\n * );\n *\n * if (response.issued) {\n * console.log('Template issued successfully');\n * }\n * ```\n */\n public initiateTemplateIssue(\n templateId: string,\n draftRecipients?: string[]\n ): Promise<TemplateIssueResponse> {\n return this.sendMessage<TemplateIssueResponse>('INITIATE_TEMPLATE_ISSUE', {\n templateId,\n draftRecipients: draftRecipients || [],\n });\n }\n\n /**\n * Request comprehensive learner context for AI tutoring systems.\n *\n * This method retrieves the user's credentials and personal data,\n * then formats them into an LLM-ready prompt that can be injected directly into\n * an AI system prompt.\n *\n * @param options - Configuration options for what data to include and how to format it\n * @returns Promise resolving to learner context with prompt and optional raw data\n *\n * @example\n * ```typescript\n * // Get LLM-ready prompt with credentials and personal data\n * const context = await learnCard.requestLearnerContext({\n * includeCredentials: true,\n * includePersonalData: true,\n * waitForSync: true,\n * format: 'prompt',\n * instructions: 'Focus on technical skills and certifications',\n * detailLevel: 'expanded'\n * });\n *\n * if (context.status === 'syncing') {\n * const unsubscribe = learnCard.onSyncComplete(async () => {\n * const readyContext = await learnCard.requestLearnerContext({ waitForSync: true });\n * unsubscribe();\n * });\n * }\n *\n * // Use in AI system prompt\n * const systemPrompt = `You are a helpful tutor. ${context.prompt}`;\n *\n * // Access structured data if needed\n * console.log('User DID:', context.did);\n * console.log('Credentials count:', context.raw?.credentials.length);\n * ```\n */\n public async requestLearnerContext(\n options?: RequestLearnerContextOptions\n ): Promise<LearnerContextResponse> {\n const startedAt = performance.now();\n const response = await this.sendMessage<LearnerContextResponse>('REQUEST_LEARNER_CONTEXT', {\n includeCredentials: options?.includeCredentials ?? true,\n includePersonalData: options?.includePersonalData ?? false,\n format: options?.format ?? 'prompt',\n instructions: options?.instructions,\n detailLevel: options?.detailLevel ?? 'compact',\n waitForSync: options?.waitForSync ?? false,\n });\n\n response.metadata ??= {};\n response.metadata.timings ??= { totalMs: 0 };\n response.metadata.timings.sdkRoundTripMs = performance.now() - startedAt;\n\n return response;\n }\n\n /**\n * Get the current LearnCard background data sync status.\n */\n public getSyncStatus(): Promise<SyncStatus> {\n return this.sendMessage<SyncStatus>('GET_SYNC_STATUS');\n }\n\n /**\n * Register a callback that fires when LearnCard reports background sync has reached a\n * terminal state ('ready' or 'error'). Check `status.status` to distinguish the two.\n * Polling stops once a terminal state is reached, all callbacks unsubscribe, or the\n * poll exceeds its maximum duration (reported to callbacks as an 'error' status).\n * Returns an unsubscribe function.\n */\n public onSyncComplete(callback: (status: SyncStatus) => void): () => void {\n this.syncCompleteCallbacks.add(callback);\n\n if (!this.syncStatusPollId) {\n const pollStartedAt = Date.now();\n\n const stopPolling = () => {\n if (this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n };\n\n this.syncStatusPollId = setInterval(() => {\n if (Date.now() - pollStartedAt > SYNC_STATUS_POLL_MAX_DURATION_MS) {\n stopPolling();\n const timeoutStatus: SyncStatus = {\n status: 'error',\n progress: {\n totalCredentials: 0,\n completedCredentials: 0,\n failedCredentials: 0,\n retryCount: 0,\n },\n lastError: 'Timed out waiting for sync to complete',\n };\n this.syncCompleteCallbacks.forEach(cb => cb(timeoutStatus));\n return;\n }\n\n this.getSyncStatus()\n .then(status => {\n if (status.status !== 'ready' && status.status !== 'error') return;\n\n stopPolling();\n this.syncCompleteCallbacks.forEach(cb => cb(status));\n })\n .catch(() => undefined);\n }, 1000);\n }\n\n return () => {\n this.syncCompleteCallbacks.delete(callback);\n if (this.syncCompleteCallbacks.size === 0 && this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n };\n }\n\n /**\n * Send a generic event to be processed by the brain service on behalf of this app.\n * This is used for backend-like operations such as issuing credentials.\n *\n * @param event - The event payload to send\n * @returns Promise resolving to the event response\n *\n * @example\n * ```typescript\n * // Issue a credential to the current user\n * const response = await learnCard.sendAppEvent({\n * type: 'send-credential',\n * templateAlias: 'achievement-badge',\n * templateData: { score: '95' }\n * });\n *\n * if (response.credentialUri) {\n * console.log('Credential issued:', response.credentialUri);\n * }\n * ```\n */\n public sendAppEvent<T = AppEventResponse>(event: AppEvent): Promise<T> {\n return this.sendMessage<T>('APP_EVENT', event);\n }\n\n /**\n * Create and send an AI Session credential to the user.\n *\n * This method manages the AI Topic → AI Session hierarchy:\n * - Ensures an AI Topic exists for this app (creates one if needed)\n * - Creates a new AI Session as a child of the topic\n * - The topic appears in the user's AI Sessions page with the app's name\n * - All sessions from this app are organized under that topic\n *\n * @param input - Session details including title and optional metadata\n * @returns Promise resolving to topic and session URIs\n */\n public sendAiSessionCredential(\n input: SendAiSessionCredentialInput\n ): Promise<SendAiSessionCredentialResponse> {\n return this.sendAppEvent<SendAiSessionCredentialResponse>({\n type: 'send-ai-session-credential',\n ...input,\n });\n }\n\n /**\n * Send a notification to the current user from this app.\n * The notification appears in the user's LearnCard notification inbox.\n */\n public sendNotification(input: AppNotificationInput): Promise<AppNotificationResponse> {\n return this.sendAppEvent<AppNotificationResponse>({\n type: 'send-notification',\n ...input,\n });\n }\n\n /**\n * Increment or decrement an app-scoped counter for the current user.\n */\n public incrementCounter(key: string, amount: number): Promise<IncrementCounterResponse> {\n return this.sendAppEvent<IncrementCounterResponse>({\n type: 'increment-counter',\n key,\n amount,\n });\n }\n\n /**\n * Read the current value of an app-scoped counter for the current user.\n */\n public getCounter(key: string): Promise<GetCounterResponse> {\n return this.sendAppEvent<GetCounterResponse>({\n type: 'get-counter',\n key,\n });\n }\n\n /**\n * Read multiple app-scoped counters at once for the current user.\n */\n public getCounters(keys?: string[]): Promise<GetCountersResponse> {\n return this.sendAppEvent<GetCountersResponse>({\n type: 'get-counters',\n ...(keys ? { keys } : {}),\n });\n }\n\n /**\n * Clean up the SDK and remove event listeners\n */\n public destroy(): void {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n // Reject all pending requests\n for (const [requestId, pending] of this.pendingRequests.entries()) {\n clearTimeout(pending.timeoutId);\n pending.reject(\n new PartnerConnectError(\n 'SDK_DESTROYED',\n 'SDK was destroyed before request completed'\n )\n );\n }\n\n this.pendingRequests.clear();\n\n if (this.syncStatusPollId) {\n clearInterval(this.syncStatusPollId);\n this.syncStatusPollId = null;\n }\n this.syncCompleteCallbacks.clear();\n\n if (this.mockHost) {\n this.mockHost.destroy();\n this.mockHost = null;\n }\n\n this.isInitialized = false;\n }\n}\n\n/**\n * Factory function to create a PartnerConnect instance\n *\n * @param options - Configuration options\n * @returns PartnerConnect instance\n *\n * @example\n * ```typescript\n * const learnCard = createPartnerConnect({\n * hostOrigin: 'https://learncard.app',\n * protocol: 'LEARNCARD_V1',\n * requestTimeout: 30000\n * });\n * ```\n */\nexport function createPartnerConnect(options?: PartnerConnectOptions): PartnerConnect {\n return new PartnerConnect(options);\n}\n\n// Default export for convenience\nexport default createPartnerConnect;\n"],"names":["__publicField","DEFAULT_PUBLISH_ORIGIN","boostUri","record","_a","_b","raw","hud"],"mappings":"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"}
|