@camstack/addon-osd-manager 0.1.129 → 0.1.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. package/dist/{MotionZonesSettings-DWuVSEf5.mjs → MotionZonesSettings-BEiIAXxX.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-BWVHTm06.mjs → PrivacyMaskSettings-CvIg_072.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-XJsu4mm2.mjs → SceneMonitorEditor-JZwBd1Jv.mjs} +3 -3
  4. package/dist/_stub.js +128 -128
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-b-sE7-_3.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-NFf3Y4nO.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D23J0_pM.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-B0SRpKdK.mjs → hostInit-CwDM2suA.mjs} +2 -2
  9. package/dist/index.js +2618 -3
  10. package/dist/index.mjs +2618 -3
  11. package/dist/{player-overlays-DzUl-ZVZ.mjs → player-overlays-9RdwSS8n.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-VLKmeNms.mjs → responsive-DOUWrPJ-.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-BKF6KEsb.mjs → scene-monitor-copy-Cr8ZNK1p.mjs} +1 -1
  15. package/dist/{square-CWIOFtEA.mjs → square-DLZPuHya.mjs} +1 -1
  16. package/dist/{trash-2-Dk1s3AVe.mjs → trash-2-DE6KKFYA.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-DqvD2BGa.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-8Z1DwgHL.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B9U0FY5V.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -5359,7 +5359,7 @@ var ZodIssueCode = {
5359
5359
  var ZodFirstPartyTypeKind;
5360
5360
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5361
5361
  //#endregion
5362
- //#region ../types/dist/sleep-BVhJDJka.mjs
5362
+ //#region ../types/dist/sleep-i3eUVc-d.mjs
5363
5363
  /**
5364
5364
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5365
5365
  * window to float samples (D455).
@@ -7878,10 +7878,20 @@ var CameraSwitchAuthoritySchema = discriminatedUnion("kind", [
7878
7878
  var CameraSwitchUnavailableReasonSchema = _enum([
7879
7879
  "no-provider",
7880
7880
  "source-unreachable",
7881
- "not-configured",
7882
7881
  "device-disabled"
7883
7882
  ]);
7884
7883
  /**
7884
+ * Something true about a switch that is nonetheless OFFERED.
7885
+ *
7886
+ * The distinction from {@link CameraSwitchUnavailableReasonSchema} is the
7887
+ * whole point: a reason replaces the control, a warning travels WITH it. The
7888
+ * privacy mask taught us the difference — greying the one button that starts
7889
+ * the feature teaches the operator the feature is broken, while a live toggle
7890
+ * that flips nothing teaches them the switch is broken. Neither is true; the
7891
+ * honest surface is a working toggle that says what is missing.
7892
+ */
7893
+ var CameraSwitchWarningSchema = _enum(["no-privacy-zones"]);
7894
+ /**
7885
7895
  * One switch, resolved for one camera.
7886
7896
  *
7887
7897
  * `label` and `costWhenOff` travel ON THE WIRE rather than being looked up
@@ -7900,6 +7910,11 @@ var CameraSwitchSchema = object({
7900
7910
  /** False = do not render a control. `unavailableReason` says why. */
7901
7911
  available: boolean(),
7902
7912
  unavailableReason: CameraSwitchUnavailableReasonSchema.optional(),
7913
+ /**
7914
+ * Present on an AVAILABLE switch only. Rendered beside the live control;
7915
+ * never a substitute for one.
7916
+ */
7917
+ warning: CameraSwitchWarningSchema.optional(),
7903
7918
  /** Current state. Meaningless when `available` is false — read it as `true`. */
7904
7919
  enabled: boolean(),
7905
7920
  authority: CameraSwitchAuthoritySchema
@@ -14663,6 +14678,118 @@ var deviceAdoptionCapability = {
14663
14678
  }
14664
14679
  };
14665
14680
  /**
14681
+ * device-admin-link — "this device has a management page of its own, and here
14682
+ * is its address".
14683
+ *
14684
+ * ## Why this is not a `deviceConfig` cap
14685
+ *
14686
+ * There is nothing to edit. A `deviceConfig` cap (D14) exists so the framework
14687
+ * can DERIVE a settings form from `getOptions` + `getStatus` and route a flat
14688
+ * patch back through a setter; it costs a `builderId` reducer in
14689
+ * `device-config-contribution.ts` and a `*-config-schema.ts` beside it, and it
14690
+ * renders a form section. This cap answers ONE question with ONE read and
14691
+ * renders a button. Nothing about it is a form, so it carries no `deviceConfig`
14692
+ * block, no `settings`, no `runtimeState` and no reducer — exactly like
14693
+ * `reboot`, the other pure-RPC device-native cap.
14694
+ *
14695
+ * ## Absent, and the difference between "no page" and "we cannot say"
14696
+ *
14697
+ * The two are answered at DIFFERENT layers, on purpose:
14698
+ *
14699
+ * - **"We cannot say"** → the provider never registers the cap for that
14700
+ * device. A VeSync humidifier, a Petkit feeder, a Dreame vacuum and a Dreo
14701
+ * fan are reached only through a vendor cloud; there is no address to hand
14702
+ * out and no page to open. A Tuya plug, a Wyze camera and a Gree air
14703
+ * conditioner DO have a LAN IP, and still have no HTTP management page
14704
+ * behind it. None of them register, so `deviceManager.getBindings` never
14705
+ * lists the cap and no surface asks.
14706
+ * - **"This device has no page, and I know that"** → the provider registers
14707
+ * and `getAdminLink` returns `null`. This is the answer for a device whose
14708
+ * sibling DOES have a page: a Reolink battery camera reached over UDP by
14709
+ * `uid` with a blank `host`, an Ecowitt gateway configured in `listener`
14710
+ * transport, a Home Assistant broker authenticated by supervisor token
14711
+ * (which carries no `baseUrl` at all).
14712
+ *
14713
+ * Both draw NOTHING. A button that opens a browser error is worse than no
14714
+ * button, and D62 is the same rule from the other side: an off switch is
14715
+ * reported off, never made to look broken. There is no third state where the
14716
+ * UI renders a disabled button "because the device might have a page".
14717
+ *
14718
+ * ## The URL never carries credentials
14719
+ *
14720
+ * Not in userinfo, not in a query string. Every provider builds through
14721
+ * `buildDeviceAdminUrl` (`device-admin-link-url.ts`), which takes host, port,
14722
+ * scheme and path as separate arguments — there is no parameter a secret could
14723
+ * arrive in — and re-checks its own output for the `scheme://user:pass@` shape
14724
+ * that `scripts/check-no-credential-urls-in-fixtures.ts` bans from recorded
14725
+ * output. `scripts/check-admin-link-builder-is-the-only-url-source.ts` is what
14726
+ * keeps providers from hand-rolling one anyway.
14727
+ *
14728
+ * This matters here more than anywhere else in the repo, because every provider
14729
+ * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14730
+ * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14731
+ * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
14732
+ * camera's own page will ask for its own login. That is correct, and pre-
14733
+ * filling it is the operator's business, not ours.
14734
+ *
14735
+ * ## It is a LAN fact
14736
+ *
14737
+ * The URL addresses the device where the NODE can see it. It is not proxied,
14738
+ * not made reachable from outside, and not sent anywhere. A surface renders it
14739
+ * as a link the operator's own browser follows, on the operator's own network,
14740
+ * or renders nothing.
14741
+ */
14742
+ /**
14743
+ * Whose page is it. The distinction is for the OPERATOR, who needs to know
14744
+ * before clicking whether he is about to land on a camera's own web server or
14745
+ * inside Home Assistant.
14746
+ */
14747
+ var AdminLinkTargetEnum = _enum(["device", "integration"]);
14748
+ var DeviceAdminLinkSchema = object({
14749
+ /**
14750
+ * Absolute `http(s)://` URL. Built by `buildDeviceAdminUrl` and therefore
14751
+ * free of userinfo and of any credential-shaped query key.
14752
+ */
14753
+ url: string(),
14754
+ /**
14755
+ * What the surface calls it — "Web UI", "Home Assistant", "UniFi controller".
14756
+ * The PROVIDER names it, because only the provider knows what the page is;
14757
+ * a UI that invented the label from the addon id would call the Home
14758
+ * Assistant device page "Provider Homeassistant".
14759
+ */
14760
+ label: string(),
14761
+ target: AdminLinkTargetEnum,
14762
+ /**
14763
+ * Host the URL points at, without scheme, port or path — for the tooltip, so
14764
+ * an operator can see WHERE the button goes before he follows it. Redundant
14765
+ * with `url` by construction; carried separately so no surface has to parse
14766
+ * a URL to show it.
14767
+ */
14768
+ host: string()
14769
+ });
14770
+ var deviceAdminLinkCapability = {
14771
+ name: "device-admin-link",
14772
+ scope: "device",
14773
+ deviceNative: true,
14774
+ mode: "singleton",
14775
+ methods: {
14776
+ /**
14777
+ * The device's management page, or `null` when this device has none.
14778
+ *
14779
+ * `auth: 'admin'` deliberately. This is administration, not actuation —
14780
+ * the same bucket as `reboot` and `camera-credentials`, and explicitly NOT
14781
+ * the actuation set `scripts/check-actuation-not-admin.ts` protects (D403).
14782
+ * The URL is also a statement about the LAN, which a household member with
14783
+ * a `view` grant on a light has no reason to be handed.
14784
+ *
14785
+ * The surfaces gate on the QUERY, never on a role they guessed: a caller
14786
+ * without the right loses the query and draws nothing, which is the same
14787
+ * thing a device with no page draws. There is no path on which a button
14788
+ * appears and then fails — the D403 failure mode, from the other end.
14789
+ */
14790
+ getAdminLink: method(object({ deviceId: number().int().nonnegative() }), DeviceAdminLinkSchema.nullable(), { auth: "admin" }) }
14791
+ };
14792
+ /**
14666
14793
  * `device-export` — collection cap for addons that export camstack
14667
14794
  * devices to external ecosystems (HomeAssistant via MQTT discovery,
14668
14795
  * HomeKit/HAP, Alexa Smart Home, …).
@@ -29278,6 +29405,82 @@ var ClipBytesSchema = object({
29278
29405
  */
29279
29406
  durationMs: number().positive().optional()
29280
29407
  });
