@camstack/addon-post-analysis 1.2.338 → 1.2.339

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.
@@ -19544,6 +19544,12 @@ function buildViewerLink(input) {
19544
19544
  if (base === "" || isAppLinkBase(base)) return null;
19545
19545
  return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
19546
19546
  }
19547
+ var HUB_ADDRESS_ROLES = [
19548
+ "appConnections",
19549
+ "notificationTaps",
19550
+ "internal",
19551
+ "publicEndpoint"
19552
+ ];
19547
19553
  /**
19548
19554
  * Transport bounds for AI capability methods.
19549
19555
  *
@@ -24719,7 +24725,13 @@ var NcAlarmModeDelaysListSchema = array(object({
24719
24725
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
24720
24726
  * is the one that starts the entry delay — the entry-delay notification already names it.
24721
24727
  */
24722
- notifySensorRewatched: boolean().optional()
24728
+ notifySensorRewatched: boolean().optional(),
24729
+ /**
24730
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
24731
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
24732
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
24733
+ */
24734
+ notifySensorIgnored: boolean().optional()
24723
24735
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
24724
24736
  var NcAlarmModeDelaysEditListSchema = array(object({
24725
24737
  mode: AlarmArmModeSchema,
@@ -24732,7 +24744,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
24732
24744
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24733
24745
  notifyDuringEntryDelay: boolean().nullable().optional(),
24734
24746
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24735
- notifySensorRewatched: boolean().nullable().optional()
24747
+ notifySensorRewatched: boolean().nullable().optional(),
24748
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
24749
+ notifySensorIgnored: boolean().nullable().optional()
24736
24750
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
24737
24751
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
24738
24752
  var NcAlarmNonBlockingEditSchema = object({
@@ -39445,7 +39459,7 @@ var GetConnectionEndpointsResultSchema = object({
39445
39459
  localPort: AdvertisedLocalPortSchema
39446
39460
  });
39447
39461
  /**
39448
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
39462
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
39449
39463
  * since D709 is the CamStack app link; `resolved` reports the effective value,
39450
39464
  * so the UI can show it either way.
39451
39465
  */
@@ -39480,8 +39494,8 @@ var ViewerEndpointsSchema = object({
39480
39494
  });
39481
39495
  /**
39482
39496
  * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
39483
- * one release for addons built against it): `cluster` is the `agents` role,
39484
- * `browser` the `signIn` role; `override` is the flagged address.
39497
+ * for addons built against it): `cluster` is the `internal` role, `browser`
39498
+ * the `publicEndpoint` role; `override` is the flagged address.
39485
39499
  */
39486
39500
  var HubAddressSnapshotSchema = object({
39487
39501
  override: string().nullable(),
@@ -39497,15 +39511,11 @@ var HubAddressesSchema = object({
39497
39511
  browser: HubAddressSnapshotSchema
39498
39512
  });
39499
39513
  /**
39500
- * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
39501
- * `notifications`, `agents` and `signIn` are carried by at most one address.
39514
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
39515
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
39516
+ * by at most one address.
39502
39517
  */
39503
- var HubAddressRoleSchema = _enum([
39504
- "viewer",
39505
- "notifications",
39506
- "agents",
39507
- "signIn"
39508
- ]);
39518
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
39509
39519
  var RoleSourceSchema = _enum([
39510
39520
  "flagged",
39511
39521
  "auto",
@@ -39519,8 +39529,8 @@ var HubAddressRoleResolutionSchema = object({
39519
39529
  resolved: string().nullable(),
39520
39530
  source: RoleSourceSchema
39521
39531
  });
39522
- var HubViewerResolutionSchema = object({
39523
- /** The addresses flagged `viewer`, or empty = automatic. */
39532
+ var HubAppConnectionsResolutionSchema = object({
39533
+ /** The addresses flagged `appConnections`, or empty = automatic. */
39524
39534
  flagged: array(string()).readonly(),
39525
39535
  /** What the apps race right now. */
39526
39536
  resolved: array(string()).readonly(),
@@ -39540,10 +39550,10 @@ var HubAddressBookSchema = object({
39540
39550
  eligible: array(HubAddressRoleSchema).readonly()
39541
39551
  })).readonly(),
39542
39552
  roles: object({
39543
- viewer: HubViewerResolutionSchema,
39544
- notifications: HubAddressRoleResolutionSchema,
39545
- agents: HubAddressRoleResolutionSchema,
39546
- signIn: HubAddressRoleResolutionSchema
39553
+ appConnections: HubAppConnectionsResolutionSchema,
39554
+ notificationTaps: HubAddressRoleResolutionSchema,
39555
+ internal: HubAddressRoleResolutionSchema,
39556
+ publicEndpoint: HubAddressRoleResolutionSchema
39547
39557
  }),
39548
39558
  /** The `hub=` an app link carries (D709), or null. */
39549
39559
  appLinkHub: string().nullable()
@@ -39638,19 +39648,18 @@ var localNetworkCapability = {
39638
39648
  * tunnel always emits `https://` regardless. */
39639
39649
  scheme: _enum(["http", "https"]).optional(),
39640
39650
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39641
- * an address notification links can be flagged with, not a hub
39651
+ * an address notification taps can be flagged with, not a hub
39642
39652
  * route. Default `false`: racers and rankers never see it. */
39643
39653
  includeAppLink: boolean().optional()
39644
39654
  }), GetConnectionEndpointsResultSchema),
39645
39655
  /**
39646
- * The address notification links are flagged with. `baseUrl: null` means
39647
- * AUTO, which is the CamStack app link (D709): viewer taps go through
39648
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39649
- * hub address the palette lists can be flagged instead; then viewer taps,
39650
- * attachment links and action buttons all use it. Signed media and
39651
- * buttons never use the app link — with it flagged (or AUTO) they keep
39652
- * the ranked hub ladder (a configured origin, a connected tunnel, then
39653
- * the LAN), never loopback.
39656
+ * The `notificationTaps` role (D734): where TAPPING a notification opens.
39657
+ * `baseUrl: null` means AUTO, which is the CamStack app link (D709): taps
39658
+ * go through `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the
39659
+ * app. Any hub address the palette lists can be flagged instead; then a
39660
+ * tap opens that address. Only the tap: action buttons, attachment /
39661
+ * media links and admin links follow the `publicEndpoint` role
39662
+ * (`getAddresses().roles.publicEndpoint`), never this one.
39654
39663
  *
39655
39664
  * Why an explicit marker: the automatic ranking cannot know which of
39656
39665
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -39660,14 +39669,13 @@ var localNetworkCapability = {
39660
39669
  */
39661
39670
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
39662
39671
  /**
39663
- * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
39664
- * an older admin UI keeps working: it writes the same `notifications`
39665
- * flag, with the same validation. `baseUrl: null` restores automatic; an
39672
+ * @deprecated Use `setAddressRole({ role: 'notificationTaps', … })`. It
39673
+ * writes the same `notificationTaps` flag, with the same validation. `baseUrl: null` restores automatic; an
39666
39674
  * address that is not detected becomes a custom address.
39667
39675
  */
39668
39676
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39669
39677
  /**
39670
- * The `viewer` role as shipped apps read it: the flagged addresses
39678
+ * The `appConnections` role as shipped apps read it: the flagged addresses
39671
39679
  * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
39672
39680
  * the public tunnel, never IPv6, mesh, loopback or a custom address.
39673
39681
  * `resolved` is the set as it stands right now; the custom ones in it are
@@ -39675,8 +39683,8 @@ var localNetworkCapability = {
39675
39683
  */
39676
39684
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
39677
39685
  /**
39678
- * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
39679
- * older admin UI keeps working: it replaces the same `viewer` flags.
39686
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
39687
+ * replaces the same `appConnections` flags.
39680
39688
  * Empty `baseUrls` restores automatic.
39681
39689
  */
39682
39690
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
@@ -39685,10 +39693,12 @@ var localNetworkCapability = {
39685
39693
  * reading of "which address is this hub reached at, for what": detected
39686
39694
  * endpoints and custom addresses with their role flags, and per role the
39687
39695
  * flagged address, the one in use and whether it is automatic. Agent
39688
- * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
39689
- * here; nothing ranks the palette itself. `scheme` is the one the caller
39690
- * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
39691
- * always resolved over the HTTPS palette.
39696
+ * deliveries and LAN devices read `roles.internal`; sign-in, OAuth2 and
39697
+ * the notification centre's buttons / media / admin links read
39698
+ * `roles.publicEndpoint`; nothing ranks the palette itself. `scheme` is
39699
+ * the one the caller shows LAN rows in (as `getConnectionEndpoints`);
39700
+ * `internal` and `publicEndpoint` are always resolved over the HTTPS
39701
+ * palette.
39692
39702
  */
39693
39703
  getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
39694
39704
  /**
@@ -39713,8 +39723,9 @@ var localNetworkCapability = {
39713
39723
  * Flag (`enabled: true`) or unflag an address for a role. For a
39714
39724
  * single-valued role, flagging moves the flag off every other address.
39715
39725
  * `baseUrl: null` returns the role to automatic. The address must be a row
39716
- * of the table (detected, custom, or the app link for notifications);
39717
- * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
39726
+ * of the table (detected, custom, or the app link for `notificationTaps`);
39727
+ * `publicEndpoint` on a plain-http address is refused unless
39728
+ * `acceptInsecureHttp`, and never takes the app link.
39718
39729
  */
39719
39730
  setAddressRole: method(object({
39720
39731
  role: HubAddressRoleSchema,
@@ -39726,9 +39737,9 @@ var localNetworkCapability = {
39726
39737
  auth: "admin"
39727
39738
  }),
39728
39739
  /**
39729
- * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
39730
- * release so an addon built against the D729 amendment keeps resolving:
39731
- * `cluster` = the `agents` role, `browser` = the `signIn` role.
39740
+ * @deprecated Read `getAddresses().roles.internal` / `.publicEndpoint`.
39741
+ * Kept so an addon built against the D729 amendment keeps resolving:
39742
+ * `cluster` = the `internal` role, `browser` = the `publicEndpoint` role.
39732
39743
  */
39733
39744
  getHubAddresses: method(_void(), HubAddressesSchema),
39734
39745
  /**
@@ -61010,17 +61021,23 @@ var NC_ALARM_DELAY_FIELDS = [
61010
61021
  * all read this one constant.
61011
61022
  */
61012
61023
  var NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = 30;
61013
- var NC_ALARM_NOTIFY_FIELDS = ["notifyDuringEntryDelay", "notifySensorRewatched"];
61024
+ var NC_ALARM_NOTIFY_FIELDS = [
61025
+ "notifyDuringEntryDelay",
61026
+ "notifySensorRewatched",
61027
+ "notifySensorIgnored"
61028
+ ];
61014
61029
  /**
61015
61030
  * The switches `mode` runs on. There is no global value: absent is OFF (operator decision
61016
61031
  * 2026-10-06 — the entry-delay notification is the only one by default, and "watched again"
61017
- * is not sent). An answer from an older hub carries no switch and reads as off.
61032
+ * is not sent; 2026-10-07 — nor is "ignored", D735). An answer from an older hub carries no
61033
+ * switch and reads as off.
61018
61034
  */
61019
61035
  function resolveModeNotifyPolicy(settings, mode) {
61020
61036
  const entry = (settings.modeDelays ?? []).find((e) => e.mode === mode);
61021
61037
  return {
61022
61038
  notifyDuringEntryDelay: entry?.notifyDuringEntryDelay === true,
61023
- notifySensorRewatched: entry?.notifySensorRewatched === true
61039
+ notifySensorRewatched: entry?.notifySensorRewatched === true,
61040
+ notifySensorIgnored: entry?.notifySensorIgnored === true
61024
61041
  };
61025
61042
  }
61026
61043
  /**
@@ -61097,6 +61114,7 @@ function applyModeDelaysEdits(current, edits) {
61097
61114
  const schedule = editedSchedule(base.schedule, edit.schedule);
61098
61115
  const duringEntry = editedFlag(base.notifyDuringEntryDelay, edit.notifyDuringEntryDelay);
61099
61116
  const rewatched = editedFlag(base.notifySensorRewatched, edit.notifySensorRewatched);
61117
+ const ignored = editedFlag(base.notifySensorIgnored, edit.notifySensorIgnored);
61100
61118
  if (exit !== void 0) next.exitDelaySec = exit;
61101
61119
  if (entry !== void 0) next.entryDelaySec = entry;
61102
61120
  if (triggered !== void 0) next.triggeredDurationSec = triggered;
@@ -61104,10 +61122,11 @@ function applyModeDelaysEdits(current, edits) {
61104
61122
  if (schedule !== void 0) next.schedule = schedule;
61105
61123
  if (duringEntry !== void 0) next.notifyDuringEntryDelay = duringEntry;
61106
61124
  if (rewatched !== void 0) next.notifySensorRewatched = rewatched;
61125
+ if (ignored !== void 0) next.notifySensorIgnored = ignored;
61107
61126
  if (at >= 0) out[at] = next;
61108
61127
  else out.push(next);
61109
61128
  }
61110
- return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0 || e.notifyDuringEntryDelay !== void 0 || e.notifySensorRewatched !== void 0);
61129
+ return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0 || e.notifyDuringEntryDelay !== void 0 || e.notifySensorRewatched !== void 0 || e.notifySensorIgnored !== void 0);
61111
61130
  }
61112
61131
  /**
61113
61132
  * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
@@ -19575,6 +19575,12 @@ function buildViewerLink(input) {
19575
19575
  if (base === "" || isAppLinkBase(base)) return null;
19576
19576
  return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
19577
19577
  }
19578
+ var HUB_ADDRESS_ROLES = [
19579
+ "appConnections",
19580
+ "notificationTaps",
19581
+ "internal",
19582
+ "publicEndpoint"
19583
+ ];
19578
19584
  /**
19579
19585
  * Transport bounds for AI capability methods.
19580
19586
  *
@@ -24750,7 +24756,13 @@ var NcAlarmModeDelaysListSchema = array(object({
24750
24756
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
24751
24757
  * is the one that starts the entry delay — the entry-delay notification already names it.
24752
24758
  */
24753
- notifySensorRewatched: boolean().optional()
24759
+ notifySensorRewatched: boolean().optional(),
24760
+ /**
24761
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
24762
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
24763
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
24764
+ */
24765
+ notifySensorIgnored: boolean().optional()
24754
24766
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
24755
24767
  var NcAlarmModeDelaysEditListSchema = array(object({
24756
24768
  mode: AlarmArmModeSchema,
@@ -24763,7 +24775,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
24763
24775
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24764
24776
  notifyDuringEntryDelay: boolean().nullable().optional(),
24765
24777
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24766
- notifySensorRewatched: boolean().nullable().optional()
24778
+ notifySensorRewatched: boolean().nullable().optional(),
24779
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
24780
+ notifySensorIgnored: boolean().nullable().optional()
24767
24781
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
24768
24782
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
24769
24783
  var NcAlarmNonBlockingEditSchema = object({
@@ -39476,7 +39490,7 @@ var GetConnectionEndpointsResultSchema = object({
39476
39490
  localPort: AdvertisedLocalPortSchema
39477
39491
  });
39478
39492
  /**
39479
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
39493
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
39480
39494
  * since D709 is the CamStack app link; `resolved` reports the effective value,
39481
39495
  * so the UI can show it either way.
39482
39496
  */
@@ -39511,8 +39525,8 @@ var ViewerEndpointsSchema = object({
39511
39525
  });
39512
39526
  /**
39513
39527
  * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
39514
- * one release for addons built against it): `cluster` is the `agents` role,
39515
- * `browser` the `signIn` role; `override` is the flagged address.
39528
+ * for addons built against it): `cluster` is the `internal` role, `browser`
39529
+ * the `publicEndpoint` role; `override` is the flagged address.
39516
39530
  */
39517
39531
  var HubAddressSnapshotSchema = object({
39518
39532
  override: string().nullable(),
@@ -39528,15 +39542,11 @@ var HubAddressesSchema = object({
39528
39542
  browser: HubAddressSnapshotSchema
39529
39543
  });
39530
39544
  /**
39531
- * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
39532
- * `notifications`, `agents` and `signIn` are carried by at most one address.
39545
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
39546
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
39547
+ * by at most one address.
39533
39548
  */
39534
- var HubAddressRoleSchema = _enum([
39535
- "viewer",
39536
- "notifications",
39537
- "agents",
39538
- "signIn"
39539
- ]);
39549
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
39540
39550
  var RoleSourceSchema = _enum([
39541
39551
  "flagged",
39542
39552
  "auto",
@@ -39550,8 +39560,8 @@ var HubAddressRoleResolutionSchema = object({
39550
39560
  resolved: string().nullable(),
39551
39561
  source: RoleSourceSchema
39552
39562
  });
39553
- var HubViewerResolutionSchema = object({
39554
- /** The addresses flagged `viewer`, or empty = automatic. */
39563
+ var HubAppConnectionsResolutionSchema = object({
39564
+ /** The addresses flagged `appConnections`, or empty = automatic. */
39555
39565
  flagged: array(string()).readonly(),
39556
39566
  /** What the apps race right now. */
39557
39567
  resolved: array(string()).readonly(),
@@ -39571,10 +39581,10 @@ var HubAddressBookSchema = object({
39571
39581
  eligible: array(HubAddressRoleSchema).readonly()
39572
39582
  })).readonly(),
39573
39583
  roles: object({
39574
- viewer: HubViewerResolutionSchema,
39575
- notifications: HubAddressRoleResolutionSchema,
39576
- agents: HubAddressRoleResolutionSchema,
39577
- signIn: HubAddressRoleResolutionSchema
39584
+ appConnections: HubAppConnectionsResolutionSchema,
39585
+ notificationTaps: HubAddressRoleResolutionSchema,
39586
+ internal: HubAddressRoleResolutionSchema,
39587
+ publicEndpoint: HubAddressRoleResolutionSchema
39578
39588
  }),
39579
39589
  /** The `hub=` an app link carries (D709), or null. */
39580
39590
  appLinkHub: string().nullable()
@@ -39669,19 +39679,18 @@ var localNetworkCapability = {
39669
39679
  * tunnel always emits `https://` regardless. */
39670
39680
  scheme: _enum(["http", "https"]).optional(),
39671
39681
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39672
- * an address notification links can be flagged with, not a hub
39682
+ * an address notification taps can be flagged with, not a hub
39673
39683
  * route. Default `false`: racers and rankers never see it. */
39674
39684
  includeAppLink: boolean().optional()
39675
39685
  }), GetConnectionEndpointsResultSchema),
39676
39686
  /**
39677
- * The address notification links are flagged with. `baseUrl: null` means
39678
- * AUTO, which is the CamStack app link (D709): viewer taps go through
39679
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39680
- * hub address the palette lists can be flagged instead; then viewer taps,
39681
- * attachment links and action buttons all use it. Signed media and
39682
- * buttons never use the app link — with it flagged (or AUTO) they keep
39683
- * the ranked hub ladder (a configured origin, a connected tunnel, then
39684
- * the LAN), never loopback.
39687
+ * The `notificationTaps` role (D734): where TAPPING a notification opens.
39688
+ * `baseUrl: null` means AUTO, which is the CamStack app link (D709): taps
39689
+ * go through `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the
39690
+ * app. Any hub address the palette lists can be flagged instead; then a
39691
+ * tap opens that address. Only the tap: action buttons, attachment /
39692
+ * media links and admin links follow the `publicEndpoint` role
39693
+ * (`getAddresses().roles.publicEndpoint`), never this one.
39685
39694
  *
39686
39695
  * Why an explicit marker: the automatic ranking cannot know which of
39687
39696
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -39691,14 +39700,13 @@ var localNetworkCapability = {
39691
39700
  */
39692
39701
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
39693
39702
  /**
39694
- * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
39695
- * an older admin UI keeps working: it writes the same `notifications`
39696
- * flag, with the same validation. `baseUrl: null` restores automatic; an
39703
+ * @deprecated Use `setAddressRole({ role: 'notificationTaps', … })`. It
39704
+ * writes the same `notificationTaps` flag, with the same validation. `baseUrl: null` restores automatic; an
39697
39705
  * address that is not detected becomes a custom address.
39698
39706
  */
39699
39707
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39700
39708
  /**
39701
- * The `viewer` role as shipped apps read it: the flagged addresses
39709
+ * The `appConnections` role as shipped apps read it: the flagged addresses
39702
39710
  * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
39703
39711
  * the public tunnel, never IPv6, mesh, loopback or a custom address.
39704
39712
  * `resolved` is the set as it stands right now; the custom ones in it are
@@ -39706,8 +39714,8 @@ var localNetworkCapability = {
39706
39714
  */
39707
39715
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
39708
39716
  /**
39709
- * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
39710
- * older admin UI keeps working: it replaces the same `viewer` flags.
39717
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
39718
+ * replaces the same `appConnections` flags.
39711
39719
  * Empty `baseUrls` restores automatic.
39712
39720
  */
39713
39721
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
@@ -39716,10 +39724,12 @@ var localNetworkCapability = {
39716
39724
  * reading of "which address is this hub reached at, for what": detected
39717
39725
  * endpoints and custom addresses with their role flags, and per role the
39718
39726
  * flagged address, the one in use and whether it is automatic. Agent
39719
- * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
39720
- * here; nothing ranks the palette itself. `scheme` is the one the caller
39721
- * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
39722
- * always resolved over the HTTPS palette.
39727
+ * deliveries and LAN devices read `roles.internal`; sign-in, OAuth2 and
39728
+ * the notification centre's buttons / media / admin links read
39729
+ * `roles.publicEndpoint`; nothing ranks the palette itself. `scheme` is
39730
+ * the one the caller shows LAN rows in (as `getConnectionEndpoints`);
39731
+ * `internal` and `publicEndpoint` are always resolved over the HTTPS
39732
+ * palette.
39723
39733
  */
39724
39734
  getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
39725
39735
  /**
@@ -39744,8 +39754,9 @@ var localNetworkCapability = {
39744
39754
  * Flag (`enabled: true`) or unflag an address for a role. For a
39745
39755
  * single-valued role, flagging moves the flag off every other address.
39746
39756
  * `baseUrl: null` returns the role to automatic. The address must be a row
39747
- * of the table (detected, custom, or the app link for notifications);
39748
- * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
39757
+ * of the table (detected, custom, or the app link for `notificationTaps`);
39758
+ * `publicEndpoint` on a plain-http address is refused unless
39759
+ * `acceptInsecureHttp`, and never takes the app link.
39749
39760
  */
39750
39761
  setAddressRole: method(object({
39751
39762
  role: HubAddressRoleSchema,
@@ -39757,9 +39768,9 @@ var localNetworkCapability = {
39757
39768
  auth: "admin"
39758
39769
  }),
39759
39770
  /**
39760
- * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
39761
- * release so an addon built against the D729 amendment keeps resolving:
39762
- * `cluster` = the `agents` role, `browser` = the `signIn` role.
39771
+ * @deprecated Read `getAddresses().roles.internal` / `.publicEndpoint`.
39772
+ * Kept so an addon built against the D729 amendment keeps resolving:
39773
+ * `cluster` = the `internal` role, `browser` = the `publicEndpoint` role.
39763
39774
  */
39764
39775
  getHubAddresses: method(_void(), HubAddressesSchema),
39765
39776
  /**
@@ -61041,17 +61052,23 @@ var NC_ALARM_DELAY_FIELDS = [
61041
61052
  * all read this one constant.
61042
61053
  */
61043
61054
  var NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = 30;
61044
- var NC_ALARM_NOTIFY_FIELDS = ["notifyDuringEntryDelay", "notifySensorRewatched"];
61055
+ var NC_ALARM_NOTIFY_FIELDS = [
61056
+ "notifyDuringEntryDelay",
61057
+ "notifySensorRewatched",
61058
+ "notifySensorIgnored"
61059
+ ];
61045
61060
  /**
61046
61061
  * The switches `mode` runs on. There is no global value: absent is OFF (operator decision
61047
61062
  * 2026-10-06 — the entry-delay notification is the only one by default, and "watched again"
61048
- * is not sent). An answer from an older hub carries no switch and reads as off.
61063
+ * is not sent; 2026-10-07 — nor is "ignored", D735). An answer from an older hub carries no
61064
+ * switch and reads as off.
61049
61065
  */
61050
61066
  function resolveModeNotifyPolicy(settings, mode) {
61051
61067
  const entry = (settings.modeDelays ?? []).find((e) => e.mode === mode);
61052
61068
  return {
61053
61069
  notifyDuringEntryDelay: entry?.notifyDuringEntryDelay === true,
61054
- notifySensorRewatched: entry?.notifySensorRewatched === true
61070
+ notifySensorRewatched: entry?.notifySensorRewatched === true,
61071
+ notifySensorIgnored: entry?.notifySensorIgnored === true
61055
61072
  };
61056
61073
  }
61057
61074
  /**
@@ -61128,6 +61145,7 @@ function applyModeDelaysEdits(current, edits) {
61128
61145
  const schedule = editedSchedule(base.schedule, edit.schedule);
61129
61146
  const duringEntry = editedFlag(base.notifyDuringEntryDelay, edit.notifyDuringEntryDelay);
61130
61147
  const rewatched = editedFlag(base.notifySensorRewatched, edit.notifySensorRewatched);
61148
+ const ignored = editedFlag(base.notifySensorIgnored, edit.notifySensorIgnored);
61131
61149
  if (exit !== void 0) next.exitDelaySec = exit;
61132
61150
  if (entry !== void 0) next.entryDelaySec = entry;
61133
61151
  if (triggered !== void 0) next.triggeredDurationSec = triggered;
@@ -61135,10 +61153,11 @@ function applyModeDelaysEdits(current, edits) {
61135
61153
  if (schedule !== void 0) next.schedule = schedule;
61136
61154
  if (duringEntry !== void 0) next.notifyDuringEntryDelay = duringEntry;
61137
61155
  if (rewatched !== void 0) next.notifySensorRewatched = rewatched;
61156
+ if (ignored !== void 0) next.notifySensorIgnored = ignored;
61138
61157
  if (at >= 0) out[at] = next;
61139
61158
  else out.push(next);
61140
61159
  }
61141
- return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0 || e.notifyDuringEntryDelay !== void 0 || e.notifySensorRewatched !== void 0);
61160
+ return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0 || e.postTriggeredAction !== void 0 || e.schedule !== void 0 || e.notifyDuringEntryDelay !== void 0 || e.notifySensorRewatched !== void 0 || e.notifySensorIgnored !== void 0);
61142
61161
  }
61143
61162
  /**
61144
61163
  * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-BcSLJ8aL.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-DlJT7zn4.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ci as normalizeNodeId, Jn as embeddingEncoderCapability, Or as parseProcStatus, Qn as embeddingRequirementsUnavailableError, Yn as embeddingModelFailedError, Zn as embeddingRequirementsFailedError, Zt as PoolMemoryWatchdog, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, hi as BaseAddon, i as CLIP_TEXT_MODELS, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, zr as resolvePoolMemoryPolicy } from "../clip-model-registry-BLUVLdlY.mjs";
1
+ import { Ci as normalizeNodeId, Jn as embeddingEncoderCapability, Or as parseProcStatus, Qn as embeddingRequirementsUnavailableError, Yn as embeddingModelFailedError, Zn as embeddingRequirementsFailedError, Zt as PoolMemoryWatchdog, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, hi as BaseAddon, i as CLIP_TEXT_MODELS, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, zr as resolvePoolMemoryPolicy } from "../clip-model-registry-BKVUtnRA.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -2,7 +2,7 @@ import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_i
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
3
  import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BRmdbHeK.mjs";
4
4
  import { n as m, r as h, t as g } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-Bm-iyjmq.mjs";
5
- import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3jDbheU.mjs";
5
+ import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BImFB0o5.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var v = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), y = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), b = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), x = (e) => {
8
8
  let t = b(e);
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.310",
21
+ version: "1.2.311",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.236",
36
+ version: "1.2.237",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",