@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.js CHANGED
@@ -5363,7 +5363,7 @@ var ZodIssueCode = {
5363
5363
  var ZodFirstPartyTypeKind;
5364
5364
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5365
5365
  //#endregion
5366
- //#region ../types/dist/sleep-pM_J7YnY.mjs
5366
+ //#region ../types/dist/sleep-D_4W7xuQ.mjs
5367
5367
  /**
5368
5368
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5369
5369
  * window to float samples (D455).
@@ -7414,7 +7414,10 @@ var deviceOpsCapability = {
7414
7414
  setConfig: method(object({
7415
7415
  deviceId: number(),
7416
7416
  values: record(string(), unknown())
7417
- }), _void(), { kind: "mutation" }),
7417
+ }), _void(), {
7418
+ kind: "mutation",
7419
+ auth: "admin"
7420
+ }),
7418
7421
  /**
7419
7422
  * Invoke a device custom action on a forked/remote device (the
7420
7423
  * cross-process transport for `IDevice.runDeviceAction`). Mirrors
@@ -7431,7 +7434,10 @@ var deviceOpsCapability = {
7431
7434
  * (close sockets, stop background tasks, …). The device-manager still
7432
7435
  * performs its own persistence cleanup before/after this call.
7433
7436
  */
7434
- removeDevice: method(object({ deviceId: number() }), _void(), { kind: "mutation" }),
7437
+ removeDevice: method(object({ deviceId: number() }), _void(), {
7438
+ kind: "mutation",
7439
+ auth: "admin"
7440
+ }),
7435
7441
  /**
7436
7442
  * Build the ConfigUISchema (FormBuilder input shape) from the device's
7437
7443
  * Zod config schema. Runs on the worker that owns the IDevice so the
@@ -12057,7 +12063,7 @@ var brokerCapability = {
12057
12063
  }),
12058
12064
  /** Read the broker's cached state for a key. Returns `null` when
12059
12065
  * unknown to the broker (never published / unknown entity). */
12060
- getState: method(GetStateInputSchema, unknown().nullable()),
12066
+ getState: method(GetStateInputSchema, unknown().nullable(), { auth: "admin" }),
12061
12067
  /** Status method — explicit registration with a `z.void()` input so
12062
12068
  * the codegen-generated tRPC router types its input as
12063
12069
  * `{addonId?: string, nodeId?: string}` (system-scoped collection
@@ -13614,6 +13620,16 @@ var CollectionIndexSchema = object({
13614
13620
  * namespace, or none. Making the door enforce it is tracked separately —
13615
13621
  * it renames tables, so it needs a migration.
13616
13622
  *
13623
+ * **So every method is `auth: 'admin'` (D634).** Because nothing scopes a
13624
+ * call to its caller, a `protected` method here was a raw, unredacted read
13625
+ * (and write) of every addon's collections for any role holding
13626
+ * `category:system` — which is every role: a `viewer` could read every
13627
+ * notifier token in plaintext from `notifiers:notification-targets`. No
13628
+ * browser or app client calls this cap. Addons are not affected: an
13629
+ * addon's `ctx.api` cap call is resolved to the provider directly and never
13630
+ * enters the tRPC router (so the tier gates sessions and tokens, never
13631
+ * addons), and the hub itself calls it through the capability registry.
13632
+ *
13617
13633
  * - `{ collection: 'addon-settings' }` → table `addon-settings`
13618
13634
  * - `{ namespace: 'my-addon', collection: 'addon-settings' }` →
13619
13635
  * table `my-addon:addon-settings`
@@ -13635,14 +13651,17 @@ var settingsStoreCapability = {
13635
13651
  namespace: string().optional(),
13636
13652
  collection: string(),
13637
13653
  key: string()
13638
- }), unknown()),
13654
+ }), unknown(), { auth: "admin" }),
13639
13655
  /** Set a value by key in a collection (upsert). */
13640
13656
  set: method(object({
13641
13657
  namespace: string().optional(),
13642
13658
  collection: string(),
13643
13659
  key: string(),
13644
13660
  value: unknown()
13645
- }), _void(), { kind: "mutation" }),
13661
+ }), _void(), {
13662
+ kind: "mutation",
13663
+ auth: "admin"
13664
+ }),
13646
13665
  /**
13647
13666
  * Rows matching a filter.
13648
13667
  *
@@ -13663,7 +13682,7 @@ var settingsStoreCapability = {
13663
13682
  collection: string(),
13664
13683
  filter: QueryFilterSchema.optional(),
13665
13684
  columns: array(string()).readonly().optional()
13666
- }), array(SettingsRecordSchema).readonly()),
13685
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }),
13667
13686
  /**
13668
13687
  * Make a SLOT hold this row — insert it, or update whatever already
13669
13688
  * occupies the slot — and answer with the id the row HAS.
@@ -13716,7 +13735,10 @@ var settingsStoreCapability = {
13716
13735
  }), object({
13717
13736
  /** The id the row HAS: assigned by SQLite on an insert, or the existing
13718
13737
  * row's own id on an update. */
