@camstack/addon-osd-manager 0.1.135 → 0.1.137

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-DjSGOYEZ.mjs → MotionZonesSettings-B4onRgUN.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-BrJjxUTV.mjs → PrivacyMaskSettings-15mTDT2b.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-lFwk-5Ag.mjs → SceneMonitorEditor-DFU0p0mQ.mjs} +3 -3
  4. package/dist/_stub.js +10 -10
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-Dk3P7vDo.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CGBPavbq.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CVM3jGoe.mjs +26 -0
  7. package/dist/{hostInit-C0GXEvIS.mjs → hostInit-jIJC0_ID.mjs} +2 -2
  8. package/dist/index.js +289 -53
  9. package/dist/index.mjs +289 -53
  10. package/dist/{player-overlays-8DJJmri3.mjs → player-overlays-B_ERqzqj.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-BJTLnN-p.mjs → responsive-BOpuh3Lr.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-CXXU8X6V.mjs → scene-monitor-copy-D5o6-VNM.mjs} +1 -1
  14. package/dist/{square-CxBZyzy5.mjs → square-oUeZZbza.mjs} +1 -1
  15. package/dist/{trash-2-CDkpE8nN.mjs → trash-2-BrFLAkuW.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-vuxTr550.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C-OUB_74.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-MNSRdKcG.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -5359,7 +5359,7 @@ var ZodIssueCode = {
5359
5359
  var ZodFirstPartyTypeKind;
5360
5360
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5361
5361
  //#endregion
5362
- //#region ../types/dist/sleep-pM_J7YnY.mjs
5362
+ //#region ../types/dist/sleep-D_4W7xuQ.mjs
5363
5363
  /**
5364
5364
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5365
5365
  * window to float samples (D455).
@@ -7410,7 +7410,10 @@ var deviceOpsCapability = {
7410
7410
  setConfig: method(object({
7411
7411
  deviceId: number(),
7412
7412
  values: record(string(), unknown())
7413
- }), _void(), { kind: "mutation" }),
7413
+ }), _void(), {
7414
+ kind: "mutation",
7415
+ auth: "admin"
7416
+ }),
7414
7417
  /**
7415
7418
  * Invoke a device custom action on a forked/remote device (the
7416
7419
  * cross-process transport for `IDevice.runDeviceAction`). Mirrors
@@ -7427,7 +7430,10 @@ var deviceOpsCapability = {
7427
7430
  * (close sockets, stop background tasks, …). The device-manager still
7428
7431
  * performs its own persistence cleanup before/after this call.
7429
7432
  */
7430
- removeDevice: method(object({ deviceId: number() }), _void(), { kind: "mutation" }),
7433
+ removeDevice: method(object({ deviceId: number() }), _void(), {
7434
+ kind: "mutation",
7435
+ auth: "admin"
7436
+ }),
7431
7437
  /**
7432
7438
  * Build the ConfigUISchema (FormBuilder input shape) from the device's
7433
7439
  * Zod config schema. Runs on the worker that owns the IDevice so the
@@ -12053,7 +12059,7 @@ var brokerCapability = {
12053
12059
  }),
12054
12060
  /** Read the broker's cached state for a key. Returns `null` when
12055
12061
  * unknown to the broker (never published / unknown entity). */
12056
- getState: method(GetStateInputSchema, unknown().nullable()),
12062
+ getState: method(GetStateInputSchema, unknown().nullable(), { auth: "admin" }),
12057
12063
  /** Status method — explicit registration with a `z.void()` input so
12058
12064
  * the codegen-generated tRPC router types its input as
12059
12065
  * `{addonId?: string, nodeId?: string}` (system-scoped collection
@@ -13610,6 +13616,16 @@ var CollectionIndexSchema = object({
13610
13616
  * namespace, or none. Making the door enforce it is tracked separately —
13611
13617
  * it renames tables, so it needs a migration.
13612
13618
  *
13619
+ * **So every method is `auth: 'admin'` (D634).** Because nothing scopes a
13620
+ * call to its caller, a `protected` method here was a raw, unredacted read
13621
+ * (and write) of every addon's collections for any role holding
13622
+ * `category:system` — which is every role: a `viewer` could read every
13623
+ * notifier token in plaintext from `notifiers:notification-targets`. No
13624
+ * browser or app client calls this cap. Addons are not affected: an
13625
+ * addon's `ctx.api` cap call is resolved to the provider directly and never
13626
+ * enters the tRPC router (so the tier gates sessions and tokens, never
13627
+ * addons), and the hub itself calls it through the capability registry.
13628
+ *
13613
13629
  * - `{ collection: 'addon-settings' }` → table `addon-settings`
13614
13630
  * - `{ namespace: 'my-addon', collection: 'addon-settings' }` →
13615
13631
  * table `my-addon:addon-settings`
@@ -13631,14 +13647,17 @@ var settingsStoreCapability = {
13631
13647
  namespace: string().optional(),
13632
13648
  collection: string(),
13633
13649
  key: string()
13634
- }), unknown()),
13650
+ }), unknown(), { auth: "admin" }),
13635
13651
  /** Set a value by key in a collection (upsert). */
13636
13652
  set: method(object({
13637
13653
  namespace: string().optional(),
13638
13654
  collection: string(),
13639
13655
  key: string(),
13640
13656
  value: unknown()
13641
- }), _void(), { kind: "mutation" }),
13657
+ }), _void(), {
13658
+ kind: "mutation",
13659
+ auth: "admin"
13660
+ }),
13642
13661
  /**
13643
13662
  * Rows matching a filter.
13644
13663
  *
@@ -13659,7 +13678,7 @@ var settingsStoreCapability = {
13659
13678
  collection: string(),
13660
13679
  filter: QueryFilterSchema.optional(),
13661
13680
  columns: array(string()).readonly().optional()
13662
- }), array(SettingsRecordSchema).readonly()),
13681
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }),
13663
13682
  /**
13664
13683
  * Make a SLOT hold this row — insert it, or update whatever already
13665
13684
  * occupies the slot — and answer with the id the row HAS.
@@ -13712,7 +13731,10 @@ var settingsStoreCapability = {
13712
13731
  }), object({
13713
13732
  /** The id the row HAS: assigned by SQLite on an insert, or the existing
13714
13733
  * row's own id on an update. */
13715
- id: union([string(), number()]) }), { kind: "mutation" }),
13734
+ id: union([string(), number()]) }), {
13735
+ kind: "mutation",
13736
+ auth: "admin"
13737
+ }),
13716
13738
  /** Insert a new record. */
13717
13739
  insert: method(object({
13718
13740
  namespace: string().optional(),
@@ -13727,7 +13749,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13727
13749
  * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
13728
13750
  * primary key — which is the only place an auto key is knowable.
13729
13751
  */
13730
- id: union([string(), number()]) }), { kind: "mutation" }),
13752
+ id: union([string(), number()]) }), {
13753
+ kind: "mutation",
13754
+ auth: "admin"
13755
+ }),
13731
13756
  /**
13732
13757
  * Insert MANY records in ONE transaction, returning how many landed.
13733
13758
  *
@@ -13755,20 +13780,29 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13755
13780
  namespace: string().optional(),
13756
13781
  collection: string(),
13757
13782
  records: array(BulkRecordSchema).readonly()
13758
- }), object({ inserted: number().int() }), { kind: "mutation" }),
13783
+ }), object({ inserted: number().int() }), {
13784
+ kind: "mutation",
13785
+ auth: "admin"
13786
+ }),
13759
13787
  /** Update an existing record by ID. */
13760
13788
  update: method(object({
13761
13789
  namespace: string().optional(),
13762
13790
  collection: string(),
13763
13791
  id: string(),
13764
13792
  data: record(string(), unknown())
13765
- }), _void(), { kind: "mutation" }),
13793
+ }), _void(), {
13794
+ kind: "mutation",
13795
+ auth: "admin"
13796
+ }),
13766
13797
  /** Delete a record by key/ID. */
