@camstack/addon-auth 1.2.125 → 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.
@@ -10578,6 +10578,57 @@ var ClipSearchStrictnessSchema = _enum([
10578
10578
  "balanced",
10579
10579
  "strict"
10580
10580
  ]);
10581
+ new Set([
10582
+ {
10583
+ id: "person",
10584
+ name: "Person"
10585
+ },
10586
+ {
10587
+ id: "vehicle",
10588
+ name: "Vehicle"
10589
+ },
10590
+ {
10591
+ id: "animal",
10592
+ name: "Animal"
10593
+ },
10594
+ {
10595
+ id: "package",
10596
+ name: "Package"
10597
+ }
10598
+ ].map((l) => l.id));
10599
+ var COCO_TO_MACRO = {
10600
+ mapping: {
10601
+ person: "person",
10602
+ bicycle: "vehicle",
10603
+ car: "vehicle",
10604
+ motorcycle: "vehicle",
10605
+ airplane: "vehicle",
10606
+ bus: "vehicle",
10607
+ train: "vehicle",
10608
+ truck: "vehicle",
10609
+ boat: "vehicle",
10610
+ bird: "animal",
10611
+ cat: "animal",
10612
+ dog: "animal",
10613
+ horse: "animal",
10614
+ sheep: "animal",
10615
+ cow: "animal",
10616
+ elephant: "animal",
10617
+ bear: "animal",
10618
+ zebra: "animal",
10619
+ giraffe: "animal",
10620
+ suitcase: "package",
10621
+ backpack: "package",
10622
+ handbag: "package"
10623
+ },
10624
+ preserveOriginal: false
10625
+ };
10626
+ /** Steps a root detector may declare it fills. */
10627
+ var FILLABLE_STEP_IDS = [
10628
+ "animal-classifier",
10629
+ "vehicle-classifier",
10630
+ "package-detection"
10631
+ ];
10581
10632
  var MODEL_FORMATS = [
10582
10633
  "onnx",
10583
10634
  "coreml",
@@ -10647,11 +10698,11 @@ var ModelVariantGroupSchema = object({
10647
10698
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10648
10699
  precision: _enum(["fp32", "int8"]).optional(),
10649
10700
  /**
10650
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10651
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10652
- * future performance variants plug into.
10701
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10702
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10703
+ * label is "Test".
10653
10704
  */
10654
- optimization: _enum(["standard", "fast"]).optional(),
10705
+ optimization: _enum(["standard", "test"]).optional(),
10655
10706
  /**
10656
10707
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10657
10708
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10674,9 +10725,10 @@ var ModelProviderIdSchema = _enum([
10674
10725
  * are per upstream. A persisted custom-model row written when this field was a
10675
10726
  * string still parses — the string is lifted into `{ weights }`.
10676
10727
  *
10677
- * Every licence surface (the admin "Models and licenses" page,
10678
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10679
- * these records by `scripts/gen-model-licenses.ts` (D661).
10728
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10729
+ * model table) is GENERATED from these records by
10730
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10731
+ * `camstack/docs` → `/docs/detection/models`.
10680
10732
  */
10681
10733
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10682
10734
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -10709,6 +10761,12 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10709
10761
  /** True when the weights or their data forbid commercial use. */
10710
10762
  nonCommercial: boolean().optional()
10711
10763
  }));