13719
- id: union([string(), number()]) }), { kind: "mutation" }),
13738
+ id: union([string(), number()]) }), {
13739
+ kind: "mutation",
13740
+ auth: "admin"
13741
+ }),
13720
13742
  /** Insert a new record. */
13721
13743
  insert: method(object({
13722
13744
  namespace: string().optional(),
@@ -13731,7 +13753,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13731
13753
  * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
13732
13754
  * primary key — which is the only place an auto key is knowable.
13733
13755
  */
13734
- id: union([string(), number()]) }), { kind: "mutation" }),
13756
+ id: union([string(), number()]) }), {
13757
+ kind: "mutation",
13758
+ auth: "admin"
13759
+ }),
13735
13760
  /**
13736
13761
  * Insert MANY records in ONE transaction, returning how many landed.
13737
13762
  *
@@ -13759,20 +13784,29 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13759
13784
  namespace: string().optional(),
13760
13785
  collection: string(),
13761
13786
  records: array(BulkRecordSchema).readonly()
13762
- }), object({ inserted: number().int() }), { kind: "mutation" }),
13787
+ }), object({ inserted: number().int() }), {
13788
+ kind: "mutation",
13789
+ auth: "admin"
13790
+ }),
13763
13791
  /** Update an existing record by ID. */
13764
13792
  update: method(object({
13765
13793
  namespace: string().optional(),
13766
13794
  collection: string(),
13767
13795
  id: string(),
13768
13796
  data: record(string(), unknown())
13769
- }), _void(), { kind: "mutation" }),
13797
+ }), _void(), {
13798
+ kind: "mutation",
13799
+ auth: "admin"
13800
+ }),
13770
13801
  /** Delete a record by key/ID. */
13771
13802
  delete: method(object({
13772
13803
  namespace: string().optional(),
13773
13804
  collection: string(),
13774
13805
  key: string()
13775
- }), _void(), { kind: "mutation" }),
13806
+ }), _void(), {
13807
+ kind: "mutation",
13808
+ auth: "admin"
13809
+ }),
13776
13810
  /**
13777
13811
  * Delete every record matching `filter`, in ONE statement, returning how
13778
13812
  * many rows went. This exists because its absence made every retention
@@ -13791,7 +13825,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13791
13825
  namespace: string().optional(),
13792
13826
  collection: string(),
13793
13827
  filter: MutationFilterSchema
13794
- }), object({ deleted: number().int() }), { kind: "mutation" }),
13828
+ }), object({ deleted: number().int() }), {
13829
+ kind: "mutation",
13830
+ auth: "admin"
13831
+ }),
13795
13832
  /**
13796
13833
  * Apply `data` to every record matching `filter`, in one statement,
13797
13834
  * returning how many rows changed. Same filter contract as
@@ -13802,13 +13839,16 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13802
13839
  collection: string(),
13803
13840
  filter: MutationFilterSchema,
13804
13841
  data: record(string(), unknown())
13805
- }), object({ updated: number().int() }), { kind: "mutation" }),
13842
+ }), object({ updated: number().int() }), {
13843
+ kind: "mutation",
13844
+ auth: "admin"
13845
+ }),
13806
13846
  /** Count entries in a collection, optionally filtered. */
