@camstack/addon-export-hap 1.2.92 → 1.2.94

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.
@@ -12669,6 +12669,9 @@ var QueryFilterSchema = object({
12669
12669
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12670
12670
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12671
12671
  whereNot: record(string(), unknown()).optional(),
12672
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12673
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12674
+ whereNotIn: record(string(), array(unknown())).optional(),
12672
12675
  orderBy: object({
12673
12676
  field: string(),
12674
12677
  direction: _enum(["asc", "desc"])
@@ -12689,7 +12692,8 @@ var MutationFilterSchema = object({
12689
12692
  where: record(string(), unknown()).optional(),
12690
12693
  whereIn: record(string(), array(unknown())).optional(),
12691
12694
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12692
- whereNot: record(string(), unknown()).optional()
12695
+ whereNot: record(string(), unknown()).optional(),
12696
+ whereNotIn: record(string(), array(unknown())).optional()
12693
12697
  });
12694
12698
  /**
12695
12699
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -19260,10 +19264,12 @@ var TrackSourceSchema = _enum([
19260
19264
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
19261
19265
  * a deliberate action of the retrain page, not a side effect of a checkbox.
19262
19266
  *
19263
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
19264
- * the store's filter language has only positive equality and `whereIn` — no
19265
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
19266
- * would make the entire pre-column history immortal in one deploy.
19267
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
19268
+ * every row is selectable by a positive predicate. (The filter language has
19269
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
19270
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
19271
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
19272
+ * column was designed, and a NOT NULL column is still the better shape.)
19267
19273
  */
19268
19274
  var RetrainStatusSchema = _enum([
19269
19275
  "none",
@@ -19999,7 +20005,9 @@ var RecentTracksQueryInput = object({
19999
20005
  * whose class list is unreadable are kept, and the client's rule stays the
20000
20006
  * exact one.
20001
20007
  */
20002
- classes: array(string()).optional()
20008
+ classes: array(string()).optional(),
20009
+ /** See {@link ExcludeSourcesDoc}. */
20010
+ excludeSources: array(TrackSourceSchema).optional()
20003
20011
  });
20004
20012
  /**
20005
20013
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -20427,7 +20435,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20427
20435
  * selected is an operator who has not narrowed anything, and an empty
20428
20436
  * timeline would read as a camera that saw nothing.
20429
20437
  */
20430
- classes: array(string()).optional()
20438
+ classes: array(string()).optional(),
20439
+ /** See {@link ExcludeSourcesDoc}. */
20440
+ excludeSources: array(TrackSourceSchema).optional()
20431
20441
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20432
20442
  kind: "mutation",
20433
20443
  auth: "admin"
@@ -27936,8 +27946,27 @@ var PrivacyMaskRegionSchema = object({
27936
27946
  });
27937
27947
  object({
27938
27948
  enabled: boolean(),
27939
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27940
- regions: array(PrivacyMaskRegionSchema),
27949
+ /**
27950
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27951
+ *
27952
+ * `null` means "no answer" — the provider has never reached this camera
27953
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27954
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27955
+ * has no zones": those two look identical to an operator right up to the
27956
+ * moment one of them is acted on, and acting on them differs completely.
27957
+ * The switch group turned an unanswered read into *"nothing is set up for
27958
+ * it to act on"* — an instruction to go and draw a zone that already
27959
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27960
+ * from deleting the mask it could not read.
27961
+ *
27962
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27963
+ * has no zones. The distinction is the same one {@link
27964
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27965
+ * microphone, on the very same payload — both planes come from ONE refresh,
27966
+ * so it was never coherent for one of them to be able to say "unknown"
27967
+ * while the other could not.
27968
+ */
27969
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27941
27970
  /**
27942
27971
  * Is the camera capturing sound right now? Read from the camera, never from
27943
27972
  * a server-side mirror.
@@ -12657,6 +12657,9 @@ var QueryFilterSchema = object({
12657
12657
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12658
12658
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
12659
12659
  whereNot: record(string(), unknown()).optional(),
12660
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
12661
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
12662
+ whereNotIn: record(string(), array(unknown())).optional(),
12660
12663
  orderBy: object({
12661
12664
  field: string(),
12662
12665
  direction: _enum(["asc", "desc"])
@@ -12677,7 +12680,8 @@ var MutationFilterSchema = object({
12677
12680
  where: record(string(), unknown()).optional(),
12678
12681
  whereIn: record(string(), array(unknown())).optional(),
12679
12682
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
12680
- whereNot: record(string(), unknown()).optional()
12683
+ whereNot: record(string(), unknown()).optional(),
12684
+ whereNotIn: record(string(), array(unknown())).optional()
12681
12685
  });
12682
12686
  /**
12683
12687
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -19248,10 +19252,12 @@ var TrackSourceSchema = _enum([
19248
19252
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
19249
19253
  * a deliberate action of the retrain page, not a side effect of a checkbox.
19250
19254
  *
19251
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
19252
- * the store's filter language has only positive equality and `whereIn` — no
19253
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
19254
- * would make the entire pre-column history immortal in one deploy.
19255
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
19256
+ * every row is selectable by a positive predicate. (The filter language has
19257
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
19258
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
19259
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
19260
+ * column was designed, and a NOT NULL column is still the better shape.)
19255
19261
  */
19256
19262
  var RetrainStatusSchema = _enum([
19257
19263
  "none",
@@ -19987,7 +19993,9 @@ var RecentTracksQueryInput = object({
19987
19993
  * whose class list is unreadable are kept, and the client's rule stays the
19988
19994
  * exact one.
19989
19995
  */
19990
- classes: array(string()).optional()
19996
+ classes: array(string()).optional(),
19997
+ /** See {@link ExcludeSourcesDoc}. */
19998
+ excludeSources: array(TrackSourceSchema).optional()
19991
19999
  });
19992
20000
  /**
19993
20001
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -20415,7 +20423,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20415
20423
  * selected is an operator who has not narrowed anything, and an empty
20416
20424
  * timeline would read as a camera that saw nothing.
20417
20425
  */
20418
- classes: array(string()).optional()
20426
+ classes: array(string()).optional(),
20427
+ /** See {@link ExcludeSourcesDoc}. */
20428
+ excludeSources: array(TrackSourceSchema).optional()
20419
20429
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20420
20430
  kind: "mutation",
20421
20431
  auth: "admin"
@@ -27924,8 +27934,27 @@ var PrivacyMaskRegionSchema = object({
27924
27934
  });
27925
27935
  object({
27926
27936
  enabled: boolean(),
27927
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27928
- regions: array(PrivacyMaskRegionSchema),
27937
+ /**
27938
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27939
+ *
27940
+ * `null` means "no answer" — the provider has never reached this camera
27941
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27942
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27943
+ * has no zones": those two look identical to an operator right up to the
27944
+ * moment one of them is acted on, and acting on them differs completely.
27945
+ * The switch group turned an unanswered read into *"nothing is set up for
27946
+ * it to act on"* — an instruction to go and draw a zone that already
27947
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27948
+ * from deleting the mask it could not read.
27949
+ *
27950
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27951
+ * has no zones. The distinction is the same one {@link
27952
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27953
+ * microphone, on the very same payload — both planes come from ONE refresh,
27954
+ * so it was never coherent for one of them to be able to say "unknown"
27955
+ * while the other could not.
27956
+ */
27957
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27929
27958
  /**
27930
27959
  * Is the camera capturing sound right now? Read from the camera, never from
27931
27960
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.2.92",
3
+ "version": "1.2.94",
4
4
  "description": "HomeKit (HAP) exporter for CamStack devices. Publishes each exposed device as its own HomeKit accessory: cameras and doorbells with SRTP streaming, HomeKit Secure Video, motion, two-way audio, PTZ and battery; switches, lights, locks and sensors through a capability→service table.",
5
5
  "keywords": [
6
6
  "camstack",