@camstack/addon-provider-wyze 0.2.152 → 0.2.154

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/addon.js CHANGED
@@ -31,7 +31,7 @@ let net = require("net");
31
31
  net = __toESM(net, 1);
32
32
  let node_child_process = require("node:child_process");
33
33
  let node_tls = require("node:tls");
34
- //#region ../types/dist/event-category-DOl51-Ij.mjs
34
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
35
35
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
36
36
  EventCategory["SystemBoot"] = "system.boot";
37
37
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -348,6 +348,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
348
348
  */
349
349
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
350
350
  /**
351
+ * A camera's motion source has fired constantly with no subject for an hour
352
+ * (motion duty or session count over the bar, zero detections) — it is not
353
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
354
+ * {@link PipelineMotionCalm}.
355
+ */
356
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
357
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
358
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
359
+ /**
351
360
  * Per-camera pipeline config was mutated by the orchestrator
352
361
  * (3-level settings change via `setAgentAddonDefaults` /
353
362
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -719,6 +728,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
719
728
  EventCategory["BackupRestored"] = "backup.restored";
720
729
  EventCategory["NotificationDispatched"] = "notification.dispatched";
721
730
  EventCategory["NotificationFailed"] = "notification.failed";
731
+ /**
732
+ * A notification rule that cannot work (D905): its stored row does not load,
733
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
734
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
735
+ */
736
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
737
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
738
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
722
739
  EventCategory["DeviceUpdated"] = "device.updated";
723
740
  /**
724
741
  * Transport-level connectivity. Emitted by the device driver when
@@ -5446,7 +5463,7 @@ var ZodIssueCode = {
5446
5463
  var ZodFirstPartyTypeKind;
5447
5464
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5448
5465
  //#endregion
5449
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5466
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5450
5467
  /**
5451
5468
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5452
5469
  * window to float samples (D455).
@@ -7975,7 +7992,7 @@ var EntryDescriptorSchema = object({
7975
7992
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7976
7993
  fields: record(string(), unknown())
7977
7994
  }).strict();
7978
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7995
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7979
7996
  var RecordKindDeclarationSchema = object({
7980
7997
  database: _enum(RECORD_DATABASES).default("settings"),
7981
7998
  class: _enum(RECORD_CLASSES),
@@ -7994,14 +8011,6 @@ var RecordKindDeclarationSchema = object({
7994
8011
  secretPaths: array(string().min(1)).default([]),
7995
8012
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7996
8013
  secretArrayKeys: record(string(), string()).default({}),
7997
- /**
7998
- * RETIRED (D900): the legacy table a kind adopted from during the records
7999
- * migration. Nothing declares it any more and nothing reads it; the schema
8000
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8001
- * (an orphaned kind is never redeclared) and an addon built before the
8002
- * removal still sends it. Never set it.
8003
- */
8004
- adoptsFrom: string().min(1).optional(),
8005
8014
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8006
8015
  transactFamily: string().min(1).optional(),
8007
8016
  entry: EntryDescriptorSchema.optional()
@@ -12713,17 +12722,6 @@ object({
12713
12722
  createdAt: number(),
12714
12723
  updatedAt: number()
12715
12724
  });
