@camstack/addon-provider-tuya 0.2.81 → 0.2.83

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
@@ -12871,6 +12871,9 @@ var QueryFilterSchema = object({
12871
12871
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12872
12872
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12873
12873
  whereNot: record(string(), unknown()).optional(),
12874
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12875
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12876
+ whereNotIn: record(string(), array(unknown())).optional(),
12874
12877
  orderBy: object({
12875
12878
  field: string(),
12876
12879
  direction: _enum(["asc", "desc"])
@@ -12891,7 +12894,8 @@ var MutationFilterSchema = object({
12891
12894
  where: record(string(), unknown()).optional(),
12892
12895
  whereIn: record(string(), array(unknown())).optional(),
12893
12896
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12894
- whereNot: record(string(), unknown()).optional()
12897
+ whereNot: record(string(), unknown()).optional(),
12898
+ whereNotIn: record(string(), array(unknown())).optional()
12895
12899
  });
12896
12900
  /**
12897
12901
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -19664,10 +19668,12 @@ var TrackSourceSchema = _enum([
19664
19668
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
19665
19669
  * a deliberate action of the retrain page, not a side effect of a checkbox.
19666
19670
  *
19667
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
19668
- * the store's filter language has only positive equality and `whereIn` — no
19669
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
19670
- * would make the entire pre-column history immortal in one deploy.
19671
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
19672
+ * every row is selectable by a positive predicate. (The filter language has
19673
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
19674
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
19675
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
19676
+ * column was designed, and a NOT NULL column is still the better shape.)
19671
19677
  */
19672
19678
  var RetrainStatusSchema = _enum([
19673
19679
  "none",
@@ -20403,7 +20409,9 @@ var RecentTracksQueryInput = object({
20403
20409
  * whose class list is unreadable are kept, and the client's rule stays the
20404
20410
  * exact one.
20405
20411
  */
20406
- classes: array(string()).optional()
20412
+ classes: array(string()).optional(),
20413
+ /** See {@link ExcludeSourcesDoc}. */
20414
+ excludeSources: array(TrackSourceSchema).optional()
20407
20415
  });
20408
20416
  /**
20409
20417
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -20831,7 +20839,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20831
20839
  * selected is an operator who has not narrowed anything, and an empty
20832
20840
  * timeline would read as a camera that saw nothing.
20833
20841
  */
20834
- classes: array(string()).optional()
20842
+ classes: array(string()).optional(),
20843
+ /** See {@link ExcludeSourcesDoc}. */
20844
+ excludeSources: array(TrackSourceSchema).optional()
20835
20845
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20836
20846
  kind: "mutation",
20837
20847
  auth: "admin"
@@ -30029,8 +30039,27 @@ var PrivacyMaskRegionSchema = object({
30029
30039
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
30030
30040
  var PrivacyMaskStatusSchema = object({
30031
30041
  enabled: boolean(),
30032
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
30033
- regions: array(PrivacyMaskRegionSchema),
30042
+ /**
30043
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
30044
+ *
30045
+ * `null` means "no answer" — the provider has never reached this camera
30046
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
30047
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
30048
+ * has no zones": those two look identical to an operator right up to the
30049
+ * moment one of them is acted on, and acting on them differs completely.
30050
+ * The switch group turned an unanswered read into *"nothing is set up for
30051
+ * it to act on"* — an instruction to go and draw a zone that already
30052
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
30053
+ * from deleting the mask it could not read.
30054
+ *
30055
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
30056
+ * has no zones. The distinction is the same one {@link
30057
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
30058
+ * microphone, on the very same payload — both planes come from ONE refresh,
30059
+ * so it was never coherent for one of them to be able to say "unknown"
30060
+ * while the other could not.
30061
+ */
30062
+ regions: array(PrivacyMaskRegionSchema).nullable(),
30034
30063
  /**
30035
30064
  * Is the camera capturing sound right now? Read from the camera, never from
30036
30065
  * a server-side mirror.
package/dist/addon.mjs CHANGED
@@ -12870,6 +12870,9 @@ var QueryFilterSchema = object({
12870
12870
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12871
12871
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12872
12872
  whereNot: record(string(), unknown()).optional(),
12873
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12874
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12875
+ whereNotIn: record(string(), array(unknown())).optional(),
12873
12876
  orderBy: object({
12874
12877
  field: string(),
12875
12878
  direction: _enum(["asc", "desc"])
@@ -12890,7 +12893,8 @@ var MutationFilterSchema = object({
12890
12893
  where: record(string(), unknown()).optional(),
12891
12894
  whereIn: record(string(), array(unknown())).optional(),
12892
12895
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12893
- whereNot: record(string(), unknown()).optional()
12896
+ whereNot: record(string(), unknown()).optional(),
12897
+ whereNotIn: record(string(), array(unknown())).optional()
12894
12898
  });
12895
12899
  /**
12896
12900
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -19663,10 +19667,12 @@ var TrackSourceSchema = _enum([
19663
19667
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
19664
19668
  * a deliberate action of the retrain page, not a side effect of a checkbox.
19665
19669
  *
19666
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
19667
- * the store's filter language has only positive equality and `whereIn` — no
19668
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
19669
- * would make the entire pre-column history immortal in one deploy.
19670
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
19671
+ * every row is selectable by a positive predicate. (The filter language has
19672
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
19673
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
19674
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
19675
+ * column was designed, and a NOT NULL column is still the better shape.)
19670
19676
  */
19671
19677
  var RetrainStatusSchema = _enum([
19672
19678
  "none",
@@ -20402,7 +20408,9 @@ var RecentTracksQueryInput = object({
20402
20408
  * whose class list is unreadable are kept, and the client's rule stays the
20403
20409
  * exact one.
20404
20410
  */
20405
- classes: array(string()).optional()
20411
+ classes: array(string()).optional(),
20412
+ /** See {@link ExcludeSourcesDoc}. */
20413
+ excludeSources: array(TrackSourceSchema).optional()
20406
20414
  });
20407
20415
  /**
20408
20416
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -20830,7 +20838,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20830
20838
  * selected is an operator who has not narrowed anything, and an empty
20831
20839
  * timeline would read as a camera that saw nothing.
20832
20840
  */
20833
- classes: array(string()).optional()
20841
+ classes: array(string()).optional(),
20842
+ /** See {@link ExcludeSourcesDoc}. */
20843
+ excludeSources: array(TrackSourceSchema).optional()
20834
20844
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20835
20845
  kind: "mutation",
20836
20846
  auth: "admin"
@@ -30028,8 +30038,27 @@ var PrivacyMaskRegionSchema = object({
30028
30038
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
30029
30039
  var PrivacyMaskStatusSchema = object({
30030
30040
  enabled: boolean(),
30031
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
30032
- regions: array(PrivacyMaskRegionSchema),
30041
+ /**
30042
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
30043
+ *
30044
+ * `null` means "no answer" — the provider has never reached this camera
30045
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
30046
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
30047
+ * has no zones": those two look identical to an operator right up to the
30048
+ * moment one of them is acted on, and acting on them differs completely.
30049
+ * The switch group turned an unanswered read into *"nothing is set up for
30050
+ * it to act on"* — an instruction to go and draw a zone that already
30051
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
30052
+ * from deleting the mask it could not read.
30053
+ *
30054
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
30055
+ * has no zones. The distinction is the same one {@link
30056
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
30057
+ * microphone, on the very same payload — both planes come from ONE refresh,
30058
+ * so it was never coherent for one of them to be able to say "unknown"
30059
+ * while the other could not.
30060
+ */
30061
+ regions: array(PrivacyMaskRegionSchema).nullable(),
30033
30062
  /**
30034
30063
  * Is the camera capturing sound right now? Read from the camera, never from
30035
30064
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.81",
3
+ "version": "0.2.83",
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",