29408
+ /**
29409
+ * Where a clip's STREAM can be dialled (D597) — the answer to
29410
+ * {@link videoclipsCapability.methods.dialClipStream}.
29411
+ *
29412
+ * `url` is plain `http://` on the provider's own token-gated listener, one
29413
+ * shot, short-lived. It is NOT the hub-proxied `/addon/<id>/clip-stream/…`
29414
+ * path: that plane takes only a user credential, which an addon does not
29415
+ * hold, and the framework offers no addon→addon byte transport — the one
29416
+ * precedent is the broker's own restream URLs (`getStreamWithCodec`), which
29417
+ * a consumer dials directly, and this is that precedent one addon over.
29418
+ */
29419
+ /**
29420
+ * The audio a clip stream can be asked for, and the audio it carries.
29421
+ *
29422
+ * The camera stores AAC and no WebRTC session speaks it, so a stream that
29423
+ * carries sound carries it TRANSCODED, muxed as a second track beside the
29424
+ * video by the one ffmpeg the provider already runs (D600). `opus` is
29425
+ * 48 kHz mono, `pcmu` is 8 kHz µ-law — the two codecs a broker session
29426
+ * negotiates — and `none` is a stream asked for, or served, without sound.
29427
+ */
29428
+ var ClipStreamAudioSchema = _enum([
29429
+ "opus",
29430
+ "pcmu",
29431
+ "none"
29432
+ ]);
29433
+ /**
29434
+ * Why a stream that was ASKED for sound is not carrying it (D600).
29435
+ *
29436
+ * Only ever set beside `servedAudio: 'none'` after a non-`none` ask. Absent
29437
+ * means the ask was honoured, or there was no ask.
29438
+ *
29439
+ * - `not-requested` — the caller asked for `none`.
29440
+ * - `unsupported-ask` — the provider cannot produce that codec.
29441
+ *
29442
+ * Whether the RECORDING has sound at all is not knowable here: the camera
29443
+ * declares no audio track before its first frame arrives. That answer is in
29444
+ * the stream itself — an fMP4 with no audio track — and the broker reads it
29445
+ * there. A dial that says `opus` promises the codec, never the content.
29446
+ */
29447
+ var ClipStreamAudioReasonSchema = _enum(["not-requested", "unsupported-ask"]);
29448
+ var ClipStreamDialSchema = object({
29449
+ url: string().min(1),
29450
+ /** After this the token is gone and the URL answers 404 `dial-expired`. */
29451
+ expiresAtMs: number(),
29452
+ /** What the stream IS — a consumer that cannot honour it must not dial. */
29453
+ transport: literal("forward-only"),
29454
+ /**
29455
+ * Which twin the stream ACTUALLY carries — not what was asked for.
29456
+ *
29457
+ * The stream serves every profile (D599), and a recording whose main twin
29458
+ * does not exist is streamed as its sub copy, which this field reports as
29459
+ * `low`. That is the whole reason the dial no longer refuses `high`:
29460
+ * stating what was served is what makes accepting honest, where a silent
29461
+ * substitution would be the 33x lie D576 forbids. Stated rather than
29462
+ * assumed, the way {@link ClipPlaybackSchema.served} is (D549 15).
29463
+ */
29464
+ served: CamProfileSchema,
29465
+ /**
29466
+ * Which audio the stream will ACTUALLY carry — `served`'s companion for
29467
+ * sound, and the same reasoning (D599, D600).
29468
+ *
29469
+ * The broker asks for the codec its WebRTC session negotiated, and the
29470
+ * provider either muxes that codec or carries none. Stating it is what
29471
+ * lets the broker wire the matching sink before the first byte, and what
29472
+ * keeps a session from being handed a codec it cannot send — the audio
29473
+ * shape of the substitution `served` exists to prevent.
29474
+ *
29475
+ * It is a promise about the CODEC, not about the content: a recording with
29476
+ * no microphone track answers `opus` here and then arrives with no audio
29477
+ * track at all. That second answer is in the stream, and the broker reads
29478
+ * it from the `moov`.
29479
+ */
29480
+ servedAudio: ClipStreamAudioSchema,
29481
+ /** Why `servedAudio` is `none` although sound was asked for. */
29482
+ audioReason: ClipStreamAudioReasonSchema.optional()
29483
+ });
29281
29484
  var ClipSourceAvailabilitySchema = object({
29282
29485
  state: _enum([
29283
29486
  "ok",
@@ -29488,6 +29691,23 @@ var videoclipsCapability = {
29488
29691
  deviceId: number(),
29489
29692
  clipId: string().min(1),
29490
29693
  /**
29694
+ * WHICH provider holds the bytes — the `addonId` a
29695
+ * {@link ClipSourceSchema} row carries. **Required**, for the reason
29696
+ * `listClips` states one method above and for a second one this method
29697
+ * learned the hard way.
29698
+ *
29699
+ * The caller is the stream broker, and the broker lives in
29700
+ * `addon-pipeline` — the same addon that registers the RECORDER's
29701
+ * videoclips provider. With no provider named, the in-process
29702
+ * resolution handed it its own sibling, which implements this method
29703
+ * solely to explain that an analytics visit has no file behind it. So
29704
+ * every onboard clip answered with that sentence, a flash of video and
29705
+ * nothing more, while the SAME call from outside the addon reached the
29706
+ * right provider and returned the bytes (measured on 3628,
29707
+ * 2026-09-21).
29708
+ */
29709
+ provider: string().min(1),
29710
+ /**
29491
29711
  * Which twin to fetch, on the mapping D549 15 already fixed:
29492
29712
  * `low | mid` → the sub file, `high` → the main twin. `auto` is not
29493
29713
  * accepted here for the same reason it is not accepted by
@@ -29511,6 +29731,44 @@ var videoclipsCapability = {
29511
29731
  }), ClipBytesSchema, {
29512
29732
  kind: "query",
29513
29733
  auth: "protected"
29734
+ }),
29735
+ /**
29736
+ * Where this clip's STREAM can be dialled (D597) — the forward-only
29737
+ * fMP4 the provider writes from the first muxed byte, for the broker to
29738
+ * play through the same WebRTC session as recorded footage, with the
29739
+ * first frame at the first fragment instead of after the last byte.
29740
+ *
29741
+ * Nothing is fetched here: the answer is a one-shot URL on the
29742
+ * provider's own listener, and the camera is touched when it is dialled.
29743
+ * The gates the file path runs (`readClipBytes`) run on the dial too —
29744
+ * the id, the row, a clip still being written — and refuse in the same
29745
+ * vocabulary, THROWN with `clipExportFailure(<token>, <prose>)`. Every
29746
+ * profile is served (D599) and the answer states which twin it carries;
29747
+ * `high` is not refused. Optional on the provider for the same reason
29748
+ * `readClipBytes` is: a source with no camera socket behind it (the
29749
+ * recorder's analytics window, a HomeKit tee) has no stream.
29750
+ */
29751
+ dialClipStream: optionalMethod(object({
29752
+ deviceId: number(),
29753
+ clipId: string().min(1),
29754
+ /** WHICH provider holds the camera — see `readClipBytes.provider`. */
29755
+ provider: string().min(1),
29756
+ /** Which twin — `high` → the main file, everything else the sub (D599). */
29757
+ profile: CamProfileSchema.optional(),
29758
+ /**
29759
+ * Which audio codec the caller's session negotiated, so the provider
29760
+ * can mux it (D600). The ask travels on the DIAL because the mux is
29761
+ * spawned once, before the first byte, and cannot gain a track later.
29762
+ *
29763
+ * ABSENT IS `none`, never a guess: a caller that does not state an
29764
+ * ask is served the video-only stream that shipped first, so a broker
29765
+ * older than this field keeps working unchanged (D382 — an unstated
29766
+ * ask is zero).
29767
+ */
29768
+ audio: ClipStreamAudioSchema.optional()
29769
+ }), ClipStreamDialSchema, {
29770
+ kind: "query",
29771
+ auth: "protected"
29514
29772
  })
29515
29773
  }
29516
29774
  };
@@ -32057,6 +32315,346 @@ var dayNightCapability = {
32057
32315
  volatileStateFields: ["lastFetchedAt"]
32058
32316
  };
32059
32317
  /**
32318
+ * Vendor-neutral **onboard** recording + storage cap — what the CAMERA
32319
+ * writes to the CAMERA's own card, on the camera's own schedule.
32320
+ *
32321
+ * This is NOT `recording.cap.ts`. That one is CamStack's recorder: our
32322
+ * footage ledger, our storage locations, our retention. This one has a
32323
+ * different authority — the camera's firmware — and per D62 it stores
32324
+ * nothing of its own. Every value here is read from the camera and every
32325
+ * write goes back to the camera; there is no CamStack-side mirror that
32326
+ * could disagree with the device.
32327
+ *
32328
+ * ## One shape, two firmwares
32329
+ *
32330
+ * Measured 2026-09-22 against the live fleet:
32331
+ *
32332
+ * | fact | Hikvision (ISAPI) | Reolink (Baichuan) |
32333
+ * | --- | --- | --- |
32334
+ * | storage | `ContentMgmt/Storage` `<hdd>` rows: status, capacity, freeSpace (MB) | `getHddInfoList` (cmd 102): `mount`, `format`, `capacity` GB + `capacityM` MB remainder |
32335
+ * | tracks | several (101 **and** 103 on both 1436 and 3833), each with its own schedule | one per channel |
32336
+ * | schedule | per track, 7 `ScheduleAction` blocks: DayOfWeek + TimeOfDay range + ONE `ActionRecordingMode` | per trigger type, a 168-char weekly HOUR mask |
32337
+ * | triggers | `CMR`, `MOTION` | `Normal`, `MD`, `people`, `vehicle`, `dog_cat`, `crossline`, `intrude`, `loitering` |
32338
+ * | pre-record | `PreRecordTimeSeconds` | `preRecordTime` |
32339
+ * | post-record | `PostRecordTimeSeconds` | `recordDelayTime` |
32340
+ * | overwrite | per track `LoopEnable` | `cycle`, with `cycleList` enumerating the accepted values |
32341
+ * | segment length | not exposed on V5.7.1 | `packageTime` (minutes) |
32342
+ *
32343
+ * The two schedule models look different and are the same thing in
32344
+ * different coordinates: both answer "for this trigger, during which
32345
+ * weekly windows does the camera record". {@link RecordWindow} is that
32346
+ * question in one shape — Hikvision's ranges map straight onto it,
32347
+ * Reolink's mask expands into hour-aligned windows.
32348
+ *
32349
+ * ## Union, not intersection
32350
+ *
32351
+ * **The same fields exist on every camera.** What differs per device is
32352
+ * which VALUES that device accepts, and that is what {@link
32353
+ * RecordingOnboardOptions} reports — a `{ readable, writable, reason }`
32354
+ * per field plus the schedule's own limits. A control a camera cannot
32355
+ * honour is rendered DISABLED WITH ITS REASON, never missing and never
32356
+ * dead: disabled must not look like broken.
32357
+ *
32358
+ * ## Refusal by name
32359
+ *
32360
+ * A write a camera cannot honour is refused with a sentence the operator
32361
+ * can read — never accepted and dropped. Both providers refuse through
32362
+ * {@link describeOnboardRefusal}, so the vocabulary is one function and
32363
+ * one test, not two hand-written vendor opinions.
32364
+ *
32365
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
32366
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
32367
+ * injected from `status`) reports the live values, and a single
32368
+ * `setSettings` mutation applies a partial change. No hand-written
32369
+ * settings-contribution methods.
32370
+ */
32371
+ /**
32372
+ * What makes the camera start recording during a window.
32373
+ *
32374
+ * The union of both vendors' vocabularies. `continuous` is Hikvision's
32375
+ * `CMR` and Reolink's `Normal`; `motion` is `MOTION` / `MD`. The
32376
+ * object-class triggers are Reolink-only today and the smart-event ones
32377
+ * (`lineCrossing`, `intrusion`, `loitering`) are Reolink-only on the
32378
+ * firmwares measured — a camera that cannot record on a trigger simply
32379
+ * does not list it in `options.schedule.triggers`, and a window naming
32380
+ * it is REFUSED, not dropped.
32381
+ */
32382
+ var RecordTriggerSchema = _enum([
32383
+ "continuous",
32384
+ "motion",
32385
+ "person",
32386
+ "vehicle",
32387
+ "animal",
32388
+ "lineCrossing",
32389
+ "intrusion",
32390
+ "loitering",
32391
+ "alarmInput"
32392
+ ]);
32393
+ /**
32394
+ * One weekly recording window: "on `day`, from `startMinute` to
32395
+ * `endMinute`, record on `trigger`".
32396
+ *
32397
+ * `day` is 0 = Monday … 6 = Sunday (ISO order, which is also the order
32398
+ * both firmwares enumerate). Minutes are local camera time since
32399
+ * midnight; `endMinute` may be 1440, meaning end of day — that is
32400
+ * Hikvision's literal `24:00` and Reolink's 24th mask slot, and
32401
+ * collapsing it to 0 would turn a whole-day window into an empty one.
32402
+ */
32403
+ var RecordWindowSchema = object({
32404
+ trigger: RecordTriggerSchema,
32405
+ day: number().int().min(0).max(6),
32406
+ startMinute: number().int().min(0).max(1439),
32407
+ endMinute: number().int().min(1).max(1440)
32408
+ });
32409
+ /** Status of one physical volume, as the camera itself describes it. */
32410
+ var OnboardStorageVolumeSchema = object({
32411
+ /** The camera's own id for the volume (`hdd/id`, Reolink `HddInfo/number`). */
32412
+ id: string(),
32413
+ /** The camera's own name for it, when it gives one (`hddName`). */
32414
+ label: string().optional(),
32415
+ status: _enum([
32416
+ "ok",
32417
+ "unformatted",
32418
+ "error",
32419
+ "offline",
32420
+ "unknown"
32421
+ ]),
32422
+ /**
32423
+ * Total size in MB, or **null when the camera did not say**.
32424
+ *
32425
+ * Never 0 for an unreadable value: a measurement that failed is not a
32426
+ * measurement (D393), and a card whose size is unknown must not be
32427
+ * rendered as a card of size zero.
32428
+ */
32429
+ capacityMb: number().nullable(),
32430
+ /**
32431
+ * Free space in MB, or null when unknown.
32432
+ *
32433
+ * **Not a proxy for "has footage".** Measured 2026-09-22: 1436 and
32434
+ * 1439 both report exactly 11776 MB free — the fixed reserve a looping
32435
+ * card converges on once it has wrapped. At loop steady state the
32436
+ * number is identical whether the camera recorded yesterday or stopped
32437
+ * a month ago.
32438
+ */
32439
+ freeMb: number().nullable(),
32440
+ /** True when the camera reports the volume writable (`property` RW). */
32441
+ writable: boolean().optional()
32442
+ });
32443
+ /**
32444
+ * What the camera is doing with its own storage, right now.
32445
+ *
32446
+ * Every scalar is nullable and **null means the camera did not answer**,
32447
+ * never a default. A form that seeds `0` from an unanswered read invites
32448
+ * the operator to save that 0 back onto the camera.
32449
+ */
32450
+ var RecordingOnboardStatusSchema = object({
32451
+ storage: discriminatedUnion("kind", [
32452
+ object({
32453
+ kind: literal("present"),
32454
+ volumes: array(OnboardStorageVolumeSchema)
32455
+ }),
32456
+ object({
32457
+ kind: literal("absent"),
32458
+ reason: string()
32459
+ }),
32460
+ object({
32461
+ kind: literal("unknown"),
32462
+ reason: string()
32463
+ })
32464
+ ]),
32465
+ tracks: array(object({
32466
+ id: string(),
32467
+ enabled: boolean(),
32468
+ isVideo: boolean(),
32469
+ /** From the camera's own track description. Null when it does not say. */
32470
+ codec: string().nullable(),
32471
+ resolution: string().nullable(),
32472
+ /** Per-track overwrite flag, where the firmware keeps it per track. */
32473
+ overwriteWhenFull: boolean().nullable()
32474
+ })),
32475
+ /**
32476
+ * The track the write path targets — the enabled VIDEO one. Null when
32477
+ * no track could be identified, which is itself a refusal reason.
32478
+ */
32479
+ primaryTrackId: string().nullable(),
32480
+ /** Master "record to the card at all" switch. */
32481
+ enabled: boolean().nullable(),
32482
+ overwriteWhenFull: boolean().nullable(),
32483
+ preRecordSec: number().nullable(),
32484
+ postRecordSec: number().nullable(),
32485
+ /** Length of one recorded file, in minutes. */
32486
+ segmentMinutes: number().nullable(),
32487
+ /** The primary track's weekly windows, flattened. */
32488
+ windows: array(RecordWindowSchema),
32489
+ /**
32490
+ * How many windows the camera described that CamStack could NOT read —
32491
+ * an unrecognised trigger, an unparseable clock, a weekday it does not
32492
+ * name.
32493
+ *
32494
+ * A dropped window is work the reader threw away, and a schedule that
32495
+ * silently shows fewer rows than the camera holds is how an operator
32496
+ * saves back a schedule shorter than the one they were looking at
32497
+ * (D391). Non-zero means the window list is INCOMPLETE and a write
32498
+ * that replaces it would delete what was not shown — which is why a
32499
+ * provider reporting a non-zero count also reports the schedule as not
32500
+ * writable.
32501
+ */
32502
+ unreadableWindows: number(),
32503
+ /**
32504
+ * The camera is scheduled to record and has NO usable storage.
32505
+ *
32506
+ * A first-class fact because it is the fleet's most common silent
32507
+ * defect: measured 2026-09-22, 1441 and 3831 are both motion-recording
32508
+ * to a card that is not there. Neither the schedule nor the storage
32509
+ * read says anything wrong on its own; only the pair does.
32510
+ */
32511
+ recordingToNowhere: boolean(),
32512
+ lastFetchedAt: number()
32513
+ });
32514
+ /** Numeric range descriptor — `{ min, max, step }` per the getOptions convention. */
32515
+ var RangeSchema = object({
32516
+ min: number(),
32517
+ max: number(),
32518
+ step: number()
32519
+ });
32520
+ /**
32521
+ * The values a camera actually takes for a numeric field, when they are a SET
32522
+ * rather than a range.
32523
+ *
32524
+ * `{min,max,step}` cannot say what these two firmwares do. Measured on 1436
32525
+ * (I91DN) on 2026-09-22 by writing each value and reading it back:
32526
+ *
32527
+ * - pre-record: `0, 5, 10, 15, 20, 25, 30` and `2147483647` (INT32_MAX, the
32528
+ * camera's "no limit" — `-1` and `4294967295` both land on it);
32529
+ * - post-record: `5, 10, 30, 60, 120, 300, 600`.
32530
+ *
32531
+ * Neither is expressible as a step: the first has a sentinel two billion away
32532
+ * from its neighbours, the second doubles and then jumps. A range that tried
32533
+ * would forbid values the camera takes AND permit values it silently replaces
32534
+ * with 5 — wrong in both directions at once.
32535
+ *
32536
+ * `sentinel` names the member that is not a duration, so a surface can render
32537
+ * "no limit" instead of `2147483647` seconds.
32538
+ */
32539
+ var AllowedValuesSchema = object({
32540
+ values: array(number()).min(1),
32541
+ sentinel: object({
32542
+ value: number(),
32543
+ meaning: _enum(["no-limit", "disabled"])
32544
+ }).optional()
32545
+ });
32546
+ /**
32547
+ * Per-field availability on ONE camera.
32548
+ *
32549
+ * The field exists on every camera — this says whether this one can be
32550
+ * read and whether it can be written, and `reason` says why not when
32551
+ * either is false. The UI renders the control DISABLED with the reason
32552
+ * rather than hiding it, so a limitation is legible instead of looking
32553
+ * like a missing feature.
32554
+ */
32555
+ var OnboardFieldSupportSchema = object({
32556
+ readable: boolean(),
32557
+ writable: boolean(),
32558
+ /** Required whenever `readable` or `writable` is false. */
32559
+ reason: string().optional()
32560
+ });
32561
+ /** What this camera's schedule model can express. */
32562
+ var OnboardScheduleSupportSchema = object({
32563
+ support: OnboardFieldSupportSchema,
32564
+ /**
32565
+ * The smallest time step the camera can express, in minutes.
32566
+ *
32567
+ * Hikvision takes arbitrary minutes (`00:05:00`–`23:57:00` observed on
32568
+ * 1436's track 103). Reolink's schedule is a 7×24 HOUR mask, so 60. A
32569
+ * window whose edges are not a multiple of this is REFUSED rather than
32570
+ * quietly rounded — rounding is how an operator's 06:30 becomes 06:00
32571
+ * and nothing says so.
32572
+ */
32573
+ granularityMinutes: number(),
32574
+ /** Triggers this camera can record on. A window naming another is refused. */
32575
+ triggers: array(RecordTriggerSchema),
32576
+ /**
32577
+ * False when the camera stores ONE trigger per time range, so two
32578
+ * windows overlapping on the same day cannot carry different triggers.
32579
+ * True on Reolink, whose mask is per-trigger and independent.
32580
+ */
32581
+ supportsOverlappingTriggers: boolean()
32582
+ });
32583
+ var RecordingOnboardOptionsSchema = object({
32584
+ enabled: OnboardFieldSupportSchema,
32585
+ overwriteWhenFull: OnboardFieldSupportSchema,
32586
+ preRecordSec: OnboardFieldSupportSchema,
32587
+ preRecordSecRange: RangeSchema.optional(),
32588
+ /** Preferred over the range when the camera takes a SET, not a span. */
32589
+ preRecordSecAllowed: AllowedValuesSchema.optional(),
32590
+ postRecordSec: OnboardFieldSupportSchema,
32591
+ postRecordSecRange: RangeSchema.optional(),
32592
+ /** Preferred over the range when the camera takes a SET, not a span. */
32593
+ postRecordSecAllowed: AllowedValuesSchema.optional(),
32594
+ segmentMinutes: OnboardFieldSupportSchema,
32595
+ segmentMinutesRange: RangeSchema.optional(),
32596
+ /** Preferred over the range when the camera takes a SET, not a span. */
32597
+ segmentMinutesAllowed: AllowedValuesSchema.optional(),
32598
+ schedule: OnboardScheduleSupportSchema
32599
+ });
32600
+ /**
32601
+ * A partial change. Every field optional.
32602
+ *
32603
+ * Unlike the other `deviceConfig` caps, a provider here does **NOT**
32604
+ * silently ignore a field it cannot support — it refuses, by name,
32605
+ * through {@link describeOnboardRefusal}. Silence on a recording setting
32606
+ * is the failure D62 exists to prevent: the operator believes the camera
32607
+ * is recording the way the form says, and it is not.
32608
+ */
32609
+ var RecordingOnboardPatchSchema = object({
32610
+ enabled: boolean().optional(),
32611
+ overwriteWhenFull: boolean().optional(),
32612
+ preRecordSec: number().optional(),
32613
+ postRecordSec: number().optional(),
32614
+ segmentMinutes: number().optional(),
32615
+ /** The complete new window set for the primary track — not a delta. */
32616
+ windows: array(RecordWindowSchema).optional()
32617
+ });
32618
+ var recordingOnboardCapability = {
32619
+ name: "recording-onboard",
32620
+ scope: "device",
32621
+ deviceNative: true,
32622
+ mode: "singleton",
32623
+ deviceTypes: [DeviceType.Camera],
32624
+ deviceConfig: { ui: {
32625
+ kind: "derived-form",
32626
+ builderId: "recording-onboard",
32627
+ tab: "recording"
32628
+ } },
32629
+ methods: {
32630
+ getOptions: method(object({ deviceId: number() }), RecordingOnboardOptionsSchema),
32631
+ setSettings: method(object({
32632
+ deviceId: number(),
32633
+ settings: RecordingOnboardPatchSchema
32634
+ }), _void(), {
32635
+ kind: "mutation",
32636
+ auth: "admin"
32637
+ })
32638
+ },
32639
+ status: {
32640
+ schema: RecordingOnboardStatusSchema,
32641
+ kind: "poll"
32642
+ },
32643
+ runtimeState: RecordingOnboardStatusSchema,
32644
+ /**
32645
+ * Runtime-state durability: **restored** — operator-set camera-side
32646
+ * recording config; mutation-driven, and the storage half is the last
32647
+ * thing the camera said about its own card.
32648
+ *
32649
+ * See `RuntimeStateDurability`. Enforced by
32650
+ * `scripts/check-runtime-state-durability.ts`.
32651
+ */
32652
+ durability: "restored",
32653
+ /** Clock fields: written, but excluded from the compare that decides
32654
+ * whether persisting is worth a SQLite commit. */
32655
+ volatileStateFields: ["lastFetchedAt"]
32656
+ };
32657
+ /**
32060
32658
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
32061
32659
  * for every device, regardless of provider — the kernel needs a uniform
32062
32660
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -38093,9 +38691,21 @@ var recordingCapability = {
38093
38691
  kind: "query",
38094
38692
  auth: "admin"
38095
38693
  }),
38694
+ /**
38695
+ * READ the camera's recording intent.
38696
+ *
38697
+ * `protected`, not `admin`, since 2026-09-21. It is the only per-camera
38698
+ * source of the recording mode the viewer has, and the camera status dot
38699
+ * asks for it on a screen every read-only user sees. As `admin` it answered
38700
+ * FORBIDDEN, the viewer collapsed that to `null` and `null` to `'off'`, and
38701
+ * a recording camera was drawn GREEN — a failed measurement rendered as a
38702
+ * value (D315, D393, D590). It carries schedules and retention, no secret,
38703
+ * and the per-device gate in `scope-access.ts` still applies; `setDeviceConfig`
38704
+ * stays `admin`.
38705
+ */
38096
38706
  getDeviceConfig: method(object({ deviceId: number() }), RecordingConfigSchema, {
38097
38707
  kind: "query",
38098
- auth: "admin"
38708
+ auth: "protected"
38099
38709
  }),
38100
38710
  /** Locate footage at a wall-clock instant: the covering segment's window,
38101
38711
  * or a gap with the forward nearest covered edge. Used by a feeder running
@@ -41408,6 +42018,1329 @@ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeate
41408
42018
  new Set(Object.values(DeviceType));
41409
42019
  DeviceFeature.BatteryOperated;
41410
42020
  /**
42021
+ * The vocabulary, in the order a picker offers it.
42022
+ *
42023
+ * Adding a key here is not enough to make it pickable: both glyph tables must
42024
+ * gain it too, and their tests fail until they do. That is the intended
42025
+ * friction — it is the only thing that keeps the two surfaces honest.
42026
+ */
42027
+ var DISPLAY_ICON_VOCABULARY = [
42028
+ {
42029
+ key: "camera",
42030
+ group: "device",
42031
+ synonyms: [
42032
+ "telecamera",
42033
+ "videocamera",
42034
+ "camera",
42035
+ "cam"
42036
+ ]
42037
+ },
42038
+ {
42039
+ key: "network",
42040
+ group: "device",
42041
+ synonyms: [
42042
+ "rete",
42043
+ "network",
42044
+ "lan"
42045
+ ]
42046
+ },
42047
+ {
42048
+ key: "toggle-left",
42049
+ group: "device",
42050
+ synonyms: [
42051
+ "interruttore",
42052
+ "switch",
42053
+ "toggle"
42054
+ ]
42055
+ },
42056
+ {
42057
+ key: "toggle-right",
42058
+ group: "device",
42059
+ synonyms: [
42060
+ "interruttore",
42061
+ "switch",
42062
+ "toggle",
42063
+ "acceso"
42064
+ ]
42065
+ },
42066
+ {
42067
+ key: "circle-dot",
42068
+ group: "device",
42069
+ synonyms: [
42070
+ "pulsante",
42071
+ "bottone",
42072
+ "button",
42073
+ "dot"
42074
+ ]
42075
+ },
42076
+ {
42077
+ key: "refresh-cw",
42078
+ group: "device",
42079
+ synonyms: [
42080
+ "aggiorna",
42081
+ "ricarica",
42082
+ "refresh",
42083
+ "reload",
42084
+ "ciclo"
42085
+ ]
42086
+ },
42087
+ {
42088
+ key: "box",
42089
+ group: "device",
42090
+ synonyms: [
42091
+ "scatola",
42092
+ "box",
42093
+ "contenitore"
42094
+ ]
42095
+ },
42096
+ {
42097
+ key: "scroll-text",
42098
+ group: "device",
42099
+ synonyms: [
42100
+ "registro",
42101
+ "log",
42102
+ "testo"
42103
+ ]
42104
+ },
42105
+ {
42106
+ key: "workflow",
42107
+ group: "device",
42108
+ synonyms: [
42109
+ "automazione",
42110
+ "flusso",
42111
+ "workflow",
42112
+ "scenario"
42113
+ ]
42114
+ },
42115
+ {
42116
+ key: "lock",
42117
+ group: "device",
42118
+ synonyms: [
42119
+ "serratura",
42120
+ "chiave",
42121
+ "lucchetto",
42122
+ "chiuso",
42123
+ "locked"
42124
+ ]
42125
+ },
42126
+ {
42127
+ key: "lock-open",
42128
+ group: "device",
42129
+ synonyms: [
42130
+ "serratura",
42131
+ "aperta",
42132
+ "sbloccato",
42133
+ "unlocked"
42134
+ ]
42135
+ },
42136
+ {
42137
+ key: "blinds",
42138
+ group: "device",
42139
+ synonyms: [
42140
+ "tapparella",
42141
+ "persiana",
42142
+ "serranda",
42143
+ "avvolgibile",
42144
+ "shutter",
42145
+ "blind",
42146
+ "veneziana"
42147
+ ]
42148
+ },
42149
+ {
42150
+ key: "air-vent",
42151
+ group: "device",
42152
+ synonyms: [
42153
+ "bocchetta",
42154
+ "aria",
42155
+ "ventilazione",
42156
+ "condizionatore",
42157
+ "vent"
42158
+ ]
42159
+ },
42160
+ {
42161
+ key: "monitor-play",
42162
+ group: "device",
42163
+ synonyms: [
42164
+ "schermo",
42165
+ "riproduzione",
42166
+ "player",
42167
+ "display"
42168
+ ]
42169
+ },
42170
+ {
42171
+ key: "sliders-horizontal",
42172
+ group: "device",
42173
+ synonyms: [
42174
+ "regolazione",
42175
+ "cursori",
42176
+ "impostazioni",
42177
+ "slider"
42178
+ ]
42179
+ },
42180
+ {
42181
+ key: "map-pin",
42182
+ group: "device",
42183
+ synonyms: [
42184
+ "posizione",
42185
+ "luogo",
42186
+ "mappa",
42187
+ "pin"
42188
+ ]
42189
+ },
42190
+ {
42191
+ key: "bot",
42192
+ group: "device",
42193
+ synonyms: [
42194
+ "robot",
42195
+ "aspirapolvere",
42196
+ "bot"
42197
+ ]
42198
+ },
42199
+ {
42200
+ key: "tractor",
42201
+ group: "device",
42202
+ synonyms: [
42203
+ "trattore",
42204
+ "tosaerba",
42205
+ "giardino"
42206
+ ]
42207
+ },
42208
+ {
42209
+ key: "image",
42210
+ group: "device",
42211
+ synonyms: [
42212
+ "immagine",
42213
+ "foto",
42214
+ "snapshot"
42215
+ ]
42216
+ },
42217
+ {
42218
+ key: "bone",
42219
+ group: "device",
42220
+ synonyms: ["osso", "cane"]
42221
+ },
42222
+ {
42223
+ key: "door-closed",
42224
+ group: "device",
42225
+ synonyms: [
42226
+ "porta",
42227
+ "chiusa",
42228
+ "contatto"
42229
+ ]
42230
+ },
42231
+ {
42232
+ key: "door-open",
42233
+ group: "device",
42234
+ synonyms: [
42235
+ "porta",
42236
+ "aperta",
42237
+ "contatto",
42238
+ "ingresso",
42239
+ "uscita"
42240
+ ]
42241
+ },
42242
+ {
42243
+ key: "crosshair",
42244
+ group: "device",
42245
+ synonyms: [
42246
+ "mirino",
42247
+ "puntamento",
42248
+ "centro"
42249
+ ]
42250
+ },
42251
+ {
42252
+ key: "eye",
42253
+ group: "device",
42254
+ synonyms: [
42255
+ "occhio",
42256
+ "visibile",
42257
+ "visto"
42258
+ ]
42259
+ },
42260
+ {
42261
+ key: "eye-off",
42262
+ group: "device",
42263
+ synonyms: [
42264
+ "privacy",
42265
+ "nascosto",
42266
+ "oscurato",
42267
+ "mascherato",
42268
+ "invisibile"
42269
+ ]
42270
+ },
42271
+ {
42272
+ key: "smartphone",
42273
+ group: "device",
42274
+ synonyms: [
42275
+ "telefono",
42276
+ "cellulare",
42277
+ "smartphone"
42278
+ ]
42279
+ },
42280
+ {
42281
+ key: "phone",
42282
+ group: "device",
42283
+ synonyms: ["telefono", "chiamata"]
42284
+ },
42285
+ {
42286
+ key: "tablet",
42287
+ group: "device",
42288
+ synonyms: ["tablet", "ipad"]
42289
+ },
42290
+ {
42291
+ key: "laptop",
42292
+ group: "device",
42293
+ synonyms: [
42294
+ "portatile",
42295
+ "laptop",
42296
+ "notebook"
42297
+ ]
42298
+ },
42299
+ {
42300
+ key: "monitor",
42301
+ group: "device",
42302
+ synonyms: ["monitor", "schermo"]
42303
+ },
42304
+ {
42305
+ key: "tv",
42306
+ group: "device",
42307
+ synonyms: ["televisore", "tv"]
42308
+ },
42309
+ {
42310
+ key: "speaker",
42311
+ group: "device",
42312
+ synonyms: [
42313
+ "altoparlante",
42314
+ "cassa",
42315
+ "speaker"
42316
+ ]
42317
+ },
42318
+ {
42319
+ key: "printer",
42320
+ group: "device",
42321
+ synonyms: ["stampante"]
42322
+ },
42323
+ {
42324
+ key: "projector",
42325
+ group: "device",
42326
+ synonyms: ["proiettore"]
42327
+ },
42328
+ {
42329
+ key: "gamepad-2",
42330
+ group: "device",
42331
+ synonyms: [
42332
+ "console",
42333
+ "gioco",
42334
+ "joystick"
42335
+ ]
42336
+ },
42337
+ {
42338
+ key: "radio",
42339
+ group: "device",
42340
+ synonyms: ["radio"]
42341
+ },
42342
+ {
42343
+ key: "router",
42344
+ group: "device",
42345
+ synonyms: ["router", "modem"]
42346
+ },
42347
+ {
42348
+ key: "bluetooth",
42349
+ group: "device",
42350
+ synonyms: ["bluetooth"]
42351
+ },
42352
+ {
42353
+ key: "cpu",
42354
+ group: "device",
42355
+ synonyms: [
42356
+ "processore",
42357
+ "cpu",
42358
+ "chip",
42359
+ "dispositivo"
42360
+ ]
42361
+ },
42362
+ {
42363
+ key: "hard-drive",
42364
+ group: "device",
42365
+ synonyms: [
42366
+ "disco",
42367
+ "hdd",
42368
+ "archiviazione",
42369
+ "storage"
42370
+ ]
42371
+ },
42372
+ {
42373
+ key: "server",
42374
+ group: "device",
42375
+ synonyms: ["server", "nas"]
42376
+ },
42377
+ {
42378
+ key: "mic",
42379
+ group: "device",
42380
+ synonyms: ["microfono", "audio"]
42381
+ },
42382
+ {
42383
+ key: "mic-off",
42384
+ group: "device",
42385
+ synonyms: [
42386
+ "microfono",
42387
+ "spento",
42388
+ "muto"
42389
+ ]
42390
+ },
42391
+ {
42392
+ key: "video",
42393
+ group: "device",
42394
+ synonyms: ["video"]
42395
+ },
42396
+ {
42397
+ key: "video-off",
42398
+ group: "device",
42399
+ synonyms: ["video", "spento"]
42400
+ },
42401
+ {
42402
+ key: "music",
42403
+ group: "device",
42404
+ synonyms: ["musica"]
42405
+ },
42406
+ {
42407
+ key: "plug",
42408
+ group: "device",
42409
+ synonyms: [
42410
+ "presa",
42411
+ "spina",
42412
+ "plug"
42413
+ ]
42414
+ },
42415
+ {
42416
+ key: "plug-zap",
42417
+ group: "device",
42418
+ synonyms: ["presa", "alimentata"]
42419
+ },
42420
+ {
42421
+ key: "power",
42422
+ group: "device",
42423
+ synonyms: [
42424
+ "accensione",
42425
+ "alimentazione",
42426
+ "power"
42427
+ ]
42428
+ },
42429
+ {
42430
+ key: "power-off",
42431
+ group: "device",
42432
+ synonyms: ["spegnimento", "spento"]
42433
+ },
42434
+ {
42435
+ key: "cable",
42436
+ group: "device",
42437
+ synonyms: ["cavo"]
42438
+ },
42439
+ {
42440
+ key: "battery",
42441
+ group: "device",
42442
+ synonyms: ["batteria"]
42443
+ },
42444
+ {
42445
+ key: "battery-charging",
42446
+ group: "device",
42447
+ synonyms: [
42448
+ "batteria",
42449
+ "carica",
42450
+ "ricarica"
42451
+ ]
42452
+ },
42453
+ {
42454
+ key: "battery-full",
42455
+ group: "device",
42456
+ synonyms: [
42457
+ "batteria",
42458
+ "carica",
42459
+ "piena"
42460
+ ]
42461
+ },
42462
+ {
42463
+ key: "battery-low",
42464
+ group: "device",
42465
+ synonyms: ["batteria", "scarica"]
42466
+ },
42467
+ {
42468
+ key: "key",
42469
+ group: "device",
42470
+ synonyms: ["chiave"]
42471
+ },
42472
+ {
42473
+ key: "key-round",
42474
+ group: "device",
42475
+ synonyms: ["chiave", "tonda"]
42476
+ },
42477
+ {
42478
+ key: "mailbox",
42479
+ group: "device",
42480
+ synonyms: [
42481
+ "cassetta",
42482
+ "postale",
42483
+ "posta"
42484
+ ]
42485
+ },
42486
+ {
42487
+ key: "package",
42488
+ group: "device",
42489
+ synonyms: ["pacco", "consegna"]
42490
+ },
42491
+ {
42492
+ key: "shield",
42493
+ group: "device",
42494
+ synonyms: [
42495
+ "scudo",
42496
+ "protezione",
42497
+ "sicurezza",
42498
+ "allarme"
42499
+ ]
42500
+ },
42501
+ {
42502
+ key: "shield-check",
42503
+ group: "device",
42504
+ synonyms: [
42505
+ "protetto",
42506
+ "sicuro",
42507
+ "armato"
42508
+ ]
42509
+ },
42510
+ {
42511
+ key: "shield-off",
42512
+ group: "device",
42513
+ synonyms: [
42514
+ "protezione",
42515
+ "disattivata",
42516
+ "disarmato"
42517
+ ]
42518
+ },
42519
+ {
42520
+ key: "briefcase",
42521
+ group: "device",
42522
+ synonyms: [
42523
+ "ufficio",
42524
+ "lavoro",
42525
+ "valigetta",
42526
+ "studio"
42527
+ ]
42528
+ },
42529
+ {
42530
+ key: "lightbulb",
42531
+ group: "lighting",
42532
+ synonyms: [
42533
+ "luce",
42534
+ "lampadina",
42535
+ "lampada",
42536
+ "light"
42537
+ ]
42538
+ },
42539
+ {
42540
+ key: "lamp",
42541
+ group: "lighting",
42542
+ synonyms: ["lampada", "abatjour"]
42543
+ },
42544
+ {
42545
+ key: "lamp-ceiling",
42546
+ group: "lighting",
42547
+ synonyms: [
42548
+ "plafoniera",
42549
+ "lampadario",
42550
+ "luce",
42551
+ "soffitto"
42552
+ ]
42553
+ },
42554
+ {
42555
+ key: "lamp-desk",
42556
+ group: "lighting",
42557
+ synonyms: [
42558
+ "lampada",
42559
+ "scrivania",
42560
+ "abatjour"
42561
+ ]
42562
+ },
42563
+ {
42564
+ key: "lamp-floor",
42565
+ group: "lighting",
42566
+ synonyms: [
42567
+ "piantana",
42568
+ "lampada",
42569
+ "terra"
42570
+ ]
42571
+ },
42572
+ {
42573
+ key: "flashlight",
42574
+ group: "lighting",
42575
+ synonyms: [
42576
+ "faretto",
42577
+ "torcia",
42578
+ "spot",
42579
+ "faro"
42580
+ ]
42581
+ },
42582
+ {
42583
+ key: "heater",
42584
+ group: "lighting",
42585
+ synonyms: [
42586
+ "riscaldamento",
42587
+ "termosifone",
42588
+ "stufa",
42589
+ "calore"
42590
+ ]
42591
+ },
42592
+ {
42593
+ key: "snowflake",
42594
+ group: "lighting",
42595
+ synonyms: [
42596
+ "freddo",
42597
+ "raffrescamento",
42598
+ "aria",
42599
+ "condizionata",
42600
+ "neve"
42601
+ ]
42602
+ },
42603
+ {
42604
+ key: "thermometer-sun",
42605
+ group: "lighting",
42606
+ synonyms: [
42607
+ "caldo",
42608
+ "temperatura",
42609
+ "alta"
42610
+ ]
42611
+ },
42612
+ {
42613
+ key: "thermometer-snowflake",
42614
+ group: "lighting",
42615
+ synonyms: [
42616
+ "freddo",
42617
+ "temperatura",
42618
+ "bassa"
42619
+ ]
42620
+ },
42621
+ {
42622
+ key: "refrigerator",
42623
+ group: "lighting",
42624
+ synonyms: ["frigorifero", "frigo"]
42625
+ },
42626
+ {
42627
+ key: "microwave",
42628
+ group: "lighting",
42629
+ synonyms: ["microonde", "forno"]
42630
+ },
42631
+ {
42632
+ key: "washing-machine",
42633
+ group: "lighting",
42634
+ synonyms: [
42635
+ "lavatrice",
42636
+ "lavastoviglie",
42637
+ "asciugatrice"
42638
+ ]
42639
+ },
42640
+ {
42641
+ key: "cooking-pot",
42642
+ group: "lighting",
42643
+ synonyms: [
42644
+ "pentola",
42645
+ "cucina",
42646
+ "fornello"
42647
+ ]
42648
+ },
42649
+ {
42650
+ key: "utensils",
42651
+ group: "lighting",
42652
+ synonyms: [
42653
+ "cucina",
42654
+ "posate",
42655
+ "sala",
42656
+ "pranzo"
42657
+ ]
42658
+ },
42659
+ {
42660
+ key: "thermometer",
42661
+ group: "sensing",
42662
+ synonyms: [
42663
+ "temperatura",
42664
+ "termometro",
42665
+ "termostato"
42666
+ ]
42667
+ },
42668
+ {
42669
+ key: "droplets",
42670
+ group: "sensing",
42671
+ synonyms: [
42672
+ "umidita",
42673
+ "acqua",
42674
+ "allagamento",
42675
+ "perdita"
42676
+ ]
42677
+ },
42678
+ {
42679
+ key: "droplet",
42680
+ group: "sensing",
42681
+ synonyms: [
42682
+ "goccia",
42683
+ "acqua",
42684
+ "perdita",
42685
+ "allagamento"
42686
+ ]
42687
+ },
42688
+ {
42689
+ key: "gauge",
42690
+ group: "sensing",
42691
+ synonyms: [
42692
+ "misura",
42693
+ "livello",
42694
+ "pressione",
42695
+ "indicatore"
42696
+ ]
42697
+ },
42698
+ {
42699
+ key: "gauge2",
42700
+ group: "sensing",
42701
+ synonyms: [
42702
+ "misura",
42703
+ "livello",
42704
+ "pressione",
42705
+ "indicatore"
42706
+ ],
42707
+ aliasOf: "gauge"
42708
+ },
42709
+ {
42710
+ key: "sun",
42711
+ group: "sensing",
42712
+ synonyms: [
42713
+ "sole",
42714
+ "luminosita",
42715
+ "giorno",
42716
+ "esterno"
42717
+ ]
42718
+ },
42719
+ {
42720
+ key: "sun-medium",
42721
+ group: "sensing",
42722
+ synonyms: ["sole", "luminosita"]
42723
+ },
42724
+ {
42725
+ key: "sunrise",
42726
+ group: "sensing",
42727
+ synonyms: ["alba"]
42728
+ },
42729
+ {
42730
+ key: "moon",
42731
+ group: "sensing",
42732
+ synonyms: [
42733
+ "notte",
42734
+ "luna",
42735
+ "notturna",
42736
+ "nightvision"
42737
+ ]
42738
+ },
42739
+ {
42740
+ key: "wind",
42741
+ group: "sensing",
42742
+ synonyms: [
42743
+ "vento",
42744
+ "aria",
42745
+ "gas",
42746
+ "monossido",
42747
+ "co"
42748
+ ]
42749
+ },
42750
+ {
42751
+ key: "cloud",
42752
+ group: "sensing",
42753
+ synonyms: ["nuvola", "nuvoloso"]
42754
+ },
42755
+ {
42756
+ key: "cloud-rain",
42757
+ group: "sensing",
42758
+ synonyms: ["pioggia"]
42759
+ },
42760
+ {
42761
+ key: "cloud-sun",
42762
+ group: "sensing",
42763
+ synonyms: [
42764
+ "variabile",
42765
+ "sole",
42766
+ "nuvole"
42767
+ ]
42768
+ },
42769
+ {
42770
+ key: "waves",
42771
+ group: "sensing",
42772
+ synonyms: [
42773
+ "onde",
42774
+ "acqua",
42775
+ "vibrazione"
42776
+ ]
42777
+ },
42778
+ {
42779
+ key: "sprout",
42780
+ group: "sensing",
42781
+ synonyms: [
42782
+ "irrigazione",
42783
+ "pianta",
42784
+ "germoglio",
42785
+ "orto"
42786
+ ]
42787
+ },
42788
+ {
42789
+ key: "leaf",
42790
+ group: "sensing",
42791
+ synonyms: [
42792
+ "foglia",
42793
+ "pianta",
42794
+ "verde"
42795
+ ]
42796
+ },
42797
+ {
42798
+ key: "flower",
42799
+ group: "sensing",
42800
+ synonyms: ["fiore", "pianta"]
42801
+ },
42802
+ {
42803
+ key: "zap",
42804
+ group: "sensing",
42805
+ synonyms: [
42806
+ "energia",
42807
+ "corrente",
42808
+ "consumo",
42809
+ "watt",
42810
+ "elettricita"
42811
+ ]
42812
+ },
42813
+ {
42814
+ key: "flame",
42815
+ group: "sensing",
42816
+ synonyms: [
42817
+ "fiamma",
42818
+ "gas",
42819
+ "fuoco",
42820
+ "incendio"
42821
+ ]
42822
+ },
42823
+ {
42824
+ key: "bell",
42825
+ group: "sensing",
42826
+ synonyms: [
42827
+ "campanello",
42828
+ "suoneria",
42829
+ "notifica",
42830
+ "bell",
42831
+ "chime"
42832
+ ]
42833
+ },
42834
+ {
42835
+ key: "bell-ring",
42836
+ group: "sensing",
42837
+ synonyms: [
42838
+ "campanello",
42839
+ "suona",
42840
+ "doorbell",
42841
+ "notifica"
42842
+ ]
42843
+ },
42844
+ {
42845
+ key: "bell-off",
42846
+ group: "sensing",
42847
+ synonyms: [
42848
+ "silenzioso",
42849
+ "notifiche",
42850
+ "disattivate",
42851
+ "muto"
42852
+ ]
42853
+ },
42854
+ {
42855
+ key: "siren",
42856
+ group: "sensing",
42857
+ synonyms: ["sirena", "allarme"]
42858
+ },
42859
+ {
42860
+ key: "radar",
42861
+ group: "sensing",
42862
+ synonyms: [
42863
+ "movimento",
42864
+ "presenza",
42865
+ "pir",
42866
+ "rilevamento",
42867
+ "radar"
42868
+ ]
42869
+ },
42870
+ {
42871
+ key: "activity",
42872
+ group: "sensing",
42873
+ synonyms: [
42874
+ "attivita",
42875
+ "sensore",
42876
+ "generico"
42877
+ ]
42878
+ },
42879
+ {
42880
+ key: "hash",
42881
+ group: "sensing",
42882
+ synonyms: [
42883
+ "numero",
42884
+ "contatore",
42885
+ "valore"
42886
+ ]
42887
+ },
42888
+ {
42889
+ key: "clock",
42890
+ group: "sensing",
42891
+ synonyms: [
42892
+ "orologio",
42893
+ "ora",
42894
+ "tempo"
42895
+ ]
42896
+ },
42897
+ {
42898
+ key: "timer",
42899
+ group: "sensing",
42900
+ synonyms: [
42901
+ "timer",
42902
+ "conto",
42903
+ "rovescia"
42904
+ ]
42905
+ },
42906
+ {
42907
+ key: "calendar",
42908
+ group: "sensing",
42909
+ synonyms: [
42910
+ "calendario",
42911
+ "data",
42912
+ "pianificazione"
42913
+ ]
42914
+ },
42915
+ {
42916
+ key: "pipette",
42917
+ group: "sensing",
42918
+ synonyms: [
42919
+ "qualita",
42920
+ "aria",
42921
+ "misura",
42922
+ "campione"
42923
+ ]
42924
+ },
42925
+ {
42926
+ key: "fan",
42927
+ group: "sensing",
42928
+ synonyms: [
42929
+ "ventilatore",
42930
+ "ventola",
42931
+ "aria"
42932
+ ]
42933
+ },
42934
+ {
42935
+ key: "bath",
42936
+ group: "sensing",
42937
+ synonyms: [
42938
+ "bagno",
42939
+ "vasca",
42940
+ "doccia"
42941
+ ]
42942
+ },
42943
+ {
42944
+ key: "footprints",
42945
+ group: "sensing",
42946
+ synonyms: [
42947
+ "movimento",
42948
+ "passi",
42949
+ "presenza",
42950
+ "motion"
42951
+ ]
42952
+ },
42953
+ {
42954
+ key: "alarm-smoke",
42955
+ group: "sensing",
42956
+ synonyms: [
42957
+ "fumo",
42958
+ "antincendio",
42959
+ "rilevatore"
42960
+ ]
42961
+ },
42962
+ {
42963
+ key: "shield-alert",
42964
+ group: "sensing",
42965
+ synonyms: [
42966
+ "manomissione",
42967
+ "allarme",
42968
+ "tamper",
42969
+ "avviso"
42970
+ ]
42971
+ },
42972
+ {
42973
+ key: "vibrate",
42974
+ group: "sensing",
42975
+ synonyms: [
42976
+ "vibrazione",
42977
+ "urto",
42978
+ "tamper"
42979
+ ]
42980
+ },
42981
+ {
42982
+ key: "wifi",
42983
+ group: "sensing",
42984
+ synonyms: [
42985
+ "wifi",
42986
+ "rete",
42987
+ "segnale"
42988
+ ]
42989
+ },
42990
+ {
42991
+ key: "wifi-off",
42992
+ group: "sensing",
42993
+ synonyms: [
42994
+ "wifi",
42995
+ "assente",
42996
+ "offline",
42997
+ "disconnesso"
42998
+ ]
42999
+ },
43000
+ {
43001
+ key: "volume-2",
43002
+ group: "sensing",
43003
+ synonyms: [
43004
+ "volume",
43005
+ "audio",
43006
+ "altoparlante",
43007
+ "suono"
43008
+ ]
43009
+ },
43010
+ {
43011
+ key: "volume-x",
43012
+ group: "sensing",
43013
+ synonyms: [
43014
+ "muto",
43015
+ "silenziato",
43016
+ "volume",
43017
+ "spento"
43018
+ ]
43019
+ },
43020
+ {
43021
+ key: "heart",
43022
+ group: "sensing",
43023
+ synonyms: [
43024
+ "cuore",
43025
+ "preferito",
43026
+ "salute"
43027
+ ]
43028
+ },
43029
+ {
43030
+ key: "heart-pulse",
43031
+ group: "sensing",
43032
+ synonyms: [
43033
+ "battito",
43034
+ "salute",
43035
+ "monitoraggio"
43036
+ ]
43037
+ },
43038
+ {
43039
+ key: "star",
43040
+ group: "sensing",
43041
+ synonyms: [
43042
+ "preferito",
43043
+ "stella",
43044
+ "importante"
43045
+ ]
43046
+ },
43047
+ {
43048
+ key: "sparkles",
43049
+ group: "sensing",
43050
+ synonyms: [
43051
+ "automatico",
43052
+ "intelligente",
43053
+ "ai",
43054
+ "scena"
43055
+ ]
43056
+ },
43057
+ {
43058
+ key: "house",
43059
+ group: "place",
43060
+ synonyms: [
43061
+ "casa",
43062
+ "abitazione",
43063
+ "home"
43064
+ ]
43065
+ },
43066
+ {
43067
+ key: "sofa",
43068
+ group: "place",
43069
+ synonyms: [
43070
+ "salone",
43071
+ "soggiorno",
43072
+ "divano",
43073
+ "living"
43074
+ ]
43075
+ },
43076
+ {
43077
+ key: "bed-double",
43078
+ group: "place",
43079
+ synonyms: [
43080
+ "camera",
43081
+ "letto",
43082
+ "matrimoniale"
43083
+ ]
43084
+ },
43085
+ {
43086
+ key: "bed",
43087
+ group: "place",
43088
+ synonyms: [
43089
+ "cameretta",
43090
+ "letto",
43091
+ "singolo"
43092
+ ]
43093
+ },
43094
+ {
43095
+ key: "warehouse",
43096
+ group: "place",
43097
+ synonyms: [
43098
+ "magazzino",
43099
+ "capanno",
43100
+ "deposito",
43101
+ "cantina"
43102
+ ]
43103
+ },
43104
+ {
43105
+ key: "trees",
43106
+ group: "place",
43107
+ synonyms: [
43108
+ "giardino",
43109
+ "alberi",
43110
+ "esterno",
43111
+ "parco"
43112
+ ]
43113
+ },
43114
+ {
43115
+ key: "tree-pine",
43116
+ group: "place",
43117
+ synonyms: [
43118
+ "albero",
43119
+ "pino",
43120
+ "giardino"
43121
+ ]
43122
+ },
43123
+ {
43124
+ key: "fence",
43125
+ group: "place",
43126
+ synonyms: [
43127
+ "recinto",
43128
+ "cancello",
43129
+ "staccionata",
43130
+ "perimetro"
43131
+ ]
43132
+ },
43133
+ {
43134
+ key: "store",
43135
+ group: "place",
43136
+ synonyms: [
43137
+ "negozio",
43138
+ "ingresso",
43139
+ "vetrina"
43140
+ ]
43141
+ },
43142
+ {
43143
+ key: "building",
43144
+ group: "place",
43145
+ synonyms: ["edificio", "palazzo"]
43146
+ },
43147
+ {
43148
+ key: "building-2",
43149
+ group: "place",
43150
+ synonyms: [
43151
+ "edificio",
43152
+ "uffici",
43153
+ "condominio"
43154
+ ]
43155
+ },
43156
+ {
43157
+ key: "mountain",
43158
+ group: "place",
43159
+ synonyms: [
43160
+ "montagna",
43161
+ "esterno",
43162
+ "panorama"
43163
+ ]
43164
+ },
43165
+ {
43166
+ key: "umbrella",
43167
+ group: "place",
43168
+ synonyms: [
43169
+ "tenda",
43170
+ "markise",
43171
+ "ombrellone",
43172
+ "pergola",
43173
+ "veranda"
43174
+ ]
43175
+ },
43176
+ {
43177
+ key: "dumbbell",
43178
+ group: "place",
43179
+ synonyms: ["palestra", "attrezzi"]
43180
+ },
43181
+ {
43182
+ key: "wrench",
43183
+ group: "place",
43184
+ synonyms: [
43185
+ "officina",
43186
+ "manutenzione",
43187
+ "attrezzi",
43188
+ "utenze"
43189
+ ]
43190
+ },
43191
+ {
43192
+ key: "hammer",
43193
+ group: "place",
43194
+ synonyms: [
43195
+ "officina",
43196
+ "martello",
43197
+ "lavori"
43198
+ ]
43199
+ },
43200
+ {
43201
+ key: "drill",
43202
+ group: "place",
43203
+ synonyms: [
43204
+ "officina",
43205
+ "trapano",
43206
+ "lavori"
43207
+ ]
43208
+ },
43209
+ {
43210
+ key: "waves-ladder",
43211
+ group: "place",
43212
+ synonyms: ["piscina", "vasca"]
43213
+ },
43214
+ {
43215
+ key: "circle-parking",
43216
+ group: "place",
43217
+ synonyms: [
43218
+ "parcheggio",
43219
+ "posto",
43220
+ "auto",
43221
+ "garage"
43222
+ ]
43223
+ },
43224
+ {
43225
+ key: "route",
43226
+ group: "place",
43227
+ synonyms: [
43228
+ "percorso",
43229
+ "strada",
43230
+ "vialetto",
43231
+ "tragitto"
43232
+ ]
43233
+ },
43234
+ {
43235
+ key: "car",
43236
+ group: "life",
43237
+ synonyms: [
43238
+ "auto",
43239
+ "macchina",
43240
+ "veicolo",
43241
+ "parcheggio"
43242
+ ]
43243
+ },
43244
+ {
43245
+ key: "bike",
43246
+ group: "life",
43247
+ synonyms: [
43248
+ "bicicletta",
43249
+ "bici",
43250
+ "moto"
43251
+ ]
43252
+ },
43253
+ {
43254
+ key: "bus",
43255
+ group: "life",
43256
+ synonyms: ["autobus", "pullman"]
43257
+ },
43258
+ {
43259
+ key: "truck",
43260
+ group: "life",
43261
+ synonyms: [
43262
+ "camion",
43263
+ "furgone",
43264
+ "consegna"
43265
+ ]
43266
+ },
43267
+ {
43268
+ key: "plane",
43269
+ group: "life",
43270
+ synonyms: ["aereo"]
43271
+ },
43272
+ {
43273
+ key: "train-front",
43274
+ group: "life",
43275
+ synonyms: ["treno"]
43276
+ },
43277
+ {
43278
+ key: "sailboat",
43279
+ group: "life",
43280
+ synonyms: ["barca", "imbarcazione"]
43281
+ },
43282
+ {
43283
+ key: "dog",
43284
+ group: "life",
43285
+ synonyms: ["cane", "animale"]
43286
+ },
43287
+ {
43288
+ key: "cat",
43289
+ group: "life",
43290
+ synonyms: ["gatto", "animale"]
43291
+ },
43292
+ {
43293
+ key: "bird",
43294
+ group: "life",
43295
+ synonyms: ["uccello", "animale"]
43296
+ },
43297
+ {
43298
+ key: "paw-print",
43299
+ group: "life",
43300
+ synonyms: [
43301
+ "animale",
43302
+ "zampa",
43303
+ "pet"
43304
+ ]
43305
+ },
43306
+ {
43307
+ key: "baby",
43308
+ group: "life",
43309
+ synonyms: [
43310
+ "neonato",
43311
+ "bimbo",
43312
+ "cameretta",
43313
+ "babymonitor"
43314
+ ]
43315
+ },
43316
+ {
43317
+ key: "user",
43318
+ group: "life",
43319
+ synonyms: ["persona", "utente"]
43320
+ },
43321
+ {
43322
+ key: "users",
43323
+ group: "life",
43324
+ synonyms: [
43325
+ "persone",
43326
+ "gruppo",
43327
+ "famiglia"
43328
+ ]
43329
+ },
43330
+ {
43331
+ key: "person-standing",
43332
+ group: "life",
43333
+ synonyms: [
43334
+ "persona",
43335
+ "piedi",
43336
+ "presenza"
43337
+ ]
43338
+ }
43339
+ ];
43340
+ DISPLAY_ICON_VOCABULARY.map((e) => e.key);
43341
+ DISPLAY_ICON_VOCABULARY.filter((e) => e.aliasOf === void 0).map((e) => e.key);
43342
+ new Map(DISPLAY_ICON_VOCABULARY.map((e) => [e.key, e]));
43343
+ /**
41411
43344
  * Every CapabilityDefinition shipped by `@camstack/types`. The hub
41412
43345
  * iterates this array at boot to declare each cap on the registry
41413
43346
  * before addons (in-process or via the Moleculer bridge) attempt
@@ -41461,6 +43394,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
41461
43394
  dayNightCapability,
41462
43395
  decoderCapability,
41463
43396
  detectionPipelineCapability,
43397
+ deviceAdminLinkCapability,
41464
43398
  deviceAdoptionCapability,
41465
43399
  deviceDiscoveryCapability,
41466
43400
  deviceExportCapability,
@@ -41535,6 +43469,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
41535
43469
  rebootCapability,
41536
43470
  recordingCapability,
41537
43471
  recordingExportCapability,
43472
+ recordingOnboardCapability,
41538
43473
  recordingSignalCapability,
41539
43474
  sceneMonitorCapability,
41540
43475
  scriptRunnerCapability,
@@ -41577,6 +43512,12 @@ var ALL_CAPABILITY_DEFINITIONS = [
41577
43512
  zonesCapability
41578
43513
  ];
41579
43514
  Object.freeze({
43515
+ "accessories.getStatus": {
43516
+ capName: "accessories",
43517
+ capScope: "device",
43518
+ addonId: null,
43519
+ access: "view"
43520
+ },
41580
43521
  "accessories.setChildHidden": {
41581
43522
  capName: "accessories",
41582
43523
  capScope: "device",
@@ -41859,6 +43800,12 @@ Object.freeze({
41859
43800
  addonId: null,
41860
43801
  access: "view"
41861
43802
  },
43803
+ "airQualitySensor.getStatus": {
43804
+ capName: "air-quality-sensor",
43805
+ capScope: "device",
43806
+ addonId: null,
43807
+ access: "view"
43808
+ },
41862
43809
  "alarmPanel.arm": {
41863
43810
  capName: "alarm-panel",
41864
43811
  capScope: "device",
@@ -41871,6 +43818,12 @@ Object.freeze({
41871
43818
  addonId: null,
41872
43819
  access: "create"
41873
43820
  },
43821
+ "alarmPanel.getStatus": {
43822
+ capName: "alarm-panel",
43823
+ capScope: "device",
43824
+ addonId: null,
43825
+ access: "view"
43826
+ },
41874
43827
  "alarmPanel.trigger": {
41875
43828
  capName: "alarm-panel",
41876
43829
  capScope: "device",
@@ -41919,6 +43872,30 @@ Object.freeze({
41919
43872
  addonId: null,
41920
43873
  access: "create"
41921
43874
  },
43875
+ "ambientLightSensor.getStatus": {
43876
+ capName: "ambient-light-sensor",
43877
+ capScope: "device",
43878
+ addonId: null,
43879
+ access: "view"
43880
+ },
43881
+ "audioAnalysis.applyDeviceSettingsPatch": {
43882
+ capName: "audio-analysis",
43883
+ capScope: "device",
43884
+ addonId: null,
43885
+ access: "create"
43886
+ },
43887
+ "audioAnalysis.getDeviceLiveContribution": {
43888
+ capName: "audio-analysis",
43889
+ capScope: "device",
43890
+ addonId: null,
43891
+ access: "view"
43892
+ },
43893
+ "audioAnalysis.getDeviceSettingsContribution": {
43894
+ capName: "audio-analysis",
43895
+ capScope: "device",
43896
+ addonId: null,
43897
+ access: "view"
43898
+ },
41922
43899
  "audioAnalysis.resolveDeviceSettings": {
41923
43900
  capName: "audio-analysis",
41924
43901
  capScope: "device",
@@ -42081,6 +44058,12 @@ Object.freeze({
42081
44058
  addonId: null,
42082
44059
  access: "create"
42083
44060
  },
44061
+ "automationControl.getStatus": {
44062
+ capName: "automation-control",
44063
+ capScope: "device",
44064
+ addonId: null,
44065
+ access: "view"
44066
+ },
42084
44067
  "automationControl.trigger": {
42085
44068
  capName: "automation-control",
42086
44069
  capScope: "device",
@@ -42177,12 +44160,30 @@ Object.freeze({
42177
44160
  addonId: null,
42178
44161
  access: "create"
42179
44162
  },
44163
+ "battery.getStatus": {
44164
+ capName: "battery",
44165
+ capScope: "device",
44166
+ addonId: null,
44167
+ access: "view"
44168
+ },
42180
44169
  "battery.wakeForStream": {
42181
44170
  capName: "battery",
42182
44171
  capScope: "device",
42183
44172
  addonId: null,
42184
44173
  access: "create"
42185
44174
  },
44175
+ "binary.getStatus": {
44176
+ capName: "binary",
44177
+ capScope: "device",
44178
+ addonId: null,
44179
+ access: "view"
44180
+ },
44181
+ "brightness.getStatus": {
44182
+ capName: "brightness",
44183
+ capScope: "device",
44184
+ addonId: null,
44185
+ access: "view"
44186
+ },
42186
44187
  "brightness.setBrightness": {
42187
44188
  capName: "brightness",
42188
44189
  capScope: "device",
@@ -42297,6 +44298,30 @@ Object.freeze({
42297
44298
  addonId: null,
42298
44299
  access: "view"
42299
44300
  },
44301
+ "cameraCredentials.getStatus": {
44302
+ capName: "camera-credentials",
44303
+ capScope: "device",
44304
+ addonId: null,
44305
+ access: "view"
44306
+ },
44307
+ "cameraGridLayout.applyDeviceSettingsPatch": {
44308
+ capName: "camera-grid-layout",
44309
+ capScope: "device",
44310
+ addonId: null,
44311
+ access: "create"
44312
+ },
44313
+ "cameraGridLayout.getDeviceLiveContribution": {
44314
+ capName: "camera-grid-layout",
44315
+ capScope: "device",
44316
+ addonId: null,
44317
+ access: "view"
44318
+ },
44319
+ "cameraGridLayout.getDeviceSettingsContribution": {
44320
+ capName: "camera-grid-layout",
44321
+ capScope: "device",
44322
+ addonId: null,
44323
+ access: "view"
44324
+ },
42300
44325
  "cameraGridLayout.getLayout": {
42301
44326
  capName: "camera-grid-layout",
42302
44327
  capScope: "device",
@@ -42309,6 +44334,24 @@ Object.freeze({
42309
44334
  addonId: null,
42310
44335
  access: "create"
42311
44336
  },
44337
+ "cameraPipelineConfig.applyDeviceSettingsPatch": {
44338
+ capName: "camera-pipeline-config",
44339
+ capScope: "device",
44340
+ addonId: null,
44341
+ access: "create"
44342
+ },
44343
+ "cameraPipelineConfig.getDeviceLiveContribution": {
44344
+ capName: "camera-pipeline-config",
44345
+ capScope: "device",
44346
+ addonId: null,
44347
+ access: "view"
44348
+ },
44349
+ "cameraPipelineConfig.getDeviceSettingsContribution": {
44350
+ capName: "camera-pipeline-config",
44351
+ capScope: "device",
44352
+ addonId: null,
44353
+ access: "view"
44354
+ },
42312
44355
  "cameraStreams.getBrokerStreams": {
42313
44356
  capName: "camera-streams",
42314
44357
  capScope: "device",
@@ -42339,6 +44382,18 @@ Object.freeze({
42339
44382
  addonId: null,
42340
44383
  access: "view"
42341
44384
  },
44385
+ "carbonMonoxide.getStatus": {
44386
+ capName: "carbon-monoxide",
44387
+ capScope: "device",
44388
+ addonId: null,
44389
+ access: "view"
44390
+ },
44391
+ "climateControl.getStatus": {
44392
+ capName: "climate-control",
44393
+ capScope: "device",
44394
+ addonId: null,
44395
+ access: "view"
44396
+ },
42342
44397
  "climateControl.setFanMode": {
42343
44398
  capName: "climate-control",
42344
44399
  capScope: "device",
@@ -42387,6 +44442,12 @@ Object.freeze({
42387
44442
  addonId: null,
42388
44443
  access: "create"
42389
44444
  },
44445
+ "color.getStatus": {
44446
+ capName: "color",
44447
+ capScope: "device",
44448
+ addonId: null,
44449
+ access: "view"
44450
+ },
42390
44451
  "color.setColor": {
42391
44452
  capName: "color",
42392
44453
  capScope: "device",
@@ -42405,12 +44466,36 @@ Object.freeze({
42405
44466
  addonId: null,
42406
44467
  access: "create"
42407
44468
  },
44469
+ "connectivity.getStatus": {
44470
+ capName: "connectivity",
44471
+ capScope: "device",
44472
+ addonId: null,
44473
+ access: "view"
44474
+ },
44475
+ "consumables.getStatus": {
44476
+ capName: "consumables",
44477
+ capScope: "device",
44478
+ addonId: null,
44479
+ access: "view"
44480
+ },
42408
44481
  "consumables.reset": {
42409
44482
  capName: "consumables",
42410
44483
  capScope: "device",
42411
44484
  addonId: null,
42412
44485
  access: "delete"
42413
44486
  },
44487
+ "contact.getStatus": {
44488
+ capName: "contact",
44489
+ capScope: "device",
44490
+ addonId: null,
44491
+ access: "view"
44492
+ },
44493
+ "control.getStatus": {
44494
+ capName: "control",
44495
+ capScope: "device",
44496
+ addonId: null,
44497
+ access: "view"
44498
+ },
42414
44499
  "control.setValue": {
42415
44500
  capName: "control",
42416
44501
  capScope: "device",
@@ -42477,6 +44562,12 @@ Object.freeze({
42477
44562
  addonId: null,
42478
44563
  access: "create"
42479
44564
  },
44565
+ "cover.getStatus": {
44566
+ capName: "cover",
44567
+ capScope: "device",
44568
+ addonId: null,
44569
+ access: "view"
44570
+ },
42480
44571
  "cover.open": {
42481
44572
  capName: "cover",
42482
44573
  capScope: "device",
@@ -42609,6 +44700,12 @@ Object.freeze({
42609
44700
  addonId: null,
42610
44701
  access: "view"
42611
44702
  },
44703
+ "dayNight.getStatus": {
44704
+ capName: "day-night",
44705
+ capScope: "device",
44706
+ addonId: null,
44707
+ access: "view"
44708
+ },
42612
44709
  "dayNight.setSettings": {
42613
44710
  capName: "day-night",
42614
44711
  capScope: "device",
@@ -42699,6 +44796,30 @@ Object.freeze({
42699
44796
  addonId: null,
42700
44797
  access: "view"
42701
44798
  },
44799
+ "detectionPipeline.applyDeviceSettingsPatch": {
44800
+ capName: "detection-pipeline",
44801
+ capScope: "device",
44802
+ addonId: null,
44803
+ access: "create"
44804
+ },
44805
+ "detectionPipeline.getDeviceLiveContribution": {
44806
+ capName: "detection-pipeline",
44807
+ capScope: "device",
44808
+ addonId: null,
44809
+ access: "view"
44810
+ },
44811
+ "detectionPipeline.getDeviceSettingsContribution": {
44812
+ capName: "detection-pipeline",
44813
+ capScope: "device",
44814
+ addonId: null,
44815
+ access: "view"
44816
+ },
44817
+ "deviceAdminLink.getAdminLink": {
44818
+ capName: "device-admin-link",
44819
+ capScope: "device",
44820
+ addonId: null,
44821
+ access: "view"
44822
+ },
42702
44823
  "deviceAdoption.adopt": {
42703
44824
  capName: "device-adoption",
42704
44825
  capScope: "system",
@@ -42711,6 +44832,12 @@ Object.freeze({
42711
44832
  addonId: null,
42712
44833
  access: "view"
42713
44834
  },
44835
+ "deviceAdoption.getStatus": {
44836
+ capName: "device-adoption",
44837
+ capScope: "system",
44838
+ addonId: null,
44839
+ access: "view"
44840
+ },
42714
44841
  "deviceAdoption.listCandidateFilters": {
42715
44842
  capName: "device-adoption",
42716
44843
  capScope: "system",
@@ -42747,6 +44874,12 @@ Object.freeze({
42747
44874
  addonId: null,
42748
44875
  access: "create"
42749
44876
  },
44877
+ "deviceDiscovery.getStatus": {
44878
+ capName: "device-discovery",
44879
+ capScope: "device",
44880
+ addonId: null,
44881
+ access: "view"
44882
+ },
42750
44883
  "deviceDiscovery.listDiscovered": {
42751
44884
  capName: "device-discovery",
42752
44885
  capScope: "device",
@@ -42765,12 +44898,30 @@ Object.freeze({
42765
44898
  addonId: null,
42766
44899
  access: "create"
42767
44900
  },
44901
+ "deviceExport.applyDeviceSettingsPatch": {
44902
+ capName: "device-export",
44903
+ capScope: "system",
44904
+ addonId: null,
44905
+ access: "create"
44906
+ },
42768
44907
  "deviceExport.exposeDevice": {
42769
44908
  capName: "device-export",
42770
44909
  capScope: "system",
42771
44910
  addonId: null,
42772
44911
  access: "create"
42773
44912
  },
44913
+ "deviceExport.getDeviceLiveContribution": {
44914
+ capName: "device-export",
44915
+ capScope: "system",
44916
+ addonId: null,
44917
+ access: "view"
44918
+ },
44919
+ "deviceExport.getDeviceSettingsContribution": {
44920
+ capName: "device-export",
44921
+ capScope: "system",
44922
+ addonId: null,
44923
+ access: "view"
44924
+ },
42774
44925
  "deviceExport.getStatus": {
42775
44926
  capName: "device-export",
42776
44927
  capScope: "system",
@@ -42867,6 +45018,12 @@ Object.freeze({
42867
45018
  addonId: null,
42868
45019
  access: "create"
42869
45020
  },
45021
+ "deviceManager.applyDeviceSettingsPatch": {
45022
+ capName: "device-manager",
45023
+ capScope: "system",
45024
+ addonId: null,
45025
+ access: "create"
45026
+ },
42870
45027
  "deviceManager.applyInitialMeta": {
42871
45028
  capName: "device-manager",
42872
45029
  capScope: "system",
@@ -42969,6 +45126,12 @@ Object.freeze({
42969
45126
  addonId: null,
42970
45127
  access: "view"
42971
45128
  },
45129
+ "deviceManager.getDeviceLiveContribution": {
45130
+ capName: "device-manager",
45131
+ capScope: "system",
45132
+ addonId: null,
45133
+ access: "view"
45134
+ },
42972
45135
  "deviceManager.getDeviceLiveInfoAggregate": {
42973
45136
  capName: "device-manager",
42974
45137
  capScope: "system",
@@ -42981,6 +45144,12 @@ Object.freeze({
42981
45144
  addonId: null,
42982
45145
  access: "view"
42983
45146
  },
45147
+ "deviceManager.getDeviceSettingsContribution": {
45148
+ capName: "device-manager",
45149
+ capScope: "system",
45150
+ addonId: null,
45151
+ access: "view"
45152
+ },
42984
45153
  "deviceManager.getDeviceStatusAggregate": {
42985
45154
  capName: "device-manager",
42986
45155
  capScope: "system",
@@ -43473,6 +45642,36 @@ Object.freeze({
43473
45642
  addonId: null,
43474
45643
  access: "create"
43475
45644
  },
45645
+ "deviceStatus.getStatus": {
45646
+ capName: "device-status",
45647
+ capScope: "device",
45648
+ addonId: null,
45649
+ access: "view"
45650
+ },
45651
+ "doorbell.applyDeviceSettingsPatch": {
45652
+ capName: "doorbell",
45653
+ capScope: "device",
45654
+ addonId: null,
45655
+ access: "create"
45656
+ },
45657
+ "doorbell.getDeviceLiveContribution": {
45658
+ capName: "doorbell",
45659
+ capScope: "device",
45660
+ addonId: null,
45661
+ access: "view"
45662
+ },
45663
+ "doorbell.getDeviceSettingsContribution": {
45664
+ capName: "doorbell",
45665
+ capScope: "device",
45666
+ addonId: null,
45667
+ access: "view"
45668
+ },
45669
+ "doorbell.getStatus": {
45670
+ capName: "doorbell",
45671
+ capScope: "device",
45672
+ addonId: null,
45673
+ access: "view"
45674
+ },
43476
45675
  "embeddingEncoder.encode": {
43477
45676
  capName: "embedding-encoder",
43478
45677
  capScope: "system",
@@ -43491,6 +45690,18 @@ Object.freeze({
43491
45690
  addonId: null,
43492
45691
  access: "view"
43493
45692
  },
45693
+ "enumSensor.getStatus": {
45694
+ capName: "enum-sensor",
45695
+ capScope: "device",
45696
+ addonId: null,
45697
+ access: "view"
45698
+ },
45699
+ "eventEmitter.getStatus": {
45700
+ capName: "event-emitter",
45701
+ capScope: "device",
45702
+ addonId: null,
45703
+ access: "view"
45704
+ },
43494
45705
  "events.getEventClipUrl": {
43495
45706
  capName: "events",
43496
45707
  capScope: "device",
@@ -43611,6 +45822,12 @@ Object.freeze({
43611
45822
  addonId: null,
43612
45823
  access: "view"
43613
45824
  },
45825
+ "fanControl.getStatus": {
45826
+ capName: "fan-control",
45827
+ capScope: "device",
45828
+ addonId: null,
45829
+ access: "view"
45830
+ },
43614
45831
  "fanControl.setDirection": {
43615
45832
  capName: "fan-control",
43616
45833
  capScope: "device",
@@ -43635,6 +45852,12 @@ Object.freeze({
43635
45852
  addonId: null,
43636
45853
  access: "create"
43637
45854
  },
45855
+ "featureProbe.getStatus": {
45856
+ capName: "feature-probe",
45857
+ capScope: "device",
45858
+ addonId: null,
45859
+ access: "view"
45860
+ },
43638
45861
  "filesystemBrowse.browse": {
43639
45862
  capName: "filesystem-browse",
43640
45863
  capScope: "system",
@@ -43653,6 +45876,24 @@ Object.freeze({
43653
45876
  addonId: null,
43654
45877
  access: "view"
43655
45878
  },
45879
+ "flood.getStatus": {
45880
+ capName: "flood",
45881
+ capScope: "device",
45882
+ addonId: null,
45883
+ access: "view"
45884
+ },
45885
+ "gas.getStatus": {
45886
+ capName: "gas",
45887
+ capScope: "device",
45888
+ addonId: null,
45889
+ access: "view"
45890
+ },
45891
+ "humidifier.getStatus": {
45892
+ capName: "humidifier",
45893
+ capScope: "device",
45894
+ addonId: null,
45895
+ access: "view"
45896
+ },
43656
45897
  "humidifier.setMode": {
43657
45898
  capName: "humidifier",
43658
45899
  capScope: "device",
@@ -43671,12 +45912,30 @@ Object.freeze({
43671
45912
  addonId: null,
43672
45913
  access: "create"
43673
45914
  },
45915
+ "humiditySensor.getStatus": {
45916
+ capName: "humidity-sensor",
45917
+ capScope: "device",
45918
+ addonId: null,
45919
+ access: "view"
45920
+ },
45921
+ "image.getStatus": {
45922
+ capName: "image",
45923
+ capScope: "device",
45924
+ addonId: null,
45925
+ access: "view"
45926
+ },
43674
45927
  "imageSettings.getOptions": {
43675
45928
  capName: "image-settings",
43676
45929
  capScope: "device",
43677
45930
  addonId: null,
43678
45931
  access: "view"
43679
45932
  },
45933
+ "imageSettings.getStatus": {
45934
+ capName: "image-settings",
45935
+ capScope: "device",
45936
+ addonId: null,
45937
+ access: "view"
45938
+ },
43680
45939
  "imageSettings.setSettings": {
43681
45940
  capName: "image-settings",
43682
45941
  capScope: "device",
@@ -43749,6 +46008,12 @@ Object.freeze({
43749
46008
  addonId: null,
43750
46009
  access: "create"
43751
46010
  },
46011
+ "intercom.getStatus": {
46012
+ capName: "intercom",
46013
+ capScope: "device",
46014
+ addonId: null,
46015
+ access: "view"
46016
+ },
43752
46017
  "intercom.handleAnswer": {
43753
46018
  capName: "intercom",
43754
46019
  capScope: "device",
@@ -43785,6 +46050,12 @@ Object.freeze({
43785
46050
  addonId: null,
43786
46051
  access: "create"
43787
46052
  },
46053
+ "lawnMowerControl.getStatus": {
46054
+ capName: "lawn-mower-control",
46055
+ capScope: "device",
46056
+ addonId: null,
46057
+ access: "view"
46058
+ },
43788
46059
  "lawnMowerControl.pause": {
43789
46060
  capName: "lawn-mower-control",
43790
46061
  capScope: "device",
@@ -44067,6 +46338,12 @@ Object.freeze({
44067
46338
  addonId: null,
44068
46339
  access: "create"
44069
46340
  },
46341
+ "lockControl.getStatus": {
46342
+ capName: "lock-control",
46343
+ capScope: "device",
46344
+ addonId: null,
46345
+ access: "view"
46346
+ },
44070
46347
  "lockControl.lock": {
44071
46348
  capName: "lock-control",
44072
46349
  capScope: "device",
@@ -44115,6 +46392,12 @@ Object.freeze({
44115
46392
  addonId: null,
44116
46393
  access: "view"
44117
46394
  },
46395
+ "mediaPlayer.getStatus": {
46396
+ capName: "media-player",
46397
+ capScope: "device",
46398
+ addonId: null,
46399
+ access: "view"
46400
+ },
44118
46401
  "mediaPlayer.next": {
44119
46402
  capName: "media-player",
44120
46403
  capScope: "device",
@@ -44307,6 +46590,12 @@ Object.freeze({
44307
46590
  addonId: null,
44308
46591
  access: "create"
44309
46592
  },
46593
+ "motion.getStatus": {
46594
+ capName: "motion",
46595
+ capScope: "device",
46596
+ addonId: null,
46597
+ access: "view"
46598
+ },
44310
46599
  "motion.isDetected": {
44311
46600
  capName: "motion",
44312
46601
  capScope: "device",
@@ -44319,6 +46608,24 @@ Object.freeze({
44319
46608
  addonId: null,
44320
46609
  access: "create"
44321
46610
  },
46611
+ "motionDetection.applyDeviceSettingsPatch": {
46612
+ capName: "motion-detection",
46613
+ capScope: "device",
46614
+ addonId: null,
46615
+ access: "create"
46616
+ },
46617
+ "motionDetection.getDeviceLiveContribution": {
46618
+ capName: "motion-detection",
46619
+ capScope: "device",
46620
+ addonId: null,
46621
+ access: "view"
46622
+ },
46623
+ "motionDetection.getDeviceSettingsContribution": {
46624
+ capName: "motion-detection",
46625
+ capScope: "device",
46626
+ addonId: null,
46627
+ access: "view"
46628
+ },
44322
46629
  "motionDetection.removeCamera": {
44323
46630
  capName: "motion-detection",
44324
46631
  capScope: "device",
@@ -44331,6 +46638,12 @@ Object.freeze({
44331
46638
  addonId: null,
44332
46639
  access: "delete"
44333
46640
  },
46641
+ "motionTrigger.getStatus": {
46642
+ capName: "motion-trigger",
46643
+ capScope: "device",
46644
+ addonId: null,
46645
+ access: "view"
46646
+ },
44334
46647
  "motionTrigger.setMotionTrigger": {
44335
46648
  capName: "motion-trigger",
44336
46649
  capScope: "device",
@@ -44343,6 +46656,12 @@ Object.freeze({
44343
46656
  addonId: null,
44344
46657
  access: "view"
44345
46658
  },
46659
+ "motionZones.getStatus": {
46660
+ capName: "motion-zones",
46661
+ capScope: "device",
46662
+ addonId: null,
46663
+ access: "view"
46664
+ },
44346
46665
  "motionZones.setZone": {
44347
46666
  capName: "motion-zones",
44348
46667
  capScope: "device",
@@ -44403,6 +46722,12 @@ Object.freeze({
44403
46722
  addonId: null,
44404
46723
  access: "view"
44405
46724
  },
46725
+ "nativeObjectDetection.getStatus": {
46726
+ capName: "native-object-detection",
46727
+ capScope: "device",
46728
+ addonId: null,
46729
+ access: "view"
46730
+ },
44406
46731
  "nativeObjectDetection.setEnabled": {
44407
46732
  capName: "native-object-detection",
44408
46733
  capScope: "device",
@@ -44421,6 +46746,12 @@ Object.freeze({
44421
46746
  addonId: null,
44422
46747
  access: "view"
44423
46748
  },
46749
+ "navigation.getStatus": {
46750
+ capName: "navigation",
46751
+ capScope: "device",
46752
+ addonId: null,
46753
+ access: "view"
46754
+ },
44424
46755
  "navigation.goToPoint": {
44425
46756
  capName: "navigation",
44426
46757
  capScope: "device",
@@ -44505,6 +46836,12 @@ Object.freeze({
44505
46836
  addonId: null,
44506
46837
  access: "create"
44507
46838
  },
46839
+ "networkLink.getStatus": {
46840
+ capName: "network-link",
46841
+ capScope: "device",
46842
+ addonId: null,
46843
+ access: "view"
46844
+ },
44508
46845
  "networkQuality.getAllStats": {
44509
46846
  capName: "network-quality",
44510
46847
  capScope: "system",
@@ -44763,18 +47100,36 @@ Object.freeze({
44763
47100
  addonId: null,
44764
47101
  access: "create"
44765
47102
  },
47103
+ "notifier.getStatus": {
47104
+ capName: "notifier",
47105
+ capScope: "device",
47106
+ addonId: null,
47107
+ access: "view"
47108
+ },
44766
47109
  "notifier.send": {
44767
47110
  capName: "notifier",
44768
47111
  capScope: "device",
44769
47112
  addonId: null,
44770
47113
  access: "create"
44771
47114
  },
47115
+ "numericSensor.getStatus": {
47116
+ capName: "numeric-sensor",
47117
+ capScope: "device",
47118
+ addonId: null,
47119
+ access: "view"
47120
+ },
44772
47121
  "oauthIntegration.getDescriptor": {
44773
47122
  capName: "oauth-integration",
44774
47123
  capScope: "system",
44775
47124
  addonId: null,
44776
47125
  access: "view"
44777
47126
  },
47127
+ "osd.getStatus": {
47128
+ capName: "osd",
47129
+ capScope: "device",
47130
+ addonId: null,
47131
+ access: "view"
47132
+ },
44778
47133
  "osd.setOverlay": {
44779
47134
  capName: "osd",
44780
47135
  capScope: "device",
@@ -44847,6 +47202,12 @@ Object.freeze({
44847
47202
  addonId: null,
44848
47203
  access: "create"
44849
47204
  },
47205
+ "petFeeder.getStatus": {
47206
+ capName: "pet-feeder",
47207
+ capScope: "device",
47208
+ addonId: null,
47209
+ access: "view"
47210
+ },
44850
47211
  "petFeeder.markFoodReplenished": {
44851
47212
  capName: "pet-feeder",
44852
47213
  capScope: "device",
@@ -44889,6 +47250,12 @@ Object.freeze({
44889
47250
  addonId: null,
44890
47251
  access: "create"
44891
47252
  },
47253
+ "pipelineAnalytics.applyDeviceSettingsPatch": {
47254
+ capName: "pipeline-analytics",
47255
+ capScope: "device",
47256
+ addonId: null,
47257
+ access: "create"
47258
+ },
44892
47259
  "pipelineAnalytics.cancelRelocateMedia": {
44893
47260
  capName: "pipeline-analytics",
44894
47261
  capScope: "device",
@@ -44955,6 +47322,18 @@ Object.freeze({
44955
47322
  addonId: null,
44956
47323
  access: "view"
44957
47324
  },
47325
+ "pipelineAnalytics.getDeviceLiveContribution": {
47326
+ capName: "pipeline-analytics",
47327
+ capScope: "device",
47328
+ addonId: null,
47329
+ access: "view"
47330
+ },
47331
+ "pipelineAnalytics.getDeviceSettingsContribution": {
47332
+ capName: "pipeline-analytics",
47333
+ capScope: "device",
47334
+ addonId: null,
47335
+ access: "view"
47336
+ },
44958
47337
  "pipelineAnalytics.getEventDensity": {
44959
47338
  capName: "pipeline-analytics",
44960
47339
  capScope: "device",
@@ -45525,6 +47904,12 @@ Object.freeze({
45525
47904
  addonId: null,
45526
47905
  access: "view"
45527
47906
  },
47907
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
47908
+ capName: "pipeline-orchestrator",
47909
+ capScope: "system",
47910
+ addonId: null,
47911
+ access: "create"
47912
+ },
45528
47913
  "pipelineOrchestrator.assignAudio": {
45529
47914
  capName: "pipeline-orchestrator",
45530
47915
  capScope: "system",
@@ -45615,6 +48000,18 @@ Object.freeze({
45615
48000
  addonId: null,
45616
48001
  access: "view"
45617
48002
  },
48003
+ "pipelineOrchestrator.getDeviceLiveContribution": {
48004
+ capName: "pipeline-orchestrator",
48005
+ capScope: "system",
48006
+ addonId: null,
48007
+ access: "view"
48008
+ },
48009
+ "pipelineOrchestrator.getDeviceSettingsContribution": {
48010
+ capName: "pipeline-orchestrator",
48011
+ capScope: "system",
48012
+ addonId: null,
48013
+ access: "view"
48014
+ },
45618
48015
  "pipelineOrchestrator.getGlobalMetrics": {
45619
48016
  capName: "pipeline-orchestrator",
45620
48017
  capScope: "system",
@@ -46023,12 +48420,36 @@ Object.freeze({
46023
48420
  addonId: null,
46024
48421
  access: "view"
46025
48422
  },
48423
+ "powerMeter.getStatus": {
48424
+ capName: "power-meter",
48425
+ capScope: "device",
48426
+ addonId: null,
48427
+ access: "view"
48428
+ },
48429
+ "presence.getStatus": {
48430
+ capName: "presence",
48431
+ capScope: "device",
48432
+ addonId: null,
48433
+ access: "view"
48434
+ },
48435
+ "pressureSensor.getStatus": {
48436
+ capName: "pressure-sensor",
48437
+ capScope: "device",
48438
+ addonId: null,
48439
+ access: "view"
48440
+ },
46026
48441
  "privacyMask.getOptions": {
46027
48442
  capName: "privacy-mask",
46028
48443
  capScope: "device",
46029
48444
  addonId: null,
46030
48445
  access: "view"
46031
48446
  },
48447
+ "privacyMask.getStatus": {
48448
+ capName: "privacy-mask",
48449
+ capScope: "device",
48450
+ addonId: null,
48451
+ access: "view"
48452
+ },
46032
48453
  "privacyMask.setAudioEnabled": {
46033
48454
  capName: "privacy-mask",
46034
48455
  capScope: "device",
@@ -46089,6 +48510,12 @@ Object.freeze({
46089
48510
  addonId: null,
46090
48511
  access: "view"
46091
48512
  },
48513
+ "ptz.getStatus": {
48514
+ capName: "ptz",
48515
+ capScope: "device",
48516
+ addonId: null,
48517
+ access: "view"
48518
+ },
46092
48519
  "ptz.goHome": {
46093
48520
  capName: "ptz",
46094
48521
  capScope: "device",
@@ -46167,6 +48594,12 @@ Object.freeze({
46167
48594
  addonId: null,
46168
48595
  access: "create"
46169
48596
  },
48597
+ "recording.applyDeviceSettingsPatch": {
48598
+ capName: "recording",
48599
+ capScope: "system",
48600
+ addonId: null,
48601
+ access: "create"
48602
+ },
46170
48603
  "recording.cancelRelocateJob": {
46171
48604
  capName: "recording",
46172
48605
  capScope: "system",
@@ -46215,6 +48648,18 @@ Object.freeze({
46215
48648
  addonId: null,
46216
48649
  access: "view"
46217
48650
  },
48651
+ "recording.getDeviceLiveContribution": {
48652
+ capName: "recording",
48653
+ capScope: "system",
48654
+ addonId: null,
48655
+ access: "view"
48656
+ },
48657
+ "recording.getDeviceSettingsContribution": {
48658
+ capName: "recording",
48659
+ capScope: "system",
48660
+ addonId: null,
48661
+ access: "view"
48662
+ },
46218
48663
  "recording.getPlacement": {
46219
48664
  capName: "recording",
46220
48665
  capScope: "system",
@@ -46233,6 +48678,12 @@ Object.freeze({
46233
48678
  addonId: null,
46234
48679
  access: "view"
46235
48680
  },
48681
+ "recording.getStatus": {
48682
+ capName: "recording",
48683
+ capScope: "system",
48684
+ addonId: null,
48685
+ access: "view"
48686
+ },
46236
48687
  "recording.getStorageMigrationMoveStatus": {
46237
48688
  capName: "recording",
46238
48689
  capScope: "system",
@@ -46407,6 +48858,24 @@ Object.freeze({
46407
48858
  addonId: null,
46408
48859
  access: "view"
46409
48860
  },
48861
+ "recordingOnboard.getOptions": {
48862
+ capName: "recording-onboard",
48863
+ capScope: "device",
48864
+ addonId: null,
48865
+ access: "view"
48866
+ },
48867
+ "recordingOnboard.getStatus": {
48868
+ capName: "recording-onboard",
48869
+ capScope: "device",
48870
+ addonId: null,
48871
+ access: "view"
48872
+ },
48873
+ "recordingOnboard.setSettings": {
48874
+ capName: "recording-onboard",
48875
+ capScope: "device",
48876
+ addonId: null,
48877
+ access: "create"
48878
+ },
46410
48879
  "recordingSignal.getStatus": {
46411
48880
  capName: "recording-signal",
46412
48881
  capScope: "device",
@@ -46437,6 +48906,12 @@ Object.freeze({
46437
48906
  addonId: null,
46438
48907
  access: "delete"
46439
48908
  },
48909
+ "sceneMonitor.getStatus": {
48910
+ capName: "scene-monitor",
48911
+ capScope: "device",
48912
+ addonId: null,
48913
+ access: "view"
48914
+ },
46440
48915
  "sceneMonitor.listScenes": {
46441
48916
  capName: "scene-monitor",
46442
48917
  capScope: "device",
@@ -46467,6 +48942,12 @@ Object.freeze({
46467
48942
  addonId: null,
46468
48943
  access: "create"
46469
48944
  },
48945
+ "scriptRunner.getStatus": {
48946
+ capName: "script-runner",
48947
+ capScope: "device",
48948
+ addonId: null,
48949
+ access: "view"
48950
+ },
46470
48951
  "scriptRunner.run": {
46471
48952
  capName: "script-runner",
46472
48953
  capScope: "device",
@@ -46599,6 +49080,12 @@ Object.freeze({
46599
49080
  addonId: null,
46600
49081
  access: "create"
46601
49082
  },
49083
+ "smoke.getStatus": {
49084
+ capName: "smoke",
49085
+ capScope: "device",
49086
+ addonId: null,
49087
+ access: "view"
49088
+ },
46602
49089
  "smtpProvider.getStatus": {
46603
49090
  capName: "smtp-provider",
46604
49091
  capScope: "system",
@@ -46617,12 +49104,30 @@ Object.freeze({
46617
49104
  addonId: null,
46618
49105
  access: "view"
46619
49106
  },
49107
+ "snapshot.applyDeviceSettingsPatch": {
49108
+ capName: "snapshot",
49109
+ capScope: "device",
49110
+ addonId: null,
49111
+ access: "create"
49112
+ },
46620
49113
  "snapshot.getDebugState": {
46621
49114
  capName: "snapshot",
46622
49115
  capScope: "device",
46623
49116
  addonId: null,
46624
49117
  access: "view"
46625
49118
  },
49119
+ "snapshot.getDeviceLiveContribution": {
49120
+ capName: "snapshot",
49121
+ capScope: "device",
49122
+ addonId: null,
49123
+ access: "view"
49124
+ },
49125
+ "snapshot.getDeviceSettingsContribution": {
49126
+ capName: "snapshot",
49127
+ capScope: "device",
49128
+ addonId: null,
49129
+ access: "view"
49130
+ },
46626
49131
  "snapshot.getSnapshot": {
46627
49132
  capName: "snapshot",
46628
49133
  capScope: "device",
@@ -46641,6 +49146,12 @@ Object.freeze({
46641
49146
  addonId: null,
46642
49147
  access: "view"
46643
49148
  },
49149
+ "snapshot.getStatus": {
49150
+ capName: "snapshot",
49151
+ capScope: "device",
49152
+ addonId: null,
49153
+ access: "view"
49154
+ },
46644
49155
  "snapshot.invalidateCache": {
46645
49156
  capName: "snapshot",
46646
49157
  capScope: "device",
@@ -46977,6 +49488,12 @@ Object.freeze({
46977
49488
  addonId: null,
46978
49489
  access: "create"
46979
49490
  },
49491
+ "streamBroker.applyDeviceSettingsPatch": {
49492
+ capName: "stream-broker",
49493
+ capScope: "system",
49494
+ addonId: null,
49495
+ access: "create"
49496
+ },
46980
49497
  "streamBroker.assignProfile": {
46981
49498
  capName: "stream-broker",
46982
49499
  capScope: "system",
@@ -47013,6 +49530,18 @@ Object.freeze({
47013
49530
  addonId: null,
47014
49531
  access: "view"
47015
49532
  },
49533
+ "streamBroker.getDeviceLiveContribution": {
49534
+ capName: "stream-broker",
49535
+ capScope: "system",
49536
+ addonId: null,
49537
+ access: "view"
49538
+ },
49539
+ "streamBroker.getDeviceSettingsContribution": {
49540
+ capName: "stream-broker",
49541
+ capScope: "system",
49542
+ addonId: null,
49543
+ access: "view"
49544
+ },
47016
49545
  "streamBroker.getPreBufferInfo": {
47017
49546
  capName: "stream-broker",
47018
49547
  capScope: "system",
@@ -47211,6 +49740,12 @@ Object.freeze({
47211
49740
  addonId: null,
47212
49741
  access: "view"
47213
49742
  },
49743
+ "streamParams.getStatus": {
49744
+ capName: "stream-params",
49745
+ capScope: "device",
49746
+ addonId: null,
49747
+ access: "view"
49748
+ },
47214
49749
  "streamParams.setProfile": {
47215
49750
  capName: "stream-params",
47216
49751
  capScope: "device",
@@ -47223,6 +49758,12 @@ Object.freeze({
47223
49758
  addonId: null,
47224
49759
  access: "view"
47225
49760
  },
49761
+ "switch.getStatus": {
49762
+ capName: "switch",
49763
+ capScope: "device",
49764
+ addonId: null,
49765
+ access: "view"
49766
+ },
47226
49767
  "switch.setState": {
47227
49768
  capName: "switch",
47228
49769
  capScope: "device",
@@ -47319,6 +49860,18 @@ Object.freeze({
47319
49860
  addonId: null,
47320
49861
  access: "create"
47321
49862
  },
49863
+ "tamper.getStatus": {
49864
+ capName: "tamper",
49865
+ capScope: "device",
49866
+ addonId: null,
49867
+ access: "view"
49868
+ },
49869
+ "temperatureSensor.getStatus": {
49870
+ capName: "temperature-sensor",
49871
+ capScope: "device",
49872
+ addonId: null,
49873
+ access: "view"
49874
+ },
47322
49875
  "terminalSession.adoptLegacyMonitor": {
47323
49876
  capName: "terminal-session",
47324
49877
  capScope: "system",
@@ -47415,6 +49968,12 @@ Object.freeze({
47415
49968
  addonId: null,
47416
49969
  access: "view"
47417
49970
  },
49971
+ "update.getStatus": {
49972
+ capName: "update",
49973
+ capScope: "device",
49974
+ addonId: null,
49975
+ access: "view"
49976
+ },
47418
49977
  "update.installUpdate": {
47419
49978
  capName: "update",
47420
49979
  capScope: "device",
@@ -47637,6 +50196,12 @@ Object.freeze({
47637
50196
  addonId: null,
47638
50197
  access: "create"
47639
50198
  },
50199
+ "vacuumControl.getStatus": {
50200
+ capName: "vacuum-control",
50201
+ capScope: "device",
50202
+ addonId: null,
50203
+ access: "view"
50204
+ },
47640
50205
  "vacuumControl.locate": {
47641
50206
  capName: "vacuum-control",
47642
50207
  capScope: "device",
@@ -47679,6 +50244,12 @@ Object.freeze({
47679
50244
  addonId: null,
47680
50245
  access: "create"
47681
50246
  },
50247
+ "valve.getStatus": {
50248
+ capName: "valve",
50249
+ capScope: "device",
50250
+ addonId: null,
50251
+ access: "view"
50252
+ },
47682
50253
  "valve.open": {
47683
50254
  capName: "valve",
47684
50255
  capScope: "device",
@@ -47751,6 +50322,18 @@ Object.freeze({
47751
50322
  addonId: null,
47752
50323
  access: "create"
47753
50324
  },
50325
+ "vibration.getStatus": {
50326
+ capName: "vibration",
50327
+ capScope: "device",
50328
+ addonId: null,
50329
+ access: "view"
50330
+ },
50331
+ "videoclips.dialClipStream": {
50332
+ capName: "videoclips",
50333
+ capScope: "device",
50334
+ addonId: null,
50335
+ access: "view"
50336
+ },
47754
50337
  "videoclips.getClipPlayback": {
47755
50338
  capName: "videoclips",
47756
50339
  capScope: "device",
@@ -47787,6 +50370,12 @@ Object.freeze({
47787
50370
  addonId: null,
47788
50371
  access: "view"
47789
50372
  },
50373
+ "waterHeater.getStatus": {
50374
+ capName: "water-heater",
50375
+ capScope: "device",
50376
+ addonId: null,
50377
+ access: "view"
50378
+ },
47790
50379
  "waterHeater.setAway": {
47791
50380
  capName: "water-heater",
47792
50381
  capScope: "device",
@@ -47805,6 +50394,12 @@ Object.freeze({
47805
50394
  addonId: null,
47806
50395
  access: "create"
47807
50396
  },
50397
+ "weather.getStatus": {
50398
+ capName: "weather",
50399
+ capScope: "device",
50400
+ addonId: null,
50401
+ access: "view"
50402
+ },
47808
50403
  "webrtcSession.addIceCandidate": {
47809
50404
  capName: "webrtc-session",
47810
50405
  capScope: "device",
@@ -48167,6 +50762,11 @@ Object.freeze({
48167
50762
  form: "single",
48168
50763
  optional: true
48169
50764
  }],
50765
+ "deviceAdminLink.getAdminLink": [{
50766
+ name: "deviceId",
50767
+ form: "single",
50768
+ optional: false
50769
+ }],
48170
50770
  "deviceAdoption.release": [{
48171
50771
  name: "camDeviceId",
48172
50772
  form: "single",
@@ -49552,6 +52152,16 @@ Object.freeze({
49552
52152
  form: "single",
49553
52153
  optional: true
49554
52154
  }],
52155
+ "recordingOnboard.getOptions": [{
52156
+ name: "deviceId",
52157
+ form: "single",
52158
+ optional: false
52159
+ }],
52160
+ "recordingOnboard.setSettings": [{
52161
+ name: "deviceId",
52162
+ form: "single",
52163
+ optional: false
52164
+ }],
49555
52165
  "recordingSignal.getStatus": [{
49556
52166
  name: "deviceId",
49557
52167
  form: "single",
@@ -49778,6 +52388,11 @@ Object.freeze({
49778
52388
  form: "single",
49779
52389
  optional: false
49780
52390
  }],
52391
+ "videoclips.dialClipStream": [{
52392
+ name: "deviceId",
52393
+ form: "single",
52394
+ optional: false
52395
+ }],
49781
52396
  "videoclips.getClipPlayback": [{
49782
52397
  name: "deviceId",
49783
52398
  form: "single",