@module-federation/observability-plugin 0.0.0-pre-release-2-5-20260520035046 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -87,6 +87,7 @@ and exposes the final loading state through a small `summary` object:
87
87
  - `runtime-loaded`: Module Federation finished loading the remote module.
88
88
  - `component-loaded`: business code called `markComponentLoaded`, or a producer
89
89
  called the injected `onMFRemoteLoaded` callback.
90
+ - `preloaded`: `preloadRemote` finished loading the selected resources.
90
91
  - `failed`: the load failed and `failedPhase` points to the first specific
91
92
  failing phase.
92
93
  - `recovered`: loading hit an error but a fallback/recovery path returned a
@@ -114,6 +115,20 @@ manifest, remoteEntry load, remoteEntry init, expose resolution, module factory
114
115
  execution, and final load completion. When a stage has matching start and end
115
116
  events, the end event includes a bounded `duration` value.
116
117
 
118
+ Preload reports include resource-level results from `preloadRemote`. Each
119
+ result records the resource URL, `resourceType`, `initiator`, preload `id`, and
120
+ status: `success`, `error`, `timeout`, or `cached`. Calls without `exposes` use
121
+ `remoteName/*` as the preload `id`. Calls with `exposes` are recorded per
122
+ expose as `remoteName/expose`. The plugin does not change the existing
123
+ `generatePreloadAssets` return shape; preload resources are still plain URL
124
+ arrays.
125
+
126
+ Runtime resource hooks also receive a `resourceContext` object on manifest,
127
+ remoteEntry, preload JS, and preload CSS resource loads. It contains
128
+ `initiator`, `id`, `resourceType`, and `url`, so custom loaders can tell whether
129
+ the resource was requested by `loadRemote` or `preloadRemote` without parsing
130
+ the URL.
131
+
117
132
  The report also keeps compact loading state under `summary`. It contains the
118
133
  final outcome, per-phase status and duration under `summary.phases`, safe
119
134
  cache/recovery markers under `summary.flags`, and the last resolved shared
@@ -304,7 +319,9 @@ ObservabilityPlugin({
304
319
  The runtime plugin does not create a server. The MF skill starts a temporary
305
320
  local Node collector, writes reports under `.mf/observability/collector`, and
306
321
  the agent reads those files. The collector path is local-only and does not
307
- execute code or control the page.
322
+ execute code or control the page. Collector delivery is controlled by the
323
+ `collector` option; debug mode only decides whether a failed collector request
324
+ prints a debug log.
308
325
 
309
326
  For browser production use, set `browser.mode: "production"` when the runtime
310
327
  console must stay minimal:
package/dist/CHANGELOG.md CHANGED
@@ -1,13 +1,16 @@
1
1
  # @module-federation/observability-plugin
2
2
 
3
- ## 0.0.0-pre-release-2-5-20260520035046
3
+ ## 2.5.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - 9aff938: Add a Loading Trace panel that can configure and inject the observability plugin, reload the inspected page, stream loading events, and export collected reports.
8
- - 9aff938: Add an opt-in observability plugin, a Chrome-extension-safe observability plugin entry with an independent name and fixed browser scope, a direct runtime plugin API with instance-bound component loaded marks, explicit temporary React `onMFRemoteLoaded` callback injection for matched remotes, opt-in start console traces for `loadRemote` and `loadShare`, a local collector mode for AI-assisted browser debugging, a Node-specific export for file reports, a build-specific export for build summaries and build error reports, remote and shared lifecycle hooks, console trace hints, safe browser/Node report outputs, configurable error stack capture with explicit console raw-stack opt-ins, shared/eager loading evidence gated to stable runtime `2.5.0+` for Chrome-extension compatibility, final loading outcome summaries for Module Federation loading reports including resolved shared dependencies, deterministic fact reports for runtime and build failures, no-op return handling for observer hooks, detailed remote match/init/expose/factory phase events with phase durations, compact phase summaries, cache/fallback markers, loaded-before evidence from existing federation instances when a remote load fails, length-limited business component metadata, clipped moduleInfo evidence with preserved deployment locator fields for snapshot-dependent failures, normalized runtime error summaries with error codes, owner hints, retryability, and safe context, dedicated runtime error codes for invalid manifests, missing exposes, and remote container init failures, plus MF skill guidance for reading and fixing observability reports.
7
+ - 41281f4: Add a Loading Trace panel that can configure and inject the observability plugin, reload the inspected page, stream loading events, and export collected reports.
8
+ - 41281f4: Add an opt-in observability plugin, a Chrome-extension-safe observability plugin entry with an independent name and fixed browser scope, a direct runtime plugin API with instance-bound component loaded marks, explicit temporary React `onMFRemoteLoaded` callback injection for matched remotes, opt-in start console traces for `loadRemote` and `loadShare`, a local collector mode for AI-assisted browser debugging, a Node-specific export for file reports, a build-specific export for build summaries and build error reports, remote and shared lifecycle hooks, console trace hints, safe browser/Node report outputs, configurable error stack capture with explicit console raw-stack opt-ins, shared/eager loading evidence gated to stable runtime `2.5.0+` for Chrome-extension compatibility, final loading outcome summaries for Module Federation loading reports including resolved shared dependencies, deterministic fact reports for runtime and build failures, no-op return handling for observer hooks, detailed remote match/init/expose/factory phase events with phase durations, compact phase summaries, cache/fallback markers, loaded-before evidence from existing federation instances when a remote load fails, length-limited business component metadata, clipped moduleInfo evidence with preserved deployment locator fields for snapshot-dependent failures, normalized runtime error summaries with error codes, owner hints, retryability, and safe context, dedicated runtime error codes for invalid manifests, missing exposes, and remote container init failures, plus MF skill guidance for reading and fixing observability reports.
9
9
 
10
10
  ### Patch Changes
11
11
 
12
+ - 0716c11: Track preload resource results and expose resource context to loader hooks.
13
+ - 328542c: Send configured local collector events outside debug mode while keeping failures quiet unless debug logging is enabled.
12
14
  - Updated dependencies [5d4095d]
13
- - @module-federation/sdk@0.0.0-pre-release-2-5-20260520035046
15
+ - Updated dependencies [0716c11]
16
+ - @module-federation/sdk@2.5.0
package/dist/README.md CHANGED
@@ -87,6 +87,7 @@ and exposes the final loading state through a small `summary` object:
87
87
  - `runtime-loaded`: Module Federation finished loading the remote module.
88
88
  - `component-loaded`: business code called `markComponentLoaded`, or a producer
89
89
  called the injected `onMFRemoteLoaded` callback.
90
+ - `preloaded`: `preloadRemote` finished loading the selected resources.
90
91
  - `failed`: the load failed and `failedPhase` points to the first specific
91
92
  failing phase.
92
93
  - `recovered`: loading hit an error but a fallback/recovery path returned a
@@ -114,6 +115,20 @@ manifest, remoteEntry load, remoteEntry init, expose resolution, module factory
114
115
  execution, and final load completion. When a stage has matching start and end
115
116
  events, the end event includes a bounded `duration` value.
116
117
 
118
+ Preload reports include resource-level results from `preloadRemote`. Each
119
+ result records the resource URL, `resourceType`, `initiator`, preload `id`, and
120
+ status: `success`, `error`, `timeout`, or `cached`. Calls without `exposes` use
121
+ `remoteName/*` as the preload `id`. Calls with `exposes` are recorded per
122
+ expose as `remoteName/expose`. The plugin does not change the existing
123
+ `generatePreloadAssets` return shape; preload resources are still plain URL
124
+ arrays.
125
+
126
+ Runtime resource hooks also receive a `resourceContext` object on manifest,
127
+ remoteEntry, preload JS, and preload CSS resource loads. It contains
128
+ `initiator`, `id`, `resourceType`, and `url`, so custom loaders can tell whether
129
+ the resource was requested by `loadRemote` or `preloadRemote` without parsing
130
+ the URL.
131
+
117
132
  The report also keeps compact loading state under `summary`. It contains the
118
133
  final outcome, per-phase status and duration under `summary.phases`, safe
119
134
  cache/recovery markers under `summary.flags`, and the last resolved shared
@@ -304,7 +319,9 @@ ObservabilityPlugin({
304
319
  The runtime plugin does not create a server. The MF skill starts a temporary
305
320
  local Node collector, writes reports under `.mf/observability/collector`, and
306
321
  the agent reads those files. The collector path is local-only and does not
307
- execute code or control the page.
322
+ execute code or control the page. Collector delivery is controlled by the
323
+ `collector` option; debug mode only decides whether a failed collector request
324
+ prints a debug log.
308
325
 
309
326
  For browser production use, set `browser.mode: "production"` when the runtime
310
327
  console must stay minimal:
package/dist/browser.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-qz6RbeSc.js";
1
+ import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-Db-z5jD3.js";
2
2
 
3
3
  //#region src/browser.d.ts
4
4
  declare function ObservabilityPlugin(options?: ObservabilityPluginOptions): ObservabilityRuntimePlugin;
package/dist/browser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
- const require_core = require('./core-JP2QeDL_.js');
2
+ const require_core = require('./core--1ofIHU9.js');
3
3
 
4
4
  //#region src/browser.ts
5
5
  function ObservabilityPlugin(options = {}) {
package/dist/build.js CHANGED
@@ -26,11 +26,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  }) : target, mod));
27
27
 
28
28
  //#endregion
29
+ let _module_federation_sdk = require("@module-federation/sdk");
29
30
  let node_fs = require("node:fs");
30
31
  node_fs = __toESM(node_fs);
31
32
  let node_path = require("node:path");
32
33
  node_path = __toESM(node_path);
33
- let _module_federation_sdk = require("@module-federation/sdk");
34
34
 
35
35
  //#region src/build.ts
36
36
  const PLUGIN_NAME = "ObservabilityBuildPlugin";
@@ -707,4 +707,5 @@ var ObservabilityBuildPlugin = class {
707
707
 
708
708
  //#endregion
709
709
  exports.ObservabilityBuildPlugin = ObservabilityBuildPlugin;
710
+ exports.__toESM = __toESM;
710
711
  exports.createObservabilityBuildInfo = createObservabilityBuildInfo;
@@ -1,4 +1,4 @@
1
- import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-qz6RbeSc.js";
1
+ import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions } from "./core-Db-z5jD3.js";
2
2
 
3
3
  //#region src/chrome-devtool.d.ts
4
4
  declare function ChromeObservabilityPlugin(options?: ObservabilityPluginOptions): ObservabilityRuntimePlugin;
@@ -1,5 +1,5 @@
1
1
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
- const require_core = require('./core-JP2QeDL_.js');
2
+ const require_core = require('./core--1ofIHU9.js');
3
3
 
4
4
  //#region src/chrome-devtool.ts
5
5
  function ChromeObservabilityPlugin(options = {}) {
@@ -10,7 +10,8 @@ function ChromeObservabilityPlugin(options = {}) {
10
10
  guardSharedHooksByRuntimeVersion: true,
11
11
  guardRuntimeHooksByRuntimeVersion: true,
12
12
  disablePreloadHooks: true,
13
- returnHookArgs: true
13
+ returnHookArgs: true,
14
+ forceDevelopmentChannels: true
14
15
  }).plugin;
15
16
  }