12716
- object({
12717
- id: string(),
12718
- label: string(),
12719
- isAdmin: boolean().default(false),
12720
- allowedProviders: AllowedProviderSchema,
12721
- allowedDevices: AllowedDevicesSchema,
12722
- tokenHash: string(),
12723
- tokenPrefix: string(),
12724
- createdAt: number(),
12725
- lastUsedAt: number().optional()
12726
- });
12727
12725
  object({
12728
12726
  id: string(),
12729
12727
  userId: string(),
@@ -16705,16 +16703,36 @@ var RecordKindStateSchema = _enum([
16705
16703
  var DeclareKindResultSchema = object({
16706
16704
  kindId: number().int(),
16707
16705
  state: RecordKindStateSchema,
16708
- createdIndexes: array(string()),
16709
- /**
16710
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16711
- * it stays on the wire, null, because an addon built before the removal reads
16712
- * an ABSENT field as "adoption pending" and refuses to start.
16713
- */
16714
- adoptionPending: _null()
16706
+ createdIndexes: array(string())
16715
16707
  });
16716
16708
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16717
16709
  var SecretRefsList = array(string());
16710
+ /**
16711
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16712
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16713
+ */
16714
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16715
+ object({
16716
+ op: literal("put"),
16717
+ kind: RecordKindNameSchema,
16718
+ record: RecordInputSchema,
16719
+ ifRev: number().int().min(0).optional()
16720
+ }),
16721
+ object({
16722
+ op: literal("patch"),
16723
+ kind: RecordKindNameSchema,
16724
+ id: RecordIdSchema,
16725
+ data: RecordBodySchema,
16726
+ at: number().int().nullable().optional(),
16727
+ expiresAt: number().int().nullable().optional(),
16728
+ ifRev: number().int().min(1).optional()
16729
+ }),
16730
+ object({
16731
+ op: literal("delete"),
16732
+ kind: RecordKindNameSchema,
16733
+ id: RecordIdSchema
16734
+ })
16735
+ ]);
16718
16736
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16719
16737
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16720
16738
  kind: "mutation",
@@ -16821,6 +16839,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16821
16839
  }), {
16822
16840
  kind: "mutation",
16823
16841
  auth: "admin"
16842
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16843
+ results: array(object({
16844
+ rev: number().int().nullable(),
16845
+ deleted: boolean()
16846
+ })),
16847
+ releasedRefs: SecretRefsList,
16848
+ secretRefs: SecretRefsList
16849
+ }), {
16850
+ kind: "mutation",
16851
+ auth: "admin"
16824
16852
  }), method(object({
16825
16853
  deviceId: number().int(),
16826
16854
  kinds: array(RecordKindNameSchema).optional()
@@ -42432,9 +42460,13 @@ var NcSystemEventKindSchema = _enum([
42432
42460
  "node-updating",
42433
42461
  "node-inference-unavailable",
42434
42462
  "detection-blind",
42463
+ "motion-noisy",
42464
+ "motion-calm",
42435
42465
  "recording-stalled",
42436
42466
  "recording-healthy",
42437
42467
  "recording-degraded",
42468
+ "device-attention-required",
42469
+ "device-attention-resolved",
42438
42470
  "storage-location-low",
42439
42471
  "storage-location-critical",
42440
42472
  "storage-location-ok",
@@ -42458,6 +42490,8 @@ var NcSystemEventKindSchema = _enum([
42458
42490
  "alert-critical",
42459
42491
  "alert-error",
42460
42492
  "alert-critical-resolved",
42493
+ "rule-broken",
42494
+ "rule-repaired",
42461
42495
  "camera-online",
42462
42496
  "camera-offline",
42463
42497
  "camera-disabled",
@@ -55868,6 +55902,16 @@ var DishwasherStatusSchema = object({
55868
55902
  powerState: string().nullable(),
55869
55903
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55870
55904
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55905
+ /**
55906
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55907
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55908
+ * when none is reported. A cleared reminder is not an unknown one.
55909
+ */
55910
+ filterCleaningDue: boolean().nullable(),
55911
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55912
+ machineCareDue: boolean().nullable(),
55913
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55914
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55871
55915
  /** Option states: null when the appliance does not expose the option or has not said. */
55872
55916
  halfLoad: boolean().nullable(),
55873
55917
  hygienePlus: boolean().nullable(),
@@ -64518,16 +64562,6 @@ var UpdateUserInputSchema = object({
64518
64562
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64519
64563
  scopes: array(TokenScopeSchema).optional()
64520
64564
  });
64521
- var ApiKeySummarySchema = object({
64522
- id: string(),
64523
- label: string(),
64524
- isAdmin: boolean().default(false),
64525
- allowedProviders: union([array(string()), literal("*")]).optional(),
64526
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64527
- tokenPrefix: string(),
64528
- createdAt: number(),
64529
- lastUsedAt: number().optional()
64530
- });
64531
64565
  var OauthSessionSummarySchema = object({
64532
64566
  id: string(),
64533
64567
  userId: string(),
@@ -64549,8 +64583,7 @@ var TotpStatusSchema = object({
64549
64583
  confirmedAt: number().nullable()
64550
64584
  });
64551
64585
  /**
64552
- * user-management — singleton capability for user accounts and the
64553
- * legacy API-key rows.
64586
+ * user-management — singleton capability for user accounts.
64554
64587
  *
64555
64588
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64556
64589
  * — the subset check on `setUserScopes` is moot
@@ -64606,10 +64639,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64606
64639
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64607
64640
  kind: "mutation",
64608
64641
  access: "view"
64609
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64610
- kind: "mutation",
64611
- auth: "admin",
64612
- access: "delete"
64613
64642
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64614
64643
  kind: "mutation",
64615
64644
  auth: "admin",
@@ -74065,6 +74094,12 @@ Object.freeze({
74065
74094
  addonId: null,
74066
74095
  access: "view"
74067
74096
  },
74097
+ "records.transact": {
74098
+ capName: "records",
74099
+ capScope: "system",
74100
+ addonId: null,
74101
+ access: "create"
74102
+ },
74068
74103
  "sceneMonitor.captureReference": {
74069
74104
  capName: "scene-monitor",
74070
74105
  capScope: "device",
@@ -75397,12 +75432,6 @@ Object.freeze({
75397
75432
  addonId: null,
75398
75433
  access: "view"
75399
75434
  },
75400
- "userManagement.listApiKeys": {
75401
- capName: "user-management",
75402
- capScope: "system",
75403
- addonId: null,
75404
- access: "view"
75405
- },
75406
75435
  "userManagement.listExternalIdentities": {
75407
75436
  capName: "user-management",
75408
75437
  capScope: "system",
@@ -75457,12 +75486,6 @@ Object.freeze({
75457
75486
  addonId: null,
75458
75487
  access: "create"
75459
75488
  },
75460
- "userManagement.revokeApiKey": {
75461
- capName: "user-management",
75462
- capScope: "system",
75463
- addonId: null,
75464
- access: "delete"
75465
- },
75466
75489
  "userManagement.revokeOauthSession": {
75467
75490
  capName: "user-management",
75468
75491
  capScope: "system",
@@ -78827,9 +78850,13 @@ new Map(Object.entries({
78827
78850
  "stream-online": "device-events",
78828
78851
  "stream-offline": "device-events",
78829
78852
  "detection-blind": "device-events",
78853
+ "motion-noisy": "device-events",
78854
+ "motion-calm": "device-events",
78830
78855
  "recording-stalled": "device-events",
78831
78856
  "recording-healthy": "device-events",
78832
78857
  "recording-degraded": "device-events",
78858
+ "device-attention-required": "device-events",
78859
+ "device-attention-resolved": "device-events",
78833
78860
  "node-online": "system",
78834
78861
  "node-offline": "system",
78835
78862
  "node-restarting": "system",
@@ -78846,6 +78873,8 @@ new Map(Object.entries({
78846
78873
  "alert-critical": "system",
78847
78874
  "alert-error": "system",
78848
78875
  "alert-critical-resolved": "system",
78876
+ "rule-broken": "system",
78877
+ "rule-repaired": "system",
78849
78878
  "storage-location-low": "system",
78850
78879
  "storage-location-critical": "system",
78851
78880
  "storage-location-ok": "system",
@@ -78910,6 +78939,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78910
78939
  label: "Detecting nothing",
78911
78940
  kinds: ["detection-blind"]
78912
78941
  },
78942
+ {
78943
+ id: "motion-noise",
78944
+ family: "device-events",
78945
+ label: "Motion without a subject",
78946
+ kinds: ["motion-noisy", "motion-calm"]
78947
+ },
78913
78948
  {
78914
78949
  id: "recording",
78915
78950
  family: "device-events",
@@ -78920,6 +78955,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78920
78955
  "recording-degraded"
78921
78956
  ]
78922
78957
  },
78958
+ {
78959
+ id: "device-attention",
78960
+ family: "device-events",
78961
+ label: "Needs attention",
78962
+ kinds: ["device-attention-required", "device-attention-resolved"]
78963
+ },
78923
78964
  {
78924
78965
  id: "nodes",
78925
78966
  family: "system",
@@ -78980,6 +79021,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78980
79021
  "alert-critical-resolved"
78981
79022
  ]
78982
79023
  },
79024
+ {
79025
+ id: "rule-health",
79026
+ family: "system",
79027
+ label: "Notification rules",
79028
+ kinds: ["rule-broken", "rule-repaired"]
79029
+ },
78983
79030
  {
78984
79031
  id: "alarm",
78985
79032
  family: "alarm",
@@ -79053,6 +79100,7 @@ var ALERT_EPISODE = [
79053
79100
  "alert-error",
79054
79101
  "alert-critical-resolved"
79055
79102
  ];
79103
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79056
79104
  var UPDATES = [
79057
79105
  "addon-update-available",
79058
79106
  "server-update-available",
@@ -79082,9 +79130,12 @@ var DEVICE_EVENTS = [
79082
79130
  "stream-online",
79083
79131
  "stream-offline",
79084
79132
  "detection-blind",
79133
+ "motion-noisy",
79134
+ "motion-calm",
79085
79135
  "recording-stalled",
79086
79136
  "recording-healthy",
79087
79137
  "recording-degraded",
79138
+ ...DEVICE_ATTENTION,
79088
79139
  ...ALARM
79089
79140
  ];
79090
79141
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79252,7 +79303,13 @@ var STATE_SUMMARY_VARS = [
79252
79303
  [...RULE_TEXT],
79253
79304
  [...RULE_TEXT],
79254
79305
  [...RULE_TEXT],
79255
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79306
+ [...RULE_TEXT],
79307
+ [...RULE_TEXT],
79308
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79309
+ [...RULE_TEXT],
79310
+ [...RULE_TEXT],
79311
+ [...RULE_TEXT],
79312
+ [...RULE_TEXT],
79256
79313
  [...RULE_TEXT],
79257
79314
  [...RULE_TEXT],
79258
79315
  [...RULE_TEXT],
@@ -79270,11 +79327,11 @@ var STATE_SUMMARY_VARS = [
79270
79327
  [...RULE_TEXT],
79271
79328
  [...RULE_TEXT],
79272
79329
  [...RULE_TEXT],
79330
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79273
79331
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79332
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79274
79333
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79275
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79276
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79277
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79334
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79278
79335
  [...RULE_TEXT],
79279
79336
  [...RULE_TEXT],
79280
79337
  [...RULE_TEXT],
@@ -79295,6 +79352,125 @@ var STATE_SUMMARY_VARS = [
79295
79352
  [...RULE_TEXT],
79296
79353
  ...STATE_SUMMARY_VARS
79297
79354
  ];
79355
+ new Map([
79356
+ {
79357
+ id: "device-connectivity",
79358
+ family: "device-events",
79359
+ label: "Device connectivity (offline / back online)",
79360
+ bad: ["device-offline"],
79361
+ recovery: ["device-online"],
79362
+ snapshotLabel: "Devices offline now",
79363
+ snapshotSection: "device-state"
79364
+ },
79365
+ {
79366
+ id: "device-switch",
79367
+ family: "device-events",
79368
+ label: "Device switched off / back on",
79369
+ bad: ["device-disabled"],
79370
+ recovery: ["device-enabled"],
79371
+ snapshotLabel: "Devices switched off now",
79372
+ snapshotSection: "device-state"
79373
+ },
79374
+ {
79375
+ id: "stream-connectivity",
79376
+ family: "device-events",
79377
+ label: "Stream connectivity (offline / back online)",
79378
+ bad: ["stream-offline"],
79379
+ recovery: ["stream-online"],
79380
+ snapshotLabel: "Streams offline now",
79381
+ snapshotSection: "streams"
79382
+ },
79383
+ {
79384
+ id: "battery",
79385
+ family: "device-events",
79386
+ label: "Battery (low / back to normal)",
79387
+ bad: ["device-battery-low"],
79388
+ recovery: ["device-battery-normal"],
79389
+ snapshotLabel: "Batteries low now",
79390
+ snapshotSection: "battery"
79391
+ },
79392
+ {
79393
+ id: "consumables",
79394
+ family: "device-events",
79395
+ label: "Consumables (low / replaced)",
79396
+ bad: ["device-consumable-low"],
79397
+ recovery: ["device-consumable-normal"],
79398
+ snapshotLabel: "Consumables low now",
79399
+ snapshotSection: "consumables"
79400
+ },
79401
+ {
79402
+ id: "tanks",
79403
+ family: "device-events",
79404
+ label: "Tanks (low or full / back to normal)",
79405
+ bad: ["device-tank-low", "device-tank-full"],
79406
+ recovery: ["device-tank-normal"],
79407
+ snapshotLabel: "Tanks low or full now",
79408
+ snapshotSection: "tanks"
79409
+ },
79410
+ {
79411
+ id: "motion-noise",
79412
+ family: "device-events",
79413
+ label: "Motion without a subject (constant / calm again)",
79414
+ bad: ["motion-noisy"],
79415
+ recovery: ["motion-calm"],
79416
+ snapshotLabel: "Cameras with constant motion now",
79417
+ snapshotSection: null
79418
+ },
79419
+ {
79420
+ id: "recording-health",
79421
+ family: "device-events",
79422
+ label: "Recording health (stalled or degraded / recording again)",
79423
+ bad: ["recording-stalled", "recording-degraded"],
79424
+ recovery: ["recording-healthy"],
79425
+ snapshotLabel: "Recordings stalled now",
79426
+ snapshotSection: null
79427
+ },
79428
+ {
79429
+ id: "device-attention",
79430
+ family: "device-events",
79431
+ label: "Device needs attention (raised / resolved)",
79432
+ bad: ["device-attention-required"],
79433
+ recovery: ["device-attention-resolved"],
79434
+ snapshotLabel: "Devices needing attention now",
79435
+ snapshotSection: null
79436
+ },
79437
+ {
79438
+ id: "node-connectivity",
79439
+ family: "system",
79440
+ label: "Node connectivity (offline / back online)",
79441
+ bad: ["node-offline"],
79442
+ recovery: ["node-online"],
79443
+ snapshotLabel: "Nodes offline now",
79444
+ snapshotSection: "nodes"
79445
+ },
79446
+ {
79447
+ id: "storage-space",
79448
+ family: "system",
79449
+ label: "Storage space (low or critical / ok again)",
79450
+ bad: ["storage-location-low", "storage-location-critical"],
79451
+ recovery: ["storage-location-ok"],
79452
+ snapshotLabel: "Storage locations low now",
79453
+ snapshotSection: null
79454
+ },
79455
+ {
79456
+ id: "critical-alerts",
79457
+ family: "system",
79458
+ label: "Critical alerts (raised / resolved)",
79459
+ bad: ["alert-critical"],
79460
+ recovery: ["alert-critical-resolved"],
79461
+ snapshotLabel: "Critical alerts open now",
79462
+ snapshotSection: null
79463
+ },
79464
+ {
79465
+ id: "rule-health",
79466
+ family: "system",
79467
+ label: "Rule health (broken / repaired)",
79468
+ bad: ["rule-broken"],
79469
+ recovery: ["rule-repaired"],
79470
+ snapshotLabel: "Notification rules broken now",
79471
+ snapshotSection: null
79472
+ }
79473
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79298
79474
  new Set([
79299
79475
  "disarmed",
79300
79476
  "armed_home",
@@ -83254,7 +83430,7 @@ function buildCreationFormSchema() {
83254
83430
  id: "p2p",
83255
83431
  title: "P2P parameters",
83256
83432
  titleKey: "provider-wyze:creation.s_p2p.title",
83257
- description: "From the Wyze cloud device list (UID / ENR / MAC / local IP / model). Use discovery to auto-populate these — this manual form is the fallback.",
83433
+ description: "Values from the Wyze cloud device list; discovery fills them in automatically.",
83258
83434
  descriptionKey: "provider-wyze:creation.s_p2p.description",
83259
83435
  columns: 2,
83260
83436
  fields: [
@@ -83386,7 +83562,7 @@ function buildSettingsSchema() {
83386
83562
  id: "credentials",
83387
83563
  title: "Wyze account",
83388
83564
  titleKey: "provider-wyze:settings.s_credentials.title",
83389
- description: "Wyze cloud credentials. A developer API Key + Key ID are required (developer-api-console.wyze.com) in addition to your account login. MFA accounts are not supported — use a sub-account or disable MFA.",
83565
+ description: "Needs a developer API Key + Key ID (developer-api-console.wyze.com) besides your login. MFA accounts are not supported.",
83390
83566
  descriptionKey: "provider-wyze:settings.s_credentials.description",
83391
83567
  columns: 2,
83392
83568
  fields: [
package/dist/addon.mjs CHANGED
@@ -10,7 +10,7 @@ import { getCACertificates, setDefaultCACertificates } from "node:tls";
10
10
  //#region \0rolldown/runtime.js
11
11
  var __require$1 = /* @__PURE__ */ createRequire(import.meta.url);
12
12
  //#endregion
13
- //#region ../types/dist/event-category-DOl51-Ij.mjs
13
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
14
14
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
15
15
  EventCategory["SystemBoot"] = "system.boot";
16
16
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -327,6 +327,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
327
327
  */
328
328
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
329
329
  /**
330
+ * A camera's motion source has fired constantly with no subject for an hour
331
+ * (motion duty or session count over the bar, zero detections) — it is not
332
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
333
+ * {@link PipelineMotionCalm}.
334
+ */
335
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
336
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
337
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
338
+ /**
330
339
  * Per-camera pipeline config was mutated by the orchestrator
331
340
  * (3-level settings change via `setAgentAddonDefaults` /
332
341
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -698,6 +707,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
698
707
  EventCategory["BackupRestored"] = "backup.restored";
699
708
  EventCategory["NotificationDispatched"] = "notification.dispatched";
700
709
  EventCategory["NotificationFailed"] = "notification.failed";
710
+ /**
711
+ * A notification rule that cannot work (D905): its stored row does not load,
712
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
713
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
714
+ */
715
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
716
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
717
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
701
718
  EventCategory["DeviceUpdated"] = "device.updated";
702
719
  /**
703
720
  * Transport-level connectivity. Emitted by the device driver when
@@ -5425,7 +5442,7 @@ var ZodIssueCode = {
5425
5442
  var ZodFirstPartyTypeKind;
5426
5443
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5427
5444
  //#endregion
5428
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5445
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5429
5446
  /**
5430
5447
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5431
5448
  * window to float samples (D455).
@@ -7954,7 +7971,7 @@ var EntryDescriptorSchema = object({
7954
7971
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
7955
7972
  fields: record(string(), unknown())
7956
7973
  }).strict();
7957
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
7974
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
7958
7975
  var RecordKindDeclarationSchema = object({
7959
7976
  database: _enum(RECORD_DATABASES).default("settings"),
7960
7977
  class: _enum(RECORD_CLASSES),
@@ -7973,14 +7990,6 @@ var RecordKindDeclarationSchema = object({
7973
7990
  secretPaths: array(string().min(1)).default([]),
7974
7991
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
7975
7992
  secretArrayKeys: record(string(), string()).default({}),
7976
- /**
7977
- * RETIRED (D900): the legacy table a kind adopted from during the records
7978
- * migration. Nothing declares it any more and nothing reads it; the schema
7979
- * still ACCEPTS it because the catalog rows the migration wrote carry it
7980
- * (an orphaned kind is never redeclared) and an addon built before the
7981
- * removal still sends it. Never set it.
7982
- */
7983
- adoptsFrom: string().min(1).optional(),
7984
7993
  /** Kinds that must agree through `transact` sit in one file under one family name. */
7985
7994
  transactFamily: string().min(1).optional(),
7986
7995
  entry: EntryDescriptorSchema.optional()
@@ -12692,17 +12701,6 @@ object({
12692
12701
  createdAt: number(),
12693
12702
  updatedAt: number()
12694
12703
  });
12695
- object({
12696
- id: string(),
12697
- label: string(),
12698
- isAdmin: boolean().default(false),
12699
- allowedProviders: AllowedProviderSchema,
12700
- allowedDevices: AllowedDevicesSchema,
12701
- tokenHash: string(),
12702
- tokenPrefix: string(),
12703
- createdAt: number(),
12704
- lastUsedAt: number().optional()
12705
- });
12706
12704
  object({
12707
12705
  id: string(),
12708
12706
  userId: string(),
@@ -16684,16 +16682,36 @@ var RecordKindStateSchema = _enum([
16684
16682
  var DeclareKindResultSchema = object({
16685
16683
  kindId: number().int(),
16686
16684
  state: RecordKindStateSchema,
16687
- createdIndexes: array(string()),
16688
- /**
16689
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16690
- * it stays on the wire, null, because an addon built before the removal reads
16691
- * an ABSENT field as "adoption pending" and refuses to start.
16692
- */
16693
- adoptionPending: _null()
16685
+ createdIndexes: array(string())
16694
16686
  });
16695
16687
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16696
16688
  var SecretRefsList = array(string());
16689
+ /**
16690
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16691
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16692
+ */
16693
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16694
+ object({
16695
+ op: literal("put"),
16696
+ kind: RecordKindNameSchema,
16697
+ record: RecordInputSchema,
16698
+ ifRev: number().int().min(0).optional()
16699
+ }),
16700
+ object({
16701
+ op: literal("patch"),
16702
+ kind: RecordKindNameSchema,
16703
+ id: RecordIdSchema,
16704
+ data: RecordBodySchema,
16705
+ at: number().int().nullable().optional(),
16706
+ expiresAt: number().int().nullable().optional(),
16707
+ ifRev: number().int().min(1).optional()
16708
+ }),
16709
+ object({
16710
+ op: literal("delete"),
16711
+ kind: RecordKindNameSchema,
16712
+ id: RecordIdSchema
16713
+ })
16714
+ ]);
16697
16715
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16698
16716
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16699
16717
  kind: "mutation",
@@ -16800,6 +16818,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16800
16818
  }), {
16801
16819
  kind: "mutation",
16802
16820
  auth: "admin"
16821
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
16822
+ results: array(object({
16823
+ rev: number().int().nullable(),
16824
+ deleted: boolean()
16825
+ })),
16826
+ releasedRefs: SecretRefsList,
16827
+ secretRefs: SecretRefsList
16828
+ }), {
16829
+ kind: "mutation",
16830
+ auth: "admin"
16803
16831
  }), method(object({
16804
16832
  deviceId: number().int(),
16805
16833
  kinds: array(RecordKindNameSchema).optional()
@@ -42411,9 +42439,13 @@ var NcSystemEventKindSchema = _enum([
42411
42439
  "node-updating",
42412
42440
  "node-inference-unavailable",
42413
42441
  "detection-blind",
42442
+ "motion-noisy",
42443
+ "motion-calm",
42414
42444
  "recording-stalled",
42415
42445
  "recording-healthy",
42416
42446
  "recording-degraded",
42447
+ "device-attention-required",
42448
+ "device-attention-resolved",
42417
42449
  "storage-location-low",
42418
42450
  "storage-location-critical",
42419
42451
  "storage-location-ok",
@@ -42437,6 +42469,8 @@ var NcSystemEventKindSchema = _enum([
42437
42469
  "alert-critical",
42438
42470
  "alert-error",
42439
42471
  "alert-critical-resolved",
42472
+ "rule-broken",
42473
+ "rule-repaired",
42440
42474
  "camera-online",
42441
42475
  "camera-offline",
42442
42476
  "camera-disabled",
@@ -55847,6 +55881,16 @@ var DishwasherStatusSchema = object({
55847
55881
  powerState: string().nullable(),
55848
55882
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55849
55883
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55884
+ /**
55885
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55886
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
55887
+ * when none is reported. A cleared reminder is not an unknown one.
55888
+ */
55889
+ filterCleaningDue: boolean().nullable(),
55890
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
55891
+ machineCareDue: boolean().nullable(),
55892
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
55893
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
55850
55894
  /** Option states: null when the appliance does not expose the option or has not said. */
55851
55895
  halfLoad: boolean().nullable(),
55852
55896
  hygienePlus: boolean().nullable(),
@@ -64497,16 +64541,6 @@ var UpdateUserInputSchema = object({
64497
64541
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64498
64542
  scopes: array(TokenScopeSchema).optional()
64499
64543
  });
64500
- var ApiKeySummarySchema = object({
64501
- id: string(),
64502
- label: string(),
64503
- isAdmin: boolean().default(false),
64504
- allowedProviders: union([array(string()), literal("*")]).optional(),
64505
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
64506
- tokenPrefix: string(),
64507
- createdAt: number(),
64508
- lastUsedAt: number().optional()
64509
- });
64510
64544
  var OauthSessionSummarySchema = object({
64511
64545
  id: string(),
64512
64546
  userId: string(),
@@ -64528,8 +64562,7 @@ var TotpStatusSchema = object({
64528
64562
  confirmedAt: number().nullable()
64529
64563
  });
64530
64564
  /**
64531
- * user-management — singleton capability for user accounts and the
64532
- * legacy API-key rows.
64565
+ * user-management — singleton capability for user accounts.
64533
64566
  *
64534
64567
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
64535
64568
  * — the subset check on `setUserScopes` is moot
@@ -64585,10 +64618,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64585
64618
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
64586
64619
  kind: "mutation",
64587
64620
  access: "view"
64588
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
64589
- kind: "mutation",
64590
- auth: "admin",
64591
- access: "delete"
64592
64621
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
64593
64622
  kind: "mutation",
64594
64623
  auth: "admin",
@@ -74044,6 +74073,12 @@ Object.freeze({
74044
74073
  addonId: null,
74045
74074
  access: "view"
74046
74075
  },
74076
+ "records.transact": {
74077
+ capName: "records",
74078
+ capScope: "system",
74079
+ addonId: null,
74080
+ access: "create"
74081
+ },
74047
74082
  "sceneMonitor.captureReference": {
74048
74083
  capName: "scene-monitor",
74049
74084
  capScope: "device",
@@ -75376,12 +75411,6 @@ Object.freeze({
75376
75411
  addonId: null,
75377
75412
  access: "view"
75378
75413
  },
75379
- "userManagement.listApiKeys": {
75380
- capName: "user-management",
75381
- capScope: "system",
75382
- addonId: null,
75383
- access: "view"
75384
- },
75385
75414
  "userManagement.listExternalIdentities": {
75386
75415
  capName: "user-management",
75387
75416
  capScope: "system",
@@ -75436,12 +75465,6 @@ Object.freeze({
75436
75465
  addonId: null,
75437
75466
  access: "create"
75438
75467
  },
75439
- "userManagement.revokeApiKey": {
75440
- capName: "user-management",
75441
- capScope: "system",
75442
- addonId: null,
75443
- access: "delete"
75444
- },
75445
75468
  "userManagement.revokeOauthSession": {
75446
75469
  capName: "user-management",
75447
75470
  capScope: "system",
@@ -78806,9 +78829,13 @@ new Map(Object.entries({
78806
78829
  "stream-online": "device-events",
78807
78830
  "stream-offline": "device-events",
78808
78831
  "detection-blind": "device-events",
78832
+ "motion-noisy": "device-events",
78833
+ "motion-calm": "device-events",
78809
78834
  "recording-stalled": "device-events",
78810
78835
  "recording-healthy": "device-events",
78811
78836
  "recording-degraded": "device-events",
78837
+ "device-attention-required": "device-events",
78838
+ "device-attention-resolved": "device-events",
78812
78839
  "node-online": "system",
78813
78840
  "node-offline": "system",
78814
78841
  "node-restarting": "system",
@@ -78825,6 +78852,8 @@ new Map(Object.entries({
78825
78852
  "alert-critical": "system",
78826
78853
  "alert-error": "system",
78827
78854
  "alert-critical-resolved": "system",
78855
+ "rule-broken": "system",
78856
+ "rule-repaired": "system",
78828
78857
  "storage-location-low": "system",
78829
78858
  "storage-location-critical": "system",
78830
78859
  "storage-location-ok": "system",
@@ -78889,6 +78918,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78889
78918
  label: "Detecting nothing",
78890
78919
  kinds: ["detection-blind"]
78891
78920
  },
78921
+ {
78922
+ id: "motion-noise",
78923
+ family: "device-events",
78924
+ label: "Motion without a subject",
78925
+ kinds: ["motion-noisy", "motion-calm"]
78926
+ },
78892
78927
  {
78893
78928
  id: "recording",
78894
78929
  family: "device-events",
@@ -78899,6 +78934,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78899
78934
  "recording-degraded"
78900
78935
  ]
78901
78936
  },
78937
+ {
78938
+ id: "device-attention",
78939
+ family: "device-events",
78940
+ label: "Needs attention",
78941
+ kinds: ["device-attention-required", "device-attention-resolved"]
78942
+ },
78902
78943
  {
78903
78944
  id: "nodes",
78904
78945
  family: "system",
@@ -78959,6 +79000,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78959
79000
  "alert-critical-resolved"
78960
79001
  ]
78961
79002
  },
79003
+ {
79004
+ id: "rule-health",
79005
+ family: "system",
79006
+ label: "Notification rules",
79007
+ kinds: ["rule-broken", "rule-repaired"]
79008
+ },
78962
79009
  {
78963
79010
  id: "alarm",
78964
79011
  family: "alarm",
@@ -79032,6 +79079,7 @@ var ALERT_EPISODE = [
79032
79079
  "alert-error",
79033
79080
  "alert-critical-resolved"
79034
79081
  ];
79082
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79035
79083
  var UPDATES = [
79036
79084
  "addon-update-available",
79037
79085
  "server-update-available",
@@ -79061,9 +79109,12 @@ var DEVICE_EVENTS = [
79061
79109
  "stream-online",
79062
79110
  "stream-offline",
79063
79111
  "detection-blind",
79112
+ "motion-noisy",
79113
+ "motion-calm",
79064
79114
  "recording-stalled",
79065
79115
  "recording-healthy",
79066
79116
  "recording-degraded",
79117
+ ...DEVICE_ATTENTION,
79067
79118
  ...ALARM
79068
79119
  ];
79069
79120
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79231,7 +79282,13 @@ var STATE_SUMMARY_VARS = [
79231
79282
  [...RULE_TEXT],
79232
79283
  [...RULE_TEXT],
79233
79284
  [...RULE_TEXT],
79234
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79285
+ [...RULE_TEXT],
79286
+ [...RULE_TEXT],
79287
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79288
+ [...RULE_TEXT],
79289
+ [...RULE_TEXT],
79290
+ [...RULE_TEXT],
79291
+ [...RULE_TEXT],
79235
79292
  [...RULE_TEXT],
79236
79293
  [...RULE_TEXT],
79237
79294
  [...RULE_TEXT],
@@ -79249,11 +79306,11 @@ var STATE_SUMMARY_VARS = [
79249
79306
  [...RULE_TEXT],
79250
79307
  [...RULE_TEXT],
79251
79308
  [...RULE_TEXT],
79309
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79252
79310
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79311
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79253
79312
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79254
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79255
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79256
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79313
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79257
79314
  [...RULE_TEXT],
79258
79315
  [...RULE_TEXT],
79259
79316
  [...RULE_TEXT],
@@ -79274,6 +79331,125 @@ var STATE_SUMMARY_VARS = [
79274
79331
  [...RULE_TEXT],
79275
79332
  ...STATE_SUMMARY_VARS
79276
79333
  ];
79334
+ new Map([
79335
+ {
79336
+ id: "device-connectivity",
79337
+ family: "device-events",
79338
+ label: "Device connectivity (offline / back online)",
79339
+ bad: ["device-offline"],
79340
+ recovery: ["device-online"],
79341
+ snapshotLabel: "Devices offline now",
79342
+ snapshotSection: "device-state"
79343
+ },
79344
+ {
79345
+ id: "device-switch",
79346
+ family: "device-events",
79347
+ label: "Device switched off / back on",
79348
+ bad: ["device-disabled"],
79349
+ recovery: ["device-enabled"],
79350
+ snapshotLabel: "Devices switched off now",
79351
+ snapshotSection: "device-state"
79352
+ },
79353
+ {
79354
+ id: "stream-connectivity",
79355
+ family: "device-events",
79356
+ label: "Stream connectivity (offline / back online)",
79357
+ bad: ["stream-offline"],
79358
+ recovery: ["stream-online"],
79359
+ snapshotLabel: "Streams offline now",
79360
+ snapshotSection: "streams"
79361
+ },
79362
+ {
79363
+ id: "battery",
79364
+ family: "device-events",
79365
+ label: "Battery (low / back to normal)",
79366
+ bad: ["device-battery-low"],
79367
+ recovery: ["device-battery-normal"],
79368
+ snapshotLabel: "Batteries low now",
79369
+ snapshotSection: "battery"
79370
+ },
79371
+ {
79372
+ id: "consumables",
79373
+ family: "device-events",
79374
+ label: "Consumables (low / replaced)",
79375
+ bad: ["device-consumable-low"],
79376
+ recovery: ["device-consumable-normal"],
79377
+ snapshotLabel: "Consumables low now",
79378
+ snapshotSection: "consumables"
79379
+ },
79380
+ {
79381
+ id: "tanks",
79382
+ family: "device-events",
79383
+ label: "Tanks (low or full / back to normal)",
79384
+ bad: ["device-tank-low", "device-tank-full"],
79385
+ recovery: ["device-tank-normal"],
79386
+ snapshotLabel: "Tanks low or full now",
79387
+ snapshotSection: "tanks"
79388
+ },
79389
+ {
79390
+ id: "motion-noise",
79391
+ family: "device-events",
79392
+ label: "Motion without a subject (constant / calm again)",
79393
+ bad: ["motion-noisy"],
79394
+ recovery: ["motion-calm"],
79395
+ snapshotLabel: "Cameras with constant motion now",
79396
+ snapshotSection: null
79397
+ },
79398
+ {
79399
+ id: "recording-health",
79400
+ family: "device-events",
79401
+ label: "Recording health (stalled or degraded / recording again)",
79402
+ bad: ["recording-stalled", "recording-degraded"],
79403
+ recovery: ["recording-healthy"],
79404
+ snapshotLabel: "Recordings stalled now",
79405
+ snapshotSection: null
79406
+ },
79407
+ {
79408
+ id: "device-attention",
79409
+ family: "device-events",
79410
+ label: "Device needs attention (raised / resolved)",
79411
+ bad: ["device-attention-required"],
79412
+ recovery: ["device-attention-resolved"],
79413
+ snapshotLabel: "Devices needing attention now",
79414
+ snapshotSection: null
79415
+ },
79416
+ {
79417
+ id: "node-connectivity",
79418
+ family: "system",
79419
+ label: "Node connectivity (offline / back online)",
79420
+ bad: ["node-offline"],
79421
+ recovery: ["node-online"],
79422
+ snapshotLabel: "Nodes offline now",
79423
+ snapshotSection: "nodes"
79424
+ },
79425
+ {
79426
+ id: "storage-space",
79427
+ family: "system",
79428
+ label: "Storage space (low or critical / ok again)",
79429
+ bad: ["storage-location-low", "storage-location-critical"],
79430
+ recovery: ["storage-location-ok"],
79431
+ snapshotLabel: "Storage locations low now",
79432
+ snapshotSection: null
79433
+ },
79434
+ {
79435
+ id: "critical-alerts",
79436
+ family: "system",
79437
+ label: "Critical alerts (raised / resolved)",
79438
+ bad: ["alert-critical"],
79439
+ recovery: ["alert-critical-resolved"],
79440
+ snapshotLabel: "Critical alerts open now",
79441
+ snapshotSection: null
79442
+ },
79443
+ {
79444
+ id: "rule-health",
79445
+ family: "system",
79446
+ label: "Rule health (broken / repaired)",
79447
+ bad: ["rule-broken"],
79448
+ recovery: ["rule-repaired"],
79449
+ snapshotLabel: "Notification rules broken now",
79450
+ snapshotSection: null
79451
+ }
79452
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79277
79453
  new Set([
79278
79454
  "disarmed",
79279
79455
  "armed_home",
@@ -83233,7 +83409,7 @@ function buildCreationFormSchema() {
83233
83409
  id: "p2p",
83234
83410
  title: "P2P parameters",
83235
83411
  titleKey: "provider-wyze:creation.s_p2p.title",
83236
- description: "From the Wyze cloud device list (UID / ENR / MAC / local IP / model). Use discovery to auto-populate these — this manual form is the fallback.",
83412
+ description: "Values from the Wyze cloud device list; discovery fills them in automatically.",
83237
83413
  descriptionKey: "provider-wyze:creation.s_p2p.description",
83238
83414
  columns: 2,
83239
83415
  fields: [
@@ -83365,7 +83541,7 @@ function buildSettingsSchema() {
83365
83541
  id: "credentials",
83366
83542
  title: "Wyze account",
83367
83543
  titleKey: "provider-wyze:settings.s_credentials.title",
83368
- description: "Wyze cloud credentials. A developer API Key + Key ID are required (developer-api-console.wyze.com) in addition to your account login. MFA accounts are not supported — use a sub-account or disable MFA.",
83544
+ description: "Needs a developer API Key + Key ID (developer-api-console.wyze.com) besides your login. MFA accounts are not supported.",
83369
83545
  descriptionKey: "provider-wyze:settings.s_credentials.description",
83370
83546
  columns: 2,
83371
83547
  fields: [
package/i18n/en.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "creation.s_identity.title": "Camera",
3
3
  "creation.s_identity.name.label": "Name",
4
4
  "creation.s_p2p.title": "P2P parameters",
5
- "creation.s_p2p.description": "From the Wyze cloud device list (UID / ENR / MAC / local IP / model). Use discovery to auto-populate these — this manual form is the fallback.",
5
+ "creation.s_p2p.description": "Values from the Wyze cloud device list; discovery fills them in automatically.",
6
6
  "creation.s_p2p.mac.label": "MAC",
7
7
  "creation.s_p2p.p2pId.label": "P2P UID",
8
8
  "creation.s_p2p.enr.label": "ENR (encryption key)",
@@ -22,7 +22,7 @@
22
22
  "creation.s_stream.motionSource.o_cloud.label": "Cloud events",
23
23
  "creation.s_stream.motionSource.o_boa.label": "On-camera (boa)",
24
24
  "settings.s_credentials.title": "Wyze account",
25
- "settings.s_credentials.description": "Wyze cloud credentials. A developer API Key + Key ID are required (developer-api-console.wyze.com) in addition to your account login. MFA accounts are not supported — use a sub-account or disable MFA.",
25
+ "settings.s_credentials.description": "Needs a developer API Key + Key ID (developer-api-console.wyze.com) besides your login. MFA accounts are not supported.",
26
26
  "settings.s_credentials.email.label": "Email",
27
27
  "settings.s_credentials.password.label": "Password",
28
28
  "settings.s_credentials.apiKey.label": "API Key",
package/i18n/it.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "creation.s_identity.title": "Telecamera",
3
3
  "creation.s_identity.name.label": "Nome",
4
4
  "creation.s_p2p.title": "Parametri P2P",
5
- "creation.s_p2p.description": "Dall'elenco dispositivi del cloud Wyze (UID / ENR / MAC / IP locale / modello). Usa il discovery per compilarli automaticamente: questo modulo manuale è il ripiego.",
5
+ "creation.s_p2p.description": "Valori dall'elenco dispositivi del cloud Wyze; la discovery li compila automaticamente.",
6
6
  "creation.s_p2p.mac.label": "MAC",
7
7
  "creation.s_p2p.p2pId.label": "UID P2P",
8
8
  "creation.s_p2p.enr.label": "ENR (chiave di cifratura)",
@@ -22,7 +22,7 @@
22
22
  "creation.s_stream.motionSource.o_cloud.label": "Eventi cloud",
23
23
  "creation.s_stream.motionSource.o_boa.label": "Di bordo (boa)",
24
24
  "settings.s_credentials.title": "Account Wyze",
25
- "settings.s_credentials.description": "Credenziali del cloud Wyze. Oltre al login dell'account servono una API Key e un Key ID da developer (developer-api-console.wyze.com). Gli account con MFA non sono supportati: usa un sotto-account o disattiva l'MFA.",
25
+ "settings.s_credentials.description": "Servono una API Key e un Key ID sviluppatore (developer-api-console.wyze.com) oltre al login. Gli account con MFA non sono supportati.",
26
26
  "settings.s_credentials.email.label": "Email",
27
27
  "settings.s_credentials.password.label": "Password",
28
28
  "settings.s_credentials.apiKey.label": "API Key",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.152",
3
+ "version": "0.2.154",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",