@camstack/types 1.2.310 → 1.2.311

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/index.js CHANGED
@@ -16234,24 +16234,24 @@ function buildViewerLink(input) {
16234
16234
  //#endregion
16235
16235
  //#region src/capabilities/hub-address.ts
16236
16236
  var HUB_ADDRESS_ROLES = [
16237
- "viewer",
16238
- "notifications",
16239
- "agents",
16240
- "signIn"
16237
+ "appConnections",
16238
+ "notificationTaps",
16239
+ "internal",
16240
+ "publicEndpoint"
16241
16241
  ];
16242
16242
  var SINGLE_HUB_ADDRESS_ROLES = [
16243
- "notifications",
16244
- "agents",
16245
- "signIn"
16243
+ "notificationTaps",
16244
+ "internal",
16245
+ "publicEndpoint"
16246
16246
  ];
16247
16247
  function isSingleHubAddressRole(role) {
16248
- return role !== "viewer";
16248
+ return role !== "appConnections";
16249
16249
  }
16250
16250
  var AUTOMATIC_HUB_ADDRESS_FLAGS = {
16251
- viewer: [],
16252
- notifications: null,
16253
- agents: null,
16254
- signIn: null
16251
+ appConnections: [],
16252
+ notificationTaps: null,
16253
+ internal: null,
16254
+ publicEndpoint: null
16255
16255
  };
16256
16256
  var IPV4_LITERAL = /^\d{1,3}(?:\.\d{1,3}){3}$/;
16257
16257
  function hostnameOf(baseUrl) {
@@ -16283,7 +16283,7 @@ function isLanIpv4Literal(endpoint) {
16283
16283
  function autoRankFor(role, endpoint) {
16284
16284
  if (endpoint.kind === "loopback" || endpoint.kind === "app-link" || endpoint.kind === "custom") return null;
16285
16285
  if (hostnameOf(endpoint.baseUrl) === null) return null;
16286
- if (role === "agents") {
16286
+ if (role === "internal") {
16287
16287
  if (isLanIpv4Literal(endpoint)) return 0;
16288
16288
  if (isPlausibleLan(endpoint)) return 1;
16289
16289
  if (isMesh(endpoint)) return 2;
@@ -16353,28 +16353,28 @@ function validateCustomAddress(raw) {
16353
16353
  baseUrl: parsed.origin
16354
16354
  };
16355
16355
  }
16356
- /** The reason a plain-http sign-in address is refused unless accepted. */
16357
- var SIGN_IN_HTTP_REASON = "Sign-in needs an https:// address: passkeys and most identity providers refuse a plain-http origin. Accept http only for a sign-in that never leaves your own network.";
16356
+ /** The reason a plain-http public endpoint is refused unless accepted. */
16357
+ var PUBLIC_ENDPOINT_HTTP_REASON = "The public endpoint needs an https:// address: passkeys and most identity providers refuse a plain-http origin. Accept http only when sign-in and notification links never leave your own network.";
16358
16358
  /**
16359
16359
  * May `baseUrl` carry `role`? The address check above, plus two role rules:
16360
- * the app link carries `notifications` only (it is not a hub address), and a
16361
- * plain-http address carries `signIn` only when the operator explicitly
16362
- * accepted it (`acceptInsecureHttp`) — a LAN-only password or magic-link
16363
- * sign-in works over http, a passkey or an OIDC callback does not.
16360
+ * the app link carries `notificationTaps` only (it is not a hub address), and
16361
+ * a plain-http address carries `publicEndpoint` only when the operator
16362
+ * explicitly accepted it (`acceptInsecureHttp`) — a LAN-only password or
16363
+ * magic-link sign-in works over http, a passkey or an OIDC callback does not.
16364
16364
  */
16365
16365
  function checkRoleAddress(role, baseUrl, options = {}) {
16366
- if (isAppLinkBase(baseUrl)) return role === "notifications" ? {
16366
+ if (isAppLinkBase(baseUrl)) return role === "notificationTaps" ? {
16367
16367
  ok: true,
16368
16368
  baseUrl: CAMSTACK_APP_LINK_ORIGIN
16369
16369
  } : {
16370
16370
  ok: false,
16371
- reason: "The CamStack app link is not a hub address — only notifications can use it."
16371
+ reason: "The CamStack app link is not a hub address — only notification taps can use it."
16372
16372
  };
16373
16373
  const check = validateCustomAddress(baseUrl);
16374
16374
  if (!check.ok) return check;
16375
- if (role === "signIn" && check.baseUrl.startsWith("http:") && options.acceptInsecureHttp !== true) return {
16375
+ if (role === "publicEndpoint" && check.baseUrl.startsWith("http:") && options.acceptInsecureHttp !== true) return {
16376
16376
  ok: false,
16377
- reason: SIGN_IN_HTTP_REASON
16377
+ reason: PUBLIC_ENDPOINT_HTTP_REASON
16378
16378
  };
16379
16379
  return check;
16380
16380
  }
@@ -16409,17 +16409,21 @@ function resolveHubRole(endpoints, role, flag) {
16409
16409
  source: auto === null ? "none" : "auto"
16410
16410
  };
16411
16411
  }
16412
- /** `agents`: what agents and LAN devices pull from. */
16413
- function resolveAgentsAddress(endpoints, flags) {
16414
- return resolveHubRole(endpoints, "agents", flags.agents);
16412
+ /** `internal`: what agents and LAN devices download from. */
16413
+ function resolveInternalAddress(endpoints, flags) {
16414
+ return resolveHubRole(endpoints, "internal", flags.internal);
16415
16415
  }
16416
- /** `signIn`: sign-in links, OIDC callbacks, the relying party, OAuth2. */
16417
- function resolveSignInAddress(endpoints, flags) {
16418
- return resolveHubRole(endpoints, "signIn", flags.signIn);
16416
+ /**
16417
+ * `publicEndpoint`: every URL that must work off the LAN — sign-in links, OIDC
16418
+ * / OAuth2 callbacks, the relying party, and notification buttons,
16419
+ * attachments, media and admin links.
16420
+ */
16421
+ function resolvePublicEndpoint(endpoints, flags) {
16422
+ return resolveHubRole(endpoints, "publicEndpoint", flags.publicEndpoint);
16419
16423
  }
16420
- /** `notifications`: the flagged address, else the CamStack app link (D709). */
16421
- function resolveNotificationsAddress(flags) {
16422
- const flagged = validFlag("notifications", flags.notifications);
16424
+ /** `notificationTaps`: the flagged address, else the CamStack app link (D709). */
16425
+ function resolveNotificationTapAddress(flags) {
16426
+ const flagged = validFlag("notificationTaps", flags.notificationTaps);
16423
16427
  if (flagged !== null && !isAppLinkBase(flagged)) return {
16424
16428
  flagged,
16425
16429
  resolved: flagged,
@@ -16431,46 +16435,47 @@ function resolveNotificationsAddress(flags) {
16431
16435
  source: "auto"
16432
16436
  };
16433
16437
  }
16434
- /** AUTO viewer race: LAN IPv4 + the public tunnel. Never IPv6, mesh, loopback or custom. */
16435
- function isDefaultViewerEndpoint(endpoint) {
16438
+ /** AUTO app connections: LAN IPv4 + the public tunnel. Never IPv6, mesh, loopback or custom. */
16439
+ function isDefaultAppConnectionEndpoint(endpoint) {
16436
16440
  if (endpoint.kind === "lan-ipv4") return true;
16437
16441
  return endpoint.kind === "public" && endpoint.interfaceKind === "public";
16438
16442
  }
16439
16443
  /**
16440
16444
  * The endpoints the apps race: the flagged ones that are in `endpoints`
16441
- * (which carries the custom addresses flagged `viewer`), else AUTO. A flagged
16445
+ * (which carries the custom addresses flagged `appConnections`), else AUTO. A flagged
16442
16446
  * set none of which is currently up falls back to AUTO rather than racing
16443
16447
  * nothing.
16444
16448
  */
16445
- function selectViewerEndpoints(endpoints, flags) {
16446
- const auto = endpoints.filter(isDefaultViewerEndpoint);
16447
- if (flags.viewer.length === 0) return auto;
16448
- const wanted = new Set(flags.viewer);
16449
+ function selectAppConnectionEndpoints(endpoints, flags) {
16450
+ const auto = endpoints.filter(isDefaultAppConnectionEndpoint);
16451
+ if (flags.appConnections.length === 0) return auto;
16452
+ const wanted = new Set(flags.appConnections);
16449
16453
  const explicit = endpoints.filter((e) => wanted.has(e.baseUrl));
16450
16454
  return explicit.length > 0 ? explicit : auto;
16451
16455
  }
16452
- /** `viewer`: what the apps race and connect to. */
16453
- function resolveViewerAddresses(endpoints, flags) {
16454
- const wanted = new Set(flags.viewer);
16455
- const selected = selectViewerEndpoints(endpoints, flags);
16456
+ /** `appConnections`: what the apps try when connecting. */
16457
+ function resolveAppConnections(endpoints, flags) {
16458
+ const wanted = new Set(flags.appConnections);
16459
+ const selected = selectAppConnectionEndpoints(endpoints, flags);
16456
16460
  const usedFlags = selected.some((e) => wanted.has(e.baseUrl));
16457
16461
  return {
16458
- flagged: flags.viewer,
16462
+ flagged: flags.appConnections,
16459
16463
  resolved: selected.map((e) => e.baseUrl),
16460
16464
  source: selected.length === 0 ? "none" : usedFlags ? "flagged" : "auto"
16461
16465
  };
16462
16466
  }
16463
16467
  /**
16464
- * Every role at once, each through its own resolver. `viewerPalette` is what
16465
- * the apps race (it carries the custom addresses flagged `viewer`);
16466
- * `hubPalette` is the detected HTTPS palette agents and sign-in resolve over.
16468
+ * Every role at once, each through its own resolver. `appPalette` is what
16469
+ * the apps race (it carries the custom addresses flagged `appConnections`);
16470
+ * `hubPalette` is the detected HTTPS palette `internal` and `publicEndpoint`
16471
+ * resolve over.
16467
16472
  */
16468
- function resolveHubAddressRoles(viewerPalette, hubPalette, flags) {
16473
+ function resolveHubAddressRoles(appPalette, hubPalette, flags) {
16469
16474
  return {
16470
- viewer: resolveViewerAddresses(viewerPalette, flags),
16471
- notifications: resolveNotificationsAddress(flags),
16472
- agents: resolveAgentsAddress(hubPalette, flags),
16473
- signIn: resolveSignInAddress(hubPalette, flags)
16475
+ appConnections: resolveAppConnections(appPalette, flags),
16476
+ notificationTaps: resolveNotificationTapAddress(flags),
16477
+ internal: resolveInternalAddress(hubPalette, flags),
16478
+ publicEndpoint: resolvePublicEndpoint(hubPalette, flags)
16474
16479
  };
16475
16480
  }
16476
16481
  /** The bare hostname of a base URL, or `null` when it does not parse. */
@@ -22275,7 +22280,13 @@ var NcAlarmModeDelaysSchema = zod.z.object({
22275
22280
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
22276
22281
  * is the one that starts the entry delay — the entry-delay notification already names it.
22277
22282
  */
22278
- notifySensorRewatched: zod.z.boolean().optional()
22283
+ notifySensorRewatched: zod.z.boolean().optional(),
22284
+ /**
22285
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
22286
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
22287
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
22288
+ */
22289
+ notifySensorIgnored: zod.z.boolean().optional()
22279
22290
  });
22280
22291
  var NcAlarmModeDelaysListSchema = zod.z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
22281
22292
  /**
@@ -22294,7 +22305,9 @@ var NcAlarmModeDelaysEditSchema = zod.z.object({
22294
22305
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
22295
22306
  notifyDuringEntryDelay: zod.z.boolean().nullable().optional(),
22296
22307
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
22297
- notifySensorRewatched: zod.z.boolean().nullable().optional()
22308
+ notifySensorRewatched: zod.z.boolean().nullable().optional(),
22309
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
22310
+ notifySensorIgnored: zod.z.boolean().nullable().optional()
22298
22311
  });
22299
22312
  var NcAlarmModeDelaysEditListSchema = zod.z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
22300
22313
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
@@ -38040,7 +38053,7 @@ var GetConnectionEndpointsResultSchema = zod.z.object({
38040
38053
  localPort: AdvertisedLocalPortSchema
38041
38054
  });
38042
38055
  /**
38043
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
38056
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
38044
38057
  * since D709 is the CamStack app link; `resolved` reports the effective value,
38045
38058
  * so the UI can show it either way.
38046
38059
  */
@@ -38075,8 +38088,8 @@ var ViewerEndpointsSchema = zod.z.object({
38075
38088
  });
38076
38089
  /**
38077
38090
  * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
38078
- * one release for addons built against it): `cluster` is the `agents` role,
38079
- * `browser` the `signIn` role; `override` is the flagged address.
38091
+ * for addons built against it): `cluster` is the `internal` role, `browser`
38092
+ * the `publicEndpoint` role; `override` is the flagged address.
38080
38093
  */
38081
38094
  var HubAddressSnapshotSchema = zod.z.object({
38082
38095
  override: zod.z.string().nullable(),
@@ -38092,15 +38105,11 @@ var HubAddressesSchema = zod.z.object({
38092
38105
  browser: HubAddressSnapshotSchema
38093
38106
  });
38094
38107
  /**
38095
- * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
38096
- * `notifications`, `agents` and `signIn` are carried by at most one address.
38108
+ * What an address is used for (`hub-address.ts`, D734). `appConnections` is
38109
+ * many-valued; `notificationTaps`, `publicEndpoint` and `internal` are carried
38110
+ * by at most one address.
38097
38111
  */
38098
- var HubAddressRoleSchema = zod.z.enum([
38099
- "viewer",
38100
- "notifications",
38101
- "agents",
38102
- "signIn"
38103
- ]);
38112
+ var HubAddressRoleSchema = zod.z.enum(HUB_ADDRESS_ROLES);
38104
38113
  var RoleSourceSchema = zod.z.enum([
38105
38114
  "flagged",
38106
38115
  "auto",
@@ -38114,8 +38123,8 @@ var HubAddressRoleResolutionSchema = zod.z.object({
38114
38123
  resolved: zod.z.string().nullable(),
38115
38124
  source: RoleSourceSchema
38116
38125
  });
38117
- var HubViewerResolutionSchema = zod.z.object({
38118
- /** The addresses flagged `viewer`, or empty = automatic. */
38126
+ var HubAppConnectionsResolutionSchema = zod.z.object({
38127
+ /** The addresses flagged `appConnections`, or empty = automatic. */
38119
38128
  flagged: zod.z.array(zod.z.string()).readonly(),
38120
38129
  /** What the apps race right now. */
38121
38130
  resolved: zod.z.array(zod.z.string()).readonly(),
@@ -38141,10 +38150,10 @@ var HubAddressRowSchema = ConnectionEndpointSchema.extend({
38141
38150
  var HubAddressBookSchema = zod.z.object({
38142
38151
  rows: zod.z.array(HubAddressRowSchema).readonly(),
38143
38152
  roles: zod.z.object({
38144
- viewer: HubViewerResolutionSchema,
38145
- notifications: HubAddressRoleResolutionSchema,
38146
- agents: HubAddressRoleResolutionSchema,
38147
- signIn: HubAddressRoleResolutionSchema
38153
+ appConnections: HubAppConnectionsResolutionSchema,
38154
+ notificationTaps: HubAddressRoleResolutionSchema,
38155
+ internal: HubAddressRoleResolutionSchema,
38156
+ publicEndpoint: HubAddressRoleResolutionSchema
38148
38157
  }),
38149
38158
  /** The `hub=` an app link carries (D709), or null. */
38150
38159
  appLinkHub: zod.z.string().nullable()
@@ -38239,19 +38248,18 @@ var localNetworkCapability = {
38239
38248
  * tunnel always emits `https://` regardless. */
38240
38249
  scheme: zod.z.enum(["http", "https"]).optional(),
38241
38250
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
38242
- * an address notification links can be flagged with, not a hub
38251
+ * an address notification taps can be flagged with, not a hub
38243
38252
  * route. Default `false`: racers and rankers never see it. */
38244
38253
  includeAppLink: zod.z.boolean().optional()
38245
38254
  }), GetConnectionEndpointsResultSchema),
38246
38255
  /**
38247
- * The address notification links are flagged with. `baseUrl: null` means
38248
- * AUTO, which is the CamStack app link (D709): viewer taps go through
38249
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
38250
- * hub address the palette lists can be flagged instead; then viewer taps,
38251
- * attachment links and action buttons all use it. Signed media and
38252
- * buttons never use the app link — with it flagged (or AUTO) they keep
38253
- * the ranked hub ladder (a configured origin, a connected tunnel, then
38254
- * the LAN), never loopback.
38256
+ * The `notificationTaps` role (D734): where TAPPING a notification opens.
38257
+ * `baseUrl: null` means AUTO, which is the CamStack app link (D709): taps
38258
+ * go through `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the
38259
+ * app. Any hub address the palette lists can be flagged instead; then a
38260
+ * tap opens that address. Only the tap: action buttons, attachment /
38261
+ * media links and admin links follow the `publicEndpoint` role
38262
+ * (`getAddresses().roles.publicEndpoint`), never this one.
38255
38263
  *
38256
38264
  * Why an explicit marker: the automatic ranking cannot know which of
38257
38265
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -38261,14 +38269,13 @@ var localNetworkCapability = {
38261
38269
  */
38262
38270
  getNotificationEndpoint: require_sleep.method(zod.z.void(), NotificationEndpointSchema),
38263
38271
  /**
38264
- * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
38265
- * an older admin UI keeps working: it writes the same `notifications`
38266
- * flag, with the same validation. `baseUrl: null` restores automatic; an
38272
+ * @deprecated Use `setAddressRole({ role: 'notificationTaps', … })`. It
38273
+ * writes the same `notificationTaps` flag, with the same validation. `baseUrl: null` restores automatic; an
38267
38274
  * address that is not detected becomes a custom address.
38268
38275
  */
38269
38276
  setNotificationEndpoint: require_sleep.method(zod.z.object({ baseUrl: zod.z.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
38270
38277
  /**
38271
- * The `viewer` role as shipped apps read it: the flagged addresses
38278
+ * The `appConnections` role as shipped apps read it: the flagged addresses
38272
38279
  * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
38273
38280
  * the public tunnel, never IPv6, mesh, loopback or a custom address.
38274
38281
  * `resolved` is the set as it stands right now; the custom ones in it are
@@ -38276,8 +38283,8 @@ var localNetworkCapability = {
38276
38283
  */
38277
38284
  getViewerEndpoints: require_sleep.method(zod.z.void(), ViewerEndpointsSchema),
38278
38285
  /**
38279
- * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
38280
- * older admin UI keeps working: it replaces the same `viewer` flags.
38286
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
38287
+ * replaces the same `appConnections` flags.
38281
38288
  * Empty `baseUrls` restores automatic.
38282
38289
  */
38283
38290
  setViewerEndpoints: require_sleep.method(zod.z.object({ baseUrls: zod.z.array(zod.z.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
@@ -38286,10 +38293,12 @@ var localNetworkCapability = {
38286
38293
  * reading of "which address is this hub reached at, for what": detected
38287
38294
  * endpoints and custom addresses with their role flags, and per role the
38288
38295
  * flagged address, the one in use and whether it is automatic. Agent
38289
- * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
38290
- * here; nothing ranks the palette itself. `scheme` is the one the caller
38291
- * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
38292
- * always resolved over the HTTPS palette.
38296
+ * deliveries and LAN devices read `roles.internal`; sign-in, OAuth2 and
38297
+ * the notification centre's buttons / media / admin links read
38298
+ * `roles.publicEndpoint`; nothing ranks the palette itself. `scheme` is
38299
+ * the one the caller shows LAN rows in (as `getConnectionEndpoints`);
38300
+ * `internal` and `publicEndpoint` are always resolved over the HTTPS
38301
+ * palette.
38293
38302
  */
38294
38303
  getAddresses: require_sleep.method(zod.z.object({ scheme: zod.z.enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
38295
38304
  /**
@@ -38314,8 +38323,9 @@ var localNetworkCapability = {
38314
38323
  * Flag (`enabled: true`) or unflag an address for a role. For a
38315
38324
  * single-valued role, flagging moves the flag off every other address.
38316
38325
  * `baseUrl: null` returns the role to automatic. The address must be a row
38317
- * of the table (detected, custom, or the app link for notifications);
38318
- * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
38326
+ * of the table (detected, custom, or the app link for `notificationTaps`);
38327
+ * `publicEndpoint` on a plain-http address is refused unless
38328
+ * `acceptInsecureHttp`, and never takes the app link.
38319
38329
  */
38320
38330
  setAddressRole: require_sleep.method(zod.z.object({
38321
38331
  role: HubAddressRoleSchema,
@@ -38327,9 +38337,9 @@ var localNetworkCapability = {
38327
38337
  auth: "admin"
38328
38338
  }),
38329
38339
  /**
38330
- * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
38331
- * release so an addon built against the D729 amendment keeps resolving:
38332
- * `cluster` = the `agents` role, `browser` = the `signIn` role.
38340
+ * @deprecated Read `getAddresses().roles.internal` / `.publicEndpoint`.
38341
+ * Kept so an addon built against the D729 amendment keeps resolving:
38342
+ * `cluster` = the `internal` role, `browser` = the `publicEndpoint` role.
38333
38343
  */
38334
38344
  getHubAddresses: require_sleep.method(zod.z.void(), HubAddressesSchema),
38335
38345
  /**
@@ -68907,17 +68917,23 @@ var NC_ALARM_DELAY_FIELDS = [
68907
68917
  * all read this one constant.
68908
68918
  */
68909
68919
  var NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = 30;
68910
- var NC_ALARM_NOTIFY_FIELDS = ["notifyDuringEntryDelay", "notifySensorRewatched"];
68920
+ var NC_ALARM_NOTIFY_FIELDS = [
68921
+ "notifyDuringEntryDelay",
68922
+ "notifySensorRewatched",
68923
+ "notifySensorIgnored"
68924
+ ];
68911
68925
  /**
68912
68926
  * The switches `mode` runs on. There is no global value: absent is OFF (operator decision
68913
68927
  * 2026-10-06 — the entry-delay notification is the only one by default, and "watched again"
68914
- * is not sent). An answer from an older hub carries no switch and reads as off.
68928
+ * is not sent; 2026-10-07 — nor is "ignored", D735). An answer from an older hub carries no
68929
+ * switch and reads as off.
68915
68930
  */
68916
68931
  function resolveModeNotifyPolicy(settings, mode) {
68917
68932
  const entry = (settings.modeDelays ?? []).find((e) => e.mode === mode);
68918
68933
  return {
68919
68934
  notifyDuringEntryDelay: entry?.notifyDuringEntryDelay === true,
68920
- notifySensorRewatched: entry?.notifySensorRewatched === true
68935
+ notifySensorRewatched: entry?.notifySensorRewatched === true,
68936
+ notifySensorIgnored: entry?.notifySensorIgnored === true
68921
68937
  };
68922
68938
  }
68923
68939
  /**
@@ -69009,6 +69025,7 @@ function applyModeDelaysEdits(current, edits) {
69009
69025
  const schedule = editedSchedule(base.schedule, edit.schedule);
69010
69026
  const duringEntry = editedFlag(base.notifyDuringEntryDelay, edit.notifyDuringEntryDelay);
69011
69027
  const rewatched = editedFlag(base.notifySensorRewatched, edit.notifySensorRewatched);
69028
+ const ignored = editedFlag(base.notifySensorIgnored, edit.notifySensorIgnored);
69012
69029
  if (exit !== void 0) next.exitDelaySec = exit;
69013
69030
  if (entry !== void 0) next.entryDelaySec = entry;
69014
69031
  if (triggered !== void 0) next.triggeredDurationSec = triggered;
@@ -69016,10 +69033,11 @@ function applyModeDelaysEdits(current, edits) {
69016
69033
  if (schedule !== void 0) next.schedule = schedule;
69017
69034
  if (duringEntry !== void 0) next.notifyDuringEntryDelay = duringEntry;
69018
69035
  if (rewatched !== void 0) next.notifySensorRewatched = rewatched;
69036
+ if (ignored !== void 0) next.notifySensorIgnored = ignored;
69019
69037
  if (at >= 0) out[at] = next;
69020
69038
  else out.push(next);
69021
69039
  }
69022
- 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);
69040
+ 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);
69023
69041
  }
69024
69042
  /**
69025
69043
  * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
@@ -74891,6 +74909,7 @@ exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
74891
74909
  exports.PRIVACY_MASK_CAP_NAME = PRIVACY_MASK_CAP_NAME;
74892
74910
  exports.PROVIDER_KIND_CAP_NAMES = PROVIDER_KIND_CAP_NAMES;
74893
74911
  exports.PROVIDER_PIN_FIELD = require_sleep.PROVIDER_PIN_FIELD;
74912
+ exports.PUBLIC_ENDPOINT_HTTP_REASON = PUBLIC_ENDPOINT_HTTP_REASON;
74894
74913
  exports.PYTHON_SCRIPT = PYTHON_SCRIPT;
74895
74914
  exports.PackageUpdateSchema = PackageUpdateSchema;
74896
74915
  exports.PackageVersionInfoSchema = PackageVersionInfoSchema;
@@ -75076,7 +75095,6 @@ exports.SCOPE_PRESETS = SCOPE_PRESETS;
75076
75095
  exports.SENSOR_FEATURES = SENSOR_FEATURES;
75077
75096
  exports.SENSOR_MAP = SENSOR_MAP;
75078
75097
  exports.SHARE_VIEW_KINDS = require_sleep.SHARE_VIEW_KINDS;
75079
- exports.SIGN_IN_HTTP_REASON = SIGN_IN_HTTP_REASON;
75080
75098
  exports.SINGLE_HUB_ADDRESS_ROLES = SINGLE_HUB_ADDRESS_ROLES;
75081
75099
  exports.SOURCE_CAPS = require_composition.SOURCE_CAPS;
75082
75100
  exports.SOURCE_CAP_ACTIVE_FIELD = require_composition.SOURCE_CAP_ACTIVE_FIELD;
@@ -75660,7 +75678,7 @@ exports.isBatteryPresenceFault = isBatteryPresenceFault;
75660
75678
  exports.isClusterScopedStep = isClusterScopedStep;
75661
75679
  exports.isCollectionArrayMethod = isCollectionArrayMethod;
75662
75680
  exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
75663
- exports.isDefaultViewerEndpoint = isDefaultViewerEndpoint;
75681
+ exports.isDefaultAppConnectionEndpoint = isDefaultAppConnectionEndpoint;
75664
75682
  exports.isDeployableToAgent = isDeployableToAgent;
75665
75683
  exports.isDetectionMacroClass = isDetectionMacroClass;
75666
75684
  exports.isDeviceConfigCap = require_sleep.isDeviceConfigCap;
@@ -75867,7 +75885,7 @@ exports.resetPoolBaseline = resetPoolBaseline;
75867
75885
  exports.resolveAddonExecution = resolveAddonExecution;
75868
75886
  exports.resolveAddonGroup = resolveAddonGroup;
75869
75887
  exports.resolveAddonPlacement = resolveAddonPlacement;
75870
- exports.resolveAgentsAddress = resolveAgentsAddress;
75888
+ exports.resolveAppConnections = resolveAppConnections;
75871
75889
  exports.resolveBucketMs = resolveBucketMs;
75872
75890
  exports.resolveCapMount = require_sleep.resolveCapMount;
75873
75891
  exports.resolveClipSearchMinScore = resolveClipSearchMinScore;
@@ -75883,22 +75901,22 @@ exports.resolveExportProfiles = resolveExportProfiles;
75883
75901
  exports.resolveFormat = resolveFormat;
75884
75902
  exports.resolveHubAddressRoles = resolveHubAddressRoles;
75885
75903
  exports.resolveHydratedFieldValue = require_sleep.resolveHydratedFieldValue;
75904
+ exports.resolveInternalAddress = resolveInternalAddress;
75886
75905
  exports.resolveLocationIcon = resolveLocationIcon;
75887
75906
  exports.resolveLocationMode = resolveLocationMode;
75888
75907
  exports.resolveMethodAuth = resolveMethodAuth;
75889
75908
  exports.resolveModeDelays = resolveModeDelays;
75890
75909
  exports.resolveModeNotifyPolicy = resolveModeNotifyPolicy;
75891
75910
  exports.resolveMutate = resolveMutate;
75892
- exports.resolveNotificationsAddress = resolveNotificationsAddress;
75911
+ exports.resolveNotificationTapAddress = resolveNotificationTapAddress;
75893
75912
  exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
75913
+ exports.resolvePublicEndpoint = resolvePublicEndpoint;
75894
75914
  exports.resolveRecordingProfiles = resolveRecordingProfiles;
75895
75915
  exports.resolveRootSupply = resolveRootSupply;
75896
75916
  exports.resolveRunnerId = resolveRunnerId;
75897
- exports.resolveSignInAddress = resolveSignInAddress;
75898
75917
  exports.resolveStreamMaps = require_composition.resolveStreamMaps;
75899
75918
  exports.resolveVariantModelId = resolveVariantModelId;
75900
75919
  exports.resolveViewableDeviceIds = resolveViewableDeviceIds;
75901
- exports.resolveViewerAddresses = resolveViewerAddresses;
75902
75920
  exports.roleSpec = roleSpec;
75903
75921
  exports.roomCompositionExample = roomCompositionExample;
75904
75922
  exports.rootSuppliesOf = rootSuppliesOf;
@@ -75931,8 +75949,8 @@ exports.scoreRuntimes = scoreRuntimes;
75931
75949
  exports.scriptRunnerCapability = scriptRunnerCapability;
75932
75950
  exports.searchDisplayIcons = searchDisplayIcons;
75933
75951
  exports.secureActuationFor = secureActuationFor;
75952
+ exports.selectAppConnectionEndpoints = selectAppConnectionEndpoints;
75934
75953
  exports.selectAssignedProfileSlots = require_sleep.selectAssignedProfileSlots;
75935
- exports.selectViewerEndpoints = selectViewerEndpoints;
75936
75954
  exports.sendTimesForEditor = sendTimesForEditor;
75937
75955
  exports.sendTimesOfSchedule = sendTimesOfSchedule;
75938
75956
  exports.sensorRaisedOf = sensorRaisedOf;