13807
13847
  count: method(object({
13808
13848
  namespace: string().optional(),
13809
13849
  collection: string(),
13810
13850
  filter: QueryFilterSchema.optional()
13811
- }), number()),
13851
+ }), number(), { auth: "admin" }),
13812
13852
  /**
13813
13853
  * `COUNT(*)` and one `SUM` / `MIN` / `MAX` per requested field, in ONE
13814
13854
  * statement, over the rows `filter` selects.
@@ -13834,7 +13874,7 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13834
13874
  collection: string(),
13835
13875
  fields: array(AggregateFieldSchema).readonly(),
13836
13876
  filter: QueryFilterSchema.optional()
13837
- }), AggregateResultSchema),
13877
+ }), AggregateResultSchema, { auth: "admin" }),
13838
13878
  /** Grouped counts per ((field-origin)/bucketSize) bucket, filtered. */
13839
13879
  histogram: method(object({
13840
13880
  namespace: string().optional(),
@@ -13846,12 +13886,12 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13846
13886
  }), array(object({
13847
13887
  bucket: number().int(),
13848
13888
  count: number().int()
13849
- })).readonly()),
13889
+ })).readonly(), { auth: "admin" }),
13850
13890
  /** Check if a collection is empty. */
13851
13891
  isEmpty: method(object({
13852
13892
  namespace: string().optional(),
13853
13893
  collection: string()
13854
- }), boolean()),
13894
+ }), boolean(), { auth: "admin" }),
13855
13895
  /**
13856
13896
  * Declare a typed (SQL-backed) collection with explicit columns +
13857
13897
  * indexes. Idempotent: re-declaring an existing collection with the
@@ -13872,7 +13912,10 @@ id: union([string(), number()]) }), { kind: "mutation" }),
13872
13912
  collection: string(),
13873
13913
  columns: array(CollectionColumnSchema).readonly(),
13874
13914
  indexes: array(CollectionIndexSchema).readonly().optional()
13875
- }), _void(), { kind: "mutation" })
13915
+ }), _void(), {
13916
+ kind: "mutation",
13917
+ auth: "admin"
13918
+ })
13876
13919
  }
13877
13920
  };
13878
13921
  /**
@@ -14817,8 +14860,14 @@ var deviceExportCapability = {
14817
14860
  getStatus: method(_void(), DeviceExportStatusSchema),
14818
14861
  listSupportedDeviceKinds: method(_void(), array(DeviceKindSchema)),
14819
14862
  listExposedDevices: method(_void(), array(ExposedDeviceSchema)),
14820
- exposeDevice: method(ExposeInputSchema, _void(), { kind: "mutation" }),
14821
- unexposeDevice: method(UnexposeInputSchema, _void(), { kind: "mutation" })
14863
+ exposeDevice: method(ExposeInputSchema, _void(), {
14864
+ kind: "mutation",
14865
+ auth: "admin"
14866
+ }),
14867
+ unexposeDevice: method(UnexposeInputSchema, _void(), {
14868
+ kind: "mutation",
14869
+ auth: "admin"
14870
+ })
14822
14871
  }
14823
14872
  };
14824
14873
  /** Wire/storage schema for one icon id. */
@@ -15449,11 +15498,14 @@ var deviceManagerCapability = {
15449
15498
  /** Remove a device from the DB + in-memory registry. Called by DeviceManagerApi.remove(). */
15450
15499
  removeDevice: method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }),
15451
15500
  /** Persist device config blob. Called by DeviceConfig.set/setAll(). */
15452
- persistConfig: method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }),
15501
+ persistConfig: method(DevicePersistConfigPayloadSchema, _void(), {
15502
+ kind: "mutation",
15503
+ auth: "admin"
15504
+ }),
15453
15505
  /** Load persisted config for a device. Called at restore time. */
