@camstack/addon-osd-manager 0.1.174 → 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-BgWZ6XzA.mjs → MotionZonesSettings-CPKsdj2c.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D9S1pJVU.mjs → PrivacyMaskSettings-Ctm1-2f1.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-rwUxImev.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-BT-J4sUh.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-1uK9d0Vg.mjs → hostInit-DIbf4z_O.mjs} +2 -2
  8. package/dist/index.js +348 -77
  9. package/dist/index.mjs +348 -77
  10. package/dist/{player-overlays-BjZKK_0c.mjs → player-overlays-DQCBnVEz.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-CO8uheGu.mjs → responsive-DfDNxJT0.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-BYrV3aHh.mjs → scene-monitor-copy-Cm4SNy1d.mjs} +1 -1
  14. package/dist/{square-BAgLrcRx.mjs → square-CzhgSdsX.mjs} +1 -1
  15. package/dist/{trash-2-BMlm83TB.mjs → trash-2-BLpS78eD.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Dw0LOv1F.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-DMGYyDv5.mjs +0 -26
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).
@@ -10562,57 +10562,15 @@ var ClipSearchStrictnessSchema = _enum([
10562
10562
  "balanced",
10563
10563
  "strict"
10564
10564
  ]);
10565
- new Set([
10566
- {
10567
- id: "person",
10568
- name: "Person"
10569
- },
10570
- {
10571
- id: "vehicle",
10572
- name: "Vehicle"
10573
- },
10574
- {
10575
- id: "animal",
10576
- name: "Animal"
10577
- },
10578
- {
10579
- id: "package",
10580
- name: "Package"
10581
- }
10582
- ].map((l) => l.id));
10583
- var COCO_TO_MACRO = {
10584
- mapping: {
10585
- person: "person",
10586
- bicycle: "vehicle",
10587
- car: "vehicle",
10588
- motorcycle: "vehicle",
10589
- airplane: "vehicle",
10590
- bus: "vehicle",
10591
- train: "vehicle",
10592
- truck: "vehicle",
10593
- boat: "vehicle",
10594
- bird: "animal",
10595
- cat: "animal",
10596
- dog: "animal",
10597
- horse: "animal",
10598
- sheep: "animal",
10599
- cow: "animal",
10600
- elephant: "animal",
10601
- bear: "animal",
10602
- zebra: "animal",
10603
- giraffe: "animal",
10604
- suitcase: "package",
10605
- backpack: "package",
10606
- handbag: "package"
10607
- },
10608
- preserveOriginal: false
10609
- };
10610
- /** Steps a root detector may declare it fills. */
10611
- var FILLABLE_STEP_IDS = [
10565
+ /** Steps whose effect a root label can BE. */
10566
+ var LABEL_SUPPLY_STEP_IDS = [
10612
10567
  "animal-classifier",
10613
10568
  "vehicle-classifier",
10614
10569
  "package-detection"
10615
10570
  ];
10571
+ /** Steps whose box a root detection can BE. */
10572
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10573
+ [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
10616
10574
  var MODEL_FORMATS = [
10617
10575
  "onnx",
10618
10576
  "coreml",
@@ -10745,12 +10703,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10745
10703
  /** True when the weights or their data forbid commercial use. */
10746
10704
  nonCommercial: boolean().optional()
10747
10705
  }));
