@camstack/system 1.2.88 → 1.2.90

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.
Files changed (53) hide show
  1. package/dist/addon-runner.js +52 -6
  2. package/dist/addon-runner.mjs +52 -6
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/console-logging/index.js +1 -1
  12. package/dist/builtins/console-logging/index.mjs +1 -1
  13. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  14. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  15. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  16. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  17. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  18. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  19. package/dist/builtins/hub-forwarder/index.js +1 -1
  20. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  21. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  22. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  23. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  24. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  25. package/dist/builtins/local-network/local-network.addon.js +1 -1
  26. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  27. package/dist/builtins/loki-logging/index.js +1 -1
  28. package/dist/builtins/loki-logging/index.mjs +1 -1
  29. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  31. package/dist/builtins/platform-probe/index.js +1 -1
  32. package/dist/builtins/platform-probe/index.mjs +1 -1
  33. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/snapshot/index.js +1 -1
  36. package/dist/builtins/snapshot/index.mjs +1 -1
  37. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  41. package/dist/builtins/storage-orchestrator/index.mjs +1 -1
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +47 -3
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +46 -3
  44. package/dist/builtins/system-config/system-config.addon.js +1 -1
  45. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  46. package/dist/builtins/winston-logging/index.js +1 -1
  47. package/dist/builtins/winston-logging/index.mjs +1 -1
  48. package/dist/{dist-B4WyhfjH.js → dist-CYqL8oZq.js} +2121 -37
  49. package/dist/{dist-DlDY9mQO.mjs → dist-DMhxx5Kr.mjs} +2121 -37
  50. package/dist/index.js +2 -46
  51. package/dist/index.mjs +2 -46
  52. package/dist/kernel/moleculer/init-watchdog.d.ts +60 -0
  53. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- //#region ../types/dist/event-category-Cv9dO26A.mjs
2
+ //#region ../types/dist/event-category-Bxo5yJjt.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -206,6 +206,33 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
206
206
  EventCategory["PipelineCameraAssigned"] = "pipeline.camera-assigned";
207
207
  EventCategory["PipelineCameraUnassigned"] = "pipeline.camera-unassigned";
208
208
  /**
209
+ * A node the orchestrator would otherwise place cameras on has NO usable
210
+ * inference device: the operator enabled one or more accelerators there and
211
+ * the live probe reports every one of them unavailable. Emitted once per
212
+ * TRANSITION into that state (never per dispatch), and the node is dropped
213
+ * from the placement candidate set for as long as it holds.
214
+ *
215
+ * This exists because the state was previously invisible: little-unraid
216
+ * absorbed 283k inference errors in a day while still being handed cameras,
217
+ * and nothing in the system said so.
218
+ *
219
+ * A node with no accelerators configured at all is NOT this — its devices
220
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
221
+ * serves it exactly as before.
222
+ */
223
+ EventCategory["PipelineNodeInferenceUnavailable"] = "pipeline.node-inference-unavailable";
224
+ /**
225
+ * A camera has an OPEN detection session and has produced no detection at
226
+ * all for longer than the blind threshold — the camera is being decoded and
227
+ * inferred and is returning nothing. Emitted once per transition into blind,
228
+ * per camera.
229
+ *
230
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
231
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
232
+ * camera" produce byte-identical silence.
233
+ */
234
+ EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
235
+ /**
209
236
  * Per-camera pipeline config was mutated by the orchestrator
210
237
  * (3-level settings change via `setAgentAddonDefaults` /
211
238
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -701,6 +728,12 @@ var WELL_KNOWN_TAB_MAP = Object.fromEntries([
701
728
  icon: "shapes",
702
729
  order: 38
703
730
  },
731
+ {
732
+ id: "scenes",
733
+ label: "Scenes",
734
+ icon: "scan-eye",
735
+ order: 36
736
+ },
704
737
  {
705
738
  id: "analytics",
706
739
  label: "Analytics",
@@ -12171,6 +12204,8 @@ var NcSystemEventKindSchema = z.enum([
12171
12204
  "stream-offline",
12172
12205
  "node-online",
12173
12206
  "node-offline",
12207
+ "node-inference-unavailable",
12208
+ "detection-blind",
12174
12209
  "addon-update-available",
12175
12210
  "server-update-available",
12176
12211
  "alarm-triggered",
@@ -12234,7 +12269,16 @@ var NcScheduleSchema = z.object({
12234
12269
  });
12235
12270
  /** Fuzzy plate matcher — OCR noise makes exact match useless (spec row 12/13). */
12236
12271
  var NcPlateMatcherSchema = z.object({
12237
- values: z.array(z.string().min(1)).min(1),
12272
+ /**
12273
+ * Plate texts (or gallery vehicle names) to match. EMPTY = **any plate the
12274
+ * pipeline could read** — the plate half of "no selection = no narrowing",
12275
+ * and the switch that says this rule is about vehicles that were IDENTIFIED
12276
+ * rather than merely seen. A subject carrying no plate still fails.
12277
+ *
12278
+ * The `.min(1)` this used to carry made that state unauthorable; nothing has
12279
+ * ever persisted an empty list, so widening it cannot change an existing rule.
12280
+ */
12281
+ values: z.array(z.string().min(1)),
12238
12282
  /** Max Levenshtein distance after normalization (uppercase alphanumeric). */
12239
12283
  maxDistance: z.number().int().min(0).max(3).default(1)
12240
12284
  });
@@ -12484,18 +12528,47 @@ var NcConditionsSchema = z.object({
12484
12528
  */
12485
12529
  labelEquals: z.array(z.string().min(1)).optional(),
12486
12530
  /**
12487
- * Identity matcher. P1 boundary: matched against the record's collapsed
12488
- * `label` (the identity display name propagated by the face pipeline) —
12489
- * identity-ID matching rides in P2 when identity ids reach the record.
12531
+ * KNOWN FACES the rule's identity scope, and the switch that says the rule
12532
+ * is about recognised people at all.
12533
+ *
12534
+ * Three states, and the empty one is the point:
12535
+ *
12536
+ * | value | meaning |
12537
+ * | --- | --- |
12538
+ * | absent | the rule does not care who it is; an unrecognised person matches |
12539
+ * | `[]` | **only known faces** — any identity in the gallery, nobody in particular |
12540
+ * | a list | only these identities |
12541
+ *
12542
+ * `[]` is the repo-wide "no selection = no narrowing" reading (an absent
12543
+ * `devices` list is every device), applied one level down: the operator has
12544
+ * turned the face scope ON and narrowed it to nothing, which is every known
12545
+ * face. No second field states the same thing — a switch that can disagree
12546
+ * with the list under it is worse than no switch (D62).
12547
+ *
12548
+ * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
12549
+ * renameable, and a rule authored on "Gianluca" went silently dark the moment
12550
+ * the operator fixed the spelling. The id reaches the record on
12551
+ * `LabelAttribution.identityId`; the name is what the editor shows and what
12552
+ * `{{label}}` renders.
12553
+ *
12554
+ * Rules written before this carry NAMES, and are resolved to ids lazily at
12555
+ * load (`NcRuleStore.load`) against the live gallery — a name nothing answers
12556
+ * for is left as it stands and reported, never dropped. The engine also
12557
+ * accepts a display-name hit as a compatibility leg, so a rule whose
12558
+ * migration could not resolve keeps matching exactly what it matched before.
12490
12559
  */
12491
12560
  identities: z.array(z.string().min(1)).optional(),
12492
- /** Fuzzy plate matcher against the record's `label` (plate text). */
12561
+ /**
12562
+ * KNOWN PLATES / VEHICLES — the plate mirror of {@link identities}, including
12563
+ * the empty-list reading: `values: []` is "any plate the OCR could read",
12564
+ * a non-empty list is those plates (fuzzily). See {@link NcPlateMatcherSchema}.
12565
+ */
12493
12566
  plates: NcPlateMatcherSchema.optional(),
12494
12567
  /**
12495
- * Identity EXCLUDE — mirror of {@link identities} with `notIn` semantics.
12496
- * Same P1 boundary: matched against the record's collapsed `label` (the
12497
- * identity display name). A record with NO label passes (nothing to
12498
- * exclude), unlike the include variant which fails on an absent label.
12568
+ * Identity EXCLUDE — mirror of {@link identities} with `notIn` semantics, and
12569
+ * the same id members and the same lazy name→id migration. A record with NO
12570
+ * identity passes (nothing to exclude), unlike the include variant which
12571
+ * fails on an unrecognised subject. An EMPTY list excludes nobody.
12499
12572
  */
12500
12573
  identitiesExclude: z.array(z.string().min(1)).optional(),
12501
12574
  /**
@@ -12887,7 +12960,80 @@ var NcRuleInputSchema = z.object({
12887
12960
  * a rule that predates the gate must keep delivering byte-for-byte as it
12888
12961
  * did, and absent is the only way to say that without a migration.
12889
12962
  */
12890
- confirm: NcConfirmSchema.optional()
12963
+ confirm: NcConfirmSchema.optional(),
12964
+ /**
12965
+ * WAIT for face/plate recognition before saying anything.
12966
+ *
12967
+ * A notification's TEXT is frozen at enqueue and its media is re-resolved at
12968
+ * send; the identity is neither. A face is confirmed after `confirmFrames`
12969
+ * agreeing observations — p50 **11.4 s** after the track was first seen,
12970
+ * measured on this hub — and an `immediate` rule enqueues on the first object
12971
+ * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
12972
+ * immediate path, and no amount of media re-resolution fixes a sentence.
12973
+ *
12974
+ * Only two honest answers exist, and this flag picks between them. It has
12975
+ * effect ONLY on a rule that declares a recognition scope
12976
+ * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
12977
+ * other rule there is nothing to wait for and the flag is inert.
12978
+ *
12979
+ * | value | what happens |
12980
+ * | --- | --- |
12981
+ * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
12982
+ * | absent / `false` | it fires at once WITHOUT the name, and if recognition lands before the track closes a SECOND, "…is Gianluca" notification follows (one per track, per rule, per target) |
12983
+ *
12984
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
12985
+ * on the addon cap path, and absent has to keep meaning exactly what every
12986
+ * rule authored before this field meant.
12987
+ *
12988
+ * The cost of `true` is stated here because the editor states it too: a rule
12989
+ * that waits also inherits track-close SEMANTICS — its `zones` condition
12990
+ * tests every zone the track visited and a `crossing` condition can no longer
12991
+ * be satisfied, because a closed track carries no crossing.
12992
+ */
12993
+ waitForEnhancement: z.boolean().optional(),
12994
+ /**
12995
+ * GROUP a burst of subjects into ONE notification that grows.
12996
+ *
12997
+ * Seconds of quiet after the last matching subject before the burst is
12998
+ * considered over. While it is open, the first subject enqueues immediately —
12999
+ * **exactly as today, with no added latency** — and every real growth (a new
13000
+ * subject, or a name confirmed on one already in it) REPLACES that
13001
+ * notification with an updated one naming everybody. The push carries the
13002
+ * group's own coalescing tag, so the phone replaces rather than stacks.
13003
+ *
13004
+ * `0` / absent = off, and off is today's behaviour byte for byte.
13005
+ *
13006
+ * ### Why an idle cutoff and not a window
13007
+ *
13008
+ * The measured seven-person arrival on device 590 spans 110 s with every
13009
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
13010
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
13011
+ * 30 is Frigate's shipped value for the same decision.
13012
+ *
13013
+ * ### What it replaces
13014
+ *
13015
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
13016
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
13017
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
13018
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
13019
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
13020
+ * budget over GROUPS — which is what it always meant — and a growth is never
13021
+ * throttled by the window its own first member spent.
13022
+ *
13023
+ * ### Interaction with {@link waitForEnhancement}
13024
+ *
13025
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
13026
+ * TRACK CLOSE, so with both set the group is opened by the first member to
13027
+ * CLOSE — already carrying its name — and grows as later members close. That
13028
+ * is later, and complete. With grouping alone the group opens on the first
13029
+ * object event and picks up names as they are confirmed, through the growth
13030
+ * path. Neither combination fires twice for one subject.
13031
+ *
13032
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
13033
+ * on the addon cap path, so absent must keep meaning what it meant before this
13034
+ * field existed.
13035
+ */
13036
+ groupIdleSec: z.number().int().min(0).max(600).optional()
12891
13037
  });