15454
- loadConfig: method(object({ deviceId: number() }), record(string(), unknown())),
15506
+ loadConfig: method(object({ deviceId: number() }), record(string(), unknown()), { auth: "admin" }),
15455
15507
  /** Load persisted runtime state. Called at device adopt time. */
15456
- loadRuntimeState: method(object({ deviceId: number() }), record(string(), unknown())),
15508
+ loadRuntimeState: method(object({ deviceId: number() }), record(string(), unknown()), { auth: "admin" }),
15457
15509
  /** Load operator-organisational meta surface for a device. Called by
15458
15510
  * the kernel proxy to populate `DeviceContext.deviceMeta` before
15459
15511
  * the device class constructor runs. Returns `null` when the id
@@ -16018,6 +16070,23 @@ var deviceManagerCapability = {
16018
16070
  */
16019
16071
  getAllBindings: method(object({}), array(DeviceBindingsForDeviceSchema)),
16020
16072
  /**
16073
+ * The ids of every device bound to AT LEAST ONE of `capNames` — ids only,
16074
+ * ascending (D636).
16075
+ *
16076
+ * The targeted form of "which devices are openings / carry a battery":
16077
+ * before it, the alarm's household scan and the battery section's picker
16078
+ * read the whole fleet (~433 KB slim) and then `getBindingsBatch` over
16079
+ * ~900 ids in five calls. Same resolver as `getBindings` (so a WRAPPED
16080
+ * binding counts exactly as the routing does), walked server-side like
16081
+ * `getAllBindings`; only the matching ids cross the wire. Names are the
16082
+ * caller's to resolve with the targeted `listAll({ deviceIds })`.
16083
+ *
16084
+ * Tier: `protected`, like its siblings `getBindings` / `getBindingsBatch` /
16085
+ * `getAllBindings` — which devices carry a cap is routing metadata every
16086
+ * signed-in client already reads, and it reveals nothing those do not.
16087
+ */
16088
+ listDeviceIdsByCaps: method(object({ capNames: array(string().min(1)).min(1).max(16) }), array(number())),
16089
+ /**
16021
16090
  * Activate (or deactivate) a wrapper addon for a (device, cap) pair — the
16022
16091
  * per-camera function switch's ONE authority (D62).
16023
16092
  *
@@ -18102,12 +18171,27 @@ var mqttBrokerCapability = {
18102
18171
  },
18103
18172
  methods: {
18104
18173
  listBrokers: method(_void(), array(BrokerInfoSchema)),
18105
- getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema),
18106
- addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }),
18107
- removeBroker: method(IdInputSchema, _void(), { kind: "mutation" }),
18108
- testConnection: method(IdInputSchema, TestResultSchema$1, { kind: "mutation" }),
18109
- startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }),
18110
- stopEmbeddedBroker: method(IdInputSchema, _void(), { kind: "mutation" }),
18174
+ getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }),
18175
+ addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, {
18176
+ kind: "mutation",
18177
+ auth: "admin"
18178
+ }),
18179
+ removeBroker: method(IdInputSchema, _void(), {
18180
+ kind: "mutation",
18181
+ auth: "admin"
18182
+ }),
18183
+ testConnection: method(IdInputSchema, TestResultSchema$1, {
18184
+ kind: "mutation",
18185
+ auth: "admin"
18186
+ }),
18187
+ startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, {
18188
+ kind: "mutation",
18189
+ auth: "admin"
18190
+ }),
18191
+ stopEmbeddedBroker: method(IdInputSchema, _void(), {
18192
+ kind: "mutation",
18193
+ auth: "admin"
18194
+ }),
18111
18195
  getStatus: method(_void(), StatusSchema)
18112
18196
  }
18113
18197
  };
@@ -18422,6 +18506,18 @@ var TargetKindSchema = object({
18422
18506
  */
18423
18507
  iconMediaType: string().optional(),
18424
18508
  configSchema: ConfigSchemaPassthrough,
