@camstack/addon-training 0.1.47 → 0.1.49

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 (40) hide show
  1. package/dist/{MaskShapeCanvas-Kfg9dl6B.mjs → MaskShapeCanvas-HNL0xNpy.mjs} +229 -228
  2. package/dist/MotionZonesSettings-B1g6IUfQ.mjs +291 -0
  3. package/dist/PrivacyMaskSettings-D4WRZZeD.mjs +339 -0
  4. package/dist/{ReactKonva-DGuYUN0L.mjs → ReactKonva-DzGysLZQ.mjs} +28 -28
  5. package/dist/SceneMonitorEditor-pYZfyXtn.mjs +825 -0
  6. package/dist/_stub.js +11562 -10221
  7. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-cOIklMU6.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-OY71DavC.mjs} +4 -4
  8. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BVsoOuTM.mjs +26 -0
  9. package/dist/{_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-DeDbF7NI.mjs → _virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs} +1 -1
  10. package/dist/addon-training.css +1 -1
  11. package/dist/{chevron-right-D3StkdcR.mjs → chevron-right-cA8Hucbi.mjs} +1 -1
  12. package/dist/{createLucideIcon-CPP1Jzoz.mjs → createLucideIcon-C0bBNRpC.mjs} +8 -8
  13. package/dist/{dist-CCnnaqt1.mjs → dist-D-7oMcBM.mjs} +198 -9
  14. package/dist/{dist-BUzSmOA3.js → dist-DvgVhVUN.js} +198 -9
  15. package/dist/{grid-2x2-Yngdckwo.mjs → grid-2x2-CHuMzRxF.mjs} +1 -1
  16. package/dist/{hostInit-v495uwvg.mjs → hostInit-B3DR-ujG.mjs} +3 -3
  17. package/dist/{icons-C4_Ji5S0.mjs → icons-BwkaMam3.mjs} +9 -9
  18. package/dist/index.js +1 -1
  19. package/dist/{mic-off-DPNSd6G7.mjs → mic-off-2uHAsVtR.mjs} +1 -1
  20. package/dist/orchestrator/training.addon.js +1 -1
  21. package/dist/orchestrator/training.addon.mjs +1 -1
  22. package/dist/{player-overlays-DXTsKpgo.mjs → player-overlays-B4V_uIvb.mjs} +25 -25
  23. package/dist/providers/modal/training-modal.addon.js +1 -1
  24. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  25. package/dist/remoteEntry.js +1 -1
  26. package/dist/{responsive-Cfmds8tw.mjs → responsive-1iwc-rj2.mjs} +26 -26
  27. package/dist/{rotate-ccw-Dak-lXgZ.mjs → rotate-ccw-Cu6tGrgG.mjs} +1 -1
  28. package/dist/scene-monitor-copy-Cqfs4Vng.mjs +176 -0
  29. package/dist/{settings-2-Cgiv3kQb.mjs → settings-2-xV0I5Y5U.mjs} +1 -1
  30. package/dist/{square-B_679zIX.mjs → square-ZPUterXM.mjs} +1 -1
  31. package/dist/{trash-2-DC8LDYlI.mjs → trash-2-BKfuhsgY.mjs} +1 -1
  32. package/dist/ui-text-CqJgUCKX.mjs +34 -0
  33. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-CdlOqgkp.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-Dk6Nf5b3.mjs} +1 -1
  34. package/dist/{zoom-out-BJoVDYa3.mjs → zoom-out-DDZCsqkQ.mjs} +1 -1
  35. package/package.json +1 -1
  36. package/dist/MotionZonesSettings-15Lfyz9l.mjs +0 -292
  37. package/dist/PrivacyMaskSettings-CAyzlGjl.mjs +0 -348
  38. package/dist/SceneMonitorEditor-D49_o83T.mjs +0 -810
  39. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Cn2OEGrR.mjs +0 -26
  40. package/dist/scene-monitor-copy-DX2u-htD.mjs +0 -136
