@camstack/addon-export-alexa 1.2.109 → 1.2.110

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.
@@ -5387,7 +5387,7 @@ var ZodIssueCode = {
5387
5387
  var ZodFirstPartyTypeKind;
5388
5388
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5389
5389
  //#endregion
5390
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5390
+ //#region ../types/dist/sleep-BDR76Ykr.mjs
5391
5391
  /**
5392
5392
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5393
5393
  * window to float samples (D455).
@@ -7268,6 +7268,28 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7268
7268
  DeviceRole["GenericNotifier"] = "generic-notifier";
7269
7269
  return DeviceRole;
7270
7270
  }({});
7271
+ /**
7272
+ * Identity — preserves literal types for downstream inference.
7273
+ *
7274
+ * The constraint is `Record<string, unknown>` (not `CustomActionsSpec`) so
7275
+ * TypeScript does not widen each entry's literal `kind`/`auth` fields to
7276
+ * the broader unions declared on `CustomActionSpec`'s default generics.
7277
+ * Shape validity is enforced separately by the `customAction(...)` helper
7278
+ * whose return type is already a `CustomActionSpec<...>`.
7279
+ */
7280
+ function defineCustomActions(spec) {
7281
+ return spec;
7282
+ }
7283
+ function customAction(input, output, options) {
7284
+ return {
7285
+ input,
7286
+ output,
7287
+ kind: options?.kind ?? "query",
7288
+ auth: options?.auth ?? "protected",
7289
+ scope: options?.scope ?? { kind: "system" },
7290
+ ...options?.caller ? { caller: "required" } : {}
7291
+ };
7292
+ }
7271
7293
  var StaticDirOutputSchema = object({ staticDir: string() });
7272
7294
  var VersionOutputSchema = object({ version: string() });
7273
7295
  method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
@@ -12726,28 +12748,6 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
12726
12748
  content: string()
12727
12749
  })) }), { auth: "admin" });
12728
12750
  /**
12729
- * Identity — preserves literal types for downstream inference.
12730
- *
12731
- * The constraint is `Record<string, unknown>` (not `CustomActionsSpec`) so
12732
- * TypeScript does not widen each entry's literal `kind`/`auth` fields to
12733
- * the broader unions declared on `CustomActionSpec`'s default generics.
12734
- * Shape validity is enforced separately by the `customAction(...)` helper
12735
- * whose return type is already a `CustomActionSpec<...>`.
12736
- */
12737
- function defineCustomActions(spec) {
12738
- return spec;
12739
- }
12740
- function customAction(input, output, options) {
12741
- return {
12742
- input,
12743
- output,
12744
- kind: options?.kind ?? "query",
12745
- auth: options?.auth ?? "protected",
12746
- scope: options?.scope ?? { kind: "system" },
12747
- ...options?.caller ? { caller: "required" } : {}
12748
- };
12749
- }
12750
- /**
12751
12751
  * `custom-model-registry` — collection cap exposing operator-registered
12752
12752
  * custom detection models. Each provider (today: `addon-model-studio`)
12753
12753
  * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
@@ -18187,6 +18187,48 @@ var NcAlarmConfigSchema = object({
18187
18187
  settings: NcAlarmSettingsSchema,
18188
18188
  coverage: array(NcAlarmModeCoverageSchema)
18189
18189
  });
18190
+ /**
18191
+ * ONE rule's demand on ONE camera's clip ring.
18192
+ *
18193
+ * A rule, not a camera: the broker takes the MAX over the asks that reach a
18194
+ * camera, so the answer stays a faithful description of the rules and the
18195
+ * bounding (the byte budget, the broker's own ceiling) stays where the cost
18196
+ * lives. A camera that appears in no ask is being told **nothing** — which is
18197
+ * a different thing from never having been told, and only the envelope
18198
+ * (`rulesLoaded`) can tell those apart.
18199
+ */
18200
+ var NcClipRetentionAskSchema = object({
18201
+ /**
18202
+ * The camera this ask is about. **Absent = every camera**, which is what a
18203
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
18204
+ * asking everywhere.
18205
+ */
18206
+ deviceId: number().int().nonnegative().optional(),
18207
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
18208
+ * needs nothing produces no ask at all. */
18209
+ seconds: number().min(0).max(60),
18210
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
18211
+ * assigned, which is what the cut defaults to. */
18212
+ profile: CamProfileSchema.optional(),
18213
+ /** Who is asking — so a retention the operator did not expect names a rule. */
18214
+ ruleId: string(),
18215
+ ruleName: string(),
18216
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
18217
+ reason: _enum(["window", "occupancy"])
18218
+ });
18219
+ /**
18220
+ * The whole answer, with the one bit that keeps absence from reading as zero.
18221
+ *
18222
+ * `rulesLoaded` is false until the rule ledger has completed a load at least
18223
+ * once. A centre that is up but has not read its rules yet answers with an
18224
+ * empty ask list that means nothing at all — applying it would drop every
18225
+ * camera's ring to zero for the first events after a restart, which is the
18226
+ * footage this mechanism exists to keep.
18227
+ */
18228
+ var NcClipRetentionPlanSchema = object({
18229
+ rulesLoaded: boolean(),
18230
+ asks: array(NcClipRetentionAskSchema).readonly()
18231
+ });
18190
18232
  method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), method(object({ ruleId: string() }), object({ rule: NcRuleSchema.nullable() }), { auth: "admin" }), method(object({ rule: NcRuleInputSchema }), object({ rule: NcRuleSchema }), {
18191
18233
  kind: "mutation",
18192
18234
  auth: "admin",
@@ -18207,7 +18249,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
18207
18249
  }), object({ success: literal(true) }), {
18208
18250
  kind: "mutation",
18209
18251
  auth: "admin"
18210
- }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
18252
+ }), method(object({}), NcClipRetentionPlanSchema, { auth: "admin" }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
18211
18253
  deviceId: number().int(),
18212
18254
  muted: boolean()
18213
18255
  }), object({ success: literal(true) }), {
@@ -20757,6 +20799,33 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
20757
20799
  * solid is this track", cheaper than re-deriving it from a trajectory. */
20758
20800
  framesMatched: number().int()
20759
20801
  })).readonly() });