13767
13798
  delete: method(object({
13768
13799
  namespace: string().optional(),
13769
13800
  collection: string(),
13770
13801
  key: string()
13771
- }), _void(), { kind: "mutation" }),
13802
+ }), _void(), {
13803
+ kind: "mutation",
13804
+ auth: "admin"
13805
+ }),
13772
13806
  /**
13773
13807
  * Delete every record matching `filter`, in ONE statement, returning how
13774
13808
  * many rows went. This exists because its absence made every retention
@@ -13787,7 +13821,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13787
13821
  namespace: string().optional(),
13788
13822
  collection: string(),
13789
13823
  filter: MutationFilterSchema
13790
- }), object({ deleted: number().int() }), { kind: "mutation" }),
13824
+ }), object({ deleted: number().int() }), {
13825
+ kind: "mutation",
13826
+ auth: "admin"
13827
+ }),
13791
13828
  /**
13792
13829
  * Apply `data` to every record matching `filter`, in one statement,
13793
13830
  * returning how many rows changed. Same filter contract as
@@ -13798,13 +13835,16 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13798
13835
  collection: string(),
13799
13836
  filter: MutationFilterSchema,
13800
13837
  data: record(string(), unknown())
13801
- }), object({ updated: number().int() }), { kind: "mutation" }),
13838
+ }), object({ updated: number().int() }), {
13839
+ kind: "mutation",
13840
+ auth: "admin"
13841
+ }),
13802
13842
  /** Count entries in a collection, optionally filtered. */
13803
13843
  count: method(object({
13804
13844
  namespace: string().optional(),
13805
13845
  collection: string(),
13806
13846
  filter: QueryFilterSchema.optional()
13807
- }), number()),
13847
+ }), number(), { auth: "admin" }),
13808
13848
  /**
13809
13849
  * `COUNT(*)` and one `SUM` / `MIN` / `MAX` per requested field, in ONE
13810
13850
  * statement, over the rows `filter` selects.
@@ -13830,7 +13870,7 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13830
13870
  collection: string(),
13831
13871
  fields: array(AggregateFieldSchema).readonly(),
13832
13872
  filter: QueryFilterSchema.optional()
13833
- }), AggregateResultSchema),
13873
+ }), AggregateResultSchema, { auth: "admin" }),
13834
13874
  /** Grouped counts per ((field-origin)/bucketSize) bucket, filtered. */
13835
13875
  histogram: method(object({
13836
13876
  namespace: string().optional(),
@@ -13842,12 +13882,12 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13842
13882
  }), array(object({
13843
13883
  bucket: number().int(),
13844
13884
  count: number().int()
13845
- })).readonly()),
13885
+ })).readonly(), { auth: "admin" }),
13846
13886
  /** Check if a collection is empty. */
13847
13887
  isEmpty: method(object({
13848
13888
  namespace: string().optional(),
13849
13889
  collection: string()
13850
- }), boolean()),
13890
+ }), boolean(), { auth: "admin" }),
13851
13891
  /**
13852
13892
  * Declare a typed (SQL-backed) collection with explicit columns +
13853
13893
  * indexes. Idempotent: re-declaring an existing collection with the
@@ -13868,7 +13908,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13868
13908
  collection: string(),
13869
13909
  columns: array(CollectionColumnSchema).readonly(),
13870
13910
  indexes: array(CollectionIndexSchema).readonly().optional()
13871
- }), _void(), { kind: "mutation" })
13911
+ }), _void(), {
13912
+ kind: "mutation",
13913
+ auth: "admin"
13914
+ })
13872
13915
  }
13873
13916
  };
13874
13917
  /**
@@ -14813,8 +14856,14 @@ var deviceExportCapability = {
14813
14856
  getStatus: method(_void(), DeviceExportStatusSchema),
14814
14857
  listSupportedDeviceKinds: method(_void(), array(DeviceKindSchema)),
14815
14858
  listExposedDevices: method(_void(), array(ExposedDeviceSchema)),
14816
- exposeDevice: method(ExposeInputSchema, _void(), { kind: "mutation" }),
14817
- unexposeDevice: method(UnexposeInputSchema, _void(), { kind: "mutation" })
14859
+ exposeDevice: method(ExposeInputSchema, _void(), {
14860
+ kind: "mutation",
14861
+ auth: "admin"
14862
+ }),
14863
+ unexposeDevice: method(UnexposeInputSchema, _void(), {
14864
+ kind: "mutation",
14865
+ auth: "admin"
14866
+ })
14818
14867
  }
14819
14868
  };
14820
14869
  /** Wire/storage schema for one icon id. */
@@ -15445,11 +15494,14 @@ var deviceManagerCapability = {
15445
15494
  /** Remove a device from the DB + in-memory registry. Called by DeviceManagerApi.remove(). */
15446
15495
  removeDevice: method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }),