12892
13038
  /**
12893
13039
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -13501,7 +13647,87 @@ var MethodAccessSchema = z.enum([
13501
13647
  var AllowedProviderSchema = z.union([z.literal("*"), z.array(z.string())]);
13502
13648
  var AllowedDevicesSchema = z.record(z.string(), z.union([z.literal("*"), z.array(z.string())]));
13503
13649
  var CapScopeSchema = z.enum(["device", "system"]);
13504
- var TokenScopeSchema = z.discriminatedUnion("type", [
13650
+ /**
13651
+ * DeviceSelector (scope model v3 — 2026-08-12).
13652
+ *
13653
+ * A `device` grant no longer carries a frozen list of deviceIds. It carries
13654
+ * a SELECTOR the matcher resolves against the live fleet, so the grant can be
13655
+ * DYNAMIC: a `types:['camera']` selector automatically covers a camera added
13656
+ * AFTER the grant was minted — no re-grant, no re-login.
13657
+ *
13658
+ * - `all` — every device in the deployment. The broad viewer/operator
13659
+ * lever without a `category` grant (a `category` grant also covers device
13660
+ * caps that carry no deviceId; `all` is specifically the device set).
13661
+ * - `ids` — an explicit deviceId list. This is what a v2 `device:[…]`
13662
+ * grant migrates to (see {@link TokenScopeSchema}); STATIC — a new camera
13663
+ * is NOT covered until the grant is edited.
13664
+ * - `types` — every device of a `DeviceType` (e.g. every `camera`).
13665
+ * DYNAMIC. A device that changes type, or a new device of the type,
13666
+ * re-resolves on the next request.
13667
+ * - `locations` — every device whose operator-assigned `location` label is
13668
+ * in the set (e.g. "Garden", "Front door"). DYNAMIC. A device with a
13669
+ * null/unset location matches NO `locations` selector.
13670
+ */
13671
+ var DeviceSelectorSchema = z.discriminatedUnion("kind", [
13672
+ z.object({ kind: z.literal("all") }),
13673
+ z.object({
13674
+ kind: z.literal("ids"),
13675
+ ids: z.array(z.number().int()).min(1)
13676
+ }),
13677
+ z.object({
13678
+ kind: z.literal("types"),
13679
+ types: z.array(z.enum(DeviceType)).min(1)
13680
+ }),
13681
+ z.object({
13682
+ kind: z.literal("locations"),
13683
+ locations: z.array(z.string().min(1)).min(1)
13684
+ })
13685
+ ]);
13686
+ var DeviceTokenScopeSchema = z.object({
13687
+ type: z.literal("device"),
13688
+ /** The device SET this grant covers — resolved against the live fleet. */
13689
+ selector: DeviceSelectorSchema,
13690
+ access: z.array(MethodAccessSchema).min(1),
13691
+ /**
13692
+ * Whether a grant on a PARENT device transparently covers its accessory
13693
+ * CHILDREN (siren / floodlight / PIR) via the persisted-parentage walk.
13694
+ * Direction is parent → children ONLY.
13695
+ *
13696
+ * Absent → the matcher DERIVES it from the access flavour: `view`
13697
+ * inherits (a camera viewer sees the camera's accessories), `create` /
13698
+ * `delete` do NOT (actuating/removing a child is an explicit act the
13699
+ * operator must grant on the child, not inherit from the parent). Set it
13700
+ * explicitly to override that default per grant.
13701
+ */
13702
+ includeLinked: z.boolean().optional()
13703
+ });
13704
+ /**
13705
+ * v2 → v3 lazy migration. A pre-v3 `device` grant carried
13706
+ * `targets: string[]` (stringified deviceIds); it rewrites to the equivalent
13707
+ * `selector: {kind:'ids', ids}`. Applied as a `preprocess` so it runs on
13708
+ * EVERY parse path — stored records AND the JWT-carried scope arrays
13709
+ * normalised at the request boundary ({@link normalizeTokenScopes} in
13710
+ * `device-selector.ts`). Chosen over a one-time DB migration because a
13711
+ * migration cannot reach a JWT already in a client's hands; parse-time
13712
+ * migration covers both without a flag day. No cast — the raw object is read
13713
+ * through `Reflect.get` (its static type is `unknown`).
13714
+ */
13715
+ function migrateLegacyTokenScope(raw) {
13716
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return raw;
13717
+ if (Reflect.get(raw, "type") !== "device") return raw;
13718
+ if (Reflect.get(raw, "selector") !== void 0) return raw;
13719
+ const targets = Reflect.get(raw, "targets");
13720
+ if (!Array.isArray(targets)) return raw;
13721
+ return {
13722
+ type: "device",
13723
+ selector: {
13724
+ kind: "ids",
13725
+ ids: targets.map((t) => typeof t === "string" ? Number(t) : t).filter((n) => typeof n === "number" && Number.isInteger(n))
13726
+ },
13727
+ access: Reflect.get(raw, "access")
13728
+ };
13729
+ }
13730
+ var TokenScopeSchema = z.preprocess(migrateLegacyTokenScope, z.discriminatedUnion("type", [
13505
13731
  z.object({
13506
13732
  type: z.literal("category"),
13507
13733
  target: CapScopeSchema,
@@ -13517,18 +13743,8 @@ var TokenScopeSchema = z.discriminatedUnion("type", [
13517
13743
  target: z.string(),
13518
13744
  access: z.array(MethodAccessSchema).min(1)
13519
13745
  }),
13520
- z.object({
13521
- type: z.literal("device"),
13522
- /**
13523
- * One or more deviceIds (serialised as strings for wire-format
13524
- * consistency with the rest of the union). Matcher accepts if
13525
- * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
13526
- * of one scope-per-device when granting access to a set of cameras.
13527
- */
13528
- targets: z.array(z.string()).min(1),
13529
- access: z.array(MethodAccessSchema).min(1)
13530
- })
13531
- ]);
13746
+ DeviceTokenScopeSchema
13747
+ ]));
13532
13748
  var UserRecordSchema = z.object({
13533
13749
  id: z.string(),
13534
13750
  username: z.string(),
@@ -13851,7 +14067,7 @@ var TrackEnvelopeSchema = z.object({
13851
14067
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
13852
14068
  * keeps every scalar the list surfaces actually render (ids, class(es),
13853
14069
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
13854
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
14070
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
13855
14071
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
13856
14072
  * `getTrack`. Mirrors the event-store `projection` convention
13857
14073
  * (`getObjectEvents` et al.).
@@ -13987,7 +14203,21 @@ z.union([z.literal(1), z.literal(2)]);
13987
14203
  var LabelAttributionSchema = z.object({
13988
14204
  stepId: z.string(),
13989
14205
  modelId: z.string().optional(),
13990
- decidedAt: z.number()
14206
+ decidedAt: z.number(),
14207
+ /**
14208
+ * The GALLERY id behind a recognised tier-2 label — a face-gallery
14209
+ * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
14210
+ *
14211
+ * The text alone is a DISPLAY NAME, and a display name is renameable: a
14212
+ * notification rule authored on "Gianluca" stopped matching the moment the
14213
+ * operator fixed the spelling in the gallery, and nothing said so. The id is
14214
+ * the thing that does not move, so it is what a rule matches on
14215
+ * (`NcConditions.identities`) and the text is what a human is shown.
14216
+ *
14217
+ * Absent when the label names no gallery row — a plate the OCR read but no
14218
+ * vehicle claims, a sub-class, a species, any tier-1 value.
14219
+ */
14220
+ identityId: z.string().optional()
13991
14221
  });
13992
14222
  /**
13993
14223
  * The TIERED label model (roadmap 4g), spread into `TrackSchema` and
@@ -14124,6 +14354,28 @@ var TrackSchema = z.object({
14124
14354
  * `=== true` and render nothing otherwise, never infer "no face".
14125
14355
  */
14126
14356
  hasFace: z.boolean().optional(),
14357
+ /**
14358
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
14359
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
14360
+ * so the passage is tracked once and as a VEHICLE.
14361
+ *
14362
+ * It exists because the fold's record was dishonest. D34 and the code both
14363
+ * said "the person is not lost — it is reported so both entities stay on the
14364
+ * record"; in fact the pair went into a per-processor RAM field behind an
14365
+ * accessor nobody called, and every durable surface said `vehicle`, full
14366
+ * stop. This is the composition note that makes the row true.
14367
+ *
14368
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
14369
+ * person" is not an answer to "what is this" — both label tiers would refuse
14370
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
14371
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
14372
+ * and a `person` rule still does not fire for someone cycling past.
14373
+ *
14374
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
14375
+ * the column, and every hub that predates the field, omits it. Test
14376
+ * `=== true` and render nothing otherwise — never infer "no rider".
14377
+ */
14378
+ hasRider: z.boolean().optional(),
14127
14379
  ...TrackFlagFields,
14128
14380
  ...TrackRetrainFields
14129
14381
  });
@@ -16144,7 +16396,7 @@ var detectionFpsField = {
16144
16396
  var occupancyRecheckSecField = {
16145
16397
  min: 0,
16146
16398
  max: 300,
16147
- default: 30,
16399
+ default: 300,
16148
16400
  step: 5
16149
16401
  };
16150
16402
  var occupancyRecheckFramesField = {
@@ -22768,7 +23020,41 @@ var intercomCapability = {
22768
23020
  status: {
22769
23021
  schema: IntercomStatusSchema,
22770
23022
  kind: "command-driven"
22771
- }
23023
+ },
23024
+ /**
23025
+ * Runtime-state slice — mirrored by the kernel.
23026
+ *
23027
+ * The cap declared `status` and nothing else, so the only two sources an
23028
+ * exporter has for a value — the `device.state-changed` slice event and the
23029
+ * `deviceState.getAllSnapshots` snapshot, both built from runtime state —
23030
+ * carried nothing for `intercom`. A talk-back entity in Home Assistant would
23031
+ * have been published and never received a value, which is the defect the
23032
+ * export's two classification tables exist to prevent (177 of them, once), so
23033
+ * `intercom` was excluded rather than exported.
23034
+ *
23035
+ * The shape is the status shape: there is exactly one truth about talk-back
23036
+ * and duplicating it into a second schema is how two halves of one capability
23037
+ * come to disagree. Providers write it through
23038
+ * `this.runtimeState.setCapState('intercom', …)` at the four points that open
23039
+ * and close a session, and seed it at registration so the slice exists before
23040
+ * the first session rather than after it.
23041
+ *
23042
+ * **Bound, named rather than hidden:** `talking` mirrors the provider's own
23043
+ * session handle, so a session torn down by a transport death that never
23044
+ * reaches `stopSession` / `endTalkSession` leaves it latched until the next
23045
+ * session or the next restart. That is why the slice is `session` and not
23046
+ * `restored` — a restart must never restore "talking".
23047
+ */
23048
+ runtimeState: IntercomStatusSchema,
23049
+ /**
23050
+ * Runtime-state durability: **session** — `talking` describes a live audio
23051
+ * session, which by definition does not survive the process that held it.
23052
+ * Restoring it would publish a camera as talking to nobody.
23053
+ *
23054
+ * See `RuntimeStateDurability`. Enforced by
23055
+ * `scripts/check-runtime-state-durability.ts`.
23056
+ */
23057
+ durability: "session"
22772
23058
  };
22773
23059
  /**
22774
23060
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
@@ -25928,7 +26214,7 @@ var recordingCapability = {
25928
26214
  toMs: z.number()
25929
26215
  }), RecordingAvailabilitySchema, {
25930
26216
  kind: "query",
25931
- auth: "admin"
26217
+ auth: "protected"
25932
26218
  }),
25933
26219
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
25934
26220
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
@@ -25940,7 +26226,7 @@ var recordingCapability = {
25940
26226
  tzOffsetMinutes: z.number()
25941
26227
  }), RecordingDaysSchema, {
25942
26228
  kind: "query",
25943
- auth: "admin"
26229
+ auth: "protected"
25944
26230
  }),
25945
26231
  getPlaybackManifest: method(z.object({
25946
26232
  deviceId: z.number(),
@@ -25948,7 +26234,7 @@ var recordingCapability = {
25948
26234
  toMs: z.number()
25949
26235
  }), RecordingManifestSchema, {
25950
26236
  kind: "query",
25951
- auth: "admin"
26237
+ auth: "protected"
25952
26238
  }),
25953
26239
  getStorageUsage: method(z.object({}), RecordingStorageUsageSchema, {
25954
26240
  kind: "query",
@@ -26361,9 +26647,33 @@ var recordingExportCapability = {
26361
26647
  * settings-contribution methods. `status.kind:'push'` — the engine pushes on
26362
26648
  * every hysteresis flip / availability change; consumers never poll.
26363
26649
  */
26364
- /** Extensible condition tag. Seeded 'day' | 'night'; open by design so more can
26365
- * be added without a wire break (matching falls back to any-condition refs). */
26650
+ /** Extensible condition tag. Seeded 'day' | 'ir' (the two variants the operator
26651
+ * captures) plus 'night' | 'dawn' | 'dusk' from the resolver's sun-times band.
26652
+ * Open by design so more can be added without a wire break.
26653
+ *
26654
+ * Matching does NOT fall back across conditions: cross-condition cosines are
26655
+ * not comparable, so "I have never seen this scene in this light" is reported
26656
+ * as `unknown`, never guessed. A day reference scored against an IR frame
26657
+ * collapses the cosine and would latch a false alarm every single night. */
26366
26658
  var SceneConditionSchema = z.string();
26659
+ /** `matched` = the baseline is what we see; `diverged` = it demonstrably is not;
26660
+ * `unknown` = we cannot judge (no reference for this condition, encoder model
26661
+ * changed, view shifted, no snapshot). `unknown` is a real value, not a null,
26662
+ * and never counts toward hysteresis in either direction. */
26663
+ var SceneVerdictSchema = z.enum([
26664
+ "matched",
26665
+ "diverged",
26666
+ "unknown"
26667
+ ]);
26668
+ /** Why a scene cannot judge. Named, because this feature's failure mode is
26669
+ * silence that reads as "nothing has happened". */
26670
+ var SceneUnavailableSchema = z.enum([
26671
+ "no-reference-for-condition",
26672
+ "view-shifted",
26673
+ "no-vision-profile",
26674
+ "encoder-model-changed",
26675
+ "no-snapshot"
26676
+ ]);
26367
26677
  /** One captured reference — condition-tagged, model-version-gated. `embedding`
26368
26678
  * is `number[]` (Float32Array does NOT survive MsgPack/UDS). */
26369
26679
  var SceneReferenceSchema = z.object({
@@ -26371,7 +26681,14 @@ var SceneReferenceSchema = z.object({
26371
26681
  modelId: z.string(),
26372
26682
  condition: SceneConditionSchema,
26373
26683
  capturedAt: z.number(),
26374
- thumbnailMediaId: z.string().optional()
26684
+ thumbnailMediaId: z.string().optional(),
26685
+ /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
26686
+ * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
26687
+ * normalized rect frame a different piece of world, and the scene would
26688
+ * diverge forever with a perfectly plausible cosine. Checked LAZILY, only
26689
+ * when hysteresis is about to flip — one extra encode per candidate
26690
+ * transition, not per poll. */
26691
+ anchorEmbedding: z.array(z.number()).optional()
26375
26692
  });
26376
26693
  var SceneMonitorStateSchema = z.object({
26377
26694
  id: z.string(),
@@ -26393,6 +26710,25 @@ var SceneCheckSchema = z.discriminatedUnion("mode", [z.object({
26393
26710
  profileId: z.string().optional(),
26394
26711
  hysteresisCount: z.number().int().positive()
26395
26712
  })]);
26713
+ var SCENE_DEFAULT_ANCHOR_THRESHOLD = .85;
26714
+ /**
26715
+ * Vision-model adjudication of a candidate flip. Field names deliberately
26716
+ * mirror `NcConfirmSchema` so an operator meets one vocabulary, not two.
26717
+ *
26718
+ * `onTimeout` defaults to **'hold'**, the OPPOSITE of `NcConfirmGate`'s
26719
+ * fail-open: a notification suppressed is the worse error there, but a vision
26720
+ * model that timed out has not told us the bin is gone, and a latch is a
26721
+ * stateful claim that costs the operator a trip to reset.
26722
+ */
26723
+ var SceneConfirmSchema = z.object({
26724
+ enabled: z.boolean().default(false),
26725
+ prompt: z.string().min(1).max(1e3),
26726
+ profileId: z.string().optional(),
26727
+ timeoutMs: z.number().int().min(1e3).max(2e4).default(8e3),
26728
+ maxImagePx: z.number().int().min(64).max(2048).default(448),
26729
+ /** What a timeout / unavailable model means for the PENDING flip. */
26730
+ onTimeout: z.enum(["flip", "hold"]).default("hold")
26731
+ });
26396
26732
  var SceneMonitorSchema = z.object({
26397
26733
  id: z.string(),
26398
26734
  label: z.string(),
@@ -26411,7 +26747,41 @@ var SceneMonitorSchema = z.object({
26411
26747
  lastConfidence: z.number().nullable(),
26412
26748
  currentCondition: SceneConditionSchema.nullable(),
26413
26749
  availability: z.enum(["ok", "unavailable"]),
26414
- unavailableReason: z.string().nullable()
26750
+ unavailableReason: z.string().nullable(),
26751
+ /** Which state is "the initial screen". `null` until the first capture. */
26752
+ baselineStateId: z.string().nullable(),
26753
+ /** Which boolean drives notification rules and any export. */
26754
+ emit: z.enum(["latched", "live"]).default("latched"),
26755
+ /** Live: does the region match the baseline RIGHT NOW. */
26756
+ verdict: SceneVerdictSchema,
26757
+ /** Has it been `diverged` at least once since `armedAt` — the operator's boolean. */
26758
+ latched: z.boolean(),
26759
+ /** Last reset (or creation). */
26760
+ armedAt: z.number(),
26761
+ divergedAt: z.number().nullable(),
26762
+ restoredAt: z.number().nullable(),
26763
+ /** A check is only COUNTED when the device has been quiet this long. Motion
26764
+ * during the window DISCARDS the observation — a car pulling up in front of
26765
+ * the bin must not be able to spend hysteresis credit. */
26766
+ quietSeconds: z.number().int().min(0).max(3600).default(60),
26767
+ /** An observation only advances the pending count when it is at least this
26768
+ * far from the previously counted one, so N agreeing checks span real time
26769
+ * rather than N adjacent polls inside one occlusion. */
26770
+ minObservationSpacingSec: z.number().int().min(0).max(3600).default(120),
26771
+ /** Vision-model adjudication of a candidate flip. Similarity primary only. */
26772
+ confirm: SceneConfirmSchema.optional(),
26773
+ /** Whole-frame anchor cosine below which a flip is REFUSED as `view-shifted`. */
26774
+ anchorThreshold: z.number().min(0).max(1).default(SCENE_DEFAULT_ANCHOR_THRESHOLD),
26775
+ /** Clear the latch on its own when the scene matches again? Default false —
26776
+ * `restoredAt` and the `scene-restored` edge are recorded regardless, so an
26777
+ * automation can react to the bin coming back without the operator's own
26778
+ * alarm silently clearing itself. */
26779
+ autoRestore: z.boolean().default(false),
26780
+ /** Named cause when `verdict === 'unknown'`. */
26781
+ unavailable: SceneUnavailableSchema.nullable(),
26782
+ /** Conditions that have at least one comparable reference — the coverage line
26783
+ * ("day ✓ · ir ✓ · dusk ✗") that turns a silent fallback into a visible fact. */
26784
+ coveredConditions: z.array(SceneConditionSchema)
26415
26785
  });
26416
26786
  var SceneMonitorStatusSchema = z.object({
26417
26787
  monitors: z.array(SceneMonitorSchema),
@@ -26460,7 +26830,14 @@ var sceneMonitorCapability = {
26460
26830
  "both"
26461
26831
  ]).optional(),
26462
26832
  checkIntervalSec: z.number().optional(),
26463
- check: SceneCheckSchema.optional()
26833
+ check: SceneCheckSchema.optional(),
26834
+ emit: z.enum(["latched", "live"]).optional(),
26835
+ quietSeconds: z.number().int().min(0).max(3600).optional(),
26836
+ minObservationSpacingSec: z.number().int().min(0).max(3600).optional(),
26837
+ anchorThreshold: z.number().min(0).max(1).optional(),
26838
+ autoRestore: z.boolean().optional(),
26839
+ /** `null` clears the vision-model adjudicator. */
26840
+ confirm: SceneConfirmSchema.nullable().optional()
26464
26841
  })
26465
26842
  }), z.void(), {
26466
26843
  kind: "mutation",
@@ -26501,6 +26878,26 @@ var sceneMonitorCapability = {
26501
26878
  }), z.void(), {
26502
26879
  kind: "mutation",
26503
26880
  auth: "admin"
26881
+ }),
26882
+ /**
26883
+ * Clear the latch, re-arm, and — by default — RE-CAPTURE the baseline for
26884
+ * the CURRENT condition. The bin never goes back in exactly the same spot;
26885
+ * "reset" in the operator's head means *this is the new normal*, and
26886
+ * re-capture is what makes the feature self-healing against slow drift
26887
+ * instead of failing silently weeks later.
26888
+ *
26889
+ * Reachable from three surfaces on this one mutation: the scene card, a
26890
+ * notification button (an `onTrigger` sequence with a `kind:'cap'` step —
26891
+ * no new Notification-Center code at all), and tRPC for scripts.
26892
+ */
26893
+ resetScene: method(z.object({
26894
+ deviceId: z.number(),
26895
+ monitorId: z.string(),
26896
+ /** Defaults to TRUE at the provider seam — see `SCENE_RESET_RECAPTURES`. */
26897
+ recapture: z.boolean().optional()
26898
+ }), z.void(), {
26899
+ kind: "mutation",
26900
+ auth: "admin"
26504
26901
  })
26505
26902
  },
26506
26903
  status: {
@@ -33263,6 +33660,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
33263
33660
  addonId: null,
33264
33661
  access: "create"
33265
33662
  },
33663
+ "sceneMonitor.resetScene": {
33664
+ capName: "scene-monitor",
33665
+ capScope: "device",
33666
+ addonId: null,
33667
+ access: "delete"
33668
+ },
33266
33669
  "sceneMonitor.updateScene": {
33267
33670
  capName: "scene-monitor",
33268
33671
  capScope: "device",
@@ -34554,6 +34957,1683 @@ var METHOD_ACCESS_MAP = Object.freeze({
34554
34957
  access: "create"
34555
34958
  }
34556
34959
  });
34960
+ Object.freeze({
34961
+ "accessories.setChildHidden": [{
34962
+ name: "childDeviceId",
34963
+ form: "single",
34964
+ optional: false
34965
+ }, {
34966
+ name: "deviceId",
34967
+ form: "single",
34968
+ optional: false
34969
+ }],
34970
+ "addonSettings.getDeviceSettings": [{
34971
+ name: "deviceId",
34972
+ form: "single",
34973
+ optional: false
34974
+ }],
34975
+ "addonSettings.updateDeviceSettings": [{
34976
+ name: "deviceId",
34977
+ form: "single",
34978
+ optional: false
34979
+ }],
34980
+ "alarmPanel.arm": [{
34981
+ name: "deviceId",
34982
+ form: "single",
34983
+ optional: false
34984
+ }],
34985
+ "alarmPanel.disarm": [{
34986
+ name: "deviceId",
34987
+ form: "single",
34988
+ optional: false
34989
+ }],
34990
+ "alarmPanel.trigger": [{
34991
+ name: "deviceId",
34992
+ form: "single",
34993
+ optional: false
34994
+ }],
34995
+ "audioAnalysis.resolveDeviceSettings": [{
34996
+ name: "deviceId",
34997
+ form: "single",
34998
+ optional: false
34999
+ }],
35000
+ "audioAnalyzer.classify": [{
35001
+ name: "deviceId",
35002
+ form: "single",
35003
+ optional: true
35004
+ }],
35005
+ "audioMetrics.getCurrentSnapshot": [{
35006
+ name: "deviceId",
35007
+ form: "single",
35008
+ optional: false
35009
+ }],
35010
+ "audioMetrics.getHistory": [{
35011
+ name: "deviceId",
35012
+ form: "single",
35013
+ optional: false
35014
+ }],
35015
+ "automationControl.disable": [{
35016
+ name: "deviceId",
35017
+ form: "single",
35018
+ optional: false
35019
+ }],
35020
+ "automationControl.enable": [{
35021
+ name: "deviceId",
35022
+ form: "single",
35023
+ optional: false
35024
+ }],
35025
+ "automationControl.trigger": [{
35026
+ name: "deviceId",
35027
+ form: "single",
35028
+ optional: false
35029
+ }],
35030
+ "battery.wakeForStream": [{
35031
+ name: "deviceId",
35032
+ form: "single",
35033
+ optional: false
35034
+ }],
35035
+ "brightness.setBrightness": [{
35036
+ name: "deviceId",
35037
+ form: "single",
35038
+ optional: false
35039
+ }],
35040
+ "button.press": [{
35041
+ name: "deviceId",
35042
+ form: "single",
35043
+ optional: false
35044
+ }],
35045
+ "cameraCredentials.getCredentials": [{
35046
+ name: "deviceId",
35047
+ form: "single",
35048
+ optional: false
35049
+ }],
35050
+ "cameraStreams.getBrokerStreams": [{
35051
+ name: "deviceId",
35052
+ form: "single",
35053
+ optional: false
35054
+ }],
35055
+ "cameraStreams.getCameraStreams": [{
35056
+ name: "deviceId",
35057
+ form: "single",
35058
+ optional: false
35059
+ }],
35060
+ "cameraStreams.getProfileRtspEntries": [{
35061
+ name: "deviceId",
35062
+ form: "single",
35063
+ optional: false
35064
+ }],
35065
+ "cameraStreams.getRtspEntries": [{
35066
+ name: "deviceId",
35067
+ form: "single",
35068
+ optional: false
35069
+ }],
35070
+ "cameraStreams.pickStream": [{
35071
+ name: "deviceId",
35072
+ form: "single",
35073
+ optional: false
35074
+ }],
35075
+ "climateControl.setFanMode": [{
35076
+ name: "deviceId",
35077
+ form: "single",
35078
+ optional: false
35079
+ }],
35080
+ "climateControl.setMode": [{
35081
+ name: "deviceId",
35082
+ form: "single",
35083
+ optional: false
35084
+ }],
35085
+ "climateControl.setPreset": [{
35086
+ name: "deviceId",
35087
+ form: "single",
35088
+ optional: false
35089
+ }],
35090
+ "climateControl.setSwingHorizontal": [{
35091
+ name: "deviceId",
35092
+ form: "single",
35093
+ optional: false
35094
+ }],
35095
+ "climateControl.setSwingVertical": [{
35096
+ name: "deviceId",
35097
+ form: "single",
35098
+ optional: false
35099
+ }],
35100
+ "climateControl.setTarget": [{
35101
+ name: "deviceId",
35102
+ form: "single",
35103
+ optional: false
35104
+ }],
35105
+ "climateControl.setTargetHumidity": [{
35106
+ name: "deviceId",
35107
+ form: "single",
35108
+ optional: false
35109
+ }],
35110
+ "climateControl.setTargetRange": [{
35111
+ name: "deviceId",
35112
+ form: "single",
35113
+ optional: false
35114
+ }],
35115
+ "color.setColor": [{
35116
+ name: "deviceId",
35117
+ form: "single",
35118
+ optional: false
35119
+ }],
35120
+ "consumables.reset": [{
35121
+ name: "deviceId",
35122
+ form: "single",
35123
+ optional: false
35124
+ }],
35125
+ "control.setValue": [{
35126
+ name: "deviceId",
35127
+ form: "single",
35128
+ optional: false
35129
+ }],
35130
+ "cover.close": [{
35131
+ name: "deviceId",
35132
+ form: "single",
35133
+ optional: false
35134
+ }],
35135
+ "cover.open": [{
35136
+ name: "deviceId",
35137
+ form: "single",
35138
+ optional: false
35139
+ }],
35140
+ "cover.setPosition": [{
35141
+ name: "deviceId",
35142
+ form: "single",
35143
+ optional: false
35144
+ }],
35145
+ "cover.setTiltPosition": [{
35146
+ name: "deviceId",
35147
+ form: "single",
35148
+ optional: false
35149
+ }],
35150
+ "cover.stop": [{
35151
+ name: "deviceId",
35152
+ form: "single",
35153
+ optional: false
35154
+ }],
35155
+ "dayNight.getOptions": [{
35156
+ name: "deviceId",
35157
+ form: "single",
35158
+ optional: false
35159
+ }],
35160
+ "dayNight.setSettings": [{
35161
+ name: "deviceId",
35162
+ form: "single",
35163
+ optional: false
35164
+ }],
35165
+ "decoder.createSession": [{
35166
+ name: "deviceId",
35167
+ form: "single",
35168
+ optional: true
35169
+ }],
35170
+ "deviceAdoption.release": [{
35171
+ name: "camDeviceId",
35172
+ form: "single",
35173
+ optional: false
35174
+ }],
35175
+ "deviceAdoption.resync": [{
35176
+ name: "camDeviceId",
35177
+ form: "single",
35178
+ optional: false
35179
+ }],
35180
+ "deviceDiscovery.adoptDevice": [{
35181
+ name: "deviceId",
35182
+ form: "single",
35183
+ optional: false
35184
+ }],
35185
+ "deviceDiscovery.listDiscovered": [{
35186
+ name: "deviceId",
35187
+ form: "single",
35188
+ optional: false
35189
+ }],
35190
+ "deviceDiscovery.refreshDiscovery": [{
35191
+ name: "deviceId",
35192
+ form: "single",
35193
+ optional: false
35194
+ }],
35195
+ "deviceDiscovery.releaseDevice": [{
35196
+ name: "childDeviceId",
35197
+ form: "single",
35198
+ optional: false
35199
+ }, {
35200
+ name: "deviceId",
35201
+ form: "single",
35202
+ optional: false
35203
+ }],
35204
+ "deviceManager.adoptionRelease": [{
35205
+ name: "camDeviceId",
35206
+ form: "single",
35207
+ optional: false
35208
+ }],
35209
+ "deviceManager.adoptionResync": [{
35210
+ name: "camDeviceId",
35211
+ form: "single",
35212
+ optional: false
35213
+ }],
35214
+ "deviceManager.applyInitialMeta": [{
35215
+ name: "deviceId",
35216
+ form: "single",
35217
+ optional: false
35218
+ }, {
35219
+ name: "linkDeviceId",
35220
+ form: "single",
35221
+ optional: true
35222
+ }],
35223
+ "deviceManager.disable": [{
35224
+ name: "deviceId",
35225
+ form: "single",
35226
+ optional: false
35227
+ }],
35228
+ "deviceManager.enable": [{
35229
+ name: "deviceId",
35230
+ form: "single",
35231
+ optional: false
35232
+ }],
35233
+ "deviceManager.getBindings": [{
35234
+ name: "deviceId",
35235
+ form: "single",
35236
+ optional: false
35237
+ }],
35238
+ "deviceManager.getChildren": [{
35239
+ name: "parentDeviceId",
35240
+ form: "single",
35241
+ optional: false
35242
+ }],
35243
+ "deviceManager.getConfigSchema": [{
35244
+ name: "deviceId",
35245
+ form: "single",
35246
+ optional: false
35247
+ }],
35248
+ "deviceManager.getDevice": [{
35249
+ name: "deviceId",
35250
+ form: "single",
35251
+ optional: false
35252
+ }],
35253
+ "deviceManager.getDeviceAggregate": [{
35254
+ name: "deviceId",
35255
+ form: "single",
35256
+ optional: false
35257
+ }],
35258
+ "deviceManager.getDeviceLiveInfoAggregate": [{
35259
+ name: "deviceId",
35260
+ form: "single",
35261
+ optional: false
35262
+ }],
35263
+ "deviceManager.getDeviceSettingsAggregate": [{
35264
+ name: "deviceId",
35265
+ form: "single",
35266
+ optional: false
35267
+ }],
35268
+ "deviceManager.getDeviceStatusAggregate": [{
35269
+ name: "deviceId",
35270
+ form: "single",
35271
+ optional: false
35272
+ }],
35273
+ "deviceManager.getDeviceStatusAggregateBatch": [{
35274
+ name: "deviceIds",
35275
+ form: "array",
35276
+ optional: false
35277
+ }],
35278
+ "deviceManager.getLinkedDevices": [{
35279
+ name: "deviceId",
35280
+ form: "single",
35281
+ optional: false
35282
+ }],
35283
+ "deviceManager.getSettingsSchema": [{
35284
+ name: "deviceId",
35285
+ form: "single",
35286
+ optional: false
35287
+ }],
35288
+ "deviceManager.getStreamProfileMap": [{
35289
+ name: "deviceId",
35290
+ form: "single",
35291
+ optional: false
35292
+ }],
35293
+ "deviceManager.getStreamSources": [{
35294
+ name: "deviceId",
35295
+ form: "single",
35296
+ optional: false
35297
+ }],
35298
+ "deviceManager.getWireableFields": [{
35299
+ name: "deviceId",
35300
+ form: "single",
35301
+ optional: false
35302
+ }],
35303
+ "deviceManager.loadConfig": [{
35304
+ name: "deviceId",
35305
+ form: "single",
35306
+ optional: false
35307
+ }],
35308
+ "deviceManager.loadMeta": [{
35309
+ name: "deviceId",
35310
+ form: "single",
35311
+ optional: false
35312
+ }],
35313
+ "deviceManager.loadRuntimeState": [{
35314
+ name: "deviceId",
35315
+ form: "single",
35316
+ optional: false
35317
+ }],
35318
+ "deviceManager.persistConfig": [{
35319
+ name: "deviceId",
35320
+ form: "single",
35321
+ optional: false
35322
+ }],
35323
+ "deviceManager.probeStreams": [{
35324
+ name: "deviceId",
35325
+ form: "single",
35326
+ optional: false
35327
+ }],
35328
+ "deviceManager.registerDevice": [{
35329
+ name: "parentDeviceId",
35330
+ form: "single",
35331
+ optional: true
35332
+ }],
35333
+ "deviceManager.remove": [{
35334
+ name: "deviceId",
35335
+ form: "single",
35336
+ optional: false
35337
+ }],
35338
+ "deviceManager.removeDevice": [{
35339
+ name: "deviceId",
35340
+ form: "single",
35341
+ optional: false
35342
+ }],
35343
+ "deviceManager.runDeviceAction": [{
35344
+ name: "deviceId",
35345
+ form: "single",
35346
+ optional: false
35347
+ }],
35348
+ "deviceManager.setChildLayout": [{
35349
+ name: "deviceId",
35350
+ form: "single",
35351
+ optional: false
35352
+ }],
35353
+ "deviceManager.setDisabled": [{
35354
+ name: "deviceId",
35355
+ form: "single",
35356
+ optional: false
35357
+ }],
35358
+ "deviceManager.setDisplay": [{
35359
+ name: "deviceId",
35360
+ form: "single",
35361
+ optional: false
35362
+ }],
35363
+ "deviceManager.setIntegrationId": [{
35364
+ name: "deviceId",
35365
+ form: "single",
35366
+ optional: false
35367
+ }],
35368
+ "deviceManager.setLinkDeviceId": [{
35369
+ name: "deviceId",
35370
+ form: "single",
35371
+ optional: false
35372
+ }, {
35373
+ name: "linkDeviceId",
35374
+ form: "single",
35375
+ optional: true
35376
+ }],
35377
+ "deviceManager.setLocation": [{
35378
+ name: "deviceId",
35379
+ form: "single",
35380
+ optional: false
35381
+ }],
35382
+ "deviceManager.setMetadata": [{
35383
+ name: "deviceId",
35384
+ form: "single",
35385
+ optional: false
35386
+ }],
35387
+ "deviceManager.setName": [{
35388
+ name: "deviceId",
35389
+ form: "single",
35390
+ optional: false
35391
+ }],
35392
+ "deviceManager.setPrimaryChildEntityId": [{
35393
+ name: "deviceId",
35394
+ form: "single",
35395
+ optional: false
35396
+ }],
35397
+ "deviceManager.setRole": [{
35398
+ name: "deviceId",
35399
+ form: "single",
35400
+ optional: false
35401
+ }],
35402
+ "deviceManager.setStreamProfileMap": [{
35403
+ name: "deviceId",
35404
+ form: "single",
35405
+ optional: false
35406
+ }],
35407
+ "deviceManager.setType": [{
35408
+ name: "deviceId",
35409
+ form: "single",
35410
+ optional: false
35411
+ }],
35412
+ "deviceManager.setWrapperActive": [{
35413
+ name: "deviceId",
35414
+ form: "single",
35415
+ optional: false
35416
+ }],
35417
+ "deviceManager.testField": [{
35418
+ name: "deviceId",
35419
+ form: "single",
35420
+ optional: false
35421
+ }],
35422
+ "deviceManager.updateConfig": [{
35423
+ name: "deviceId",
35424
+ form: "single",
35425
+ optional: false
35426
+ }],
35427
+ "deviceManager.updateDeviceField": [{
35428
+ name: "deviceId",
35429
+ form: "single",
35430
+ optional: false
35431
+ }],
35432
+ "deviceManager.updateDeviceFieldsBatch": [{
35433
+ name: "deviceId",
35434
+ form: "single",
35435
+ optional: false
35436
+ }],
35437
+ "deviceOps.getConfigEntries": [{
35438
+ name: "deviceId",
35439
+ form: "single",
35440
+ optional: false
35441
+ }],
35442
+ "deviceOps.getRawState": [{
35443
+ name: "deviceId",
35444
+ form: "single",
35445
+ optional: false
35446
+ }],
35447
+ "deviceOps.getSettingsSchema": [{
35448
+ name: "deviceId",
35449
+ form: "single",
35450
+ optional: false
35451
+ }],
35452
+ "deviceOps.getStreamSources": [{
35453
+ name: "deviceId",
35454
+ form: "single",
35455
+ optional: false
35456
+ }],
35457
+ "deviceOps.removeDevice": [{
35458
+ name: "deviceId",
35459
+ form: "single",
35460
+ optional: false
35461
+ }],
35462
+ "deviceOps.runAction": [{
35463
+ name: "deviceId",
35464
+ form: "single",
35465
+ optional: false
35466
+ }],
35467
+ "deviceOps.setConfig": [{
35468
+ name: "deviceId",
35469
+ form: "single",
35470
+ optional: false
35471
+ }],
35472
+ "deviceState.getCapSlice": [{
35473
+ name: "deviceId",
35474
+ form: "single",
35475
+ optional: false
35476
+ }],
35477
+ "deviceState.getSnapshot": [{
35478
+ name: "deviceId",
35479
+ form: "single",
35480
+ optional: false
35481
+ }],
35482
+ "deviceState.setCapSlice": [{
35483
+ name: "deviceId",
35484
+ form: "single",
35485
+ optional: false
35486
+ }],
35487
+ "events.getEventClipUrl": [{
35488
+ name: "deviceId",
35489
+ form: "single",
35490
+ optional: false
35491
+ }],
35492
+ "events.getEvents": [{
35493
+ name: "deviceId",
35494
+ form: "single",
35495
+ optional: false
35496
+ }],
35497
+ "events.getEventThumbnail": [{
35498
+ name: "deviceId",
35499
+ form: "single",
35500
+ optional: false
35501
+ }],
35502
+ "faceGallery.getFaceByTrack": [{
35503
+ name: "deviceId",
35504
+ form: "single",
35505
+ optional: false
35506
+ }],
35507
+ "faceGallery.listRecentFaces": [{
35508
+ name: "deviceId",
35509
+ form: "single",
35510
+ optional: true
35511
+ }],
35512
+ "fanControl.setDirection": [{
35513
+ name: "deviceId",
35514
+ form: "single",
35515
+ optional: false
35516
+ }],
35517
+ "fanControl.setOscillating": [{
35518
+ name: "deviceId",
35519
+ form: "single",
35520
+ optional: false
35521
+ }],
35522
+ "fanControl.setPercentage": [{
35523
+ name: "deviceId",
35524
+ form: "single",
35525
+ optional: false
35526
+ }],
35527
+ "fanControl.setPreset": [{
35528
+ name: "deviceId",
35529
+ form: "single",
35530
+ optional: false
35531
+ }],
35532
+ "humidifier.setMode": [{
35533
+ name: "deviceId",
35534
+ form: "single",
35535
+ optional: false
35536
+ }],
35537
+ "humidifier.setOn": [{
35538
+ name: "deviceId",
35539
+ form: "single",
35540
+ optional: false
35541
+ }],
35542
+ "humidifier.setTargetHumidity": [{
35543
+ name: "deviceId",
35544
+ form: "single",
35545
+ optional: false
35546
+ }],
35547
+ "imageSettings.getOptions": [{
35548
+ name: "deviceId",
35549
+ form: "single",
35550
+ optional: false
35551
+ }],
35552
+ "imageSettings.setSettings": [{
35553
+ name: "deviceId",
35554
+ form: "single",
35555
+ optional: false
35556
+ }],
35557
+ "intercom.endTalkSession": [{
35558
+ name: "deviceId",
35559
+ form: "single",
35560
+ optional: false
35561
+ }],
35562
+ "intercom.handleAnswer": [{
35563
+ name: "deviceId",
35564
+ form: "single",
35565
+ optional: false
35566
+ }],
35567
+ "intercom.pushTalkAudio": [{
35568
+ name: "deviceId",
35569
+ form: "single",
35570
+ optional: false
35571
+ }],
35572
+ "intercom.startSession": [{
35573
+ name: "deviceId",
35574
+ form: "single",
35575
+ optional: false
35576
+ }],
35577
+ "intercom.startTalkSession": [{
35578
+ name: "deviceId",
35579
+ form: "single",
35580
+ optional: false
35581
+ }],
35582
+ "intercom.stopSession": [{
35583
+ name: "deviceId",
35584
+ form: "single",
35585
+ optional: false
35586
+ }],
35587
+ "lawnMowerControl.dock": [{
35588
+ name: "deviceId",
35589
+ form: "single",
35590
+ optional: false
35591
+ }],
35592
+ "lawnMowerControl.pause": [{
35593
+ name: "deviceId",
35594
+ form: "single",
35595
+ optional: false
35596
+ }],
35597
+ "lawnMowerControl.startMowing": [{
35598
+ name: "deviceId",
35599
+ form: "single",
35600
+ optional: false
35601
+ }],
35602
+ "lockControl.lock": [{
35603
+ name: "deviceId",
35604
+ form: "single",
35605
+ optional: false
35606
+ }],
35607
+ "lockControl.open": [{
35608
+ name: "deviceId",
35609
+ form: "single",
35610
+ optional: false
35611
+ }],
35612
+ "lockControl.unlock": [{
35613
+ name: "deviceId",
35614
+ form: "single",
35615
+ optional: false
35616
+ }],
35617
+ "mediaPlayer.next": [{
35618
+ name: "deviceId",
35619
+ form: "single",
35620
+ optional: false
35621
+ }],
35622
+ "mediaPlayer.pause": [{
35623
+ name: "deviceId",
35624
+ form: "single",
35625
+ optional: false
35626
+ }],
35627
+ "mediaPlayer.play": [{
35628
+ name: "deviceId",
35629
+ form: "single",
35630
+ optional: false
35631
+ }],
35632
+ "mediaPlayer.playMedia": [{
35633
+ name: "deviceId",
35634
+ form: "single",
35635
+ optional: false
35636
+ }],
35637
+ "mediaPlayer.previous": [{
35638
+ name: "deviceId",
35639
+ form: "single",
35640
+ optional: false
35641
+ }],
35642
+ "mediaPlayer.seek": [{
35643
+ name: "deviceId",
35644
+ form: "single",
35645
+ optional: false
35646
+ }],
35647
+ "mediaPlayer.selectSource": [{
35648
+ name: "deviceId",
35649
+ form: "single",
35650
+ optional: false
35651
+ }],
35652
+ "mediaPlayer.setMute": [{
35653
+ name: "deviceId",
35654
+ form: "single",
35655
+ optional: false
35656
+ }],
35657
+ "mediaPlayer.setRepeat": [{
35658
+ name: "deviceId",
35659
+ form: "single",
35660
+ optional: false
35661
+ }],
35662
+ "mediaPlayer.setShuffle": [{
35663
+ name: "deviceId",
35664
+ form: "single",
35665
+ optional: false
35666
+ }],
35667
+ "mediaPlayer.setVolume": [{
35668
+ name: "deviceId",
35669
+ form: "single",
35670
+ optional: false
35671
+ }],
35672
+ "mediaPlayer.stop": [{
35673
+ name: "deviceId",
35674
+ form: "single",
35675
+ optional: false
35676
+ }],
35677
+ "motion.isDetected": [{
35678
+ name: "deviceId",
35679
+ form: "single",
35680
+ optional: false
35681
+ }],
35682
+ "motionDetection.analyze": [{
35683
+ name: "deviceId",
35684
+ form: "single",
35685
+ optional: false
35686
+ }],
35687
+ "motionDetection.removeCamera": [{
35688
+ name: "deviceId",
35689
+ form: "single",
35690
+ optional: false
35691
+ }],
35692
+ "motionTrigger.setMotionTrigger": [{
35693
+ name: "deviceId",
35694
+ form: "single",
35695
+ optional: false
35696
+ }],
35697
+ "motionZones.getOptions": [{
35698
+ name: "deviceId",
35699
+ form: "single",
35700
+ optional: false
35701
+ }],
35702
+ "motionZones.setZone": [{
35703
+ name: "deviceId",
35704
+ form: "single",
35705
+ optional: false
35706
+ }],
35707
+ "nativeObjectDetection.setEnabled": [{
35708
+ name: "deviceId",
35709
+ form: "single",
35710
+ optional: false
35711
+ }],
35712
+ "networkQuality.getDeviceStats": [{
35713
+ name: "deviceId",
35714
+ form: "single",
35715
+ optional: false
35716
+ }],
35717
+ "networkQuality.reportClientStats": [{
35718
+ name: "deviceId",
35719
+ form: "single",
35720
+ optional: false
35721
+ }],
35722
+ "notificationRules.setDeviceMuted": [{
35723
+ name: "deviceId",
35724
+ form: "single",
35725
+ optional: false
35726
+ }],
35727
+ "notifier.cancel": [{
35728
+ name: "deviceId",
35729
+ form: "single",
35730
+ optional: false
35731
+ }],
35732
+ "notifier.send": [{
35733
+ name: "deviceId",
35734
+ form: "single",
35735
+ optional: false
35736
+ }],
35737
+ "osd.setOverlay": [{
35738
+ name: "deviceId",
35739
+ form: "single",
35740
+ optional: false
35741
+ }],
35742
+ "osdManager.clearSlotBinding": [{
35743
+ name: "deviceId",
35744
+ form: "single",
35745
+ optional: false
35746
+ }],
35747
+ "osdManager.copyDeviceConfiguration": [{
35748
+ name: "sourceDeviceId",
35749
+ form: "single",
35750
+ optional: false
35751
+ }, {
35752
+ name: "targetDeviceId",
35753
+ form: "single",
35754
+ optional: false
35755
+ }],
35756
+ "osdManager.getDeviceOsd": [{
35757
+ name: "deviceId",
35758
+ form: "single",
35759
+ optional: false
35760
+ }],
35761
+ "osdManager.getSourceCatalog": [{
35762
+ name: "deviceId",
35763
+ form: "single",
35764
+ optional: false
35765
+ }],
35766
+ "osdManager.previewSlot": [{
35767
+ name: "deviceId",
35768
+ form: "single",
35769
+ optional: false
35770
+ }],
35771
+ "osdManager.renderDevice": [{
35772
+ name: "deviceId",
35773
+ form: "single",
35774
+ optional: false
35775
+ }],
35776
+ "osdManager.setSlotBinding": [{
35777
+ name: "deviceId",
35778
+ form: "single",
35779
+ optional: false
35780
+ }],
35781
+ "petFeeder.callPet": [{
35782
+ name: "deviceId",
35783
+ form: "single",
35784
+ optional: false
35785
+ }],
35786
+ "petFeeder.cancelFeed": [{
35787
+ name: "deviceId",
35788
+ form: "single",
35789
+ optional: false
35790
+ }],
35791
+ "petFeeder.feed": [{
35792
+ name: "deviceId",
35793
+ form: "single",
35794
+ optional: false
35795
+ }],
35796
+ "petFeeder.markFoodReplenished": [{
35797
+ name: "deviceId",
35798
+ form: "single",
35799
+ optional: false
35800
+ }],
35801
+ "petFeeder.playSound": [{
35802
+ name: "deviceId",
35803
+ form: "single",
35804
+ optional: false
35805
+ }],
35806
+ "petFeeder.resetDesiccant": [{
35807
+ name: "deviceId",
35808
+ form: "single",
35809
+ optional: false
35810
+ }],
35811
+ "petFeeder.setChildLock": [{
35812
+ name: "deviceId",
35813
+ form: "single",
35814
+ optional: false
35815
+ }],
35816
+ "petFeeder.setFeedSound": [{
35817
+ name: "deviceId",
35818
+ form: "single",
35819
+ optional: false
35820
+ }],
35821
+ "petFeeder.setIndicatorLight": [{
35822
+ name: "deviceId",
35823
+ form: "single",
35824
+ optional: false
35825
+ }],
35826
+ "petFeeder.setVolume": [{
35827
+ name: "deviceId",
35828
+ form: "single",
35829
+ optional: false
35830
+ }],
35831
+ "pipelineAnalytics.clearTracks": [{
35832
+ name: "deviceId",
35833
+ form: "single",
35834
+ optional: false
35835
+ }],
35836
+ "pipelineAnalytics.completeRetrainTrack": [{
35837
+ name: "deviceId",
35838
+ form: "single",
35839
+ optional: false
35840
+ }],
35841
+ "pipelineAnalytics.deleteDeviceEvents": [{
35842
+ name: "deviceId",
35843
+ form: "single",
35844
+ optional: false
35845
+ }],
35846
+ "pipelineAnalytics.deleteTracks": [{
35847
+ name: "deviceId",
35848
+ form: "single",
35849
+ optional: false
35850
+ }],
35851
+ "pipelineAnalytics.deselectRetrainFrame": [{
35852
+ name: "deviceId",
35853
+ form: "single",
35854
+ optional: false
35855
+ }],
35856
+ "pipelineAnalytics.getActiveTracks": [{
35857
+ name: "deviceId",
35858
+ form: "single",
35859
+ optional: false
35860
+ }],
35861
+ "pipelineAnalytics.getAudioEvents": [{
35862
+ name: "deviceId",
35863
+ form: "single",
35864
+ optional: false
35865
+ }],
35866
+ "pipelineAnalytics.getEventDensity": [{
35867
+ name: "deviceId",
35868
+ form: "single",
35869
+ optional: false
35870
+ }],
35871
+ "pipelineAnalytics.getKeyEvents": [{
35872
+ name: "deviceId",
35873
+ form: "single",
35874
+ optional: false
35875
+ }],
35876
+ "pipelineAnalytics.getMotionEvents": [{
35877
+ name: "deviceId",
35878
+ form: "single",
35879
+ optional: false
35880
+ }],
35881
+ "pipelineAnalytics.getObjectEvents": [{
35882
+ name: "deviceId",
35883
+ form: "single",
35884
+ optional: false
35885
+ }],
35886
+ "pipelineAnalytics.getRetrainExportUrl": [{
35887
+ name: "deviceIds",
35888
+ form: "array",
35889
+ optional: true
35890
+ }],
35891
+ "pipelineAnalytics.getSensorEvents": [{
35892
+ name: "deviceId",
35893
+ form: "single",
35894
+ optional: false
35895
+ }],
35896
+ "pipelineAnalytics.getTrack": [{
35897
+ name: "deviceId",
35898
+ form: "single",
35899
+ optional: false
35900
+ }],
35901
+ "pipelineAnalytics.getTrainingExportSummary": [{
35902
+ name: "deviceIds",
35903
+ form: "array",
35904
+ optional: true
35905
+ }],
35906
+ "pipelineAnalytics.getTrainingExportUrl": [{
35907
+ name: "deviceIds",
35908
+ form: "array",
35909
+ optional: true
35910
+ }],
35911
+ "pipelineAnalytics.listEventKinds": [{
35912
+ name: "deviceId",
35913
+ form: "single",
35914
+ optional: false
35915
+ }],
35916
+ "pipelineAnalytics.listEventKindsBatch": [{
35917
+ name: "deviceIds",
35918
+ form: "array",
35919
+ optional: false
35920
+ }],
35921
+ "pipelineAnalytics.listOpsLog": [{
35922
+ name: "deviceId",
35923
+ form: "single",
35924
+ optional: true
35925
+ }],
35926
+ "pipelineAnalytics.listRecentTracks": [{
35927
+ name: "deviceIds",
35928
+ form: "array",
35929
+ optional: false
35930
+ }],
35931
+ "pipelineAnalytics.listRetrainStaging": [{
35932
+ name: "deviceIds",
35933
+ form: "array",
35934
+ optional: true
35935
+ }],
35936
+ "pipelineAnalytics.listTracks": [{
35937
+ name: "deviceId",
35938
+ form: "single",
35939
+ optional: false
35940
+ }],
35941
+ "pipelineAnalytics.proposeRetrainAnnotations": [{
35942
+ name: "deviceId",
35943
+ form: "single",
35944
+ optional: false
35945
+ }],
35946
+ "pipelineAnalytics.pruneEventsBefore": [{
35947
+ name: "deviceId",
35948
+ form: "single",
35949
+ optional: false
35950
+ }],
35951
+ "pipelineAnalytics.pruneTracksBefore": [{
35952
+ name: "deviceId",
35953
+ form: "single",
35954
+ optional: false
35955
+ }],
35956
+ "pipelineAnalytics.rebuildObjectEmbeddings": [{
35957
+ name: "deviceId",
35958
+ form: "single",
35959
+ optional: true
35960
+ }],
35961
+ "pipelineAnalytics.restageRetrainTrack": [{
35962
+ name: "deviceId",
35963
+ form: "single",
35964
+ optional: false
35965
+ }],
35966
+ "pipelineAnalytics.saveRetrainAnnotations": [{
35967
+ name: "deviceId",
35968
+ form: "single",
35969
+ optional: false
35970
+ }],
35971
+ "pipelineAnalytics.searchObjectEvents": [{
35972
+ name: "deviceId",
35973
+ form: "single",
35974
+ optional: true
35975
+ }],
35976
+ "pipelineAnalytics.selectRetrainFrames": [{
35977
+ name: "deviceId",
35978
+ form: "single",
35979
+ optional: false
35980
+ }],
35981
+ "pipelineAnalytics.setTrackFlags": [{
35982
+ name: "deviceId",
35983
+ form: "single",
35984
+ optional: false
35985
+ }],
35986
+ "pipelineAnalytics.wipeAllAnalytics": [{
35987
+ name: "deviceId",
35988
+ form: "single",
35989
+ optional: false
35990
+ }],
35991
+ "pipelineExecutor.runPipeline": [{
35992
+ name: "deviceId",
35993
+ form: "single",
35994
+ optional: true
35995
+ }],
35996
+ "pipelineExecutor.runPipelineBatch": [{
35997
+ name: "deviceId",
35998
+ form: "single",
35999
+ optional: true
36000
+ }],
36001
+ "pipelineOrchestrator.assignAudio": [{
36002
+ name: "deviceId",
36003
+ form: "single",
36004
+ optional: false
36005
+ }],
36006
+ "pipelineOrchestrator.assignPipeline": [{
36007
+ name: "deviceId",
36008
+ form: "single",
36009
+ optional: false
36010
+ }],
36011
+ "pipelineOrchestrator.getAudioAssignment": [{
36012
+ name: "deviceId",
36013
+ form: "single",
36014
+ optional: false
36015
+ }],
36016
+ "pipelineOrchestrator.getCameraMetrics": [{
36017
+ name: "deviceId",
36018
+ form: "single",
36019
+ optional: false
36020
+ }],
36021
+ "pipelineOrchestrator.getCameraSettings": [{
36022
+ name: "deviceId",
36023
+ form: "single",
36024
+ optional: false
36025
+ }],
36026
+ "pipelineOrchestrator.getCameraStatus": [{
36027
+ name: "deviceId",
36028
+ form: "single",
36029
+ optional: false
36030
+ }],
36031
+ "pipelineOrchestrator.getCameraStatuses": [{
36032
+ name: "deviceIds",
36033
+ form: "array",
36034
+ optional: true
36035
+ }],
36036
+ "pipelineOrchestrator.getCameraStepOverrides": [{
36037
+ name: "deviceId",
36038
+ form: "single",
36039
+ optional: false
36040
+ }],
36041
+ "pipelineOrchestrator.getCameraSwitches": [{
36042
+ name: "deviceId",
36043
+ form: "single",
36044
+ optional: false
36045
+ }],
36046
+ "pipelineOrchestrator.getPipelineAssignment": [{
36047
+ name: "deviceId",
36048
+ form: "single",
36049
+ optional: false
36050
+ }],
36051
+ "pipelineOrchestrator.getPipelineDevicePin": [{
36052
+ name: "deviceId",
36053
+ form: "single",
36054
+ optional: false
36055
+ }],
36056
+ "pipelineOrchestrator.resolvePipeline": [{
36057
+ name: "deviceId",
36058
+ form: "single",
36059
+ optional: false
36060
+ }],
36061
+ "pipelineOrchestrator.setCameraPipelineForAgent": [{
36062
+ name: "deviceId",
36063
+ form: "single",
36064
+ optional: false
36065
+ }],
36066
+ "pipelineOrchestrator.setCameraStepOverride": [{
36067
+ name: "deviceId",
36068
+ form: "single",
36069
+ optional: false
36070
+ }],
36071
+ "pipelineOrchestrator.setCameraStepToggle": [{
36072
+ name: "deviceId",
36073
+ form: "single",
36074
+ optional: false
36075
+ }],
36076
+ "pipelineOrchestrator.setCameraSwitch": [{
36077
+ name: "deviceId",
36078
+ form: "single",
36079
+ optional: false
36080
+ }],
36081
+ "pipelineOrchestrator.setPipelineDevicePin": [{
36082
+ name: "deviceId",
36083
+ form: "single",
36084
+ optional: false
36085
+ }],
36086
+ "pipelineOrchestrator.unassignAudio": [{
36087
+ name: "deviceId",
36088
+ form: "single",
36089
+ optional: false
36090
+ }],
36091
+ "pipelineOrchestrator.unassignPipeline": [{
36092
+ name: "deviceId",
36093
+ form: "single",
36094
+ optional: false
36095
+ }],
36096
+ "pipelineRunner.attachCamera": [{
36097
+ name: "deviceId",
36098
+ form: "single",
36099
+ optional: false
36100
+ }],
36101
+ "pipelineRunner.detachCamera": [{
36102
+ name: "deviceId",
36103
+ form: "single",
36104
+ optional: false
36105
+ }],
36106
+ "pipelineRunner.getCameraMetrics": [{
36107
+ name: "deviceId",
36108
+ form: "single",
36109
+ optional: false
36110
+ }],
36111
+ "pipelineRunner.reportMotion": [{
36112
+ name: "deviceId",
36113
+ form: "single",
36114
+ optional: false
36115
+ }],
36116
+ "pipelineRunner.runDetailSubtree": [{
36117
+ name: "deviceId",
36118
+ form: "single",
36119
+ optional: false
36120
+ }],
36121
+ "pipelineRunner.runStatelessStep": [{
36122
+ name: "sourceDeviceId",
36123
+ form: "single",
36124
+ optional: false
36125
+ }],
36126
+ "plateGallery.getPlateByTrack": [{
36127
+ name: "deviceId",
36128
+ form: "single",
36129
+ optional: false
36130
+ }],
36131
+ "plateGallery.listPlates": [{
36132
+ name: "deviceId",
36133
+ form: "single",
36134
+ optional: true
36135
+ }],
36136
+ "privacyMask.getOptions": [{
36137
+ name: "deviceId",
36138
+ form: "single",
36139
+ optional: false
36140
+ }],
36141
+ "privacyMask.setAudioEnabled": [{
36142
+ name: "deviceId",
36143
+ form: "single",
36144
+ optional: false
36145
+ }],
36146
+ "privacyMask.setMask": [{
36147
+ name: "deviceId",
36148
+ form: "single",
36149
+ optional: false
36150
+ }],
36151
+ "ptz.continuousMove": [{
36152
+ name: "deviceId",
36153
+ form: "single",
36154
+ optional: false
36155
+ }],
36156
+ "ptz.deletePreset": [{
36157
+ name: "deviceId",
36158
+ form: "single",
36159
+ optional: false
36160
+ }],
36161
+ "ptz.getOptions": [{
36162
+ name: "deviceId",
36163
+ form: "single",
36164
+ optional: false
36165
+ }],
36166
+ "ptz.getPosition": [{
36167
+ name: "deviceId",
36168
+ form: "single",
36169
+ optional: false
36170
+ }],
36171
+ "ptz.getPresets": [{
36172
+ name: "deviceId",
36173
+ form: "single",
36174
+ optional: false
36175
+ }],
36176
+ "ptz.goHome": [{
36177
+ name: "deviceId",
36178
+ form: "single",
36179
+ optional: false
36180
+ }],
36181
+ "ptz.goToPreset": [{
36182
+ name: "deviceId",
36183
+ form: "single",
36184
+ optional: false
36185
+ }],
36186
+ "ptz.move": [{
36187
+ name: "deviceId",
36188
+ form: "single",
36189
+ optional: false
36190
+ }],
36191
+ "ptz.savePreset": [{
36192
+ name: "deviceId",
36193
+ form: "single",
36194
+ optional: false
36195
+ }],
36196
+ "ptz.setAutofocus": [{
36197
+ name: "deviceId",
36198
+ form: "single",
36199
+ optional: false
36200
+ }],
36201
+ "ptz.stop": [{
36202
+ name: "deviceId",
36203
+ form: "single",
36204
+ optional: false
36205
+ }],
36206
+ "ptzAutotrack.getSettings": [{
36207
+ name: "deviceId",
36208
+ form: "single",
36209
+ optional: false
36210
+ }],
36211
+ "ptzAutotrack.getStatus": [{
36212
+ name: "deviceId",
36213
+ form: "single",
36214
+ optional: false
36215
+ }],
36216
+ "ptzAutotrack.setEnabled": [{
36217
+ name: "deviceId",
36218
+ form: "single",
36219
+ optional: false
36220
+ }],
36221
+ "ptzAutotrack.setSettings": [{
36222
+ name: "deviceId",
36223
+ form: "single",
36224
+ optional: false
36225
+ }],
36226
+ "reboot.reboot": [{
36227
+ name: "deviceId",
36228
+ form: "single",
36229
+ optional: false
36230
+ }],
36231
+ "recording.deleteFootprint": [{
36232
+ name: "deviceId",
36233
+ form: "single",
36234
+ optional: false
36235
+ }],
36236
+ "recording.getAvailability": [{
36237
+ name: "deviceId",
36238
+ form: "single",
36239
+ optional: false
36240
+ }],
36241
+ "recording.getDaysWithRecordings": [{
36242
+ name: "deviceId",
36243
+ form: "single",
36244
+ optional: false
36245
+ }],
36246
+ "recording.getDeviceConfig": [{
36247
+ name: "deviceId",
36248
+ form: "single",
36249
+ optional: false
36250
+ }],
36251
+ "recording.getPlaybackManifest": [{
36252
+ name: "deviceId",
36253
+ form: "single",
36254
+ optional: false
36255
+ }],
36256
+ "recording.listOpsLog": [{
36257
+ name: "deviceId",
36258
+ form: "single",
36259
+ optional: true
36260
+ }],
36261
+ "recording.locateSegment": [{
36262
+ name: "deviceId",
36263
+ form: "single",
36264
+ optional: false
36265
+ }],
36266
+ "recording.pruneFootage": [{
36267
+ name: "deviceId",
36268
+ form: "single",
36269
+ optional: false
36270
+ }],
36271
+ "recording.readGopBytes": [{
36272
+ name: "deviceId",
36273
+ form: "single",
36274
+ optional: false
36275
+ }],
36276
+ "recording.readSegmentBytes": [{
36277
+ name: "deviceId",
36278
+ form: "single",
36279
+ optional: false
36280
+ }],
36281
+ "recording.relocateFootage": [{
36282
+ name: "deviceId",
36283
+ form: "single",
36284
+ optional: true
36285
+ }],
36286
+ "recording.renderClip": [{
36287
+ name: "deviceId",
36288
+ form: "single",
36289
+ optional: false
36290
+ }],
36291
+ "recording.renderGif": [{
36292
+ name: "deviceId",
36293
+ form: "single",
36294
+ optional: false
36295
+ }],
36296
+ "recording.rescanStorage": [{
36297
+ name: "deviceId",
36298
+ form: "single",
36299
+ optional: false
36300
+ }],
36301
+ "recording.setDeviceConfig": [{
36302
+ name: "deviceId",
36303
+ form: "single",
36304
+ optional: false
36305
+ }],
36306
+ "recording.startStorageMigrationMove": [{
36307
+ name: "deviceId",
36308
+ form: "single",
36309
+ optional: true
36310
+ }],
36311
+ "recordingExport.createExport": [{
36312
+ name: "deviceId",
36313
+ form: "single",
36314
+ optional: false
36315
+ }],
36316
+ "recordingExport.listExports": [{
36317
+ name: "deviceId",
36318
+ form: "single",
36319
+ optional: true
36320
+ }],
36321
+ "sceneMonitor.captureReference": [{
36322
+ name: "deviceId",
36323
+ form: "single",
36324
+ optional: false
36325
+ }],
36326
+ "sceneMonitor.createScene": [{
36327
+ name: "deviceId",
36328
+ form: "single",
36329
+ optional: false
36330
+ }],
36331
+ "sceneMonitor.deleteReference": [{
36332
+ name: "deviceId",
36333
+ form: "single",
36334
+ optional: false
36335
+ }],
36336
+ "sceneMonitor.deleteScene": [{
36337
+ name: "deviceId",
36338
+ form: "single",
36339
+ optional: false
36340
+ }],
36341
+ "sceneMonitor.listScenes": [{
36342
+ name: "deviceId",
36343
+ form: "single",
36344
+ optional: false
36345
+ }],
36346
+ "sceneMonitor.recheckNow": [{
36347
+ name: "deviceId",
36348
+ form: "single",
36349
+ optional: false
36350
+ }],
36351
+ "sceneMonitor.resetScene": [{
36352
+ name: "deviceId",
36353
+ form: "single",
36354
+ optional: false
36355
+ }],
36356
+ "sceneMonitor.updateScene": [{
36357
+ name: "deviceId",
36358
+ form: "single",
36359
+ optional: false
36360
+ }],
36361
+ "scriptRunner.run": [{
36362
+ name: "deviceId",
36363
+ form: "single",
36364
+ optional: false
36365
+ }],
36366
+ "scriptRunner.stop": [{
36367
+ name: "deviceId",
36368
+ form: "single",
36369
+ optional: false
36370
+ }],
36371
+ "snapshot.getSnapshot": [{
36372
+ name: "deviceId",
36373
+ form: "single",
36374
+ optional: false
36375
+ }],
36376
+ "snapshot.getSnapshotOverview": [{
36377
+ name: "deviceIds",
36378
+ form: "array",
36379
+ optional: false
36380
+ }],
36381
+ "snapshot.invalidateCache": [{
36382
+ name: "deviceId",
36383
+ form: "single",
36384
+ optional: false
36385
+ }],
36386
+ "streamBroker.acquireEgressTranscode": [{
36387
+ name: "deviceId",
36388
+ form: "single",
36389
+ optional: false
36390
+ }],
36391
+ "streamBroker.assignProfile": [{
36392
+ name: "deviceId",
36393
+ form: "single",
36394
+ optional: false
36395
+ }],
36396
+ "streamBroker.getDeviceAudioMute": [{
36397
+ name: "deviceId",
36398
+ form: "single",
36399
+ optional: false
36400
+ }],
36401
+ "streamBroker.getStreamWithCodec": [{
36402
+ name: "deviceId",
36403
+ form: "single",
36404
+ optional: false
36405
+ }],
36406
+ "streamBroker.produceEventMedia": [{
36407
+ name: "deviceId",
36408
+ form: "single",
36409
+ optional: false
36410
+ }],
36411
+ "streamBroker.publishCameraStream": [{
36412
+ name: "deviceId",
36413
+ form: "single",
36414
+ optional: false
36415
+ }],
36416
+ "streamBroker.renderPreBufferClip": [{
36417
+ name: "deviceId",
36418
+ form: "single",
36419
+ optional: false
36420
+ }],
36421
+ "streamBroker.restartProfile": [{
36422
+ name: "deviceId",
36423
+ form: "single",
36424
+ optional: false
36425
+ }],
36426
+ "streamBroker.retractCameraStream": [{
36427
+ name: "deviceId",
36428
+ form: "single",
36429
+ optional: false
36430
+ }],
36431
+ "streamBroker.setDeviceAudioMute": [{
36432
+ name: "deviceId",
36433
+ form: "single",
36434
+ optional: false
36435
+ }],
36436
+ "streamBroker.unassignProfile": [{
36437
+ name: "deviceId",
36438
+ form: "single",
36439
+ optional: false
36440
+ }],
36441
+ "streamCatalog.getCatalog": [{
36442
+ name: "deviceId",
36443
+ form: "single",
36444
+ optional: false
36445
+ }],
36446
+ "streamParams.getConfigSchema": [{
36447
+ name: "deviceId",
36448
+ form: "single",
36449
+ optional: false
36450
+ }],
36451
+ "streamParams.getOptions": [{
36452
+ name: "deviceId",
36453
+ form: "single",
36454
+ optional: false
36455
+ }],
36456
+ "streamParams.setProfile": [{
36457
+ name: "deviceId",
36458
+ form: "single",
36459
+ optional: false
36460
+ }],
36461
+ "switch.setState": [{
36462
+ name: "deviceId",
36463
+ form: "single",
36464
+ optional: false
36465
+ }],
36466
+ "vacuumControl.locate": [{
36467
+ name: "deviceId",
36468
+ form: "single",
36469
+ optional: false
36470
+ }],
36471
+ "vacuumControl.pause": [{
36472
+ name: "deviceId",
36473
+ form: "single",
36474
+ optional: false
36475
+ }],
36476
+ "vacuumControl.returnToBase": [{
36477
+ name: "deviceId",
36478
+ form: "single",
36479
+ optional: false
36480
+ }],
36481
+ "vacuumControl.setFanSpeed": [{
36482
+ name: "deviceId",
36483
+ form: "single",
36484
+ optional: false
36485
+ }],
36486
+ "vacuumControl.start": [{
36487
+ name: "deviceId",
36488
+ form: "single",
36489
+ optional: false
36490
+ }],
36491
+ "vacuumControl.stop": [{
36492
+ name: "deviceId",
36493
+ form: "single",
36494
+ optional: false
36495
+ }],
36496
+ "valve.close": [{
36497
+ name: "deviceId",
36498
+ form: "single",
36499
+ optional: false
36500
+ }],
36501
+ "valve.open": [{
36502
+ name: "deviceId",
36503
+ form: "single",
36504
+ optional: false
36505
+ }],
36506
+ "valve.setPosition": [{
36507
+ name: "deviceId",
36508
+ form: "single",
36509
+ optional: false
36510
+ }],
36511
+ "valve.stop": [{
36512
+ name: "deviceId",
36513
+ form: "single",
36514
+ optional: false
36515
+ }],
36516
+ "videoclips.getClipPlayback": [{
36517
+ name: "deviceId",
36518
+ form: "single",
36519
+ optional: false
36520
+ }],
36521
+ "videoclips.listClips": [{
36522
+ name: "deviceId",
36523
+ form: "single",
36524
+ optional: false
36525
+ }],
36526
+ "waterHeater.setAway": [{
36527
+ name: "deviceId",
36528
+ form: "single",
36529
+ optional: false
36530
+ }],
36531
+ "waterHeater.setOperationMode": [{
36532
+ name: "deviceId",
36533
+ form: "single",
36534
+ optional: false
36535
+ }],
36536
+ "waterHeater.setTargetTemp": [{
36537
+ name: "deviceId",
36538
+ form: "single",
36539
+ optional: false
36540
+ }],
36541
+ "webrtcSession.addIceCandidate": [{
36542
+ name: "deviceId",
36543
+ form: "single",
36544
+ optional: false
36545
+ }],
36546
+ "webrtcSession.closeSession": [{
36547
+ name: "deviceId",
36548
+ form: "single",
36549
+ optional: false
36550
+ }],
36551
+ "webrtcSession.createSession": [{
36552
+ name: "deviceId",
36553
+ form: "single",
36554
+ optional: false
36555
+ }],
36556
+ "webrtcSession.getIceCandidates": [{
36557
+ name: "deviceId",
36558
+ form: "single",
36559
+ optional: false
36560
+ }],
36561
+ "webrtcSession.getSessionState": [{
36562
+ name: "deviceId",
36563
+ form: "single",
36564
+ optional: false
36565
+ }],
36566
+ "webrtcSession.handleAnswer": [{
36567
+ name: "deviceId",
36568
+ form: "single",
36569
+ optional: false
36570
+ }],
36571
+ "webrtcSession.handleOffer": [{
36572
+ name: "deviceId",
36573
+ form: "single",
36574
+ optional: false
36575
+ }],
36576
+ "webrtcSession.hasAdaptiveBitrate": [{
36577
+ name: "deviceId",
36578
+ form: "single",
36579
+ optional: false
36580
+ }],
36581
+ "webrtcSession.listStreams": [{
36582
+ name: "deviceId",
36583
+ form: "single",
36584
+ optional: false
36585
+ }],
36586
+ "zoneAnalytics.getCameraHistory": [{
36587
+ name: "deviceId",
36588
+ form: "single",
36589
+ optional: false
36590
+ }],
36591
+ "zoneAnalytics.getCurrentSnapshot": [{
36592
+ name: "deviceId",
36593
+ form: "single",
36594
+ optional: false
36595
+ }],
36596
+ "zoneAnalytics.getUnzonedHistory": [{
36597
+ name: "deviceId",
36598
+ form: "single",
36599
+ optional: false
36600
+ }],
36601
+ "zoneAnalytics.getZoneHistory": [{
36602
+ name: "deviceId",
36603
+ form: "single",
36604
+ optional: false
36605
+ }],
36606
+ "zoneRules.listRules": [{
36607
+ name: "deviceId",
36608
+ form: "single",
36609
+ optional: false
36610
+ }],
36611
+ "zoneRules.setRules": [{
36612
+ name: "deviceId",
36613
+ form: "single",
36614
+ optional: false
36615
+ }],
36616
+ "zones.addZone": [{
36617
+ name: "deviceId",
36618
+ form: "single",
36619
+ optional: false
36620
+ }],
36621
+ "zones.listZones": [{
36622
+ name: "deviceId",
36623
+ form: "single",
36624
+ optional: false
36625
+ }],
36626
+ "zones.removeZone": [{
36627
+ name: "deviceId",
36628
+ form: "single",
36629
+ optional: false
36630
+ }],
36631
+ "zones.updateZone": [{
36632
+ name: "deviceId",
36633
+ form: "single",
36634
+ optional: false
36635
+ }]
36636
+ });
34557
36637
  Object.freeze({
34558
36638
  "broker": "broker",
34559
36639
  "device-export": "device-export",
@@ -34565,7 +36645,7 @@ Object.freeze({
34565
36645
  });
34566
36646
  /**
34567
36647
  * Per-cap runtime-state policy, projected from every `*.cap.ts` that declares
34568
- * `runtimeState`. 62 caps: 33 `restored`, 29 `session`.
36648
+ * `runtimeState`. 63 caps: 33 `restored`, 30 `session`.
34569
36649
  *
34570
36650
  * A cap absent from this map has no runtime-state slice at all. A cap PRESENT
34571
36651
  * with `durability: 'session'` has one and has decided not to keep it.
@@ -34695,6 +36775,10 @@ var RUNTIME_STATE_POLICY = {
34695
36775
  durability: "restored",
34696
36776
  volatileFields: ["lastFetchedAt"]
34697
36777
  },
36778
+ "intercom": {
36779
+ durability: "session",
36780
+ volatileFields: []
36781
+ },
34698
36782
  "lawn-mower-control": {
34699
36783
  durability: "session",
34700
36784
  volatileFields: []