@camstack/addon-provider-tuya 0.2.139 → 0.2.141

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
@@ -819,7 +819,7 @@ async function discoverDevices(options = {}, binder = createDgramBinder()) {
819
819
  return [...byId.values()];
820
820
  }
821
821
  //#endregion
822
- //#region ../types/dist/event-category-DOl51-Ij.mjs
822
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
823
823
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
824
824
  EventCategory["SystemBoot"] = "system.boot";
825
825
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1136,6 +1136,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1136
1136
  */
1137
1137
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
1138
1138
  /**
1139
+ * A camera's motion source has fired constantly with no subject for an hour
1140
+ * (motion duty or session count over the bar, zero detections) — it is not
1141
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
1142
+ * {@link PipelineMotionCalm}.
1143
+ */
1144
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
1145
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
1146
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
1147
+ /**
1139
1148
  * Per-camera pipeline config was mutated by the orchestrator
1140
1149
  * (3-level settings change via `setAgentAddonDefaults` /
1141
1150
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -1507,6 +1516,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1507
1516
  EventCategory["BackupRestored"] = "backup.restored";
1508
1517
  EventCategory["NotificationDispatched"] = "notification.dispatched";
1509
1518
  EventCategory["NotificationFailed"] = "notification.failed";
1519
+ /**
1520
+ * A notification rule that cannot work (D905): its stored row does not load,
1521
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
1522
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
1523
+ */
1524
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
1525
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
1526
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
1510
1527
  EventCategory["DeviceUpdated"] = "device.updated";
1511
1528
  /**
1512
1529
  * Transport-level connectivity. Emitted by the device driver when
@@ -6234,7 +6251,7 @@ var ZodIssueCode = {
6234
6251
  var ZodFirstPartyTypeKind;
6235
6252
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6236
6253
  //#endregion
6237
- //#region ../types/dist/sleep-_sV1BE2f.mjs
6254
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
6238
6255
  /**
6239
6256
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6240
6257
  * window to float samples (D455).
@@ -8763,7 +8780,7 @@ var EntryDescriptorSchema = object({
8763
8780
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8764
8781
  fields: record(string(), unknown())
8765
8782
  }).strict();
8766
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8783
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8767
8784
  var RecordKindDeclarationSchema = object({
8768
8785
  database: _enum(RECORD_DATABASES).default("settings"),
8769
8786
  class: _enum(RECORD_CLASSES),
@@ -8782,14 +8799,6 @@ var RecordKindDeclarationSchema = object({
8782
8799
  secretPaths: array(string().min(1)).default([]),
8783
8800
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8784
8801
  secretArrayKeys: record(string(), string()).default({}),
8785
- /**
8786
- * RETIRED (D900): the legacy table a kind adopted from during the records
8787
- * migration. Nothing declares it any more and nothing reads it; the schema
8788
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8789
- * (an orphaned kind is never redeclared) and an addon built before the
8790
- * removal still sends it. Never set it.
8791
- */
8792
- adoptsFrom: string().min(1).optional(),
8793
8802
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8794
8803
  transactFamily: string().min(1).optional(),
8795
8804
  entry: EntryDescriptorSchema.optional()
@@ -13467,17 +13476,6 @@ object({
13467
13476
  createdAt: number(),
13468
13477
  updatedAt: number()
13469
13478
  });
