@camstack/addon-osd-manager 0.1.175 → 0.1.176

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 (18) hide show
  1. package/dist/{MotionZonesSettings-CLHuPFP2.mjs → MotionZonesSettings-CPKsdj2c.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-msEoZGV4.mjs → PrivacyMaskSettings-Ctm1-2f1.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-CDMTyPOI.mjs → SceneMonitorEditor-CvSaLIzi.mjs} +3 -3
  4. package/dist/_stub.js +11 -11
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BOWRi4wx.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CKTxetEY.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BaCE42a6.mjs +26 -0
  7. package/dist/{hostInit-B0oLGxE3.mjs → hostInit-DIbf4z_O.mjs} +2 -2
  8. package/dist/index.js +174 -34
  9. package/dist/index.mjs +174 -34
  10. package/dist/{player-overlays-Ci5aBEqV.mjs → player-overlays-DQCBnVEz.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-D83cn_B2.mjs → responsive-DfDNxJT0.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-T37cA01e.mjs → scene-monitor-copy-Cm4SNy1d.mjs} +1 -1
  14. package/dist/{square-BBks-LOA.mjs → square-CzhgSdsX.mjs} +1 -1
  15. package/dist/{trash-2-B4ohh3xr.mjs → trash-2-BLpS78eD.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C0g1t6Aa.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-D3FVaAu5.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C2RynBx0.mjs +0 -26
package/dist/index.js CHANGED
@@ -5382,7 +5382,7 @@ var ZodIssueCode = {
5382
5382
  var ZodFirstPartyTypeKind;
5383
5383
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5384
5384
  //#endregion
5385
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5385
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5386
5386
  /**
5387
5387
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5388
5388
  * window to float samples (D455).
@@ -33650,6 +33650,35 @@ var webrtcSessionCapability = {
33650
33650
  alive: boolean()
33651
33651
  })),
33652
33652
  /**
33653
+ * The viewer's downlink probe, for ONE live session (D733).
33654
+ *
33655
+ * The player measures `/adaptive-probe` after the session's first decoded
33656
+ * frame (D635). It used to act on the reading itself, by opening a SECOND
33657
+ * session with `hints.downlinkMbps` — every adaptive live open became two
33658
+ * sessions, two ICE + DTLS handshakes and two server pipelines. It now
33659
+ * hands the measurement to the session it already has; the provider picks
33660
+ * the rung exactly as it would from an offer's hints (same viewport
33661
+ * ceiling) and moves the session there — in place when the negotiated
33662
+ * codec carries the new rendition, by the existing re-offer
33663
+ * (`getSessionState.pendingRenegotiation`) when it cannot.
33664
+ *
33665
+ * A MEASUREMENT, never a tier: the client does not choose. A probe only
33666
+ * raises the rung; lowering it stays the ladder's call on delivery.
33667
+ * `held` answers why nothing moved (`not-adaptive`, `pinned`,
33668
+ * `already-there`, `recorded`, …) — a client that gets ANY answer must not
33669
+ * fall back to a reconnect; only a provider that does not know the method
33670
+ * (an older hub) leaves the client its legacy second session.
33671
+ */
33672
+ applyDownlinkProbe: method(object({
33673
+ deviceId: number().int().nonnegative(),
33674
+ sessionId: string(),
33675
+ downlinkMbps: number().nonnegative()
33676
+ }), object({
33677
+ outcome: _enum(["switching", "held"]),
33678
+ tier: CamProfileSchema.nullable(),
33679
+ reason: string()
33680
+ }), { kind: "mutation" }),
33681
+ /**
33653
33682
  * The SERVER's half of the stream-debug overlay, for one live session.
33654
33683
  *
33655
33684
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -37878,7 +37907,8 @@ var ConnectionEndpointSchema = object({
37878
37907
  "lan-ipv6",
37879
37908
  "public",
37880
37909
  "loopback",
37881
- "app-link"
37910
+ "app-link",
37911
+ "custom"
37882
37912
  ]),
37883
37913
  /**
37884
37914
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -37981,13 +38011,12 @@ var ViewerEndpointsSchema = object({
37981
38011
  resolved: array(string()).readonly()
37982
38012
  });
37983
38013
  /**
37984
- * One audience's hub address (see `hub-address.ts`): the operator's stored
37985
- * override, the address in use, and where it came from.
38014
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
38015
+ * one release for addons built against it): `cluster` is the `agents` role,
38016
+ * `browser` the `signIn` role; `override` is the flagged address.
37986
38017
  */
37987
38018
  var HubAddressSnapshotSchema = object({
37988
- /** The operator's override, or null for automatic. */
37989
38019
  override: string().nullable(),
37990
- /** The address in use, or null when nothing qualifies (never loopback). */
37991
38020
  resolved: string().nullable(),
37992
38021
  source: _enum([
37993
38022
  "override",
@@ -37996,11 +38025,61 @@ var HubAddressSnapshotSchema = object({
37996
38025
  ])
37997
38026
  });
37998
38027
  var HubAddressesSchema = object({
37999
- /** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
38000
38028
  cluster: HubAddressSnapshotSchema,
38001
- /** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
38002
38029
  browser: HubAddressSnapshotSchema
38003
38030
  });
38031
+ /**
38032
+ * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
38033
+ * `notifications`, `agents` and `signIn` are carried by at most one address.
38034
+ */
38035
+ var HubAddressRoleSchema = _enum([
38036
+ "viewer",
38037
+ "notifications",
38038
+ "agents",
38039
+ "signIn"
38040
+ ]);
38041
+ var RoleSourceSchema = _enum([
38042
+ "flagged",
38043
+ "auto",
38044
+ "none"
38045
+ ]);
38046
+ /** One single-valued role: the flagged address, the one in use, and why. */
38047
+ var HubAddressRoleResolutionSchema = object({
38048
+ /** The address carrying the flag, or null = automatic. */
38049
+ flagged: string().nullable(),
38050
+ /** The address in use, or null when nothing qualifies (never loopback). */
38051
+ resolved: string().nullable(),
38052
+ source: RoleSourceSchema
38053
+ });
38054
+ var HubViewerResolutionSchema = object({
38055
+ /** The addresses flagged `viewer`, or empty = automatic. */
38056
+ flagged: array(string()).readonly(),
38057
+ /** What the apps race right now. */
38058
+ resolved: array(string()).readonly(),
38059
+ source: RoleSourceSchema
38060
+ });
38061
+ var HubAddressBookSchema = object({
38062
+ rows: array(ConnectionEndpointSchema.extend({
38063
+ /** In the hub's detected palette right now. */
38064
+ detected: boolean(),
38065
+ /** Entered by the operator (removable). */
38066
+ custom: boolean(),
38067
+ /** The roles explicitly flagged on this address. */
38068
+ flags: array(HubAddressRoleSchema).readonly(),
38069
+ /** The roles this address serves right now — flagged or automatic. */
38070
+ inUse: array(HubAddressRoleSchema).readonly(),
38071
+ /** The roles this address may be flagged with. */
38072
+ eligible: array(HubAddressRoleSchema).readonly()
38073
+ })).readonly(),
38074
+ roles: object({
38075
+ viewer: HubViewerResolutionSchema,
38076
+ notifications: HubAddressRoleResolutionSchema,
38077
+ agents: HubAddressRoleResolutionSchema,
38078
+ signIn: HubAddressRoleResolutionSchema
38079
+ }),
38080
+ /** The `hub=` an app link carries (D709), or null. */
38081
+ appLinkHub: string().nullable()
38082
+ });
38004
38083
  var AllowedAddressesSchema = object({
38005
38084
  /**
38006
38085
  * Allowlist of interface addresses operators have explicitly opted
@@ -38113,46 +38192,78 @@ var localNetworkCapability = {
38113
38192
  */
38114
38193
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
38115
38194
  /**
38116
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
38117
- * AUTO. The value is stored verbatim (not an index into the candidate
38118
- * list): interfaces come and go, and an index would silently re-point at a
38119
- * different address after a reboot.
38195
+ * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
38196
+ * an older admin UI keeps working: it writes the same `notifications`
38197
+ * flag, with the same validation. `baseUrl: null` restores automatic; an
38198
+ * address that is not detected becomes a custom address.
38120
38199
  */
38121
38200
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
38122
38201
  /**
38123
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
38124
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
38125
- * never mesh, never loopback. `resolved` is that set (or the operator's
38126
- * explicit subset) as it stands right now.
38202
+ * The `viewer` role as shipped apps read it: the flagged addresses
38203
+ * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
38204
+ * the public tunnel, never IPv6, mesh, loopback or a custom address.
38205
+ * `resolved` is the set as it stands right now; the custom ones in it are
38206
+ * also in `getConnectionEndpoints`, which the apps filter by it.
38127
38207
  */
38128
38208
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
38129
38209
  /**
38130
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
38131
- * verbatim (not indices) so a temporarily-down tunnel is not silently
38132
- * dropped from the operator's choice.
38210
+ * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
38211
+ * older admin UI keeps working: it replaces the same `viewer` flags.
38212
+ * Empty `baseUrls` restores automatic.
38133
38213
  */
38134
38214
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
38135
38215
  /**
38136
- * The hub's address for each audience — agents (`cluster`) and sign-in
38137
- * links (`browser`) — as every consumer must read it: the operator's
38138
- * override when set, else the automatic pick from this cap's palette,
38139
- * never loopback. The ONE answer to "at which address is this hub
38140
- * reached?"; there is no environment variable for it.
38216
+ * The Network page's Addresses table and every role's answer — the ONE
38217
+ * reading of "which address is this hub reached at, for what": detected
38218
+ * endpoints and custom addresses with their role flags, and per role the
38219
+ * flagged address, the one in use and whether it is automatic. Agent
38220
+ * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
38221
+ * here; nothing ranks the palette itself. `scheme` is the one the caller
38222
+ * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
38223
+ * always resolved over the HTTPS palette.
38141
38224
  */
38142
- getHubAddresses: method(_void(), HubAddressesSchema),
38225
+ getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
38226
+ /**
38227
+ * Add a custom address. Validated: an http(s) origin with a host, no
38228
+ * credentials, no path, never loopback — an invalid one is refused with
38229
+ * the reason and nothing is stored. Adding an address that already exists
38230
+ * only updates its label.
38231
+ */
38232
+ addCustomAddress: method(object({
38233
+ baseUrl: string(),
38234
+ label: string().max(80)
38235
+ }), HubAddressBookSchema, {
38236
+ kind: "mutation",
38237
+ auth: "admin"
38238
+ }),
38239
+ /** Remove a custom address. Its role flags go with it (those roles turn automatic). */
38240
+ removeCustomAddress: method(object({ baseUrl: string() }), HubAddressBookSchema, {
38241
+ kind: "mutation",
38242
+ auth: "admin"
38243
+ }),
38143
38244
  /**
38144
- * Set or clear (`baseUrl: null`) one audience's override. Validated: an
38145
- * http(s) origin with a host, no credentials, no path, never loopback —
38146
- * an invalid value is refused with the reason, nothing is stored.
38245
+ * Flag (`enabled: true`) or unflag an address for a role. For a
38246
+ * single-valued role, flagging moves the flag off every other address.
38247
+ * `baseUrl: null` returns the role to automatic. The address must be a row
38248
+ * of the table (detected, custom, or the app link for notifications);
38249
+ * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
38147
38250
  */
38148
- setHubAddress: method(object({
38149
- audience: _enum(["cluster", "browser"]),
38150
- baseUrl: string().nullable()
38151
- }), HubAddressesSchema, {
38251
+ setAddressRole: method(object({
38252
+ role: HubAddressRoleSchema,
38253
+ baseUrl: string().nullable(),
38254
+ enabled: boolean(),
38255
+ acceptInsecureHttp: boolean().optional()
38256
+ }), HubAddressBookSchema, {
38152
38257
  kind: "mutation",
38153
38258
  auth: "admin"
38154
38259
  }),
38155
38260
  /**
38261
+ * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
38262
+ * release so an addon built against the D729 amendment keeps resolving:
38263
+ * `cluster` = the `agents` role, `browser` = the `signIn` role.
38264
+ */
38265
+ getHubAddresses: method(_void(), HubAddressesSchema),
38266
+ /**
38156
38267
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
38157
38268
  * by the admin UI's address selector to seed its checkbox state.
38158
38269
  */
@@ -49285,12 +49396,24 @@ Object.freeze({
49285
49396
  addonId: null,
49286
49397
  access: "view"
49287
49398
  },
49399
+ "localNetwork.addCustomAddress": {
49400
+ capName: "local-network",
49401
+ capScope: "system",
49402
+ addonId: null,
49403
+ access: "create"
49404
+ },
49288
49405
  "localNetwork.downloadCa": {
49289
49406
  capName: "local-network",
49290
49407
  capScope: "system",
49291
49408
  addonId: null,
49292
49409
  access: "view"
49293
49410
  },
49411
+ "localNetwork.getAddresses": {
49412
+ capName: "local-network",
49413
+ capScope: "system",
49414
+ addonId: null,
49415
+ access: "view"
49416
+ },
49294
49417
  "localNetwork.getAllowedAddresses": {
49295
49418
  capName: "local-network",
49296
49419
  capScope: "system",
@@ -49345,6 +49468,12 @@ Object.freeze({
49345
49468
  addonId: null,
49346
49469
  access: "create"
49347
49470
  },
49471
+ "localNetwork.removeCustomAddress": {
49472
+ capName: "local-network",
49473
+ capScope: "system",
49474
+ addonId: null,
49475
+ access: "delete"
49476
+ },
49348
49477
  "localNetwork.resetAllowlistToBestMatch": {
49349
49478
  capName: "local-network",
49350
49479
  capScope: "system",
@@ -49357,13 +49486,13 @@ Object.freeze({
49357
49486
  addonId: null,
49358
49487
  access: "create"
49359
49488
  },
49360
- "localNetwork.setAllowedAddresses": {
49489
+ "localNetwork.setAddressRole": {
49361
49490
  capName: "local-network",
49362
49491
  capScope: "system",
49363
49492
  addonId: null,
49364
49493
  access: "create"
49365
49494
  },
49366
- "localNetwork.setHubAddress": {
49495
+ "localNetwork.setAllowedAddresses": {
49367
49496
  capName: "local-network",
49368
49497
  capScope: "system",
49369
49498
  addonId: null,
@@ -53617,6 +53746,12 @@ Object.freeze({
53617
53746
  addonId: null,
53618
53747
  access: "create"
53619
53748
  },
53749
+ "webrtcSession.applyDownlinkProbe": {
53750
+ capName: "webrtc-session",
53751
+ capScope: "device",
53752
+ addonId: null,
53753
+ access: "create"
53754
+ },
53620
53755
  "webrtcSession.closeSession": {
53621
53756
  capName: "webrtc-session",
53622
53757
  capScope: "device",
@@ -57715,6 +57850,11 @@ Object.freeze({
57715
57850
  form: "single",
57716
57851
  optional: false
57717
57852
  }],
57853
+ "webrtcSession.applyDownlinkProbe": [{
57854
+ name: "deviceId",
57855
+ form: "single",
57856
+ optional: false
57857
+ }],
57718
57858
  "webrtcSession.closeSession": [{
57719
57859
  name: "deviceId",
57720
57860
  form: "single",
package/dist/index.mjs CHANGED
@@ -5378,7 +5378,7 @@ var ZodIssueCode = {
5378
5378
  var ZodFirstPartyTypeKind;
5379
5379
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5380
5380
  //#endregion
5381
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5381
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5382
5382
  /**
5383
5383
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5384
5384
  * window to float samples (D455).
@@ -33646,6 +33646,35 @@ var webrtcSessionCapability = {
33646
33646
  alive: boolean()
33647
33647
  })),
33648
33648
  /**
33649
+ * The viewer's downlink probe, for ONE live session (D733).
33650
+ *
33651
+ * The player measures `/adaptive-probe` after the session's first decoded
33652
+ * frame (D635). It used to act on the reading itself, by opening a SECOND
33653
+ * session with `hints.downlinkMbps` — every adaptive live open became two
33654
+ * sessions, two ICE + DTLS handshakes and two server pipelines. It now
33655
+ * hands the measurement to the session it already has; the provider picks
33656
+ * the rung exactly as it would from an offer's hints (same viewport
33657
+ * ceiling) and moves the session there — in place when the negotiated
33658
+ * codec carries the new rendition, by the existing re-offer
33659
+ * (`getSessionState.pendingRenegotiation`) when it cannot.
33660
+ *
33661
+ * A MEASUREMENT, never a tier: the client does not choose. A probe only
33662
+ * raises the rung; lowering it stays the ladder's call on delivery.
33663
+ * `held` answers why nothing moved (`not-adaptive`, `pinned`,
33664
+ * `already-there`, `recorded`, …) — a client that gets ANY answer must not
33665
+ * fall back to a reconnect; only a provider that does not know the method
33666
+ * (an older hub) leaves the client its legacy second session.
33667
+ */
33668
+ applyDownlinkProbe: method(object({
33669
+ deviceId: number().int().nonnegative(),
33670
+ sessionId: string(),
33671
+ downlinkMbps: number().nonnegative()
33672
+ }), object({
33673
+ outcome: _enum(["switching", "held"]),
33674
+ tier: CamProfileSchema.nullable(),
33675
+ reason: string()
33676
+ }), { kind: "mutation" }),
33677
+ /**
33649
33678
  * The SERVER's half of the stream-debug overlay, for one live session.
33650
33679
  *
33651
33680
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -37874,7 +37903,8 @@ var ConnectionEndpointSchema = object({
37874
37903
  "lan-ipv6",
37875
37904
  "public",
37876
37905
  "loopback",
37877
- "app-link"
37906
+ "app-link",
37907
+ "custom"
37878
37908
  ]),
37879
37909
  /**
37880
37910
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -37977,13 +38007,12 @@ var ViewerEndpointsSchema = object({
37977
38007
  resolved: array(string()).readonly()
37978
38008
  });
37979
38009
  /**
37980
- * One audience's hub address (see `hub-address.ts`): the operator's stored
37981
- * override, the address in use, and where it came from.
38010
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
38011
+ * one release for addons built against it): `cluster` is the `agents` role,
38012
+ * `browser` the `signIn` role; `override` is the flagged address.
37982
38013
  */
37983
38014
  var HubAddressSnapshotSchema = object({
37984
- /** The operator's override, or null for automatic. */
37985
38015
  override: string().nullable(),
37986
- /** The address in use, or null when nothing qualifies (never loopback). */
37987
38016
  resolved: string().nullable(),
37988
38017
  source: _enum([
37989
38018
  "override",
@@ -37992,11 +38021,61 @@ var HubAddressSnapshotSchema = object({
37992
38021
  ])
37993
38022
  });
37994
38023
  var HubAddressesSchema = object({
37995
- /** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
37996
38024
  cluster: HubAddressSnapshotSchema,
37997
- /** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
37998
38025
  browser: HubAddressSnapshotSchema
37999
38026
  });
38027
+ /**
38028
+ * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
38029
+ * `notifications`, `agents` and `signIn` are carried by at most one address.
38030
+ */
38031
+ var HubAddressRoleSchema = _enum([
38032
+ "viewer",
38033
+ "notifications",
38034
+ "agents",
38035
+ "signIn"
38036
+ ]);
38037
+ var RoleSourceSchema = _enum([
38038
+ "flagged",
38039
+ "auto",
38040
+ "none"
38041
+ ]);
38042
+ /** One single-valued role: the flagged address, the one in use, and why. */
38043
+ var HubAddressRoleResolutionSchema = object({
38044
+ /** The address carrying the flag, or null = automatic. */
38045
+ flagged: string().nullable(),
38046
+ /** The address in use, or null when nothing qualifies (never loopback). */
38047
+ resolved: string().nullable(),
38048
+ source: RoleSourceSchema
38049
+ });
38050
+ var HubViewerResolutionSchema = object({
38051
+ /** The addresses flagged `viewer`, or empty = automatic. */
38052
+ flagged: array(string()).readonly(),
38053
+ /** What the apps race right now. */
38054
+ resolved: array(string()).readonly(),
38055
+ source: RoleSourceSchema
38056
+ });
38057
+ var HubAddressBookSchema = object({
38058
+ rows: array(ConnectionEndpointSchema.extend({
38059
+ /** In the hub's detected palette right now. */
38060
+ detected: boolean(),
38061
+ /** Entered by the operator (removable). */
38062
+ custom: boolean(),
38063
+ /** The roles explicitly flagged on this address. */
38064
+ flags: array(HubAddressRoleSchema).readonly(),
38065
+ /** The roles this address serves right now — flagged or automatic. */
38066
+ inUse: array(HubAddressRoleSchema).readonly(),
38067
+ /** The roles this address may be flagged with. */
38068
+ eligible: array(HubAddressRoleSchema).readonly()
38069
+ })).readonly(),
38070
+ roles: object({
38071
+ viewer: HubViewerResolutionSchema,
38072
+ notifications: HubAddressRoleResolutionSchema,
38073
+ agents: HubAddressRoleResolutionSchema,
38074
+ signIn: HubAddressRoleResolutionSchema
38075
+ }),
38076
+ /** The `hub=` an app link carries (D709), or null. */
38077
+ appLinkHub: string().nullable()
38078
+ });
38000
38079
  var AllowedAddressesSchema = object({
38001
38080
  /**
38002
38081
  * Allowlist of interface addresses operators have explicitly opted
@@ -38109,46 +38188,78 @@ var localNetworkCapability = {
38109
38188
  */
38110
38189
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
38111
38190
  /**
38112
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
38113
- * AUTO. The value is stored verbatim (not an index into the candidate
38114
- * list): interfaces come and go, and an index would silently re-point at a
38115
- * different address after a reboot.
38191
+ * @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
38192
+ * an older admin UI keeps working: it writes the same `notifications`
38193
+ * flag, with the same validation. `baseUrl: null` restores automatic; an
38194
+ * address that is not detected becomes a custom address.
38116
38195
  */
38117
38196
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
38118
38197
  /**
38119
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
38120
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
38121
- * never mesh, never loopback. `resolved` is that set (or the operator's
38122
- * explicit subset) as it stands right now.
38198
+ * The `viewer` role as shipped apps read it: the flagged addresses
38199
+ * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
38200
+ * the public tunnel, never IPv6, mesh, loopback or a custom address.
38201
+ * `resolved` is the set as it stands right now; the custom ones in it are
38202
+ * also in `getConnectionEndpoints`, which the apps filter by it.
38123
38203
  */
38124
38204
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
38125
38205
  /**
38126
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
38127
- * verbatim (not indices) so a temporarily-down tunnel is not silently
38128
- * dropped from the operator's choice.
38206
+ * @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
38207
+ * older admin UI keeps working: it replaces the same `viewer` flags.
38208
+ * Empty `baseUrls` restores automatic.
38129
38209
  */
38130
38210
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
38131
38211
  /**
38132
- * The hub's address for each audience — agents (`cluster`) and sign-in
38133
- * links (`browser`) — as every consumer must read it: the operator's
38134
- * override when set, else the automatic pick from this cap's palette,
38135
- * never loopback. The ONE answer to "at which address is this hub
38136
- * reached?"; there is no environment variable for it.
38212
+ * The Network page's Addresses table and every role's answer — the ONE
38213
+ * reading of "which address is this hub reached at, for what": detected
38214
+ * endpoints and custom addresses with their role flags, and per role the
38215
+ * flagged address, the one in use and whether it is automatic. Agent
38216
+ * deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
38217
+ * here; nothing ranks the palette itself. `scheme` is the one the caller
38218
+ * shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
38219
+ * always resolved over the HTTPS palette.
38137
38220
  */
38138
- getHubAddresses: method(_void(), HubAddressesSchema),
38221
+ getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
38222
+ /**
38223
+ * Add a custom address. Validated: an http(s) origin with a host, no
38224
+ * credentials, no path, never loopback — an invalid one is refused with
38225
+ * the reason and nothing is stored. Adding an address that already exists
38226
+ * only updates its label.
38227
+ */
38228
+ addCustomAddress: method(object({
38229
+ baseUrl: string(),
38230
+ label: string().max(80)
38231
+ }), HubAddressBookSchema, {
38232
+ kind: "mutation",
38233
+ auth: "admin"
38234
+ }),
38235
+ /** Remove a custom address. Its role flags go with it (those roles turn automatic). */
38236
+ removeCustomAddress: method(object({ baseUrl: string() }), HubAddressBookSchema, {
38237
+ kind: "mutation",
38238
+ auth: "admin"
38239
+ }),
38139
38240
  /**
38140
- * Set or clear (`baseUrl: null`) one audience's override. Validated: an
38141
- * http(s) origin with a host, no credentials, no path, never loopback —
38142
- * an invalid value is refused with the reason, nothing is stored.
38241
+ * Flag (`enabled: true`) or unflag an address for a role. For a
38242
+ * single-valued role, flagging moves the flag off every other address.
38243
+ * `baseUrl: null` returns the role to automatic. The address must be a row
38244
+ * of the table (detected, custom, or the app link for notifications);
38245
+ * `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
38143
38246
  */
38144
- setHubAddress: method(object({
38145
- audience: _enum(["cluster", "browser"]),
38146
- baseUrl: string().nullable()
38147
- }), HubAddressesSchema, {
38247
+ setAddressRole: method(object({
38248
+ role: HubAddressRoleSchema,
38249
+ baseUrl: string().nullable(),
38250
+ enabled: boolean(),
38251
+ acceptInsecureHttp: boolean().optional()
38252
+ }), HubAddressBookSchema, {
38148
38253
  kind: "mutation",
38149
38254
  auth: "admin"
38150
38255
  }),
38151
38256
  /**
38257
+ * @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
38258
+ * release so an addon built against the D729 amendment keeps resolving:
38259
+ * `cluster` = the `agents` role, `browser` = the `signIn` role.
38260
+ */
38261
+ getHubAddresses: method(_void(), HubAddressesSchema),
38262
+ /**
38152
38263
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
38153
38264
  * by the admin UI's address selector to seed its checkbox state.
38154
38265
  */
@@ -49281,12 +49392,24 @@ Object.freeze({
49281
49392
  addonId: null,
49282
49393
  access: "view"
49283
49394
  },
49395
+ "localNetwork.addCustomAddress": {
49396
+ capName: "local-network",
49397
+ capScope: "system",
49398
+ addonId: null,
49399
+ access: "create"
49400
+ },
49284
49401
  "localNetwork.downloadCa": {
49285
49402
  capName: "local-network",
49286
49403
  capScope: "system",
49287
49404
  addonId: null,
49288
49405
  access: "view"
49289
49406
  },
49407
+ "localNetwork.getAddresses": {
49408
+ capName: "local-network",
49409
+ capScope: "system",
49410
+ addonId: null,
49411
+ access: "view"
49412
+ },
49290
49413
  "localNetwork.getAllowedAddresses": {
49291
49414
  capName: "local-network",
49292
49415
  capScope: "system",
@@ -49341,6 +49464,12 @@ Object.freeze({
49341
49464
  addonId: null,
49342
49465
  access: "create"
49343
49466
  },
49467
+ "localNetwork.removeCustomAddress": {
49468
+ capName: "local-network",
49469
+ capScope: "system",
49470
+ addonId: null,
49471
+ access: "delete"
49472
+ },
49344
49473
  "localNetwork.resetAllowlistToBestMatch": {
49345
49474
  capName: "local-network",
49346
49475
  capScope: "system",
@@ -49353,13 +49482,13 @@ Object.freeze({
49353
49482
  addonId: null,
49354
49483
  access: "create"
49355
49484
  },
49356
- "localNetwork.setAllowedAddresses": {
49485
+ "localNetwork.setAddressRole": {
49357
49486
  capName: "local-network",
49358
49487
  capScope: "system",
49359
49488
  addonId: null,
49360
49489
  access: "create"
49361
49490
  },
49362
- "localNetwork.setHubAddress": {
49491
+ "localNetwork.setAllowedAddresses": {
49363
49492
  capName: "local-network",
49364
49493
  capScope: "system",
49365
49494
  addonId: null,
@@ -53613,6 +53742,12 @@ Object.freeze({
53613
53742
  addonId: null,
53614
53743
  access: "create"
53615
53744
  },
53745
+ "webrtcSession.applyDownlinkProbe": {
53746
+ capName: "webrtc-session",
53747
+ capScope: "device",
53748
+ addonId: null,
53749
+ access: "create"
53750
+ },
53616
53751
  "webrtcSession.closeSession": {
53617
53752
  capName: "webrtc-session",
53618
53753
  capScope: "device",
@@ -57711,6 +57846,11 @@ Object.freeze({
57711
57846
  form: "single",
57712
57847
  optional: false
57713
57848
  }],
57849
+ "webrtcSession.applyDownlinkProbe": [{
57850
+ name: "deviceId",
57851
+ form: "single",
57852
+ optional: false
57853
+ }],
57714
57854
  "webrtcSession.closeSession": [{
57715
57855
  name: "deviceId",
57716
57856
  form: "single",
@@ -1,5 +1,5 @@
1
1
  import { b as e, g as t, l as n, u as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
- import { c as i, s as a } from "./responsive-D83cn_B2.mjs";
2
+ import { c as i, s as a } from "./responsive-DfDNxJT0.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
4
4
  var l = i("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C0g1t6Aa.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-D3FVaAu5.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { _ as e, b as t, c as n, g as r, l as i, m as a, n as o, r as s, t as c, u as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
3
- import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C2RynBx0.mjs";
3
+ import { i as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BaCE42a6.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  t();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {