@camstack/addon-notifiers 1.2.126 → 1.2.127

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
@@ -10689,11 +10689,11 @@ var ModelVariantGroupSchema = object({
10689
10689
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10690
10690
  precision: _enum(["fp32", "int8"]).optional(),
10691
10691
  /**
10692
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10693
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10694
- * future performance variants plug into.
10692
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10693
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10694
+ * label is "Test".
10695
10695
  */
10696
- optimization: _enum(["standard", "fast"]).optional(),
10696
+ optimization: _enum(["standard", "test"]).optional(),
10697
10697
  /**
10698
10698
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10699
10699
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10716,9 +10716,10 @@ var ModelProviderIdSchema = _enum([
10716
10716
  * are per upstream. A persisted custom-model row written when this field was a
10717
10717
  * string still parses — the string is lifted into `{ weights }`.
10718
10718
  *
10719
- * Every licence surface (the admin "Models and licenses" page,
10720
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10721
- * these records by `scripts/gen-model-licenses.ts` (D661).
10719
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10720
+ * model table) is GENERATED from these records by
10721
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10722
+ * `camstack/docs` → `/docs/detection/models`.
10722
10723
  */
10723
10724
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10724
10725
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -17250,7 +17251,7 @@ method(object({
17250
17251
  timeoutMs: 6e5
17251
17252
  });
17252
17253
  method(object({
17253
- nodeId: string(),
17254
+ targetNodeId: string(),
17254
17255
  modelId: string(),
17255
17256
  format: _enum(MODEL_FORMATS),
17256
17257
  entry: ModelCatalogEntrySchema
@@ -21201,39 +21202,19 @@ Object.freeze(Object.fromEntries([{
21201
21202
  label: "Face recognition model",
21202
21203
  defaultModelId: "auraface-r100",
21203
21204
  indexName: "the enrolled face gallery",
21204
- options: [
21205
- {
21206
- id: "auraface-r100",
21207
- label: "AuraFace R100"
21208
- },
21209
- {
21210
- id: "arcface-r100",
21211
- label: "ArcFace (ResNet34)"
21212
- },
21213
- {
21214
- id: "inception-resnet-v1",
21215
- label: "Inception ResNet V1"
21216
- }
21217
- ]
21205
+ options: [{
21206
+ id: "auraface-r100",
21207
+ label: "AuraFace R100"
21208
+ }]
21218
21209
  }, {
21219
21210
  stepId: "clip-embedding",
21220
21211
  label: "Semantic search model",
21221
- defaultModelId: "mobileclip-s1",
21212
+ defaultModelId: "siglip2-b16-224",
21222
21213
  indexName: "the object semantic-search index",
21223
- options: [
21224
- {
21225
- id: "mobileclip-s1",
21226
- label: "MobileCLIP S1"
21227
- },
21228
- {
21229
- id: "mobileclip-s2",
21230
- label: "MobileCLIP S2"
21231
- },
21232
- {
21233
- id: "siglip2-b16-224",
21234
- label: "SigLIP2 B/16 (Apache-2.0)"
21235
- }
21236
- ]
21214
+ options: [{
21215
+ id: "siglip2-b16-224",
21216
+ label: "SigLIP2 B/16 (Apache-2.0)"
21217
+ }]
21237
21218
  }].map((s) => [s.stepId, s.defaultModelId])));
21238
21219
  var CLUSTER_STEP_SETTING_FIELDS = [{
21239
21220
  stepId: "face-embedding",
@@ -31945,7 +31926,13 @@ var OsdStatusSchema = object({ overlays: array(object({
31945
31926
  */
31946
31927
  availablePositions: array(OsdPositionEnum).readonly(),
31947
31928
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
31948
- readOnly: boolean().optional()
31929
+ readOnly: boolean().optional(),
31930
+ /**
31931
+ * Firmware text ceiling for this overlay. Absent = no known limit.
31932
+ * The OSD manager truncates here on every write — never stores its own
31933
+ * copy on the binding.
31934
+ */
31935
+ maxCharacters: number().int().positive().optional()
31949
31936
  })).readonly() });
31950
31937
  var OsdOverlayPatchSchema = object({
31951
31938
  enabled: boolean().optional(),
@@ -31996,7 +31983,9 @@ var OsdTemplateBindingSchema = object({
31996
31983
  valuePath: string().min(1).max(64),
31997
31984
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
31998
31985
  displayUnit: string().max(16).optional(),
31999
- maxDecimals: number().int().min(0).max(4).default(1)
31986
+ maxDecimals: number().int().min(0).max(4).default(1),
31987
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
31988
+ valueMap: record(string(), string()).optional()
32000
31989
  });
32001
31990
  /**
32002
31991
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32046,18 +32035,11 @@ var OsdSlotBindingSchema = object({
32046
32035
  source: OsdSourceSchema,
32047
32036
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32048
32037
  template: string().max(96).default("${value}"),
32049
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32050
- maxCharacters: number().int().min(4).max(64).optional(),
32051
32038
  /**
32052
32039
  * Decimal places for a numeric value. `0` yields an integer — the
32053
32040
  * documented workaround for firmwares that reject `.` in overlay text.
32054
32041
  */
32055
32042
  maxDecimals: number().int().min(0).max(4).default(1),
32056
- /**
32057
- * Appended via `${unit}` when no unit conversion produces a label.
32058
- * Prefer `source.displayUnit` for converted device-state values.
32059
- */
32060
- unitLabel: string().max(8).optional(),
32061
32043
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32062
32044
  valueMap: record(string(), string()).optional(),
32063
32045
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32066,9 +32048,7 @@ var OsdSlotBindingSchema = object({
32066
32048
  * Display gate, in the notification centre's condition vocabulary.
32067
32049
  * Only the keys reported by `getConditionSupport` are accepted.
32068
32050
  */
32069
- conditions: NcConditionsSchema.optional(),
32070
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32071
- fallbackText: string().max(64).default("")
32051
+ conditions: NcConditionsSchema.optional()
32072
32052
  });
32073
32053
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32074
32054
  var OsdSlotViewSchema = object({
@@ -48247,6 +48227,8 @@ var STATE_SUMMARY_VARS = [
48247
48227
  [...RULE_TEXT],
48248
48228
  [...RULE_TEXT],
48249
48229
  [...RULE_TEXT],
48230
+ [...RULE_TEXT],
48231
+ [...RULE_TEXT],
48250
48232
  ...STATE_SUMMARY_VARS
48251
48233
  ];
48252
48234
  new Set([
@@ -50623,12 +50605,12 @@ var BUCKETS_PATH = "/api/v1/buckets";
50623
50605
  /** Zentik `deliveryType` enum — mirrors our declared level ids 1:1. */
50624
50606
  var DEFAULT_DELIVERY_TYPE = "NORMAL";
50625
50607
  /**
50626
- * Backend `CreateMessageDto` limits (verbatim from
50627
- * `zentik-notifier/backend/.../create-message.dto.ts`): `title` is REQUIRED and
50628
- * `@MaxLength(100)`, `body` is optional `@MaxLength(500)`. Over-length → 400.
50608
+ * Backend `CreateMessageDto` title is REQUIRED and `@MaxLength(100)`.
50609
+ * Body has no CamStack truncate — model "no cap" like webhook (positive int).
50629
50610
  */
50630
50611
  var TITLE_MAX_LEN = 100;
50631
- var BODY_MAX_LEN = 500;
50612
+ /** Positive int required by caps; large enough that degrade never truncates. */
50613
+ var NO_BODY_CAP = 1e6;
50632
50614
  /** Non-empty fallback title when a notification carries no title. */
50633
50615
  var FALLBACK_TITLE = "CamStack";
50634
50616
  /** url-mode attachment ceiling (no hard doc limit; matrix §5 → 5). */
@@ -50981,7 +50963,7 @@ var NOTIFIER_ADAPTERS = [
50981
50963
  actionIcons: true,
50982
50964
  sound: true,
50983
50965
  ttl: true,
50984
- bodyMaxLen: BODY_MAX_LEN
50966
+ bodyMaxLen: NO_BODY_CAP
50985
50967
  }
50986
50968
  },
50987
50969
  destinationKeys: [
package/dist/addon.mjs CHANGED
@@ -10662,11 +10662,11 @@ var ModelVariantGroupSchema = object({
10662
10662
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10663
10663
  precision: _enum(["fp32", "int8"]).optional(),
10664
10664
  /**
10665
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10666
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10667
- * future performance variants plug into.
10665
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10666
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10667
+ * label is "Test".
10668
10668
  */
10669
- optimization: _enum(["standard", "fast"]).optional(),
10669
+ optimization: _enum(["standard", "test"]).optional(),
10670
10670
  /**
10671
10671
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10672
10672
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10689,9 +10689,10 @@ var ModelProviderIdSchema = _enum([
10689
10689
  * are per upstream. A persisted custom-model row written when this field was a
10690
10690
  * string still parses — the string is lifted into `{ weights }`.
10691
10691
  *
10692
- * Every licence surface (the admin "Models and licenses" page,
10693
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10694
- * these records by `scripts/gen-model-licenses.ts` (D661).
10692
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10693
+ * model table) is GENERATED from these records by
10694
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10695
+ * `camstack/docs` → `/docs/detection/models`.
10695
10696
  */
10696
10697
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10697
10698
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -17223,7 +17224,7 @@ method(object({
17223
17224
  timeoutMs: 6e5
17224
17225
  });
17225
17226
  method(object({
17226
- nodeId: string(),
17227
+ targetNodeId: string(),
17227
17228
  modelId: string(),
17228
17229
  format: _enum(MODEL_FORMATS),
17229
17230
  entry: ModelCatalogEntrySchema
@@ -21174,39 +21175,19 @@ Object.freeze(Object.fromEntries([{
21174
21175
  label: "Face recognition model",
21175
21176
  defaultModelId: "auraface-r100",
21176
21177
  indexName: "the enrolled face gallery",
21177
- options: [
21178
- {
21179
- id: "auraface-r100",
21180
- label: "AuraFace R100"
21181
- },
21182
- {
21183
- id: "arcface-r100",
21184
- label: "ArcFace (ResNet34)"
21185
- },
21186
- {
21187
- id: "inception-resnet-v1",
21188
- label: "Inception ResNet V1"
21189
- }
21190
- ]
21178
+ options: [{
21179
+ id: "auraface-r100",
21180
+ label: "AuraFace R100"
21181
+ }]
21191
21182
  }, {
21192
21183
  stepId: "clip-embedding",
21193
21184
  label: "Semantic search model",
21194
- defaultModelId: "mobileclip-s1",
21185
+ defaultModelId: "siglip2-b16-224",
21195
21186
  indexName: "the object semantic-search index",
21196
- options: [
21197
- {
21198
- id: "mobileclip-s1",
21199
- label: "MobileCLIP S1"
21200
- },
21201
- {
21202
- id: "mobileclip-s2",
21203
- label: "MobileCLIP S2"
21204
- },
21205
- {
21206
- id: "siglip2-b16-224",
21207
- label: "SigLIP2 B/16 (Apache-2.0)"
21208
- }
21209
- ]
21187
+ options: [{
21188
+ id: "siglip2-b16-224",
21189
+ label: "SigLIP2 B/16 (Apache-2.0)"
21190
+ }]
21210
21191
  }].map((s) => [s.stepId, s.defaultModelId])));
21211
21192
  var CLUSTER_STEP_SETTING_FIELDS = [{
21212
21193
  stepId: "face-embedding",
@@ -31918,7 +31899,13 @@ var OsdStatusSchema = object({ overlays: array(object({
31918
31899
  */
31919
31900
  availablePositions: array(OsdPositionEnum).readonly(),
31920
31901
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
31921
- readOnly: boolean().optional()
31902
+ readOnly: boolean().optional(),
31903
+ /**
31904
+ * Firmware text ceiling for this overlay. Absent = no known limit.
31905
+ * The OSD manager truncates here on every write — never stores its own
31906
+ * copy on the binding.
31907
+ */
31908
+ maxCharacters: number().int().positive().optional()
31922
31909
  })).readonly() });
31923
31910
  var OsdOverlayPatchSchema = object({
31924
31911
  enabled: boolean().optional(),
@@ -31969,7 +31956,9 @@ var OsdTemplateBindingSchema = object({
31969
31956
  valuePath: string().min(1).max(64),
31970
31957
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
31971
31958
  displayUnit: string().max(16).optional(),
31972
- maxDecimals: number().int().min(0).max(4).default(1)
31959
+ maxDecimals: number().int().min(0).max(4).default(1),
31960
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
31961
+ valueMap: record(string(), string()).optional()
31973
31962
  });
31974
31963
  /**
31975
31964
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32019,18 +32008,11 @@ var OsdSlotBindingSchema = object({
32019
32008
  source: OsdSourceSchema,
32020
32009
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32021
32010
  template: string().max(96).default("${value}"),
32022
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32023
- maxCharacters: number().int().min(4).max(64).optional(),
32024
32011
  /**
32025
32012
  * Decimal places for a numeric value. `0` yields an integer — the
32026
32013
  * documented workaround for firmwares that reject `.` in overlay text.
32027
32014
  */
32028
32015
  maxDecimals: number().int().min(0).max(4).default(1),
32029
- /**
32030
- * Appended via `${unit}` when no unit conversion produces a label.
32031
- * Prefer `source.displayUnit` for converted device-state values.
32032
- */
32033
- unitLabel: string().max(8).optional(),
32034
32016
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32035
32017
  valueMap: record(string(), string()).optional(),
32036
32018
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32039,9 +32021,7 @@ var OsdSlotBindingSchema = object({
32039
32021
  * Display gate, in the notification centre's condition vocabulary.
32040
32022
  * Only the keys reported by `getConditionSupport` are accepted.
32041
32023
  */
32042
- conditions: NcConditionsSchema.optional(),
32043
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32044
- fallbackText: string().max(64).default("")
32024
+ conditions: NcConditionsSchema.optional()
32045
32025
  });
32046
32026
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32047
32027
  var OsdSlotViewSchema = object({
@@ -48220,6 +48200,8 @@ var STATE_SUMMARY_VARS = [
48220
48200
  [...RULE_TEXT],
48221
48201
  [...RULE_TEXT],
48222
48202
  [...RULE_TEXT],
48203
+ [...RULE_TEXT],
48204
+ [...RULE_TEXT],
48223
48205
  ...STATE_SUMMARY_VARS
48224
48206
  ];
48225
48207
  new Set([
@@ -50596,12 +50578,12 @@ var BUCKETS_PATH = "/api/v1/buckets";
50596
50578
  /** Zentik `deliveryType` enum — mirrors our declared level ids 1:1. */
50597
50579
  var DEFAULT_DELIVERY_TYPE = "NORMAL";
50598
50580
  /**
50599
- * Backend `CreateMessageDto` limits (verbatim from
50600
- * `zentik-notifier/backend/.../create-message.dto.ts`): `title` is REQUIRED and
50601
- * `@MaxLength(100)`, `body` is optional `@MaxLength(500)`. Over-length → 400.
50581
+ * Backend `CreateMessageDto` title is REQUIRED and `@MaxLength(100)`.
50582
+ * Body has no CamStack truncate — model "no cap" like webhook (positive int).
50602
50583
  */
50603
50584
  var TITLE_MAX_LEN = 100;
50604
- var BODY_MAX_LEN = 500;
50585
+ /** Positive int required by caps; large enough that degrade never truncates. */
50586
+ var NO_BODY_CAP = 1e6;
50605
50587
  /** Non-empty fallback title when a notification carries no title. */
50606
50588
  var FALLBACK_TITLE = "CamStack";
50607
50589
  /** url-mode attachment ceiling (no hard doc limit; matrix §5 → 5). */
@@ -50954,7 +50936,7 @@ var NOTIFIER_ADAPTERS = [
50954
50936
  actionIcons: true,
50955
50937
  sound: true,
50956
50938
  ttl: true,
50957
- bodyMaxLen: BODY_MAX_LEN
50939
+ bodyMaxLen: NO_BODY_CAP
50958
50940
  }
50959
50941
  },
50960
50942
  destinationKeys: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.126",
3
+ "version": "1.2.127",
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",