20802
+ /**
20803
+ * The long-term series a camera produces. A closed union so a typo cannot
20804
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
20805
+ * is an alias of this, not a second list.
20806
+ */
20807
+ var AnalyticsLtsSeriesSchema = _enum([
20808
+ "motion",
20809
+ "audio-dbfs",
20810
+ "battery",
20811
+ "occupancy"
20812
+ ]);
20813
+ /**
20814
+ * One closed 5-minute bucket of a long-term series.
20815
+ *
20816
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
20817
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
20818
+ * that exists at all was measured; a bucket that is absent was not, which is a
20819
+ * different claim from zero and the reason this is a sparse series.
20820
+ */
20821
+ var LtsBucketSchema = object({
20822
+ scope: string(),
20823
+ bucketStart: number().int(),
20824
+ samples: number().int().nonnegative(),
20825
+ sum: number(),
20826
+ min: number(),
20827
+ max: number()
20828
+ });
20760
20829
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
20761
20830
  deviceId: number(),
20762
20831
  trackId: string()
@@ -20803,6 +20872,14 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20803
20872
  kinds: array(string()).optional(),
20804
20873
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
20805
20874
  }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
20875
+ deviceId: number(),
20876
+ series: AnalyticsLtsSeriesSchema,
20877
+ /** Omit for EVERY scope of this series in the range. */
20878
+ scope: string().optional(),
20879
+ from: number(),
20880
+ to: number(),
20881
+ limit: number().int().positive().optional()
20882
+ }), array(LtsBucketSchema).readonly()), method(object({
20806
20883
  deviceId: number(),
20807
20884
  since: number(),
20808
20885
  until: number(),
@@ -21421,6 +21498,14 @@ var MotionSourceEnum = _enum([
21421
21498
  */
21422
21499
  var MotionSourcesSchema = array(MotionSourceEnum);
21423
21500
  /**
21501
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21502
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21503
+ * than a second spelling of the same two ideas — the value an operator picks
21504
+ * here is the value that comes back on the track, the overlay and the debug
21505
+ * row.
21506
+ */
21507
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
21508
+ /**
21424
21509
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21425
21510
  * so cap-side consumers (the orchestrator forward, the runner addon's
21426
21511
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21571,6 +21656,35 @@ var RunnerCameraConfigSchema = object({
21571
21656
  * events; the orchestrator forwards to `reportMotion`.
21572
21657
  */
21573
21658
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21659
+ /**
21660
+ * WHICH root detector runs for this camera. The detection counterpart of
21661
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21662
+ * of sources the system understands, vendor-agnostic, owned here.
21663
+ *
21664
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21665
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21666
+ * here. Its boxes reach post-analysis on the same
21667
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21668
+ * track gets the same tracker, the same overlay and the same detail
21669
+ * subtree (face / plate / embedding).
21670
+ *
21671
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21672
+ * run, and that is where a camera with a usable onboard detector buys back
21673
+ * its share of the accelerator. It saves the root inference, not the decode
21674
+ * — the detail subtree still needs pixels to cut crops from.
21675
+ *
21676
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21677
+ * step at all (there is nothing to track), and the cap that knows this says
21678
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21679
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21680
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21681
+ * worth exactly what it already is — a wake signal with a class.
21682
+ *
21683
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21684
+ * vendor never turns a detector on for the operator, and neither does a
21685
+ * default.
21686
+ */
21687
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21574
21688
  pipelineEnabled: boolean().default(true),
21575
21689
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21576
21690
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -21752,7 +21866,47 @@ var RunnerLocalMetricsSchema = object({
21752
21866
  queueDepth: number(),
21753
21867
  frameLazy: FrameLazyMetricsSchema.optional()
21754
21868
  });
21869
+ /**
21870
+ * Pipeline Runner capability — runtime detection workhorse.
21871
+ *
21872
+ * One instance per node. Receives camera assignments from
21873
+ * `addon-pipeline-orchestrator`, subscribes to the local stream-broker for
21874
+ * decoded frames, drains motion + detection queues, calls the local
21875
+ * `motion-detection` and `pipeline-executor` capabilities, and emits typed
21876
+ * `pipeline.inference-result` and `detection.motion-analysis` events on
21877
+ * the bus.
21878
+ *
21879
+ * Distinct from `pipeline-orchestrator` (the hub-side load balancer) — the
21880
+ * runner has zero knowledge of other agents, no global state, and never
21881
+ * makes assignment decisions itself.
21882
+ */
21883
+ /**
21884
+ * Why a runner declined to look at a camera out of band. Named rather than a
21885
+ * bare `false`: a camera asleep on battery (D173), one attached elsewhere, one
21886
+ * already mid-session and one already bursting are four different facts, and a
21887
+ * caller told only "no" cannot tell a protection from a bug.
21888
+ */
21889
+ var OccupancyBurstRefusalSchema = _enum([
21890
+ "not-attached",
21891
+ "battery-asleep",
21892
+ "not-watching",
21893
+ "already-bursting"
21894
+ ]);
21755
21895
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
21896
+ deviceId: number(),
21897
+ /** How many frames to collect. The caller sizes this against what its
21898
+ * own confirmation needs; the runner clamps it to the field's range. */
21899
+ frames: number().int().positive().optional(),
21900
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
21901
+ * defend — the periodic one at least has a timer to point at. */
21902
+ reason: string()
21903
+ }), object({
21904
+ started: boolean(),
21905
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
21906
+ }), {
21907
+ auth: "admin",
21908
+ kind: "mutation"
21909
+ }), method(object({
21756
21910
  handle: FrameHandleSchema,
21757
21911
  bbox: NativeCropBboxSchema,
21758
21912
  maxWidth: number().int().positive().optional(),
@@ -27221,7 +27375,7 @@ var NativeDetectionSchema = object({
27221
27375
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
27222
27376
  confidence: number().min(0).max(1).optional()
27223
27377
  });
27224
- object({
27378
+ var NativeObjectDetectionStatusSchema = object({
27225
27379
  /**
27226
27380
  * Last observed instance per class. Missing entries mean the class
27227
27381
  * is supported but nothing has been seen since the provider started.
@@ -27238,14 +27392,56 @@ object({
27238
27392
  supportedClasses: array(NativeObjectClassEnum).readonly(),
27239
27393
  /**
27240
27394
  * Whether forwarding of onboard AI detections is enabled for this device.
27241
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
27242
- * churn the tracker, so forwarding stays off until the operator enables it.
27395
+ *
27396
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
27397
+ * camera runs — that is the operator's choice, and it is made where every
27398
+ * other detection choice is made. `geometry` on
27399
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
27400
+ * choice would buy this particular camera.
27243
27401
  */
27244
27402
  enabled: boolean()
27245
- }).extend({
27403
+ });
27404
+ /**
27405
+ * WHEN a camera's onboard detections carry geometry.
27406
+ *
27407
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
27408
+ * a detection is a trackable subject whenever the camera sees one.
27409
+ * - `while-streaming` — only while some stream of this camera is already open.
27410
+ * The boxes ride the video's own side-channel rather than a feed of their
27411
+ * own, so they cost nothing and they exist only when something is pulling.
27412
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
27413
+ * radio drain, but a camera that is awake is awake precisely because
27414
+ * something is in front of it, and its stream is already being pulled.
27415
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
27416
+ * pipeline needs geometry to make a subject, so such a push reaches the
27417
+ * tracker as motion and no further.
27418
+ *
27419
+ * Reported and not inferred, because the operator's question in front of the
27420
+ * picker is "what do I get", and these are three different answers (D14: the
27421
+ * derived form is only as honest as `getOptions`).
27422
+ */
27423
+ var NativeObjectGeometryEnum = _enum([
27424
+ "boxed",
27425
+ "while-streaming",
27426
+ "flag-only"
27427
+ ]);
27428
+ var NativeObjectDetectionOptionsSchema = object({
27429
+ /** Classes this firmware can detect — the same list the status reports. */
27430
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
27431
+ /** What a detection from this camera carries. */
27432
+ geometry: NativeObjectGeometryEnum
27433
+ });
27434
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
27435
+ NativeObjectDetectionStatusSchema.extend({
27246
27436
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
27247
27437
  lastFetchedAt: number() });
27248
- DeviceType.Camera, method(object({
27438
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
27439
+ deviceId: number(),
27440
+ settings: NativeObjectDetectionSettingsPatchSchema
27441
+ }), _void(), {
27442
+ kind: "mutation",
27443
+ auth: "admin"
27444
+ }), method(object({
27249
27445
  deviceId: number(),
27250
27446
  enabled: boolean()
27251
27447
  }), _void(), {
@@ -31044,7 +31240,28 @@ var PerScopeBreakdownSchema = object({
31044
31240
  /** Total tracked objects in this scope (frame / zone / unzoned). */
31045
31241
  totalObjects: number().int().nonnegative(),
31046
31242
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
31047
- byClass: record(string(), number().int().nonnegative())
31243
+ byClass: record(string(), number().int().nonnegative()),
31244
+ /**
31245
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
31246
+ * present but not going anywhere (a parked car, a bin, a statue).
31247
+ *
31248
+ * The operator's question about a scene has two halves and they answer
31249
+ * different things: "what is parked here" is stable for hours and must not
31250
+ * flap, while "who is walking through" is the thing an alert is about. One
31251
+ * number could only serve one of them, and `totalObjects` served the first
31252
+ * badly — a passer-by moved it and every occupancy rule saw a change.
31253
+ *
31254
+ * `standing + transient === totalObjects`, always. The total keeps its old
31255
+ * meaning exactly, so no rule written against it changes behaviour.
31256
+ *
31257
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
31258
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
31259
+ * parked objects here" about a camera whose lot is full.
31260
+ */
31261
+ standingObjects: number().int().nonnegative().optional(),
31262
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
31263
+ * same absence rule. */
31264
+ transientObjects: number().int().nonnegative().optional()
31048
31265
  });
31049
31266
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
31050
31267
  zoneId: string(),
@@ -33983,12 +34200,24 @@ Object.freeze({
33983
34200
  addonId: null,
33984
34201
  access: "create"
33985
34202
  },
34203
+ "nativeObjectDetection.getOptions": {
34204
+ capName: "native-object-detection",
34205
+ capScope: "device",
34206
+ addonId: null,
34207
+ access: "view"
34208
+ },
33986
34209
  "nativeObjectDetection.setEnabled": {
33987
34210
  capName: "native-object-detection",
33988
34211
  capScope: "device",
33989
34212
  addonId: null,
33990
34213
  access: "create"
33991
34214
  },
34215
+ "nativeObjectDetection.setSettings": {
34216
+ capName: "native-object-detection",
34217
+ capScope: "device",
34218
+ addonId: null,
34219
+ access: "create"
34220
+ },
33992
34221
  "navigation.getFeatures": {
33993
34222
  capName: "navigation",
33994
34223
  capScope: "device",
@@ -34253,6 +34482,12 @@ Object.freeze({
34253
34482
  addonId: null,
34254
34483
  access: "view"
34255
34484
  },
34485
+ "notificationRules.getClipRetentionAsks": {
34486
+ capName: "notification-rules",
34487
+ capScope: "system",
34488
+ addonId: null,
34489
+ access: "view"
34490
+ },
34256
34491
  "notificationRules.getConditionCatalog": {
34257
34492
  capName: "notification-rules",
34258
34493
  capScope: "system",
@@ -34763,6 +34998,12 @@ Object.freeze({
34763
34998
  addonId: null,
34764
34999
  access: "create"
34765
35000
  },
35001
+ "pipelineAnalytics.readLongTermSeries": {
35002
+ capName: "pipeline-analytics",
35003
+ capScope: "device",
35004
+ addonId: null,
35005
+ access: "view"
35006
+ },
34766
35007
  "pipelineAnalytics.rebuildObjectEmbeddings": {
34767
35008
  capName: "pipeline-analytics",
34768
35009
  capScope: "device",
@@ -35435,6 +35676,12 @@ Object.freeze({
35435
35676
  addonId: null,
35436
35677
  access: "create"
35437
35678
  },
35679
+ "pipelineRunner.requestOccupancyBurst": {
35680
+ capName: "pipeline-runner",
35681
+ capScope: "system",
35682
+ addonId: null,
35683
+ access: "create"
35684
+ },
35438
35685
  "pipelineRunner.runDetailSubtree": {
35439
35686
  capName: "pipeline-runner",
35440
35687
  capScope: "system",
@@ -38215,11 +38462,21 @@ Object.freeze({
38215
38462
  form: "single",
38216
38463
  optional: false
38217
38464
  }],
38465
+ "nativeObjectDetection.getOptions": [{
38466
+ name: "deviceId",
38467
+ form: "single",
38468
+ optional: false
38469
+ }],
38218
38470
  "nativeObjectDetection.setEnabled": [{
38219
38471
  name: "deviceId",
38220
38472
  form: "single",
38221
38473
  optional: false
38222
38474
  }],
38475
+ "nativeObjectDetection.setSettings": [{
38476
+ name: "deviceId",
38477
+ form: "single",
38478
+ optional: false
38479
+ }],
38223
38480
  "navigation.getFeatures": [{
38224
38481
  name: "deviceId",
38225
38482
  form: "single",
@@ -38569,6 +38826,11 @@ Object.freeze({
38569
38826
  form: "single",
38570
38827
  optional: false
38571
38828
  }],
38829
+ "pipelineAnalytics.readLongTermSeries": [{
38830
+ name: "deviceId",
38831
+ form: "single",
38832
+ optional: false
38833
+ }],
38572
38834
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
38573
38835
  name: "deviceId",
38574
38836
  form: "single",
@@ -38759,6 +39021,11 @@ Object.freeze({
38759
39021
  form: "single",
38760
39022
  optional: false
38761
39023
  }],
39024
+ "pipelineRunner.requestOccupancyBurst": [{
39025
+ name: "deviceId",
39026
+ form: "single",
39027
+ optional: false
39028
+ }],
38762
39029
  "pipelineRunner.runDetailSubtree": [{
38763
39030
  name: "deviceId",
38764
39031
  form: "single",
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5363
+ //#region ../types/dist/sleep-BDR76Ykr.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -7241,6 +7241,28 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7241
7241
  DeviceRole["GenericNotifier"] = "generic-notifier";
7242
7242
  return DeviceRole;
7243
7243
  }({});
7244
+ /**
7245
+ * Identity — preserves literal types for downstream inference.
7246
+ *
7247
+ * The constraint is `Record<string, unknown>` (not `CustomActionsSpec`) so
7248
+ * TypeScript does not widen each entry's literal `kind`/`auth` fields to
7249
+ * the broader unions declared on `CustomActionSpec`'s default generics.
7250
+ * Shape validity is enforced separately by the `customAction(...)` helper
7251
+ * whose return type is already a `CustomActionSpec<...>`.
7252
+ */
7253
+ function defineCustomActions(spec) {
7254
+ return spec;
7255
+ }
7256
+ function customAction(input, output, options) {
7257
+ return {
7258
+ input,
7259
+ output,
7260
+ kind: options?.kind ?? "query",
7261
+ auth: options?.auth ?? "protected",
7262
+ scope: options?.scope ?? { kind: "system" },
7263
+ ...options?.caller ? { caller: "required" } : {}
7264
+ };
7265
+ }
7244
7266
  var StaticDirOutputSchema = object({ staticDir: string() });
7245
7267
  var VersionOutputSchema = object({ version: string() });
7246
7268
  method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
@@ -12699,28 +12721,6 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
12699
12721
  content: string()
12700
12722
  })) }), { auth: "admin" });
12701
12723
  /**
12702
- * Identity — preserves literal types for downstream inference.
12703
- *
12704
- * The constraint is `Record<string, unknown>` (not `CustomActionsSpec`) so
12705
- * TypeScript does not widen each entry's literal `kind`/`auth` fields to
12706
- * the broader unions declared on `CustomActionSpec`'s default generics.
12707
- * Shape validity is enforced separately by the `customAction(...)` helper
12708
- * whose return type is already a `CustomActionSpec<...>`.
12709
- */
12710
- function defineCustomActions(spec) {
12711
- return spec;
12712
- }
12713
- function customAction(input, output, options) {
12714
- return {
12715
- input,
12716
- output,
12717
- kind: options?.kind ?? "query",
12718
- auth: options?.auth ?? "protected",
12719
- scope: options?.scope ?? { kind: "system" },
12720
- ...options?.caller ? { caller: "required" } : {}
12721
- };
12722
- }
12723
- /**
12724
12724
  * `custom-model-registry` — collection cap exposing operator-registered
12725
12725
  * custom detection models. Each provider (today: `addon-model-studio`)
12726
12726
  * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
@@ -18160,6 +18160,48 @@ var NcAlarmConfigSchema = object({
18160
18160
  settings: NcAlarmSettingsSchema,
18161
18161
  coverage: array(NcAlarmModeCoverageSchema)
18162
18162
  });
18163
+ /**
18164
+ * ONE rule's demand on ONE camera's clip ring.
18165
+ *
18166
+ * A rule, not a camera: the broker takes the MAX over the asks that reach a
18167
+ * camera, so the answer stays a faithful description of the rules and the
18168
+ * bounding (the byte budget, the broker's own ceiling) stays where the cost
18169
+ * lives. A camera that appears in no ask is being told **nothing** — which is
18170
+ * a different thing from never having been told, and only the envelope
18171
+ * (`rulesLoaded`) can tell those apart.
18172
+ */
18173
+ var NcClipRetentionAskSchema = object({
18174
+ /**
18175
+ * The camera this ask is about. **Absent = every camera**, which is what a
18176
+ * rule with no `conditions.devices` means: it can fire anywhere, so it is
18177
+ * asking everywhere.
18178
+ */
18179
+ deviceId: number().int().nonnegative().optional(),
18180
+ /** Seconds of history the rule needs held for it. Never zero — a rule that
18181
+ * needs nothing produces no ask at all. */
18182
+ seconds: number().min(0).max(60),
18183
+ /** The profile the rule cuts from, when it named one. Absent = the cheapest
18184
+ * assigned, which is what the cut defaults to. */
18185
+ profile: CamProfileSchema.optional(),
18186
+ /** Who is asking — so a retention the operator did not expect names a rule. */
18187
+ ruleId: string(),
18188
+ ruleName: string(),
18189
+ /** Why this many seconds: the rule's own window, or the occupancy ceiling. */
18190
+ reason: _enum(["window", "occupancy"])
18191
+ });
18192
+ /**
18193
+ * The whole answer, with the one bit that keeps absence from reading as zero.
18194
+ *
18195
+ * `rulesLoaded` is false until the rule ledger has completed a load at least
18196
+ * once. A centre that is up but has not read its rules yet answers with an
18197
+ * empty ask list that means nothing at all — applying it would drop every
18198
+ * camera's ring to zero for the first events after a restart, which is the
18199
+ * footage this mechanism exists to keep.
18200
+ */
18201
+ var NcClipRetentionPlanSchema = object({
18202
+ rulesLoaded: boolean(),
18203
+ asks: array(NcClipRetentionAskSchema).readonly()
18204
+ });
18163
18205
  method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), method(object({ ruleId: string() }), object({ rule: NcRuleSchema.nullable() }), { auth: "admin" }), method(object({ rule: NcRuleInputSchema }), object({ rule: NcRuleSchema }), {
18164
18206
  kind: "mutation",
18165
18207
  auth: "admin",
@@ -18180,7 +18222,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
18180
18222
  }), object({ success: literal(true) }), {
18181
18223
  kind: "mutation",
18182
18224
  auth: "admin"
18183
- }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
18225
+ }), method(object({}), NcClipRetentionPlanSchema, { auth: "admin" }), method(object({}), object({ mutedDeviceIds: array(number().int()).readonly() }), { auth: "admin" }), method(object({
18184
18226
  deviceId: number().int(),
18185
18227
  muted: boolean()
18186
18228
  }), object({ success: literal(true) }), {
@@ -20730,6 +20772,33 @@ var RunReplayFrameProcessorResultSchema = object({ tracks: array(object({
20730
20772
  * solid is this track", cheaper than re-deriving it from a trajectory. */
20731
20773
  framesMatched: number().int()
20732
20774
  })).readonly() });
20775
+ /**
20776
+ * The long-term series a camera produces. A closed union so a typo cannot
20777
+ * invent one, and the ONE declaration of it — the addon's `AnalyticsLtsSeries`
20778
+ * is an alias of this, not a second list.
20779
+ */
20780
+ var AnalyticsLtsSeriesSchema = _enum([
20781
+ "motion",
20782
+ "audio-dbfs",
20783
+ "battery",
20784
+ "occupancy"
20785
+ ]);
20786
+ /**
20787
+ * One closed 5-minute bucket of a long-term series.
20788
+ *
20789
+ * `samples` is how many readings the bucket folded — it is the ACTIVITY for a
20790
+ * series like `motion`, and the confidence for one like `occupancy`. A bucket
20791
+ * that exists at all was measured; a bucket that is absent was not, which is a
20792
+ * different claim from zero and the reason this is a sparse series.
20793
+ */
20794
+ var LtsBucketSchema = object({
20795
+ scope: string(),
20796
+ bucketStart: number().int(),
20797
+ samples: number().int().nonnegative(),
20798
+ sum: number(),
20799
+ min: number(),
20800
+ max: number()
20801
+ });
20733
20802
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
20734
20803
  deviceId: number(),
20735
20804
  trackId: string()
@@ -20776,6 +20845,14 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20776
20845
  kinds: array(string()).optional(),
20777
20846
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
20778
20847
  }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
20848
+ deviceId: number(),
20849
+ series: AnalyticsLtsSeriesSchema,
20850
+ /** Omit for EVERY scope of this series in the range. */
20851
+ scope: string().optional(),
20852
+ from: number(),
20853
+ to: number(),
20854
+ limit: number().int().positive().optional()
20855
+ }), array(LtsBucketSchema).readonly()), method(object({
20779
20856
  deviceId: number(),
20780
20857
  since: number(),
20781
20858
  until: number(),
@@ -21394,6 +21471,14 @@ var MotionSourceEnum = _enum([
21394
21471
  */
21395
21472
  var MotionSourcesSchema = array(MotionSourceEnum);
21396
21473
  /**
21474
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
21475
+ * post-analysis already tags every detection with (`DetectionSource`) rather
21476
+ * than a second spelling of the same two ideas — the value an operator picks
21477
+ * here is the value that comes back on the track, the overlay and the debug
21478
+ * row.
21479
+ */
21480
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
21481
+ /**
21397
21482
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21398
21483
  * so cap-side consumers (the orchestrator forward, the runner addon's
21399
21484
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -21544,6 +21629,35 @@ var RunnerCameraConfigSchema = object({
21544
21629
  * events; the orchestrator forwards to `reportMotion`.
21545
21630
  */
21546
21631
  motionSources: MotionSourcesSchema.default(["analyzer"]),
21632
+ /**
21633
+ * WHICH root detector runs for this camera. The detection counterpart of
21634
+ * {@link motionSources}, same shape and same discipline: a per-camera list
21635
+ * of sources the system understands, vendor-agnostic, owned here.
21636
+ *
21637
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
21638
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
21639
+ * here. Its boxes reach post-analysis on the same
21640
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
21641
+ * track gets the same tracker, the same overlay and the same detail
21642
+ * subtree (face / plate / embedding).
21643
+ *
21644
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
21645
+ * run, and that is where a camera with a usable onboard detector buys back
21646
+ * its share of the accelerator. It saves the root inference, not the decode
21647
+ * — the detail subtree still needs pixels to cut crops from.
21648
+ *
21649
+ * A camera whose onboard detections carry no geometry cannot serve as a root
21650
+ * step at all (there is nothing to track), and the cap that knows this says
21651
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
21652
+ * every battery camera: the boxes ride a sub-stream a battery camera never
21653
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
21654
+ * worth exactly what it already is — a wake signal with a class.
21655
+ *
21656
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
21657
+ * vendor never turns a detector on for the operator, and neither does a
21658
+ * default.
21659
+ */
21660
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
21547
21661
  pipelineEnabled: boolean().default(true),
21548
21662
  /** Ordered tree of video steps. Absent → runner skips video detection. */
21549
21663
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -21725,7 +21839,47 @@ var RunnerLocalMetricsSchema = object({
21725
21839
  queueDepth: number(),
21726
21840
  frameLazy: FrameLazyMetricsSchema.optional()
21727
21841
  });
21842
+ /**
21843
+ * Pipeline Runner capability — runtime detection workhorse.
21844
+ *
21845
+ * One instance per node. Receives camera assignments from
21846
+ * `addon-pipeline-orchestrator`, subscribes to the local stream-broker for
21847
+ * decoded frames, drains motion + detection queues, calls the local
21848
+ * `motion-detection` and `pipeline-executor` capabilities, and emits typed
21849
+ * `pipeline.inference-result` and `detection.motion-analysis` events on
21850
+ * the bus.
21851
+ *
21852
+ * Distinct from `pipeline-orchestrator` (the hub-side load balancer) — the
21853
+ * runner has zero knowledge of other agents, no global state, and never
21854
+ * makes assignment decisions itself.
21855
+ */
21856
+ /**
21857
+ * Why a runner declined to look at a camera out of band. Named rather than a
21858
+ * bare `false`: a camera asleep on battery (D173), one attached elsewhere, one
21859
+ * already mid-session and one already bursting are four different facts, and a
21860
+ * caller told only "no" cannot tell a protection from a bug.
21861
+ */
21862
+ var OccupancyBurstRefusalSchema = _enum([
21863
+ "not-attached",
21864
+ "battery-asleep",
21865
+ "not-watching",
21866
+ "already-bursting"
21867
+ ]);
21728
21868
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
21869
+ deviceId: number(),
21870
+ /** How many frames to collect. The caller sizes this against what its
21871
+ * own confirmation needs; the runner clamps it to the field's range. */
21872
+ frames: number().int().positive().optional(),
21873
+ /** Why, for the log. A burst nobody can attribute is a cost nobody can
21874
+ * defend — the periodic one at least has a timer to point at. */
21875
+ reason: string()
21876
+ }), object({
21877
+ started: boolean(),
21878
+ refusedBecause: OccupancyBurstRefusalSchema.optional()
21879
+ }), {
21880
+ auth: "admin",
21881
+ kind: "mutation"
21882
+ }), method(object({
21729
21883
  handle: FrameHandleSchema,
21730
21884
  bbox: NativeCropBboxSchema,
21731
21885
  maxWidth: number().int().positive().optional(),
@@ -27194,7 +27348,7 @@ var NativeDetectionSchema = object({
27194
27348
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
27195
27349
  confidence: number().min(0).max(1).optional()
27196
27350
  });
27197
- object({
27351
+ var NativeObjectDetectionStatusSchema = object({
27198
27352
  /**
27199
27353
  * Last observed instance per class. Missing entries mean the class
27200
27354
  * is supported but nothing has been seen since the provider started.
@@ -27211,14 +27365,56 @@ object({
27211
27365
  supportedClasses: array(NativeObjectClassEnum).readonly(),
27212
27366
  /**
27213
27367
  * Whether forwarding of onboard AI detections is enabled for this device.
27214
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
27215
- * churn the tracker, so forwarding stays off until the operator enables it.
27368
+ *
27369
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
27370
+ * camera runs — that is the operator's choice, and it is made where every
27371
+ * other detection choice is made. `geometry` on
27372
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
27373
+ * choice would buy this particular camera.
27216
27374
  */
27217
27375
  enabled: boolean()
27218
- }).extend({
27376
+ });
27377
+ /**
27378
+ * WHEN a camera's onboard detections carry geometry.
27379
+ *
27380
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
27381
+ * a detection is a trackable subject whenever the camera sees one.
27382
+ * - `while-streaming` — only while some stream of this camera is already open.
27383
+ * The boxes ride the video's own side-channel rather than a feed of their
27384
+ * own, so they cost nothing and they exist only when something is pulling.
27385
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
27386
+ * radio drain, but a camera that is awake is awake precisely because
27387
+ * something is in front of it, and its stream is already being pulled.
27388
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
27389
+ * pipeline needs geometry to make a subject, so such a push reaches the
27390
+ * tracker as motion and no further.
27391
+ *
27392
+ * Reported and not inferred, because the operator's question in front of the
27393
+ * picker is "what do I get", and these are three different answers (D14: the
27394
+ * derived form is only as honest as `getOptions`).
27395
+ */
27396
+ var NativeObjectGeometryEnum = _enum([
27397
+ "boxed",
27398
+ "while-streaming",
27399
+ "flag-only"
27400
+ ]);
27401
+ var NativeObjectDetectionOptionsSchema = object({
27402
+ /** Classes this firmware can detect — the same list the status reports. */
27403
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
27404
+ /** What a detection from this camera carries. */
27405
+ geometry: NativeObjectGeometryEnum
27406
+ });
27407
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
27408
+ NativeObjectDetectionStatusSchema.extend({
27219
27409
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
27220
27410
  lastFetchedAt: number() });
27221
- DeviceType.Camera, method(object({
27411
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
27412
+ deviceId: number(),
27413
+ settings: NativeObjectDetectionSettingsPatchSchema
27414
+ }), _void(), {
27415
+ kind: "mutation",
27416
+ auth: "admin"
27417
+ }), method(object({
27222
27418
  deviceId: number(),
27223
27419
  enabled: boolean()
27224
27420
  }), _void(), {
@@ -31017,7 +31213,28 @@ var PerScopeBreakdownSchema = object({
31017
31213
  /** Total tracked objects in this scope (frame / zone / unzoned). */
31018
31214
  totalObjects: number().int().nonnegative(),
31019
31215
  /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */
31020
- byClass: record(string(), number().int().nonnegative())
31216
+ byClass: record(string(), number().int().nonnegative()),
31217
+ /**
31218
+ * Of `totalObjects`, how many are STANDING — objects the census holds,
31219
+ * present but not going anywhere (a parked car, a bin, a statue).
31220
+ *
31221
+ * The operator's question about a scene has two halves and they answer
31222
+ * different things: "what is parked here" is stable for hours and must not
31223
+ * flap, while "who is walking through" is the thing an alert is about. One
31224
+ * number could only serve one of them, and `totalObjects` served the first
31225
+ * badly — a passer-by moved it and every occupancy rule saw a change.
31226
+ *
31227
+ * `standing + transient === totalObjects`, always. The total keeps its old
31228
+ * meaning exactly, so no rule written against it changes behaviour.
31229
+ *
31230
+ * ABSENT means UNKNOWN, never zero (D393): a snapshot from a node older than
31231
+ * this field cannot say, and a reader that folds absence in as 0 reports "no
31232
+ * parked objects here" about a camera whose lot is full.
31233
+ */
31234
+ standingObjects: number().int().nonnegative().optional(),
31235
+ /** Of `totalObjects`, how many are passing through. See `standingObjects` —
31236
+ * same absence rule. */
31237
+ transientObjects: number().int().nonnegative().optional()
31021
31238
  });
31022
31239
  var ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({
31023
31240
  zoneId: string(),
@@ -33956,12 +34173,24 @@ Object.freeze({
33956
34173
  addonId: null,
33957
34174
  access: "create"
33958
34175
  },
34176
+ "nativeObjectDetection.getOptions": {
34177
+ capName: "native-object-detection",
34178
+ capScope: "device",
34179
+ addonId: null,
34180
+ access: "view"
34181
+ },
33959
34182
  "nativeObjectDetection.setEnabled": {
33960
34183
  capName: "native-object-detection",
33961
34184
  capScope: "device",
33962
34185
  addonId: null,
33963
34186
  access: "create"
33964
34187
  },
34188
+ "nativeObjectDetection.setSettings": {
34189
+ capName: "native-object-detection",
34190
+ capScope: "device",
34191
+ addonId: null,
34192
+ access: "create"
34193
+ },
33965
34194
  "navigation.getFeatures": {
33966
34195
  capName: "navigation",
33967
34196
  capScope: "device",
@@ -34226,6 +34455,12 @@ Object.freeze({
34226
34455
  addonId: null,
34227
34456
  access: "view"
34228
34457
  },
34458
+ "notificationRules.getClipRetentionAsks": {
34459
+ capName: "notification-rules",
34460
+ capScope: "system",
34461
+ addonId: null,
34462
+ access: "view"
34463
+ },
34229
34464
  "notificationRules.getConditionCatalog": {
34230
34465
  capName: "notification-rules",
34231
34466
  capScope: "system",
@@ -34736,6 +34971,12 @@ Object.freeze({
34736
34971
  addonId: null,
34737
34972
  access: "create"
34738
34973
  },
34974
+ "pipelineAnalytics.readLongTermSeries": {
34975
+ capName: "pipeline-analytics",
34976
+ capScope: "device",
34977
+ addonId: null,
34978
+ access: "view"
34979
+ },
34739
34980
  "pipelineAnalytics.rebuildObjectEmbeddings": {
34740
34981
  capName: "pipeline-analytics",
34741
34982
  capScope: "device",
@@ -35408,6 +35649,12 @@ Object.freeze({
35408
35649
  addonId: null,
35409
35650
  access: "create"
35410
35651
  },
35652
+ "pipelineRunner.requestOccupancyBurst": {
35653
+ capName: "pipeline-runner",
35654
+ capScope: "system",
35655
+ addonId: null,
35656
+ access: "create"
35657
+ },
35411
35658
  "pipelineRunner.runDetailSubtree": {
35412
35659
  capName: "pipeline-runner",
35413
35660
  capScope: "system",
@@ -38188,11 +38435,21 @@ Object.freeze({
38188
38435
  form: "single",
38189
38436
  optional: false
38190
38437
  }],
38438
+ "nativeObjectDetection.getOptions": [{
38439
+ name: "deviceId",
38440
+ form: "single",
38441
+ optional: false
38442
+ }],
38191
38443
  "nativeObjectDetection.setEnabled": [{
38192
38444
  name: "deviceId",
38193
38445
  form: "single",
38194
38446
  optional: false
38195
38447
  }],
38448
+ "nativeObjectDetection.setSettings": [{
38449
+ name: "deviceId",
38450
+ form: "single",
38451
+ optional: false
38452
+ }],
38196
38453
  "navigation.getFeatures": [{
38197
38454
  name: "deviceId",
38198
38455
  form: "single",
@@ -38542,6 +38799,11 @@ Object.freeze({
38542
38799
  form: "single",
38543
38800
  optional: false
38544
38801
  }],
38802
+ "pipelineAnalytics.readLongTermSeries": [{
38803
+ name: "deviceId",
38804
+ form: "single",
38805
+ optional: false
38806
+ }],
38545
38807
  "pipelineAnalytics.rebuildObjectEmbeddings": [{
38546
38808
  name: "deviceId",
38547
38809
  form: "single",
@@ -38732,6 +38994,11 @@ Object.freeze({
38732
38994
  form: "single",
38733
38995
  optional: false
38734
38996
  }],
38997
+ "pipelineRunner.requestOccupancyBurst": [{
38998
+ name: "deviceId",
38999
+ form: "single",
39000
+ optional: false
39001
+ }],
38735
39002
  "pipelineRunner.runDetailSubtree": [{
38736
39003
  name: "deviceId",
38737
39004
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.109",
3
+ "version": "1.2.110",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",