@camstack/types 1.2.202 → 1.2.204

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 CHANGED
@@ -11425,6 +11425,230 @@ var deviceExportCapability = {
11425
11425
  }
11426
11426
  };
11427
11427
  //#endregion
11428
+ //#region src/device/location-icon.ts
11429
+ /**
11430
+ * The CLOSED icon vocabulary a location may carry.
11431
+ *
11432
+ * A location is not an entity — it is a free-form label (`PersistedDeviceMeta.
11433
+ * location`) plus an operator-curated registry of labels in the device-manager
11434
+ * addon store. The icon is a second map beside that registry, keyed the same
11435
+ * way the registry matches everywhere else: {@link locationIconKey}, i.e.
11436
+ * trimmed + lower-cased.
11437
+ *
11438
+ * WHY A CLOSED SET, AND WHY THESE NAMES
11439
+ * -------------------------------------
11440
+ * Two surfaces draw this icon and they do NOT share an icon module: the admin
11441
+ * UI imports `lucide-react`, the viewer imports a hand-maintained per-icon
11442
+ * allowlist (`src/lib/icons.ts`, re-exporting `lucide-react-native/icons/*`
11443
+ * because the barrel is 47 % of the app's modules). A free-form string would
11444
+ * therefore be renderable on one surface and a hole on the other, decided at
11445
+ * runtime by whichever icon happened to be bundled.
11446
+ *
11447
+ * So the vocabulary names the DRAWING, not the room: every member is the exact
11448
+ * kebab-case lucide icon id. That makes "can this surface draw it?" a
11449
+ * mechanical question with a mechanical answer — the admin UI maps the id to
11450
+ * lucide-react's PascalCase export, the viewer maps it to
11451
+ * `lucide-react-native/icons/<id>` — instead of a semantic judgement call, and
11452
+ * it removes the per-surface meaning table a room-typed vocabulary
11453
+ * (`kitchen`, `garage`, …) would have needed on both sides. An operator who
11454
+ * puts the `car` icon on a room called "Ripostiglio" is not fighting the
11455
+ * model; they picked a picture.
11456
+ *
11457
+ * The members, and the export each surface needs:
11458
+ *
11459
+ * | id | lucide-react | viewer `icons.ts` export |
11460
+ * | ----------------- | ----------------- | ------------------------ |
11461
+ * | `map-pin` | `MapPin` | present |
11462
+ * | `house` | `House` | present |
11463
+ * | `door-open` | `DoorOpen` | present |
11464
+ * | `utensils` | `Utensils` | present |
11465
+ * | `car` | `Car` | present |
11466
+ * | `circle-parking` | `CircleParking` | present |
11467
+ * | `route` | `Route` | present |
11468
+ * | `package` | `Package` | present |
11469
+ * | `sun` | `Sun` | present |
11470
+ * | `radar` | `Radar` | present |
11471
+ * | `sofa` | `Sofa` | MISSING — add |
11472
+ * | `bed-double` | `BedDouble` | MISSING — add |
11473
+ * | `bath` | `Bath` | MISSING — add |
11474
+ * | `briefcase` | `Briefcase` | MISSING — add |
11475
+ * | `trees` | `Trees` | MISSING — add |
11476
+ * | `umbrella` | `Umbrella` | MISSING — add |
11477
+ * | `waves-ladder` | `WavesLadder` | MISSING — add |
11478
+ * | `fence` | `Fence` | MISSING — add |
11479
+ * | `warehouse` | `Warehouse` | MISSING — add |
11480
+ * | `store` | `Store` | MISSING — add |
11481
+ *
11482
+ * DEGRADATION IS A FALLBACK, NEVER A HOLE. A surface that cannot draw a member
11483
+ * — a viewer build shipped before its allowlist caught up, a persisted value
11484
+ * from a newer hub, a hand-edited settings row — draws
11485
+ * {@link LOCATION_ICON_FALLBACK} (`map-pin`, the one every surface has always
11486
+ * had). Read a stored/wire value through {@link resolveLocationIcon} and that
11487
+ * is what you get; nothing anywhere renders an empty box.
11488
+ *
11489
+ * Growing the vocabulary is a framework change (`@camstack/types` travels in
11490
+ * the `@camstack/server` closure) AND a viewer change. Add the id here, add the
11491
+ * line to the viewer's `icons.ts`, and expect older viewers to draw the
11492
+ * fallback for it until they update — which is exactly the contract above.
11493
+ */
11494
+ /**
11495
+ * Every icon id a location may carry. Kebab-case lucide icon ids — see the
11496
+ * module docblock for why the vocabulary names the drawing and not the room.
11497
+ */
11498
+ var LOCATION_ICON_IDS = [
11499
+ "map-pin",
11500
+ "house",
11501
+ "door-open",
11502
+ "sofa",
11503
+ "utensils",
11504
+ "bed-double",
11505
+ "bath",
11506
+ "briefcase",
11507
+ "car",
11508
+ "circle-parking",
11509
+ "route",
11510
+ "trees",
11511
+ "umbrella",
11512
+ "waves-ladder",
11513
+ "fence",
11514
+ "package",
11515
+ "warehouse",
11516
+ "store",
11517
+ "sun",
11518
+ "radar"
11519
+ ];
11520
+ /**
11521
+ * The id every surface is guaranteed to draw, and what an unrecognised value
11522
+ * degrades to. It has been in both icon sets since before this vocabulary
11523
+ * existed (the Locations page's own page icon), so "the fallback is missing"
11524
+ * is not a state a build can reach.
11525
+ */
11526
+ var LOCATION_ICON_FALLBACK = "map-pin";
11527
+ /** Wire/storage schema for one icon id. */
11528
+ var LocationIconIdSchema = zod.z.enum(LOCATION_ICON_IDS);
11529
+ /**
11530
+ * One (location, icon) assignment as it travels.
11531
+ *
11532
+ * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
11533
+ * operator's casing. The registry matches labels trimmed + case-insensitively
11534
+ * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
11535
+ * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
11536
+ * map keyed on the displayed casing would orphan its entry on exactly that
11537
+ * edit. Consumers join by keying their own label through `locationIconKey`.
11538
+ */
11539
+ var LocationIconAssignmentSchema = zod.z.object({
11540
+ locationKey: zod.z.string(),
11541
+ icon: LocationIconIdSchema
11542
+ });
11543
+ /**
11544
+ * The join key for a location label: trimmed, lower-cased. The ONE place this
11545
+ * derivation lives — a caller that re-spells it is a rename away from an
11546
+ * orphaned icon.
11547
+ */
11548
+ function locationIconKey(label) {
11549
+ return label.trim().toLowerCase();
11550
+ }
11551
+ /**
11552
+ * Read an arbitrary stored/wire value as a drawable icon id.
11553
+ *
11554
+ * Anything that is not a member of the vocabulary — `null`, `undefined`, a
11555
+ * hand-edited settings row, an id minted by a newer hub — becomes
11556
+ * {@link LOCATION_ICON_FALLBACK}. Never returns `null`: a caller that wants to
11557
+ * distinguish "no icon chosen" from "icon unknown" must look at the assignment
11558
+ * list, which only carries what was actually stored.
11559
+ */
11560
+ function resolveLocationIcon(value) {
11561
+ const parsed = LocationIconIdSchema.safeParse(value);
11562
+ return parsed.success ? parsed.data : LOCATION_ICON_FALLBACK;
11563
+ }
11564
+ /**
11565
+ * How long a location description may be.
11566
+ *
11567
+ * It is given to a vision model alongside the pictures, so it competes for the
11568
+ * same attention the pictures need. A cap of one short paragraph is what keeps
11569
+ * it a PLACE description rather than a second prompt — an operator who needs
11570
+ * more than this is describing events, which change, instead of the ground,
11571
+ * which does not.
11572
+ */
11573
+ var LOCATION_DESCRIPTION_MAX = 400;
11574
+ /**
11575
+ * One (location, description) assignment as it travels.
11576
+ *
11577
+ * Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
11578
+ * reason: this lived for a while in the post-analysis addon's own settings,
11579
+ * keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
11580
+ * the Locations page carried the icon and silently orphaned the description —
11581
+ * two authorities for one thing, joined by two different rules. Now both hang
11582
+ * off the location itself, on `locationIconKey`.
11583
+ */
11584
+ var LocationDescriptionAssignmentSchema = zod.z.object({
11585
+ locationKey: zod.z.string(),
11586
+ description: zod.z.string()
11587
+ });
11588
+ //#endregion
11589
+ //#region src/device/site-zone.ts
11590
+ /**
11591
+ * A SITE ZONE — a named part of the property that several locations belong to.
11592
+ *
11593
+ * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
11594
+ * kitchen. A camera belongs to exactly one location, and a location to at most
11595
+ * one zone, so a camera's zone is derived and never stored on the device: the
11596
+ * whole point of this entity is that grouping rooms touches no device row.
11597
+ *
11598
+ * ## Why not `zone`
11599
+ *
11600
+ * Because `zone` is already the most loaded word in this product: 612 source
11601
+ * files and 24 Italian strings where it means a DETECTION zone drawn on a
11602
+ * camera. The two are unrelated — one is a polygon in a frame, the other is a
11603
+ * set of rooms — and a reader who confuses them will look for a camera's
11604
+ * bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
11605
+ * word by calling the drawn one what it actually is: a detection zone.
11606
+ *
11607
+ * ## The key
11608
+ *
11609
+ * `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
11610
+ * use (`locationIconKey`). Membership and the icon both hang off it, so a
11611
+ * case-only rename keeps them, which is exactly the orphaning that cost us a
11612
+ * silently-dropped location description.
11613
+ *
11614
+ * The icon vocabulary is the location one, unchanged: a zone is drawn on the
11615
+ * same two surfaces by the same glyph map, so a second vocabulary would be a
11616
+ * second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
11617
+ */
11618
+ /**
11619
+ * One zone as it travels: its key, the label the operator typed, its icon and
11620
+ * the locations inside it.
11621
+ *
11622
+ * The LABEL is carried alongside the key because the key is lossy on purpose —
11623
+ * a surface must show "Zona notte", not "zona notte". Locations are carried
11624
+ * here, rather than left to a second call, because every consumer wants both
11625
+ * at once and a viewer that asked twice could render a zone whose membership
11626
+ * it has not fetched yet.
11627
+ *
11628
+ * `icon: null` means nobody chose one, which is NOT the fallback pin: only one
11629
+ * of those two is a choice, and a picker has to draw them differently.
11630
+ */
11631
+ var SiteZoneSchema = zod.z.object({
11632
+ zoneKey: zod.z.string(),
11633
+ label: zod.z.string(),
11634
+ icon: LocationIconIdSchema.nullable(),
11635
+ /** Folded location keys, sorted. A location listed here need not be
11636
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
11637
+ * the ones that most want grouping. */
11638
+ locationKeys: zod.z.array(zod.z.string())
11639
+ });
11640
+ /**
11641
+ * The join key for a zone label: trimmed, lower-cased.
11642
+ *
11643
+ * Deliberately a separate export from `locationIconKey` even though the
11644
+ * derivation is identical — they key different maps, and a future change to one
11645
+ * must not silently re-key the other. Their agreement is a fact about today,
11646
+ * not a dependency.
11647
+ */
11648
+ function siteZoneKey(label) {
11649
+ return label.trim().toLowerCase();
11650
+ }
11651
+ //#endregion
11428
11652
  //#region src/capabilities/device-provider.cap.ts