10748
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10749
- var FillsClassifierEffectSchema = object({
10750
- stepId: _enum(FILLABLE_STEP_IDS),
10706
+ /**
10707
+ * One step a ROOT detector can supply from its own output (D730) — see
10708
+ * `ModelCatalogEntry.suppliesSteps`.
10709
+ *
10710
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
10711
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
10712
+ * the root cannot produce (shown as unavailable, never a blocker).
10713
+ * - `crop`: the root draws the box the step would have found (`license_plate`
10714
+ * for plate-detection, `face` for face-detection). The box becomes a detail
10715
+ * child of the `parentMacro` detection that contains it — never a track.
10716
+ */
10717
+ var RootStepSupplySchema = discriminatedUnion("kind", [object({
10718
+ kind: literal("label"),
10719
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
10751
10720
  labelToEffect: record(string(), string()),
10752
10721
  uncovered: array(string()).readonly()
10753
- });
10722
+ }), object({
10723
+ kind: literal("crop"),
10724
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
10725
+ rootLabels: array(string()).readonly(),
10726
+ parentMacro: _enum(["vehicle", "person"]),
10727
+ childClass: _enum(["plate", "face"]),
10728
+ /**
10729
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
10730
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
10731
+ * stored by an import.
10732
+ */
10733
+ rootInputPx: number().int().positive().optional()
10734
+ })]);
10754
10735
  var ModelCatalogEntrySchema = object({
10755
10736
  id: string(),
10756
10737
  name: string(),
@@ -10877,15 +10858,15 @@ var ModelCatalogEntrySchema = object({
10877
10858
  */
10878
10859
  classMap: DetectionCatalogClassMapSchema.optional(),
10879
10860
  /**
10880
- * The pipeline steps this ROOT detector already does the work of (D715):
10881
- * its labels name the effect the step exists to produce (`deer` for
10882
- * `animal-classifier`, `package` for `package-detection`). Derived from the
10883
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
10884
- * declares none. Whether a declaration is honoured is the step's own
10885
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
10886
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
10861
+ * The pipeline steps this ROOT detector can supply from its own output
10862
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
10863
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
10864
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
10865
+ * by hand and never assumed per family; a row without it is derived on read
10866
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
10867
+ * `useRootModel` flag (`resolveRootSupply`).
10887
10868
  */
10888
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
10869
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
10889
10870
  /**
10890
10871
  * The model's CLIP feature-space contract (text encoder, dimension, vector
10891
10872
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -20473,6 +20454,51 @@ var notificationOutputCapability = {
20473
20454
  })
20474
20455
  }
20475
20456
  };
20457
+ new Set([
20458
+ {
20459
+ id: "person",
20460
+ name: "Person"
20461
+ },
20462
+ {
20463
+ id: "vehicle",
20464
+ name: "Vehicle"
20465
+ },
20466
+ {
20467
+ id: "animal",
20468
+ name: "Animal"
20469
+ },
20470
+ {
20471
+ id: "package",
20472
+ name: "Package"
20473
+ }
20474
+ ].map((l) => l.id));
20475
+ var COCO_TO_MACRO = {
20476
+ mapping: {
20477
+ person: "person",
20478
+ bicycle: "vehicle",
20479
+ car: "vehicle",
20480
+ motorcycle: "vehicle",
20481
+ airplane: "vehicle",
20482
+ bus: "vehicle",
20483
+ train: "vehicle",
20484
+ truck: "vehicle",
20485
+ boat: "vehicle",
20486
+ bird: "animal",
20487
+ cat: "animal",
20488
+ dog: "animal",
20489
+ horse: "animal",
20490
+ sheep: "animal",
20491
+ cow: "animal",
20492
+ elephant: "animal",
20493
+ bear: "animal",
20494
+ zebra: "animal",
20495
+ giraffe: "animal",
20496
+ suitcase: "package",
20497
+ backpack: "package",
20498
+ handbag: "package"
20499
+ },
20500
+ preserveOriginal: false
20501
+ };
20476
20502
  var AUDIO_MACRO_LABELS = [
20477
20503
  {
20478
20504
  id: "speech",
@@ -22923,7 +22949,7 @@ var NC_CONDITION_CATALOG = [
22923
22949
  operator: "in",
22924
22950
  appliesTo: ["immediate", "track-end"],
22925
22951
  phase: "P1",
22926
- description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it (D692)."
22952
+ description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it."
22927
22953
  },
22928
22954
  {
22929
22955
  id: "plates",
@@ -27207,6 +27233,34 @@ var pipelineAnalyticsCapability = {
27207
27233
  }
27208
27234
  };
27209
27235
  /**
27236
+ * A root model's boxes standing in for one crop-kind step's own inference
27237
+ * (D730) — see `runPipeline.suppliedRoot`.
27238
+ */
27239
+ var SuppliedRootOutputSchema = object({
27240
+ stepId: string(),
27241
+ /** The root model that drew the boxes — stamped on the result. */
27242
+ modelId: string(),
27243
+ detections: array(object({
27244
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
27245
+ bbox: tuple([
27246
+ number(),
27247
+ number(),
27248
+ number(),
27249
+ number()
27250
+ ]),
27251
+ score: number(),
27252
+ /**
27253
+ * Five facial landmarks in the same pixels — a face the step's own
27254
+ * detector already re-found inside a root face box (D730), so its
27255
+ * embedder child aligns it exactly as it aligns any detected face.
27256
+ */
27257
+ landmarks: array(object({
27258
+ x: number(),
27259
+ y: number()
27260
+ })).optional()
27261
+ })).min(1)
27262
+ });
27263
+ /**
27210
27264
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
27211
27265
  * within the frame, so the executor can re-cut a leaf child ROI at native
27212
27266
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -27337,7 +27391,7 @@ var PipelineModelOptionSchema = object({
27337
27391
  legacy: boolean().optional(),
27338
27392
  provider: ModelProviderIdSchema.optional(),
27339
27393
  defaultConfidence: number().optional(),
27340
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
27394
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
27341
27395
  });
27342
27396
  var ConfigFieldBridge = custom();
27343
27397
  var PipelineAddonSchemaSchema = object({
@@ -27741,7 +27795,16 @@ var pipelineExecutorCapability = {
27741
27795
  * `device-not-servable`), and nothing reaches the camera's live
27742
27796
  * trace stream. Absent ⇒ unchanged behaviour.
27743
27797
  */
27744
- replay: literal(true).optional()
27798
+ replay: literal(true).optional(),
27799
+ /**
27800
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
27801
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
27802
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
27803
+ * NOT inferred, these boxes are its output, and its children (the plate
27804
+ * reader) run on them through their own crop policy. Boxes are in the
27805
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
27806
+ */
27807
+ suppliedRoot: SuppliedRootOutputSchema.optional()
27745
27808
  }), PipelineRunResultBridge, { kind: "mutation" }),
27746
27809
  /**
27747
27810
  * Batched run — N raw frames packed into one cap call. The provider
@@ -29054,7 +29117,22 @@ var pipelineRunnerCapability = {
29054
29117
  */
29055
29118
  cropJpeg: string().optional(),
29056
29119
  parent: DetailParentSchema,
29057
- steps: array(string()).optional()
29120
+ steps: array(string()).optional(),
29121
+ /**
29122
+ * The camera's root model already drew this step's boxes (D730): a
29123
+ * `license_plate` inside the parent vehicle. The named step is NOT
29124
+ * inferred — these FRAME-space boxes are its output — and its
29125
+ * requested children (the plate reader) run on them. Absent ⇒ every
29126
+ * requested step infers as before.
29127
+ */
29128
+ supplied: object({
29129
+ stepId: string(),
29130
+ modelId: string(),
29131
+ boxes: array(object({
29132
+ bbox: NativeCropBboxSchema,
29133
+ score: number()
29134
+ })).min(1)
29135
+ }).optional()
29058
29136
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
29059
29137
  /**
29060
29138
  * Run ONE enrichment step against caller-supplied pixels, with NO camera
@@ -33568,6 +33646,35 @@ var webrtcSessionCapability = {
33568
33646
  alive: boolean()
33569
33647
  })),
33570
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
+ /**
33571
33678
  * The SERVER's half of the stream-debug overlay, for one live session.
33572
33679
  *
33573
33680
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -37796,7 +37903,8 @@ var ConnectionEndpointSchema = object({
37796
37903
  "lan-ipv6",
37797
37904
  "public",
37798
37905
  "loopback",
37799
- "app-link"
37906
+ "app-link",
37907
+ "custom"
37800
37908
  ]),
37801
37909
  /**
37802
37910
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -37898,6 +38006,76 @@ var ViewerEndpointsSchema = object({
37898
38006
  /** What the ranking currently resolves to (may be empty if nothing is up). */
37899
38007
  resolved: array(string()).readonly()
37900
38008
  });