15447
15496
  /** Persist device config blob. Called by DeviceConfig.set/setAll(). */
15448
- persistConfig: method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }),
15497
+ persistConfig: method(DevicePersistConfigPayloadSchema, _void(), {
15498
+ kind: "mutation",
15499
+ auth: "admin"
15500
+ }),
15449
15501
  /** Load persisted config for a device. Called at restore time. */
15450
- loadConfig: method(object({ deviceId: number() }), record(string(), unknown())),
15502
+ loadConfig: method(object({ deviceId: number() }), record(string(), unknown()), { auth: "admin" }),
15451
15503
  /** Load persisted runtime state. Called at device adopt time. */
15452
- loadRuntimeState: method(object({ deviceId: number() }), record(string(), unknown())),
15504
+ loadRuntimeState: method(object({ deviceId: number() }), record(string(), unknown()), { auth: "admin" }),
15453
15505
  /** Load operator-organisational meta surface for a device. Called by
15454
15506
  * the kernel proxy to populate `DeviceContext.deviceMeta` before
15455
15507
  * the device class constructor runs. Returns `null` when the id
@@ -16014,6 +16066,23 @@ var deviceManagerCapability = {
16014
16066
  */
16015
16067
  getAllBindings: method(object({}), array(DeviceBindingsForDeviceSchema)),
16016
16068
  /**
16069
+ * The ids of every device bound to AT LEAST ONE of `capNames` — ids only,
16070
+ * ascending (D636).
16071
+ *
16072
+ * The targeted form of "which devices are openings / carry a battery":
16073
+ * before it, the alarm's household scan and the battery section's picker
16074
+ * read the whole fleet (~433 KB slim) and then `getBindingsBatch` over
16075
+ * ~900 ids in five calls. Same resolver as `getBindings` (so a WRAPPED
16076
+ * binding counts exactly as the routing does), walked server-side like
16077
+ * `getAllBindings`; only the matching ids cross the wire. Names are the
16078
+ * caller's to resolve with the targeted `listAll({ deviceIds })`.
16079
+ *
16080
+ * Tier: `protected`, like its siblings `getBindings` / `getBindingsBatch` /
16081
+ * `getAllBindings` — which devices carry a cap is routing metadata every
16082
+ * signed-in client already reads, and it reveals nothing those do not.
16083
+ */
16084
+ listDeviceIdsByCaps: method(object({ capNames: array(string().min(1)).min(1).max(16) }), array(number())),
16085
+ /**
16017
16086
  * Activate (or deactivate) a wrapper addon for a (device, cap) pair — the
16018
16087
  * per-camera function switch's ONE authority (D62).
16019
16088
  *
@@ -18098,12 +18167,27 @@ var mqttBrokerCapability = {
18098
18167
  },
18099
18168
  methods: {
18100
18169
  listBrokers: method(_void(), array(BrokerInfoSchema)),
18101
- getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema),
18102
- addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }),
18103
- removeBroker: method(IdInputSchema, _void(), { kind: "mutation" }),
18104
- testConnection: method(IdInputSchema, TestResultSchema$1, { kind: "mutation" }),
18105
- startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }),
18106
- stopEmbeddedBroker: method(IdInputSchema, _void(), { kind: "mutation" }),
18170
+ getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }),
18171
+ addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, {
18172
+ kind: "mutation",
18173
+ auth: "admin"
18174
+ }),
18175
+ removeBroker: method(IdInputSchema, _void(), {
18176
+ kind: "mutation",
18177
+ auth: "admin"
18178
+ }),
18179
+ testConnection: method(IdInputSchema, TestResultSchema$1, {
18180
+ kind: "mutation",
18181
+ auth: "admin"
18182
+ }),
18183
+ startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, {
18184
+ kind: "mutation",
18185
+ auth: "admin"
18186
+ }),
18187
+ stopEmbeddedBroker: method(IdInputSchema, _void(), {
18188
+ kind: "mutation",
18189
+ auth: "admin"
18190
+ }),
18107
18191
  getStatus: method(_void(), StatusSchema)
18108
18192
  }
18109
18193
  };
@@ -18418,6 +18502,18 @@ var TargetKindSchema = object({
18418
18502
  */
18419
18503
  iconMediaType: string().optional(),
18420
18504
  configSchema: ConfigSchemaPassthrough,
