@camstack/addon-notifiers 1.2.113 → 1.2.115

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
@@ -5390,7 +5390,7 @@ var ZodIssueCode = {
5390
5390
  var ZodFirstPartyTypeKind;
5391
5391
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5392
5392
  //#endregion
5393
- //#region ../types/dist/sleep-BDR76Ykr.mjs
5393
+ //#region ../types/dist/sleep-B1y0Fo1U.mjs
5394
5394
  /**
5395
5395
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5396
5396
  * window to float samples (D455).
@@ -28888,14 +28888,81 @@ DeviceType.Camera, method(object({ deviceId: number() }), PrivacyMaskOptionsSche
28888
28888
  kind: "mutation",
28889
28889
  auth: "admin"
28890
28890
  });
28891
+ /**
28892
+ * What a preset id DOES on this camera.
28893
+ *
28894
+ * On several PTZ firmwares the preset namespace is shared: low ids are stored
28895
+ * positions, a reserved band triggers camera FUNCTIONS. The dispensa camera
28896
+ * (Hikvision) returns its own reserved band in the preset list, named by the
28897
+ * firmware:
28898
+ *
28899
+ * 34 Back to origin · 39 Day mode · 40 Night mode · 46 Day/Night Auto Mode
28900
+ * 92 Set manual limits · 93 Save manual limits · 94 Remote reboot
28901
+ * 95 Call OSD menu
28902
+ *
28903
+ * We used to hand all of these to the UI as ordinary presets. Saving over one
28904
+ * is what produced `PUT /ISAPI/PTZCtrl/channels/1/presets/34 -> HTTP 500`: the
28905
+ * camera refusing to let "Back to origin" be overwritten, surfaced to the
28906
+ * operator as a transport failure.
28907
+ *
28908
+ * A function preset stays fully usable as a DESTINATION -- `goToPreset('34')`
28909
+ * is the single most useful thing that camera can do. Only `savePreset` and
28910
+ * `deletePreset` are gated.
28911
+ */
28912
+ var PtzPresetFunctionSchema = _enum([
28913
+ "home",
28914
+ "day-mode",
28915
+ "night-mode",
28916
+ "day-night-auto",
28917
+ "set-limits",
28918
+ "save-limits",
28919
+ "reboot",
28920
+ "osd-menu"
28921
+ ]);
28891
28922
  var PtzPresetSchema = object({
28892
28923
  id: string(),
28893
- name: string()
28924
+ name: string(),
28925
+ /**
28926
+ * The firmware function this id performs, when the provider KNOWS the id is
28927
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
28928
+ * provider does not recognise -- the two are told apart by `writable`.
28929
+ */
28930
+ fn: PtzPresetFunctionSchema.nullable(),
28931
+ /**
28932
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
28933
+ * it false only for a band it KNOWS is reserved; where the firmware is not
28934
+ * documented it stays true and a refusal comes from the camera, named.
28935
+ */
28936
+ writable: boolean()
28894
28937
  });
28938
+ /**
28939
+ * Where the head is pointing -- per axis, and `null` when the driver cannot
28940
+ * read it.
28941
+ *
28942
+ * It used to be three REQUIRED numbers, which left a provider that cannot read
28943
+ * position no way to say so. All four said `0`:
28944
+ *
28945
+ * reolink `return { pan: 0, tilt: 0, zoom: 0 }` "until a position-query
28946
+ * path lands upstream"
28947
+ * hikvision stub, "firmware-dependent and frequently absent"
28948
+ * amcrest stub, "no generic absolute-position read for this model family"
28949
+ * onvif throws
28950
+ *
28951
+ * So every consumer asking where a camera points was told "perfectly centred"
28952
+ * by four cameras that had never looked. That is D393 -- a measurement that
28953
+ * FAILED is `null`, never `0`, and the type says so all the way to the
28954
+ * decision -- the same shape as the unreadable `statfs` folded into "0 bytes of
28955
+ * headroom", which evacuated a healthy disk.
28956
+ *
28957
+ * D393 also says to check for a narrower structural TWIN of the result type.
28958
+ * There is one: `PtzStatusSchema` extends this, so the lie had already
28959
+ * propagated into `getStatus`, which is the surface `getPosition`'s own comment
28960
+ * tells callers to migrate to.
28961
+ */
28895
28962
  var PtzPositionSchema = object({
28896
- pan: number(),
28897
- tilt: number(),
28898
- zoom: number()
28963
+ pan: number().nullable(),
28964
+ tilt: number().nullable(),
28965
+ zoom: number().nullable()
28899
28966
  });
28900
28967
  var PtzMoveCommandSchema = object({
28901
28968
  pan: number().optional(),
@@ -28914,7 +28981,72 @@ var PtzOptionsSchema = object({
28914
28981
  maxPresets: number().optional(),
28915
28982
  /** Whether the camera exposes a controllable autofocus toggle
28916
28983
  * (boolean `hasX` per the getOptions availability convention). */
28917
- hasAutofocus: boolean()
28984
+ hasAutofocus: boolean(),
28985
+ /**
28986
+ * How many distinct speeds this camera's NATIVE scale offers.
28987
+ *
28988
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
28989
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
28990
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
28991
+ * meaningless, because it has eight steps and three of them round to the
28992
+ * same one. A loop that tunes its own gain has to know the granularity of
28993
+ * the knob it is turning.
28994
+ *
28995
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
28996
+ * a float). Never a made-up number.
28997
+ */
28998
+ speedSteps: number().int().positive().nullable(),
28999
+ /**
29000
+ * How long ONE `move` pulse runs on this driver, ms.
29001
+ *
29002
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
29003
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
29004
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
29005
+ * did the head travel per pulse": without it a measured displacement has no
29006
+ * gain to be divided into.
29007
+ *
29008
+ * `null` = the driver cannot say.
29009
+ */
29010
+ moveImpulseMs: number().int().positive().nullable()
29011
+ });
29012
+ /**
29013
+ * Which preset `goHome` goes to, and WHO decided.
29014
+ *
29015
+ * `goHome` used to be three vendor "conventions" written in three comments --
29016
+ * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
29017
+ * not one of the three cameras honours its own:
29018
+ *
29019
+ * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
29020
+ * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
29021
+ * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
29022
+ *
29023
+ * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
29024
+ * and two of the three swallowed the failure in a bare `catch`. For autotrack
29025
+ * this is the HOTTEST path -- it runs every time a subject is released -- so it
29026
+ * needs an answer that is true per camera and audible when it is missing.
29027
+ *
29028
+ * `source` is what makes it honest:
29029
+ * - `operator` -- picked in the UI, stored by the provider.
29030
+ * - `firmware` -- the camera itself named a preset `fn: 'home'` (Hikvision's
29031
+ * "Back to origin"), adopted as the default with nothing to configure.
29032
+ * - `native` -- the driver homes WITHOUT a preset at all. ONVIF does:
29033
+ * `goHome` is `ptzAbsoluteMove({x:0, y:0, zoom:0})`. `presetId` is null and
29034
+ * that is not a failure -- there is nothing to pick, and the UI must offer
29035
+ * no picker.
29036
+ * - `none` -- nothing is configured and the camera names nothing.
29037
+ * `goHome` REFUSES rather than moving the head somewhere arbitrary.
29038
+ *
29039
+ * `source === 'none'` is the refusal condition, NOT `presetId === null`: the
29040
+ * native case has no preset and homes perfectly well.
29041
+ */
29042
+ var PtzHomePresetSchema = object({
29043
+ presetId: string().nullable(),
29044
+ source: _enum([
29045
+ "operator",
29046
+ "firmware",
29047
+ "native",
29048
+ "none"
29049
+ ])
28918
29050
  });
28919
29051
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
28920
29052
  deviceId: number(),
@@ -28932,7 +29064,13 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
28932
29064
  }), _void(), {
28933
29065
  kind: "mutation",
28934
29066
  auth: "admin"
28935
- }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29067
+ }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzHomePresetSchema), method(object({
29068
+ deviceId: number(),
29069
+ presetId: string().nullable()
29070
+ }), _void(), {
29071
+ kind: "mutation",
29072
+ auth: "admin"
29073
+ }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
28936
29074
  deviceId: number(),
28937
29075
  enabled: boolean()
28938
29076
  }), _void(), { kind: "mutation" });
