camstack 1.2.156 → 1.2.158

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.
@@ -21004,6 +21004,33 @@ var deviceExportCapability = {
21004
21004
  unexposeDevice: method(UnexposeInputSchema, external_exports.void(), { kind: "mutation" })
21005
21005
  }
21006
21006
  };
21007
+ var LOCATION_ICON_IDS = [
21008
+ "map-pin",
21009
+ "house",
21010
+ "door-open",
21011
+ "sofa",
21012
+ "utensils",
21013
+ "bed-double",
21014
+ "bath",
21015
+ "briefcase",
21016
+ "car",
21017
+ "circle-parking",
21018
+ "route",
21019
+ "trees",
21020
+ "umbrella",
21021
+ "waves-ladder",
21022
+ "fence",
21023
+ "package",
21024
+ "warehouse",
21025
+ "store",
21026
+ "sun",
21027
+ "radar"
21028
+ ];
21029
+ var LocationIconIdSchema = external_exports.enum(LOCATION_ICON_IDS);
21030
+ var LocationIconAssignmentSchema = external_exports.object({
21031
+ locationKey: external_exports.string(),
21032
+ icon: LocationIconIdSchema
21033
+ });
21007
21034
  var ProviderStatusSchema = external_exports.object({
21008
21035
  connected: external_exports.boolean(),
21009
21036
  deviceCount: external_exports.number(),
@@ -21653,7 +21680,11 @@ var deviceManagerCapability = {
21653
21680
  * reference this label keep their `meta.location` value — the
21654
21681
  * registry is purely a suggestion list. To purge from devices,
21655
21682
  * iterate them and call `setLocation(deviceId, null)`
21656
- * separately (or pass `cascade: true` to do it in one shot). */
21683
+ * separately (or pass `cascade: true` to do it in one shot).
21684
+ *
21685
+ * The room's ICON goes with it, always — a key left behind survives in a
21686
+ * map nobody lists, and a room later re-created under the same name would
21687
+ * silently inherit an icon the operator never chose for it. */
21657
21688
  removeLocation: method(external_exports.object({
21658
21689
  name: external_exports.string(),
21659
21690
  cascade: external_exports.boolean().optional()
@@ -21674,7 +21705,13 @@ var deviceManagerCapability = {
21674
21705
  * a suggestion list, and the devices that most need a rename are exactly
21675
21706
  * the ones carrying a label nobody registered. `to` renames onto an
21676
21707
  * existing room by MERGING into it, leaving no duplicate label. An empty
21677
- * `to` throws before anything is written. */
21708
+ * `to` throws before anything is written.
21709
+ *
21710
+ * The room's ICON travels with the rename, including when `from` was
21711
+ * never registered — otherwise it orphans on a key no location carries
21712
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
21713
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
21714
+ * it. */
21678
21715
  renameLocation: method(external_exports.object({
21679
21716
  from: external_exports.string(),
21680
21717
  to: external_exports.string()
@@ -21682,6 +21719,39 @@ var deviceManagerCapability = {
21682
21719
  kind: "mutation",
21683
21720
  auth: "admin"
21684
21721
  }),
21722
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
21723
+ *
21724
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
21725
+ * every consumer of it (the Device Info autocomplete, the HA adoption
21726
+ * import, the recorder) reads a list of labels and none of them wants a
21727
+ * shape change. A surface that wants icons asks for them and joins.
21728
+ *
21729
+ * Only assignments that EXIST are returned — a location with no icon is
21730
+ * absent, not `map-pin`. The fallback belongs to the renderer
21731
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
21732
+ * pin" and "the operator chose nothing" stay distinguishable.
21733
+ *
21734
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
21735
+ * same equality the registry uses everywhere. Never the operator's
21736
+ * casing: a case-only rename is a real edit here, and a map keyed on the
21737
+ * displayed spelling would orphan its entry on exactly that edit. */
21738
+ listLocationIcons: method(external_exports.void(), external_exports.array(LocationIconAssignmentSchema)),
21739
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
21740
+ * assignment. The label need NOT be registered — the registry is a
21741
+ * suggestion list and devices carry labels nobody registered — but an
21742
+ * empty / whitespace-only label throws. Idempotent.
21743
+ *
21744
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
21745
+ * and the viewer draw from different icon modules; see
21746
+ * `device/location-icon.ts` for the list and for what a surface that
21747
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
21748
+ setLocationIcon: method(external_exports.object({
21749
+ location: external_exports.string(),
21750
+ icon: LocationIconIdSchema.nullable()
21751
+ }), external_exports.void(), {
21752
+ kind: "mutation",
21753
+ auth: "admin"
21754
+ }),
21685
21755
  /** Soft-disable / re-enable the device. Drivers consult
21686
21756
  * `BaseDevice.disabled` to gate lifecycle hooks. */
21687
21757
  setDisabled: method(external_exports.object({
@@ -27299,6 +27369,7 @@ var MediaFileKindEnum = external_exports.enum([
27299
27369
  "keyFrame",
27300
27370
  "keyFrameSmall",
27301
27371
  "thumbnailSmall",
27372
+ "confirmationCrop",
27302
27373
  "sceneFrame"
27303
27374
  ]);
27304
27375
  var MediaFileRefSchema = external_exports.object({
@@ -42949,6 +43020,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42949
43020
  addonId: null,
42950
43021
  access: "view"
42951
43022
  },
43023
+ "deviceManager.listLocationIcons": {
43024
+ capName: "device-manager",
43025
+ capScope: "system",
43026
+ addonId: null,
43027
+ access: "view"
43028
+ },
42952
43029
  "deviceManager.listLocations": {
42953
43030
  capName: "device-manager",
42954
43031
  capScope: "system",
@@ -43093,6 +43170,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43093
43170
  addonId: null,
43094
43171
  access: "create"
43095
43172
  },
43173
+ "deviceManager.setLocationIcon": {
43174
+ capName: "device-manager",
43175
+ capScope: "system",
43176
+ addonId: null,
43177
+ access: "create"
43178
+ },
43096
43179
  "deviceManager.setMetadata": {
43097
43180
  capName: "device-manager",
43098
43181
  capScope: "system",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-VR72SEQZ.js";
4
+ } from "./chunk-GDVPY652.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-OPKFHSZH.js");
41
+ await import("./launcher-MMBEAJYM.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-OPKFHSZH.js");
86
+ await import("./launcher-MMBEAJYM.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1140,7 +1140,7 @@ function isUnknown(_value) {
1140
1140
  return true;
1141
1141
  }
1142
1142
  async function resolveServerInteractive(presetNamespace) {
1143
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-63TJXVH3.js");
1143
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-HGPO3SNF.js");
1144
1144
  if (presetNamespace) {
1145
1145
  const spinner4 = clack.spinner();
1146
1146
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-VR72SEQZ.js";
8
+ } from "./chunk-GDVPY652.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-C6JIhqS6.js
23637
- var require_dist_C6JIhqS6 = __commonJS({
23638
- "../system/dist/dist-C6JIhqS6.js"(exports) {
23636
+ // ../system/dist/dist-D6kqBW1G.js
23637
+ var require_dist_D6kqBW1G = __commonJS({
23638
+ "../system/dist/dist-D6kqBW1G.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -31763,6 +31763,35 @@ var require_dist_C6JIhqS6 = __commonJS({
31763
31763
  unexposeDevice: method(UnexposeInputSchema, zod.z.void(), { kind: "mutation" })
31764
31764
  }
31765
31765
  };
31766
+ var LocationIconIdSchema = zod.z.enum([
31767
+ "map-pin",
31768
+ "house",
31769
+ "door-open",
31770
+ "sofa",
31771
+ "utensils",
31772
+ "bed-double",
31773
+ "bath",
31774
+ "briefcase",
31775
+ "car",
31776
+ "circle-parking",
31777
+ "route",
31778
+ "trees",
31779
+ "umbrella",
31780
+ "waves-ladder",
31781
+ "fence",
31782
+ "package",
31783
+ "warehouse",
31784
+ "store",
31785
+ "sun",
31786
+ "radar"
31787
+ ]);
31788
+ var LocationIconAssignmentSchema = zod.z.object({
31789
+ locationKey: zod.z.string(),
31790
+ icon: LocationIconIdSchema
31791
+ });
31792
+ function locationIconKey(label) {
31793
+ return label.trim().toLowerCase();
31794
+ }
31766
31795
  var ProviderStatusSchema = zod.z.object({
31767
31796
  connected: zod.z.boolean(),
31768
31797
  deviceCount: zod.z.number(),
@@ -32412,7 +32441,11 @@ var require_dist_C6JIhqS6 = __commonJS({
32412
32441
  * reference this label keep their `meta.location` value — the
32413
32442
  * registry is purely a suggestion list. To purge from devices,
32414
32443
  * iterate them and call `setLocation(deviceId, null)`
32415
- * separately (or pass `cascade: true` to do it in one shot). */
32444
+ * separately (or pass `cascade: true` to do it in one shot).
32445
+ *
32446
+ * The room's ICON goes with it, always — a key left behind survives in a
32447
+ * map nobody lists, and a room later re-created under the same name would
32448
+ * silently inherit an icon the operator never chose for it. */
32416
32449
  removeLocation: method(zod.z.object({
32417
32450
  name: zod.z.string(),
32418
32451
  cascade: zod.z.boolean().optional()
@@ -32433,7 +32466,13 @@ var require_dist_C6JIhqS6 = __commonJS({
32433
32466
  * a suggestion list, and the devices that most need a rename are exactly
32434
32467
  * the ones carrying a label nobody registered. `to` renames onto an
32435
32468
  * existing room by MERGING into it, leaving no duplicate label. An empty
32436
- * `to` throws before anything is written. */
32469
+ * `to` throws before anything is written.
32470
+ *
32471
+ * The room's ICON travels with the rename, including when `from` was
32472
+ * never registered — otherwise it orphans on a key no location carries
32473
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
32474
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
32475
+ * it. */
32437
32476
  renameLocation: method(zod.z.object({
32438
32477
  from: zod.z.string(),
32439
32478
  to: zod.z.string()
@@ -32441,6 +32480,39 @@ var require_dist_C6JIhqS6 = __commonJS({
32441
32480
  kind: "mutation",
32442
32481
  auth: "admin"
32443
32482
  }),
32483
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
32484
+ *
32485
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
32486
+ * every consumer of it (the Device Info autocomplete, the HA adoption
32487
+ * import, the recorder) reads a list of labels and none of them wants a
32488
+ * shape change. A surface that wants icons asks for them and joins.
32489
+ *
32490
+ * Only assignments that EXIST are returned — a location with no icon is
32491
+ * absent, not `map-pin`. The fallback belongs to the renderer
32492
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
32493
+ * pin" and "the operator chose nothing" stay distinguishable.
32494
+ *
32495
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
32496
+ * same equality the registry uses everywhere. Never the operator's
32497
+ * casing: a case-only rename is a real edit here, and a map keyed on the
32498
+ * displayed spelling would orphan its entry on exactly that edit. */
32499
+ listLocationIcons: method(zod.z.void(), zod.z.array(LocationIconAssignmentSchema)),
32500
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
32501
+ * assignment. The label need NOT be registered — the registry is a
32502
+ * suggestion list and devices carry labels nobody registered — but an
32503
+ * empty / whitespace-only label throws. Idempotent.
32504
+ *
32505
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
32506
+ * and the viewer draw from different icon modules; see
32507
+ * `device/location-icon.ts` for the list and for what a surface that
32508
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
32509
+ setLocationIcon: method(zod.z.object({
32510
+ location: zod.z.string(),
32511
+ icon: LocationIconIdSchema.nullable()
32512
+ }), zod.z.void(), {
32513
+ kind: "mutation",
32514
+ auth: "admin"
32515
+ }),
32444
32516
  /** Soft-disable / re-enable the device. Drivers consult
32445
32517
  * `BaseDevice.disabled` to gate lifecycle hooks. */
32446
32518
  setDisabled: method(zod.z.object({
@@ -38051,6 +38123,7 @@ var require_dist_C6JIhqS6 = __commonJS({
38051
38123
  "keyFrame",
38052
38124
  "keyFrameSmall",
38053
38125
  "thumbnailSmall",
38126
+ "confirmationCrop",
38054
38127
  "sceneFrame"
38055
38128
  ]);
38056
38129
  var MediaFileSchema = zod.z.object({
@@ -54340,6 +54413,12 @@ var require_dist_C6JIhqS6 = __commonJS({
54340
54413
  addonId: null,
54341
54414
  access: "view"
54342
54415
  },
54416
+ "deviceManager.listLocationIcons": {
54417
+ capName: "device-manager",
54418
+ capScope: "system",
54419
+ addonId: null,
54420
+ access: "view"
54421
+ },
54343
54422
  "deviceManager.listLocations": {
54344
54423
  capName: "device-manager",
54345
54424
  capScope: "system",
@@ -54484,6 +54563,12 @@ var require_dist_C6JIhqS6 = __commonJS({
54484
54563
  addonId: null,
54485
54564
  access: "create"
54486
54565
  },
54566
+ "deviceManager.setLocationIcon": {
54567
+ capName: "device-manager",
54568
+ capScope: "system",
54569
+ addonId: null,
54570
+ access: "create"
54571
+ },
54487
54572
  "deviceManager.setMetadata": {
54488
54573
  capName: "device-manager",
54489
54574
  capScope: "system",
@@ -61908,6 +61993,12 @@ var require_dist_C6JIhqS6 = __commonJS({
61908
61993
  return LegacyStorageLocationDefaultSchema;
61909
61994
  }
61910
61995
  });
61996
+ Object.defineProperty(exports, "LocationIconIdSchema", {
61997
+ enumerable: true,
61998
+ get: function() {
61999
+ return LocationIconIdSchema;
62000
+ }
62001
+ });
61911
62002
  Object.defineProperty(exports, "METHOD_ACCESS_MAP", {
61912
62003
  enumerable: true,
61913
62004
  get: function() {
@@ -62310,6 +62401,12 @@ var require_dist_C6JIhqS6 = __commonJS({
62310
62401
  return localNetworkCapability;
62311
62402
  }
62312
62403
  });
62404
+ Object.defineProperty(exports, "locationIconKey", {
62405
+ enumerable: true,
62406
+ get: function() {
62407
+ return locationIconKey;
62408
+ }
62409
+ });
62313
62410
  Object.defineProperty(exports, "logDestinationCapability", {
62314
62411
  enumerable: true,
62315
62412
  get: function() {
@@ -62556,7 +62653,7 @@ var require_alerts_addon = __commonJS({
62556
62653
  [Symbol.toStringTag]: { value: "Module" }
62557
62654
  });
62558
62655
  require_chunk_Cek0wNdY();
62559
- var require_dist10 = require_dist_C6JIhqS6();
62656
+ var require_dist10 = require_dist_D6kqBW1G();
62560
62657
  function selectExpired(alerts, cutoffMs) {
62561
62658
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
62562
62659
  }
@@ -63375,7 +63472,7 @@ var require_console_logging = __commonJS({
63375
63472
  [Symbol.toStringTag]: { value: "Module" }
63376
63473
  });
63377
63474
  require_chunk_Cek0wNdY();
63378
- var require_dist10 = require_dist_C6JIhqS6();
63475
+ var require_dist10 = require_dist_D6kqBW1G();
63379
63476
  var require_formatter = require_formatter_DqAKDlvN();
63380
63477
  var LEVEL_RANK = {
63381
63478
  debug: 0,
@@ -63469,7 +63566,7 @@ var require_core_blocks_addon = __commonJS({
63469
63566
  "use strict";
63470
63567
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
63471
63568
  var require_chunk = require_chunk_Cek0wNdY();
63472
- var require_dist10 = require_dist_C6JIhqS6();
63569
+ var require_dist10 = require_dist_D6kqBW1G();
63473
63570
  var node_crypto = __require("crypto");
63474
63571
  var node_fs_promises = __require("fs/promises");
63475
63572
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -64366,11 +64463,11 @@ var require_core_blocks = __commonJS({
64366
64463
  }
64367
64464
  });
64368
64465
 
64369
- // ../system/dist/retired-settings-keys-C53Y2Q1C.js
64370
- var require_retired_settings_keys_C53Y2Q1C = __commonJS({
64371
- "../system/dist/retired-settings-keys-C53Y2Q1C.js"(exports) {
64466
+ // ../system/dist/retired-settings-keys-BPIyHR4_.js
64467
+ var require_retired_settings_keys_BPIyHR4 = __commonJS({
64468
+ "../system/dist/retired-settings-keys-BPIyHR4_.js"(exports) {
64372
64469
  "use strict";
64373
- var require_dist10 = require_dist_C6JIhqS6();
64470
+ var require_dist10 = require_dist_D6kqBW1G();
64374
64471
  function settingsStoreIsAuthoritativeHere(env) {
64375
64472
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
64376
64473
  return raw === "" || raw === "hub";
@@ -66607,8 +66704,8 @@ var require_device_manager_addon = __commonJS({
66607
66704
  [Symbol.toStringTag]: { value: "Module" }
66608
66705
  });
66609
66706
  require_chunk_Cek0wNdY();
66610
- var require_dist10 = require_dist_C6JIhqS6();
66611
- var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
66707
+ var require_dist10 = require_dist_D6kqBW1G();
66708
+ var require_retired_settings_keys = require_retired_settings_keys_BPIyHR4();
66612
66709
  var node_crypto = __require("crypto");
66613
66710
  var _camstack_types_node = require_node();
66614
66711
  var JOB_HISTORY = 20;
@@ -66830,13 +66927,15 @@ var require_device_manager_addon = __commonJS({
66830
66927
  const startedAt = this.now();
66831
66928
  try {
66832
66929
  const per = input.perCandidate?.[childNativeId];
66833
- const entry = (await provider.adopt({
66930
+ const adoptCandidate = async () => await provider.adopt({
66834
66931
  integrationId: input.integrationId,
66835
66932
  childNativeIds: [childNativeId],
66836
66933
  ...input.filter !== void 0 ? { filter: input.filter } : {},
66837
66934
  ...input.importLocations !== void 0 ? { importLocations: input.importLocations } : {},
66838
66935
  ...per !== void 0 ? { perCandidate: { [childNativeId]: per } } : {}
66839
- })).adopted[0];
66936
+ });
66937
+ const fence = this.deps.removalFence;
66938
+ const entry = (fence === void 0 ? await adoptCandidate() : await fence.runUnfenced(adoptCandidate)).adopted[0];
66840
66939
  if (!entry) {
66841
66940
  job.results.push({
66842
66941
  childNativeId,
@@ -70332,6 +70431,42 @@ var require_device_manager_addon = __commonJS({
70332
70431
  await pctx.settings.writeAddonStore({ locations: [...current, trimmed] });
70333
70432
  });
70334
70433
  }
70434
+ async function listLocationIcons(pctx) {
70435
+ const icons = (await pctx.metaStore.readStore()).locationIcons ?? {};
70436
+ return Object.entries(icons).map(([locationKey, icon]) => ({
70437
+ locationKey,
70438
+ icon
70439
+ })).toSorted((a, b) => a.locationKey.localeCompare(b.locationKey));
70440
+ }
70441
+ async function setLocationIcon(pctx, input) {
70442
+ const trimmed = input.location.trim();
70443
+ if (trimmed.length === 0) throw new Error("[device-manager] setLocationIcon: location must be non-empty");
70444
+ const key = require_dist10.locationIconKey(trimmed);
70445
+ await pctx.bindingsDeps.withAddonStoreWriteLock(async () => {
70446
+ const icons = (await pctx.metaStore.readStore()).locationIcons ?? {};
70447
+ if (input.icon === null) {
70448
+ if (!(key in icons)) return;
70449
+ const { [key]: _cleared, ...kept } = icons;
70450
+ await pctx.settings.writeAddonStore({ locationIcons: kept });
70451
+ return;
70452
+ }
70453
+ if (icons[key] === input.icon) return;
70454
+ await pctx.settings.writeAddonStore({ locationIcons: {
70455
+ ...icons,
70456
+ [key]: input.icon
70457
+ } });
70458
+ });
70459
+ }
70460
+ function renameLocationIcon(icons, fromKey, toKey) {
70461
+ const moved = icons[fromKey];
70462
+ if (moved === void 0) return null;
70463
+ if (fromKey === toKey) return null;
70464
+ const { [fromKey]: _dropped, ...rest } = icons;
70465
+ return toKey in rest ? rest : {
70466
+ ...rest,
70467
+ [toKey]: moved
70468
+ };
70469
+ }
70335
70470
  async function renameLocation(pctx, input) {
70336
70471
  const from = input.from.trim();
70337
70472
  const to = input.to.trim();
@@ -70340,13 +70475,19 @@ var require_device_manager_addon = __commonJS({
70340
70475
  const fromKey = from.toLowerCase();
70341
70476
  const toKey = to.toLowerCase();
70342
70477
  await pctx.bindingsDeps.withAddonStoreWriteLock(async () => {
70343
- const current = (await pctx.metaStore.readStore()).locations ?? [];
70344
- if (!current.some((l) => l.trim().toLowerCase() === fromKey)) return;
70478
+ const store = await pctx.metaStore.readStore();
70479
+ const current = store.locations ?? [];
70480
+ const registered = current.some((l) => l.trim().toLowerCase() === fromKey);
70481
+ const movedIcons = renameLocationIcon(store.locationIcons ?? {}, fromKey, toKey);
70482
+ if (!registered && movedIcons === null) return;
70345
70483
  const kept = current.filter((l) => {
70346
70484
  const key = l.trim().toLowerCase();
70347
70485
  return key !== fromKey && key !== toKey;
70348
70486
  });
70349
- await pctx.settings.writeAddonStore({ locations: [...kept, to] });
70487
+ await pctx.settings.writeAddonStore({
70488
+ ...registered ? { locations: [...kept, to] } : {},
70489
+ ...movedIcons !== null ? { locationIcons: movedIcons } : {}
70490
+ });
70350
70491
  });
70351
70492
  const moved = await pctx.metaStore.withMetaWriteLock(async () => {
70352
70493
  const out = [];
@@ -70384,10 +70525,19 @@ var require_device_manager_addon = __commonJS({
70384
70525
  const trimmed = input.name.trim();
70385
70526
  if (trimmed.length === 0) return;
70386
70527
  await pctx.bindingsDeps.withAddonStoreWriteLock(async () => {
70387
- const current = (await pctx.metaStore.readStore()).locations ?? [];
70388
- const remaining = current.filter((l) => l.toLowerCase() !== trimmed.toLowerCase());
70389
- if (remaining.length === current.length) return;
70390
- await pctx.settings.writeAddonStore({ locations: remaining });
70528
+ const store = await pctx.metaStore.readStore();
70529
+ const current = store.locations ?? [];
70530
+ const key = require_dist10.locationIconKey(trimmed);
70531
+ const remaining = current.filter((l) => l.toLowerCase() !== key);
70532
+ const droppedLabel = remaining.length !== current.length;
70533
+ const icons = store.locationIcons ?? {};
70534
+ const droppedIcon = key in icons;
70535
+ if (!droppedLabel && !droppedIcon) return;
70536
+ const { [key]: _removedIcon, ...keptIcons } = icons;
70537
+ await pctx.settings.writeAddonStore({
70538
+ ...droppedLabel ? { locations: remaining } : {},
70539
+ ...droppedIcon ? { locationIcons: keptIcons } : {}
70540
+ });
70391
70541
  });
70392
70542
  if (input.cascade !== true) return;
70393
70543
  const cleared = await pctx.metaStore.withMetaWriteLock(async () => {
@@ -70478,12 +70628,24 @@ var require_device_manager_addon = __commonJS({
70478
70628
  const nextDeviceId = raw["nextDeviceId"];
70479
70629
  const locations = raw["locations"];
70480
70630
  const roleDisplayDefaults = raw["roleDisplayDefaults"];
70631
+ const locationIcons = decodeLocationIcons(raw["locationIcons"]);
70481
70632
  return {
70482
70633
  ...typeof nextDeviceId === "number" && Number.isFinite(nextDeviceId) ? { nextDeviceId } : {},
70483
70634
  ...Array.isArray(locations) ? { locations: locations.filter((l) => typeof l === "string") } : {},
70484
- ...isRoleDisplayDefaults(roleDisplayDefaults) ? { roleDisplayDefaults } : {}
70635
+ ...isRoleDisplayDefaults(roleDisplayDefaults) ? { roleDisplayDefaults } : {},
70636
+ ...locationIcons !== null ? { locationIcons } : {}
70485
70637
  };
70486
70638
  }
70639
+ function decodeLocationIcons(raw) {
70640
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return null;
70641
+ const out = {};
70642
+ for (const [key, value] of Object.entries(raw)) {
70643
+ const parsed = require_dist10.LocationIconIdSchema.safeParse(value);
70644
+ if (!parsed.success) continue;
70645
+ out[key] = parsed.data;
70646
+ }
70647
+ return out;
70648
+ }
70487
70649
  function isRoleDisplayDefaults(value) {
70488
70650
  return value !== null && typeof value === "object" && !Array.isArray(value);
70489
70651
  }
@@ -71878,6 +72040,17 @@ var require_device_manager_addon = __commonJS({
71878
72040
  remoteNativeCaps = /* @__PURE__ */ new Map();
71879
72041
  /** Background adoption jobs — lazily constructed (needs `ctx.logger`). */
71880
72042
  adoptionJobEngine = null;
72043
+ /**
72044
+ * ONE removal fence for this process, shared by the provider context and the
72045
+ * adoption-job engine.
72046
+ *
72047
+ * It used to be constructed inline into the context, so the job engine had
72048
+ * no way to reach it and an operator re-adopting hardware they had just
72049
+ * deleted was refused for the whole 5-minute TTL — their own action, denied.
72050
+ * Two fences would be worse than one: the engine would suspend a fence that
72051
+ * `allocateDeviceId` never consults.
72052
+ */
72053
+ removalFence = createRemovalFence();
71881
72054
  /** The runtime-state mirror, asserted present (constructed in onInitialize). */
71882
72055
  get stateMirror() {
71883
72056
  if (!this.stateMirrorImpl) throw new Error("DeviceManagerAddon: state mirror accessed before onInitialize");
@@ -71915,7 +72088,8 @@ var require_device_manager_addon = __commonJS({
71915
72088
  get adoptionJobsImpl() {
71916
72089
  if (!this.adoptionJobEngine) this.adoptionJobEngine = new AdoptionJobEngine({
71917
72090
  resolveProvider: async (addonId) => this.requireDeviceAdoptionProvider(addonId),
71918
- logger: this.ctx.logger
72091
+ logger: this.ctx.logger,
72092
+ removalFence: this.removalFence
71919
72093
  });
71920
72094
  return this.adoptionJobEngine;
71921
72095
  }
@@ -72066,7 +72240,7 @@ var require_device_manager_addon = __commonJS({
72066
72240
  registry,
72067
72241
  bindingsDeps: this.bindingsDeps,
72068
72242
  migrationGuard: createMigrationGuard(),
72069
- removalFence: createRemovalFence(),
72243
+ removalFence: this.removalFence,
72070
72244
  requireDeviceOps,
72071
72245
  stampIntegrationId: stampIntegrationId$1,
72072
72246
  get provider() {
@@ -72112,6 +72286,8 @@ var require_device_manager_addon = __commonJS({
72112
72286
  addLocation: (input) => addLocation(pctx, input),
72113
72287
  removeLocation: (input) => removeLocation(pctx, input),
72114
72288
  renameLocation: (input) => renameLocation(pctx, input),
72289
+ listLocationIcons: () => listLocationIcons(pctx),
72290
+ setLocationIcon: (input) => setLocationIcon(pctx, input),
72115
72291
  listPersistedByAddon: (input) => listPersistedByAddon(pctx, input),
72116
72292
  listAll: (input) => listAll(pctx, input),
72117
72293
  getDevice: (input) => getDevice(pctx, input),
@@ -72318,7 +72494,7 @@ var require_hub_forwarder = __commonJS({
72318
72494
  [Symbol.toStringTag]: { value: "Module" }
72319
72495
  });
72320
72496
  require_chunk_Cek0wNdY();
72321
- var require_dist10 = require_dist_C6JIhqS6();
72497
+ var require_dist10 = require_dist_D6kqBW1G();
72322
72498
  var require_formatter = require_formatter_DqAKDlvN();
72323
72499
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
72324
72500
  var HubForwarderDestination = class {
@@ -72455,7 +72631,7 @@ var require_liveness_monitor_addon = __commonJS({
72455
72631
  "use strict";
72456
72632
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
72457
72633
  require_chunk_Cek0wNdY();
72458
- var require_dist10 = require_dist_C6JIhqS6();
72634
+ var require_dist10 = require_dist_D6kqBW1G();
72459
72635
  var NO_DEVICES = "liveness:no-devices";
72460
72636
  var ALL_OFFLINE = "liveness:all-devices-offline";
72461
72637
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -72651,7 +72827,7 @@ var require_local_auth_addon = __commonJS({
72651
72827
  [Symbol.toStringTag]: { value: "Module" }
72652
72828
  });
72653
72829
  var require_chunk = require_chunk_Cek0wNdY();
72654
- var require_dist10 = require_dist_C6JIhqS6();
72830
+ var require_dist10 = require_dist_D6kqBW1G();
72655
72831
  var node_crypto = __require("crypto");
72656
72832
  node_crypto = require_chunk.__toESM(node_crypto);
72657
72833
  var crypto$1 = __require("crypto");
@@ -80464,7 +80640,7 @@ var require_loki_logging = __commonJS({
80464
80640
  [Symbol.toStringTag]: { value: "Module" }
80465
80641
  });
80466
80642
  require_chunk_Cek0wNdY();
80467
- var require_dist10 = require_dist_C6JIhqS6();
80643
+ var require_dist10 = require_dist_D6kqBW1G();
80468
80644
  function sanitizeLabelName(raw) {
80469
80645
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
80470
80646
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -81051,7 +81227,7 @@ var require_native_metrics_addon = __commonJS({
81051
81227
  [Symbol.toStringTag]: { value: "Module" }
81052
81228
  });
81053
81229
  var require_chunk = require_chunk_Cek0wNdY();
81054
- var require_dist10 = require_dist_C6JIhqS6();
81230
+ var require_dist10 = require_dist_D6kqBW1G();
81055
81231
  var node_fs_promises = __require("fs/promises");
81056
81232
  var node_fs = __require("fs");
81057
81233
  node_fs = require_chunk.__toESM(node_fs);
@@ -83804,7 +83980,7 @@ var require_filesystem_storage_addon = __commonJS({
83804
83980
  [Symbol.toStringTag]: { value: "Module" }
83805
83981
  });
83806
83982
  var require_chunk = require_chunk_Cek0wNdY();
83807
- var require_dist10 = require_dist_C6JIhqS6();
83983
+ var require_dist10 = require_dist_D6kqBW1G();
83808
83984
  var node_crypto = __require("crypto");
83809
83985
  var node_fs_promises = __require("fs/promises");
83810
83986
  var node_path = __require("path");
@@ -85031,8 +85207,8 @@ var require_sqlite_settings_addon = __commonJS({
85031
85207
  [Symbol.toStringTag]: { value: "Module" }
85032
85208
  });
85033
85209
  var require_chunk = require_chunk_Cek0wNdY();
85034
- var require_dist10 = require_dist_C6JIhqS6();
85035
- var require_retired_settings_keys = require_retired_settings_keys_C53Y2Q1C();
85210
+ var require_dist10 = require_dist_D6kqBW1G();
85211
+ var require_retired_settings_keys = require_retired_settings_keys_BPIyHR4();
85036
85212
  var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
85037
85213
  var node_crypto = __require("crypto");
85038
85214
  var node_path = __require("path");
@@ -87819,7 +87995,7 @@ var require_storage_orchestrator_addon = __commonJS({
87819
87995
  [Symbol.toStringTag]: { value: "Module" }
87820
87996
  });
87821
87997
  var require_chunk = require_chunk_Cek0wNdY();
87822
- var require_dist10 = require_dist_C6JIhqS6();
87998
+ var require_dist10 = require_dist_D6kqBW1G();
87823
87999
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
87824
88000
  var zod = require_zod();
87825
88001
  var node_crypto = __require("crypto");
@@ -91546,7 +91722,7 @@ var require_system_config_addon = __commonJS({
91546
91722
  [Symbol.toStringTag]: { value: "Module" }
91547
91723
  });
91548
91724
  require_chunk_Cek0wNdY();
91549
- var require_dist10 = require_dist_C6JIhqS6();
91725
+ var require_dist10 = require_dist_D6kqBW1G();
91550
91726
  var SECTION_TITLES = {
91551
91727
  server: "Server",
91552
91728
  auth: "Authentication"
@@ -109607,7 +109783,7 @@ var require_winston_logging = __commonJS({
109607
109783
  [Symbol.toStringTag]: { value: "Module" }
109608
109784
  });
109609
109785
  var require_chunk = require_chunk_Cek0wNdY();
109610
- var require_dist10 = require_dist_C6JIhqS6();
109786
+ var require_dist10 = require_dist_D6kqBW1G();
109611
109787
  var require_formatter = require_formatter_DqAKDlvN();
109612
109788
  var node_path = __require("path");
109613
109789
  node_path = require_chunk.__toESM(node_path);
@@ -135874,7 +136050,7 @@ var require_dist3 = __commonJS({
135874
136050
  "use strict";
135875
136051
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
135876
136052
  var require_chunk = require_chunk_Cek0wNdY();
135877
- var require_dist10 = require_dist_C6JIhqS6();
136053
+ var require_dist10 = require_dist_D6kqBW1G();
135878
136054
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
135879
136055
  require_alerts();
135880
136056
  var require_formatter = require_formatter_DqAKDlvN();
@@ -225125,6 +225301,41 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225125
225301
  unexposeDevice: require_sleep.method(UnexposeInputSchema, zod.z.void(), { kind: "mutation" })
225126
225302
  }
225127
225303
  };
225304
+ var LOCATION_ICON_IDS = [
225305
+ "map-pin",
225306
+ "house",
225307
+ "door-open",
225308
+ "sofa",
225309
+ "utensils",
225310
+ "bed-double",
225311
+ "bath",
225312
+ "briefcase",
225313
+ "car",
225314
+ "circle-parking",
225315
+ "route",
225316
+ "trees",
225317
+ "umbrella",
225318
+ "waves-ladder",
225319
+ "fence",
225320
+ "package",
225321
+ "warehouse",
225322
+ "store",
225323
+ "sun",
225324
+ "radar"
225325
+ ];
225326
+ var LOCATION_ICON_FALLBACK = "map-pin";
225327
+ var LocationIconIdSchema = zod.z.enum(LOCATION_ICON_IDS);
225328
+ var LocationIconAssignmentSchema = zod.z.object({
225329
+ locationKey: zod.z.string(),
225330
+ icon: LocationIconIdSchema
225331
+ });
225332
+ function locationIconKey(label) {
225333
+ return label.trim().toLowerCase();
225334
+ }
225335
+ function resolveLocationIcon(value) {
225336
+ const parsed = LocationIconIdSchema.safeParse(value);
225337
+ return parsed.success ? parsed.data : LOCATION_ICON_FALLBACK;
225338
+ }
225128
225339
  var ProviderStatusSchema = zod.z.object({
225129
225340
  connected: zod.z.boolean(),
225130
225341
  deviceCount: zod.z.number(),
@@ -225774,7 +225985,11 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225774
225985
  * reference this label keep their `meta.location` value — the
225775
225986
  * registry is purely a suggestion list. To purge from devices,
225776
225987
  * iterate them and call `setLocation(deviceId, null)`
225777
- * separately (or pass `cascade: true` to do it in one shot). */
225988
+ * separately (or pass `cascade: true` to do it in one shot).
225989
+ *
225990
+ * The room's ICON goes with it, always — a key left behind survives in a
225991
+ * map nobody lists, and a room later re-created under the same name would
225992
+ * silently inherit an icon the operator never chose for it. */
225778
225993
  removeLocation: require_sleep.method(zod.z.object({
225779
225994
  name: zod.z.string(),
225780
225995
  cascade: zod.z.boolean().optional()
@@ -225795,7 +226010,13 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225795
226010
  * a suggestion list, and the devices that most need a rename are exactly
225796
226011
  * the ones carrying a label nobody registered. `to` renames onto an
225797
226012
  * existing room by MERGING into it, leaving no duplicate label. An empty
225798
- * `to` throws before anything is written. */
226013
+ * `to` throws before anything is written.
226014
+ *
226015
+ * The room's ICON travels with the rename, including when `from` was
226016
+ * never registered — otherwise it orphans on a key no location carries
226017
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
226018
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
226019
+ * it. */
225799
226020
  renameLocation: require_sleep.method(zod.z.object({
225800
226021
  from: zod.z.string(),
225801
226022
  to: zod.z.string()
@@ -225803,6 +226024,39 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225803
226024
  kind: "mutation",
225804
226025
  auth: "admin"
225805
226026
  }),
226027
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
226028
+ *
226029
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
226030
+ * every consumer of it (the Device Info autocomplete, the HA adoption
226031
+ * import, the recorder) reads a list of labels and none of them wants a
226032
+ * shape change. A surface that wants icons asks for them and joins.
226033
+ *
226034
+ * Only assignments that EXIST are returned — a location with no icon is
226035
+ * absent, not `map-pin`. The fallback belongs to the renderer
226036
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
226037
+ * pin" and "the operator chose nothing" stay distinguishable.
226038
+ *
226039
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
226040
+ * same equality the registry uses everywhere. Never the operator's
226041
+ * casing: a case-only rename is a real edit here, and a map keyed on the
226042
+ * displayed spelling would orphan its entry on exactly that edit. */
226043
+ listLocationIcons: require_sleep.method(zod.z.void(), zod.z.array(LocationIconAssignmentSchema)),
226044
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
226045
+ * assignment. The label need NOT be registered — the registry is a
226046
+ * suggestion list and devices carry labels nobody registered — but an
226047
+ * empty / whitespace-only label throws. Idempotent.
226048
+ *
226049
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
226050
+ * and the viewer draw from different icon modules; see
226051
+ * `device/location-icon.ts` for the list and for what a surface that
226052
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
226053
+ setLocationIcon: require_sleep.method(zod.z.object({
226054
+ location: zod.z.string(),
226055
+ icon: LocationIconIdSchema.nullable()
226056
+ }), zod.z.void(), {
226057
+ kind: "mutation",
226058
+ auth: "admin"
226059
+ }),
225806
226060
  /** Soft-disable / re-enable the device. Drivers consult
225807
226061
  * `BaseDevice.disabled` to gate lifecycle hooks. */
225808
226062
  setDisabled: require_sleep.method(zod.z.object({
@@ -232243,6 +232497,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
232243
232497
  "keyFrame",
232244
232498
  "keyFrameSmall",
232245
232499
  "thumbnailSmall",
232500
+ "confirmationCrop",
232246
232501
  "sceneFrame"
232247
232502
  ]);
232248
232503
  var MediaFileRefSchema = zod.z.object({
@@ -252279,6 +252534,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
252279
252534
  addonId: null,
252280
252535
  access: "view"
252281
252536
  },
252537
+ "deviceManager.listLocationIcons": {
252538
+ capName: "device-manager",
252539
+ capScope: "system",
252540
+ addonId: null,
252541
+ access: "view"
252542
+ },
252282
252543
  "deviceManager.listLocations": {
252283
252544
  capName: "device-manager",
252284
252545
  capScope: "system",
@@ -252423,6 +252684,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
252423
252684
  addonId: null,
252424
252685
  access: "create"
252425
252686
  },
252687
+ "deviceManager.setLocationIcon": {
252688
+ capName: "device-manager",
252689
+ capScope: "system",
252690
+ addonId: null,
252691
+ access: "create"
252692
+ },
252426
252693
  "deviceManager.setMetadata": {
252427
252694
  capName: "device-manager",
252428
252695
  capScope: "system",
@@ -259989,6 +260256,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
259989
260256
  addLocation: (input) => dispatch("deviceManager", "addLocation", "mutation", input),
259990
260257
  removeLocation: (input) => dispatch("deviceManager", "removeLocation", "mutation", input),
259991
260258
  renameLocation: (input) => dispatch("deviceManager", "renameLocation", "mutation", input),
260259
+ listLocationIcons: (input) => dispatch("deviceManager", "listLocationIcons", "query", input),
260260
+ setLocationIcon: (input) => dispatch("deviceManager", "setLocationIcon", "mutation", input),
259992
260261
  listPersistedByAddon: (input) => dispatch("deviceManager", "listPersistedByAddon", "query", input),
259993
260262
  listAll: (input) => dispatch("deviceManager", "listAll", "query", input),
259994
260263
  getChildren: (input) => dispatch("deviceManager", "getChildren", "query", input),
@@ -263536,6 +263805,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263536
263805
  exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
263537
263806
  exports.LOAD_CONTRIBUTION_ATTRIBUTIONS = LOAD_CONTRIBUTION_ATTRIBUTIONS;
263538
263807
  exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
263808
+ exports.LOCATION_ICON_FALLBACK = LOCATION_ICON_FALLBACK;
263809
+ exports.LOCATION_ICON_IDS = LOCATION_ICON_IDS;
263539
263810
  exports.LOG_CHANNEL_TICK_MS = LOG_CHANNEL_TICK_MS;
263540
263811
  exports.LOG_LEVEL_RANK = LOG_LEVEL_RANK;
263541
263812
  exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
@@ -263576,6 +263847,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
263576
263847
  exports.LlmUsageSchema = LlmUsageSchema;
263577
263848
  exports.LoadContributionSchema = LoadContributionSchema;
263578
263849
  exports.LocateSegmentResultSchema = LocateSegmentResultSchema;
263850
+ exports.LocationIconAssignmentSchema = LocationIconAssignmentSchema;
263851
+ exports.LocationIconIdSchema = LocationIconIdSchema;
263579
263852
  exports.LocationStatSchema = LocationStatSchema;
263580
263853
  exports.LockControlStatusSchema = LockControlStatusSchema;
263581
263854
  exports.LockStateSchema = LockStateSchema;
@@ -264475,6 +264748,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
264475
264748
  exports.llmRuntimeCapability = llmRuntimeCapability;
264476
264749
  exports.loadContributionCapability = loadContributionCapability;
264477
264750
  exports.localNetworkCapability = localNetworkCapability;
264751
+ exports.locationIconKey = locationIconKey;
264478
264752
  exports.locationSimilarity = locationSimilarity;
264479
264753
  exports.lockControlCapability = lockControlCapability;
264480
264754
  exports.logBannerArgs = require_canonical_hash.logBannerArgs;
@@ -264599,6 +264873,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
264599
264873
  exports.resolveEgressDecodeHwAccel = resolveEgressDecodeHwAccel;
264600
264874
  exports.resolveFormat = resolveFormat;
264601
264875
  exports.resolveHydratedFieldValue = require_sleep.resolveHydratedFieldValue;
264876
+ exports.resolveLocationIcon = resolveLocationIcon;
264602
264877
  exports.resolveLocationMode = resolveLocationMode;
264603
264878
  exports.resolveMethodAuth = resolveMethodAuth;
264604
264879
  exports.resolveModelFormat = resolveModelFormat;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.156",
3
+ "version": "1.2.158",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",