18505
+ /**
18506
+ * The config keys that decide WHERE this kind's secrets are sent (server,
18507
+ * base URL, instance, chat, recipient). A save that changes any of them
18508
+ * while leaving a secret redacted is refused by the provider (D634), so an
18509
+ * editor uses this to ask for the secret on exactly those edits instead of
18510
+ * on every edit.
18511
+ *
18512
+ * Optional: absent from a provider that holds no secret (the Home Assistant
18513
+ * kinds) and from a provider older than this field — an editor that finds
18514
+ * it absent must assume ANY edit may need the secret.
18515
+ */
18516
+ destinationKeys: array(string()).optional(),
18421
18517
  supportsDiscovery: boolean(),
18422
18518
  caps: TargetKindCapsSchema
18423
18519
  });
@@ -18462,25 +18558,40 @@ var notificationOutputCapability = {
18462
18558
  mode: "collection",
18463
18559
  methods: {
18464
18560
  listTargetKinds: method(object({}), array(TargetKindSchema)),
18465
- listTargets: method(object({}), array(TargetSchema)),
18561
+ listTargets: method(object({}), array(TargetSchema), { auth: "admin" }),
18466
18562
  discoverTargets: method(object({
18467
18563
  kind: string(),
18468
18564
  config: record(string(), unknown()).optional()
18469
- }), array(DiscoveredTargetSchema)),
18565
+ }), array(DiscoveredTargetSchema), { auth: "admin" }),
18470
18566
  send: method(object({
18471
18567
  targetId: string(),
18472
18568
  notification: NotificationSchema
18473
- }), SendResultSchema, { kind: "mutation" }),
18569
+ }), SendResultSchema, {
18570
+ kind: "mutation",
18571
+ auth: "admin"
18572
+ }),
18474
18573
  testTarget: method(object({
18475
18574
  targetId: string(),
18476
18575
  sample: NotificationSchema.optional()
18477
- }), TestResultSchema, { kind: "mutation" }),
18478
- upsertTarget: method(object({ target: TargetSchema }), TargetSchema, { kind: "mutation" }),
18479
- deleteTarget: method(object({ targetId: string() }), _void(), { kind: "mutation" }),
18576
+ }), TestResultSchema, {
18577
+ kind: "mutation",
18578
+ auth: "admin"
18579
+ }),
18580
+ upsertTarget: method(object({ target: TargetSchema }), TargetSchema, {
18581
+ kind: "mutation",
18582
+ auth: "admin"
18583
+ }),
18584
+ deleteTarget: method(object({ targetId: string() }), _void(), {
18585
+ kind: "mutation",
18586
+ auth: "admin"
18587
+ }),
18480
18588
  setTargetEnabled: method(object({
18481
18589
  targetId: string(),
18482
18590
  enabled: boolean()
18483
- }), _void(), { kind: "mutation" })
18591
+ }), _void(), {
18592
+ kind: "mutation",
18593
+ auth: "admin"
18594
+ })
18484
18595
  }
18485
18596
  };