11429
11653
  var ProviderStatusSchema = zod.z.object({
11430
11654
  connected: zod.z.boolean(),
@@ -12156,7 +12380,11 @@ var deviceManagerCapability = {
12156
12380
  * reference this label keep their `meta.location` value — the
12157
12381
  * registry is purely a suggestion list. To purge from devices,
12158
12382
  * iterate them and call `setLocation(deviceId, null)`
12159
- * separately (or pass `cascade: true` to do it in one shot). */
12383
+ * separately (or pass `cascade: true` to do it in one shot).
12384
+ *
12385
+ * The room's ICON goes with it, always — a key left behind survives in a
12386
+ * map nobody lists, and a room later re-created under the same name would
12387
+ * silently inherit an icon the operator never chose for it. */
12160
12388
  removeLocation: require_sleep.method(zod.z.object({
12161
12389
  name: zod.z.string(),
12162
12390
  cascade: zod.z.boolean().optional()
@@ -12177,7 +12405,13 @@ var deviceManagerCapability = {
12177
12405
  * a suggestion list, and the devices that most need a rename are exactly
12178
12406
  * the ones carrying a label nobody registered. `to` renames onto an
12179
12407
  * existing room by MERGING into it, leaving no duplicate label. An empty
12180
- * `to` throws before anything is written. */
12408
+ * `to` throws before anything is written.
12409
+ *
12410
+ * The room's ICON travels with the rename, including when `from` was
12411
+ * never registered — otherwise it orphans on a key no location carries
12412
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
12413
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
12414
+ * it. */
12181
12415
  renameLocation: require_sleep.method(zod.z.object({
12182
12416
  from: zod.z.string(),
12183
12417
  to: zod.z.string()
@@ -12185,6 +12419,127 @@ var deviceManagerCapability = {
12185
12419
  kind: "mutation",
12186
12420
  auth: "admin"
12187
12421
  }),
12422
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
12423
+ *
12424
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
12425
+ * every consumer of it (the Device Info autocomplete, the HA adoption
12426
+ * import, the recorder) reads a list of labels and none of them wants a
12427
+ * shape change. A surface that wants icons asks for them and joins.
12428
+ *
12429
+ * Only assignments that EXIST are returned — a location with no icon is
12430
+ * absent, not `map-pin`. The fallback belongs to the renderer
12431
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
12432
+ * pin" and "the operator chose nothing" stay distinguishable.
12433
+ *
12434
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
12435
+ * same equality the registry uses everywhere. Never the operator's
12436
+ * casing: a case-only rename is a real edit here, and a map keyed on the
12437
+ * displayed spelling would orphan its entry on exactly that edit. */
12438
+ listLocationIcons: require_sleep.method(zod.z.void(), zod.z.array(LocationIconAssignmentSchema)),
12439
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
12440
+ * assignment. The label need NOT be registered — the registry is a
12441
+ * suggestion list and devices carry labels nobody registered — but an
12442
+ * empty / whitespace-only label throws. Idempotent.
12443
+ *
12444
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
12445
+ * and the viewer draw from different icon modules; see
12446
+ * `device/location-icon.ts` for the list and for what a surface that
12447
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
12448
+ setLocationIcon: require_sleep.method(zod.z.object({
12449
+ location: zod.z.string(),
12450
+ icon: LocationIconIdSchema.nullable()
12451
+ }), zod.z.void(), {
12452
+ kind: "mutation",
12453
+ auth: "admin"
12454
+ }),
12455
+ /** Every location that carries a DESCRIPTION — what the place LOOKS like,
12456
+ * in plain words, given to the vision model alongside the pictures so it
12457
+ * knows what it is looking at. A driveway of cobbles between a brick wall
12458
+ * and three parking spaces reads very differently from a back garden.
12459
+ *
12460
+ * Same additive shape and same join key as `listLocationIcons`, and that
12461
+ * is the point of it being here at all: this lived in the post-analysis
12462
+ * addon's own settings, keyed by a hand-typed label matched exactly and
12463
+ * case-sensitively, while the icon hung off the location itself. A rename
12464
+ * carried the icon and silently orphaned the description. One location,
12465
+ * one authority, one key.
12466
+ *
12467
+ * Absent means nobody wrote one — the digest then tells the model only the
12468
+ * location NAME, exactly as it did before descriptions existed. */
12469
+ listLocationDescriptions: require_sleep.method(zod.z.void(), zod.z.array(LocationDescriptionAssignmentSchema)),
12470
+ /** Set (or clear) a location's description. `description: null`, or a
12471
+ * blank string, removes it — an empty description and no description are
12472
+ * the same thing to every reader, and storing the first would send an
12473
+ * empty line to the model.
12474
+ *
12475
+ * Like `setLocationIcon`, the label need NOT be registered, and an
12476
+ * empty / whitespace-only LABEL throws. */
12477
+ setLocationDescription: require_sleep.method(zod.z.object({
12478
+ location: zod.z.string(),
12479
+ description: zod.z.string().max(400).nullable()
12480
+ }), zod.z.void(), {
12481
+ kind: "mutation",
12482
+ auth: "admin"
12483
+ }),
12484
+ /** Every SITE ZONE — a named part of the property that groups locations
12485
+ * ("Zona notte" holds the bedrooms). One call answers the whole picture:
12486
+ * key, the label as typed, the icon, and the locations inside.
12487
+ *
12488
+ * Together, because a surface that asked for membership separately could
12489
+ * draw a zone whose rooms it has not fetched — and the strip that renders
12490
+ * these puts zones BEFORE locations, so a half-known zone is the first
12491
+ * thing an operator sees.
12492
+ *
12493
+ * Nothing here touches a device: a camera's zone is derived from its
12494
+ * location, never stored on the row. Grouping rooms must not rewrite the
12495
+ * fleet. */
12496
+ listSiteZones: require_sleep.method(zod.z.void(), zod.z.array(SiteZoneSchema)),
12497
+ /** Create a zone, or set the icon of one that exists. `icon: null` clears
12498
+ * the icon and KEEPS the zone — a zone with no icon is a normal zone, and
12499
+ * conflating "no icon" with "no zone" would delete membership on a
12500
+ * mis-click.
12501
+ *
12502
+ * Idempotent, and the label is stored as typed: the key is folded, so
12503
+ * re-running this with different casing re-labels rather than duplicating. */
12504
+ setSiteZone: require_sleep.method(zod.z.object({
12505
+ name: zod.z.string(),
12506
+ icon: LocationIconIdSchema.nullable().optional()
12507
+ }), zod.z.void(), {
12508
+ kind: "mutation",
12509
+ auth: "admin"
12510
+ }),
12511
+ /** Delete a zone. Its LOCATIONS survive — they simply stop belonging to
12512
+ * anything. Deleting a grouping must never delete what was grouped. */
12513
+ removeSiteZone: require_sleep.method(zod.z.object({ name: zod.z.string() }), zod.z.void(), {
12514
+ kind: "mutation",
12515
+ auth: "admin"
12516
+ }),
12517
+ /** Rename a zone, carrying its icon AND its membership.
12518
+ *
12519
+ * It exists so that renaming is not delete-then-recreate, which would drop
12520
+ * both — the exact orphaning that lost a location's description when the
12521
+ * two hung off different keys. Renaming onto an existing zone MERGES into
12522
+ * it and the target keeps its own icon. */
12523
+ renameSiteZone: require_sleep.method(zod.z.object({
12524
+ from: zod.z.string(),
12525
+ to: zod.z.string()
12526
+ }), zod.z.void(), {
12527
+ kind: "mutation",
12528
+ auth: "admin"
12529
+ }),
12530
+ /** Put a location in a zone, or take it out with `zone: null`.
12531
+ *
12532
+ * At most one zone per location, by construction: this writes one key, so
12533
+ * there is no state in which a room is in two places at once. The zone
12534
+ * need not exist yet — it is created empty-labelled from this call, the
12535
+ * same way `setLocationIcon` does not require a registered location. */
12536
+ setLocationZone: require_sleep.method(zod.z.object({
12537
+ location: zod.z.string(),
12538
+ zone: zod.z.string().nullable()
12539
+ }), zod.z.void(), {
12540
+ kind: "mutation",
12541
+ auth: "admin"
12542
+ }),
12188
12543
  /** Soft-disable / re-enable the device. Drivers consult
12189
12544
  * `BaseDevice.disabled` to gate lifecycle hooks. */
12190
12545
  setDisabled: require_sleep.method(zod.z.object({
@@ -44819,6 +45174,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
44819
45174
  addonId: null,
44820
45175
  access: "view"
44821
45176
  },
45177
+ "deviceManager.listLocationDescriptions": {
45178
+ capName: "device-manager",
45179
+ capScope: "system",
45180
+ addonId: null,
45181
+ access: "view"
45182
+ },
45183
+ "deviceManager.listLocationIcons": {
45184
+ capName: "device-manager",
45185
+ capScope: "system",
45186
+ addonId: null,
45187
+ access: "view"
45188
+ },
44822
45189
  "deviceManager.listLocations": {
44823
45190
  capName: "device-manager",
44824
45191
  capScope: "system",
@@ -44831,6 +45198,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44831
45198
  addonId: null,
44832
45199
  access: "view"
44833
45200
  },
45201
+ "deviceManager.listSiteZones": {
45202
+ capName: "device-manager",
45203
+ capScope: "system",
45204
+ addonId: null,
45205
+ access: "view"
45206
+ },
44834
45207
  "deviceManager.listWrappersForCap": {
44835
45208
  capName: "device-manager",
44836
45209
  capScope: "system",
@@ -44915,12 +45288,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
44915
45288
  addonId: null,
44916
45289
  access: "delete"
44917
45290
  },
45291
+ "deviceManager.removeSiteZone": {
45292
+ capName: "device-manager",
45293
+ capScope: "system",
45294
+ addonId: null,
45295
+ access: "delete"
45296
+ },
44918
45297
  "deviceManager.renameLocation": {
44919
45298
  capName: "device-manager",
44920
45299
  capScope: "system",
44921
45300
  addonId: null,
44922
45301
  access: "create"
44923
45302
  },
45303
+ "deviceManager.renameSiteZone": {
45304
+ capName: "device-manager",
45305
+ capScope: "system",
45306
+ addonId: null,
45307
+ access: "create"
45308
+ },
44924
45309
  "deviceManager.runDeviceAction": {
44925
45310
  capName: "device-manager",
44926
45311
  capScope: "system",
@@ -44963,6 +45348,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
44963
45348
  addonId: null,
44964
45349
  access: "create"
44965
45350
  },
45351
+ "deviceManager.setLocationDescription": {
45352
+ capName: "device-manager",
45353
+ capScope: "system",
45354
+ addonId: null,
45355
+ access: "create"
45356
+ },
45357
+ "deviceManager.setLocationIcon": {
45358
+ capName: "device-manager",
45359
+ capScope: "system",
45360
+ addonId: null,
45361
+ access: "create"
45362
+ },
45363
+ "deviceManager.setLocationZone": {
45364
+ capName: "device-manager",
45365
+ capScope: "system",
45366
+ addonId: null,
45367
+ access: "create"
45368
+ },
44966
45369
  "deviceManager.setMetadata": {
44967
45370
  capName: "device-manager",
44968
45371
  capScope: "system",
@@ -44993,6 +45396,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
44993
45396
  addonId: null,
44994
45397
  access: "create"
44995
45398
  },
45399
+ "deviceManager.setSiteZone": {
45400
+ capName: "device-manager",
45401
+ capScope: "system",
45402
+ addonId: null,
45403
+ access: "create"
45404
+ },
44996
45405
  "deviceManager.setStreamProfileMap": {
44997
45406
  capName: "device-manager",
44998
45407
  capScope: "system",
@@ -52581,6 +52990,15 @@ function createSystemProxy(api) {
52581
52990
  addLocation: (input) => dispatch("deviceManager", "addLocation", "mutation", input),
52582
52991
  removeLocation: (input) => dispatch("deviceManager", "removeLocation", "mutation", input),
52583
52992
  renameLocation: (input) => dispatch("deviceManager", "renameLocation", "mutation", input),
52993
+ listLocationIcons: (input) => dispatch("deviceManager", "listLocationIcons", "query", input),
52994
+ setLocationIcon: (input) => dispatch("deviceManager", "setLocationIcon", "mutation", input),
52995
+ listLocationDescriptions: (input) => dispatch("deviceManager", "listLocationDescriptions", "query", input),
52996
+ setLocationDescription: (input) => dispatch("deviceManager", "setLocationDescription", "mutation", input),
52997
+ listSiteZones: (input) => dispatch("deviceManager", "listSiteZones", "query", input),
52998
+ setSiteZone: (input) => dispatch("deviceManager", "setSiteZone", "mutation", input),
52999
+ removeSiteZone: (input) => dispatch("deviceManager", "removeSiteZone", "mutation", input),
53000
+ renameSiteZone: (input) => dispatch("deviceManager", "renameSiteZone", "mutation", input),
53001
+ setLocationZone: (input) => dispatch("deviceManager", "setLocationZone", "mutation", input),
52584
53002
  listPersistedByAddon: (input) => dispatch("deviceManager", "listPersistedByAddon", "query", input),
52585
53003
  listAll: (input) => dispatch("deviceManager", "listAll", "query", input),
52586
53004
  getChildren: (input) => dispatch("deviceManager", "getChildren", "query", input),
@@ -57558,6 +57976,9 @@ exports.KeyEventSchema = KeyEventSchema;
57558
57976
  exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
57559
57977
  exports.LOAD_CONTRIBUTION_ATTRIBUTIONS = LOAD_CONTRIBUTION_ATTRIBUTIONS;
57560
57978
  exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
57979
+ exports.LOCATION_DESCRIPTION_MAX = LOCATION_DESCRIPTION_MAX;
57980
+ exports.LOCATION_ICON_FALLBACK = LOCATION_ICON_FALLBACK;
57981
+ exports.LOCATION_ICON_IDS = LOCATION_ICON_IDS;
57561
57982
  exports.LOG_CHANNEL_TICK_MS = LOG_CHANNEL_TICK_MS;
57562
57983
  exports.LOG_LEVEL_RANK = LOG_LEVEL_RANK;
57563
57984
  exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
@@ -57598,6 +58019,9 @@ exports.LlmUsageRollupSchema = LlmUsageRollupSchema;
57598
58019
  exports.LlmUsageSchema = LlmUsageSchema;
57599
58020
  exports.LoadContributionSchema = LoadContributionSchema;
57600
58021
  exports.LocateSegmentResultSchema = LocateSegmentResultSchema;
58022
+ exports.LocationDescriptionAssignmentSchema = LocationDescriptionAssignmentSchema;
58023
+ exports.LocationIconAssignmentSchema = LocationIconAssignmentSchema;
58024
+ exports.LocationIconIdSchema = LocationIconIdSchema;
57601
58025
  exports.LocationStatSchema = LocationStatSchema;
57602
58026
  exports.LockControlStatusSchema = LockControlStatusSchema;
57603
58027
  exports.LockStateSchema = LockStateSchema;
@@ -58073,6 +58497,7 @@ exports.ShmRingStatsSchema = ShmRingStatsSchema;
58073
58497
  exports.SiteLocationSchema = SiteLocationSchema;
58074
58498
  exports.SiteLocationSourceSchema = SiteLocationSourceSchema;
58075
58499
  exports.SiteLocationStatusSchema = SiteLocationStatusSchema;
58500
+ exports.SiteZoneSchema = SiteZoneSchema;
58076
58501
  exports.SmokeStatusSchema = SmokeStatusSchema;
58077
58502
  exports.SmtpStatusSchema = SmtpStatusSchema;
58078
58503
  exports.SnapshotImageSchema = SnapshotImageSchema;
@@ -58497,6 +58922,7 @@ exports.llmCapability = llmCapability;
58497
58922
  exports.llmRuntimeCapability = llmRuntimeCapability;
58498
58923
  exports.loadContributionCapability = loadContributionCapability;
58499
58924
  exports.localNetworkCapability = localNetworkCapability;
58925
+ exports.locationIconKey = locationIconKey;
58500
58926
  exports.locationSimilarity = locationSimilarity;
58501
58927
  exports.lockControlCapability = lockControlCapability;
58502
58928
  exports.logBannerArgs = require_canonical_hash.logBannerArgs;
@@ -58621,6 +59047,7 @@ exports.resolveDeviceProfile = resolveDeviceProfile;
58621
59047
  exports.resolveEgressDecodeHwAccel = resolveEgressDecodeHwAccel;
58622
59048
  exports.resolveFormat = resolveFormat;
58623
59049
  exports.resolveHydratedFieldValue = require_sleep.resolveHydratedFieldValue;
59050
+ exports.resolveLocationIcon = resolveLocationIcon;
58624
59051
  exports.resolveLocationMode = resolveLocationMode;
58625
59052
  exports.resolveMethodAuth = resolveMethodAuth;
58626
59053
  exports.resolveModelFormat = resolveModelFormat;
@@ -58655,6 +59082,7 @@ exports.setByPath = setByPath;
58655
59082
  exports.settingsStoreCapability = settingsStoreCapability;
58656
59083
  exports.signalPercentFromBars = signalPercentFromBars;
58657
59084
  exports.signalPercentFromRssi = signalPercentFromRssi;
59085
+ exports.siteZoneKey = siteZoneKey;
58658
59086
  exports.sleep = require_sleep.sleep;
58659
59087
  exports.sleepCancellable = require_sleep.sleepCancellable;
58660
59088
  exports.sliceActiveValue = sliceActiveValue;