18509
+ /**
18510
+ * The config keys that decide WHERE this kind's secrets are sent (server,
18511
+ * base URL, instance, chat, recipient). A save that changes any of them
18512
+ * while leaving a secret redacted is refused by the provider (D634), so an
18513
+ * editor uses this to ask for the secret on exactly those edits instead of
18514
+ * on every edit.
18515
+ *
18516
+ * Optional: absent from a provider that holds no secret (the Home Assistant
18517
+ * kinds) and from a provider older than this field — an editor that finds
18518
+ * it absent must assume ANY edit may need the secret.
18519
+ */
18520
+ destinationKeys: array(string()).optional(),
18425
18521
  supportsDiscovery: boolean(),
18426
18522
  caps: TargetKindCapsSchema
18427
18523
  });
@@ -18466,25 +18562,40 @@ var notificationOutputCapability = {
18466
18562
  mode: "collection",
18467
18563
  methods: {
18468
18564
  listTargetKinds: method(object({}), array(TargetKindSchema)),
18469
- listTargets: method(object({}), array(TargetSchema)),
18565
+ listTargets: method(object({}), array(TargetSchema), { auth: "admin" }),
18470
18566
  discoverTargets: method(object({
18471
18567
  kind: string(),
18472
18568
  config: record(string(), unknown()).optional()
18473
- }), array(DiscoveredTargetSchema)),
18569
+ }), array(DiscoveredTargetSchema), { auth: "admin" }),
18474
18570
  send: method(object({
18475
18571
  targetId: string(),
18476
18572
  notification: NotificationSchema
18477
- }), SendResultSchema, { kind: "mutation" }),
18573
+ }), SendResultSchema, {
18574
+ kind: "mutation",
18575
+ auth: "admin"
18576
+ }),
18478
18577
  testTarget: method(object({
18479
18578
  targetId: string(),
18480
18579
  sample: NotificationSchema.optional()
18481
- }), TestResultSchema, { kind: "mutation" }),
18482
- upsertTarget: method(object({ target: TargetSchema }), TargetSchema, { kind: "mutation" }),
18483
- deleteTarget: method(object({ targetId: string() }), _void(), { kind: "mutation" }),
18580
+ }), TestResultSchema, {
18581
+ kind: "mutation",
18582
+ auth: "admin"
18583
+ }),
18584
+ upsertTarget: method(object({ target: TargetSchema }), TargetSchema, {
18585
+ kind: "mutation",
18586
+ auth: "admin"
18587
+ }),
18588
+ deleteTarget: method(object({ targetId: string() }), _void(), {
18589
+ kind: "mutation",
18590
+ auth: "admin"
18591
+ }),
18484
18592
  setTargetEnabled: method(object({
18485
18593
  targetId: string(),
18486
18594
  enabled: boolean()
18487
- }), _void(), { kind: "mutation" })
18595
+ }), _void(), {
18596
+ kind: "mutation",
18597
+ auth: "admin"
18598
+ })
18488
18599
  }
18489
18600
  };