18486
18597
  new Set([
@@ -19363,6 +19474,19 @@ var NcSystemEventConditionSchema = object({
19363
19474
  * does not carry) matches no `deviceTypes` list.
19364
19475
  */
19365
19476
  deviceTypes: array(string().min(1)).min(1).optional(),
19477
+ /**
19478
+ * Devices this rule NEVER speaks about, whatever else matched. Scoped to the
19479
+ * same kind family as `deviceIds` (`systemEventFilterApplies(kind,
19480
+ * 'deviceIds')`) and applied AFTER it: include first, then exclude. A
19481
+ * consumable subject (`consumable:<id>:<key>`) is excluded by its device id.
19482
+ *
19483
+ * It never fails closed: a subject that carries no device id is not in the
19484
+ * list, so it is not excluded. "Every battery except the one thermometer that
19485
+ * reads 0 % forever" is the question this answers — expressed as an include
19486
+ * list it would have to name every other battery device, and every device
19487
+ * adopted later would be silently left out (D636).
19488
+ */
19489
+ excludeDeviceIds: array(number().int()).min(1).optional(),
19366
19490
  nodeIds: array(string().min(1)).min(1).optional(),
19367
19491
  packageNames: array(string().min(1)).min(1).optional()
19368
19492
  });
@@ -20554,6 +20678,14 @@ var NC_CONDITION_CATALOG = [
20554
20678
  value: "server-updated",
20555
20679
  label: "Server updated"
20556
20680
  },
20681
+ {
20682
+ value: "device-battery-low",
20683
+ label: "Battery low"
20684
+ },
20685
+ {
20686
+ value: "device-battery-normal",
20687
+ label: "Battery back to normal"
20688
+ },
20557
20689
  {
20558
20690
  value: "device-consumable-low",
20559
20691
  label: "Consumable low"
@@ -28128,54 +28260,78 @@ var storageCapability = {
28128
28260
  resolve: method(object({
28129
28261
  location: StorageLocationRefSchema,
28130
28262
  relativePath: string()
28131
- }), string()),
28263
+ }), string(), { auth: "admin" }),
28132
28264
  write: method(object({
28133
28265
  location: StorageLocationRefSchema,
28134
28266
  relativePath: string(),
28135
28267
  data: _instanceof(Uint8Array)
28136
- }), _void(), { kind: "mutation" }),
28268
+ }), _void(), {
28269
+ kind: "mutation",
28270
+ auth: "admin"
28271
+ }),
28137
28272
  read: method(object({
28138
28273
  location: StorageLocationRefSchema,
28139
28274
  relativePath: string()
28140
- }), _instanceof(Uint8Array)),
28275
+ }), _instanceof(Uint8Array), { auth: "admin" }),
28141
28276
  exists: method(object({
28142
28277
  location: StorageLocationRefSchema,
28143
28278
  relativePath: string()
28144
- }), boolean()),
28279
+ }), boolean(), { auth: "admin" }),
28145
28280
  list: method(object({
28146
28281
  location: StorageLocationRefSchema,
28147
28282
  prefix: string().optional()
28148
- }), array(string()).readonly()),
28283
+ }), array(string()).readonly(), { auth: "admin" }),
28149
28284
  delete: method(object({
28150
28285
  location: StorageLocationRefSchema,
28151
28286
  relativePath: string()
28152
- }), _void(), { kind: "mutation" }),
28287
+ }), _void(), {
28288
+ kind: "mutation",
28289
+ auth: "admin"
28290
+ }),
28153
28291
  getAvailableSpace: method(object({ location: StorageLocationRefSchema }), number().nullable()),
28154
28292
  beginUpload: method(object({
28155
28293
  location: StorageLocationRefSchema,
28156
28294
  relativePath: string(),
28157
28295
  sizeBytes: number().optional()
28158
- }), object({ uploadId: string() }), { kind: "mutation" }),
28296
+ }), object({ uploadId: string() }), {
28297
+ kind: "mutation",
28298
+ auth: "admin"
28299
+ }),
28159
28300
  writeChunk: method(object({
28160
28301
  uploadId: string(),
28161
28302
  offset: number(),
28162
28303
  data: _instanceof(Uint8Array)
28163
- }), _void(), { kind: "mutation" }),
28164
- finalizeUpload: method(object({ uploadId: string() }), _void(), { kind: "mutation" }),
28165
- abortUpload: method(object({ uploadId: string() }), _void(), { kind: "mutation" }),
28304
+ }), _void(), {
28305
+ kind: "mutation",
28306
+ auth: "admin"
28307
+ }),
28308
+ finalizeUpload: method(object({ uploadId: string() }), _void(), {
28309
+ kind: "mutation",
28310
+ auth: "admin"
28311
+ }),
28312
+ abortUpload: method(object({ uploadId: string() }), _void(), {
28313
+ kind: "mutation",
28314
+ auth: "admin"
28315
+ }),
28166
28316
  beginDownload: method(object({
28167
28317
  location: StorageLocationRefSchema,
28168
28318
  relativePath: string()
28169
28319
  }), object({
28170
28320
  downloadId: string(),
28171
28321
  sizeBytes: number()
28172
- }), { kind: "mutation" }),
28322
+ }), {
28323
+ kind: "mutation",
28324
+ auth: "admin"
28325
+ }),
28173
28326
  readChunk: method(object({
28174
28327
  downloadId: string(),
28175
28328
  offset: number(),
28176
28329
  length: number()
28177
- }), _instanceof(Uint8Array)),
28178
- endDownload: method(object({ downloadId: string() }), _void(), { kind: "mutation" }),
28330
+ }), _instanceof(Uint8Array), { auth: "admin" }),
28331
+ endDownload: method(object({ downloadId: string() }), _void(), {
28332
+ kind: "mutation",
28333
+ auth: "admin"
28334
+ }),
28179
28335
  listLocations: method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()),
