camstack 1.2.154 → 1.2.156

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-DaSCLJVH.js
23637
- var require_dist_DaSCLJVH = __commonJS({
23638
- "../system/dist/dist-DaSCLJVH.js"(exports) {
23636
+ // ../system/dist/dist-C6JIhqS6.js
23637
+ var require_dist_C6JIhqS6 = __commonJS({
23638
+ "../system/dist/dist-C6JIhqS6.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -29471,6 +29471,21 @@ var require_dist_DaSCLJVH = __commonJS({
29471
29471
  mode: "singleton",
29472
29472
  deviceTypes: Object.values(DeviceType),
29473
29473
  runtimeState: StreamSignalsStatusSchema,
29474
+ /**
29475
+ * Runtime-state durability: **session** — mirrored in RAM, never written.
29476
+ *
29477
+ * The slice holds what the DEVICE says it can emit. That is a probed fact,
29478
+ * not an operator choice: the provider re-declares it on every registration,
29479
+ * so losing it loses nothing and persisting it would freeze an answer the
29480
+ * camera is entitled to change. Measured the same day on the sibling case —
29481
+ * `native-object-detection.supportedClasses` was persisted, and a firmware
29482
+ * class the camera really detected stayed missing for the life of the row
29483
+ * because the fix could not reach it.
29484
+ *
29485
+ * See `RuntimeStateDurability`. Enforced by
29486
+ * `scripts/check-runtime-state-durability.ts`.
29487
+ */
29488
+ durability: "session",
29474
29489
  methods: {
29475
29490
  /**
29476
29491
  * What this device can emit. Empty is a valid and common answer — most
@@ -30735,16 +30750,6 @@ var require_dist_DaSCLJVH = __commonJS({
30735
30750
  })) }), { auth: "admin" })
30736
30751
  }
30737
30752
  };
30738
- function describeCustomActions(catalog) {
30739
- const out = {};
30740
- for (const [name, spec] of Object.entries(catalog)) out[name] = {
30741
- kind: spec.kind,
30742
- auth: spec.auth,
30743
- scope: spec.scope,
30744
- ...spec.caller === "required" ? { caller: "required" } : {}
30745
- };
30746
- return out;
30747
- }
30748
30753
  var CustomModelDescriptorSchema = zod.z.object({
30749
30754
  stepId: zod.z.string(),
30750
30755
  entry: ModelCatalogEntrySchema
@@ -36354,6 +36359,29 @@ var require_dist_DaSCLJVH = __commonJS({
36354
36359
  settings: NcAlarmSettingsSchema,
36355
36360
  coverage: zod.z.array(NcAlarmModeCoverageSchema)
36356
36361
  });
36362
+ var NcClipRetentionAskSchema = zod.z.object({
36363
+ /**
36364
+ * The camera this ask is about. **Absent = every camera**, which is what a
36365
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
36366
+ * asking everywhere.
36367
+ */
36368
+ deviceId: zod.z.number().int().nonnegative().optional(),
36369
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
36370
+ * needs nothing produces no ask at all. */
36371
+ seconds: zod.z.number().min(0).max(60),
36372
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
36373
+ * assigned, which is what the cut defaults to. */
36374
+ profile: CamProfileSchema.optional(),
36375
+ /** Who is asking — so a retention the operator did not expect names a rule. */
36376
+ ruleId: zod.z.string(),
36377
+ ruleName: zod.z.string(),
36378
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
36379
+ reason: zod.z.enum(["window", "occupancy"])
36380
+ });
36381
+ var NcClipRetentionPlanSchema = zod.z.object({
36382
+ rulesLoaded: zod.z.boolean(),
36383
+ asks: zod.z.array(NcClipRetentionAskSchema).readonly()
36384
+ });
36357
36385
  var notificationRulesCapability = {
36358
36386
  name: "notification-rules",
36359
36387
  scope: "system",
@@ -36386,6 +36414,23 @@ var require_dist_DaSCLJVH = __commonJS({
36386
36414
  auth: "admin"
36387
36415
  }),
36388
36416
  /**
36417
+ * WHAT THE RULES ACTUALLY ASK the stream broker to retain, per camera.
36418
+ *
36419
+ * The notification centre owns the rules, so it is the only thing that can
36420
+ * say how much history a camera's notifications will ever reach back for.
36421
+ * Before this the broker guessed — a flat minute on every camera — and
36422
+ * learned the PROFILE reactively, after the first clip had already been cut
36423
+ * from the wrong one. This is the same ask stated once, in front.
36424
+ *
36425
+ * A QUERY, pulled by each node's broker, not a push: brokers are per node
36426
+ * (a camera's ring lives wherever its stream is ingested) while this cap is
36427
+ * a singleton, so a push would have to enumerate the cluster. The pull also
36428
+ * makes the failure mode right — a broker that cannot reach the centre
36429
+ * keeps the plan it has, and a plan that has never arrived is UNKNOWN
36430
+ * rather than empty (D49: a read that fails changes nothing).
36431
+ */
36432
+ getClipRetentionAsks: method(zod.z.object({}), NcClipRetentionPlanSchema, { auth: "admin" }),
36433
+ /**
36389
36434
  * PERMANENT per-camera mute — the notifications half of the per-camera
36390
36435
  * function switch group ([D61](../../../../docs/decisions/adr-0067.md)).
36391
36436
  *
@@ -37545,6 +37590,7 @@ var require_dist_DaSCLJVH = __commonJS({
37545
37590
  });
37546
37591
  var TrackSourceSchema = zod.z.enum([
37547
37592
  "pipeline",
37593
+ "onboard",
37548
37594
  "sensor",
37549
37595
  "audio"
37550
37596
  ]);
@@ -38594,6 +38640,20 @@ var require_dist_DaSCLJVH = __commonJS({
38594
38640
  framesMatched: zod.z.number().int()
38595
38641
  });
38596
38642
  var RunReplayFrameProcessorResultSchema = zod.z.object({ tracks: zod.z.array(ReplayTrackSchema).readonly() });
38643
+ var AnalyticsLtsSeriesSchema = zod.z.enum([
38644
+ "motion",
38645
+ "audio-dbfs",
38646
+ "battery",
38647
+ "occupancy"
38648
+ ]);
38649
+ var LtsBucketSchema = zod.z.object({
38650
+ scope: zod.z.string(),
38651
+ bucketStart: zod.z.number().int(),
38652
+ samples: zod.z.number().int().nonnegative(),
38653
+ sum: zod.z.number(),
38654
+ min: zod.z.number(),
38655
+ max: zod.z.number()
38656
+ });
38597
38657
  var pipelineAnalyticsCapability = {
38598
38658
  name: "pipeline-analytics",
38599
38659
  scope: "device",
@@ -38737,6 +38797,30 @@ var require_dist_DaSCLJVH = __commonJS({
38737
38797
  getKeyEventsBatch: method(KeyEventBatchQueryInput, zod.z.array(KeyEventsForDeviceSchema).readonly()),
38738
38798
  /** Server-side bucketed event counts for the 24-hour timeline.
38739
38799
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
38800
+ /**
38801
+ * Read one camera's long-term series — 5-minute buckets, kept for a year.
38802
+ *
38803
+ * This is the history surface for every chart that used to be served from a
38804
+ * RAM ring: the ring dies with the process, cannot answer about last night,
38805
+ * and had a 60-minute horizon, while these rows are ~60 bytes and already
38806
+ * written. `scope` is the series' own dimension — for `occupancy`, spell it
38807
+ * with {@link occupancyScope} rather than by hand, and omit it to get every
38808
+ * scope back at once (the caller then groups with
38809
+ * {@link parseOccupancyScope}).
38810
+ *
38811
+ * Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
38812
+ * still returns the bucket it lands in — the alternative is a chart whose
38813
+ * last column silently disappears for five minutes out of every five.
38814
+ */
38815
+ readLongTermSeries: method(zod.z.object({
38816
+ deviceId: zod.z.number(),
38817
+ series: AnalyticsLtsSeriesSchema,
38818
+ /** Omit for EVERY scope of this series in the range. */
38819
+ scope: zod.z.string().optional(),
38820
+ from: zod.z.number(),
38821
+ to: zod.z.number(),
38822
+ limit: zod.z.number().int().positive().optional()
38823
+ }), zod.z.array(LtsBucketSchema).readonly()),
38740
38824
  getEventDensity: method(zod.z.object({
38741
38825
  deviceId: zod.z.number(),
38742
38826
  since: zod.z.number(),
@@ -39745,7 +39829,7 @@ var require_dist_DaSCLJVH = __commonJS({
39745
39829
  "device-activity"
39746
39830
  ]);
39747
39831
  var MotionSourcesSchema = zod.z.array(MotionSourceEnum);
39748
- var DetectionSourcesSchema = zod.z.array(DetectionSourceSchema);
39832
+ var DetectionSourcesSchema = zod.z.preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, zod.z.array(DetectionSourceSchema).max(1));
39749
39833
  var ReportMotionInputSchema = zod.z.object({
39750
39834
  deviceId: zod.z.number(),
39751
39835
  detected: zod.z.boolean(),
@@ -40053,6 +40137,12 @@ var require_dist_DaSCLJVH = __commonJS({
40053
40137
  queueDepth: zod.z.number(),
40054
40138
  frameLazy: FrameLazyMetricsSchema.optional()
40055
40139
  });
40140
+ var OccupancyBurstRefusalSchema = zod.z.enum([
40141
+ "not-attached",
40142
+ "battery-asleep",
40143
+ "not-watching",
40144
+ "already-bursting"
40145
+ ]);
40056
40146
  var pipelineRunnerCapability = {
40057
40147
  name: "pipeline-runner",
40058
40148
  scope: "system",
@@ -40089,6 +40179,50 @@ var require_dist_DaSCLJVH = __commonJS({
40089
40179
  /** List the deviceIds currently attached to this runner. */
40090
40180
  getLocalCameras: method(zod.z.void(), zod.z.array(zod.z.number()).readonly()),
40091
40181
  /**
40182
+ * Look at a camera NOW, out of band, because something just happened that
40183
+ * only a fresh look can settle.
40184
+ *
40185
+ * The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
40186
+ * still scene. It is the wrong instrument for a QUESTION that has just been
40187
+ * asked: on device 617 a parked car's departure was observed, a departure
40188
+ * strike was armed — and then the motion session ended, the strike decayed
40189
+ * after its 30 s TTL, and the next periodic look arrived up to five minutes
40190
+ * later with nothing left to confirm. Every one of those departures was
40191
+ * settled by the entry ageing out 6 to 10 minutes of observed time later,
40192
+ * and the notification's clip showed an empty space with nothing leaving
40193
+ * it.
40194
+ *
40195
+ * Two numbers make the ask specific, and a caller that ignores them wastes
40196
+ * the burst: a confirmation must land at least
40197
+ * `DEPARTURE_CONFIRM_MIN_GAP_MS` (3 s) after the read that armed the
40198
+ * strike — before that it is the same optical event and is refused — and
40199
+ * `DEPARTURE_ABSENCE_MIN_READS` (5) consecutive unassociated frames are
40200
+ * needed, while `occupancyRecheckFrames` defaults to FOUR. A burst of four
40201
+ * can never confirm an absence; that is why two periodic looks were always
40202
+ * required.
40203
+ *
40204
+ * The runner answers whether it actually started one. A refusal is NAMED,
40205
+ * never a silent `false`: a camera that is asleep on battery (D173 — this
40206
+ * must not become a self-initiated wake), detached, mid-session or already
40207
+ * bursting are four different facts, and a caller told only "no" cannot
40208
+ * tell a protection from a bug.
40209
+ */
40210
+ requestOccupancyBurst: method(zod.z.object({
40211
+ deviceId: zod.z.number(),
40212
+ /** How many frames to collect. The caller sizes this against what its
40213
+ * own confirmation needs; the runner clamps it to the field's range. */
40214
+ frames: zod.z.number().int().positive().optional(),
40215
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
40216
+ * defend — the periodic one at least has a timer to point at. */
40217
+ reason: zod.z.string()
40218
+ }), zod.z.object({
40219
+ started: zod.z.boolean(),
40220
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
40221
+ }), {
40222
+ auth: "admin",
40223
+ kind: "mutation"
40224
+ }),
40225
+ /**
40092
40226
  * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
40093
40227
  * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
40094
40228
  * the runner asks the decode worker still holding that frame's NATIVE
@@ -51841,7 +51975,28 @@ var require_dist_DaSCLJVH = __commonJS({
51841
51975
  /** Total tracked objects in this scope (frame / zone / unzoned). */
51842
51976
  totalObjects: zod.z.number().int().nonnegative(),
51843
51977
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
51844
- byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative())
51978
+ byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative()),
51979
+ /**
51980
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
51981
+ * present but not going anywhere (a parked car, a bin, a statue).
51982
+ *
51983
+ * The operator's question about a scene has two halves and they answer
51984
+ * different things: "what is parked here" is stable for hours and must not
51985
+ * flap, while "who is walking through" is the thing an alert is about. One
51986
+ * number could only serve one of them, and `totalObjects` served the first
51987
+ * badly — a passer-by moved it and every occupancy rule saw a change.
51988
+ *
51989
+ * `standing + transient === totalObjects`, always. The total keeps its old
51990
+ * meaning exactly, so no rule written against it changes behaviour.
51991
+ *
51992
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
51993
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
51994
+ * parked objects here" about a camera whose lot is full.
51995
+ */
51996
+ standingObjects: zod.z.number().int().nonnegative().optional(),
51997
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
51998
+ * same absence rule. */
51999
+ transientObjects: zod.z.number().int().nonnegative().optional()
51845
52000
  });
51846
52001
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
51847
52002
  zoneId: zod.z.string(),
@@ -55763,6 +55918,12 @@ var require_dist_DaSCLJVH = __commonJS({
55763
55918
  addonId: null,
55764
55919
  access: "view"
55765
55920
  },
55921
+ "notificationRules.getClipRetentionAsks": {
55922
+ capName: "notification-rules",
55923
+ capScope: "system",
55924
+ addonId: null,
55925
+ access: "view"
55926
+ },
55766
55927
  "notificationRules.getConditionCatalog": {
55767
55928
  capName: "notification-rules",
55768
55929
  capScope: "system",
@@ -56273,6 +56434,12 @@ var require_dist_DaSCLJVH = __commonJS({
56273
56434
  addonId: null,
56274
56435
  access: "create"
56275
56436
  },
56437
+ "pipelineAnalytics.readLongTermSeries": {
56438
+ capName: "pipeline-analytics",
56439
+ capScope: "device",
56440
+ addonId: null,
56441
+ access: "view"
56442
+ },
56276
56443
  "pipelineAnalytics.rebuildObjectEmbeddings": {
56277
56444
  capName: "pipeline-analytics",
56278
56445
  capScope: "device",
@@ -56945,6 +57112,12 @@ var require_dist_DaSCLJVH = __commonJS({
56945
57112
  addonId: null,
56946
57113
  access: "create"
56947
57114
  },
57115
+ "pipelineRunner.requestOccupancyBurst": {
57116
+ capName: "pipeline-runner",
57117
+ capScope: "system",
57118
+ addonId: null,
57119
+ access: "create"
57120
+ },
56948
57121
  "pipelineRunner.runDetailSubtree": {
56949
57122
  capName: "pipeline-runner",
56950
57123
  capScope: "system",
@@ -60089,6 +60262,11 @@ var require_dist_DaSCLJVH = __commonJS({
60089
60262
  form: "single",
60090
60263
  optional: false
60091
60264
  }],
60265
+ "pipelineAnalytics.readLongTermSeries": [{
60266
+ name: "deviceId",
60267
+ form: "single",
60268
+ optional: false
60269
+ }],
60092
60270
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
60093
60271
  name: "deviceId",
60094
60272
  form: "single",
@@ -60279,6 +60457,11 @@ var require_dist_DaSCLJVH = __commonJS({
60279
60457
  form: "single",
60280
60458
  optional: false
60281
60459
  }],
60460
+ "pipelineRunner.requestOccupancyBurst": [{
60461
+ name: "deviceId",
60462
+ form: "single",
60463
+ optional: false
60464
+ }],
60282
60465
  "pipelineRunner.runDetailSubtree": [{
60283
60466
  name: "deviceId",
60284
60467
  form: "single",
@@ -61947,12 +62130,6 @@ var require_dist_DaSCLJVH = __commonJS({
61947
62130
  return deriveBatteryPresence;
61948
62131
  }
61949
62132
  });
61950
- Object.defineProperty(exports, "describeCustomActions", {
61951
- enumerable: true,
61952
- get: function() {
61953
- return describeCustomActions;
61954
- }
61955
- });
61956
62133
  Object.defineProperty(exports, "deviceManagerCapability", {
61957
62134
  enumerable: true,
61958
62135
  get: function() {
@@ -62379,7 +62556,7 @@ var require_alerts_addon = __commonJS({
62379
62556
  [Symbol.toStringTag]: { value: "Module" }
62380
62557
  });
62381
62558
  require_chunk_Cek0wNdY();
62382
- var require_dist10 = require_dist_DaSCLJVH();
62559
+ var require_dist10 = require_dist_C6JIhqS6();
62383
62560
  function selectExpired(alerts, cutoffMs) {
62384
62561
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
62385
62562
  }
@@ -63198,7 +63375,7 @@ var require_console_logging = __commonJS({
63198
63375
  [Symbol.toStringTag]: { value: "Module" }
63199
63376
  });
63200
63377
  require_chunk_Cek0wNdY();
63201
- var require_dist10 = require_dist_DaSCLJVH();
63378
+ var require_dist10 = require_dist_C6JIhqS6();
63202
63379
  var require_formatter = require_formatter_DqAKDlvN();
63203
63380
  var LEVEL_RANK = {
63204
63381
  debug: 0,
@@ -63292,7 +63469,7 @@ var require_core_blocks_addon = __commonJS({
63292
63469
  "use strict";
63293
63470
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
63294
63471
  var require_chunk = require_chunk_Cek0wNdY();
63295
- var require_dist10 = require_dist_DaSCLJVH();
63472
+ var require_dist10 = require_dist_C6JIhqS6();
63296
63473
  var node_crypto = __require("crypto");
63297
63474
  var node_fs_promises = __require("fs/promises");
63298
63475
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -64189,11 +64366,11 @@ var require_core_blocks = __commonJS({
64189
64366
  }
64190
64367
  });
64191
64368
 
64192
- // ../system/dist/retired-settings-keys-CZISf623.js
64193
- var require_retired_settings_keys_CZISf623 = __commonJS({
64194
- "../system/dist/retired-settings-keys-CZISf623.js"(exports) {
64369
+ // ../system/dist/retired-settings-keys-C53Y2Q1C.js
64370
+ var require_retired_settings_keys_C53Y2Q1C = __commonJS({
64371
+ "../system/dist/retired-settings-keys-C53Y2Q1C.js"(exports) {
64195
64372
  "use strict";
64196
- var require_dist10 = require_dist_DaSCLJVH();
64373
+ var require_dist10 = require_dist_C6JIhqS6();
64197
64374
  function settingsStoreIsAuthoritativeHere(env) {
64198
64375
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
64199
64376
  return raw === "" || raw === "hub";
@@ -66430,8 +66607,8 @@ var require_device_manager_addon = __commonJS({
66430
66607
  [Symbol.toStringTag]: { value: "Module" }
66431
66608
  });
66432
66609
  require_chunk_Cek0wNdY();
66433
- var require_dist10 = require_dist_DaSCLJVH();
66434
- var require_retired_settings_keys = require_retired_settings_keys_CZISf623();
66610
+ var require_dist10 = require_dist_C6JIhqS6();
66611
+ var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
66435
66612
  var node_crypto = __require("crypto");
66436
66613
  var _camstack_types_node = require_node();
66437
66614
  var JOB_HISTORY = 20;
@@ -72141,7 +72318,7 @@ var require_hub_forwarder = __commonJS({
72141
72318
  [Symbol.toStringTag]: { value: "Module" }
72142
72319
  });
72143
72320
  require_chunk_Cek0wNdY();
72144
- var require_dist10 = require_dist_DaSCLJVH();
72321
+ var require_dist10 = require_dist_C6JIhqS6();
72145
72322
  var require_formatter = require_formatter_DqAKDlvN();
72146
72323
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
72147
72324
  var HubForwarderDestination = class {
@@ -72278,7 +72455,7 @@ var require_liveness_monitor_addon = __commonJS({
72278
72455
  "use strict";
72279
72456
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
72280
72457
  require_chunk_Cek0wNdY();
72281
- var require_dist10 = require_dist_DaSCLJVH();
72458
+ var require_dist10 = require_dist_C6JIhqS6();
72282
72459
  var NO_DEVICES = "liveness:no-devices";
72283
72460
  var ALL_OFFLINE = "liveness:all-devices-offline";
72284
72461
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -72474,7 +72651,7 @@ var require_local_auth_addon = __commonJS({
72474
72651
  [Symbol.toStringTag]: { value: "Module" }
72475
72652
  });
72476
72653
  var require_chunk = require_chunk_Cek0wNdY();
72477
- var require_dist10 = require_dist_DaSCLJVH();
72654
+ var require_dist10 = require_dist_C6JIhqS6();
72478
72655
  var node_crypto = __require("crypto");
72479
72656
  node_crypto = require_chunk.__toESM(node_crypto);
72480
72657
  var crypto$1 = __require("crypto");
@@ -80287,7 +80464,7 @@ var require_loki_logging = __commonJS({
80287
80464
  [Symbol.toStringTag]: { value: "Module" }
80288
80465
  });
80289
80466
  require_chunk_Cek0wNdY();
80290
- var require_dist10 = require_dist_DaSCLJVH();
80467
+ var require_dist10 = require_dist_C6JIhqS6();
80291
80468
  function sanitizeLabelName(raw) {
80292
80469
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
80293
80470
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -80874,7 +81051,7 @@ var require_native_metrics_addon = __commonJS({
80874
81051
  [Symbol.toStringTag]: { value: "Module" }
80875
81052
  });
80876
81053
  var require_chunk = require_chunk_Cek0wNdY();
80877
- var require_dist10 = require_dist_DaSCLJVH();
81054
+ var require_dist10 = require_dist_C6JIhqS6();
80878
81055
  var node_fs_promises = __require("fs/promises");
80879
81056
  var node_fs = __require("fs");
80880
81057
  node_fs = require_chunk.__toESM(node_fs);
@@ -83627,7 +83804,7 @@ var require_filesystem_storage_addon = __commonJS({
83627
83804
  [Symbol.toStringTag]: { value: "Module" }
83628
83805
  });
83629
83806
  var require_chunk = require_chunk_Cek0wNdY();
83630
- var require_dist10 = require_dist_DaSCLJVH();
83807
+ var require_dist10 = require_dist_C6JIhqS6();
83631
83808
  var node_crypto = __require("crypto");
83632
83809
  var node_fs_promises = __require("fs/promises");
83633
83810
  var node_path = __require("path");
@@ -84854,8 +85031,8 @@ var require_sqlite_settings_addon = __commonJS({
84854
85031
  [Symbol.toStringTag]: { value: "Module" }
84855
85032
  });
84856
85033
  var require_chunk = require_chunk_Cek0wNdY();
84857
- var require_dist10 = require_dist_DaSCLJVH();
84858
- var require_retired_settings_keys = require_retired_settings_keys_CZISf623();
85034
+ var require_dist10 = require_dist_C6JIhqS6();
85035
+ var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
84859
85036
  var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
84860
85037
  var node_crypto = __require("crypto");
84861
85038
  var node_path = __require("path");
@@ -87642,7 +87819,7 @@ var require_storage_orchestrator_addon = __commonJS({
87642
87819
  [Symbol.toStringTag]: { value: "Module" }
87643
87820
  });
87644
87821
  var require_chunk = require_chunk_Cek0wNdY();
87645
- var require_dist10 = require_dist_DaSCLJVH();
87822
+ var require_dist10 = require_dist_C6JIhqS6();
87646
87823
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
87647
87824
  var zod = require_zod();
87648
87825
  var node_crypto = __require("crypto");
@@ -91369,7 +91546,7 @@ var require_system_config_addon = __commonJS({
91369
91546
  [Symbol.toStringTag]: { value: "Module" }
91370
91547
  });
91371
91548
  require_chunk_Cek0wNdY();
91372
- var require_dist10 = require_dist_DaSCLJVH();
91549
+ var require_dist10 = require_dist_C6JIhqS6();
91373
91550
  var SECTION_TITLES = {
91374
91551
  server: "Server",
91375
91552
  auth: "Authentication"
@@ -109430,7 +109607,7 @@ var require_winston_logging = __commonJS({
109430
109607
  [Symbol.toStringTag]: { value: "Module" }
109431
109608
  });
109432
109609
  var require_chunk = require_chunk_Cek0wNdY();
109433
- var require_dist10 = require_dist_DaSCLJVH();
109610
+ var require_dist10 = require_dist_C6JIhqS6();
109434
109611
  var require_formatter = require_formatter_DqAKDlvN();
109435
109612
  var node_path = __require("path");
109436
109613
  node_path = require_chunk.__toESM(node_path);
@@ -111468,9 +111645,9 @@ var require_event_category_BVfsrBYA = __commonJS({
111468
111645
  }
111469
111646
  });
111470
111647
 
111471
- // ../types/dist/sleep-B8nfmQ8a.js
111472
- var require_sleep_B8nfmQ8a = __commonJS({
111473
- "../types/dist/sleep-B8nfmQ8a.js"(exports) {
111648
+ // ../types/dist/sleep-DqtlfkSS.js
111649
+ var require_sleep_DqtlfkSS = __commonJS({
111650
+ "../types/dist/sleep-DqtlfkSS.js"(exports) {
111474
111651
  "use strict";
111475
111652
  var require_event_category = require_event_category_BVfsrBYA();
111476
111653
  var zod = require_zod();
@@ -113548,6 +113725,41 @@ var require_sleep_B8nfmQ8a = __commonJS({
113548
113725
  DeviceRole2["GenericNotifier"] = "generic-notifier";
113549
113726
  return DeviceRole2;
113550
113727
  })({});
113728
+ function defineCustomActions(spec) {
113729
+ return spec;
113730
+ }
113731
+ function customAction(input, output, options) {
113732
+ return {
113733
+ input,
113734
+ output,
113735
+ kind: options?.kind ?? "query",
113736
+ auth: options?.auth ?? "protected",
113737
+ scope: options?.scope ?? { kind: "system" },
113738
+ ...options?.caller ? { caller: "required" } : {}
113739
+ };
113740
+ }
113741
+ function deviceCustomAction(input, output, options) {
113742
+ return {
113743
+ input,
113744
+ output,
113745
+ kind: options?.kind ?? "query",
113746
+ auth: options?.auth ?? "protected",
113747
+ scope: {
113748
+ kind: "device",
113749
+ ...options?.deviceTypes ? { deviceTypes: options.deviceTypes } : {}
113750
+ }
113751
+ };
113752
+ }
113753
+ function describeCustomActions(catalog) {
113754
+ const out = {};
113755
+ for (const [name, spec] of Object.entries(catalog)) out[name] = {
113756
+ kind: spec.kind,
113757
+ auth: spec.auth,
113758
+ scope: spec.scope,
113759
+ ...spec.caller === "required" ? { caller: "required" } : {}
113760
+ };
113761
+ return out;
113762
+ }
113551
113763
  var DEVICE_CHILDREN_BATCH_MAX = 256;
113552
113764
  var StaticDirOutputSchema = zod.z.object({ staticDir: zod.z.string() });
113553
113765
  var VersionOutputSchema = zod.z.object({ version: zod.z.string() });
@@ -114211,6 +114423,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
114211
114423
  updateRule: (input) => dispatch("notification-rules", "notificationRules", "updateRule", "mutation", input),
114212
114424
  deleteRule: (input) => dispatch("notification-rules", "notificationRules", "deleteRule", "mutation", input),
114213
114425
  setRuleEnabled: (input) => dispatch("notification-rules", "notificationRules", "setRuleEnabled", "mutation", input),
114426
+ getClipRetentionAsks: (input) => dispatch("notification-rules", "notificationRules", "getClipRetentionAsks", "query", input),
114214
114427
  listDeviceMutes: (input) => dispatch("notification-rules", "notificationRules", "listDeviceMutes", "query", input),
114215
114428
  setDeviceMuted: (input) => dispatch("notification-rules", "notificationRules", "setDeviceMuted", "mutation", input),
114216
114429
  testRule: (input) => dispatch("notification-rules", "notificationRules", "testRule", "mutation", input),
@@ -114263,6 +114476,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
114263
114476
  getSensorEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getSensorEvents", "query", input),
114264
114477
  getKeyEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getKeyEvents", "query", input),
114265
114478
  getKeyEventsBatch: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getKeyEventsBatch", "query", input),
114479
+ readLongTermSeries: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "readLongTermSeries", "query", input),
114266
114480
  getEventDensity: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventDensity", "query", input),
114267
114481
  getEventDensityBatch: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventDensityBatch", "query", input),
114268
114482
  pruneEventsBefore: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneEventsBefore", "mutation", input),
@@ -114563,6 +114777,7 @@ var require_sleep_B8nfmQ8a = __commonJS({
114563
114777
  pipelineRunner: {
114564
114778
  detachCamera: (input) => dispatchSystem("pipelineRunner", "detachCamera", "mutation", input),
114565
114779
  getCameraMetrics: (input) => dispatchSystem("pipelineRunner", "getCameraMetrics", "query", input),
114780
+ requestOccupancyBurst: (input) => dispatchSystem("pipelineRunner", "requestOccupancyBurst", "mutation", input),
114566
114781
  runDetailSubtree: (input) => dispatchSystem("pipelineRunner", "runDetailSubtree", "mutation", input),
114567
114782
  parkTrackFrame: (input) => dispatchSystem("pipelineRunner", "parkTrackFrame", "mutation", input),
114568
114783
  getParkedTrackFrame: (input) => dispatchSystem("pipelineRunner", "getParkedTrackFrame", "query", input),
@@ -115115,6 +115330,30 @@ var require_sleep_B8nfmQ8a = __commonJS({
115115
115330
  return createSliceHandle;
115116
115331
  }
115117
115332
  });
115333
+ Object.defineProperty(exports, "customAction", {
115334
+ enumerable: true,
115335
+ get: function() {
115336
+ return customAction;
115337
+ }
115338
+ });
115339
+ Object.defineProperty(exports, "defineCustomActions", {
115340
+ enumerable: true,
115341
+ get: function() {
115342
+ return defineCustomActions;
115343
+ }
115344
+ });
115345
+ Object.defineProperty(exports, "describeCustomActions", {
115346
+ enumerable: true,
115347
+ get: function() {
115348
+ return describeCustomActions;
115349
+ }
115350
+ });
115351
+ Object.defineProperty(exports, "deviceCustomAction", {
115352
+ enumerable: true,
115353
+ get: function() {
115354
+ return deviceCustomAction;
115355
+ }
115356
+ });
115118
115357
  Object.defineProperty(exports, "deviceOpsCapability", {
115119
115358
  enumerable: true,
115120
115359
  get: function() {
@@ -115309,7 +115548,7 @@ var require_addon = __commonJS({
115309
115548
  "../types/dist/addon.js"(exports) {
115310
115549
  "use strict";
115311
115550
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
115312
- var require_sleep = require_sleep_B8nfmQ8a();
115551
+ var require_sleep = require_sleep_DqtlfkSS();
115313
115552
  var require_event_category = require_event_category_BVfsrBYA();
115314
115553
  var require_err_msg = require_err_msg_COpsHMw2();
115315
115554
  var CAP_INPUT_DEFAULTS = Object.freeze({
@@ -115622,6 +115861,7 @@ var require_addon = __commonJS({
115622
115861
  exports.asString = require_sleep.asString;
115623
115862
  exports.createDeviceProxy = require_sleep.createDeviceProxy;
115624
115863
  exports.createEventBusSliceSource = require_sleep.createEventBusSliceSource;
115864
+ exports.describeCustomActions = require_sleep.describeCustomActions;
115625
115865
  exports.deviceOpsCapability = require_sleep.deviceOpsCapability;
115626
115866
  exports.emitReadiness = require_sleep.emitReadiness;
115627
115867
  exports.errMsg = require_err_msg.errMsg;
@@ -122176,9 +122416,9 @@ var require_dist2 = __commonJS({
122176
122416
  }
122177
122417
  });
122178
122418
 
122179
- // ../system/dist/manifest-system-deps-CrSP0Kkp.js
122180
- var require_manifest_system_deps_CrSP0Kkp = __commonJS({
122181
- "../system/dist/manifest-system-deps-CrSP0Kkp.js"(exports) {
122419
+ // ../system/dist/manifest-system-deps-CzyjTMcO.js
122420
+ var require_manifest_system_deps_CzyjTMcO = __commonJS({
122421
+ "../system/dist/manifest-system-deps-CzyjTMcO.js"(exports) {
122182
122422
  "use strict";
122183
122423
  var require_chunk = require_chunk_Cek0wNdY();
122184
122424
  require_hub_cap_forward_DmHNjbB0();
@@ -127283,10 +127523,104 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
127283
127523
  function __resetCapUsageRegistryForTests() {
127284
127524
  singleton = null;
127285
127525
  }
127526
+ var MIRROR_REASON_BY_CATEGORY = new Map([
127527
+ {
127528
+ category: "device.state-changed",
127529
+ reason: "Device runtime-state mirror, 69.1 % of fleet traffic. Each event is a snapshot of the slice AFTER the change; the superseded snapshot describes a state the device is no longer in, and every consumer (SystemMirror, DeviceStateHandle) reads the latest one only."
127530
+ },
127531
+ {
127532
+ category: "camera-streams.onCamStreamsChanged",
127533
+ reason: "Full stream-list snapshot per camera, 20.1 % of fleet traffic. The payload is the complete current list, not a delta, so an older list is strictly less true than the newer one."
127534
+ },
127535
+ {
127536
+ category: "system.ready-state",
127537
+ reason: "Readiness is a LEVEL, not an edge: the event reports whether a capability is ready right now. Declared for the case where it carries a deviceId; when it does not it stays in the global ring like any other unattributed event."
127538
+ }
127539
+ ].map((m) => [m.category, m.reason]));
127540
+ function isMirrorCategory(category) {
127541
+ return MIRROR_REASON_BY_CATEGORY.has(category);
127542
+ }
127543
+ var MAX_DEVICE_RING_EVENTS = 2e3;
127544
+ function serializePayload(data) {
127545
+ try {
127546
+ const json = JSON.stringify(data);
127547
+ if (typeof json !== "string") return null;
127548
+ return {
127549
+ json,
127550
+ bytes: Buffer.byteLength(json, "utf8")
127551
+ };
127552
+ } catch {
127553
+ return null;
127554
+ }
127555
+ }
127556
+ function capEventData(event) {
127557
+ const serialized = serializePayload(event.data);
127558
+ if (serialized !== null && serialized.bytes <= 256) return event;
127559
+ const truncated = {
127560
+ __truncated: true,
127561
+ __originalBytes: serialized?.bytes ?? null,
127562
+ __preview: serialized === null ? "" : serialized.json.slice(0, 160)
127563
+ };
127564
+ return {
127565
+ ...event,
127566
+ data: truncated
127567
+ };
127568
+ }
127569
+ function eventDeviceId(event) {
127570
+ const explicit = event.source.deviceId;
127571
+ if (explicit !== void 0) return Number.isFinite(explicit) ? explicit : void 0;
127572
+ if (event.source.type !== "device") return void 0;
127573
+ const asNumber = Number(event.source.id);
127574
+ return Number.isFinite(asNumber) ? asNumber : void 0;
127575
+ }
127576
+ function createDeviceEventRings() {
127577
+ return { byDevice: /* @__PURE__ */ new Map() };
127578
+ }
127579
+ function ringFor(rings, deviceId) {
127580
+ const existing = rings.byDevice.get(deviceId);
127581
+ if (existing !== void 0) {
127582
+ rings.byDevice.delete(deviceId);
127583
+ rings.byDevice.set(deviceId, existing);
127584
+ return existing;
127585
+ }
127586
+ const created = {
127587
+ history: [],
127588
+ mirrors: /* @__PURE__ */ new Map()
127589
+ };
127590
+ rings.byDevice.set(deviceId, created);
127591
+ while (rings.byDevice.size > 512) {
127592
+ const oldest = rings.byDevice.keys().next();
127593
+ if (oldest.done === true) break;
127594
+ rings.byDevice.delete(oldest.value);
127595
+ }
127596
+ return created;
127597
+ }
127598
+ function recordDeviceEvent(rings, event) {
127599
+ const deviceId = eventDeviceId(event);
127600
+ if (deviceId === void 0) return void 0;
127601
+ const ring = ringFor(rings, deviceId);
127602
+ const retained = capEventData(event);
127603
+ if (isMirrorCategory(event.category)) {
127604
+ ring.mirrors.set(event.category, retained);
127605
+ return deviceId;
127606
+ }
127607
+ ring.history.push(retained);
127608
+ if (ring.history.length > 2e3) ring.history.splice(0, ring.history.length - MAX_DEVICE_RING_EVENTS);
127609
+ return deviceId;
127610
+ }
127611
+ function getDeviceRecent(rings, deviceId) {
127612
+ const ring = rings.byDevice.get(deviceId);
127613
+ if (ring === void 0) return [];
127614
+ if (ring.mirrors.size === 0) return ring.history;
127615
+ const merged = [...ring.history, ...ring.mirrors.values()];
127616
+ merged.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
127617
+ return merged;
127618
+ }
127286
127619
  function createSharedBusState(retainRecent = false) {
127287
127620
  return {
127288
127621
  handlers: /* @__PURE__ */ new Map(),
127289
127622
  recent: [],
127623
+ deviceRings: createDeviceEventRings(),
127290
127624
  retainRecent
127291
127625
  };
127292
127626
  }
@@ -127394,6 +127728,7 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
127394
127728
  if (state.retainRecent && !isHighFrequencyCategory(event.category)) {
127395
127729
  state.recent.push(event);
127396
127730
  if (state.recent.length > 1e3) state.recent.splice(0, state.recent.length - MAX_RECENT_EVENTS);
127731
+ recordDeviceEvent(state.deviceRings, event);
127397
127732
  }
127398
127733
  const delivered = /* @__PURE__ */ new Set();
127399
127734
  for (const [pattern, set] of state.handlers) {
@@ -129788,14 +130123,15 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
129788
130123
  });
129789
130124
  },
129790
130125
  getRecent(filter, limit) {
129791
- const filtered = filter ? state.recent.filter((e) => {
130126
+ const source = filter?.deviceId !== void 0 ? getDeviceRecent(state.deviceRings, filter.deviceId) : state.recent;
130127
+ const filtered = filter ? source.filter((e) => {
129792
130128
  const cat = filter.category;
129793
130129
  if (cat) {
129794
130130
  const categories = typeof cat === "string" ? [cat] : Array.isArray(cat) ? cat : [];
129795
130131
  if (categories.length > 0 && !categories.some((c) => matchesPattern(String(c), e.category))) return false;
129796
130132
  }
129797
130133
  return matchesEventFilter(e, filter);
129798
- }) : state.recent;
130134
+ }) : source;
129799
130135
  return limit !== void 0 ? filtered.slice(-limit) : filtered;
129800
130136
  }
129801
130137
  };
@@ -131720,11 +132056,11 @@ var require_manifest_system_deps_CrSP0Kkp = __commonJS({
131720
132056
  }
131721
132057
  });
131722
132058
 
131723
- // ../system/dist/custom-action-registry-DG-QIWxd.js
131724
- var require_custom_action_registry_DG_QIWxd = __commonJS({
131725
- "../system/dist/custom-action-registry-DG-QIWxd.js"(exports) {
132059
+ // ../system/dist/custom-action-registry-acBY3mHA.js
132060
+ var require_custom_action_registry_acBY3mHA = __commonJS({
132061
+ "../system/dist/custom-action-registry-acBY3mHA.js"(exports) {
131726
132062
  "use strict";
131727
- var require_dist10 = require_dist_DaSCLJVH();
132063
+ var _camstack_types_addon = require_addon();
131728
132064
  var CustomActionRegistry = class {
131729
132065
  byAddon = /* @__PURE__ */ new Map();
131730
132066
  registerAddon(addonId, catalog, handler) {
@@ -131765,7 +132101,7 @@ var require_custom_action_registry_DG_QIWxd = __commonJS({
131765
132101
  for (const [addonId, actions] of this.byAddon) {
131766
132102
  const catalog = {};
131767
132103
  for (const [name, entry] of actions) catalog[name] = entry.spec;
131768
- out[addonId] = require_dist10.describeCustomActions(catalog);
132104
+ out[addonId] = (0, _camstack_types_addon.describeCustomActions)(catalog);
131769
132105
  }
131770
132106
  return out;
131771
132107
  }
@@ -135538,7 +135874,7 @@ var require_dist3 = __commonJS({
135538
135874
  "use strict";
135539
135875
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
135540
135876
  var require_chunk = require_chunk_Cek0wNdY();
135541
- var require_dist10 = require_dist_DaSCLJVH();
135877
+ var require_dist10 = require_dist_C6JIhqS6();
135542
135878
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
135543
135879
  require_alerts();
135544
135880
  var require_formatter = require_formatter_DqAKDlvN();
@@ -135565,9 +135901,9 @@ var require_dist3 = __commonJS({
135565
135901
  var require_builtins_winston_logging_index = require_winston_logging();
135566
135902
  var require_event_loop_stall_monitor = require_event_loop_stall_monitor_CAsHdMwP();
135567
135903
  var require_tls$1 = require_tls_BFs4PzoW();
135568
- var require_manifest_system_deps = require_manifest_system_deps_CrSP0Kkp();
135904
+ var require_manifest_system_deps = require_manifest_system_deps_CzyjTMcO();
135569
135905
  var require_resource_monitor = require_resource_monitor_LVE1BoLs();
135570
- var require_custom_action_registry = require_custom_action_registry_DG_QIWxd();
135906
+ var require_custom_action_registry = require_custom_action_registry_acBY3mHA();
135571
135907
  var zod = require_zod();
135572
135908
  var node_crypto = __require("crypto");
135573
135909
  var _camstack_types_node = require_node();
@@ -216676,7 +217012,7 @@ var require_dist4 = __commonJS({
216676
217012
  "../types/dist/index.js"(exports) {
216677
217013
  "use strict";
216678
217014
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
216679
- var require_sleep = require_sleep_B8nfmQ8a();
217015
+ var require_sleep = require_sleep_DqtlfkSS();
216680
217016
  var require_event_category = require_event_category_BVfsrBYA();
216681
217017
  var require_canonical_hash = require_canonical_hash_9lydiEzx();
216682
217018
  var require_enums2 = require_enums();
@@ -219486,6 +219822,49 @@ var require_dist4 = __commonJS({
219486
219822
  pixels: entry.resolution.width * entry.resolution.height
219487
219823
  }])].sort((a, b) => compareToTarget(a.pixels, b.pixels, targetPixels))[0]?.entry;
219488
219824
  }
219825
+ var OVERLAY_LAYERS = [
219826
+ "motion",
219827
+ "objects",
219828
+ "discarded",
219829
+ "stationary"
219830
+ ];
219831
+ var DEFAULT_OVERLAY_LAYERS = [
219832
+ "motion",
219833
+ "objects",
219834
+ "stationary"
219835
+ ];
219836
+ var STATIONARY_OVERLAY_STYLE = {
219837
+ /** Border width in px, at the surface's own scale. */
219838
+ borderWidth: 2,
219839
+ /** Dashed, not solid — the census is not a live detection. */
219840
+ dashed: true,
219841
+ /** Dash on/off lengths in px, for a renderer that needs them explicitly
219842
+ * (React Native cannot express `border-dashed` without them). */
219843
+ dashPattern: [6, 4],
219844
+ /**
219845
+ * FULL opacity, deliberately.
219846
+ *
219847
+ * This was 0.7, to make a parked car quieter than a live subject. It made it
219848
+ * quieter by lying about its colour: a class hue at 70% over a dark frame
219849
+ * reads as a different hue, and the operator saw the census boxes as the
219850
+ * wrong colour — which they effectively were.
219851
+ *
219852
+ * The dash already says "censused", and it says it without touching the
219853
+ * hue. Two signals for one fact was one too many, and the one that had to go
219854
+ * is the one that corrupts a value the rest of the system agrees on: the
219855
+ * class colour comes from `EVENT_TAXONOMY` and must reach the screen intact
219856
+ * on every surface, or the palette is shared in name only.
219857
+ */
219858
+ opacity: 1,
219859
+ /** Corner radius in px. */
219860
+ borderRadius: 2
219861
+ };
219862
+ function formatParkedFor(ms) {
219863
+ if (!Number.isFinite(ms) || ms <= 0) return "0 s";
219864
+ if (ms < 6e4) return `${String(Math.round(ms / 1e3))} s`;
219865
+ if (ms < 36e5) return `${String(Math.round(ms / 6e4))} min`;
219866
+ return `${String(Math.round(ms / 36e5))} h`;
219867
+ }
219489
219868
  var FORMAT_KEYS = [
219490
219869
  "onnx",
219491
219870
  "coreml",
@@ -222370,6 +222749,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
222370
222749
  mode: "singleton",
222371
222750
  deviceTypes: Object.values(require_sleep.DeviceType),
222372
222751
  runtimeState: StreamSignalsStatusSchema,
222752
+ /**
222753
+ * Runtime-state durability: **session** — mirrored in RAM, never written.
222754
+ *
222755
+ * The slice holds what the DEVICE says it can emit. That is a probed fact,
222756
+ * not an operator choice: the provider re-declares it on every registration,
222757
+ * so losing it loses nothing and persisting it would freeze an answer the
222758
+ * camera is entitled to change. Measured the same day on the sibling case —
222759
+ * `native-object-detection.supportedClasses` was persisted, and a firmware
222760
+ * class the camera really detected stayed missing for the life of the row
222761
+ * because the fix could not reach it.
222762
+ *
222763
+ * See `RuntimeStateDurability`. Enforced by
222764
+ * `scripts/check-runtime-state-durability.ts`.
222765
+ */
222766
+ durability: "session",
222373
222767
  methods: {
222374
222768
  /**
222375
222769
  * What this device can emit. Empty is a valid and common answer — most
@@ -223634,41 +224028,6 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
223634
224028
  })) }), { auth: "admin" })
223635
224029
  }
223636
224030
  };
223637
- function defineCustomActions(spec) {
223638
- return spec;
223639
- }
223640
- function customAction(input, output, options) {
223641
- return {
223642
- input,
223643
- output,
223644
- kind: options?.kind ?? "query",
223645
- auth: options?.auth ?? "protected",
223646
- scope: options?.scope ?? { kind: "system" },
223647
- ...options?.caller ? { caller: "required" } : {}
223648
- };
223649
- }
223650
- function deviceCustomAction(input, output, options) {
223651
- return {
223652
- input,
223653
- output,
223654
- kind: options?.kind ?? "query",
223655
- auth: options?.auth ?? "protected",
223656
- scope: {
223657
- kind: "device",
223658
- ...options?.deviceTypes ? { deviceTypes: options.deviceTypes } : {}
223659
- }
223660
- };
223661
- }
223662
- function describeCustomActions(catalog) {
223663
- const out = {};
223664
- for (const [name, spec] of Object.entries(catalog)) out[name] = {
223665
- kind: spec.kind,
223666
- auth: spec.auth,
223667
- scope: spec.scope,
223668
- ...spec.caller === "required" ? { caller: "required" } : {}
223669
- };
223670
- return out;
223671
- }
223672
224031
  var CustomModelDescriptorSchema = zod.z.object({
223673
224032
  stepId: zod.z.string(),
223674
224033
  entry: ModelCatalogEntrySchema
@@ -230190,6 +230549,30 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
230190
230549
  settings: NcAlarmSettingsSchema,
230191
230550
  coverage: zod.z.array(NcAlarmModeCoverageSchema)
230192
230551
  });
230552
+ var NC_CLIP_RETENTION_MAX_SEC = 60;
230553
+ var NcClipRetentionAskSchema = zod.z.object({
230554
+ /**
230555
+ * The camera this ask is about. **Absent = every camera**, which is what a
230556
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
230557
+ * asking everywhere.
230558
+ */
230559
+ deviceId: zod.z.number().int().nonnegative().optional(),
230560
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
230561
+ * needs nothing produces no ask at all. */
230562
+ seconds: zod.z.number().min(0).max(60),
230563
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
230564
+ * assigned, which is what the cut defaults to. */
230565
+ profile: require_sleep.CamProfileSchema.optional(),
230566
+ /** Who is asking — so a retention the operator did not expect names a rule. */
230567
+ ruleId: zod.z.string(),
230568
+ ruleName: zod.z.string(),
230569
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
230570
+ reason: zod.z.enum(["window", "occupancy"])
230571
+ });
230572
+ var NcClipRetentionPlanSchema = zod.z.object({
230573
+ rulesLoaded: zod.z.boolean(),
230574
+ asks: zod.z.array(NcClipRetentionAskSchema).readonly()
230575
+ });
230193
230576
  var notificationRulesCapability = {
230194
230577
  name: "notification-rules",
230195
230578
  scope: "system",
@@ -230222,6 +230605,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
230222
230605
  auth: "admin"
230223
230606
  }),
230224
230607
  /**
230608
+ * WHAT THE RULES ACTUALLY ASK the stream broker to retain, per camera.
230609
+ *
230610
+ * The notification centre owns the rules, so it is the only thing that can
230611
+ * say how much history a camera's notifications will ever reach back for.
230612
+ * Before this the broker guessed — a flat minute on every camera — and
230613
+ * learned the PROFILE reactively, after the first clip had already been cut
230614
+ * from the wrong one. This is the same ask stated once, in front.
230615
+ *
230616
+ * A QUERY, pulled by each node's broker, not a push: brokers are per node
230617
+ * (a camera's ring lives wherever its stream is ingested) while this cap is
230618
+ * a singleton, so a push would have to enumerate the cluster. The pull also
230619
+ * makes the failure mode right — a broker that cannot reach the centre
230620
+ * keeps the plan it has, and a plan that has never arrived is UNKNOWN
230621
+ * rather than empty (D49: a read that fails changes nothing).
230622
+ */
230623
+ getClipRetentionAsks: require_sleep.method(zod.z.object({}), NcClipRetentionPlanSchema, { auth: "admin" }),
230624
+ /**
230225
230625
  * PERMANENT per-camera mute — the notifications half of the per-camera
230226
230626
  * function switch group ([D61](../../../../docs/decisions/adr-0067.md)).
230227
230627
  *
@@ -231381,6 +231781,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
231381
231781
  });
231382
231782
  var TrackSourceSchema = zod.z.enum([
231383
231783
  "pipeline",
231784
+ "onboard",
231384
231785
  "sensor",
231385
231786
  "audio"
231386
231787
  ]);
@@ -232435,6 +232836,33 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
232435
232836
  framesMatched: zod.z.number().int()
232436
232837
  });
232437
232838
  var RunReplayFrameProcessorResultSchema = zod.z.object({ tracks: zod.z.array(ReplayTrackSchema).readonly() });
232839
+ var AnalyticsLtsSeriesSchema = zod.z.enum([
232840
+ "motion",
232841
+ "audio-dbfs",
232842
+ "battery",
232843
+ "occupancy"
232844
+ ]);
232845
+ var LTS_SCOPE_CLASS_SEPARATOR = "|";
232846
+ function occupancyScope(zoneId, className) {
232847
+ const place = zoneId ?? "";
232848
+ return className === void 0 ? place : `${place}|${className}`;
232849
+ }
232850
+ function parseOccupancyScope(scope) {
232851
+ const at = scope.indexOf("|");
232852
+ if (at < 0) return { zoneId: scope };
232853
+ return {
232854
+ zoneId: scope.slice(0, at),
232855
+ className: scope.slice(at + 1)
232856
+ };
232857
+ }
232858
+ var LtsBucketSchema = zod.z.object({
232859
+ scope: zod.z.string(),
232860
+ bucketStart: zod.z.number().int(),
232861
+ samples: zod.z.number().int().nonnegative(),
232862
+ sum: zod.z.number(),
232863
+ min: zod.z.number(),
232864
+ max: zod.z.number()
232865
+ });
232438
232866
  var pipelineAnalyticsCapability = {
232439
232867
  name: "pipeline-analytics",
232440
232868
  scope: "device",
@@ -232578,6 +233006,30 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
232578
233006
  getKeyEventsBatch: require_sleep.method(KeyEventBatchQueryInput, zod.z.array(KeyEventsForDeviceSchema).readonly()),
232579
233007
  /** Server-side bucketed event counts for the 24-hour timeline.
232580
233008
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
233009
+ /**
233010
+ * Read one camera's long-term series — 5-minute buckets, kept for a year.
233011
+ *
233012
+ * This is the history surface for every chart that used to be served from a
233013
+ * RAM ring: the ring dies with the process, cannot answer about last night,
233014
+ * and had a 60-minute horizon, while these rows are ~60 bytes and already
233015
+ * written. `scope` is the series' own dimension — for `occupancy`, spell it
233016
+ * with {@link occupancyScope} rather than by hand, and omit it to get every
233017
+ * scope back at once (the caller then groups with
233018
+ * {@link parseOccupancyScope}).
233019
+ *
233020
+ * Bounds are inclusive on the BUCKET START, so a range that ends mid-bucket
233021
+ * still returns the bucket it lands in — the alternative is a chart whose
233022
+ * last column silently disappears for five minutes out of every five.
233023
+ */
233024
+ readLongTermSeries: require_sleep.method(zod.z.object({
233025
+ deviceId: zod.z.number(),
233026
+ series: AnalyticsLtsSeriesSchema,
233027
+ /** Omit for EVERY scope of this series in the range. */
233028
+ scope: zod.z.string().optional(),
233029
+ from: zod.z.number(),
233030
+ to: zod.z.number(),
233031
+ limit: zod.z.number().int().positive().optional()
233032
+ }), zod.z.array(LtsBucketSchema).readonly()),
232581
233033
  getEventDensity: require_sleep.method(zod.z.object({
232582
233034
  deviceId: zod.z.number(),
232583
233035
  since: zod.z.number(),
@@ -233586,7 +234038,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
233586
234038
  "device-activity"
233587
234039
  ]);
233588
234040
  var MotionSourcesSchema = zod.z.array(MotionSourceEnum);
233589
- var DetectionSourcesSchema = zod.z.array(DetectionSourceSchema);
234041
+ var DetectionSourcesSchema = zod.z.preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, zod.z.array(DetectionSourceSchema).max(1));
233590
234042
  var ReportMotionInputSchema = zod.z.object({
233591
234043
  deviceId: zod.z.number(),
233592
234044
  detected: zod.z.boolean(),
@@ -234080,6 +234532,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
234080
234532
  queueDepth: zod.z.number(),
234081
234533
  frameLazy: FrameLazyMetricsSchema.optional()
234082
234534
  });
234535
+ var OccupancyBurstRefusalSchema = zod.z.enum([
234536
+ "not-attached",
234537
+ "battery-asleep",
234538
+ "not-watching",
234539
+ "already-bursting"
234540
+ ]);
234083
234541
  var pipelineRunnerCapability = {
234084
234542
  name: "pipeline-runner",
234085
234543
  scope: "system",
@@ -234116,6 +234574,50 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
234116
234574
  /** List the deviceIds currently attached to this runner. */
234117
234575
  getLocalCameras: require_sleep.method(zod.z.void(), zod.z.array(zod.z.number()).readonly()),
234118
234576
  /**
234577
+ * Look at a camera NOW, out of band, because something just happened that
234578
+ * only a fresh look can settle.
234579
+ *
234580
+ * The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
234581
+ * still scene. It is the wrong instrument for a QUESTION that has just been
234582
+ * asked: on device 617 a parked car's departure was observed, a departure
234583
+ * strike was armed — and then the motion session ended, the strike decayed
234584
+ * after its 30 s TTL, and the next periodic look arrived up to five minutes
234585
+ * later with nothing left to confirm. Every one of those departures was
234586
+ * settled by the entry ageing out 6 to 10 minutes of observed time later,
234587
+ * and the notification's clip showed an empty space with nothing leaving
234588
+ * it.
234589
+ *
234590
+ * Two numbers make the ask specific, and a caller that ignores them wastes
234591
+ * the burst: a confirmation must land at least
234592
+ * `DEPARTURE_CONFIRM_MIN_GAP_MS` (3 s) after the read that armed the
234593
+ * strike — before that it is the same optical event and is refused — and
234594
+ * `DEPARTURE_ABSENCE_MIN_READS` (5) consecutive unassociated frames are
234595
+ * needed, while `occupancyRecheckFrames` defaults to FOUR. A burst of four
234596
+ * can never confirm an absence; that is why two periodic looks were always
234597
+ * required.
234598
+ *
234599
+ * The runner answers whether it actually started one. A refusal is NAMED,
234600
+ * never a silent `false`: a camera that is asleep on battery (D173 — this
234601
+ * must not become a self-initiated wake), detached, mid-session or already
234602
+ * bursting are four different facts, and a caller told only "no" cannot
234603
+ * tell a protection from a bug.
234604
+ */
234605
+ requestOccupancyBurst: require_sleep.method(zod.z.object({
234606
+ deviceId: zod.z.number(),
234607
+ /** How many frames to collect. The caller sizes this against what its
234608
+ * own confirmation needs; the runner clamps it to the field's range. */
234609
+ frames: zod.z.number().int().positive().optional(),
234610
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
234611
+ * defend — the periodic one at least has a timer to point at. */
234612
+ reason: zod.z.string()
234613
+ }), zod.z.object({
234614
+ started: zod.z.boolean(),
234615
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
234616
+ }), {
234617
+ auth: "admin",
234618
+ kind: "mutation"
234619
+ }),
234620
+ /**
234119
234621
  * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
234120
234622
  * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
234121
234623
  * the runner asks the decode worker still holding that frame's NATIVE
@@ -246057,7 +246559,28 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
246057
246559
  /** Total tracked objects in this scope (frame / zone / unzoned). */
246058
246560
  totalObjects: zod.z.number().int().nonnegative(),
246059
246561
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
246060
- byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative())
246562
+ byClass: zod.z.record(zod.z.string(), zod.z.number().int().nonnegative()),
246563
+ /**
246564
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
246565
+ * present but not going anywhere (a parked car, a bin, a statue).
246566
+ *
246567
+ * The operator's question about a scene has two halves and they answer
246568
+ * different things: "what is parked here" is stable for hours and must not
246569
+ * flap, while "who is walking through" is the thing an alert is about. One
246570
+ * number could only serve one of them, and `totalObjects` served the first
246571
+ * badly — a passer-by moved it and every occupancy rule saw a change.
246572
+ *
246573
+ * `standing + transient === totalObjects`, always. The total keeps its old
246574
+ * meaning exactly, so no rule written against it changes behaviour.
246575
+ *
246576
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
246577
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
246578
+ * parked objects here" about a camera whose lot is full.
246579
+ */
246580
+ standingObjects: zod.z.number().int().nonnegative().optional(),
246581
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
246582
+ * same absence rule. */
246583
+ transientObjects: zod.z.number().int().nonnegative().optional()
246061
246584
  });
246062
246585
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
246063
246586
  zoneId: zod.z.string(),
@@ -253334,6 +253857,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
253334
253857
  addonId: null,
253335
253858
  access: "view"
253336
253859
  },
253860
+ "notificationRules.getClipRetentionAsks": {
253861
+ capName: "notification-rules",
253862
+ capScope: "system",
253863
+ addonId: null,
253864
+ access: "view"
253865
+ },
253337
253866
  "notificationRules.getConditionCatalog": {
253338
253867
  capName: "notification-rules",
253339
253868
  capScope: "system",
@@ -253844,6 +254373,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
253844
254373
  addonId: null,
253845
254374
  access: "create"
253846
254375
  },
254376
+ "pipelineAnalytics.readLongTermSeries": {
254377
+ capName: "pipeline-analytics",
254378
+ capScope: "device",
254379
+ addonId: null,
254380
+ access: "view"
254381
+ },
253847
254382
  "pipelineAnalytics.rebuildObjectEmbeddings": {
253848
254383
  capName: "pipeline-analytics",
253849
254384
  capScope: "device",
@@ -254516,6 +255051,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
254516
255051
  addonId: null,
254517
255052
  access: "create"
254518
255053
  },
255054
+ "pipelineRunner.requestOccupancyBurst": {
255055
+ capName: "pipeline-runner",
255056
+ capScope: "system",
255057
+ addonId: null,
255058
+ access: "create"
255059
+ },
254519
255060
  "pipelineRunner.runDetailSubtree": {
254520
255061
  capName: "pipeline-runner",
254521
255062
  capScope: "system",
@@ -257926,6 +258467,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
257926
258467
  form: "single",
257927
258468
  optional: false
257928
258469
  }],
258470
+ "pipelineAnalytics.readLongTermSeries": [{
258471
+ name: "deviceId",
258472
+ form: "single",
258473
+ optional: false
258474
+ }],
257929
258475
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
257930
258476
  name: "deviceId",
257931
258477
  form: "single",
@@ -258116,6 +258662,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258116
258662
  form: "single",
258117
258663
  optional: false
258118
258664
  }],
258665
+ "pipelineRunner.requestOccupancyBurst": [{
258666
+ name: "deviceId",
258667
+ form: "single",
258668
+ optional: false
258669
+ }],
258119
258670
  "pipelineRunner.runDetailSubtree": [{
258120
258671
  name: "deviceId",
258121
258672
  form: "single",
@@ -258799,6 +259350,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
258799
259350
  "pipelineRunner.parkTrackFrame",
258800
259351
  "pipelineRunner.releaseParkedTrackFrames",
258801
259352
  "pipelineRunner.reportMotion",
259353
+ "pipelineRunner.requestOccupancyBurst",
258802
259354
  "pipelineRunner.runDetailSubtree",
258803
259355
  "pipelineRunner.runStatelessStep",
258804
259356
  "plateGallery.getPlateByTrack",
@@ -262607,6 +263159,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
262607
263159
  exports.AlertSourceSchema = AlertSourceSchema;
262608
263160
  exports.AlertStatusSchema = AlertStatusSchema;
262609
263161
  exports.AmbientLightSensorStatusSchema = AmbientLightSensorStatusSchema;
263162
+ exports.AnalyticsLtsSeriesSchema = AnalyticsLtsSeriesSchema;
262610
263163
  exports.ApiKeyRecordSchema = ApiKeyRecordSchema;
262611
263164
  exports.ApiKeySummarySchema = ApiKeySummarySchema;
262612
263165
  exports.ArchiveEntrySchema = ArchiveEntrySchema;
@@ -262801,6 +263354,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
262801
263354
  exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
262802
263355
  exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
262803
263356
  exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
263357
+ exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
262804
263358
  exports.DEFAULT_POOL_MEMORY_POLICY = DEFAULT_POOL_MEMORY_POLICY;
262805
263359
  exports.DEFAULT_RECORDING_PROFILES = DEFAULT_RECORDING_PROFILES;
262806
263360
  exports.DEFAULT_RETENTION = DEFAULT_RETENTION;
@@ -262984,6 +263538,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
262984
263538
  exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
262985
263539
  exports.LOG_CHANNEL_TICK_MS = LOG_CHANNEL_TICK_MS;
262986
263540
  exports.LOG_LEVEL_RANK = LOG_LEVEL_RANK;
263541
+ exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
262987
263542
  exports.LabelAttributionSchema = LabelAttributionSchema;
262988
263543
  exports.LabelDefinitionSchema = LabelDefinitionSchema;
262989
263544
  exports.LabelTierSchema = LabelTierSchema;
@@ -263044,6 +263599,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263044
263599
  exports.LoggingSettingsStateSchema = LoggingSettingsStateSchema;
263045
263600
  exports.LoginMethodContributionSchema = LoginMethodContributionSchema;
263046
263601
  exports.LoginStageEnum = LoginStageEnum;
263602
+ exports.LtsBucketSchema = LtsBucketSchema;
263047
263603
  exports.MACRO_LABELS = MACRO_LABELS;
263048
263604
  exports.MAX_ARCHIVED_DEBUG_NOTES = MAX_ARCHIVED_DEBUG_NOTES;
263049
263605
  exports.MAX_BIRTH_DECISION_RECORDS = MAX_BIRTH_DECISION_RECORDS;
@@ -263157,6 +263713,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263157
263713
  exports.NC_AUDIO_SEED = NC_AUDIO_SEED;
263158
263714
  exports.NC_AUTHORABLE_SYSTEM_EVENT_KINDS = NC_AUTHORABLE_SYSTEM_EVENT_KINDS;
263159
263715
  exports.NC_BASE_CONDITION_KEYS = NC_BASE_CONDITION_KEYS;
263716
+ exports.NC_CLIP_RETENTION_MAX_SEC = NC_CLIP_RETENTION_MAX_SEC;
263160
263717
  exports.NC_CONDITION_CATALOG = NC_CONDITION_CATALOG;
263161
263718
  exports.NC_CONFIRM_DEFAULT_MAX_IMAGE_PX = NC_CONFIRM_DEFAULT_MAX_IMAGE_PX;
263162
263719
  exports.NC_CONFIRM_DEFAULT_TIMEOUT_MS = NC_CONFIRM_DEFAULT_TIMEOUT_MS;
@@ -263205,6 +263762,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263205
263762
  exports.NcAlarmSkipReasonSchema = NcAlarmSkipReasonSchema;
263206
263763
  exports.NcAlarmSkippedDeviceSchema = NcAlarmSkippedDeviceSchema;
263207
263764
  exports.NcAudioConditionSchema = NcAudioConditionSchema;
263765
+ exports.NcClipRetentionAskSchema = NcClipRetentionAskSchema;
263766
+ exports.NcClipRetentionPlanSchema = NcClipRetentionPlanSchema;
263208
263767
  exports.NcConditionDescriptorSchema = NcConditionDescriptorSchema;
263209
263768
  exports.NcConditionsSchema = NcConditionsSchema;
263210
263769
  exports.NcConfirmExpectSchema = NcConfirmExpectSchema;
@@ -263258,8 +263817,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263258
263817
  exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
263259
263818
  exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
263260
263819
  exports.OVERFLOW_REASON = OVERFLOW_REASON;
263820
+ exports.OVERLAY_LAYERS = OVERLAY_LAYERS;
263261
263821
  exports.OauthIntegrationDescriptorSchema = OauthIntegrationDescriptorSchema;
263262
263822
  exports.ObjectEventSchema = ObjectEventSchema;
263823
+ exports.OccupancyBurstRefusalSchema = OccupancyBurstRefusalSchema;
263263
263824
  exports.OpsLogDomainSchema = OpsLogDomainSchema;
263264
263825
  exports.OpsLogEntrySchema = OpsLogEntrySchema;
263265
263826
  exports.OpsLogOpSchema = OpsLogOpSchema;
@@ -263443,6 +264004,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263443
264004
  exports.SOURCE_CAP_CHANGED_AT_FIELD = SOURCE_CAP_CHANGED_AT_FIELD;
263444
264005
  exports.SOURCE_DEVICE_TYPES = SOURCE_DEVICE_TYPES;
263445
264006
  exports.SOURCE_INFO_METADATA_KEY = SOURCE_INFO_METADATA_KEY;
264007
+ exports.STATIONARY_OVERLAY_STYLE = STATIONARY_OVERLAY_STYLE;
263446
264008
  exports.STORAGE_ACCESS_FALLBACK = STORAGE_ACCESS_FALLBACK;
263447
264009
  exports.STORAGE_BYTES_PER_GB = STORAGE_BYTES_PER_GB;
263448
264010
  exports.STORAGE_LOCATION_MODES = STORAGE_LOCATION_MODES;
@@ -263775,7 +264337,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263775
264337
  exports.createRuntimeStateBridge = createRuntimeStateBridge;
263776
264338
  exports.createSliceHandle = require_sleep.createSliceHandle;
263777
264339
  exports.createSystemProxy = createSystemProxy;
263778
- exports.customAction = customAction;
264340
+ exports.customAction = require_sleep.customAction;
263779
264341
  exports.customModelRegistryCapability = customModelRegistryCapability;
263780
264342
  exports.dataStoreProviderCapability = dataStoreProviderCapability;
263781
264343
  exports.dayNightCapability = dayNightCapability;
@@ -263785,18 +264347,18 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263785
264347
  exports.decoderCapability = decoderCapability;
263786
264348
  exports.defaultDeliveryForSection = defaultDeliveryForSection;
263787
264349
  exports.defaultDeviceFor = defaultDeviceFor;
263788
- exports.defineCustomActions = defineCustomActions;
264350
+ exports.defineCustomActions = require_sleep.defineCustomActions;
263789
264351
  exports.deriveBatteryPresence = deriveBatteryPresence;
263790
264352
  exports.deriveCameraSwitches = deriveCameraSwitches;
263791
264353
  exports.deriveDetailCropRect = deriveDetailCropRect;
263792
264354
  exports.deriveRecordingMode = deriveRecordingMode;
263793
- exports.describeCustomActions = describeCustomActions;
264355
+ exports.describeCustomActions = require_sleep.describeCustomActions;
263794
264356
  exports.describeModelVariant = describeModelVariant;
263795
264357
  exports.detectAccessRole = detectAccessRole;
263796
264358
  exports.detectionPipelineCapability = detectionPipelineCapability;
263797
264359
  exports.deviceAdoptionCapability = deviceAdoptionCapability;
263798
264360
  exports.deviceBackendToFormat = deviceBackendToFormat;
263799
- exports.deviceCustomAction = deviceCustomAction;
264361
+ exports.deviceCustomAction = require_sleep.deviceCustomAction;
263800
264362
  exports.deviceDiscoveryCapability = deviceDiscoveryCapability;
263801
264363
  exports.deviceExportCapability = deviceExportCapability;
263802
264364
  exports.deviceManagerCapability = deviceManagerCapability;
@@ -263846,6 +264408,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263846
264408
  exports.formatForBackend = formatForBackend;
263847
264409
  exports.formatForRuntime = formatForRuntime;
263848
264410
  exports.formatMediaOwnerKey = formatMediaOwnerKey;
264411
+ exports.formatParkedFor = formatParkedFor;
263849
264412
  exports.gasCapability = gasCapability;
263850
264413
  exports.gbToBytes = gbToBytes;
263851
264414
  exports.generateAutomationBlock = generateAutomationBlock;
@@ -263962,6 +264525,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263962
264525
  exports.numericSensorCapability = numericSensorCapability;
263963
264526
  exports.oauthIntegrationCapability = oauthIntegrationCapability;
263964
264527
  exports.objectInputDeclaresAddonId = objectInputDeclaresAddonId;
264528
+ exports.occupancyScope = occupancyScope;
263965
264529
  exports.osdCapability = osdCapability;
263966
264530
  exports.osdManagerCapability = osdManagerCapability;
263967
264531
  exports.overlayClusterStepSettings = overlayClusterStepSettings;
@@ -263971,6 +264535,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263971
264535
  exports.parseJsonObject = require_sleep.parseJsonObject;
263972
264536
  exports.parseJsonUnknown = require_sleep.parseJsonUnknown;
263973
264537
  exports.parseMediaOwnerKey = parseMediaOwnerKey;
264538
+ exports.parseOccupancyScope = parseOccupancyScope;
263974
264539
  exports.parseProcStatus = parseProcStatus;
263975
264540
  exports.parseProfileBrokerId = require_sleep.parseProfileBrokerId;
263976
264541
  exports.parseRuleSection = parseRuleSection;