38009
+ /**
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.
38013
+ */
38014
+ var HubAddressSnapshotSchema = object({
38015
+ override: string().nullable(),
38016
+ resolved: string().nullable(),
38017
+ source: _enum([
38018
+ "override",
38019
+ "auto",
38020
+ "none"
38021
+ ])
38022
+ });
38023
+ var HubAddressesSchema = object({
38024
+ cluster: HubAddressSnapshotSchema,
38025
+ browser: HubAddressSnapshotSchema
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
+ });
37901
38079
  var AllowedAddressesSchema = object({
37902
38080
  /**
37903
38081
  * Allowlist of interface addresses operators have explicitly opted
@@ -38010,26 +38188,78 @@ var localNetworkCapability = {
38010
38188
  */
38011
38189
  getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
38012
38190
  /**
38013
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
38014
- * AUTO. The value is stored verbatim (not an index into the candidate
38015
- * list): interfaces come and go, and an index would silently re-point at a
38016
- * 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.
38017
38195
  */
38018
38196
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
38019
38197
  /**
38020
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
38021
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
38022
- * never mesh, never loopback. `resolved` is that set (or the operator's
38023
- * 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.
38024
38203
  */
38025
38204
  getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
38026
38205
  /**
38027
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
38028
- * verbatim (not indices) so a temporarily-down tunnel is not silently
38029
- * 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.
38030
38209
  */
38031
38210
  setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
38032
38211
  /**
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.
38220
+ */
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
+ }),
38240
+ /**
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`.
38246
+ */
38247
+ setAddressRole: method(object({
38248
+ role: HubAddressRoleSchema,
38249
+ baseUrl: string().nullable(),
38250
+ enabled: boolean(),
38251
+ acceptInsecureHttp: boolean().optional()
38252
+ }), HubAddressBookSchema, {
38253
+ kind: "mutation",
38254
+ auth: "admin"
38255
+ }),
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
+ /**
38033
38263
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
38034
38264
  * by the admin UI's address selector to seed its checkbox state.
38035
38265
  */
