camstack 1.2.157 → 1.2.159

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,46 @@ 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
+ });
21034
+ var LocationDescriptionAssignmentSchema = external_exports.object({
21035
+ locationKey: external_exports.string(),
21036
+ description: external_exports.string()
21037
+ });
21038
+ var SiteZoneSchema = external_exports.object({
21039
+ zoneKey: external_exports.string(),
21040
+ label: external_exports.string(),
21041
+ icon: LocationIconIdSchema.nullable(),
21042
+ /** Folded location keys, sorted. A location listed here need not be
21043
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
21044
+ * the ones that most want grouping. */
21045
+ locationKeys: external_exports.array(external_exports.string())
21046
+ });
21007
21047
  var ProviderStatusSchema = external_exports.object({
21008
21048
  connected: external_exports.boolean(),
21009
21049
  deviceCount: external_exports.number(),
@@ -21653,7 +21693,11 @@ var deviceManagerCapability = {
21653
21693
  * reference this label keep their `meta.location` value — the
21654
21694
  * registry is purely a suggestion list. To purge from devices,
21655
21695
  * iterate them and call `setLocation(deviceId, null)`
21656
- * separately (or pass `cascade: true` to do it in one shot). */
21696
+ * separately (or pass `cascade: true` to do it in one shot).
21697
+ *
21698
+ * The room's ICON goes with it, always — a key left behind survives in a
21699
+ * map nobody lists, and a room later re-created under the same name would
21700
+ * silently inherit an icon the operator never chose for it. */
21657
21701
  removeLocation: method(external_exports.object({
21658
21702
  name: external_exports.string(),
21659
21703
  cascade: external_exports.boolean().optional()
@@ -21674,7 +21718,13 @@ var deviceManagerCapability = {
21674
21718
  * a suggestion list, and the devices that most need a rename are exactly
21675
21719
  * the ones carrying a label nobody registered. `to` renames onto an
21676
21720
  * existing room by MERGING into it, leaving no duplicate label. An empty
21677
- * `to` throws before anything is written. */
21721
+ * `to` throws before anything is written.
21722
+ *
21723
+ * The room's ICON travels with the rename, including when `from` was
21724
+ * never registered — otherwise it orphans on a key no location carries
21725
+ * any more. A merge keeps the TARGET's icon when it has one: renaming
21726
+ * "Sala" into "Salone" moves devices into Salone, it does not restyle
21727
+ * it. */
21678
21728
  renameLocation: method(external_exports.object({
21679
21729
  from: external_exports.string(),
21680
21730
  to: external_exports.string()
@@ -21682,6 +21732,127 @@ var deviceManagerCapability = {
21682
21732
  kind: "mutation",
21683
21733
  auth: "admin"
21684
21734
  }),
21735
+ /** Every location that carries an ICON, as `(locationKey, icon)` pairs.
21736
+ *
21737
+ * ADDITIVE, deliberately: `listLocations` keeps returning `string[]` —
21738
+ * every consumer of it (the Device Info autocomplete, the HA adoption
21739
+ * import, the recorder) reads a list of labels and none of them wants a
21740
+ * shape change. A surface that wants icons asks for them and joins.
21741
+ *
21742
+ * Only assignments that EXIST are returned — a location with no icon is
21743
+ * absent, not `map-pin`. The fallback belongs to the renderer
21744
+ * (`resolveLocationIcon`), not to the store, so "the operator chose the
21745
+ * pin" and "the operator chose nothing" stay distinguishable.
21746
+ *
21747
+ * The join key is `locationIconKey(label)` (trimmed, lower-cased) — the
21748
+ * same equality the registry uses everywhere. Never the operator's
21749
+ * casing: a case-only rename is a real edit here, and a map keyed on the
21750
+ * displayed spelling would orphan its entry on exactly that edit. */
21751
+ listLocationIcons: method(external_exports.void(), external_exports.array(LocationIconAssignmentSchema)),
21752
+ /** Set (or clear) the icon of a location label. `icon: null` removes the
21753
+ * assignment. The label need NOT be registered — the registry is a
21754
+ * suggestion list and devices carry labels nobody registered — but an
21755
+ * empty / whitespace-only label throws. Idempotent.
21756
+ *
21757
+ * The icon vocabulary is CLOSED (`LOCATION_ICON_IDS`) because the admin UI
21758
+ * and the viewer draw from different icon modules; see
21759
+ * `device/location-icon.ts` for the list and for what a surface that
21760
+ * cannot draw a member must do (fall back to `map-pin`, never a hole). */
21761
+ setLocationIcon: method(external_exports.object({
21762
+ location: external_exports.string(),
21763
+ icon: LocationIconIdSchema.nullable()
21764
+ }), external_exports.void(), {
21765
+ kind: "mutation",
21766
+ auth: "admin"
21767
+ }),
21768
+ /** Every location that carries a DESCRIPTION — what the place LOOKS like,
21769
+ * in plain words, given to the vision model alongside the pictures so it
21770
+ * knows what it is looking at. A driveway of cobbles between a brick wall
21771
+ * and three parking spaces reads very differently from a back garden.
21772
+ *
21773
+ * Same additive shape and same join key as `listLocationIcons`, and that
21774
+ * is the point of it being here at all: this lived in the post-analysis
21775
+ * addon's own settings, keyed by a hand-typed label matched exactly and
21776
+ * case-sensitively, while the icon hung off the location itself. A rename
21777
+ * carried the icon and silently orphaned the description. One location,
21778
+ * one authority, one key.
21779
+ *
21780
+ * Absent means nobody wrote one — the digest then tells the model only the
21781
+ * location NAME, exactly as it did before descriptions existed. */
21782
+ listLocationDescriptions: method(external_exports.void(), external_exports.array(LocationDescriptionAssignmentSchema)),
21783
+ /** Set (or clear) a location's description. `description: null`, or a
21784
+ * blank string, removes it — an empty description and no description are
21785
+ * the same thing to every reader, and storing the first would send an
21786
+ * empty line to the model.
21787
+ *
21788
+ * Like `setLocationIcon`, the label need NOT be registered, and an
21789
+ * empty / whitespace-only LABEL throws. */
21790
+ setLocationDescription: method(external_exports.object({
21791
+ location: external_exports.string(),
21792
+ description: external_exports.string().max(400).nullable()
21793
+ }), external_exports.void(), {
21794
+ kind: "mutation",
21795
+ auth: "admin"
21796
+ }),
21797
+ /** Every SITE ZONE — a named part of the property that groups locations
21798
+ * ("Zona notte" holds the bedrooms). One call answers the whole picture:
21799
+ * key, the label as typed, the icon, and the locations inside.
21800
+ *
21801
+ * Together, because a surface that asked for membership separately could
21802
+ * draw a zone whose rooms it has not fetched — and the strip that renders
21803
+ * these puts zones BEFORE locations, so a half-known zone is the first
21804
+ * thing an operator sees.
21805
+ *
21806
+ * Nothing here touches a device: a camera's zone is derived from its
21807
+ * location, never stored on the row. Grouping rooms must not rewrite the
21808
+ * fleet. */
21809
+ listSiteZones: method(external_exports.void(), external_exports.array(SiteZoneSchema)),
21810
+ /** Create a zone, or set the icon of one that exists. `icon: null` clears
21811
+ * the icon and KEEPS the zone — a zone with no icon is a normal zone, and
21812
+ * conflating "no icon" with "no zone" would delete membership on a
21813
+ * mis-click.
21814
+ *
21815
+ * Idempotent, and the label is stored as typed: the key is folded, so
21816
+ * re-running this with different casing re-labels rather than duplicating. */
21817
+ setSiteZone: method(external_exports.object({
21818
+ name: external_exports.string(),
21819
+ icon: LocationIconIdSchema.nullable().optional()
21820
+ }), external_exports.void(), {
21821
+ kind: "mutation",
21822
+ auth: "admin"
21823
+ }),
21824
+ /** Delete a zone. Its LOCATIONS survive — they simply stop belonging to
21825
+ * anything. Deleting a grouping must never delete what was grouped. */
21826
+ removeSiteZone: method(external_exports.object({ name: external_exports.string() }), external_exports.void(), {
21827
+ kind: "mutation",
21828
+ auth: "admin"
21829
+ }),
21830
+ /** Rename a zone, carrying its icon AND its membership.
21831
+ *
21832
+ * It exists so that renaming is not delete-then-recreate, which would drop
21833
+ * both — the exact orphaning that lost a location's description when the
21834
+ * two hung off different keys. Renaming onto an existing zone MERGES into
21835
+ * it and the target keeps its own icon. */
21836
+ renameSiteZone: method(external_exports.object({
21837
+ from: external_exports.string(),
21838
+ to: external_exports.string()
21839
+ }), external_exports.void(), {
21840
+ kind: "mutation",
21841
+ auth: "admin"
21842
+ }),
21843
+ /** Put a location in a zone, or take it out with `zone: null`.
21844
+ *
21845
+ * At most one zone per location, by construction: this writes one key, so
21846
+ * there is no state in which a room is in two places at once. The zone
21847
+ * need not exist yet — it is created empty-labelled from this call, the
21848
+ * same way `setLocationIcon` does not require a registered location. */
21849
+ setLocationZone: method(external_exports.object({
21850
+ location: external_exports.string(),
21851
+ zone: external_exports.string().nullable()
21852
+ }), external_exports.void(), {
21853
+ kind: "mutation",
21854
+ auth: "admin"
21855
+ }),
21685
21856
  /** Soft-disable / re-enable the device. Drivers consult
21686
21857
  * `BaseDevice.disabled` to gate lifecycle hooks. */
21687
21858
  setDisabled: method(external_exports.object({
@@ -42950,6 +43121,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
42950
43121
  addonId: null,
42951
43122
  access: "view"
42952
43123
  },
43124
+ "deviceManager.listLocationDescriptions": {
43125
+ capName: "device-manager",
43126
+ capScope: "system",
43127
+ addonId: null,
43128
+ access: "view"
43129
+ },
43130
+ "deviceManager.listLocationIcons": {
43131
+ capName: "device-manager",
43132
+ capScope: "system",
43133
+ addonId: null,
43134
+ access: "view"
43135
+ },
42953
43136
  "deviceManager.listLocations": {
42954
43137
  capName: "device-manager",
42955
43138
  capScope: "system",
@@ -42962,6 +43145,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42962
43145
  addonId: null,
42963
43146
  access: "view"
42964
43147
  },
43148
+ "deviceManager.listSiteZones": {
43149
+ capName: "device-manager",
43150
+ capScope: "system",
43151
+ addonId: null,
43152
+ access: "view"
43153
+ },
42965
43154
  "deviceManager.listWrappersForCap": {
42966
43155
  capName: "device-manager",
42967
43156
  capScope: "system",
@@ -43046,12 +43235,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
43046
43235
  addonId: null,
43047
43236
  access: "delete"
43048
43237
  },
43238
+ "deviceManager.removeSiteZone": {
43239
+ capName: "device-manager",
43240
+ capScope: "system",
43241
+ addonId: null,
43242
+ access: "delete"
43243
+ },
43049
43244
  "deviceManager.renameLocation": {
43050
43245
  capName: "device-manager",
43051
43246
  capScope: "system",
43052
43247
  addonId: null,
43053
43248
  access: "create"
43054
43249
  },
43250
+ "deviceManager.renameSiteZone": {
43251
+ capName: "device-manager",
43252
+ capScope: "system",
43253
+ addonId: null,
43254
+ access: "create"
43255
+ },
43055
43256
  "deviceManager.runDeviceAction": {
43056
43257
  capName: "device-manager",
43057
43258
  capScope: "system",
@@ -43094,6 +43295,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
43094
43295
  addonId: null,
43095
43296
  access: "create"
43096
43297
  },
43298
+ "deviceManager.setLocationDescription": {
43299
+ capName: "device-manager",
43300
+ capScope: "system",
43301
+ addonId: null,
43302
+ access: "create"
43303
+ },
43304
+ "deviceManager.setLocationIcon": {
43305
+ capName: "device-manager",
43306
+ capScope: "system",
43307
+ addonId: null,
43308
+ access: "create"
43309
+ },
43310
+ "deviceManager.setLocationZone": {
43311
+ capName: "device-manager",
43312
+ capScope: "system",
43313
+ addonId: null,
43314
+ access: "create"
43315
+ },
43097
43316
  "deviceManager.setMetadata": {
43098
43317
  capName: "device-manager",
43099
43318
  capScope: "system",
@@ -43124,6 +43343,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43124
43343
  addonId: null,
43125
43344
  access: "create"
43126
43345
  },
43346
+ "deviceManager.setSiteZone": {
43347
+ capName: "device-manager",
43348
+ capScope: "system",
43349
+ addonId: null,
43350
+ access: "create"
43351
+ },
43127
43352
  "deviceManager.setStreamProfileMap": {
43128
43353
  capName: "device-manager",
43129
43354
  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-LFAXPGXW.js";
4
+ } from "./chunk-VJIT6AOW.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-MZZ42ZMY.js");
41
+ await import("./launcher-HOXPTYJH.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-MZZ42ZMY.js");
86
+ await import("./launcher-HOXPTYJH.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-AGYCTXAP.js");
1143
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-N63N6OOD.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-LFAXPGXW.js";
8
+ } from "./chunk-VJIT6AOW.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,