camstack 1.2.25 → 1.2.26

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-CSgK0rNX.mjs
14525
+ // ../types/dist/sleep-DlC2kJYf.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15278,6 +15278,15 @@ var deviceOpsCapability = {
15278
15278
  getRawState: method(external_exports.object({ deviceId: external_exports.number() }), RawStateResultSchema.nullable(), { auth: "protected" })
15279
15279
  }
15280
15280
  };
15281
+ var BOOT_RECOVERY_BACKOFF_MS = [
15282
+ 15e3,
15283
+ 6e4,
15284
+ 5 * 6e4,
15285
+ 15 * 6e4,
15286
+ 30 * 6e4,
15287
+ 60 * 6e4,
15288
+ 90 * 6e4
15289
+ ];
15281
15290
  function sleep(ms) {
15282
15291
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
15283
15292
  }
@@ -18893,6 +18902,8 @@ var QueryFilterSchema = external_exports.object({
18893
18902
  where: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
18894
18903
  whereIn: external_exports.record(external_exports.string(), external_exports.array(external_exports.unknown())).optional(),
18895
18904
  whereBetween: external_exports.record(external_exports.string(), external_exports.tuple([external_exports.unknown(), external_exports.unknown()])).optional(),
18905
+ /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
18906
+ whereNot: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
18896
18907
  orderBy: external_exports.object({
18897
18908
  field: external_exports.string(),
18898
18909
  direction: external_exports.enum(["asc", "desc"])
@@ -18903,7 +18914,8 @@ var QueryFilterSchema = external_exports.object({
18903
18914
  var MutationFilterSchema = external_exports.object({
18904
18915
  where: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
18905
18916
  whereIn: external_exports.record(external_exports.string(), external_exports.array(external_exports.unknown())).optional(),
18906
- whereBetween: external_exports.record(external_exports.string(), external_exports.tuple([external_exports.unknown(), external_exports.unknown()])).optional()
18917
+ whereBetween: external_exports.record(external_exports.string(), external_exports.tuple([external_exports.unknown(), external_exports.unknown()])).optional(),
18918
+ whereNot: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
18907
18919
  });
18908
18920
  var SettingsRecordSchema = external_exports.object({
18909
18921
  id: external_exports.string(),
@@ -20726,6 +20738,11 @@ var LlmImageSchema = external_exports.object({
20726
20738
  bytes: external_exports.instanceof(Uint8Array),
20727
20739
  mimeType: external_exports.string()
20728
20740
  });
20741
+ var LlmRetryPolicySchema = external_exports.object({
20742
+ enabled: external_exports.boolean().default(false),
20743
+ /** Total attempts INCLUDING the first. 1 = no retry. */
20744
+ maxAttempts: external_exports.number().int().min(1).max(5).default(1)
20745
+ });
20729
20746
  var LlmGenerateBaseInputSchema = external_exports.object({
20730
20747
  /** Collection routing (the notification-output posture). */
20731
20748
  addonId: external_exports.string().optional(),
@@ -20740,7 +20757,34 @@ var LlmGenerateBaseInputSchema = external_exports.object({
20740
20757
  jsonSchema: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
20741
20758
  /** Per-call override of the profile default. */
20742
20759
  maxTokens: external_exports.number().int().positive().optional(),
20743
- temperature: external_exports.number().optional()
20760
+ temperature: external_exports.number().optional(),
20761
+ /** Per-call override of the profile default (nucleus sampling). */
20762
+ topP: external_exports.number().min(0).max(1).optional(),
20763
+ /** Per-call override of the profile default (top-k sampling). */
20764
+ topK: external_exports.number().int().positive().optional(),
20765
+ /** Per-call override of `profile.timeoutMs` — the total generation bound. */
20766
+ timeoutMs: external_exports.number().int().positive().optional(),
20767
+ /** Per-call override; beats both the consumer table and the profile. */
20768
+ retry: LlmRetryPolicySchema.optional(),
20769
+ /**
20770
+ * Caller-minted id that makes this generation CANCELLABLE.
20771
+ *
20772
+ * Without it a caller that stops waiting cannot stop the work: the gates race
20773
+ * the call against 8 s and free their own slot when the timer wins, while the
20774
+ * generation upstream keeps running to `profile.timeoutMs` — 60 s by default,
20775
+ * on a single-threaded local model. The per-camera bound then counts WAITS,
20776
+ * not generations, and the real load is unbounded.
20777
+ *
20778
+ * `AbortSignal` cannot cross a process boundary; an id can. Pass one here and
20779
+ * `llm.cancel({ requestId })` tears the socket down.
20780
+ */
20781
+ requestId: external_exports.string().optional()
20782
+ });
20783
+ var ManagedModelExtraFileSchema = external_exports.object({
20784
+ url: external_exports.string(),
20785
+ filename: external_exports.string(),
20786
+ sizeBytes: external_exports.number(),
20787
+ sha256: external_exports.string().optional()
20744
20788
  });
20745
20789
  var ManagedModelRefSchema = external_exports.discriminatedUnion("kind", [
20746
20790
  external_exports.object({
@@ -20750,7 +20794,11 @@ var ManagedModelRefSchema = external_exports.discriminatedUnion("kind", [
20750
20794
  external_exports.object({
20751
20795
  kind: external_exports.literal("url"),
20752
20796
  url: external_exports.string(),
20753
- sha256: external_exports.string().optional()
20797
+ sha256: external_exports.string().optional(),
20798
+ /** Picker/status label; the file basename when absent. */
20799
+ label: external_exports.string().optional(),
20800
+ sizeBytes: external_exports.number().optional(),
20801
+ extraFiles: external_exports.array(ManagedModelExtraFileSchema).optional()
20754
20802
  }),
20755
20803
  external_exports.object({
20756
20804
  kind: external_exports.literal("path"),
@@ -20768,13 +20816,76 @@ var ManagedRuntimeConfigSchema = external_exports.object({
20768
20816
  gpuLayers: external_exports.number().int().default(0),
20769
20817
  /** Default: cpus-2, clamped ≥1 (resolved node-side). */
20770
20818
  threads: external_exports.number().int().optional(),
20771
- /** Concurrent slots. */
20819
+ /** Concurrent slots (`--parallel`). */
20772
20820
  parallel: external_exports.number().int().default(1),
20821
+ /** Logical batch size (`-b`). Larger = faster prompt ingest, more RAM. */
20822
+ batchSize: external_exports.number().int().positive().optional(),
20823
+ /** Physical batch / micro-batch (`-ub`). */
20824
+ ubatchSize: external_exports.number().int().positive().optional(),
20825
+ /**
20826
+ * `--flash-attn`. Cuts KV-cache memory on the backends that implement it and
20827
+ * is a no-op elsewhere, so it is offered rather than assumed.
20828
+ */
20829
+ flashAttention: external_exports.boolean().default(false),
20830
+ /**
20831
+ * `--mlock`. Pins the weights in RAM so the OS cannot page them out mid
20832
+ * inference. Costs the full model size in resident memory — which is exactly
20833
+ * what the RAM budget is counting.
20834
+ */
20835
+ mlock: external_exports.boolean().default(false),
20836
+ /**
20837
+ * `--no-mmap`. Reads the whole GGUF up front instead of mapping it. Slower to
20838
+ * start, but avoids the page-fault stalls a network or spinning-disk model
20839
+ * store produces on every first token.
20840
+ */
20841
+ noMmap: external_exports.boolean().default(false),
20842
+ /** `--cache-type-k` / `--cache-type-v` — quantising the KV cache is the
20843
+ * cheapest way to fit a longer context in the same RAM. */
20844
+ cacheTypeK: external_exports.enum([
20845
+ "f32",
20846
+ "f16",
20847
+ "q8_0",
20848
+ "q5_1",
20849
+ "q5_0",
20850
+ "q4_1",
20851
+ "q4_0"
20852
+ ]).optional(),
20853
+ cacheTypeV: external_exports.enum([
20854
+ "f32",
20855
+ "f16",
20856
+ "q8_0",
20857
+ "q5_1",
20858
+ "q5_0",
20859
+ "q4_1",
20860
+ "q4_0"
20861
+ ]).optional(),
20862
+ /**
20863
+ * Escape hatch for llama-server flags this schema does NOT model — `--jinja`
20864
+ * (which most vision chat templates need and some language-only models
20865
+ * dislike), `--cont-batching`, `--rope-scaling`, …
20866
+ *
20867
+ * It is NOT a second place to set the flags above. A token that collides
20868
+ * with a typed field is REJECTED at start, naming the field that owns it
20869
+ * (`assertNoOwnedFlags`), because two knobs writing the same argv is exactly
20870
+ * the "two switches that disagree" failure this repo has already shipped
20871
+ * twice (D62).
20872
+ */
20873
+ extraArgs: external_exports.array(external_exports.string()).default([]),
20773
20874
  /** Else lazy: first generate boots it. */
20774
20875
  autoStart: external_exports.boolean().default(false),
20775
20876
  /** 0 = never; frees RAM after quiet periods. */
20776
20877
  idleStopMinutes: external_exports.number().int().default(30)
20777
20878
  });
20879
+ var LlmDownloadProgressSchema = external_exports.object({
20880
+ phase: external_exports.enum(["downloading", "verifying"]),
20881
+ /** The artifact currently moving, e.g. `mmproj-F16.gguf`. */
20882
+ file: external_exports.string(),
20883
+ fileIndex: external_exports.number().int(),
20884
+ fileCount: external_exports.number().int(),
20885
+ /** Across the WHOLE install, not the current file. */
20886
+ downloadedBytes: external_exports.number(),
20887
+ totalBytes: external_exports.number().optional()
20888
+ });
20778
20889
  var LlmRuntimeStatusSchema = external_exports.object({
20779
20890
  /** Status is ALWAYS node-qualified. */
20780
20891
  nodeId: external_exports.string(),
@@ -20791,6 +20902,8 @@ var LlmRuntimeStatusSchema = external_exports.object({
20791
20902
  modelPath: external_exports.string().optional(),
20792
20903
  modelId: external_exports.string().optional(),
20793
20904
  downloadProgress: external_exports.number().min(0).max(1).optional(),
20905
+ /** Detail behind `downloadProgress`; present for the same lifetime. */
20906
+ download: LlmDownloadProgressSchema.optional(),
20794
20907
  lastError: external_exports.string().optional(),
20795
20908
  crashesInWindow: external_exports.number(),
20796
20909
  /** Child RSS (sampled best-effort). */
@@ -20801,7 +20914,14 @@ var LlmNodeModelSchema = external_exports.object({
20801
20914
  file: external_exports.string(),
20802
20915
  sizeBytes: external_exports.number(),
20803
20916
  catalogId: external_exports.string().optional(),
20804
- installedAt: external_exports.number().optional()
20917
+ installedAt: external_exports.number().optional(),
20918
+ /**
20919
+ * Absolute path on the node. Present so a file that is on disk but matches
20920
+ * no catalog entry — a custom Hugging Face install, or a GGUF the operator
20921
+ * copied in by hand — is still SELECTABLE, as a `{kind:'path'}` ref. Without
20922
+ * it the picker could list such a file and do nothing with it.
20923
+ */
20924
+ path: external_exports.string().optional()
20805
20925
  });
20806
20926
  var LlmRuntimeDiskUsageSchema = external_exports.object({
20807
20927
  nodeId: external_exports.string(),
@@ -20862,10 +20982,47 @@ var LlmProfileSchema = external_exports.object({
20862
20982
  baseUrl: external_exports.string().optional(),
20863
20983
  /** ConfigUISchema type:'password' — never round-trips (spec §5). */
20864
20984
  apiKey: external_exports.string().optional(),
20985
+ /** Vision on/off. A vision call against a `false` profile is REFUSED, never
20986
+ * degraded to text — that shipped once and produced a confident answer to a
20987
+ * question about a picture nobody sent. */
20865
20988
  supportsVision: external_exports.boolean(),
20866
20989
  temperature: external_exports.number().min(0).max(2).optional(),
20990
+ /** Nucleus sampling. Every wire we speak has it. */
20991
+ topP: external_exports.number().min(0).max(1).optional(),
20992
+ /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
20993
+ * wire does, and the client drops it there (measured: the request body gets
20994
+ * `top_p` and no `top_k`). The profile editor hides the field wherever it
20995
+ * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
20996
+ topK: external_exports.number().int().positive().optional(),
20867
20997
  maxTokens: external_exports.number().int().positive().optional(),
20998
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own);
20999
+ * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
21000
+ * the model with, so it is the one field that changes a PROCESS. */
21001
+ contextLength: external_exports.number().int().positive().optional(),
21002
+ /** Default system prompt. A caller's `system` REPLACES it (never appends —
21003
+ * two system prompts fighting is worse than either alone). */
21004
+ systemPrompt: external_exports.string().optional(),
21005
+ /** Total generation bound — the only one a unary call has. */
20868
21006
  timeoutMs: external_exports.number().int().positive().default(6e4),
21007
+ /** The TCP handshake only — "is the port even open". NOT the wait for
21008
+ * response headers: on the LM Studio / llama-server wire those are written
21009
+ * once the model has finished loading, so they belong to the bound below. */
21010
+ connectTimeoutMs: external_exports.number().int().positive().default(1e4),
21011
+ /** Accepted, but no output yet — response headers included, because a cold
21012
+ * GPU load is exactly what happens before them. */
21013
+ firstTokenTimeoutMs: external_exports.number().int().positive().default(12e4),
21014
+ /** Output started then stopped. */
21015
+ idleTimeoutMs: external_exports.number().int().positive().default(6e4),
21016
+ /** Profile-level default. The per-consumer table and a per-call override
21017
+ * both beat it — see `resolveRetryPolicy`. */
21018
+ retry: LlmRetryPolicySchema.default({
21019
+ enabled: false,
21020
+ maxAttempts: 1
21021
+ }),
21022
+ /** Whether this profile may use tools. The tool-call plumbing rides the
21023
+ * library; the REGISTRY of callable tools is ours and is empty in v1, so a
21024
+ * `true` here buys the wiring, not behaviour, until tools are registered. */
21025
+ toolsEnabled: external_exports.boolean().default(false),
20869
21026
  extraHeaders: external_exports.record(external_exports.string(), external_exports.string()).optional(),
20870
21027
  /** kind === 'managed-local' only (spec §4). */
20871
21028
  runtime: ManagedRuntimeConfigSchema.optional()
@@ -20910,6 +21067,27 @@ var ManagedModelCatalogEntrySchema = external_exports.object({
20910
21067
  /** Vision models: companion projector file. */
20911
21068
  mmprojUrl: external_exports.string().optional()
20912
21069
  });
21070
+ var HfModelResolutionSchema = external_exports.discriminatedUnion("ok", [external_exports.object({
21071
+ ok: external_exports.literal(true),
21072
+ /** Ready to hand to `installModel` unchanged. */
21073
+ model: ManagedModelRefSchema,
21074
+ label: external_exports.string(),
21075
+ repo: external_exports.string(),
21076
+ quantization: external_exports.string(),
21077
+ purpose: external_exports.enum(["text", "vision"]),
21078
+ totalBytes: external_exports.number(),
21079
+ /** mmproj + shards, for the preview: an operator approving 23 GB should
21080
+ * see that 0.9 GB of it is a projector they did not name. */
21081
+ extraFilenames: external_exports.array(external_exports.string())
21082
+ }), external_exports.object({
21083
+ ok: external_exports.literal(false),
21084
+ code: external_exports.string(),
21085
+ message: external_exports.string(),
21086
+ candidates: external_exports.array(external_exports.string()).optional(),
21087
+ /** Set when the refusal was only the ceiling: re-calling with
21088
+ * `maxBytes: requiredBytes` is the operator's explicit override. */
21089
+ requiredBytes: external_exports.number().optional()
21090
+ })]);
20913
21091
  var LlmRuntimeNodeSchema = external_exports.object({
20914
21092
  nodeId: external_exports.string(),
20915
21093
  reachable: external_exports.boolean(),
@@ -20933,6 +21111,17 @@ var llmCapability = {
20933
21111
  methods: {
20934
21112
  generate: method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }),
20935
21113
  generateVision: method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }),
21114
+ /**
21115
+ * Stop a generation started with a `requestId`.
21116
+ *
21117
+ * Idempotent and always successful: cancelling an id that already finished,
21118
+ * never existed, or was cancelled a moment ago is a no-op. A caller that has
21119
+ * given up must never have to handle an error from giving up.
21120
+ */
21121
+ cancel: method(external_exports.object({
21122
+ addonId: external_exports.string().optional(),
21123
+ requestId: external_exports.string()
21124
+ }), external_exports.void(), { kind: "mutation" }),
20936
21125
  listProfileKinds: method(external_exports.object({}), external_exports.array(LlmProfileKindDescriptorSchema)),
20937
21126
  listProfiles: method(external_exports.object({}), external_exports.array(LlmProfileSchema)),
20938
21127
  upsertProfile: method(external_exports.object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -20966,6 +21155,25 @@ var llmCapability = {
20966
21155
  listModelCatalog: method(external_exports.object({}), external_exports.array(ManagedModelCatalogEntrySchema)),
20967
21156
  listRuntimeNodes: method(external_exports.object({}), external_exports.array(LlmRuntimeNodeSchema)),
20968
21157
  listNodeModels: method(external_exports.object({ nodeId: external_exports.string() }), external_exports.array(LlmNodeModelSchema)),
21158
+ /**
21159
+ * One typed Hugging Face reference → a pinned, verified `ManagedModelRef`.
21160
+ *
21161
+ * Runs on the HUB, not on the target node: resolution needs egress to
21162
+ * huggingface.co, and an agent that cannot reach it still installs fine
21163
+ * through the model-distributor relay. Nothing is downloaded here — this is
21164
+ * a tree read plus a HEAD, so the operator sees the size, the quantization
21165
+ * and the mmproj BEFORE approving a multi-GB pull.
21166
+ */
21167
+ resolveModelRef: method(external_exports.object({
21168
+ /** `https://huggingface.co/<org>/<repo>/resolve/main/<f>.gguf`,
21169
+ * `<org>/<repo>/<f>.gguf`, `<org>/<repo>` or `<org>/<repo>:<QUANT>`. */
21170
+ ref: external_exports.string(),
21171
+ /** Explicit ceiling override, in bytes. Absent = the built-in ceiling. */
21172
+ maxBytes: external_exports.number().positive().optional()
21173
+ }), HfModelResolutionSchema, {
21174
+ kind: "mutation",
21175
+ auth: "admin"
21176
+ }),
20969
21177
  installModel: method(external_exports.object({
20970
21178
  nodeId: external_exports.string(),
20971
21179
  model: ManagedModelRefSchema
@@ -22456,6 +22664,8 @@ var NcSystemEventKindSchema = external_exports.enum([
22456
22664
  "stream-offline",
22457
22665
  "node-online",
22458
22666
  "node-offline",
22667
+ "node-inference-unavailable",
22668
+ "detection-blind",
22459
22669
  "addon-update-available",
22460
22670
  "server-update-available",
22461
22671
  "alarm-triggered",
@@ -22508,7 +22718,16 @@ var NcScheduleSchema = external_exports.object({
22508
22718
  invert: external_exports.boolean().optional()
22509
22719
  });
22510
22720
  var NcPlateMatcherSchema = external_exports.object({
22511
- values: external_exports.array(external_exports.string().min(1)).min(1),
22721
+ /**
22722
+ * Plate texts (or gallery vehicle names) to match. EMPTY = **any plate the
22723
+ * pipeline could read** — the plate half of "no selection = no narrowing",
22724
+ * and the switch that says this rule is about vehicles that were IDENTIFIED
22725
+ * rather than merely seen. A subject carrying no plate still fails.
22726
+ *
22727
+ * The `.min(1)` this used to carry made that state unauthorable; nothing has
22728
+ * ever persisted an empty list, so widening it cannot change an existing rule.
22729
+ */
22730
+ values: external_exports.array(external_exports.string().min(1)),
22512
22731
  /** Max Levenshtein distance after normalization (uppercase alphanumeric). */
22513
22732
  maxDistance: external_exports.number().int().min(0).max(3).default(1)
22514
22733
  });
@@ -22527,13 +22746,13 @@ var NcOccupancyConditionSchema = external_exports.object({
22527
22746
  sustainSeconds: external_exports.number().int().min(0).max(3600).default(15)
22528
22747
  });
22529
22748
  var NcAudioConditionSchema = external_exports.object({
22530
- /** Audio macro labels; absent = any sound (level-only rule). */
22749
+ /** LABEL MODE: audio macro labels. Present fires on the first labelled frame. */
22531
22750
  labels: external_exports.array(external_exports.string().min(1)).min(1).optional(),
22532
- /** Level floor in dBFS (negative-going, `0` = full scale); absent = any level. */
22751
+ /** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
22533
22752
  dbThreshold: external_exports.number().min(-96).max(0).optional(),
22534
- /** Percentage of the window's samples that must be hits (1–100). */
22753
+ /** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
22535
22754
  hitPercent: external_exports.number().int().min(1).max(100).default(60),
22536
- /** Length of the sampling window in seconds. */
22755
+ /** LEVEL MODE ONLY: length of the sampling window in seconds. */
22537
22756
  samplingSeconds: external_exports.number().int().min(1).max(300).default(10)
22538
22757
  });
22539
22758
  var NcCrossingSchema = external_exports.enum([
@@ -22600,9 +22819,29 @@ var NcDeviceStateConditionSchema = external_exports.object({
22600
22819
  /** Any of these matches. */
22601
22820
  states: external_exports.array(external_exports.string().min(1)).min(1)
22602
22821
  });
22822
+ var NcSceneConditionSchema = external_exports.object({
22823
+ /** `SceneMonitor.id` — the uuid the cap mints. The whole lookup key. */
22824
+ sceneId: external_exports.string().min(1),
22825
+ /** The camera the scene lives on. A hint for the editor and the log line. */
22826
+ deviceId: external_exports.number().int().optional(),
22827
+ /** The state the scene must be in for the rule to fire. */
22828
+ requiredState: external_exports.enum(["matched", "diverged"]),
22829
+ /**
22830
+ * Read the LATCH (`true`) or the LIVE verdict (`false`). Absent = follow the
22831
+ * scene's own `emit` field, which is the only place that decision belongs.
22832
+ */
22833
+ latched: external_exports.boolean().optional()
22834
+ });
22603
22835
  var NcConditionsSchema = external_exports.object({
22604
22836
  /** Gate on ANOTHER device's current state (the alarm armed, a switch on). */
22605
22837
  deviceState: NcDeviceStateConditionSchema.optional(),
22838
+ /**
22839
+ * Gate on a SCENE's state — "only while the bin is still out". Composes with
22840
+ * every trigger (detection, occupancy, audio, sensor, package, track-end);
22841
+ * unlike `occupancy`/`audio` it discriminates nothing. See
22842
+ * {@link NcSceneCondition} and D159.
22843
+ */
22844
+ scene: NcSceneConditionSchema.optional(),
22606
22845
  /** Device scope — absent = all devices. */
22607
22846
  devices: external_exports.array(external_exports.number()).optional(),
22608
22847
  /** Detector class names (any overlap with the record's class set). */
@@ -22628,18 +22867,47 @@ var NcConditionsSchema = external_exports.object({
22628
22867
  */
22629
22868
  labelEquals: external_exports.array(external_exports.string().min(1)).optional(),
22630
22869
  /**
22631
- * Identity matcher. P1 boundary: matched against the record's collapsed
22632
- * `label` (the identity display name propagated by the face pipeline) —
22633
- * identity-ID matching rides in P2 when identity ids reach the record.
22870
+ * KNOWN FACES the rule's identity scope, and the switch that says the rule
22871
+ * is about recognised people at all.
22872
+ *
22873
+ * Three states, and the empty one is the point:
22874
+ *
22875
+ * | value | meaning |
22876
+ * | --- | --- |
22877
+ * | absent | the rule does not care who it is; an unrecognised person matches |
22878
+ * | `[]` | **only known faces** — any identity in the gallery, nobody in particular |
22879
+ * | a list | only these identities |
22880
+ *
22881
+ * `[]` is the repo-wide "no selection = no narrowing" reading (an absent
22882
+ * `devices` list is every device), applied one level down: the operator has
22883
+ * turned the face scope ON and narrowed it to nothing, which is every known
22884
+ * face. No second field states the same thing — a switch that can disagree
22885
+ * with the list under it is worse than no switch (D62).
22886
+ *
22887
+ * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
22888
+ * renameable, and a rule authored on "Gianluca" went silently dark the moment
22889
+ * the operator fixed the spelling. The id reaches the record on
22890
+ * `LabelAttribution.identityId`; the name is what the editor shows and what
22891
+ * `{{label}}` renders.
22892
+ *
22893
+ * Rules written before this carry NAMES, and are resolved to ids lazily at
22894
+ * load (`NcRuleStore.load`) against the live gallery — a name nothing answers
22895
+ * for is left as it stands and reported, never dropped. The engine also
22896
+ * accepts a display-name hit as a compatibility leg, so a rule whose
22897
+ * migration could not resolve keeps matching exactly what it matched before.
22634
22898
  */
22635
22899
  identities: external_exports.array(external_exports.string().min(1)).optional(),
22636
- /** Fuzzy plate matcher against the record's `label` (plate text). */
22900
+ /**
22901
+ * KNOWN PLATES / VEHICLES — the plate mirror of {@link identities}, including
22902
+ * the empty-list reading: `values: []` is "any plate the OCR could read",
22903
+ * a non-empty list is those plates (fuzzily). See {@link NcPlateMatcherSchema}.
22904
+ */
22637
22905
  plates: NcPlateMatcherSchema.optional(),
22638
22906
  /**
22639
- * Identity EXCLUDE — mirror of {@link identities} with `notIn` semantics.
22640
- * Same P1 boundary: matched against the record's collapsed `label` (the
22641
- * identity display name). A record with NO label passes (nothing to
22642
- * exclude), unlike the include variant which fails on an absent label.
22907
+ * Identity EXCLUDE — mirror of {@link identities} with `notIn` semantics, and
22908
+ * the same id members and the same lazy name→id migration. A record with NO
22909
+ * identity passes (nothing to exclude), unlike the include variant which
22910
+ * fails on an unrecognised subject. An EMPTY list excludes nobody.
22643
22911
  */
22644
22912
  identitiesExclude: external_exports.array(external_exports.string().min(1)).optional(),
22645
22913
  /**
@@ -22964,7 +23232,80 @@ var NcRuleInputSchema = external_exports.object({
22964
23232
  * a rule that predates the gate must keep delivering byte-for-byte as it
22965
23233
  * did, and absent is the only way to say that without a migration.
22966
23234
  */
22967
- confirm: NcConfirmSchema.optional()
23235
+ confirm: NcConfirmSchema.optional(),
23236
+ /**
23237
+ * WAIT for face/plate recognition before saying anything.
23238
+ *
23239
+ * A notification's TEXT is frozen at enqueue and its media is re-resolved at
23240
+ * send; the identity is neither. A face is confirmed after `confirmFrames`
23241
+ * agreeing observations — p50 **11.4 s** after the track was first seen,
23242
+ * measured on this hub — and an `immediate` rule enqueues on the first object
23243
+ * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
23244
+ * immediate path, and no amount of media re-resolution fixes a sentence.
23245
+ *
23246
+ * Only two honest answers exist, and this flag picks between them. It has
23247
+ * effect ONLY on a rule that declares a recognition scope
23248
+ * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
23249
+ * other rule there is nothing to wait for and the flag is inert.
23250
+ *
23251
+ * | value | what happens |
23252
+ * | --- | --- |
23253
+ * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
23254
+ * | 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) |
23255
+ *
23256
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
23257
+ * on the addon cap path, and absent has to keep meaning exactly what every
23258
+ * rule authored before this field meant.
23259
+ *
23260
+ * The cost of `true` is stated here because the editor states it too: a rule
23261
+ * that waits also inherits track-close SEMANTICS — its `zones` condition
23262
+ * tests every zone the track visited and a `crossing` condition can no longer
23263
+ * be satisfied, because a closed track carries no crossing.
23264
+ */
23265
+ waitForEnhancement: external_exports.boolean().optional(),
23266
+ /**
23267
+ * GROUP a burst of subjects into ONE notification that grows.
23268
+ *
23269
+ * Seconds of quiet after the last matching subject before the burst is
23270
+ * considered over. While it is open, the first subject enqueues immediately —
23271
+ * **exactly as today, with no added latency** — and every real growth (a new
23272
+ * subject, or a name confirmed on one already in it) REPLACES that
23273
+ * notification with an updated one naming everybody. The push carries the
23274
+ * group's own coalescing tag, so the phone replaces rather than stacks.
23275
+ *
23276
+ * `0` / absent = off, and off is today's behaviour byte for byte.
23277
+ *
23278
+ * ### Why an idle cutoff and not a window
23279
+ *
23280
+ * The measured seven-person arrival on device 590 spans 110 s with every
23281
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
23282
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
23283
+ * 30 is Frigate's shipped value for the same decision.
23284
+ *
23285
+ * ### What it replaces
23286
+ *
23287
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
23288
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
23289
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
23290
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
23291
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
23292
+ * budget over GROUPS — which is what it always meant — and a growth is never
23293
+ * throttled by the window its own first member spent.
23294
+ *
23295
+ * ### Interaction with {@link waitForEnhancement}
23296
+ *
23297
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
23298
+ * TRACK CLOSE, so with both set the group is opened by the first member to
23299
+ * CLOSE — already carrying its name — and grows as later members close. That
23300
+ * is later, and complete. With grouping alone the group opens on the first
23301
+ * object event and picks up names as they are confirmed, through the growth
23302
+ * path. Neither combination fires twice for one subject.
23303
+ *
23304
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
23305
+ * on the addon cap path, so absent must keep meaning what it meant before this
23306
+ * field existed.
23307
+ */
23308
+ groupIdleSec: external_exports.number().int().min(0).max(600).optional()
22968
23309
  });
22969
23310
  var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
22970
23311
  disabledTargetIds: external_exports.array(external_exports.string()).optional(),
@@ -23061,6 +23402,7 @@ var NcConditionDescriptorSchema = external_exports.object({
23061
23402
  "occupancy",
23062
23403
  "audio",
23063
23404
  "deviceState",
23405
+ "scene",
23064
23406
  "systemEvent"
23065
23407
  ]),
23066
23408
  operator: external_exports.enum([
@@ -23452,7 +23794,55 @@ var MethodAccessSchema = external_exports.enum([
23452
23794
  var AllowedProviderSchema = external_exports.union([external_exports.literal("*"), external_exports.array(external_exports.string())]);
23453
23795
  var AllowedDevicesSchema = external_exports.record(external_exports.string(), external_exports.union([external_exports.literal("*"), external_exports.array(external_exports.string())]));
23454
23796
  var CapScopeSchema = external_exports.enum(["device", "system"]);
23455
- var TokenScopeSchema = external_exports.discriminatedUnion("type", [
23797
+ var DeviceSelectorSchema = external_exports.discriminatedUnion("kind", [
23798
+ external_exports.object({ kind: external_exports.literal("all") }),
23799
+ external_exports.object({
23800
+ kind: external_exports.literal("ids"),
23801
+ ids: external_exports.array(external_exports.number().int()).min(1)
23802
+ }),
23803
+ external_exports.object({
23804
+ kind: external_exports.literal("types"),
23805
+ types: external_exports.array(external_exports.enum(DeviceType)).min(1)
23806
+ }),
23807
+ external_exports.object({
23808
+ kind: external_exports.literal("locations"),
23809
+ locations: external_exports.array(external_exports.string().min(1)).min(1)
23810
+ })
23811
+ ]);
23812
+ var DeviceTokenScopeSchema = external_exports.object({
23813
+ type: external_exports.literal("device"),
23814
+ /** The device SET this grant covers — resolved against the live fleet. */
23815
+ selector: DeviceSelectorSchema,
23816
+ access: external_exports.array(MethodAccessSchema).min(1),
23817
+ /**
23818
+ * Whether a grant on a PARENT device transparently covers its accessory
23819
+ * CHILDREN (siren / floodlight / PIR) via the persisted-parentage walk.
23820
+ * Direction is parent → children ONLY.
23821
+ *
23822
+ * Absent → the matcher DERIVES it from the access flavour: `view`
23823
+ * inherits (a camera viewer sees the camera's accessories), `create` /
23824
+ * `delete` do NOT (actuating/removing a child is an explicit act the
23825
+ * operator must grant on the child, not inherit from the parent). Set it
23826
+ * explicitly to override that default per grant.
23827
+ */
23828
+ includeLinked: external_exports.boolean().optional()
23829
+ });
23830
+ function migrateLegacyTokenScope(raw) {
23831
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return raw;
23832
+ if (Reflect.get(raw, "type") !== "device") return raw;
23833
+ if (Reflect.get(raw, "selector") !== void 0) return raw;
23834
+ const targets = Reflect.get(raw, "targets");
23835
+ if (!Array.isArray(targets)) return raw;
23836
+ return {
23837
+ type: "device",
23838
+ selector: {
23839
+ kind: "ids",
23840
+ ids: targets.map((t) => typeof t === "string" ? Number(t) : t).filter((n) => typeof n === "number" && Number.isInteger(n))
23841
+ },
23842
+ access: Reflect.get(raw, "access")
23843
+ };
23844
+ }
23845
+ var TokenScopeSchema = external_exports.preprocess(migrateLegacyTokenScope, external_exports.discriminatedUnion("type", [
23456
23846
  external_exports.object({
23457
23847
  type: external_exports.literal("category"),
23458
23848
  target: CapScopeSchema,
@@ -23468,18 +23858,8 @@ var TokenScopeSchema = external_exports.discriminatedUnion("type", [
23468
23858
  target: external_exports.string(),
23469
23859
  access: external_exports.array(MethodAccessSchema).min(1)
23470
23860
  }),
23471
- external_exports.object({
23472
- type: external_exports.literal("device"),
23473
- /**
23474
- * One or more deviceIds (serialised as strings for wire-format
23475
- * consistency with the rest of the union). Matcher accepts if
23476
- * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
23477
- * of one scope-per-device when granting access to a set of cameras.
23478
- */
23479
- targets: external_exports.array(external_exports.string()).min(1),
23480
- access: external_exports.array(MethodAccessSchema).min(1)
23481
- })
23482
- ]);
23861
+ DeviceTokenScopeSchema
23862
+ ]));
23483
23863
  var UserRecordSchema = external_exports.object({
23484
23864
  id: external_exports.string(),
23485
23865
  username: external_exports.string(),
@@ -23724,7 +24104,21 @@ var LabelTierSchema = external_exports.union([external_exports.literal(1), exter
23724
24104
  var LabelAttributionSchema = external_exports.object({
23725
24105
  stepId: external_exports.string(),
23726
24106
  modelId: external_exports.string().optional(),
23727
- decidedAt: external_exports.number()
24107
+ decidedAt: external_exports.number(),
24108
+ /**
24109
+ * The GALLERY id behind a recognised tier-2 label — a face-gallery
24110
+ * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
24111
+ *
24112
+ * The text alone is a DISPLAY NAME, and a display name is renameable: a
24113
+ * notification rule authored on "Gianluca" stopped matching the moment the
24114
+ * operator fixed the spelling in the gallery, and nothing said so. The id is
24115
+ * the thing that does not move, so it is what a rule matches on
24116
+ * (`NcConditions.identities`) and the text is what a human is shown.
24117
+ *
24118
+ * Absent when the label names no gallery row — a plate the OCR read but no
24119
+ * vehicle claims, a sub-class, a species, any tier-1 value.
24120
+ */
24121
+ identityId: external_exports.string().optional()
23728
24122
  });
23729
24123
  var TieredLabelFields = {
23730
24124
  /** Tier 1 — the sub-class. See {@link LabelTierSchema}. */
@@ -23834,6 +24228,28 @@ var TrackSchema = external_exports.object({
23834
24228
  * `=== true` and render nothing otherwise, never infer "no face".
23835
24229
  */
23836
24230
  hasFace: external_exports.boolean().optional(),
24231
+ /**
24232
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
24233
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
24234
+ * so the passage is tracked once and as a VEHICLE.
24235
+ *
24236
+ * It exists because the fold's record was dishonest. D34 and the code both
24237
+ * said "the person is not lost — it is reported so both entities stay on the
24238
+ * record"; in fact the pair went into a per-processor RAM field behind an
24239
+ * accessor nobody called, and every durable surface said `vehicle`, full
24240
+ * stop. This is the composition note that makes the row true.
24241
+ *
24242
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
24243
+ * person" is not an answer to "what is this" — both label tiers would refuse
24244
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
24245
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
24246
+ * and a `person` rule still does not fire for someone cycling past.
24247
+ *
24248
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
24249
+ * the column, and every hub that predates the field, omits it. Test
24250
+ * `=== true` and render nothing otherwise — never infer "no rider".
24251
+ */
24252
+ hasRider: external_exports.boolean().optional(),
23837
24253
  ...TrackFlagFields,
23838
24254
  ...TrackRetrainFields
23839
24255
  });
@@ -24112,7 +24528,10 @@ var RecentTracksQueryInput = external_exports.object({
24112
24528
  * Encodes the (lastSeen, trackId) sort position — treat as opaque. */
24113
24529
  cursor: external_exports.string().optional(),
24114
24530
  /** See {@link TrackProjectionSchema}. Default `full`. */
24115
- projection: TrackProjectionSchema.optional()
24531
+ projection: TrackProjectionSchema.optional(),
24532
+ /** Include stationary-promoted rows (parked objects). Default false: the
24533
+ * feed lists passages; parking records live on the stationary registry. */
24534
+ includeStationary: external_exports.boolean().optional()
24116
24535
  });
24117
24536
  var RecentTracksPageSchema = external_exports.object({
24118
24537
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -24315,7 +24734,11 @@ var pipelineAnalyticsCapability = {
24315
24734
  zone: TrackZoneFilterSchema.optional(),
24316
24735
  /** See {@link TrackProjectionSchema}. Default `full` (backward
24317
24736
  * compatible — omitting the field keeps today's exact behaviour). */
24318
- projection: TrackProjectionSchema.optional()
24737
+ projection: TrackProjectionSchema.optional(),
24738
+ /** Include stationary-promoted rows (parked objects handed to the
24739
+ * stationary registry). Default false: the timeline lists passages,
24740
+ * not parking records (operator decision, 2026-08-15). */
24741
+ includeStationary: external_exports.boolean().optional()
24319
24742
  }), external_exports.array(TrackSchema).readonly()),
24320
24743
  /**
24321
24744
  * Batched cluster-wide track listing — ONE call for the events page /
@@ -24806,7 +25229,8 @@ var pipelineAnalyticsCapability = {
24806
25229
  }),
24807
25230
  getEventMedia: method(external_exports.object({
24808
25231
  eventId: external_exports.string(),
24809
- kind: MediaFileKindEnum.optional()
25232
+ kind: MediaFileKindEnum.optional(),
25233
+ deviceId: external_exports.number()
24810
25234
  }), external_exports.array(MediaFileSchema).readonly()),
24811
25235
  /** All media rows owned by a track. `kinds` narrows to a kind subset so a
24812
25236
  * client can fetch the SMALL display variants on open and pull the
@@ -24814,7 +25238,8 @@ var pipelineAnalyticsCapability = {
24814
25238
  * Absent ⇒ every kind (back-compat). */
24815
25239
  getTrackMedia: method(external_exports.object({
24816
25240
  trackId: external_exports.string(),
24817
- kinds: external_exports.array(MediaFileKindEnum).optional()
25241
+ kinds: external_exports.array(MediaFileKindEnum).optional(),
25242
+ deviceId: external_exports.number()
24818
25243
  }), external_exports.array(MediaFileSchema).readonly()),
24819
25244
  /**
24820
25245
  * What media a track HAS, without any of it.
@@ -24831,7 +25256,10 @@ var pipelineAnalyticsCapability = {
24831
25256
  * tell a full-resolution variant existed — and the affordance that opens it
24832
25257
  * would silently disappear.
24833
25258
  */
24834
- listTrackMedia: method(external_exports.object({ trackId: external_exports.string() }), external_exports.array(MediaFileInfoSchema).readonly()),
25259
+ listTrackMedia: method(external_exports.object({
25260
+ trackId: external_exports.string(),
25261
+ deviceId: external_exports.number()
25262
+ }), external_exports.array(MediaFileInfoSchema).readonly()),
24835
25263
  /**
24836
25264
  * Search object events by text query using CLIP cosine similarity.
24837
25265
  * Encodes `text` via the `embedding-encoder` cap, queries the
@@ -25608,6 +26036,12 @@ var maxSessionHoldMsField = {
25608
26036
  default: 12e4,
25609
26037
  step: 5e3
25610
26038
  };
26039
+ var audioMotionWindowMsField = {
26040
+ min: 5e3,
26041
+ max: 6e5,
26042
+ default: 9e4,
26043
+ step: 5e3
26044
+ };
25611
26045
  var motionFpsField = {
25612
26046
  min: 1,
25613
26047
  max: 30,
@@ -25623,7 +26057,7 @@ var detectionFpsField = {
25623
26057
  var occupancyRecheckSecField = {
25624
26058
  min: 0,
25625
26059
  max: 300,
25626
- default: 30,
26060
+ default: 300,
25627
26061
  step: 5
25628
26062
  };
25629
26063
  var occupancyRecheckFramesField = {
@@ -25701,6 +26135,27 @@ var RunnerCameraConfigSchema = external_exports.object({
25701
26135
  * resolved `CameraDetectionConfig`.
25702
26136
  */
25703
26137
  maxSessionHoldMs: external_exports.number().min(maxSessionHoldMsField.min).max(maxSessionHoldMsField.max).optional(),
26138
+ /**
26139
+ * Orchestrator-side quiet period (ms) that closes an `audioMode:
26140
+ * 'on-motion'` audio window, measured from the LAST motion event.
26141
+ *
26142
+ * This exists because the falling edge cannot be relied on. Camera-native
26143
+ * providers emit motion as a RISING EDGE ONLY (Reolink's Baichuan push and
26144
+ * its email-push SMTP path both emit `detected: true` and never the
26145
+ * counterpart); only the frame-diff analyzer emits falls. So on an
26146
+ * onboard-only camera a window that closed only on `detected: false` never
26147
+ * closed at all, and `on-motion` silently behaved as `always-on` — on a
26148
+ * battery camera, the one failure mode the mode exists to prevent.
26149
+ *
26150
+ * Every motion event rearms this timer WITHOUT restarting the stream, so a
26151
+ * burst of re-fires costs nothing. A falling edge, when one does arrive,
26152
+ * still closes earlier via `motionCooldownMs` — whichever comes first wins.
26153
+ *
26154
+ * Not consumed by the runner: carried here so it shares the per-camera
26155
+ * device-settings surface with `motionCooldownMs`, exactly like
26156
+ * `maxSessionHoldMs`.
26157
+ */
26158
+ audioMotionWindowMs: external_exports.number().min(audioMotionWindowMsField.min).max(audioMotionWindowMsField.max).optional(),
25704
26159
  motionFps: external_exports.number().min(motionFpsField.min).max(motionFpsField.max).default(motionFpsField.default),
25705
26160
  detectionFps: external_exports.number().min(detectionFpsField.min).max(detectionFpsField.max).default(detectionFpsField.default),
25706
26161
  motionStreamId: external_exports.string(),
@@ -25870,6 +26325,25 @@ var RunnerCameraDeviceUIFields = [
25870
26325
  nullable: true,
25871
26326
  nullLabel: "Default"
25872
26327
  },
26328
+ {
26329
+ key: "audioMotionWindowMs",
26330
+ type: "slider",
26331
+ label: "Audio window after motion",
26332
+ description: "How long audio keeps being analysed after the last motion event. Each new motion event extends the window without restarting the audio stream.",
26333
+ min: audioMotionWindowMsField.min,
26334
+ max: audioMotionWindowMsField.max,
26335
+ step: audioMotionWindowMsField.step,
26336
+ default: audioMotionWindowMsField.default,
26337
+ showValue: true,
26338
+ unit: "s",
26339
+ displayScale: 1e3,
26340
+ nullable: true,
26341
+ nullLabel: "Default",
26342
+ showWhen: {
26343
+ field: "audioMode",
26344
+ equals: "on-motion"
26345
+ }
26346
+ },
25873
26347
  {
25874
26348
  key: "onboardMotionDrivesAnalyzer",
25875
26349
  type: "boolean",
@@ -27328,7 +27802,16 @@ var snapshotCapability = {
27328
27802
  /** A sleeping battery camera: the frame is deliberately stale and will
27329
27803
  * NOT refresh in the background. A surface should say so rather than
27330
27804
  * present it as current. */
27331
- sleeping: external_exports.boolean()
27805
+ sleeping: external_exports.boolean(),
27806
+ /** Current device state rendered over the cached frame. State images
27807
+ * remain authoritative even when their photographic background is
27808
+ * old; null means the link must carry a current camera frame. */
27809
+ stateReason: external_exports.enum([
27810
+ "disabled",
27811
+ "sleeping",
27812
+ "unreachable",
27813
+ "waking"
27814
+ ]).nullable()
27332
27815
  })))
27333
27816
  },
27334
27817
  status: {
@@ -29152,6 +29635,25 @@ var BatteryStatusSchema = external_exports.object({
29152
29635
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
29153
29636
  lastUpdated: external_exports.number(),
29154
29637
  /**
29638
+ * Ms epoch of the last time the device PROVED it was reachable — a
29639
+ * completed firmware round-trip, an observed wake, or an inbound push
29640
+ * (firmware event, email). `0`/absent = never since this slice was born.
29641
+ *
29642
+ * This is the ONLY input that separates "asleep" from "gone", and it is
29643
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
29644
+ * for the radio, because a poll that confirms reachability is the same
29645
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
29646
+ * single derivation every consumer must use; no surface computes its own.
29647
+ *
29648
+ * It is deliberately NOT a clock in the
29649
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
29650
+ * observation itself, and it is the only thing a 30-hour silence is
29651
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
29652
+ * Reolink provider) so a value that means "recently" cannot cost a
29653
+ * SQLite commit per round-trip.
29654
+ */
29655
+ lastContactAt: external_exports.number().optional(),
29656
+ /**
29155
29657
  * True when the source is a BINARY low-battery indicator (HA
29156
29658
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
29157
29659
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -31142,7 +31644,41 @@ var intercomCapability = {
31142
31644
  status: {
31143
31645
  schema: IntercomStatusSchema,
31144
31646
  kind: "command-driven"
31145
- }
31647
+ },
31648
+ /**
31649
+ * Runtime-state slice — mirrored by the kernel.
31650
+ *
31651
+ * The cap declared `status` and nothing else, so the only two sources an
31652
+ * exporter has for a value — the `device.state-changed` slice event and the
31653
+ * `deviceState.getAllSnapshots` snapshot, both built from runtime state —
31654
+ * carried nothing for `intercom`. A talk-back entity in Home Assistant would
31655
+ * have been published and never received a value, which is the defect the
31656
+ * export's two classification tables exist to prevent (177 of them, once), so
31657
+ * `intercom` was excluded rather than exported.
31658
+ *
31659
+ * The shape is the status shape: there is exactly one truth about talk-back
31660
+ * and duplicating it into a second schema is how two halves of one capability
31661
+ * come to disagree. Providers write it through
31662
+ * `this.runtimeState.setCapState('intercom', …)` at the four points that open
31663
+ * and close a session, and seed it at registration so the slice exists before
31664
+ * the first session rather than after it.
31665
+ *
31666
+ * **Bound, named rather than hidden:** `talking` mirrors the provider's own
31667
+ * session handle, so a session torn down by a transport death that never
31668
+ * reaches `stopSession` / `endTalkSession` leaves it latched until the next
31669
+ * session or the next restart. That is why the slice is `session` and not
31670
+ * `restored` — a restart must never restore "talking".
31671
+ */
31672
+ runtimeState: IntercomStatusSchema,
31673
+ /**
31674
+ * Runtime-state durability: **session** — `talking` describes a live audio
31675
+ * session, which by definition does not survive the process that held it.
31676
+ * Restoring it would publish a camera as talking to nobody.
31677
+ *
31678
+ * See `RuntimeStateDurability`. Enforced by
31679
+ * `scripts/check-runtime-state-durability.ts`.
31680
+ */
31681
+ durability: "session"
31146
31682
  };
31147
31683
  var LawnMowerActivitySchema = external_exports.enum([
31148
31684
  "idle",
@@ -33796,7 +34332,7 @@ var recordingCapability = {
33796
34332
  toMs: external_exports.number()
33797
34333
  }), RecordingAvailabilitySchema, {
33798
34334
  kind: "query",
33799
- auth: "admin"
34335
+ auth: "protected"
33800
34336
  }),
33801
34337
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
33802
34338
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
@@ -33808,7 +34344,7 @@ var recordingCapability = {
33808
34344
  tzOffsetMinutes: external_exports.number()
33809
34345
  }), RecordingDaysSchema, {
33810
34346
  kind: "query",
33811
- auth: "admin"
34347
+ auth: "protected"
33812
34348
  }),
33813
34349
  getPlaybackManifest: method(external_exports.object({
33814
34350
  deviceId: external_exports.number(),
@@ -33816,7 +34352,7 @@ var recordingCapability = {
33816
34352
  toMs: external_exports.number()
33817
34353
  }), RecordingManifestSchema, {
33818
34354
  kind: "query",
33819
- auth: "admin"
34355
+ auth: "protected"
33820
34356
  }),
33821
34357
  getStorageUsage: method(external_exports.object({}), RecordingStorageUsageSchema, {
33822
34358
  kind: "query",
@@ -34161,12 +34697,32 @@ var recordingExportCapability = {
34161
34697
  }
34162
34698
  };
34163
34699
  var SceneConditionSchema = external_exports.string();
34700
+ var SceneUncoveredPolicySchema = external_exports.enum(["skip", "judge-anyway"]);
34701
+ var SceneVerdictSchema = external_exports.enum([
34702
+ "matched",
34703
+ "diverged",
34704
+ "unknown"
34705
+ ]);
34706
+ var SceneUnavailableSchema = external_exports.enum([
34707
+ "no-reference-for-condition",
34708
+ "view-shifted",
34709
+ "no-vision-profile",
34710
+ "encoder-model-changed",
34711
+ "no-snapshot"
34712
+ ]);
34164
34713
  var SceneReferenceSchema = external_exports.object({
34165
34714
  embedding: external_exports.array(external_exports.number()),
34166
34715
  modelId: external_exports.string(),
34167
34716
  condition: SceneConditionSchema,
34168
34717
  capturedAt: external_exports.number(),
34169
- thumbnailMediaId: external_exports.string().optional()
34718
+ thumbnailMediaId: external_exports.string().optional(),
34719
+ /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
34720
+ * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
34721
+ * normalized rect frame a different piece of world, and the scene would
34722
+ * diverge forever with a perfectly plausible cosine. Checked LAZILY, only
34723
+ * when hysteresis is about to flip — one extra encode per candidate
34724
+ * transition, not per poll. */
34725
+ anchorEmbedding: external_exports.array(external_exports.number()).optional()
34170
34726
  });
34171
34727
  var SceneMonitorStateSchema = external_exports.object({
34172
34728
  id: external_exports.string(),
@@ -34186,6 +34742,18 @@ var SceneCheckSchema = external_exports.discriminatedUnion("mode", [external_exp
34186
34742
  profileId: external_exports.string().optional(),
34187
34743
  hysteresisCount: external_exports.number().int().positive()
34188
34744
  })]);
34745
+ var SCENE_DEFAULT_ANCHOR_THRESHOLD = 0.85;
34746
+ var SCENE_DEFAULT_UNCOVERED_POLICY = "skip";
34747
+ var SCENE_CONFIRM_DEFAULT_TIMEOUT_MS = 8e3;
34748
+ var SceneConfirmSchema = external_exports.object({
34749
+ enabled: external_exports.boolean().default(false),
34750
+ prompt: external_exports.string().min(1).max(1e3),
34751
+ profileId: external_exports.string().optional(),
34752
+ timeoutMs: external_exports.number().int().min(1e3).max(2e4).default(SCENE_CONFIRM_DEFAULT_TIMEOUT_MS),
34753
+ maxImagePx: external_exports.number().int().min(64).max(2048).default(448),
34754
+ /** What a timeout / unavailable model means for the PENDING flip. */
34755
+ onTimeout: external_exports.enum(["flip", "hold"]).default("hold")
34756
+ });
34189
34757
  var SceneMonitorSchema = external_exports.object({
34190
34758
  id: external_exports.string(),
34191
34759
  label: external_exports.string(),
@@ -34204,7 +34772,56 @@ var SceneMonitorSchema = external_exports.object({
34204
34772
  lastConfidence: external_exports.number().nullable(),
34205
34773
  currentCondition: SceneConditionSchema.nullable(),
34206
34774
  availability: external_exports.enum(["ok", "unavailable"]),
34207
- unavailableReason: external_exports.string().nullable()
34775
+ unavailableReason: external_exports.string().nullable(),
34776
+ /** Which state is "the initial screen". `null` until the first capture. */
34777
+ baselineStateId: external_exports.string().nullable(),
34778
+ /** Which boolean drives notification rules and any export. */
34779
+ emit: external_exports.enum(["latched", "live"]).default("latched"),
34780
+ /** Live: does the region match the baseline RIGHT NOW. */
34781
+ verdict: SceneVerdictSchema,
34782
+ /** Has it been `diverged` at least once since `armedAt` — the operator's boolean. */
34783
+ latched: external_exports.boolean(),
34784
+ /** Last reset (or creation). */
34785
+ armedAt: external_exports.number(),
34786
+ divergedAt: external_exports.number().nullable(),
34787
+ restoredAt: external_exports.number().nullable(),
34788
+ /** A check is only COUNTED when the device has been quiet this long. Motion
34789
+ * during the window DISCARDS the observation — a car pulling up in front of
34790
+ * the bin must not be able to spend hysteresis credit. */
34791
+ quietSeconds: external_exports.number().int().min(0).max(3600).default(60),
34792
+ /** An observation only advances the pending count when it is at least this
34793
+ * far from the previously counted one, so N agreeing checks span real time
34794
+ * rather than N adjacent polls inside one occlusion. */
34795
+ minObservationSpacingSec: external_exports.number().int().min(0).max(3600).default(120),
34796
+ /** Vision-model adjudication of a candidate flip. Similarity primary only. */
34797
+ confirm: SceneConfirmSchema.optional(),
34798
+ /** Whole-frame anchor cosine below which a flip is REFUSED as `view-shifted`. */
34799
+ anchorThreshold: external_exports.number().min(0).max(1).default(SCENE_DEFAULT_ANCHOR_THRESHOLD),
34800
+ /** Clear the latch on its own when the scene matches again? Default false —
34801
+ * `restoredAt` and the `scene-restored` edge are recorded regardless, so an
34802
+ * automation can react to the bin coming back without the operator's own
34803
+ * alarm silently clearing itself. */
34804
+ autoRestore: external_exports.boolean().default(false),
34805
+ /** What to do when the current light has no reference of its own. See
34806
+ * {@link SceneUncoveredPolicySchema} — the default makes night OPTIONAL. */
34807
+ onUncoveredCondition: SceneUncoveredPolicySchema.default(SCENE_DEFAULT_UNCOVERED_POLICY),
34808
+ /**
34809
+ * The light whose checks are currently being SAT OUT under
34810
+ * `onUncoveredCondition: 'skip'` — `null` when the scene is checking normally.
34811
+ *
34812
+ * Engine-reported and advisory only: it moves no verdict, no latch and no
34813
+ * hysteresis. It exists so the card can say *"night (IR) — checks paused,
34814
+ * nothing captured in this light"* in the same calm voice as the coverage
34815
+ * line, because the alternative is a scene that silently stops answering
34816
+ * after sunset with nothing anywhere saying why. A skipped check must never
34817
+ * read as a broken one.
34818
+ */
34819
+ suspendedCondition: SceneConditionSchema.nullable().default(null),
34820
+ /** Named cause when `verdict === 'unknown'`. */
34821
+ unavailable: SceneUnavailableSchema.nullable(),
34822
+ /** Conditions that have at least one comparable reference — the coverage line
34823
+ * ("day ✓ · ir ✓ · dusk ✗") that turns a silent fallback into a visible fact. */
34824
+ coveredConditions: external_exports.array(SceneConditionSchema)
34208
34825
  });
34209
34826
  var SceneMonitorStatusSchema = external_exports.object({
34210
34827
  monitors: external_exports.array(SceneMonitorSchema),
@@ -34217,12 +34834,6 @@ var sceneMonitorCapability = {
34217
34834
  kind: "wrapper",
34218
34835
  defaultActive: true,
34219
34836
  deviceTypes: [DeviceType.Camera],
34220
- deviceConfig: { ui: {
34221
- kind: "widget",
34222
- widgetId: "host/scene-monitor-editor",
34223
- tab: "scenes",
34224
- label: "Scenes"
34225
- } },
34226
34837
  methods: {
34227
34838
  listScenes: method(external_exports.object({ deviceId: external_exports.number() }), SceneMonitorStatusSchema),
34228
34839
  createScene: method(external_exports.object({
@@ -34253,7 +34864,15 @@ var sceneMonitorCapability = {
34253
34864
  "both"
34254
34865
  ]).optional(),
34255
34866
  checkIntervalSec: external_exports.number().optional(),
34256
- check: SceneCheckSchema.optional()
34867
+ check: SceneCheckSchema.optional(),
34868
+ emit: external_exports.enum(["latched", "live"]).optional(),
34869
+ quietSeconds: external_exports.number().int().min(0).max(3600).optional(),
34870
+ minObservationSpacingSec: external_exports.number().int().min(0).max(3600).optional(),
34871
+ anchorThreshold: external_exports.number().min(0).max(1).optional(),
34872
+ autoRestore: external_exports.boolean().optional(),
34873
+ onUncoveredCondition: SceneUncoveredPolicySchema.optional(),
34874
+ /** `null` clears the vision-model adjudicator. */
34875
+ confirm: SceneConfirmSchema.nullable().optional()
34257
34876
  })
34258
34877
  }), external_exports.void(), {
34259
34878
  kind: "mutation",
@@ -34294,6 +34913,26 @@ var sceneMonitorCapability = {
34294
34913
  }), external_exports.void(), {
34295
34914
  kind: "mutation",
34296
34915
  auth: "admin"
34916
+ }),
34917
+ /**
34918
+ * Clear the latch, re-arm, and — by default — RE-CAPTURE the baseline for
34919
+ * the CURRENT condition. The bin never goes back in exactly the same spot;
34920
+ * "reset" in the operator's head means *this is the new normal*, and
34921
+ * re-capture is what makes the feature self-healing against slow drift
34922
+ * instead of failing silently weeks later.
34923
+ *
34924
+ * Reachable from three surfaces on this one mutation: the scene card, a
34925
+ * notification button (an `onTrigger` sequence with a `kind:'cap'` step —
34926
+ * no new Notification-Center code at all), and tRPC for scripts.
34927
+ */
34928
+ resetScene: method(external_exports.object({
34929
+ deviceId: external_exports.number(),
34930
+ monitorId: external_exports.string(),
34931
+ /** Defaults to TRUE at the provider seam — see `SCENE_RESET_RECAPTURES`. */
34932
+ recapture: external_exports.boolean().optional()
34933
+ }), external_exports.void(), {
34934
+ kind: "mutation",
34935
+ auth: "admin"
34297
34936
  })
34298
34937
  },
34299
34938
  status: {
@@ -34461,13 +35100,40 @@ var CamStreamDescriptorSchema = external_exports.object({
34461
35100
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
34462
35101
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
34463
35102
  });
35103
+ var StreamCatalogStateSchema = external_exports.object({
35104
+ /** The descriptors as last built from a real camera response. Never a guess:
35105
+ * a failed or refused build writes NOTHING, so a restored catalog is always
35106
+ * one the camera itself once produced. */
35107
+ descriptors: external_exports.array(CamStreamDescriptorSchema),
35108
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
35109
+ * path decide whether the camera's own awake window is worth spending on a
35110
+ * re-read. */
35111
+ lastFetchedAt: external_exports.number()
35112
+ });
34464
35113
  var streamCatalogCapability = {
34465
35114
  name: "stream-catalog",
34466
35115
  scope: "device",
34467
35116
  deviceNative: true,
34468
35117
  mode: "singleton",
34469
35118
  deviceTypes: [DeviceType.Camera],
34470
- methods: { getCatalog: method(external_exports.object({ deviceId: external_exports.number().int().nonnegative() }), external_exports.array(CamStreamDescriptorSchema).readonly()) }
35119
+ methods: { getCatalog: method(external_exports.object({ deviceId: external_exports.number().int().nonnegative() }), external_exports.array(CamStreamDescriptorSchema).readonly()) },
35120
+ runtimeState: StreamCatalogStateSchema,
35121
+ /**
35122
+ * Runtime-state durability: **restored** — see the schema doc. A cold
35123
+ * catalog on a sleeping battery camera is not a slow first frame, it is a
35124
+ * camera that cannot be watched at all until it happens to wake.
35125
+ *
35126
+ * Churn is nil by construction: the slice is written only by a SUCCESSFUL
35127
+ * build, and a build only runs when there is no cached copy (or the copy is
35128
+ * a day old and the camera is awake anyway).
35129
+ *
35130
+ * See `RuntimeStateDurability`. Enforced by
35131
+ * `scripts/check-runtime-state-durability.ts`.
35132
+ */
35133
+ durability: "restored",
35134
+ /** Clock field: written, but excluded from the compare that decides whether
35135
+ * persisting is worth a SQLite commit — the descriptors are the value. */
35136
+ volatileStateFields: ["lastFetchedAt"]
34471
35137
  };
34472
35138
  var StreamProfileSchema = external_exports.enum([
34473
35139
  "main",
@@ -34686,6 +35352,30 @@ var NetworkAddressSchema = external_exports.object({
34686
35352
  family: external_exports.string(),
34687
35353
  internal: external_exports.boolean()
34688
35354
  });
35355
+ var SiteLocationSourceSchema = external_exports.enum(["operator-set", "derived-from-ip"]);
35356
+ var SiteLocationSchema = external_exports.object({
35357
+ /** WGS84 decimal degrees. */
35358
+ latitude: external_exports.number().min(-90).max(90),
35359
+ longitude: external_exports.number().min(-180).max(180),
35360
+ source: SiteLocationSourceSchema,
35361
+ /** Epoch ms the value was last written. */
35362
+ updatedAt: external_exports.number(),
35363
+ /**
35364
+ * Human-readable place the geo-IP service reported ("Napoli, IT"). Display
35365
+ * only — never parsed, never matched on. Absent for an operator-typed value.
35366
+ */
35367
+ label: external_exports.string().optional()
35368
+ });
35369
+ var SiteLocationStatusSchema = external_exports.object({
35370
+ location: SiteLocationSchema.nullable(),
35371
+ derivationAttemptedAt: external_exports.number().nullable(),
35372
+ /** Why the last derivation failed, for the UI to show instead of a shrug. */
35373
+ derivationError: external_exports.string().nullable()
35374
+ });
35375
+ var SetSiteLocationInputSchema = external_exports.object({
35376
+ latitude: external_exports.number().min(-90).max(90),
35377
+ longitude: external_exports.number().min(-180).max(180)
35378
+ }).nullable();
34689
35379
  var systemCapability = {
34690
35380
  name: "system",
34691
35381
  scope: "system",
@@ -34703,6 +35393,32 @@ var systemCapability = {
34703
35393
  forceRetentionCleanup: method(external_exports.void(), external_exports.void(), {
34704
35394
  kind: "mutation",
34705
35395
  auth: "admin"
35396
+ }),
35397
+ /**
35398
+ * The site coordinates, deriving a default from the hub's public IP on the
35399
+ * FIRST read that finds nothing stored.
35400
+ *
35401
+ * The derivation is one-shot and bounded: one outbound request, a few
35402
+ * seconds, its outcome persisted either way. A hub with no internet pays it
35403
+ * once and never again, and neither boot nor any consumer is blocked on it —
35404
+ * the caller gets `location: null` and degrades exactly as it did before this
35405
+ * method existed.
35406
+ */
35407
+ getSiteLocation: method(external_exports.void(), SiteLocationStatusSchema),
35408
+ /** Operator input. Always lands as `source: 'operator-set'`. */
35409
+ setSiteLocation: method(SetSiteLocationInputSchema, SiteLocationStatusSchema, {
35410
+ kind: "mutation",
35411
+ auth: "admin"
35412
+ }),
35413
+ /**
35414
+ * Re-run the geo-IP derivation now. The ONLY way a spent or failed
35415
+ * derivation is retried — there is no timer, and no read path retries.
35416
+ * Overwrites an existing `derived-from-ip` value; refuses to clobber an
35417
+ * `operator-set` one.
35418
+ */
35419
+ detectSiteLocation: method(external_exports.void(), SiteLocationStatusSchema, {
35420
+ kind: "mutation",
35421
+ auth: "admin"
34706
35422
  })
34707
35423
  },
34708
35424
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
@@ -35632,6 +36348,7 @@ var BATTERY_DEVICE_PROFILE = {
35632
36348
  },
35633
36349
  settings: {}
35634
36350
  };
36351
+ var BATTERY_UNREACHABLE_AFTER_MS = 360 * 6e4;
35635
36352
  var METHOD_ACCESS_MAP = Object.freeze({
35636
36353
  "accessories.setChildHidden": {
35637
36354
  capName: "accessories",
@@ -37691,6 +38408,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
37691
38408
  addonId: null,
37692
38409
  access: "create"
37693
38410
  },
38411
+ "llm.cancel": {
38412
+ capName: "llm",
38413
+ capScope: "system",
38414
+ addonId: null,
38415
+ access: "create"
38416
+ },
37694
38417
  "llm.deleteModel": {
37695
38418
  capName: "llm",
37696
38419
  capScope: "system",
@@ -37775,6 +38498,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
37775
38498
  addonId: null,
37776
38499
  access: "view"
37777
38500
  },
38501
+ "llm.resolveModelRef": {
38502
+ capName: "llm",
38503
+ capScope: "system",
38504
+ addonId: null,
38505
+ access: "create"
38506
+ },
37778
38507
  "llm.setDefault": {
37779
38508
  capName: "llm",
37780
38509
  capScope: "system",
@@ -39941,6 +40670,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39941
40670
  addonId: null,
39942
40671
  access: "create"
39943
40672
  },
40673
+ "sceneMonitor.resetScene": {
40674
+ capName: "scene-monitor",
40675
+ capScope: "device",
40676
+ addonId: null,
40677
+ access: "delete"
40678
+ },
39944
40679
  "sceneMonitor.updateScene": {
39945
40680
  capName: "scene-monitor",
39946
40681
  capScope: "device",
@@ -40619,6 +41354,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40619
41354
  addonId: null,
40620
41355
  access: "create"
40621
41356
  },
41357
+ "system.detectSiteLocation": {
41358
+ capName: "system",
41359
+ capScope: "system",
41360
+ addonId: null,
41361
+ access: "create"
41362
+ },
40622
41363
  "system.featureFlags": {
40623
41364
  capName: "system",
40624
41365
  capScope: "system",
@@ -40637,6 +41378,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40637
41378
  addonId: null,
40638
41379
  access: "view"
40639
41380
  },
41381
+ "system.getSiteLocation": {
41382
+ capName: "system",
41383
+ capScope: "system",
41384
+ addonId: null,
41385
+ access: "view"
41386
+ },
40640
41387
  "system.health": {
40641
41388
  capName: "system",
40642
41389
  capScope: "system",
@@ -40661,6 +41408,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40661
41408
  addonId: null,
40662
41409
  access: "create"
40663
41410
  },
41411
+ "system.setSiteLocation": {
41412
+ capName: "system",
41413
+ capScope: "system",
41414
+ addonId: null,
41415
+ access: "create"
41416
+ },
40664
41417
  "terminalSession.adoptLegacyMonitor": {
40665
41418
  capName: "terminal-session",
40666
41419
  capScope: "system",
@@ -41232,6 +41985,1704 @@ var METHOD_ACCESS_MAP = Object.freeze({
41232
41985
  access: "create"
41233
41986
  }
41234
41987
  });
41988
+ var METHOD_DEVICE_SELECTORS = Object.freeze({
41989
+ "accessories.setChildHidden": [{
41990
+ name: "childDeviceId",
41991
+ form: "single",
41992
+ optional: false
41993
+ }, {
41994
+ name: "deviceId",
41995
+ form: "single",
41996
+ optional: false
41997
+ }],
41998
+ "addonSettings.getDeviceSettings": [{
41999
+ name: "deviceId",
42000
+ form: "single",
42001
+ optional: false
42002
+ }],
42003
+ "addonSettings.updateDeviceSettings": [{
42004
+ name: "deviceId",
42005
+ form: "single",
42006
+ optional: false
42007
+ }],
42008
+ "alarmPanel.arm": [{
42009
+ name: "deviceId",
42010
+ form: "single",
42011
+ optional: false
42012
+ }],
42013
+ "alarmPanel.disarm": [{
42014
+ name: "deviceId",
42015
+ form: "single",
42016
+ optional: false
42017
+ }],
42018
+ "alarmPanel.trigger": [{
42019
+ name: "deviceId",
42020
+ form: "single",
42021
+ optional: false
42022
+ }],
42023
+ "audioAnalysis.resolveDeviceSettings": [{
42024
+ name: "deviceId",
42025
+ form: "single",
42026
+ optional: false
42027
+ }],
42028
+ "audioAnalyzer.classify": [{
42029
+ name: "deviceId",
42030
+ form: "single",
42031
+ optional: true
42032
+ }],
42033
+ "audioMetrics.getCurrentSnapshot": [{
42034
+ name: "deviceId",
42035
+ form: "single",
42036
+ optional: false
42037
+ }],
42038
+ "audioMetrics.getHistory": [{
42039
+ name: "deviceId",
42040
+ form: "single",
42041
+ optional: false
42042
+ }],
42043
+ "automationControl.disable": [{
42044
+ name: "deviceId",
42045
+ form: "single",
42046
+ optional: false
42047
+ }],
42048
+ "automationControl.enable": [{
42049
+ name: "deviceId",
42050
+ form: "single",
42051
+ optional: false
42052
+ }],
42053
+ "automationControl.trigger": [{
42054
+ name: "deviceId",
42055
+ form: "single",
42056
+ optional: false
42057
+ }],
42058
+ "battery.wakeForStream": [{
42059
+ name: "deviceId",
42060
+ form: "single",
42061
+ optional: false
42062
+ }],
42063
+ "brightness.setBrightness": [{
42064
+ name: "deviceId",
42065
+ form: "single",
42066
+ optional: false
42067
+ }],
42068
+ "button.press": [{
42069
+ name: "deviceId",
42070
+ form: "single",
42071
+ optional: false
42072
+ }],
42073
+ "cameraCredentials.getCredentials": [{
42074
+ name: "deviceId",
42075
+ form: "single",
42076
+ optional: false
42077
+ }],
42078
+ "cameraStreams.getBrokerStreams": [{
42079
+ name: "deviceId",
42080
+ form: "single",
42081
+ optional: false
42082
+ }],
42083
+ "cameraStreams.getCameraStreams": [{
42084
+ name: "deviceId",
42085
+ form: "single",
42086
+ optional: false
42087
+ }],
42088
+ "cameraStreams.getProfileRtspEntries": [{
42089
+ name: "deviceId",
42090
+ form: "single",
42091
+ optional: false
42092
+ }],
42093
+ "cameraStreams.getRtspEntries": [{
42094
+ name: "deviceId",
42095
+ form: "single",
42096
+ optional: false
42097
+ }],
42098
+ "cameraStreams.pickStream": [{
42099
+ name: "deviceId",
42100
+ form: "single",
42101
+ optional: false
42102
+ }],
42103
+ "climateControl.setFanMode": [{
42104
+ name: "deviceId",
42105
+ form: "single",
42106
+ optional: false
42107
+ }],
42108
+ "climateControl.setMode": [{
42109
+ name: "deviceId",
42110
+ form: "single",
42111
+ optional: false
42112
+ }],
42113
+ "climateControl.setPreset": [{
42114
+ name: "deviceId",
42115
+ form: "single",
42116
+ optional: false
42117
+ }],
42118
+ "climateControl.setSwingHorizontal": [{
42119
+ name: "deviceId",
42120
+ form: "single",
42121
+ optional: false
42122
+ }],
42123
+ "climateControl.setSwingVertical": [{
42124
+ name: "deviceId",
42125
+ form: "single",
42126
+ optional: false
42127
+ }],
42128
+ "climateControl.setTarget": [{
42129
+ name: "deviceId",
42130
+ form: "single",
42131
+ optional: false
42132
+ }],
42133
+ "climateControl.setTargetHumidity": [{
42134
+ name: "deviceId",
42135
+ form: "single",
42136
+ optional: false
42137
+ }],
42138
+ "climateControl.setTargetRange": [{
42139
+ name: "deviceId",
42140
+ form: "single",
42141
+ optional: false
42142
+ }],
42143
+ "color.setColor": [{
42144
+ name: "deviceId",
42145
+ form: "single",
42146
+ optional: false
42147
+ }],
42148
+ "consumables.reset": [{
42149
+ name: "deviceId",
42150
+ form: "single",
42151
+ optional: false
42152
+ }],
42153
+ "control.setValue": [{
42154
+ name: "deviceId",
42155
+ form: "single",
42156
+ optional: false
42157
+ }],
42158
+ "cover.close": [{
42159
+ name: "deviceId",
42160
+ form: "single",
42161
+ optional: false
42162
+ }],
42163
+ "cover.open": [{
42164
+ name: "deviceId",
42165
+ form: "single",
42166
+ optional: false
42167
+ }],
42168
+ "cover.setPosition": [{
42169
+ name: "deviceId",
42170
+ form: "single",
42171
+ optional: false
42172
+ }],
42173
+ "cover.setTiltPosition": [{
42174
+ name: "deviceId",
42175
+ form: "single",
42176
+ optional: false
42177
+ }],
42178
+ "cover.stop": [{
42179
+ name: "deviceId",
42180
+ form: "single",
42181
+ optional: false
42182
+ }],
42183
+ "dayNight.getOptions": [{
42184
+ name: "deviceId",
42185
+ form: "single",
42186
+ optional: false
42187
+ }],
42188
+ "dayNight.setSettings": [{
42189
+ name: "deviceId",
42190
+ form: "single",
42191
+ optional: false
42192
+ }],
42193
+ "decoder.createSession": [{
42194
+ name: "deviceId",
42195
+ form: "single",
42196
+ optional: true
42197
+ }],
42198
+ "deviceAdoption.release": [{
42199
+ name: "camDeviceId",
42200
+ form: "single",
42201
+ optional: false
42202
+ }],
42203
+ "deviceAdoption.resync": [{
42204
+ name: "camDeviceId",
42205
+ form: "single",
42206
+ optional: false
42207
+ }],
42208
+ "deviceDiscovery.adoptDevice": [{
42209
+ name: "deviceId",
42210
+ form: "single",
42211
+ optional: false
42212
+ }],
42213
+ "deviceDiscovery.listDiscovered": [{
42214
+ name: "deviceId",
42215
+ form: "single",
42216
+ optional: false
42217
+ }],
42218
+ "deviceDiscovery.refreshDiscovery": [{
42219
+ name: "deviceId",
42220
+ form: "single",
42221
+ optional: false
42222
+ }],
42223
+ "deviceDiscovery.releaseDevice": [{
42224
+ name: "childDeviceId",
42225
+ form: "single",
42226
+ optional: false
42227
+ }, {
42228
+ name: "deviceId",
42229
+ form: "single",
42230
+ optional: false
42231
+ }],
42232
+ "deviceManager.adoptionRelease": [{
42233
+ name: "camDeviceId",
42234
+ form: "single",
42235
+ optional: false
42236
+ }],
42237
+ "deviceManager.adoptionResync": [{
42238
+ name: "camDeviceId",
42239
+ form: "single",
42240
+ optional: false
42241
+ }],
42242
+ "deviceManager.applyInitialMeta": [{
42243
+ name: "deviceId",
42244
+ form: "single",
42245
+ optional: false
42246
+ }, {
42247
+ name: "linkDeviceId",
42248
+ form: "single",
42249
+ optional: true
42250
+ }],
42251
+ "deviceManager.disable": [{
42252
+ name: "deviceId",
42253
+ form: "single",
42254
+ optional: false
42255
+ }],
42256
+ "deviceManager.enable": [{
42257
+ name: "deviceId",
42258
+ form: "single",
42259
+ optional: false
42260
+ }],
42261
+ "deviceManager.getBindings": [{
42262
+ name: "deviceId",
42263
+ form: "single",
42264
+ optional: false
42265
+ }],
42266
+ "deviceManager.getChildren": [{
42267
+ name: "parentDeviceId",
42268
+ form: "single",
42269
+ optional: false
42270
+ }],
42271
+ "deviceManager.getConfigSchema": [{
42272
+ name: "deviceId",
42273
+ form: "single",
42274
+ optional: false
42275
+ }],
42276
+ "deviceManager.getDevice": [{
42277
+ name: "deviceId",
42278
+ form: "single",
42279
+ optional: false
42280
+ }],
42281
+ "deviceManager.getDeviceAggregate": [{
42282
+ name: "deviceId",
42283
+ form: "single",
42284
+ optional: false
42285
+ }],
42286
+ "deviceManager.getDeviceLiveInfoAggregate": [{
42287
+ name: "deviceId",
42288
+ form: "single",
42289
+ optional: false
42290
+ }],
42291
+ "deviceManager.getDeviceSettingsAggregate": [{
42292
+ name: "deviceId",
42293
+ form: "single",
42294
+ optional: false
42295
+ }],
42296
+ "deviceManager.getDeviceStatusAggregate": [{
42297
+ name: "deviceId",
42298
+ form: "single",
42299
+ optional: false
42300
+ }],
42301
+ "deviceManager.getDeviceStatusAggregateBatch": [{
42302
+ name: "deviceIds",
42303
+ form: "array",
42304
+ optional: false
42305
+ }],
42306
+ "deviceManager.getLinkedDevices": [{
42307
+ name: "deviceId",
42308
+ form: "single",
42309
+ optional: false
42310
+ }],
42311
+ "deviceManager.getSettingsSchema": [{
42312
+ name: "deviceId",
42313
+ form: "single",
42314
+ optional: false
42315
+ }],
42316
+ "deviceManager.getStreamProfileMap": [{
42317
+ name: "deviceId",
42318
+ form: "single",
42319
+ optional: false
42320
+ }],
42321
+ "deviceManager.getStreamSources": [{
42322
+ name: "deviceId",
42323
+ form: "single",
42324
+ optional: false
42325
+ }],
42326
+ "deviceManager.getWireableFields": [{
42327
+ name: "deviceId",
42328
+ form: "single",
42329
+ optional: false
42330
+ }],
42331
+ "deviceManager.loadConfig": [{
42332
+ name: "deviceId",
42333
+ form: "single",
42334
+ optional: false
42335
+ }],
42336
+ "deviceManager.loadMeta": [{
42337
+ name: "deviceId",
42338
+ form: "single",
42339
+ optional: false
42340
+ }],
42341
+ "deviceManager.loadRuntimeState": [{
42342
+ name: "deviceId",
42343
+ form: "single",
42344
+ optional: false
42345
+ }],
42346
+ "deviceManager.persistConfig": [{
42347
+ name: "deviceId",
42348
+ form: "single",
42349
+ optional: false
42350
+ }],
42351
+ "deviceManager.probeStreams": [{
42352
+ name: "deviceId",
42353
+ form: "single",
42354
+ optional: false
42355
+ }],
42356
+ "deviceManager.registerDevice": [{
42357
+ name: "parentDeviceId",
42358
+ form: "single",
42359
+ optional: true
42360
+ }],
42361
+ "deviceManager.remove": [{
42362
+ name: "deviceId",
42363
+ form: "single",
42364
+ optional: false
42365
+ }],
42366
+ "deviceManager.removeDevice": [{
42367
+ name: "deviceId",
42368
+ form: "single",
42369
+ optional: false
42370
+ }],
42371
+ "deviceManager.runDeviceAction": [{
42372
+ name: "deviceId",
42373
+ form: "single",
42374
+ optional: false
42375
+ }],
42376
+ "deviceManager.setChildLayout": [{
42377
+ name: "deviceId",
42378
+ form: "single",
42379
+ optional: false
42380
+ }],
42381
+ "deviceManager.setDisabled": [{
42382
+ name: "deviceId",
42383
+ form: "single",
42384
+ optional: false
42385
+ }],
42386
+ "deviceManager.setDisplay": [{
42387
+ name: "deviceId",
42388
+ form: "single",
42389
+ optional: false
42390
+ }],
42391
+ "deviceManager.setIntegrationId": [{
42392
+ name: "deviceId",
42393
+ form: "single",
42394
+ optional: false
42395
+ }],
42396
+ "deviceManager.setLinkDeviceId": [{
42397
+ name: "deviceId",
42398
+ form: "single",
42399
+ optional: false
42400
+ }, {
42401
+ name: "linkDeviceId",
42402
+ form: "single",
42403
+ optional: true
42404
+ }],
42405
+ "deviceManager.setLocation": [{
42406
+ name: "deviceId",
42407
+ form: "single",
42408
+ optional: false
42409
+ }],
42410
+ "deviceManager.setMetadata": [{
42411
+ name: "deviceId",
42412
+ form: "single",
42413
+ optional: false
42414
+ }],
42415
+ "deviceManager.setName": [{
42416
+ name: "deviceId",
42417
+ form: "single",
42418
+ optional: false
42419
+ }],
42420
+ "deviceManager.setPrimaryChildEntityId": [{
42421
+ name: "deviceId",
42422
+ form: "single",
42423
+ optional: false
42424
+ }],
42425
+ "deviceManager.setRole": [{
42426
+ name: "deviceId",
42427
+ form: "single",
42428
+ optional: false
42429
+ }],
42430
+ "deviceManager.setStreamProfileMap": [{
42431
+ name: "deviceId",
42432
+ form: "single",
42433
+ optional: false
42434
+ }],
42435
+ "deviceManager.setType": [{
42436
+ name: "deviceId",
42437
+ form: "single",
42438
+ optional: false
42439
+ }],
42440
+ "deviceManager.setWrapperActive": [{
42441
+ name: "deviceId",
42442
+ form: "single",
42443
+ optional: false
42444
+ }],
42445
+ "deviceManager.testField": [{
42446
+ name: "deviceId",
42447
+ form: "single",
42448
+ optional: false
42449
+ }],
42450
+ "deviceManager.updateConfig": [{
42451
+ name: "deviceId",
42452
+ form: "single",
42453
+ optional: false
42454
+ }],
42455
+ "deviceManager.updateDeviceField": [{
42456
+ name: "deviceId",
42457
+ form: "single",
42458
+ optional: false
42459
+ }],
42460
+ "deviceManager.updateDeviceFieldsBatch": [{
42461
+ name: "deviceId",
42462
+ form: "single",
42463
+ optional: false
42464
+ }],
42465
+ "deviceOps.getConfigEntries": [{
42466
+ name: "deviceId",
42467
+ form: "single",
42468
+ optional: false
42469
+ }],
42470
+ "deviceOps.getRawState": [{
42471
+ name: "deviceId",
42472
+ form: "single",
42473
+ optional: false
42474
+ }],
42475
+ "deviceOps.getSettingsSchema": [{
42476
+ name: "deviceId",
42477
+ form: "single",
42478
+ optional: false
42479
+ }],
42480
+ "deviceOps.getStreamSources": [{
42481
+ name: "deviceId",
42482
+ form: "single",
42483
+ optional: false
42484
+ }],
42485
+ "deviceOps.removeDevice": [{
42486
+ name: "deviceId",
42487
+ form: "single",
42488
+ optional: false
42489
+ }],
42490
+ "deviceOps.runAction": [{
42491
+ name: "deviceId",
42492
+ form: "single",
42493
+ optional: false
42494
+ }],
42495
+ "deviceOps.setConfig": [{
42496
+ name: "deviceId",
42497
+ form: "single",
42498
+ optional: false
42499
+ }],
42500
+ "deviceState.getCapSlice": [{
42501
+ name: "deviceId",
42502
+ form: "single",
42503
+ optional: false
42504
+ }],
42505
+ "deviceState.getSnapshot": [{
42506
+ name: "deviceId",
42507
+ form: "single",
42508
+ optional: false
42509
+ }],
42510
+ "deviceState.setCapSlice": [{
42511
+ name: "deviceId",
42512
+ form: "single",
42513
+ optional: false
42514
+ }],
42515
+ "events.getEventClipUrl": [{
42516
+ name: "deviceId",
42517
+ form: "single",
42518
+ optional: false
42519
+ }],
42520
+ "events.getEvents": [{
42521
+ name: "deviceId",
42522
+ form: "single",
42523
+ optional: false
42524
+ }],
42525
+ "events.getEventThumbnail": [{
42526
+ name: "deviceId",
42527
+ form: "single",
42528
+ optional: false
42529
+ }],
42530
+ "faceGallery.getFaceByTrack": [{
42531
+ name: "deviceId",
42532
+ form: "single",
42533
+ optional: false
42534
+ }],
42535
+ "faceGallery.listRecentFaces": [{
42536
+ name: "deviceId",
42537
+ form: "single",
42538
+ optional: true
42539
+ }],
42540
+ "fanControl.setDirection": [{
42541
+ name: "deviceId",
42542
+ form: "single",
42543
+ optional: false
42544
+ }],
42545
+ "fanControl.setOscillating": [{
42546
+ name: "deviceId",
42547
+ form: "single",
42548
+ optional: false
42549
+ }],
42550
+ "fanControl.setPercentage": [{
42551
+ name: "deviceId",
42552
+ form: "single",
42553
+ optional: false
42554
+ }],
42555
+ "fanControl.setPreset": [{
42556
+ name: "deviceId",
42557
+ form: "single",
42558
+ optional: false
42559
+ }],
42560
+ "humidifier.setMode": [{
42561
+ name: "deviceId",
42562
+ form: "single",
42563
+ optional: false
42564
+ }],
42565
+ "humidifier.setOn": [{
42566
+ name: "deviceId",
42567
+ form: "single",
42568
+ optional: false
42569
+ }],
42570
+ "humidifier.setTargetHumidity": [{
42571
+ name: "deviceId",
42572
+ form: "single",
42573
+ optional: false
42574
+ }],
42575
+ "imageSettings.getOptions": [{
42576
+ name: "deviceId",
42577
+ form: "single",
42578
+ optional: false
42579
+ }],
42580
+ "imageSettings.setSettings": [{
42581
+ name: "deviceId",
42582
+ form: "single",
42583
+ optional: false
42584
+ }],
42585
+ "intercom.endTalkSession": [{
42586
+ name: "deviceId",
42587
+ form: "single",
42588
+ optional: false
42589
+ }],
42590
+ "intercom.handleAnswer": [{
42591
+ name: "deviceId",
42592
+ form: "single",
42593
+ optional: false
42594
+ }],
42595
+ "intercom.pushTalkAudio": [{
42596
+ name: "deviceId",
42597
+ form: "single",
42598
+ optional: false
42599
+ }],
42600
+ "intercom.startSession": [{
42601
+ name: "deviceId",
42602
+ form: "single",
42603
+ optional: false
42604
+ }],
42605
+ "intercom.startTalkSession": [{
42606
+ name: "deviceId",
42607
+ form: "single",
42608
+ optional: false
42609
+ }],
42610
+ "intercom.stopSession": [{
42611
+ name: "deviceId",
42612
+ form: "single",
42613
+ optional: false
42614
+ }],
42615
+ "lawnMowerControl.dock": [{
42616
+ name: "deviceId",
42617
+ form: "single",
42618
+ optional: false
42619
+ }],
42620
+ "lawnMowerControl.pause": [{
42621
+ name: "deviceId",
42622
+ form: "single",
42623
+ optional: false
42624
+ }],
42625
+ "lawnMowerControl.startMowing": [{
42626
+ name: "deviceId",
42627
+ form: "single",
42628
+ optional: false
42629
+ }],
42630
+ "lockControl.lock": [{
42631
+ name: "deviceId",
42632
+ form: "single",
42633
+ optional: false
42634
+ }],
42635
+ "lockControl.open": [{
42636
+ name: "deviceId",
42637
+ form: "single",
42638
+ optional: false
42639
+ }],
42640
+ "lockControl.unlock": [{
42641
+ name: "deviceId",
42642
+ form: "single",
42643
+ optional: false
42644
+ }],
42645
+ "mediaPlayer.next": [{
42646
+ name: "deviceId",
42647
+ form: "single",
42648
+ optional: false
42649
+ }],
42650
+ "mediaPlayer.pause": [{
42651
+ name: "deviceId",
42652
+ form: "single",
42653
+ optional: false
42654
+ }],
42655
+ "mediaPlayer.play": [{
42656
+ name: "deviceId",
42657
+ form: "single",
42658
+ optional: false
42659
+ }],
42660
+ "mediaPlayer.playMedia": [{
42661
+ name: "deviceId",
42662
+ form: "single",
42663
+ optional: false
42664
+ }],
42665
+ "mediaPlayer.previous": [{
42666
+ name: "deviceId",
42667
+ form: "single",
42668
+ optional: false
42669
+ }],
42670
+ "mediaPlayer.seek": [{
42671
+ name: "deviceId",
42672
+ form: "single",
42673
+ optional: false
42674
+ }],
42675
+ "mediaPlayer.selectSource": [{
42676
+ name: "deviceId",
42677
+ form: "single",
42678
+ optional: false
42679
+ }],
42680
+ "mediaPlayer.setMute": [{
42681
+ name: "deviceId",
42682
+ form: "single",
42683
+ optional: false
42684
+ }],
42685
+ "mediaPlayer.setRepeat": [{
42686
+ name: "deviceId",
42687
+ form: "single",
42688
+ optional: false
42689
+ }],
42690
+ "mediaPlayer.setShuffle": [{
42691
+ name: "deviceId",
42692
+ form: "single",
42693
+ optional: false
42694
+ }],
42695
+ "mediaPlayer.setVolume": [{
42696
+ name: "deviceId",
42697
+ form: "single",
42698
+ optional: false
42699
+ }],
42700
+ "mediaPlayer.stop": [{
42701
+ name: "deviceId",
42702
+ form: "single",
42703
+ optional: false
42704
+ }],
42705
+ "motion.isDetected": [{
42706
+ name: "deviceId",
42707
+ form: "single",
42708
+ optional: false
42709
+ }],
42710
+ "motionDetection.analyze": [{
42711
+ name: "deviceId",
42712
+ form: "single",
42713
+ optional: false
42714
+ }],
42715
+ "motionDetection.removeCamera": [{
42716
+ name: "deviceId",
42717
+ form: "single",
42718
+ optional: false
42719
+ }],
42720
+ "motionTrigger.setMotionTrigger": [{
42721
+ name: "deviceId",
42722
+ form: "single",
42723
+ optional: false
42724
+ }],
42725
+ "motionZones.getOptions": [{
42726
+ name: "deviceId",
42727
+ form: "single",
42728
+ optional: false
42729
+ }],
42730
+ "motionZones.setZone": [{
42731
+ name: "deviceId",
42732
+ form: "single",
42733
+ optional: false
42734
+ }],
42735
+ "nativeObjectDetection.setEnabled": [{
42736
+ name: "deviceId",
42737
+ form: "single",
42738
+ optional: false
42739
+ }],
42740
+ "networkQuality.getDeviceStats": [{
42741
+ name: "deviceId",
42742
+ form: "single",
42743
+ optional: false
42744
+ }],
42745
+ "networkQuality.reportClientStats": [{
42746
+ name: "deviceId",
42747
+ form: "single",
42748
+ optional: false
42749
+ }],
42750
+ "notificationRules.setDeviceMuted": [{
42751
+ name: "deviceId",
42752
+ form: "single",
42753
+ optional: false
42754
+ }],
42755
+ "notifier.cancel": [{
42756
+ name: "deviceId",
42757
+ form: "single",
42758
+ optional: false
42759
+ }],
42760
+ "notifier.send": [{
42761
+ name: "deviceId",
42762
+ form: "single",
42763
+ optional: false
42764
+ }],
42765
+ "osd.setOverlay": [{
42766
+ name: "deviceId",
42767
+ form: "single",
42768
+ optional: false
42769
+ }],
42770
+ "osdManager.clearSlotBinding": [{
42771
+ name: "deviceId",
42772
+ form: "single",
42773
+ optional: false
42774
+ }],
42775
+ "osdManager.copyDeviceConfiguration": [{
42776
+ name: "sourceDeviceId",
42777
+ form: "single",
42778
+ optional: false
42779
+ }, {
42780
+ name: "targetDeviceId",
42781
+ form: "single",
42782
+ optional: false
42783
+ }],
42784
+ "osdManager.getDeviceOsd": [{
42785
+ name: "deviceId",
42786
+ form: "single",
42787
+ optional: false
42788
+ }],
42789
+ "osdManager.getSourceCatalog": [{
42790
+ name: "deviceId",
42791
+ form: "single",
42792
+ optional: false
42793
+ }],
42794
+ "osdManager.previewSlot": [{
42795
+ name: "deviceId",
42796
+ form: "single",
42797
+ optional: false
42798
+ }],
42799
+ "osdManager.renderDevice": [{
42800
+ name: "deviceId",
42801
+ form: "single",
42802
+ optional: false
42803
+ }],
42804
+ "osdManager.setSlotBinding": [{
42805
+ name: "deviceId",
42806
+ form: "single",
42807
+ optional: false
42808
+ }],
42809
+ "petFeeder.callPet": [{
42810
+ name: "deviceId",
42811
+ form: "single",
42812
+ optional: false
42813
+ }],
42814
+ "petFeeder.cancelFeed": [{
42815
+ name: "deviceId",
42816
+ form: "single",
42817
+ optional: false
42818
+ }],
42819
+ "petFeeder.feed": [{
42820
+ name: "deviceId",
42821
+ form: "single",
42822
+ optional: false
42823
+ }],
42824
+ "petFeeder.markFoodReplenished": [{
42825
+ name: "deviceId",
42826
+ form: "single",
42827
+ optional: false
42828
+ }],
42829
+ "petFeeder.playSound": [{
42830
+ name: "deviceId",
42831
+ form: "single",
42832
+ optional: false
42833
+ }],
42834
+ "petFeeder.resetDesiccant": [{
42835
+ name: "deviceId",
42836
+ form: "single",
42837
+ optional: false
42838
+ }],
42839
+ "petFeeder.setChildLock": [{
42840
+ name: "deviceId",
42841
+ form: "single",
42842
+ optional: false
42843
+ }],
42844
+ "petFeeder.setFeedSound": [{
42845
+ name: "deviceId",
42846
+ form: "single",
42847
+ optional: false
42848
+ }],
42849
+ "petFeeder.setIndicatorLight": [{
42850
+ name: "deviceId",
42851
+ form: "single",
42852
+ optional: false
42853
+ }],
42854
+ "petFeeder.setVolume": [{
42855
+ name: "deviceId",
42856
+ form: "single",
42857
+ optional: false
42858
+ }],
42859
+ "pipelineAnalytics.clearTracks": [{
42860
+ name: "deviceId",
42861
+ form: "single",
42862
+ optional: false
42863
+ }],
42864
+ "pipelineAnalytics.completeRetrainTrack": [{
42865
+ name: "deviceId",
42866
+ form: "single",
42867
+ optional: false
42868
+ }],
42869
+ "pipelineAnalytics.deleteDeviceEvents": [{
42870
+ name: "deviceId",
42871
+ form: "single",
42872
+ optional: false
42873
+ }],
42874
+ "pipelineAnalytics.deleteTracks": [{
42875
+ name: "deviceId",
42876
+ form: "single",
42877
+ optional: false
42878
+ }],
42879
+ "pipelineAnalytics.deselectRetrainFrame": [{
42880
+ name: "deviceId",
42881
+ form: "single",
42882
+ optional: false
42883
+ }],
42884
+ "pipelineAnalytics.getActiveTracks": [{
42885
+ name: "deviceId",
42886
+ form: "single",
42887
+ optional: false
42888
+ }],
42889
+ "pipelineAnalytics.getAudioEvents": [{
42890
+ name: "deviceId",
42891
+ form: "single",
42892
+ optional: false
42893
+ }],
42894
+ "pipelineAnalytics.getEventDensity": [{
42895
+ name: "deviceId",
42896
+ form: "single",
42897
+ optional: false
42898
+ }],
42899
+ "pipelineAnalytics.getEventMedia": [{
42900
+ name: "deviceId",
42901
+ form: "single",
42902
+ optional: false
42903
+ }],
42904
+ "pipelineAnalytics.getKeyEvents": [{
42905
+ name: "deviceId",
42906
+ form: "single",
42907
+ optional: false
42908
+ }],
42909
+ "pipelineAnalytics.getMotionEvents": [{
42910
+ name: "deviceId",
42911
+ form: "single",
42912
+ optional: false
42913
+ }],
42914
+ "pipelineAnalytics.getObjectEvents": [{
42915
+ name: "deviceId",
42916
+ form: "single",
42917
+ optional: false
42918
+ }],
42919
+ "pipelineAnalytics.getRetrainExportUrl": [{
42920
+ name: "deviceIds",
42921
+ form: "array",
42922
+ optional: true
42923
+ }],
42924
+ "pipelineAnalytics.getSensorEvents": [{
42925
+ name: "deviceId",
42926
+ form: "single",
42927
+ optional: false
42928
+ }],
42929
+ "pipelineAnalytics.getTrack": [{
42930
+ name: "deviceId",
42931
+ form: "single",
42932
+ optional: false
42933
+ }],
42934
+ "pipelineAnalytics.getTrackMedia": [{
42935
+ name: "deviceId",
42936
+ form: "single",
42937
+ optional: false
42938
+ }],
42939
+ "pipelineAnalytics.getTrainingExportSummary": [{
42940
+ name: "deviceIds",
42941
+ form: "array",
42942
+ optional: true
42943
+ }],
42944
+ "pipelineAnalytics.getTrainingExportUrl": [{
42945
+ name: "deviceIds",
42946
+ form: "array",
42947
+ optional: true
42948
+ }],
42949
+ "pipelineAnalytics.listEventKinds": [{
42950
+ name: "deviceId",
42951
+ form: "single",
42952
+ optional: false
42953
+ }],
42954
+ "pipelineAnalytics.listEventKindsBatch": [{
42955
+ name: "deviceIds",
42956
+ form: "array",
42957
+ optional: false
42958
+ }],
42959
+ "pipelineAnalytics.listOpsLog": [{
42960
+ name: "deviceId",
42961
+ form: "single",
42962
+ optional: true
42963
+ }],
42964
+ "pipelineAnalytics.listRecentTracks": [{
42965
+ name: "deviceIds",
42966
+ form: "array",
42967
+ optional: false
42968
+ }],
42969
+ "pipelineAnalytics.listRetrainStaging": [{
42970
+ name: "deviceIds",
42971
+ form: "array",
42972
+ optional: true
42973
+ }],
42974
+ "pipelineAnalytics.listTrackMedia": [{
42975
+ name: "deviceId",
42976
+ form: "single",
42977
+ optional: false
42978
+ }],
42979
+ "pipelineAnalytics.listTracks": [{
42980
+ name: "deviceId",
42981
+ form: "single",
42982
+ optional: false
42983
+ }],
42984
+ "pipelineAnalytics.proposeRetrainAnnotations": [{
42985
+ name: "deviceId",
42986
+ form: "single",
42987
+ optional: false
42988
+ }],
42989
+ "pipelineAnalytics.pruneEventsBefore": [{
42990
+ name: "deviceId",
42991
+ form: "single",
42992
+ optional: false
42993
+ }],
42994
+ "pipelineAnalytics.pruneTracksBefore": [{
42995
+ name: "deviceId",
42996
+ form: "single",
42997
+ optional: false
42998
+ }],
42999
+ "pipelineAnalytics.rebuildObjectEmbeddings": [{
43000
+ name: "deviceId",
43001
+ form: "single",
43002
+ optional: true
43003
+ }],
43004
+ "pipelineAnalytics.restageRetrainTrack": [{
43005
+ name: "deviceId",
43006
+ form: "single",
43007
+ optional: false
43008
+ }],
43009
+ "pipelineAnalytics.saveRetrainAnnotations": [{
43010
+ name: "deviceId",
43011
+ form: "single",
43012
+ optional: false
43013
+ }],
43014
+ "pipelineAnalytics.searchObjectEvents": [{
43015
+ name: "deviceId",
43016
+ form: "single",
43017
+ optional: true
43018
+ }],
43019
+ "pipelineAnalytics.selectRetrainFrames": [{
43020
+ name: "deviceId",
43021
+ form: "single",
43022
+ optional: false
43023
+ }],
43024
+ "pipelineAnalytics.setTrackFlags": [{
43025
+ name: "deviceId",
43026
+ form: "single",
43027
+ optional: false
43028
+ }],
43029
+ "pipelineAnalytics.wipeAllAnalytics": [{
43030
+ name: "deviceId",
43031
+ form: "single",
43032
+ optional: false
43033
+ }],
43034
+ "pipelineExecutor.runPipeline": [{
43035
+ name: "deviceId",
43036
+ form: "single",
43037
+ optional: true
43038
+ }],
43039
+ "pipelineExecutor.runPipelineBatch": [{
43040
+ name: "deviceId",
43041
+ form: "single",
43042
+ optional: true
43043
+ }],
43044
+ "pipelineOrchestrator.assignAudio": [{
43045
+ name: "deviceId",
43046
+ form: "single",
43047
+ optional: false
43048
+ }],
43049
+ "pipelineOrchestrator.assignPipeline": [{
43050
+ name: "deviceId",
43051
+ form: "single",
43052
+ optional: false
43053
+ }],
43054
+ "pipelineOrchestrator.getAudioAssignment": [{
43055
+ name: "deviceId",
43056
+ form: "single",
43057
+ optional: false
43058
+ }],
43059
+ "pipelineOrchestrator.getCameraMetrics": [{
43060
+ name: "deviceId",
43061
+ form: "single",
43062
+ optional: false
43063
+ }],
43064
+ "pipelineOrchestrator.getCameraSettings": [{
43065
+ name: "deviceId",
43066
+ form: "single",
43067
+ optional: false
43068
+ }],
43069
+ "pipelineOrchestrator.getCameraStatus": [{
43070
+ name: "deviceId",
43071
+ form: "single",
43072
+ optional: false
43073
+ }],
43074
+ "pipelineOrchestrator.getCameraStatuses": [{
43075
+ name: "deviceIds",
43076
+ form: "array",
43077
+ optional: true
43078
+ }],
43079
+ "pipelineOrchestrator.getCameraStepOverrides": [{
43080
+ name: "deviceId",
43081
+ form: "single",
43082
+ optional: false
43083
+ }],
43084
+ "pipelineOrchestrator.getCameraSwitches": [{
43085
+ name: "deviceId",
43086
+ form: "single",
43087
+ optional: false
43088
+ }],
43089
+ "pipelineOrchestrator.getPipelineAssignment": [{
43090
+ name: "deviceId",
43091
+ form: "single",
43092
+ optional: false
43093
+ }],
43094
+ "pipelineOrchestrator.getPipelineDevicePin": [{
43095
+ name: "deviceId",
43096
+ form: "single",
43097
+ optional: false
43098
+ }],
43099
+ "pipelineOrchestrator.resolvePipeline": [{
43100
+ name: "deviceId",
43101
+ form: "single",
43102
+ optional: false
43103
+ }],
43104
+ "pipelineOrchestrator.setCameraPipelineForAgent": [{
43105
+ name: "deviceId",
43106
+ form: "single",
43107
+ optional: false
43108
+ }],
43109
+ "pipelineOrchestrator.setCameraStepOverride": [{
43110
+ name: "deviceId",
43111
+ form: "single",
43112
+ optional: false
43113
+ }],
43114
+ "pipelineOrchestrator.setCameraStepToggle": [{
43115
+ name: "deviceId",
43116
+ form: "single",
43117
+ optional: false
43118
+ }],
43119
+ "pipelineOrchestrator.setCameraSwitch": [{
43120
+ name: "deviceId",
43121
+ form: "single",
43122
+ optional: false
43123
+ }],
43124
+ "pipelineOrchestrator.setPipelineDevicePin": [{
43125
+ name: "deviceId",
43126
+ form: "single",
43127
+ optional: false
43128
+ }],
43129
+ "pipelineOrchestrator.unassignAudio": [{
43130
+ name: "deviceId",
43131
+ form: "single",
43132
+ optional: false
43133
+ }],
43134
+ "pipelineOrchestrator.unassignPipeline": [{
43135
+ name: "deviceId",
43136
+ form: "single",
43137
+ optional: false
43138
+ }],
43139
+ "pipelineRunner.attachCamera": [{
43140
+ name: "deviceId",
43141
+ form: "single",
43142
+ optional: false
43143
+ }],
43144
+ "pipelineRunner.detachCamera": [{
43145
+ name: "deviceId",
43146
+ form: "single",
43147
+ optional: false
43148
+ }],
43149
+ "pipelineRunner.getCameraMetrics": [{
43150
+ name: "deviceId",
43151
+ form: "single",
43152
+ optional: false
43153
+ }],
43154
+ "pipelineRunner.reportMotion": [{
43155
+ name: "deviceId",
43156
+ form: "single",
43157
+ optional: false
43158
+ }],
43159
+ "pipelineRunner.runDetailSubtree": [{
43160
+ name: "deviceId",
43161
+ form: "single",
43162
+ optional: false
43163
+ }],
43164
+ "pipelineRunner.runStatelessStep": [{
43165
+ name: "sourceDeviceId",
43166
+ form: "single",
43167
+ optional: false
43168
+ }],
43169
+ "plateGallery.getPlateByTrack": [{
43170
+ name: "deviceId",
43171
+ form: "single",
43172
+ optional: false
43173
+ }],
43174
+ "plateGallery.listPlates": [{
43175
+ name: "deviceId",
43176
+ form: "single",
43177
+ optional: true
43178
+ }],
43179
+ "privacyMask.getOptions": [{
43180
+ name: "deviceId",
43181
+ form: "single",
43182
+ optional: false
43183
+ }],
43184
+ "privacyMask.setAudioEnabled": [{
43185
+ name: "deviceId",
43186
+ form: "single",
43187
+ optional: false
43188
+ }],
43189
+ "privacyMask.setMask": [{
43190
+ name: "deviceId",
43191
+ form: "single",
43192
+ optional: false
43193
+ }],
43194
+ "ptz.continuousMove": [{
43195
+ name: "deviceId",
43196
+ form: "single",
43197
+ optional: false
43198
+ }],
43199
+ "ptz.deletePreset": [{
43200
+ name: "deviceId",
43201
+ form: "single",
43202
+ optional: false
43203
+ }],
43204
+ "ptz.getOptions": [{
43205
+ name: "deviceId",
43206
+ form: "single",
43207
+ optional: false
43208
+ }],
43209
+ "ptz.getPosition": [{
43210
+ name: "deviceId",
43211
+ form: "single",
43212
+ optional: false
43213
+ }],
43214
+ "ptz.getPresets": [{
43215
+ name: "deviceId",
43216
+ form: "single",
43217
+ optional: false
43218
+ }],
43219
+ "ptz.goHome": [{
43220
+ name: "deviceId",
43221
+ form: "single",
43222
+ optional: false
43223
+ }],
43224
+ "ptz.goToPreset": [{
43225
+ name: "deviceId",
43226
+ form: "single",
43227
+ optional: false
43228
+ }],
43229
+ "ptz.move": [{
43230
+ name: "deviceId",
43231
+ form: "single",
43232
+ optional: false
43233
+ }],
43234
+ "ptz.savePreset": [{
43235
+ name: "deviceId",
43236
+ form: "single",
43237
+ optional: false
43238
+ }],
43239
+ "ptz.setAutofocus": [{
43240
+ name: "deviceId",
43241
+ form: "single",
43242
+ optional: false
43243
+ }],
43244
+ "ptz.stop": [{
43245
+ name: "deviceId",
43246
+ form: "single",
43247
+ optional: false
43248
+ }],
43249
+ "ptzAutotrack.getSettings": [{
43250
+ name: "deviceId",
43251
+ form: "single",
43252
+ optional: false
43253
+ }],
43254
+ "ptzAutotrack.getStatus": [{
43255
+ name: "deviceId",
43256
+ form: "single",
43257
+ optional: false
43258
+ }],
43259
+ "ptzAutotrack.setEnabled": [{
43260
+ name: "deviceId",
43261
+ form: "single",
43262
+ optional: false
43263
+ }],
43264
+ "ptzAutotrack.setSettings": [{
43265
+ name: "deviceId",
43266
+ form: "single",
43267
+ optional: false
43268
+ }],
43269
+ "reboot.reboot": [{
43270
+ name: "deviceId",
43271
+ form: "single",
43272
+ optional: false
43273
+ }],
43274
+ "recording.deleteFootprint": [{
43275
+ name: "deviceId",
43276
+ form: "single",
43277
+ optional: false
43278
+ }],
43279
+ "recording.getAvailability": [{
43280
+ name: "deviceId",
43281
+ form: "single",
43282
+ optional: false
43283
+ }],
43284
+ "recording.getDaysWithRecordings": [{
43285
+ name: "deviceId",
43286
+ form: "single",
43287
+ optional: false
43288
+ }],
43289
+ "recording.getDeviceConfig": [{
43290
+ name: "deviceId",
43291
+ form: "single",
43292
+ optional: false
43293
+ }],
43294
+ "recording.getPlaybackManifest": [{
43295
+ name: "deviceId",
43296
+ form: "single",
43297
+ optional: false
43298
+ }],
43299
+ "recording.listOpsLog": [{
43300
+ name: "deviceId",
43301
+ form: "single",
43302
+ optional: true
43303
+ }],
43304
+ "recording.locateSegment": [{
43305
+ name: "deviceId",
43306
+ form: "single",
43307
+ optional: false
43308
+ }],
43309
+ "recording.pruneFootage": [{
43310
+ name: "deviceId",
43311
+ form: "single",
43312
+ optional: false
43313
+ }],
43314
+ "recording.readGopBytes": [{
43315
+ name: "deviceId",
43316
+ form: "single",
43317
+ optional: false
43318
+ }],
43319
+ "recording.readSegmentBytes": [{
43320
+ name: "deviceId",
43321
+ form: "single",
43322
+ optional: false
43323
+ }],
43324
+ "recording.relocateFootage": [{
43325
+ name: "deviceId",
43326
+ form: "single",
43327
+ optional: true
43328
+ }],
43329
+ "recording.renderClip": [{
43330
+ name: "deviceId",
43331
+ form: "single",
43332
+ optional: false
43333
+ }],
43334
+ "recording.renderGif": [{
43335
+ name: "deviceId",
43336
+ form: "single",
43337
+ optional: false
43338
+ }],
43339
+ "recording.rescanStorage": [{
43340
+ name: "deviceId",
43341
+ form: "single",
43342
+ optional: false
43343
+ }],
43344
+ "recording.setDeviceConfig": [{
43345
+ name: "deviceId",
43346
+ form: "single",
43347
+ optional: false
43348
+ }],
43349
+ "recording.startStorageMigrationMove": [{
43350
+ name: "deviceId",
43351
+ form: "single",
43352
+ optional: true
43353
+ }],
43354
+ "recordingExport.createExport": [{
43355
+ name: "deviceId",
43356
+ form: "single",
43357
+ optional: false
43358
+ }],
43359
+ "recordingExport.listExports": [{
43360
+ name: "deviceId",
43361
+ form: "single",
43362
+ optional: true
43363
+ }],
43364
+ "sceneMonitor.captureReference": [{
43365
+ name: "deviceId",
43366
+ form: "single",
43367
+ optional: false
43368
+ }],
43369
+ "sceneMonitor.createScene": [{
43370
+ name: "deviceId",
43371
+ form: "single",
43372
+ optional: false
43373
+ }],
43374
+ "sceneMonitor.deleteReference": [{
43375
+ name: "deviceId",
43376
+ form: "single",
43377
+ optional: false
43378
+ }],
43379
+ "sceneMonitor.deleteScene": [{
43380
+ name: "deviceId",
43381
+ form: "single",
43382
+ optional: false
43383
+ }],
43384
+ "sceneMonitor.listScenes": [{
43385
+ name: "deviceId",
43386
+ form: "single",
43387
+ optional: false
43388
+ }],
43389
+ "sceneMonitor.recheckNow": [{
43390
+ name: "deviceId",
43391
+ form: "single",
43392
+ optional: false
43393
+ }],
43394
+ "sceneMonitor.resetScene": [{
43395
+ name: "deviceId",
43396
+ form: "single",
43397
+ optional: false
43398
+ }],
43399
+ "sceneMonitor.updateScene": [{
43400
+ name: "deviceId",
43401
+ form: "single",
43402
+ optional: false
43403
+ }],
43404
+ "scriptRunner.run": [{
43405
+ name: "deviceId",
43406
+ form: "single",
43407
+ optional: false
43408
+ }],
43409
+ "scriptRunner.stop": [{
43410
+ name: "deviceId",
43411
+ form: "single",
43412
+ optional: false
43413
+ }],
43414
+ "snapshot.getSnapshot": [{
43415
+ name: "deviceId",
43416
+ form: "single",
43417
+ optional: false
43418
+ }],
43419
+ "snapshot.getSnapshotLinks": [{
43420
+ name: "targets",
43421
+ form: "object-array",
43422
+ optional: false,
43423
+ itemField: "deviceId"
43424
+ }],
43425
+ "snapshot.getSnapshotOverview": [{
43426
+ name: "deviceIds",
43427
+ form: "array",
43428
+ optional: false
43429
+ }],
43430
+ "snapshot.invalidateCache": [{
43431
+ name: "deviceId",
43432
+ form: "single",
43433
+ optional: false
43434
+ }],
43435
+ "streamBroker.acquireEgressTranscode": [{
43436
+ name: "deviceId",
43437
+ form: "single",
43438
+ optional: false
43439
+ }],
43440
+ "streamBroker.assignProfile": [{
43441
+ name: "deviceId",
43442
+ form: "single",
43443
+ optional: false
43444
+ }],
43445
+ "streamBroker.getDeviceAudioMute": [{
43446
+ name: "deviceId",
43447
+ form: "single",
43448
+ optional: false
43449
+ }],
43450
+ "streamBroker.getStreamWithCodec": [{
43451
+ name: "deviceId",
43452
+ form: "single",
43453
+ optional: false
43454
+ }],
43455
+ "streamBroker.produceEventMedia": [{
43456
+ name: "deviceId",
43457
+ form: "single",
43458
+ optional: false
43459
+ }],
43460
+ "streamBroker.publishCameraStream": [{
43461
+ name: "deviceId",
43462
+ form: "single",
43463
+ optional: false
43464
+ }],
43465
+ "streamBroker.renderPreBufferClip": [{
43466
+ name: "deviceId",
43467
+ form: "single",
43468
+ optional: false
43469
+ }],
43470
+ "streamBroker.restartProfile": [{
43471
+ name: "deviceId",
43472
+ form: "single",
43473
+ optional: false
43474
+ }],
43475
+ "streamBroker.retractCameraStream": [{
43476
+ name: "deviceId",
43477
+ form: "single",
43478
+ optional: false
43479
+ }],
43480
+ "streamBroker.setDeviceAudioMute": [{
43481
+ name: "deviceId",
43482
+ form: "single",
43483
+ optional: false
43484
+ }],
43485
+ "streamBroker.unassignProfile": [{
43486
+ name: "deviceId",
43487
+ form: "single",
43488
+ optional: false
43489
+ }],
43490
+ "streamCatalog.getCatalog": [{
43491
+ name: "deviceId",
43492
+ form: "single",
43493
+ optional: false
43494
+ }],
43495
+ "streamParams.getConfigSchema": [{
43496
+ name: "deviceId",
43497
+ form: "single",
43498
+ optional: false
43499
+ }],
43500
+ "streamParams.getOptions": [{
43501
+ name: "deviceId",
43502
+ form: "single",
43503
+ optional: false
43504
+ }],
43505
+ "streamParams.setProfile": [{
43506
+ name: "deviceId",
43507
+ form: "single",
43508
+ optional: false
43509
+ }],
43510
+ "switch.setState": [{
43511
+ name: "deviceId",
43512
+ form: "single",
43513
+ optional: false
43514
+ }],
43515
+ "vacuumControl.locate": [{
43516
+ name: "deviceId",
43517
+ form: "single",
43518
+ optional: false
43519
+ }],
43520
+ "vacuumControl.pause": [{
43521
+ name: "deviceId",
43522
+ form: "single",
43523
+ optional: false
43524
+ }],
43525
+ "vacuumControl.returnToBase": [{
43526
+ name: "deviceId",
43527
+ form: "single",
43528
+ optional: false
43529
+ }],
43530
+ "vacuumControl.setFanSpeed": [{
43531
+ name: "deviceId",
43532
+ form: "single",
43533
+ optional: false
43534
+ }],
43535
+ "vacuumControl.start": [{
43536
+ name: "deviceId",
43537
+ form: "single",
43538
+ optional: false
43539
+ }],
43540
+ "vacuumControl.stop": [{
43541
+ name: "deviceId",
43542
+ form: "single",
43543
+ optional: false
43544
+ }],
43545
+ "valve.close": [{
43546
+ name: "deviceId",
43547
+ form: "single",
43548
+ optional: false
43549
+ }],
43550
+ "valve.open": [{
43551
+ name: "deviceId",
43552
+ form: "single",
43553
+ optional: false
43554
+ }],
43555
+ "valve.setPosition": [{
43556
+ name: "deviceId",
43557
+ form: "single",
43558
+ optional: false
43559
+ }],
43560
+ "valve.stop": [{
43561
+ name: "deviceId",
43562
+ form: "single",
43563
+ optional: false
43564
+ }],
43565
+ "videoclips.getClipPlayback": [{
43566
+ name: "deviceId",
43567
+ form: "single",
43568
+ optional: false
43569
+ }],
43570
+ "videoclips.listClips": [{
43571
+ name: "deviceId",
43572
+ form: "single",
43573
+ optional: false
43574
+ }],
43575
+ "waterHeater.setAway": [{
43576
+ name: "deviceId",
43577
+ form: "single",
43578
+ optional: false
43579
+ }],
43580
+ "waterHeater.setOperationMode": [{
43581
+ name: "deviceId",
43582
+ form: "single",
43583
+ optional: false
43584
+ }],
43585
+ "waterHeater.setTargetTemp": [{
43586
+ name: "deviceId",
43587
+ form: "single",
43588
+ optional: false
43589
+ }],
43590
+ "webrtcSession.addIceCandidate": [{
43591
+ name: "deviceId",
43592
+ form: "single",
43593
+ optional: false
43594
+ }],
43595
+ "webrtcSession.closeSession": [{
43596
+ name: "deviceId",
43597
+ form: "single",
43598
+ optional: false
43599
+ }],
43600
+ "webrtcSession.createSession": [{
43601
+ name: "deviceId",
43602
+ form: "single",
43603
+ optional: false
43604
+ }],
43605
+ "webrtcSession.getIceCandidates": [{
43606
+ name: "deviceId",
43607
+ form: "single",
43608
+ optional: false
43609
+ }],
43610
+ "webrtcSession.getSessionState": [{
43611
+ name: "deviceId",
43612
+ form: "single",
43613
+ optional: false
43614
+ }],
43615
+ "webrtcSession.handleAnswer": [{
43616
+ name: "deviceId",
43617
+ form: "single",
43618
+ optional: false
43619
+ }],
43620
+ "webrtcSession.handleOffer": [{
43621
+ name: "deviceId",
43622
+ form: "single",
43623
+ optional: false
43624
+ }],
43625
+ "webrtcSession.hasAdaptiveBitrate": [{
43626
+ name: "deviceId",
43627
+ form: "single",
43628
+ optional: false
43629
+ }],
43630
+ "webrtcSession.listStreams": [{
43631
+ name: "deviceId",
43632
+ form: "single",
43633
+ optional: false
43634
+ }],
43635
+ "zoneAnalytics.getCameraHistory": [{
43636
+ name: "deviceId",
43637
+ form: "single",
43638
+ optional: false
43639
+ }],
43640
+ "zoneAnalytics.getCurrentSnapshot": [{
43641
+ name: "deviceId",
43642
+ form: "single",
43643
+ optional: false
43644
+ }],
43645
+ "zoneAnalytics.getUnzonedHistory": [{
43646
+ name: "deviceId",
43647
+ form: "single",
43648
+ optional: false
43649
+ }],
43650
+ "zoneAnalytics.getZoneHistory": [{
43651
+ name: "deviceId",
43652
+ form: "single",
43653
+ optional: false
43654
+ }],
43655
+ "zoneRules.listRules": [{
43656
+ name: "deviceId",
43657
+ form: "single",
43658
+ optional: false
43659
+ }],
43660
+ "zoneRules.setRules": [{
43661
+ name: "deviceId",
43662
+ form: "single",
43663
+ optional: false
43664
+ }],
43665
+ "zones.addZone": [{
43666
+ name: "deviceId",
43667
+ form: "single",
43668
+ optional: false
43669
+ }],
43670
+ "zones.listZones": [{
43671
+ name: "deviceId",
43672
+ form: "single",
43673
+ optional: false
43674
+ }],
43675
+ "zones.removeZone": [{
43676
+ name: "deviceId",
43677
+ form: "single",
43678
+ optional: false
43679
+ }],
43680
+ "zones.updateZone": [{
43681
+ name: "deviceId",
43682
+ form: "single",
43683
+ optional: false
43684
+ }]
43685
+ });
41235
43686
  var CAP_PROVIDER_KIND_MAP = Object.freeze({
41236
43687
  "broker": "broker",
41237
43688
  "device-export": "device-export",