camstack 1.2.25 → 1.2.27

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-BxO5xNe6.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",
@@ -27255,6 +27729,39 @@ var snapshotCapability = {
27255
27729
  etag: external_exports.string().nullable()
27256
27730
  }))),
27257
27731
  /**
27732
+ * The full decision chain for ONE device, for the viewer's debug readout —
27733
+ * the answer to "why does this tile show what it shows" in a single poll:
27734
+ * the battery slice the state was derived from, the resolved state + its
27735
+ * reason, the cached frame's identity/age, whether a wake window is open,
27736
+ * and whether a fresh capture is in flight. Cache-only and capture-free:
27737
+ * a debug read must never wake a battery camera.
27738
+ */
27739
+ getDebugState: systemMethod(external_exports.object({ deviceId: external_exports.number() }), external_exports.object({
27740
+ /** The battery slice as read, or null when the device has none. */
27741
+ battery: external_exports.object({
27742
+ sleeping: external_exports.boolean(),
27743
+ lastUpdated: external_exports.number(),
27744
+ lastContactAt: external_exports.number().optional()
27745
+ }).nullable(),
27746
+ /** The resolved snapshot state (what the overlay decision used). */
27747
+ state: external_exports.object({
27748
+ isBattery: external_exports.boolean(),
27749
+ reason: external_exports.enum([
27750
+ "disabled",
27751
+ "sleeping",
27752
+ "unreachable",
27753
+ "waking"
27754
+ ]).nullable()
27755
+ }),
27756
+ /** The cached frame behind the next paint. */
27757
+ frame: external_exports.object({
27758
+ capturedAt: external_exports.number().nullable(),
27759
+ ageMs: external_exports.number().nullable()
27760
+ }),
27761
+ /** A wake window is currently open (the Waking overlay's source). */
27762
+ waking: external_exports.boolean()
27763
+ })),
27764
+ /**
27258
27765
  * Signed, expiring links to a CLIENT-SIZED frame — and the demand signal
27259
27766
  * that makes those frames current.
27260
27767
  *
@@ -27328,7 +27835,16 @@ var snapshotCapability = {
27328
27835
  /** A sleeping battery camera: the frame is deliberately stale and will
27329
27836
  * NOT refresh in the background. A surface should say so rather than
27330
27837
  * present it as current. */
27331
- sleeping: external_exports.boolean()
27838
+ sleeping: external_exports.boolean(),
27839
+ /** Current device state rendered over the cached frame. State images
27840
+ * remain authoritative even when their photographic background is
27841
+ * old; null means the link must carry a current camera frame. */
27842
+ stateReason: external_exports.enum([
27843
+ "disabled",
27844
+ "sleeping",
27845
+ "unreachable",
27846
+ "waking"
27847
+ ]).nullable()
27332
27848
  })))
27333
27849
  },
27334
27850
  status: {
@@ -29152,6 +29668,25 @@ var BatteryStatusSchema = external_exports.object({
29152
29668
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
29153
29669
  lastUpdated: external_exports.number(),
29154
29670
  /**
29671
+ * Ms epoch of the last time the device PROVED it was reachable — a
29672
+ * completed firmware round-trip, an observed wake, or an inbound push
29673
+ * (firmware event, email). `0`/absent = never since this slice was born.
29674
+ *
29675
+ * This is the ONLY input that separates "asleep" from "gone", and it is
29676
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
29677
+ * for the radio, because a poll that confirms reachability is the same
29678
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
29679
+ * single derivation every consumer must use; no surface computes its own.
29680
+ *
29681
+ * It is deliberately NOT a clock in the
29682
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
29683
+ * observation itself, and it is the only thing a 30-hour silence is
29684
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
29685
+ * Reolink provider) so a value that means "recently" cannot cost a
29686
+ * SQLite commit per round-trip.
29687
+ */
29688
+ lastContactAt: external_exports.number().optional(),
29689
+ /**
29155
29690
  * True when the source is a BINARY low-battery indicator (HA
29156
29691
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
29157
29692
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -31142,7 +31677,41 @@ var intercomCapability = {
31142
31677
  status: {
31143
31678
  schema: IntercomStatusSchema,
31144
31679
  kind: "command-driven"
31145
- }
31680
+ },
31681
+ /**
31682
+ * Runtime-state slice — mirrored by the kernel.
31683
+ *
31684
+ * The cap declared `status` and nothing else, so the only two sources an
31685
+ * exporter has for a value — the `device.state-changed` slice event and the
31686
+ * `deviceState.getAllSnapshots` snapshot, both built from runtime state —
31687
+ * carried nothing for `intercom`. A talk-back entity in Home Assistant would
31688
+ * have been published and never received a value, which is the defect the
31689
+ * export's two classification tables exist to prevent (177 of them, once), so
31690
+ * `intercom` was excluded rather than exported.
31691
+ *
31692
+ * The shape is the status shape: there is exactly one truth about talk-back
31693
+ * and duplicating it into a second schema is how two halves of one capability
31694
+ * come to disagree. Providers write it through
31695
+ * `this.runtimeState.setCapState('intercom', …)` at the four points that open
31696
+ * and close a session, and seed it at registration so the slice exists before
31697
+ * the first session rather than after it.
31698
+ *
31699
+ * **Bound, named rather than hidden:** `talking` mirrors the provider's own
31700
+ * session handle, so a session torn down by a transport death that never
31701
+ * reaches `stopSession` / `endTalkSession` leaves it latched until the next
31702
+ * session or the next restart. That is why the slice is `session` and not
31703
+ * `restored` — a restart must never restore "talking".
31704
+ */
31705
+ runtimeState: IntercomStatusSchema,
31706
+ /**
31707
+ * Runtime-state durability: **session** — `talking` describes a live audio
31708
+ * session, which by definition does not survive the process that held it.
31709
+ * Restoring it would publish a camera as talking to nobody.
31710
+ *
31711
+ * See `RuntimeStateDurability`. Enforced by
31712
+ * `scripts/check-runtime-state-durability.ts`.
31713
+ */
31714
+ durability: "session"
31146
31715
  };
31147
31716
  var LawnMowerActivitySchema = external_exports.enum([
31148
31717
  "idle",
@@ -33796,7 +34365,7 @@ var recordingCapability = {
33796
34365
  toMs: external_exports.number()
33797
34366
  }), RecordingAvailabilitySchema, {
33798
34367
  kind: "query",
33799
- auth: "admin"
34368
+ auth: "protected"
33800
34369
  }),
33801
34370
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
33802
34371
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
@@ -33808,7 +34377,7 @@ var recordingCapability = {
33808
34377
  tzOffsetMinutes: external_exports.number()
33809
34378
  }), RecordingDaysSchema, {
33810
34379
  kind: "query",
33811
- auth: "admin"
34380
+ auth: "protected"
33812
34381
  }),
