@pie-players/pie-players-shared 0.3.61 → 0.3.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/config/profile.js +0 -1
  2. package/dist/i18n/index.js +0 -1
  3. package/dist/i18n/loader.js +0 -1
  4. package/dist/i18n/simple-i18n.js +0 -1
  5. package/dist/i18n/types.js +0 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +1 -1
  8. package/dist/instrumentation/debug-panel-stream.js +0 -1
  9. package/dist/instrumentation/index.js +0 -1
  10. package/dist/instrumentation/provider-guards.js +0 -1
  11. package/dist/instrumentation/providers/BaseInstrumentationProvider.js +0 -1
  12. package/dist/instrumentation/providers/CompositeInstrumentationProvider.js +0 -1
  13. package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js +0 -1
  14. package/dist/instrumentation/providers/DebugPanelInstrumentationProvider.js +0 -1
  15. package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js +0 -1
  16. package/dist/instrumentation/providers/index.js +0 -1
  17. package/dist/instrumentation/types.js +0 -1
  18. package/dist/loader-config.js +0 -1
  19. package/dist/loaders/ElementLoader.js +0 -1
  20. package/dist/loaders/element-loader-types.js +0 -1
  21. package/dist/loaders/element-loader.js +0 -1
  22. package/dist/loaders/element-package-policy.js +0 -1
  23. package/dist/loaders/esm-adapter.js +0 -1
  24. package/dist/loaders/iife-adapter.js +0 -1
  25. package/dist/loaders/index.js +0 -1
  26. package/dist/object/index.js +0 -1
  27. package/dist/pie/asset-handler.js +0 -1
  28. package/dist/pie/authoring-tag.js +0 -1
  29. package/dist/pie/authoring.js +0 -1
  30. package/dist/pie/component-context.js +0 -1
  31. package/dist/pie/config.js +0 -1
  32. package/dist/pie/configure-initialization.js +0 -1
  33. package/dist/pie/correct-response-env.js +0 -1
  34. package/dist/pie/custom-element-define.js +0 -1
  35. package/dist/pie/index.js +0 -1
  36. package/dist/pie/initialization.js +0 -1
  37. package/dist/pie/instrumentation-event-bridge.js +0 -1
  38. package/dist/pie/instrumentation-event-map.js +0 -1
  39. package/dist/pie/instrumentation-provider-resolution.js +0 -1
  40. package/dist/pie/item-controller-storage.js +0 -1
  41. package/dist/pie/item-controller.js +0 -1
  42. package/dist/pie/item-session-contract.js +0 -1
  43. package/dist/pie/logger.js +0 -1
  44. package/dist/pie/math-rendering.js +0 -1
  45. package/dist/pie/overrides.js +0 -1
  46. package/dist/pie/player-initializer.js +0 -1
  47. package/dist/pie/registry.js +0 -1
  48. package/dist/pie/resource-monitor.js +0 -1
  49. package/dist/pie/scoring.js +0 -1
  50. package/dist/pie/stage-tracker.js +0 -1
  51. package/dist/pie/stages.js +0 -1
  52. package/dist/pie/tag-names.js +0 -1
  53. package/dist/pie/types.js +0 -1
  54. package/dist/pie/updates.js +0 -1
  55. package/dist/pie/utils.js +0 -1
  56. package/dist/pie/versioned-tag.js +0 -1
  57. package/dist/player-strategy.js +0 -1
  58. package/dist/security/index.js +0 -1
  59. package/dist/security/sanitize-item-markup.d.ts +11 -0
  60. package/dist/security/sanitize-item-markup.js +5 -3
  61. package/dist/security/sanitize-svg-icon.js +0 -1
  62. package/dist/security/validate-style-url.js +0 -1
  63. package/dist/security/wrap-model-rich-content.js +0 -1
  64. package/dist/security/wrap-overwide-images.js +0 -1
  65. package/dist/security/wrap-overwide-tables.js +0 -1
  66. package/dist/server/npm-registry.js +0 -1
  67. package/dist/types/index.js +0 -1
  68. package/dist/ui/content-styles.js +0 -1
  69. package/dist/ui/debug-panel-persistence.js +0 -1
  70. package/dist/ui/first-focusable.js +0 -1
  71. package/dist/ui/focus-trap.js +0 -1
  72. package/dist/ui/safe-storage.js +0 -1
  73. package/dist/ui/scope-css.d.ts +56 -0
  74. package/dist/ui/scope-css.js +310 -0
  75. package/dist/ui/zoom-compensation.js +0 -1
  76. package/package.json +4 -4
  77. package/dist/config/profile.js.map +0 -1
  78. package/dist/i18n/index.js.map +0 -1
  79. package/dist/i18n/loader.js.map +0 -1
  80. package/dist/i18n/simple-i18n.js.map +0 -1
  81. package/dist/i18n/types.js.map +0 -1
  82. package/dist/index.js.map +0 -1
  83. package/dist/instrumentation/debug-panel-stream.js.map +0 -1
  84. package/dist/instrumentation/index.js.map +0 -1
  85. package/dist/instrumentation/provider-guards.js.map +0 -1
  86. package/dist/instrumentation/providers/BaseInstrumentationProvider.js.map +0 -1
  87. package/dist/instrumentation/providers/CompositeInstrumentationProvider.js.map +0 -1
  88. package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js.map +0 -1
  89. package/dist/instrumentation/providers/DebugPanelInstrumentationProvider.js.map +0 -1
  90. package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js.map +0 -1
  91. package/dist/instrumentation/providers/index.js.map +0 -1
  92. package/dist/instrumentation/types.js.map +0 -1
  93. package/dist/loader-config.js.map +0 -1
  94. package/dist/loaders/ElementLoader.js.map +0 -1
  95. package/dist/loaders/element-loader-types.js.map +0 -1
  96. package/dist/loaders/element-loader.js.map +0 -1
  97. package/dist/loaders/element-package-policy.js.map +0 -1
  98. package/dist/loaders/esm-adapter.js.map +0 -1
  99. package/dist/loaders/iife-adapter.js.map +0 -1
  100. package/dist/loaders/index.js.map +0 -1
  101. package/dist/object/index.js.map +0 -1
  102. package/dist/pie/asset-handler.js.map +0 -1
  103. package/dist/pie/authoring-tag.js.map +0 -1
  104. package/dist/pie/authoring.js.map +0 -1
  105. package/dist/pie/component-context.js.map +0 -1
  106. package/dist/pie/config.js.map +0 -1
  107. package/dist/pie/configure-initialization.js.map +0 -1
  108. package/dist/pie/correct-response-env.js.map +0 -1
  109. package/dist/pie/custom-element-define.js.map +0 -1
  110. package/dist/pie/index.js.map +0 -1
  111. package/dist/pie/initialization.js.map +0 -1
  112. package/dist/pie/instrumentation-event-bridge.js.map +0 -1
  113. package/dist/pie/instrumentation-event-map.js.map +0 -1
  114. package/dist/pie/instrumentation-provider-resolution.js.map +0 -1
  115. package/dist/pie/item-controller-storage.js.map +0 -1
  116. package/dist/pie/item-controller.js.map +0 -1
  117. package/dist/pie/item-session-contract.js.map +0 -1
  118. package/dist/pie/logger.js.map +0 -1
  119. package/dist/pie/math-rendering.js.map +0 -1
  120. package/dist/pie/overrides.js.map +0 -1
  121. package/dist/pie/player-initializer.js.map +0 -1
  122. package/dist/pie/registry.js.map +0 -1
  123. package/dist/pie/resource-monitor.js.map +0 -1
  124. package/dist/pie/scoring.js.map +0 -1
  125. package/dist/pie/stage-tracker.js.map +0 -1
  126. package/dist/pie/stages.js.map +0 -1
  127. package/dist/pie/tag-names.js.map +0 -1
  128. package/dist/pie/types.js.map +0 -1
  129. package/dist/pie/updates.js.map +0 -1
  130. package/dist/pie/utils.js.map +0 -1
  131. package/dist/pie/versioned-tag.js.map +0 -1
  132. package/dist/player-strategy.js.map +0 -1
  133. package/dist/security/index.js.map +0 -1
  134. package/dist/security/sanitize-item-markup.js.map +0 -1
  135. package/dist/security/sanitize-svg-icon.js.map +0 -1
  136. package/dist/security/validate-style-url.js.map +0 -1
  137. package/dist/security/wrap-model-rich-content.js.map +0 -1
  138. package/dist/security/wrap-overwide-images.js.map +0 -1
  139. package/dist/security/wrap-overwide-tables.js.map +0 -1
  140. package/dist/server/npm-registry.js.map +0 -1
  141. package/dist/types/index.js.map +0 -1
  142. package/dist/ui/content-styles.js.map +0 -1
  143. package/dist/ui/debug-panel-persistence.js.map +0 -1
  144. package/dist/ui/first-focusable.js.map +0 -1
  145. package/dist/ui/focus-trap.js.map +0 -1
  146. package/dist/ui/safe-storage.js.map +0 -1
  147. package/dist/ui/zoom-compensation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"initialization.js","sourceRoot":"","sources":["../../src/pie/initialization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Initialization Module\n *\n * Bundle loading and element initialization logic.\n * This is the core of the PIE player system.\n */\n\nimport { BUILDER_BUNDLE_URL } from \"../config/profile.js\";\nimport { mergeObjectsIgnoringNullUndefined } from \"../object/index.js\";\nimport { wrapModelRichContent } from \"../security/wrap-model-rich-content.js\";\nimport type { ConfigEntity, Env, PieModel } from \"../types/index.js\";\nimport { editorPostFix } from \"../types/index.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { initializeMathRendering } from \"./math-rendering.js\";\nimport { pieRegistry } from \"./registry.js\";\nimport { findPieController } from \"./scoring.js\";\nimport { defineCustomElementSafely } from \"./custom-element-define.js\";\nimport { validateCustomElementTag } from \"./tag-names.js\";\nimport type {\n\tEventListeners,\n\tLoadPieElementsOptions,\n\tPieElement,\n\tPieRegistry,\n} from \"./types.js\";\nimport {\n\tBundleType,\n\tisCustomElementConstructor,\n\tisPieAvailable,\n\tStatus,\n} from \"./types.js\";\nimport { updatePieElement } from \"./updates.js\";\nimport {\n\tfindOrAddSession,\n\tgetPackageWithoutVersion,\n\tgetPieElementBundlesUrl,\n} from \"./utils.js\";\n\n// Create module-level logger (respects global debug flag - pass function for dynamic checking)\nconst logger = createPieLogger(\"pie-initialization\", () =>\n\tisGlobalDebugEnabled(),\n);\n\n// Default options for loading PIE elements\nconst defaultOptions: LoadPieElementsOptions = {\n\tbuildServiceBase: BUILDER_BUNDLE_URL,\n\tbundleType: BundleType.player, // Default to player.js (no controllers, server-processed models)\n\tenv: { mode: \"gather\", role: \"student\" },\n};\n\n// Add this to your window types\ndeclare global {\n\tinterface Window {\n\t\t_pieElementObserver?: MutationObserver;\n\t\t_pieCurrentContext?: {\n\t\t\tconfig: ConfigEntity;\n\t\t\tsession: any[];\n\t\t\tenv?: Env;\n\t\t\tcontainer?: Element | Document;\n\t\t};\n\t}\n}\n\n/**\n * Helper function to initialize a PIE element\n */\nconst initializePieElement = (\n\telement: PieElement,\n\toptions: {\n\t\tconfig: ConfigEntity;\n\t\tsession: any[];\n\t\tenv?: Env;\n\t\teventListeners?: EventListeners;\n\t},\n): void => {\n\tconst { config, session, env, eventListeners } = options;\n\tif ((element as any).__pieInitialized) {\n\t\treturn;\n\t}\n\tconst tagName = element.tagName.toLowerCase();\n\n\tlogger.debug(`[initializePieElement] Initializing ${tagName}#${element.id}`);\n\n\t// Find model for this element\n\tlet model = config?.models?.find((m) => m.id === element.id) as PieModel;\n\tif (!model) {\n\t\t// Only warn if this element is from a client-player.js bundle (where models are expected)\n\t\t// player.js bundles use server-processed models, so missing models are expected there\n\t\tconst registry = pieRegistry();\n\t\tconst registryEntry = registry[tagName];\n\n\t\tif (registryEntry && registryEntry.bundleType === BundleType.clientPlayer) {\n\t\t\tlogger.warn(\n\t\t\t\t`[initializePieElement] Model not found for PIE element ${tagName}#${element.id} (client-player.js bundle)`,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\t// Set session (with element property for updateSession callback)\n\tconst elementSession = findOrAddSession(session, model.id, model.element);\n\telement.session = elementSession;\n\t(element as any).__pieInitialized = true;\n\tlogger.debug(\n\t\t`[initializePieElement] Session set for ${tagName}#${element.id}:`,\n\t\telementSession,\n\t);\n\n\t// Set model - use controller if available (client-player.js), or use server-processed model (player.js)\n\tconst controller = findPieController(tagName);\n\n\tif (!env) {\n\t\tlogger.error(\n\t\t\t`[initializePieElement] ❌ FATAL: No env provided for ${tagName}`,\n\t\t);\n\t\tthrow new Error(\n\t\t\t`No env provided for ${tagName}. PIE elements require an env object with mode and role.`,\n\t\t);\n\t}\n\n\tif (!controller) {\n\t\t// No controller available - using server-processed model (player.js bundle)\n\t\tlogger.debug(\n\t\t\t`[initializePieElement] ℹ️ No controller for ${tagName}, using server-processed model`,\n\t\t);\n\t\tlogger.debug(`[initializePieElement] Model already processed by server:`, {\n\t\t\tid: model.id,\n\t\t\telement: model.element,\n\t\t\thasCorrectResponse: \"correctResponse\" in model,\n\t\t\tmode: env.mode,\n\t\t\trole: env.role,\n\t\t});\n\n\t\t// Set model directly - server already processed it\n\t\telement.model = wrapModelRichContent(model);\n\t} else {\n\t\t// Controller available - run client-side processing (client-player.js bundle)\n\t\t// Note: updatePieElementWithRef handles controller invocation\n\t\tlogger.debug(\n\t\t\t`[initializePieElement] Controller found for ${tagName}, will invoke model() function`,\n\t\t);\n\t}\n\n\t// Add event listeners\n\tif (eventListeners) {\n\t\tObject.entries(eventListeners).forEach(([evt, fn]) => {\n\t\t\telement.addEventListener(evt as any, fn);\n\t\t});\n\t}\n};\n\nconst getEditorElementTagName = (elementTagName: string, pkg: string): string =>\n\tvalidateCustomElementTag(\n\t\telementTagName + editorPostFix,\n\t\t`editor element tag for ${pkg}`,\n\t);\n\nconst updateRegisteredElement = (\n\telementTagName: string,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\toptions: LoadPieElementsOptions,\n\tomitEnv = false,\n): void => {\n\tupdatePieElement(elementTagName, {\n\t\tconfig,\n\t\tsession,\n\t\t...(omitEnv ? {} : { env: options.env }),\n\t\tcontainer: options.container,\n\t\t...(options.eventListeners?.[elementTagName] && {\n\t\t\teventListeners: options.eventListeners[elementTagName],\n\t\t}),\n\t});\n};\n\n/**\n * Shared element registration logic\n * Extracted from initializePiesFromLoadedBundle and loadPieModule to eliminate ~200 lines of duplication\n * Also fixes MutationObserver memory leak by storing latest config/session in window context\n *\n * `elementModule` may be `null`. In that case we cannot register *new*\n * tags (no element constructor source), but we can still update tags\n * that another loader (e.g. the section-player's IIFE adapter) has\n * already registered with `customElements`. This is the common case\n * when `pie-item-player` mounts inside `pie-section-player`: the\n * section player has already pre-warmed the bundle through the deep\n * `ElementLoader` primitive, so the `window.pie.default` bundle-global\n * path is not required for those tags.\n */\nconst registerPieElementsFromBundle = (\n\telementModule: any | null,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\tregistry: PieRegistry,\n\toptions: LoadPieElementsOptions,\n): Promise<void>[] => {\n\tconst promises: Promise<void>[] = [];\n\tconst isNodeWithinContainer = (\n\t\tnode: Node,\n\t\tcontainer?: Element | Document,\n\t): boolean => {\n\t\tif (!container || container === document) return true;\n\t\treturn node instanceof Node && container.contains(node);\n\t};\n\n\tif (elementModule) {\n\t\tlogger.debug(\n\t\t\t\"[registerPieElementsFromBundle] Available packages in bundle:\",\n\t\t\tObject.keys(elementModule),\n\t\t);\n\t} else {\n\t\tlogger.debug(\n\t\t\t\"[registerPieElementsFromBundle] No bundle module supplied; will only update tags already registered with customElements.\",\n\t\t);\n\t}\n\tlogger.debug(\n\t\t\"[registerPieElementsFromBundle] config.elements:\",\n\t\tconfig.elements,\n\t);\n\n\t// Store latest config/session in window so MutationObserver can access current values\n\tif (typeof window !== \"undefined\") {\n\t\twindow._pieCurrentContext = {\n\t\t\tconfig,\n\t\t\tsession,\n\t\t\tenv: options.env,\n\t\t\tcontainer: options.container,\n\t\t};\n\t}\n\n\tObject.entries(config.elements).forEach(([elName, pkg]) => {\n\t\tconst elementTagName = validateCustomElementTag(\n\t\t\telName,\n\t\t\t`element tag in config.elements for ${String(pkg)}`,\n\t\t);\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] Processing element: ${elementTagName} -> ${pkg}`,\n\t\t);\n\n\t\t// Fast path — the tag is already registered with customElements\n\t\t// (typically by the host's pre-warm pipeline). We can update its\n\t\t// session/model bindings without needing the bundle module at all.\n\t\t// This branch is also the one that runs when `elementModule` is\n\t\t// `null` because `window.pie` was missing.\n\t\tif (customElements.get(elementTagName)) {\n\t\t\tupdateRegisteredElement(elementTagName, config, session, options);\n\n\t\t\tif (options.bundleType === BundleType.editor) {\n\t\t\t\tconst editorElName = getEditorElementTagName(\n\t\t\t\t\telementTagName,\n\t\t\t\t\tString(pkg),\n\t\t\t\t);\n\t\t\t\tupdateRegisteredElement(editorElName, config, session, options, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// From here on we are in the \"register a new tag\" branch, which\n\t\t// requires a bundle module to read the element constructor from.\n\t\tif (!elementModule) {\n\t\t\t// A missing bundle module + an unregistered tag is *not*\n\t\t\t// always an error: in the section-player composition the\n\t\t\t// host's own `ElementLoader` may register this tag\n\t\t\t// out-of-band moments later, in which case `updatePieElement`\n\t\t\t// will pick it up on the next reactive pass via the\n\t\t\t// MutationObserver / `whenDefined` paths. Log at warn so the\n\t\t\t// transient miss is still visible during diagnostics without\n\t\t\t// printing a red stack trace for a routine timing condition.\n\t\t\tlogger.warn(\n\t\t\t\t`[registerPieElementsFromBundle] Skipping \"${elementTagName}\" — no bundle module available and the tag is not yet registered. Will bind on next update if the host's loader registers it.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pkgStripped = getPackageWithoutVersion(pkg as string);\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] Package without version: \"${pkgStripped}\"`,\n\t\t);\n\n\t\tconst elementData = elementModule[pkgStripped];\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] elementData result:`,\n\t\t\telementData ? \"FOUND\" : \"UNDEFINED\",\n\t\t);\n\n\t\tif (!elementData) {\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] ❌ Package \"${pkgStripped}\" not found in bundle!`,\n\t\t\t);\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] Lookup key: \"${pkgStripped}\"`,\n\t\t\t);\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] Available packages:`,\n\t\t\t\tObject.keys(elementModule),\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\t`pie ${pkgStripped} not found in ${Object.keys(elementModule)}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] elementData for ${pkgStripped}:`,\n\t\t\t{\n\t\t\t\thasController: !!elementData.controller,\n\t\t\t\thasElement: !!elementData.Element,\n\t\t\t\thasConfig: !!elementData.config,\n\t\t\t\tcontrollerKeys: elementData.controller\n\t\t\t\t\t? Object.keys(elementData.controller)\n\t\t\t\t\t: [],\n\t\t\t\tbundleType: options.bundleType,\n\t\t\t},\n\t\t);\n\n\t\t// Validate controller presence based on bundle type\n\t\tif (!elementData.controller) {\n\t\t\tif (options.bundleType === BundleType.clientPlayer) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] ❌ CRITICAL: No controller found for ${pkgStripped}!`,\n\t\t\t\t);\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] Bundle type: ${options.bundleType} (controllers required)`,\n\t\t\t\t);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No controller found for ${pkgStripped}. client-player.js bundles MUST include controllers!`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[registerPieElementsFromBundle] ℹ️ No controller found for ${pkgStripped} - using server-processed models (player.js bundle)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\t// Register the element in our registry\n\t\t\tlogger.debug(\n\t\t\t\t`[registerPieElementsFromBundle] Registering ${elName} in registry${\n\t\t\t\t\telementData.controller\n\t\t\t\t\t\t? \" with controller\"\n\t\t\t\t\t\t: \" (no controller - server-processed models)\"\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tregistry[elementTagName] = {\n\t\t\t\tpackage: pkg as string,\n\t\t\t\tstatus: Status.loading,\n\t\t\t\ttagName: elementTagName,\n\t\t\t\tcontroller: elementData.controller || null,\n\t\t\t\tconfig: elementData.config,\n\t\t\t\tbundleType: options.bundleType,\n\t\t\t};\n\n\t\t\tif (isCustomElementConstructor(elementData.Element)) {\n\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\telementTagName,\n\t\t\t\t\telementData.Element,\n\t\t\t\t\t`element tag in config.elements for ${String(pkg)}`,\n\t\t\t\t);\n\n\t\t\t\t// Initialize existing elements\n\t\t\t\tconst searchRoot = options.container || document;\n\t\t\t\tconst elements = searchRoot.querySelectorAll(elementTagName);\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[registerPieElementsFromBundle] Found ${elements.length} elements for tag '${elementTagName}'`,\n\t\t\t\t);\n\n\t\t\t\telements.forEach((el) => {\n\t\t\t\t\tinitializePieElement(el as PieElement, {\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tenv: options.env,\n\t\t\t\t\t\teventListeners: options.eventListeners?.[elementTagName],\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// Update registry status\n\t\t\t\tregistry[elementTagName] = {\n\t\t\t\t\t...registry[elementTagName],\n\t\t\t\t\tstatus: Status.loaded,\n\t\t\t\t};\n\n\t\t\t\tpromises.push(\n\t\t\t\t\tcustomElements.whenDefined(elementTagName).then(() => {\n\t\t\t\t\t\tlogger.debug(\n\t\t\t\t\t\t\t\"[registerPieElementsFromBundle] defined custom PIE element: %s\",\n\t\t\t\t\t\t\telementTagName,\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\t// Setup MutationObserver that uses current context (only once)\n\t\t\t\tif (!window._pieElementObserver) {\n\t\t\t\t\twindow._pieElementObserver = new MutationObserver((mutations) => {\n\t\t\t\t\t\t// Use current context from window instead of stale closure\n\t\t\t\t\t\tconst context = window._pieCurrentContext;\n\t\t\t\t\t\tif (!context) {\n\t\t\t\t\t\t\tlogger.warn(\"[MutationObserver] No current context available\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmutations.forEach((mutation) => {\n\t\t\t\t\t\t\tif (mutation.type === \"childList\") {\n\t\t\t\t\t\t\t\tmutation.addedNodes.forEach((node) => {\n\t\t\t\t\t\t\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\t\t\tif (!isNodeWithinContainer(node, context.container)) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tconst tagName = (node as Element).tagName.toLowerCase();\n\t\t\t\t\t\t\t\t\t\tif (registry[tagName]) {\n\t\t\t\t\t\t\t\t\t\t\tinitializePieElement(node as PieElement, {\n\t\t\t\t\t\t\t\t\t\t\t\tconfig: context.config,\n\t\t\t\t\t\t\t\t\t\t\t\tsession: context.session,\n\t\t\t\t\t\t\t\t\t\t\t\tenv: context.env,\n\t\t\t\t\t\t\t\t\t\t\t\teventListeners: options.eventListeners?.[tagName],\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Check children of added nodes\n\t\t\t\t\t\t\t\t\t\t(node as Element)\n\t\t\t\t\t\t\t\t\t\t\t.querySelectorAll(\"*\")\n\t\t\t\t\t\t\t\t\t\t\t.forEach((childNode) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t!isNodeWithinContainer(childNode, context.container)\n\t\t\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tconst childTagName = childNode.tagName.toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\t\tif (registry[childTagName]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitializePieElement(childNode as PieElement, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig: context.config,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsession: context.session,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenv: context.env,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\teventListeners:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toptions.eventListeners?.[childTagName],\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\twindow._pieElementObserver.observe(document.body, {\n\t\t\t\t\t\tchildList: true,\n\t\t\t\t\t\tsubtree: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle editor elements if needed\n\t\t\t\tif (options.bundleType === BundleType.editor) {\n\t\t\t\t\tif (isCustomElementConstructor(elementData.Configure)) {\n\t\t\t\t\t\tconst editorElName = getEditorElementTagName(\n\t\t\t\t\t\t\telementTagName,\n\t\t\t\t\t\t\tString(pkg),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\t\t\teditorElName,\n\t\t\t\t\t\t\telementData.Configure,\n\t\t\t\t\t\t\t`editor element tag for ${String(pkg)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpromises.push(\n\t\t\t\t\t\t\tcustomElements.whenDefined(editorElName).then(() => {\n\t\t\t\t\t\t\t\tlogger.debug(\n\t\t\t\t\t\t\t\t\t`[registerPieElementsFromBundle] defined custom PIE editor element: ${editorElName}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t`[registerPieElementsFromBundle] pie.Configure for ${pkgStripped} is not a valid custom element constructor.`,\n\t\t\t\t\t\t\telementData.configure,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] pie.Element for ${pkgStripped} is not a valid custom element constructor.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn promises;\n};\n\n/**\n * Initialize PIE elements from a bundle that may already be loaded.\n *\n * `window.pie` is the IIFE bundle-loading global populated by\n * `loadPieModule` / `loadBundleFromString`. When the host loaded the\n * bundle through the deep `ElementLoader` primitive instead — as\n * `pie-section-player` does — the global is irrelevant: the loader\n * registers tags directly with `customElements`, so this function only\n * needs to bind models/sessions to whatever is already registered.\n *\n * Behavior:\n * - `window.pie` available → register any new tags from the bundle and\n * update bindings for already-registered tags.\n * - `window.pie` missing → fall back to the update-only path. Tags that\n * are already registered get their model/session updated; tags that\n * are not yet registered are logged at `warn` and left alone — the\n * host's loader is expected to register them imminently, after which\n * the existing `MutationObserver` / `updatePieElements` flow binds\n * them on the next reactive pass.\n *\n * The original blanket `window.pie not found; was the bundle inlined\n * correctly?` error has been removed: in the section-player + item-player\n * composition it produced a confusing red stack trace for a routine\n * timing condition that the host already handles. Genuine failures\n * (bundle not loaded by *anyone*) still surface — every unregistered tag\n * gets its own warning, and `updatePieElements` later reports any tag\n * that never resolves.\n */\nexport const initializePiesFromLoadedBundle = (\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): void => {\n\tconst registry = pieRegistry();\n\tconst options = mergeObjectsIgnoringNullUndefined(defaultOptions, opts);\n\n\tif (isPieAvailable(window)) {\n\t\tlogger.debug(\"[initializePiesFromLoadedBundle] window.pie available\");\n\t\tconst elementModule = window.pie.default;\n\t\tregisterPieElementsFromBundle(\n\t\t\telementModule,\n\t\t\tconfig,\n\t\t\tsession,\n\t\t\tregistry,\n\t\t\toptions,\n\t\t);\n\t\treturn;\n\t}\n\n\tlogger.debug(\n\t\t\"[initializePiesFromLoadedBundle] window.pie not present; using update-only path. Already-registered tags will be bound now; missing tags are expected to be registered by the host's loader and will bind on the next update pass.\",\n\t);\n\tregisterPieElementsFromBundle(null, config, session, registry, options);\n};\n\n/**\n * Load a PIE bundle from a URL and initialize elements\n */\nexport const loadPieModule = async (\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): Promise<{\n\tsession: any[];\n}> => {\n\tif (!session) {\n\t\tthrow new Error(\"session is required\");\n\t}\n\n\t// Initialize math-rendering module (required by PIE elements)\n\tawait initializeMathRendering();\n\n\tconst registry = pieRegistry();\n\tconst options = mergeObjectsIgnoringNullUndefined(defaultOptions, opts);\n\tconst url = opts.bundleUrl || getPieElementBundlesUrl(config, options);\n\tconst script = document.createElement(\"script\");\n\tscript.src = url;\n\tscript.defer = true;\n\tscript.onerror = () => {\n\t\tthrow new Error(`failed to load script: ${url}`);\n\t};\n\n\tconst loadPromise = new Promise<void>((loadResolve) => {\n\t\tscript.addEventListener(\"load\", () => {\n\t\t\tlogger.debug(\"[loadPieModule] Script loaded from:\", url);\n\t\t\tif (isPieAvailable(window)) {\n\t\t\t\tlogger.debug(\"[loadPieModule] window.pie available\");\n\t\t\t\tconst elementModule = window.pie.default;\n\n\t\t\t\t// Use shared registration logic (returns array of promises)\n\t\t\t\tconst registrationPromises = registerPieElementsFromBundle(\n\t\t\t\t\telementModule,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsession,\n\t\t\t\t\tregistry,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\n\t\t\t\t// Wait for all element definitions to complete\n\t\t\t\tPromise.all(registrationPromises).then(() => loadResolve());\n\t\t\t} else {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"[loadPieModule] pie var not found; is %s a proper PIE IIFE module?\",\n\t\t\t\t\turl,\n\t\t\t\t);\n\t\t\t\tloadResolve();\n\t\t\t}\n\t\t});\n\t});\n\n\tdocument.head.appendChild(script);\n\tawait loadPromise;\n\treturn { session };\n};\n\n/**\n * Load a PIE bundle from a JavaScript string into window.pie (IIFE bundles only)\n * This only registers elements and controllers - does NOT initialize them.\n * For initialization, use initializePiesFromLoadedBundle after loading.\n */\nexport const loadBundleFromString = async (bundleJs: string): Promise<void> => {\n\tawait initializeMathRendering();\n\tawait withBlobBundleUrl(\n\t\tbundleJs,\n\t\t{ stripSourceMapComment: true },\n\t\tasync (bundleUrl) => {\n\t\t\t// Create a script tag to execute the bundle\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tscript.src = bundleUrl;\n\t\t\tscript.type = \"text/javascript\"; // IIFE bundles are standard JS\n\n\t\t\t// Wait for script to load\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tscript.onload = () => resolve();\n\t\t\t\tscript.onerror = () => reject(new Error(\"Failed to load bundle\"));\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\n\t\t\tlogger.debug(\"[loadBundleFromString] Bundle loaded into window.pie\");\n\t\t},\n\t);\n};\n\n/**\n * Load a PIE bundle from a JavaScript string and initialize elements\n * Convenience wrapper around loadBundleFromString + loadPieModule\n */\nexport const loadPieModuleFromString = async (\n\tbundleJs: string,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): Promise<void> => {\n\tawait withBlobBundleUrl(bundleJs, {}, async (bundleUrl) => {\n\t\t// Use existing loadPieModule with the blob URL\n\t\tawait loadPieModule(config, session, { ...opts, bundleUrl });\n\t});\n};\n\nconst withBlobBundleUrl = async <T>(\n\tbundleJs: string,\n\toptions: { stripSourceMapComment?: boolean },\n\trun: (bundleUrl: string) => Promise<T>,\n): Promise<T> => {\n\tconst source = options.stripSourceMapComment\n\t\t? bundleJs.replace(/\\/\\/# sourceMappingURL=.*$/m, \"\")\n\t\t: bundleJs;\n\tconst blob = new Blob([source], { type: \"application/javascript\" });\n\tconst bundleUrl = URL.createObjectURL(blob);\n\ttry {\n\t\treturn await run(bundleUrl);\n\t} finally {\n\t\tURL.revokeObjectURL(bundleUrl);\n\t}\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-event-bridge.js","sourceRoot":"","sources":["../../src/pie/instrumentation-event-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGlF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,GAAG,eAAe,CAAC,8BAA8B,EAAE,GAAG,EAAE,CACnE,oBAAoB,EAAE,CACtB,CAAC;AAaF,SAAS,oBAAoB,CAAC,MAAe;IAC5C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,MAAiC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB;IAC7C,MAAM,CAAC,IAAI,CACV,+BAA+B,SAAS,wFAAwF,CAChI,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAKzB;IACA,IAAI,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,UAAU,CACvB,IAAI,CAAC,KAAK,YAAY,KAAK;YAC1B,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,KAAK,CACT,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,sCAAsC,CAAC,CAC5D,EACH;YACC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,4BAA4B;YACvC,eAAe,EAAE,IAAI,CAAC,eAAe;SACrC,CACD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,0EAA0E;IAC3E,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC/C,IAA0C;IAE1C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,uBAAuB;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACnD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC9D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC;IAC9C,MAAM,eAAe,GAAsB,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,MAAM,gBAAgB,GAAG,CACxB,OAAoC,EACpC,MAA+B,EACtB,EAAE;QACX,MAAM,OAAO,GAAG;YACf,MAAM,CAAC,YAAY;YACnB,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,eAAe;YACtB,MAAM,CAAC,eAAe;SACtB;aACC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;aACnC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,OAAO,GAAG,OAAO,CAAC,wBAAwB,IAAI,OAAO,EAAE,CAAC;IACzD,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;YAChC,IAAI,CAAC;gBACJ,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;oBAAE,OAAO;gBAChC,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACnE,MAAM,WAAW,GAAG,KAA6B,CAAC;gBAClD,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACxD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,gBAAgB,GAAG;oBACxB,GAAG,MAAM;oBACT,GAAG,IAAI,CAAC,gBAAgB;oBACxB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,SAAS;iBACT,CAAC;gBACF,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACvB,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;oBAC9D,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACxD,IACC,OAAO,iBAAiB,KAAK,QAAQ;wBACrC,GAAG,GAAG,iBAAiB,GAAG,cAAc,EACvC,CAAC;wBACF,OAAO;oBACR,CAAC;oBACD,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACpC,CAAC;gBACD,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,wBAAwB,EAAE;oBACrD,GAAG,gBAAgB;iBACnB,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,gBAAgB,CAAC;oBAChB,QAAQ;oBACR,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,KAAK;oBACL,eAAe,EAAE,OAAO,CAAC,eAAe;iBACxC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,gBAAgB,CACzB,OAAO,CAAC,eAAe,EACvB,OAAwB,CACxB,CAAC;QACF,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;YACzB,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAC7B,OAAO,CAAC,eAAe,EACvB,OAAwB,CACxB,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,EAAE;QACX,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC9C,cAAc,EAAE,CAAC;QAClB,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["import { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport type { InstrumentationProvider } from \"../instrumentation/types.js\";\nimport type { InstrumentationEventMapping } from \"./instrumentation-event-map.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\nconst logger = createPieLogger(\"instrumentation-event-bridge\", () =>\n\tisGlobalDebugEnabled(),\n);\n\nexport type AttachInstrumentationEventBridgeArgs = {\n\thost: EventTarget | null | undefined;\n\tinstrumentationProvider?: unknown;\n\tcomponent: string;\n\teventMap: InstrumentationEventMapping[];\n\tstaticAttributes?: Record<string, unknown>;\n\tdebug?: boolean;\n\tdedupeWindowMs?: number;\n\tshouldTrackEvent?: (event: Event) => boolean;\n};\n\nfunction normalizeEventDetail(detail: unknown): Record<string, unknown> {\n\tif (detail && typeof detail === \"object\") {\n\t\treturn detail as Record<string, unknown>;\n\t}\n\tif (typeof detail === \"undefined\") {\n\t\treturn {};\n\t}\n\treturn { value: detail };\n}\n\nfunction warnInvalidProvider(component: string): void {\n\tlogger.warn(\n\t\t`[InstrumentationEventBridge:${component}] Ignoring invalid instrumentation provider; expected InstrumentationProvider contract`,\n\t);\n}\n\nfunction trackBridgeError(args: {\n\tprovider: InstrumentationProvider;\n\tcomponent: string;\n\terror: unknown;\n\tsourceEventName: string;\n}): void {\n\ttry {\n\t\targs.provider.trackError(\n\t\t\targs.error instanceof Error\n\t\t\t\t? args.error\n\t\t\t\t: new Error(\n\t\t\t\t\t\tString(args.error ?? \"Unknown instrumentation bridge error\"),\n\t\t\t\t\t),\n\t\t\t{\n\t\t\t\tcomponent: args.component,\n\t\t\t\terrorType: \"InstrumentationBridgeError\",\n\t\t\t\tsourceEventName: args.sourceEventName,\n\t\t\t},\n\t\t);\n\t} catch {\n\t\t// Avoid recursive failures while reporting instrumentation bridge errors.\n\t}\n}\n\nexport function attachInstrumentationEventBridge(\n\targs: AttachInstrumentationEventBridgeArgs,\n): () => void {\n\tif (!args.host || !args.eventMap.length) return () => {};\n\tif (!args.instrumentationProvider) return () => {};\n\tif (!isInstrumentationProvider(args.instrumentationProvider)) {\n\t\tif (args.debug) {\n\t\t\twarnInvalidProvider(args.component);\n\t\t}\n\t\treturn () => {};\n\t}\n\n\tconst provider = args.instrumentationProvider;\n\tconst removeListeners: Array<() => void> = [];\n\tconst dedupeWindowMs = Math.max(0, args.dedupeWindowMs ?? 0);\n\tconst recentEventMap = new Map<string, number>();\n\n\tconst computeDedupeKey = (\n\t\tmapping: InstrumentationEventMapping,\n\t\tdetail: Record<string, unknown>,\n\t): string => {\n\t\tconst summary = [\n\t\t\tdetail.assessmentId,\n\t\t\tdetail.sectionId,\n\t\t\tdetail.attemptId,\n\t\t\tdetail.itemId,\n\t\t\tdetail.canonicalItemId,\n\t\t\tdetail.sourceRuntimeId,\n\t\t]\n\t\t\t.map((value) => String(value ?? \"\"))\n\t\t\t.join(\"|\");\n\t\treturn `${mapping.instrumentationEventName}|${summary}`;\n\t};\n\n\tfor (const mapping of args.eventMap) {\n\t\tconst handler = (event: Event) => {\n\t\t\ttry {\n\t\t\t\tif (!provider.isReady()) return;\n\t\t\t\tif (args.shouldTrackEvent && !args.shouldTrackEvent(event)) return;\n\t\t\t\tconst customEvent = event as CustomEvent<unknown>;\n\t\t\t\tconst detail = normalizeEventDetail(customEvent.detail);\n\t\t\t\tconst timestamp = new Date().toISOString();\n\t\t\t\tconst mergedAttributes = {\n\t\t\t\t\t...detail,\n\t\t\t\t\t...args.staticAttributes,\n\t\t\t\t\tcomponent: args.component,\n\t\t\t\t\tsourceEventName: mapping.sourceEventName,\n\t\t\t\t\ttimestamp,\n\t\t\t\t};\n\t\t\t\tif (dedupeWindowMs > 0) {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tconst dedupeKey = computeDedupeKey(mapping, mergedAttributes);\n\t\t\t\t\tconst previousTimestamp = recentEventMap.get(dedupeKey);\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof previousTimestamp === \"number\" &&\n\t\t\t\t\t\tnow - previousTimestamp < dedupeWindowMs\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecentEventMap.set(dedupeKey, now);\n\t\t\t\t}\n\t\t\t\tprovider.trackEvent(mapping.instrumentationEventName, {\n\t\t\t\t\t...mergedAttributes,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\ttrackBridgeError({\n\t\t\t\t\tprovider,\n\t\t\t\t\tcomponent: args.component,\n\t\t\t\t\terror,\n\t\t\t\t\tsourceEventName: mapping.sourceEventName,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\targs.host.addEventListener(\n\t\t\tmapping.sourceEventName,\n\t\t\thandler as EventListener,\n\t\t);\n\t\tremoveListeners.push(() => {\n\t\t\targs.host?.removeEventListener(\n\t\t\t\tmapping.sourceEventName,\n\t\t\t\thandler as EventListener,\n\t\t\t);\n\t\t});\n\t}\n\n\treturn () => {\n\t\tfor (const removeListener of removeListeners) {\n\t\t\tremoveListener();\n\t\t}\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-event-map.js","sourceRoot":"","sources":["../../src/pie/instrumentation-event-map.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,iCAAiC,GAC7C;IACC,mEAAmE;IACnE,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,gEAAgE;IAChE,uEAAuE;IACvE,8CAA8C;IAC9C;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,0BAA0B;KACpD;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,2BAA2B;KACrD;IACD;QACC,eAAe,EAAE,mBAAmB;QACpC,wBAAwB,EAAE,+BAA+B;KACzD;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,mBAAmB;KAC7C;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,2BAA2B;KACrD;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;CACD,CAAC;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAC7C;IACC,uEAAuE;IACvE,mEAAmE;IACnE,mEAAmE;IACnE,qEAAqE;IACrE,mEAAmE;IACnE,sCAAsC;IACtC;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,0BAA0B;KACpD;IACD;QACC,eAAe,EAAE,sBAAsB;QACvC,wBAAwB,EAAE,8BAA8B;KACxD;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;IACD;QACC,eAAe,EAAE,qBAAqB;QACtC,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;IACD;QACC,eAAe,EAAE,uBAAuB;QACxC,wBAAwB,EAAE,mCAAmC;KAC7D;IACD;QACC,eAAe,EAAE,uBAAuB;QACxC,wBAAwB,EAAE,mCAAmC;KAC7D;CACD,CAAC;AAEH,MAAM,CAAC,MAAM,oCAAoC,GAChD;IACC;QACC,eAAe,EAAE,6BAA6B;QAC9C,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,iCAAiC;QAClD,wBAAwB,EAAE,qCAAqC;KAC/D;IACD;QACC,eAAe,EAAE,0BAA0B;QAC3C,wBAAwB,EAAE,8BAA8B;KACxD;IACD;QACC,eAAe,EAAE,4BAA4B;QAC7C,wBAAwB,EAAE,gCAAgC;KAC1D;IACD;QACC,eAAe,EAAE,4BAA4B;QAC7C,wBAAwB,EAAE,gCAAgC;KAC1D;IACD;QACC,eAAe,EAAE,6BAA6B;QAC9C,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,qCAAqC;QACtD,wBAAwB,EAAE,yCAAyC;KACnE;IACD;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,sBAAsB;KAChD;CACD,CAAC","sourcesContent":["export type InstrumentationEventMapping = {\n\tsourceEventName: string;\n\tinstrumentationEventName: string;\n};\n\nexport const TOOLKIT_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t// M6 canonical readiness vocabulary. The four-stage canonical list\n\t\t// (`composed`, `engine-ready`, `interactive`, `disposed`) is identical\n\t\t// across the toolkit CE and the layout CEs — the M6 retro removed the\n\t\t// `attached`, `runtime-bound`, and `ui-rendered` stages because they\n\t\t// had zero internal or external consumers. Hosts listen for the\n\t\t// DOM-prefixed name directly (`pie-stage-change`); the instrumentation\n\t\t// bridge forwards the same name to telemetry.\n\t\t{\n\t\t\tsourceEventName: \"pie-stage-change\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-stage-change\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"runtime-owned\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-runtime-owned\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"runtime-inherited\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-runtime-inherited\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"toolkit-ready\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"section-ready\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-section-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"framework-error\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-framework-error\",\n\t\t},\n\t];\n\nexport const SECTION_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t// M6 canonical readiness vocabulary. Hosts listen for the DOM-prefixed\n\t\t// names directly (`pie-stage-change`, `pie-loading-complete`); the\n\t\t// instrumentation bridge forwards the same names to telemetry. The\n\t\t// readiness alias mappings (`readiness-change`, `interaction-ready`,\n\t\t// `ready`) and the `section-controller-ready` mapping were removed\n\t\t// alongside their DOM-event surfaces.\n\t\t{\n\t\t\tsourceEventName: \"pie-stage-change\",\n\t\t\tinstrumentationEventName: \"pie-section-stage-change\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"pie-loading-complete\",\n\t\t\tinstrumentationEventName: \"pie-section-loading-complete\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"session-changed\",\n\t\t\tinstrumentationEventName: \"pie-section-session-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"composition-changed\",\n\t\t\tinstrumentationEventName: \"pie-section-composition-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"framework-error\",\n\t\t\tinstrumentationEventName: \"pie-section-framework-error\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"element-preload-retry\",\n\t\t\tinstrumentationEventName: \"pie-section-element-preload-retry\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"element-preload-error\",\n\t\t\tinstrumentationEventName: \"pie-section-element-preload-error\",\n\t\t},\n\t];\n\nexport const ASSESSMENT_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t{\n\t\t\tsourceEventName: \"assessment-controller-ready\",\n\t\t\tinstrumentationEventName: \"pie-assessment-controller-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-navigation-requested\",\n\t\t\tinstrumentationEventName: \"pie-assessment-navigation-requested\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-route-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-route-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-session-applied\",\n\t\t\tinstrumentationEventName: \"pie-assessment-session-applied\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-session-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-session-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-progress-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-progress-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-submission-state-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-submission-state-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-error\",\n\t\t\tinstrumentationEventName: \"pie-assessment-error\",\n\t\t},\n\t];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-provider-resolution.js","sourceRoot":"","sources":["../../src/pie/instrumentation-provider-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport { NewRelicInstrumentationProvider } from \"../instrumentation/providers/NewRelicInstrumentationProvider.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype ProviderCandidate =\n\t| { kind: \"unset\" }\n\t| { kind: \"null\" }\n\t| { kind: \"value\"; value: unknown };\n\nfunction asRecord(value: unknown): UnknownRecord {\n\treturn value && typeof value === \"object\" ? (value as UnknownRecord) : {};\n}\n\nfunction resolveLoaderConfig(playerLike: unknown): UnknownRecord | null {\n\tconst player = asRecord(playerLike);\n\tconst loaderConfig = asRecord(player.loaderConfig);\n\treturn Object.keys(loaderConfig).length > 0 ? loaderConfig : null;\n}\n\nfunction resolveProviderFromLoaderConfig(\n\tloaderConfig: UnknownRecord | null,\n): ProviderCandidate {\n\tif (!loaderConfig || !(\"instrumentationProvider\" in loaderConfig)) {\n\t\treturn { kind: \"unset\" };\n\t}\n\tconst provider = loaderConfig.instrumentationProvider;\n\tif (provider === null) return { kind: \"null\" };\n\tif (typeof provider === \"undefined\") return { kind: \"unset\" };\n\treturn { kind: \"value\", value: provider };\n}\n\nfunction resolveTrackPageActionsFromLoaderConfig(\n\tloaderConfig: UnknownRecord | null,\n): boolean | undefined {\n\tif (!loaderConfig || !(\"trackPageActions\" in loaderConfig)) return undefined;\n\tconst trackPageActions = loaderConfig.trackPageActions;\n\treturn typeof trackPageActions === \"boolean\" ? trackPageActions : undefined;\n}\n\nfunction selectProviderCandidate(\n\truntimeCandidate: ProviderCandidate,\n\ttopLevelCandidate: ProviderCandidate,\n): ProviderCandidate {\n\tif (runtimeCandidate.kind === \"value\" || runtimeCandidate.kind === \"null\") {\n\t\treturn runtimeCandidate;\n\t}\n\treturn topLevelCandidate;\n}\n\nlet defaultProvider: NewRelicInstrumentationProvider | undefined;\nconst logger = createPieLogger(\"instrumentation-provider-resolution\", () =>\n\tisGlobalDebugEnabled(),\n);\n\nfunction getDefaultInstrumentationProvider(): NewRelicInstrumentationProvider {\n\tif (!defaultProvider) {\n\t\tdefaultProvider = new NewRelicInstrumentationProvider();\n\t\t// New Relic provider sets readiness based on window.newrelic.\n\t\tvoid defaultProvider.initialize();\n\t}\n\treturn defaultProvider;\n}\n\nexport function resolveInstrumentationProvider(args: {\n\truntimePlayer?: unknown;\n\tplayer?: unknown;\n\tdebug?: boolean;\n\tcomponent?: string;\n}): unknown {\n\tconst runtimeLoaderConfig = resolveLoaderConfig(args.runtimePlayer);\n\tconst topLevelLoaderConfig = resolveLoaderConfig(args.player);\n\tconst runtimeTrackPageActions =\n\t\tresolveTrackPageActionsFromLoaderConfig(runtimeLoaderConfig);\n\tconst topLevelTrackPageActions =\n\t\tresolveTrackPageActionsFromLoaderConfig(topLevelLoaderConfig);\n\tconst trackPageActions =\n\t\truntimeTrackPageActions ?? topLevelTrackPageActions ?? false;\n\tconst candidateProvider = selectProviderCandidate(\n\t\tresolveProviderFromLoaderConfig(runtimeLoaderConfig),\n\t\tresolveProviderFromLoaderConfig(topLevelLoaderConfig),\n\t);\n\tif (candidateProvider.kind === \"null\") return undefined;\n\tif (candidateProvider.kind === \"unset\") {\n\t\treturn trackPageActions ? getDefaultInstrumentationProvider() : undefined;\n\t}\n\tif (isInstrumentationProvider(candidateProvider.value)) {\n\t\treturn candidateProvider.value;\n\t}\n\tif (args.debug) {\n\t\tconst prefix = args.component ? `[${args.component}] ` : \"\";\n\t\tlogger.warn(\n\t\t\t`${prefix}Ignoring invalid instrumentation provider; expected InstrumentationProvider contract`,\n\t\t);\n\t}\n\treturn undefined;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-controller-storage.js","sourceRoot":"","sources":["../../src/pie/item-controller-storage.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,wBAAwB;IAC5B,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;IAExD,IAAI,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,OAA6B;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAW;QAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;CACD;AAED,MAAM,OAAO,gCAAgC;IAG5C,IAAI,CAAC,GAAW;QACf,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,OAA6B;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC;YACJ,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,KAAK,CAAC,GAAW;QAChB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC;YACJ,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;CACD","sourcesContent":["export type ItemSessionContainer = {\n\tid: string;\n\tdata: any[];\n};\n\nexport interface ItemSessionStorageStrategy {\n\tload(\n\t\tkey: string,\n\t): ItemSessionContainer | null | Promise<ItemSessionContainer | null>;\n\tsave(key: string, session: ItemSessionContainer): void | Promise<void>;\n\tclear?(key: string): void | Promise<void>;\n}\n\nexport class MemoryItemSessionStorage implements ItemSessionStorageStrategy {\n\tprivate store = new Map<string, ItemSessionContainer>();\n\n\tload(key: string): ItemSessionContainer | null {\n\t\treturn this.store.get(key) ?? null;\n\t}\n\n\tsave(key: string, session: ItemSessionContainer): void {\n\t\tthis.store.set(key, session);\n\t}\n\n\tclear(key: string): void {\n\t\tthis.store.delete(key);\n\t}\n}\n\nexport class SessionStorageItemSessionStorage\n\timplements ItemSessionStorageStrategy\n{\n\tload(key: string): ItemSessionContainer | null {\n\t\tif (typeof window === \"undefined\") return null;\n\t\ttry {\n\t\t\tconst raw = window.sessionStorage.getItem(key);\n\t\t\tif (!raw) return null;\n\t\t\treturn JSON.parse(raw) as ItemSessionContainer;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tsave(key: string, session: ItemSessionContainer): void {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\twindow.sessionStorage.setItem(key, JSON.stringify(session));\n\t\t} catch {}\n\t}\n\n\tclear(key: string): void {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\twindow.sessionStorage.removeItem(key);\n\t\t} catch {}\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-controller.js","sourceRoot":"","sources":["../../src/pie/item-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tMemoryItemSessionStorage,\n\ttype ItemSessionContainer,\n\ttype ItemSessionStorageStrategy,\n} from \"./item-controller-storage.js\";\nimport {\n\thasResponseField,\n\thasResponseValue,\n\tmergeElementIntoSession,\n\tnormalizeItemSessionContainer as normalizeSessionContainer,\n\tnormalizeItemSessionChange,\n} from \"./item-session-contract.js\";\n\nexport type ItemControllerOptions = {\n\titemId: string;\n\tstorageKey?: string;\n\tsessionId?: string;\n\tinitialSession?: unknown;\n\tstorage?: ItemSessionStorageStrategy;\n};\n\ntype SetSessionOptions = {\n\tpersist?: boolean;\n\tallowMetadataOverwrite?: boolean;\n};\n\nconst DEFAULT_SESSION_ID = \"\";\n\nfunction cloneSession(session: ItemSessionContainer): ItemSessionContainer {\n\ttry {\n\t\treturn structuredClone(session);\n\t} catch {\n\t\treturn {\n\t\t\tid: session.id,\n\t\t\tdata: JSON.parse(JSON.stringify(session.data ?? [])),\n\t\t};\n\t}\n}\n\nexport class ItemController {\n\tprivate storage: ItemSessionStorageStrategy;\n\tprivate session: ItemSessionContainer;\n\tprivate storageKey: string;\n\tprivate sessionId: string;\n\tprivate itemId: string;\n\n\tconstructor(options: ItemControllerOptions) {\n\t\tthis.storage = options.storage ?? new MemoryItemSessionStorage();\n\t\tthis.itemId = options.itemId;\n\t\tthis.storageKey =\n\t\t\toptions.storageKey ?? `pie:item-controller:v1:${options.itemId}`;\n\t\tthis.sessionId = options.sessionId ?? DEFAULT_SESSION_ID;\n\t\tthis.session = normalizeSessionContainer(\n\t\t\toptions.initialSession,\n\t\t\tthis.sessionId,\n\t\t);\n\t}\n\n\tasync hydrate(): Promise<ItemSessionContainer> {\n\t\tconst loaded = await this.storage.load(this.storageKey);\n\t\tif (loaded) {\n\t\t\tthis.session = normalizeSessionContainer(loaded, this.sessionId);\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\tasync persist(): Promise<void> {\n\t\tawait this.storage.save(this.storageKey, this.session);\n\t}\n\n\tasync clearPersisted(): Promise<void> {\n\t\tawait this.storage.clear?.(this.storageKey);\n\t}\n\n\tgetSession(): ItemSessionContainer {\n\t\treturn cloneSession(this.session);\n\t}\n\n\tsetSession(\n\t\tinput: unknown,\n\t\toptions: SetSessionOptions = {},\n\t): ItemSessionContainer {\n\t\tconst next = normalizeSessionContainer(input, this.sessionId);\n\t\tconst allowMetadataOverwrite = options.allowMetadataOverwrite ?? false;\n\t\tif (\n\t\t\t!allowMetadataOverwrite &&\n\t\t\thasResponseValue(this.session) &&\n\t\t\t!hasResponseValue(next) &&\n\t\t\t!hasResponseField(next)\n\t\t) {\n\t\t\treturn this.getSession();\n\t\t}\n\t\tthis.session = next;\n\t\tif (options.persist !== false) {\n\t\t\tvoid this.persist();\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\t/**\n\t * Merge derived, non-response element state (e.g. a controller's persisted\n\t * shuffle order) into the authoritative session for a single element entry.\n\t *\n\t * Unlike {@link setSession}, this deliberately bypasses the response-protection\n\t * guard: the merged `properties` are element-derived metadata (no `value`), so\n\t * they must never be blocked by, nor mistaken for, a student response. The\n\t * shallow merge preserves any existing response on the entry.\n\t *\n\t * Defaults to `persist: false` — shuffle order rides along with the next genuine\n\t * response save rather than triggering its own persistence.\n\t */\n\tmergeElementSession(\n\t\telementId: string,\n\t\tproperties: Record<string, unknown>,\n\t\toptions: { persist?: boolean } = {},\n\t): ItemSessionContainer {\n\t\tthis.session = mergeElementIntoSession(\n\t\t\tthis.session.id || this.sessionId,\n\t\t\tthis.session,\n\t\t\telementId,\n\t\t\t{ id: elementId, ...properties },\n\t\t);\n\t\tif (options.persist === true) {\n\t\t\tvoid this.persist();\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\tupdateFromEventDetail(\n\t\tdetail: unknown,\n\t\toptions: SetSessionOptions = {},\n\t): ItemSessionContainer {\n\t\tconst normalized = normalizeItemSessionChange({\n\t\t\titemId: this.session.id || this.itemId,\n\t\t\tsessionDetail: detail,\n\t\t\tpreviousItemSession: this.session,\n\t\t});\n\t\tif (normalized.intent === \"metadata-only\" || !normalized.session) {\n\t\t\treturn this.getSession();\n\t\t}\n\t\treturn this.setSession(normalized.session, options);\n\t}\n}\n\nexport const normalizeItemSessionContainer = normalizeSessionContainer;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-session-contract.js","sourceRoot":"","sources":["../../src/pie/item-session-contract.ts"],"names":[],"mappings":"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","sourcesContent":["export type ItemSessionContainer = {\n\tid: string;\n\tdata: unknown[];\n};\n\nexport type ItemSessionUpdateIntent =\n\t| \"replace-item-session\"\n\t| \"merge-element-session\"\n\t| \"metadata-only\";\n\nexport type NormalizedItemSessionChange = {\n\titemId: string;\n\tsession: ItemSessionContainer | null;\n\tintent: ItemSessionUpdateIntent;\n\tcomponent?: string;\n\tcomplete?: boolean;\n};\n\nconst DEFAULT_SESSION_ID = \"\";\nconst METADATA_ONLY_SESSION_KEYS = new Set([\n\t\"complete\",\n\t\"component\",\n\t\"timestamp\",\n\t\"sourceRuntimeId\",\n]);\nconst ELEMENT_IDENTITY_SESSION_KEYS = new Set([\n\t\"id\",\n\t\"element\",\n\t...METADATA_ONLY_SESSION_KEYS,\n]);\n\nfunction areSessionContainersEqual(\n\tleft: ItemSessionContainer | null,\n\tright: ItemSessionContainer | null,\n): boolean {\n\tif (!left && !right) return true;\n\tif (!left || !right) return false;\n\tif ((left.id || \"\") !== (right.id || \"\")) return false;\n\ttry {\n\t\treturn JSON.stringify(left.data || []) === JSON.stringify(right.data || []);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction alignPreviousSessionIdForRendererSnapshot(\n\tcandidate: ItemSessionContainer,\n\tprevious: ItemSessionContainer | null,\n): ItemSessionContainer | null {\n\tif (!previous || candidate.id !== \"\") return previous;\n\treturn {\n\t\t...previous,\n\t\tid: \"\",\n\t};\n}\n\nexport function normalizeItemSessionContainer(\n\tinput: unknown,\n\tfallbackSessionId: string = DEFAULT_SESSION_ID,\n): ItemSessionContainer {\n\tif (input && typeof input === \"object\") {\n\t\tconst candidate = input as Record<string, unknown>;\n\t\tif (Array.isArray(candidate.data)) {\n\t\t\treturn {\n\t\t\t\tid: typeof candidate.id === \"string\" ? candidate.id : fallbackSessionId,\n\t\t\t\tdata: candidate.data,\n\t\t\t};\n\t\t}\n\t\tif (Array.isArray(input)) {\n\t\t\treturn { id: fallbackSessionId, data: input };\n\t\t}\n\t\treturn { id: fallbackSessionId, data: [input] };\n\t}\n\tif (Array.isArray(input)) {\n\t\treturn { id: fallbackSessionId, data: input };\n\t}\n\treturn { id: fallbackSessionId, data: [] };\n}\n\nexport function hasResponseValue(value: unknown): boolean {\n\tif (value == null) return false;\n\tif (Array.isArray(value))\n\t\treturn value.some((entry) => hasResponseValue(entry));\n\tif (typeof value !== \"object\") return false;\n\tfor (const [key, nested] of Object.entries(\n\t\tvalue as Record<string, unknown>,\n\t)) {\n\t\tif (\n\t\t\tkey === \"value\" &&\n\t\t\tnested !== undefined &&\n\t\t\tnested !== null &&\n\t\t\t!(typeof nested === \"string\" && nested.trim() === \"\") &&\n\t\t\t!(Array.isArray(nested) && nested.length === 0)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tif (hasResponseValue(nested)) return true;\n\t}\n\treturn false;\n}\n\nexport function hasResponseField(value: unknown): boolean {\n\tif (value == null) return false;\n\tif (Array.isArray(value))\n\t\treturn value.some((entry) => hasResponseField(entry));\n\tif (typeof value !== \"object\") return false;\n\tfor (const [key, nested] of Object.entries(\n\t\tvalue as Record<string, unknown>,\n\t)) {\n\t\tif (key === \"value\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (hasResponseField(nested)) return true;\n\t}\n\treturn false;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getMetadataComponent(\n\tsessionDetail: Record<string, unknown>,\n\tcandidate?: Record<string, unknown>,\n): string | undefined {\n\tif (typeof sessionDetail.component === \"string\")\n\t\treturn sessionDetail.component;\n\tif (typeof candidate?.component === \"string\") return candidate.component;\n\treturn undefined;\n}\n\nfunction getMetadataComplete(\n\tsessionDetail: Record<string, unknown>,\n\tcandidate?: Record<string, unknown>,\n): boolean | undefined {\n\tif (typeof sessionDetail.complete === \"boolean\")\n\t\treturn sessionDetail.complete;\n\tif (typeof candidate?.complete === \"boolean\") return candidate.complete;\n\treturn undefined;\n}\n\nfunction isElementIdentityOnlyPayload(\n\tcandidate: Record<string, unknown>,\n): boolean {\n\tconst candidateKeys = Object.keys(candidate);\n\tconst hasIdentityKey = \"id\" in candidate || \"element\" in candidate;\n\treturn (\n\t\thasIdentityKey &&\n\t\t!hasResponseField(candidate) &&\n\t\tcandidateKeys.every((key) => ELEMENT_IDENTITY_SESSION_KEYS.has(key))\n\t);\n}\n\nfunction isWrappedIdentityOnlyElementEcho(\n\tcandidate: ItemSessionContainer,\n): boolean {\n\treturn (\n\t\tcandidate.data.length > 0 &&\n\t\tcandidate.data.every(\n\t\t\t(entry) =>\n\t\t\t\tentry &&\n\t\t\t\ttypeof entry === \"object\" &&\n\t\t\t\t!Array.isArray(entry) &&\n\t\t\t\tisElementIdentityOnlyPayload(entry as Record<string, unknown>),\n\t\t)\n\t);\n}\n\nfunction mergeSessionEntry(\n\texisting: Record<string, unknown>,\n\tincoming: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst merged = { ...existing };\n\tfor (const [key, value] of Object.entries(incoming)) {\n\t\tconst previous = merged[key];\n\t\tmerged[key] =\n\t\t\tisPlainObject(previous) && isPlainObject(value)\n\t\t\t\t? mergeSessionEntry(previous, value)\n\t\t\t\t: value;\n\t}\n\treturn merged;\n}\n\nexport function mergeElementIntoSession(\n\titemId: string,\n\tpreviousItemSession: unknown,\n\tentryId: string,\n\tentry: Record<string, unknown>,\n): ItemSessionContainer {\n\tconst previous = normalizeItemSessionContainer(previousItemSession, itemId);\n\tconst nextData = [...previous.data];\n\tconst existingIndex = nextData.findIndex((candidate) => {\n\t\tif (!candidate || typeof candidate !== \"object\") return false;\n\t\treturn (candidate as Record<string, unknown>).id === entryId;\n\t});\n\tif (existingIndex >= 0) {\n\t\tconst existing = nextData[existingIndex];\n\t\tnextData[existingIndex] =\n\t\t\texisting && typeof existing === \"object\"\n\t\t\t\t? mergeSessionEntry(existing as Record<string, unknown>, entry)\n\t\t\t\t: entry;\n\t} else {\n\t\tnextData.push(entry);\n\t}\n\treturn {\n\t\tid: previous.id || itemId,\n\t\tdata: nextData,\n\t};\n}\n\nexport function normalizeItemSessionChange(args: {\n\titemId: string;\n\tsessionDetail: unknown;\n\tpreviousItemSession?: unknown;\n}): NormalizedItemSessionChange {\n\tconst sessionDetail = (args.sessionDetail || {}) as Record<string, unknown>;\n\tconst actualSession =\n\t\tsessionDetail &&\n\t\ttypeof sessionDetail === \"object\" &&\n\t\t\"session\" in sessionDetail\n\t\t\t? sessionDetail.session\n\t\t\t: args.sessionDetail;\n\n\tconst safeItemId =\n\t\ttypeof args.itemId === \"string\" && args.itemId\n\t\t\t? args.itemId\n\t\t\t: typeof (actualSession as Record<string, unknown> | null)?.id ===\n\t\t\t\t\t\"string\"\n\t\t\t\t? String((actualSession as Record<string, unknown>).id)\n\t\t\t\t: \"\";\n\n\tif (!actualSession || typeof actualSession !== \"object\") {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t};\n\t}\n\n\tconst candidate = actualSession as Record<string, unknown>;\n\tif (Array.isArray(candidate.data)) {\n\t\tconst normalizedCandidate = normalizeItemSessionContainer(\n\t\t\tcandidate,\n\t\t\tsafeItemId,\n\t\t);\n\t\tconst previousNormalized =\n\t\t\targs.previousItemSession !== undefined\n\t\t\t\t? normalizeItemSessionContainer(args.previousItemSession, safeItemId)\n\t\t\t\t: null;\n\t\tconst previousForMetadataComparison =\n\t\t\talignPreviousSessionIdForRendererSnapshot(\n\t\t\t\tnormalizedCandidate,\n\t\t\t\tpreviousNormalized,\n\t\t\t);\n\t\tconst sessionDetailKeys = Object.keys(sessionDetail);\n\t\tconst metadataWithSessionOnly =\n\t\t\tsessionDetailKeys.length > 0 &&\n\t\t\tsessionDetailKeys.every(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey === \"session\" ||\n\t\t\t\t\tkey === \"complete\" ||\n\t\t\t\t\tkey === \"component\" ||\n\t\t\t\t\tkey === \"timestamp\" ||\n\t\t\t\t\tkey === \"sourceRuntimeId\",\n\t\t\t);\n\t\tconst hasMetadataBeyondSession = sessionDetailKeys.some(\n\t\t\t(key) => key !== \"session\",\n\t\t);\n\t\tif (\n\t\t\tmetadataWithSessionOnly &&\n\t\t\thasMetadataBeyondSession &&\n\t\t\tpreviousForMetadataComparison &&\n\t\t\tareSessionContainersEqual(\n\t\t\t\tnormalizedCandidate,\n\t\t\t\tpreviousForMetadataComparison,\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\titemId: safeItemId,\n\t\t\t\tsession: null,\n\t\t\t\tintent: \"metadata-only\",\n\t\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tmetadataWithSessionOnly &&\n\t\t\tisWrappedIdentityOnlyElementEcho(normalizedCandidate)\n\t\t) {\n\t\t\treturn {\n\t\t\t\titemId: safeItemId,\n\t\t\t\tsession: null,\n\t\t\t\tintent: \"metadata-only\",\n\t\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: normalizedCandidate,\n\t\t\tintent: \"replace-item-session\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t};\n\t}\n\n\tconst candidateKeys = Object.keys(candidate);\n\tconst isMetadataOnlyPayload =\n\t\tcandidateKeys.length > 0 &&\n\t\tcandidateKeys.every(\n\t\t\t(key) =>\n\t\t\t\tkey === \"complete\" ||\n\t\t\t\tkey === \"component\" ||\n\t\t\t\tkey === \"timestamp\" ||\n\t\t\t\tkey === \"sourceRuntimeId\",\n\t\t);\n\tif (isMetadataOnlyPayload) {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail, candidate),\n\t\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t\t};\n\t}\n\tif (isElementIdentityOnlyPayload(candidate)) {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail, candidate),\n\t\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t\t};\n\t}\n\n\tconst component =\n\t\tgetMetadataComponent(sessionDetail, candidate) ?? \"response\";\n\tconst elementEntryId =\n\t\ttypeof candidate.id === \"string\" && candidate.id ? candidate.id : component;\n\tconst merged = mergeElementIntoSession(\n\t\tsafeItemId,\n\t\targs.previousItemSession,\n\t\telementEntryId,\n\t\t{ id: elementEntryId, ...candidate },\n\t);\n\treturn {\n\t\titemId: safeItemId,\n\t\tsession: merged,\n\t\tintent: \"merge-element-session\",\n\t\tcomponent,\n\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/pie/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA4BH;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC9B,SAAiB,EACjB,cAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,SAAS,GAAG,CAAC;IAEhC,OAAO;QACN,mFAAmF;QACnF,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;YAC1C,IAAI,cAAc,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;QAED,yDAAyD;QACzD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEvC,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEvC,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAC1C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;KACxC,CAAC;AACH,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,oBAAoB;IACnC,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;AACnE,CAAC","sourcesContent":["/**\n * PIE Logger Utility\n *\n * Simple, efficient logging for PIE players with debug mode support.\n * Uses browser console methods (debug, info, warn, error) which can be\n * filtered natively in browser dev tools.\n *\n * Usage:\n * ```typescript\n * const logger = createPieLogger('pie-item-player', debug);\n * logger.debug('Detailed debug info', data); // Only shown if debug=true\n * logger.info('Important production info'); // Always shown\n * logger.warn('Warning message'); // Always shown\n * logger.error('Error occurred', error); // Always shown\n * ```\n */\n\nexport interface PieLogger {\n\t/**\n\t * Debug-level logging - only shown when debug mode is enabled\n\t * Use for: detailed initialization steps, data transformations, internal state\n\t */\n\tdebug: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Info-level logging - always shown\n\t * Use for: successful operations, lifecycle events, important milestones\n\t */\n\tinfo: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Warning-level logging - always shown\n\t * Use for: recoverable errors, removed/unsupported features, potential issues\n\t */\n\twarn: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Error-level logging - always shown\n\t * Use for: errors, exceptions, failures\n\t */\n\terror: (message: string, ...args: any[]) => void;\n}\n\n/**\n * Create a PIE logger instance\n *\n * @param namespace - Component name for log prefixing (e.g., 'pie-item-player')\n * @param debugEnabledFn - Function that returns whether debug logs should be shown (checked dynamically on each call)\n * @returns Logger instance with debug, info, warn, error methods\n */\nexport function createPieLogger(\n\tnamespace: string,\n\tdebugEnabledFn: () => boolean,\n): PieLogger {\n\tconst prefix = `[${namespace}]`;\n\n\treturn {\n\t\t// Only debug method checks debugEnabledFn - it's checked dynamically on every call\n\t\tdebug: (message: string, ...args: any[]) => {\n\t\t\tif (debugEnabledFn()) {\n\t\t\t\tconsole.debug(prefix, message, ...args);\n\t\t\t}\n\t\t},\n\n\t\t// info, warn, error always log (not gated by debug flag)\n\t\tinfo: (message: string, ...args: any[]) =>\n\t\t\tconsole.info(prefix, message, ...args),\n\n\t\twarn: (message: string, ...args: any[]) =>\n\t\t\tconsole.warn(prefix, message, ...args),\n\n\t\terror: (message: string, ...args: any[]) =>\n\t\t\tconsole.error(prefix, message, ...args),\n\t};\n}\n\n/**\n * Global debug flag - can be set via window for runtime debugging\n *\n * Usage in browser console:\n * ```javascript\n * window.PIE_DEBUG = true; // Enable debug logging\n * ```\n */\ndeclare global {\n\tinterface Window {\n\t\tPIE_DEBUG?: boolean;\n\t}\n}\n\n/**\n * Check if debug mode is enabled globally\n */\nexport function isGlobalDebugEnabled(): boolean {\n\treturn typeof window !== \"undefined\" && window.PIE_DEBUG === true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"math-rendering.js","sourceRoot":"","sources":["../../src/pie/math-rendering.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sCAAsC;AACtC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAUpE,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,cAAc,GAAG,8BAA8B,CAAC;AACtD,IAAI,WAAW,GAAyB,IAAI,CAAC;AAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE/E,MAAM,iBAAiB,GAAG,GAA4B,EAAE;IACvD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,QAAQ,GAAI,MAAc,CAAC,UAAU,CAAiC,CAAC;IAC7E,OAAO,QAAQ,IAAI,IAAI,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAA0B,EAAQ,EAAE;IAC9D,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IACzC,MAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IACtC,MAAc,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,cAAiC;IAEjC,sBAAsB;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;IACR,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,EAAE,CAAC;QACpB,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAClC,OAAO;IACR,CAAC;IAED,8BAA8B;IAC9B,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO;IACR,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,WAAW,CAAC;QAClB,OAAO;IACR,CAAC;IAED,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACJ,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CACpD,uCAAuC,CACvC,CAAC;YACF,iBAAiB,CAAC,4BAAgD,CAAC,CAAC;YAEpE,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,WAAW,GAAG,IAAI,CAAC;IACpB,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,QAA0B;IACzD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC3D,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC","sourcesContent":["/**\n * Math rendering bootstrap for PIE players\n *\n * PIE elements expect @pie-lib/math-rendering to be available on window.\n * This module ensures required globals are populated from the upstream\n * @pie-lib/math-rendering-module package, and also supports overriding with\n * a custom renderer object when needed.\n */\n\n/// <reference path=\"../shims.d.ts\" />\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\nexport type MathRenderer = (element: HTMLElement) => void | Promise<void>;\nexport interface MathRenderingAPI {\n\trenderMath: MathRenderer;\n\twrapMath?: (latex: string) => string;\n\tunWrapMath?: (wrapped: string) => string;\n\tmmlToLatex?: (mathml: string) => string;\n}\n\nconst GLOBAL_KEY = \"@pie-lib/math-rendering\";\nconst GLOBAL_DLL_KEY = \"_dll_pie_lib__math_rendering\";\nlet initPromise: Promise<void> | null = null;\nconst logger = createPieLogger(\"math-rendering\", () => isGlobalDebugEnabled());\n\nconst getWindowRenderer = (): MathRenderingAPI | null => {\n\tif (typeof window === \"undefined\") {\n\t\treturn null;\n\t}\n\tconst renderer = (window as any)[GLOBAL_KEY] as MathRenderingAPI | undefined;\n\treturn renderer || null;\n};\n\nconst setWindowRenderer = (renderer: MathRenderingAPI): void => {\n\tif (typeof window === \"undefined\") return;\n\t(window as any)[GLOBAL_KEY] = renderer;\n\t(window as any)[GLOBAL_DLL_KEY] = renderer;\n};\n\n/**\n * Initialize math rendering with optional custom renderer\n *\n * If no custom renderer is provided, defaults to MathJax.\n * For custom renderers, use setMathRenderer() before calling this function.\n *\n * Sets TWO window globals that PIE elements expect:\n * - window[\"@pie-lib/math-rendering\"] (standard key)\n * - window[\"_dll_pie_lib__math_rendering\"] (SystemJS/DLL key for IIFE bundles)\n *\n * @param customRenderer - Optional custom renderer to use instead of default MathJax\n *\n * @example\n * ```typescript\n * // Default MathJax\n * await initializeMathRendering();\n *\n * // Custom renderer instance implementing MathRenderingAPI\n * const customRenderer = await createCustomRenderer();\n * await initializeMathRendering(customRenderer);\n *\n * // Or use setMathRenderer first\n * setMathRenderer(katexRenderer);\n * await initializeMathRendering();\n * ```\n */\nexport async function initializeMathRendering(\n\tcustomRenderer?: MathRenderingAPI,\n): Promise<void> {\n\t// Only run in browser\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\n\t// Explicit override always wins.\n\tif (customRenderer) {\n\t\tsetWindowRenderer(customRenderer);\n\t\treturn;\n\t}\n\n\t// Already initialized - skip.\n\tif (getWindowRenderer()) {\n\t\treturn;\n\t}\n\tif (initPromise) {\n\t\tawait initPromise;\n\t\treturn;\n\t}\n\n\tinitPromise = (async () => {\n\t\ttry {\n\t\t\tconst { _dll_pie_lib__math_rendering } = await import(\n\t\t\t\t\"@pie-lib/math-rendering-module/module\"\n\t\t\t);\n\t\t\tsetWindowRenderer(_dll_pie_lib__math_rendering as MathRenderingAPI);\n\n\t\t\tlogger.debug(\"Math rendering module initialized (both globals set)\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize math rendering:\", error);\n\t\t\tthrow error;\n\t\t}\n\t})();\n\ttry {\n\t\tawait initPromise;\n\t} finally {\n\t\tinitPromise = null;\n\t}\n}\n\n/**\n * Set custom math renderer programmatically\n *\n * Call this BEFORE initializeMathRendering() or any loader.load() calls\n * to override the default MathJax renderer.\n *\n * @param renderer - The renderer to use\n *\n * @example\n * ```typescript\n * import { setMathRenderer } from '@pie-players/pie-players-shared/pie';\n *\n * const renderer = await createCustomRenderer();\n * setMathRenderer(renderer);\n *\n * // Now load PIE elements - they'll use your custom renderer\n * await loader.load(config, document, needsControllers);\n * ```\n */\nexport function setMathRenderer(renderer: MathRenderingAPI): void {\n\tsetWindowRenderer(renderer);\n}\n\n/**\n * Render math in the given element\n *\n * Convenience wrapper that calls the active renderer's renderMath() function.\n * Typically called after PIE elements are rendered.\n *\n * @param element - The element to render math within\n */\nexport function renderMath(element: HTMLElement): void {\n\tconst renderer = getWindowRenderer();\n\tif (renderer && typeof renderer.renderMath === \"function\") {\n\t\trenderer.renderMath(element);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/pie/overrides.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE element override helpers.\n *\n * Used to:\n * - parse overrides from URL params\n * - apply overrides to a PIE config (server-side or client-side)\n * - build URLs/params for sharing override state\n */\n\nimport { cloneDeep } from \"../object/index.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { parsePackageName } from \"./utils.js\";\nimport { toPackageVersionedTag } from \"./versioned-tag.js\";\n\nexport type ElementOverrides = Record<string, string>;\nconst logger = createPieLogger(\"pie-overrides\", () => isGlobalDebugEnabled());\n\n/**\n * Apply element overrides to a PIE config\n * @param config The original PIE config\n * @param elementOverrides Map of element packages to override versions\n * @returns Updated config with overridden elements\n */\nexport function applyElementOverrides(\n\tconfig: any,\n\telementOverrides: ElementOverrides,\n) {\n\tif (\n\t\t!config ||\n\t\t!elementOverrides ||\n\t\tObject.keys(elementOverrides).length === 0\n\t) {\n\t\treturn config;\n\t}\n\n\t// pie-item contract compatibility: runtime version overrides have historically\n\t// returned a cloned config with tags renamed for the selected package version.\n\tconst updatedConfig = cloneDeep(config);\n\n\t// Check if there are elements to override\n\tif (!updatedConfig.elements) {\n\t\treturn updatedConfig;\n\t}\n\n\tconst matchedPackages = new Set<string>();\n\tconst tagMappings = new Map<string, string>();\n\tconst elements: Record<string, unknown> = {};\n\n\tfor (const [elementKey, elementPackageValue] of Object.entries(\n\t\tupdatedConfig.elements,\n\t)) {\n\t\tconst elementPackageStr = String(elementPackageValue);\n\t\ttry {\n\t\t\tconst parsed = parsePackageName(elementPackageStr);\n\t\t\tconst overrideVersion = elementOverrides[parsed.name];\n\t\t\tif (overrideVersion === undefined) {\n\t\t\t\telements[elementKey] = elementPackageValue;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmatchedPackages.add(parsed.name);\n\t\t\tconst packageBase = parsed.path\n\t\t\t\t? `${parsed.name}/${parsed.path}`\n\t\t\t\t: parsed.name;\n\t\t\tconst overriddenPackage = `${packageBase}@${String(overrideVersion).trim()}`;\n\t\t\tconst overriddenTag = toPackageVersionedTag(\n\t\t\t\telementKey,\n\t\t\t\toverriddenPackage,\n\t\t\t);\n\t\t\telements[overriddenTag] = overriddenPackage;\n\t\t\tif (overriddenTag !== elementKey) {\n\t\t\t\ttagMappings.set(elementKey, overriddenTag);\n\t\t\t}\n\t\t} catch {\n\t\t\tlogger.debug(\n\t\t\t\t`Couldn't parse element package value: ${elementPackageStr}`,\n\t\t\t);\n\t\t\telements[elementKey] = elementPackageValue;\n\t\t}\n\t}\n\n\tupdatedConfig.elements = elements;\n\n\tif (tagMappings.size > 0) {\n\t\tif (updatedConfig.markup) {\n\t\t\tconst escapeRegExp = (value: string): string =>\n\t\t\t\tvalue.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t\tconst sourceTags = [...tagMappings.keys()]\n\t\t\t\t.sort((left, right) => right.length - left.length)\n\t\t\t\t.map(escapeRegExp)\n\t\t\t\t.join(\"|\");\n\t\t\tconst exactTag = new RegExp(\n\t\t\t\t`(<\\\\/?)(${sourceTags})(?=[\\\\t\\\\n\\\\f\\\\r />])`,\n\t\t\t\t\"g\",\n\t\t\t);\n\t\t\tupdatedConfig.markup = String(updatedConfig.markup).replace(\n\t\t\t\texactTag,\n\t\t\t\t(_match: string, opening: string, tagName: string) =>\n\t\t\t\t\t`${opening}${tagMappings.get(tagName) ?? tagName}`,\n\t\t\t);\n\t\t}\n\n\t\tif (Array.isArray(updatedConfig.models)) {\n\t\t\tupdatedConfig.models = updatedConfig.models.map((model: any) => {\n\t\t\t\tconst overriddenTag = tagMappings.get(model?.element);\n\t\t\t\treturn overriddenTag ? { ...model, element: overriddenTag } : model;\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const packageName of Object.keys(elementOverrides)) {\n\t\tif (!matchedPackages.has(packageName)) {\n\t\t\tlogger.debug(`No matching element found for package ${packageName}`);\n\t\t}\n\t}\n\n\treturn updatedConfig;\n}\n\n/**\n * Apply element version overrides without renaming custom element tags.\n *\n * Unlike `applyElementOverrides`, this helper keeps `config.markup` and\n * `config.elements` keys intact and only updates each matching element package\n * value to the requested version. This is intended for unified `pie-item-player`\n * flows that preserve authored tags at the override boundary; `makeUniqueTags`\n * later derives the effective per-version runtime namespace on a cloned config.\n */\nexport function applyElementVersionOverridesPreserveTags(\n\tconfig: any,\n\telementOverrides: ElementOverrides,\n) {\n\tif (\n\t\t!config ||\n\t\t!elementOverrides ||\n\t\tObject.keys(elementOverrides).length === 0\n\t) {\n\t\treturn config;\n\t}\n\n\tconst updatedConfig = cloneDeep(config);\n\tif (!updatedConfig.elements || typeof updatedConfig.elements !== \"object\") {\n\t\treturn updatedConfig;\n\t}\n\n\tfor (const [elementKey, elementPackageValue] of Object.entries(\n\t\tupdatedConfig.elements,\n\t)) {\n\t\tconst elementPackageStr = String(elementPackageValue);\n\t\ttry {\n\t\t\tconst parsed = parsePackageName(elementPackageStr);\n\t\t\tconst nextVersion = elementOverrides[parsed.name];\n\t\t\tif (!nextVersion) continue;\n\t\t\tconst packageBase = parsed.path\n\t\t\t\t? `${parsed.name}/${parsed.path}`\n\t\t\t\t: parsed.name;\n\t\t\tupdatedConfig.elements[elementKey] =\n\t\t\t\t`${packageBase}@${String(nextVersion).trim()}`;\n\t\t} catch {\n\t\t\tlogger.debug(\n\t\t\t\t`Couldn't parse element package value: ${elementPackageStr}`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn updatedConfig;\n}\n\n/**\n * Parse element overrides from URL search params.\n * @returns Map of element package names to versions\n */\nexport function parseElementOverridesFromUrl(\n\tsearchParams: URLSearchParams,\n): ElementOverrides {\n\tconst overrides: ElementOverrides = {};\n\n\t// Look for parameters with the pattern pie-overrides[packageName]=version\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key.startsWith(\"pie-overrides[\") && key.endsWith(\"]\")) {\n\t\t\t// Extract the package name from between the brackets\n\t\t\tconst packageName = key.substring(14, key.length - 1);\n\n\t\t\t// Ensure the package name format is correct (including @)\n\t\t\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t\t\t? packageName\n\t\t\t\t: `@${packageName}`;\n\t\t\toverrides[normalizedPackageName] = value;\n\t\t}\n\t}\n\n\treturn overrides;\n}\n\n/**\n * Parse element overrides from current window URL (client-only).\n */\nexport function parseElementOverridesFromCurrentUrl(): ElementOverrides {\n\tif (typeof window === \"undefined\") {\n\t\treturn {};\n\t}\n\n\tconst url = new URL(window.location.href);\n\treturn parseElementOverridesFromUrl(url.searchParams);\n}\n\n/**\n * Generate a URL parameter string for an element override\n */\nexport function formatElementOverrideParam(\n\tpackageName: string,\n\tversion: string,\n): string {\n\t// Normalize the package name for the parameter key (strip leading @)\n\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t? packageName.substring(1)\n\t\t: packageName;\n\treturn `pie-overrides[${normalizedPackageName}]=${encodeURIComponent(version)}`;\n}\n\n/**\n * Creates a URL that preserves existing overrides and adds or updates a new one.\n */\nexport function addOrUpdateOverrideInUrl(\n\turl: URL,\n\tpackageName: string,\n\tversion: string,\n): string {\n\tconst params = new URLSearchParams(url.search);\n\n\t// Remove @ if present for consistency in URL\n\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t? packageName.substring(1)\n\t\t: packageName;\n\n\t// Set the new override\n\tparams.set(`pie-overrides[${normalizedPackageName}]`, version);\n\n\t// Create the new URL\n\tconst newUrl = new URL(url.pathname, url.origin);\n\tnewUrl.search = params.toString();\n\treturn newUrl.toString();\n}\n\n/**\n * Extract package information from a package string.\n * Intended for UI display.\n */\nexport function extractPackageInfo(packageStr: string) {\n\ttry {\n\t\tconst parsed = parsePackageName(String(packageStr));\n\t\treturn {\n\t\t\tname: parsed.name,\n\t\t\tversion: parsed.version || \"unknown\",\n\t\t\tdisplayName: parsed.name.split(\"/\").pop() || parsed.name,\n\t\t};\n\t} catch {\n\t\tconst s = String(packageStr);\n\t\treturn {\n\t\t\tname: s,\n\t\t\tversion: \"unknown\",\n\t\t\tdisplayName: s.split(\"/\").pop() || s,\n\t\t};\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"player-initializer.js","sourceRoot":"","sources":["../../src/pie/player-initializer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared PIE player initialization logic\n * Used by preloaded static player runtimes\n */\n\nexport interface PiePlayerConfig {\n\tenv: any;\n\taddCorrectResponse: boolean;\n\tsession: any[];\n\texternalStyleUrls?: string;\n\tcustomClassName?: string;\n\tcontainerClass?: string;\n\tpassageContainerClass?: string;\n}\n\nexport interface ItemData {\n\titem: {\n\t\tconfig: any;\n\t};\n\tpassage?: {\n\t\tconfig: {\n\t\t\tmarkup?: string;\n\t\t};\n\t};\n}\n\nexport interface PiePlayerElements {\n\tplayerEl: HTMLElement;\n\tpassageMarkup: string | null;\n}\n\n/**\n * Initialize PIE player with item data\n * Shared initialization for preloaded/static player entrypoints.\n */\nexport async function initializePiePlayer(\n\titemData: ItemData,\n\tconfig: PiePlayerConfig,\n\telements: PiePlayerElements,\n): Promise<void> {\n\tconst { playerEl } = elements;\n\n\tif (!itemData.item?.config || !playerEl) {\n\t\tthrow new Error(\"Missing item config or player element\");\n\t}\n\n\t// Ensure pie-player is loaded\n\tawait ensurePiePlayerLoaded();\n\n\tconst defaultEnv = config.env || { mode: \"evaluate\", role: \"instructor\" };\n\n\t// Configure player element\n\t(playerEl as any).config = itemData.item.config;\n\t(playerEl as any).env = defaultEnv;\n\n\tconst shouldShowCorrect = !!(\n\t\tconfig.addCorrectResponse ||\n\t\t(defaultEnv.mode === \"evaluate\" && defaultEnv.role === \"instructor\")\n\t);\n\t(playerEl as any).addCorrectResponse = shouldShowCorrect;\n\n\t// Forward additional properties\n\t(playerEl as any).session = {\n\t\tid: \"\",\n\t\tdata: Array.isArray(config.session) ? config.session : [],\n\t};\n\n\tif (config.externalStyleUrls) {\n\t\t(playerEl as any).externalStyleUrls = config.externalStyleUrls;\n\t}\n\tif (config.customClassName) {\n\t\t(playerEl as any).customClassName = config.customClassName;\n\t}\n\tif (config.containerClass) {\n\t\t(playerEl as any).containerClass = config.containerClass;\n\t}\n\tif (config.passageContainerClass) {\n\t\t(playerEl as any).passageContainerClass = config.passageContainerClass;\n\t}\n}\n\n/**\n * Extract passage markup from item data\n */\nexport function extractPassageMarkup(itemData: ItemData): string | null {\n\treturn itemData.passage?.config?.markup || null;\n}\n\n/**\n * Ensure pie-player web component is loaded\n */\nexport async function ensurePiePlayerLoaded(): Promise<void> {\n\tif (customElements.get(\"pie-player\")) return;\n\n\tconst url =\n\t\t\"https://cdn.jsdelivr.net/npm/@pie-players/pie-player-components@latest/dist/pie-player-components/pie-player-components.esm.js\";\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst existing = document.querySelector(\n\t\t\t\"script[data-pie-player]\",\n\t\t) as HTMLScriptElement | null;\n\t\tif (existing) {\n\t\t\texisting.addEventListener(\"load\", () => resolve());\n\t\t\texisting.addEventListener(\"error\", () =>\n\t\t\t\treject(new Error(\"failed to load pie-player\")),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst s = document.createElement(\"script\");\n\t\ts.type = \"module\";\n\t\ts.dataset.piePlayer = \"true\";\n\t\ts.src = url;\n\t\ts.addEventListener(\"load\", () => resolve());\n\t\ts.addEventListener(\"error\", () =>\n\t\t\treject(new Error(\"failed to load pie-player\")),\n\t\t);\n\t\tdocument.head.appendChild(s);\n\t});\n\n\tawait customElements.whenDefined(\"pie-player\");\n}\n\n/**\n * Build event listeners map for PIE elements\n */\nexport function buildEventListenersMap(\n\tconfig: any,\n\tonSessionChanged: (detail: any) => void,\n): Record<string, Record<string, (e: CustomEvent) => void>> | undefined {\n\tif (!config?.elements) return undefined;\n\n\tconst listeners: Record<\n\t\tstring,\n\t\tRecord<string, (e: CustomEvent) => void>\n\t> = {};\n\tObject.keys(config.elements).forEach((elName) => {\n\t\tlisteners[elName] = {\n\t\t\t\"session-changed\": (e: CustomEvent) => onSessionChanged(e.detail),\n\t\t};\n\t});\n\treturn listeners;\n}\n\n/**\n * Build URL parameters for API request\n * Shared by preloaded/static player entrypoints.\n */\nexport function buildApiParams(\n\tenv: any,\n\taddCorrectResponse: boolean,\n): URLSearchParams {\n\tconst params = new URLSearchParams();\n\tif (env && typeof env === \"object\") {\n\t\tif (env.mode) params.set(\"mode\", String(env.mode));\n\t\tif (env.role) params.set(\"role\", String(env.role));\n\t}\n\tif (addCorrectResponse) params.set(\"addCorrectResponse\", \"true\");\n\treturn params;\n}\n\n/**\n * Fetch item data from API\n * Shared by preloaded/static player entrypoints.\n */\nexport async function fetchItemData(\n\tapiBaseUrl: string,\n\titemId: string,\n\ttoken: string,\n\tendpoint: \"packaged\" | \"data-only\",\n\tenv: any,\n\taddCorrectResponse: boolean,\n\tsignal?: AbortSignal,\n): Promise<any> {\n\tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n\t\tthrow new Error(\"PIE initialization must run in browser\");\n\t}\n\n\tconst params = buildApiParams(env, addCorrectResponse);\n\tconst apiUrl = `${apiBaseUrl}/api/item/${itemId}/${endpoint}${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n\tconst response = await fetch(apiUrl, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\tAccept: \"application/json\",\n\t\t},\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch item data: ${response.statusText}`);\n\t}\n\n\treturn await response.json();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/pie/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAgB,EAAE;IAC5C,IAAI,QAAqB,CAAC;IAC1B,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;IAChC,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,EAAE,CAAC;QACb,MAAc,CAAC,YAAY,GAAG,QAAQ,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC","sourcesContent":["/**\n * PIE Registry Module\n *\n * Manages the global PIE registry that tracks loaded elements.\n */\n\nimport type { PieRegistry } from \"./types.js\";\nimport { isPieRegistryAvailable } from \"./types.js\";\n\n/**\n * Get or create the global PIE registry\n */\nexport const pieRegistry = (): PieRegistry => {\n\tlet registry: PieRegistry;\n\tif (isPieRegistryAvailable(window)) {\n\t\tregistry = window.PIE_REGISTRY;\n\t} else {\n\t\tregistry = {};\n\t\t(window as any).PIE_REGISTRY = registry;\n\t}\n\treturn registry;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-monitor.js","sourceRoot":"","sources":["../../src/pie/resource-monitor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resource Monitor for PIE Element Assets\n *\n * Tracks and monitors loading of resources (audio, video, images) embedded\n * in PIE element content without requiring changes to PIE elements.\n *\n * Features:\n * - Tracks resource load timing with PerformanceObserver\n * - Detects and retries failed resource loads\n * - Sends instrumentation to New Relic\n * - Works with all resource types (audio, video, img, link)\n */\n\nimport { NewRelicInstrumentationProvider } from \"../instrumentation/providers/NewRelicInstrumentationProvider.js\";\nimport { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport type { InstrumentationProvider } from \"../instrumentation/types.js\";\nimport type { ComponentContext } from \"./component-context.js\";\nimport { getCurrentComponentContext } from \"./component-context.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\nexport type ResourceMonitorConfig = {\n\t/**\n\t * Enable tracking page actions/events\n\t *\n\t * When true, resource monitoring events will be sent to the instrumentation provider.\n\t */\n\ttrackPageActions?: boolean;\n\n\t/**\n\t * Instrumentation provider for tracking events and errors\n\t *\n\t * Optional. If not provided, defaults to NewRelicInstrumentationProvider.\n\t * The provider handles instrumentation gracefully - if New Relic is not available,\n\t * it will simply not track events (no errors thrown).\n\t *\n\t * To use a different provider, pass it here:\n\t *\n\t * @example\n\t * ```typescript\n\t * const provider = new ConsoleInstrumentationProvider();\n\t * await provider.initialize({ debug: true });\n\t *\n\t * const monitor = new ResourceMonitor({\n\t * trackPageActions: true,\n\t * instrumentationProvider: provider\n\t * });\n\t * ```\n\t */\n\tinstrumentationProvider?: InstrumentationProvider;\n\n\t/**\n\t * Whether ResourceMonitor should initialize/destroy the instrumentation provider.\n\t *\n\t * Defaults to `true` when ResourceMonitor creates the provider internally, and\n\t * `false` when a provider is injected by the host.\n\t */\n\tmanageProviderLifecycle?: boolean;\n\n\t/**\n\t * Maximum number of retry attempts for failed resources\n\t * Default: 3\n\t */\n\tmaxRetries?: number;\n\n\t/**\n\t * Initial delay in ms before first retry\n\t * Default: 500\n\t */\n\tinitialRetryDelay?: number;\n\n\t/**\n\t * Maximum delay in ms between retries\n\t * Default: 5000\n\t */\n\tmaxRetryDelay?: number;\n\n\t/**\n\t * Enable debug logging\n\t */\n\tdebug?: boolean;\n};\n\nconst DEFAULT_CONFIG = {\n\ttrackPageActions: false as const,\n\tinstrumentationProvider: undefined as InstrumentationProvider | undefined,\n\tmanageProviderLifecycle: undefined as boolean | undefined,\n\tmaxRetries: 3 as number,\n\tinitialRetryDelay: 500 as number,\n\tmaxRetryDelay: 5000 as number,\n\tdebug: false as const,\n};\n\n// Constants\nconst MAX_URL_LENGTH = 80;\nconst URL_TRUNCATE_LENGTH = 77;\nconst MEDIA_RETRY_RECONCILIATION_TIMEOUT_MS = 1200;\nconst MEDIA_RETRY_RECONCILIATION_POLL_MS = 75;\n\ntype ResourceElement =\n\t| HTMLImageElement\n\t| HTMLAudioElement\n\t| HTMLVideoElement\n\t| HTMLLinkElement\n\t| HTMLSourceElement;\n\n/**\n * Event detail for resource monitoring events\n */\nexport interface ResourceMonitorEventDetail {\n\turl: string;\n\tresourceType: string;\n\tduration?: number;\n\tsize?: number;\n\tretryCount: number;\n\tmaxRetries: number;\n\terror?: string;\n}\n\nexport interface MediaRetryReadyDetail extends ResourceMonitorEventDetail {\n\tmediaTag: \"audio\" | \"video\";\n}\n\n/**\n * Resource monitor event contract\n *\n * - `pie-resource-load-success`: emitted when a resource request is successful.\n * For retried media resources, this is emitted only after media becomes healthy.\n * - `pie-resource-retry-success`: emitted once per successful retry cycle.\n * - `pie-media-retry-ready`: emitted once per successful retry cycle to recovered\n * media targets (`audio`/`video`), including `<source>`-driven retries resolved\n * to their parent media element.\n * - `pie-resource-load-error`: emitted when retries are exhausted or when a retried\n * media fetch succeeds but media does not become healthy before reconciliation timeout.\n */\n\ninterface ResourceErrorDiagnostics {\n\teventType: string;\n\ttagName: string;\n\tresourceUrl: string;\n\toriginalUrl: string;\n\tcurrentRetries: number;\n\tremainingRetries: number;\n\twillRetry: boolean;\n\tcacheBypassActive: boolean;\n\tcurrentSrc?: string;\n\treadyState?: number;\n\tnetworkState?: number;\n\tpaused?: boolean;\n\tended?: boolean;\n\tcurrentTime?: number;\n\tduration?: number | null;\n\tmediaErrorCode?: number;\n\tmediaErrorName?: string;\n\tmediaErrorMessage?: string;\n}\n\n/**\n * Tracks resource loads and provides retry capability\n */\nexport class ResourceMonitor {\n\tprivate config: Required<\n\t\tOmit<ResourceMonitorConfig, \"instrumentationProvider\">\n\t> & {\n\t\tinstrumentationProvider: InstrumentationProvider | undefined;\n\t};\n\tprivate logger: ReturnType<typeof createPieLogger>;\n\tprivate observer: PerformanceObserver | null = null;\n\tprivate mutationObserver: MutationObserver | null = null;\n\tprivate errorHandler: ((event: Event) => void) | null = null;\n\tprivate retryAttempts = new Map<string, number>();\n\tprivate retryTargets = new Map<string, Set<ResourceElement>>();\n\tprivate container: HTMLElement | null = null;\n\tprivate isBrowser: boolean;\n\tprivate containerResources = new Set<string>(); // Track resources within our container\n\tprivate provider: InstrumentationProvider;\n\tprivate readonly ownsProvider: boolean;\n\tprivate readonly manageProviderLifecycle: boolean;\n\tprivate started = false;\n\tprivate lifecycleVersion = 0;\n\tprivate pendingRetryTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\tprivate retryInFlight = new Set<string>();\n\tprivate pendingMediaChecks = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcleanup: () => void;\n\t\t}\n\t>();\n\n\tconstructor(config: ResourceMonitorConfig = {}) {\n\t\tconst validInjectedProvider = isInstrumentationProvider(\n\t\t\tconfig.instrumentationProvider,\n\t\t)\n\t\t\t? config.instrumentationProvider\n\t\t\t: undefined;\n\t\tconst hasInjectedProvider = !!validInjectedProvider;\n\t\tconst manageProviderLifecycle =\n\t\t\tconfig.manageProviderLifecycle ?? !hasInjectedProvider;\n\t\tthis.config = {\n\t\t\ttrackPageActions:\n\t\t\t\tconfig.trackPageActions ?? DEFAULT_CONFIG.trackPageActions,\n\t\t\tinstrumentationProvider: validInjectedProvider,\n\t\t\tmanageProviderLifecycle,\n\t\t\tmaxRetries: config.maxRetries ?? DEFAULT_CONFIG.maxRetries,\n\t\t\tinitialRetryDelay:\n\t\t\t\tconfig.initialRetryDelay ?? DEFAULT_CONFIG.initialRetryDelay,\n\t\t\tmaxRetryDelay: config.maxRetryDelay ?? DEFAULT_CONFIG.maxRetryDelay,\n\t\t\tdebug: config.debug ?? DEFAULT_CONFIG.debug,\n\t\t};\n\t\tthis.logger = createPieLogger(\"resource-monitor\", () =>\n\t\t\tthis.isDebugEnabled(),\n\t\t);\n\t\tif (config.instrumentationProvider && !validInjectedProvider) {\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tthis.logger.warn(\n\t\t\t\t\t\"Ignoring invalid instrumentation provider; expected InstrumentationProvider shape\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Always use a provider - default to NewRelic if not specified\n\t\tthis.ownsProvider = !this.config.instrumentationProvider;\n\t\tthis.provider =\n\t\t\tthis.config.instrumentationProvider ??\n\t\t\tnew NewRelicInstrumentationProvider();\n\t\tthis.manageProviderLifecycle = this.config.manageProviderLifecycle;\n\n\t\t// Initialize the provider (async, but don't block constructor)\n\t\tif (this.manageProviderLifecycle) {\n\t\t\tthis.provider.initialize().catch((err) => {\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.warn(\n\t\t\t\t\t\t\"Failed to initialize instrumentation provider:\",\n\t\t\t\t\t\terr,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (this.isDebugEnabled()) {\n\t\t\tthis.logger.debug(\n\t\t\t\t\"Skipping provider lifecycle management for injected provider\",\n\t\t\t);\n\t\t}\n\t\tthis.isBrowser =\n\t\t\ttypeof window !== \"undefined\" && typeof document !== \"undefined\";\n\t}\n\n\t/**\n\t * Check if debug logging is enabled (dynamically checks window.PIE_DEBUG)\n\t */\n\tprivate isDebugEnabled(): boolean {\n\t\treturn this.config.debug || isGlobalDebugEnabled();\n\t}\n\n\t/**\n\t * Truncate URL for display in logs\n\t */\n\tprivate truncateUrl(url: string): string {\n\t\treturn url.length > MAX_URL_LENGTH\n\t\t\t? \"...\" + url.slice(-URL_TRUNCATE_LENGTH)\n\t\t\t: url;\n\t}\n\n\t/**\n\t * Strip retry parameters from URL to get the original URL\n\t */\n\tprivate getOriginalUrl(url: string): string {\n\t\ttry {\n\t\t\tconst urlObj = new URL(url);\n\t\t\turlObj.searchParams.delete(\"retry\");\n\t\t\turlObj.searchParams.delete(\"t\");\n\t\t\treturn urlObj.toString();\n\t\t} catch {\n\t\t\t// If URL parsing fails, return as-is\n\t\t\treturn url;\n\t\t}\n\t}\n\n\tprivate withRetryParams(url: string, attempt: number): string {\n\t\tconst retryValue = String(attempt);\n\t\tconst timestamp = Date.now().toString();\n\t\ttry {\n\t\t\tconst parsed = new URL(url);\n\t\t\tparsed.searchParams.set(\"retry\", retryValue);\n\t\t\tparsed.searchParams.set(\"t\", timestamp);\n\t\t\treturn parsed.toString();\n\t\t} catch {\n\t\t\t// Fallback for relative or malformed URLs.\n\t\t\tconst separator = url.includes(\"?\") ? \"&\" : \"?\";\n\t\t\treturn `${url}${separator}retry=${encodeURIComponent(retryValue)}&t=${encodeURIComponent(timestamp)}`;\n\t\t}\n\t}\n\n\tprivate getMediaErrorName(code: number | undefined): string | undefined {\n\t\tswitch (code) {\n\t\t\tcase 1:\n\t\t\t\treturn \"MEDIA_ERR_ABORTED\";\n\t\t\tcase 2:\n\t\t\t\treturn \"MEDIA_ERR_NETWORK\";\n\t\t\tcase 3:\n\t\t\t\treturn \"MEDIA_ERR_DECODE\";\n\t\t\tcase 4:\n\t\t\t\treturn \"MEDIA_ERR_SRC_NOT_SUPPORTED\";\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate buildResourceErrorDiagnostics(\n\t\ttarget: ResourceElement,\n\t\targs: {\n\t\t\teventType: string;\n\t\t\tresourceUrl: string;\n\t\t\toriginalUrl: string;\n\t\t\tcurrentRetries: number;\n\t\t\tremainingRetries: number;\n\t\t\twillRetry: boolean;\n\t\t},\n\t): ResourceErrorDiagnostics {\n\t\tconst diagnostics: ResourceErrorDiagnostics = {\n\t\t\teventType: args.eventType,\n\t\t\ttagName: target.tagName.toLowerCase(),\n\t\t\tresourceUrl: args.resourceUrl,\n\t\t\toriginalUrl: args.originalUrl,\n\t\t\tcurrentRetries: args.currentRetries,\n\t\t\tremainingRetries: args.remainingRetries,\n\t\t\twillRetry: args.willRetry,\n\t\t\tcacheBypassActive:\n\t\t\t\targs.resourceUrl.includes(\"retry=\") || args.resourceUrl.includes(\"t=\"),\n\t\t};\n\n\t\tif (\n\t\t\ttarget instanceof HTMLAudioElement ||\n\t\t\ttarget instanceof HTMLVideoElement\n\t\t) {\n\t\t\tconst mediaError = target.error;\n\t\t\tconst mediaErrorCode = mediaError?.code;\n\t\t\tdiagnostics.currentSrc = target.currentSrc || target.src;\n\t\t\tdiagnostics.readyState = target.readyState;\n\t\t\tdiagnostics.networkState = target.networkState;\n\t\t\tdiagnostics.paused = target.paused;\n\t\t\tdiagnostics.ended = target.ended;\n\t\t\tdiagnostics.currentTime = target.currentTime;\n\t\t\tdiagnostics.duration = Number.isFinite(target.duration)\n\t\t\t\t? target.duration\n\t\t\t\t: null;\n\t\t\tdiagnostics.mediaErrorCode = mediaErrorCode;\n\t\t\tdiagnostics.mediaErrorName = this.getMediaErrorName(mediaErrorCode);\n\t\t\tdiagnostics.mediaErrorMessage =\n\t\t\t\ttypeof mediaError?.message === \"string\"\n\t\t\t\t\t? mediaError.message\n\t\t\t\t\t: undefined;\n\t\t}\n\n\t\treturn diagnostics;\n\t}\n\n\t/**\n\t * Track event with instrumentation provider if enabled\n\t */\n\tprivate trackInstrumentationEvent(\n\t\teventName: string,\n\t\tattributes: Record<string, any>,\n\t): void {\n\t\tif (!this.config.trackPageActions || !this.provider.isReady()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.provider.trackEvent(eventName, {\n\t\t\t...attributes,\n\t\t\tcomponent: \"resource-monitor\",\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t});\n\t}\n\n\t/**\n\t * Track error with instrumentation provider if enabled\n\t */\n\tprivate trackInstrumentationError(\n\t\terror: Error,\n\t\tattributes: Record<string, any>,\n\t): void {\n\t\tif (!this.config.trackPageActions || !this.provider.isReady()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.provider.trackError(error, {\n\t\t\t...attributes,\n\t\t\tcomponent: \"resource-monitor\",\n\t\t\terrorType: attributes.errorType || \"ResourceError\",\n\t\t});\n\t}\n\n\t/**\n\t * Start monitoring resources in the given container\n\t */\n\tpublic start(container: HTMLElement): void {\n\t\tif (this.started) {\n\t\t\tif (this.container === container) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.stop();\n\t\t}\n\n\t\tif (!this.isBrowser) {\n\t\t\tthis.logger.debug(\n\t\t\t\t\"Not in browser environment, skipping resource monitoring\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.lifecycleVersion += 1;\n\n\t\tthis.setupMutationObserver();\n\t\tthis.scanContainerResources(); // Initial scan of existing resources\n\t\tthis.setupPerformanceObserver();\n\t\tthis.setupErrorHandler();\n\t\tthis.started = true;\n\n\t\tthis.logger.info(\"✅ Resource monitoring started\");\n\t}\n\n\t/**\n\t * Stop monitoring and clean up\n\t */\n\tpublic stop(): void {\n\t\tif (!this.started) return;\n\t\tthis.lifecycleVersion += 1;\n\n\t\tif (this.observer) {\n\t\t\tthis.observer.disconnect();\n\t\t\tthis.observer = null;\n\t\t}\n\n\t\tif (this.mutationObserver) {\n\t\t\tthis.mutationObserver.disconnect();\n\t\t\tthis.mutationObserver = null;\n\t\t}\n\n\t\tif (this.errorHandler && this.container) {\n\t\t\tthis.container.removeEventListener(\"error\", this.errorHandler, true);\n\t\t\tthis.errorHandler = null;\n\t\t}\n\n\t\tthis.retryAttempts.clear();\n\t\tthis.retryTargets.clear();\n\t\tthis.retryInFlight.clear();\n\t\tfor (const timer of this.pendingRetryTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tthis.pendingRetryTimers.clear();\n\t\tfor (const pending of this.pendingMediaChecks.values()) {\n\t\t\tpending.cleanup();\n\t\t}\n\t\tthis.pendingMediaChecks.clear();\n\t\tthis.containerResources.clear();\n\t\tthis.container = null;\n\t\tthis.started = false;\n\n\t\tif (this.manageProviderLifecycle) {\n\t\t\ttry {\n\t\t\t\tthis.provider.destroy();\n\t\t\t} catch (error) {\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.warn(\n\t\t\t\t\t\t\"Failed to destroy instrumentation provider:\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.logger.info(\"Resource monitoring stopped\");\n\t}\n\n\t/**\n\t * Set up MutationObserver to track DOM changes within container\n\t * This allows us to know which resources belong to our container\n\t */\n\tprivate setupMutationObserver(): void {\n\t\tif (\n\t\t\t!this.isBrowser ||\n\t\t\ttypeof MutationObserver === \"undefined\" ||\n\t\t\t!this.container\n\t\t) {\n\t\t\tthis.logger.debug(\"MutationObserver not available or no container\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.mutationObserver = new MutationObserver((mutations) => {\n\t\t\t\tfor (const mutation of mutations) {\n\t\t\t\t\t// Check added nodes\n\t\t\t\t\tmutation.addedNodes.forEach((node) => {\n\t\t\t\t\t\tif (node instanceof HTMLElement) {\n\t\t\t\t\t\t\tthis.scanElementForResources(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check attribute changes (src, href changes)\n\t\t\t\t\tif (\n\t\t\t\t\t\tmutation.type === \"attributes\" &&\n\t\t\t\t\t\tmutation.target instanceof HTMLElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst target = mutation.target;\n\t\t\t\t\t\tif (this.isResourceElement(target)) {\n\t\t\t\t\t\t\tconst src = this.getResourceSrc(target);\n\t\t\t\t\t\t\tif (src) {\n\t\t\t\t\t\t\t\tthis.containerResources.add(src);\n\t\t\t\t\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t\t\t\t\t`📌 Tracked resource attribute change: ${src}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Observe the container for changes\n\t\t\tthis.mutationObserver.observe(this.container, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: true,\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: [\"src\", \"href\"],\n\t\t\t});\n\n\t\t\tthis.logger.debug(\"MutationObserver set up successfully\");\n\t\t} catch (error) {\n\t\t\tthis.logger.warn(\"Failed to set up MutationObserver:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Scan an element and its descendants for resources\n\t */\n\tprivate scanElementForResources(element: HTMLElement): void {\n\t\t// Check the element itself\n\t\tif (this.isResourceElement(element)) {\n\t\t\tconst src = this.getResourceSrc(element);\n\t\t\tif (src) {\n\t\t\t\tthis.containerResources.add(src);\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.debug(`📌 Tracked new resource in container: ${src}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check descendants\n\t\tconst resourceSelectors = [\n\t\t\t\"img\",\n\t\t\t\"audio\",\n\t\t\t\"video\",\n\t\t\t'link[rel=\"stylesheet\"]',\n\t\t\t\"source\",\n\t\t];\n\t\tresourceSelectors.forEach((selector) => {\n\t\t\telement.querySelectorAll(selector).forEach((el) => {\n\t\t\t\tif (this.isResourceElement(el)) {\n\t\t\t\t\tconst src = this.getResourceSrc(el as ResourceElement);\n\t\t\t\t\tif (src) {\n\t\t\t\t\t\tthis.containerResources.add(src);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Initial scan of container for existing resources\n\t */\n\tprivate scanContainerResources(): void {\n\t\tif (!this.container) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.scanElementForResources(this.container);\n\n\t\tif (this.isDebugEnabled()) {\n\t\t\tthis.logger.debug(\n\t\t\t\t`📊 Initial container scan found ${this.containerResources.size} resources`,\n\t\t\t);\n\t\t\tif (this.containerResources.size > 0) {\n\t\t\t\tthis.containerResources.forEach((url) => {\n\t\t\t\t\tthis.logger.debug(` - ${this.truncateUrl(url)}`);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set up PerformanceObserver to track resource loading timing\n\t */\n\tprivate setupPerformanceObserver(): void {\n\t\tif (!this.isBrowser || typeof PerformanceObserver === \"undefined\") {\n\t\t\tthis.logger.debug(\"PerformanceObserver not available\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.observer = new PerformanceObserver((list) => {\n\t\t\t\tfor (const entry of list.getEntries()) {\n\t\t\t\t\tif (entry.entryType === \"resource\") {\n\t\t\t\t\t\tthis.handleResourceTiming(entry as PerformanceResourceTiming);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Use 'type' (singular) instead of 'entryTypes' (plural) to support buffered option\n\t\t\t// The buffered flag only works with the newer 'type' parameter\n\t\t\tthis.observer.observe({\n\t\t\t\ttype: \"resource\",\n\t\t\t\tbuffered: true, // Capture resources loaded before observer started\n\t\t\t});\n\n\t\t\tthis.logger.debug(\"PerformanceObserver set up successfully\");\n\t\t} catch (error) {\n\t\t\tthis.logger.warn(\"Failed to set up PerformanceObserver:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Handle resource timing entry\n\t */\n\tprivate handleResourceTiming(entry: PerformanceResourceTiming): void {\n\t\t// Only track media and image resources that are relevant to PIE content\n\t\tconst isRelevant = this.isRelevantResource(entry);\n\n\t\tif (!isRelevant) {\n\t\t\tif (\n\t\t\t\tthis.isDebugEnabled() &&\n\t\t\t\t(entry.initiatorType === \"img\" ||\n\t\t\t\t\tentry.initiatorType === \"audio\" ||\n\t\t\t\t\tentry.initiatorType === \"video\")\n\t\t\t) {\n\t\t\t\tthis.logger.debug(\n\t\t\t\t\t`⏭️ Skipping non-container resource: ${this.truncateUrl(entry.name)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst duration = entry.duration;\n\t\tconst size = entry.transferSize;\n\t\tconst url = entry.name;\n\t\tconst originalUrl = this.getOriginalUrl(url);\n\n\t\t// Detect actual failures: responseEnd === 0 means the request didn't complete\n\t\t// Note: transferSize === 0 is NOT a failure indicator (can be cache, CORS, or small resources)\n\t\t// We primarily rely on the error event handler for detecting failures\n\t\tconst failed = entry.responseEnd === 0 && entry.duration > 0;\n\n\t\t// Check if this was a retry that succeeded\n\t\tconst wasRetried = this.retryAttempts.has(originalUrl);\n\t\tconst retryCount = this.retryAttempts.get(originalUrl) || 0;\n\n\t\t// Enhanced debug logging with detailed timing breakdown\n\t\tif (this.isDebugEnabled()) {\n\t\t\tconst shortUrl = this.truncateUrl(url);\n\t\t\tconst sizeKB = (size / 1024).toFixed(2);\n\t\t\tconst status = failed ? \"❌ FAILED\" : \"✅ SUCCESS\";\n\n\t\t\t// Detailed timing breakdown\n\t\t\tconst timingDetails = {\n\t\t\t\ttotal: `${duration.toFixed(2)}ms`,\n\t\t\t\tdns:\n\t\t\t\t\tentry.domainLookupEnd > 0\n\t\t\t\t\t\t? `${(entry.domainLookupEnd - entry.domainLookupStart).toFixed(2)}ms`\n\t\t\t\t\t\t: \"n/a\",\n\t\t\t\ttcp:\n\t\t\t\t\tentry.connectEnd > 0\n\t\t\t\t\t\t? `${(entry.connectEnd - entry.connectStart).toFixed(2)}ms`\n\t\t\t\t\t\t: \"n/a\",\n\t\t\t\trequest:\n\t\t\t\t\tentry.responseStart > 0\n\t\t\t\t\t\t? `${(entry.responseStart - entry.requestStart).toFixed(2)}ms`\n\t\t\t\t\t\t: \"n/a\",\n\t\t\t\tresponse:\n\t\t\t\t\tentry.responseEnd > 0\n\t\t\t\t\t\t? `${(entry.responseEnd - entry.responseStart).toFixed(2)}ms`\n\t\t\t\t\t\t: \"n/a\",\n\t\t\t\tsize: size > 0 ? `${sizeKB} KB` : \"0 KB\",\n\t\t\t\ttype: entry.initiatorType,\n\t\t\t\tprotocol: entry.nextHopProtocol || \"unknown\",\n\t\t\t};\n\n\t\t\t// Add retry context if this was retried\n\t\t\tconst retryContext =\n\t\t\t\twasRetried && !failed\n\t\t\t\t\t? `\\n 🔄 Retry Success: Succeeded after ${retryCount} ${retryCount === 1 ? \"retry\" : \"retries\"}`\n\t\t\t\t\t: \"\";\n\n\t\t\tthis.logger.info(\n\t\t\t\t`📊 PIE Resource Load ${status}\\n` +\n\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t` Type: ${timingDetails.type} | Protocol: ${timingDetails.protocol}\\n` +\n\t\t\t\t\t` ⏱️ Total Time: ${timingDetails.total}\\n` +\n\t\t\t\t\t` └─ DNS Lookup: ${timingDetails.dns}\\n` +\n\t\t\t\t\t` └─ TCP Connect: ${timingDetails.tcp}\\n` +\n\t\t\t\t\t` └─ Request Time: ${timingDetails.request}\\n` +\n\t\t\t\t\t` └─ Response Time: ${timingDetails.response}\\n` +\n\t\t\t\t\t` 📦 Transfer Size: ${timingDetails.size}${retryContext}`,\n\t\t\t);\n\t\t} else {\n\t\t\t// Simple logging when debug is off but tracking is on\n\t\t\tthis.logger.debug(`Resource loaded: ${entry.name}`, {\n\t\t\t\tduration: `${duration.toFixed(2)}ms`,\n\t\t\t\tsize: `${size} bytes`,\n\t\t\t\ttype: entry.initiatorType,\n\t\t\t\tfailed,\n\t\t\t\twasRetried,\n\t\t\t\tretryCount,\n\t\t\t});\n\t\t}\n\n\t\t// Handle successful loads\n\t\tif (!failed) {\n\t\t\tthis.handleSuccessfulLoad(\n\t\t\t\toriginalUrl,\n\t\t\t\tentry,\n\t\t\t\tduration,\n\t\t\t\tsize,\n\t\t\t\tretryCount,\n\t\t\t\twasRetried,\n\t\t\t);\n\t\t}\n\n\t\t// Track with instrumentation provider\n\t\tthis.trackInstrumentationEvent(\"pie-resource-load\", {\n\t\t\turl: entry.name,\n\t\t\tduration: Math.round(duration),\n\t\t\tsize,\n\t\t\ttype: entry.initiatorType,\n\t\t\tfailed,\n\t\t\twasRetried,\n\t\t\tretryCount,\n\t\t});\n\n\t\t// Track failed loads\n\t\tif (failed) {\n\t\t\tthis.handleFailedLoad(\n\t\t\t\toriginalUrl,\n\t\t\t\tentry,\n\t\t\t\tduration,\n\t\t\t\tretryCount,\n\t\t\t\twasRetried,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate isLifecycleActive(version: number): boolean {\n\t\treturn this.started && this.lifecycleVersion === version;\n\t}\n\n\tprivate clearRetryTracking(url: string): void {\n\t\tthis.retryAttempts.delete(url);\n\t\tthis.retryTargets.delete(url);\n\t\tthis.retryInFlight.delete(url);\n\t}\n\n\tprivate clearPendingMediaCheck(url: string): void {\n\t\tconst pending = this.pendingMediaChecks.get(url);\n\t\tif (!pending) return;\n\t\tpending.cleanup();\n\t\tthis.pendingMediaChecks.delete(url);\n\t}\n\n\tprivate getRetryTargets(url: string): Set<ResourceElement> {\n\t\tlet trackedTargets = this.retryTargets.get(url);\n\t\tif (!trackedTargets) {\n\t\t\ttrackedTargets = new Set<ResourceElement>();\n\t\t\tthis.retryTargets.set(url, trackedTargets);\n\t\t}\n\t\treturn trackedTargets;\n\t}\n\n\tprivate getPrimaryRetryTarget(url: string): ResourceElement | null {\n\t\tconst targets = this.retryTargets.get(url);\n\t\tif (!targets || targets.size === 0) return null;\n\t\tfor (const target of targets) {\n\t\t\treturn target;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Handle successful resource load\n\t */\n\tprivate handleSuccessfulLoad(\n\t\turl: string,\n\t\tentry: PerformanceResourceTiming,\n\t\tduration: number,\n\t\tsize: number,\n\t\tretryCount: number,\n\t\twasRetried: boolean,\n\t): void {\n\t\tconst detail: ResourceMonitorEventDetail = {\n\t\t\turl,\n\t\t\tresourceType: entry.initiatorType,\n\t\t\tduration,\n\t\t\tsize,\n\t\t\tretryCount,\n\t\t\tmaxRetries: this.config.maxRetries,\n\t\t};\n\t\tconst isMediaInitiator =\n\t\t\tentry.initiatorType === \"audio\" ||\n\t\t\tentry.initiatorType === \"video\" ||\n\t\t\tentry.initiatorType === \"source\";\n\n\t\tif (wasRetried && isMediaInitiator) {\n\t\t\tthis.reconcileMediaRetrySuccess(url, detail);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.dispatchEvent(\"pie-resource-load-success\", detail);\n\t\tif (wasRetried) {\n\t\t\tthis.finalizeRetrySuccess(url, detail);\n\t\t}\n\t}\n\n\tprivate resolveMediaTarget(target: ResourceElement): {\n\t\tmediaEl: HTMLAudioElement | HTMLVideoElement;\n\t\tmediaTag: \"audio\" | \"video\";\n\t} | null {\n\t\tif (target instanceof HTMLAudioElement) {\n\t\t\treturn { mediaEl: target, mediaTag: \"audio\" };\n\t\t}\n\t\tif (target instanceof HTMLVideoElement) {\n\t\t\treturn { mediaEl: target, mediaTag: \"video\" };\n\t\t}\n\t\tif (target instanceof HTMLSourceElement) {\n\t\t\tconst parent = target.parentElement;\n\t\t\tif (parent instanceof HTMLAudioElement) {\n\t\t\t\treturn { mediaEl: parent, mediaTag: \"audio\" };\n\t\t\t}\n\t\t\tif (parent instanceof HTMLVideoElement) {\n\t\t\t\treturn { mediaEl: parent, mediaTag: \"video\" };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate resolveMediaTargetsForUrl(url: string): Array<{\n\t\tmediaEl: HTMLAudioElement | HTMLVideoElement;\n\t\tmediaTag: \"audio\" | \"video\";\n\t}> {\n\t\tconst targets = this.retryTargets.get(url);\n\t\tif (!targets || targets.size === 0) return [];\n\t\tconst resolved = new Set<HTMLAudioElement | HTMLVideoElement>();\n\t\tconst out: Array<{\n\t\t\tmediaEl: HTMLAudioElement | HTMLVideoElement;\n\t\t\tmediaTag: \"audio\" | \"video\";\n\t\t}> = [];\n\t\tfor (const target of targets) {\n\t\t\tconst mediaTarget = this.resolveMediaTarget(target);\n\t\t\tif (!mediaTarget) continue;\n\t\t\tconst { mediaEl, mediaTag } = mediaTarget;\n\t\t\tif (resolved.has(mediaEl)) continue;\n\t\t\tconst candidateUrl = mediaEl.currentSrc || mediaEl.src;\n\t\t\tif (candidateUrl && this.getOriginalUrl(candidateUrl) !== url) continue;\n\t\t\tresolved.add(mediaEl);\n\t\t\tout.push({ mediaEl, mediaTag });\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate normalizeRetrySuccessResourceType(\n\t\turl: string,\n\t\tresourceType: string,\n\t): string {\n\t\tif (resourceType !== \"source\") return resourceType;\n\t\tconst mediaTargets = this.resolveMediaTargetsForUrl(url);\n\t\tif (mediaTargets.length === 0) return resourceType;\n\t\treturn mediaTargets[0].mediaTag;\n\t}\n\n\tprivate isMediaRetryRecovered(url: string): boolean {\n\t\tconst mediaTargets = this.resolveMediaTargetsForUrl(url);\n\t\tif (mediaTargets.length === 0) return false;\n\t\tfor (const { mediaEl } of mediaTargets) {\n\t\t\tconst hasError = !!mediaEl.error;\n\t\t\tconst hasNoSource =\n\t\t\t\tmediaEl.networkState === HTMLMediaElement.NETWORK_NO_SOURCE;\n\t\t\tconst isReady = mediaEl.readyState >= HTMLMediaElement.HAVE_METADATA;\n\t\t\tif (!hasError && !hasNoSource && isReady) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate finalizeRetrySuccess(\n\t\turl: string,\n\t\tdetail: ResourceMonitorEventDetail,\n\t): void {\n\t\tif (!this.retryAttempts.has(url)) return;\n\t\tconst successDetail: ResourceMonitorEventDetail = {\n\t\t\t...detail,\n\t\t\tresourceType: this.normalizeRetrySuccessResourceType(\n\t\t\t\turl,\n\t\t\t\tdetail.resourceType,\n\t\t\t),\n\t\t};\n\t\tconst shortUrl = this.truncateUrl(url);\n\t\tthis.logger.info(\n\t\t\t`✅ PIE Resource Retry Succeeded!\\n` +\n\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t` Retry Attempt: ${successDetail.retryCount}\\n` +\n\t\t\t\t` Load Time: ${(successDetail.duration || 0).toFixed(2)}ms\\n` +\n\t\t\t\t` Result: Resource now available to user`,\n\t\t);\n\t\tthis.dispatchEvent(\"pie-resource-retry-success\", successDetail);\n\t\tthis.dispatchMediaRetryReady(url, successDetail);\n\t\tthis.clearPendingMediaCheck(url);\n\t\tthis.clearRetryTracking(url);\n\t}\n\n\tprivate reconcileMediaRetrySuccess(\n\t\turl: string,\n\t\tdetail: ResourceMonitorEventDetail,\n\t): void {\n\t\tthis.clearPendingMediaCheck(url);\n\t\tif (this.isMediaRetryRecovered(url)) {\n\t\t\tthis.dispatchEvent(\"pie-resource-load-success\", detail);\n\t\t\tthis.finalizeRetrySuccess(url, detail);\n\t\t\treturn;\n\t\t}\n\t\tif (this.isDebugEnabled()) {\n\t\t\tthis.logger.debug(\n\t\t\t\t`⏳ Waiting for media readiness before retry success: ${this.truncateUrl(url)}`,\n\t\t\t);\n\t\t}\n\t\tconst version = this.lifecycleVersion;\n\t\tconst mediaTargets = this.resolveMediaTargetsForUrl(url);\n\t\tconst eventHandlers: Array<{\n\t\t\tmediaEl: HTMLAudioElement | HTMLVideoElement;\n\t\t\thandler: EventListener;\n\t\t}> = [];\n\t\tconst pollTimer = setInterval(() => {\n\t\t\tif (!this.isLifecycleActive(version)) {\n\t\t\t\tthis.clearPendingMediaCheck(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.retryAttempts.has(url)) {\n\t\t\t\tthis.clearPendingMediaCheck(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isMediaRetryRecovered(url)) {\n\t\t\t\tthis.dispatchEvent(\"pie-resource-load-success\", detail);\n\t\t\t\tthis.finalizeRetrySuccess(url, detail);\n\t\t\t}\n\t\t}, MEDIA_RETRY_RECONCILIATION_POLL_MS);\n\t\tconst timeoutTimer = setTimeout(() => {\n\t\t\tif (!this.isLifecycleActive(version)) {\n\t\t\t\tthis.clearPendingMediaCheck(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.retryAttempts.has(url)) {\n\t\t\t\tthis.clearPendingMediaCheck(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.clearPendingMediaCheck(url);\n\t\t\tthis.handleMediaRetryReconciliationTimeout(url, detail);\n\t\t}, MEDIA_RETRY_RECONCILIATION_TIMEOUT_MS);\n\t\tfor (const { mediaEl } of mediaTargets) {\n\t\t\tconst handler: EventListener = () => {\n\t\t\t\tif (!this.isLifecycleActive(version)) return;\n\t\t\t\tif (!this.retryAttempts.has(url)) return;\n\t\t\t\tif (!this.isMediaRetryRecovered(url)) return;\n\t\t\t\tthis.dispatchEvent(\"pie-resource-load-success\", detail);\n\t\t\t\tthis.finalizeRetrySuccess(url, detail);\n\t\t\t};\n\t\t\tmediaEl.addEventListener(\"loadedmetadata\", handler);\n\t\t\tmediaEl.addEventListener(\"canplay\", handler);\n\t\t\teventHandlers.push({ mediaEl, handler });\n\t\t}\n\t\tthis.pendingMediaChecks.set(url, {\n\t\t\tcleanup: () => {\n\t\t\t\tclearInterval(pollTimer);\n\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\tfor (const { mediaEl, handler } of eventHandlers) {\n\t\t\t\t\tmediaEl.removeEventListener(\"loadedmetadata\", handler);\n\t\t\t\t\tmediaEl.removeEventListener(\"canplay\", handler);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate handleMediaRetryReconciliationTimeout(\n\t\turl: string,\n\t\tdetail: ResourceMonitorEventDetail,\n\t): void {\n\t\tconst shortUrl = this.truncateUrl(url);\n\t\tthis.logger.warn(\n\t\t\t`⚠️ PIE Resource Retry Ready Timeout\\n` +\n\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t` Retry Attempt: ${detail.retryCount}\\n` +\n\t\t\t\t` Status: Media did not become healthy after fetch success`,\n\t\t);\n\t\tthis.dispatchEvent(\"pie-resource-retry-failed\", {\n\t\t\t...detail,\n\t\t\terror: \"Media fetch succeeded but did not become ready before timeout\",\n\t\t});\n\t\tthis.trackInstrumentationError(\n\t\t\tnew Error(\n\t\t\t\t`Resource retry reconciliation timed out before media was healthy: ${url}`,\n\t\t\t),\n\t\t\t{\n\t\t\t\tresourceUrl: url,\n\t\t\t\tresourceType: detail.resourceType,\n\t\t\t\tretryCount: detail.retryCount,\n\t\t\t\terrorType: \"MediaRetryReadyTimeout\",\n\t\t\t},\n\t\t);\n\t\tconst retryTarget = this.getPrimaryRetryTarget(url);\n\t\tif (retryTarget) {\n\t\t\tthis.retryResourceLoad(retryTarget, url);\n\t\t\treturn;\n\t\t}\n\t\tthis.handlePermanentFailure(url, detail.resourceType, detail.retryCount);\n\t}\n\n\tprivate dispatchMediaRetryReady(\n\t\turl: string,\n\t\tdetail: ResourceMonitorEventDetail,\n\t): void {\n\t\tconst mediaTargets = this.resolveMediaTargetsForUrl(url);\n\t\tif (mediaTargets.length === 0) return;\n\t\tfor (const { mediaEl, mediaTag } of mediaTargets) {\n\t\t\tconst event = new CustomEvent<MediaRetryReadyDetail>(\n\t\t\t\t\"pie-media-retry-ready\",\n\t\t\t\t{\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\t...detail,\n\t\t\t\t\t\tmediaTag,\n\t\t\t\t\t},\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tmediaEl.dispatchEvent(event);\n\t\t}\n\t}\n\n\t/**\n\t * Handle failed resource load\n\t */\n\tprivate handleFailedLoad(\n\t\turl: string,\n\t\tentry: PerformanceResourceTiming,\n\t\tduration: number,\n\t\tretryCount: number,\n\t\twasRetried: boolean,\n\t): void {\n\t\tconst shortUrl = this.truncateUrl(url);\n\n\t\tif (wasRetried) {\n\t\t\t// This is a retry that also failed - use warn since we'll retry again\n\t\t\tthis.logger.warn(\n\t\t\t\t`⚠️ PIE Resource Retry Failed\\n` +\n\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t` Retry Attempt: ${retryCount}\\n` +\n\t\t\t\t\t` Remaining Attempts: ${this.config.maxRetries - retryCount}\\n` +\n\t\t\t\t\t` Status: Will ${retryCount >= this.config.maxRetries ? \"give up\" : \"retry again\"}`,\n\t\t\t);\n\n\t\t\t// Dispatch retry failure event\n\t\t\tthis.dispatchEvent(\"pie-resource-retry-failed\", {\n\t\t\t\turl,\n\t\t\t\tresourceType: entry.initiatorType,\n\t\t\t\tduration,\n\t\t\t\tretryCount,\n\t\t\t\tmaxRetries: this.config.maxRetries,\n\t\t\t\terror: \"Resource load failed after retry\",\n\t\t\t});\n\t\t} else {\n\t\t\t// Initial failure - use warn since we'll retry\n\t\t\tthis.logger.warn(\n\t\t\t\t`⚠️ PIE Resource Initial Load Failed\\n` +\n\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t` Status: Will attempt ${this.config.maxRetries} ${this.config.maxRetries === 1 ? \"retry\" : \"retries\"}`,\n\t\t\t);\n\n\t\t\t// Dispatch initial failure event\n\t\t\tthis.dispatchEvent(\"pie-resource-load-failed\", {\n\t\t\t\turl,\n\t\t\t\tresourceType: entry.initiatorType,\n\t\t\t\tduration,\n\t\t\t\tretryCount: 0,\n\t\t\t\tmaxRetries: this.config.maxRetries,\n\t\t\t\terror: \"Initial resource load failed\",\n\t\t\t});\n\t\t}\n\n\t\t// Track error with instrumentation provider\n\t\tthis.trackInstrumentationError(\n\t\t\tnew Error(`Resource load failed: ${entry.name}`),\n\t\t\t{\n\t\t\t\tresourceUrl: entry.name,\n\t\t\t\tresourceType: entry.initiatorType,\n\t\t\t\tduration: Math.round(duration),\n\t\t\t\twasRetried,\n\t\t\t\tretryCount,\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Check if resource is relevant to our container\n\t * Uses container-scoped tracking via MutationObserver\n\t * Also retroactively checks if resource belongs to container if not yet tracked\n\t */\n\tprivate isRelevantResource(entry: PerformanceResourceTiming): boolean {\n\t\tconst url = entry.name;\n\n\t\t// Only track resources that we know are in our container\n\t\tlet isInContainer = this.containerResources.has(url);\n\n\t\tif (!isInContainer) {\n\t\t\t// Also check if it's a relative URL that might match\n\t\t\t// (PerformanceResourceTiming gives absolute URLs)\n\t\t\tfor (const containerUrl of this.containerResources) {\n\t\t\t\tif (url.endsWith(containerUrl) || containerUrl.endsWith(url)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Retroactively check if this resource belongs to our container\n\t\t\t// This handles the case where resources load before MutationObserver scans\n\t\t\t// PerformanceObserver can capture resources that loaded before it started (buffered: true)\n\t\t\t// but if they loaded before MutationObserver scanned, they won't be in containerResources\n\t\t\tif (this.container) {\n\t\t\t\t// Simple check: if resource is a media/image type and we have a container,\n\t\t\t\t// check if any element in container has this src/href\n\t\t\t\t// This is a fallback for resources that loaded very quickly before scan completed\n\t\t\t\tconst isInContainer = this.isResourceInContainer(\n\t\t\t\t\turl,\n\t\t\t\t\tentry.initiatorType,\n\t\t\t\t);\n\t\t\t\tif (isInContainer) {\n\t\t\t\t\tthis.containerResources.add(url);\n\t\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t\t`📌 Retroactively tracked resource: ${this.truncateUrl(url)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn isInContainer;\n\t}\n\n\t/**\n\t * Check if a resource URL actually belongs to our container by checking DOM elements\n\t * This is a fallback for resources that loaded before MutationObserver scanned\n\t */\n\tprivate isResourceInContainer(url: string, initiatorType: string): boolean {\n\t\tif (!this.container) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Check if any element in the container has this URL as src/href\n\t\t\tconst urlObj = new URL(url);\n\t\t\tconst urlPath = urlObj.pathname + urlObj.search;\n\n\t\t\t// For images, audio, video - check src attributes\n\t\t\tif (\n\t\t\t\tinitiatorType === \"img\" ||\n\t\t\t\tinitiatorType === \"audio\" ||\n\t\t\t\tinitiatorType === \"video\"\n\t\t\t) {\n\t\t\t\tconst elements = this.container.querySelectorAll(\n\t\t\t\t\t`${initiatorType}[src]`,\n\t\t\t\t);\n\t\t\t\tfor (const el of elements) {\n\t\t\t\t\tconst resourceEl = el as\n\t\t\t\t\t\t| HTMLImageElement\n\t\t\t\t\t\t| HTMLAudioElement\n\t\t\t\t\t\t| HTMLVideoElement;\n\t\t\t\t\tif (\n\t\t\t\t\t\tresourceEl.src &&\n\t\t\t\t\t\t(resourceEl.src === url || resourceEl.src.endsWith(urlPath))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For link elements (stylesheets) - check href\n\t\t\tif (initiatorType === \"link\") {\n\t\t\t\tconst links = this.container.querySelectorAll(\"link[href]\");\n\t\t\t\tfor (const link of links) {\n\t\t\t\t\tconst linkEl = link as HTMLLinkElement;\n\t\t\t\t\tif (\n\t\t\t\t\t\tlinkEl.href &&\n\t\t\t\t\t\t(linkEl.href === url || linkEl.href.endsWith(urlPath))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For source elements (inside audio/video) - check src\n\t\t\tif (initiatorType === \"source\") {\n\t\t\t\tconst sources = this.container.querySelectorAll(\"source[src]\");\n\t\t\t\tfor (const source of sources) {\n\t\t\t\t\tconst sourceEl = source as HTMLSourceElement;\n\t\t\t\t\tif (\n\t\t\t\t\t\tsourceEl.src &&\n\t\t\t\t\t\t(sourceEl.src === url || sourceEl.src.endsWith(urlPath))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// If URL parsing fails or querySelector fails, fall back to false\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tthis.logger.debug(\n\t\t\t\t\t`Error checking if resource is in container: ${error}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set up error event handler for resource loading failures\n\t */\n\tprivate setupErrorHandler(): void {\n\t\tif (!this.container) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use capturing phase to catch errors before they bubble\n\t\tthis.errorHandler = (event: Event) => {\n\t\t\tconst target = event.target as ResourceElement;\n\n\t\t\t// Only handle resource elements\n\t\t\tif (!this.isResourceElement(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tagName = target.tagName.toLowerCase();\n\t\t\tconst src = this.getResourceSrc(target);\n\n\t\t\tif (!src) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get the original URL without retry parameters\n\t\t\tconst originalSrc = this.getOriginalUrl(src);\n\n\t\t\t// Check if we have retries remaining\n\t\t\tconst currentRetries = this.retryAttempts.get(originalSrc) || 0;\n\t\t\tconst remainingRetries = this.config.maxRetries - currentRetries;\n\t\t\tconst willRetry = remainingRetries > 0;\n\t\t\tconst diagnostics = this.buildResourceErrorDiagnostics(target, {\n\t\t\t\teventType: event.type,\n\t\t\t\tresourceUrl: src,\n\t\t\t\toriginalUrl: originalSrc,\n\t\t\t\tcurrentRetries,\n\t\t\t\tremainingRetries,\n\t\t\t\twillRetry,\n\t\t\t});\n\n\t\t\t// Enhanced debug logging for errors\n\t\t\t// Use warn if we'll retry, error if we've exhausted retries\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tconst shortUrl = this.truncateUrl(src);\n\t\t\t\tconst logMethod = willRetry\n\t\t\t\t\t? this.logger.warn.bind(this.logger)\n\t\t\t\t\t: this.logger.error.bind(this.logger);\n\t\t\t\tconst icon = willRetry ? \"⚠️\" : \"❌\";\n\n\t\t\t\tlogMethod(\n\t\t\t\t\t`${icon} PIE Resource Load Error\\n` +\n\t\t\t\t\t\t` Element: <${tagName}>\\n` +\n\t\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t\t` Current Attempts: ${currentRetries}\\n` +\n\t\t\t\t\t\t` Remaining Retries: ${remainingRetries}/${this.config.maxRetries}\\n` +\n\t\t\t\t\t\t` Action: ${willRetry ? \"Will retry with exponential backoff\" : \"Max retries reached, giving up\"}`,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst logMethod = willRetry\n\t\t\t\t\t? this.logger.warn.bind(this.logger)\n\t\t\t\t\t: this.logger.error.bind(this.logger);\n\t\t\t\tconst icon = willRetry ? \"⚠️\" : \"❌\";\n\t\t\t\tlogMethod(`${icon} Resource error: ${tagName} failed to load ${src}`);\n\t\t\t}\n\n\t\t\tthis.trackInstrumentationEvent(\"pie-resource-load-error\", diagnostics);\n\n\t\t\t// Track error with instrumentation provider\n\t\t\tthis.trackInstrumentationError(\n\t\t\t\tnew Error(`Resource load error: ${originalSrc}`),\n\t\t\t\t{\n\t\t\t\t\tresourceType: tagName,\n\t\t\t\t\t...diagnostics,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\t// Attempt retry with original URL\n\t\t\tthis.retryResourceLoad(target, originalSrc);\n\t\t};\n\n\t\tthis.container.addEventListener(\"error\", this.errorHandler, true);\n\t\tthis.logger.debug(\"Error handler attached to container\");\n\t}\n\n\t/**\n\t * Check if element is a resource element\n\t */\n\tprivate isResourceElement(\n\t\telement: EventTarget | null,\n\t): element is ResourceElement {\n\t\tif (!element || !(element instanceof HTMLElement)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst tag = element.tagName.toLowerCase();\n\t\treturn [\"img\", \"audio\", \"video\", \"link\", \"source\"].includes(tag);\n\t}\n\n\t/**\n\t * Get resource src/href from element\n\t */\n\tprivate getResourceSrc(element: ResourceElement): string | null {\n\t\tif (element instanceof HTMLLinkElement) {\n\t\t\treturn element.href;\n\t\t}\n\n\t\t// For audio, video, img, and source elements (all have src)\n\t\tif (\"src\" in element && element.src) {\n\t\t\treturn element.src;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Handle permanent resource failure after all retries exhausted\n\t */\n\tprivate handlePermanentFailure(\n\t\turl: string,\n\t\tresourceType: string,\n\t\tretryCount: number,\n\t): void {\n\t\tthis.clearPendingMediaCheck(url);\n\t\tthis.clearRetryTracking(url);\n\t\tif (this.isDebugEnabled()) {\n\t\t\tconst shortUrl = this.truncateUrl(url);\n\t\t\tthis.logger.error(\n\t\t\t\t`❌ PIE Resource Permanently Failed\\n` +\n\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t` Total Attempts: ${retryCount + 1} (initial + ${retryCount} retries)\\n` +\n\t\t\t\t\t` Status: Giving up after ${this.config.maxRetries} retries\\n` +\n\t\t\t\t\t` ⚠️ This resource will not be available to the user`,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.logger.error(\n\t\t\t\t`❌ Failed to load resource after ${this.config.maxRetries} retries: ${url}`,\n\t\t\t);\n\t\t}\n\n\t\t// Dispatch permanent failure event\n\t\tthis.dispatchEvent(\"pie-resource-load-error\", {\n\t\t\turl,\n\t\t\tresourceType,\n\t\t\tretryCount,\n\t\t\tmaxRetries: this.config.maxRetries,\n\t\t\terror: `Resource permanently failed after ${this.config.maxRetries} retries`,\n\t\t});\n\n\t\t// Track final failure with instrumentation provider\n\t\tthis.trackInstrumentationError(\n\t\t\tnew Error(\n\t\t\t\t`Resource permanently failed after ${this.config.maxRetries} retries: ${url}`,\n\t\t\t),\n\t\t\t{\n\t\t\t\tresourceUrl: url,\n\t\t\t\tretryCount,\n\t\t\t\tresourceType,\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Log retry schedule information\n\t */\n\tprivate logRetrySchedule(\n\t\turl: string,\n\t\tretryCount: number,\n\t\tdelay: number,\n\t\telementTag: string,\n\t): void {\n\t\tif (this.isDebugEnabled()) {\n\t\t\tconst shortUrl = this.truncateUrl(url);\n\t\t\tconst nextDelay = Math.min(\n\t\t\t\tthis.config.initialRetryDelay * Math.pow(2, retryCount + 1),\n\t\t\t\tthis.config.maxRetryDelay,\n\t\t\t);\n\n\t\t\tconst strategy =\n\t\t\t\telementTag === \"img\"\n\t\t\t\t\t? \"Cache-busting URL\"\n\t\t\t\t\t: elementTag === \"audio\" || elementTag === \"video\"\n\t\t\t\t\t\t? \"element.load()\"\n\t\t\t\t\t\t: elementTag === \"link\"\n\t\t\t\t\t\t\t? \"Cache-busting URL\"\n\t\t\t\t\t\t\t: \"URL update\";\n\n\t\t\tthis.logger.info(\n\t\t\t\t`🔄 PIE Resource Retry Scheduled\\n` +\n\t\t\t\t\t` URL: ${shortUrl}\\n` +\n\t\t\t\t\t` Attempt: ${retryCount + 1}/${this.config.maxRetries}\\n` +\n\t\t\t\t\t` ⏰ Wait Time: ${delay}ms (exponential backoff)\\n` +\n\t\t\t\t\t` Next Retry Delay: ${nextDelay}ms (if this fails)\\n` +\n\t\t\t\t\t` Strategy: ${strategy}`,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.logger.info(\n\t\t\t\t`🔄 Retrying resource load (attempt ${retryCount + 1}/${this.config.maxRetries}) after ${delay}ms: ${url}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Retry loading a failed resource with exponential backoff\n\t */\n\tprivate performRetryLoadAttempt(\n\t\telement: ResourceElement,\n\t\toriginalSrc: string,\n\t\tattemptNumber: number,\n\t): void {\n\t\ttry {\n\t\t\tif (\n\t\t\t\telement instanceof HTMLAudioElement ||\n\t\t\t\telement instanceof HTMLVideoElement\n\t\t\t) {\n\t\t\t\tconst retryUrl = this.withRetryParams(originalSrc, attemptNumber);\n\t\t\t\tif (element.src) {\n\t\t\t\t\telement.src = retryUrl;\n\t\t\t\t} else {\n\t\t\t\t\tconst source = Array.from(element.querySelectorAll(\"source\")).find(\n\t\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\t\ttypeof candidate.src === \"string\" &&\n\t\t\t\t\t\t\tthis.getOriginalUrl(candidate.src) === originalSrc,\n\t\t\t\t\t);\n\t\t\t\t\tif (source) {\n\t\t\t\t\t\tsource.src = retryUrl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telement.load();\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t`✓ Triggered load() on <${element.tagName.toLowerCase()}> with cache-busting params`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (element instanceof HTMLSourceElement) {\n\t\t\t\tconst retryUrl = this.withRetryParams(originalSrc, attemptNumber);\n\t\t\t\telement.src = retryUrl;\n\t\t\t\tconst parent = element.parentElement;\n\t\t\t\tif (\n\t\t\t\t\tparent instanceof HTMLAudioElement ||\n\t\t\t\t\tparent instanceof HTMLVideoElement\n\t\t\t\t) {\n\t\t\t\t\tparent.load();\n\t\t\t\t}\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t`✓ Updated <source> src with cache-busting params and reloaded parent media: retry=${attemptNumber}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (element instanceof HTMLImageElement) {\n\t\t\t\telement.src = this.withRetryParams(originalSrc, attemptNumber);\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t`✓ Updated <img> src with cache-busting params: retry=${attemptNumber}, t=${Date.now()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (element instanceof HTMLLinkElement) {\n\t\t\t\telement.href = this.withRetryParams(originalSrc, attemptNumber);\n\t\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t`✓ Updated <link> href with cache-busting params: retry=${attemptNumber}, t=${Date.now()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst diagnostics = this.buildResourceErrorDiagnostics(element, {\n\t\t\t\teventType: \"retry\",\n\t\t\t\tresourceUrl: this.getResourceSrc(element) || originalSrc,\n\t\t\t\toriginalUrl: originalSrc,\n\t\t\t\tcurrentRetries: attemptNumber,\n\t\t\t\tremainingRetries: Math.max(0, this.config.maxRetries - attemptNumber),\n\t\t\t\twillRetry: attemptNumber < this.config.maxRetries,\n\t\t\t});\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t`❌ Error during retry attempt for ${originalSrc}:`,\n\t\t\t\t\terror,\n\t\t\t\t\tdiagnostics,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.logger.error(`Error during retry for ${originalSrc}:`, error);\n\t\t\t}\n\t\t\tthis.trackInstrumentationError(\n\t\t\t\tnew Error(`Retry attempt error for resource: ${originalSrc}`),\n\t\t\t\t{\n\t\t\t\t\t...diagnostics,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate retryResourceLoad(\n\t\telement: ResourceElement,\n\t\toriginalSrc: string,\n\t): void {\n\t\tthis.getRetryTargets(originalSrc).add(element);\n\t\tif (!this.started) return;\n\t\tif (this.retryInFlight.has(originalSrc)) {\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tthis.logger.debug(\n\t\t\t\t\t`Retry already scheduled for ${this.truncateUrl(originalSrc)}; skipping duplicate error-triggered schedule`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst currentRetries = this.retryAttempts.get(originalSrc) || 0;\n\t\tif (currentRetries >= this.config.maxRetries) {\n\t\t\tthis.handlePermanentFailure(\n\t\t\t\toriginalSrc,\n\t\t\t\telement.tagName.toLowerCase(),\n\t\t\t\tcurrentRetries,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst delay = Math.min(\n\t\t\tthis.config.initialRetryDelay * Math.pow(2, currentRetries),\n\t\t\tthis.config.maxRetryDelay,\n\t\t);\n\t\tconst attemptNumber = currentRetries + 1;\n\t\tthis.retryInFlight.add(originalSrc);\n\t\tthis.retryAttempts.set(originalSrc, attemptNumber);\n\t\tthis.logRetrySchedule(\n\t\t\toriginalSrc,\n\t\t\tcurrentRetries,\n\t\t\tdelay,\n\t\t\telement.tagName.toLowerCase(),\n\t\t);\n\t\tthis.trackInstrumentationEvent(\"pie-resource-retry\", {\n\t\t\turl: originalSrc,\n\t\t\tattempt: attemptNumber,\n\t\t\tdelay,\n\t\t});\n\t\tconst version = this.lifecycleVersion;\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.pendingRetryTimers.delete(originalSrc);\n\t\t\tthis.retryInFlight.delete(originalSrc);\n\t\t\tif (!this.isLifecycleActive(version)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst retryTarget = this.getPrimaryRetryTarget(originalSrc);\n\t\t\tif (!retryTarget) return;\n\t\t\tif (this.isDebugEnabled()) {\n\t\t\t\tthis.logger.debug(\n\t\t\t\t\t`⏱️ Retry wait completed (${delay}ms), attempting reload now...`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.performRetryLoadAttempt(retryTarget, originalSrc, attemptNumber);\n\t\t}, delay);\n\t\tthis.pendingRetryTimers.set(originalSrc, timer);\n\t}\n\n\t/**\n\t * Dispatch a custom event from the container\n\t */\n\tprivate dispatchEvent(\n\t\teventName: string,\n\t\tdetail: ResourceMonitorEventDetail,\n\t): void {\n\t\tif (!this.container) {\n\t\t\t// Silent return - if container is null, events can't be dispatched\n\t\t\t// This should only happen if ResourceMonitor wasn't properly initialized\n\t\t\treturn;\n\t\t}\n\n\t\tconst event = new CustomEvent(eventName, {\n\t\t\tdetail,\n\t\t\tbubbles: true,\n\t\t\tcomposed: true, // Allow crossing shadow DOM boundaries\n\t\t});\n\n\t\tthis.container.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Get current retry statistics\n\t */\n\tpublic getStats(): {\n\t\tactiveRetries: number;\n\t\tfailedResources: Array<{ url: string; attempts: number }>;\n\t} {\n\t\tconst failedResources: Array<{ url: string; attempts: number }> = [];\n\n\t\tthis.retryAttempts.forEach((attempts, url) => {\n\t\t\tfailedResources.push({ url, attempts });\n\t\t});\n\n\t\treturn {\n\t\t\tactiveRetries: this.retryAttempts.size,\n\t\t\tfailedResources: failedResources.sort((a, b) => b.attempts - a.attempts),\n\t\t};\n\t}\n}\n\n/**\n * Create and start a resource monitor for a container\n */\nexport function createResourceMonitor(\n\tcontainer: HTMLElement,\n\tconfig: ResourceMonitorConfig = {},\n): ResourceMonitor {\n\tconst monitor = new ResourceMonitor(config);\n\tmonitor.start(container);\n\treturn monitor;\n}\n\n// =============================================================================\n// Global resource request tracking (consolidated from the old font-request-tracker)\n// =============================================================================\n\n// Track failed resource requests (by URL)\nconst failedRequests = new Map<string, ComponentContext[]>();\n\nfunction isResourceFile(url: string): boolean {\n\tconst resourceExtensions = [\n\t\t// Fonts\n\t\t\".woff\",\n\t\t\".woff2\",\n\t\t\".ttf\",\n\t\t\".otf\",\n\t\t\".eot\",\n\t\t// Images\n\t\t\".gif\",\n\t\t\".jpg\",\n\t\t\".jpeg\",\n\t\t\".png\",\n\t\t\".svg\",\n\t\t\".webp\",\n\t\t\".ico\",\n\t\t// Audio/Video\n\t\t\".mp3\",\n\t\t\".mp4\",\n\t\t\".wav\",\n\t\t\".ogg\",\n\t\t\".webm\",\n\t\t// Other assets\n\t\t\".pdf\",\n\t\t\".css\",\n\t\t\".js\",\n\t];\n\n\treturn resourceExtensions.some((ext) => url.toLowerCase().includes(ext));\n}\n\nfunction getResourceType(url: string): string {\n\tif (url.match(/\\.(woff|woff2|ttf|otf|eot)/i)) return \"Font\";\n\tif (url.match(/\\.(gif|jpg|jpeg|png|svg|webp|ico)/i)) return \"Image\";\n\tif (url.match(/\\.(mp3|mp4|wav|ogg|webm)/i)) return \"Media\";\n\tif (url.match(/\\.(css)/i)) return \"Stylesheet\";\n\tif (url.match(/\\.(js)/i)) return \"Script\";\n\treturn \"Resource\";\n}\n\nfunction logFailedRequest(\n\turl: string,\n\tstatus: number,\n\tcontext: ComponentContext | null,\n) {\n\t// Only log 404s and other failures (status 0 for network errors)\n\tif (status !== 404 && status !== 0) {\n\t\treturn;\n\t}\n\n\tconst key = url;\n\tif (!failedRequests.has(key)) {\n\t\tfailedRequests.set(key, []);\n\t}\n\n\tconst contexts = failedRequests.get(key)!;\n\tcontexts.push({\n\t\t...(context || { componentName: \"Unknown\", timestamp: Date.now() }),\n\t\ttimestamp: Date.now(),\n\t});\n\n\tconst resourceType = getResourceType(url);\n\tconst filename = url.split(\"/\").pop() || url;\n\tconst itemId = context?.itemId || \"Unknown\";\n\tconst componentName = context?.componentName || \"Unknown component\";\n\tconst elementType = context?.elementType || \"\";\n\n\tconsole.warn(\n\t\t`Failed ${resourceType} request`,\n\t\t`\\n Resource: ${filename}`,\n\t\t`\\n URL: ${url}`,\n\t\t`\\n Item ID: ${itemId}`,\n\t\t`\\n Mini-Player: ${componentName}`,\n\t\telementType ? `\\n Element Type: ${elementType}` : \"\",\n\t\t`\\n Status: ${status}`,\n\t\tcontext\n\t\t\t? \"\"\n\t\t\t: \"\\n Note: Component not tracked - may be from item markup or PIE element\",\n\t);\n}\n\n/**\n * Initialize global resource request tracking (404s for fonts/images/etc.)\n * Call this once when the app loads (client-side only).\n */\nexport function initializeResourceRequestTracking(): void {\n\tif (typeof window === \"undefined\") return;\n\n\t// Track fetch requests\n\tconst originalFetch = window.fetch;\n\twindow.fetch = async function (...args: Parameters<typeof fetch>) {\n\t\t// Extract URL from first argument (can be string, URL, or Request)\n\t\tlet url = \"\";\n\t\tif (typeof args[0] === \"string\") {\n\t\t\turl = args[0];\n\t\t} else if (args[0] instanceof URL) {\n\t\t\turl = args[0].toString();\n\t\t} else if (args[0] instanceof Request) {\n\t\t\turl = args[0].url;\n\t\t}\n\n\t\tif (isResourceFile(url) || url.startsWith(\"/\")) {\n\t\t\tconst context = getCurrentComponentContext();\n\t\t\ttry {\n\t\t\t\tconst response = await (originalFetch as any)(...args);\n\t\t\t\tif (response.status === 404) {\n\t\t\t\t\tlogFailedRequest(url, response.status, context);\n\t\t\t\t}\n\t\t\t\treturn response;\n\t\t\t} catch (error) {\n\t\t\t\tlogFailedRequest(url, 0, context);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn (originalFetch as any)(...args);\n\t} as any;\n\n\t// Track XMLHttpRequest\n\tconst originalXHROpen = XMLHttpRequest.prototype.open;\n\tXMLHttpRequest.prototype.open = function (\n\t\tmethod: string,\n\t\turl: string | URL,\n\t\tasync?: boolean,\n\t\tusername?: string | null,\n\t\tpassword?: string | null,\n\t) {\n\t\tconst urlString = typeof url === \"string\" ? url : url.toString();\n\n\t\tif (isResourceFile(urlString) || urlString.startsWith(\"/\")) {\n\t\t\tconst context = getCurrentComponentContext();\n\t\t\tthis.addEventListener(\"load\", function () {\n\t\t\t\tif (this.status === 404) {\n\t\t\t\t\tlogFailedRequest(urlString, this.status, context);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.addEventListener(\"error\", function () {\n\t\t\t\tlogFailedRequest(urlString, 0, context);\n\t\t\t});\n\t\t}\n\n\t\treturn originalXHROpen.call(\n\t\t\tthis,\n\t\t\tmethod,\n\t\t\turl,\n\t\t\tasync ?? true,\n\t\t\tusername ?? null,\n\t\t\tpassword ?? null,\n\t\t);\n\t};\n\n\t// Intercept img tag error events (most reliable way to catch failed image loads)\n\tconst errorHandler = (event: Event) => {\n\t\tconst target = event.target;\n\t\tif (target instanceof HTMLImageElement && target.src) {\n\t\t\tconst url = target.src;\n\t\t\tif (\n\t\t\t\tisResourceFile(url) ||\n\t\t\t\turl.startsWith(\"/\") ||\n\t\t\t\turl.startsWith(window.location.origin + \"/\")\n\t\t\t) {\n\t\t\t\tconst context = getCurrentComponentContext();\n\t\t\t\tconst relativeUrl = url.startsWith(window.location.origin)\n\t\t\t\t\t? url.replace(window.location.origin, \"\")\n\t\t\t\t\t: url;\n\t\t\t\tlogFailedRequest(relativeUrl, 404, context);\n\t\t\t}\n\t\t}\n\t};\n\n\tdocument.addEventListener(\"error\", errorHandler, true);\n\n\t// Track resource requests via PerformanceObserver (fonts, CSS resources, etc.)\n\tconst observer = new PerformanceObserver((list) => {\n\t\tfor (const entry of list.getEntries()) {\n\t\t\tif (entry.entryType !== \"resource\") continue;\n\t\t\tconst resourceEntry = entry;\n\t\t\tconst url = resourceEntry.name;\n\n\t\t\tif (\n\t\t\t\tisResourceFile(url) ||\n\t\t\t\turl.startsWith(\"/\") ||\n\t\t\t\turl.startsWith(window.location.origin + \"/\")\n\t\t\t) {\n\t\t\t\tconst perf = resourceEntry;\n\t\t\t\tconst failed = (perf as any).responseEnd === 0 && perf.duration > 0;\n\t\t\t\tconst mightBe404 =\n\t\t\t\t\t(perf as any).transferSize === 0 &&\n\t\t\t\t\t(perf as any).responseEnd > 0 &&\n\t\t\t\t\t(perf as any).responseStart === 0;\n\t\t\t\tif (failed || mightBe404) {\n\t\t\t\t\tconst context = getCurrentComponentContext();\n\t\t\t\t\tconst relativeUrl = url.startsWith(window.location.origin)\n\t\t\t\t\t\t? url.replace(window.location.origin, \"\")\n\t\t\t\t\t\t: url;\n\t\t\t\t\tlogFailedRequest(relativeUrl, 404, context);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\ttry {\n\t\tobserver.observe({ type: \"resource\", buffered: true });\n\t} catch (e) {\n\t\tconsole.warn(\n\t\t\t\"Failed to set up PerformanceObserver for resource tracking:\",\n\t\t\te,\n\t\t);\n\t}\n}\n\nexport function getTrackedResourceRequests(): Map<string, ComponentContext[]> {\n\treturn new Map(failedRequests);\n}\n\nexport function clearTrackedResourceRequests(): void {\n\tfailedRequests.clear();\n}\n"]}