16
17
 
@@ -1,8 +1,12 @@
1
+ const require_build = require('./build.js');
2
+ let _module_federation_sdk = require("@module-federation/sdk");
3
+
1
4
  //#region src/core.ts
2
5
  const DEFAULT_MAX_EVENTS = 100;
3
6
  const HARD_MAX_EVENTS = 1e3;
4
7
  const DEFAULT_COLLECTOR_PORT = 17891;
5
8
  const COLLECTOR_PATH = "/__mf_observability";
9
+ const logger = (0, _module_federation_sdk.createLogger)("[ Module Federation Observability Plugin ]");
6
10
  const DEFAULT_DEVTOOLS_SOURCE = "module-federation/observability";
7
11
  const COMPONENT_BUSINESS_LOADED_EVENT = "component:business-loaded";
8
12
  const ON_MF_REMOTE_LOADED_PROP = "onMFRemoteLoaded";
@@ -537,6 +541,11 @@ function resolveRemoteFromRequestId(id, options) {
537
541
  })[0];
538
542
  return createRemoteInfo(matchedRemote);
539
543
  }
544
+ function resolveAliasRequestId(requestId, remote) {
545
+ if (!requestId || !remote?.alias || remote.alias === remote.name) return;
546
+ if (requestId === remote.name) return remote.alias;
547
+ if (requestId.startsWith(`${remote.name}/`)) return `${remote.alias}/${requestId.slice(remote.name.length + 1)}`;
548
+ }
540
549
  function sanitizeModuleInfoPath(value) {
541
550
  if (typeof value !== "string") return;
542
551
  return clipText(value, 320);
@@ -684,6 +693,7 @@ function createErrorContext(event, inputContext) {
684
693
  const context = { ...inputContext };
685
694
  if (event.lifecycle) context.lifecycle = event.lifecycle;
686
695
  if (event.requestId) context.requestId = event.requestId;
696
+ if (event.requestAlias) context.requestAlias = event.requestAlias;
687
697
  if (event.remote?.name) context.remoteName = event.remote.name;
688
698
  if (event.remote?.alias) context.remoteAlias = event.remote.alias;
689
699
  if (event.remote?.type) context.remoteType = event.remote.type;
@@ -717,6 +727,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
717
727
  const shouldGuardRuntimeHooksByRuntimeVersion = adapterOptions.guardRuntimeHooksByRuntimeVersion === true;
718
728
  const shouldDisablePreloadHooks = adapterOptions.disablePreloadHooks === true;
719
729
  const shouldReturnHookArgs = adapterOptions.returnHookArgs === true;
730
+ const shouldForceDevelopmentChannels = adapterOptions.forceDevelopmentChannels === true;
720
731
  const returnHookArgs = (args) => shouldReturnHookArgs ? args : void 0;
721
732
  const level = options.level || "summary";
722
733
  const configuredMaxEvents = normalizeMaxEvents(options.maxEvents, DEFAULT_MAX_EVENTS);
@@ -767,6 +778,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
767
778
  const errorInfo = getErrorInfo(event.error, options.stackTrace);
768
779
  const sanitizedRemote = sanitizeRemote(event.remote);
769
780
  const sanitizedShared = sanitizeShared(event.shared);
781
+ const requestAlias = sanitizeRequestId(event.requestAlias) || resolveAliasRequestId(event.requestId, sanitizedRemote);
770
782
  const hostName = sanitizeText(event.hostName, 120) || sanitizeText(origin?.options?.name, 120);
771
783
  const runtimeVersion = sanitizeText(origin?.version, 80) || appliedRuntimeVersion;
772
784
  const message = getRawText(event.message) || errorInfo.errorMessage;
@@ -776,6 +788,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
776
788
  phase: sanitizeText(event.phase, 120) || "runtime",
777
789
  status: event.status,
778
790
  requestId: sanitizeRequestId(event.requestId),
791
+ requestAlias,
779
792
  hostName,
780
793
  runtimeVersion,
781
794
  remote: sanitizedRemote,
@@ -966,7 +979,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
966
979
  }
967
980
  if (report.summary.componentLoaded) return "Business component loaded";
968
981
  if (report.summary.runtimeLoaded) return "Remote loaded successfully";
969
- if (report.summary.preloaded) return "Remote preload prepared";
982
+ if (report.summary.preloaded) return "Remote preloaded successfully";
970
983
  return "Remote loading is pending";
971
984
  }
