@camstack/addon-post-analysis 1.2.337 → 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.
Files changed (15) hide show
  1. package/dist/{clip-model-registry-CD0UYoAb.mjs → clip-model-registry-BKVUtnRA.mjs} +299 -140
  2. package/dist/{clip-model-registry-CML1YOOa.js → clip-model-registry-DlJT7zn4.js} +299 -140
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DGaCYQ8R.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CF8ypDMO.mjs} +2 -2
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BImFB0o5.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BRmdbHeK.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-Dlhtn22B.mjs → hostInit-DYVlvRBm.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +494 -429
  11. package/dist/pipeline-analytics/index.mjs +494 -429
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D7NMYqUM.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-bIOxWlPv.mjs +0 -26
@@ -5451,7 +5451,7 @@ var ZodIssueCode = {
5451
5451
  var ZodFirstPartyTypeKind;
5452
5452
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5453
5453
  //#endregion
5454
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5454
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5455
5455
  /**
5456
5456
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5457
5457
  * window to float samples (D455).
@@ -19454,6 +19454,102 @@ var filesystemBrowseCapability = {
19454
19454
  })
19455
19455
  }
19456
19456
  };
19457
+ /** The central link domain the viewer app claims (Universal Links / App Links). */
19458
+ var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
19459
+ /** Where the hub serves the viewer SPA. */
19460
+ var HUB_VIEWER_MOUNT = "/viewer/camstack";
19461
+ /** True when `baseUrl` names the CamStack app link rather than a hub address. */
19462
+ function isAppLinkBase(baseUrl) {
19463
+ if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
19464
+ try {
19465
+ return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
19466
+ } catch {
19467
+ return false;
19468
+ }
19469
+ }
19470
+ /**
19471
+ * The base a viewer link is built on, from the flagged notification address:
19472
+ * the effective address is the explicit choice, else AUTO's `resolved`. The
19473
+ * one reading of that answer — the NC's tap and the Network page's preview
19474
+ * both go through it.
19475
+ */
19476
+ function viewerLinkBaseOf(endpoint) {
19477
+ const flagged = endpoint.baseUrl ?? endpoint.resolved;
19478
+ return isAppLinkBase(flagged) ? {
19479
+ form: "app",
19480
+ hubBaseUrl: endpoint.appLinkHub ?? null
19481
+ } : {
19482
+ form: "hub",
19483
+ hubBaseUrl: flagged
19484
+ };
19485
+ }
19486
+ /**
19487
+ * Reduce a base URL to the bare origin the central page accepts as `hub=`,
19488
+ * or `null` when it cannot be one: not http(s), carries credentials, or does
19489
+ * not parse. A path/query/fragment is dropped — the central page mounts the
19490
+ * viewer under the origin itself.
19491
+ */
19492
+ function toAppLinkHubOrigin(baseUrl) {
19493
+ let parsed;
19494
+ try {
19495
+ parsed = new URL(baseUrl);
19496
+ } catch {
19497
+ return null;
19498
+ }
19499
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
19500
+ if (parsed.username !== "" || parsed.password !== "") return null;
19501
+ if (parsed.hostname === "") return null;
19502
+ return parsed.origin;
19503
+ }
19504
+ /** The viewer route for a destination, or null when it names nothing. */
19505
+ function viewerRoute(destination) {
19506
+ switch (destination.kind) {
19507
+ case "camera": {
19508
+ if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
19509
+ const at = destination.atMs;
19510
+ return {
19511
+ path: `/camera/${String(destination.deviceId)}`,
19512
+ query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
19513
+ };
19514
+ }
19515
+ case "events": return {
19516
+ path: "/events",
19517
+ query: []
19518
+ };
19519
+ case "notifications": return {
19520
+ path: "/notifications",
19521
+ query: []
19522
+ };
19523
+ }
19524
+ }
19525
+ function encodeQuery(query) {
19526
+ if (query.length === 0) return "";
19527
+ return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
19528
+ }
19529
+ /**
19530
+ * The link for a viewer destination, or `null` when none can be minted: an
19531
+ * unknown destination, or the `hub` form with no reachable base (a dead link
19532
+ * is worse than none).
19533
+ */
19534
+ function buildViewerLink(input) {
19535
+ const route = viewerRoute(input.destination);
19536
+ if (route === null) return null;
19537
+ const raw = input.base.hubBaseUrl;
19538
+ const base = raw === null ? "" : raw.replace(/\/+$/, "");
19539
+ if (input.base.form === "app") {
19540
+ const origin = base === "" ? null : toAppLinkHubOrigin(base);
19541
+ const query = origin === null ? route.query : [...route.query, ["hub", origin]];
19542
+ return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
19543
+ }
19544
+ if (base === "" || isAppLinkBase(base)) return null;
19545
+ return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
19546
+ }
19547
+ var HUB_ADDRESS_ROLES = [
19548
+ "appConnections",
19549
+ "notificationTaps",
19550
+ "internal",
19551
+ "publicEndpoint"
19552
+ ];
19457
19553
  /**
19458
19554
  * Transport bounds for AI capability methods.
19459
19555
  *
@@ -24629,7 +24725,13 @@ var NcAlarmModeDelaysListSchema = array(object({
24629
24725
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
24630
24726
  * is the one that starts the entry delay — the entry-delay notification already names it.
24631
24727
  */
24632
- 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()
24633
24735
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
24634
24736
  var NcAlarmModeDelaysEditListSchema = array(object({
24635
24737
  mode: AlarmArmModeSchema,
@@ -24642,7 +24744,9 @@ var NcAlarmModeDelaysEditListSchema = array(object({
24642
24744
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24643
24745
  notifyDuringEntryDelay: boolean().nullable().optional(),
24644
24746
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
24645
- 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()
24646
24750
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
24647
24751
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
24648
24752
  var NcAlarmNonBlockingEditSchema = object({
@@ -34531,96 +34635,6 @@ var videoclipsCapability = {
34531
34635
  })
34532
34636
  }
34533
34637
  };
34534
- /** The central link domain the viewer app claims (Universal Links / App Links). */
34535
- var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
34536
- /** Where the hub serves the viewer SPA. */
34537
- var HUB_VIEWER_MOUNT = "/viewer/camstack";
34538
- /** True when `baseUrl` names the CamStack app link rather than a hub address. */
34539
- function isAppLinkBase(baseUrl) {
34540
- if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
34541
- try {
34542
- return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
34543
- } catch {
34544
- return false;
34545
- }
34546
- }
34547
- /**
34548
- * The base a viewer link is built on, from the flagged notification address:
34549
- * the effective address is the explicit choice, else AUTO's `resolved`. The
34550
- * one reading of that answer — the NC's tap and the Network page's preview
34551
- * both go through it.
34552
- */
34553
- function viewerLinkBaseOf(endpoint) {
34554
- const flagged = endpoint.baseUrl ?? endpoint.resolved;
34555
- return isAppLinkBase(flagged) ? {
34556
- form: "app",
34557
- hubBaseUrl: endpoint.appLinkHub ?? null
34558
- } : {
34559
- form: "hub",
34560
- hubBaseUrl: flagged
34561
- };
34562
- }
34563
- /**
34564
- * Reduce a base URL to the bare origin the central page accepts as `hub=`,
34565
- * or `null` when it cannot be one: not http(s), carries credentials, or does
34566
- * not parse. A path/query/fragment is dropped — the central page mounts the
34567
- * viewer under the origin itself.
34568
- */
34569
- function toAppLinkHubOrigin(baseUrl) {
34570
- let parsed;
34571
- try {
34572
- parsed = new URL(baseUrl);
34573
- } catch {
34574
- return null;
34575
- }
34576
- if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
34577
- if (parsed.username !== "" || parsed.password !== "") return null;
34578
- if (parsed.hostname === "") return null;
34579
- return parsed.origin;
34580
- }
34581
- /** The viewer route for a destination, or null when it names nothing. */
34582
- function viewerRoute(destination) {
34583
- switch (destination.kind) {
34584
- case "camera": {
34585
- if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
34586
- const at = destination.atMs;
34587
- return {
34588
- path: `/camera/${String(destination.deviceId)}`,
34589
- query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
34590
- };
34591
- }
34592
- case "events": return {
34593
- path: "/events",
34594
- query: []
34595
- };
34596
- case "notifications": return {
34597
- path: "/notifications",
34598
- query: []
34599
- };
34600
- }
34601
- }
34602
- function encodeQuery(query) {
34603
- if (query.length === 0) return "";
34604
- return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
34605
- }
34606
- /**
34607
- * The link for a viewer destination, or `null` when none can be minted: an
34608
- * unknown destination, or the `hub` form with no reachable base (a dead link
34609
- * is worse than none).
34610
- */
34611
- function buildViewerLink(input) {
34612
- const route = viewerRoute(input.destination);
34613
- if (route === null) return null;
34614
- const raw = input.base.hubBaseUrl;
34615
- const base = raw === null ? "" : raw.replace(/\/+$/, "");
34616
- if (input.base.form === "app") {
34617
- const origin = base === "" ? null : toAppLinkHubOrigin(base);
34618
- const query = origin === null ? route.query : [...route.query, ["hub", origin]];
34619
- return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
34620
- }
34621
- if (base === "" || isAppLinkBase(base)) return null;
34622
- return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
34623
- }
34624
34638
  /**
34625
34639
  * Optional client-side hints sent at session creation to help the provider
34626
34640
  * pick the best native source. All fields optional — a viewer that knows
@@ -35096,6 +35110,35 @@ var webrtcSessionCapability = {
35096
35110
  alive: boolean()
35097
35111
  })),
35098
35112
  /**
35113
+ * The viewer's downlink probe, for ONE live session (D733).
35114
+ *
35115
+ * The player measures `/adaptive-probe` after the session's first decoded
35116
+ * frame (D635). It used to act on the reading itself, by opening a SECOND
35117
+ * session with `hints.downlinkMbps` — every adaptive live open became two
35118
+ * sessions, two ICE + DTLS handshakes and two server pipelines. It now
35119
+ * hands the measurement to the session it already has; the provider picks
35120
+ * the rung exactly as it would from an offer's hints (same viewport
35121
+ * ceiling) and moves the session there — in place when the negotiated
35122
+ * codec carries the new rendition, by the existing re-offer
35123
+ * (`getSessionState.pendingRenegotiation`) when it cannot.
35124
+ *
35125
+ * A MEASUREMENT, never a tier: the client does not choose. A probe only
35126
+ * raises the rung; lowering it stays the ladder's call on delivery.
35127
+ * `held` answers why nothing moved (`not-adaptive`, `pinned`,
35128
+ * `already-there`, `recorded`, …) — a client that gets ANY answer must not
35129
+ * fall back to a reconnect; only a provider that does not know the method
35130
+ * (an older hub) leaves the client its legacy second session.
35131
+ */
35132
+ applyDownlinkProbe: method(object({
35133
+ deviceId: number().int().nonnegative(),
35134
+ sessionId: string(),
35135
+ downlinkMbps: number().nonnegative()
35136
+ }), object({
35137
+ outcome: _enum(["switching", "held"]),
35138
+ tier: CamProfileSchema.nullable(),
35139
+ reason: string()
35140
+ }), { kind: "mutation" }),
35141
+ /**
35099
35142
  * The SERVER's half of the stream-debug overlay, for one live session.
35100
35143
  *
35101
35144
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -39346,7 +39389,8 @@ var ConnectionEndpointSchema = object({
39346
39389
  "lan-ipv6",
39347
39390
  "public",
39348
39391
  "loopback",
39349
- "app-link"
39392
+ "app-link",
39393
+ "custom"
39350
39394
  ]),
39351
39395
  /**
39352
39396
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39415,7 +39459,7 @@ var GetConnectionEndpointsResultSchema = object({
39415
39459
  localPort: AdvertisedLocalPortSchema
39416
39460
  });
39417
39461
  /**
39418
- * The address flagged for notification links. `baseUrl: null` = AUTO, which
39462
+ * The address flagged for notification taps (`notificationTaps`). `baseUrl: null` = AUTO, which
39419
39463
  * since D709 is the CamStack app link; `resolved` reports the effective value,
39420
39464
  * so the UI can show it either way.
39421
39465
  */
@@ -39449,13 +39493,12 @@ var ViewerEndpointsSchema = object({
39449
39493
  resolved: array(string()).readonly()
39450
39494
  });
39451
39495
  /**
39452
- * One audience's hub address (see `hub-address.ts`): the operator's stored
39453
- * override, the address in use, and where it came from.
39496
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
39497
+ * for addons built against it): `cluster` is the `internal` role, `browser`
39498
+ * the `publicEndpoint` role; `override` is the flagged address.
39454
39499
  */
39455
39500
  var HubAddressSnapshotSchema = object({
39456
- /** The operator's override, or null for automatic. */
39457
39501
  override: string().nullable(),
39458
- /** The address in use, or null when nothing qualifies (never loopback). */
39459
39502
  resolved: string().nullable(),
39460
39503
  source: _enum([
39461
39504
  "override",
@@ -39464,11 +39507,57 @@ var HubAddressSnapshotSchema = object({
39464
39507
  ])
39465
39508
  });
39466
39509
  var HubAddressesSchema = object({
39467
- /** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
39468
39510
  cluster: HubAddressSnapshotSchema,
39469
- /** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
39470
39511
  browser: HubAddressSnapshotSchema
39471
39512
  });
39513
+ /**
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.
39517
+ */
39518
+ var HubAddressRoleSchema = _enum(HUB_ADDRESS_ROLES);
39519
+ var RoleSourceSchema = _enum([
39520
+ "flagged",
39521
+ "auto",
39522
+ "none"
39523
+ ]);
39524
+ /** One single-valued role: the flagged address, the one in use, and why. */
39525
+ var HubAddressRoleResolutionSchema = object({
39526
+ /** The address carrying the flag, or null = automatic. */
39527
+ flagged: string().nullable(),
39528
+ /** The address in use, or null when nothing qualifies (never loopback). */
39529
+ resolved: string().nullable(),
39530
+ source: RoleSourceSchema
39531
+ });
39532
+ var HubAppConnectionsResolutionSchema = object({
39533
+ /** The addresses flagged `appConnections`, or empty = automatic. */
39534
+ flagged: array(string()).readonly(),
39535
+ /** What the apps race right now. */
39536
+ resolved: array(string()).readonly(),
39537
+ source: RoleSourceSchema
39538
+ });
39539
+ var HubAddressBookSchema = object({
39540
+ rows: array(ConnectionEndpointSchema.extend({
39541
+ /** In the hub's detected palette right now. */
39542
+ detected: boolean(),
39543
+ /** Entered by the operator (removable). */
39544
+ custom: boolean(),
39545
+ /** The roles explicitly flagged on this address. */
39546
+ flags: array(HubAddressRoleSchema).readonly(),
39547
+ /** The roles this address serves right now — flagged or automatic. */
39548
+ inUse: array(HubAddressRoleSchema).readonly(),
39549
+ /** The roles this address may be flagged with. */
39550
+ eligible: array(HubAddressRoleSchema).readonly()
39551
+ })).readonly(),
39552
+ roles: object({
39553
+ appConnections: HubAppConnectionsResolutionSchema,
39554
+ notificationTaps: HubAddressRoleResolutionSchema,
39555
+ internal: HubAddressRoleResolutionSchema,
39556
+ publicEndpoint: HubAddressRoleResolutionSchema
39557
+ }),
39558
+ /** The `hub=` an app link carries (D709), or null. */
39559
+ appLinkHub: string().nullable()
39560
+ });
39472
39561
  var AllowedAddressesSchema = object({
39473
39562
  /**
39474
39563
  * Allowlist of interface addresses operators have explicitly opted
@@ -39559,19 +39648,18 @@ var localNetworkCapability = {
39559
39648
  * tunnel always emits `https://` regardless. */
39560
39649
  scheme: _enum(["http", "https"]).optional(),
39561
39650
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39562
- * an address notification links can be flagged with, not a hub
39651
+ * an address notification taps can be flagged with, not a hub
39563
39652
  * route. Default `false`: racers and rankers never see it. */
39564
39653
  includeAppLink: boolean().optional()
39565
39654
  }), GetConnectionEndpointsResultSchema),
39566
39655
  /**
39567
- * The address notification links are flagged with. `baseUrl: null` means
39568
- * AUTO, which is the CamStack app link (D709): viewer taps go through
39569
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39570
- * hub address the palette lists can be flagged instead; then viewer taps,
39571
- * attachment links and action buttons all use it. Signed media and
39572
- * buttons never use the app link — with it flagged (or AUTO) they keep
39573
- * the ranked hub ladder (a configured origin, a connected tunnel, then
39574
- * 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.
39575
39663
  *
39576
39664
  * Why an explicit marker: the automatic ranking cannot know which of
39577
39665
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -39581,46 +39669,80 @@ var localNetworkCapability = {
39581
39669
  */
39582
39670
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
39583
39671
  /**
39584
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
39585
- * AUTO. The value is stored verbatim (not an index into the candidate
39586
- * list): interfaces come and go, and an index would silently re-point at a
39587
- * different address after a reboot.
39672
+ * @deprecated Use `setAddressRole({ role: 'notificationTaps', … })`. It
39673
+ * writes the same `notificationTaps` flag, with the same validation. `baseUrl: null` restores automatic; an
39674
+ * address that is not detected becomes a custom address.
39588
39675
  */
39589
39676
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39590
39677
  /**
39591
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
39592
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
39593
- * never mesh, never loopback. `resolved` is that set (or the operator's
39594
- * explicit subset) as it stands right now.
39678
+ * The `appConnections` role as shipped apps read it: the flagged addresses
39679
+ * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
39680
+ * the public tunnel, never IPv6, mesh, loopback or a custom address.
39681
+ * `resolved` is the set as it stands right now; the custom ones in it are
39682
+ * also in `getConnectionEndpoints`, which the apps filter by it.
39595
39683
  */
39596
39684
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
39597
39685
  /**
39598
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
39599
- * verbatim (not indices) so a temporarily-down tunnel is not silently
39600
- * dropped from the operator's choice.
39686
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
39687
+ * replaces the same `appConnections` flags.
39688
+ * Empty `baseUrls` restores automatic.
39601
39689
  */
39602
39690
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
39603
39691
  /**
39604
- * The hub's address for each audience — agents (`cluster`) and sign-in
39605
- * links (`browser`) — as every consumer must read it: the operator's
39606
- * override when set, else the automatic pick from this cap's palette,
39607
- * never loopback. The ONE answer to "at which address is this hub
39608
- * reached?"; there is no environment variable for it.
39692
+ * The Network page's Addresses table and every role's answer — the ONE
39693
+ * reading of "which address is this hub reached at, for what": detected
39694
+ * endpoints and custom addresses with their role flags, and per role the
39695
+ * flagged address, the one in use and whether it is automatic. Agent
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.
39609
39702
  */
39610
- getHubAddresses: method(_void(), HubAddressesSchema),
39703
+ getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
39611
39704
  /**
39612
- * Set or clear (`baseUrl: null`) one audience's override. Validated: an
39613
- * http(s) origin with a host, no credentials, no path, never loopback —
39614
- * an invalid value is refused with the reason, nothing is stored.
39705
+ * Add a custom address. Validated: an http(s) origin with a host, no
39706
+ * credentials, no path, never loopback — an invalid one is refused with
39707
+ * the reason and nothing is stored. Adding an address that already exists
39708
+ * only updates its label.
39615
39709
  */
39616
- setHubAddress: method(object({
39617
- audience: _enum(["cluster", "browser"]),
39618
- baseUrl: string().nullable()
39619
- }), HubAddressesSchema, {
39710
+ addCustomAddress: method(object({
39711
+ baseUrl: string(),
39712
+ label: string().max(80)
39713
+ }), HubAddressBookSchema, {
39714
+ kind: "mutation",
39715
+ auth: "admin"
39716
+ }),
39717
+ /** Remove a custom address. Its role flags go with it (those roles turn automatic). */
39718
+ removeCustomAddress: method(object({ baseUrl: string() }), HubAddressBookSchema, {
39719
+ kind: "mutation",
39720
+ auth: "admin"
39721
+ }),
39722
+ /**
39723
+ * Flag (`enabled: true`) or unflag an address for a role. For a
39724
+ * single-valued role, flagging moves the flag off every other address.
39725
+ * `baseUrl: null` returns the role to automatic. The address must be a row
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.
39729
+ */
39730
+ setAddressRole: method(object({
39731
+ role: HubAddressRoleSchema,
39732
+ baseUrl: string().nullable(),
39733
+ enabled: boolean(),
39734
+ acceptInsecureHttp: boolean().optional()
39735
+ }), HubAddressBookSchema, {
39620
39736
  kind: "mutation",
39621
39737
  auth: "admin"
39622
39738
  }),
39623
39739
  /**
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.
39743
+ */
39744
+ getHubAddresses: method(_void(), HubAddressesSchema),
39745
+ /**
39624
39746
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
39625
39747
  * by the admin UI's address selector to seed its checkbox state.
39626
39748
  */
@@ -51633,12 +51755,24 @@ Object.freeze({
51633
51755
  addonId: null,
51634
51756
  access: "view"
51635
51757
  },
51758
+ "localNetwork.addCustomAddress": {
51759
+ capName: "local-network",
51760
+ capScope: "system",
51761
+ addonId: null,
51762
+ access: "create"
51763
+ },
51636
51764
  "localNetwork.downloadCa": {
51637
51765
  capName: "local-network",
51638
51766
  capScope: "system",
51639
51767
  addonId: null,
51640
51768
  access: "view"
51641
51769
  },
51770
+ "localNetwork.getAddresses": {
51771
+ capName: "local-network",
51772
+ capScope: "system",
51773
+ addonId: null,
51774
+ access: "view"
51775
+ },
51642
51776
  "localNetwork.getAllowedAddresses": {
51643
51777
  capName: "local-network",
51644
51778
  capScope: "system",
@@ -51693,6 +51827,12 @@ Object.freeze({
51693
51827
  addonId: null,
51694
51828
  access: "create"
51695
51829
  },
51830
+ "localNetwork.removeCustomAddress": {
51831
+ capName: "local-network",
51832
+ capScope: "system",
51833
+ addonId: null,
51834
+ access: "delete"
51835
+ },
51696
51836
  "localNetwork.resetAllowlistToBestMatch": {
51697
51837
  capName: "local-network",
51698
51838
  capScope: "system",
@@ -51705,13 +51845,13 @@ Object.freeze({
51705
51845
  addonId: null,
51706
51846
  access: "create"
51707
51847
  },
51708
- "localNetwork.setAllowedAddresses": {
51848
+ "localNetwork.setAddressRole": {
51709
51849
  capName: "local-network",
51710
51850
  capScope: "system",
51711
51851
  addonId: null,
51712
51852
  access: "create"
51713
51853
  },
51714
- "localNetwork.setHubAddress": {
51854
+ "localNetwork.setAllowedAddresses": {
51715
51855
  capName: "local-network",
51716
51856
  capScope: "system",
51717
51857
  addonId: null,
@@ -55965,6 +56105,12 @@ Object.freeze({
55965
56105
  addonId: null,
55966
56106
  access: "create"
55967
56107
  },
56108
+ "webrtcSession.applyDownlinkProbe": {
56109
+ capName: "webrtc-session",
56110
+ capScope: "device",
56111
+ addonId: null,
56112
+ access: "create"
56113
+ },
55968
56114
  "webrtcSession.closeSession": {
55969
56115
  capName: "webrtc-session",
55970
56116
  capScope: "device",
@@ -60063,6 +60209,11 @@ Object.freeze({
60063
60209
  form: "single",
60064
60210
  optional: false
60065
60211
  }],
60212
+ "webrtcSession.applyDownlinkProbe": [{
60213
+ name: "deviceId",
60214
+ form: "single",
60215
+ optional: false
60216
+ }],
60066
60217
  "webrtcSession.closeSession": [{
60067
60218
  name: "deviceId",
60068
60219
  form: "single",
@@ -60870,17 +61021,23 @@ var NC_ALARM_DELAY_FIELDS = [
60870
61021
  * all read this one constant.
60871
61022
  */
60872
61023
  var NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC = 30;
60873
- var NC_ALARM_NOTIFY_FIELDS = ["notifyDuringEntryDelay", "notifySensorRewatched"];
61024
+ var NC_ALARM_NOTIFY_FIELDS = [
61025
+ "notifyDuringEntryDelay",
61026
+ "notifySensorRewatched",
61027
+ "notifySensorIgnored"
61028
+ ];
60874
61029
  /**
60875
61030
  * The switches `mode` runs on. There is no global value: absent is OFF (operator decision
60876
61031
  * 2026-10-06 — the entry-delay notification is the only one by default, and "watched again"
60877
- * 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.
60878
61034
  */
60879
61035
  function resolveModeNotifyPolicy(settings, mode) {
60880
61036
  const entry = (settings.modeDelays ?? []).find((e) => e.mode === mode);
60881
61037
  return {
60882
61038
  notifyDuringEntryDelay: entry?.notifyDuringEntryDelay === true,
60883
- notifySensorRewatched: entry?.notifySensorRewatched === true
61039
+ notifySensorRewatched: entry?.notifySensorRewatched === true,
61040
+ notifySensorIgnored: entry?.notifySensorIgnored === true
60884
61041
  };
60885
61042
  }
60886
61043
  /**
@@ -60957,6 +61114,7 @@ function applyModeDelaysEdits(current, edits) {
60957
61114
  const schedule = editedSchedule(base.schedule, edit.schedule);
60958
61115
  const duringEntry = editedFlag(base.notifyDuringEntryDelay, edit.notifyDuringEntryDelay);
60959
61116
  const rewatched = editedFlag(base.notifySensorRewatched, edit.notifySensorRewatched);
61117
+ const ignored = editedFlag(base.notifySensorIgnored, edit.notifySensorIgnored);
60960
61118
  if (exit !== void 0) next.exitDelaySec = exit;
60961
61119
  if (entry !== void 0) next.entryDelaySec = entry;
60962
61120
  if (triggered !== void 0) next.triggeredDurationSec = triggered;
@@ -60964,10 +61122,11 @@ function applyModeDelaysEdits(current, edits) {
60964
61122
  if (schedule !== void 0) next.schedule = schedule;
60965
61123
  if (duringEntry !== void 0) next.notifyDuringEntryDelay = duringEntry;
60966
61124
  if (rewatched !== void 0) next.notifySensorRewatched = rewatched;
61125
+ if (ignored !== void 0) next.notifySensorIgnored = ignored;
60967
61126
  if (at >= 0) out[at] = next;
60968
61127
  else out.push(next);
60969
61128
  }
60970
- 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);
60971
61130
  }
60972
61131
  /**
60973
61132
  * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers