@camstack/addon-provider-unifi 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
@@ -12051,6 +12051,9 @@ var QueryFilterSchema = object({
12051
12051
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12052
12052
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12053
12053
  whereNot: record(string(), unknown()).optional(),
12054
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12055
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12056
+ whereNotIn: record(string(), array(unknown())).optional(),
12054
12057
  orderBy: object({
12055
12058
  field: string(),
12056
12059
  direction: _enum(["asc", "desc"])
@@ -12071,7 +12074,8 @@ var MutationFilterSchema = object({
12071
12074
  where: record(string(), unknown()).optional(),
12072
12075
  whereIn: record(string(), array(unknown())).optional(),
12073
12076
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12074
- whereNot: record(string(), unknown()).optional()
12077
+ whereNot: record(string(), unknown()).optional(),
12078
+ whereNotIn: record(string(), array(unknown())).optional()
12075
12079
  });
12076
12080
  /**
12077
12081
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -18827,10 +18831,12 @@ var TrackSourceSchema = _enum([
18827
18831
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
18828
18832
  * a deliberate action of the retrain page, not a side effect of a checkbox.
18829
18833
  *
18830
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
18831
- * the store's filter language has only positive equality and `whereIn` — no
18832
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
18833
- * would make the entire pre-column history immortal in one deploy.
18834
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
18835
+ * every row is selectable by a positive predicate. (The filter language has
18836
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
18837
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
18838
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
18839
+ * column was designed, and a NOT NULL column is still the better shape.)
18834
18840
  */
18835
18841
  var RetrainStatusSchema = _enum([
18836
18842
  "none",
@@ -19566,7 +19572,9 @@ var RecentTracksQueryInput = object({
19566
19572
  * whose class list is unreadable are kept, and the client's rule stays the
19567
19573
  * exact one.
19568
19574
  */
19569
- classes: array(string()).optional()
19575
+ classes: array(string()).optional(),
19576
+ /** See {@link ExcludeSourcesDoc}. */
19577
+ excludeSources: array(TrackSourceSchema).optional()
19570
19578
  });
19571
19579
  /**
19572
19580
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -19994,7 +20002,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19994
20002
  * selected is an operator who has not narrowed anything, and an empty
19995
20003
  * timeline would read as a camera that saw nothing.
19996
20004
  */
19997
- classes: array(string()).optional()
20005
+ classes: array(string()).optional(),
20006
+ /** See {@link ExcludeSourcesDoc}. */
20007
+ excludeSources: array(TrackSourceSchema).optional()
19998
20008
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19999
20009
  kind: "mutation",
20000
20010
  auth: "admin"
@@ -29201,8 +29211,27 @@ var PrivacyMaskRegionSchema = object({
29201
29211
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
29202
29212
  var PrivacyMaskStatusSchema = object({
29203
29213
  enabled: boolean(),
29204
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
29205
- regions: array(PrivacyMaskRegionSchema),
29214
+ /**
29215
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
29216
+ *
29217
+ * `null` means "no answer" — the provider has never reached this camera
29218
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
29219
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
29220
+ * has no zones": those two look identical to an operator right up to the
29221
+ * moment one of them is acted on, and acting on them differs completely.
29222
+ * The switch group turned an unanswered read into *"nothing is set up for
29223
+ * it to act on"* — an instruction to go and draw a zone that already
29224
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
29225
+ * from deleting the mask it could not read.
29226
+ *
29227
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
29228
+ * has no zones. The distinction is the same one {@link
29229
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
29230
+ * microphone, on the very same payload — both planes come from ONE refresh,
29231
+ * so it was never coherent for one of them to be able to say "unknown"
29232
+ * while the other could not.
29233
+ */
29234
+ regions: array(PrivacyMaskRegionSchema).nullable(),
29206
29235
  /**
29207
29236
  * Is the camera capturing sound right now? Read from the camera, never from
29208
29237
  * a server-side mirror.
package/dist/addon.mjs CHANGED
@@ -12050,6 +12050,9 @@ var QueryFilterSchema = object({
12050
12050
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12051
12051
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12052
12052
  whereNot: record(string(), unknown()).optional(),
12053
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12054
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12055
+ whereNotIn: record(string(), array(unknown())).optional(),
12053
12056
  orderBy: object({
12054
12057
  field: string(),
12055
12058
  direction: _enum(["asc", "desc"])
@@ -12070,7 +12073,8 @@ var MutationFilterSchema = object({
12070
12073
  where: record(string(), unknown()).optional(),
12071
12074
  whereIn: record(string(), array(unknown())).optional(),
12072
12075
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12073
- whereNot: record(string(), unknown()).optional()
12076
+ whereNot: record(string(), unknown()).optional(),
12077
+ whereNotIn: record(string(), array(unknown())).optional()
12074
12078
  });
12075
12079
  /**
12076
12080
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -18826,10 +18830,12 @@ var TrackSourceSchema = _enum([
18826
18830
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
18827
18831
  * a deliberate action of the retrain page, not a side effect of a checkbox.
18828
18832
  *
18829
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
18830
- * the store's filter language has only positive equality and `whereIn` — no
18831
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
18832
- * would make the entire pre-column history immortal in one deploy.
18833
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
18834
+ * every row is selectable by a positive predicate. (The filter language has
18835
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
18836
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
18837
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
18838
+ * column was designed, and a NOT NULL column is still the better shape.)
18833
18839
  */
18834
18840
  var RetrainStatusSchema = _enum([
18835
18841
  "none",
@@ -19565,7 +19571,9 @@ var RecentTracksQueryInput = object({
19565
19571
  * whose class list is unreadable are kept, and the client's rule stays the
19566
19572
  * exact one.
19567
19573
  */
19568
- classes: array(string()).optional()
19574
+ classes: array(string()).optional(),
19575
+ /** See {@link ExcludeSourcesDoc}. */
19576
+ excludeSources: array(TrackSourceSchema).optional()
19569
19577
  });
19570
19578
  /**
19571
19579
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -19993,7 +20001,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19993
20001
  * selected is an operator who has not narrowed anything, and an empty
19994
20002
  * timeline would read as a camera that saw nothing.
19995
20003
  */
19996
- classes: array(string()).optional()
20004
+ classes: array(string()).optional(),
20005
+ /** See {@link ExcludeSourcesDoc}. */
20006
+ excludeSources: array(TrackSourceSchema).optional()
19997
20007
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19998
20008
  kind: "mutation",
19999
20009
  auth: "admin"
@@ -29200,8 +29210,27 @@ var PrivacyMaskRegionSchema = object({
29200
29210
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
29201
29211
  var PrivacyMaskStatusSchema = object({
29202
29212
  enabled: boolean(),
29203
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
29204
- regions: array(PrivacyMaskRegionSchema),
29213
+ /**
29214
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
29215
+ *
29216
+ * `null` means "no answer" — the provider has never reached this camera
29217
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
29218
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
29219
+ * has no zones": those two look identical to an operator right up to the
29220
+ * moment one of them is acted on, and acting on them differs completely.
29221
+ * The switch group turned an unanswered read into *"nothing is set up for
29222
+ * it to act on"* — an instruction to go and draw a zone that already
29223
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
29224
+ * from deleting the mask it could not read.
29225
+ *
29226
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
29227
+ * has no zones. The distinction is the same one {@link
29228
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
29229
+ * microphone, on the very same payload — both planes come from ONE refresh,
29230
+ * so it was never coherent for one of them to be able to say "unknown"
29231
+ * while the other could not.
29232
+ */
29233
+ regions: array(PrivacyMaskRegionSchema).nullable(),
29205
29234
  /**
29206
29235
  * Is the camera capturing sound right now? Read from the camera, never from
29207
29236
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-unifi",
3
- "version": "0.2.81",
3
+ "version": "0.2.83",
4
4
  "description": "UniFi Network controller device-provider addon for CamStack — local-controller infra switches/APs (as containers) + network-client presence. NO cameras/Protect.",
5
5
  "keywords": [
6
6
  "camstack",