@@ -35947,6 +36085,12 @@ Object.freeze({
35947
36085
  addonId: null,
35948
36086
  access: "delete"
35949
36087
  },
36088
+ "ptz.getHomePreset": {
36089
+ capName: "ptz",
36090
+ capScope: "device",
36091
+ addonId: null,
36092
+ access: "view"
36093
+ },
35950
36094
  "ptz.getOptions": {
35951
36095
  capName: "ptz",
35952
36096
  capScope: "device",
@@ -35995,6 +36139,12 @@ Object.freeze({
35995
36139
  addonId: null,
35996
36140
  access: "create"
35997
36141
  },
36142
+ "ptz.setHomePreset": {
36143
+ capName: "ptz",
36144
+ capScope: "device",
36145
+ addonId: null,
36146
+ access: "create"
36147
+ },
35998
36148
  "ptz.stop": {
35999
36149
  capName: "ptz",
36000
36150
  capScope: "device",
@@ -39168,6 +39318,11 @@ Object.freeze({
39168
39318
  form: "single",
39169
39319
  optional: false
39170
39320
  }],
39321
+ "ptz.getHomePreset": [{
39322
+ name: "deviceId",
39323
+ form: "single",
39324
+ optional: false
39325
+ }],
39171
39326
  "ptz.getOptions": [{
39172
39327
  name: "deviceId",
39173
39328
  form: "single",
@@ -39208,6 +39363,11 @@ Object.freeze({
39208
39363
  form: "single",
39209
39364
  optional: false
39210
39365
  }],
39366
+ "ptz.setHomePreset": [{
39367
+ name: "deviceId",
39368
+ form: "single",
39369
+ optional: false
39370
+ }],
39211
39371
  "ptz.stop": [{
39212
39372
  name: "deviceId",
39213
39373
  form: "single",
package/dist/addon.mjs CHANGED
@@ -5363,7 +5363,7 @@ var ZodIssueCode = {
5363
5363
  var ZodFirstPartyTypeKind;
5364
5364
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5365
5365
  //#endregion
5366
- //#region ../types/dist/sleep-BDR76Ykr.mjs
5366
+ //#region ../types/dist/sleep-B1y0Fo1U.mjs
5367
5367
  /**
5368
5368
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5369
5369
  * window to float samples (D455).
@@ -28861,14 +28861,81 @@ DeviceType.Camera, method(object({ deviceId: number() }), PrivacyMaskOptionsSche
28861
28861
  kind: "mutation",
28862
28862
  auth: "admin"
28863
28863
  });
28864
+ /**
28865
+ * What a preset id DOES on this camera.
28866
+ *
28867
+ * On several PTZ firmwares the preset namespace is shared: low ids are stored
28868
+ * positions, a reserved band triggers camera FUNCTIONS. The dispensa camera
28869
+ * (Hikvision) returns its own reserved band in the preset list, named by the
28870
+ * firmware:
28871
+ *
28872
+ * 34 Back to origin · 39 Day mode · 40 Night mode · 46 Day/Night Auto Mode
28873
+ * 92 Set manual limits · 93 Save manual limits · 94 Remote reboot
28874
+ * 95 Call OSD menu
28875
+ *
28876
+ * We used to hand all of these to the UI as ordinary presets. Saving over one
28877
+ * is what produced `PUT /ISAPI/PTZCtrl/channels/1/presets/34 -> HTTP 500`: the
28878
+ * camera refusing to let "Back to origin" be overwritten, surfaced to the
28879
+ * operator as a transport failure.
28880
+ *
28881
+ * A function preset stays fully usable as a DESTINATION -- `goToPreset('34')`
28882
+ * is the single most useful thing that camera can do. Only `savePreset` and
28883
+ * `deletePreset` are gated.
28884
+ */
28885
+ var PtzPresetFunctionSchema = _enum([
28886
+ "home",
28887
+ "day-mode",
28888
+ "night-mode",
28889
+ "day-night-auto",
28890
+ "set-limits",
28891
+ "save-limits",
28892
+ "reboot",
28893
+ "osd-menu"
28894
+ ]);
28864
28895
  var PtzPresetSchema = object({
28865
28896
  id: string(),
28866
- name: string()
28897
+ name: string(),
28898
+ /**
28899
+ * The firmware function this id performs, when the provider KNOWS the id is
28900
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
28901
+ * provider does not recognise -- the two are told apart by `writable`.
28902
+ */
28903
+ fn: PtzPresetFunctionSchema.nullable(),
28904
+ /**
28905
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
28906
+ * it false only for a band it KNOWS is reserved; where the firmware is not
28907
+ * documented it stays true and a refusal comes from the camera, named.
28908
+ */
28909
+ writable: boolean()
28867
28910
  });
28911
+ /**
28912
+ * Where the head is pointing -- per axis, and `null` when the driver cannot
28913
+ * read it.
28914
+ *
28915
+ * It used to be three REQUIRED numbers, which left a provider that cannot read
28916
+ * position no way to say so. All four said `0`:
28917
+ *
28918
+ * reolink `return { pan: 0, tilt: 0, zoom: 0 }` "until a position-query
28919
+ * path lands upstream"
28920
+ * hikvision stub, "firmware-dependent and frequently absent"
28921
+ * amcrest stub, "no generic absolute-position read for this model family"
28922
+ * onvif throws
28923
+ *
28924
+ * So every consumer asking where a camera points was told "perfectly centred"
28925
+ * by four cameras that had never looked. That is D393 -- a measurement that
28926
+ * FAILED is `null`, never `0`, and the type says so all the way to the
28927
+ * decision -- the same shape as the unreadable `statfs` folded into "0 bytes of
28928
+ * headroom", which evacuated a healthy disk.
28929
+ *
28930
+ * D393 also says to check for a narrower structural TWIN of the result type.
28931
+ * There is one: `PtzStatusSchema` extends this, so the lie had already
28932
+ * propagated into `getStatus`, which is the surface `getPosition`'s own comment
28933
+ * tells callers to migrate to.
28934
+ */
28868
28935
  var PtzPositionSchema = object({
28869
- pan: number(),
28870
- tilt: number(),
28871
- zoom: number()
28936
+ pan: number().nullable(),
28937
+ tilt: number().nullable(),
28938
+ zoom: number().nullable()
28872
28939
  });
28873
28940
  var PtzMoveCommandSchema = object({
28874
28941
  pan: number().optional(),
@@ -28887,7 +28954,72 @@ var PtzOptionsSchema = object({
28887
28954
  maxPresets: number().optional(),
28888
28955
  /** Whether the camera exposes a controllable autofocus toggle
28889
28956
  * (boolean `hasX` per the getOptions availability convention). */
28890
- hasAutofocus: boolean()
28957
+ hasAutofocus: boolean(),
28958
+ /**
28959
+ * How many distinct speeds this camera's NATIVE scale offers.
28960
+ *
28961
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
28962
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
28963
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
28964
+ * meaningless, because it has eight steps and three of them round to the
28965
+ * same one. A loop that tunes its own gain has to know the granularity of
28966
+ * the knob it is turning.
28967
+ *
28968
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
28969
+ * a float). Never a made-up number.
28970
+ */
28971
+ speedSteps: number().int().positive().nullable(),
28972
+ /**
28973
+ * How long ONE `move` pulse runs on this driver, ms.
28974
+ *
28975
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
28976
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
28977
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
28978
+ * did the head travel per pulse": without it a measured displacement has no
28979
+ * gain to be divided into.
28980
+ *
28981
+ * `null` = the driver cannot say.
28982
+ */
28983
+ moveImpulseMs: number().int().positive().nullable()
28984
+ });
28985
+ /**
28986
+ * Which preset `goHome` goes to, and WHO decided.
28987
+ *
28988
+ * `goHome` used to be three vendor "conventions" written in three comments --
28989
+ * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
28990
+ * not one of the three cameras honours its own:
28991
+ *
28992
+ * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
28993
+ * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
28994
+ * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
28995
+ *
28996
+ * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
28997
+ * and two of the three swallowed the failure in a bare `catch`. For autotrack
28998
+ * this is the HOTTEST path -- it runs every time a subject is released -- so it
28999
+ * needs an answer that is true per camera and audible when it is missing.
29000
+ *
29001
+ * `source` is what makes it honest:
29002
+ * - `operator` -- picked in the UI, stored by the provider.
29003
+ * - `firmware` -- the camera itself named a preset `fn: 'home'` (Hikvision's
29004
+ * "Back to origin"), adopted as the default with nothing to configure.
29005
+ * - `native` -- the driver homes WITHOUT a preset at all. ONVIF does:
29006
+ * `goHome` is `ptzAbsoluteMove({x:0, y:0, zoom:0})`. `presetId` is null and
29007
+ * that is not a failure -- there is nothing to pick, and the UI must offer
29008
+ * no picker.
29009
+ * - `none` -- nothing is configured and the camera names nothing.
29010
+ * `goHome` REFUSES rather than moving the head somewhere arbitrary.
29011
+ *
29012
+ * `source === 'none'` is the refusal condition, NOT `presetId === null`: the
29013
+ * native case has no preset and homes perfectly well.
29014
+ */
29015
+ var PtzHomePresetSchema = object({
29016
+ presetId: string().nullable(),
29017
+ source: _enum([
29018
+ "operator",
29019
+ "firmware",
29020
+ "native",
29021
+ "none"
29022
+ ])
28891
29023
  });
28892
29024
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
28893
29025
  deviceId: number(),
@@ -28905,7 +29037,13 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
28905
29037
  }), _void(), {
28906
29038
  kind: "mutation",
28907
29039
  auth: "admin"
28908
- }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29040
+ }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzHomePresetSchema), method(object({
29041
+ deviceId: number(),
29042
+ presetId: string().nullable()
29043
+ }), _void(), {
29044
+ kind: "mutation",
29045
+ auth: "admin"
29046
+ }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
28909
29047
  deviceId: number(),
28910
29048
  enabled: boolean()
28911
29049
  }), _void(), { kind: "mutation" });
@@ -35920,6 +36058,12 @@ Object.freeze({
35920
36058
  addonId: null,
35921
36059
  access: "delete"
35922
36060
  },
36061
+ "ptz.getHomePreset": {
36062
+ capName: "ptz",
36063
+ capScope: "device",
36064
+ addonId: null,
36065
+ access: "view"
36066
+ },
35923
36067
  "ptz.getOptions": {
35924
36068
  capName: "ptz",
35925
36069
  capScope: "device",
@@ -35968,6 +36112,12 @@ Object.freeze({
35968
36112
  addonId: null,
35969
36113
  access: "create"
35970
36114
  },
36115
+ "ptz.setHomePreset": {
36116
+ capName: "ptz",
36117
+ capScope: "device",
36118
+ addonId: null,
36119
+ access: "create"
36120
+ },
35971
36121
  "ptz.stop": {
35972
36122
  capName: "ptz",
35973
36123
  capScope: "device",
@@ -39141,6 +39291,11 @@ Object.freeze({
39141
39291
  form: "single",
39142
39292
  optional: false
39143
39293
  }],
39294
+ "ptz.getHomePreset": [{
39295
+ name: "deviceId",
39296
+ form: "single",
39297
+ optional: false
39298
+ }],
39144
39299
  "ptz.getOptions": [{
39145
39300
  name: "deviceId",
39146
39301
  form: "single",
@@ -39181,6 +39336,11 @@ Object.freeze({
39181
39336
  form: "single",
39182
39337
  optional: false
39183
39338
  }],
39339
+ "ptz.setHomePreset": [{
39340
+ name: "deviceId",
39341
+ form: "single",
39342
+ optional: false
39343
+ }],
39184
39344
  "ptz.stop": [{
39185
39345
  name: "deviceId",
39186
39346
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.113",
3
+ "version": "1.2.115",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",