13470
- object({
13471
- id: string(),
13472
- label: string(),
13473
- isAdmin: boolean().default(false),
13474
- allowedProviders: AllowedProviderSchema,
13475
- allowedDevices: AllowedDevicesSchema,
13476
- tokenHash: string(),
13477
- tokenPrefix: string(),
13478
- createdAt: number(),
13479
- lastUsedAt: number().optional()
13480
- });
13481
13479
  object({
13482
13480
  id: string(),
13483
13481
  userId: string(),
@@ -17459,16 +17457,36 @@ var RecordKindStateSchema = _enum([
17459
17457
  var DeclareKindResultSchema = object({
17460
17458
  kindId: number().int(),
17461
17459
  state: RecordKindStateSchema,
17462
- createdIndexes: array(string()),
17463
- /**
17464
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17465
- * it stays on the wire, null, because an addon built before the removal reads
17466
- * an ABSENT field as "adoption pending" and refuses to start.
17467
- */
17468
- adoptionPending: _null()
17460
+ createdIndexes: array(string())
17469
17461
  });
17470
17462
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17471
17463
  var SecretRefsList = array(string());
17464
+ /**
17465
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17466
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17467
+ */
17468
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17469
+ object({
17470
+ op: literal("put"),
17471
+ kind: RecordKindNameSchema,
17472
+ record: RecordInputSchema,
17473
+ ifRev: number().int().min(0).optional()
17474
+ }),
17475
+ object({
17476
+ op: literal("patch"),
17477
+ kind: RecordKindNameSchema,
17478
+ id: RecordIdSchema,
17479
+ data: RecordBodySchema,
17480
+ at: number().int().nullable().optional(),
17481
+ expiresAt: number().int().nullable().optional(),
17482
+ ifRev: number().int().min(1).optional()
17483
+ }),
17484
+ object({
17485
+ op: literal("delete"),
17486
+ kind: RecordKindNameSchema,
17487
+ id: RecordIdSchema
17488
+ })
17489
+ ]);
17472
17490
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17473
17491
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17474
17492
  kind: "mutation",
@@ -17575,6 +17593,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17575
17593
  }), {
17576
17594
  kind: "mutation",
17577
17595
  auth: "admin"
17596
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17597
+ results: array(object({
17598
+ rev: number().int().nullable(),
17599
+ deleted: boolean()
17600
+ })),
17601
+ releasedRefs: SecretRefsList,
17602
+ secretRefs: SecretRefsList
17603
+ }), {
17604
+ kind: "mutation",
17605
+ auth: "admin"
17578
17606
  }), method(object({
17579
17607
  deviceId: number().int(),
17580
17608
  kinds: array(RecordKindNameSchema).optional()
@@ -43186,9 +43214,13 @@ var NcSystemEventKindSchema = _enum([
43186
43214
  "node-updating",
43187
43215
  "node-inference-unavailable",
43188
43216
  "detection-blind",
43217
+ "motion-noisy",
43218
+ "motion-calm",
43189
43219
  "recording-stalled",
43190
43220
  "recording-healthy",
43191
43221
  "recording-degraded",
43222
+ "device-attention-required",
43223
+ "device-attention-resolved",
43192
43224
  "storage-location-low",
43193
43225
  "storage-location-critical",
43194
43226
  "storage-location-ok",
@@ -43212,6 +43244,8 @@ var NcSystemEventKindSchema = _enum([
43212
43244
  "alert-critical",
43213
43245
  "alert-error",
43214
43246
  "alert-critical-resolved",
43247
+ "rule-broken",
43248
+ "rule-repaired",
43215
43249
  "camera-online",
43216
43250
  "camera-offline",
43217
43251
  "camera-disabled",
@@ -56518,6 +56552,16 @@ var DishwasherStatusSchema = object({
56518
56552
  powerState: string().nullable(),
56519
56553
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56520
56554
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56555
+ /**
56556
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56557
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56558
+ * when none is reported. A cleared reminder is not an unknown one.
56559
+ */
56560
+ filterCleaningDue: boolean().nullable(),
56561
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56562
+ machineCareDue: boolean().nullable(),
56563
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56564
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56521
56565
  /** Option states: null when the appliance does not expose the option or has not said. */
56522
56566
  halfLoad: boolean().nullable(),
56523
56567
  hygienePlus: boolean().nullable(),
@@ -65168,16 +65212,6 @@ var UpdateUserInputSchema = object({
65168
65212
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65169
65213
  scopes: array(TokenScopeSchema).optional()
65170
65214
  });
65171
- var ApiKeySummarySchema = object({
65172
- id: string(),
65173
- label: string(),
65174
- isAdmin: boolean().default(false),
65175
- allowedProviders: union([array(string()), literal("*")]).optional(),
65176
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65177
- tokenPrefix: string(),
65178
- createdAt: number(),
65179
- lastUsedAt: number().optional()
65180
- });
65181
65215
  var OauthSessionSummarySchema = object({
65182
65216
  id: string(),
65183
65217
  userId: string(),
@@ -65199,8 +65233,7 @@ var TotpStatusSchema = object({
65199
65233
  confirmedAt: number().nullable()
65200
65234
  });
65201
65235
  /**
65202
- * user-management — singleton capability for user accounts and the
65203
- * legacy API-key rows.
65236
+ * user-management — singleton capability for user accounts.
65204
65237
  *
65205
65238
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65206
65239
  * — the subset check on `setUserScopes` is moot
@@ -65256,10 +65289,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65256
65289
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65257
65290
  kind: "mutation",
65258
65291
  access: "view"
65259
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65260
- kind: "mutation",
65261
- auth: "admin",
65262
- access: "delete"
65263
65292
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65264
65293
  kind: "mutation",
65265
65294
  auth: "admin",
@@ -74715,6 +74744,12 @@ Object.freeze({
74715
74744
  addonId: null,
74716
74745
  access: "view"
74717
74746
  },
74747
+ "records.transact": {
74748
+ capName: "records",
74749
+ capScope: "system",
74750
+ addonId: null,
74751
+ access: "create"
74752
+ },
74718
74753
  "sceneMonitor.captureReference": {
74719
74754
  capName: "scene-monitor",
74720
74755
  capScope: "device",
@@ -76047,12 +76082,6 @@ Object.freeze({
76047
76082
  addonId: null,
76048
76083
  access: "view"
76049
76084
  },
76050
- "userManagement.listApiKeys": {
76051
- capName: "user-management",
76052
- capScope: "system",
76053
- addonId: null,
76054
- access: "view"
76055
- },
76056
76085
  "userManagement.listExternalIdentities": {
76057
76086
  capName: "user-management",
76058
76087
  capScope: "system",
@@ -76107,12 +76136,6 @@ Object.freeze({
76107
76136
  addonId: null,
76108
76137
  access: "create"
76109
76138
  },
76110
- "userManagement.revokeApiKey": {
76111
- capName: "user-management",
76112
- capScope: "system",
76113
- addonId: null,
76114
- access: "delete"
76115
- },
76116
76139
  "userManagement.revokeOauthSession": {
76117
76140
  capName: "user-management",
76118
76141
  capScope: "system",
@@ -79477,9 +79500,13 @@ new Map(Object.entries({
79477
79500
  "stream-online": "device-events",
79478
79501
  "stream-offline": "device-events",
79479
79502
  "detection-blind": "device-events",
79503
+ "motion-noisy": "device-events",
79504
+ "motion-calm": "device-events",
79480
79505
  "recording-stalled": "device-events",
79481
79506
  "recording-healthy": "device-events",
79482
79507
  "recording-degraded": "device-events",
79508
+ "device-attention-required": "device-events",
79509
+ "device-attention-resolved": "device-events",
79483
79510
  "node-online": "system",
79484
79511
  "node-offline": "system",
79485
79512
  "node-restarting": "system",
@@ -79496,6 +79523,8 @@ new Map(Object.entries({
79496
79523
  "alert-critical": "system",
79497
79524
  "alert-error": "system",
79498
79525
  "alert-critical-resolved": "system",
79526
+ "rule-broken": "system",
79527
+ "rule-repaired": "system",
79499
79528
  "storage-location-low": "system",
79500
79529
  "storage-location-critical": "system",
79501
79530
  "storage-location-ok": "system",
@@ -79560,6 +79589,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79560
79589
  label: "Detecting nothing",
79561
79590
  kinds: ["detection-blind"]
79562
79591
  },
79592
+ {
79593
+ id: "motion-noise",
79594
+ family: "device-events",
79595
+ label: "Motion without a subject",
79596
+ kinds: ["motion-noisy", "motion-calm"]
79597
+ },
79563
79598
  {
79564
79599
  id: "recording",
79565
79600
  family: "device-events",
@@ -79570,6 +79605,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79570
79605
  "recording-degraded"
79571
79606
  ]
79572
79607
  },
79608
+ {
79609
+ id: "device-attention",
79610
+ family: "device-events",
79611
+ label: "Needs attention",
79612
+ kinds: ["device-attention-required", "device-attention-resolved"]
79613
+ },
79573
79614
  {
79574
79615
  id: "nodes",
79575
79616
  family: "system",
@@ -79630,6 +79671,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79630
79671
  "alert-critical-resolved"
79631
79672
  ]
79632
79673
  },
79674
+ {
79675
+ id: "rule-health",
79676
+ family: "system",
79677
+ label: "Notification rules",
79678
+ kinds: ["rule-broken", "rule-repaired"]
79679
+ },
79633
79680
  {
79634
79681
  id: "alarm",
79635
79682
  family: "alarm",
@@ -79703,6 +79750,7 @@ var ALERT_EPISODE = [
79703
79750
  "alert-error",
79704
79751
  "alert-critical-resolved"
79705
79752
  ];
79753
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79706
79754
  var UPDATES = [
79707
79755
  "addon-update-available",
79708
79756
  "server-update-available",
@@ -79732,9 +79780,12 @@ var DEVICE_EVENTS = [
79732
79780
  "stream-online",
79733
79781
  "stream-offline",
79734
79782
  "detection-blind",
79783
+ "motion-noisy",
79784
+ "motion-calm",
79735
79785
  "recording-stalled",
79736
79786
  "recording-healthy",
79737
79787
  "recording-degraded",
79788
+ ...DEVICE_ATTENTION,
79738
79789
  ...ALARM
79739
79790
  ];
79740
79791
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79902,7 +79953,13 @@ var STATE_SUMMARY_VARS = [
79902
79953
  [...RULE_TEXT],
79903
79954
  [...RULE_TEXT],
79904
79955
  [...RULE_TEXT],
79905
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79956
+ [...RULE_TEXT],
79957
+ [...RULE_TEXT],
79958
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79959
+ [...RULE_TEXT],
79960
+ [...RULE_TEXT],
79961
+ [...RULE_TEXT],
79962
+ [...RULE_TEXT],
79906
79963
  [...RULE_TEXT],
79907
79964
  [...RULE_TEXT],
79908
79965
  [...RULE_TEXT],
@@ -79920,11 +79977,11 @@ var STATE_SUMMARY_VARS = [
79920
79977
  [...RULE_TEXT],
79921
79978
  [...RULE_TEXT],
79922
79979
  [...RULE_TEXT],
79980
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79923
79981
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79982
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79924
79983
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79925
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79926
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79927
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79984
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79928
79985
  [...RULE_TEXT],
79929
79986
  [...RULE_TEXT],
79930
79987
  [...RULE_TEXT],
@@ -79945,6 +80002,125 @@ var STATE_SUMMARY_VARS = [
79945
80002
  [...RULE_TEXT],
79946
80003
  ...STATE_SUMMARY_VARS
79947
80004
  ];
80005
+ new Map([
80006
+ {
80007
+ id: "device-connectivity",
80008
+ family: "device-events",
80009
+ label: "Device connectivity (offline / back online)",
80010
+ bad: ["device-offline"],
80011
+ recovery: ["device-online"],
80012
+ snapshotLabel: "Devices offline now",
80013
+ snapshotSection: "device-state"
80014
+ },
80015
+ {
80016
+ id: "device-switch",
80017
+ family: "device-events",
80018
+ label: "Device switched off / back on",
80019
+ bad: ["device-disabled"],
80020
+ recovery: ["device-enabled"],
80021
+ snapshotLabel: "Devices switched off now",
80022
+ snapshotSection: "device-state"
80023
+ },
80024
+ {
80025
+ id: "stream-connectivity",
80026
+ family: "device-events",
80027
+ label: "Stream connectivity (offline / back online)",
80028
+ bad: ["stream-offline"],
80029
+ recovery: ["stream-online"],
80030
+ snapshotLabel: "Streams offline now",
80031
+ snapshotSection: "streams"
80032
+ },
80033
+ {
80034
+ id: "battery",
80035
+ family: "device-events",
80036
+ label: "Battery (low / back to normal)",
80037
+ bad: ["device-battery-low"],
80038
+ recovery: ["device-battery-normal"],
80039
+ snapshotLabel: "Batteries low now",
80040
+ snapshotSection: "battery"
80041
+ },
80042
+ {
80043
+ id: "consumables",
80044
+ family: "device-events",
80045
+ label: "Consumables (low / replaced)",
80046
+ bad: ["device-consumable-low"],
80047
+ recovery: ["device-consumable-normal"],
80048
+ snapshotLabel: "Consumables low now",
80049
+ snapshotSection: "consumables"
80050
+ },
80051
+ {
80052
+ id: "tanks",
80053
+ family: "device-events",
80054
+ label: "Tanks (low or full / back to normal)",
80055
+ bad: ["device-tank-low", "device-tank-full"],
80056
+ recovery: ["device-tank-normal"],
80057
+ snapshotLabel: "Tanks low or full now",
80058
+ snapshotSection: "tanks"
80059
+ },
80060
+ {
80061
+ id: "motion-noise",
80062
+ family: "device-events",
80063
+ label: "Motion without a subject (constant / calm again)",
80064
+ bad: ["motion-noisy"],
80065
+ recovery: ["motion-calm"],
80066
+ snapshotLabel: "Cameras with constant motion now",
80067
+ snapshotSection: null
80068
+ },
80069
+ {
80070
+ id: "recording-health",
80071
+ family: "device-events",
80072
+ label: "Recording health (stalled or degraded / recording again)",
80073
+ bad: ["recording-stalled", "recording-degraded"],
80074
+ recovery: ["recording-healthy"],
80075
+ snapshotLabel: "Recordings stalled now",
80076
+ snapshotSection: null
80077
+ },
80078
+ {
80079
+ id: "device-attention",
80080
+ family: "device-events",
80081
+ label: "Device needs attention (raised / resolved)",
80082
+ bad: ["device-attention-required"],
80083
+ recovery: ["device-attention-resolved"],
80084
+ snapshotLabel: "Devices needing attention now",
80085
+ snapshotSection: null
80086
+ },
80087
+ {
80088
+ id: "node-connectivity",
80089
+ family: "system",
80090
+ label: "Node connectivity (offline / back online)",
80091
+ bad: ["node-offline"],
80092
+ recovery: ["node-online"],
80093
+ snapshotLabel: "Nodes offline now",
80094
+ snapshotSection: "nodes"
80095
+ },
80096
+ {
80097
+ id: "storage-space",
80098
+ family: "system",
80099
+ label: "Storage space (low or critical / ok again)",
80100
+ bad: ["storage-location-low", "storage-location-critical"],
80101
+ recovery: ["storage-location-ok"],
80102
+ snapshotLabel: "Storage locations low now",
80103
+ snapshotSection: null
80104
+ },
80105
+ {
80106
+ id: "critical-alerts",
80107
+ family: "system",
80108
+ label: "Critical alerts (raised / resolved)",
80109
+ bad: ["alert-critical"],
80110
+ recovery: ["alert-critical-resolved"],
80111
+ snapshotLabel: "Critical alerts open now",
80112
+ snapshotSection: null
80113
+ },
80114
+ {
80115
+ id: "rule-health",
80116
+ family: "system",
80117
+ label: "Rule health (broken / repaired)",
80118
+ bad: ["rule-broken"],
80119
+ recovery: ["rule-repaired"],
80120
+ snapshotLabel: "Notification rules broken now",
80121
+ snapshotSection: null
80122
+ }
80123
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79948
80124
  new Set([
79949
80125
  "disarmed",
79950
80126
  "armed_home",
@@ -80544,7 +80720,7 @@ function buildConnectionFormSchema() {
80544
80720
  id: "credentials",
80545
80721
  title: "Tuya IoT cloud project",
80546
80722
  titleKey: "provider-tuya:connection.s_credentials.title",
80547
- description: "Create a free project at iot.tuya.com, link your Smart Life / Tuya app account to it, and paste the project's Access ID and Access Secret. CamStack uses them to fetch each device's local key, then controls the devices directly over your LAN (no ongoing cloud).",
80723
+ description: "Create a project at iot.tuya.com, link your Smart Life / Tuya account to it, and paste its Access ID and Access Secret.",
80548
80724
  descriptionKey: "provider-tuya:connection.s_credentials.description",
80549
80725
  columns: 1,
80550
80726
  fields: [{
package/dist/addon.mjs CHANGED
@@ -818,7 +818,7 @@ async function discoverDevices(options = {}, binder = createDgramBinder()) {
818
818
  return [...byId.values()];
819
819
  }
820
820
  //#endregion
821
- //#region ../types/dist/event-category-DOl51-Ij.mjs
821
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
822
822
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
823
823
  EventCategory["SystemBoot"] = "system.boot";
824
824
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -1135,6 +1135,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1135
1135
  */
1136
1136
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
1137
1137
  /**
1138
+ * A camera's motion source has fired constantly with no subject for an hour
1139
+ * (motion duty or session count over the bar, zero detections) — it is not
1140
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
1141
+ * {@link PipelineMotionCalm}.
1142
+ */
1143
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
1144
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
1145
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
1146
+ /**
1138
1147
  * Per-camera pipeline config was mutated by the orchestrator
1139
1148
  * (3-level settings change via `setAgentAddonDefaults` /
1140
1149
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -1506,6 +1515,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
1506
1515
  EventCategory["BackupRestored"] = "backup.restored";
1507
1516
  EventCategory["NotificationDispatched"] = "notification.dispatched";
1508
1517
  EventCategory["NotificationFailed"] = "notification.failed";
1518
+ /**
1519
+ * A notification rule that cannot work (D905): its stored row does not load,
1520
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
1521
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
1522
+ */
1523
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
1524
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
1525
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
1509
1526
  EventCategory["DeviceUpdated"] = "device.updated";
1510
1527
  /**
1511
1528
  * Transport-level connectivity. Emitted by the device driver when
@@ -6233,7 +6250,7 @@ var ZodIssueCode = {
6233
6250
  var ZodFirstPartyTypeKind;
6234
6251
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6235
6252
  //#endregion
6236
- //#region ../types/dist/sleep-_sV1BE2f.mjs
6253
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
6237
6254
  /**
6238
6255
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6239
6256
  * window to float samples (D455).
@@ -8762,7 +8779,7 @@ var EntryDescriptorSchema = object({
8762
8779
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8763
8780
  fields: record(string(), unknown())
8764
8781
  }).strict();
8765
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8782
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8766
8783
  var RecordKindDeclarationSchema = object({
8767
8784
  database: _enum(RECORD_DATABASES).default("settings"),
8768
8785
  class: _enum(RECORD_CLASSES),
@@ -8781,14 +8798,6 @@ var RecordKindDeclarationSchema = object({
8781
8798
  secretPaths: array(string().min(1)).default([]),
8782
8799
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8783
8800
  secretArrayKeys: record(string(), string()).default({}),
8784
- /**
8785
- * RETIRED (D900): the legacy table a kind adopted from during the records
8786
- * migration. Nothing declares it any more and nothing reads it; the schema
8787
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8788
- * (an orphaned kind is never redeclared) and an addon built before the
8789
- * removal still sends it. Never set it.
8790
- */
8791
- adoptsFrom: string().min(1).optional(),
8792
8801
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8793
8802
  transactFamily: string().min(1).optional(),
8794
8803
  entry: EntryDescriptorSchema.optional()
@@ -13466,17 +13475,6 @@ object({
13466
13475
  createdAt: number(),
13467
13476
  updatedAt: number()
13468
13477
  });
13469
- object({
13470
- id: string(),
13471
- label: string(),
13472
- isAdmin: boolean().default(false),
13473
- allowedProviders: AllowedProviderSchema,
13474
- allowedDevices: AllowedDevicesSchema,
13475
- tokenHash: string(),
13476
- tokenPrefix: string(),
13477
- createdAt: number(),
13478
- lastUsedAt: number().optional()
13479
- });
13480
13478
  object({
13481
13479
  id: string(),
13482
13480
  userId: string(),
@@ -17458,16 +17456,36 @@ var RecordKindStateSchema = _enum([
17458
17456
  var DeclareKindResultSchema = object({
17459
17457
  kindId: number().int(),
17460
17458
  state: RecordKindStateSchema,
17461
- createdIndexes: array(string()),
17462
- /**
17463
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17464
- * it stays on the wire, null, because an addon built before the removal reads
17465
- * an ABSENT field as "adoption pending" and refuses to start.
17466
- */
17467
- adoptionPending: _null()
17459
+ createdIndexes: array(string())
17468
17460
  });
17469
17461
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17470
17462
  var SecretRefsList = array(string());
17463
+ /**
17464
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17465
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17466
+ */
17467
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17468
+ object({
17469
+ op: literal("put"),
17470
+ kind: RecordKindNameSchema,
17471
+ record: RecordInputSchema,
17472
+ ifRev: number().int().min(0).optional()
17473
+ }),
17474
+ object({
17475
+ op: literal("patch"),
17476
+ kind: RecordKindNameSchema,
17477
+ id: RecordIdSchema,
17478
+ data: RecordBodySchema,
17479
+ at: number().int().nullable().optional(),
17480
+ expiresAt: number().int().nullable().optional(),
17481
+ ifRev: number().int().min(1).optional()
17482
+ }),
17483
+ object({
17484
+ op: literal("delete"),
17485
+ kind: RecordKindNameSchema,
17486
+ id: RecordIdSchema
17487
+ })
17488
+ ]);
17471
17489
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17472
17490
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17473
17491
  kind: "mutation",
@@ -17574,6 +17592,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17574
17592
  }), {
17575
17593
  kind: "mutation",
17576
17594
  auth: "admin"
17595
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17596
+ results: array(object({
17597
+ rev: number().int().nullable(),
17598
+ deleted: boolean()
17599
+ })),
17600
+ releasedRefs: SecretRefsList,
17601
+ secretRefs: SecretRefsList
17602
+ }), {
17603
+ kind: "mutation",
17604
+ auth: "admin"
17577
17605
  }), method(object({
17578
17606
  deviceId: number().int(),
17579
17607
  kinds: array(RecordKindNameSchema).optional()
@@ -43185,9 +43213,13 @@ var NcSystemEventKindSchema = _enum([
43185
43213
  "node-updating",
43186
43214
  "node-inference-unavailable",
43187
43215
  "detection-blind",
43216
+ "motion-noisy",
43217
+ "motion-calm",
43188
43218
  "recording-stalled",
43189
43219
  "recording-healthy",
43190
43220
  "recording-degraded",
43221
+ "device-attention-required",
43222
+ "device-attention-resolved",
43191
43223
  "storage-location-low",
43192
43224
  "storage-location-critical",
43193
43225
  "storage-location-ok",
@@ -43211,6 +43243,8 @@ var NcSystemEventKindSchema = _enum([
43211
43243
  "alert-critical",
43212
43244
  "alert-error",
43213
43245
  "alert-critical-resolved",
43246
+ "rule-broken",
43247
+ "rule-repaired",
43214
43248
  "camera-online",
43215
43249
  "camera-offline",
43216
43250
  "camera-disabled",
@@ -56517,6 +56551,16 @@ var DishwasherStatusSchema = object({
56517
56551
  powerState: string().nullable(),
56518
56552
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56519
56553
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56554
+ /**
56555
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56556
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56557
+ * when none is reported. A cleared reminder is not an unknown one.
56558
+ */
56559
+ filterCleaningDue: boolean().nullable(),
56560
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56561
+ machineCareDue: boolean().nullable(),
56562
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56563
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56520
56564
  /** Option states: null when the appliance does not expose the option or has not said. */
56521
56565
  halfLoad: boolean().nullable(),
56522
56566
  hygienePlus: boolean().nullable(),
@@ -65167,16 +65211,6 @@ var UpdateUserInputSchema = object({
65167
65211
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65168
65212
  scopes: array(TokenScopeSchema).optional()
65169
65213
  });
65170
- var ApiKeySummarySchema = object({
65171
- id: string(),
65172
- label: string(),
65173
- isAdmin: boolean().default(false),
65174
- allowedProviders: union([array(string()), literal("*")]).optional(),
65175
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65176
- tokenPrefix: string(),
65177
- createdAt: number(),
65178
- lastUsedAt: number().optional()
65179
- });
65180
65214
  var OauthSessionSummarySchema = object({
65181
65215
  id: string(),
65182
65216
  userId: string(),
@@ -65198,8 +65232,7 @@ var TotpStatusSchema = object({
65198
65232
  confirmedAt: number().nullable()
65199
65233
  });
65200
65234
  /**
65201
- * user-management — singleton capability for user accounts and the
65202
- * legacy API-key rows.
65235
+ * user-management — singleton capability for user accounts.
65203
65236
  *
65204
65237
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65205
65238
  * — the subset check on `setUserScopes` is moot
@@ -65255,10 +65288,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65255
65288
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65256
65289
  kind: "mutation",
65257
65290
  access: "view"
65258
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65259
- kind: "mutation",
65260
- auth: "admin",
65261
- access: "delete"
65262
65291
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65263
65292
  kind: "mutation",
65264
65293
  auth: "admin",
@@ -74714,6 +74743,12 @@ Object.freeze({
74714
74743
  addonId: null,
74715
74744
  access: "view"
74716
74745
  },
74746
+ "records.transact": {
74747
+ capName: "records",
74748
+ capScope: "system",
74749
+ addonId: null,
74750
+ access: "create"
74751
+ },
74717
74752
  "sceneMonitor.captureReference": {
74718
74753
  capName: "scene-monitor",
74719
74754
  capScope: "device",
@@ -76046,12 +76081,6 @@ Object.freeze({
76046
76081
  addonId: null,
76047
76082
  access: "view"
76048
76083
  },
76049
- "userManagement.listApiKeys": {
76050
- capName: "user-management",
76051
- capScope: "system",
76052
- addonId: null,
76053
- access: "view"
76054
- },
76055
76084
  "userManagement.listExternalIdentities": {
76056
76085
  capName: "user-management",
76057
76086
  capScope: "system",
@@ -76106,12 +76135,6 @@ Object.freeze({
76106
76135
  addonId: null,
76107
76136
  access: "create"
76108
76137
  },
76109
- "userManagement.revokeApiKey": {
76110
- capName: "user-management",
76111
- capScope: "system",
76112
- addonId: null,
76113
- access: "delete"
76114
- },
76115
76138
  "userManagement.revokeOauthSession": {
76116
76139
  capName: "user-management",
76117
76140
  capScope: "system",
@@ -79476,9 +79499,13 @@ new Map(Object.entries({
79476
79499
  "stream-online": "device-events",
79477
79500
  "stream-offline": "device-events",
79478
79501
  "detection-blind": "device-events",
79502
+ "motion-noisy": "device-events",
79503
+ "motion-calm": "device-events",
79479
79504
  "recording-stalled": "device-events",
79480
79505
  "recording-healthy": "device-events",
79481
79506
  "recording-degraded": "device-events",
79507
+ "device-attention-required": "device-events",
79508
+ "device-attention-resolved": "device-events",
79482
79509
  "node-online": "system",
79483
79510
  "node-offline": "system",
79484
79511
  "node-restarting": "system",
@@ -79495,6 +79522,8 @@ new Map(Object.entries({
79495
79522
  "alert-critical": "system",
79496
79523
  "alert-error": "system",
79497
79524
  "alert-critical-resolved": "system",
79525
+ "rule-broken": "system",
79526
+ "rule-repaired": "system",
79498
79527
  "storage-location-low": "system",
79499
79528
  "storage-location-critical": "system",
79500
79529
  "storage-location-ok": "system",
@@ -79559,6 +79588,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79559
79588
  label: "Detecting nothing",
79560
79589
  kinds: ["detection-blind"]
79561
79590
  },
79591
+ {
79592
+ id: "motion-noise",
79593
+ family: "device-events",
79594
+ label: "Motion without a subject",
79595
+ kinds: ["motion-noisy", "motion-calm"]
79596
+ },
79562
79597
  {
79563
79598
  id: "recording",
79564
79599
  family: "device-events",
@@ -79569,6 +79604,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79569
79604
  "recording-degraded"
79570
79605
  ]
79571
79606
  },
79607
+ {
79608
+ id: "device-attention",
79609
+ family: "device-events",
79610
+ label: "Needs attention",
79611
+ kinds: ["device-attention-required", "device-attention-resolved"]
79612
+ },
79572
79613
  {
79573
79614
  id: "nodes",
79574
79615
  family: "system",
@@ -79629,6 +79670,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79629
79670
  "alert-critical-resolved"
79630
79671
  ]
79631
79672
  },
79673
+ {
79674
+ id: "rule-health",
79675
+ family: "system",
79676
+ label: "Notification rules",
79677
+ kinds: ["rule-broken", "rule-repaired"]
79678
+ },
79632
79679
  {
79633
79680
  id: "alarm",
79634
79681
  family: "alarm",
@@ -79702,6 +79749,7 @@ var ALERT_EPISODE = [
79702
79749
  "alert-error",
79703
79750
  "alert-critical-resolved"
79704
79751
  ];
79752
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
79705
79753
  var UPDATES = [
79706
79754
  "addon-update-available",
79707
79755
  "server-update-available",
@@ -79731,9 +79779,12 @@ var DEVICE_EVENTS = [
79731
79779
  "stream-online",
79732
79780
  "stream-offline",
79733
79781
  "detection-blind",
79782
+ "motion-noisy",
79783
+ "motion-calm",
79734
79784
  "recording-stalled",
79735
79785
  "recording-healthy",
79736
79786
  "recording-degraded",
79787
+ ...DEVICE_ATTENTION,
79737
79788
  ...ALARM
79738
79789
  ];
79739
79790
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79901,7 +79952,13 @@ var STATE_SUMMARY_VARS = [
79901
79952
  [...RULE_TEXT],
79902
79953
  [...RULE_TEXT],
79903
79954
  [...RULE_TEXT],
79904
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79955
+ [...RULE_TEXT],
79956
+ [...RULE_TEXT],
79957
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79958
+ [...RULE_TEXT],
79959
+ [...RULE_TEXT],
79960
+ [...RULE_TEXT],
79961
+ [...RULE_TEXT],
79905
79962
  [...RULE_TEXT],
79906
79963
  [...RULE_TEXT],
79907
79964
  [...RULE_TEXT],
@@ -79919,11 +79976,11 @@ var STATE_SUMMARY_VARS = [
79919
79976
  [...RULE_TEXT],
79920
79977
  [...RULE_TEXT],
79921
79978
  [...RULE_TEXT],
79979
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79922
79980
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79981
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79923
79982
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79924
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79925
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79926
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79983
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79927
79984
  [...RULE_TEXT],
79928
79985
  [...RULE_TEXT],
79929
79986
  [...RULE_TEXT],
@@ -79944,6 +80001,125 @@ var STATE_SUMMARY_VARS = [
79944
80001
  [...RULE_TEXT],
79945
80002
  ...STATE_SUMMARY_VARS
79946
80003
  ];
80004
+ new Map([
80005
+ {
80006
+ id: "device-connectivity",
80007
+ family: "device-events",
80008
+ label: "Device connectivity (offline / back online)",
80009
+ bad: ["device-offline"],
80010
+ recovery: ["device-online"],
80011
+ snapshotLabel: "Devices offline now",
80012
+ snapshotSection: "device-state"
80013
+ },
80014
+ {
80015
+ id: "device-switch",
80016
+ family: "device-events",
80017
+ label: "Device switched off / back on",
80018
+ bad: ["device-disabled"],
80019
+ recovery: ["device-enabled"],
80020
+ snapshotLabel: "Devices switched off now",
80021
+ snapshotSection: "device-state"
80022
+ },
80023
+ {
80024
+ id: "stream-connectivity",
80025
+ family: "device-events",
80026
+ label: "Stream connectivity (offline / back online)",
80027
+ bad: ["stream-offline"],
80028
+ recovery: ["stream-online"],
80029
+ snapshotLabel: "Streams offline now",
80030
+ snapshotSection: "streams"
80031
+ },
80032
+ {
80033
+ id: "battery",
80034
+ family: "device-events",
80035
+ label: "Battery (low / back to normal)",
80036
+ bad: ["device-battery-low"],
80037
+ recovery: ["device-battery-normal"],
80038
+ snapshotLabel: "Batteries low now",
80039
+ snapshotSection: "battery"
80040
+ },
80041
+ {
80042
+ id: "consumables",
80043
+ family: "device-events",
80044
+ label: "Consumables (low / replaced)",
80045
+ bad: ["device-consumable-low"],
80046
+ recovery: ["device-consumable-normal"],
80047
+ snapshotLabel: "Consumables low now",
80048
+ snapshotSection: "consumables"
80049
+ },
80050
+ {
80051
+ id: "tanks",
80052
+ family: "device-events",
80053
+ label: "Tanks (low or full / back to normal)",
80054
+ bad: ["device-tank-low", "device-tank-full"],
80055
+ recovery: ["device-tank-normal"],
80056
+ snapshotLabel: "Tanks low or full now",
80057
+ snapshotSection: "tanks"
80058
+ },
80059
+ {
80060
+ id: "motion-noise",
80061
+ family: "device-events",
80062
+ label: "Motion without a subject (constant / calm again)",
80063
+ bad: ["motion-noisy"],
80064
+ recovery: ["motion-calm"],
80065
+ snapshotLabel: "Cameras with constant motion now",
80066
+ snapshotSection: null
80067
+ },
80068
+ {
80069
+ id: "recording-health",
80070
+ family: "device-events",
80071
+ label: "Recording health (stalled or degraded / recording again)",
80072
+ bad: ["recording-stalled", "recording-degraded"],
80073
+ recovery: ["recording-healthy"],
80074
+ snapshotLabel: "Recordings stalled now",
80075
+ snapshotSection: null
80076
+ },
80077
+ {
80078
+ id: "device-attention",
80079
+ family: "device-events",
80080
+ label: "Device needs attention (raised / resolved)",
80081
+ bad: ["device-attention-required"],
80082
+ recovery: ["device-attention-resolved"],
80083
+ snapshotLabel: "Devices needing attention now",
80084
+ snapshotSection: null
80085
+ },
80086
+ {
80087
+ id: "node-connectivity",
80088
+ family: "system",
80089
+ label: "Node connectivity (offline / back online)",
80090
+ bad: ["node-offline"],
80091
+ recovery: ["node-online"],
80092
+ snapshotLabel: "Nodes offline now",
80093
+ snapshotSection: "nodes"
80094
+ },
80095
+ {
80096
+ id: "storage-space",
80097
+ family: "system",
80098
+ label: "Storage space (low or critical / ok again)",
80099
+ bad: ["storage-location-low", "storage-location-critical"],
80100
+ recovery: ["storage-location-ok"],
80101
+ snapshotLabel: "Storage locations low now",
80102
+ snapshotSection: null
80103
+ },
80104
+ {
80105
+ id: "critical-alerts",
80106
+ family: "system",
80107
+ label: "Critical alerts (raised / resolved)",
80108
+ bad: ["alert-critical"],
80109
+ recovery: ["alert-critical-resolved"],
80110
+ snapshotLabel: "Critical alerts open now",
80111
+ snapshotSection: null
80112
+ },
80113
+ {
80114
+ id: "rule-health",
80115
+ family: "system",
80116
+ label: "Rule health (broken / repaired)",
80117
+ bad: ["rule-broken"],
80118
+ recovery: ["rule-repaired"],
80119
+ snapshotLabel: "Notification rules broken now",
80120
+ snapshotSection: null
80121
+ }
80122
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
79947
80123
  new Set([
79948
80124
  "disarmed",
79949
80125
  "armed_home",
@@ -80543,7 +80719,7 @@ function buildConnectionFormSchema() {
80543
80719
  id: "credentials",
80544
80720
  title: "Tuya IoT cloud project",
80545
80721
  titleKey: "provider-tuya:connection.s_credentials.title",
80546
- description: "Create a free project at iot.tuya.com, link your Smart Life / Tuya app account to it, and paste the project's Access ID and Access Secret. CamStack uses them to fetch each device's local key, then controls the devices directly over your LAN (no ongoing cloud).",
80722
+ description: "Create a project at iot.tuya.com, link your Smart Life / Tuya account to it, and paste its Access ID and Access Secret.",
80547
80723
  descriptionKey: "provider-tuya:connection.s_credentials.description",
80548
80724
  columns: 1,
80549
80725
  fields: [{
package/i18n/en.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "connection.s_credentials.title": "Tuya IoT cloud project",
3
- "connection.s_credentials.description": "Create a free project at iot.tuya.com, link your Smart Life / Tuya app account to it, and paste the project's Access ID and Access Secret. CamStack uses them to fetch each device's local key, then controls the devices directly over your LAN (no ongoing cloud).",
3
+ "connection.s_credentials.description": "Create a project at iot.tuya.com, link your Smart Life / Tuya account to it, and paste its Access ID and Access Secret.",
4
4
  "connection.s_credentials.accessId.label": "Access ID / Client ID",
5
5
  "connection.s_credentials.accessSecret.label": "Access Secret / Client Secret",
6
6
  "connection.s_region.title": "Region",
package/i18n/it.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "connection.s_credentials.title": "Progetto cloud Tuya IoT",
3
- "connection.s_credentials.description": "Crea un progetto gratuito su iot.tuya.com, collega a esso l'account dell'app Smart Life / Tuya e incolla Access ID e Access Secret del progetto. CamStack li usa per recuperare la chiave locale di ogni dispositivo, poi controlla i dispositivi direttamente sulla LAN (nessun cloud in uso).",
3
+ "connection.s_credentials.description": "Crea un progetto su iot.tuya.com, collega il tuo account Smart Life / Tuya e incolla Access ID e Access Secret.",
4
4
  "connection.s_credentials.accessId.label": "Access ID / Client ID",
5
5
  "connection.s_credentials.accessSecret.label": "Access Secret / Client Secret",
6
6
  "connection.s_region.title": "Regione",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.139",
3
+ "version": "0.2.141",
4
4
  "description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
5
5
  "keywords": [
6
6
  "camstack",