@camstack/types 1.2.237 → 1.2.239

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.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-Cqxm5OIN.js");
2
+ const require_sleep = require("./sleep-C0n7gucP.js");
3
3
  const require_event_category = require("./event-category-BVfsrBYA.js");
4
4
  const require_canonical_hash = require("./canonical-hash-CSE4ioRi.js");
5
5
  const require_enums = require("./enums.js");
@@ -27462,6 +27462,77 @@ var ClipPlaybackSchema = zod.z.object({
27462
27462
  * which days it asked for and got nothing — "no clips" would be a lie about a
27463
27463
  * card that is full of them.
27464
27464
  */
27465
+ /**
27466
+ * The operator's authorisation to WAKE a sleeping camera for one clip read.
27467
+ *
27468
+ * ONE value, absent by default, and it is a `force`-shaped operator signal in
27469
+ * exactly the sense `snapshot-wake-gate.ts` uses the word: *"`snapshot.getSnapshot`'s
27470
+ * `force` flag, and nothing else… a background caller must never set it…
27471
+ * Stale but honest beats woken"*. A scheduler, a retry, a reconcile and a
27472
+ * prefetch never set it; a surface sets it only behind the same confirm the
27473
+ * "Wake and refresh" gesture uses, and it is refused below 15 % battery
27474
+ * exactly as that gesture is.
27475
+ *
27476
+ * The gate is decided BEFORE `getApi()`, because on UDP the login IS the wake
27477
+ * (D549) — a read that opened a session and then checked would have woken the
27478
+ * camera to find out it was not allowed to.
27479
+ *
27480
+ * **One authorised yes is one wake.** `next-natural` — take the clip the next
27481
+ * time the camera is awake for its own reasons — is deliberately not a member:
27482
+ * it was proposed, it is free on the battery, and the operator declined it on
27483
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
27484
+ * D558 "Considered and not taken").
27485
+ */
27486
+ var ClipWakeSchema = zod.z.enum(["authorised"]);
27487
+ /**
27488
+ * Hard ceiling on ONE {@link videoclipsCapability.methods.readClipBytes} — the
27489
+ * same 50 MiB `RECORDING_EXPORT_MAX_READ_BYTES` uses, and for the same second
27490
+ * reason: the envelope is unary, so a base64 payload is held whole (~1.33× its
27491
+ * size) in the provider AND in the caller, on a hub this repo has already
27492
+ * OOM'd once (D9/D18).
27493
+ *
27494
+ * Measured clips sit far below it — 92 KB–2.29 MB for a sub twin, 455 KB for a
27495
+ * 16 s main clip — so the bound bites rarely. "Rarely" is not "never": a long
27496
+ * 4K main twin can exceed it, and above the bound the provider REFUSES with
27497
+ * the size in the message, never truncates. Half a video is worse than an
27498
+ * honest refusal.
27499
+ *
27500
+ * The clean follow-on is a CHUNKED read so a `high` twin of a long clip stops
27501
+ * being refusable at all. That is a later slice, named here so the bound is
27502
+ * not mistaken for a design ceiling.
27503
+ */
27504
+ var VIDEOCLIPS_MAX_READ_BYTES = 50 * 1024 * 1024;
27505
+ /**
27506
+ * A clip's finished bytes, inline — the twin of `recordingExport.readExportBytes`.
27507
+ *
27508
+ * `bytes` is the DECODED length, so nobody infers it from the base64 length,
27509
+ * and `served` says which twin the caller actually got.
27510
+ */
27511
+ var ClipBytesSchema = zod.z.object({
27512
+ base64: zod.z.string(),
27513
+ contentType: zod.z.string(),
27514
+ /** Suggested filename, extension included. */
27515
+ name: zod.z.string(),
27516
+ bytes: zod.z.number().int().nonnegative(),
27517
+ /**
27518
+ * Which twin was actually served — the same contract
27519
+ * {@link ClipPlaybackSchema.served} carries, and REQUIRED here because the
27520
+ * export record persists it: a row read a week later must say the same thing
27521
+ * the panel said at the moment of the tap. A missing main twin is never
27522
+ * served silently as if it were the asked-for quality (D549 15).
27523
+ */
27524
+ served: require_sleep.CamProfileSchema,
27525
+ /**
27526
+ * The DECODED duration of the delivered file, when the fetch measured one.
27527
+ *
27528
+ * A clip fetch verifies its own completion against the catalog row and
27529
+ * retries a materially short pass (D568); this is that measurement, carried
27530
+ * so a consumer can say the same thing rather than re-deriving it. Absent
27531
+ * when the producer did not measure — never zero, which would say the file
27532
+ * is empty.
27533
+ */
27534
+ durationMs: zod.z.number().positive().optional()
27535
+ });
27465
27536
  var ClipSourceAvailabilitySchema = zod.z.object({
27466
27537
  state: zod.z.enum([
27467
27538
  "ok",
@@ -27633,6 +27704,68 @@ var videoclipsCapability = {
27633
27704
  }), ClipPlaybackSchema, {
27634
27705
  kind: "query",
27635
27706
  auth: "protected"
27707
+ }),
27708
+ /**
27709
+ * This clip's BYTES, base64, bounded — the by-handle read a clip EXPORT
27710
+ * pulls once (D558).
27711
+ *
27712
+ * `getClipPlayback` is the right answer for a player: it hands back a URL
27713
+ * on a plane the hub serves `access:'authenticated'`, which a browser and a
27714
+ * viewer session satisfy. It is the wrong answer for another ADDON. There
27715
+ * is no addon→addon byte transport in this framework — `AddonDataPlane`
27716
+ * only lets an addon SERVE, on `127.0.0.1` behind a per-listener secret
27717
+ * only the hub may present — so a recorder that wants a camera's clip
27718
+ * cannot fetch that URL. This method is the one seam that exists for it,
27719
+ * and it is deliberately the same shape (and the same bound) as
27720
+ * `recordingExport.readExportBytes`, which exists for the mirror-image
27721
+ * reason.
27722
+ *
27723
+ * Routing needs no `provider` pin: the id is source-prefixed and
27724
+ * self-contained, so `device-collection-dispatch.ts` rule 3 hands the call
27725
+ * to the source that claims it — and an id nobody claims is REFUSED rather
27726
+ * than answered by another source.
27727
+ *
27728
+ * The producer reuses the fetch path it already has, completion rules
27729
+ * included: a clip is taken by cmd 5 and finished on a short idle window
27730
+ * whose result is PROVED against the catalog row's own span, retried once
27731
+ * when it comes up materially short, and served-and-named when it is still
27732
+ * short (D568). A second fetch with different completion rules is exactly
27733
+ * the second authority D558 refuses to create.
27734
+ *
27735
+ * Every refusal THROWS with its reason and none of them is silent — the
27736
+ * sleep gate (decided before `getApi()`, liftable only by
27737
+ * {@link ClipWakeSchema}), a catalog row nobody claims, a clip with no
27738
+ * bytes behind it, a mux that failed, and the size bound. The caller turns
27739
+ * that reason into an operator-facing one; a truncated file is never an
27740
+ * answer.
27741
+ */
27742
+ readClipBytes: require_sleep.optionalMethod(zod.z.object({
27743
+ deviceId: zod.z.number(),
27744
+ clipId: zod.z.string().min(1),
27745
+ /**
27746
+ * Which twin to fetch, on the mapping D549 15 already fixed:
27747
+ * `low | mid` → the sub file, `high` → the main twin. `auto` is not
27748
+ * accepted here for the same reason it is not accepted by
27749
+ * `getClipPlayback` — a stored file has no broker session, so the
27750
+ * adaptive tier cannot be resolved for it.
27751
+ */
27752
+ profile: require_sleep.CamProfileSchema.optional(),
27753
+ /**
27754
+ * The CALLER's byte bound, so an over-size clip is refused before it is
27755
+ * read and encoded rather than after. Capped by
27756
+ * {@link VIDEOCLIPS_MAX_READ_BYTES} whatever is passed; absent means
27757
+ * that ceiling.
27758
+ */
27759
+ maxBytes: zod.z.number().int().positive().optional(),
27760
+ /**
27761
+ * The operator's authorisation to wake a sleeping camera for this
27762
+ * read. Absent — the default — means a sleeping standalone battery
27763
+ * camera is REFUSED by name, before any session is opened.
27764
+ */
27765
+ wake: ClipWakeSchema.optional()
27766
+ }), ClipBytesSchema, {
27767
+ kind: "query",
27768
+ auth: "protected"
27636
27769
  })
27637
27770
  }
27638
27771
  };
@@ -36787,9 +36920,21 @@ var recordingCapability = {
36787
36920
  kind: "query",
36788
36921
  auth: "admin"
36789
36922
  }),
36923
+ /**
36924
+ * READ the camera's recording intent.
36925
+ *
36926
+ * `protected`, not `admin`, since 2026-09-21. It is the only per-camera
36927
+ * source of the recording mode the viewer has, and the camera status dot
36928
+ * asks for it on a screen every read-only user sees. As `admin` it answered
36929
+ * FORBIDDEN, the viewer collapsed that to `null` and `null` to `'off'`, and
36930
+ * a recording camera was drawn GREEN — a failed measurement rendered as a
36931
+ * value (D315, D393, D590). It carries schedules and retention, no secret,
36932
+ * and the per-device gate in `scope-access.ts` still applies; `setDeviceConfig`
36933
+ * stays `admin`.
36934
+ */
36790
36935
  getDeviceConfig: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), RecordingConfigSchema, {
36791
36936
  kind: "query",
36792
- auth: "admin"
36937
+ auth: "protected"
36793
36938
  }),