972
985
  switch (report.errorCode) {
@@ -1020,6 +1033,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1020
1033
  addFact("ownerHint", ownerHint);
1021
1034
  addFact("retryable", report.retryable ?? report.summary.error?.retryable);
1022
1035
  addFact("requestId", report.requestId);
1036
+ addFact("requestAlias", report.requestAlias || report.summary.error?.context?.["requestAlias"]);
1023
1037
  addFact("hostName", report.hostName);
1024
1038
  addFact("remoteName", report.remote?.name);
1025
1039
  addFact("remoteAlias", report.remote?.alias);
@@ -1157,6 +1171,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1157
1171
  traceId: event.traceId,
1158
1172
  status: event.status === "error" ? "error" : "pending",
1159
1173
  requestId: event.requestId,
1174
+ requestAlias: event.requestAlias,
1160
1175
  hostName: event.hostName,
1161
1176
  runtimeVersion: event.runtimeVersion,
1162
1177
  remote: event.remote ? { ...event.remote } : void 0,
@@ -1195,6 +1210,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1195
1210
  reports.set(event.traceId, report);
1196
1211
  }
1197
1212
  if (event.requestId) report.requestId = event.requestId;
1213
+ if (event.requestAlias) report.requestAlias = event.requestAlias;
1198
1214
  if (event.hostName) report.hostName = event.hostName;
1199
1215
  if (event.runtimeVersion) report.runtimeVersion = event.runtimeVersion;
1200
1216
  if (event.remote) report.remote = { ...event.remote };
@@ -1264,8 +1280,12 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1264
1280
  keepalive: body.length <= 64 * 1024,
1265
1281
  credentials: "omit",
1266
1282
  mode: "cors"
1267
- }).catch(() => {});
1268
- } catch {}
1283
+ }).catch((error) => {
1284
+ logger.debug("Failed to notify local observability collector.", error);
1285
+ });
1286
+ } catch (error) {
1287
+ logger.debug("Failed to notify local observability collector.", error);
1288
+ }
1269
1289
  };
1270
1290
  const notifyDevtools = (event, report) => {
1271
1291
  if (!devtoolsOptions) return;
@@ -1304,6 +1324,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1304
1324
  report.remote?.alias,
1305
1325
  report.remote?.entry,
1306
1326
  report.requestId,
1327
+ report.requestAlias,
1307
1328
  report.sanitizedUrl
1308
1329
  ].some((value) => matchesReportValue(value, query.remote))) return false;
1309
1330
  if (query.expose && ![report.expose, report.requestId].some((value) => matchesReportValue(value, query.expose))) return false;
@@ -1360,6 +1381,14 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1360
1381
  }
1361
1382
  };
1362
1383
  const shouldUseConsole = () => options.console !== false;
1384
+ const shouldUseDevelopmentChannels = () => {
1385
+ if (shouldUseMinimalBrowserConsole()) return false;
1386
+ if (shouldForceDevelopmentChannels) return true;
1387
+ if (typeof process === "undefined" || !process.env) return true;
1388
+ return process.env.NODE_ENV !== "production";
1389
+ };
1390
+ const shouldNotifyCollector = () => Boolean(collectorOptions);
1391
+ const shouldNotifyDevtools = () => shouldUseDevelopmentChannels();
1363
1392
  const shouldUseMinimalBrowserConsole = () => options.browser?.mode === "production";
1364
1393
  const shouldUseStartTrace = () => options.trace?.printStart ?? (options.browser?.enabled === true && !shouldUseMinimalBrowserConsole());
1365
1394
  const shouldPrintStartConsole = (event) => shouldUseStartTrace() && event.status === "start" && (event.phase === "loadRemote" || event.phase === "shared") && shouldUseConsole();
@@ -1386,6 +1415,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1386
1415
  `phase: ${report.failedPhase || event.phase}`
1387
1416
  ];
1388
1417
  if (report.requestId) lines.push(`requestId: ${report.requestId}`);
1418
+ if (report.requestAlias) lines.push(`requestAlias: ${report.requestAlias}`);
1389
1419
  if (report.errorCode) lines.push(`errorCode: ${report.errorCode}`);
1390
1420
  if (report.shared?.name) lines.push(`shared: ${report.shared.name}`);
1391
1421
  const browserReadCommand = getBrowserReadCommand(report.traceId);
@@ -1413,6 +1443,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1413
1443
  `phase: ${event.phase}`
1414
1444
  ];
1415
1445
  if (event.requestId) lines.push(`requestId: ${event.requestId}`);
1446
+ if (event.requestAlias) lines.push(`requestAlias: ${event.requestAlias}`);
1416
1447
  if (event.remote?.name) lines.push(`remote: ${event.remote.name}`);
1417
1448
  if (event.shared?.name) lines.push(`shared: ${event.shared.name}`);
1418
1449
  if (event.lifecycle) lines.push(`lifecycle: ${event.lifecycle}`);
@@ -1443,8 +1474,8 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1443
1474
  const report = updateReport(event);