18490
18601
  new Set([
@@ -19367,6 +19478,19 @@ var NcSystemEventConditionSchema = object({
19367
19478
  * does not carry) matches no `deviceTypes` list.
19368
19479
  */
19369
19480
  deviceTypes: array(string().min(1)).min(1).optional(),
19481
+ /**
19482
+ * Devices this rule NEVER speaks about, whatever else matched. Scoped to the
19483
+ * same kind family as `deviceIds` (`systemEventFilterApplies(kind,
19484
+ * 'deviceIds')`) and applied AFTER it: include first, then exclude. A
19485
+ * consumable subject (`consumable:<id>:<key>`) is excluded by its device id.
19486
+ *
19487
+ * It never fails closed: a subject that carries no device id is not in the
19488
+ * list, so it is not excluded. "Every battery except the one thermometer that
19489
+ * reads 0 % forever" is the question this answers — expressed as an include
19490
+ * list it would have to name every other battery device, and every device
19491
+ * adopted later would be silently left out (D636).
19492
+ */
19493
+ excludeDeviceIds: array(number().int()).min(1).optional(),
19370
19494
  nodeIds: array(string().min(1)).min(1).optional(),
19371
19495
  packageNames: array(string().min(1)).min(1).optional()
19372
19496
  });
@@ -20558,6 +20682,14 @@ var NC_CONDITION_CATALOG = [
20558
20682
  value: "server-updated",
20559
20683
  label: "Server updated"
20560
20684
  },
20685
+ {
20686
+ value: "device-battery-low",
20687
+ label: "Battery low"
20688
+ },
20689
+ {
20690
+ value: "device-battery-normal",
20691
+ label: "Battery back to normal"
20692
+ },
20561
20693
  {
20562
20694
  value: "device-consumable-low",
20563
20695
  label: "Consumable low"
@@ -28132,54 +28264,78 @@ var storageCapability = {
28132
28264
  resolve: method(object({
28133
28265
  location: StorageLocationRefSchema,
28134
28266
  relativePath: string()
28135
- }), string()),
28267
+ }), string(), { auth: "admin" }),
28136
28268
  write: method(object({
28137
28269
  location: StorageLocationRefSchema,
28138
28270
  relativePath: string(),
28139
28271
  data: _instanceof(Uint8Array)
28140
- }), _void(), { kind: "mutation" }),
28272
+ }), _void(), {
28273
+ kind: "mutation",
28274
+ auth: "admin"
28275
+ }),
28141
28276
  read: method(object({
28142
28277
  location: StorageLocationRefSchema,
28143
28278
  relativePath: string()
28144
- }), _instanceof(Uint8Array)),
28279
+ }), _instanceof(Uint8Array), { auth: "admin" }),
28145
28280
  exists: method(object({
28146
28281
  location: StorageLocationRefSchema,
28147
28282
  relativePath: string()
28148
- }), boolean()),
28283
+ }), boolean(), { auth: "admin" }),
28149
28284
  list: method(object({
28150
28285
  location: StorageLocationRefSchema,
28151
28286
  prefix: string().optional()
28152
- }), array(string()).readonly()),
28287
+ }), array(string()).readonly(), { auth: "admin" }),
28153
28288
  delete: method(object({
28154
28289
  location: StorageLocationRefSchema,
28155
28290
  relativePath: string()
28156
- }), _void(), { kind: "mutation" }),
28291
+ }), _void(), {
28292
+ kind: "mutation",
28293
+ auth: "admin"
28294
+ }),
28157
28295
  getAvailableSpace: method(object({ location: StorageLocationRefSchema }), number().nullable()),
28158
28296
  beginUpload: method(object({
28159
28297
  location: StorageLocationRefSchema,
28160
28298
  relativePath: string(),
28161
28299
  sizeBytes: number().optional()
28162
- }), object({ uploadId: string() }), { kind: "mutation" }),
28300
+ }), object({ uploadId: string() }), {
28301
+ kind: "mutation",
28302
+ auth: "admin"
28303
+ }),
28163
28304
  writeChunk: method(object({
28164
28305
  uploadId: string(),
28165
28306
  offset: number(),
28166
28307
  data: _instanceof(Uint8Array)
28167
- }), _void(), { kind: "mutation" }),
28168
- finalizeUpload: method(object({ uploadId: string() }), _void(), { kind: "mutation" }),
28169
- abortUpload: method(object({ uploadId: string() }), _void(), { kind: "mutation" }),
28308
+ }), _void(), {
28309
+ kind: "mutation",
28310
+ auth: "admin"
28311
+ }),
28312
+ finalizeUpload: method(object({ uploadId: string() }), _void(), {
28313
+ kind: "mutation",
28314
+ auth: "admin"
28315
+ }),
28316
+ abortUpload: method(object({ uploadId: string() }), _void(), {
28317
+ kind: "mutation",
28318
+ auth: "admin"
28319
+ }),
28170
28320
  beginDownload: method(object({
28171
28321
  location: StorageLocationRefSchema,
28172
28322
  relativePath: string()
28173
28323
  }), object({
28174
28324
  downloadId: string(),
28175
28325
  sizeBytes: number()
28176
- }), { kind: "mutation" }),
28326
+ }), {
28327
+ kind: "mutation",
28328
+ auth: "admin"
28329
+ }),
28177
28330
  readChunk: method(object({
28178
28331
  downloadId: string(),
28179
28332
  offset: number(),
28180
28333
  length: number()
28181
- }), _instanceof(Uint8Array)),
28182
- endDownload: method(object({ downloadId: string() }), _void(), { kind: "mutation" }),
28334
+ }), _instanceof(Uint8Array), { auth: "admin" }),
28335
+ endDownload: method(object({ downloadId: string() }), _void(), {
28336
+ kind: "mutation",
28337
+ auth: "admin"
28338
+ }),
28183
28339
  listLocations: method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()),