36794
36939
  /** Locate footage at a wall-clock instant: the covering segment's window,
36795
36940
  * or a gap with the forward nearest covered edge. Used by a feeder running
@@ -37153,13 +37298,135 @@ var ExportStateSchema = zod.z.enum([
37153
37298
  "expired",
37154
37299
  "deleted"
37155
37300
  ]);
37156
- /** One export job / history row. */
37301
+ /**
37302
+ * A stretch of footage THIS system recorded — the only thing `createExport`
37303
+ * could export before D558, and still the shape every legacy caller sends.
37304
+ */
37305
+ var ExportFootageSubjectSchema = zod.z.object({
37306
+ kind: zod.z.literal("footage"),
37307
+ deviceId: zod.z.number(),
37308
+ profiles: zod.z.array(zod.z.string()).min(1),
37309
+ fromMs: zod.z.number(),
37310
+ toMs: zod.z.number()
37311
+ });
37312
+ /**
37313
+ * A CLIP — a finished file with boundaries the camera chose, listed by one of
37314
+ * the device's `videoclips` sources.
37315
+ *
37316
+ * There is deliberately **no `fromMs`/`toMs` here**. The camera chose them,
37317
+ * no surface on this path asks for them (there is no drag and no
37318
+ * `datetime-local` pair — D558 § 5.4.3), and they reach the record only as the
37319
+ * projection. A range in the subject would be a second place the boundaries
37320
+ * live and the one a caller could get wrong.
37321
+ *
37322
+ * `provider` is the **addonId** of the source's serving addon — the `provider`
37323
+ * pin `videoclips.listClips` REQUIRES since D554 was amended on 2026-09-20.
37324
+ * There was never a default: a bare call fanned out and returned the union of
37325
+ * every source with `limit` meaning `limit × sources`. The catalog check that
37326
+ * validates this subject names it, so it asks exactly the source the operator
37327
+ * picked.
37328
+ *
37329
+ * `source` is that source's id (the namespace `clipId` is prefixed with), and
37330
+ * `sourceLabel` is its operator-facing name FROZEN at creation — a history row
37331
+ * still reads "SD card" after the source is unbound.
37332
+ *
37333
+ * `profile` is exactly ONE, and it is what was ASKED. What was SERVED lands on
37334
+ * the record's top-level `profile`, so a clip with no main twin renders the
37335
+ * divergence instead of hiding it (D549 15; measured on 592, 17 of 546 clips
37336
+ * had no main twin, so a silent fallback would be right 96.9 % of the time).
37337
+ * `auto` is not a member: a stored file has no broker session, so the adaptive
37338
+ * tier cannot be resolved for it.
37339
+ */
37340
+ var ExportClipSubjectSchema = zod.z.object({
37341
+ kind: zod.z.literal("clip"),
37342
+ deviceId: zod.z.number(),
37343
+ provider: zod.z.string().min(1),
37344
+ source: zod.z.string().min(1),
37345
+ sourceLabel: zod.z.string().min(1),
37346
+ clipId: zod.z.string().min(1),
37347
+ /**
37348
+ * WHERE IN THE CATALOG to confirm this clip — the day window the surface was
37349
+ * already listing when the operator picked the segment.
37350
+ *
37351
+ * It is **not** a time range control and it never becomes one: the record's
37352
+ * `fromMs`/`toMs` come from the catalog ROW and from nothing a caller
37353
+ * supplied (D558 § 5.4.3), and a window that does not contain the clip is a
37354
+ * `catalog-miss`, not a silently wider search. It exists because
37355
+ * `videoclips.listClips` takes `since`/`until` and has no by-handle twin:
37356
+ * the catalog check D558 asks for is literally that call, and a call needs a
37357
+ * window. The surface has one — `ClipsBrowser`'s `dayWindow`, one local
37358
+ * wall-clock day, which is also the only width measured to be cheap (one
37359
+ * day on 592 lists 171 clips in 712 ms, a busy day 546 in 2.0 s; twenty days
37360
+ * of one child's events took 3.6–5.4 s).
37361
+ */
37362
+ catalogWindow: zod.z.object({
37363
+ sinceMs: zod.z.number(),
37364
+ untilMs: zod.z.number()
37365
+ }),
37366
+ profile: zod.z.enum([
37367
+ "high",
37368
+ "mid",
37369
+ "low"
37370
+ ]),
37371
+ /**
37372
+ * The operator's authorisation to wake a sleeping camera for this export.
37373
+ * ONE definition, in the cap that owns the clip read ({@link ClipWakeSchema}),
37374
+ * because the gate that honours it is the clip provider's sleep gate — a
37375
+ * second enum here would be a second contract. Absent by default; never
37376
+ * settable by a scheduler or a retry.
37377
+ *
37378
+ * **One authorised yes is ONE wake.** A failed clip export is retried only by
37379
+ * an operator act that asks again; a queued job that outlived its wake fails
37380
+ * with a reason rather than waking on its turn; and this subject carries
37381
+ * exactly one profile precisely so one tap is never two fetches (D558 § 5.2).
37382
+ */
37383
+ wake: ClipWakeSchema.optional()
37384
+ });
37385
+ /**
37386
+ * WHAT an export is — the authority, as opposed to the four top-level fields
37387
+ * the Library sorts and labels on (D558 § 2.2).
37388
+ *
37389
+ * Read it through {@link exportSubjectOf}, never off the record directly: the
37390
+ * field is optional for the history rows written before it existed, and that
37391
+ * absence has exactly one interpreter.
37392
+ */
37393
+ var ExportSubjectSchema = zod.z.discriminatedUnion("kind", [ExportFootageSubjectSchema, ExportClipSubjectSchema]);
37394
+ /**
37395
+ * One export job / history row.
37396
+ *
37397
+ * **`subject` is the AUTHORITY on what was exported. `deviceId`, `profile`,
37398
+ * `fromMs` and `toMs` are its PROJECTION** — kept top-level because the whole
37399
+ * Library sorts and labels on them (`library-items.ts` orders an export by
37400
+ * `fromMs`; `export-format.ts` draws `rangeLabel` from the pair), and a row
37401
+ * that did not fill them would sort under the epoch and render a blank range.
37402
+ * Write to the subject and read from the projection and the two will disagree;
37403
+ * the projection is derived at creation and never edited afterwards.
37404
+ *
37405
+ * And they mean DIFFERENT FACTS for the two kinds, which is the part a reader
37406
+ * who knows only the recording export will get wrong:
37407
+ *
37408
+ * | field | `kind:'footage'` | `kind:'clip'` |
37409
+ * | --- | --- | --- |
37410
+ * | `fromMs`/`toMs` | the stretch the operator ASKED for | the camera's own boundaries, always `clip.timeRange`, never anything a caller supplied |
37411
+ * | `profile` | the stream rendered | the twin actually SERVED (`subject.profile` is the one asked for) |
37412
+ *
37413
+ * Same type, different fact — the shape this repo keeps getting wrong (D385's
37414
+ * two authorities, D224's second copy).
37415
+ */
37157
37416
  var ExportRecordSchema = zod.z.object({
37158
37417
  id: zod.z.string(),
37159
37418
  deviceId: zod.z.number(),
37160
37419
  profile: zod.z.string(),
37161
37420
  fromMs: zod.z.number(),
37162
37421
  toMs: zod.z.number(),
37422
+ /**
37423
+ * What this export IS. Optional ONLY for the rows written before D558: the
37424
+ * store parses every row through this schema on every read, so a required
37425
+ * field would make the export AUDIT — which is the whole reason rows survive
37426
+ * file deletion — unreadable in one release. Absence means `footage`, and
37427
+ * {@link exportSubjectOf} is the one place that says so.
37428
+ */
37429
+ subject: ExportSubjectSchema.optional(),
37163
37430
  options: ExportOptionsSchema,
37164
37431
  state: ExportStateSchema,
37165
37432
  /** 0–100 while rendering; null otherwise. */
@@ -37176,6 +37443,49 @@ var ExportRecordSchema = zod.z.object({
37176
37443
  /** Failure reason when state is 'failed'; null otherwise. */
37177
37444
  error: zod.z.string().nullable()
37178
37445
  });
37446
+ /**
37447
+ * Every way a clip export can fail, as a TOKEN — never prose.
37448
+ *
37449
+ * A branch that accepts work and produces nothing is the branch this repo
37450
+ * keeps losing work in (D391), and a clip export has five places to lose it
37451
+ * that a recording export does not have. The token is what a surface may key
37452
+ * a table on; the PROSE — the camera's own words, the source's verbatim
37453
+ * refusal — travels with it, in the same `ExportRecord.error` string, after a
37454
+ * `: `. Two separate things in one field because the field is one field:
37455
+ * `ClipStillRefusalCodeSchema` split them across two HTTP headers for the same
37456
+ * reason, and the surface that keyed on the whole header rendered every
37457
+ * refusal on this fleet as `Refused: <prose>`.
37458
+ *
37459
+ * Compose with {@link clipExportFailure}, read back with
37460
+ * {@link clipExportFailureOf}. Never hand-spell the separator.
37461
+ */
37462
+ var ClipExportFailureSchema = zod.z.enum([
37463
+ "catalog-miss",
37464
+ "catalog-unreachable",
37465
+ "no-file-for-window",
37466
+ "clip-in-progress",
37467
+ "unsupported-option",
37468
+ "sleeping",
37469
+ "camera-refused",
37470
+ "fetch-failed",
37471
+ "too-large-to-transfer",
37472
+ "wake-expired"
37473
+ ]);
37474
+ /** `<token>: <prose>` — the ONE composition of a clip export's failure string. */
37475
+ function clipExportFailure(code, detail) {
37476
+ return detail.length > 0 ? `${code}: ${detail}` : code;
37477
+ }
37478
+ /**
37479
+ * The token out of an {@link ExportRecord.error}, or null when the string did
37480
+ * not come from {@link clipExportFailure} (every footage failure, and every
37481
+ * error thrown by something that never heard of this vocabulary).
37482
+ */
37483
+ function clipExportFailureOf(error) {
37484
+ if (error === null) return null;
37485
+ const head = error.split(":", 1)[0] ?? "";
37486
+ const parsed = ClipExportFailureSchema.safeParse(head.trim());
37487
+ return parsed.success ? parsed.data : null;
37488
+ }
37179
37489
  /** Candidate download URLs (LAN first, then operator extra hosts). */
37180
37490
  var ExportDownloadSchema = zod.z.object({
37181
37491
  url: zod.z.string(),
@@ -37213,35 +37523,149 @@ var ExportBytesSchema = zod.z.object({
37213
37523
  name: zod.z.string(),
37214
37524
  bytes: zod.z.number().int().nonnegative()
37215
37525
  });
37526
+ /** Canonical `profiles[]`, falling back to the legacy singular `profile`. */
37527
+ function resolveExportProfiles(input) {
37528
+ if (input.profiles !== void 0 && input.profiles.length > 0) return [...input.profiles];
37529
+ if (typeof input.profile === "string" && input.profile.length > 0) return [input.profile];
37530
+ return [];
37531
+ }
37216
37532
  /**
37217
- * `createExport` input. `profiles` is the canonical field (min 1). A legacy
37218
- * singular `profile` is still accepted so existing callers do not break.
37533
+ * `createExport` input — ONE object carrying an optional {@link ExportSubject},
37534
+ * never a union of two inputs.
37219
37535
  *
37220
- * Must remain a ZodObject (`.loose()` for out-of-band `nodeId`).
37536
+ * It has to be a ZodObject: generated routers call `.input.loose()` so the
37537
+ * out-of-band `nodeId` selector survives the wire parse, and `.loose()` is a
37538
+ * ZodObject method a `z.discriminatedUnion` does not have. That is why the
37539
+ * discriminant sits one level down, in `subject`, and why
37540
+ * {@link resolveCreateExportSubject} — not a `z.preprocess` wrapper, which
37541
+ * would have produced a schema with no `.loose()` — is the one reading of a
37542
+ * legacy flat input as a subject.
37543
+ *
37544
+ * **`deviceId` stays REQUIRED at the top level**, for both kinds, and a clip
37545
+ * subject naming a different one is REFUSED. Not symmetry: `METHOD_DEVICE_SELECTORS`
37546
+ * (generated) maps top-level fields and one-level object arrays, so per-device
37547
+ * scope enforcement in `scope-access.ts` reads THIS field and cannot see
37548
+ * `subject.deviceId`. A deviceId that lived only in the subject would let a
37549
+ * principal scoped to one camera create an export — and, on the clip path, a
37550
+ * WAKE — for another.
37551
+ *
37552
+ * **A clip carries no time range**, and one supplied alongside a clip subject
37553
+ * is refused rather than ignored: there is no drag on this path and nothing to
37554
+ * normalise (D558 § 5.4.3). The record's `fromMs`/`toMs` come from the clip's
37555
+ * own `timeRange` and from nowhere else.
37221
37556
  */
37222
37557
  var CreateExportInputSchema = zod.z.object({
37223
37558
  deviceId: zod.z.number(),
37224
37559
  /** @deprecated Prefer `profiles`. Kept so timelapse/notifiers keep working. */
37225
37560
  profile: zod.z.string().optional(),
37226
37561
  profiles: zod.z.array(zod.z.string()).min(1).optional(),
37227
- fromMs: zod.z.number(),
37228
- toMs: zod.z.number(),
37562
+ /** Footage only — a clip's boundaries are the camera's. */
37563
+ fromMs: zod.z.number().optional(),
37564
+ toMs: zod.z.number().optional(),
37565
+ /** What to export. Absent means the legacy flat footage request. */
37566
+ subject: ExportSubjectSchema.optional(),
37229
37567
  options: ExportOptionsSchema
37230
37568
  }).superRefine((v, ctx) => {
37231
- if ((v.profiles !== void 0 && v.profiles.length > 0 ? v.profiles : v.profile !== void 0 ? [v.profile] : []).length < 1) ctx.addIssue({
37569
+ if (v.subject?.kind === "clip") {
37570
+ if (v.subject.deviceId !== v.deviceId) ctx.addIssue({
37571
+ code: zod.z.ZodIssueCode.custom,
37572
+ message: `subject.deviceId (${v.subject.deviceId}) must equal deviceId (${v.deviceId}) — the top-level field is what per-device scope enforcement reads`,
37573
+ path: ["subject", "deviceId"]
37574
+ });
37575
+ if (v.fromMs !== void 0 || v.toMs !== void 0) ctx.addIssue({
37576
+ code: zod.z.ZodIssueCode.custom,
37577
+ message: "a clip export asks for no time range: the camera chose the boundaries and they are read from the catalog row",
37578
+ path: ["fromMs"]
37579
+ });
37580
+ return;
37581
+ }
37582
+ if (v.subject?.kind === "footage" && v.subject.deviceId !== v.deviceId) ctx.addIssue({
37583
+ code: zod.z.ZodIssueCode.custom,
37584
+ message: `subject.deviceId (${v.subject.deviceId}) must equal deviceId (${v.deviceId})`,
37585
+ path: ["subject", "deviceId"]
37586
+ });
37587
+ const fromMs = v.subject?.kind === "footage" ? v.subject.fromMs : v.fromMs;
37588
+ const toMs = v.subject?.kind === "footage" ? v.subject.toMs : v.toMs;
37589
+ if (typeof fromMs !== "number" || typeof toMs !== "number") ctx.addIssue({
37590
+ code: zod.z.ZodIssueCode.custom,
37591
+ message: "a footage export needs fromMs and toMs",
37592
+ path: ["fromMs"]
37593
+ });
37594
+ if ((v.subject?.kind === "footage" ? [...v.subject.profiles] : resolveExportProfiles(v)).length < 1) ctx.addIssue({
37232
37595
  code: zod.z.ZodIssueCode.custom,
37233
37596
  message: "pass profiles[] (min 1) or legacy profile",
37234
37597
  path: ["profiles"]
37235
37598
  });
37236
37599
  });
37600
+ /**
37601
+ * The ONE reading of a `createExport` input as a {@link ExportSubject}.
37602
+ *
37603
+ * Every consumer goes through this: a provider that branched on
37604
+ * `input.subject !== undefined` in one place and on `input.fromMs` in another
37605
+ * would be two authorities on what was asked for, which is how the flat fields
37606
+ * and the subject drift apart.
37607
+ *
37608
+ * Throws on a footage input with no range — an input that parsed cannot reach
37609
+ * that, and a caller that skipped the parse gets a named refusal rather than
37610
+ * `NaN` boundaries on a durable row.
37611
+ */
37612
+ function resolveCreateExportSubject(input) {
37613
+ if (input.subject !== void 0) return input.subject;
37614
+ const profiles = resolveExportProfiles(input);
37615
+ if (typeof input.fromMs !== "number" || typeof input.toMs !== "number") throw new Error("recording-export: a footage export needs fromMs and toMs");
37616
+ return {
37617
+ kind: "footage",
37618
+ deviceId: input.deviceId,
37619
+ profiles,
37620
+ fromMs: input.fromMs,
37621
+ toMs: input.toMs
37622
+ };
37623
+ }
37624
+ /**
37625
+ * The ONE interpreter of a stored row's subject.
37626
+ *
37627
+ * `ExportRecord.subject` is optional for exactly one reason — the history rows
37628
+ * written before D558 — and "absent means footage, built from the projection"
37629
+ * is a statement that must live in one place. Anything that reads
37630
+ * `rec.subject` directly and falls back inline is the second authority.
37631
+ */
37632
+ function exportSubjectOf(rec) {
37633
+ if (rec.subject !== void 0) return rec.subject;
37634
+ return {
37635
+ kind: "footage",
37636
+ deviceId: rec.deviceId,
37637
+ profiles: [rec.profile],
37638
+ fromMs: rec.fromMs,
37639
+ toMs: rec.toMs
37640
+ };
37641
+ }
37237
37642
  var recordingExportCapability = {
37238
37643
  name: "recording-export",
37239
37644
  scope: "system",
37240
37645
  mode: "singleton",
37241
37646
  methods: {
37242
- /** Queue a render of `[fromMs,toMs)` for `deviceId`/`profiles` (legacy
37243
- * singular `profile` still accepted). Fails fast when no footage covers
37244
- * the range. One job per profile; returns the first queued record. */
37647
+ /**
37648
+ * Queue an export of {@link ExportSubjectSchema}.
37649
+ *
37650
+ * `kind:'footage'` — a render of `[fromMs,toMs)` for `deviceId`/`profiles`
37651
+ * (legacy flat input, singular `profile` included, still accepted and
37652
+ * rewritten). Fails fast when no footage covers the range. One job per
37653
+ * profile; **returns the first queued record and the others are reachable
37654
+ * only through `listExports`** — a defect named in D558 § 6.3 and the
37655
+ * reason a clip subject carries exactly ONE profile.
37656
+ *
37657
+ * `kind:'clip'` — a finished file the camera holds, validated against the
37658
+ * device's clip CATALOG (`videoclips.listClips`, at the subject's
37659
+ * `provider`) instead of the recording index, and fetched once by handle
37660
+ * under a bound. Its `fromMs`/`toMs` come from the catalog row and from
37661
+ * nowhere else; a caller supplying a range is refused.
37662
+ *
37663
+ * A clip export reuses the six {@link ExportStateSchema} members and adds
37664
+ * none: the viewer maps an unknown state string to `failed`, so a seventh
37665
+ * member renders every live export — of both kinds — as FAILED on every
37666
+ * installed app (D558 § 6.1, pinned by `export-state-members.spec.ts`).
37667
+ * `subject.kind` is what tells a surface what `rendering` means.
37668
+ */
37245
37669
  createExport: require_sleep.method(CreateExportInputSchema, ExportRecordSchema, {
37246
37670
  kind: "mutation",
37247
37671
  auth: "protected"
@@ -44931,6 +45355,12 @@ var ALL_CAPABILITY_DEFINITIONS = [
44931
45355
  //#endregion
44932
45356
  //#region src/generated/method-access-map.ts
44933
45357
  var METHOD_ACCESS_MAP = Object.freeze({
45358
+ "accessories.getStatus": {
45359
+ capName: "accessories",
45360
+ capScope: "device",
45361
+ addonId: null,
45362
+ access: "view"
45363
+ },
44934
45364
  "accessories.setChildHidden": {
44935
45365
  capName: "accessories",
44936
45366
  capScope: "device",
@@ -45213,6 +45643,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45213
45643
  addonId: null,
45214
45644
  access: "view"
45215
45645
  },
45646
+ "airQualitySensor.getStatus": {
45647
+ capName: "air-quality-sensor",
45648
+ capScope: "device",
45649
+ addonId: null,
45650
+ access: "view"
45651
+ },
45216
45652
  "alarmPanel.arm": {
45217
45653
  capName: "alarm-panel",
45218
45654
  capScope: "device",
@@ -45225,6 +45661,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45225
45661
  addonId: null,
45226
45662
  access: "create"
45227
45663
  },
45664
+ "alarmPanel.getStatus": {
45665
+ capName: "alarm-panel",
45666
+ capScope: "device",
45667
+ addonId: null,
45668
+ access: "view"
45669
+ },
45228
45670
  "alarmPanel.trigger": {
45229
45671
  capName: "alarm-panel",
45230
45672
  capScope: "device",
@@ -45273,6 +45715,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
45273
45715
  addonId: null,
45274
45716
  access: "create"
45275
45717
  },
45718
+ "ambientLightSensor.getStatus": {
45719
+ capName: "ambient-light-sensor",
45720
+ capScope: "device",
45721
+ addonId: null,
45722
+ access: "view"
45723
+ },
45724
+ "audioAnalysis.applyDeviceSettingsPatch": {
45725
+ capName: "audio-analysis",
45726
+ capScope: "device",
45727
+ addonId: null,
45728
+ access: "create"
45729
+ },
45730
+ "audioAnalysis.getDeviceLiveContribution": {
45731
+ capName: "audio-analysis",
45732
+ capScope: "device",
45733
+ addonId: null,
45734
+ access: "view"
45735
+ },
45736
+ "audioAnalysis.getDeviceSettingsContribution": {
45737
+ capName: "audio-analysis",
45738
+ capScope: "device",
45739
+ addonId: null,
45740
+ access: "view"
45741
+ },
45276
45742
  "audioAnalysis.resolveDeviceSettings": {
45277
45743
  capName: "audio-analysis",
45278
45744
  capScope: "device",
@@ -45435,6 +45901,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45435
45901
  addonId: null,
45436
45902
  access: "create"
45437
45903
  },
45904
+ "automationControl.getStatus": {
45905
+ capName: "automation-control",
45906
+ capScope: "device",
45907
+ addonId: null,
45908
+ access: "view"
45909
+ },
45438
45910
  "automationControl.trigger": {
45439
45911
  capName: "automation-control",
45440
45912
  capScope: "device",
@@ -45531,12 +46003,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
45531
46003
  addonId: null,
45532
46004
  access: "create"
45533
46005
  },
46006
+ "battery.getStatus": {
46007
+ capName: "battery",
46008
+ capScope: "device",
46009
+ addonId: null,
46010
+ access: "view"
46011
+ },
45534
46012
  "battery.wakeForStream": {
45535
46013
  capName: "battery",
45536
46014
  capScope: "device",
45537
46015
  addonId: null,
45538
46016
  access: "create"
45539
46017
  },
46018
+ "binary.getStatus": {
46019
+ capName: "binary",
46020
+ capScope: "device",
46021
+ addonId: null,
46022
+ access: "view"
46023
+ },
46024
+ "brightness.getStatus": {
46025
+ capName: "brightness",
46026
+ capScope: "device",
46027
+ addonId: null,
46028
+ access: "view"
46029
+ },
45540
46030
  "brightness.setBrightness": {
45541
46031
  capName: "brightness",
45542
46032
  capScope: "device",
@@ -45651,6 +46141,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
45651
46141
  addonId: null,
45652
46142
  access: "view"
45653
46143
  },
46144
+ "cameraCredentials.getStatus": {
46145
+ capName: "camera-credentials",
46146
+ capScope: "device",
46147
+ addonId: null,
46148
+ access: "view"
46149
+ },
46150
+ "cameraGridLayout.applyDeviceSettingsPatch": {
46151
+ capName: "camera-grid-layout",
46152
+ capScope: "device",
46153
+ addonId: null,
46154
+ access: "create"
46155
+ },
46156
+ "cameraGridLayout.getDeviceLiveContribution": {
46157
+ capName: "camera-grid-layout",
46158
+ capScope: "device",
46159
+ addonId: null,
46160
+ access: "view"
46161
+ },
46162
+ "cameraGridLayout.getDeviceSettingsContribution": {
46163
+ capName: "camera-grid-layout",
46164
+ capScope: "device",
46165
+ addonId: null,
46166
+ access: "view"
46167
+ },
45654
46168
  "cameraGridLayout.getLayout": {
45655
46169
  capName: "camera-grid-layout",
45656
46170
  capScope: "device",
@@ -45663,6 +46177,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
45663
46177
  addonId: null,
45664
46178
  access: "create"
45665
46179
  },
46180
+ "cameraPipelineConfig.applyDeviceSettingsPatch": {
46181
+ capName: "camera-pipeline-config",
46182
+ capScope: "device",
46183
+ addonId: null,
46184
+ access: "create"
46185
+ },
46186
+ "cameraPipelineConfig.getDeviceLiveContribution": {
46187
+ capName: "camera-pipeline-config",
46188
+ capScope: "device",
46189
+ addonId: null,
46190
+ access: "view"
46191
+ },
46192
+ "cameraPipelineConfig.getDeviceSettingsContribution": {
46193
+ capName: "camera-pipeline-config",
46194
+ capScope: "device",
46195
+ addonId: null,
46196
+ access: "view"
46197
+ },
45666
46198
  "cameraStreams.getBrokerStreams": {
45667
46199
  capName: "camera-streams",
45668
46200
  capScope: "device",
@@ -45693,6 +46225,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
45693
46225
  addonId: null,
45694
46226
  access: "view"
45695
46227
  },
46228
+ "carbonMonoxide.getStatus": {
46229
+ capName: "carbon-monoxide",
46230
+ capScope: "device",
46231
+ addonId: null,
46232
+ access: "view"
46233
+ },
46234
+ "climateControl.getStatus": {
46235
+ capName: "climate-control",
46236
+ capScope: "device",
46237
+ addonId: null,
46238
+ access: "view"
46239
+ },
45696
46240
  "climateControl.setFanMode": {
45697
46241
  capName: "climate-control",
45698
46242
  capScope: "device",
@@ -45741,6 +46285,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45741
46285
  addonId: null,
45742
46286
  access: "create"
45743
46287
  },
46288
+ "color.getStatus": {
46289
+ capName: "color",
46290
+ capScope: "device",
46291
+ addonId: null,
46292
+ access: "view"
46293
+ },
45744
46294
  "color.setColor": {
45745
46295
  capName: "color",
45746
46296
  capScope: "device",
@@ -45759,12 +46309,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
45759
46309
  addonId: null,
45760
46310
  access: "create"
45761
46311
  },
46312
+ "connectivity.getStatus": {
46313
+ capName: "connectivity",
46314
+ capScope: "device",
46315
+ addonId: null,
46316
+ access: "view"
46317
+ },
46318
+ "consumables.getStatus": {
46319
+ capName: "consumables",
46320
+ capScope: "device",
46321
+ addonId: null,
46322
+ access: "view"
46323
+ },
45762
46324
  "consumables.reset": {
45763
46325
  capName: "consumables",
45764
46326
  capScope: "device",
45765
46327
  addonId: null,
45766
46328
  access: "delete"
45767
46329
  },
46330
+ "contact.getStatus": {
46331
+ capName: "contact",
46332
+ capScope: "device",
46333
+ addonId: null,
46334
+ access: "view"
46335
+ },
46336
+ "control.getStatus": {
46337
+ capName: "control",
46338
+ capScope: "device",
46339
+ addonId: null,
46340
+ access: "view"
46341
+ },
45768
46342
  "control.setValue": {
45769
46343
  capName: "control",
45770
46344
  capScope: "device",
@@ -45831,6 +46405,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45831
46405
  addonId: null,
45832
46406
  access: "create"
45833
46407
  },
46408
+ "cover.getStatus": {
46409
+ capName: "cover",
46410
+ capScope: "device",
46411
+ addonId: null,
46412
+ access: "view"
46413
+ },
45834
46414
  "cover.open": {
45835
46415
  capName: "cover",
45836
46416
  capScope: "device",
@@ -45963,6 +46543,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
45963
46543
  addonId: null,
45964
46544
  access: "view"
45965
46545
  },
46546
+ "dayNight.getStatus": {
46547
+ capName: "day-night",
46548
+ capScope: "device",
46549
+ addonId: null,
46550
+ access: "view"
46551
+ },
45966
46552
  "dayNight.setSettings": {
45967
46553
  capName: "day-night",
45968
46554
  capScope: "device",
@@ -46053,6 +46639,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
46053
46639
  addonId: null,
46054
46640
  access: "view"
46055
46641
  },
46642
+ "detectionPipeline.applyDeviceSettingsPatch": {
46643
+ capName: "detection-pipeline",
46644
+ capScope: "device",
46645
+ addonId: null,
46646
+ access: "create"
46647
+ },
46648
+ "detectionPipeline.getDeviceLiveContribution": {
46649
+ capName: "detection-pipeline",
46650
+ capScope: "device",
46651
+ addonId: null,
46652
+ access: "view"
46653
+ },
46654
+ "detectionPipeline.getDeviceSettingsContribution": {
46655
+ capName: "detection-pipeline",
46656
+ capScope: "device",
46657
+ addonId: null,
46658
+ access: "view"
46659
+ },
46056
46660
  "deviceAdoption.adopt": {
46057
46661
  capName: "device-adoption",
46058
46662
  capScope: "system",
@@ -46065,6 +46669,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46065
46669
  addonId: null,
46066
46670
  access: "view"
46067
46671
  },
46672
+ "deviceAdoption.getStatus": {
46673
+ capName: "device-adoption",
46674
+ capScope: "system",
46675
+ addonId: null,
46676
+ access: "view"
46677
+ },
46068
46678
  "deviceAdoption.listCandidateFilters": {
46069
46679
  capName: "device-adoption",
46070
46680
  capScope: "system",
@@ -46101,6 +46711,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46101
46711
  addonId: null,
46102
46712
  access: "create"
46103
46713
  },
46714
+ "deviceDiscovery.getStatus": {
46715
+ capName: "device-discovery",
46716
+ capScope: "device",
46717
+ addonId: null,
46718
+ access: "view"
46719
+ },
46104
46720
  "deviceDiscovery.listDiscovered": {
46105
46721
  capName: "device-discovery",
46106
46722
  capScope: "device",
@@ -46119,12 +46735,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
46119
46735
  addonId: null,
46120
46736
  access: "create"
46121
46737
  },
46738
+ "deviceExport.applyDeviceSettingsPatch": {
46739
+ capName: "device-export",
46740
+ capScope: "system",
46741
+ addonId: null,
46742
+ access: "create"
46743
+ },
46122
46744
  "deviceExport.exposeDevice": {
46123
46745
  capName: "device-export",
46124
46746
  capScope: "system",
46125
46747
  addonId: null,
46126
46748
  access: "create"
46127
46749
  },
46750
+ "deviceExport.getDeviceLiveContribution": {
46751
+ capName: "device-export",
46752
+ capScope: "system",
46753
+ addonId: null,
46754
+ access: "view"
46755
+ },
46756
+ "deviceExport.getDeviceSettingsContribution": {
46757
+ capName: "device-export",
46758
+ capScope: "system",
46759
+ addonId: null,
46760
+ access: "view"
46761
+ },
46128
46762
  "deviceExport.getStatus": {
46129
46763
  capName: "device-export",
46130
46764
  capScope: "system",
@@ -46221,6 +46855,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46221
46855
  addonId: null,
46222
46856
  access: "create"
46223
46857
  },
46858
+ "deviceManager.applyDeviceSettingsPatch": {
46859
+ capName: "device-manager",
46860
+ capScope: "system",
46861
+ addonId: null,
46862
+ access: "create"
46863
+ },
46224
46864
  "deviceManager.applyInitialMeta": {
46225
46865
  capName: "device-manager",
46226
46866
  capScope: "system",
@@ -46323,6 +46963,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46323
46963
  addonId: null,
46324
46964
  access: "view"
46325
46965
  },
46966
+ "deviceManager.getDeviceLiveContribution": {
46967
+ capName: "device-manager",
46968
+ capScope: "system",
46969
+ addonId: null,
46970
+ access: "view"
46971
+ },
46326
46972
  "deviceManager.getDeviceLiveInfoAggregate": {
46327
46973
  capName: "device-manager",
46328
46974
  capScope: "system",
@@ -46335,6 +46981,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46335
46981
  addonId: null,
46336
46982
  access: "view"
46337
46983
  },
46984
+ "deviceManager.getDeviceSettingsContribution": {
46985
+ capName: "device-manager",
46986
+ capScope: "system",
46987
+ addonId: null,
46988
+ access: "view"
46989
+ },
46338
46990
  "deviceManager.getDeviceStatusAggregate": {
46339
46991
  capName: "device-manager",
46340
46992
  capScope: "system",
@@ -46827,6 +47479,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
46827
47479
  addonId: null,
46828
47480
  access: "create"
46829
47481
  },
47482
+ "deviceStatus.getStatus": {
47483
+ capName: "device-status",
47484
+ capScope: "device",
47485
+ addonId: null,
47486
+ access: "view"
47487
+ },
47488
+ "doorbell.applyDeviceSettingsPatch": {
47489
+ capName: "doorbell",
47490
+ capScope: "device",
47491
+ addonId: null,
47492
+ access: "create"
47493
+ },
47494
+ "doorbell.getDeviceLiveContribution": {
47495
+ capName: "doorbell",
47496
+ capScope: "device",
47497
+ addonId: null,
47498
+ access: "view"
47499
+ },
47500
+ "doorbell.getDeviceSettingsContribution": {
47501
+ capName: "doorbell",
47502
+ capScope: "device",
47503
+ addonId: null,
47504
+ access: "view"
47505
+ },
47506
+ "doorbell.getStatus": {
47507
+ capName: "doorbell",
47508
+ capScope: "device",
47509
+ addonId: null,
47510
+ access: "view"
47511
+ },
46830
47512
  "embeddingEncoder.encode": {
46831
47513
  capName: "embedding-encoder",
46832
47514
  capScope: "system",
@@ -46845,6 +47527,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
46845
47527
  addonId: null,
46846
47528
  access: "view"
46847
47529
  },
47530
+ "enumSensor.getStatus": {
47531
+ capName: "enum-sensor",
47532
+ capScope: "device",
47533
+ addonId: null,
47534
+ access: "view"
47535
+ },
47536
+ "eventEmitter.getStatus": {
47537
+ capName: "event-emitter",
47538
+ capScope: "device",
47539
+ addonId: null,
47540
+ access: "view"
47541
+ },
46848
47542
  "events.getEventClipUrl": {
46849
47543
  capName: "events",
46850
47544
  capScope: "device",
@@ -46965,6 +47659,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46965
47659
  addonId: null,
46966
47660
  access: "view"
46967
47661
  },
47662
+ "fanControl.getStatus": {
47663
+ capName: "fan-control",
47664
+ capScope: "device",
47665
+ addonId: null,
47666
+ access: "view"
47667
+ },
46968
47668
  "fanControl.setDirection": {
46969
47669
  capName: "fan-control",
46970
47670
  capScope: "device",
@@ -46989,6 +47689,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46989
47689
  addonId: null,
46990
47690
  access: "create"
46991
47691
  },
47692
+ "featureProbe.getStatus": {
47693
+ capName: "feature-probe",
47694
+ capScope: "device",
47695
+ addonId: null,
47696
+ access: "view"
47697
+ },
46992
47698
  "filesystemBrowse.browse": {
46993
47699
  capName: "filesystem-browse",
46994
47700
  capScope: "system",
@@ -47007,6 +47713,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
47007
47713
  addonId: null,
47008
47714
  access: "view"
47009
47715
  },
47716
+ "flood.getStatus": {
47717
+ capName: "flood",
47718
+ capScope: "device",
47719
+ addonId: null,
47720
+ access: "view"
47721
+ },
47722
+ "gas.getStatus": {
47723
+ capName: "gas",
47724
+ capScope: "device",
47725
+ addonId: null,
47726
+ access: "view"
47727
+ },
47728
+ "humidifier.getStatus": {
47729
+ capName: "humidifier",
47730
+ capScope: "device",
47731
+ addonId: null,
47732
+ access: "view"
47733
+ },
47010
47734
  "humidifier.setMode": {
47011
47735
  capName: "humidifier",
47012
47736
  capScope: "device",
@@ -47025,12 +47749,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
47025
47749
  addonId: null,
47026
47750
  access: "create"
47027
47751
  },
47752
+ "humiditySensor.getStatus": {
47753
+ capName: "humidity-sensor",
47754
+ capScope: "device",
47755
+ addonId: null,
47756
+ access: "view"
47757
+ },
47758
+ "image.getStatus": {
47759
+ capName: "image",
47760
+ capScope: "device",
47761
+ addonId: null,
47762
+ access: "view"
47763
+ },
47028
47764
  "imageSettings.getOptions": {
47029
47765
  capName: "image-settings",
47030
47766
  capScope: "device",
47031
47767
  addonId: null,
47032
47768
  access: "view"
47033
47769
  },
47770
+ "imageSettings.getStatus": {
47771
+ capName: "image-settings",
47772
+ capScope: "device",
47773
+ addonId: null,
47774
+ access: "view"
47775
+ },
47034
47776
  "imageSettings.setSettings": {
47035
47777
  capName: "image-settings",
47036
47778
  capScope: "device",
@@ -47103,6 +47845,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47103
47845
  addonId: null,
47104
47846
  access: "create"
47105
47847
  },
47848
+ "intercom.getStatus": {
47849
+ capName: "intercom",
47850
+ capScope: "device",
47851
+ addonId: null,
47852
+ access: "view"
47853
+ },
47106
47854
  "intercom.handleAnswer": {
47107
47855
  capName: "intercom",
47108
47856
  capScope: "device",
@@ -47139,6 +47887,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47139
47887
  addonId: null,
47140
47888
  access: "create"
47141
47889
  },
47890
+ "lawnMowerControl.getStatus": {
47891
+ capName: "lawn-mower-control",
47892
+ capScope: "device",
47893
+ addonId: null,
47894
+ access: "view"
47895
+ },
47142
47896
  "lawnMowerControl.pause": {
47143
47897
  capName: "lawn-mower-control",
47144
47898
  capScope: "device",
@@ -47421,6 +48175,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47421
48175
  addonId: null,
47422
48176
  access: "create"
47423
48177
  },
48178
+ "lockControl.getStatus": {
48179
+ capName: "lock-control",
48180
+ capScope: "device",
48181
+ addonId: null,
48182
+ access: "view"
48183
+ },
47424
48184
  "lockControl.lock": {
47425
48185
  capName: "lock-control",
47426
48186
  capScope: "device",
@@ -47469,6 +48229,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47469
48229
  addonId: null,
47470
48230
  access: "view"
47471
48231
  },
48232
+ "mediaPlayer.getStatus": {
48233
+ capName: "media-player",
48234
+ capScope: "device",
48235
+ addonId: null,
48236
+ access: "view"
48237
+ },
47472
48238
  "mediaPlayer.next": {
47473
48239
  capName: "media-player",
47474
48240
  capScope: "device",
@@ -47661,6 +48427,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47661
48427
  addonId: null,
47662
48428
  access: "create"
47663
48429
  },
48430
+ "motion.getStatus": {
48431
+ capName: "motion",
48432
+ capScope: "device",
48433
+ addonId: null,
48434
+ access: "view"
48435
+ },
47664
48436
  "motion.isDetected": {
47665
48437
  capName: "motion",
47666
48438
  capScope: "device",
@@ -47673,6 +48445,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
47673
48445
  addonId: null,
47674
48446
  access: "create"
47675
48447
  },
48448
+ "motionDetection.applyDeviceSettingsPatch": {
48449
+ capName: "motion-detection",
48450
+ capScope: "device",
48451
+ addonId: null,
48452
+ access: "create"
48453
+ },
48454
+ "motionDetection.getDeviceLiveContribution": {
48455
+ capName: "motion-detection",
48456
+ capScope: "device",
48457
+ addonId: null,
48458
+ access: "view"
48459
+ },
48460
+ "motionDetection.getDeviceSettingsContribution": {
48461
+ capName: "motion-detection",
48462
+ capScope: "device",
48463
+ addonId: null,
48464
+ access: "view"
48465
+ },
47676
48466
  "motionDetection.removeCamera": {
47677
48467
  capName: "motion-detection",
47678
48468
  capScope: "device",
@@ -47685,6 +48475,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47685
48475
  addonId: null,
47686
48476
  access: "delete"
47687
48477
  },
48478
+ "motionTrigger.getStatus": {
48479
+ capName: "motion-trigger",
48480
+ capScope: "device",
48481
+ addonId: null,
48482
+ access: "view"
48483
+ },
47688
48484
  "motionTrigger.setMotionTrigger": {
47689
48485
  capName: "motion-trigger",
47690
48486
  capScope: "device",
@@ -47697,6 +48493,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47697
48493
  addonId: null,
47698
48494
  access: "view"
47699
48495
  },
48496
+ "motionZones.getStatus": {
48497
+ capName: "motion-zones",
48498
+ capScope: "device",
48499
+ addonId: null,
48500
+ access: "view"
48501
+ },
47700
48502
  "motionZones.setZone": {
47701
48503
  capName: "motion-zones",
47702
48504
  capScope: "device",
@@ -47757,6 +48559,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47757
48559
  addonId: null,
47758
48560
  access: "view"
47759
48561
  },
48562
+ "nativeObjectDetection.getStatus": {
48563
+ capName: "native-object-detection",
48564
+ capScope: "device",
48565
+ addonId: null,
48566
+ access: "view"
48567
+ },
47760
48568
  "nativeObjectDetection.setEnabled": {
47761
48569
  capName: "native-object-detection",
47762
48570
  capScope: "device",
@@ -47775,6 +48583,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47775
48583
  addonId: null,
47776
48584
  access: "view"
47777
48585
  },
48586
+ "navigation.getStatus": {
48587
+ capName: "navigation",
48588
+ capScope: "device",
48589
+ addonId: null,
48590
+ access: "view"
48591
+ },
47778
48592
  "navigation.goToPoint": {
47779
48593
  capName: "navigation",
47780
48594
  capScope: "device",
@@ -47859,6 +48673,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47859
48673
  addonId: null,
47860
48674
  access: "create"
47861
48675
  },
48676
+ "networkLink.getStatus": {
48677
+ capName: "network-link",
48678
+ capScope: "device",
48679
+ addonId: null,
48680
+ access: "view"
48681
+ },
47862
48682
  "networkQuality.getAllStats": {
47863
48683
  capName: "network-quality",
47864
48684
  capScope: "system",
@@ -48117,18 +48937,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
48117
48937
  addonId: null,
48118
48938
  access: "create"
48119
48939
  },
48940
+ "notifier.getStatus": {
48941
+ capName: "notifier",
48942
+ capScope: "device",
48943
+ addonId: null,
48944
+ access: "view"
48945
+ },
48120
48946
  "notifier.send": {
48121
48947
  capName: "notifier",
48122
48948
  capScope: "device",
48123
48949
  addonId: null,
48124
48950
  access: "create"
48125
48951
  },
48952
+ "numericSensor.getStatus": {
48953
+ capName: "numeric-sensor",
48954
+ capScope: "device",
48955
+ addonId: null,
48956
+ access: "view"
48957
+ },
48126
48958
  "oauthIntegration.getDescriptor": {
48127
48959
  capName: "oauth-integration",
48128
48960
  capScope: "system",
48129
48961
  addonId: null,
48130
48962
  access: "view"
48131
48963
  },
48964
+ "osd.getStatus": {
48965
+ capName: "osd",
48966
+ capScope: "device",
48967
+ addonId: null,
48968
+ access: "view"
48969
+ },
48132
48970
  "osd.setOverlay": {
48133
48971
  capName: "osd",
48134
48972
  capScope: "device",
@@ -48201,6 +49039,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
48201
49039
  addonId: null,
48202
49040
  access: "create"
48203
49041
  },
49042
+ "petFeeder.getStatus": {
49043
+ capName: "pet-feeder",
49044
+ capScope: "device",
49045
+ addonId: null,
49046
+ access: "view"
49047
+ },
48204
49048
  "petFeeder.markFoodReplenished": {
48205
49049
  capName: "pet-feeder",
48206
49050
  capScope: "device",
@@ -48243,6 +49087,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
48243
49087
  addonId: null,
48244
49088
  access: "create"
48245
49089
  },
49090
+ "pipelineAnalytics.applyDeviceSettingsPatch": {
49091
+ capName: "pipeline-analytics",
49092
+ capScope: "device",
49093
+ addonId: null,
49094
+ access: "create"
49095
+ },
48246
49096
  "pipelineAnalytics.cancelRelocateMedia": {
48247
49097
  capName: "pipeline-analytics",
48248
49098
  capScope: "device",
@@ -48309,6 +49159,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
48309
49159
  addonId: null,
48310
49160
  access: "view"
48311
49161
  },
49162
+ "pipelineAnalytics.getDeviceLiveContribution": {
49163
+ capName: "pipeline-analytics",
49164
+ capScope: "device",
49165
+ addonId: null,
49166
+ access: "view"
49167
+ },
49168
+ "pipelineAnalytics.getDeviceSettingsContribution": {
49169
+ capName: "pipeline-analytics",
49170
+ capScope: "device",
49171
+ addonId: null,
49172
+ access: "view"
49173
+ },
48312
49174
  "pipelineAnalytics.getEventDensity": {
48313
49175
  capName: "pipeline-analytics",
48314
49176
  capScope: "device",
@@ -48879,6 +49741,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
48879
49741
  addonId: null,
48880
49742
  access: "view"
48881
49743
  },
49744
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
49745
+ capName: "pipeline-orchestrator",
49746
+ capScope: "system",
49747
+ addonId: null,
49748
+ access: "create"
49749
+ },
48882
49750
  "pipelineOrchestrator.assignAudio": {
48883
49751
  capName: "pipeline-orchestrator",
48884
49752
  capScope: "system",
@@ -48969,6 +49837,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
48969
49837
  addonId: null,
48970
49838
  access: "view"
48971
49839
  },
49840
+ "pipelineOrchestrator.getDeviceLiveContribution": {
49841
+ capName: "pipeline-orchestrator",
49842
+ capScope: "system",
49843
+ addonId: null,
49844
+ access: "view"
49845
+ },
49846
+ "pipelineOrchestrator.getDeviceSettingsContribution": {
49847
+ capName: "pipeline-orchestrator",
49848
+ capScope: "system",
49849
+ addonId: null,
49850
+ access: "view"
49851
+ },
48972
49852
  "pipelineOrchestrator.getGlobalMetrics": {
48973
49853
  capName: "pipeline-orchestrator",
48974
49854
  capScope: "system",
@@ -49377,12 +50257,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
49377
50257
  addonId: null,
49378
50258
  access: "view"
49379
50259
  },
50260
+ "powerMeter.getStatus": {
50261
+ capName: "power-meter",
50262
+ capScope: "device",
50263
+ addonId: null,
50264
+ access: "view"
50265
+ },
50266
+ "presence.getStatus": {
50267
+ capName: "presence",
50268
+ capScope: "device",
50269
+ addonId: null,
50270
+ access: "view"
50271
+ },
50272
+ "pressureSensor.getStatus": {
50273
+ capName: "pressure-sensor",
50274
+ capScope: "device",
50275
+ addonId: null,
50276
+ access: "view"
50277
+ },
49380
50278
  "privacyMask.getOptions": {
49381
50279
  capName: "privacy-mask",
49382
50280
  capScope: "device",
49383
50281
  addonId: null,
49384
50282
  access: "view"
49385
50283
  },
50284
+ "privacyMask.getStatus": {
50285
+ capName: "privacy-mask",
50286
+ capScope: "device",
50287
+ addonId: null,
50288
+ access: "view"
50289
+ },
49386
50290
  "privacyMask.setAudioEnabled": {
49387
50291
  capName: "privacy-mask",
49388
50292
  capScope: "device",
@@ -49443,6 +50347,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49443
50347
  addonId: null,
49444
50348
  access: "view"
49445
50349
  },
50350
+ "ptz.getStatus": {
50351
+ capName: "ptz",
50352
+ capScope: "device",
50353
+ addonId: null,
50354
+ access: "view"
50355
+ },
49446
50356
  "ptz.goHome": {
49447
50357
  capName: "ptz",
49448
50358
  capScope: "device",
@@ -49521,6 +50431,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49521
50431
  addonId: null,
49522
50432
  access: "create"
49523
50433
  },
50434
+ "recording.applyDeviceSettingsPatch": {
50435
+ capName: "recording",
50436
+ capScope: "system",
50437
+ addonId: null,
50438
+ access: "create"
50439
+ },
49524
50440
  "recording.cancelRelocateJob": {
49525
50441
  capName: "recording",
49526
50442
  capScope: "system",
@@ -49569,6 +50485,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
49569
50485
  addonId: null,
49570
50486
  access: "view"
49571
50487
  },
50488
+ "recording.getDeviceLiveContribution": {
50489
+ capName: "recording",
50490
+ capScope: "system",
50491
+ addonId: null,
50492
+ access: "view"
50493
+ },
50494
+ "recording.getDeviceSettingsContribution": {
50495
+ capName: "recording",
50496
+ capScope: "system",
50497
+ addonId: null,
50498
+ access: "view"
50499
+ },
49572
50500
  "recording.getPlacement": {
49573
50501
  capName: "recording",
49574
50502
  capScope: "system",
@@ -49587,6 +50515,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49587
50515
  addonId: null,
49588
50516
  access: "view"
49589
50517
  },
50518
+ "recording.getStatus": {
50519
+ capName: "recording",
50520
+ capScope: "system",
50521
+ addonId: null,
50522
+ access: "view"
50523
+ },
49590
50524
  "recording.getStorageMigrationMoveStatus": {
49591
50525
  capName: "recording",
49592
50526
  capScope: "system",
@@ -49791,6 +50725,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49791
50725
  addonId: null,
49792
50726
  access: "delete"
49793
50727
  },
50728
+ "sceneMonitor.getStatus": {
50729
+ capName: "scene-monitor",
50730
+ capScope: "device",
50731
+ addonId: null,
50732
+ access: "view"
50733
+ },
49794
50734
  "sceneMonitor.listScenes": {
49795
50735
  capName: "scene-monitor",
49796
50736
  capScope: "device",
@@ -49821,6 +50761,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49821
50761
  addonId: null,
49822
50762
  access: "create"
49823
50763
  },
50764
+ "scriptRunner.getStatus": {
50765
+ capName: "script-runner",
50766
+ capScope: "device",
50767
+ addonId: null,
50768
+ access: "view"
50769
+ },
49824
50770
  "scriptRunner.run": {
49825
50771
  capName: "script-runner",
49826
50772
  capScope: "device",
@@ -49953,6 +50899,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49953
50899
  addonId: null,
49954
50900
  access: "create"
49955
50901
  },
50902
+ "smoke.getStatus": {
50903
+ capName: "smoke",
50904
+ capScope: "device",
50905
+ addonId: null,
50906
+ access: "view"
50907
+ },
49956
50908
  "smtpProvider.getStatus": {
49957
50909
  capName: "smtp-provider",
49958
50910
  capScope: "system",
@@ -49971,12 +50923,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
49971
50923
  addonId: null,
49972
50924
  access: "view"
49973
50925
  },
50926
+ "snapshot.applyDeviceSettingsPatch": {
50927
+ capName: "snapshot",
50928
+ capScope: "device",
50929
+ addonId: null,
50930
+ access: "create"
50931
+ },
49974
50932
  "snapshot.getDebugState": {
49975
50933
  capName: "snapshot",
49976
50934
  capScope: "device",
49977
50935
  addonId: null,
49978
50936
  access: "view"
49979
50937
  },
50938
+ "snapshot.getDeviceLiveContribution": {
50939
+ capName: "snapshot",
50940
+ capScope: "device",
50941
+ addonId: null,
50942
+ access: "view"
50943
+ },
50944
+ "snapshot.getDeviceSettingsContribution": {
50945
+ capName: "snapshot",
50946
+ capScope: "device",
50947
+ addonId: null,
50948
+ access: "view"
50949
+ },
49980
50950
  "snapshot.getSnapshot": {
49981
50951
  capName: "snapshot",
49982
50952
  capScope: "device",
@@ -49995,6 +50965,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49995
50965
  addonId: null,
49996
50966
  access: "view"
49997
50967
  },
50968
+ "snapshot.getStatus": {
50969
+ capName: "snapshot",
50970
+ capScope: "device",
50971
+ addonId: null,
50972
+ access: "view"
50973
+ },
49998
50974
  "snapshot.invalidateCache": {
49999
50975
  capName: "snapshot",
50000
50976
  capScope: "device",
@@ -50331,6 +51307,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50331
51307
  addonId: null,
50332
51308
  access: "create"
50333
51309
  },
51310
+ "streamBroker.applyDeviceSettingsPatch": {
51311
+ capName: "stream-broker",
51312
+ capScope: "system",
51313
+ addonId: null,
51314
+ access: "create"
51315
+ },
50334
51316
  "streamBroker.assignProfile": {
50335
51317
  capName: "stream-broker",
50336
51318
  capScope: "system",
@@ -50367,6 +51349,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50367
51349
  addonId: null,
50368
51350
  access: "view"
50369
51351
  },
51352
+ "streamBroker.getDeviceLiveContribution": {
51353
+ capName: "stream-broker",
51354
+ capScope: "system",
51355
+ addonId: null,
51356
+ access: "view"
51357
+ },
51358
+ "streamBroker.getDeviceSettingsContribution": {
51359
+ capName: "stream-broker",
51360
+ capScope: "system",
51361
+ addonId: null,
51362
+ access: "view"
51363
+ },
50370
51364
  "streamBroker.getPreBufferInfo": {
50371
51365
  capName: "stream-broker",
50372
51366
  capScope: "system",
@@ -50565,6 +51559,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50565
51559
  addonId: null,
50566
51560
  access: "view"
50567
51561
  },
51562
+ "streamParams.getStatus": {
51563
+ capName: "stream-params",
51564
+ capScope: "device",
51565
+ addonId: null,
51566
+ access: "view"
51567
+ },
50568
51568
  "streamParams.setProfile": {
50569
51569
  capName: "stream-params",
50570
51570
  capScope: "device",
@@ -50577,6 +51577,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50577
51577
  addonId: null,
50578
51578
  access: "view"
50579
51579
  },
51580
+ "switch.getStatus": {
51581
+ capName: "switch",
51582
+ capScope: "device",
51583
+ addonId: null,
51584
+ access: "view"
51585
+ },
50580
51586
  "switch.setState": {
50581
51587
  capName: "switch",
50582
51588
  capScope: "device",
@@ -50673,6 +51679,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50673
51679
  addonId: null,
50674
51680
  access: "create"
50675
51681
  },
51682
+ "tamper.getStatus": {
51683
+ capName: "tamper",
51684
+ capScope: "device",
51685
+ addonId: null,
51686
+ access: "view"
51687
+ },
51688
+ "temperatureSensor.getStatus": {
51689
+ capName: "temperature-sensor",
51690
+ capScope: "device",
51691
+ addonId: null,
51692
+ access: "view"
51693
+ },
50676
51694
  "terminalSession.adoptLegacyMonitor": {
50677
51695
  capName: "terminal-session",
50678
51696
  capScope: "system",
@@ -50769,6 +51787,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50769
51787
  addonId: null,
50770
51788
  access: "view"
50771
51789
  },
51790
+ "update.getStatus": {
51791
+ capName: "update",
51792
+ capScope: "device",
51793
+ addonId: null,
51794
+ access: "view"
51795
+ },
50772
51796
  "update.installUpdate": {
50773
51797
  capName: "update",
50774
51798
  capScope: "device",
@@ -50991,6 +52015,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50991
52015
  addonId: null,
50992
52016
  access: "create"
50993
52017
  },
52018
+ "vacuumControl.getStatus": {
52019
+ capName: "vacuum-control",
52020
+ capScope: "device",
52021
+ addonId: null,
52022
+ access: "view"
52023
+ },
50994
52024
  "vacuumControl.locate": {
50995
52025
  capName: "vacuum-control",
50996
52026
  capScope: "device",
@@ -51033,6 +52063,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51033
52063
  addonId: null,
51034
52064
  access: "create"
51035
52065
  },
52066
+ "valve.getStatus": {
52067
+ capName: "valve",
52068
+ capScope: "device",
52069
+ addonId: null,
52070
+ access: "view"
52071
+ },
51036
52072
  "valve.open": {
51037
52073
  capName: "valve",
51038
52074
  capScope: "device",
@@ -51105,6 +52141,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51105
52141
  addonId: null,
51106
52142
  access: "create"
51107
52143
  },
52144
+ "vibration.getStatus": {
52145
+ capName: "vibration",
52146
+ capScope: "device",
52147
+ addonId: null,
52148
+ access: "view"
52149
+ },
51108
52150
  "videoclips.getClipPlayback": {
51109
52151
  capName: "videoclips",
51110
52152
  capScope: "device",
@@ -51123,6 +52165,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51123
52165
  addonId: null,
51124
52166
  access: "view"
51125
52167
  },
52168
+ "videoclips.readClipBytes": {
52169
+ capName: "videoclips",
52170
+ capScope: "device",
52171
+ addonId: null,
52172
+ access: "view"
52173
+ },
51126
52174
  "viewerUi.getStaticDir": {
51127
52175
  capName: "viewer-ui",
51128
52176
  capScope: "system",
@@ -51135,6 +52183,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51135
52183
  addonId: null,
51136
52184
  access: "view"
51137
52185
  },
52186
+ "waterHeater.getStatus": {
52187
+ capName: "water-heater",
52188
+ capScope: "device",
52189
+ addonId: null,
52190
+ access: "view"
52191
+ },
51138
52192
  "waterHeater.setAway": {
51139
52193
  capName: "water-heater",
51140
52194
  capScope: "device",
@@ -51153,6 +52207,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51153
52207
  addonId: null,
51154
52208
  access: "create"
51155
52209
  },
52210
+ "weather.getStatus": {
52211
+ capName: "weather",
52212
+ capScope: "device",
52213
+ addonId: null,
52214
+ access: "view"
52215
+ },
51156
52216
  "webrtcSession.addIceCandidate": {
51157
52217
  capName: "webrtc-session",
51158
52218
  capScope: "device",
@@ -51291,8 +52351,10 @@ var KNOWN_CAP_NAMES = [
51291
52351
  "addon-widgets-source",
51292
52352
  "addons",
51293
52353
  "admin-ui",
52354
+ "air-quality-sensor",
51294
52355
  "alarm-panel",
51295
52356
  "alerts",
52357
+ "ambient-light-sensor",
51296
52358
  "audio-analysis",
51297
52359
  "audio-analyzer",
51298
52360
  "audio-codec",
@@ -51301,16 +52363,21 @@ var KNOWN_CAP_NAMES = [
51301
52363
  "automation-control",
51302
52364
  "backup",
51303
52365
  "battery",
52366
+ "binary",
51304
52367
  "brightness",
51305
52368
  "broker",
51306
52369
  "button",
51307
52370
  "camera-credentials",
51308
52371
  "camera-grid-layout",
52372
+ "camera-pipeline-config",
51309
52373
  "camera-streams",
52374
+ "carbon-monoxide",
51310
52375
  "climate-control",
51311
52376
  "color",
51312
52377
  "connection-test",
52378
+ "connectivity",
51313
52379
  "consumables",
52380
+ "contact",
51314
52381
  "control",
51315
52382
  "core-blocks",
51316
52383
  "cover",
@@ -51318,6 +52385,7 @@ var KNOWN_CAP_NAMES = [
51318
52385
  "data-store-provider",
51319
52386
  "day-night",
51320
52387
  "decoder",
52388
+ "detection-pipeline",
51321
52389
  "device-adoption",
51322
52390
  "device-discovery",
51323
52391
  "device-export",
@@ -51325,13 +52393,22 @@ var KNOWN_CAP_NAMES = [
51325
52393
  "device-ops",
51326
52394
  "device-provider",
51327
52395
  "device-state",
52396
+ "device-status",
52397
+ "doorbell",
51328
52398
  "embedding-encoder",
52399
+ "enum-sensor",
52400
+ "event-emitter",
51329
52401
  "events",
51330
52402
  "face-gallery",
51331
52403
  "failure-contribution",
51332
52404
  "fan-control",
52405
+ "feature-probe",
51333
52406
  "filesystem-browse",
52407
+ "flood",
52408
+ "gas",
51334
52409
  "humidifier",
52410
+ "humidity-sensor",
52411
+ "image",
51335
52412
  "image-settings",
51336
52413
  "integrations",
51337
52414
  "intercom",
@@ -51357,11 +52434,13 @@ var KNOWN_CAP_NAMES = [
51357
52434
  "native-object-detection",
51358
52435
  "navigation",
51359
52436
  "network-access",
52437
+ "network-link",
51360
52438
  "network-quality",
51361
52439
  "nodes",
51362
52440
  "notification-output",
51363
52441
  "notification-rules",
51364
52442
  "notifier",
52443
+ "numeric-sensor",
51365
52444
  "oauth-integration",
51366
52445
  "osd",
51367
52446
  "osd-manager",
@@ -51372,6 +52451,9 @@ var KNOWN_CAP_NAMES = [
51372
52451
  "pipeline-runner",
51373
52452
  "plate-gallery",
51374
52453
  "platform-probe",
52454
+ "power-meter",
52455
+ "presence",
52456
+ "pressure-sensor",
51375
52457
  "privacy-mask",
51376
52458
  "ptz",
51377
52459
  "ptz-autotrack",
@@ -51383,6 +52465,7 @@ var KNOWN_CAP_NAMES = [
51383
52465
  "script-runner",
51384
52466
  "server-management",
51385
52467
  "settings-store",
52468
+ "smoke",
51386
52469
  "smtp-provider",
51387
52470
  "snapshot",
51388
52471
  "sso-bridge",
@@ -51397,6 +52480,8 @@ var KNOWN_CAP_NAMES = [
51397
52480
  "stream-signals",
51398
52481
  "switch",
51399
52482
  "system",
52483
+ "tamper",
52484
+ "temperature-sensor",
51400
52485
  "terminal-session",
51401
52486
  "toast",
51402
52487
  "turn-provider",
@@ -51406,9 +52491,11 @@ var KNOWN_CAP_NAMES = [
51406
52491
  "vacuum-control",
51407
52492
  "valve",
51408
52493
  "vector-store",
52494
+ "vibration",
51409
52495
  "videoclips",
51410
52496
  "viewer-ui",
51411
52497
  "water-heater",
52498
+ "weather",
51412
52499
  "webrtc-session",
51413
52500
  "zone-analytics",
51414
52501
  "zone-rules",
@@ -51417,27 +52504,44 @@ var KNOWN_CAP_NAMES = [
51417
52504
  /** Every cap declared as `scope: 'device'` — drives the `category:device` matcher. */
51418
52505
  var DEVICE_CAP_NAMES = [
51419
52506
  "accessories",
52507
+ "air-quality-sensor",
51420
52508
  "alarm-panel",
52509
+ "ambient-light-sensor",
51421
52510
  "audio-analysis",
51422
52511
  "audio-metrics",
51423
52512
  "automation-control",
51424
52513
  "battery",
52514
+ "binary",
51425
52515
  "brightness",
51426
52516
  "button",
51427
52517
  "camera-credentials",
51428
52518
  "camera-grid-layout",
52519
+ "camera-pipeline-config",
51429
52520
  "camera-streams",
52521
+ "carbon-monoxide",
51430
52522
  "climate-control",
51431
52523
  "color",
52524
+ "connectivity",
51432
52525
  "consumables",
52526
+ "contact",
51433
52527
  "control",
51434
52528
  "cover",
51435
52529
  "day-night",
52530
+ "detection-pipeline",
51436
52531
  "device-discovery",
51437
52532
  "device-ops",
52533
+ "device-status",
52534
+ "doorbell",
52535
+ "enum-sensor",
52536
+ "event-emitter",
51438
52537
  "events",
51439
52538
  "fan-control",
52539
+ "feature-probe",
52540
+ "flood",
52541
+ "gas",
51440
52542
  "humidifier",
52543
+ "humidity-sensor",
52544
+ "image",
51441
52545
  "image-settings",
51442
52546
  "intercom",
51443
52547
  "lawn-mower-control",
@@ -51449,10 +52553,15 @@ var DEVICE_CAP_NAMES = [
51449
52553
  "motion-zones",
51450
52554
  "native-object-detection",
51451
52555
  "navigation",
52556
+ "network-link",
51452
52557
  "notifier",
52558
+ "numeric-sensor",
51453
52559
  "osd",
51454
52560
  "pet-feeder",
51455
52561
  "pipeline-analytics",
52562
+ "power-meter",
52563
+ "presence",
52564
+ "pressure-sensor",
51456
52565
  "privacy-mask",
51457
52566
  "ptz",
51458
52567
  "ptz-autotrack",
@@ -51460,16 +52569,21 @@ var DEVICE_CAP_NAMES = [
51460
52569
  "recording-signal",
51461
52570
  "scene-monitor",
51462
52571
  "script-runner",
52572
+ "smoke",
51463
52573
  "snapshot",
51464
52574
  "stream-catalog",
51465
52575
  "stream-params",
51466
52576
  "stream-signals",
51467
52577
  "switch",
52578
+ "tamper",
52579
+ "temperature-sensor",
51468
52580
  "update",
51469
52581
  "vacuum-control",
51470
52582
  "valve",
52583
+ "vibration",
51471
52584
  "videoclips",
51472
52585
  "water-heater",
52586
+ "weather",
51473
52587
  "webrtc-session",
51474
52588
  "zone-analytics",
51475
52589
  "zone-rules",
@@ -53414,6 +54528,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
53414
54528
  form: "single",
53415
54529
  optional: false
53416
54530
  }],
54531
+ "videoclips.readClipBytes": [{
54532
+ name: "deviceId",
54533
+ form: "single",
54534
+ optional: false
54535
+ }],
53417
54536
  "waterHeater.setAway": [{
53418
54537
  name: "deviceId",
53419
54538
  form: "single",
@@ -59078,12 +60197,15 @@ exports.CarbonMonoxideStatusSchema = CarbonMonoxideStatusSchema;
59078
60197
  exports.ChargingStatus = require_sleep.ChargingStatus;
59079
60198
  exports.ClientNetworkStatsSchema = ClientNetworkStatsSchema;
59080
60199
  exports.ClimateControlStatusSchema = ClimateControlStatusSchema;
60200
+ exports.ClipBytesSchema = ClipBytesSchema;
60201
+ exports.ClipExportFailureSchema = ClipExportFailureSchema;
59081
60202
  exports.ClipPlaybackSchema = ClipPlaybackSchema;
59082
60203
  exports.ClipSchema = ClipSchema;
59083
60204
  exports.ClipSourceAvailabilitySchema = ClipSourceAvailabilitySchema;
59084
60205
  exports.ClipSourceSchema = ClipSourceSchema;
59085
60206
  exports.ClipStillDispositionSchema = ClipStillDispositionSchema;
59086
60207
  exports.ClipStillRefusalCodeSchema = ClipStillRefusalCodeSchema;
60208
+ exports.ClipWakeSchema = ClipWakeSchema;
59087
60209
  exports.ClusterAddonNodeDeploymentSchema = ClusterAddonNodeDeploymentSchema;
59088
60210
  exports.ClusterAddonStatusEntrySchema = ClusterAddonStatusEntrySchema;
59089
60211
  exports.CollectionColumnSchema = CollectionColumnSchema;
@@ -59243,15 +60365,18 @@ exports.EventMediaProductionSchema = EventMediaProductionSchema;
59243
60365
  exports.EventOwnerTypeSchema = EventOwnerTypeSchema;
59244
60366
  exports.EventSourceType = require_enums.EventSourceType$1;
59245
60367
  exports.ExportBytesSchema = ExportBytesSchema;
60368
+ exports.ExportClipSubjectSchema = ExportClipSubjectSchema;
59246
60369
  exports.ExportDenseRangeSchema = ExportDenseRangeSchema;
59247
60370
  exports.ExportDenseSchema = ExportDenseSchema;
59248
60371
  exports.ExportDownloadSchema = ExportDownloadSchema;
60372
+ exports.ExportFootageSubjectSchema = ExportFootageSubjectSchema;
59249
60373
  exports.ExportOptionsSchema = ExportOptionsSchema;
59250
60374
  exports.ExportRecordSchema = ExportRecordSchema;
59251
60375
  exports.ExportSetupFieldSchema = ExportSetupFieldSchema;
59252
60376
  exports.ExportSetupSchema = ExportSetupSchema;
59253
60377
  exports.ExportSpeedSchema = ExportSpeedSchema;
59254
60378
  exports.ExportStateSchema = ExportStateSchema;
60379
+ exports.ExportSubjectSchema = ExportSubjectSchema;
59255
60380
  exports.ExportTimelapseSchema = ExportTimelapseSchema;
59256
60381
  exports.ExposedDeviceSchema = ExposedDeviceSchema;
59257
60382
  exports.ExposureModeSchema = ExposureModeSchema;
@@ -59978,6 +61103,7 @@ exports.UpdateStatusSchema = UpdateStatusSchema;
59978
61103
  exports.UpdateUserInputSchema = UpdateUserInputSchema;
59979
61104
  exports.UserRecordSchema = UserRecordSchema;
59980
61105
  exports.UserSummarySchema = UserSummarySchema;
61106
+ exports.VIDEOCLIPS_MAX_READ_BYTES = VIDEOCLIPS_MAX_READ_BYTES;
59981
61107
  exports.VISIT_MERGE_GAP_MS = VISIT_MERGE_GAP_MS;
59982
61108
  exports.VacuumControlStatusSchema = VacuumControlStatusSchema;
59983
61109
  exports.VacuumStateSchema = VacuumStateSchema;
@@ -60098,6 +61224,8 @@ exports.classifyBearerPrincipal = classifyBearerPrincipal;
60098
61224
  exports.classifyStream = classifyStream;
60099
61225
  exports.classifyStreams = classifyStreams;
60100
61226
  exports.climateControlCapability = climateControlCapability;
61227
+ exports.clipExportFailure = clipExportFailure;
61228
+ exports.clipExportFailureOf = clipExportFailureOf;
60101
61229
  exports.clusterModelSettingKey = clusterModelSettingKey;
60102
61230
  exports.clusterStepSettingFieldsFor = clusterStepSettingFieldsFor;
60103
61231
  exports.clusterStepSettingKey = clusterStepSettingKey;
@@ -60197,6 +61325,7 @@ exports.evictionPolicyForMode = evictionPolicyForMode;
60197
61325
  exports.evictionPolicyOfLocation = evictionPolicyOfLocation;
60198
61326
  exports.expandAudioChunkToF32le = require_sleep.expandAudioChunkToF32le;
60199
61327
  exports.expandCapMethods = require_sleep.expandCapMethods;
61328
+ exports.exportSubjectOf = exportSubjectOf;
60200
61329
  exports.extractNestedAddonId = extractNestedAddonId;
60201
61330
  exports.extractSourceInfoFromMetadata = extractSourceInfoFromMetadata;
60202
61331
  exports.faceGalleryCapability = faceGalleryCapability;
@@ -60331,6 +61460,7 @@ exports.oauthIntegrationCapability = oauthIntegrationCapability;
60331
61460
  exports.objectInputDeclaresAddonId = objectInputDeclaresAddonId;
60332
61461
  exports.objectInputDeclaresRequiredDeviceId = objectInputDeclaresRequiredDeviceId;
60333
61462
  exports.occupancyScope = occupancyScope;
61463
+ exports.optionalMethod = require_sleep.optionalMethod;
60334
61464
  exports.osdCapability = osdCapability;
60335
61465
  exports.osdManagerCapability = osdManagerCapability;
60336
61466
  exports.overlayClusterStepSettings = overlayClusterStepSettings;
@@ -60398,10 +61528,12 @@ exports.resolveBucketMs = resolveBucketMs;
60398
61528
  exports.resolveCapMount = require_sleep.resolveCapMount;
60399
61529
  exports.resolveClusterStepModelId = resolveClusterStepModelId;
60400
61530
  exports.resolveContainerPrimaryChild = resolveContainerPrimaryChild;
61531
+ exports.resolveCreateExportSubject = resolveCreateExportSubject;
60401
61532
  exports.resolveDetectionRuntime = resolveDetectionRuntime;
60402
61533
  exports.resolveDeviceControlKind = resolveDeviceControlKind;
60403
61534
  exports.resolveDeviceProfile = resolveDeviceProfile;
60404
61535
  exports.resolveEgressDecodeHwAccel = resolveEgressDecodeHwAccel;
61536
+ exports.resolveExportProfiles = resolveExportProfiles;
60405
61537
  exports.resolveFormat = resolveFormat;
60406
61538
  exports.resolveHydratedFieldValue = require_sleep.resolveHydratedFieldValue;
60407
61539
  exports.resolveLocationIcon = resolveLocationIcon;