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