28184
28340
  listLocationDeclarations: method(_void(), array(StorageLocationDeclarationSchema).readonly()),
28185
28341
  upsertLocation: method(StorageLocationSchema.omit({
@@ -30267,7 +30423,67 @@ var WebrtcLadderDecisionSchema = object({
30267
30423
  serverSending: boolean().nullable(),
30268
30424
  /** Epoch ms. The overlay prints its age; a decision from 40 minutes ago
30269
30425
  * must not read like one from this second. */
30270
- at: number()
30426
+ at: number(),
30427
+ /** The broker's own cause when it is finer than `cause` can carry, e.g.
30428
+ * `trial-revert` (reported as `stall`/`loss` for older consumers). Optional:
30429
+ * an older server strips it instead of rejecting the answer. */
30430
+ causeDetail: string().optional()
30431
+ });
30432
+ var WebrtcClimbHoldSchema = object({
30433
+ /** `stall-building` — the client receives ≪ what is sent; `delivery` — the
30434
+ * current rung is not landing whole; `no-evidence` — no receiver feedback;
30435
+ * `warming` — healthy, accumulating the streak; `cooldown` — too soon after
30436
+ * a change; `capacity` — a MEASURED probe below the next rung's bar;
30437
+ * `try-unclean` — no capacity evidence, and the path is not clean enough to
30438
+ * try; `try-backoff` — a try reverted, waiting out its backoff; `trial` —
30439
+ * this rung IS a try, reverting if it does not land; `suspended` —
30440
+ * recorded playback on the track. */
30441
+ code: string(),
30442
+ /** The rung a climb would go to. */
30443
+ nextTier: CamProfileSchema,
30444
+ /** Bytes received ÷ bytes sent over the delivery window (≥ one GOP). */
30445
+ deliveryRatio: number().nullable(),
30446
+ deliveryWindowMs: number().nullable(),
30447
+ /** The ratio a climb requires. */
30448
+ climbDeliveryRatio: number(),
30449
+ /** The receiver's bandwidth estimate (REMB), kbps. Capped by what is sent. */
30450
+ capacityKbps: number().nullable(),
30451
+ /** The viewer's downlink probe for this session, kbps. */
30452
+ probeKbps: number().nullable(),
30453
+ /** The next rung's measured bitrate, kbps. */
30454
+ nextTierKbps: number().nullable(),
30455
+ capacityMargin: number(),
30456
+ /** The capacity a climb to `nextTier` needs, kbps (bitrate × margin, or the
30457
+ * client ladder threshold when the rung has measured nothing). */
30458
+ neededKbps: number().nullable(),
30459
+ /** For `try-unclean`: which clean-path condition failed (a `WebrtcTryBlocker`,
30460
+ * carried as a string for the same reason as `code`). */
30461
+ tryBlockedBy: string().nullable(),
30462
+ /** The delivery ratio and the loss ratio a try requires / must stay under.
30463
+ * Optional, like every field added to this schema after it first shipped:
30464
+ * the router validates output, so a REQUIRED new field makes a newer server
30465
+ * reject an older broker's whole answer (review m1). */
30466
+ tryDeliveryRatio: number().optional(),
30467
+ tryMaxLossRatio: number().optional(),
30468
+ /** For `try-backoff`: time until the next try, ms. */
30469
+ retryInMs: number().nullable(),
30470
+ /** The last try that reverted in this viewer session. */
30471
+ lastRevert: object({
30472
+ tier: CamProfileSchema,
30473
+ deliveryRatio: number().nullable(),
30474
+ stalled: boolean(),
30475
+ at: number()
30476
+ }).nullable(),
30477
+ /** For `trial`: how long this rung has been on trial, and for how long it must hold. */
30478
+ trialForMs: number().nullable(),
30479
+ trialMs: number().nullable(),
30480
+ healthyForMs: number().nullable(),
30481
+ requiredHealthyMs: number().nullable(),
30482
+ /** Epoch ms this hold's code began. */
30483
+ since: number(),
30484
+ /** The same one-line account the broker logs, e.g.
30485
+ * `held: delivery 0.97 over 4.0s ok, REMB 480 kbps < mid 1800 kbps × 1.2`. */
30486
+ summary: string()
30271
30487
  });
30272
30488
  /** Per-tier count of MEASURED downgrades this viewer session has suffered. */
30273
30489
  var WebrtcTierFailureSchema = object({
@@ -30331,7 +30547,12 @@ var WebrtcSessionDebugSchema = object({
30331
30547
  tierFailures: array(WebrtcTierFailureSchema),
30332
30548
  /** Successful promotions in this viewer session (drives the progressive
30333
30549
  * healthy timer). Null when no ladder is running. */
30334
- upgradeCount: number().nullable()
30550
+ upgradeCount: number().nullable(),
30551
+ /** Why the ladder is not climbing right now. Null when no ladder runs, it
30552
+ * is at the top rung, or it just moved. Optional because this output is
30553
+ * validated by the router: a server carrying this schema must still accept
30554
+ * the answer of a stream-broker deployed before the field existed. */
30555
+ climbHold: WebrtcClimbHoldSchema.nullable().optional()
30335
30556
  });
30336
30557
  /**
30337
30558
  * WebRTC session — device-scoped facade over the system `webrtc` cap.
@@ -36180,6 +36401,11 @@ var ClientNetworkStatsSchema = object({
36180
36401
  jitterMs: number(),
36181
36402
  estimatedBandwidthKbps: number(),
36182
36403
  packetLossPercent: number().min(0).max(100),
36404
+ /** The viewer's latest `/adaptive-probe` reading, Mbps — whatever it read
36405
+ * (D635 I4). Absent when it never probed or the probe failed (unknown). */
36406
+ downlinkMbps: number().optional(),
36407
+ /** Age of that reading when this report was sent, ms. */
36408
+ downlinkAgeMs: number().optional(),
36183
36409
  lastUpdated: number()
36184
36410
  });
36185
36411
  var DeviceNetworkStatsSchema = object({
@@ -36199,7 +36425,11 @@ var networkQualityCapability = {
36199
36425
  rttMs: number().min(0).max(6e4),
36200
36426
  jitterMs: number().min(0).max(1e4),
36201
36427
  estimatedBandwidthKbps: number().min(0).max(1e6),
36202
- packetLossPercent: number().min(0).max(100)
36428
+ packetLossPercent: number().min(0).max(100),
36429
+ /** Latest downlink probe, Mbps, whatever it read; absent = never / failed. */
36430
+ downlinkMbps: number().min(0).max(1e5).optional(),
36431
+ /** Age of that probe when this report is sent, ms. */
36432
+ downlinkAgeMs: number().min(0).max(864e5).optional()
36203
36433
  }), _void(), { kind: "mutation" })
36204
36434
  },
36205
36435
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
@@ -45875,6 +46105,12 @@ Object.freeze({
45875
46105
  addonId: null,
45876
46106
  access: "view"
45877
46107
  },
46108
+ "deviceManager.listDeviceIdsByCaps": {
46109
+ capName: "device-manager",
46110
+ capScope: "system",
46111
+ addonId: null,
46112
+ access: "view"
46113
+ },
45878
46114
  "deviceManager.listLocationDescriptions": {
45879
46115
  capName: "device-manager",
45880
46116
  capScope: "system",