33813
34382
  getPlaybackManifest: method(external_exports.object({
33814
34383
  deviceId: external_exports.number(),
@@ -33816,7 +34385,7 @@ var recordingCapability = {
33816
34385
  toMs: external_exports.number()
33817
34386
  }), RecordingManifestSchema, {
33818
34387
  kind: "query",
33819
- auth: "admin"
34388
+ auth: "protected"
33820
34389
  }),
33821
34390
  getStorageUsage: method(external_exports.object({}), RecordingStorageUsageSchema, {
33822
34391
  kind: "query",
@@ -34161,12 +34730,32 @@ var recordingExportCapability = {
34161
34730
  }
34162
34731
  };
34163
34732
  var SceneConditionSchema = external_exports.string();
34733
+ var SceneUncoveredPolicySchema = external_exports.enum(["skip", "judge-anyway"]);
34734
+ var SceneVerdictSchema = external_exports.enum([
34735
+ "matched",
34736
+ "diverged",
34737
+ "unknown"
34738
+ ]);
34739
+ var SceneUnavailableSchema = external_exports.enum([
34740
+ "no-reference-for-condition",
34741
+ "view-shifted",
34742
+ "no-vision-profile",
34743
+ "encoder-model-changed",
34744
+ "no-snapshot"
34745
+ ]);
34164
34746
  var SceneReferenceSchema = external_exports.object({
34165
34747
  embedding: external_exports.array(external_exports.number()),
34166
34748
  modelId: external_exports.string(),
34167
34749
  condition: SceneConditionSchema,
34168
34750
  capturedAt: external_exports.number(),
34169
- thumbnailMediaId: external_exports.string().optional()
34751
+ thumbnailMediaId: external_exports.string().optional(),
34752
+ /** Whole-frame (downscaled) embedding captured alongside the ROI crop. The
34753
+ * anti-view-shift anchor: a bumped camera, a PTZ preset or a re-aim makes the
34754
+ * normalized rect frame a different piece of world, and the scene would
34755
+ * diverge forever with a perfectly plausible cosine. Checked LAZILY, only
34756
+ * when hysteresis is about to flip — one extra encode per candidate
34757
+ * transition, not per poll. */
34758
+ anchorEmbedding: external_exports.array(external_exports.number()).optional()
34170
34759
  });
34171
34760
  var SceneMonitorStateSchema = external_exports.object({
34172
34761
  id: external_exports.string(),
@@ -34186,6 +34775,18 @@ var SceneCheckSchema = external_exports.discriminatedUnion("mode", [external_exp
34186
34775
  profileId: external_exports.string().optional(),
34187
34776
  hysteresisCount: external_exports.number().int().positive()
34188
34777
  })]);
34778
+ var SCENE_DEFAULT_ANCHOR_THRESHOLD = 0.85;
34779
+ var SCENE_DEFAULT_UNCOVERED_POLICY = "skip";
34780
+ var SCENE_CONFIRM_DEFAULT_TIMEOUT_MS = 8e3;
34781
+ var SceneConfirmSchema = external_exports.object({
34782
+ enabled: external_exports.boolean().default(false),
34783
+ prompt: external_exports.string().min(1).max(1e3),
34784
+ profileId: external_exports.string().optional(),
34785
+ timeoutMs: external_exports.number().int().min(1e3).max(2e4).default(SCENE_CONFIRM_DEFAULT_TIMEOUT_MS),
34786
+ maxImagePx: external_exports.number().int().min(64).max(2048).default(448),
34787
+ /** What a timeout / unavailable model means for the PENDING flip. */
34788
+ onTimeout: external_exports.enum(["flip", "hold"]).default("hold")
34789
+ });
34189
34790
  var SceneMonitorSchema = external_exports.object({
34190
34791
  id: external_exports.string(),
34191
34792
  label: external_exports.string(),
@@ -34204,7 +34805,56 @@ var SceneMonitorSchema = external_exports.object({
34204
34805
  lastConfidence: external_exports.number().nullable(),
34205
34806
  currentCondition: SceneConditionSchema.nullable(),
34206
34807
  availability: external_exports.enum(["ok", "unavailable"]),
34207
- unavailableReason: external_exports.string().nullable()
34808
+ unavailableReason: external_exports.string().nullable(),
34809
+ /** Which state is "the initial screen". `null` until the first capture. */
34810
+ baselineStateId: external_exports.string().nullable(),
34811
+ /** Which boolean drives notification rules and any export. */
34812
+ emit: external_exports.enum(["latched", "live"]).default("latched"),
34813
+ /** Live: does the region match the baseline RIGHT NOW. */
34814
+ verdict: SceneVerdictSchema,
34815
+ /** Has it been `diverged` at least once since `armedAt` — the operator's boolean. */
34816
+ latched: external_exports.boolean(),
34817
+ /** Last reset (or creation). */
34818
+ armedAt: external_exports.number(),
34819
+ divergedAt: external_exports.number().nullable(),
34820
+ restoredAt: external_exports.number().nullable(),
34821
+ /** A check is only COUNTED when the device has been quiet this long. Motion
34822
+ * during the window DISCARDS the observation — a car pulling up in front of
34823
+ * the bin must not be able to spend hysteresis credit. */
34824
+ quietSeconds: external_exports.number().int().min(0).max(3600).default(60),
34825
+ /** An observation only advances the pending count when it is at least this
34826
+ * far from the previously counted one, so N agreeing checks span real time
34827
+ * rather than N adjacent polls inside one occlusion. */
34828
+ minObservationSpacingSec: external_exports.number().int().min(0).max(3600).default(120),
34829
+ /** Vision-model adjudication of a candidate flip. Similarity primary only. */
34830
+ confirm: SceneConfirmSchema.optional(),
34831
+ /** Whole-frame anchor cosine below which a flip is REFUSED as `view-shifted`. */
34832
+ anchorThreshold: external_exports.number().min(0).max(1).default(SCENE_DEFAULT_ANCHOR_THRESHOLD),
34833
+ /** Clear the latch on its own when the scene matches again? Default false —
34834
+ * `restoredAt` and the `scene-restored` edge are recorded regardless, so an
34835
+ * automation can react to the bin coming back without the operator's own
34836
+ * alarm silently clearing itself. */
34837
+ autoRestore: external_exports.boolean().default(false),
34838
+ /** What to do when the current light has no reference of its own. See
34839
+ * {@link SceneUncoveredPolicySchema} — the default makes night OPTIONAL. */
34840
+ onUncoveredCondition: SceneUncoveredPolicySchema.default(SCENE_DEFAULT_UNCOVERED_POLICY),
34841
+ /**
34842
+ * The light whose checks are currently being SAT OUT under
34843
+ * `onUncoveredCondition: 'skip'` — `null` when the scene is checking normally.
34844
+ *
34845
+ * Engine-reported and advisory only: it moves no verdict, no latch and no
34846
+ * hysteresis. It exists so the card can say *"night (IR) — checks paused,
34847
+ * nothing captured in this light"* in the same calm voice as the coverage
34848
+ * line, because the alternative is a scene that silently stops answering
34849
+ * after sunset with nothing anywhere saying why. A skipped check must never
34850
+ * read as a broken one.
34851
+ */
34852
+ suspendedCondition: SceneConditionSchema.nullable().default(null),
34853
+ /** Named cause when `verdict === 'unknown'`. */
34854
+ unavailable: SceneUnavailableSchema.nullable(),
34855
+ /** Conditions that have at least one comparable reference — the coverage line
34856
+ * ("day ✓ · ir ✓ · dusk ✗") that turns a silent fallback into a visible fact. */
34857
+ coveredConditions: external_exports.array(SceneConditionSchema)
34208
34858
  });
34209
34859
  var SceneMonitorStatusSchema = external_exports.object({
34210
34860
  monitors: external_exports.array(SceneMonitorSchema),
@@ -34217,12 +34867,6 @@ var sceneMonitorCapability = {
34217
34867
  kind: "wrapper",
34218
34868
  defaultActive: true,
34219
34869
  deviceTypes: [DeviceType.Camera],
34220
- deviceConfig: { ui: {
34221
- kind: "widget",
34222
- widgetId: "host/scene-monitor-editor",
34223
- tab: "scenes",
34224
- label: "Scenes"
34225
- } },
34226
34870
  methods: {
34227
34871
  listScenes: method(external_exports.object({ deviceId: external_exports.number() }), SceneMonitorStatusSchema),
34228
34872
  createScene: method(external_exports.object({
@@ -34253,7 +34897,15 @@ var sceneMonitorCapability = {
34253
34897
  "both"
34254
34898
  ]).optional(),
34255
34899
  checkIntervalSec: external_exports.number().optional(),
34256
- check: SceneCheckSchema.optional()
34900
+ check: SceneCheckSchema.optional(),
34901
+ emit: external_exports.enum(["latched", "live"]).optional(),
34902
+ quietSeconds: external_exports.number().int().min(0).max(3600).optional(),
34903
+ minObservationSpacingSec: external_exports.number().int().min(0).max(3600).optional(),
34904
+ anchorThreshold: external_exports.number().min(0).max(1).optional(),
34905
+ autoRestore: external_exports.boolean().optional(),
34906
+ onUncoveredCondition: SceneUncoveredPolicySchema.optional(),
34907
+ /** `null` clears the vision-model adjudicator. */
34908
+ confirm: SceneConfirmSchema.nullable().optional()
34257
34909
  })
34258
34910
  }), external_exports.void(), {
34259
34911
  kind: "mutation",
@@ -34294,6 +34946,26 @@ var sceneMonitorCapability = {
34294
34946
  }), external_exports.void(), {
34295
34947
  kind: "mutation",
34296
34948
  auth: "admin"
34949
+ }),
34950
+ /**
34951
+ * Clear the latch, re-arm, and — by default — RE-CAPTURE the baseline for
34952
+ * the CURRENT condition. The bin never goes back in exactly the same spot;
34953
+ * "reset" in the operator's head means *this is the new normal*, and
34954
+ * re-capture is what makes the feature self-healing against slow drift
34955
+ * instead of failing silently weeks later.
34956
+ *
34957
+ * Reachable from three surfaces on this one mutation: the scene card, a
34958
+ * notification button (an `onTrigger` sequence with a `kind:'cap'` step —
34959
+ * no new Notification-Center code at all), and tRPC for scripts.
34960
+ */
34961
+ resetScene: method(external_exports.object({
34962
+ deviceId: external_exports.number(),
34963
+ monitorId: external_exports.string(),
34964
+ /** Defaults to TRUE at the provider seam — see `SCENE_RESET_RECAPTURES`. */
34965
+ recapture: external_exports.boolean().optional()
34966
+ }), external_exports.void(), {
34967
+ kind: "mutation",
34968
+ auth: "admin"
34297
34969
  })
34298
34970
  },
34299
34971
  status: {
@@ -34461,13 +35133,40 @@ var CamStreamDescriptorSchema = external_exports.object({
34461
35133
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
34462
35134
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
34463
35135
  });
35136
+ var StreamCatalogStateSchema = external_exports.object({
35137
+ /** The descriptors as last built from a real camera response. Never a guess:
35138
+ * a failed or refused build writes NOTHING, so a restored catalog is always
35139
+ * one the camera itself once produced. */
35140
+ descriptors: external_exports.array(CamStreamDescriptorSchema),
35141
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
35142
+ * path decide whether the camera's own awake window is worth spending on a
35143
+ * re-read. */
35144
+ lastFetchedAt: external_exports.number()
35145
+ });
34464
35146
  var streamCatalogCapability = {
34465
35147
  name: "stream-catalog",
34466
35148
  scope: "device",
34467
35149
  deviceNative: true,
34468
35150
  mode: "singleton",
34469
35151
  deviceTypes: [DeviceType.Camera],
34470
- methods: { getCatalog: method(external_exports.object({ deviceId: external_exports.number().int().nonnegative() }), external_exports.array(CamStreamDescriptorSchema).readonly()) }
35152
+ methods: { getCatalog: method(external_exports.object({ deviceId: external_exports.number().int().nonnegative() }), external_exports.array(CamStreamDescriptorSchema).readonly()) },
35153
+ runtimeState: StreamCatalogStateSchema,
35154
+ /**
35155
+ * Runtime-state durability: **restored** — see the schema doc. A cold
35156
+ * catalog on a sleeping battery camera is not a slow first frame, it is a
35157
+ * camera that cannot be watched at all until it happens to wake.
35158
+ *
35159
+ * Churn is nil by construction: the slice is written only by a SUCCESSFUL
35160
+ * build, and a build only runs when there is no cached copy (or the copy is
35161
+ * a day old and the camera is awake anyway).
35162
+ *
35163
+ * See `RuntimeStateDurability`. Enforced by
35164
+ * `scripts/check-runtime-state-durability.ts`.
35165
+ */
35166
+ durability: "restored",
35167
+ /** Clock field: written, but excluded from the compare that decides whether
35168
+ * persisting is worth a SQLite commit — the descriptors are the value. */
35169
+ volatileStateFields: ["lastFetchedAt"]
34471
35170
  };
34472
35171
  var StreamProfileSchema = external_exports.enum([
34473
35172
  "main",
@@ -34686,6 +35385,30 @@ var NetworkAddressSchema = external_exports.object({
34686
35385
  family: external_exports.string(),
34687
35386
  internal: external_exports.boolean()
34688
35387
  });
35388
+ var SiteLocationSourceSchema = external_exports.enum(["operator-set", "derived-from-ip"]);
35389
+ var SiteLocationSchema = external_exports.object({
35390
+ /** WGS84 decimal degrees. */
35391
+ latitude: external_exports.number().min(-90).max(90),
35392
+ longitude: external_exports.number().min(-180).max(180),
35393
+ source: SiteLocationSourceSchema,
35394
+ /** Epoch ms the value was last written. */
35395
+ updatedAt: external_exports.number(),
35396
+ /**
35397
+ * Human-readable place the geo-IP service reported ("Napoli, IT"). Display
35398
+ * only — never parsed, never matched on. Absent for an operator-typed value.
35399
+ */
35400
+ label: external_exports.string().optional()
35401
+ });
35402
+ var SiteLocationStatusSchema = external_exports.object({
35403
+ location: SiteLocationSchema.nullable(),
35404
+ derivationAttemptedAt: external_exports.number().nullable(),
35405
+ /** Why the last derivation failed, for the UI to show instead of a shrug. */
35406
+ derivationError: external_exports.string().nullable()
35407
+ });
35408
+ var SetSiteLocationInputSchema = external_exports.object({
35409
+ latitude: external_exports.number().min(-90).max(90),
35410
+ longitude: external_exports.number().min(-180).max(180)
35411
+ }).nullable();
34689
35412
  var systemCapability = {
34690
35413
  name: "system",
34691
35414
  scope: "system",
@@ -34703,6 +35426,32 @@ var systemCapability = {
34703
35426
  forceRetentionCleanup: method(external_exports.void(), external_exports.void(), {
34704
35427
  kind: "mutation",
34705
35428
  auth: "admin"
35429
+ }),
35430
+ /**
35431
+ * The site coordinates, deriving a default from the hub's public IP on the
35432
+ * FIRST read that finds nothing stored.
35433
+ *
35434
+ * The derivation is one-shot and bounded: one outbound request, a few
35435
+ * seconds, its outcome persisted either way. A hub with no internet pays it
35436
+ * once and never again, and neither boot nor any consumer is blocked on it —
35437
+ * the caller gets `location: null` and degrades exactly as it did before this
35438
+ * method existed.
35439
+ */
35440
+ getSiteLocation: method(external_exports.void(), SiteLocationStatusSchema),
35441
+ /** Operator input. Always lands as `source: 'operator-set'`. */
35442
+ setSiteLocation: method(SetSiteLocationInputSchema, SiteLocationStatusSchema, {
35443
+ kind: "mutation",
35444
+ auth: "admin"
35445
+ }),
35446
+ /**
35447
+ * Re-run the geo-IP derivation now. The ONLY way a spent or failed
35448
+ * derivation is retried — there is no timer, and no read path retries.
35449
+ * Overwrites an existing `derived-from-ip` value; refuses to clobber an
35450
+ * `operator-set` one.
35451
+ */
35452
+ detectSiteLocation: method(external_exports.void(), SiteLocationStatusSchema, {
35453
+ kind: "mutation",
35454
+ auth: "admin"
34706
35455
  })
34707
35456
  },
34708
35457
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
@@ -35632,6 +36381,7 @@ var BATTERY_DEVICE_PROFILE = {
35632
36381
  },
35633
36382
  settings: {}
35634
36383
  };
36384
+ var BATTERY_UNREACHABLE_AFTER_MS = 360 * 6e4;
35635
36385
  var METHOD_ACCESS_MAP = Object.freeze({
35636
36386
  "accessories.setChildHidden": {
35637
36387
  capName: "accessories",
@@ -37691,6 +38441,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
37691
38441
  addonId: null,
37692
38442
  access: "create"
37693
38443
  },
38444
+ "llm.cancel": {
38445
+ capName: "llm",
38446
+ capScope: "system",
38447
+ addonId: null,
38448
+ access: "create"
38449
+ },
37694
38450
  "llm.deleteModel": {
37695
38451
  capName: "llm",
37696
38452
  capScope: "system",
@@ -37775,6 +38531,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
37775
38531
  addonId: null,
37776
38532
  access: "view"
37777
38533
  },
38534
+ "llm.resolveModelRef": {
38535
+ capName: "llm",
38536
+ capScope: "system",
38537
+ addonId: null,
38538
+ access: "create"
38539
+ },
37778
38540
  "llm.setDefault": {
37779
38541
  capName: "llm",
37780
38542
  capScope: "system",
@@ -39941,6 +40703,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39941
40703
  addonId: null,
39942
40704
  access: "create"
39943
40705
  },
40706
+ "sceneMonitor.resetScene": {
40707
+ capName: "scene-monitor",
40708
+ capScope: "device",
40709
+ addonId: null,
40710
+ access: "delete"
40711
+ },
39944
40712
  "sceneMonitor.updateScene": {
39945
40713
  capName: "scene-monitor",
39946
40714
  capScope: "device",
@@ -40079,6 +40847,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40079
40847
  addonId: null,
40080
40848
  access: "view"
40081
40849
  },
40850
+ "snapshot.getDebugState": {
40851
+ capName: "snapshot",
40852
+ capScope: "device",
40853
+ addonId: null,
40854
+ access: "view"
40855
+ },
40082
40856
  "snapshot.getSnapshot": {
40083
40857
  capName: "snapshot",
40084
40858
  capScope: "device",
@@ -40619,6 +41393,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40619
41393
  addonId: null,
40620
41394
  access: "create"
40621
41395
  },
41396
+ "system.detectSiteLocation": {
41397
+ capName: "system",
41398
+ capScope: "system",
41399
+ addonId: null,
41400
+ access: "create"
41401
+ },
40622
41402
  "system.featureFlags": {
40623
41403
  capName: "system",
40624
41404
  capScope: "system",
@@ -40637,6 +41417,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40637
41417
  addonId: null,
40638
41418
  access: "view"
40639
41419
  },
41420
+ "system.getSiteLocation": {
41421
+ capName: "system",
41422
+ capScope: "system",
41423
+ addonId: null,
41424
+ access: "view"
41425
+ },
40640
41426
  "system.health": {
40641
41427
  capName: "system",
40642
41428
  capScope: "system",
@@ -40661,6 +41447,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40661
41447
  addonId: null,
40662
41448
  access: "create"
40663
41449
  },
41450
+ "system.setSiteLocation": {
41451
+ capName: "system",
41452
+ capScope: "system",
41453
+ addonId: null,
41454
+ access: "create"
41455
+ },
40664
41456
  "terminalSession.adoptLegacyMonitor": {
40665
41457
  capName: "terminal-session",
40666
41458
  capScope: "system",
@@ -41232,6 +42024,1709 @@ var METHOD_ACCESS_MAP = Object.freeze({
41232
42024
  access: "create"
41233
42025
  }
41234
42026
  });
42027
+ var METHOD_DEVICE_SELECTORS = Object.freeze({
42028
+ "accessories.setChildHidden": [{
42029
+ name: "childDeviceId",
42030
+ form: "single",
42031
+ optional: false
42032
+ }, {
42033
+ name: "deviceId",
42034
+ form: "single",
42035
+ optional: false
42036
+ }],
42037
+ "addonSettings.getDeviceSettings": [{
42038
+ name: "deviceId",
42039
+ form: "single",
42040
+ optional: false
42041
+ }],
42042
+ "addonSettings.updateDeviceSettings": [{
42043
+ name: "deviceId",
42044
+ form: "single",
42045
+ optional: false
42046
+ }],
42047
+ "alarmPanel.arm": [{
42048
+ name: "deviceId",
42049
+ form: "single",
42050
+ optional: false
42051
+ }],
42052
+ "alarmPanel.disarm": [{
42053
+ name: "deviceId",
42054
+ form: "single",
42055
+ optional: false
42056
+ }],
42057
+ "alarmPanel.trigger": [{
42058
+ name: "deviceId",
42059
+ form: "single",
42060
+ optional: false
42061
+ }],
42062
+ "audioAnalysis.resolveDeviceSettings": [{
42063
+ name: "deviceId",
42064
+ form: "single",
42065
+ optional: false
42066
+ }],
42067
+ "audioAnalyzer.classify": [{
42068
+ name: "deviceId",
42069
+ form: "single",
42070
+ optional: true
42071
+ }],
42072
+ "audioMetrics.getCurrentSnapshot": [{
42073
+ name: "deviceId",
42074
+ form: "single",
42075
+ optional: false
42076
+ }],
42077
+ "audioMetrics.getHistory": [{
42078
+ name: "deviceId",
42079
+ form: "single",
42080
+ optional: false
42081
+ }],
42082
+ "automationControl.disable": [{
42083
+ name: "deviceId",
42084
+ form: "single",
42085
+ optional: false
42086
+ }],
42087
+ "automationControl.enable": [{
42088
+ name: "deviceId",
42089
+ form: "single",
42090
+ optional: false
42091
+ }],
42092
+ "automationControl.trigger": [{
42093
+ name: "deviceId",
42094
+ form: "single",
42095
+ optional: false
42096
+ }],
42097
+ "battery.wakeForStream": [{
42098
+ name: "deviceId",
42099
+ form: "single",
42100
+ optional: false
42101
+ }],
42102
+ "brightness.setBrightness": [{
42103
+ name: "deviceId",
42104
+ form: "single",
42105
+ optional: false
42106
+ }],
42107
+ "button.press": [{
42108
+ name: "deviceId",
42109
+ form: "single",
42110
+ optional: false
42111
+ }],
42112
+ "cameraCredentials.getCredentials": [{
42113
+ name: "deviceId",
42114
+ form: "single",
42115
+ optional: false
42116
+ }],
42117
+ "cameraStreams.getBrokerStreams": [{
42118
+ name: "deviceId",
42119
+ form: "single",
42120
+ optional: false
42121
+ }],
42122
+ "cameraStreams.getCameraStreams": [{
42123
+ name: "deviceId",
42124
+ form: "single",
42125
+ optional: false
42126
+ }],
42127
+ "cameraStreams.getProfileRtspEntries": [{
42128
+ name: "deviceId",
42129
+ form: "single",
42130
+ optional: false
42131
+ }],
42132
+ "cameraStreams.getRtspEntries": [{
42133
+ name: "deviceId",
42134
+ form: "single",
42135
+ optional: false
42136
+ }],
42137
+ "cameraStreams.pickStream": [{
42138
+ name: "deviceId",
42139
+ form: "single",
42140
+ optional: false
42141
+ }],
42142
+ "climateControl.setFanMode": [{
42143
+ name: "deviceId",
42144
+ form: "single",
42145
+ optional: false
42146
+ }],
42147
+ "climateControl.setMode": [{
42148
+ name: "deviceId",
42149
+ form: "single",
42150
+ optional: false
42151
+ }],
42152
+ "climateControl.setPreset": [{
42153
+ name: "deviceId",
42154
+ form: "single",
42155
+ optional: false
42156
+ }],
42157
+ "climateControl.setSwingHorizontal": [{
42158
+ name: "deviceId",
42159
+ form: "single",
42160
+ optional: false
42161
+ }],
42162
+ "climateControl.setSwingVertical": [{
42163
+ name: "deviceId",
42164
+ form: "single",
42165
+ optional: false
42166
+ }],
42167
+ "climateControl.setTarget": [{
42168
+ name: "deviceId",
42169
+ form: "single",
42170
+ optional: false
42171
+ }],
42172
+ "climateControl.setTargetHumidity": [{
42173
+ name: "deviceId",
42174
+ form: "single",
42175
+ optional: false
42176
+ }],
42177
+ "climateControl.setTargetRange": [{
42178
+ name: "deviceId",
42179
+ form: "single",
42180
+ optional: false
42181
+ }],
42182
+ "color.setColor": [{
42183
+ name: "deviceId",
42184
+ form: "single",
42185
+ optional: false
42186
+ }],
42187
+ "consumables.reset": [{
42188
+ name: "deviceId",
42189
+ form: "single",
42190
+ optional: false
42191
+ }],
42192
+ "control.setValue": [{
42193
+ name: "deviceId",
42194
+ form: "single",
42195
+ optional: false
42196
+ }],
42197
+ "cover.close": [{
42198
+ name: "deviceId",
42199
+ form: "single",
42200
+ optional: false
42201
+ }],
42202
+ "cover.open": [{
42203
+ name: "deviceId",
42204
+ form: "single",
42205
+ optional: false
42206
+ }],
42207
+ "cover.setPosition": [{
42208
+ name: "deviceId",
42209
+ form: "single",
42210
+ optional: false
42211
+ }],
42212
+ "cover.setTiltPosition": [{
42213
+ name: "deviceId",
42214
+ form: "single",
42215
+ optional: false
42216
+ }],
42217
+ "cover.stop": [{
42218
+ name: "deviceId",
42219
+ form: "single",
42220
+ optional: false
42221
+ }],
42222
+ "dayNight.getOptions": [{
42223
+ name: "deviceId",
42224
+ form: "single",
42225
+ optional: false
42226
+ }],
42227
+ "dayNight.setSettings": [{
42228
+ name: "deviceId",
42229
+ form: "single",
42230
+ optional: false
42231
+ }],
42232
+ "decoder.createSession": [{
42233
+ name: "deviceId",
42234
+ form: "single",
42235
+ optional: true
42236
+ }],
42237
+ "deviceAdoption.release": [{
42238
+ name: "camDeviceId",
42239
+ form: "single",
42240
+ optional: false
42241
+ }],
42242
+ "deviceAdoption.resync": [{
42243
+ name: "camDeviceId",
42244
+ form: "single",
42245
+ optional: false
42246
+ }],
42247
+ "deviceDiscovery.adoptDevice": [{
42248
+ name: "deviceId",
42249
+ form: "single",
42250
+ optional: false
42251
+ }],
42252
+ "deviceDiscovery.listDiscovered": [{
42253
+ name: "deviceId",
42254
+ form: "single",
42255
+ optional: false
42256
+ }],
42257
+ "deviceDiscovery.refreshDiscovery": [{
42258
+ name: "deviceId",
42259
+ form: "single",
42260
+ optional: false
42261
+ }],
42262
+ "deviceDiscovery.releaseDevice": [{
42263
+ name: "childDeviceId",
42264
+ form: "single",
42265
+ optional: false
42266
+ }, {
42267
+ name: "deviceId",
42268
+ form: "single",
42269
+ optional: false
42270
+ }],
42271
+ "deviceManager.adoptionRelease": [{
42272
+ name: "camDeviceId",
42273
+ form: "single",
42274
+ optional: false
42275
+ }],
42276
+ "deviceManager.adoptionResync": [{
42277
+ name: "camDeviceId",
42278
+ form: "single",
42279
+ optional: false
42280
+ }],
42281
+ "deviceManager.applyInitialMeta": [{
42282
+ name: "deviceId",
42283
+ form: "single",
42284
+ optional: false
42285
+ }, {
42286
+ name: "linkDeviceId",
42287
+ form: "single",
42288
+ optional: true
42289
+ }],
42290
+ "deviceManager.disable": [{
42291
+ name: "deviceId",
42292
+ form: "single",
42293
+ optional: false
42294
+ }],
42295
+ "deviceManager.enable": [{
42296
+ name: "deviceId",
42297
+ form: "single",
42298
+ optional: false
42299
+ }],
42300
+ "deviceManager.getBindings": [{
42301
+ name: "deviceId",
42302
+ form: "single",
42303
+ optional: false
42304
+ }],
42305
+ "deviceManager.getChildren": [{
42306
+ name: "parentDeviceId",
42307
+ form: "single",
42308
+ optional: false
42309
+ }],
42310
+ "deviceManager.getConfigSchema": [{
42311
+ name: "deviceId",
42312
+ form: "single",
42313
+ optional: false
42314
+ }],
42315
+ "deviceManager.getDevice": [{
42316
+ name: "deviceId",
42317
+ form: "single",
42318
+ optional: false
42319
+ }],
42320
+ "deviceManager.getDeviceAggregate": [{
42321
+ name: "deviceId",
42322
+ form: "single",
42323
+ optional: false
42324
+ }],
42325
+ "deviceManager.getDeviceLiveInfoAggregate": [{
42326
+ name: "deviceId",
42327
+ form: "single",
42328
+ optional: false
42329
+ }],
42330
+ "deviceManager.getDeviceSettingsAggregate": [{
42331
+ name: "deviceId",
42332
+ form: "single",
42333
+ optional: false
42334
+ }],
42335
+ "deviceManager.getDeviceStatusAggregate": [{
42336
+ name: "deviceId",
42337
+ form: "single",
42338
+ optional: false
42339
+ }],
42340
+ "deviceManager.getDeviceStatusAggregateBatch": [{
42341
+ name: "deviceIds",
42342
+ form: "array",
42343
+ optional: false
42344
+ }],
42345
+ "deviceManager.getLinkedDevices": [{
42346
+ name: "deviceId",
42347
+ form: "single",
42348
+ optional: false
42349
+ }],
42350
+ "deviceManager.getSettingsSchema": [{
42351
+ name: "deviceId",
42352
+ form: "single",
42353
+ optional: false
42354
+ }],
42355
+ "deviceManager.getStreamProfileMap": [{
42356
+ name: "deviceId",
42357
+ form: "single",
42358
+ optional: false
42359
+ }],
42360
+ "deviceManager.getStreamSources": [{
42361
+ name: "deviceId",
42362
+ form: "single",
42363
+ optional: false
42364
+ }],
42365
+ "deviceManager.getWireableFields": [{
42366
+ name: "deviceId",
42367
+ form: "single",
42368
+ optional: false
42369
+ }],
42370
+ "deviceManager.loadConfig": [{
42371
+ name: "deviceId",
42372
+ form: "single",
42373
+ optional: false
42374
+ }],
42375
+ "deviceManager.loadMeta": [{
42376
+ name: "deviceId",
42377
+ form: "single",
42378
+ optional: false
42379
+ }],
42380
+ "deviceManager.loadRuntimeState": [{
42381
+ name: "deviceId",
42382
+ form: "single",
42383
+ optional: false
42384
+ }],
42385
+ "deviceManager.persistConfig": [{
42386
+ name: "deviceId",
42387
+ form: "single",
42388
+ optional: false
42389
+ }],
42390
+ "deviceManager.probeStreams": [{
42391
+ name: "deviceId",
42392
+ form: "single",
42393
+ optional: false
42394
+ }],
42395
+ "deviceManager.registerDevice": [{
42396
+ name: "parentDeviceId",
42397
+ form: "single",
42398
+ optional: true
42399
+ }],
42400
+ "deviceManager.remove": [{
42401
+ name: "deviceId",
42402
+ form: "single",
42403
+ optional: false
42404
+ }],
42405
+ "deviceManager.removeDevice": [{
42406
+ name: "deviceId",
42407
+ form: "single",
42408
+ optional: false
42409
+ }],
42410
+ "deviceManager.runDeviceAction": [{
42411
+ name: "deviceId",
42412
+ form: "single",
42413
+ optional: false
42414
+ }],
42415
+ "deviceManager.setChildLayout": [{
42416
+ name: "deviceId",
42417
+ form: "single",
42418
+ optional: false
42419
+ }],
42420
+ "deviceManager.setDisabled": [{
42421
+ name: "deviceId",
42422
+ form: "single",
42423
+ optional: false
42424
+ }],
42425
+ "deviceManager.setDisplay": [{
42426
+ name: "deviceId",
42427
+ form: "single",
42428
+ optional: false
42429
+ }],
42430
+ "deviceManager.setIntegrationId": [{
42431
+ name: "deviceId",
42432
+ form: "single",
42433
+ optional: false
42434
+ }],
42435
+ "deviceManager.setLinkDeviceId": [{
42436
+ name: "deviceId",
42437
+ form: "single",
42438
+ optional: false
42439
+ }, {
42440
+ name: "linkDeviceId",
42441
+ form: "single",
42442
+ optional: true
42443
+ }],
42444
+ "deviceManager.setLocation": [{
42445
+ name: "deviceId",
42446
+ form: "single",
42447
+ optional: false
42448
+ }],
42449
+ "deviceManager.setMetadata": [{
42450
+ name: "deviceId",
42451
+ form: "single",
42452
+ optional: false
42453
+ }],
42454
+ "deviceManager.setName": [{
42455
+ name: "deviceId",
42456
+ form: "single",
42457
+ optional: false
42458
+ }],
42459
+ "deviceManager.setPrimaryChildEntityId": [{
42460
+ name: "deviceId",
42461
+ form: "single",
42462
+ optional: false
42463
+ }],
42464
+ "deviceManager.setRole": [{
42465
+ name: "deviceId",
42466
+ form: "single",
42467
+ optional: false
42468
+ }],
42469
+ "deviceManager.setStreamProfileMap": [{
42470
+ name: "deviceId",
42471
+ form: "single",
42472
+ optional: false
42473
+ }],
42474
+ "deviceManager.setType": [{
42475
+ name: "deviceId",
42476
+ form: "single",
42477
+ optional: false
42478
+ }],
42479
+ "deviceManager.setWrapperActive": [{
42480
+ name: "deviceId",
42481
+ form: "single",
42482
+ optional: false
42483
+ }],
42484
+ "deviceManager.testField": [{
42485
+ name: "deviceId",
42486
+ form: "single",
42487
+ optional: false
42488
+ }],
42489
+ "deviceManager.updateConfig": [{
42490
+ name: "deviceId",
42491
+ form: "single",
42492
+ optional: false
42493
+ }],
42494
+ "deviceManager.updateDeviceField": [{
42495
+ name: "deviceId",
42496
+ form: "single",
42497
+ optional: false
42498
+ }],
42499
+ "deviceManager.updateDeviceFieldsBatch": [{
42500
+ name: "deviceId",
42501
+ form: "single",
42502
+ optional: false
42503
+ }],
42504
+ "deviceOps.getConfigEntries": [{
42505
+ name: "deviceId",
42506
+ form: "single",
42507
+ optional: false
42508
+ }],
42509
+ "deviceOps.getRawState": [{
42510
+ name: "deviceId",
42511
+ form: "single",
42512
+ optional: false
42513
+ }],
42514
+ "deviceOps.getSettingsSchema": [{
42515
+ name: "deviceId",
42516
+ form: "single",
42517
+ optional: false
42518
+ }],
42519
+ "deviceOps.getStreamSources": [{
42520
+ name: "deviceId",
42521
+ form: "single",
42522
+ optional: false
42523
+ }],
42524
+ "deviceOps.removeDevice": [{
42525
+ name: "deviceId",
42526
+ form: "single",
42527
+ optional: false
42528
+ }],
42529
+ "deviceOps.runAction": [{
42530
+ name: "deviceId",
42531
+ form: "single",
42532
+ optional: false
42533
+ }],
42534
+ "deviceOps.setConfig": [{
42535
+ name: "deviceId",
42536
+ form: "single",
42537
+ optional: false
42538
+ }],
42539
+ "deviceState.getCapSlice": [{
42540
+ name: "deviceId",
42541
+ form: "single",
42542
+ optional: false
42543
+ }],
42544
+ "deviceState.getSnapshot": [{
42545
+ name: "deviceId",
42546
+ form: "single",
42547
+ optional: false
42548
+ }],
42549
+ "deviceState.setCapSlice": [{
42550
+ name: "deviceId",
42551
+ form: "single",
42552
+ optional: false
42553
+ }],
42554
+ "events.getEventClipUrl": [{
42555
+ name: "deviceId",
42556
+ form: "single",
42557
+ optional: false
42558
+ }],
42559
+ "events.getEvents": [{
42560
+ name: "deviceId",
42561
+ form: "single",
42562
+ optional: false
42563
+ }],
42564
+ "events.getEventThumbnail": [{
42565
+ name: "deviceId",
42566
+ form: "single",
42567
+ optional: false
42568
+ }],
42569
+ "faceGallery.getFaceByTrack": [{
42570
+ name: "deviceId",
42571
+ form: "single",
42572
+ optional: false
42573
+ }],
42574
+ "faceGallery.listRecentFaces": [{
42575
+ name: "deviceId",
42576
+ form: "single",
42577
+ optional: true
42578
+ }],
42579
+ "fanControl.setDirection": [{
42580
+ name: "deviceId",
42581
+ form: "single",
42582
+ optional: false
42583
+ }],
42584
+ "fanControl.setOscillating": [{
42585
+ name: "deviceId",
42586
+ form: "single",
42587
+ optional: false
42588
+ }],
42589
+ "fanControl.setPercentage": [{
42590
+ name: "deviceId",
42591
+ form: "single",
42592
+ optional: false
42593
+ }],
42594
+ "fanControl.setPreset": [{
42595
+ name: "deviceId",
42596
+ form: "single",
42597
+ optional: false
42598
+ }],
42599
+ "humidifier.setMode": [{
42600
+ name: "deviceId",
42601
+ form: "single",
42602
+ optional: false
42603
+ }],
42604
+ "humidifier.setOn": [{
42605
+ name: "deviceId",
42606
+ form: "single",
42607
+ optional: false
42608
+ }],
42609
+ "humidifier.setTargetHumidity": [{
42610
+ name: "deviceId",
42611
+ form: "single",
42612
+ optional: false
42613
+ }],
42614
+ "imageSettings.getOptions": [{
42615
+ name: "deviceId",
42616
+ form: "single",
42617
+ optional: false
42618
+ }],
42619
+ "imageSettings.setSettings": [{
42620
+ name: "deviceId",
42621
+ form: "single",
42622
+ optional: false
42623
+ }],
42624
+ "intercom.endTalkSession": [{
42625
+ name: "deviceId",
42626
+ form: "single",
42627
+ optional: false
42628
+ }],
42629
+ "intercom.handleAnswer": [{
42630
+ name: "deviceId",
42631
+ form: "single",
42632
+ optional: false
42633
+ }],
42634
+ "intercom.pushTalkAudio": [{
42635
+ name: "deviceId",
42636
+ form: "single",
42637
+ optional: false
42638
+ }],
42639
+ "intercom.startSession": [{
42640
+ name: "deviceId",
42641
+ form: "single",
42642
+ optional: false
42643
+ }],
42644
+ "intercom.startTalkSession": [{
42645
+ name: "deviceId",
42646
+ form: "single",
42647
+ optional: false
42648
+ }],
42649
+ "intercom.stopSession": [{
42650
+ name: "deviceId",
42651
+ form: "single",
42652
+ optional: false
42653
+ }],
42654
+ "lawnMowerControl.dock": [{
42655
+ name: "deviceId",
42656
+ form: "single",
42657
+ optional: false
42658
+ }],
42659
+ "lawnMowerControl.pause": [{
42660
+ name: "deviceId",
42661
+ form: "single",
42662
+ optional: false
42663
+ }],
42664
+ "lawnMowerControl.startMowing": [{
42665
+ name: "deviceId",
42666
+ form: "single",
42667
+ optional: false
42668
+ }],
42669
+ "lockControl.lock": [{
42670
+ name: "deviceId",
42671
+ form: "single",
42672
+ optional: false
42673
+ }],
42674
+ "lockControl.open": [{
42675
+ name: "deviceId",
42676
+ form: "single",
42677
+ optional: false
42678
+ }],
42679
+ "lockControl.unlock": [{
42680
+ name: "deviceId",
42681
+ form: "single",
42682
+ optional: false
42683
+ }],
42684
+ "mediaPlayer.next": [{
42685
+ name: "deviceId",
42686
+ form: "single",
42687
+ optional: false
42688
+ }],
42689
+ "mediaPlayer.pause": [{
42690
+ name: "deviceId",
42691
+ form: "single",
42692
+ optional: false
42693
+ }],
42694
+ "mediaPlayer.play": [{
42695
+ name: "deviceId",
42696
+ form: "single",
42697
+ optional: false
42698
+ }],
42699
+ "mediaPlayer.playMedia": [{
42700
+ name: "deviceId",
42701
+ form: "single",
42702
+ optional: false
42703
+ }],
42704
+ "mediaPlayer.previous": [{
42705
+ name: "deviceId",
42706
+ form: "single",
42707
+ optional: false
42708
+ }],
42709
+ "mediaPlayer.seek": [{
42710
+ name: "deviceId",
42711
+ form: "single",
42712
+ optional: false
42713
+ }],
42714
+ "mediaPlayer.selectSource": [{
42715
+ name: "deviceId",
42716
+ form: "single",
42717
+ optional: false
42718
+ }],
42719
+ "mediaPlayer.setMute": [{
42720
+ name: "deviceId",
42721
+ form: "single",
42722
+ optional: false
42723
+ }],
42724
+ "mediaPlayer.setRepeat": [{
42725
+ name: "deviceId",
42726
+ form: "single",
42727
+ optional: false
42728
+ }],
42729
+ "mediaPlayer.setShuffle": [{
42730
+ name: "deviceId",
42731
+ form: "single",
42732
+ optional: false
42733
+ }],
42734
+ "mediaPlayer.setVolume": [{
42735
+ name: "deviceId",
42736
+ form: "single",
42737
+ optional: false
42738
+ }],
42739
+ "mediaPlayer.stop": [{
42740
+ name: "deviceId",
42741
+ form: "single",
42742
+ optional: false
42743
+ }],
42744
+ "motion.isDetected": [{
42745
+ name: "deviceId",
42746
+ form: "single",
42747
+ optional: false
42748
+ }],
42749
+ "motionDetection.analyze": [{
42750
+ name: "deviceId",
42751
+ form: "single",
42752
+ optional: false
42753
+ }],
42754
+ "motionDetection.removeCamera": [{
42755
+ name: "deviceId",
42756
+ form: "single",
42757
+ optional: false
42758
+ }],
42759
+ "motionTrigger.setMotionTrigger": [{
42760
+ name: "deviceId",
42761
+ form: "single",
42762
+ optional: false
42763
+ }],
42764
+ "motionZones.getOptions": [{
42765
+ name: "deviceId",
42766
+ form: "single",
42767
+ optional: false
42768
+ }],
42769
+ "motionZones.setZone": [{
42770
+ name: "deviceId",
42771
+ form: "single",
42772
+ optional: false
42773
+ }],
42774
+ "nativeObjectDetection.setEnabled": [{
42775
+ name: "deviceId",
42776
+ form: "single",
42777
+ optional: false
42778
+ }],
42779
+ "networkQuality.getDeviceStats": [{
42780
+ name: "deviceId",
42781
+ form: "single",
42782
+ optional: false
42783
+ }],
42784
+ "networkQuality.reportClientStats": [{
42785
+ name: "deviceId",
42786
+ form: "single",
42787
+ optional: false
42788
+ }],
42789
+ "notificationRules.setDeviceMuted": [{
42790
+ name: "deviceId",
42791
+ form: "single",
42792
+ optional: false
42793
+ }],
42794
+ "notifier.cancel": [{
42795
+ name: "deviceId",
42796
+ form: "single",
42797
+ optional: false
42798
+ }],
42799
+ "notifier.send": [{
42800
+ name: "deviceId",
42801
+ form: "single",
42802
+ optional: false
42803
+ }],
42804
+ "osd.setOverlay": [{
42805
+ name: "deviceId",
42806
+ form: "single",
42807
+ optional: false
42808
+ }],
42809
+ "osdManager.clearSlotBinding": [{
42810
+ name: "deviceId",
42811
+ form: "single",
42812
+ optional: false
42813
+ }],
42814
+ "osdManager.copyDeviceConfiguration": [{
42815
+ name: "sourceDeviceId",
42816
+ form: "single",
42817
+ optional: false
42818
+ }, {
42819
+ name: "targetDeviceId",
42820
+ form: "single",
42821
+ optional: false
42822
+ }],
42823
+ "osdManager.getDeviceOsd": [{
42824
+ name: "deviceId",
42825
+ form: "single",
42826
+ optional: false
42827
+ }],
42828
+ "osdManager.getSourceCatalog": [{
42829
+ name: "deviceId",
42830
+ form: "single",
42831
+ optional: false
42832
+ }],
42833
+ "osdManager.previewSlot": [{
42834
+ name: "deviceId",
42835
+ form: "single",
42836
+ optional: false
42837
+ }],
42838
+ "osdManager.renderDevice": [{
42839
+ name: "deviceId",
42840
+ form: "single",
42841
+ optional: false
42842
+ }],
42843
+ "osdManager.setSlotBinding": [{
42844
+ name: "deviceId",
42845
+ form: "single",
42846
+ optional: false
42847
+ }],
42848
+ "petFeeder.callPet": [{
42849
+ name: "deviceId",
42850
+ form: "single",
42851
+ optional: false
42852
+ }],
42853
+ "petFeeder.cancelFeed": [{
42854
+ name: "deviceId",
42855
+ form: "single",
42856
+ optional: false
42857
+ }],
42858
+ "petFeeder.feed": [{
42859
+ name: "deviceId",
42860
+ form: "single",
42861
+ optional: false
42862
+ }],
42863
+ "petFeeder.markFoodReplenished": [{
42864
+ name: "deviceId",
42865
+ form: "single",
42866
+ optional: false
42867
+ }],
42868
+ "petFeeder.playSound": [{
42869
+ name: "deviceId",
42870
+ form: "single",
42871
+ optional: false
42872
+ }],
42873
+ "petFeeder.resetDesiccant": [{
42874
+ name: "deviceId",
42875
+ form: "single",
42876
+ optional: false
42877
+ }],
42878
+ "petFeeder.setChildLock": [{
42879
+ name: "deviceId",
42880
+ form: "single",
42881
+ optional: false
42882
+ }],
42883
+ "petFeeder.setFeedSound": [{
42884
+ name: "deviceId",
42885
+ form: "single",
42886
+ optional: false
42887
+ }],
42888
+ "petFeeder.setIndicatorLight": [{
42889
+ name: "deviceId",
42890
+ form: "single",
42891
+ optional: false
42892
+ }],
42893
+ "petFeeder.setVolume": [{
42894
+ name: "deviceId",
42895
+ form: "single",
42896
+ optional: false
42897
+ }],
42898
+ "pipelineAnalytics.clearTracks": [{
42899
+ name: "deviceId",
42900
+ form: "single",
42901
+ optional: false
42902
+ }],
42903
+ "pipelineAnalytics.completeRetrainTrack": [{
42904
+ name: "deviceId",
42905
+ form: "single",
42906
+ optional: false
42907
+ }],
42908
+ "pipelineAnalytics.deleteDeviceEvents": [{
42909
+ name: "deviceId",
42910
+ form: "single",
42911
+ optional: false
42912
+ }],
42913
+ "pipelineAnalytics.deleteTracks": [{
42914
+ name: "deviceId",
42915
+ form: "single",
42916
+ optional: false
42917
+ }],
42918
+ "pipelineAnalytics.deselectRetrainFrame": [{
42919
+ name: "deviceId",
42920
+ form: "single",
42921
+ optional: false
42922
+ }],
42923
+ "pipelineAnalytics.getActiveTracks": [{
42924
+ name: "deviceId",
42925
+ form: "single",
42926
+ optional: false
42927
+ }],
42928
+ "pipelineAnalytics.getAudioEvents": [{
42929
+ name: "deviceId",
42930
+ form: "single",
42931
+ optional: false
42932
+ }],
42933
+ "pipelineAnalytics.getEventDensity": [{
42934
+ name: "deviceId",
42935
+ form: "single",
42936
+ optional: false
42937
+ }],
42938
+ "pipelineAnalytics.getEventMedia": [{
42939
+ name: "deviceId",
42940
+ form: "single",
42941
+ optional: false
42942
+ }],
42943
+ "pipelineAnalytics.getKeyEvents": [{
42944
+ name: "deviceId",
42945
+ form: "single",
42946
+ optional: false
42947
+ }],
42948
+ "pipelineAnalytics.getMotionEvents": [{
42949
+ name: "deviceId",
42950
+ form: "single",
42951
+ optional: false
42952
+ }],
42953
+ "pipelineAnalytics.getObjectEvents": [{
42954
+ name: "deviceId",
42955
+ form: "single",
42956
+ optional: false
42957
+ }],
42958
+ "pipelineAnalytics.getRetrainExportUrl": [{
42959
+ name: "deviceIds",
42960
+ form: "array",
42961
+ optional: true
42962
+ }],
42963
+ "pipelineAnalytics.getSensorEvents": [{
42964
+ name: "deviceId",
42965
+ form: "single",
42966
+ optional: false
42967
+ }],
42968
+ "pipelineAnalytics.getTrack": [{
42969
+ name: "deviceId",
42970
+ form: "single",
42971
+ optional: false
42972
+ }],
42973
+ "pipelineAnalytics.getTrackMedia": [{
42974
+ name: "deviceId",
42975
+ form: "single",
42976
+ optional: false
42977
+ }],
42978
+ "pipelineAnalytics.getTrainingExportSummary": [{
42979
+ name: "deviceIds",
42980
+ form: "array",
42981
+ optional: true
42982
+ }],
42983
+ "pipelineAnalytics.getTrainingExportUrl": [{
42984
+ name: "deviceIds",
42985
+ form: "array",
42986
+ optional: true
42987
+ }],
42988
+ "pipelineAnalytics.listEventKinds": [{
42989
+ name: "deviceId",
42990
+ form: "single",
42991
+ optional: false
42992
+ }],
42993
+ "pipelineAnalytics.listEventKindsBatch": [{
42994
+ name: "deviceIds",
42995
+ form: "array",
42996
+ optional: false
42997
+ }],
42998
+ "pipelineAnalytics.listOpsLog": [{
42999
+ name: "deviceId",
43000
+ form: "single",
43001
+ optional: true
43002
+ }],
43003
+ "pipelineAnalytics.listRecentTracks": [{
43004
+ name: "deviceIds",
43005
+ form: "array",
43006
+ optional: false
43007
+ }],
43008
+ "pipelineAnalytics.listRetrainStaging": [{
43009
+ name: "deviceIds",
43010
+ form: "array",
43011
+ optional: true
43012
+ }],
43013
+ "pipelineAnalytics.listTrackMedia": [{
43014
+ name: "deviceId",
43015
+ form: "single",
43016
+ optional: false
43017
+ }],
43018
+ "pipelineAnalytics.listTracks": [{
43019
+ name: "deviceId",
43020
+ form: "single",
43021
+ optional: false
43022
+ }],
43023
+ "pipelineAnalytics.proposeRetrainAnnotations": [{
43024
+ name: "deviceId",
43025
+ form: "single",
43026
+ optional: false
43027
+ }],
43028
+ "pipelineAnalytics.pruneEventsBefore": [{
43029
+ name: "deviceId",
43030
+ form: "single",
43031
+ optional: false
43032
+ }],
43033
+ "pipelineAnalytics.pruneTracksBefore": [{
43034
+ name: "deviceId",
43035
+ form: "single",
43036
+ optional: false
43037
+ }],
43038
+ "pipelineAnalytics.rebuildObjectEmbeddings": [{
43039
+ name: "deviceId",
43040
+ form: "single",
43041
+ optional: true
43042
+ }],
43043
+ "pipelineAnalytics.restageRetrainTrack": [{
43044
+ name: "deviceId",
43045
+ form: "single",
43046
+ optional: false
43047
+ }],
43048
+ "pipelineAnalytics.saveRetrainAnnotations": [{
43049
+ name: "deviceId",
43050
+ form: "single",
43051
+ optional: false
43052
+ }],
43053
+ "pipelineAnalytics.searchObjectEvents": [{
43054
+ name: "deviceId",
43055
+ form: "single",
43056
+ optional: true
43057
+ }],
43058
+ "pipelineAnalytics.selectRetrainFrames": [{
43059
+ name: "deviceId",
43060
+ form: "single",
43061
+ optional: false
43062
+ }],
43063
+ "pipelineAnalytics.setTrackFlags": [{
43064
+ name: "deviceId",
43065
+ form: "single",
43066
+ optional: false
43067
+ }],
43068
+ "pipelineAnalytics.wipeAllAnalytics": [{
43069
+ name: "deviceId",
43070
+ form: "single",
43071
+ optional: false
43072
+ }],
43073
+ "pipelineExecutor.runPipeline": [{
43074
+ name: "deviceId",
43075
+ form: "single",
43076
+ optional: true
43077
+ }],
43078
+ "pipelineExecutor.runPipelineBatch": [{
43079
+ name: "deviceId",
43080
+ form: "single",
43081
+ optional: true
43082
+ }],
43083
+ "pipelineOrchestrator.assignAudio": [{
43084
+ name: "deviceId",
43085
+ form: "single",
43086
+ optional: false
43087
+ }],
43088
+ "pipelineOrchestrator.assignPipeline": [{
43089
+ name: "deviceId",
43090
+ form: "single",
43091
+ optional: false
43092
+ }],
43093
+ "pipelineOrchestrator.getAudioAssignment": [{
43094
+ name: "deviceId",
43095
+ form: "single",
43096
+ optional: false
43097
+ }],
43098
+ "pipelineOrchestrator.getCameraMetrics": [{
43099
+ name: "deviceId",
43100
+ form: "single",
43101
+ optional: false
43102
+ }],
43103
+ "pipelineOrchestrator.getCameraSettings": [{
43104
+ name: "deviceId",
43105
+ form: "single",
43106
+ optional: false
43107
+ }],
43108
+ "pipelineOrchestrator.getCameraStatus": [{
43109
+ name: "deviceId",
43110
+ form: "single",
43111
+ optional: false
43112
+ }],
43113
+ "pipelineOrchestrator.getCameraStatuses": [{
43114
+ name: "deviceIds",
43115
+ form: "array",
43116
+ optional: true
43117
+ }],
43118
+ "pipelineOrchestrator.getCameraStepOverrides": [{
43119
+ name: "deviceId",
43120
+ form: "single",
43121
+ optional: false
43122
+ }],
43123
+ "pipelineOrchestrator.getCameraSwitches": [{
43124
+ name: "deviceId",
43125
+ form: "single",
43126
+ optional: false
43127
+ }],
43128
+ "pipelineOrchestrator.getPipelineAssignment": [{
43129
+ name: "deviceId",
43130
+ form: "single",
43131
+ optional: false
43132
+ }],
43133
+ "pipelineOrchestrator.getPipelineDevicePin": [{
43134
+ name: "deviceId",
43135
+ form: "single",
43136
+ optional: false
43137
+ }],
43138
+ "pipelineOrchestrator.resolvePipeline": [{
43139
+ name: "deviceId",
43140
+ form: "single",
43141
+ optional: false
43142
+ }],
43143
+ "pipelineOrchestrator.setCameraPipelineForAgent": [{
43144
+ name: "deviceId",
43145
+ form: "single",
43146
+ optional: false
43147
+ }],
43148
+ "pipelineOrchestrator.setCameraStepOverride": [{
43149
+ name: "deviceId",
43150
+ form: "single",
43151
+ optional: false
43152
+ }],
43153
+ "pipelineOrchestrator.setCameraStepToggle": [{
43154
+ name: "deviceId",
43155
+ form: "single",
43156
+ optional: false
43157
+ }],
43158
+ "pipelineOrchestrator.setCameraSwitch": [{
43159
+ name: "deviceId",
43160
+ form: "single",
43161
+ optional: false
43162
+ }],
43163
+ "pipelineOrchestrator.setPipelineDevicePin": [{
43164
+ name: "deviceId",
43165
+ form: "single",
43166
+ optional: false
43167
+ }],
43168
+ "pipelineOrchestrator.unassignAudio": [{
43169
+ name: "deviceId",
43170
+ form: "single",
43171
+ optional: false
43172
+ }],
43173
+ "pipelineOrchestrator.unassignPipeline": [{
43174
+ name: "deviceId",
43175
+ form: "single",
43176
+ optional: false
43177
+ }],
43178
+ "pipelineRunner.attachCamera": [{
43179
+ name: "deviceId",
43180
+ form: "single",
43181
+ optional: false
43182
+ }],
43183
+ "pipelineRunner.detachCamera": [{
43184
+ name: "deviceId",
43185
+ form: "single",
43186
+ optional: false
43187
+ }],
43188
+ "pipelineRunner.getCameraMetrics": [{
43189
+ name: "deviceId",
43190
+ form: "single",
43191
+ optional: false
43192
+ }],
43193
+ "pipelineRunner.reportMotion": [{
43194
+ name: "deviceId",
43195
+ form: "single",
43196
+ optional: false
43197
+ }],
43198
+ "pipelineRunner.runDetailSubtree": [{
43199
+ name: "deviceId",
43200
+ form: "single",
43201
+ optional: false
43202
+ }],
43203
+ "pipelineRunner.runStatelessStep": [{
43204
+ name: "sourceDeviceId",
43205
+ form: "single",
43206
+ optional: false
43207
+ }],
43208
+ "plateGallery.getPlateByTrack": [{
43209
+ name: "deviceId",
43210
+ form: "single",
43211
+ optional: false
43212
+ }],
43213
+ "plateGallery.listPlates": [{
43214
+ name: "deviceId",
43215
+ form: "single",
43216
+ optional: true
43217
+ }],
43218
+ "privacyMask.getOptions": [{
43219
+ name: "deviceId",
43220
+ form: "single",
43221
+ optional: false
43222
+ }],
43223
+ "privacyMask.setAudioEnabled": [{
43224
+ name: "deviceId",
43225
+ form: "single",
43226
+ optional: false
43227
+ }],
43228
+ "privacyMask.setMask": [{
43229
+ name: "deviceId",
43230
+ form: "single",
43231
+ optional: false
43232
+ }],
43233
+ "ptz.continuousMove": [{
43234
+ name: "deviceId",
43235
+ form: "single",
43236
+ optional: false
43237
+ }],
43238
+ "ptz.deletePreset": [{
43239
+ name: "deviceId",
43240
+ form: "single",
43241
+ optional: false
43242
+ }],
43243
+ "ptz.getOptions": [{
43244
+ name: "deviceId",
43245
+ form: "single",
43246
+ optional: false
43247
+ }],
43248
+ "ptz.getPosition": [{
43249
+ name: "deviceId",
43250
+ form: "single",
43251
+ optional: false
43252
+ }],
43253
+ "ptz.getPresets": [{
43254
+ name: "deviceId",
43255
+ form: "single",
43256
+ optional: false
43257
+ }],
43258
+ "ptz.goHome": [{
43259
+ name: "deviceId",
43260
+ form: "single",
43261
+ optional: false
43262
+ }],
43263
+ "ptz.goToPreset": [{
43264
+ name: "deviceId",
43265
+ form: "single",
43266
+ optional: false
43267
+ }],
43268
+ "ptz.move": [{
43269
+ name: "deviceId",
43270
+ form: "single",
43271
+ optional: false
43272
+ }],
43273
+ "ptz.savePreset": [{
43274
+ name: "deviceId",
43275
+ form: "single",
43276
+ optional: false
43277
+ }],
43278
+ "ptz.setAutofocus": [{
43279
+ name: "deviceId",
43280
+ form: "single",
43281
+ optional: false
43282
+ }],
43283
+ "ptz.stop": [{
43284
+ name: "deviceId",
43285
+ form: "single",
43286
+ optional: false
43287
+ }],
43288
+ "ptzAutotrack.getSettings": [{
43289
+ name: "deviceId",
43290
+ form: "single",
43291
+ optional: false
43292
+ }],
43293
+ "ptzAutotrack.getStatus": [{
43294
+ name: "deviceId",
43295
+ form: "single",
43296
+ optional: false
43297
+ }],
43298
+ "ptzAutotrack.setEnabled": [{
43299
+ name: "deviceId",
43300
+ form: "single",
43301
+ optional: false
43302
+ }],
43303
+ "ptzAutotrack.setSettings": [{
43304
+ name: "deviceId",
43305
+ form: "single",
43306
+ optional: false
43307
+ }],
43308
+ "reboot.reboot": [{
43309
+ name: "deviceId",
43310
+ form: "single",
43311
+ optional: false
43312
+ }],
43313
+ "recording.deleteFootprint": [{
43314
+ name: "deviceId",
43315
+ form: "single",
43316
+ optional: false
43317
+ }],
43318
+ "recording.getAvailability": [{
43319
+ name: "deviceId",
43320
+ form: "single",
43321
+ optional: false
43322
+ }],
43323
+ "recording.getDaysWithRecordings": [{
43324
+ name: "deviceId",
43325
+ form: "single",
43326
+ optional: false
43327
+ }],
43328
+ "recording.getDeviceConfig": [{
43329
+ name: "deviceId",
43330
+ form: "single",
43331
+ optional: false
43332
+ }],
43333
+ "recording.getPlaybackManifest": [{
43334
+ name: "deviceId",
43335
+ form: "single",
43336
+ optional: false
43337
+ }],
43338
+ "recording.listOpsLog": [{
43339
+ name: "deviceId",
43340
+ form: "single",
43341
+ optional: true
43342
+ }],
43343
+ "recording.locateSegment": [{
43344
+ name: "deviceId",
43345
+ form: "single",
43346
+ optional: false
43347
+ }],
43348
+ "recording.pruneFootage": [{
43349
+ name: "deviceId",
43350
+ form: "single",
43351
+ optional: false
43352
+ }],
43353
+ "recording.readGopBytes": [{
43354
+ name: "deviceId",
43355
+ form: "single",
43356
+ optional: false
43357
+ }],
43358
+ "recording.readSegmentBytes": [{
43359
+ name: "deviceId",
43360
+ form: "single",
43361
+ optional: false
43362
+ }],
43363
+ "recording.relocateFootage": [{
43364
+ name: "deviceId",
43365
+ form: "single",
43366
+ optional: true
43367
+ }],
43368
+ "recording.renderClip": [{
43369
+ name: "deviceId",
43370
+ form: "single",
43371
+ optional: false
43372
+ }],
43373
+ "recording.renderGif": [{
43374
+ name: "deviceId",
43375
+ form: "single",
43376
+ optional: false
43377
+ }],
43378
+ "recording.rescanStorage": [{
43379
+ name: "deviceId",
43380
+ form: "single",
43381
+ optional: false
43382
+ }],
43383
+ "recording.setDeviceConfig": [{
43384
+ name: "deviceId",
43385
+ form: "single",
43386
+ optional: false
43387
+ }],
43388
+ "recording.startStorageMigrationMove": [{
43389
+ name: "deviceId",
43390
+ form: "single",
43391
+ optional: true
43392
+ }],
43393
+ "recordingExport.createExport": [{
43394
+ name: "deviceId",
43395
+ form: "single",
43396
+ optional: false
43397
+ }],
43398
+ "recordingExport.listExports": [{
43399
+ name: "deviceId",
43400
+ form: "single",
43401
+ optional: true
43402
+ }],
43403
+ "sceneMonitor.captureReference": [{
43404
+ name: "deviceId",
43405
+ form: "single",
43406
+ optional: false
43407
+ }],
43408
+ "sceneMonitor.createScene": [{
43409
+ name: "deviceId",
43410
+ form: "single",
43411
+ optional: false
43412
+ }],
43413
+ "sceneMonitor.deleteReference": [{
43414
+ name: "deviceId",
43415
+ form: "single",
43416
+ optional: false
43417
+ }],
43418
+ "sceneMonitor.deleteScene": [{
43419
+ name: "deviceId",
43420
+ form: "single",
43421
+ optional: false
43422
+ }],
43423
+ "sceneMonitor.listScenes": [{
43424
+ name: "deviceId",
43425
+ form: "single",
43426
+ optional: false
43427
+ }],
43428
+ "sceneMonitor.recheckNow": [{
43429
+ name: "deviceId",
43430
+ form: "single",
43431
+ optional: false
43432
+ }],
43433
+ "sceneMonitor.resetScene": [{
43434
+ name: "deviceId",
43435
+ form: "single",
43436
+ optional: false
43437
+ }],
43438
+ "sceneMonitor.updateScene": [{
43439
+ name: "deviceId",
43440
+ form: "single",
43441
+ optional: false
43442
+ }],
43443
+ "scriptRunner.run": [{
43444
+ name: "deviceId",
43445
+ form: "single",
43446
+ optional: false
43447
+ }],
43448
+ "scriptRunner.stop": [{
43449
+ name: "deviceId",
43450
+ form: "single",
43451
+ optional: false
43452
+ }],
43453
+ "snapshot.getDebugState": [{
43454
+ name: "deviceId",
43455
+ form: "single",
43456
+ optional: false
43457
+ }],
43458
+ "snapshot.getSnapshot": [{
43459
+ name: "deviceId",
43460
+ form: "single",
43461
+ optional: false
43462
+ }],
43463
+ "snapshot.getSnapshotLinks": [{
43464
+ name: "targets",
43465
+ form: "object-array",
43466
+ optional: false,
43467
+ itemField: "deviceId"
43468
+ }],
43469
+ "snapshot.getSnapshotOverview": [{
43470
+ name: "deviceIds",
43471
+ form: "array",
43472
+ optional: false
43473
+ }],
43474
+ "snapshot.invalidateCache": [{
43475
+ name: "deviceId",
43476
+ form: "single",
43477
+ optional: false
43478
+ }],
43479
+ "streamBroker.acquireEgressTranscode": [{
43480
+ name: "deviceId",
43481
+ form: "single",
43482
+ optional: false
43483
+ }],
43484
+ "streamBroker.assignProfile": [{
43485
+ name: "deviceId",
43486
+ form: "single",
43487
+ optional: false
43488
+ }],
43489
+ "streamBroker.getDeviceAudioMute": [{
43490
+ name: "deviceId",
43491
+ form: "single",
43492
+ optional: false
43493
+ }],
43494
+ "streamBroker.getStreamWithCodec": [{
43495
+ name: "deviceId",
43496
+ form: "single",
43497
+ optional: false
43498
+ }],
43499
+ "streamBroker.produceEventMedia": [{
43500
+ name: "deviceId",
43501
+ form: "single",
43502
+ optional: false
43503
+ }],
43504
+ "streamBroker.publishCameraStream": [{
43505
+ name: "deviceId",
43506
+ form: "single",
43507
+ optional: false
43508
+ }],
43509
+ "streamBroker.renderPreBufferClip": [{
43510
+ name: "deviceId",
43511
+ form: "single",
43512
+ optional: false
43513
+ }],
43514
+ "streamBroker.restartProfile": [{
43515
+ name: "deviceId",
43516
+ form: "single",
43517
+ optional: false
43518
+ }],
43519
+ "streamBroker.retractCameraStream": [{
43520
+ name: "deviceId",
43521
+ form: "single",
43522
+ optional: false
43523
+ }],
43524
+ "streamBroker.setDeviceAudioMute": [{
43525
+ name: "deviceId",
43526
+ form: "single",
43527
+ optional: false
43528
+ }],
43529
+ "streamBroker.unassignProfile": [{
43530
+ name: "deviceId",
43531
+ form: "single",
43532
+ optional: false
43533
+ }],
43534
+ "streamCatalog.getCatalog": [{
43535
+ name: "deviceId",
43536
+ form: "single",
43537
+ optional: false
43538
+ }],
43539
+ "streamParams.getConfigSchema": [{
43540
+ name: "deviceId",
43541
+ form: "single",
43542
+ optional: false
43543
+ }],
43544
+ "streamParams.getOptions": [{
43545
+ name: "deviceId",
43546
+ form: "single",
43547
+ optional: false
43548
+ }],
43549
+ "streamParams.setProfile": [{
43550
+ name: "deviceId",
43551
+ form: "single",
43552
+ optional: false
43553
+ }],
43554
+ "switch.setState": [{
43555
+ name: "deviceId",
43556
+ form: "single",
43557
+ optional: false
43558
+ }],
43559
+ "vacuumControl.locate": [{
43560
+ name: "deviceId",
43561
+ form: "single",
43562
+ optional: false
43563
+ }],
43564
+ "vacuumControl.pause": [{
43565
+ name: "deviceId",
43566
+ form: "single",
43567
+ optional: false
43568
+ }],
43569
+ "vacuumControl.returnToBase": [{
43570
+ name: "deviceId",
43571
+ form: "single",
43572
+ optional: false
43573
+ }],
43574
+ "vacuumControl.setFanSpeed": [{
43575
+ name: "deviceId",
43576
+ form: "single",
43577
+ optional: false
43578
+ }],
43579
+ "vacuumControl.start": [{
43580
+ name: "deviceId",
43581
+ form: "single",
43582
+ optional: false
43583
+ }],
43584
+ "vacuumControl.stop": [{
43585
+ name: "deviceId",
43586
+ form: "single",
43587
+ optional: false
43588
+ }],
43589
+ "valve.close": [{
43590
+ name: "deviceId",
43591
+ form: "single",
43592
+ optional: false
43593
+ }],
43594
+ "valve.open": [{
43595
+ name: "deviceId",
43596
+ form: "single",
43597
+ optional: false
43598
+ }],
43599
+ "valve.setPosition": [{
43600
+ name: "deviceId",
43601
+ form: "single",
43602
+ optional: false
43603
+ }],
43604
+ "valve.stop": [{
43605
+ name: "deviceId",
43606
+ form: "single",
43607
+ optional: false
43608
+ }],
43609
+ "videoclips.getClipPlayback": [{
43610
+ name: "deviceId",
43611
+ form: "single",
43612
+ optional: false
43613
+ }],
43614
+ "videoclips.listClips": [{
43615
+ name: "deviceId",
43616
+ form: "single",
43617
+ optional: false
43618
+ }],
43619
+ "waterHeater.setAway": [{
43620
+ name: "deviceId",
43621
+ form: "single",
43622
+ optional: false
43623
+ }],
43624
+ "waterHeater.setOperationMode": [{
43625
+ name: "deviceId",
43626
+ form: "single",
43627
+ optional: false
43628
+ }],
43629
+ "waterHeater.setTargetTemp": [{
43630
+ name: "deviceId",
43631
+ form: "single",
43632
+ optional: false
43633
+ }],
43634
+ "webrtcSession.addIceCandidate": [{
43635
+ name: "deviceId",
43636
+ form: "single",
43637
+ optional: false
43638
+ }],
43639
+ "webrtcSession.closeSession": [{
43640
+ name: "deviceId",
43641
+ form: "single",
43642
+ optional: false
43643
+ }],
43644
+ "webrtcSession.createSession": [{
43645
+ name: "deviceId",
43646
+ form: "single",
43647
+ optional: false
43648
+ }],
43649
+ "webrtcSession.getIceCandidates": [{
43650
+ name: "deviceId",
43651
+ form: "single",
43652
+ optional: false
43653
+ }],
43654
+ "webrtcSession.getSessionState": [{
43655
+ name: "deviceId",
43656
+ form: "single",
43657
+ optional: false
43658
+ }],
43659
+ "webrtcSession.handleAnswer": [{
43660
+ name: "deviceId",
43661
+ form: "single",
43662
+ optional: false
43663
+ }],
43664
+ "webrtcSession.handleOffer": [{
43665
+ name: "deviceId",
43666
+ form: "single",
43667
+ optional: false
43668
+ }],
43669
+ "webrtcSession.hasAdaptiveBitrate": [{
43670
+ name: "deviceId",
43671
+ form: "single",
43672
+ optional: false
43673
+ }],
43674
+ "webrtcSession.listStreams": [{
43675
+ name: "deviceId",
43676
+ form: "single",
43677
+ optional: false
43678
+ }],
43679
+ "zoneAnalytics.getCameraHistory": [{
43680
+ name: "deviceId",
43681
+ form: "single",
43682
+ optional: false
43683
+ }],
43684
+ "zoneAnalytics.getCurrentSnapshot": [{
43685
+ name: "deviceId",
43686
+ form: "single",
43687
+ optional: false
43688
+ }],
43689
+ "zoneAnalytics.getUnzonedHistory": [{
43690
+ name: "deviceId",
43691
+ form: "single",
43692
+ optional: false
43693
+ }],
43694
+ "zoneAnalytics.getZoneHistory": [{
43695
+ name: "deviceId",
43696
+ form: "single",
43697
+ optional: false
43698
+ }],
43699
+ "zoneRules.listRules": [{
43700
+ name: "deviceId",
43701
+ form: "single",
43702
+ optional: false
43703
+ }],
43704
+ "zoneRules.setRules": [{
43705
+ name: "deviceId",
43706
+ form: "single",
43707
+ optional: false
43708
+ }],
43709
+ "zones.addZone": [{
43710
+ name: "deviceId",
43711
+ form: "single",
43712
+ optional: false
43713
+ }],
43714
+ "zones.listZones": [{
43715
+ name: "deviceId",
43716
+ form: "single",
43717
+ optional: false
43718
+ }],
43719
+ "zones.removeZone": [{
43720
+ name: "deviceId",
43721
+ form: "single",
43722
+ optional: false
43723
+ }],
43724
+ "zones.updateZone": [{
43725
+ name: "deviceId",
43726
+ form: "single",
43727
+ optional: false
43728
+ }]
43729
+ });
41235
43730
  var CAP_PROVIDER_KIND_MAP = Object.freeze({
41236
43731
  "broker": "broker",
41237
43732
  "device-export": "device-export",