@camstack/addon-matter-broker 0.2.105 → 0.2.107

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.
package/dist/addon.js CHANGED
@@ -12355,7 +12355,23 @@ var PickStreamRequirementsSchema = object({
12355
12355
  * This is what lets one picker serve both the bypass and the full source
12356
12356
  * choice, instead of a consumer scoring privately when the bypass misses.
12357
12357
  */
12358
- allowTranscode: boolean().optional()
12358
+ allowTranscode: boolean().optional(),
12359
+ /**
12360
+ * Consider ONLY streams the broker has bound to a profile slot.
12361
+ *
12362
+ * A consumer that dials the broker — which is every exporter, since none
12363
+ * of them may open the camera's own URL — can do nothing with a source
12364
+ * that has no slot: there is no restream to dial. Without this the picker
12365
+ * can name such a stream, and each consumer discovers the dead end for
12366
+ * itself: Alexa's `profileForCamStream` returns `null` and it quietly
12367
+ * falls back, and HomeKit would have had to grow the same function again.
12368
+ *
12369
+ * Default `false`, and deliberately so: the BROKER itself picks through
12370
+ * here when it decides which source to BIND to a slot
12371
+ * (`computeInitialAssignment`), and it must see the unbound ones or it
12372
+ * could never bind them.
12373
+ */
12374
+ requireProfileBound: boolean().optional()
12359
12375
  }).readonly();
12360
12376
  var PickStreamPreferencesSchema = object({
12361
12377
  /**
@@ -12396,7 +12412,43 @@ var PickedCamStreamSchema = object({
12396
12412
  */
12397
12413
  transcodes: boolean(),
12398
12414
  /** One-line explanation of why this stream won — for logs / debug UI. */
12399
- reason: string$2()
12415
+ reason: string$2(),
12416
+ /**
12417
+ * The broker profile slot this source is bound to, when it is bound.
12418
+ *
12419
+ * Answered HERE because every consumer needs it and none of them can get it
12420
+ * from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
12421
+ * a second cap read plus a `null` branch — and HomeKit was about to write
12422
+ * the same function a second time.
12423
+ *
12424
+ * Absent when the source has no slot, which a caller passing
12425
+ * `requireProfileBound` can never see.
12426
+ */
12427
+ profile: CamProfileSchema.optional(),
12428
+ /** The broker id of that slot, for logs that must name what was dialled. */
12429
+ brokerId: string$2().optional(),
12430
+ /**
12431
+ * The broker restream URL to dial for this stream.
12432
+ *
12433
+ * An exporter must never open the camera's own URL — the broker is the one
12434
+ * that dials the camera, and every consumer goes through its restream. So
12435
+ * the picker answers with the thing a consumer may actually use, instead of
12436
+ * naming a source and leaving each caller to look the URL up.
12437
+ */
12438
+ url: string$2().optional(),
12439
+ /**
12440
+ * Frames per second this stream really delivers, and where the number came
12441
+ * from.
12442
+ *
12443
+ * It is here because getting it wrong is expensive and silent: a HomeKit
12444
+ * accessory advertised 720p at 24 fps while the slot serving it ran at 9,
12445
+ * and the controller rendered nothing at all. The source is carried with the
12446
+ * value for the same reason the bitrate evidence is: `published` is what the
12447
+ * publisher declares and `measured` is what the broker observed, and they
12448
+ * are not interchangeable.
12449
+ */
12450
+ fps: number().positive().optional(),
12451
+ fpsSource: _enum(["published", "measured"]).optional()
12400
12452
  });
