@camstack/system 1.2.279 → 1.2.281

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 (55) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/camera-grid/index.js +1 -1
  12. package/dist/builtins/camera-grid/index.mjs +1 -1
  13. package/dist/builtins/console-logging/index.js +1 -1
  14. package/dist/builtins/console-logging/index.mjs +1 -1
  15. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  17. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  18. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  19. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  20. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  21. package/dist/builtins/hub-forwarder/index.js +1 -1
  22. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  23. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  24. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  25. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  26. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  27. package/dist/builtins/local-network/local-network.addon.js +1 -1
  28. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  29. package/dist/builtins/loki-logging/index.js +1 -1
  30. package/dist/builtins/loki-logging/index.mjs +1 -1
  31. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  32. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  33. package/dist/builtins/platform-probe/index.js +1 -1
  34. package/dist/builtins/platform-probe/index.mjs +1 -1
  35. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  36. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  37. package/dist/builtins/snapshot/index.js +1 -1
  38. package/dist/builtins/snapshot/index.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  41. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  42. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  44. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  45. package/dist/builtins/system-config/system-config.addon.js +1 -1
  46. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  47. package/dist/builtins/winston-logging/index.js +1 -1
  48. package/dist/builtins/winston-logging/index.mjs +1 -1
  49. package/dist/{dist-C6z4MoX5.js → dist-BEICnNLn.js} +976 -9
  50. package/dist/{dist-BLHDOV8o.mjs → dist-OKbs4A_r.mjs} +976 -9
  51. package/dist/index.js +1 -1
  52. package/dist/index.mjs +1 -1
  53. package/dist/{retired-settings-keys-DsMEZO3v.mjs → retired-settings-keys-BSensQtj.mjs} +1 -1
  54. package/dist/{retired-settings-keys-_qA7nWba.js → retired-settings-keys-eH9h-hTR.js} +1 -1
  55. package/package.json +1 -1
@@ -691,7 +691,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
691
691
  return EventCategory;
692
692
  }({});
693
693
  //#endregion
694
- //#region ../types/dist/sleep-CaB_hL5g.mjs
694
+ //#region ../types/dist/sleep-BVhJDJka.mjs
695
695
  /**
696
696
  * The audio chunk plane's byte format, and the ONE expansion from a coded
697
697
  * window to float samples (D455).
@@ -2853,6 +2853,18 @@ function systemMethod(input, output, options) {
2853
2853
  systemOnly: true
2854
2854
  };
2855
2855
  }
2856
+ /**
2857
+ * A method a SOURCE of a collection cap may legitimately not serve — OPTIONAL
2858
+ * on `InferProvider`. The `providerOptional: true` literal is what
2859
+ * `InferProvider` keys on; see {@link CapabilityMethodSchema.providerOptional}
2860
+ * for when this is the honest answer and when it is a soft stub.
2861
+ */
2862
+ function optionalMethod(input, output, options) {
2863
+ return {
2864
+ ...method(input, output, options),
2865
+ providerOptional: true
2866
+ };
2867
+ }
2856
2868
  /** Shorthand to define an event schema */