10764
+ /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10765
+ var FillsClassifierEffectSchema = object({
10766
+ stepId: _enum(FILLABLE_STEP_IDS),
10767
+ labelToEffect: record(string(), string()),
10768
+ uncovered: array(string()).readonly()
10769
+ });
10712
10770
  var ModelCatalogEntrySchema = object({
10713
10771
  id: string(),
10714
10772
  name: string(),
@@ -10835,6 +10893,16 @@ var ModelCatalogEntrySchema = object({
10835
10893
  */
10836
10894
  classMap: DetectionCatalogClassMapSchema.optional(),
10837
10895
  /**
10896
+ * The pipeline steps this ROOT detector already does the work of (D715):
10897
+ * its labels name the effect the step exists to produce (`deer` for
10898
+ * `animal-classifier`, `package` for `package-detection`). Derived from the
10899
+ * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
10900
+ * declares none. Whether a declaration is honoured is the step's own
10901
+ * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
10902
+ * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
10903
+ */
10904
+ fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
10905
+ /**
10838
10906
  * The model's CLIP feature-space contract (text encoder, dimension, vector
10839
10907
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
10840
10908
  * CLIP image encoder; its absence is what "not a CLIP model" means to the
@@ -14256,7 +14324,7 @@ DeviceType.Camera;
14256
14324
  * This matters here more than anywhere else in the repo, because every provider
14257
14325
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14258
14326
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14259
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14327
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14260
14328
  * camera's own page will ask for its own login. That is correct, and pre-
14261
14329
  * filling it is the operator's business, not ours.
14262
14330
  *
@@ -17248,7 +17316,7 @@ method(object({
17248
17316
  timeoutMs: 6e5
17249
17317
  });
17250
17318
  method(object({
17251
- nodeId: string(),
17319
+ targetNodeId: string(),
17252
17320
  modelId: string(),
17253
17321
  format: _enum(MODEL_FORMATS),
17254
17322
  entry: ModelCatalogEntrySchema
@@ -17814,51 +17882,6 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
17814
17882
  kind: "mutation",
17815
17883
  auth: "admin"
17816
17884
  });
17817
- new Set([
17818
- {
17819
- id: "person",
17820
- name: "Person"
17821
- },
17822
- {
17823
- id: "vehicle",
17824
- name: "Vehicle"
17825
- },
17826
- {
17827
- id: "animal",
17828
- name: "Animal"
17829
- },
17830
- {
17831
- id: "package",
17832
- name: "Package"
17833
- }
17834
- ].map((l) => l.id));
17835
- var COCO_TO_MACRO = {
17836
- mapping: {
17837
- person: "person",
17838
- bicycle: "vehicle",
17839
- car: "vehicle",
17840
- motorcycle: "vehicle",
17841
- airplane: "vehicle",
17842
- bus: "vehicle",
17843
- train: "vehicle",
17844
- truck: "vehicle",
17845
- boat: "vehicle",
17846
- bird: "animal",
17847
- cat: "animal",
17848
- dog: "animal",
17849
- horse: "animal",
17850
- sheep: "animal",
17851
- cow: "animal",
17852
- elephant: "animal",
17853
- bear: "animal",
17854
- zebra: "animal",
17855
- giraffe: "animal",
17856
- suitcase: "package",
17857
- backpack: "package",
17858
- handbag: "package"
17859
- },
17860
- preserveOriginal: false
17861
- };
17862
17885
  var AUDIO_MACRO_LABELS = [
17863
17886
  {
17864
17887
  id: "speech",
@@ -19714,8 +19737,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19714
19737
  disabledTargetIds: array(string()).default([])
19715
19738
  });
19716
19739
  /**
19717
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19718
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19740
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19741
+ * report a still-true state. `addons` is the crash-looped addons only and
19742
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19719
19743
  * job is not an open state, and the alarm stays instant.
19720
19744
  */
19721
19745
  var NcStateSummarySectionIdSchema = _enum([
@@ -19727,6 +19751,7 @@ var NcStateSummarySectionIdSchema = _enum([
19727
19751
  "detection-blind",
19728
19752
  "nodes",
19729
19753
  "addons",
19754
+ "addon-updates",
19730
19755
  "updates"
19731
19756
  ]);
19732
19757
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20207,7 +20232,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20207
20232
  * When this mode may be armed. Absent / null = always allowed (same as a
20208
20233
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20209
20234
  */
20210
- schedule: NcScheduleSchema.optional()
20235
+ schedule: NcScheduleSchema.optional(),
20236
+ /**
20237
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20238
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20239
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20240
+ */
20241
+ notifyDuringEntryDelay: boolean().optional(),
20242
+ /**
20243
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20244
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20245
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20246
+ */
20247
+ notifySensorRewatched: boolean().optional()
20211
20248
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20212
20249
  var NcAlarmModeDelaysEditListSchema = array(object({
20213
20250
  mode: AlarmArmModeSchema,
@@ -20216,7 +20253,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20216
20253
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20217
20254
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20218
20255
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20219
- schedule: NcScheduleSchema.nullable().optional()
20256
+ schedule: NcScheduleSchema.nullable().optional(),
20257
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20258
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20259
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20260
+ notifySensorRewatched: boolean().nullable().optional()
20220
20261
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20221
20262
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20222
20263
  var NcAlarmNonBlockingEditSchema = object({
@@ -21177,39 +21218,19 @@ Object.freeze(Object.fromEntries([{
21177
21218
  label: "Face recognition model",
21178
21219
  defaultModelId: "auraface-r100",
21179
21220
  indexName: "the enrolled face gallery",
21180
- options: [
21181
- {
21182
- id: "auraface-r100",
21183
- label: "AuraFace R100"
21184
- },
21185
- {
21186
- id: "arcface-r100",
21187
- label: "ArcFace (ResNet34)"
21188
- },
21189
- {
21190
- id: "inception-resnet-v1",
21191
- label: "Inception ResNet V1"
21192
- }
21193
- ]
21221
+ options: [{
21222
+ id: "auraface-r100",
21223
+ label: "AuraFace R100"
21224
+ }]
21194
21225
  }, {
21195
21226
  stepId: "clip-embedding",
21196
21227
  label: "Semantic search model",
21197
- defaultModelId: "mobileclip-s1",
21228
+ defaultModelId: "siglip2-b16-224",
21198
21229
  indexName: "the object semantic-search index",
21199
- options: [
21200
- {
21201
- id: "mobileclip-s1",
21202
- label: "MobileCLIP S1"
21203
- },
21204
- {
21205
- id: "mobileclip-s2",
21206
- label: "MobileCLIP S2"
21207
- },
21208
- {
21209
- id: "siglip2-b16-224",
21210
- label: "SigLIP2 B/16 (Apache-2.0)"
21211
- }
21212
- ]
21230
+ options: [{
21231
+ id: "siglip2-b16-224",
21232
+ label: "SigLIP2 B/16 (Apache-2.0)"
21233
+ }]
21213
21234
  }].map((s) => [s.stepId, s.defaultModelId])));
21214
21235
  var CLUSTER_STEP_SETTING_FIELDS = [{
21215
21236
  stepId: "face-embedding",
@@ -23264,7 +23285,8 @@ var PipelineModelOptionSchema = object({
23264
23285
  group: ModelVariantGroupSchema.optional(),
23265
23286
  legacy: boolean().optional(),
23266
23287
  provider: ModelProviderIdSchema.optional(),
23267
- defaultConfidence: number().optional()
23288
+ defaultConfidence: number().optional(),
23289
+ fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23268
23290
  });
23269
23291
  var ConfigFieldBridge = custom();
23270
23292
  var PipelineAddonSchemaSchema = object({
@@ -24057,6 +24079,22 @@ var MotionSourceEnum = _enum([
24057
24079
  "device-activity"
24058
24080
  ]);
24059
24081
  /**
24082
+ * What opened an on-motion detection SESSION: the motion source that passed the
24083
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24084
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24085
+ * device name as the orchestrator's camera-sensors resolution last read it;
24086
+ * absent when unknown or when the camera itself triggered.
24087
+ *
24088
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24089
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24090
+ * runner never decides anything on it.
24091
+ */
24092
+ var SessionTriggerSchema = object({
24093
+ source: MotionSourceEnum,
24094
+ triggeredBy: MotionTriggeredBySchema,
24095
+ sensorName: string().optional()
24096
+ });
24097
+ /**
24060
24098
  * List of motion sources active on a camera. Empty array is valid:
24061
24099
  * "no source" — happens for battery cams without firmware motion when
24062
24100
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24308,6 +24346,14 @@ var RunnerCameraConfigSchema = object({
24308
24346
  */
24309
24347
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24310
24348
  /**
24349
+ * What opened this attach, on a SESSION attach only (see
24350
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24351
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24352
+ * behind it, and every attach from an orchestrator older than the field — the
24353
+ * runner then names no source on the phase event.
24354
+ */
24355
+ sessionTrigger: SessionTriggerSchema.optional(),
24356
+ /**
24311
24357
  * WHICH root detector runs for this camera. The detection counterpart of
24312
24358
  * {@link motionSources}, same shape and same discipline: a per-camera list
24313
24359
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30566,7 +30612,7 @@ var LocalInterfaceSchema = object({
30566
30612
  name: string(),
30567
30613
  family: _enum(["IPv4", "IPv6"]),
30568
30614
  address: string(),
30569
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30615
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30570
30616
  cidr: string(),
30571
30617
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30572
30618
  netmask: string(),
@@ -30620,7 +30666,8 @@ var ConnectionEndpointSchema = object({
30620
30666
  "lan-ipv4",
30621
30667
  "lan-ipv6",
30622
30668
  "public",
30623
- "loopback"
30669
+ "loopback",
30670
+ "app-link"
30624
30671
  ]),
30625
30672
  /**
30626
30673
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30689,15 +30736,27 @@ var GetConnectionEndpointsResultSchema = object({
30689
30736
  localPort: AdvertisedLocalPortSchema
30690
30737
  });
30691
30738
  /**
30692
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30693
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30694
- * what AUTO currently picks, so the UI can show the effective value either way.
30739
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30740
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30741
+ * so the UI can show it either way.
30695
30742
  */
30696
30743
  var NotificationEndpointSchema = object({
30697
30744
  /** The operator's explicit choice, or null for AUTO. */
30698
30745
  baseUrl: string().nullable(),
30699
- /** What the ranking currently resolves to (null when nothing is reachable). */
30700
- resolved: string().nullable()
30746
+ /**
30747
+ * The effective flagged address: the explicit choice, else (AUTO) the
30748
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30749
+ * answered the public tunnel / mesh here, or null.
30750
+ */
30751
+ resolved: string().nullable(),
30752
+ /**
30753
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30754
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30755
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30756
+ * hub advertises neither; the app link is then minted without `hub=`.
30757
+ * Absent on a pre-D709 hub.
30758
+ */
30759
+ appLinkHub: string().nullable()
30701
30760
  });
30702
30761
  /**
30703
30762
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30751,7 +30810,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30751
30810
  * Pass `'https'` when the caller is itself loaded over HTTPS
30752
30811
  * to avoid mixed-content blocks in the browser. The public
30753
30812
  * tunnel always emits `https://` regardless. */
30754
- scheme: _enum(["http", "https"]).optional()
30813
+ scheme: _enum(["http", "https"]).optional(),
30814
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30815
+ * an address notification links can be flagged with, not a hub
30816
+ * route. Default `false`: racers and rankers never see it. */
30817
+ includeAppLink: boolean().optional()
30755
30818
  }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
30756
30819
  kind: "mutation",
30757
30820
  auth: "admin"
@@ -31012,7 +31075,7 @@ var MeshPeerSchema = object({
31012
31075
  tags: array(string()).readonly(),
31013
31076
  /** True when the peer advertises itself as an exit-node candidate. */
31014
31077
  exitNodeOption: boolean(),
31015
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31078
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
31016
31079
  advertisedRoutes: array(string()).readonly(),
31017
31080
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
31018
31081
  userLogin: string().nullable(),
@@ -31956,7 +32019,13 @@ var OsdStatusSchema = object({ overlays: array(object({
31956
32019
  */
31957
32020
  availablePositions: array(OsdPositionEnum).readonly(),
31958
32021
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
31959
- readOnly: boolean().optional()
32022
+ readOnly: boolean().optional(),
32023
+ /**
32024
+ * Firmware text ceiling for this overlay. Absent = no known limit.
32025
+ * The OSD manager truncates here on every write — never stores its own
32026
+ * copy on the binding.
32027
+ */
32028
+ maxCharacters: number().int().positive().optional()
31960
32029
  })).readonly() });
31961
32030
  var OsdOverlayPatchSchema = object({
31962
32031
  enabled: boolean().optional(),
@@ -32007,7 +32076,9 @@ var OsdTemplateBindingSchema = object({
32007
32076
  valuePath: string().min(1).max(64),
32008
32077
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
32009
32078
  displayUnit: string().max(16).optional(),
32010
- maxDecimals: number().int().min(0).max(4).default(1)
32079
+ maxDecimals: number().int().min(0).max(4).default(1),
32080
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
32081
+ valueMap: record(string(), string()).optional()
32011
32082
  });
32012
32083
  /**
32013
32084
  * A named template: bindings (alias → leaf field) + a parser that
@@ -32057,18 +32128,11 @@ var OsdSlotBindingSchema = object({
32057
32128
  source: OsdSourceSchema,
32058
32129
  /** `${value}` and `${unit}` are substituted; every occurrence. */
32059
32130
  template: string().max(96).default("${value}"),
32060
- /** Truncate with an ellipsis past this length. Absent = no limit. */
32061
- maxCharacters: number().int().min(4).max(64).optional(),
32062
32131
  /**
32063
32132
  * Decimal places for a numeric value. `0` yields an integer — the
32064
32133
  * documented workaround for firmwares that reject `.` in overlay text.
32065
32134
  */
32066
32135
  maxDecimals: number().int().min(0).max(4).default(1),
32067
- /**
32068
- * Appended via `${unit}` when no unit conversion produces a label.
32069
- * Prefer `source.displayUnit` for converted device-state values.
32070
- */
32071
- unitLabel: string().max(8).optional(),
32072
32136
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
32073
32137
  valueMap: record(string(), string()).optional(),
32074
32138
  /** Time windows in which the slot is shown. Absent = always. */
@@ -32077,9 +32141,7 @@ var OsdSlotBindingSchema = object({
32077
32141
  * Display gate, in the notification centre's condition vocabulary.
32078
32142
  * Only the keys reported by `getConditionSupport` are accepted.
32079
32143
  */
32080
- conditions: NcConditionsSchema.optional(),
32081
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
32082
- fallbackText: string().max(64).default("")
32144
+ conditions: NcConditionsSchema.optional()
32083
32145
  });
32084
32146
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
32085
32147
  var OsdSlotViewSchema = object({
@@ -47756,12 +47818,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47756
47818
  {
47757
47819
  id: "addons",
47758
47820
  family: "system",
47759
- label: "Addons",
47760
- kinds: [
47761
- "addon-crash-loop",
47762
- "addon-update-available",
47763
- "addon-updated"
47764
- ]
47821
+ label: "Addons stopped",
47822
+ kinds: ["addon-crash-loop"]
47823
+ },
47824
+ {
47825
+ id: "addon-updates",
47826
+ family: "system",
47827
+ label: "Addon updates",
47828
+ kinds: ["addon-update-available", "addon-updated"]
47765
47829
  },
47766
47830
  {
47767
47831
  id: "updates",
@@ -47921,13 +47985,15 @@ var STATE_SUMMARY_SECTION_VARS = [
47921
47985
  },
47922
47986
  {
47923
47987
  name: "summaryAddons",
47924
- label: "Summary: addons",
47925
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
47926
- kinds: [
47927
- "addon-crash-loop",
47928
- "addon-update-available",
47929
- "addon-updated"
47930
- ]
47988
+ label: "Summary: addons stopped",
47989
+ example: "hub — recorder stopped after repeated crashes",
47990
+ kinds: ["addon-crash-loop"]
47991
+ },
47992
+ {
47993
+ name: "summaryAddonUpdates",
47994
+ label: "Summary: addon updates",
47995
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
47996
+ kinds: ["addon-update-available", "addon-updated"]
47931
47997
  },
47932
47998
  {
47933
47999
  name: "summaryUpdates",
@@ -48011,6 +48077,7 @@ var STATE_SUMMARY_VARS = [
48011
48077
  [...RULE_BODY_ONLY],
48012
48078
  [...RULE_TEXT],
48013
48079
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48080
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
48014
48081
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48015
48082
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
48016
48083
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -48051,6 +48118,8 @@ var STATE_SUMMARY_VARS = [
48051
48118
  [...RULE_TEXT],
48052
48119
  [...RULE_TEXT],
48053
48120
  [...RULE_TEXT],
48121
+ [...RULE_TEXT],
48122
+ [...RULE_TEXT],
48054
48123
  ...STATE_SUMMARY_VARS
48055
48124
  ];
48056
48125
  new Set([