1444
1475
  emitStartConsoleHint(event, report);
1445
1476
  emitConsoleHint(event, report, input.error);
1446
- notifyCollector(event, report);
1447
- notifyDevtools(event, report);
1477
+ if (shouldNotifyCollector()) notifyCollector(event, report);
1478
+ if (shouldNotifyDevtools()) notifyDevtools(event, report);
1448
1479
  notifyRawError(input.error, event, report, origin);
1449
1480
  notifyEvent(event, report, origin);
1450
1481
  notifyReport(report, origin);
@@ -1491,7 +1522,29 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1491
1522
  if (options.react?.enabled === false || options.react?.injectLoadedCallback !== true) return;
1492
1523
  const remoteIds = options.react.remoteIds || [];
1493
1524
  if (!remoteIds.length) return { allowAnonymousComponent: false };
1494
- return remoteIds.includes(loadArgs.id) || (loadArgs.expose ? remoteIds.includes(loadArgs.expose) : false) ? { allowAnonymousComponent: true } : void 0;
1525
+ const normalizeRemoteId = (value) => value.replace(/\/\.\//g, "/").replace(/^\.\//, "");
1526
+ const expectedRemoteIds = new Set(remoteIds.map(normalizeRemoteId));
1527
+ const candidates = /* @__PURE__ */ new Set();
1528
+ const addCandidate = (value) => {
1529
+ if (!value) return;
1530
+ candidates.add(value);
1531
+ candidates.add(normalizeRemoteId(value));
1532
+ };
1533
+ const exposeValues = [loadArgs.expose];
1534
+ if (loadArgs.expose?.startsWith("./")) exposeValues.push(loadArgs.expose.slice(2));
1535
+ const remoteNames = [
1536
+ loadArgs.pkgNameOrAlias,
1537
+ loadArgs.remote?.alias,
1538
+ loadArgs.remote?.name
1539
+ ];
1540
+ addCandidate(loadArgs.id);
1541
+ addCandidate(loadArgs.expose);
1542
+ remoteNames.forEach((remoteName) => {
1543
+ exposeValues.forEach((expose) => {
1544
+ addCandidate(remoteName && expose ? `${remoteName}/${expose}` : "");
1545
+ });
1546
+ });
1547
+ return Array.from(candidates).some((candidate) => expectedRemoteIds.has(candidate)) ? { allowAnonymousComponent: true } : void 0;
1495
1548
  };
1496
1549
  const createReactComponentWrapper = (component, loadArgs, wrapPolicy, react) => {
1497
1550
  const target = resolveReactComponentTarget(component, options.react?.defaultExportMode || (wrapPolicy.allowAnonymousComponent ? "component" : "preserve"), wrapPolicy.allowAnonymousComponent);
@@ -1865,27 +1918,78 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1865
1918
  return returnHookArgs(args);
1866
1919
  }
1867
1920
  };
