@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.d.cts CHANGED
@@ -2632,22 +2632,20 @@ declare enum LogLevel {
2632
2632
  SILENT = "SILENT"
2633
2633
  }
2634
2634
  /**
2635
- * Describes a logger configuration change. Frozen — fields cannot be
2635
+ * Describes a logger effective-level change. Frozen — fields cannot be
2636
2636
  * mutated after construction so a listener cannot affect later listeners.
2637
2637
  *
2638
- * The `level` field is a TypeScript-SDK-only convenience for callers that
2639
- * want to act on the new effective level without re-fetching the logger.
2638
+ * One instance per logger whose effective level moved; emitted in lockstep
2639
+ * with the matching `adapter.applyLevel(...)` call.
2640
2640
  */
2641
2641
  declare class LoggerChangeEvent {
2642
2642
  readonly id: string;
2643
2643
  readonly source: string;
2644
- readonly level?: LogLevel | null;
2645
- readonly deleted?: true;
2644
+ readonly level: LogLevel;
2646
2645
  constructor(fields: {
2647
2646
  id: string;
2648
2647
  source: string;
2649
- level?: LogLevel | null;
2650
- deleted?: true;
2648
+ level: LogLevel;
2651
2649
  });
2652
2650
  }
2653
2651
  /**
@@ -3446,15 +3444,17 @@ declare class LoggingClient {
3446
3444
  /**
3447
3445
  * Refresh resolved levels and apply them to adapter-known loggers.
3448
3446
  *
3449
- * Computes a resolved level (via {@link resolveLevel}) for every entry
3450
- * currently in `_loggersCache` *and* every adapter-known logger name
3451
- * even loggers whose own `level` is `null`, because they may inherit
3452
- * via group chain or dot-notation ancestry.
3447
+ * Walks every adapter-known logger name through {@link resolveLevel}
3448
+ * (env override base group chain → dot-notation ancestry fallback)
3449
+ * and pushes the result to every registered adapter. Loggers whose own
3450
+ * `level` is `null` are still applied — that's the whole point of group
3451
+ * inheritance and dot-notation ancestry.
3453
3452
  *
3454
- * The full resolved-level snapshot is stored in `_resolvedLevelStore`
3455
- * so callers can diff pre-vs-post and fire change listeners on actual
3456
- * effective-level deltas (group-driven changes included). Adapter pushes
3457
- * only happen for adapter-known names where `managed !== false`.
3453
+ * The resolved-level snapshot lives in `_resolvedLevelStore` so callers
3454
+ * can diff pre-vs-post and fire change listeners on actual effective-
3455
+ * level deltas. The store is scoped to adapter-known names: listener
3456
+ * fanout pairs 1:1 with `adapter.applyLevel` calls, so a logger that
3457
+ * the adapter doesn't know about has no apply and no listener fire.
3458
3458
  * @internal
3459
3459
  */
3460
3460
  private _applyLevels;