@@ -1,4 +1,4 @@
1
- import { t as e } from "./createLucideIcon-CPP1Jzoz.mjs";
1
+ import { t as e } from "./createLucideIcon-C0bBNRpC.mjs";
2
2
  var t = e("chevron-down", [["path", {
3
3
  d: "m6 9 6 6 6-6",
4
4
  key: "qrunsl"
@@ -1,6 +1,6 @@
1
- import { S as e, n as t, r as n } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-DeDbF7NI.mjs";
1
+ import { i as e, r as t, w as n } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
3
- e();
3
+ n();
4
4
  var r = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), i = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), a = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), o = (e) => {
5
5
  let t = a(e);
6
6
  return t.charAt(0).toUpperCase() + t.slice(1);
@@ -17,7 +17,7 @@ var r = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) =
17
17
  }, c = (e) => {
18
18
  for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
19
19
  return !1;
20
- }, l = n(({ color: e = "currentColor", size: n = 24, strokeWidth: i = 2, absoluteStrokeWidth: a, className: o = "", children: l, iconNode: u, ...d }, f) => t("svg", {
20
+ }, l = e(({ color: e = "currentColor", size: n = 24, strokeWidth: i = 2, absoluteStrokeWidth: a, className: o = "", children: l, iconNode: u, ...d }, f) => t("svg", {
21
21
  ref: f,
22
22
  ...s,
23
23
  width: n,
@@ -30,15 +30,15 @@ var r = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) =
30
30
  }, [...u.map(([e, n]) => t(e, n)), ...Array.isArray(l) ? l : [l]]));
31
31
  //#endregion
32
32
  //#region ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
33
- e();
34
- var u = (e, a) => {
35
- let s = n(({ className: n, ...s }, c) => t(l, {
33
+ n();
34
+ var u = (n, a) => {
35
+ let s = e(({ className: e, ...s }, c) => t(l, {
36
36
  ref: c,
37
37
  iconNode: a,
38
- className: r(`lucide-${i(o(e))}`, `lucide-${e}`, n),
38
+ className: r(`lucide-${i(o(n))}`, `lucide-${n}`, e),
39
39
  ...s
40
40
  }));
41
- return s.displayName = o(e), s;
41
+ return s.displayName = o(n), s;
42
42
  };
43
43
  //#endregion
44
44
  export { u as t };
@@ -5387,7 +5387,7 @@ var ZodIssueCode = {
5387
5387
  var ZodFirstPartyTypeKind;
5388
5388
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5389
5389
  //#endregion
5390
- //#region ../types/dist/sleep-DAX0-2v9.mjs
5390
+ //#region ../types/dist/sleep-DRqxtc0C.mjs
5391
5391
  /**
5392
5392
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5393
5393
  * window to float samples (D455).
@@ -8155,8 +8155,12 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8155
8155
  kind: "mutation",
8156
8156
  auth: "admin"
8157
8157
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8158
+ object({
8159
+ code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8160
+ params: record(string(), union([string(), number()])).optional()
8161
+ });
8158
8162
  //#endregion
8159
- //#region ../types/dist/err-msg-DX6i_MY4.mjs
8163
+ //#region ../types/dist/err-msg-DLerKiVO.mjs
8160
8164
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8161
8165
  DeviceType["Camera"] = "camera";
8162
8166
  DeviceType["Hub"] = "hub";
@@ -8406,6 +8410,22 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8406
8410
  DeviceRole["Nightvision"] = "nightvision";
8407
8411
  DeviceRole["PrivacyMask"] = "privacy-mask";
8408
8412
  DeviceRole["Doorbell"] = "doorbell";
8413
+ /** Interior blind / shade / roller blind. HA `device_class: blind|shade`. */
8414
+ DeviceRole["CoverBlind"] = "cover-blind";
8415
+ /** Exterior roller shutter. HA `device_class: shutter`; Homematic BROLL. */
8416
+ DeviceRole["CoverShutter"] = "cover-shutter";
8417
+ /** Exterior awning. HA `device_class: awning`. */
8418
+ DeviceRole["CoverAwning"] = "cover-awning";
8419
+ /** Curtain / drape. HA `device_class: curtain`. */
8420
+ DeviceRole["CoverCurtain"] = "cover-curtain";
8421
+ /** Garage door. HA `device_class: garage`. A security actuator: exports gate it. */
8422
+ DeviceRole["CoverGarage"] = "cover-garage";
8423
+ /** Gate. HA `device_class: gate`. A security actuator: exports gate it. */
8424
+ DeviceRole["CoverGate"] = "cover-gate";
8425
+ /** Door. HA `device_class: door`. A security actuator: exports gate it. */
8426
+ DeviceRole["CoverDoor"] = "cover-door";
8427
+ /** Window. HA `device_class: window`. */
8428
+ DeviceRole["CoverWindow"] = "cover-window";
8409
8429
  /** Virtual HA toggle (input_boolean.*) — distinguishable from a
8410
8430
  * real Switch device for UI rendering / export adapters. */
8411
8431
  DeviceRole["BinaryHelper"] = "binary-helper";
@@ -8476,7 +8496,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8476
8496
  return DeviceRole;
8477
8497
  }({});
8478
8498
  //#endregion
8479
- //#region ../types/dist/composition-C-WpVYTX.mjs
8499
+ //#region ../types/dist/composition-EQ9Ok0Ee.mjs
8480
8500
  /**
8481
8501
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8482
8502
  *
@@ -11698,11 +11718,10 @@ var ClipModelMetaSchema = object({
11698
11718
  /**
11699
11719
  * The `vector-store` index this model's vectors live in. ONE feature space
11700
11720
  * per index: two models share an index only when their vectors are ranked
11701
- * against each other, which for CLIP means never across families. MobileCLIP
11702
- * S1 and S2 share `object-clip` for history (separated by the row's
11703
- * `modelId`); any other model gets its own.
11721
+ * against each other, which for CLIP means never across families. Every
11722
+ * model gets its own.
11704
11723
  */
11705
- vectorIndex: string().regex(/^object-clip(-[a-z0-9][a-z0-9-]*)?$/),
11724
+ vectorIndex: string().regex(/^object-clip-[a-z0-9][a-z0-9-]*$/),
11706
11725
  /**
11707
11726
  * The text encoder's tokenizer, a declared SIBLING file of its onnx. The name
11708
11727
  * must be unique per tokenizer: every model's siblings land in ONE flat
@@ -12171,7 +12190,8 @@ var ConvertResultSchema = object({
12171
12190
  })).readonly()
12172
12191
  });
12173
12192
  _enum(["new-session", "step-up"]);
12174
- _enum(["en", "it"]);
12193
+ /** The languages the hub's app landing pages are written in (D858). */
12194
+ var AppPageLangSchema = _enum(["en", "it"]);
12175
12195
  /** How a native app starts one login method (D858), as `auth.listLoginMethods` reports it. */
12176
12196
  var AppLoginPathSchema = discriminatedUnion("kind", [object({ kind: literal("native") }), object({
12177
12197
  kind: literal("browser"),
@@ -12685,7 +12705,9 @@ var ConfigTabDeclarationSchema = object({
12685
12705
  var ConfigSectionWithValuesSchema = object({
12686
12706
  id: string(),
12687
12707
  title: string(),
12708
+ titleKey: string().optional(),
12688
12709
  description: string().optional(),
12710
+ descriptionKey: string().optional(),
12689
12711
  style: _enum(["card", "accordion"]).optional(),
12690
12712
  defaultCollapsed: boolean().optional(),
12691
12713
  columns: union([
@@ -15911,6 +15933,9 @@ method(object({
15911
15933
  }), method(object({ refs: RefListSchema }), KeychainResolveResultSchema, { auth: "admin" }), method(object({ refs: RefListSchema }), object({ deleted: number().int() }), {
15912
15934
  kind: "mutation",
15913
15935
  auth: "admin"
15936
+ }), method(object({ deviceId: number().int() }), object({ refs: array(string()).readonly() }), {
15937
+ kind: "mutation",
15938
+ auth: "admin"
15914
15939
  }), method(object({}), array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }), method(object({}), KeychainStateSchema, { auth: "admin" });
15915
15940
  /**
15916
15941
  * device-history — the ONE mechanism for numeric history (D850).
@@ -37314,6 +37339,38 @@ var DeviceRegisterPayloadSchema = object({
37314
37339
  * omits it and the keyword backstop applies. */
37315
37340
  secretConfigPaths: array(string()).optional()
37316
37341
  });
37342
+ /** One deleted device, kept by device-manager so an addon that missed the
37343
+ * deletion can still learn of it (D865). Written by the delete path ONLY. */
37344
+ var DeviceTombstoneSchema = object({
37345
+ deviceId: number().int().positive(),
37346
+ /** Epoch ms the device was deleted. */
37347
+ deletedAt: number(),
37348
+ /** The addon that owned the device when it was deleted. */
37349
+ providerAddonId: string()
37350
+ });
37351
+ /** Data held for one device that device-manager no longer knows. */
37352
+ var OrphanDeviceDataSchema = object({
37353
+ deviceId: number().int().positive(),
37354
+ /** Rows/files per store (`<addonId>:<store>`). */
37355
+ stores: record(string(), number().int().nonnegative())
37356
+ });
37357
+ var CleanupDeletedDevicesResultSchema = object({
37358
+ /**
37359
+ * `skipped` — the absence check could not be trusted (a device-list read
37360
+ * failed or the two reads disagreed); nothing was listed or deleted.
37361
+ * `dry-run` — `devices` is what a confirmed run would delete.
37362
+ * `cleaned` — `devices` is what was deleted.
37363
+ */
37364
+ status: _enum([
37365
+ "skipped",
37366
+ "dry-run",
37367
+ "cleaned"
37368
+ ]),
37369
+ reason: string().nullable(),
37370
+ devices: array(OrphanDeviceDataSchema),
37371
+ /** Implementers that could not be asked (their stores are not in `devices`). */
37372
+ unreachable: array(string())
37373
+ });
37317
37374
  var DeviceRemovePayloadSchema = object({ deviceId: number() });
37318
37375
  var DevicePersistConfigPayloadSchema = object({
37319
37376
  deviceId: number(),
@@ -37552,6 +37609,9 @@ method(object({
37552
37609
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
37553
37610
  kind: "mutation",
37554
37611
  auth: "admin"
37612
+ }), method(object({ sinceMs: number() }), array(DeviceTombstoneSchema).readonly(), { auth: "admin" }), method(object({ confirm: boolean() }), CleanupDeletedDevicesResultSchema, {
37613
+ kind: "mutation",
37614
+ auth: "admin"
37555
37615
  }), method(object({ integrationId: string() }), object({ removed: number() }), {
37556
37616
  kind: "mutation",
37557
37617
  auth: "admin"
@@ -38014,6 +38074,72 @@ method(object({
38014
38074
  auth: "admin"
38015
38075
  });
38016
38076
  /**
38077
+ * `device-removal-hook` — the reliable way an addon learns a device was DELETED,
38078
+ * so it can delete what it keeps for that device (D865).
38079
+ *
38080
+ * ## Why an event was not enough
38081
+ *
38082
+ * `DeviceUnregistered` is telemetry and may be dropped (D8, D11). An addon that
38083
+ * hung its per-device clean-up on it left durable garbage whenever the event was
38084
+ * lost, the addon was down, or it was restarting at that moment — footage,
38085
+ * analytics rows and settings of device 4483 outlived the device. Loss of this
38086
+ * signal corrupts durable state, so it travels by RPC with a recorded fact
38087
+ * behind it (D8: "if loss would corrupt durable state, use RPC plus a reconcile").
38088
+ *
38089
+ * ## The three pieces
38090
+ *
38091
+ * 1. device-manager records a TOMBSTONE per deleted device
38092
+ * (`deviceManager.listDeletedSince`). The tombstone is written by the delete
38093
+ * path only — a device that is unregistered, offline or whose provider is
38094
+ * restarting is NOT deleted and gets none.
38095
+ * 2. After a delete, device-manager calls `onDeviceRemoved` on EVERY provider of
38096
+ * this collection, one by one, with bounded retries, logged.
38097
+ * 3. An implementer that was down asks `deviceManager.listDeletedSince` at start
38098
+ * (and periodically) and runs its own `onDeviceRemoved` for each tombstone it
38099
+ * may have missed. Reconcile is driven by tombstones, never by "the device is
38100
+ * not in the current list": a failed or partial list read must not destroy data.
38101
+ *
38102
+ * ## Contract for an implementer
38103
+ *
38104
+ * - **Idempotent.** It is called again by a retry, by a reconcile and by the
38105
+ * admin cleanup of data that predates tombstones. A device with nothing left
38106
+ * answers zero counts.
38107
+ * - **One key per store** in `counts`, deleted rows/files per store, so the log
38108
+ * line and the admin dry run can say where the data was.
38109
+ * - **Training datasets are NOT device data** and are never deleted by a hook.
38110
+ * - **Per-device SETTINGS are not hooked.** Configuration lives in the standard
38111
+ * per-device store (`ctx.settings.*DeviceStore`), which device-manager clears
38112
+ * for every addon centrally at delete time. This hook is for device DATA
38113
+ * that is not settings: footage, event media, analytics rows, history.
38114
+ * - A provider that cannot tell is allowed to throw; the caller retries it.
38115
+ *
38116
+ * `listDeviceData` is the read side of the admin "Clean data of deleted devices"
38117
+ * action: which device ids this addon holds data for, and how much per store. It
38118
+ * never deletes. device-manager decides which of those ids are absent from the
38119
+ * fleet, from TWO consistent reads of the device list (D49).
38120
+ */
38121
+ /** What a hook is told about the deletion. */
38122
+ var DeviceRemovedInputSchema = object({
38123
+ deviceId: number().int().positive(),
38124
+ /** Epoch ms the device was deleted (the tombstone's `deletedAt`). */
38125
+ deletedAt: number(),
38126
+ /** The addon that owned the device, as device-manager last knew it. */
38127
+ providerAddonId: string()
38128
+ });
38129
+ /** Rows/files/refs deleted, per store this implementer owns. */
38130
+ var DeviceRemovedResultSchema = object({ counts: record(string(), number().int().nonnegative()) });
38131
+ /** One (store, device) pair an implementer holds data for. */
38132
+ var DeviceDataEntrySchema = object({
38133
+ store: string(),
38134
+ deviceId: number().int().positive(),
38135
+ /** Rows (or files) held for the device in the store. */
38136
+ count: number().int().nonnegative()
38137
+ });
38138
+ method(DeviceRemovedInputSchema, DeviceRemovedResultSchema, {
38139
+ kind: "mutation",
38140
+ auth: "admin"
38141
+ }), method(_void(), array(DeviceDataEntrySchema).readonly(), { auth: "admin" });
38142
+ /**
38017
38143
  * `failure-contribution` — the capability an addon reports its OWN losses
38018
38144
  * through, per camera, with the denominator attached. It stores nothing.
38019
38145
  *
@@ -54533,7 +54659,19 @@ var TlsStatusSchema = object({
54533
54659
  sans: array(string()),
54534
54660
  caCertPem: string().nullable(),
54535
54661
  reissueError: string().nullable(),
54536
- restartRequired: boolean()
54662
+ restartRequired: boolean(),
54663
+ /** An uploaded certificate is served but no CA is kept for it and it is not publicly signed (D873). */
54664
+ caMissing: boolean(),
54665
+ /** Does the hub's own generated CA carry a critical name constraint? `null` while it has none. */
54666
+ localCaConstrained: boolean().nullable(),
54667
+ /** ISO time the generated CA was replaced by a constrained one; devices must re-download it. */
54668
+ caReplacedAt: string().nullable(),
54669
+ /** The uploaded certificate kept on disk, selectable again after "Revert to generated". */
54670
+ storedUpload: object({
54671
+ leafFingerprintSha256: string(),
54672
+ validTo: string(),
54673
+ hasCa: boolean()
54674
+ }).nullable()
54537
54675
  });
54538
54676
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
54539
54677
  /**
@@ -54589,6 +54727,9 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
54589
54727
  }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
54590
54728
  kind: "mutation",
54591
54729
  auth: "admin"
54730
+ }), method(_void(), TlsStatusSchema, {
54731
+ kind: "mutation",
54732
+ auth: "admin"
54592
54733
  });
54593
54734
  object({
54594
54735
  /** Lifecycle state of the lock. `jammed` means the motor reported
@@ -62613,6 +62754,12 @@ Object.freeze({
62613
62754
  addonId: null,
62614
62755
  access: "create"
62615
62756
  },
62757
+ "deviceManager.cleanupDeletedDevicesData": {
62758
+ capName: "device-manager",
62759
+ capScope: "system",
62760
+ addonId: null,
62761
+ access: "create"
62762
+ },
62616
62763
  "deviceManager.createDevice": {
62617
62764
  capName: "device-manager",
62618
62765
  capScope: "system",
@@ -62793,6 +62940,12 @@ Object.freeze({
62793
62940
  addonId: null,
62794
62941
  access: "view"
62795
62942
  },
62943
+ "deviceManager.listDeletedSince": {
62944
+ capName: "device-manager",
62945
+ capScope: "system",
62946
+ addonId: null,
62947
+ access: "view"
62948
+ },
62796
62949
  "deviceManager.listDeviceIdsByCaps": {
62797
62950
  capName: "device-manager",
62798
62951
  capScope: "system",
@@ -63201,6 +63354,18 @@ Object.freeze({
63201
63354
  addonId: null,
63202
63355
  access: "create"
63203
63356
  },
63357
+ "deviceRemovalHook.listDeviceData": {
63358
+ capName: "device-removal-hook",
63359
+ capScope: "system",
63360
+ addonId: null,
63361
+ access: "view"
63362
+ },
63363
+ "deviceRemovalHook.onDeviceRemoved": {
63364
+ capName: "device-removal-hook",
63365
+ capScope: "system",
63366
+ addonId: null,
63367
+ access: "create"
63368
+ },
63204
63369
  "deviceState.claimFields": {
63205
63370
  capName: "device-state",
63206
63371
  capScope: "system",
@@ -63633,6 +63798,12 @@ Object.freeze({
63633
63798
  addonId: null,
63634
63799
  access: "delete"
63635
63800
  },
63801
+ "keychain.deleteDeviceScope": {
63802
+ capName: "keychain",
63803
+ capScope: "system",
63804
+ addonId: null,
63805
+ access: "delete"
63806
+ },
63636
63807
  "keychain.getState": {
63637
63808
  capName: "keychain",
63638
63809
  capScope: "system",
@@ -64071,6 +64242,12 @@ Object.freeze({
64071
64242
  addonId: null,
64072
64243
  access: "create"
64073
64244
  },
64245
+ "localNetwork.useStoredUploadedCertificate": {
64246
+ capName: "local-network",
64247
+ capScope: "system",
64248
+ addonId: null,
64249
+ access: "create"
64250
+ },
64074
64251
  "lockControl.getStatus": {
64075
64252
  capName: "lock-control",
64076
64253
  capScope: "device",
@@ -69645,6 +69822,11 @@ Object.freeze({
69645
69822
  form: "single",
69646
69823
  optional: false
69647
69824
  }],
69825
+ "deviceRemovalHook.onDeviceRemoved": [{
69826
+ name: "deviceId",
69827
+ form: "single",
69828
+ optional: false
69829
+ }],
69648
69830
  "deviceState.claimFields": [{
69649
69831
  name: "deviceId",
69650
69832
  form: "single",
@@ -69834,6 +70016,11 @@ Object.freeze({
69834
70016
  form: "single",
69835
70017
  optional: false
69836
70018
  }],
70019
+ "keychain.deleteDeviceScope": [{
70020
+ name: "deviceId",
70021
+ form: "single",
70022
+ optional: false
70023
+ }],
69837
70024
  "lawnMowerControl.dock": [{
69838
70025
  name: "deviceId",
69839
70026
  form: "single",
@@ -72182,6 +72369,8 @@ new Set([
72182
72369
  "audio-tools",
72183
72370
  "audio-silence"
72184
72371
  ]);
72372
+ AppPageLangSchema.options;
72373
+ record(string().min(1), string());
72185
72374
  /**
72186
72375
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
72187
72376
  *