@camstack/addon-notifiers 1.2.127 → 1.2.128

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
@@ -14267,7 +14267,7 @@ DeviceType.Camera;
14267
14267
  * This matters here more than anywhere else in the repo, because every provider
14268
14268
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14269
14269
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14270
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14270
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14271
14271
  * camera's own page will ask for its own login. That is correct, and pre-
14272
14272
  * filling it is the operator's business, not ours.
14273
14273
  *
@@ -19739,8 +19739,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19739
19739
  disabledTargetIds: array(string()).default([])
19740
19740
  });
19741
19741
  /**
19742
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19743
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19742
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19743
+ * report a still-true state. `addons` is the crash-looped addons only and
19744
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19744
19745
  * job is not an open state, and the alarm stays instant.
19745
19746
  */
19746
19747
  var NcStateSummarySectionIdSchema = _enum([
@@ -19752,6 +19753,7 @@ var NcStateSummarySectionIdSchema = _enum([
19752
19753
  "detection-blind",
19753
19754
  "nodes",
19754
19755
  "addons",
19756
+ "addon-updates",
19755
19757
  "updates"
19756
19758
  ]);
19757
19759
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20232,7 +20234,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20232
20234
  * When this mode may be armed. Absent / null = always allowed (same as a
20233
20235
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20234
20236
  */
20235
- schedule: NcScheduleSchema.optional()
20237
+ schedule: NcScheduleSchema.optional(),
20238
+ /**
20239
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20240
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20241
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20242
+ */
20243
+ notifyDuringEntryDelay: boolean().optional(),
20244
+ /**
20245
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20246
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20247
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20248
+ */
20249
+ notifySensorRewatched: boolean().optional()
20236
20250
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20237
20251
  var NcAlarmModeDelaysEditListSchema = array(object({
20238
20252
  mode: AlarmArmModeSchema,
@@ -20241,7 +20255,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20241
20255
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20242
20256
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20243
20257
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20244
- schedule: NcScheduleSchema.nullable().optional()
20258
+ schedule: NcScheduleSchema.nullable().optional(),
20259
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20260
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20261
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20262
+ notifySensorRewatched: boolean().nullable().optional()
20245
20263
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20246
20264
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20247
20265
  var NcAlarmNonBlockingEditSchema = object({
@@ -24062,6 +24080,22 @@ var MotionSourceEnum = _enum([
24062
24080
  "device-activity"
24063
24081
  ]);
24064
24082
  /**
24083
+ * What opened an on-motion detection SESSION: the motion source that passed the
24084
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24085
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24086
+ * device name as the orchestrator's camera-sensors resolution last read it;
24087
+ * absent when unknown or when the camera itself triggered.
24088
+ *
24089
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24090
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24091
+ * runner never decides anything on it.
24092
+ */
24093
+ var SessionTriggerSchema = object({
24094
+ source: MotionSourceEnum,
24095
+ triggeredBy: MotionTriggeredBySchema,
24096
+ sensorName: string().optional()
24097
+ });
24098
+ /**
24065
24099
  * List of motion sources active on a camera. Empty array is valid:
24066
24100
  * "no source" — happens for battery cams without firmware motion when
24067
24101
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24313,6 +24347,14 @@ var RunnerCameraConfigSchema = object({
24313
24347
  */
24314
24348
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24315
24349
  /**
24350
+ * What opened this attach, on a SESSION attach only (see
24351
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24352
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24353
+ * behind it, and every attach from an orchestrator older than the field — the
24354
+ * runner then names no source on the phase event.
24355
+ */
24356
+ sessionTrigger: SessionTriggerSchema.optional(),
24357
+ /**
24316
24358
  * WHICH root detector runs for this camera. The detection counterpart of
24317
24359
  * {@link motionSources}, same shape and same discipline: a per-camera list
24318
24360
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30536,7 +30578,7 @@ var LocalInterfaceSchema = object({
30536
30578
  name: string(),
30537
30579
  family: _enum(["IPv4", "IPv6"]),
30538
30580
  address: string(),
30539
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30581
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30540
30582
  cidr: string(),
30541
30583
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30542
30584
  netmask: string(),
@@ -30590,7 +30632,8 @@ var ConnectionEndpointSchema = object({
30590
30632
  "lan-ipv4",
30591
30633
  "lan-ipv6",
30592
30634
  "public",
30593
- "loopback"
30635
+ "loopback",
30636
+ "app-link"
30594
30637
  ]),
30595
30638
  /**
30596
30639
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30659,15 +30702,27 @@ var GetConnectionEndpointsResultSchema = object({
30659
30702
  localPort: AdvertisedLocalPortSchema
30660
30703
  });
30661
30704
  /**
30662
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30663
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30664
- * what AUTO currently picks, so the UI can show the effective value either way.
30705
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30706
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30707
+ * so the UI can show it either way.
30665
30708
  */
30666
30709
  var NotificationEndpointSchema = object({
30667
30710
  /** The operator's explicit choice, or null for AUTO. */
30668
30711
  baseUrl: string().nullable(),
30669
- /** What the ranking currently resolves to (null when nothing is reachable). */
30670
- resolved: string().nullable()
30712
+ /**
30713
+ * The effective flagged address: the explicit choice, else (AUTO) the
30714
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30715
+ * answered the public tunnel / mesh here, or null.
30716
+ */
30717
+ resolved: string().nullable(),
30718
+ /**
30719
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30720
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30721
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30722
+ * hub advertises neither; the app link is then minted without `hub=`.
30723
+ * Absent on a pre-D709 hub.
30724
+ */
30725
+ appLinkHub: string().nullable()
30671
30726
  });
30672
30727
  /**
30673
30728
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30721,7 +30776,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30721
30776
  * Pass `'https'` when the caller is itself loaded over HTTPS
30722
30777
  * to avoid mixed-content blocks in the browser. The public
30723
30778
  * tunnel always emits `https://` regardless. */
30724
- scheme: _enum(["http", "https"]).optional()
30779
+ scheme: _enum(["http", "https"]).optional(),
30780
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30781
+ * an address notification links can be flagged with, not a hub
30782
+ * route. Default `false`: racers and rankers never see it. */
30783
+ includeAppLink: boolean().optional()
30725
30784
  }), 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, {
30726
30785
  kind: "mutation",
30727
30786
  auth: "admin"
@@ -30982,7 +31041,7 @@ var MeshPeerSchema = object({
30982
31041
  tags: array(string()).readonly(),
30983
31042
  /** True when the peer advertises itself as an exit-node candidate. */
30984
31043
  exitNodeOption: boolean(),
30985
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31044
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
30986
31045
  advertisedRoutes: array(string()).readonly(),
30987
31046
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
30988
31047
  userLogin: string().nullable(),
@@ -47932,12 +47991,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47932
47991
  {
47933
47992
  id: "addons",
47934
47993
  family: "system",
47935
- label: "Addons",
47936
- kinds: [
47937
- "addon-crash-loop",
47938
- "addon-update-available",
47939
- "addon-updated"
47940
- ]
47994
+ label: "Addons stopped",
47995
+ kinds: ["addon-crash-loop"]
47996
+ },
47997
+ {
47998
+ id: "addon-updates",
47999
+ family: "system",
48000
+ label: "Addon updates",
48001
+ kinds: ["addon-update-available", "addon-updated"]
47941
48002
  },
47942
48003
  {
47943
48004
  id: "updates",
@@ -48097,13 +48158,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48097
48158
  },
48098
48159
  {
48099
48160
  name: "summaryAddons",
48100
- label: "Summary: addons",
48101
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48102
- kinds: [
48103
- "addon-crash-loop",
48104
- "addon-update-available",
48105
- "addon-updated"
48106
- ]
48161
+ label: "Summary: addons stopped",
48162
+ example: "hub — recorder stopped after repeated crashes",
48163
+ kinds: ["addon-crash-loop"]
48164
+ },
48165
+ {
48166
+ name: "summaryAddonUpdates",
48167
+ label: "Summary: addon updates",
48168
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
48169
+ kinds: ["addon-update-available", "addon-updated"]
48107
48170
  },
48108
48171
  {
48109
48172
  name: "summaryUpdates",
@@ -48187,6 +48250,7 @@ var STATE_SUMMARY_VARS = [
48187
48250
  [...RULE_BODY_ONLY],
48188
48251
  [...RULE_TEXT],
48189
48252
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48253
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
48190
48254
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48191
48255
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
48192
48256
  ([...RULE_TEXT], [...CONSUMABLE]),
package/dist/addon.mjs CHANGED
@@ -14240,7 +14240,7 @@ DeviceType.Camera;
14240
14240
  * This matters here more than anywhere else in the repo, because every provider
14241
14241
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14242
14242
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14243
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14243
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14244
14244
  * camera's own page will ask for its own login. That is correct, and pre-
14245
14245
  * filling it is the operator's business, not ours.
14246
14246
  *
@@ -19712,8 +19712,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19712
19712
  disabledTargetIds: array(string()).default([])
19713
19713
  });
19714
19714
  /**
19715
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19716
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
19715
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
19716
+ * report a still-true state. `addons` is the crash-looped addons only and
19717
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
19717
19718
  * job is not an open state, and the alarm stays instant.
19718
19719
  */
19719
19720
  var NcStateSummarySectionIdSchema = _enum([
@@ -19725,6 +19726,7 @@ var NcStateSummarySectionIdSchema = _enum([
19725
19726
  "detection-blind",
19726
19727
  "nodes",
19727
19728
  "addons",
19729
+ "addon-updates",
19728
19730
  "updates"
19729
19731
  ]);
19730
19732
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20205,7 +20207,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20205
20207
  * When this mode may be armed. Absent / null = always allowed (same as a
20206
20208
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20207
20209
  */
20208
- schedule: NcScheduleSchema.optional()
20210
+ schedule: NcScheduleSchema.optional(),
20211
+ /**
20212
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20213
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20214
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20215
+ */
20216
+ notifyDuringEntryDelay: boolean().optional(),
20217
+ /**
20218
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20219
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20220
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20221
+ */
20222
+ notifySensorRewatched: boolean().optional()
20209
20223
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20210
20224
  var NcAlarmModeDelaysEditListSchema = array(object({
20211
20225
  mode: AlarmArmModeSchema,
@@ -20214,7 +20228,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20214
20228
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20215
20229
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20216
20230
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20217
- schedule: NcScheduleSchema.nullable().optional()
20231
+ schedule: NcScheduleSchema.nullable().optional(),
20232
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20233
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20234
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20235
+ notifySensorRewatched: boolean().nullable().optional()
20218
20236
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20219
20237
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20220
20238
  var NcAlarmNonBlockingEditSchema = object({
@@ -24035,6 +24053,22 @@ var MotionSourceEnum = _enum([
24035
24053
  "device-activity"
24036
24054
  ]);
24037
24055
  /**
24056
+ * What opened an on-motion detection SESSION: the motion source that passed the
24057
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24058
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24059
+ * device name as the orchestrator's camera-sensors resolution last read it;
24060
+ * absent when unknown or when the camera itself triggered.
24061
+ *
24062
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24063
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24064
+ * runner never decides anything on it.
24065
+ */
24066
+ var SessionTriggerSchema = object({
24067
+ source: MotionSourceEnum,
24068
+ triggeredBy: MotionTriggeredBySchema,
24069
+ sensorName: string().optional()
24070
+ });
24071
+ /**
24038
24072
  * List of motion sources active on a camera. Empty array is valid:
24039
24073
  * "no source" — happens for battery cams without firmware motion when
24040
24074
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -24286,6 +24320,14 @@ var RunnerCameraConfigSchema = object({
24286
24320
  */
24287
24321
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24288
24322
  /**
24323
+ * What opened this attach, on a SESSION attach only (see
24324
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
24325
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
24326
+ * behind it, and every attach from an orchestrator older than the field — the
24327
+ * runner then names no source on the phase event.
24328
+ */
24329
+ sessionTrigger: SessionTriggerSchema.optional(),
24330
+ /**
24289
24331
  * WHICH root detector runs for this camera. The detection counterpart of
24290
24332
  * {@link motionSources}, same shape and same discipline: a per-camera list
24291
24333
  * of sources the system understands, vendor-agnostic, owned here.
@@ -30509,7 +30551,7 @@ var LocalInterfaceSchema = object({
30509
30551
  name: string(),
30510
30552
  family: _enum(["IPv4", "IPv6"]),
30511
30553
  address: string(),
30512
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
30554
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
30513
30555
  cidr: string(),
30514
30556
  /** OS netmask. Stable across calls so the SDK can hash on it. */
30515
30557
  netmask: string(),
@@ -30563,7 +30605,8 @@ var ConnectionEndpointSchema = object({
30563
30605
  "lan-ipv4",
30564
30606
  "lan-ipv6",
30565
30607
  "public",
30566
- "loopback"
30608
+ "loopback",
30609
+ "app-link"
30567
30610
  ]),
30568
30611
  /**
30569
30612
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30632,15 +30675,27 @@ var GetConnectionEndpointsResultSchema = object({
30632
30675
  localPort: AdvertisedLocalPortSchema
30633
30676
  });
30634
30677
  /**
30635
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
30636
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
30637
- * what AUTO currently picks, so the UI can show the effective value either way.
30678
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
30679
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
30680
+ * so the UI can show it either way.
30638
30681
  */
30639
30682
  var NotificationEndpointSchema = object({
30640
30683
  /** The operator's explicit choice, or null for AUTO. */
30641
30684
  baseUrl: string().nullable(),
30642
- /** What the ranking currently resolves to (null when nothing is reachable). */
30643
- resolved: string().nullable()
30685
+ /**
30686
+ * The effective flagged address: the explicit choice, else (AUTO) the
30687
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
30688
+ * answered the public tunnel / mesh here, or null.
30689
+ */
30690
+ resolved: string().nullable(),
30691
+ /**
30692
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
30693
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
30694
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
30695
+ * hub advertises neither; the app link is then minted without `hub=`.
30696
+ * Absent on a pre-D709 hub.
30697
+ */
30698
+ appLinkHub: string().nullable()
30644
30699
  });
30645
30700
  /**
30646
30701
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -30694,7 +30749,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30694
30749
  * Pass `'https'` when the caller is itself loaded over HTTPS
30695
30750
  * to avoid mixed-content blocks in the browser. The public
30696
30751
  * tunnel always emits `https://` regardless. */
30697
- scheme: _enum(["http", "https"]).optional()
30752
+ scheme: _enum(["http", "https"]).optional(),
30753
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
30754
+ * an address notification links can be flagged with, not a hub
30755
+ * route. Default `false`: racers and rankers never see it. */
30756
+ includeAppLink: boolean().optional()
30698
30757
  }), 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, {
30699
30758
  kind: "mutation",
30700
30759
  auth: "admin"
@@ -30955,7 +31014,7 @@ var MeshPeerSchema = object({
30955
31014
  tags: array(string()).readonly(),
30956
31015
  /** True when the peer advertises itself as an exit-node candidate. */
30957
31016
  exitNodeOption: boolean(),
30958
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
31017
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
30959
31018
  advertisedRoutes: array(string()).readonly(),
30960
31019
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
30961
31020
  userLogin: string().nullable(),
@@ -47905,12 +47964,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47905
47964
  {
47906
47965
  id: "addons",
47907
47966
  family: "system",
47908
- label: "Addons",
47909
- kinds: [
47910
- "addon-crash-loop",
47911
- "addon-update-available",
47912
- "addon-updated"
47913
- ]
47967
+ label: "Addons stopped",
47968
+ kinds: ["addon-crash-loop"]
47969
+ },
47970
+ {
47971
+ id: "addon-updates",
47972
+ family: "system",
47973
+ label: "Addon updates",
47974
+ kinds: ["addon-update-available", "addon-updated"]
47914
47975
  },
47915
47976
  {
47916
47977
  id: "updates",
@@ -48070,13 +48131,15 @@ var STATE_SUMMARY_SECTION_VARS = [
48070
48131
  },
48071
48132
  {
48072
48133
  name: "summaryAddons",
48073
- label: "Summary: addons",
48074
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
48075
- kinds: [
48076
- "addon-crash-loop",
48077
- "addon-update-available",
48078
- "addon-updated"
48079
- ]
48134
+ label: "Summary: addons stopped",
48135
+ example: "hub — recorder stopped after repeated crashes",
48136
+ kinds: ["addon-crash-loop"]
48137
+ },
48138
+ {
48139
+ name: "summaryAddonUpdates",
48140
+ label: "Summary: addon updates",
48141
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
48142
+ kinds: ["addon-update-available", "addon-updated"]
48080
48143
  },
48081
48144
  {
48082
48145
  name: "summaryUpdates",
@@ -48160,6 +48223,7 @@ var STATE_SUMMARY_VARS = [
48160
48223
  [...RULE_BODY_ONLY],
48161
48224
  [...RULE_TEXT],
48162
48225
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48226
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
48163
48227
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
48164
48228
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
48165
48229
  ([...RULE_TEXT], [...CONSUMABLE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.127",
3
+ "version": "1.2.128",
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",