2857
2869
  function event(data) {
2858
2870
  return { data };
@@ -26214,6 +26226,59 @@ var ClipPlaybackSchema = zod.z.object({
26214
26226
  * which days it asked for and got nothing — "no clips" would be a lie about a
26215
26227
  * card that is full of them.
26216
26228
  */
26229
+ /**
26230
+ * The operator's authorisation to WAKE a sleeping camera for one clip read.
26231
+ *
26232
+ * ONE value, absent by default, and it is a `force`-shaped operator signal in
26233
+ * exactly the sense `snapshot-wake-gate.ts` uses the word: *"`snapshot.getSnapshot`'s
26234
+ * `force` flag, and nothing else… a background caller must never set it…
26235
+ * Stale but honest beats woken"*. A scheduler, a retry, a reconcile and a
26236
+ * prefetch never set it; a surface sets it only behind the same confirm the
26237
+ * "Wake and refresh" gesture uses, and it is refused below 15 % battery
26238
+ * exactly as that gesture is.
26239
+ *
26240
+ * The gate is decided BEFORE `getApi()`, because on UDP the login IS the wake
26241
+ * (D549) — a read that opened a session and then checked would have woken the
26242
+ * camera to find out it was not allowed to.
26243
+ *
26244
+ * **One authorised yes is one wake.** `next-natural` — take the clip the next
26245
+ * time the camera is awake for its own reasons — is deliberately not a member:
26246
+ * it was proposed, it is free on the battery, and the operator declined it on
26247
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
26248
+ * D558 "Considered and not taken").
26249
+ */
26250
+ var ClipWakeSchema = zod.z.enum(["authorised"]);
26251
+ /**
26252
+ * A clip's finished bytes, inline — the twin of `recordingExport.readExportBytes`.
26253
+ *
26254
+ * `bytes` is the DECODED length, so nobody infers it from the base64 length,
26255
+ * and `served` says which twin the caller actually got.
26256
+ */
26257
+ var ClipBytesSchema = zod.z.object({
26258
+ base64: zod.z.string(),
26259
+ contentType: zod.z.string(),
26260
+ /** Suggested filename, extension included. */
26261
+ name: zod.z.string(),
26262
+ bytes: zod.z.number().int().nonnegative(),
26263
+ /**
26264
+ * Which twin was actually served — the same contract
26265
+ * {@link ClipPlaybackSchema.served} carries, and REQUIRED here because the
26266
+ * export record persists it: a row read a week later must say the same thing
26267
+ * the panel said at the moment of the tap. A missing main twin is never
26268
+ * served silently as if it were the asked-for quality (D549 15).
26269
+ */
26270
+ served: CamProfileSchema,
26271
+ /**
26272
+ * The DECODED duration of the delivered file, when the fetch measured one.
26273
+ *
26274
+ * A clip fetch verifies its own completion against the catalog row and
26275
+ * retries a materially short pass (D568); this is that measurement, carried
26276
+ * so a consumer can say the same thing rather than re-deriving it. Absent
26277
+ * when the producer did not measure — never zero, which would say the file
26278
+ * is empty.
26279
+ */
26280
+ durationMs: zod.z.number().positive().optional()
26281
+ });
26217
26282
  var ClipSourceAvailabilitySchema = zod.z.object({
26218
26283
  state: zod.z.enum([
26219
26284
  "ok",
@@ -26385,6 +26450,68 @@ var videoclipsCapability = {
26385
26450
  }), ClipPlaybackSchema, {
26386
26451
  kind: "query",
26387
26452
  auth: "protected"
26453
+ }),
26454
+ /**
26455
+ * This clip's BYTES, base64, bounded — the by-handle read a clip EXPORT
26456
+ * pulls once (D558).
26457
+ *
26458
+ * `getClipPlayback` is the right answer for a player: it hands back a URL
26459
+ * on a plane the hub serves `access:'authenticated'`, which a browser and a
26460
+ * viewer session satisfy. It is the wrong answer for another ADDON. There
26461
+ * is no addon→addon byte transport in this framework — `AddonDataPlane`
26462
+ * only lets an addon SERVE, on `127.0.0.1` behind a per-listener secret
26463
+ * only the hub may present — so a recorder that wants a camera's clip
26464
+ * cannot fetch that URL. This method is the one seam that exists for it,
26465
+ * and it is deliberately the same shape (and the same bound) as
26466
+ * `recordingExport.readExportBytes`, which exists for the mirror-image
26467
+ * reason.
26468
+ *
26469
+ * Routing needs no `provider` pin: the id is source-prefixed and
26470
+ * self-contained, so `device-collection-dispatch.ts` rule 3 hands the call
26471
+ * to the source that claims it — and an id nobody claims is REFUSED rather
26472
+ * than answered by another source.
26473
+ *
26474
+ * The producer reuses the fetch path it already has, completion rules
26475
+ * included: a clip is taken by cmd 5 and finished on a short idle window
26476
+ * whose result is PROVED against the catalog row's own span, retried once
26477
+ * when it comes up materially short, and served-and-named when it is still
26478
+ * short (D568). A second fetch with different completion rules is exactly
26479
+ * the second authority D558 refuses to create.
26480
+ *
26481
+ * Every refusal THROWS with its reason and none of them is silent — the
26482
+ * sleep gate (decided before `getApi()`, liftable only by
26483
+ * {@link ClipWakeSchema}), a catalog row nobody claims, a clip with no
26484
+ * bytes behind it, a mux that failed, and the size bound. The caller turns
26485
+ * that reason into an operator-facing one; a truncated file is never an
26486
+ * answer.
26487
+ */
26488
+ readClipBytes: optionalMethod(zod.z.object({
26489
+ deviceId: zod.z.number(),
26490
+ clipId: zod.z.string().min(1),
26491
+ /**
26492
+ * Which twin to fetch, on the mapping D549 15 already fixed:
26493
+ * `low | mid` → the sub file, `high` → the main twin. `auto` is not
26494
+ * accepted here for the same reason it is not accepted by
26495
+ * `getClipPlayback` — a stored file has no broker session, so the
26496
+ * adaptive tier cannot be resolved for it.
26497
+ */
26498
+ profile: CamProfileSchema.optional(),
26499
+ /**
26500
+ * The CALLER's byte bound, so an over-size clip is refused before it is
26501
+ * read and encoded rather than after. Capped by
26502
+ * {@link VIDEOCLIPS_MAX_READ_BYTES} whatever is passed; absent means
26503
+ * that ceiling.
26504
+ */
26505
+ maxBytes: zod.z.number().int().positive().optional(),
26506
+ /**
26507
+ * The operator's authorisation to wake a sleeping camera for this
26508
+ * read. Absent — the default — means a sleeping standalone battery
26509
+ * camera is REFUSED by name, before any session is opened.
26510
+ */
26511
+ wake: ClipWakeSchema.optional()
26512
+ }), ClipBytesSchema, {
26513
+ kind: "query",
26514
+ auth: "protected"
26388
26515
  })
26389
26516
  }
26390
26517
  };
@@ -35107,9 +35234,21 @@ var recordingCapability = {
35107
35234
  kind: "query",
35108
35235
  auth: "admin"
35109
35236
  }),
35237
+ /**
35238
+ * READ the camera's recording intent.
35239
+ *
35240
+ * `protected`, not `admin`, since 2026-09-21. It is the only per-camera
35241
+ * source of the recording mode the viewer has, and the camera status dot
35242
+ * asks for it on a screen every read-only user sees. As `admin` it answered
35243
+ * FORBIDDEN, the viewer collapsed that to `null` and `null` to `'off'`, and
35244
+ * a recording camera was drawn GREEN — a failed measurement rendered as a
35245
+ * value (D315, D393, D590). It carries schedules and retention, no secret,
35246
+ * and the per-device gate in `scope-access.ts` still applies; `setDeviceConfig`
35247
+ * stays `admin`.
35248
+ */
35110
35249
  getDeviceConfig: method(zod.z.object({ deviceId: zod.z.number() }), RecordingConfigSchema, {
35111
35250
  kind: "query",
35112
- auth: "admin"
35251
+ auth: "protected"
35113
35252
  }),
35114
35253
  /** Locate footage at a wall-clock instant: the covering segment's window,
35115
35254
  * or a gap with the forward nearest covered edge. Used by a feeder running
@@ -35461,13 +35600,135 @@ var ExportStateSchema = zod.z.enum([
35461
35600
  "expired",
35462
35601
  "deleted"
35463
35602
  ]);
35464
- /** One export job / history row. */
35603
+ /**
35604
+ * A stretch of footage THIS system recorded — the only thing `createExport`
35605
+ * could export before D558, and still the shape every legacy caller sends.
35606
+ */
35607
+ var ExportFootageSubjectSchema = zod.z.object({
35608
+ kind: zod.z.literal("footage"),
35609
+ deviceId: zod.z.number(),
35610
+ profiles: zod.z.array(zod.z.string()).min(1),
35611
+ fromMs: zod.z.number(),
35612
+ toMs: zod.z.number()
35613
+ });
35614
+ /**
35615
+ * A CLIP — a finished file with boundaries the camera chose, listed by one of
35616
+ * the device's `videoclips` sources.
35617
+ *
35618
+ * There is deliberately **no `fromMs`/`toMs` here**. The camera chose them,
35619
+ * no surface on this path asks for them (there is no drag and no
35620
+ * `datetime-local` pair — D558 § 5.4.3), and they reach the record only as the
35621
+ * projection. A range in the subject would be a second place the boundaries
35622
+ * live and the one a caller could get wrong.
35623
+ *
35624
+ * `provider` is the **addonId** of the source's serving addon — the `provider`
35625
+ * pin `videoclips.listClips` REQUIRES since D554 was amended on 2026-09-20.
35626
+ * There was never a default: a bare call fanned out and returned the union of
35627
+ * every source with `limit` meaning `limit × sources`. The catalog check that
35628
+ * validates this subject names it, so it asks exactly the source the operator
35629
+ * picked.
35630
+ *
35631
+ * `source` is that source's id (the namespace `clipId` is prefixed with), and
35632
+ * `sourceLabel` is its operator-facing name FROZEN at creation — a history row
35633
+ * still reads "SD card" after the source is unbound.
35634
+ *
35635
+ * `profile` is exactly ONE, and it is what was ASKED. What was SERVED lands on
35636
+ * the record's top-level `profile`, so a clip with no main twin renders the
35637
+ * divergence instead of hiding it (D549 15; measured on 592, 17 of 546 clips
35638
+ * had no main twin, so a silent fallback would be right 96.9 % of the time).
35639
+ * `auto` is not a member: a stored file has no broker session, so the adaptive
35640
+ * tier cannot be resolved for it.
35641
+ */
35642
+ var ExportClipSubjectSchema = zod.z.object({
35643
+ kind: zod.z.literal("clip"),
35644
+ deviceId: zod.z.number(),
35645
+ provider: zod.z.string().min(1),
35646
+ source: zod.z.string().min(1),
35647
+ sourceLabel: zod.z.string().min(1),
35648
+ clipId: zod.z.string().min(1),
35649
+ /**
35650
+ * WHERE IN THE CATALOG to confirm this clip — the day window the surface was
35651
+ * already listing when the operator picked the segment.
35652
+ *
35653
+ * It is **not** a time range control and it never becomes one: the record's
35654
+ * `fromMs`/`toMs` come from the catalog ROW and from nothing a caller
35655
+ * supplied (D558 § 5.4.3), and a window that does not contain the clip is a
35656
+ * `catalog-miss`, not a silently wider search. It exists because
35657
+ * `videoclips.listClips` takes `since`/`until` and has no by-handle twin:
35658
+ * the catalog check D558 asks for is literally that call, and a call needs a
35659
+ * window. The surface has one — `ClipsBrowser`'s `dayWindow`, one local
35660
+ * wall-clock day, which is also the only width measured to be cheap (one
35661
+ * day on 592 lists 171 clips in 712 ms, a busy day 546 in 2.0 s; twenty days
35662
+ * of one child's events took 3.6–5.4 s).
35663
+ */
35664
+ catalogWindow: zod.z.object({
35665
+ sinceMs: zod.z.number(),
35666
+ untilMs: zod.z.number()
35667
+ }),
35668
+ profile: zod.z.enum([
35669
+ "high",
35670
+ "mid",
35671
+ "low"
35672
+ ]),
35673
+ /**
35674
+ * The operator's authorisation to wake a sleeping camera for this export.
35675
+ * ONE definition, in the cap that owns the clip read ({@link ClipWakeSchema}),
35676
+ * because the gate that honours it is the clip provider's sleep gate — a
35677
+ * second enum here would be a second contract. Absent by default; never
35678
+ * settable by a scheduler or a retry.
35679
+ *
35680
+ * **One authorised yes is ONE wake.** A failed clip export is retried only by
35681
+ * an operator act that asks again; a queued job that outlived its wake fails
35682
+ * with a reason rather than waking on its turn; and this subject carries
35683
+ * exactly one profile precisely so one tap is never two fetches (D558 § 5.2).
35684
+ */
35685
+ wake: ClipWakeSchema.optional()
35686
+ });
35687
+ /**
35688
+ * WHAT an export is — the authority, as opposed to the four top-level fields
35689
+ * the Library sorts and labels on (D558 § 2.2).
35690
+ *
35691
+ * Read it through {@link exportSubjectOf}, never off the record directly: the
35692
+ * field is optional for the history rows written before it existed, and that
35693
+ * absence has exactly one interpreter.
35694
+ */
35695
+ var ExportSubjectSchema = zod.z.discriminatedUnion("kind", [ExportFootageSubjectSchema, ExportClipSubjectSchema]);
35696
+ /**
35697
+ * One export job / history row.
35698
+ *
35699
+ * **`subject` is the AUTHORITY on what was exported. `deviceId`, `profile`,
35700
+ * `fromMs` and `toMs` are its PROJECTION** — kept top-level because the whole
35701
+ * Library sorts and labels on them (`library-items.ts` orders an export by
35702
+ * `fromMs`; `export-format.ts` draws `rangeLabel` from the pair), and a row
35703
+ * that did not fill them would sort under the epoch and render a blank range.
35704
+ * Write to the subject and read from the projection and the two will disagree;
35705
+ * the projection is derived at creation and never edited afterwards.
35706
+ *
35707
+ * And they mean DIFFERENT FACTS for the two kinds, which is the part a reader
35708
+ * who knows only the recording export will get wrong:
35709
+ *
35710
+ * | field | `kind:'footage'` | `kind:'clip'` |
35711
+ * | --- | --- | --- |
35712
+ * | `fromMs`/`toMs` | the stretch the operator ASKED for | the camera's own boundaries, always `clip.timeRange`, never anything a caller supplied |
35713
+ * | `profile` | the stream rendered | the twin actually SERVED (`subject.profile` is the one asked for) |
35714
+ *
35715
+ * Same type, different fact — the shape this repo keeps getting wrong (D385's
35716
+ * two authorities, D224's second copy).
35717
+ */
35465
35718
  var ExportRecordSchema = zod.z.object({
35466
35719
  id: zod.z.string(),
35467
35720
  deviceId: zod.z.number(),
35468
35721
  profile: zod.z.string(),
35469
35722
  fromMs: zod.z.number(),
35470
35723
  toMs: zod.z.number(),
35724
+ /**
35725
+ * What this export IS. Optional ONLY for the rows written before D558: the
35726
+ * store parses every row through this schema on every read, so a required
35727
+ * field would make the export AUDIT — which is the whole reason rows survive
35728
+ * file deletion — unreadable in one release. Absence means `footage`, and
35729
+ * {@link exportSubjectOf} is the one place that says so.
35730
+ */
35731
+ subject: ExportSubjectSchema.optional(),
35471
35732
  options: ExportOptionsSchema,
35472
35733
  state: ExportStateSchema,
35473
35734
  /** 0–100 while rendering; null otherwise. */
@@ -35484,6 +35745,18 @@ var ExportRecordSchema = zod.z.object({
35484
35745
  /** Failure reason when state is 'failed'; null otherwise. */
35485
35746
  error: zod.z.string().nullable()
35486
35747
  });
35748
+ zod.z.enum([
35749
+ "catalog-miss",
35750
+ "catalog-unreachable",
35751
+ "no-file-for-window",
35752
+ "clip-in-progress",
35753
+ "unsupported-option",
35754
+ "sleeping",
35755
+ "camera-refused",
35756
+ "fetch-failed",
35757
+ "too-large-to-transfer",
35758
+ "wake-expired"
35759
+ ]);
35487
35760
  /** Candidate download URLs (LAN first, then operator extra hosts). */
35488
35761
  var ExportDownloadSchema = zod.z.object({
35489
35762
  url: zod.z.string(),
@@ -35502,24 +35775,77 @@ var ExportBytesSchema = zod.z.object({
35502
35775
  name: zod.z.string(),
35503
35776
  bytes: zod.z.number().int().nonnegative()
35504
35777
  });
35778
+ /** Canonical `profiles[]`, falling back to the legacy singular `profile`. */
35779
+ function resolveExportProfiles(input) {
35780
+ if (input.profiles !== void 0 && input.profiles.length > 0) return [...input.profiles];
35781
+ if (typeof input.profile === "string" && input.profile.length > 0) return [input.profile];
35782
+ return [];
35783
+ }
35505
35784
  var recordingExportCapability = {
35506
35785
  name: "recording-export",
35507
35786
  scope: "system",
35508
35787
  mode: "singleton",
35509
35788
  methods: {
35510
- /** Queue a render of `[fromMs,toMs)` for `deviceId`/`profiles` (legacy
35511
- * singular `profile` still accepted). Fails fast when no footage covers
35512
- * the range. One job per profile; returns the first queued record. */
35789
+ /**
35790
+ * Queue an export of {@link ExportSubjectSchema}.
35791
+ *
35792
+ * `kind:'footage'` — a render of `[fromMs,toMs)` for `deviceId`/`profiles`
35793
+ * (legacy flat input, singular `profile` included, still accepted and
35794
+ * rewritten). Fails fast when no footage covers the range. One job per
35795
+ * profile; **returns the first queued record and the others are reachable
35796
+ * only through `listExports`** — a defect named in D558 § 6.3 and the
35797
+ * reason a clip subject carries exactly ONE profile.
35798
+ *
35799
+ * `kind:'clip'` — a finished file the camera holds, validated against the
35800
+ * device's clip CATALOG (`videoclips.listClips`, at the subject's
35801
+ * `provider`) instead of the recording index, and fetched once by handle
35802
+ * under a bound. Its `fromMs`/`toMs` come from the catalog row and from
35803
+ * nowhere else; a caller supplying a range is refused.
35804
+ *
35805
+ * A clip export reuses the six {@link ExportStateSchema} members and adds
35806
+ * none: the viewer maps an unknown state string to `failed`, so a seventh
35807
+ * member renders every live export — of both kinds — as FAILED on every
35808
+ * installed app (D558 § 6.1, pinned by `export-state-members.spec.ts`).
35809
+ * `subject.kind` is what tells a surface what `rendering` means.
35810
+ */
35513
35811
  createExport: method(zod.z.object({
35514
35812
  deviceId: zod.z.number(),
35515
35813
  /** @deprecated Prefer `profiles`. Kept so timelapse/notifiers keep working. */
35516
35814
  profile: zod.z.string().optional(),
35517
35815
  profiles: zod.z.array(zod.z.string()).min(1).optional(),
35518
- fromMs: zod.z.number(),
35519
- toMs: zod.z.number(),
35816
+ /** Footage only — a clip's boundaries are the camera's. */
35817
+ fromMs: zod.z.number().optional(),
35818
+ toMs: zod.z.number().optional(),
35819
+ /** What to export. Absent means the legacy flat footage request. */
35820
+ subject: ExportSubjectSchema.optional(),
35520
35821
  options: ExportOptionsSchema
35521
35822
  }).superRefine((v, ctx) => {
35522
- if ((v.profiles !== void 0 && v.profiles.length > 0 ? v.profiles : v.profile !== void 0 ? [v.profile] : []).length < 1) ctx.addIssue({
35823
+ if (v.subject?.kind === "clip") {
35824
+ if (v.subject.deviceId !== v.deviceId) ctx.addIssue({
35825
+ code: zod.z.ZodIssueCode.custom,
35826
+ message: `subject.deviceId (${v.subject.deviceId}) must equal deviceId (${v.deviceId}) — the top-level field is what per-device scope enforcement reads`,
35827
+ path: ["subject", "deviceId"]
35828
+ });
35829
+ if (v.fromMs !== void 0 || v.toMs !== void 0) ctx.addIssue({
35830
+ code: zod.z.ZodIssueCode.custom,
35831
+ message: "a clip export asks for no time range: the camera chose the boundaries and they are read from the catalog row",
35832
+ path: ["fromMs"]
35833
+ });
35834
+ return;
35835
+ }
35836
+ if (v.subject?.kind === "footage" && v.subject.deviceId !== v.deviceId) ctx.addIssue({
35837
+ code: zod.z.ZodIssueCode.custom,
35838
+ message: `subject.deviceId (${v.subject.deviceId}) must equal deviceId (${v.deviceId})`,
35839
+ path: ["subject", "deviceId"]
35840
+ });
35841
+ const fromMs = v.subject?.kind === "footage" ? v.subject.fromMs : v.fromMs;
35842
+ const toMs = v.subject?.kind === "footage" ? v.subject.toMs : v.toMs;
35843
+ if (typeof fromMs !== "number" || typeof toMs !== "number") ctx.addIssue({
35844
+ code: zod.z.ZodIssueCode.custom,
35845
+ message: "a footage export needs fromMs and toMs",
35846
+ path: ["fromMs"]
35847
+ });
35848
+ if ((v.subject?.kind === "footage" ? [...v.subject.profiles] : resolveExportProfiles(v)).length < 1) ctx.addIssue({
35523
35849
  code: zod.z.ZodIssueCode.custom,
35524
35850
  message: "pass profiles[] (min 1) or legacy profile",
35525
35851
  path: ["profiles"]
@@ -40184,6 +40510,12 @@ var ALL_CAPABILITY_DEFINITIONS = [
40184
40510
  zonesCapability
40185
40511
  ];
40186
40512
  var METHOD_ACCESS_MAP = Object.freeze({
40513
+ "accessories.getStatus": {
40514
+ capName: "accessories",
40515
+ capScope: "device",
40516
+ addonId: null,
40517
+ access: "view"
40518
+ },
40187
40519
  "accessories.setChildHidden": {
40188
40520
  capName: "accessories",
40189
40521
  capScope: "device",
@@ -40466,6 +40798,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40466
40798
  addonId: null,
40467
40799
  access: "view"
40468
40800
  },
40801
+ "airQualitySensor.getStatus": {
40802
+ capName: "air-quality-sensor",
40803
+ capScope: "device",
40804
+ addonId: null,
40805
+ access: "view"
40806
+ },
40469
40807
  "alarmPanel.arm": {
40470
40808
  capName: "alarm-panel",
40471
40809
  capScope: "device",
@@ -40478,6 +40816,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40478
40816
  addonId: null,
40479
40817
  access: "create"
40480
40818
  },
40819
+ "alarmPanel.getStatus": {
40820
+ capName: "alarm-panel",
40821
+ capScope: "device",
40822
+ addonId: null,
40823
+ access: "view"
40824
+ },
40481
40825
  "alarmPanel.trigger": {
40482
40826
  capName: "alarm-panel",
40483
40827
  capScope: "device",
@@ -40526,6 +40870,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
40526
40870
  addonId: null,
40527
40871
  access: "create"
40528
40872
  },
40873
+ "ambientLightSensor.getStatus": {
40874
+ capName: "ambient-light-sensor",
40875
+ capScope: "device",
40876
+ addonId: null,
40877
+ access: "view"
40878
+ },
40879
+ "audioAnalysis.applyDeviceSettingsPatch": {
40880
+ capName: "audio-analysis",
40881
+ capScope: "device",
40882
+ addonId: null,
40883
+ access: "create"
40884
+ },
40885
+ "audioAnalysis.getDeviceLiveContribution": {
40886
+ capName: "audio-analysis",
40887
+ capScope: "device",
40888
+ addonId: null,
40889
+ access: "view"
40890
+ },
40891
+ "audioAnalysis.getDeviceSettingsContribution": {
40892
+ capName: "audio-analysis",
40893
+ capScope: "device",
40894
+ addonId: null,
40895
+ access: "view"
40896
+ },
40529
40897
  "audioAnalysis.resolveDeviceSettings": {
40530
40898
  capName: "audio-analysis",
40531
40899
  capScope: "device",
@@ -40688,6 +41056,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40688
41056
  addonId: null,
40689
41057
  access: "create"
40690
41058
  },
41059
+ "automationControl.getStatus": {
41060
+ capName: "automation-control",
41061
+ capScope: "device",
41062
+ addonId: null,
41063
+ access: "view"
41064
+ },
40691
41065
  "automationControl.trigger": {
40692
41066
  capName: "automation-control",
40693
41067
  capScope: "device",
@@ -40784,12 +41158,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
40784
41158
  addonId: null,
40785
41159
  access: "create"
40786
41160
  },
41161
+ "battery.getStatus": {
41162
+ capName: "battery",
41163
+ capScope: "device",
41164
+ addonId: null,
41165
+ access: "view"
41166
+ },
40787
41167
  "battery.wakeForStream": {
40788
41168
  capName: "battery",
40789
41169
  capScope: "device",
40790
41170
  addonId: null,
40791
41171
  access: "create"
40792
41172
  },
41173
+ "binary.getStatus": {
41174
+ capName: "binary",
41175
+ capScope: "device",
41176
+ addonId: null,
41177
+ access: "view"
41178
+ },
41179
+ "brightness.getStatus": {
41180
+ capName: "brightness",
41181
+ capScope: "device",
41182
+ addonId: null,
41183
+ access: "view"
41184
+ },
40793
41185
  "brightness.setBrightness": {
40794
41186
  capName: "brightness",
40795
41187
  capScope: "device",
@@ -40904,6 +41296,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
40904
41296
  addonId: null,
40905
41297
  access: "view"
40906
41298
  },
41299
+ "cameraCredentials.getStatus": {
41300
+ capName: "camera-credentials",
41301
+ capScope: "device",
41302
+ addonId: null,
41303
+ access: "view"
41304
+ },
41305
+ "cameraGridLayout.applyDeviceSettingsPatch": {
41306
+ capName: "camera-grid-layout",
41307
+ capScope: "device",
41308
+ addonId: null,
41309
+ access: "create"
41310
+ },
41311
+ "cameraGridLayout.getDeviceLiveContribution": {
41312
+ capName: "camera-grid-layout",
41313
+ capScope: "device",
41314
+ addonId: null,
41315
+ access: "view"
41316
+ },
41317
+ "cameraGridLayout.getDeviceSettingsContribution": {
41318
+ capName: "camera-grid-layout",
41319
+ capScope: "device",
41320
+ addonId: null,
41321
+ access: "view"
41322
+ },
40907
41323
  "cameraGridLayout.getLayout": {
40908
41324
  capName: "camera-grid-layout",
40909
41325
  capScope: "device",
@@ -40916,6 +41332,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
40916
41332
  addonId: null,
40917
41333
  access: "create"
40918
41334
  },
41335
+ "cameraPipelineConfig.applyDeviceSettingsPatch": {
41336
+ capName: "camera-pipeline-config",
41337
+ capScope: "device",
41338
+ addonId: null,
41339
+ access: "create"
41340
+ },
41341
+ "cameraPipelineConfig.getDeviceLiveContribution": {
41342
+ capName: "camera-pipeline-config",
41343
+ capScope: "device",
41344
+ addonId: null,
41345
+ access: "view"
41346
+ },
41347
+ "cameraPipelineConfig.getDeviceSettingsContribution": {
41348
+ capName: "camera-pipeline-config",
41349
+ capScope: "device",
41350
+ addonId: null,
41351
+ access: "view"
41352
+ },
40919
41353
  "cameraStreams.getBrokerStreams": {
40920
41354
  capName: "camera-streams",
40921
41355
  capScope: "device",
@@ -40946,6 +41380,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
40946
41380
  addonId: null,
40947
41381
  access: "view"
40948
41382
  },
41383
+ "carbonMonoxide.getStatus": {
41384
+ capName: "carbon-monoxide",
41385
+ capScope: "device",
41386
+ addonId: null,
41387
+ access: "view"
41388
+ },
41389
+ "climateControl.getStatus": {
41390
+ capName: "climate-control",
41391
+ capScope: "device",
41392
+ addonId: null,
41393
+ access: "view"
41394
+ },
40949
41395
  "climateControl.setFanMode": {
40950
41396
  capName: "climate-control",
40951
41397
  capScope: "device",
@@ -40994,6 +41440,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40994
41440
  addonId: null,
40995
41441
  access: "create"
40996
41442
  },
41443
+ "color.getStatus": {
41444
+ capName: "color",
41445
+ capScope: "device",
41446
+ addonId: null,
41447
+ access: "view"
41448
+ },
40997
41449
  "color.setColor": {
40998
41450
  capName: "color",
40999
41451
  capScope: "device",
@@ -41012,12 +41464,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
41012
41464
  addonId: null,
41013
41465
  access: "create"
41014
41466
  },
41467
+ "connectivity.getStatus": {
41468
+ capName: "connectivity",
41469
+ capScope: "device",
41470
+ addonId: null,
41471
+ access: "view"
41472
+ },
41473
+ "consumables.getStatus": {
41474
+ capName: "consumables",
41475
+ capScope: "device",
41476
+ addonId: null,
41477
+ access: "view"
41478
+ },
41015
41479
  "consumables.reset": {
41016
41480
  capName: "consumables",
41017
41481
  capScope: "device",
41018
41482
  addonId: null,
41019
41483
  access: "delete"
41020
41484
  },
41485
+ "contact.getStatus": {
41486
+ capName: "contact",
41487
+ capScope: "device",
41488
+ addonId: null,
41489
+ access: "view"
41490
+ },
41491
+ "control.getStatus": {
41492
+ capName: "control",
41493
+ capScope: "device",
41494
+ addonId: null,
41495
+ access: "view"
41496
+ },
41021
41497
  "control.setValue": {
41022
41498
  capName: "control",
41023
41499
  capScope: "device",
@@ -41084,6 +41560,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41084
41560
  addonId: null,
41085
41561
  access: "create"
41086
41562
  },
41563
+ "cover.getStatus": {
41564
+ capName: "cover",
41565
+ capScope: "device",
41566
+ addonId: null,
41567
+ access: "view"
41568
+ },
41087
41569
  "cover.open": {
41088
41570
  capName: "cover",
41089
41571
  capScope: "device",
@@ -41216,6 +41698,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41216
41698
  addonId: null,
41217
41699
  access: "view"
41218
41700
  },
41701
+ "dayNight.getStatus": {
41702
+ capName: "day-night",
41703
+ capScope: "device",
41704
+ addonId: null,
41705
+ access: "view"
41706
+ },
41219
41707
  "dayNight.setSettings": {
41220
41708
  capName: "day-night",
41221
41709
  capScope: "device",
@@ -41306,6 +41794,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
41306
41794
  addonId: null,
41307
41795
  access: "view"
41308
41796
  },
41797
+ "detectionPipeline.applyDeviceSettingsPatch": {
41798
+ capName: "detection-pipeline",
41799
+ capScope: "device",
41800
+ addonId: null,
41801
+ access: "create"
41802
+ },
41803
+ "detectionPipeline.getDeviceLiveContribution": {
41804
+ capName: "detection-pipeline",
41805
+ capScope: "device",
41806
+ addonId: null,
41807
+ access: "view"
41808
+ },
41809
+ "detectionPipeline.getDeviceSettingsContribution": {
41810
+ capName: "detection-pipeline",
41811
+ capScope: "device",
41812
+ addonId: null,
41813
+ access: "view"
41814
+ },
41309
41815
  "deviceAdoption.adopt": {
41310
41816
  capName: "device-adoption",
41311
41817
  capScope: "system",
@@ -41318,6 +41824,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41318
41824
  addonId: null,
41319
41825
  access: "view"
41320
41826
  },
41827
+ "deviceAdoption.getStatus": {
41828
+ capName: "device-adoption",
41829
+ capScope: "system",
41830
+ addonId: null,
41831
+ access: "view"
41832
+ },
41321
41833
  "deviceAdoption.listCandidateFilters": {
41322
41834
  capName: "device-adoption",
41323
41835
  capScope: "system",
@@ -41354,6 +41866,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41354
41866
  addonId: null,
41355
41867
  access: "create"
41356
41868
  },
41869
+ "deviceDiscovery.getStatus": {
41870
+ capName: "device-discovery",
41871
+ capScope: "device",
41872
+ addonId: null,
41873
+ access: "view"
41874
+ },
41357
41875
  "deviceDiscovery.listDiscovered": {
41358
41876
  capName: "device-discovery",
41359
41877
  capScope: "device",
@@ -41372,12 +41890,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
41372
41890
  addonId: null,
41373
41891
  access: "create"
41374
41892
  },
41893
+ "deviceExport.applyDeviceSettingsPatch": {
41894
+ capName: "device-export",
41895
+ capScope: "system",
41896
+ addonId: null,
41897
+ access: "create"
41898
+ },
41375
41899
  "deviceExport.exposeDevice": {
41376
41900
  capName: "device-export",
41377
41901
  capScope: "system",
41378
41902
  addonId: null,
41379
41903
  access: "create"
41380
41904
  },
41905
+ "deviceExport.getDeviceLiveContribution": {
41906
+ capName: "device-export",
41907
+ capScope: "system",
41908
+ addonId: null,
41909
+ access: "view"
41910
+ },
41911
+ "deviceExport.getDeviceSettingsContribution": {
41912
+ capName: "device-export",
41913
+ capScope: "system",
41914
+ addonId: null,
41915
+ access: "view"
41916
+ },
41381
41917
  "deviceExport.getStatus": {
41382
41918
  capName: "device-export",
41383
41919
  capScope: "system",
@@ -41474,6 +42010,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41474
42010
  addonId: null,
41475
42011
  access: "create"
41476
42012
  },
42013
+ "deviceManager.applyDeviceSettingsPatch": {
42014
+ capName: "device-manager",
42015
+ capScope: "system",
42016
+ addonId: null,
42017
+ access: "create"
42018
+ },
41477
42019
  "deviceManager.applyInitialMeta": {
41478
42020
  capName: "device-manager",
41479
42021
  capScope: "system",
@@ -41576,6 +42118,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41576
42118
  addonId: null,
41577
42119
  access: "view"
41578
42120
  },
42121
+ "deviceManager.getDeviceLiveContribution": {
42122
+ capName: "device-manager",
42123
+ capScope: "system",
42124
+ addonId: null,
42125
+ access: "view"
42126
+ },
41579
42127
  "deviceManager.getDeviceLiveInfoAggregate": {
41580
42128
  capName: "device-manager",
41581
42129
  capScope: "system",
@@ -41588,6 +42136,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41588
42136
  addonId: null,
41589
42137
  access: "view"
41590
42138
  },
42139
+ "deviceManager.getDeviceSettingsContribution": {
42140
+ capName: "device-manager",
42141
+ capScope: "system",
42142
+ addonId: null,
42143
+ access: "view"
42144
+ },
41591
42145
  "deviceManager.getDeviceStatusAggregate": {
41592
42146
  capName: "device-manager",
41593
42147
  capScope: "system",
@@ -42080,6 +42634,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
42080
42634
  addonId: null,
42081
42635
  access: "create"
42082
42636
  },
42637
+ "deviceStatus.getStatus": {
42638
+ capName: "device-status",
42639
+ capScope: "device",
42640
+ addonId: null,
42641
+ access: "view"
42642
+ },
42643
+ "doorbell.applyDeviceSettingsPatch": {
42644
+ capName: "doorbell",
42645
+ capScope: "device",
42646
+ addonId: null,
42647
+ access: "create"
42648
+ },
42649
+ "doorbell.getDeviceLiveContribution": {
42650
+ capName: "doorbell",
42651
+ capScope: "device",
42652
+ addonId: null,
42653
+ access: "view"
42654
+ },
42655
+ "doorbell.getDeviceSettingsContribution": {
42656
+ capName: "doorbell",
42657
+ capScope: "device",
42658
+ addonId: null,
42659
+ access: "view"
42660
+ },
42661
+ "doorbell.getStatus": {
42662
+ capName: "doorbell",
42663
+ capScope: "device",
42664
+ addonId: null,
42665
+ access: "view"
42666
+ },
42083
42667
  "embeddingEncoder.encode": {
42084
42668
  capName: "embedding-encoder",
42085
42669
  capScope: "system",
@@ -42098,6 +42682,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
42098
42682
  addonId: null,
42099
42683
  access: "view"
42100
42684
  },
42685
+ "enumSensor.getStatus": {
42686
+ capName: "enum-sensor",
42687
+ capScope: "device",
42688
+ addonId: null,
42689
+ access: "view"
42690
+ },
42691
+ "eventEmitter.getStatus": {
42692
+ capName: "event-emitter",
42693
+ capScope: "device",
42694
+ addonId: null,
42695
+ access: "view"
42696
+ },
42101
42697
  "events.getEventClipUrl": {
42102
42698
  capName: "events",
42103
42699
  capScope: "device",
@@ -42218,6 +42814,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42218
42814
  addonId: null,
42219
42815
  access: "view"
42220
42816
  },
42817
+ "fanControl.getStatus": {
42818
+ capName: "fan-control",
42819
+ capScope: "device",
42820
+ addonId: null,
42821
+ access: "view"
42822
+ },
42221
42823
  "fanControl.setDirection": {
42222
42824
  capName: "fan-control",
42223
42825
  capScope: "device",
@@ -42242,6 +42844,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42242
42844
  addonId: null,
42243
42845
  access: "create"
42244
42846
  },
42847
+ "featureProbe.getStatus": {
42848
+ capName: "feature-probe",
42849
+ capScope: "device",
42850
+ addonId: null,
42851
+ access: "view"
42852
+ },
42245
42853
  "filesystemBrowse.browse": {
42246
42854
  capName: "filesystem-browse",
42247
42855
  capScope: "system",
@@ -42260,6 +42868,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
42260
42868
  addonId: null,
42261
42869
  access: "view"
42262
42870
  },
42871
+ "flood.getStatus": {
42872
+ capName: "flood",
42873
+ capScope: "device",
42874
+ addonId: null,
42875
+ access: "view"
42876
+ },
42877
+ "gas.getStatus": {
42878
+ capName: "gas",
42879
+ capScope: "device",
42880
+ addonId: null,
42881
+ access: "view"
42882
+ },
42883
+ "humidifier.getStatus": {
42884
+ capName: "humidifier",
42885
+ capScope: "device",
42886
+ addonId: null,
42887
+ access: "view"
42888
+ },
42263
42889
  "humidifier.setMode": {
42264
42890
  capName: "humidifier",
42265
42891
  capScope: "device",
@@ -42278,12 +42904,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
42278
42904
  addonId: null,
42279
42905
  access: "create"
42280
42906
  },
42907
+ "humiditySensor.getStatus": {
42908
+ capName: "humidity-sensor",
42909
+ capScope: "device",
42910
+ addonId: null,
42911
+ access: "view"
42912
+ },
42913
+ "image.getStatus": {
42914
+ capName: "image",
42915
+ capScope: "device",
42916
+ addonId: null,
42917
+ access: "view"
42918
+ },
42281
42919
  "imageSettings.getOptions": {
42282
42920
  capName: "image-settings",
42283
42921
  capScope: "device",
42284
42922
  addonId: null,
42285
42923
  access: "view"
42286
42924
  },
42925
+ "imageSettings.getStatus": {
42926
+ capName: "image-settings",
42927
+ capScope: "device",
42928
+ addonId: null,
42929
+ access: "view"
42930
+ },
42287
42931
  "imageSettings.setSettings": {
42288
42932
  capName: "image-settings",
42289
42933
  capScope: "device",
@@ -42356,6 +43000,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42356
43000
  addonId: null,
42357
43001
  access: "create"
42358
43002
  },
43003
+ "intercom.getStatus": {
43004
+ capName: "intercom",
43005
+ capScope: "device",
43006
+ addonId: null,
43007
+ access: "view"
43008
+ },
42359
43009
  "intercom.handleAnswer": {
42360
43010
  capName: "intercom",
42361
43011
  capScope: "device",
@@ -42392,6 +43042,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42392
43042
  addonId: null,
42393
43043
  access: "create"
42394
43044
  },
43045
+ "lawnMowerControl.getStatus": {
43046
+ capName: "lawn-mower-control",
43047
+ capScope: "device",
43048
+ addonId: null,
43049
+ access: "view"
43050
+ },
42395
43051
  "lawnMowerControl.pause": {
42396
43052
  capName: "lawn-mower-control",
42397
43053
  capScope: "device",
@@ -42674,6 +43330,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42674
43330
  addonId: null,
42675
43331
  access: "create"
42676
43332
  },
43333
+ "lockControl.getStatus": {
43334
+ capName: "lock-control",
43335
+ capScope: "device",
43336
+ addonId: null,
43337
+ access: "view"
43338
+ },
42677
43339
  "lockControl.lock": {
42678
43340
  capName: "lock-control",
42679
43341
  capScope: "device",
@@ -42722,6 +43384,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42722
43384
  addonId: null,
42723
43385
  access: "view"
42724
43386
  },
43387
+ "mediaPlayer.getStatus": {
43388
+ capName: "media-player",
43389
+ capScope: "device",
43390
+ addonId: null,
43391
+ access: "view"
43392
+ },
42725
43393
  "mediaPlayer.next": {
42726
43394
  capName: "media-player",
42727
43395
  capScope: "device",
@@ -42914,6 +43582,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42914
43582
  addonId: null,
42915
43583
  access: "create"
42916
43584
  },
43585
+ "motion.getStatus": {
43586
+ capName: "motion",
43587
+ capScope: "device",
43588
+ addonId: null,
43589
+ access: "view"
43590
+ },
42917
43591
  "motion.isDetected": {
42918
43592
  capName: "motion",
42919
43593
  capScope: "device",
@@ -42926,6 +43600,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
42926
43600
  addonId: null,
42927
43601
  access: "create"
42928
43602
  },
43603
+ "motionDetection.applyDeviceSettingsPatch": {
43604
+ capName: "motion-detection",
43605
+ capScope: "device",
43606
+ addonId: null,
43607
+ access: "create"
43608
+ },
43609
+ "motionDetection.getDeviceLiveContribution": {
43610
+ capName: "motion-detection",
43611
+ capScope: "device",
43612
+ addonId: null,
43613
+ access: "view"
43614
+ },
43615
+ "motionDetection.getDeviceSettingsContribution": {
43616
+ capName: "motion-detection",
43617
+ capScope: "device",
43618
+ addonId: null,
43619
+ access: "view"
43620
+ },
42929
43621
  "motionDetection.removeCamera": {
42930
43622
  capName: "motion-detection",
42931
43623
  capScope: "device",
@@ -42938,6 +43630,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42938
43630
  addonId: null,
42939
43631
  access: "delete"
42940
43632
  },
43633
+ "motionTrigger.getStatus": {
43634
+ capName: "motion-trigger",
43635
+ capScope: "device",
43636
+ addonId: null,
43637
+ access: "view"
43638
+ },
42941
43639
  "motionTrigger.setMotionTrigger": {
42942
43640
  capName: "motion-trigger",
42943
43641
  capScope: "device",
@@ -42950,6 +43648,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42950
43648
  addonId: null,
42951
43649
  access: "view"
42952
43650
  },
43651
+ "motionZones.getStatus": {
43652
+ capName: "motion-zones",
43653
+ capScope: "device",
43654
+ addonId: null,
43655
+ access: "view"
43656
+ },
42953
43657
  "motionZones.setZone": {
42954
43658
  capName: "motion-zones",
42955
43659
  capScope: "device",
@@ -43010,6 +43714,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43010
43714
  addonId: null,
43011
43715
  access: "view"
43012
43716
  },
43717
+ "nativeObjectDetection.getStatus": {
43718
+ capName: "native-object-detection",
43719
+ capScope: "device",
43720
+ addonId: null,
43721
+ access: "view"
43722
+ },
43013
43723
  "nativeObjectDetection.setEnabled": {
43014
43724
  capName: "native-object-detection",
43015
43725
  capScope: "device",
@@ -43028,6 +43738,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43028
43738
  addonId: null,
43029
43739
  access: "view"
43030
43740
  },
43741
+ "navigation.getStatus": {
43742
+ capName: "navigation",
43743
+ capScope: "device",
43744
+ addonId: null,
43745
+ access: "view"
43746
+ },
43031
43747
  "navigation.goToPoint": {
43032
43748
  capName: "navigation",
43033
43749
  capScope: "device",
@@ -43112,6 +43828,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43112
43828
  addonId: null,
43113
43829
  access: "create"
43114
43830
  },
43831
+ "networkLink.getStatus": {
43832
+ capName: "network-link",
43833
+ capScope: "device",
43834
+ addonId: null,
43835
+ access: "view"
43836
+ },
43115
43837
  "networkQuality.getAllStats": {
43116
43838
  capName: "network-quality",
43117
43839
  capScope: "system",
@@ -43370,18 +44092,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
43370
44092
  addonId: null,
43371
44093
  access: "create"
43372
44094
  },
44095
+ "notifier.getStatus": {
44096
+ capName: "notifier",
44097
+ capScope: "device",
44098
+ addonId: null,
44099
+ access: "view"
44100
+ },
43373
44101
  "notifier.send": {
43374
44102
  capName: "notifier",
43375
44103
  capScope: "device",
43376
44104
  addonId: null,
43377
44105
  access: "create"
43378
44106
  },
44107
+ "numericSensor.getStatus": {
44108
+ capName: "numeric-sensor",
44109
+ capScope: "device",
44110
+ addonId: null,
44111
+ access: "view"
44112
+ },
43379
44113
  "oauthIntegration.getDescriptor": {
43380
44114
  capName: "oauth-integration",
43381
44115
  capScope: "system",
43382
44116
  addonId: null,
43383
44117
  access: "view"
43384
44118
  },
44119
+ "osd.getStatus": {
44120
+ capName: "osd",
44121
+ capScope: "device",
44122
+ addonId: null,
44123
+ access: "view"
44124
+ },
43385
44125
  "osd.setOverlay": {
43386
44126
  capName: "osd",
43387
44127
  capScope: "device",
@@ -43454,6 +44194,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43454
44194
  addonId: null,
43455
44195
  access: "create"
43456
44196
  },
44197
+ "petFeeder.getStatus": {
44198
+ capName: "pet-feeder",
44199
+ capScope: "device",
44200
+ addonId: null,
44201
+ access: "view"
44202
+ },
43457
44203
  "petFeeder.markFoodReplenished": {
43458
44204
  capName: "pet-feeder",
43459
44205
  capScope: "device",
@@ -43496,6 +44242,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43496
44242
  addonId: null,
43497
44243
  access: "create"
43498
44244
  },
44245
+ "pipelineAnalytics.applyDeviceSettingsPatch": {
44246
+ capName: "pipeline-analytics",
44247
+ capScope: "device",
44248
+ addonId: null,
44249
+ access: "create"
44250
+ },
43499
44251
  "pipelineAnalytics.cancelRelocateMedia": {
43500
44252
  capName: "pipeline-analytics",
43501
44253
  capScope: "device",
@@ -43562,6 +44314,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
43562
44314
  addonId: null,
43563
44315
  access: "view"
43564
44316
  },
44317
+ "pipelineAnalytics.getDeviceLiveContribution": {
44318
+ capName: "pipeline-analytics",
44319
+ capScope: "device",
44320
+ addonId: null,
44321
+ access: "view"
44322
+ },
44323
+ "pipelineAnalytics.getDeviceSettingsContribution": {
44324
+ capName: "pipeline-analytics",
44325
+ capScope: "device",
44326
+ addonId: null,
44327
+ access: "view"
44328
+ },
43565
44329
  "pipelineAnalytics.getEventDensity": {
43566
44330
  capName: "pipeline-analytics",
43567
44331
  capScope: "device",
@@ -44132,6 +44896,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44132
44896
  addonId: null,
44133
44897
  access: "view"
44134
44898
  },
44899
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
44900
+ capName: "pipeline-orchestrator",
44901
+ capScope: "system",
44902
+ addonId: null,
44903
+ access: "create"
44904
+ },
44135
44905
  "pipelineOrchestrator.assignAudio": {
44136
44906
  capName: "pipeline-orchestrator",
44137
44907
  capScope: "system",
@@ -44222,6 +44992,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
44222
44992
  addonId: null,
44223
44993
  access: "view"
44224
44994
  },
44995
+ "pipelineOrchestrator.getDeviceLiveContribution": {
44996
+ capName: "pipeline-orchestrator",
44997
+ capScope: "system",
44998
+ addonId: null,
44999
+ access: "view"
45000
+ },
45001
+ "pipelineOrchestrator.getDeviceSettingsContribution": {
45002
+ capName: "pipeline-orchestrator",
45003
+ capScope: "system",
45004
+ addonId: null,
45005
+ access: "view"
45006
+ },
44225
45007
  "pipelineOrchestrator.getGlobalMetrics": {
44226
45008
  capName: "pipeline-orchestrator",
44227
45009
  capScope: "system",
@@ -44630,12 +45412,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
44630
45412
  addonId: null,
44631
45413
  access: "view"
44632
45414
  },
45415
+ "powerMeter.getStatus": {
45416
+ capName: "power-meter",
45417
+ capScope: "device",
45418
+ addonId: null,
45419
+ access: "view"
45420
+ },
45421
+ "presence.getStatus": {
45422
+ capName: "presence",
45423
+ capScope: "device",
45424
+ addonId: null,
45425
+ access: "view"
45426
+ },
45427
+ "pressureSensor.getStatus": {
45428
+ capName: "pressure-sensor",
45429
+ capScope: "device",
45430
+ addonId: null,
45431
+ access: "view"
45432
+ },
44633
45433
  "privacyMask.getOptions": {
44634
45434
  capName: "privacy-mask",
44635
45435
  capScope: "device",
44636
45436
  addonId: null,
44637
45437
  access: "view"
44638
45438
  },
45439
+ "privacyMask.getStatus": {
45440
+ capName: "privacy-mask",
45441
+ capScope: "device",
45442
+ addonId: null,
45443
+ access: "view"
45444
+ },
44639
45445
  "privacyMask.setAudioEnabled": {
44640
45446
  capName: "privacy-mask",
44641
45447
  capScope: "device",
@@ -44696,6 +45502,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44696
45502
  addonId: null,
44697
45503
  access: "view"
44698
45504
  },
45505
+ "ptz.getStatus": {
45506
+ capName: "ptz",
45507
+ capScope: "device",
45508
+ addonId: null,
45509
+ access: "view"
45510
+ },
44699
45511
  "ptz.goHome": {
44700
45512
  capName: "ptz",
44701
45513
  capScope: "device",
@@ -44774,6 +45586,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44774
45586
  addonId: null,
44775
45587
  access: "create"
44776
45588
  },
45589
+ "recording.applyDeviceSettingsPatch": {
45590
+ capName: "recording",
45591
+ capScope: "system",
45592
+ addonId: null,
45593
+ access: "create"
45594
+ },
44777
45595
  "recording.cancelRelocateJob": {
44778
45596
  capName: "recording",
44779
45597
  capScope: "system",
@@ -44822,6 +45640,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
44822
45640
  addonId: null,
44823
45641
  access: "view"
44824
45642
  },
45643
+ "recording.getDeviceLiveContribution": {
45644
+ capName: "recording",
45645
+ capScope: "system",
45646
+ addonId: null,
45647
+ access: "view"
45648
+ },
45649
+ "recording.getDeviceSettingsContribution": {
45650
+ capName: "recording",
45651
+ capScope: "system",
45652
+ addonId: null,
45653
+ access: "view"
45654
+ },
44825
45655
  "recording.getPlacement": {
44826
45656
  capName: "recording",
44827
45657
  capScope: "system",
@@ -44840,6 +45670,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44840
45670
  addonId: null,
44841
45671
  access: "view"
44842
45672
  },
45673
+ "recording.getStatus": {
45674
+ capName: "recording",
45675
+ capScope: "system",
45676
+ addonId: null,
45677
+ access: "view"
45678
+ },
44843
45679
  "recording.getStorageMigrationMoveStatus": {
44844
45680
  capName: "recording",
44845
45681
  capScope: "system",
@@ -45044,6 +45880,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45044
45880
  addonId: null,
45045
45881
  access: "delete"
45046
45882
  },
45883
+ "sceneMonitor.getStatus": {
45884
+ capName: "scene-monitor",
45885
+ capScope: "device",
45886
+ addonId: null,
45887
+ access: "view"
45888
+ },
45047
45889
  "sceneMonitor.listScenes": {
45048
45890
  capName: "scene-monitor",
45049
45891
  capScope: "device",
@@ -45074,6 +45916,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45074
45916
  addonId: null,
45075
45917
  access: "create"
45076
45918
  },
45919
+ "scriptRunner.getStatus": {
45920
+ capName: "script-runner",
45921
+ capScope: "device",
45922
+ addonId: null,
45923
+ access: "view"
45924
+ },
45077
45925
  "scriptRunner.run": {
45078
45926
  capName: "script-runner",
45079
45927
  capScope: "device",
@@ -45206,6 +46054,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45206
46054
  addonId: null,
45207
46055
  access: "create"
45208
46056
  },
46057
+ "smoke.getStatus": {
46058
+ capName: "smoke",
46059
+ capScope: "device",
46060
+ addonId: null,
46061
+ access: "view"
46062
+ },
45209
46063
  "smtpProvider.getStatus": {
45210
46064
  capName: "smtp-provider",
45211
46065
  capScope: "system",
@@ -45224,12 +46078,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
45224
46078
  addonId: null,
45225
46079
  access: "view"
45226
46080
  },
46081
+ "snapshot.applyDeviceSettingsPatch": {
46082
+ capName: "snapshot",
46083
+ capScope: "device",
46084
+ addonId: null,
46085
+ access: "create"
46086
+ },
45227
46087
  "snapshot.getDebugState": {
45228
46088
  capName: "snapshot",
45229
46089
  capScope: "device",
45230
46090
  addonId: null,
45231
46091
  access: "view"
45232
46092
  },
46093
+ "snapshot.getDeviceLiveContribution": {
46094
+ capName: "snapshot",
46095
+ capScope: "device",
46096
+ addonId: null,
46097
+ access: "view"
46098
+ },
46099
+ "snapshot.getDeviceSettingsContribution": {
46100
+ capName: "snapshot",
46101
+ capScope: "device",
46102
+ addonId: null,
46103
+ access: "view"
46104
+ },
45233
46105
  "snapshot.getSnapshot": {
45234
46106
  capName: "snapshot",
45235
46107
  capScope: "device",
@@ -45248,6 +46120,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45248
46120
  addonId: null,
45249
46121
  access: "view"
45250
46122
  },
46123
+ "snapshot.getStatus": {
46124
+ capName: "snapshot",
46125
+ capScope: "device",
46126
+ addonId: null,
46127
+ access: "view"
46128
+ },
45251
46129
  "snapshot.invalidateCache": {
45252
46130
  capName: "snapshot",
45253
46131
  capScope: "device",
@@ -45584,6 +46462,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45584
46462
  addonId: null,
45585
46463
  access: "create"
45586
46464
  },
46465
+ "streamBroker.applyDeviceSettingsPatch": {
46466
+ capName: "stream-broker",
46467
+ capScope: "system",
46468
+ addonId: null,
46469
+ access: "create"
46470
+ },
45587
46471
  "streamBroker.assignProfile": {
45588
46472
  capName: "stream-broker",
45589
46473
  capScope: "system",
@@ -45620,6 +46504,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
45620
46504
  addonId: null,
45621
46505
  access: "view"
45622
46506
  },
46507
+ "streamBroker.getDeviceLiveContribution": {
46508
+ capName: "stream-broker",
46509
+ capScope: "system",
46510
+ addonId: null,
46511
+ access: "view"
46512
+ },
46513
+ "streamBroker.getDeviceSettingsContribution": {
46514
+ capName: "stream-broker",
46515
+ capScope: "system",
46516
+ addonId: null,
46517
+ access: "view"
46518
+ },
45623
46519
  "streamBroker.getPreBufferInfo": {
45624
46520
  capName: "stream-broker",
45625
46521
  capScope: "system",
@@ -45818,6 +46714,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45818
46714
  addonId: null,
45819
46715
  access: "view"
45820
46716
  },
46717
+ "streamParams.getStatus": {
46718
+ capName: "stream-params",
46719
+ capScope: "device",
46720
+ addonId: null,
46721
+ access: "view"
46722
+ },
45821
46723
  "streamParams.setProfile": {
45822
46724
  capName: "stream-params",
45823
46725
  capScope: "device",
@@ -45830,6 +46732,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45830
46732
  addonId: null,
45831
46733
  access: "view"
45832
46734
  },
46735
+ "switch.getStatus": {
46736
+ capName: "switch",
46737
+ capScope: "device",
46738
+ addonId: null,
46739
+ access: "view"
46740
+ },
45833
46741
  "switch.setState": {
45834
46742
  capName: "switch",
45835
46743
  capScope: "device",
@@ -45926,6 +46834,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
45926
46834
  addonId: null,
45927
46835
  access: "create"
45928
46836
  },
46837
+ "tamper.getStatus": {
46838
+ capName: "tamper",
46839
+ capScope: "device",
46840
+ addonId: null,
46841
+ access: "view"
46842
+ },
46843
+ "temperatureSensor.getStatus": {
46844
+ capName: "temperature-sensor",
46845
+ capScope: "device",
46846
+ addonId: null,
46847
+ access: "view"
46848
+ },
45929
46849
  "terminalSession.adoptLegacyMonitor": {
45930
46850
  capName: "terminal-session",
45931
46851
  capScope: "system",
@@ -46022,6 +46942,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46022
46942
  addonId: null,
46023
46943
  access: "view"
46024
46944
  },
46945
+ "update.getStatus": {
46946
+ capName: "update",
46947
+ capScope: "device",
46948
+ addonId: null,
46949
+ access: "view"
46950
+ },
46025
46951
  "update.installUpdate": {
46026
46952
  capName: "update",
46027
46953
  capScope: "device",
@@ -46244,6 +47170,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46244
47170
  addonId: null,
46245
47171
  access: "create"
46246
47172
  },
47173
+ "vacuumControl.getStatus": {
47174
+ capName: "vacuum-control",
47175
+ capScope: "device",
47176
+ addonId: null,
47177
+ access: "view"
47178
+ },
46247
47179
  "vacuumControl.locate": {
46248
47180
  capName: "vacuum-control",
46249
47181
  capScope: "device",
@@ -46286,6 +47218,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46286
47218
  addonId: null,
46287
47219
  access: "create"
46288
47220
  },
47221
+ "valve.getStatus": {
47222
+ capName: "valve",
47223
+ capScope: "device",
47224
+ addonId: null,
47225
+ access: "view"
47226
+ },
46289
47227
  "valve.open": {
46290
47228
  capName: "valve",
46291
47229
  capScope: "device",
@@ -46358,6 +47296,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46358
47296
  addonId: null,
46359
47297
  access: "create"
46360
47298
  },
47299
+ "vibration.getStatus": {
47300
+ capName: "vibration",
47301
+ capScope: "device",
47302
+ addonId: null,
47303
+ access: "view"
47304
+ },
46361
47305
  "videoclips.getClipPlayback": {
46362
47306
  capName: "videoclips",
46363
47307
  capScope: "device",
@@ -46376,6 +47320,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46376
47320
  addonId: null,
46377
47321
  access: "view"
46378
47322
  },
47323
+ "videoclips.readClipBytes": {
47324
+ capName: "videoclips",
47325
+ capScope: "device",
47326
+ addonId: null,
47327
+ access: "view"
47328
+ },
46379
47329
  "viewerUi.getStaticDir": {
46380
47330
  capName: "viewer-ui",
46381
47331
  capScope: "system",
@@ -46388,6 +47338,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46388
47338
  addonId: null,
46389
47339
  access: "view"
46390
47340
  },
47341
+ "waterHeater.getStatus": {
47342
+ capName: "water-heater",
47343
+ capScope: "device",
47344
+ addonId: null,
47345
+ access: "view"
47346
+ },
46391
47347
  "waterHeater.setAway": {
46392
47348
  capName: "water-heater",
46393
47349
  capScope: "device",
@@ -46406,6 +47362,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46406
47362
  addonId: null,
46407
47363
  access: "create"
46408
47364
  },
47365
+ "weather.getStatus": {
47366
+ capName: "weather",
47367
+ capScope: "device",
47368
+ addonId: null,
47369
+ access: "view"
47370
+ },
46409
47371
  "webrtcSession.addIceCandidate": {
46410
47372
  capName: "webrtc-session",
46411
47373
  capScope: "device",
@@ -48394,6 +49356,11 @@ Object.freeze({
48394
49356
  form: "single",
48395
49357
  optional: false
48396
49358
  }],
49359
+ "videoclips.readClipBytes": [{
49360
+ name: "deviceId",
49361
+ form: "single",
49362
+ optional: false
49363
+ }],
48397
49364
  "waterHeater.setAway": [{
48398
49365
  name: "deviceId",
48399
49366
  form: "single",