@smplkit/sdk 3.0.50 → 3.0.51

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/dist/index.cjs CHANGED
@@ -19291,12 +19291,10 @@ var LoggerChangeEvent = class {
19291
19291
  id;
19292
19292
  source;
19293
19293
  level;
19294
- deleted;
19295
19294
  constructor(fields) {
19296
19295
  this.id = fields.id;
19297
19296
  this.source = fields.source;
19298
- if (fields.level !== void 0) this.level = fields.level;
19299
- if (fields.deleted) this.deleted = fields.deleted;
19297
+ this.level = fields.level;
19300
19298
  Object.freeze(this);
19301
19299
  }
19302
19300
  };
@@ -22220,27 +22218,24 @@ var LoggingClient = class {
22220
22218
  /**
22221
22219
  * Refresh resolved levels and apply them to adapter-known loggers.
22222
22220
  *
22223
- * Computes a resolved level (via {@link resolveLevel}) for every entry
22224
- * currently in `_loggersCache` *and* every adapter-known logger name
22225
- * even loggers whose own `level` is `null`, because they may inherit
22226
- * via group chain or dot-notation ancestry.
22221
+ * Walks every adapter-known logger name through {@link resolveLevel}
22222
+ * (env override base group chain → dot-notation ancestry fallback)
22223
+ * and pushes the result to every registered adapter. Loggers whose own
22224
+ * `level` is `null` are still applied — that's the whole point of group
22225
+ * inheritance and dot-notation ancestry.
22227
22226
  *
22228
- * The full resolved-level snapshot is stored in `_resolvedLevelStore`
22229
- * so callers can diff pre-vs-post and fire change listeners on actual
22230
- * effective-level deltas (group-driven changes included). Adapter pushes
22231
- * only happen for adapter-known names where `managed !== false`.
22227
+ * The resolved-level snapshot lives in `_resolvedLevelStore` so callers
22228
+ * can diff pre-vs-post and fire change listeners on actual effective-
22229
+ * level deltas. The store is scoped to adapter-known names: listener
22230
+ * fanout pairs 1:1 with `adapter.applyLevel` calls, so a logger that
22231
+ * the adapter doesn't know about has no apply and no listener fire.
22232
22232
  * @internal
22233
22233
  */
22234
22234
  _applyLevels() {
22235
22235
  const environment = this._parent?._environment ?? "";
22236
22236
  const newResolved = {};
22237
- for (const id of Object.keys(this._loggersCache)) {
22238
- newResolved[id] = resolveLevel(id, environment, this._loggersCache, this._groupsCache);
22239
- }
22240
22237
  for (const name of this._knownLoggerNames) {
22241
- if (!(name in newResolved)) {
22242
- newResolved[name] = resolveLevel(name, environment, this._loggersCache, this._groupsCache);
22243
- }
22238
+ newResolved[name] = resolveLevel(name, environment, this._loggersCache, this._groupsCache);
22244
22239
  }
22245
22240
  this._resolvedLevelStore = newResolved;
22246
22241
  for (const name of this._knownLoggerNames) {
@@ -22373,7 +22368,6 @@ var LoggingClient = class {
22373
22368
  delete this._loggersCache[id];
22374
22369
  const preResolved = { ...this._resolvedLevelStore };
22375
22370
  this._applyLevels();
22376
- this._emitDeletedEvent(id, "websocket");
22377
22371
  this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
22378
22372
  };
22379
22373
  _handleGroupChanged = (data) => {
@@ -22403,45 +22397,41 @@ var LoggingClient = class {
22403
22397
  delete this._groupsCache[id];
22404
22398
  const preResolved = { ...this._resolvedLevelStore };
22405
22399
  this._applyLevels();
22406
- this._emitDeletedEvent(id, "websocket");
22407
22400
  this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
22408
22401
  };
22409
22402
  /**
22410
- * @internal Fire change listeners for every logger whose resolved level
22411
- * changed between `pre` and `post`. Stores resolved levels, not raw
22412
- * `logger.level`, so a group-driven change actually fires. Keys that
22413
- * disappeared from `post` are emitted with `deleted: true`.
22403
+ * @internal Fire change listeners for every logger whose effective level
22404
+ * changed between `pre` and `post`.
22405
+ *
22406
+ * Contract:
22407
+ * - Iterates loggers present in `post` (the post-apply resolved store).
22408
+ * A key in `pre` but not in `post` is a cache eviction — that key
22409
+ * itself fires nothing. Dependents that re-resolved to a new value
22410
+ * are still in `post` and fire normally.
22411
+ * - For every changed logger, fires every global listener once with
22412
+ * that logger's own payload (no "summary" event), then fires every
22413
+ * key-scoped listener registered for that id.
22414
+ * - One adapter.applyLevel call ↔ one listener notification per
22415
+ * subscriber. A trigger that moves N loggers fires the global
22416
+ * listener N times, not once.
22417
+ * - `suppressIds` is the deletion-event escape hatch: a deleted id
22418
+ * fires nothing for itself even when its adapter-known resolved
22419
+ * level moved (e.g. fell back to INFO).
22414
22420
  */
22415
- _fireDeltas(pre, post, source, excludeIds) {
22416
- const changed = [];
22417
- const allKeys = /* @__PURE__ */ new Set([...Object.keys(pre), ...Object.keys(post)]);
22418
- for (const k of allKeys) {
22419
- if (excludeIds?.has(k)) continue;
22420
- if (pre[k] !== post[k]) changed.push(k);
22421
- }
22422
- if (changed.length === 0) return;
22423
- const buildEvent = (id) => {
22424
- const isDeletion = id in pre && !(id in post);
22425
- const fields = {
22426
- id,
22427
- source,
22428
- level: post[id] ?? null
22429
- };
22430
- if (isDeletion) fields.deleted = true;
22431
- return new LoggerChangeEvent(fields);
22432
- };
22433
- const firstKey = changed[0];
22434
- const globalEvent = buildEvent(firstKey);
22435
- for (const cb of this._globalListeners) {
22436
- try {
22437
- cb(globalEvent);
22438
- } catch {
22421
+ _fireDeltas(pre, post, source, suppressIds) {
22422
+ for (const id of Object.keys(post)) {
22423
+ if (suppressIds?.has(id)) continue;
22424
+ const next = post[id];
22425
+ if (pre[id] === next) continue;
22426
+ const event = new LoggerChangeEvent({ id, source, level: next });
22427
+ for (const cb of this._globalListeners) {
22428
+ try {
22429
+ cb(event);
22430
+ } catch {
22431
+ }
22439
22432
  }
22440
- }
22441
- for (const k of changed) {
22442
- const keyCallbacks = this._keyListeners.get(k);
22433
+ const keyCallbacks = this._keyListeners.get(id);
22443
22434
  if (keyCallbacks) {
22444
- const event = buildEvent(k);
22445
22435
  for (const cb of keyCallbacks) {
22446
22436
  try {
22447
22437
  cb(event);
@@ -22451,43 +22441,6 @@ var LoggingClient = class {
22451
22441
  }
22452
22442
  }
22453
22443
  }
22454
- /**
22455
- * @internal Always emit a deleted event for `id` on global and per-key
22456
- * listeners. Used by `logger_deleted` / `group_deleted` handlers to
22457
- * preserve the explicit notification contract even when nothing in the
22458
- * resolved-level store changed (e.g. server removed an unknown logger).
22459
- */
22460
- _emitDeletedEvent(id, source) {
22461
- const event = new LoggerChangeEvent({
22462
- id,
22463
- level: null,
22464
- source,
22465
- deleted: true
22466
- });
22467
- for (const cb of this._globalListeners) {
22468
- try {
22469
- cb(event);
22470
- } catch (err) {
22471
- debug(
22472
- "websocket",
22473
- `deleted listener error: ${err instanceof Error ? err.message : String(err)}`
22474
- );
22475
- }
22476
- }
22477
- const idCallbacks = this._keyListeners.get(id);
22478
- if (idCallbacks) {
22479
- for (const cb of idCallbacks) {
22480
- try {
22481
- cb(event);
22482
- } catch (err) {
22483
- debug(
22484
- "websocket",
22485
- `deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
22486
- );
22487
- }
22488
- }
22489
- }
22490
- }
22491
22444
  _handleLoggersChanged = (_data) => {
22492
22445
  debug("websocket", `loggers_changed event received`);
22493
22446
  void this._resolveAndFire("websocket").catch(() => {