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-
|
|
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-
|
|
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-
|
|
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-
|
|
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}")`);
|
|
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
|
|
|
23633
23633
|
}
|
|
23634
23634
|
});
|
|
23635
23635
|
|
|
23636
|
-
// ../system/dist/dist-
|
|
23637
|
-
var
|
|
23638
|
-
"../system/dist/dist-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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-
|
|
64370
|
-
var
|
|
64371
|
-
"../system/dist/retired-settings-keys-
|
|
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 =
|
|
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 =
|
|
66611
|
-
var require_retired_settings_keys =
|
|
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
|
|
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
|
-
})
|
|
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
|
|
70344
|
-
|
|
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({
|
|
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
|
|
70388
|
-
const
|
|
70389
|
-
|
|
70390
|
-
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
85035
|
-
var require_retired_settings_keys =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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;
|