@camstack/addon-decoder-nodeav 1.2.106 → 1.2.108
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/index.js +187 -2
- package/dist/index.mjs +187 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12300,7 +12300,23 @@ var PickStreamRequirementsSchema = object({
|
|
|
12300
12300
|
* This is what lets one picker serve both the bypass and the full source
|
|
12301
12301
|
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12302
12302
|
*/
|
|
12303
|
-
allowTranscode: boolean().optional()
|
|
12303
|
+
allowTranscode: boolean().optional(),
|
|
12304
|
+
/**
|
|
12305
|
+
* Consider ONLY streams the broker has bound to a profile slot.
|
|
12306
|
+
*
|
|
12307
|
+
* A consumer that dials the broker — which is every exporter, since none
|
|
12308
|
+
* of them may open the camera's own URL — can do nothing with a source
|
|
12309
|
+
* that has no slot: there is no restream to dial. Without this the picker
|
|
12310
|
+
* can name such a stream, and each consumer discovers the dead end for
|
|
12311
|
+
* itself: Alexa's `profileForCamStream` returns `null` and it quietly
|
|
12312
|
+
* falls back, and HomeKit would have had to grow the same function again.
|
|
12313
|
+
*
|
|
12314
|
+
* Default `false`, and deliberately so: the BROKER itself picks through
|
|
12315
|
+
* here when it decides which source to BIND to a slot
|
|
12316
|
+
* (`computeInitialAssignment`), and it must see the unbound ones or it
|
|
12317
|
+
* could never bind them.
|
|
12318
|
+
*/
|
|
12319
|
+
requireProfileBound: boolean().optional()
|
|
12304
12320
|
}).readonly();
|
|
12305
12321
|
var PickStreamPreferencesSchema = object({
|
|
12306
12322
|
/**
|
|
@@ -12341,7 +12357,43 @@ var PickedCamStreamSchema = object({
|
|
|
12341
12357
|
*/
|
|
12342
12358
|
transcodes: boolean(),
|
|
12343
12359
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12344
|
-
reason: string()
|
|
12360
|
+
reason: string(),
|
|
12361
|
+
/**
|
|
12362
|
+
* The broker profile slot this source is bound to, when it is bound.
|
|
12363
|
+
*
|
|
12364
|
+
* Answered HERE because every consumer needs it and none of them can get it
|
|
12365
|
+
* from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
|
|
12366
|
+
* a second cap read plus a `null` branch — and HomeKit was about to write
|
|
12367
|
+
* the same function a second time.
|
|
12368
|
+
*
|
|
12369
|
+
* Absent when the source has no slot, which a caller passing
|
|
12370
|
+
* `requireProfileBound` can never see.
|
|
12371
|
+
*/
|
|
12372
|
+
profile: CamProfileSchema.optional(),
|
|
12373
|
+
/** The broker id of that slot, for logs that must name what was dialled. */
|
|
12374
|
+
brokerId: string().optional(),
|
|
12375
|
+
/**
|
|
12376
|
+
* The broker restream URL to dial for this stream.
|
|
12377
|
+
*
|
|
12378
|
+
* An exporter must never open the camera's own URL — the broker is the one
|
|
12379
|
+
* that dials the camera, and every consumer goes through its restream. So
|
|
12380
|
+
* the picker answers with the thing a consumer may actually use, instead of
|
|
12381
|
+
* naming a source and leaving each caller to look the URL up.
|
|
12382
|
+
*/
|
|
12383
|
+
url: string().optional(),
|
|
12384
|
+
/**
|
|
12385
|
+
* Frames per second this stream really delivers, and where the number came
|
|
12386
|
+
* from.
|
|
12387
|
+
*
|
|
12388
|
+
* It is here because getting it wrong is expensive and silent: a HomeKit
|
|
12389
|
+
* accessory advertised 720p at 24 fps while the slot serving it ran at 9,
|
|
12390
|
+
* and the controller rendered nothing at all. The source is carried with the
|
|
12391
|
+
* value for the same reason the bitrate evidence is: `published` is what the
|
|
12392
|
+
* publisher declares and `measured` is what the broker observed, and they
|
|
12393
|
+
* are not interchangeable.
|
|
12394
|
+
*/
|
|
12395
|
+
fps: number().positive().optional(),
|
|
12396
|
+
fpsSource: _enum(["published", "measured"]).optional()
|
|
12345
12397
|
});
|
|
12346
12398
|
DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CameraStreamSchema).readonly()), method(object({ deviceId: number().int().nonnegative() }), array(ProfileSlotSchema).readonly()), method(object({
|
|
12347
12399
|
deviceId: number().int().nonnegative(),
|
|
@@ -13408,6 +13460,70 @@ var LocationIconAssignmentSchema = object({
|
|
|
13408
13460
|
locationKey: string(),
|
|
13409
13461
|
icon: LocationIconIdSchema
|
|
13410
13462
|
});
|
|
13463
|
+
/**
|
|
13464
|
+
* One (location, description) assignment as it travels.
|
|
13465
|
+
*
|
|
13466
|
+
* Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
|
|
13467
|
+
* reason: this lived for a while in the post-analysis addon's own settings,
|
|
13468
|
+
* keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
|
|
13469
|
+
* the Locations page carried the icon and silently orphaned the description —
|
|
13470
|
+
* two authorities for one thing, joined by two different rules. Now both hang
|
|
13471
|
+
* off the location itself, on `locationIconKey`.
|
|
13472
|
+
*/
|
|
13473
|
+
var LocationDescriptionAssignmentSchema = object({
|
|
13474
|
+
locationKey: string(),
|
|
13475
|
+
description: string()
|
|
13476
|
+
});
|
|
13477
|
+
/**
|
|
13478
|
+
* A SITE ZONE — a named part of the property that several locations belong to.
|
|
13479
|
+
*
|
|
13480
|
+
* "Zona notte" holds every bedroom; "Zona giorno" the living room and the
|
|
13481
|
+
* kitchen. A camera belongs to exactly one location, and a location to at most
|
|
13482
|
+
* one zone, so a camera's zone is derived and never stored on the device: the
|
|
13483
|
+
* whole point of this entity is that grouping rooms touches no device row.
|
|
13484
|
+
*
|
|
13485
|
+
* ## Why not `zone`
|
|
13486
|
+
*
|
|
13487
|
+
* Because `zone` is already the most loaded word in this product: 612 source
|
|
13488
|
+
* files and 24 Italian strings where it means a DETECTION zone drawn on a
|
|
13489
|
+
* camera. The two are unrelated — one is a polygon in a frame, the other is a
|
|
13490
|
+
* set of rooms — and a reader who confuses them will look for a camera's
|
|
13491
|
+
* bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
|
|
13492
|
+
* word by calling the drawn one what it actually is: a detection zone.
|
|
13493
|
+
*
|
|
13494
|
+
* ## The key
|
|
13495
|
+
*
|
|
13496
|
+
* `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
|
|
13497
|
+
* use (`locationIconKey`). Membership and the icon both hang off it, so a
|
|
13498
|
+
* case-only rename keeps them, which is exactly the orphaning that cost us a
|
|
13499
|
+
* silently-dropped location description.
|
|
13500
|
+
*
|
|
13501
|
+
* The icon vocabulary is the location one, unchanged: a zone is drawn on the
|
|
13502
|
+
* same two surfaces by the same glyph map, so a second vocabulary would be a
|
|
13503
|
+
* second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
|
|
13504
|
+
*/
|
|
13505
|
+
/**
|
|
13506
|
+
* One zone as it travels: its key, the label the operator typed, its icon and
|
|
13507
|
+
* the locations inside it.
|
|
13508
|
+
*
|
|
13509
|
+
* The LABEL is carried alongside the key because the key is lossy on purpose —
|
|
13510
|
+
* a surface must show "Zona notte", not "zona notte". Locations are carried
|
|
13511
|
+
* here, rather than left to a second call, because every consumer wants both
|
|
13512
|
+
* at once and a viewer that asked twice could render a zone whose membership
|
|
13513
|
+
* it has not fetched yet.
|
|
13514
|
+
*
|
|
13515
|
+
* `icon: null` means nobody chose one, which is NOT the fallback pin: only one
|
|
13516
|
+
* of those two is a choice, and a picker has to draw them differently.
|
|
13517
|
+
*/
|
|
13518
|
+
var SiteZoneSchema = object({
|
|
13519
|
+
zoneKey: string(),
|
|
13520
|
+
label: string(),
|
|
13521
|
+
icon: LocationIconIdSchema.nullable(),
|
|
13522
|
+
/** Folded location keys, sorted. A location listed here need not be
|
|
13523
|
+
* REGISTERED — devices carry labels nobody registered, and those rooms are
|
|
13524
|
+
* the ones that most want grouping. */
|
|
13525
|
+
locationKeys: array(string())
|
|
13526
|
+
});
|
|
13411
13527
|
var ProviderStatusSchema = object({
|
|
13412
13528
|
connected: boolean(),
|
|
13413
13529
|
deviceCount: number(),
|
|
@@ -13925,6 +14041,33 @@ method(object({
|
|
|
13925
14041
|
}), _void(), {
|
|
13926
14042
|
kind: "mutation",
|
|
13927
14043
|
auth: "admin"
|
|
14044
|
+
}), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
|
|
14045
|
+
location: string(),
|
|
14046
|
+
description: string().max(400).nullable()
|
|
14047
|
+
}), _void(), {
|
|
14048
|
+
kind: "mutation",
|
|
14049
|
+
auth: "admin"
|
|
14050
|
+
}), method(_void(), array(SiteZoneSchema)), method(object({
|
|
14051
|
+
name: string(),
|
|
14052
|
+
icon: LocationIconIdSchema.nullable().optional()
|
|
14053
|
+
}), _void(), {
|
|
14054
|
+
kind: "mutation",
|
|
14055
|
+
auth: "admin"
|
|
14056
|
+
}), method(object({ name: string() }), _void(), {
|
|
14057
|
+
kind: "mutation",
|
|
14058
|
+
auth: "admin"
|
|
14059
|
+
}), method(object({
|
|
14060
|
+
from: string(),
|
|
14061
|
+
to: string()
|
|
14062
|
+
}), _void(), {
|
|
14063
|
+
kind: "mutation",
|
|
14064
|
+
auth: "admin"
|
|
14065
|
+
}), method(object({
|
|
14066
|
+
location: string(),
|
|
14067
|
+
zone: string().nullable()
|
|
14068
|
+
}), _void(), {
|
|
14069
|
+
kind: "mutation",
|
|
14070
|
+
auth: "admin"
|
|
13928
14071
|
}), method(object({
|
|
13929
14072
|
deviceId: number(),
|
|
13930
14073
|
disabled: boolean()
|
|
@@ -32748,6 +32891,12 @@ Object.freeze({
|
|
|
32748
32891
|
addonId: null,
|
|
32749
32892
|
access: "view"
|
|
32750
32893
|
},
|
|
32894
|
+
"deviceManager.listLocationDescriptions": {
|
|
32895
|
+
capName: "device-manager",
|
|
32896
|
+
capScope: "system",
|
|
32897
|
+
addonId: null,
|
|
32898
|
+
access: "view"
|
|
32899
|
+
},
|
|
32751
32900
|
"deviceManager.listLocationIcons": {
|
|
32752
32901
|
capName: "device-manager",
|
|
32753
32902
|
capScope: "system",
|
|
@@ -32766,6 +32915,12 @@ Object.freeze({
|
|
|
32766
32915
|
addonId: null,
|
|
32767
32916
|
access: "view"
|
|
32768
32917
|
},
|
|
32918
|
+
"deviceManager.listSiteZones": {
|
|
32919
|
+
capName: "device-manager",
|
|
32920
|
+
capScope: "system",
|
|
32921
|
+
addonId: null,
|
|
32922
|
+
access: "view"
|
|
32923
|
+
},
|
|
32769
32924
|
"deviceManager.listWrappersForCap": {
|
|
32770
32925
|
capName: "device-manager",
|
|
32771
32926
|
capScope: "system",
|
|
@@ -32850,12 +33005,24 @@ Object.freeze({
|
|
|
32850
33005
|
addonId: null,
|
|
32851
33006
|
access: "delete"
|
|
32852
33007
|
},
|
|
33008
|
+
"deviceManager.removeSiteZone": {
|
|
33009
|
+
capName: "device-manager",
|
|
33010
|
+
capScope: "system",
|
|
33011
|
+
addonId: null,
|
|
33012
|
+
access: "delete"
|
|
33013
|
+
},
|
|
32853
33014
|
"deviceManager.renameLocation": {
|
|
32854
33015
|
capName: "device-manager",
|
|
32855
33016
|
capScope: "system",
|
|
32856
33017
|
addonId: null,
|
|
32857
33018
|
access: "create"
|
|
32858
33019
|
},
|
|
33020
|
+
"deviceManager.renameSiteZone": {
|
|
33021
|
+
capName: "device-manager",
|
|
33022
|
+
capScope: "system",
|
|
33023
|
+
addonId: null,
|
|
33024
|
+
access: "create"
|
|
33025
|
+
},
|
|
32859
33026
|
"deviceManager.runDeviceAction": {
|
|
32860
33027
|
capName: "device-manager",
|
|
32861
33028
|
capScope: "system",
|
|
@@ -32898,12 +33065,24 @@ Object.freeze({
|
|
|
32898
33065
|
addonId: null,
|
|
32899
33066
|
access: "create"
|
|
32900
33067
|
},
|
|
33068
|
+
"deviceManager.setLocationDescription": {
|
|
33069
|
+
capName: "device-manager",
|
|
33070
|
+
capScope: "system",
|
|
33071
|
+
addonId: null,
|
|
33072
|
+
access: "create"
|
|
33073
|
+
},
|
|
32901
33074
|
"deviceManager.setLocationIcon": {
|
|
32902
33075
|
capName: "device-manager",
|
|
32903
33076
|
capScope: "system",
|
|
32904
33077
|
addonId: null,
|
|
32905
33078
|
access: "create"
|
|
32906
33079
|
},
|
|
33080
|
+
"deviceManager.setLocationZone": {
|
|
33081
|
+
capName: "device-manager",
|
|
33082
|
+
capScope: "system",
|
|
33083
|
+
addonId: null,
|
|
33084
|
+
access: "create"
|
|
33085
|
+
},
|
|
32907
33086
|
"deviceManager.setMetadata": {
|
|
32908
33087
|
capName: "device-manager",
|
|
32909
33088
|
capScope: "system",
|
|
@@ -32934,6 +33113,12 @@ Object.freeze({
|
|
|
32934
33113
|
addonId: null,
|
|
32935
33114
|
access: "create"
|
|
32936
33115
|
},
|
|
33116
|
+
"deviceManager.setSiteZone": {
|
|
33117
|
+
capName: "device-manager",
|
|
33118
|
+
capScope: "system",
|
|
33119
|
+
addonId: null,
|
|
33120
|
+
access: "create"
|
|
33121
|
+
},
|
|
32937
33122
|
"deviceManager.setStreamProfileMap": {
|
|
32938
33123
|
capName: "device-manager",
|
|
32939
33124
|
capScope: "system",
|
package/dist/index.mjs
CHANGED
|
@@ -12296,7 +12296,23 @@ var PickStreamRequirementsSchema = object({
|
|
|
12296
12296
|
* This is what lets one picker serve both the bypass and the full source
|
|
12297
12297
|
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12298
12298
|
*/
|
|
12299
|
-
allowTranscode: boolean().optional()
|
|
12299
|
+
allowTranscode: boolean().optional(),
|
|
12300
|
+
/**
|
|
12301
|
+
* Consider ONLY streams the broker has bound to a profile slot.
|
|
12302
|
+
*
|
|
12303
|
+
* A consumer that dials the broker — which is every exporter, since none
|
|
12304
|
+
* of them may open the camera's own URL — can do nothing with a source
|
|
12305
|
+
* that has no slot: there is no restream to dial. Without this the picker
|
|
12306
|
+
* can name such a stream, and each consumer discovers the dead end for
|
|
12307
|
+
* itself: Alexa's `profileForCamStream` returns `null` and it quietly
|
|
12308
|
+
* falls back, and HomeKit would have had to grow the same function again.
|
|
12309
|
+
*
|
|
12310
|
+
* Default `false`, and deliberately so: the BROKER itself picks through
|
|
12311
|
+
* here when it decides which source to BIND to a slot
|
|
12312
|
+
* (`computeInitialAssignment`), and it must see the unbound ones or it
|
|
12313
|
+
* could never bind them.
|
|
12314
|
+
*/
|
|
12315
|
+
requireProfileBound: boolean().optional()
|
|
12300
12316
|
}).readonly();
|
|
12301
12317
|
var PickStreamPreferencesSchema = object({
|
|
12302
12318
|
/**
|
|
@@ -12337,7 +12353,43 @@ var PickedCamStreamSchema = object({
|
|
|
12337
12353
|
*/
|
|
12338
12354
|
transcodes: boolean(),
|
|
12339
12355
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12340
|
-
reason: string()
|
|
12356
|
+
reason: string(),
|
|
12357
|
+
/**
|
|
12358
|
+
* The broker profile slot this source is bound to, when it is bound.
|
|
12359
|
+
*
|
|
12360
|
+
* Answered HERE because every consumer needs it and none of them can get it
|
|
12361
|
+
* from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
|
|
12362
|
+
* a second cap read plus a `null` branch — and HomeKit was about to write
|
|
12363
|
+
* the same function a second time.
|
|
12364
|
+
*
|
|
12365
|
+
* Absent when the source has no slot, which a caller passing
|
|
12366
|
+
* `requireProfileBound` can never see.
|
|
12367
|
+
*/
|
|
12368
|
+
profile: CamProfileSchema.optional(),
|
|
12369
|
+
/** The broker id of that slot, for logs that must name what was dialled. */
|
|
12370
|
+
brokerId: string().optional(),
|
|
12371
|
+
/**
|
|
12372
|
+
* The broker restream URL to dial for this stream.
|
|
12373
|
+
*
|
|
12374
|
+
* An exporter must never open the camera's own URL — the broker is the one
|
|
12375
|
+
* that dials the camera, and every consumer goes through its restream. So
|
|
12376
|
+
* the picker answers with the thing a consumer may actually use, instead of
|
|
12377
|
+
* naming a source and leaving each caller to look the URL up.
|
|
12378
|
+
*/
|
|
12379
|
+
url: string().optional(),
|
|
12380
|
+
/**
|
|
12381
|
+
* Frames per second this stream really delivers, and where the number came
|
|
12382
|
+
* from.
|
|
12383
|
+
*
|
|
12384
|
+
* It is here because getting it wrong is expensive and silent: a HomeKit
|
|
12385
|
+
* accessory advertised 720p at 24 fps while the slot serving it ran at 9,
|
|
12386
|
+
* and the controller rendered nothing at all. The source is carried with the
|
|
12387
|
+
* value for the same reason the bitrate evidence is: `published` is what the
|
|
12388
|
+
* publisher declares and `measured` is what the broker observed, and they
|
|
12389
|
+
* are not interchangeable.
|
|
12390
|
+
*/
|
|
12391
|
+
fps: number().positive().optional(),
|
|
12392
|
+
fpsSource: _enum(["published", "measured"]).optional()
|
|
12341
12393
|
});
|
|
12342
12394
|
DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CameraStreamSchema).readonly()), method(object({ deviceId: number().int().nonnegative() }), array(ProfileSlotSchema).readonly()), method(object({
|
|
12343
12395
|
deviceId: number().int().nonnegative(),
|
|
@@ -13404,6 +13456,70 @@ var LocationIconAssignmentSchema = object({
|
|
|
13404
13456
|
locationKey: string(),
|
|
13405
13457
|
icon: LocationIconIdSchema
|
|
13406
13458
|
});
|
|
13459
|
+
/**
|
|
13460
|
+
* One (location, description) assignment as it travels.
|
|
13461
|
+
*
|
|
13462
|
+
* Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
|
|
13463
|
+
* reason: this lived for a while in the post-analysis addon's own settings,
|
|
13464
|
+
* keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
|
|
13465
|
+
* the Locations page carried the icon and silently orphaned the description —
|
|
13466
|
+
* two authorities for one thing, joined by two different rules. Now both hang
|
|
13467
|
+
* off the location itself, on `locationIconKey`.
|
|
13468
|
+
*/
|
|
13469
|
+
var LocationDescriptionAssignmentSchema = object({
|
|
13470
|
+
locationKey: string(),
|
|
13471
|
+
description: string()
|
|
13472
|
+
});
|
|
13473
|
+
/**
|
|
13474
|
+
* A SITE ZONE — a named part of the property that several locations belong to.
|
|
13475
|
+
*
|
|
13476
|
+
* "Zona notte" holds every bedroom; "Zona giorno" the living room and the
|
|
13477
|
+
* kitchen. A camera belongs to exactly one location, and a location to at most
|
|
13478
|
+
* one zone, so a camera's zone is derived and never stored on the device: the
|
|
13479
|
+
* whole point of this entity is that grouping rooms touches no device row.
|
|
13480
|
+
*
|
|
13481
|
+
* ## Why not `zone`
|
|
13482
|
+
*
|
|
13483
|
+
* Because `zone` is already the most loaded word in this product: 612 source
|
|
13484
|
+
* files and 24 Italian strings where it means a DETECTION zone drawn on a
|
|
13485
|
+
* camera. The two are unrelated — one is a polygon in a frame, the other is a
|
|
13486
|
+
* set of rooms — and a reader who confuses them will look for a camera's
|
|
13487
|
+
* bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
|
|
13488
|
+
* word by calling the drawn one what it actually is: a detection zone.
|
|
13489
|
+
*
|
|
13490
|
+
* ## The key
|
|
13491
|
+
*
|
|
13492
|
+
* `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
|
|
13493
|
+
* use (`locationIconKey`). Membership and the icon both hang off it, so a
|
|
13494
|
+
* case-only rename keeps them, which is exactly the orphaning that cost us a
|
|
13495
|
+
* silently-dropped location description.
|
|
13496
|
+
*
|
|
13497
|
+
* The icon vocabulary is the location one, unchanged: a zone is drawn on the
|
|
13498
|
+
* same two surfaces by the same glyph map, so a second vocabulary would be a
|
|
13499
|
+
* second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
|
|
13500
|
+
*/
|
|
13501
|
+
/**
|
|
13502
|
+
* One zone as it travels: its key, the label the operator typed, its icon and
|
|
13503
|
+
* the locations inside it.
|
|
13504
|
+
*
|
|
13505
|
+
* The LABEL is carried alongside the key because the key is lossy on purpose —
|
|
13506
|
+
* a surface must show "Zona notte", not "zona notte". Locations are carried
|
|
13507
|
+
* here, rather than left to a second call, because every consumer wants both
|
|
13508
|
+
* at once and a viewer that asked twice could render a zone whose membership
|
|
13509
|
+
* it has not fetched yet.
|
|
13510
|
+
*
|
|
13511
|
+
* `icon: null` means nobody chose one, which is NOT the fallback pin: only one
|
|
13512
|
+
* of those two is a choice, and a picker has to draw them differently.
|
|
13513
|
+
*/
|
|
13514
|
+
var SiteZoneSchema = object({
|
|
13515
|
+
zoneKey: string(),
|
|
13516
|
+
label: string(),
|
|
13517
|
+
icon: LocationIconIdSchema.nullable(),
|
|
13518
|
+
/** Folded location keys, sorted. A location listed here need not be
|
|
13519
|
+
* REGISTERED — devices carry labels nobody registered, and those rooms are
|
|
13520
|
+
* the ones that most want grouping. */
|
|
13521
|
+
locationKeys: array(string())
|
|
13522
|
+
});
|
|
13407
13523
|
var ProviderStatusSchema = object({
|
|
13408
13524
|
connected: boolean(),
|
|
13409
13525
|
deviceCount: number(),
|
|
@@ -13921,6 +14037,33 @@ method(object({
|
|
|
13921
14037
|
}), _void(), {
|
|
13922
14038
|
kind: "mutation",
|
|
13923
14039
|
auth: "admin"
|
|
14040
|
+
}), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
|
|
14041
|
+
location: string(),
|
|
14042
|
+
description: string().max(400).nullable()
|
|
14043
|
+
}), _void(), {
|
|
14044
|
+
kind: "mutation",
|
|
14045
|
+
auth: "admin"
|
|
14046
|
+
}), method(_void(), array(SiteZoneSchema)), method(object({
|
|
14047
|
+
name: string(),
|
|
14048
|
+
icon: LocationIconIdSchema.nullable().optional()
|
|
14049
|
+
}), _void(), {
|
|
14050
|
+
kind: "mutation",
|
|
14051
|
+
auth: "admin"
|
|
14052
|
+
}), method(object({ name: string() }), _void(), {
|
|
14053
|
+
kind: "mutation",
|
|
14054
|
+
auth: "admin"
|
|
14055
|
+
}), method(object({
|
|
14056
|
+
from: string(),
|
|
14057
|
+
to: string()
|
|
14058
|
+
}), _void(), {
|
|
14059
|
+
kind: "mutation",
|
|
14060
|
+
auth: "admin"
|
|
14061
|
+
}), method(object({
|
|
14062
|
+
location: string(),
|
|
14063
|
+
zone: string().nullable()
|
|
14064
|
+
}), _void(), {
|
|
14065
|
+
kind: "mutation",
|
|
14066
|
+
auth: "admin"
|
|
13924
14067
|
}), method(object({
|
|
13925
14068
|
deviceId: number(),
|
|
13926
14069
|
disabled: boolean()
|
|
@@ -32744,6 +32887,12 @@ Object.freeze({
|
|
|
32744
32887
|
addonId: null,
|
|
32745
32888
|
access: "view"
|
|
32746
32889
|
},
|
|
32890
|
+
"deviceManager.listLocationDescriptions": {
|
|
32891
|
+
capName: "device-manager",
|
|
32892
|
+
capScope: "system",
|
|
32893
|
+
addonId: null,
|
|
32894
|
+
access: "view"
|
|
32895
|
+
},
|
|
32747
32896
|
"deviceManager.listLocationIcons": {
|
|
32748
32897
|
capName: "device-manager",
|
|
32749
32898
|
capScope: "system",
|
|
@@ -32762,6 +32911,12 @@ Object.freeze({
|
|
|
32762
32911
|
addonId: null,
|
|
32763
32912
|
access: "view"
|
|
32764
32913
|
},
|
|
32914
|
+
"deviceManager.listSiteZones": {
|
|
32915
|
+
capName: "device-manager",
|
|
32916
|
+
capScope: "system",
|
|
32917
|
+
addonId: null,
|
|
32918
|
+
access: "view"
|
|
32919
|
+
},
|
|
32765
32920
|
"deviceManager.listWrappersForCap": {
|
|
32766
32921
|
capName: "device-manager",
|
|
32767
32922
|
capScope: "system",
|
|
@@ -32846,12 +33001,24 @@ Object.freeze({
|
|
|
32846
33001
|
addonId: null,
|
|
32847
33002
|
access: "delete"
|
|
32848
33003
|
},
|
|
33004
|
+
"deviceManager.removeSiteZone": {
|
|
33005
|
+
capName: "device-manager",
|
|
33006
|
+
capScope: "system",
|
|
33007
|
+
addonId: null,
|
|
33008
|
+
access: "delete"
|
|
33009
|
+
},
|
|
32849
33010
|
"deviceManager.renameLocation": {
|
|
32850
33011
|
capName: "device-manager",
|
|
32851
33012
|
capScope: "system",
|
|
32852
33013
|
addonId: null,
|
|
32853
33014
|
access: "create"
|
|
32854
33015
|
},
|
|
33016
|
+
"deviceManager.renameSiteZone": {
|
|
33017
|
+
capName: "device-manager",
|
|
33018
|
+
capScope: "system",
|
|
33019
|
+
addonId: null,
|
|
33020
|
+
access: "create"
|
|
33021
|
+
},
|
|
32855
33022
|
"deviceManager.runDeviceAction": {
|
|
32856
33023
|
capName: "device-manager",
|
|
32857
33024
|
capScope: "system",
|
|
@@ -32894,12 +33061,24 @@ Object.freeze({
|
|
|
32894
33061
|
addonId: null,
|
|
32895
33062
|
access: "create"
|
|
32896
33063
|
},
|
|
33064
|
+
"deviceManager.setLocationDescription": {
|
|
33065
|
+
capName: "device-manager",
|
|
33066
|
+
capScope: "system",
|
|
33067
|
+
addonId: null,
|
|
33068
|
+
access: "create"
|
|
33069
|
+
},
|
|
32897
33070
|
"deviceManager.setLocationIcon": {
|
|
32898
33071
|
capName: "device-manager",
|
|
32899
33072
|
capScope: "system",
|
|
32900
33073
|
addonId: null,
|
|
32901
33074
|
access: "create"
|
|
32902
33075
|
},
|
|
33076
|
+
"deviceManager.setLocationZone": {
|
|
33077
|
+
capName: "device-manager",
|
|
33078
|
+
capScope: "system",
|
|
33079
|
+
addonId: null,
|
|
33080
|
+
access: "create"
|
|
33081
|
+
},
|
|
32903
33082
|
"deviceManager.setMetadata": {
|
|
32904
33083
|
capName: "device-manager",
|
|
32905
33084
|
capScope: "system",
|
|
@@ -32930,6 +33109,12 @@ Object.freeze({
|
|
|
32930
33109
|
addonId: null,
|
|
32931
33110
|
access: "create"
|
|
32932
33111
|
},
|
|
33112
|
+
"deviceManager.setSiteZone": {
|
|
33113
|
+
capName: "device-manager",
|
|
33114
|
+
capScope: "system",
|
|
33115
|
+
addonId: null,
|
|
33116
|
+
access: "create"
|
|
33117
|
+
},
|
|
32933
33118
|
"deviceManager.setStreamProfileMap": {
|
|
32934
33119
|
capName: "device-manager",
|
|
32935
33120
|
capScope: "system",
|