12401
12453
  /**
12402
12454
  * Camera streams — device-scoped facade over the system `stream-broker`.
@@ -13596,6 +13648,70 @@ var LocationIconAssignmentSchema = object({
13596
13648
  locationKey: string$2(),
13597
13649
  icon: LocationIconIdSchema
13598
13650
  });
13651
+ /**
13652
+ * One (location, description) assignment as it travels.
13653
+ *
13654
+ * Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
13655
+ * reason: this lived for a while in the post-analysis addon's own settings,
13656
+ * keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
13657
+ * the Locations page carried the icon and silently orphaned the description —
13658
+ * two authorities for one thing, joined by two different rules. Now both hang
13659
+ * off the location itself, on `locationIconKey`.
13660
+ */
13661
+ var LocationDescriptionAssignmentSchema = object({
13662
+ locationKey: string$2(),
13663
+ description: string$2()
13664
+ });
13665
+ /**
13666
+ * A SITE ZONE — a named part of the property that several locations belong to.
13667
+ *
13668
+ * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
13669
+ * kitchen. A camera belongs to exactly one location, and a location to at most
13670
+ * one zone, so a camera's zone is derived and never stored on the device: the
13671
+ * whole point of this entity is that grouping rooms touches no device row.
13672
+ *
13673
+ * ## Why not `zone`
13674
+ *
13675
+ * Because `zone` is already the most loaded word in this product: 612 source
13676
+ * files and 24 Italian strings where it means a DETECTION zone drawn on a
13677
+ * camera. The two are unrelated — one is a polygon in a frame, the other is a
13678
+ * set of rooms — and a reader who confuses them will look for a camera's
13679
+ * bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
13680
+ * word by calling the drawn one what it actually is: a detection zone.
13681
+ *
13682
+ * ## The key
13683
+ *
13684
+ * `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
13685
+ * use (`locationIconKey`). Membership and the icon both hang off it, so a
13686
+ * case-only rename keeps them, which is exactly the orphaning that cost us a
13687
+ * silently-dropped location description.
13688
+ *
13689
+ * The icon vocabulary is the location one, unchanged: a zone is drawn on the
13690
+ * same two surfaces by the same glyph map, so a second vocabulary would be a
13691
+ * second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
13692
+ */
13693
+ /**
13694
+ * One zone as it travels: its key, the label the operator typed, its icon and
13695
+ * the locations inside it.
13696
+ *
13697
+ * The LABEL is carried alongside the key because the key is lossy on purpose —
13698
+ * a surface must show "Zona notte", not "zona notte". Locations are carried
13699
+ * here, rather than left to a second call, because every consumer wants both
13700
+ * at once and a viewer that asked twice could render a zone whose membership
13701
+ * it has not fetched yet.
13702
+ *
13703
+ * `icon: null` means nobody chose one, which is NOT the fallback pin: only one
13704
+ * of those two is a choice, and a picker has to draw them differently.
13705
+ */
13706
+ var SiteZoneSchema = object({
13707
+ zoneKey: string$2(),
13708
+ label: string$2(),
13709
+ icon: LocationIconIdSchema.nullable(),
13710
+ /** Folded location keys, sorted. A location listed here need not be
13711
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
13712
+ * the ones that most want grouping. */
13713
+ locationKeys: array(string$2())
13714
+ });
13599
13715
  var ProviderStatusSchema = object({
13600
13716
  connected: boolean(),
13601
13717
  deviceCount: number(),
@@ -14194,6 +14310,33 @@ method(object({
14194
14310
  }), _void(), {
14195
14311
  kind: "mutation",
14196
14312
  auth: "admin"
14313
+ }), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
14314
+ location: string$2(),
14315
+ description: string$2().max(400).nullable()
14316
+ }), _void(), {
14317
+ kind: "mutation",
14318
+ auth: "admin"
14319
+ }), method(_void(), array(SiteZoneSchema)), method(object({
14320
+ name: string$2(),
14321
+ icon: LocationIconIdSchema.nullable().optional()
14322
+ }), _void(), {
14323
+ kind: "mutation",
14324
+ auth: "admin"
14325
+ }), method(object({ name: string$2() }), _void(), {
14326
+ kind: "mutation",
14327
+ auth: "admin"
14328
+ }), method(object({
14329
+ from: string$2(),
14330
+ to: string$2()
14331
+ }), _void(), {
14332
+ kind: "mutation",
14333
+ auth: "admin"
14334
+ }), method(object({
14335
+ location: string$2(),
14336
+ zone: string$2().nullable()
14337
+ }), _void(), {
14338
+ kind: "mutation",
14339
+ auth: "admin"
14197
14340
  }), method(object({
14198
14341
  deviceId: number(),
14199
14342
  disabled: boolean()
@@ -37121,6 +37264,12 @@ Object.freeze({
37121
37264
  addonId: null,
37122
37265
  access: "view"
37123
37266
  },
37267
+ "deviceManager.listLocationDescriptions": {
37268
+ capName: "device-manager",
37269
+ capScope: "system",
37270
+ addonId: null,
37271
+ access: "view"
37272
+ },
37124
37273
  "deviceManager.listLocationIcons": {
37125
37274
  capName: "device-manager",
37126
37275
  capScope: "system",
@@ -37139,6 +37288,12 @@ Object.freeze({
37139
37288
  addonId: null,
37140
37289
  access: "view"
37141
37290
  },
37291
+ "deviceManager.listSiteZones": {
37292
+ capName: "device-manager",
37293
+ capScope: "system",
37294
+ addonId: null,
37295
+ access: "view"
37296
+ },
37142
37297
  "deviceManager.listWrappersForCap": {
37143
37298
  capName: "device-manager",
37144
37299
  capScope: "system",
@@ -37223,12 +37378,24 @@ Object.freeze({
37223
37378
  addonId: null,
37224
37379
  access: "delete"
37225
37380
  },
37381
+ "deviceManager.removeSiteZone": {
37382
+ capName: "device-manager",
37383
+ capScope: "system",
37384
+ addonId: null,
37385
+ access: "delete"
37386
+ },
37226
37387
  "deviceManager.renameLocation": {
37227
37388
  capName: "device-manager",
37228
37389
  capScope: "system",
37229
37390
  addonId: null,
37230
37391
  access: "create"
37231
37392
  },
37393
+ "deviceManager.renameSiteZone": {
37394
+ capName: "device-manager",
37395
+ capScope: "system",
37396
+ addonId: null,
37397
+ access: "create"
37398
+ },
37232
37399
  "deviceManager.runDeviceAction": {
37233
37400
  capName: "device-manager",
37234
37401
  capScope: "system",
@@ -37271,12 +37438,24 @@ Object.freeze({
37271
37438
  addonId: null,
37272
37439
  access: "create"
37273
37440
  },
37441
+ "deviceManager.setLocationDescription": {
37442
+ capName: "device-manager",
37443
+ capScope: "system",
37444
+ addonId: null,
37445
+ access: "create"
37446
+ },
37274
37447
  "deviceManager.setLocationIcon": {
37275
37448
  capName: "device-manager",
37276
37449
  capScope: "system",
37277
37450
  addonId: null,
37278
37451
  access: "create"
37279
37452
  },
37453
+ "deviceManager.setLocationZone": {
37454
+ capName: "device-manager",
37455
+ capScope: "system",
37456
+ addonId: null,
37457
+ access: "create"
37458
+ },
37280
37459
  "deviceManager.setMetadata": {
37281
37460
  capName: "device-manager",
37282
37461
  capScope: "system",
@@ -37307,6 +37486,12 @@ Object.freeze({
37307
37486
  addonId: null,
37308
37487
  access: "create"
37309
37488
  },
37489
+ "deviceManager.setSiteZone": {
37490
+ capName: "device-manager",
37491
+ capScope: "system",
37492
+ addonId: null,
37493
+ access: "create"
37494
+ },
37310
37495
  "deviceManager.setStreamProfileMap": {
37311
37496
  capName: "device-manager",
37312
37497
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -12353,7 +12353,23 @@ var PickStreamRequirementsSchema = object({
12353
12353
  * This is what lets one picker serve both the bypass and the full source
12354
12354
  * choice, instead of a consumer scoring privately when the bypass misses.
12355
12355
  */
12356
- allowTranscode: boolean().optional()
12356
+ allowTranscode: boolean().optional(),
12357
+ /**
12358
+ * Consider ONLY streams the broker has bound to a profile slot.
12359
+ *
12360
+ * A consumer that dials the broker — which is every exporter, since none
12361
+ * of them may open the camera's own URL — can do nothing with a source
12362
+ * that has no slot: there is no restream to dial. Without this the picker
12363
+ * can name such a stream, and each consumer discovers the dead end for
12364
+ * itself: Alexa's `profileForCamStream` returns `null` and it quietly
12365
+ * falls back, and HomeKit would have had to grow the same function again.
12366
+ *
12367
+ * Default `false`, and deliberately so: the BROKER itself picks through
12368
+ * here when it decides which source to BIND to a slot
12369
+ * (`computeInitialAssignment`), and it must see the unbound ones or it
12370
+ * could never bind them.
12371
+ */
12372
+ requireProfileBound: boolean().optional()
12357
12373
  }).readonly();
12358
12374
  var PickStreamPreferencesSchema = object({
12359
12375
  /**
@@ -12394,7 +12410,43 @@ var PickedCamStreamSchema = object({
12394
12410
  */
12395
12411
  transcodes: boolean(),
12396
12412
  /** One-line explanation of why this stream won — for logs / debug UI. */
12397
- reason: string$2()
12413
+ reason: string$2(),
12414
+ /**
12415
+ * The broker profile slot this source is bound to, when it is bound.
12416
+ *
12417
+ * Answered HERE because every consumer needs it and none of them can get it
12418
+ * from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
12419
+ * a second cap read plus a `null` branch — and HomeKit was about to write
12420
+ * the same function a second time.
12421
+ *
12422
+ * Absent when the source has no slot, which a caller passing
12423
+ * `requireProfileBound` can never see.
12424
+ */
12425
+ profile: CamProfileSchema.optional(),
12426
+ /** The broker id of that slot, for logs that must name what was dialled. */
12427
+ brokerId: string$2().optional(),
12428
+ /**
12429
+ * The broker restream URL to dial for this stream.
12430
+ *
12431
+ * An exporter must never open the camera's own URL — the broker is the one
12432
+ * that dials the camera, and every consumer goes through its restream. So
12433
+ * the picker answers with the thing a consumer may actually use, instead of
12434
+ * naming a source and leaving each caller to look the URL up.
12435
+ */
12436
+ url: string$2().optional(),
12437
+ /**
12438
+ * Frames per second this stream really delivers, and where the number came
12439
+ * from.
12440
+ *
12441
+ * It is here because getting it wrong is expensive and silent: a HomeKit
12442
+ * accessory advertised 720p at 24 fps while the slot serving it ran at 9,
12443
+ * and the controller rendered nothing at all. The source is carried with the
12444
+ * value for the same reason the bitrate evidence is: `published` is what the
12445
+ * publisher declares and `measured` is what the broker observed, and they
12446
+ * are not interchangeable.
12447
+ */
12448
+ fps: number().positive().optional(),
12449
+ fpsSource: _enum(["published", "measured"]).optional()
12398
12450
  });
12399
12451
  /**
12400
12452
  * Camera streams — device-scoped facade over the system `stream-broker`.
@@ -13594,6 +13646,70 @@ var LocationIconAssignmentSchema = object({
13594
13646
  locationKey: string$2(),
13595
13647
  icon: LocationIconIdSchema
13596
13648
  });
13649
+ /**
13650
+ * One (location, description) assignment as it travels.
13651
+ *
13652
+ * Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
13653
+ * reason: this lived for a while in the post-analysis addon's own settings,
13654
+ * keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
13655
+ * the Locations page carried the icon and silently orphaned the description —
13656
+ * two authorities for one thing, joined by two different rules. Now both hang
13657
+ * off the location itself, on `locationIconKey`.
13658
+ */
13659
+ var LocationDescriptionAssignmentSchema = object({
13660
+ locationKey: string$2(),
13661
+ description: string$2()
13662
+ });
13663
+ /**
13664
+ * A SITE ZONE — a named part of the property that several locations belong to.
13665
+ *
13666
+ * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
13667
+ * kitchen. A camera belongs to exactly one location, and a location to at most
13668
+ * one zone, so a camera's zone is derived and never stored on the device: the
13669
+ * whole point of this entity is that grouping rooms touches no device row.
13670
+ *
13671
+ * ## Why not `zone`
13672
+ *
13673
+ * Because `zone` is already the most loaded word in this product: 612 source
13674
+ * files and 24 Italian strings where it means a DETECTION zone drawn on a
13675
+ * camera. The two are unrelated — one is a polygon in a frame, the other is a
13676
+ * set of rooms — and a reader who confuses them will look for a camera's
13677
+ * bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
13678
+ * word by calling the drawn one what it actually is: a detection zone.
13679
+ *
13680
+ * ## The key
13681
+ *
13682
+ * `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
13683
+ * use (`locationIconKey`). Membership and the icon both hang off it, so a
13684
+ * case-only rename keeps them, which is exactly the orphaning that cost us a
13685
+ * silently-dropped location description.
13686
+ *
13687
+ * The icon vocabulary is the location one, unchanged: a zone is drawn on the
13688
+ * same two surfaces by the same glyph map, so a second vocabulary would be a
13689
+ * second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
13690
+ */
13691
+ /**
13692
+ * One zone as it travels: its key, the label the operator typed, its icon and
13693
+ * the locations inside it.
13694
+ *
13695
+ * The LABEL is carried alongside the key because the key is lossy on purpose —
13696
+ * a surface must show "Zona notte", not "zona notte". Locations are carried
13697
+ * here, rather than left to a second call, because every consumer wants both
13698
+ * at once and a viewer that asked twice could render a zone whose membership
13699
+ * it has not fetched yet.
13700
+ *
13701
+ * `icon: null` means nobody chose one, which is NOT the fallback pin: only one
13702
+ * of those two is a choice, and a picker has to draw them differently.
13703
+ */
13704
+ var SiteZoneSchema = object({
13705
+ zoneKey: string$2(),
13706
+ label: string$2(),
13707
+ icon: LocationIconIdSchema.nullable(),
13708
+ /** Folded location keys, sorted. A location listed here need not be
13709
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
13710
+ * the ones that most want grouping. */
13711
+ locationKeys: array(string$2())
13712
+ });
13597
13713
  var ProviderStatusSchema = object({
13598
13714
  connected: boolean(),
13599
13715
  deviceCount: number(),
@@ -14192,6 +14308,33 @@ method(object({
14192
14308
  }), _void(), {
14193
14309
  kind: "mutation",
14194
14310
  auth: "admin"
14311
+ }), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
14312
+ location: string$2(),
14313
+ description: string$2().max(400).nullable()
14314
+ }), _void(), {
14315
+ kind: "mutation",
14316
+ auth: "admin"
14317
+ }), method(_void(), array(SiteZoneSchema)), method(object({
14318
+ name: string$2(),
14319
+ icon: LocationIconIdSchema.nullable().optional()
14320
+ }), _void(), {
14321
+ kind: "mutation",
14322
+ auth: "admin"
14323
+ }), method(object({ name: string$2() }), _void(), {
14324
+ kind: "mutation",
14325
+ auth: "admin"
14326
+ }), method(object({
14327
+ from: string$2(),
14328
+ to: string$2()
14329
+ }), _void(), {
14330
+ kind: "mutation",
14331
+ auth: "admin"
14332
+ }), method(object({
14333
+ location: string$2(),
14334
+ zone: string$2().nullable()
14335
+ }), _void(), {
14336
+ kind: "mutation",
14337
+ auth: "admin"
14195
14338
  }), method(object({
14196
14339
  deviceId: number(),
14197
14340
  disabled: boolean()
@@ -37119,6 +37262,12 @@ Object.freeze({
37119
37262
  addonId: null,
37120
37263
  access: "view"
37121
37264
  },
37265
+ "deviceManager.listLocationDescriptions": {
37266
+ capName: "device-manager",
37267
+ capScope: "system",
37268
+ addonId: null,
37269
+ access: "view"
37270
+ },
37122
37271
  "deviceManager.listLocationIcons": {
37123
37272
  capName: "device-manager",
37124
37273
  capScope: "system",
@@ -37137,6 +37286,12 @@ Object.freeze({
37137
37286
  addonId: null,
37138
37287
  access: "view"
37139
37288
  },
37289
+ "deviceManager.listSiteZones": {
37290
+ capName: "device-manager",
37291
+ capScope: "system",
37292
+ addonId: null,
37293
+ access: "view"
37294
+ },
37140
37295
  "deviceManager.listWrappersForCap": {
37141
37296
  capName: "device-manager",
37142
37297
  capScope: "system",
@@ -37221,12 +37376,24 @@ Object.freeze({
37221
37376
  addonId: null,
37222
37377
  access: "delete"
37223
37378
  },
37379
+ "deviceManager.removeSiteZone": {
37380
+ capName: "device-manager",
37381
+ capScope: "system",
37382
+ addonId: null,
37383
+ access: "delete"
37384
+ },
37224
37385
  "deviceManager.renameLocation": {
37225
37386
  capName: "device-manager",
37226
37387
  capScope: "system",
37227
37388
  addonId: null,
37228
37389
  access: "create"
37229
37390
  },
37391
+ "deviceManager.renameSiteZone": {
37392
+ capName: "device-manager",
37393
+ capScope: "system",
37394
+ addonId: null,
37395
+ access: "create"
37396
+ },
37230
37397
  "deviceManager.runDeviceAction": {
37231
37398
  capName: "device-manager",
37232
37399
  capScope: "system",
@@ -37269,12 +37436,24 @@ Object.freeze({
37269
37436
  addonId: null,
37270
37437
  access: "create"
37271
37438
  },
37439
+ "deviceManager.setLocationDescription": {
37440
+ capName: "device-manager",
37441
+ capScope: "system",
37442
+ addonId: null,
37443
+ access: "create"
37444
+ },
37272
37445
  "deviceManager.setLocationIcon": {
37273
37446
  capName: "device-manager",
37274
37447
  capScope: "system",
37275
37448
  addonId: null,
37276
37449
  access: "create"
37277
37450
  },
37451
+ "deviceManager.setLocationZone": {
37452
+ capName: "device-manager",
37453
+ capScope: "system",
37454
+ addonId: null,
37455
+ access: "create"
37456
+ },
37278
37457
  "deviceManager.setMetadata": {
37279
37458
  capName: "device-manager",
37280
37459
  capScope: "system",
@@ -37305,6 +37484,12 @@ Object.freeze({
37305
37484
  addonId: null,
37306
37485
  access: "create"
37307
37486
  },
37487
+ "deviceManager.setSiteZone": {
37488
+ capName: "device-manager",
37489
+ capScope: "system",
37490
+ addonId: null,
37491
+ access: "create"
37492
+ },
37308
37493
  "deviceManager.setStreamProfileMap": {
37309
37494
  capName: "device-manager",
37310
37495
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.105",
3
+ "version": "0.2.107",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",