@@ -3475,19 +3475,25 @@ declare class LoggingClient {
3475
3475
  private _handleGroupChanged;
3476
3476
  private _handleGroupDeleted;
3477
3477
  /**
3478
- * @internal Fire change listeners for every logger whose resolved level
3479
- * changed between `pre` and `post`. Stores resolved levels, not raw
3480
- * `logger.level`, so a group-driven change actually fires. Keys that
3481
- * disappeared from `post` are emitted with `deleted: true`.
3478
+ * @internal Fire change listeners for every logger whose effective level
3479
+ * changed between `pre` and `post`.
3480
+ *
3481
+ * Contract:
3482
+ * - Iterates loggers present in `post` (the post-apply resolved store).
3483
+ * A key in `pre` but not in `post` is a cache eviction — that key
3484
+ * itself fires nothing. Dependents that re-resolved to a new value
3485
+ * are still in `post` and fire normally.
3486
+ * - For every changed logger, fires every global listener once with
3487
+ * that logger's own payload (no "summary" event), then fires every
3488
+ * key-scoped listener registered for that id.
3489
+ * - One adapter.applyLevel call ↔ one listener notification per
3490
+ * subscriber. A trigger that moves N loggers fires the global
3491
+ * listener N times, not once.
3492
+ * - `suppressIds` is the deletion-event escape hatch: a deleted id
3493
+ * fires nothing for itself even when its adapter-known resolved
3494
+ * level moved (e.g. fell back to INFO).
3482
3495
  */
3483
3496
  private _fireDeltas;
3484
- /**
3485
- * @internal Always emit a deleted event for `id` on global and per-key
3486
- * listeners. Used by `logger_deleted` / `group_deleted` handlers to
3487
- * preserve the explicit notification contract even when nothing in the
3488
- * resolved-level store changed (e.g. server removed an unknown logger).
3489
- */
3490
- private _emitDeletedEvent;
3491
3497
  private _handleLoggersChanged;
3492
3498
  /**
3493
3499
  * Full refetch of loggers + log_groups, rebuild the caches, re-resolve
package/dist/index.d.ts CHANGED
@@ -2632,22 +2632,20 @@ declare enum LogLevel {
2632
2632
  SILENT = "SILENT"
2633
2633
  }
2634
2634
  /**
2635
- * Describes a logger configuration change. Frozen — fields cannot be
2635
+ * Describes a logger effective-level change. Frozen — fields cannot be
2636
2636
  * mutated after construction so a listener cannot affect later listeners.
2637
2637
  *
2638
- * The `level` field is a TypeScript-SDK-only convenience for callers that
2639
- * want to act on the new effective level without re-fetching the logger.
2638
+ * One instance per logger whose effective level moved; emitted in lockstep
2639
+ * with the matching `adapter.applyLevel(...)` call.
2640
2640
  */
2641
2641
  declare class LoggerChangeEvent {
2642
2642
  readonly id: string;
2643
2643
  readonly source: string;
2644
- readonly level?: LogLevel | null;
2645
- readonly deleted?: true;
2644
+ readonly level: LogLevel;
2646
2645
  constructor(fields: {
2647
2646
  id: string;
2648
2647
  source: string;
2649
- level?: LogLevel | null;
2650
- deleted?: true;
2648
+ level: LogLevel;
2651
2649
  });
2652
2650
  }
2653
2651
  /**
@@ -3446,15 +3444,17 @@ declare class LoggingClient {
3446
3444
  /**
3447
3445
  * Refresh resolved levels and apply them to adapter-known loggers.
3448
3446
  *
3449
- * Computes a resolved level (via {@link resolveLevel}) for every entry
3450
- * currently in `_loggersCache` *and* every adapter-known logger name
3451
- * even loggers whose own `level` is `null`, because they may inherit
3452
- * via group chain or dot-notation ancestry.
3447
+ * Walks every adapter-known logger name through {@link resolveLevel}
3448
+ * (env override base group chain → dot-notation ancestry fallback)
3449
+ * and pushes the result to every registered adapter. Loggers whose own
3450
+ * `level` is `null` are still applied — that's the whole point of group
3451
+ * inheritance and dot-notation ancestry.
3453
3452
  *
3454
- * The full resolved-level snapshot is stored in `_resolvedLevelStore`
3455
- * so callers can diff pre-vs-post and fire change listeners on actual
3456
- * effective-level deltas (group-driven changes included). Adapter pushes
3457
- * only happen for adapter-known names where `managed !== false`.
3453
+ * The resolved-level snapshot lives in `_resolvedLevelStore` so callers
3454
+ * can diff pre-vs-post and fire change listeners on actual effective-
3455
+ * level deltas. The store is scoped to adapter-known names: listener
3456
+ * fanout pairs 1:1 with `adapter.applyLevel` calls, so a logger that
3457
+ * the adapter doesn't know about has no apply and no listener fire.
3458
3458
  * @internal
3459
3459
  */
3460
3460
  private _applyLevels;
@@ -3475,19 +3475,25 @@ declare class LoggingClient {
3475
3475
  private _handleGroupChanged;
3476
3476
  private _handleGroupDeleted;
3477
3477
  /**
3478
- * @internal Fire change listeners for every logger whose resolved level
3479
- * changed between `pre` and `post`. Stores resolved levels, not raw
3480
- * `logger.level`, so a group-driven change actually fires. Keys that
3481
- * disappeared from `post` are emitted with `deleted: true`.
3478
+ * @internal Fire change listeners for every logger whose effective level
3479
+ * changed between `pre` and `post`.
3480
+ *
3481
+ * Contract:
3482
+ * - Iterates loggers present in `post` (the post-apply resolved store).
3483
+ * A key in `pre` but not in `post` is a cache eviction — that key
3484
+ * itself fires nothing. Dependents that re-resolved to a new value
3485
+ * are still in `post` and fire normally.
3486
+ * - For every changed logger, fires every global listener once with
3487
+ * that logger's own payload (no "summary" event), then fires every
3488
+ * key-scoped listener registered for that id.
3489
+ * - One adapter.applyLevel call ↔ one listener notification per
3490
+ * subscriber. A trigger that moves N loggers fires the global
3491
+ * listener N times, not once.
3492
+ * - `suppressIds` is the deletion-event escape hatch: a deleted id
3493
+ * fires nothing for itself even when its adapter-known resolved
3494
+ * level moved (e.g. fell back to INFO).
3482
3495
  */
3483
3496
  private _fireDeltas;
3484
- /**
3485
- * @internal Always emit a deleted event for `id` on global and per-key
3486
- * listeners. Used by `logger_deleted` / `group_deleted` handlers to
3487
- * preserve the explicit notification contract even when nothing in the
3488
- * resolved-level store changed (e.g. server removed an unknown logger).
3489
- */
3490
- private _emitDeletedEvent;
3491
3497
  private _handleLoggersChanged;
3492
3498
  /**
3493
3499
  * Full refetch of loggers + log_groups, rebuild the caches, re-resolve
package/dist/index.js CHANGED
@@ -19221,12 +19221,10 @@ var LoggerChangeEvent = class {
19221
19221
  id;
19222
19222
  source;
19223
19223
  level;
19224
- deleted;
19225
19224
  constructor(fields) {
19226
19225
  this.id = fields.id;
19227
19226
  this.source = fields.source;
19228
- if (fields.level !== void 0) this.level = fields.level;
19229
- if (fields.deleted) this.deleted = fields.deleted;
19227
+ this.level = fields.level;
19230
19228
  Object.freeze(this);
19231
19229
  }
19232
19230
  };
@@ -22150,27 +22148,24 @@ var LoggingClient = class {
22150
22148
  /**
22151
22149
  * Refresh resolved levels and apply them to adapter-known loggers.
22152
22150
  *
22153
- * Computes a resolved level (via {@link resolveLevel}) for every entry
22154
- * currently in `_loggersCache` *and* every adapter-known logger name
22155
- * even loggers whose own `level` is `null`, because they may inherit
22156
- * via group chain or dot-notation ancestry.
22151
+ * Walks every adapter-known logger name through {@link resolveLevel}
22152
+ * (env override base group chain → dot-notation ancestry fallback)
22153
+ * and pushes the result to every registered adapter. Loggers whose own
22154
+ * `level` is `null` are still applied — that's the whole point of group
22155
+ * inheritance and dot-notation ancestry.
22157
22156
  *
22158
- * The full resolved-level snapshot is stored in `_resolvedLevelStore`
22159
- * so callers can diff pre-vs-post and fire change listeners on actual
22160
- * effective-level deltas (group-driven changes included). Adapter pushes
22161
- * only happen for adapter-known names where `managed !== false`.
22157
+ * The resolved-level snapshot lives in `_resolvedLevelStore` so callers
22158
+ * can diff pre-vs-post and fire change listeners on actual effective-
22159
+ * level deltas. The store is scoped to adapter-known names: listener
22160
+ * fanout pairs 1:1 with `adapter.applyLevel` calls, so a logger that
22161
+ * the adapter doesn't know about has no apply and no listener fire.
22162
22162
  * @internal
22163
22163
  */
22164
22164
  _applyLevels() {
22165
22165
  const environment = this._parent?._environment ?? "";
22166
22166
  const newResolved = {};
22167
- for (const id of Object.keys(this._loggersCache)) {
22168
- newResolved[id] = resolveLevel(id, environment, this._loggersCache, this._groupsCache);
22169
- }
22170
22167
  for (const name of this._knownLoggerNames) {
22171
- if (!(name in newResolved)) {
22172
- newResolved[name] = resolveLevel(name, environment, this._loggersCache, this._groupsCache);
22173
- }
22168
+ newResolved[name] = resolveLevel(name, environment, this._loggersCache, this._groupsCache);
22174
22169
  }
22175
22170
  this._resolvedLevelStore = newResolved;
22176
22171
  for (const name of this._knownLoggerNames) {
@@ -22303,7 +22298,6 @@ var LoggingClient = class {
22303
22298
  delete this._loggersCache[id];
22304
22299
  const preResolved = { ...this._resolvedLevelStore };
22305
22300
  this._applyLevels();
22306
- this._emitDeletedEvent(id, "websocket");
22307
22301
  this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
22308
22302
  };
22309
22303
  _handleGroupChanged = (data) => {
@@ -22333,45 +22327,41 @@ var LoggingClient = class {
22333
22327
  delete this._groupsCache[id];
22334
22328
  const preResolved = { ...this._resolvedLevelStore };
22335
22329
  this._applyLevels();
22336
- this._emitDeletedEvent(id, "websocket");
22337
22330
  this._fireDeltas(preResolved, this._resolvedLevelStore, "websocket", /* @__PURE__ */ new Set([id]));
22338
22331
  };
22339
22332
  /**
22340
- * @internal Fire change listeners for every logger whose resolved level
22341
- * changed between `pre` and `post`. Stores resolved levels, not raw
22342
- * `logger.level`, so a group-driven change actually fires. Keys that
22343
- * disappeared from `post` are emitted with `deleted: true`.
22333
+ * @internal Fire change listeners for every logger whose effective level
22334
+ * changed between `pre` and `post`.
22335
+ *
22336
+ * Contract:
22337
+ * - Iterates loggers present in `post` (the post-apply resolved store).
22338
+ * A key in `pre` but not in `post` is a cache eviction — that key
22339
+ * itself fires nothing. Dependents that re-resolved to a new value
22340
+ * are still in `post` and fire normally.
22341
+ * - For every changed logger, fires every global listener once with
22342
+ * that logger's own payload (no "summary" event), then fires every
22343
+ * key-scoped listener registered for that id.
22344
+ * - One adapter.applyLevel call ↔ one listener notification per
22345
+ * subscriber. A trigger that moves N loggers fires the global
22346
+ * listener N times, not once.
22347
+ * - `suppressIds` is the deletion-event escape hatch: a deleted id
22348
+ * fires nothing for itself even when its adapter-known resolved
22349
+ * level moved (e.g. fell back to INFO).
22344
22350
  */
22345
- _fireDeltas(pre, post, source, excludeIds) {
22346
- const changed = [];
22347
- const allKeys = /* @__PURE__ */ new Set([...Object.keys(pre), ...Object.keys(post)]);
22348
- for (const k of allKeys) {
22349
- if (excludeIds?.has(k)) continue;
22350
- if (pre[k] !== post[k]) changed.push(k);
22351
- }
22352
- if (changed.length === 0) return;
22353
- const buildEvent = (id) => {
22354
- const isDeletion = id in pre && !(id in post);
22355
- const fields = {
22356
- id,
22357
- source,
22358
- level: post[id] ?? null
22359
- };
22360
- if (isDeletion) fields.deleted = true;
22361
- return new LoggerChangeEvent(fields);
22362
- };
22363
- const firstKey = changed[0];
22364
- const globalEvent = buildEvent(firstKey);
22365
- for (const cb of this._globalListeners) {
22366
- try {
22367
- cb(globalEvent);
22368
- } catch {
22351
+ _fireDeltas(pre, post, source, suppressIds) {
22352
+ for (const id of Object.keys(post)) {
22353
+ if (suppressIds?.has(id)) continue;
22354
+ const next = post[id];
22355
+ if (pre[id] === next) continue;
22356
+ const event = new LoggerChangeEvent({ id, source, level: next });
22357
+ for (const cb of this._globalListeners) {
22358
+ try {
22359
+ cb(event);
22360
+ } catch {
22361
+ }
22369
22362
  }
22370
- }
22371
- for (const k of changed) {
22372
- const keyCallbacks = this._keyListeners.get(k);
22363
+ const keyCallbacks = this._keyListeners.get(id);
22373
22364
  if (keyCallbacks) {
22374
- const event = buildEvent(k);
22375
22365
  for (const cb of keyCallbacks) {
22376
22366
  try {
22377
22367
  cb(event);
@@ -22381,43 +22371,6 @@ var LoggingClient = class {
22381
22371
  }
22382
22372
  }
22383
22373
  }
22384
- /**
22385
- * @internal Always emit a deleted event for `id` on global and per-key
22386
- * listeners. Used by `logger_deleted` / `group_deleted` handlers to
22387
- * preserve the explicit notification contract even when nothing in the
22388
- * resolved-level store changed (e.g. server removed an unknown logger).
22389
- */
22390
- _emitDeletedEvent(id, source) {
22391
- const event = new LoggerChangeEvent({
22392
- id,
22393
- level: null,
22394
- source,
22395
- deleted: true
22396
- });
22397
- for (const cb of this._globalListeners) {
22398
- try {
22399
- cb(event);
22400
- } catch (err) {
22401
- debug(
22402
- "websocket",
22403
- `deleted listener error: ${err instanceof Error ? err.message : String(err)}`
22404
- );
22405
- }
22406
- }
22407
- const idCallbacks = this._keyListeners.get(id);
22408
- if (idCallbacks) {
22409
- for (const cb of idCallbacks) {
22410
- try {
22411
- cb(event);
22412
- } catch (err) {
22413
- debug(
22414
- "websocket",
22415
- `deleted key listener error: ${err instanceof Error ? err.message : String(err)}`
22416
- );
22417
- }
22418
- }
22419
- }
22420
- }
22421
22374
  _handleLoggersChanged = (_data) => {
22422
22375
  debug("websocket", `loggers_changed event received`);
22423
22376
  void this._resolveAndFire("websocket").catch(() => {