28180
28336
  listLocationDeclarations: method(_void(), array(StorageLocationDeclarationSchema).readonly()),
28181
28337
  upsertLocation: method(StorageLocationSchema.omit({
@@ -30263,7 +30419,67 @@ var WebrtcLadderDecisionSchema = object({
30263
30419
  serverSending: boolean().nullable(),
30264
30420
  /** Epoch ms. The overlay prints its age; a decision from 40 minutes ago
30265
30421
  * must not read like one from this second. */
30266
- at: number()
30422
+ at: number(),
30423
+ /** The broker's own cause when it is finer than `cause` can carry, e.g.
30424
+ * `trial-revert` (reported as `stall`/`loss` for older consumers). Optional:
30425
+ * an older server strips it instead of rejecting the answer. */
30426
+ causeDetail: string().optional()
30427
+ });
30428
+ var WebrtcClimbHoldSchema = object({
30429
+ /** `stall-building` — the client receives ≪ what is sent; `delivery` — the
30430
+ * current rung is not landing whole; `no-evidence` — no receiver feedback;
30431
+ * `warming` — healthy, accumulating the streak; `cooldown` — too soon after
30432
+ * a change; `capacity` — a MEASURED probe below the next rung's bar;
30433
+ * `try-unclean` — no capacity evidence, and the path is not clean enough to
30434
+ * try; `try-backoff` — a try reverted, waiting out its backoff; `trial` —
30435
+ * this rung IS a try, reverting if it does not land; `suspended` —
30436
+ * recorded playback on the track. */
30437
+ code: string(),
30438
+ /** The rung a climb would go to. */
30439
+ nextTier: CamProfileSchema,
30440
+ /** Bytes received ÷ bytes sent over the delivery window (≥ one GOP). */
30441
+ deliveryRatio: number().nullable(),
30442
+ deliveryWindowMs: number().nullable(),
30443
+ /** The ratio a climb requires. */
30444
+ climbDeliveryRatio: number(),
30445
+ /** The receiver's bandwidth estimate (REMB), kbps. Capped by what is sent. */
30446
+ capacityKbps: number().nullable(),
30447
+ /** The viewer's downlink probe for this session, kbps. */
30448
+ probeKbps: number().nullable(),
30449
+ /** The next rung's measured bitrate, kbps. */
30450
+ nextTierKbps: number().nullable(),
30451
+ capacityMargin: number(),
30452
+ /** The capacity a climb to `nextTier` needs, kbps (bitrate × margin, or the
30453
+ * client ladder threshold when the rung has measured nothing). */
30454
+ neededKbps: number().nullable(),
30455
+ /** For `try-unclean`: which clean-path condition failed (a `WebrtcTryBlocker`,
30456
+ * carried as a string for the same reason as `code`). */
30457
+ tryBlockedBy: string().nullable(),
30458
+ /** The delivery ratio and the loss ratio a try requires / must stay under.
30459
+ * Optional, like every field added to this schema after it first shipped:
30460
+ * the router validates output, so a REQUIRED new field makes a newer server
30461
+ * reject an older broker's whole answer (review m1). */
30462
+ tryDeliveryRatio: number().optional(),
30463
+ tryMaxLossRatio: number().optional(),
30464
+ /** For `try-backoff`: time until the next try, ms. */
30465
+ retryInMs: number().nullable(),
30466
+ /** The last try that reverted in this viewer session. */
30467
+ lastRevert: object({
30468
+ tier: CamProfileSchema,
30469
+ deliveryRatio: number().nullable(),
30470
+ stalled: boolean(),
30471
+ at: number()
30472
+ }).nullable(),
30473
+ /** For `trial`: how long this rung has been on trial, and for how long it must hold. */
30474
+ trialForMs: number().nullable(),
30475
+ trialMs: number().nullable(),
30476
+ healthyForMs: number().nullable(),
30477
+ requiredHealthyMs: number().nullable(),
30478
+ /** Epoch ms this hold's code began. */
30479
+ since: number(),
30480
+ /** The same one-line account the broker logs, e.g.
30481
+ * `held: delivery 0.97 over 4.0s ok, REMB 480 kbps < mid 1800 kbps × 1.2`. */
30482
+ summary: string()
30267
30483
  });
30268
30484
  /** Per-tier count of MEASURED downgrades this viewer session has suffered. */
30269
30485
  var WebrtcTierFailureSchema = object({
@@ -30327,7 +30543,12 @@ var WebrtcSessionDebugSchema = object({
30327
30543
  tierFailures: array(WebrtcTierFailureSchema),
30328
30544
  /** Successful promotions in this viewer session (drives the progressive
30329
30545
  * healthy timer). Null when no ladder is running. */
30330
- upgradeCount: number().nullable()
30546
+ upgradeCount: number().nullable(),
30547
+ /** Why the ladder is not climbing right now. Null when no ladder runs, it
30548
+ * is at the top rung, or it just moved. Optional because this output is
30549
+ * validated by the router: a server carrying this schema must still accept
30550
+ * the answer of a stream-broker deployed before the field existed. */
30551
+ climbHold: WebrtcClimbHoldSchema.nullable().optional()
30331
30552
  });
30332
30553
  /**
30333
30554
  * WebRTC session — device-scoped facade over the system `webrtc` cap.
@@ -36176,6 +36397,11 @@ var ClientNetworkStatsSchema = object({
36176
36397
  jitterMs: number(),
36177
36398
  estimatedBandwidthKbps: number(),
36178
36399
  packetLossPercent: number().min(0).max(100),
36400
+ /** The viewer's latest `/adaptive-probe` reading, Mbps — whatever it read
36401
+ * (D635 I4). Absent when it never probed or the probe failed (unknown). */
36402
+ downlinkMbps: number().optional(),
36403
+ /** Age of that reading when this report was sent, ms. */
36404
+ downlinkAgeMs: number().optional(),
36179
36405
  lastUpdated: number()
36180
36406
  });
36181
36407
  var DeviceNetworkStatsSchema = object({
@@ -36195,7 +36421,11 @@ var networkQualityCapability = {
36195
36421
  rttMs: number().min(0).max(6e4),
36196
36422
  jitterMs: number().min(0).max(1e4),
36197
36423
  estimatedBandwidthKbps: number().min(0).max(1e6),
36198
- packetLossPercent: number().min(0).max(100)
36424
+ packetLossPercent: number().min(0).max(100),
36425
+ /** Latest downlink probe, Mbps, whatever it read; absent = never / failed. */
36426
+ downlinkMbps: number().min(0).max(1e5).optional(),
36427
+ /** Age of that probe when this report is sent, ms. */
36428
+ downlinkAgeMs: number().min(0).max(864e5).optional()
36199
36429
  }), _void(), { kind: "mutation" })
36200
36430
  },
36201
36431
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
@@ -45871,6 +46101,12 @@ Object.freeze({
45871
46101
  addonId: null,
45872
46102
  access: "view"
45873
46103
  },
46104
+ "deviceManager.listDeviceIdsByCaps": {
46105
+ capName: "device-manager",
46106
+ capScope: "system",
46107
+ addonId: null,
46108
+ access: "view"
46109
+ },
45874
46110
  "deviceManager.listLocationDescriptions": {
45875
46111
  capName: "device-manager",
45876
46112
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { o as i, s as a } from "./responsive-BJTLnN-p.mjs";
2
+ import { o as i, s as a } from "./responsive-BOpuh3Lr.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 = a("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-vuxTr550.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C-OUB_74.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.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 { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-MNSRdKcG.mjs";
3
+ import { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CVM3jGoe.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
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 { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { s as i } from "./responsive-BJTLnN-p.mjs";
2
+ import { s as i } from "./responsive-BOpuh3Lr.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 { s as e } from "./responsive-BJTLnN-p.mjs";
1
+ import { s as e } from "./responsive-BOpuh3Lr.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 { s as e } from "./responsive-BJTLnN-p.mjs";
1
+ import { s as e } from "./responsive-BOpuh3Lr.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-Dk3P7vDo.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-CGBPavbq.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.135",
3
+ "version": "0.1.137",
4
4
  "description": "Binds camera on-screen-display slots to live state and recognitions",
5
5
  "keywords": [
6
6
  "camstack",