1868
- if (!shouldDisablePreloadHooks) plugin.generatePreloadAssets = (args) => {
1869
- const preloadArgs = args;
1870
- if (!prepareRuntimeOrigin(preloadArgs.origin)) return;
1871
- const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
1872
- const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
1873
- recordEvent({
1874
- phase: "preload",
1875
- status: "success",
1876
- requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
1877
- remote,
1878
- lifecycle: "generatePreloadAssets",
1879
- message: "preload:assets-ready",
1880
- metadata: clipObservabilityMetadata({
1881
- nameOrAlias: preloadConfig?.nameOrAlias,
1882
- exposes: preloadConfig?.exposes?.join(","),
1883
- resourceCategory: preloadConfig?.resourceCategory,
1884
- share: preloadConfig?.share,
1885
- depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
1886
- })
1887
- }, preloadArgs.origin);
1888
- };
1921
+ if (!shouldDisablePreloadHooks) {
1922
+ plugin.generatePreloadAssets = (args) => {
1923
+ const preloadArgs = args;
1924
+ if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
1925
+ const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
1926
+ const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
1927
+ recordEvent({
1928
+ phase: "preload",
1929
+ status: "start",
1930
+ requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
1931
+ remote,
1932
+ lifecycle: "generatePreloadAssets",
1933
+ message: "preload:assets-ready",
1934
+ metadata: clipObservabilityMetadata({
1935
+ nameOrAlias: preloadConfig?.nameOrAlias,
1936
+ exposes: preloadConfig?.exposes?.join(","),
1937
+ resourceCategory: preloadConfig?.resourceCategory,
1938
+ share: preloadConfig?.share,
1939
+ depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
1940
+ })
1941
+ }, preloadArgs.origin);
1942
+ return returnHookArgs(args);
1943
+ };
1944
+ plugin.afterPreloadRemote = (args) => {
1945
+ const preloadArgs = args;
1946
+ if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
1947
+ const results = preloadArgs.results || [];
1948
+ if (results.length === 0 && preloadArgs.error) {
1949
+ recordEvent({
1950
+ phase: "preload",
1951
+ status: "error",
1952
+ requestId: "preloadRemote",
1953
+ lifecycle: "afterPreloadRemote",
1954
+ message: "preload:failed",
1955
+ error: preloadArgs.error
1956
+ }, preloadArgs.origin);
1957
+ return returnHookArgs(args);
1958
+ }
1959
+ results.forEach((preloadResult) => {
1960
+ const remote = createRemoteInfo(preloadResult.remoteInfo || preloadResult.remote);
1961
+ const requestId = sanitizeRequestId(preloadResult.id) || remote?.name || sanitizeText(preloadResult.preloadConfig?.nameOrAlias, 160);
1962
+ preloadResult.results?.forEach((assetResult) => {
1963
+ const isError = assetResult.status === "error" || assetResult.status === "timeout";
1964
+ recordEvent({
1965
+ phase: "preload",
1966
+ status: isError ? "error" : "success",
1967
+ requestId,
1968
+ remote,
1969
+ url: assetResult.url,
1970
+ cached: assetResult.status === "cached",
1971
+ lifecycle: "afterPreloadRemote",
1972
+ message: `preload:${assetResult.resourceType || "resource"}:${assetResult.status || "complete"}`,
1973
+ error: isError ? assetResult.error : void 0,
1974
+ errorContext: isError ? {
1975
+ resourceType: assetResult.resourceType,
1976
+ initiator: assetResult.initiator,
1977
+ status: assetResult.status,
1978
+ id: assetResult.id
1979
+ } : void 0,
1980
+ metadata: clipObservabilityMetadata({
1981
+ resourceType: assetResult.resourceType,
1982
+ initiator: assetResult.initiator,
1983
+ status: assetResult.status,
1984
+ id: assetResult.id,
1985
+ preloadNameOrAlias: preloadResult.preloadConfig?.nameOrAlias
1986
+ })
1987
+ }, preloadArgs.origin);
1988
+ });
1989
+ });
1990
+ return returnHookArgs(args);
1991
+ };
1992
+ }
1889
1993
  return {
1890
1994
  plugin,
1891
1995
  getEvents() {
@@ -1930,4 +2034,9 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1930
2034
  }
1931
2035
 
1932
2036
  //#endregion
1933
- export { createObservability as t };
2037
+ Object.defineProperty(exports, 'createObservability', {
2038
+ enumerable: true,
2039
+ get: function () {
2040
+ return createObservability;
2041
+ }
2042
+ });
@@ -121,6 +121,7 @@ interface ObservabilityEvent {
121
121
  phase: string;
122
122
  status: ObservabilityEventStatus;
123
123
  requestId?: string;
124
+ requestAlias?: string;
124
125
  hostName?: string;
125
126
  runtimeVersion?: string;
126
127
  remote?: ObservabilityRemoteInfo;
@@ -149,6 +150,7 @@ interface ObservabilityReport {
149
150
  traceId: string;
150
151
  status: ObservabilityReportStatus;
151
152
  requestId?: string;
153
+ requestAlias?: string;
152
154
  hostName?: string;
153
155
  runtimeVersion?: string;
154
156
  remote?: ObservabilityRemoteInfo;
@@ -269,6 +271,7 @@ interface ObservabilityRuntimeAdapterOptions {
269
271
  guardRuntimeHooksByRuntimeVersion?: boolean;
270
272
  disablePreloadHooks?: boolean;
271
273
  returnHookArgs?: boolean;
274
+ forceDevelopmentChannels?: boolean;
272
275
  }
273
276
  declare module '@module-federation/runtime-core' {
274
277
  interface ModuleFederation {
@@ -279,6 +282,7 @@ interface ObservabilityRuntimeEventInput {
279
282
  phase: string;
280
283
  status: ObservabilityEventStatus;
281
284
  requestId?: string;
285
+ requestAlias?: string;
282
286
  hostName?: string;
283
287
  remote?: ObservabilityRemoteInfo;
284
288
  shared?: ObservabilitySharedInfo;
@@ -1,4 +1,4 @@
1
- import { t as createObservability } from "./core-CJhThq9p.js";
1
+ import { t as createObservability } from "./core-4ykFjWWj.js";
2
2
 
3
3
  //#region src/browser.ts
4
4
  function ObservabilityPlugin(options = {}) {
package/dist/esm/build.js CHANGED
@@ -1,6 +1,6 @@
1
+ import { simpleJoinRemoteEntry } from "@module-federation/sdk";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
- import { simpleJoinRemoteEntry } from "@module-federation/sdk";
4
4
 
5
5
  //#region src/build.ts
6
6
  const PLUGIN_NAME = "ObservabilityBuildPlugin";
@@ -1,4 +1,4 @@
1
- import { t as createObservability } from "./core-CJhThq9p.js";
1
+ import { t as createObservability } from "./core-4ykFjWWj.js";
2
2
 
3
3
  //#region src/chrome-devtool.ts
4
4
  function ChromeObservabilityPlugin(options = {}) {
@@ -9,7 +9,8 @@ function ChromeObservabilityPlugin(options = {}) {
9
9
  guardSharedHooksByRuntimeVersion: true,
10
10
  guardRuntimeHooksByRuntimeVersion: true,
11
11
  disablePreloadHooks: true,
12
- returnHookArgs: true
12
+ returnHookArgs: true,
13
+ forceDevelopmentChannels: true
13
14
  }).plugin;
14
15
  }
15
16
 
@@ -1,9 +1,11 @@
1
+ import { createLogger } from "@module-federation/sdk";
1
2
 
2
3
  //#region src/core.ts
3
4
  const DEFAULT_MAX_EVENTS = 100;
4
5
  const HARD_MAX_EVENTS = 1e3;
5
6
  const DEFAULT_COLLECTOR_PORT = 17891;
6
7
  const COLLECTOR_PATH = "/__mf_observability";
8
+ const logger = createLogger("[ Module Federation Observability Plugin ]");
7
9
  const DEFAULT_DEVTOOLS_SOURCE = "module-federation/observability";
8
10
  const COMPONENT_BUSINESS_LOADED_EVENT = "component:business-loaded";
9
11
  const ON_MF_REMOTE_LOADED_PROP = "onMFRemoteLoaded";
@@ -538,6 +540,11 @@ function resolveRemoteFromRequestId(id, options) {
538
540
  })[0];
539
541
  return createRemoteInfo(matchedRemote);
540
542
  }
543
+ function resolveAliasRequestId(requestId, remote) {
544
+ if (!requestId || !remote?.alias || remote.alias === remote.name) return;
545
+ if (requestId === remote.name) return remote.alias;
546
+ if (requestId.startsWith(`${remote.name}/`)) return `${remote.alias}/${requestId.slice(remote.name.length + 1)}`;
547
+ }
541
548
  function sanitizeModuleInfoPath(value) {
542
549
  if (typeof value !== "string") return;
543
550
  return clipText(value, 320);
@@ -685,6 +692,7 @@ function createErrorContext(event, inputContext) {
685
692
  const context = { ...inputContext };
686
693
  if (event.lifecycle) context.lifecycle = event.lifecycle;
687
694
  if (event.requestId) context.requestId = event.requestId;
695
+ if (event.requestAlias) context.requestAlias = event.requestAlias;
688
696
  if (event.remote?.name) context.remoteName = event.remote.name;
689
697
  if (event.remote?.alias) context.remoteAlias = event.remote.alias;
690
698
  if (event.remote?.type) context.remoteType = event.remote.type;
@@ -718,6 +726,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
718
726
  const shouldGuardRuntimeHooksByRuntimeVersion = adapterOptions.guardRuntimeHooksByRuntimeVersion === true;
719
727
  const shouldDisablePreloadHooks = adapterOptions.disablePreloadHooks === true;
720
728
  const shouldReturnHookArgs = adapterOptions.returnHookArgs === true;
729
+ const shouldForceDevelopmentChannels = adapterOptions.forceDevelopmentChannels === true;
721
730
  const returnHookArgs = (args) => shouldReturnHookArgs ? args : void 0;
722
731
  const level = options.level || "summary";
723
732
  const configuredMaxEvents = normalizeMaxEvents(options.maxEvents, DEFAULT_MAX_EVENTS);
@@ -768,6 +777,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
768
777
  const errorInfo = getErrorInfo(event.error, options.stackTrace);
769
778
  const sanitizedRemote = sanitizeRemote(event.remote);
770
779
  const sanitizedShared = sanitizeShared(event.shared);
780
+ const requestAlias = sanitizeRequestId(event.requestAlias) || resolveAliasRequestId(event.requestId, sanitizedRemote);
771
781
  const hostName = sanitizeText(event.hostName, 120) || sanitizeText(origin?.options?.name, 120);
772
782
  const runtimeVersion = sanitizeText(origin?.version, 80) || appliedRuntimeVersion;
773
783
  const message = getRawText(event.message) || errorInfo.errorMessage;
@@ -777,6 +787,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
777
787
  phase: sanitizeText(event.phase, 120) || "runtime",
778
788
  status: event.status,
779
789
  requestId: sanitizeRequestId(event.requestId),
790
+ requestAlias,
780
791
  hostName,
781
792
  runtimeVersion,
782
793
  remote: sanitizedRemote,
@@ -967,7 +978,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
967
978
  }
968
979
  if (report.summary.componentLoaded) return "Business component loaded";
969
980
  if (report.summary.runtimeLoaded) return "Remote loaded successfully";
970
- if (report.summary.preloaded) return "Remote preload prepared";
981
+ if (report.summary.preloaded) return "Remote preloaded successfully";
971
982
  return "Remote loading is pending";
972
983
  }
973
984
  switch (report.errorCode) {
@@ -1021,6 +1032,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1021
1032
  addFact("ownerHint", ownerHint);
1022
1033
  addFact("retryable", report.retryable ?? report.summary.error?.retryable);
1023
1034
  addFact("requestId", report.requestId);
1035
+ addFact("requestAlias", report.requestAlias || report.summary.error?.context?.["requestAlias"]);
1024
1036
  addFact("hostName", report.hostName);
1025
1037
  addFact("remoteName", report.remote?.name);
1026
1038
  addFact("remoteAlias", report.remote?.alias);
@@ -1158,6 +1170,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1158
1170
  traceId: event.traceId,
1159
1171
  status: event.status === "error" ? "error" : "pending",
1160
1172
  requestId: event.requestId,
1173
+ requestAlias: event.requestAlias,
1161
1174
  hostName: event.hostName,
1162
1175
  runtimeVersion: event.runtimeVersion,
1163
1176
  remote: event.remote ? { ...event.remote } : void 0,
@@ -1196,6 +1209,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1196
1209
  reports.set(event.traceId, report);
1197
1210
  }
1198
1211
  if (event.requestId) report.requestId = event.requestId;
1212
+ if (event.requestAlias) report.requestAlias = event.requestAlias;
1199
1213
  if (event.hostName) report.hostName = event.hostName;
1200
1214
  if (event.runtimeVersion) report.runtimeVersion = event.runtimeVersion;
1201
1215
  if (event.remote) report.remote = { ...event.remote };
@@ -1265,8 +1279,12 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1265
1279
  keepalive: body.length <= 64 * 1024,
1266
1280
  credentials: "omit",
1267
1281
  mode: "cors"
1268
- }).catch(() => {});
1269
- } catch {}
1282
+ }).catch((error) => {
1283
+ logger.debug("Failed to notify local observability collector.", error);
1284
+ });
1285
+ } catch (error) {
1286
+ logger.debug("Failed to notify local observability collector.", error);
1287
+ }
1270
1288
  };
