camstack 1.2.130 → 1.2.133

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.
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-9GQQ9F3s.js
23637
- var require_dist_9GQQ9F3s = __commonJS({
23638
- "../system/dist/dist-9GQQ9F3s.js"(exports) {
23636
+ // ../system/dist/dist-DYWqXngV.js
23637
+ var require_dist_DYWqXngV = __commonJS({
23638
+ "../system/dist/dist-DYWqXngV.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -23768,7 +23768,6 @@ var require_dist_9GQQ9F3s = __commonJS({
23768
23768
  EventCategory2["PipelineAnalyticsPackagePickedUp"] = "pipeline-analytics.package-picked-up";
23769
23769
  EventCategory2["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
23770
23770
  EventCategory2["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
23771
- EventCategory2["FrigateLiveEvent"] = "frigate.live-event";
23772
23771
  EventCategory2["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
23773
23772
  EventCategory2["StreamOnline"] = "stream.online";
23774
23773
  EventCategory2["StreamOffline"] = "stream.offline";
@@ -31042,7 +31041,7 @@ var require_dist_9GQQ9F3s = __commonJS({
31042
31041
  var SourceInfoSchema = zod.z.object({
31043
31042
  /** Live dispatch key — mutable when the source system allows rename. */
31044
31043
  id: zod.z.string(),
31045
- /** Source system tag — e.g. 'homeassistant' | 'reolink' | 'frigate'. */
31044
+ /** Source system tag — e.g. 'homeassistant' | 'reolink' | 'onvif'. */
31046
31045
  system: zod.z.string(),
31047
31046
  /** Immutable upstream identifier when available (HA `unique_id`, … ).
31048
31047
  * Used to detect rename when `id` changes. */
@@ -35642,7 +35641,7 @@ var require_dist_9GQQ9F3s = __commonJS({
35642
35641
  * The measured seven-person arrival on device 590 spans 110 s with every
35643
35642
  * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
35644
35643
  * idle cutoff holds it as one and ends it when the arrival actually ends.
35645
- * 30 is Frigate's shipped value for the same decision.
35644
+ * 30 s is a widely shipped value for the same decision.
35646
35645
  *
35647
35646
  * ### What it replaces
35648
35647
  *
@@ -37499,6 +37498,12 @@ var require_dist_9GQQ9F3s = __commonJS({
37499
37498
  /** Zone display name at crossing time (falls back to the id). */
37500
37499
  zoneName: zod.z.string().optional()
37501
37500
  });
37501
+ var ZoneOverlapSchema = zod.z.object({
37502
+ zoneId: zod.z.string(),
37503
+ zoneName: zod.z.string().optional(),
37504
+ /** Percentage of the BOX area inside the zone, 0–100. */
37505
+ overlapPct: zod.z.number()
37506
+ });
37502
37507
  var ObjectEventSchema = zod.z.object({
37503
37508
  ...BaseEventFields,
37504
37509
  kind: zod.z.literal("object"),
@@ -37523,6 +37528,35 @@ var require_dist_9GQQ9F3s = __commonJS({
37523
37528
  bbox: BoundingBoxSchema.optional(),
37524
37529
  /** Heavy JSON — omitted in slim projection. */
37525
37530
  zones: zod.z.array(zod.z.string()).readonly().optional(),
37531
+ /**
37532
+ * How far inside each stamped zone the box actually was, as a percentage of
37533
+ * the BOX area.
37534
+ *
37535
+ * Membership alone cannot express "at least a third of it inside", which is
37536
+ * the bar an operator argues with — and the number already existed: the
37537
+ * engine computed it, the pipeline logged it, and then discarded it. It
37538
+ * matters most on the events that carry no track, where a rule has nothing
37539
+ * else to judge by.
37540
+ */
37541
+ zoneOverlaps: zod.z.array(ZoneOverlapSchema).readonly().optional(),
37542
+ /**
37543
+ * Present when this event describes a detection the TRACKER refused, so it
37544
+ * has no track and never will.
37545
+ *
37546
+ * A zone-scoped immediate rule asks "is there an animal in the flowerbed
37547
+ * NOW?"; tracking answers a different question ("is this the same subject as
37548
+ * before?") whose confirmation threshold presumes continuity. On 2026-09-09 a
37549
+ * dog at 0.7729, 100% inside a watched zone, was refused three times in six
37550
+ * seconds with three different candidate ids — seven analysed frames in the
37551
+ * window, the subject in a handful of them, metres apart — and produced no
37552
+ * event at all.
37553
+ *
37554
+ * It is NAMED rather than merely implied by a missing `trackId`: an event
37555
+ * with no track and no reason is indistinguishable from a track whose media
37556
+ * went missing, and a consumer that asks this one for a best shot or a
37557
+ * history is asking for something that never existed.
37558
+ */
37559
+ spawnRefused: zod.z.string().optional(),
37526
37560
  /** Omitted in slim projection. */
37527
37561
  state: TrackStateSchema.optional(),
37528
37562
  /**
@@ -39001,6 +39035,35 @@ var require_dist_9GQQ9F3s = __commonJS({
39001
39035
  */
39002
39036
  tier: zod.z.enum(["native", "ram-fullframe"]).optional()
39003
39037
  });
39038
+ var ParkedFrameKindSchema = zod.z.enum(["keyFrame", "thumbnail"]);
39039
+ var ParkRefusalSchema = zod.z.enum(["handle-gone", "encode-failed"]);
39040
+ var ParkTrackFrameResultSchema = zod.z.discriminatedUnion("parked", [zod.z.object({
39041
+ parked: zod.z.literal(true),
39042
+ /** The node holding the parcel — what a later retrieval must be pinned to. */
39043
+ nodeId: zod.z.string(),
39044
+ width: zod.z.number().int().positive(),
39045
+ height: zod.z.number().int().positive(),
39046
+ /** JPEG bytes the parcel costs on the node. */
39047
+ bytes: zod.z.number().int().nonnegative(),
39048
+ /** Whether this park replaced a parcel already held for the key. */
39049
+ replaced: zod.z.boolean()
39050
+ }), zod.z.object({
39051
+ parked: zod.z.literal(false),
39052
+ nodeId: zod.z.string(),
39053
+ reason: ParkRefusalSchema,
39054
+ /** Age of the handle at the park, on the runner's clock; null if unknown. */
39055
+ handleAgeMs: zod.z.number().nullable(),
39056
+ detail: zod.z.string().optional()
39057
+ })]);
39058
+ var ParkedTrackFrameSchema = zod.z.object({
39059
+ jpeg: zod.z.string(),
39060
+ width: zod.z.number().int().positive(),
39061
+ height: zod.z.number().int().positive(),
39062
+ /** The frame instant the parcel shows (the caller's clock, echoed back). */
39063
+ timestamp: zod.z.number(),
39064
+ /** When the node stored it (the node's clock). */
39065
+ parkedAt: zod.z.number()
39066
+ });
39004
39067
  var DetailParentSchema = zod.z.object({
39005
39068
  bbox: NativeCropBboxSchema,
39006
39069
  className: zod.z.string()
@@ -39246,7 +39309,7 @@ var require_dist_9GQQ9F3s = __commonJS({
39246
39309
  * - `analyzer`: ML/frame-diff motion detection (motion-wasm or other
39247
39310
  * analyzer providers) running on decoded frames in this runner.
39248
39311
  * - `onboard`: camera-native motion pushes (Reolink Baichuan, ONVIF
39249
- * analytics, Frigate motion). The provider emits ProviderMotion
39312
+ * analytics). The provider emits ProviderMotion
39250
39313
  * events; the orchestrator forwards to `reportMotion`.
39251
39314
  */
39252
39315
  motionSources: MotionSourcesSchema.default(["analyzer"]),
@@ -39604,7 +39667,60 @@ var require_dist_9GQQ9F3s = __commonJS({
39604
39667
  className: zod.z.string(),
39605
39668
  /** Camera the pixels came from. Diagnostics + log tags ONLY — never routing. */
39606
39669
  sourceDeviceId: zod.z.number()
39607
- }), RunStatelessStepResultSchema, { kind: "mutation" })
39670
+ }), RunStatelessStepResultSchema, { kind: "mutation" }),
39671
+ /**
39672
+ * PARK a frame for a track at the instant it is judged to matter
39673
+ * ([D422](../../../docs/decisions/adr-0422-a-relevant-frame-is-parked-when-it-becomes-relevant.md)).
39674
+ *
39675
+ * The hub's `BestDetectionTracker` — the single "best per track" policy —
39676
+ * concludes a frame is a track's best and calls this on the node that
39677
+ * owns `handle` (`nodePin(handle.nodeId)`), while the handle is young. The
39678
+ * runner cuts `bbox` from the native surface it already holds (a full
39679
+ * frame for `keyFrame`, the caller's subject window for `thumbnail`),
39680
+ * encodes ONE JPEG, and keeps it under `(deviceId, trackId, kind)`. Every
39681
+ * later consumer retrieves by that key (`getParkedTrackFrame`) — a lookup
39682
+ * that cannot miss on age. D52 holds: the rectangle is cut by the runner,
39683
+ * never a pre-cut tile the caller decided. D9/D18 hold: one compressed
39684
+ * encode at a decision point, never a stream.
39685
+ *
39686
+ * Idempotent per `(trackId, kind)`: a later park replaces (the ranking is
39687
+ * the hub's; this adds no second opinion), an out-of-order older instant
39688
+ * is ignored. Bounded per device and per node on the runner
39689
+ * (`parked-frame-store.ts`), oldest-first eviction, never a refusal for
39690
+ * space. A refusal names its reason and is logged on the runner with the
39691
+ * handle's measured age — it is never retried into a loop.
39692
+ */
39693
+ parkTrackFrame: method(zod.z.object({
39694
+ deviceId: zod.z.number(),
39695
+ /** Opaque to the runner — the hub's track id. */
39696
+ trackId: zod.z.string(),
39697
+ kind: ParkedFrameKindSchema,
39698
+ handle: FrameHandleSchema,
39699
+ /** Normalized [0,1] window to cut. `{0,0,1,1}` for a full frame. */
39700
+ bbox: NativeCropBboxSchema,
39701
+ /** Width cap for a full-frame park (the `keyFrame` native cap). */
39702
+ maxWidth: zod.z.number().int().positive().optional(),
39703
+ /** The frame instant (caller's clock) — orders parks for one key. */
39704
+ timestamp: zod.z.number()
39705
+ }), ParkTrackFrameResultSchema, { kind: "mutation" }),
39706
+ /**
39707
+ * Retrieve a parked parcel by `(deviceId, trackId, kind)`. Pinned to the
39708
+ * node that answered the park (`ParkTrackFrameResult.nodeId`). `null` means
39709
+ * nothing was parked under that key on this node — never "too old".
39710
+ */
39711
+ getParkedTrackFrame: method(zod.z.object({
39712
+ deviceId: zod.z.number(),
39713
+ trackId: zod.z.string(),
39714
+ kind: ParkedFrameKindSchema
39715
+ }), ParkedTrackFrameSchema.nullable()),
39716
+ /**
39717
+ * Drop every parcel of a track — the hub closed it. Idempotent. A track
39718
+ * whose release is lost ages out on the runner under a hard ceiling.
39719
+ */
39720
+ releaseParkedTrackFrames: method(zod.z.object({
39721
+ deviceId: zod.z.number(),
39722
+ trackId: zod.z.string()
39723
+ }), zod.z.object({ released: zod.z.number().int().nonnegative() }), { kind: "mutation" })
39608
39724
  }
39609
39725
  };
39610
39726
  var CameraPipelineConfigSchema = zod.z.object({
@@ -43200,8 +43316,8 @@ var require_dist_9GQQ9F3s = __commonJS({
43200
43316
  /**
43201
43317
  * Runtime-state slice — every provider that registers this cap
43202
43318
  * stores the same shape under `device.runtimeState[battery]`.
43203
- * Cross-provider uniformity: a Reolink Argus, a Frigate sensor
43204
- * proxy, an ONVIF battery cam all read/write the same keys.
43319
+ * Cross-provider uniformity: a Reolink Argus, a sensor proxy,
43320
+ * an ONVIF battery cam all read/write the same keys.
43205
43321
  * Consumers (BatteryBadge, snapshot wrapper sleep gate) read once
43206
43322
  * via `device.runtimeState.getCapState('battery')` regardless of
43207
43323
  * the underlying driver.
@@ -45054,7 +45170,7 @@ var require_dist_9GQQ9F3s = __commonJS({
45054
45170
  * Which integration-marker cap the addon declared, so the wizard can
45055
45171
  * branch on CAP — never on addon name. `device-adoption` integrations
45056
45172
  * (Home Assistant, …) route through the broker step (Approach A);
45057
- * `device-provider` integrations (Reolink/Frigate/ONVIF) keep the
45173
+ * `device-provider` integrations (Reolink/ONVIF) keep the
45058
45174
  * legacy config → discovery flow.
45059
45175
  */
45060
45176
  kind: zod.z.enum(["device-adoption", "device-provider"]),
@@ -48306,9 +48422,11 @@ var require_dist_9GQQ9F3s = __commonJS({
48306
48422
  });
48307
48423
  var RecordingDeviceUsageSchema = zod.z.object({
48308
48424
  deviceId: zod.z.number(),
48425
+ /** Bytes the ARCHIVE holds for this camera on this node's resolvable
48426
+ * recordings locations. */
48309
48427
  usedBytes: zod.z.number(),
48310
48428
  /**
48311
- * Start of this camera's OLDEST indexed segment, across every profile and
48429
+ * Start of this camera's OLDEST ARCHIVED segment, across every profile and
48312
48430
  * location — the "Oldest footage" column in Recordings → Storage, and the
48313
48431
  * only honest answer to "is retention actually holding?" per camera.
48314
48432
  *
@@ -48318,7 +48436,24 @@ var require_dist_9GQQ9F3s = __commonJS({
48318
48436
  * (types) and the addon ship on different trains, and the addon is usually
48319
48437
  * the later of the two.
48320
48438
  */
48321
- oldestMs: zod.z.number().nullable().optional()
48439
+ oldestMs: zod.z.number().nullable().optional(),
48440
+ /** Segments the archive holds for this camera — the "M" beside `usedBytes`.
48441
+ * OPTIONAL for the same train-skew reason as `oldestMs`. */
48442
+ segments: zod.z.number().optional(),
48443
+ /**
48444
+ * RESIDENCY, not the archive: bytes the recorder process currently holds in
48445
+ * its RAM index — the live tail plus the hours a reader hydrated.
48446
+ *
48447
+ * It answers "what can be served without touching the disk", never "how much
48448
+ * footage this camera has". A UI that renders it must label it as such, and
48449
+ * must never total it as storage. OPTIONAL: a recorder predating D418 omits
48450
+ * it, and so does a node whose ledger could not answer.
48451
+ */
48452
+ residentBytes: zod.z.number().optional(),
48453
+ /** The residency counterpart of `oldestMs` — the oldest segment currently in
48454
+ * RAM, which on a healthy recorder is minutes ago and means nothing about
48455
+ * retention. `null` = nothing resident. */
48456
+ residentOldestMs: zod.z.number().nullable().optional()
48322
48457
  });
48323
48458
  var RecordingLocationUsageSchema = zod.z.object({
48324
48459
  /** StorageLocation id; null for the legacy/degraded single-root fallback. */
@@ -48352,6 +48487,17 @@ var require_dist_9GQQ9F3s = __commonJS({
48352
48487
  totalUsedBytes: zod.z.number(),
48353
48488
  devices: zod.z.array(RecordingDeviceUsageSchema),
48354
48489
  /**
48490
+ * WHERE `devices[]` came from, so an empty table is never mistaken for empty
48491
+ * disks (D418).
48492
+ *
48493
+ * `archive` = the durable hour ledger answered. `unavailable` = this node
48494
+ * declared no ledger and the recorder REFUSED rather than answering the
48495
+ * question with the resident index (D295 rule 3) — the rows are UNKNOWN, not
48496
+ * zero, and a UI must say so. OPTIONAL: a recorder predating D418 omits it,
48497
+ * and its rows are residency.
48498
+ */
48499
+ devicesRead: zod.z.enum(["archive", "unavailable"]).optional(),
48500
+ /**
48355
48501
  * Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
48356
48502
  * of the payload without it: the hub serves this method through a BAKED
48357
48503
  * router, so a hub whose framework train predates a change to this array
@@ -55949,6 +56095,24 @@ var require_dist_9GQQ9F3s = __commonJS({
55949
56095
  addonId: null,
55950
56096
  access: "view"
55951
56097
  },
56098
+ "pipelineRunner.getParkedTrackFrame": {
56099
+ capName: "pipeline-runner",
56100
+ capScope: "system",
56101
+ addonId: null,
56102
+ access: "view"
56103
+ },
56104
+ "pipelineRunner.parkTrackFrame": {
56105
+ capName: "pipeline-runner",
56106
+ capScope: "system",
56107
+ addonId: null,
56108
+ access: "create"
56109
+ },
56110
+ "pipelineRunner.releaseParkedTrackFrames": {
56111
+ capName: "pipeline-runner",
56112
+ capScope: "system",
56113
+ addonId: null,
56114
+ access: "create"
56115
+ },
55952
56116
  "pipelineRunner.reportMotion": {
55953
56117
  capName: "pipeline-runner",
55954
56118
  capScope: "system",
@@ -59226,6 +59390,21 @@ var require_dist_9GQQ9F3s = __commonJS({
59226
59390
  form: "single",
59227
59391
  optional: false
59228
59392
  }],
59393
+ "pipelineRunner.getParkedTrackFrame": [{
59394
+ name: "deviceId",
59395
+ form: "single",
59396
+ optional: false
59397
+ }],
59398
+ "pipelineRunner.parkTrackFrame": [{
59399
+ name: "deviceId",
59400
+ form: "single",
59401
+ optional: false
59402
+ }],
59403
+ "pipelineRunner.releaseParkedTrackFrames": [{
59404
+ name: "deviceId",
59405
+ form: "single",
59406
+ optional: false
59407
+ }],
59229
59408
  "pipelineRunner.reportMotion": [{
59230
59409
  name: "deviceId",
59231
59410
  form: "single",
@@ -61308,7 +61487,7 @@ var require_alerts_addon = __commonJS({
61308
61487
  [Symbol.toStringTag]: { value: "Module" }
61309
61488
  });
61310
61489
  require_chunk_Cek0wNdY();
61311
- var require_dist10 = require_dist_9GQQ9F3s();
61490
+ var require_dist10 = require_dist_DYWqXngV();
61312
61491
  function selectExpired(alerts, cutoffMs) {
61313
61492
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
61314
61493
  }
@@ -62127,7 +62306,7 @@ var require_console_logging = __commonJS({
62127
62306
  [Symbol.toStringTag]: { value: "Module" }
62128
62307
  });
62129
62308
  require_chunk_Cek0wNdY();
62130
- var require_dist10 = require_dist_9GQQ9F3s();
62309
+ var require_dist10 = require_dist_DYWqXngV();
62131
62310
  var require_formatter = require_formatter_DqAKDlvN();
62132
62311
  var LEVEL_RANK = {
62133
62312
  debug: 0,
@@ -62221,7 +62400,7 @@ var require_core_blocks_addon = __commonJS({
62221
62400
  "use strict";
62222
62401
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
62223
62402
  var require_chunk = require_chunk_Cek0wNdY();
62224
- var require_dist10 = require_dist_9GQQ9F3s();
62403
+ var require_dist10 = require_dist_DYWqXngV();
62225
62404
  var node_crypto = __require("crypto");
62226
62405
  var node_fs_promises = __require("fs/promises");
62227
62406
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -63118,11 +63297,11 @@ var require_core_blocks = __commonJS({
63118
63297
  }
63119
63298
  });
63120
63299
 
63121
- // ../system/dist/retired-settings-keys-DfdSH46H.js
63122
- var require_retired_settings_keys_DfdSH46H = __commonJS({
63123
- "../system/dist/retired-settings-keys-DfdSH46H.js"(exports) {
63300
+ // ../system/dist/retired-settings-keys-CXLIB19R.js
63301
+ var require_retired_settings_keys_CXLIB19R = __commonJS({
63302
+ "../system/dist/retired-settings-keys-CXLIB19R.js"(exports) {
63124
63303
  "use strict";
63125
- var require_dist10 = require_dist_9GQQ9F3s();
63304
+ var require_dist10 = require_dist_DYWqXngV();
63126
63305
  function settingsStoreIsAuthoritativeHere(env) {
63127
63306
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
63128
63307
  return raw === "" || raw === "hub";
@@ -65357,8 +65536,8 @@ var require_device_manager_addon = __commonJS({
65357
65536
  [Symbol.toStringTag]: { value: "Module" }
65358
65537
  });
65359
65538
  require_chunk_Cek0wNdY();
65360
- var require_dist10 = require_dist_9GQQ9F3s();
65361
- var require_retired_settings_keys = require_retired_settings_keys_DfdSH46H();
65539
+ var require_dist10 = require_dist_DYWqXngV();
65540
+ var require_retired_settings_keys = require_retired_settings_keys_CXLIB19R();
65362
65541
  var node_crypto = __require("crypto");
65363
65542
  var _camstack_types_node = require_node();
65364
65543
  var JOB_HISTORY = 20;
@@ -70983,7 +71162,7 @@ var require_hub_forwarder = __commonJS({
70983
71162
  [Symbol.toStringTag]: { value: "Module" }
70984
71163
  });
70985
71164
  require_chunk_Cek0wNdY();
70986
- var require_dist10 = require_dist_9GQQ9F3s();
71165
+ var require_dist10 = require_dist_DYWqXngV();
70987
71166
  var require_formatter = require_formatter_DqAKDlvN();
70988
71167
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
70989
71168
  var HubForwarderDestination = class {
@@ -71120,7 +71299,7 @@ var require_liveness_monitor_addon = __commonJS({
71120
71299
  "use strict";
71121
71300
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
71122
71301
  require_chunk_Cek0wNdY();
71123
- var require_dist10 = require_dist_9GQQ9F3s();
71302
+ var require_dist10 = require_dist_DYWqXngV();
71124
71303
  var NO_DEVICES = "liveness:no-devices";
71125
71304
  var ALL_OFFLINE = "liveness:all-devices-offline";
71126
71305
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -71316,7 +71495,7 @@ var require_local_auth_addon = __commonJS({
71316
71495
  [Symbol.toStringTag]: { value: "Module" }
71317
71496
  });
71318
71497
  var require_chunk = require_chunk_Cek0wNdY();
71319
- var require_dist10 = require_dist_9GQQ9F3s();
71498
+ var require_dist10 = require_dist_DYWqXngV();
71320
71499
  var node_crypto = __require("crypto");
71321
71500
  node_crypto = require_chunk.__toESM(node_crypto);
71322
71501
  var crypto$1 = __require("crypto");
@@ -79129,7 +79308,7 @@ var require_loki_logging = __commonJS({
79129
79308
  [Symbol.toStringTag]: { value: "Module" }
79130
79309
  });
79131
79310
  require_chunk_Cek0wNdY();
79132
- var require_dist10 = require_dist_9GQQ9F3s();
79311
+ var require_dist10 = require_dist_DYWqXngV();
79133
79312
  function sanitizeLabelName(raw) {
79134
79313
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
79135
79314
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -79694,7 +79873,7 @@ var require_native_metrics_addon = __commonJS({
79694
79873
  [Symbol.toStringTag]: { value: "Module" }
79695
79874
  });
79696
79875
  var require_chunk = require_chunk_Cek0wNdY();
79697
- var require_dist10 = require_dist_9GQQ9F3s();
79876
+ var require_dist10 = require_dist_DYWqXngV();
79698
79877
  var node_fs_promises = __require("fs/promises");
79699
79878
  var node_child_process = __require("child_process");
79700
79879
  var node_util = __require("util");
@@ -82278,7 +82457,7 @@ var require_filesystem_storage_addon = __commonJS({
82278
82457
  [Symbol.toStringTag]: { value: "Module" }
82279
82458
  });
82280
82459
  var require_chunk = require_chunk_Cek0wNdY();
82281
- var require_dist10 = require_dist_9GQQ9F3s();
82460
+ var require_dist10 = require_dist_DYWqXngV();
82282
82461
  var node_crypto = __require("crypto");
82283
82462
  var node_fs_promises = __require("fs/promises");
82284
82463
  var node_path = __require("path");
@@ -83394,8 +83573,8 @@ var require_sqlite_settings_addon = __commonJS({
83394
83573
  [Symbol.toStringTag]: { value: "Module" }
83395
83574
  });
83396
83575
  var require_chunk = require_chunk_Cek0wNdY();
83397
- var require_dist10 = require_dist_9GQQ9F3s();
83398
- var require_retired_settings_keys = require_retired_settings_keys_DfdSH46H();
83576
+ var require_dist10 = require_dist_DYWqXngV();
83577
+ var require_retired_settings_keys = require_retired_settings_keys_CXLIB19R();
83399
83578
  var node_crypto = __require("crypto");
83400
83579
  var node_fs = __require("fs");
83401
83580
  var node_module = __require("module");
@@ -85899,7 +86078,7 @@ var require_storage_orchestrator_addon = __commonJS({
85899
86078
  [Symbol.toStringTag]: { value: "Module" }
85900
86079
  });
85901
86080
  var require_chunk = require_chunk_Cek0wNdY();
85902
- var require_dist10 = require_dist_9GQQ9F3s();
86081
+ var require_dist10 = require_dist_DYWqXngV();
85903
86082
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
85904
86083
  var zod = require_zod();
85905
86084
  var node_crypto = __require("crypto");
@@ -89549,7 +89728,7 @@ var require_system_config_addon = __commonJS({
89549
89728
  [Symbol.toStringTag]: { value: "Module" }
89550
89729
  });
89551
89730
  require_chunk_Cek0wNdY();
89552
- var require_dist10 = require_dist_9GQQ9F3s();
89731
+ var require_dist10 = require_dist_DYWqXngV();
89553
89732
  var SECTION_TITLES = {
89554
89733
  server: "Server",
89555
89734
  auth: "Authentication"
@@ -107610,7 +107789,7 @@ var require_winston_logging = __commonJS({
107610
107789
  [Symbol.toStringTag]: { value: "Module" }
107611
107790
  });
107612
107791
  var require_chunk = require_chunk_Cek0wNdY();
107613
- var require_dist10 = require_dist_9GQQ9F3s();
107792
+ var require_dist10 = require_dist_DYWqXngV();
107614
107793
  var require_formatter = require_formatter_DqAKDlvN();
107615
107794
  var node_path = __require("path");
107616
107795
  node_path = require_chunk.__toESM(node_path);
@@ -107747,9 +107926,9 @@ var require_winston_logging = __commonJS({
107747
107926
  }
107748
107927
  });
107749
107928
 
107750
- // ../system/dist/file-data-plane-DO8KbxCe.js
107751
- var require_file_data_plane_DO8KbxCe = __commonJS({
107752
- "../system/dist/file-data-plane-DO8KbxCe.js"(exports) {
107929
+ // ../system/dist/event-loop-stall-monitor-DM9OAzy8.js
107930
+ var require_event_loop_stall_monitor_DM9OAzy8 = __commonJS({
107931
+ "../system/dist/event-loop-stall-monitor-DM9OAzy8.js"(exports) {
107753
107932
  "use strict";
107754
107933
  var require_chunk = require_chunk_Cek0wNdY();
107755
107934
  var node_crypto = __require("crypto");
@@ -107760,6 +107939,7 @@ var require_file_data_plane_DO8KbxCe = __commonJS({
107760
107939
  node_fs = require_chunk.__toESM(node_fs);
107761
107940
  var node_http = __require("http");
107762
107941
  var node_zlib = __require("zlib");
107942
+ var node_perf_hooks = __require("perf_hooks");
107763
107943
  function isNonEmptyFile(filePath) {
107764
107944
  return node_fs.existsSync(filePath) && node_fs.statSync(filePath).size > 0;
107765
107945
  }
@@ -108547,12 +108727,98 @@ var require_file_data_plane_DO8KbxCe = __commonJS({
108547
108727
  (0, node_fs.createReadStream)(absPath).pipe(res);
108548
108728
  };
108549
108729
  }
108730
+ var STALL_TICK_MS = 1e3;
108731
+ var STALL_REPORT_MS = 2e3;
108732
+ function attributeStall(stallMs, gcMs, gcCount, longestGcMs) {
108733
+ const share = stallMs > 0 ? gcMs / stallMs : 0;
108734
+ return {
108735
+ stallMs,
108736
+ gcMs,
108737
+ gcCount,
108738
+ longestGcMs,
108739
+ cause: share >= 0.7 ? "gc" : share <= 0.2 ? "synchronous-block" : "mixed"
108740
+ };
108741
+ }
108742
+ function startEventLoopStallMonitor(logger, reportThresholdMs = STALL_REPORT_MS) {
108743
+ let gc = {
108744
+ totalMs: 0,
108745
+ count: 0,
108746
+ longestMs: 0
108747
+ };
108748
+ let observer = null;
108749
+ try {
108750
+ observer = new node_perf_hooks.PerformanceObserver((list) => {
108751
+ for (const entry of list.getEntries()) {
108752
+ gc.totalMs += entry.duration;
108753
+ gc.count += 1;
108754
+ if (entry.duration > gc.longestMs) gc.longestMs = entry.duration;
108755
+ }
108756
+ });
108757
+ observer.observe({ entryTypes: ["gc"] });
108758
+ } catch {
108759
+ observer = null;
108760
+ }
108761
+ let expected = Date.now() + STALL_TICK_MS;
108762
+ const timer = setInterval(() => {
108763
+ const now = Date.now();
108764
+ const lateBy = now - expected;
108765
+ const window2 = gc;
108766
+ gc = {
108767
+ totalMs: 0,
108768
+ count: 0,
108769
+ longestMs: 0
108770
+ };
108771
+ expected = now + STALL_TICK_MS;
108772
+ if (lateBy < reportThresholdMs) return;
108773
+ const verdict = attributeStall(lateBy, Math.round(window2.totalMs), window2.count, Math.round(window2.longestMs));
108774
+ const mem = process.memoryUsage();
108775
+ logger.warn("event loop stalled", { meta: {
108776
+ stallMs: verdict.stallMs,
108777
+ cause: verdict.cause,
108778
+ gcMs: verdict.gcMs,
108779
+ gcCount: verdict.gcCount,
108780
+ longestGcMs: verdict.longestGcMs,
108781
+ gcObserved: observer !== null,
108782
+ heapUsedMb: Math.round(mem.heapUsed / 1e6),
108783
+ heapTotalMb: Math.round(mem.heapTotal / 1e6),
108784
+ rssMb: Math.round(mem.rss / 1e6),
108785
+ externalMb: Math.round(mem.external / 1e6),
108786
+ arrayBuffersMb: Math.round(mem.arrayBuffers / 1e6)
108787
+ } });
108788
+ }, STALL_TICK_MS);
108789
+ timer.unref?.();
108790
+ let stopped = false;
108791
+ return () => {
108792
+ if (stopped) return;
108793
+ stopped = true;
108794
+ clearInterval(timer);
108795
+ observer?.disconnect();
108796
+ };
108797
+ }
108550
108798
  Object.defineProperty(exports, "ModelDownloadService", {
108551
108799
  enumerable: true,
108552
108800
  get: function() {
108553
108801
  return ModelDownloadService;
108554
108802
  }
108555
108803
  });
108804
+ Object.defineProperty(exports, "STALL_REPORT_MS", {
108805
+ enumerable: true,
108806
+ get: function() {
108807
+ return STALL_REPORT_MS;
108808
+ }
108809
+ });
108810
+ Object.defineProperty(exports, "STALL_TICK_MS", {
108811
+ enumerable: true,
108812
+ get: function() {
108813
+ return STALL_TICK_MS;
108814
+ }
108815
+ });
108816
+ Object.defineProperty(exports, "attributeStall", {
108817
+ enumerable: true,
108818
+ get: function() {
108819
+ return attributeStall;
108820
+ }
108821
+ });
108556
108822
  Object.defineProperty(exports, "collectModelFiles", {
108557
108823
  enumerable: true,
108558
108824
  get: function() {
@@ -108637,6 +108903,12 @@ var require_file_data_plane_DO8KbxCe = __commonJS({
108637
108903
  return resolveFilePath;
108638
108904
  }
108639
108905
  });
108906
+ Object.defineProperty(exports, "startEventLoopStallMonitor", {
108907
+ enumerable: true,
108908
+ get: function() {
108909
+ return startEventLoopStallMonitor;
108910
+ }
108911
+ });
108640
108912
  }
108641
108913
  });
108642
108914
 
@@ -109386,9 +109658,9 @@ ${(0, node_fs.readFileSync)(ca.caCertPath, "utf-8").trimEnd()}
109386
109658
  }
109387
109659
  });
109388
109660
 
109389
- // ../types/dist/event-category-BVo6ta6_.js
109390
- var require_event_category_BVo6ta6 = __commonJS({
109391
- "../types/dist/event-category-BVo6ta6_.js"(exports) {
109661
+ // ../types/dist/event-category-BNJ9EE5B.js
109662
+ var require_event_category_BNJ9EE5B = __commonJS({
109663
+ "../types/dist/event-category-BNJ9EE5B.js"(exports) {
109392
109664
  "use strict";
109393
109665
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
109394
109666
  EventCategory2["SystemBoot"] = "system.boot";
@@ -109520,7 +109792,6 @@ var require_event_category_BVo6ta6 = __commonJS({
109520
109792
  EventCategory2["PipelineAnalyticsPackagePickedUp"] = "pipeline-analytics.package-picked-up";
109521
109793
  EventCategory2["PipelineAnalyticsFaceGalleryChanged"] = "pipeline-analytics.face-gallery-changed";
109522
109794
  EventCategory2["PipelineAnalyticsPlateGalleryChanged"] = "pipeline-analytics.plate-gallery-changed";
109523
- EventCategory2["FrigateLiveEvent"] = "frigate.live-event";
109524
109795
  EventCategory2["CameraStreamsProfileSlotsChanged"] = "camera-streams.onProfileSlotsChanged";
109525
109796
  EventCategory2["StreamOnline"] = "stream.online";
109526
109797
  EventCategory2["StreamOffline"] = "stream.offline";
@@ -109555,11 +109826,11 @@ var require_event_category_BVo6ta6 = __commonJS({
109555
109826
  }
109556
109827
  });
109557
109828
 
109558
- // ../types/dist/sleep-Bo9cUOXp.js
109559
- var require_sleep_Bo9cUOXp = __commonJS({
109560
- "../types/dist/sleep-Bo9cUOXp.js"(exports) {
109829
+ // ../types/dist/sleep-CTHjJilA.js
109830
+ var require_sleep_CTHjJilA = __commonJS({
109831
+ "../types/dist/sleep-CTHjJilA.js"(exports) {
109561
109832
  "use strict";
109562
- var require_event_category = require_event_category_BVo6ta6();
109833
+ var require_event_category = require_event_category_BNJ9EE5B();
109563
109834
  var zod = require_zod();
109564
109835
  var WELL_KNOWN_TABS = [
109565
109836
  {
@@ -112579,7 +112850,10 @@ var require_sleep_Bo9cUOXp = __commonJS({
112579
112850
  pipelineRunner: {
112580
112851
  detachCamera: (input) => dispatchSystem("pipelineRunner", "detachCamera", "mutation", input),
112581
112852
  getCameraMetrics: (input) => dispatchSystem("pipelineRunner", "getCameraMetrics", "query", input),
112582
- runDetailSubtree: (input) => dispatchSystem("pipelineRunner", "runDetailSubtree", "mutation", input)
112853
+ runDetailSubtree: (input) => dispatchSystem("pipelineRunner", "runDetailSubtree", "mutation", input),
112854
+ parkTrackFrame: (input) => dispatchSystem("pipelineRunner", "parkTrackFrame", "mutation", input),
112855
+ getParkedTrackFrame: (input) => dispatchSystem("pipelineRunner", "getParkedTrackFrame", "query", input),
112856
+ releaseParkedTrackFrames: (input) => dispatchSystem("pipelineRunner", "releaseParkedTrackFrames", "mutation", input)
112583
112857
  },
112584
112858
  plateGallery: {
112585
112859
  listPlates: (input) => dispatchSystem("plateGallery", "listPlates", "query", input),
@@ -113290,8 +113564,8 @@ var require_addon = __commonJS({
113290
113564
  "../types/dist/addon.js"(exports) {
113291
113565
  "use strict";
113292
113566
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
113293
- var require_event_category = require_event_category_BVo6ta6();
113294
- var require_sleep = require_sleep_Bo9cUOXp();
113567
+ var require_event_category = require_event_category_BNJ9EE5B();
113568
+ var require_sleep = require_sleep_CTHjJilA();
113295
113569
  var require_err_msg = require_err_msg_COpsHMw2();
113296
113570
  var CAP_INPUT_DEFAULTS = Object.freeze({
113297
113571
  "addons": { "getLogs": { "limit": 100 } },
@@ -132224,7 +132498,7 @@ var require_dist3 = __commonJS({
132224
132498
  "use strict";
132225
132499
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
132226
132500
  var require_chunk = require_chunk_Cek0wNdY();
132227
- var require_dist10 = require_dist_9GQQ9F3s();
132501
+ var require_dist10 = require_dist_DYWqXngV();
132228
132502
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
132229
132503
  require_alerts();
132230
132504
  var require_formatter = require_formatter_DqAKDlvN();
@@ -132249,7 +132523,7 @@ var require_dist3 = __commonJS({
132249
132523
  var require_builtins_system_config_system_config_addon = require_system_config_addon();
132250
132524
  require_system_config();
132251
132525
  var require_builtins_winston_logging_index = require_winston_logging();
132252
- var require_file_data_plane = require_file_data_plane_DO8KbxCe();
132526
+ var require_event_loop_stall_monitor = require_event_loop_stall_monitor_DM9OAzy8();
132253
132527
  var require_tls$1 = require_tls_BxQlomxd();
132254
132528
  var require_manifest_system_deps = require_manifest_system_deps_DvY1bY_n();
132255
132529
  var require_resource_monitor = require_resource_monitor_CdnzxBLP();
@@ -213019,7 +213293,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213019
213293
  exports.LokiLoggingAddon = require_builtins_loki_logging_index.LokiLoggingAddon$1;
213020
213294
  exports.MAX_LEAF_VALIDITY_DAYS = require_tls$1.MAX_LEAF_VALIDITY_DAYS;
213021
213295
  exports.METHOD_ACCESS_MAP = require_dist10.METHOD_ACCESS_MAP;
213022
- exports.ModelDownloadService = require_file_data_plane.ModelDownloadService;
213296
+ exports.ModelDownloadService = require_event_loop_stall_monitor.ModelDownloadService;
213023
213297
  exports.NATIVE_PROVIDER_SERVICE_INFIX = require_manifest_system_deps.NATIVE_PROVIDER_SERVICE_INFIX;
213024
213298
  exports.NATIVE_SCAN_DEPTH = NATIVE_SCAN_DEPTH;
213025
213299
  exports.NativeMetricsAddon = require_builtins_native_metrics_native_metrics_addon.default;
@@ -213049,6 +213323,8 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213049
213323
  exports.RingBuffer = RingBuffer;
213050
213324
  exports.SERVER_AUTH_OID = require_tls$1.SERVER_AUTH_OID;
213051
213325
  exports.SOCKET_PLANE_TOP_N = require_manifest_system_deps.SOCKET_PLANE_TOP_N;
213326
+ exports.STALL_REPORT_MS = require_event_loop_stall_monitor.STALL_REPORT_MS;
213327
+ exports.STALL_TICK_MS = require_event_loop_stall_monitor.STALL_TICK_MS;
213052
213328
  exports.ScopedLogger = ScopedLogger;
213053
213329
  exports.ScopedTokenManager = require_builtins_local_auth_local_auth_addon.ScopedTokenManager;
213054
213330
  exports.SocketChannel = require_manifest_system_deps.SocketChannel;
@@ -213076,6 +213352,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213076
213352
  exports.addonSettingsCapability = require_dist10.addonSettingsCapability;
213077
213353
  exports.allFamiliesListenHost = require_tls$1.allFamiliesListenHost;
213078
213354
  exports.applyLanHttp = require_tls$1.applyLanHttp;
213355
+ exports.attributeStall = require_event_loop_stall_monitor.attributeStall;
213079
213356
  exports.bindPendingLanHttp = require_tls$1.bindPendingLanHttp;
213080
213357
  exports.bootstrapSchema = bootstrapSchema;
213081
213358
  exports.brokerCallForCap = require_manifest_system_deps.brokerCallForCap;
@@ -213108,14 +213385,14 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213108
213385
  exports.clusterEventTopic = require_manifest_system_deps.clusterEventTopic;
213109
213386
  exports.clusterSecretMatches = clusterSecretMatches;
213110
213387
  exports.collectCertIdentity = require_tls$1.collectCertIdentity;
213111
- exports.collectModelFiles = require_file_data_plane.collectModelFiles;
213112
- exports.contentTypeFor = require_file_data_plane.contentTypeFor;
213388
+ exports.collectModelFiles = require_event_loop_stall_monitor.collectModelFiles;
213389
+ exports.contentTypeFor = require_event_loop_stall_monitor.contentTypeFor;
213113
213390
  exports.copyDirRecursive = copyDirRecursive;
213114
213391
  exports.copyExtraFileDirs = copyExtraFileDirs;
213115
213392
  exports.createAddonContext = require_manifest_system_deps.createAddonContext;
213116
213393
  exports.createAddonDataPlaneFacility = require_manifest_system_deps.createAddonDataPlaneFacility;
213117
213394
  exports.createAddonService = require_manifest_system_deps.createAddonService;
213118
- exports.createAuthenticatedFileServer = require_file_data_plane.createAuthenticatedFileServer;
213395
+ exports.createAuthenticatedFileServer = require_event_loop_stall_monitor.createAuthenticatedFileServer;
213119
213396
  exports.createBroker = createBroker2;
213120
213397
  exports.createBrokerDeviceManagerApi = require_manifest_system_deps.createBrokerDeviceManagerApi;
213121
213398
  exports.createCoreCapService = createCoreCapService;
@@ -213123,7 +213400,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213123
213400
  exports.createDoorSettingsView = createDoorSettingsView;
213124
213401
  exports.createEventPlaneMeter = require_manifest_system_deps.createEventPlaneMeter;
213125
213402
  exports.createEventPlaneReader = require_manifest_system_deps.createEventPlaneReader;
213126
- exports.createFileDataPlaneHandler = require_file_data_plane.createFileDataPlaneHandler;
213403
+ exports.createFileDataPlaneHandler = require_event_loop_stall_monitor.createFileDataPlaneHandler;
213127
213404
  exports.createHubCapForwardService = require_hub_cap_forward.createHubCapForwardService;
213128
213405
  exports.createHubService = createHubService;
213129
213406
  exports.createKernelHwAccel = require_manifest_system_deps.createKernelHwAccel;
@@ -213144,7 +213421,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213144
213421
  exports.createUdsLogger = require_manifest_system_deps.createUdsLogger;
213145
213422
  exports.createUdsLoggerWithControl = require_manifest_system_deps.createUdsLoggerWithControl;
213146
213423
  exports.createV8Reclaimer = require_manifest_system_deps.createV8Reclaimer;
213147
- exports.deleteModelFromDisk = require_file_data_plane.deleteModelFromDisk;
213424
+ exports.deleteModelFromDisk = require_event_loop_stall_monitor.deleteModelFromDisk;
213148
213425
  exports.deriveAgentListenPort = deriveAgentListenPort;
213149
213426
  exports.describeProviderKindDrift = describeProviderKindDrift;
213150
213427
  exports.describeRss = require_manifest_system_deps.describeRss;
@@ -213157,8 +213434,8 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213157
213434
  return _camstack_types_node.downloadBinary;
213158
213435
  }
213159
213436
  });
213160
- exports.downloadFile = require_file_data_plane.downloadFile;
213161
- exports.downloadModel = require_file_data_plane.downloadModel;
213437
+ exports.downloadFile = require_event_loop_stall_monitor.downloadFile;
213438
+ exports.downloadModel = require_event_loop_stall_monitor.downloadModel;
213162
213439
  exports.emitDownForOwnedCaps = require_dist10.emitDownForOwnedCaps;
213163
213440
  exports.emitHeapDiagnosticReport = require_manifest_system_deps.emitHeapDiagnosticReport;
213164
213441
  exports.encodeFrame = require_manifest_system_deps.encodeFrame;
@@ -213177,7 +213454,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213177
213454
  }
213178
213455
  });
213179
213456
  exports.ensureLibraryBuilt = ensureLibraryBuilt;
213180
- exports.ensureModel = require_file_data_plane.ensureModel;
213457
+ exports.ensureModel = require_event_loop_stall_monitor.ensureModel;
213181
213458
  exports.ensureNativePrebuilds = ensureNativePrebuilds;
213182
213459
  Object.defineProperty(exports, "ensurePython", {
213183
213460
  enumerable: true,
@@ -213188,7 +213465,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213188
213465
  exports.ensureTlsCert = require_tls$1.ensureTlsCert;
213189
213466
  exports.evaluateExistingCert = require_tls$1.evaluateExistingCert;
213190
213467
  exports.expandCapMethods = require_dist10.expandCapMethods;
213191
- exports.fetchJson = require_file_data_plane.fetchJson;
213468
+ exports.fetchJson = require_event_loop_stall_monitor.fetchJson;
213192
213469
  Object.defineProperty(exports, "findInPath", {
213193
213470
  enumerable: true,
213194
213471
  get: function() {
@@ -213208,7 +213485,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213208
213485
  }
213209
213486
  });
213210
213487
  exports.getLoggingGate = getLoggingGate;
213211
- exports.getModelFilePath = require_file_data_plane.getModelFilePath;
213488
+ exports.getModelFilePath = require_event_loop_stall_monitor.getModelFilePath;
213212
213489
  exports.getMoleculerEventStats = require_manifest_system_deps.getMoleculerEventStats;
213213
213490
  exports.getOrInitReadinessRegistry = require_manifest_system_deps.getOrInitReadinessRegistry;
213214
213491
  exports.getOrInitReadinessRegistryForClient = require_manifest_system_deps.getOrInitReadinessRegistryForClient;
@@ -213254,7 +213531,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213254
213531
  exports.isClusterSecretMismatchError = isClusterSecretMismatchError;
213255
213532
  exports.isCollectionArrayMethod = require_dist10.isCollectionArrayMethod;
213256
213533
  exports.isInfraCapability = isInfraCapability;
213257
- exports.isModelDownloaded = require_file_data_plane.isModelDownloaded;
213534
+ exports.isModelDownloaded = require_event_loop_stall_monitor.isModelDownloaded;
213258
213535
  exports.isSourceNewer = isSourceNewer;
213259
213536
  exports.isolatedBuiltinPhase = isolatedBuiltinPhase;
213260
213537
  exports.loadTlsCert = require_tls$1.loadTlsCert;
@@ -213263,9 +213540,9 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213263
213540
  exports.mountNativeCapService = require_manifest_system_deps.mountNativeCapService;
213264
213541
  exports.nextRssBudgetState = require_manifest_system_deps.nextRssBudgetState;
213265
213542
  exports.parseCapAction = require_manifest_system_deps.parseCapAction;
213266
- exports.parseRangeHeader = require_file_data_plane.parseRangeHeader;
213543
+ exports.parseRangeHeader = require_event_loop_stall_monitor.parseRangeHeader;
213267
213544
  exports.parseRssBudgetMb = require_manifest_system_deps.parseRssBudgetMb;
213268
- exports.parseTokenizedUrl = require_file_data_plane.parseTokenizedUrl;
213545
+ exports.parseTokenizedUrl = require_event_loop_stall_monitor.parseTokenizedUrl;
213269
213546
  exports.partitionIsolatedBuiltinIds = partitionIsolatedBuiltinIds;
213270
213547
  exports.proxyToUpstream = proxyToUpstream;
213271
213548
  exports.quarantineAddonResidue = quarantineAddonResidue;
@@ -213282,7 +213559,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213282
213559
  exports.registerEventBusService = require_manifest_system_deps.registerEventBusService;
213283
213560
  exports.registerLanHttpHandler = require_tls$1.registerLanHttpHandler;
213284
213561
  exports.reissueTlsLeaf = require_tls$1.reissueTlsLeaf;
213285
- exports.resolveFilePath = require_file_data_plane.resolveFilePath;
213562
+ exports.resolveFilePath = require_event_loop_stall_monitor.resolveFilePath;
213286
213563
  exports.resolveHwAccel = require_manifest_system_deps.resolveHwAccel;
213287
213564
  exports.resolveNpmInvocation = require_manifest_system_deps.resolveNpmInvocation;
213288
213565
  exports.runHubAddonBoot = runHubAddonBoot;
@@ -213300,6 +213577,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
213300
213577
  exports.shouldReclaim = require_manifest_system_deps.shouldReclaim;
213301
213578
  exports.socketDirectionBytes = require_manifest_system_deps.socketDirectionBytes;
213302
213579
  exports.socketDirectionMessages = require_manifest_system_deps.socketDirectionMessages;
213580
+ exports.startEventLoopStallMonitor = require_event_loop_stall_monitor.startEventLoopStallMonitor;
213303
213581
  exports.startHeapWatch = require_manifest_system_deps.startHeapWatch;
213304
213582
  exports.startRunnerHeapWatch = require_manifest_system_deps.startRunnerHeapWatch;
213305
213583
  exports.strandedMb = require_manifest_system_deps.strandedMb;
@@ -213320,7 +213598,7 @@ var require_enums = __commonJS({
213320
213598
  "../types/dist/enums.js"(exports) {
213321
213599
  "use strict";
213322
213600
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
213323
- var require_event_category = require_event_category_BVo6ta6();
213601
+ var require_event_category = require_event_category_BNJ9EE5B();
213324
213602
  var EventSourceType = /* @__PURE__ */ (function(EventSourceType2) {
213325
213603
  EventSourceType2["Addon"] = "addon";
213326
213604
  EventSourceType2["Core"] = "core";
@@ -213340,8 +213618,8 @@ var require_dist4 = __commonJS({
213340
213618
  "../types/dist/index.js"(exports) {
213341
213619
  "use strict";
213342
213620
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
213343
- var require_event_category = require_event_category_BVo6ta6();
213344
- var require_sleep = require_sleep_Bo9cUOXp();
213621
+ var require_event_category = require_event_category_BNJ9EE5B();
213622
+ var require_sleep = require_sleep_CTHjJilA();
213345
213623
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
213346
213624
  var require_enums2 = require_enums();
213347
213625
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -220649,7 +220927,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
220649
220927
  var SourceInfoSchema = zod.z.object({
220650
220928
  /** Live dispatch key — mutable when the source system allows rename. */
220651
220929
  id: zod.z.string(),
220652
- /** Source system tag — e.g. 'homeassistant' | 'reolink' | 'frigate'. */
220930
+ /** Source system tag — e.g. 'homeassistant' | 'reolink' | 'onvif'. */
220653
220931
  system: zod.z.string(),
220654
220932
  /** Immutable upstream identifier when available (HA `unique_id`, … ).
220655
220933
  * Used to detect rename when `id` changes. */
@@ -225650,7 +225928,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225650
225928
  * The measured seven-person arrival on device 590 spans 110 s with every
225651
225929
  * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
225652
225930
  * idle cutoff holds it as one and ends it when the arrival actually ends.
225653
- * 30 is Frigate's shipped value for the same decision.
225931
+ * 30 s is a widely shipped value for the same decision.
225654
225932
  *
225655
225933
  * ### What it replaces
225656
225934
  *
@@ -227949,6 +228227,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
227949
228227
  /** Zone display name at crossing time (falls back to the id). */
227950
228228
  zoneName: zod.z.string().optional()
227951
228229
  });
228230
+ var ZoneOverlapSchema = zod.z.object({
228231
+ zoneId: zod.z.string(),
228232
+ zoneName: zod.z.string().optional(),
228233
+ /** Percentage of the BOX area inside the zone, 0–100. */
228234
+ overlapPct: zod.z.number()
228235
+ });
227952
228236
  var ObjectEventSchema = zod.z.object({
227953
228237
  ...BaseEventFields,
227954
228238
  kind: zod.z.literal("object"),
@@ -227973,6 +228257,35 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
227973
228257
  bbox: BoundingBoxSchema.optional(),
227974
228258
  /** Heavy JSON — omitted in slim projection. */
227975
228259
  zones: zod.z.array(zod.z.string()).readonly().optional(),
228260
+ /**
228261
+ * How far inside each stamped zone the box actually was, as a percentage of
228262
+ * the BOX area.
228263
+ *
228264
+ * Membership alone cannot express "at least a third of it inside", which is
228265
+ * the bar an operator argues with — and the number already existed: the
228266
+ * engine computed it, the pipeline logged it, and then discarded it. It
228267
+ * matters most on the events that carry no track, where a rule has nothing
228268
+ * else to judge by.
228269
+ */
228270
+ zoneOverlaps: zod.z.array(ZoneOverlapSchema).readonly().optional(),
228271
+ /**
228272
+ * Present when this event describes a detection the TRACKER refused, so it
228273
+ * has no track and never will.
228274
+ *
228275
+ * A zone-scoped immediate rule asks "is there an animal in the flowerbed
228276
+ * NOW?"; tracking answers a different question ("is this the same subject as
228277
+ * before?") whose confirmation threshold presumes continuity. On 2026-09-09 a
228278
+ * dog at 0.7729, 100% inside a watched zone, was refused three times in six
228279
+ * seconds with three different candidate ids — seven analysed frames in the
228280
+ * window, the subject in a handful of them, metres apart — and produced no
228281
+ * event at all.
228282
+ *
228283
+ * It is NAMED rather than merely implied by a missing `trackId`: an event
228284
+ * with no track and no reason is indistinguishable from a track whose media
228285
+ * went missing, and a consumer that asks this one for a best shot or a
228286
+ * history is asking for something that never existed.
228287
+ */
228288
+ spawnRefused: zod.z.string().optional(),
227976
228289
  /** Omitted in slim projection. */
227977
228290
  state: TrackStateSchema.optional(),
227978
228291
  /**
@@ -229455,6 +229768,35 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
229455
229768
  */
229456
229769
  tier: zod.z.enum(["native", "ram-fullframe"]).optional()
229457
229770
  });
229771
+ var ParkedFrameKindSchema = zod.z.enum(["keyFrame", "thumbnail"]);
229772
+ var ParkRefusalSchema = zod.z.enum(["handle-gone", "encode-failed"]);
229773
+ var ParkTrackFrameResultSchema = zod.z.discriminatedUnion("parked", [zod.z.object({
229774
+ parked: zod.z.literal(true),
229775
+ /** The node holding the parcel — what a later retrieval must be pinned to. */
229776
+ nodeId: zod.z.string(),
229777
+ width: zod.z.number().int().positive(),
229778
+ height: zod.z.number().int().positive(),
229779
+ /** JPEG bytes the parcel costs on the node. */
229780
+ bytes: zod.z.number().int().nonnegative(),
229781
+ /** Whether this park replaced a parcel already held for the key. */
229782
+ replaced: zod.z.boolean()
229783
+ }), zod.z.object({
229784
+ parked: zod.z.literal(false),
229785
+ nodeId: zod.z.string(),
229786
+ reason: ParkRefusalSchema,
229787
+ /** Age of the handle at the park, on the runner's clock; null if unknown. */
229788
+ handleAgeMs: zod.z.number().nullable(),
229789
+ detail: zod.z.string().optional()
229790
+ })]);
229791
+ var ParkedTrackFrameSchema = zod.z.object({
229792
+ jpeg: zod.z.string(),
229793
+ width: zod.z.number().int().positive(),
229794
+ height: zod.z.number().int().positive(),
229795
+ /** The frame instant the parcel shows (the caller's clock, echoed back). */
229796
+ timestamp: zod.z.number(),
229797
+ /** When the node stored it (the node's clock). */
229798
+ parkedAt: zod.z.number()
229799
+ });
229458
229800
  var DetailParentSchema = zod.z.object({
229459
229801
  bbox: NativeCropBboxSchema,
229460
229802
  className: zod.z.string()
@@ -229700,7 +230042,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
229700
230042
  * - `analyzer`: ML/frame-diff motion detection (motion-wasm or other
229701
230043
  * analyzer providers) running on decoded frames in this runner.
229702
230044
  * - `onboard`: camera-native motion pushes (Reolink Baichuan, ONVIF
229703
- * analytics, Frigate motion). The provider emits ProviderMotion
230045
+ * analytics). The provider emits ProviderMotion
229704
230046
  * events; the orchestrator forwards to `reportMotion`.
229705
230047
  */
229706
230048
  motionSources: MotionSourcesSchema.default(["analyzer"]),
@@ -230231,7 +230573,60 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
230231
230573
  className: zod.z.string(),
230232
230574
  /** Camera the pixels came from. Diagnostics + log tags ONLY — never routing. */
230233
230575
  sourceDeviceId: zod.z.number()
230234
- }), RunStatelessStepResultSchema, { kind: "mutation" })
230576
+ }), RunStatelessStepResultSchema, { kind: "mutation" }),
230577
+ /**
230578
+ * PARK a frame for a track at the instant it is judged to matter
230579
+ * ([D422](../../../docs/decisions/adr-0422-a-relevant-frame-is-parked-when-it-becomes-relevant.md)).
230580
+ *
230581
+ * The hub's `BestDetectionTracker` — the single "best per track" policy —
230582
+ * concludes a frame is a track's best and calls this on the node that
230583
+ * owns `handle` (`nodePin(handle.nodeId)`), while the handle is young. The
230584
+ * runner cuts `bbox` from the native surface it already holds (a full
230585
+ * frame for `keyFrame`, the caller's subject window for `thumbnail`),
230586
+ * encodes ONE JPEG, and keeps it under `(deviceId, trackId, kind)`. Every
230587
+ * later consumer retrieves by that key (`getParkedTrackFrame`) — a lookup
230588
+ * that cannot miss on age. D52 holds: the rectangle is cut by the runner,
230589
+ * never a pre-cut tile the caller decided. D9/D18 hold: one compressed
230590
+ * encode at a decision point, never a stream.
230591
+ *
230592
+ * Idempotent per `(trackId, kind)`: a later park replaces (the ranking is
230593
+ * the hub's; this adds no second opinion), an out-of-order older instant
230594
+ * is ignored. Bounded per device and per node on the runner
230595
+ * (`parked-frame-store.ts`), oldest-first eviction, never a refusal for
230596
+ * space. A refusal names its reason and is logged on the runner with the
230597
+ * handle's measured age — it is never retried into a loop.
230598
+ */
230599
+ parkTrackFrame: require_sleep.method(zod.z.object({
230600
+ deviceId: zod.z.number(),
230601
+ /** Opaque to the runner — the hub's track id. */
230602
+ trackId: zod.z.string(),
230603
+ kind: ParkedFrameKindSchema,
230604
+ handle: require_sleep.FrameHandleSchema,
230605
+ /** Normalized [0,1] window to cut. `{0,0,1,1}` for a full frame. */
230606
+ bbox: NativeCropBboxSchema,
230607
+ /** Width cap for a full-frame park (the `keyFrame` native cap). */
230608
+ maxWidth: zod.z.number().int().positive().optional(),
230609
+ /** The frame instant (caller's clock) — orders parks for one key. */
230610
+ timestamp: zod.z.number()
230611
+ }), ParkTrackFrameResultSchema, { kind: "mutation" }),
230612
+ /**
230613
+ * Retrieve a parked parcel by `(deviceId, trackId, kind)`. Pinned to the
230614
+ * node that answered the park (`ParkTrackFrameResult.nodeId`). `null` means
230615
+ * nothing was parked under that key on this node — never "too old".
230616
+ */
230617
+ getParkedTrackFrame: require_sleep.method(zod.z.object({
230618
+ deviceId: zod.z.number(),
230619
+ trackId: zod.z.string(),
230620
+ kind: ParkedFrameKindSchema
230621
+ }), ParkedTrackFrameSchema.nullable()),
230622
+ /**
230623
+ * Drop every parcel of a track — the hub closed it. Idempotent. A track
230624
+ * whose release is lost ages out on the runner under a hard ceiling.
230625
+ */
230626
+ releaseParkedTrackFrames: require_sleep.method(zod.z.object({
230627
+ deviceId: zod.z.number(),
230628
+ trackId: zod.z.string()
230629
+ }), zod.z.object({ released: zod.z.number().int().nonnegative() }), { kind: "mutation" })
230235
230630
  }
230236
230631
  };
230237
230632
  var CameraPipelineConfigSchema = zod.z.object({
@@ -233850,8 +234245,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
233850
234245
  /**
233851
234246
  * Runtime-state slice — every provider that registers this cap
233852
234247
  * stores the same shape under `device.runtimeState[battery]`.
233853
- * Cross-provider uniformity: a Reolink Argus, a Frigate sensor
233854
- * proxy, an ONVIF battery cam all read/write the same keys.
234248
+ * Cross-provider uniformity: a Reolink Argus, a sensor proxy,
234249
+ * an ONVIF battery cam all read/write the same keys.
233855
234250
  * Consumers (BatteryBadge, snapshot wrapper sleep gate) read once
233856
234251
  * via `device.runtimeState.getCapState('battery')` regardless of
233857
234252
  * the underlying driver.
@@ -235705,7 +236100,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
235705
236100
  * Which integration-marker cap the addon declared, so the wizard can
235706
236101
  * branch on CAP — never on addon name. `device-adoption` integrations
235707
236102
  * (Home Assistant, …) route through the broker step (Approach A);
235708
- * `device-provider` integrations (Reolink/Frigate/ONVIF) keep the
236103
+ * `device-provider` integrations (Reolink/ONVIF) keep the
235709
236104
  * legacy config → discovery flow.
235710
236105
  */
235711
236106
  kind: zod.z.enum(["device-adoption", "device-provider"]),
@@ -239103,9 +239498,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
239103
239498
  });
239104
239499
  var RecordingDeviceUsageSchema = zod.z.object({
239105
239500
  deviceId: zod.z.number(),
239501
+ /** Bytes the ARCHIVE holds for this camera on this node's resolvable
239502
+ * recordings locations. */
239106
239503
  usedBytes: zod.z.number(),
239107
239504
  /**
239108
- * Start of this camera's OLDEST indexed segment, across every profile and
239505
+ * Start of this camera's OLDEST ARCHIVED segment, across every profile and
239109
239506
  * location — the "Oldest footage" column in Recordings → Storage, and the
239110
239507
  * only honest answer to "is retention actually holding?" per camera.
239111
239508
  *
@@ -239115,7 +239512,24 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
239115
239512
  * (types) and the addon ship on different trains, and the addon is usually
239116
239513
  * the later of the two.
239117
239514
  */
239118
- oldestMs: zod.z.number().nullable().optional()
239515
+ oldestMs: zod.z.number().nullable().optional(),
239516
+ /** Segments the archive holds for this camera — the "M" beside `usedBytes`.
239517
+ * OPTIONAL for the same train-skew reason as `oldestMs`. */
239518
+ segments: zod.z.number().optional(),
239519
+ /**
239520
+ * RESIDENCY, not the archive: bytes the recorder process currently holds in
239521
+ * its RAM index — the live tail plus the hours a reader hydrated.
239522
+ *
239523
+ * It answers "what can be served without touching the disk", never "how much
239524
+ * footage this camera has". A UI that renders it must label it as such, and
239525
+ * must never total it as storage. OPTIONAL: a recorder predating D418 omits
239526
+ * it, and so does a node whose ledger could not answer.
239527
+ */
239528
+ residentBytes: zod.z.number().optional(),
239529
+ /** The residency counterpart of `oldestMs` — the oldest segment currently in
239530
+ * RAM, which on a healthy recorder is minutes ago and means nothing about
239531
+ * retention. `null` = nothing resident. */
239532
+ residentOldestMs: zod.z.number().nullable().optional()
239119
239533
  });
239120
239534
  var RecordingLocationUsageSchema = zod.z.object({
239121
239535
  /** StorageLocation id; null for the legacy/degraded single-root fallback. */
@@ -239149,6 +239563,17 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
239149
239563
  totalUsedBytes: zod.z.number(),
239150
239564
  devices: zod.z.array(RecordingDeviceUsageSchema),
239151
239565
  /**
239566
+ * WHERE `devices[]` came from, so an empty table is never mistaken for empty
239567
+ * disks (D418).
239568
+ *
239569
+ * `archive` = the durable hour ledger answered. `unavailable` = this node
239570
+ * declared no ledger and the recorder REFUSED rather than answering the
239571
+ * question with the resident index (D295 rule 3) — the rows are UNKNOWN, not
239572
+ * zero, and a UI must say so. OPTIONAL: a recorder predating D418 omits it,
239573
+ * and its rows are residency.
239574
+ */
239575
+ devicesRead: zod.z.enum(["archive", "unavailable"]).optional(),
239576
+ /**
239152
239577
  * Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
239153
239578
  * of the payload without it: the hub serves this method through a BAKED
239154
239579
  * router, so a hub whose framework train predates a change to this array
@@ -250113,6 +250538,24 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
250113
250538
  addonId: null,
250114
250539
  access: "view"
250115
250540
  },
250541
+ "pipelineRunner.getParkedTrackFrame": {
250542
+ capName: "pipeline-runner",
250543
+ capScope: "system",
250544
+ addonId: null,
250545
+ access: "view"
250546
+ },
250547
+ "pipelineRunner.parkTrackFrame": {
250548
+ capName: "pipeline-runner",
250549
+ capScope: "system",
250550
+ addonId: null,
250551
+ access: "create"
250552
+ },
250553
+ "pipelineRunner.releaseParkedTrackFrames": {
250554
+ capName: "pipeline-runner",
250555
+ capScope: "system",
250556
+ addonId: null,
250557
+ access: "create"
250558
+ },
250116
250559
  "pipelineRunner.reportMotion": {
250117
250560
  capName: "pipeline-runner",
250118
250561
  capScope: "system",
@@ -253654,6 +254097,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
253654
254097
  form: "single",
253655
254098
  optional: false
253656
254099
  }],
254100
+ "pipelineRunner.getParkedTrackFrame": [{
254101
+ name: "deviceId",
254102
+ form: "single",
254103
+ optional: false
254104
+ }],
254105
+ "pipelineRunner.parkTrackFrame": [{
254106
+ name: "deviceId",
254107
+ form: "single",
254108
+ optional: false
254109
+ }],
254110
+ "pipelineRunner.releaseParkedTrackFrames": [{
254111
+ name: "deviceId",
254112
+ form: "single",
254113
+ optional: false
254114
+ }],
253657
254115
  "pipelineRunner.reportMotion": [{
253658
254116
  name: "deviceId",
253659
254117
  form: "single",
@@ -254331,6 +254789,9 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
254331
254789
  "pipelineRunner.attachCamera",
254332
254790
  "pipelineRunner.detachCamera",
254333
254791
  "pipelineRunner.getCameraMetrics",
254792
+ "pipelineRunner.getParkedTrackFrame",
254793
+ "pipelineRunner.parkTrackFrame",
254794
+ "pipelineRunner.releaseParkedTrackFrames",
254334
254795
  "pipelineRunner.reportMotion",
254335
254796
  "pipelineRunner.runDetailSubtree",
254336
254797
  "pipelineRunner.runStatelessStep",
@@ -258784,6 +259245,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258784
259245
  exports.PYTHON_SCRIPT = PYTHON_SCRIPT;
258785
259246
  exports.PackageUpdateSchema = PackageUpdateSchema;
258786
259247
  exports.PackageVersionInfoSchema = PackageVersionInfoSchema;
259248
+ exports.ParkRefusalSchema = ParkRefusalSchema;
259249
+ exports.ParkTrackFrameResultSchema = ParkTrackFrameResultSchema;
259250
+ exports.ParkedFrameKindSchema = ParkedFrameKindSchema;
259251
+ exports.ParkedTrackFrameSchema = ParkedTrackFrameSchema;
258787
259252
  exports.PasskeyLoginMethodSchema = PasskeyLoginMethodSchema;
258788
259253
  exports.PasskeySummarySchema = PasskeySummarySchema;
258789
259254
  exports.PcmSampleFormatSchema = PcmSampleFormatSchema;
@@ -432134,6 +432599,8 @@ var require_main4 = __commonJS({
432134
432599
  heapWatchLogger.warn(line);
432135
432600
  }
432136
432601
  });
432602
+ const stallLogger = loggingService.createLogger("event-loop");
432603
+ (0, system_1.startEventLoopStallMonitor)(stallLogger);
432137
432604
  const addonRouteRegistry = new system_1.AddonRouteRegistry();
432138
432605
  const dataPlaneRegistry = new system_1.DataPlaneRegistry();
432139
432606
  const { NotificationServiceWrapper } = await Promise.resolve().then(() => __importStar(require_notification_wrapper_service()));