@@ -49162,12 +49392,24 @@ Object.freeze({
49162
49392
  addonId: null,
49163
49393
  access: "view"
49164
49394
  },
49395
+ "localNetwork.addCustomAddress": {
49396
+ capName: "local-network",
49397
+ capScope: "system",
49398
+ addonId: null,
49399
+ access: "create"
49400
+ },
49165
49401
  "localNetwork.downloadCa": {
49166
49402
  capName: "local-network",
49167
49403
  capScope: "system",
49168
49404
  addonId: null,
49169
49405
  access: "view"
49170
49406
  },
49407
+ "localNetwork.getAddresses": {
49408
+ capName: "local-network",
49409
+ capScope: "system",
49410
+ addonId: null,
49411
+ access: "view"
49412
+ },
49171
49413
  "localNetwork.getAllowedAddresses": {
49172
49414
  capName: "local-network",
49173
49415
  capScope: "system",
@@ -49180,6 +49422,12 @@ Object.freeze({
49180
49422
  addonId: null,
49181
49423
  access: "view"
49182
49424
  },
49425
+ "localNetwork.getHubAddresses": {
49426
+ capName: "local-network",
49427
+ capScope: "system",
49428
+ addonId: null,
49429
+ access: "view"
49430
+ },
49183
49431
  "localNetwork.getNotificationEndpoint": {
49184
49432
  capName: "local-network",
49185
49433
  capScope: "system",
@@ -49216,6 +49464,12 @@ Object.freeze({
49216
49464
  addonId: null,
49217
49465
  access: "create"
49218
49466
  },
49467
+ "localNetwork.removeCustomAddress": {
49468
+ capName: "local-network",
49469
+ capScope: "system",
49470
+ addonId: null,
49471
+ access: "delete"
49472
+ },
49219
49473
  "localNetwork.resetAllowlistToBestMatch": {
49220
49474
  capName: "local-network",
49221
49475
  capScope: "system",
@@ -49228,6 +49482,12 @@ Object.freeze({
49228
49482
  addonId: null,
49229
49483
  access: "create"
49230
49484
  },
49485
+ "localNetwork.setAddressRole": {
49486
+ capName: "local-network",
49487
+ capScope: "system",
49488
+ addonId: null,
49489
+ access: "create"
49490
+ },
49231
49491
  "localNetwork.setAllowedAddresses": {
49232
49492
  capName: "local-network",
49233
49493
  capScope: "system",
@@ -53482,6 +53742,12 @@ Object.freeze({
53482
53742
  addonId: null,
53483
53743
  access: "create"
53484
53744
  },
53745
+ "webrtcSession.applyDownlinkProbe": {
53746
+ capName: "webrtc-session",
53747
+ capScope: "device",
53748
+ addonId: null,
53749
+ access: "create"
53750
+ },
53485
53751
  "webrtcSession.closeSession": {
53486
53752
  capName: "webrtc-session",
53487
53753
  capScope: "device",
@@ -57580,6 +57846,11 @@ Object.freeze({
57580
57846
  form: "single",
57581
57847
  optional: false
57582
57848
  }],
57849
+ "webrtcSession.applyDownlinkProbe": [{
57850
+ name: "deviceId",
57851
+ form: "single",
57852
+ optional: false
57853
+ }],
57583
57854
  "webrtcSession.closeSession": [{
57584
57855
  name: "deviceId",
57585
57856
  form: "single",
@@ -58193,7 +58464,7 @@ var STATE_SUMMARY_VARS = [
58193
58464
  {
58194
58465
  name: "summarySection",
58195
58466
  label: "Summary: this section",
58196
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
58467
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
58197
58468
  example: "Batterie scariche",
58198
58469
  group: "system",
58199
58470
  families: ["rule"],
@@ -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-CO8uheGu.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-Dw0LOv1F.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-DMGYyDv5.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) => {
@@ -1,5 +1,5 @@
1
1
  import { b as e, c as t, g as n, m as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-C5jUMd7X.mjs";
2
- import { c as i } from "./responsive-CO8uheGu.mjs";
2
+ import { c as i } from "./responsive-DfDNxJT0.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -1,4 +1,4 @@
1
- import { c as e } from "./responsive-CO8uheGu.mjs";
1
+ import { c as e } from "./responsive-DfDNxJT0.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { c as e } from "./responsive-CO8uheGu.mjs";
1
+ import { c as e } from "./responsive-DfDNxJT0.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BT-J4sUh.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CKTxetEY.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-osd-manager",
3
- "version": "0.1.174",
3
+ "version": "0.1.176",
4
4
  "description": "Binds camera on-screen-display slots to live state and recognitions",
5
5
  "keywords": [
6
6
  "camstack",