1271
1289
  const notifyDevtools = (event, report) => {
1272
1290
  if (!devtoolsOptions) return;
@@ -1305,6 +1323,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1305
1323
  report.remote?.alias,
1306
1324
  report.remote?.entry,
1307
1325
  report.requestId,
1326
+ report.requestAlias,
1308
1327
  report.sanitizedUrl
1309
1328
  ].some((value) => matchesReportValue(value, query.remote))) return false;
1310
1329
  if (query.expose && ![report.expose, report.requestId].some((value) => matchesReportValue(value, query.expose))) return false;
@@ -1361,6 +1380,14 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1361
1380
  }
1362
1381
  };
1363
1382
  const shouldUseConsole = () => options.console !== false;
1383
+ const shouldUseDevelopmentChannels = () => {
1384
+ if (shouldUseMinimalBrowserConsole()) return false;
1385
+ if (shouldForceDevelopmentChannels) return true;
1386
+ if (typeof process === "undefined" || !process.env) return true;
1387
+ return process.env.NODE_ENV !== "production";
1388
+ };
1389
+ const shouldNotifyCollector = () => Boolean(collectorOptions);
1390
+ const shouldNotifyDevtools = () => shouldUseDevelopmentChannels();
1364
1391
  const shouldUseMinimalBrowserConsole = () => options.browser?.mode === "production";
1365
1392
  const shouldUseStartTrace = () => options.trace?.printStart ?? (options.browser?.enabled === true && !shouldUseMinimalBrowserConsole());
1366
1393
  const shouldPrintStartConsole = (event) => shouldUseStartTrace() && event.status === "start" && (event.phase === "loadRemote" || event.phase === "shared") && shouldUseConsole();
@@ -1387,6 +1414,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1387
1414
  `phase: ${report.failedPhase || event.phase}`
1388
1415
  ];
1389
1416
  if (report.requestId) lines.push(`requestId: ${report.requestId}`);
1417
+ if (report.requestAlias) lines.push(`requestAlias: ${report.requestAlias}`);
1390
1418
  if (report.errorCode) lines.push(`errorCode: ${report.errorCode}`);
1391
1419
  if (report.shared?.name) lines.push(`shared: ${report.shared.name}`);
1392
1420
  const browserReadCommand = getBrowserReadCommand(report.traceId);
@@ -1414,6 +1442,7 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1414
1442
  `phase: ${event.phase}`
1415
1443
  ];
1416
1444
  if (event.requestId) lines.push(`requestId: ${event.requestId}`);
1445
+ if (event.requestAlias) lines.push(`requestAlias: ${event.requestAlias}`);
1417
1446
  if (event.remote?.name) lines.push(`remote: ${event.remote.name}`);
1418
1447
  if (event.shared?.name) lines.push(`shared: ${event.shared.name}`);
1419
1448
  if (event.lifecycle) lines.push(`lifecycle: ${event.lifecycle}`);
@@ -1444,8 +1473,8 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1444
1473
  const report = updateReport(event);
1445
1474
  emitStartConsoleHint(event, report);
1446
1475
  emitConsoleHint(event, report, input.error);
1447
- notifyCollector(event, report);
1448
- notifyDevtools(event, report);
1476
+ if (shouldNotifyCollector()) notifyCollector(event, report);
1477
+ if (shouldNotifyDevtools()) notifyDevtools(event, report);
1449
1478
  notifyRawError(input.error, event, report, origin);
1450
1479
  notifyEvent(event, report, origin);
1451
1480
  notifyReport(report, origin);
@@ -1492,7 +1521,29 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1492
1521
  if (options.react?.enabled === false || options.react?.injectLoadedCallback !== true) return;
1493
1522
  const remoteIds = options.react.remoteIds || [];
1494
1523
  if (!remoteIds.length) return { allowAnonymousComponent: false };
1495
- return remoteIds.includes(loadArgs.id) || (loadArgs.expose ? remoteIds.includes(loadArgs.expose) : false) ? { allowAnonymousComponent: true } : void 0;
1524
+ const normalizeRemoteId = (value) => value.replace(/\/\.\//g, "/").replace(/^\.\//, "");
1525
+ const expectedRemoteIds = new Set(remoteIds.map(normalizeRemoteId));
1526
+ const candidates = /* @__PURE__ */ new Set();
1527
+ const addCandidate = (value) => {
1528
+ if (!value) return;
1529
+ candidates.add(value);
1530
+ candidates.add(normalizeRemoteId(value));
1531
+ };
1532
+ const exposeValues = [loadArgs.expose];
1533
+ if (loadArgs.expose?.startsWith("./")) exposeValues.push(loadArgs.expose.slice(2));
1534
+ const remoteNames = [
1535
+ loadArgs.pkgNameOrAlias,
1536
+ loadArgs.remote?.alias,
1537
+ loadArgs.remote?.name
1538
+ ];
1539
+ addCandidate(loadArgs.id);
1540
+ addCandidate(loadArgs.expose);
1541
+ remoteNames.forEach((remoteName) => {
1542
+ exposeValues.forEach((expose) => {
1543
+ addCandidate(remoteName && expose ? `${remoteName}/${expose}` : "");
1544
+ });
1545
+ });
1546
+ return Array.from(candidates).some((candidate) => expectedRemoteIds.has(candidate)) ? { allowAnonymousComponent: true } : void 0;
1496
1547
  };
1497
1548
  const createReactComponentWrapper = (component, loadArgs, wrapPolicy, react) => {
1498
1549
  const target = resolveReactComponentTarget(component, options.react?.defaultExportMode || (wrapPolicy.allowAnonymousComponent ? "component" : "preserve"), wrapPolicy.allowAnonymousComponent);
@@ -1866,27 +1917,78 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1866
1917
  return returnHookArgs(args);
1867
1918
  }
1868
1919
  };
1869
- if (!shouldDisablePreloadHooks) plugin.generatePreloadAssets = (args) => {
1870
- const preloadArgs = args;
1871
- if (!prepareRuntimeOrigin(preloadArgs.origin)) return;
1872
- const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
1873
- const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
1874
- recordEvent({
1875
- phase: "preload",
1876
- status: "success",
1877
- requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
1878
- remote,
1879
- lifecycle: "generatePreloadAssets",
1880
- message: "preload:assets-ready",
1881
- metadata: clipObservabilityMetadata({
1882
- nameOrAlias: preloadConfig?.nameOrAlias,
1883
- exposes: preloadConfig?.exposes?.join(","),
1884
- resourceCategory: preloadConfig?.resourceCategory,
1885
- share: preloadConfig?.share,
1886
- depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
1887
- })
1888
- }, preloadArgs.origin);
1889
- };
1920
+ if (!shouldDisablePreloadHooks) {
1921
+ plugin.generatePreloadAssets = (args) => {
1922
+ const preloadArgs = args;
1923
+ if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
1924
+ const remote = createRemoteInfo(preloadArgs.remoteInfo || preloadArgs.remote);
1925
+ const preloadConfig = preloadArgs.preloadOptions?.preloadConfig;
1926
+ recordEvent({
1927
+ phase: "preload",
1928
+ status: "start",
1929
+ requestId: remote?.name || sanitizeText(preloadConfig?.nameOrAlias, 160),
1930
+ remote,
1931
+ lifecycle: "generatePreloadAssets",
1932
+ message: "preload:assets-ready",
1933
+ metadata: clipObservabilityMetadata({
1934
+ nameOrAlias: preloadConfig?.nameOrAlias,
1935
+ exposes: preloadConfig?.exposes?.join(","),
1936
+ resourceCategory: preloadConfig?.resourceCategory,
1937
+ share: preloadConfig?.share,
1938
+ depsRemote: Array.isArray(preloadConfig?.depsRemote) ? "custom" : preloadConfig?.depsRemote
1939
+ })
1940
+ }, preloadArgs.origin);
1941
+ return returnHookArgs(args);
1942
+ };
1943
+ plugin.afterPreloadRemote = (args) => {
1944
+ const preloadArgs = args;
1945
+ if (!prepareRuntimeOrigin(preloadArgs.origin)) return returnHookArgs(args);
1946
+ const results = preloadArgs.results || [];
1947
+ if (results.length === 0 && preloadArgs.error) {
1948
+ recordEvent({
1949
+ phase: "preload",
1950
+ status: "error",
1951
+ requestId: "preloadRemote",
1952
+ lifecycle: "afterPreloadRemote",
1953
+ message: "preload:failed",
1954
+ error: preloadArgs.error
1955
+ }, preloadArgs.origin);
1956
+ return returnHookArgs(args);
1957
+ }
1958
+ results.forEach((preloadResult) => {
1959
+ const remote = createRemoteInfo(preloadResult.remoteInfo || preloadResult.remote);
1960
+ const requestId = sanitizeRequestId(preloadResult.id) || remote?.name || sanitizeText(preloadResult.preloadConfig?.nameOrAlias, 160);
1961
+ preloadResult.results?.forEach((assetResult) => {
1962
+ const isError = assetResult.status === "error" || assetResult.status === "timeout";
1963
+ recordEvent({
1964
+ phase: "preload",
1965
+ status: isError ? "error" : "success",
1966
+ requestId,
1967
+ remote,
1968
+ url: assetResult.url,
1969
+ cached: assetResult.status === "cached",
1970
+ lifecycle: "afterPreloadRemote",
1971
+ message: `preload:${assetResult.resourceType || "resource"}:${assetResult.status || "complete"}`,
1972
+ error: isError ? assetResult.error : void 0,
1973
+ errorContext: isError ? {
1974
+ resourceType: assetResult.resourceType,
1975
+ initiator: assetResult.initiator,
1976
+ status: assetResult.status,
1977
+ id: assetResult.id
1978
+ } : void 0,
1979
+ metadata: clipObservabilityMetadata({
1980
+ resourceType: assetResult.resourceType,
1981
+ initiator: assetResult.initiator,
1982
+ status: assetResult.status,
1983
+ id: assetResult.id,
1984
+ preloadNameOrAlias: preloadResult.preloadConfig?.nameOrAlias
1985
+ })
1986
+ }, preloadArgs.origin);
1987
+ });
1988
+ });
1989
+ return returnHookArgs(args);
1990
+ };
1991
+ }
1890
1992
  return {
1891
1993
  plugin,
1892
1994
  getEvents() {
@@ -1931,9 +2033,4 @@ function createObservability(rawOptions = {}, adapterOptions = {}) {
1931
2033
  }
1932
2034
 
1933
2035
  //#endregion
1934
- Object.defineProperty(exports, 'createObservability', {
1935
- enumerable: true,
1936
- get: function () {
1937
- return createObservability;
1938
- }
1939
- });
2036
+ export { createObservability as t };
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as createObservability } from "./core-CJhThq9p.js";
1
+ import { t as createObservability } from "./core-4ykFjWWj.js";
2
2
  import { ObservabilityPlugin } from "./browser.js";
3
3
  import { ChromeObservabilityPlugin } from "./chrome-devtool.js";
4
4
 
package/dist/esm/node.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as createObservability } from "./core-CJhThq9p.js";
1
+ import { t as createObservability } from "./core-4ykFjWWj.js";
2
2
 
3
3
  //#region src/node.ts
4
4
  const DEFAULT_NODE_DIRECTORY = ".mf/observability";
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ObservabilityReportListOptions, B as OnMFRemoteLoaded, C as ObservabilityPhaseCollection, D as ObservabilityRemoteInfo, E as ObservabilityRawErrorContext, F as ObservabilityRuntimeEventInput, I as ObservabilityRuntimeOrigin, L as ObservabilityRuntimePlugin, M as ObservabilityReportQuery, N as ObservabilityReportStatus, O as ObservabilityReport, P as ObservabilityRuntimeAdapterOptions, R as ObservabilitySharedInfo, S as ObservabilityOwnerHint, T as ObservabilityPluginOptions, V as createObservability, _ as ObservabilityLoadedBeforeInfo, a as ObservabilityBrowserMode, b as ObservabilityModuleInfoEntry, c as ObservabilityErrorSummary, d as ObservabilityEventSource, f as ObservabilityEventStatus, g as ObservabilityLoadedBeforeConsumer, h as ObservabilityLevel, i as ObservabilityActionId, j as ObservabilityReportOutcome, k as ObservabilityReportFlags, l as ObservabilityEvent, m as ObservabilityInstanceAPI, n as MarkComponentLoadedOptions, o as ObservabilityBrowserReader, p as ObservabilityFactReport, r as ObservabilityAction, s as ObservabilityController, t as MFRemoteLoadedOptions, u as ObservabilityEventContext, v as ObservabilityMetadata, w as ObservabilityPhaseSummary, x as ObservabilityModuleInfoSummary, y as ObservabilityMetadataValue, z as ObservabilitySharedSummary } from "./core-qz6RbeSc.js";
1
+ import { A as ObservabilityReportListOptions, B as OnMFRemoteLoaded, C as ObservabilityPhaseCollection, D as ObservabilityRemoteInfo, E as ObservabilityRawErrorContext, F as ObservabilityRuntimeEventInput, I as ObservabilityRuntimeOrigin, L as ObservabilityRuntimePlugin, M as ObservabilityReportQuery, N as ObservabilityReportStatus, O as ObservabilityReport, P as ObservabilityRuntimeAdapterOptions, R as ObservabilitySharedInfo, S as ObservabilityOwnerHint, T as ObservabilityPluginOptions, V as createObservability, _ as ObservabilityLoadedBeforeInfo, a as ObservabilityBrowserMode, b as ObservabilityModuleInfoEntry, c as ObservabilityErrorSummary, d as ObservabilityEventSource, f as ObservabilityEventStatus, g as ObservabilityLoadedBeforeConsumer, h as ObservabilityLevel, i as ObservabilityActionId, j as ObservabilityReportOutcome, k as ObservabilityReportFlags, l as ObservabilityEvent, m as ObservabilityInstanceAPI, n as MarkComponentLoadedOptions, o as ObservabilityBrowserReader, p as ObservabilityFactReport, r as ObservabilityAction, s as ObservabilityController, t as MFRemoteLoadedOptions, u as ObservabilityEventContext, v as ObservabilityMetadata, w as ObservabilityPhaseSummary, x as ObservabilityModuleInfoSummary, y as ObservabilityMetadataValue, z as ObservabilitySharedSummary } from "./core-Db-z5jD3.js";
2
2
  import { ObservabilityPlugin } from "./browser.js";
3
3
  import { ChromeObservabilityPlugin } from "./chrome-devtool.js";
4
4
  export { ChromeObservabilityPlugin, MFRemoteLoadedOptions, MarkComponentLoadedOptions, ObservabilityAction, ObservabilityActionId, ObservabilityBrowserMode, ObservabilityBrowserReader, ObservabilityController, ObservabilityErrorSummary, ObservabilityEvent, ObservabilityEventContext, ObservabilityEventSource, ObservabilityEventStatus, ObservabilityFactReport, ObservabilityInstanceAPI, ObservabilityLevel, ObservabilityLoadedBeforeConsumer, ObservabilityLoadedBeforeInfo, ObservabilityMetadata, ObservabilityMetadataValue, ObservabilityModuleInfoEntry, ObservabilityModuleInfoSummary, ObservabilityOwnerHint, ObservabilityPhaseCollection, ObservabilityPhaseSummary, ObservabilityPlugin, ObservabilityPlugin as default, ObservabilityPluginOptions, ObservabilityRawErrorContext, ObservabilityRemoteInfo, ObservabilityReport, ObservabilityReportFlags, ObservabilityReportListOptions, ObservabilityReportOutcome, ObservabilityReportQuery, ObservabilityReportStatus, ObservabilityRuntimeAdapterOptions, ObservabilityRuntimeEventInput, ObservabilityRuntimeOrigin, ObservabilityRuntimePlugin, ObservabilitySharedInfo, ObservabilitySharedSummary, OnMFRemoteLoaded, createObservability };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
- const require_core = require('./core-JP2QeDL_.js');
2
+ const require_core = require('./core--1ofIHU9.js');
3
3
  const require_browser = require('./browser.js');
4
4
  const require_chrome_devtool = require('./chrome-devtool.js');
5
5
 
package/dist/node.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions, s as ObservabilityController } from "./core-qz6RbeSc.js";
1
+ import { L as ObservabilityRuntimePlugin, T as ObservabilityPluginOptions, s as ObservabilityController } from "./core-Db-z5jD3.js";
2
2
 
3
3
  //#region src/node.d.ts
4
4
  interface ObservabilityNodeOptions extends Omit<ObservabilityPluginOptions, 'browser'> {
package/dist/node.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
- const require_core = require('./core-JP2QeDL_.js');
2
+ const require_core = require('./core--1ofIHU9.js');
3
3
 
4
4
  //#region src/node.ts
5
5
  const DEFAULT_NODE_DIRECTORY = ".mf/observability";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/observability-plugin",
3
- "version": "0.0.0-pre-release-2-5-20260520035046",
3
+ "version": "2.5.0",
4
4
  "author": "module-federation",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -65,10 +65,10 @@
65
65
  }
66
66
  },
67
67
  "devDependencies": {
68
- "@module-federation/runtime": "0.0.0-pre-release-2-5-20260520035046"
68
+ "@module-federation/runtime": "2.5.0"
69
69
  },
70
70
  "dependencies": {
71
- "@module-federation/sdk": "0.0.0-pre-release-2-5-20260520035046"
71
+ "@module-federation/sdk": "2.5.0"
72
72
  },
73
73
  "scripts": {
74
74
  "build": "tsdown --config tsdown.config.ts && cp *.md dist",