@camstack/addon-pipeline 1.2.247 → 1.2.249

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.
Files changed (33) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-pr2NMNpc.mjs → default-detection-model-Bm04eyB4.mjs} +1 -1
  4. package/dist/{default-detection-model-ClJ9y701.js → default-detection-model-DGkkGNxL.js} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-Dzy3wAmT.mjs → dist-CGIdW7g5.mjs} +188 -0
  8. package/dist/{dist-BjiM0e6J.js → dist-DG74yV1a.js} +188 -0
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-D9DBz5HF.mjs → node-C7MbYv9I.mjs} +1 -1
  12. package/dist/{node-P2-C_t7H.js → node-hnHqauG8.js} +1 -1
  13. package/dist/pipeline-runner/index.js +3 -3
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/{process-memory-BMpJ42op.mjs → process-memory-3qXmcKQn.mjs} +1 -1
  16. package/dist/{process-memory-vWz15IrS.js → process-memory-D2e6wNF5.js} +1 -1
  17. package/dist/recorder/index.js +2 -2
  18. package/dist/recorder/index.mjs +2 -2
  19. package/dist/{segment-demux-js-Dd5asWZc.js → segment-demux-js-B5Kg4QOx.js} +1 -1
  20. package/dist/{segment-demux-js-DcF7tvrn.mjs → segment-demux-js-BW5ndPxS.mjs} +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-vEbg16EK.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BQlBhj7w.mjs} +3 -3
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-k114uFcJ.mjs +26 -0
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BHtcf-Mo.mjs +26 -0
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-D1dVvyjN.mjs → hostInit-BqE2ZTEl.mjs} +3 -3
  28. package/dist/stream-broker/index.js +3 -3
  29. package/dist/stream-broker/index.mjs +3 -3
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DVqDp5VD.mjs +0 -26
  33. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CJunbWSo.mjs +0 -26
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-BjiM0e6J.js");
7
- const require_process_memory = require("../process-memory-vWz15IrS.js");
6
+ const require_dist = require("../dist-DG74yV1a.js");
7
+ const require_process_memory = require("../process-memory-D2e6wNF5.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, Jt as audioChunkBytesPerSample, Lt as errMsg, N as audioAnalysisCapability, Ot as resolvePoolMemoryPolicy, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Wt as BaseAddon, bn as EventCategory, n as AUDIO_BACKEND_CHOICES, ot as mapAudioLabelToMacro, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL } from "../dist-Dzy3wAmT.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BMpJ42op.mjs";
2
+ import { $t as hydrateSchema, Jt as audioChunkBytesPerSample, Lt as errMsg, N as audioAnalysisCapability, Ot as resolvePoolMemoryPolicy, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Wt as BaseAddon, bn as EventCategory, n as AUDIO_BACKEND_CHOICES, ot as mapAudioLabelToMacro, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL } from "../dist-CGIdW7g5.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-3qXmcKQn.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, tt as hfModelUrl } from "./dist-Dzy3wAmT.mjs";
1
+ import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, tt as hfModelUrl } from "./dist-CGIdW7g5.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-BjiM0e6J.js");
1
+ const require_dist = require("./dist-DG74yV1a.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-BjiM0e6J.js");
7
- const require_node = require("../node-P2-C_t7H.js");
8
- const require_default_detection_model = require("../default-detection-model-ClJ9y701.js");
6
+ const require_dist = require("../dist-DG74yV1a.js");
7
+ const require_node = require("../node-hnHqauG8.js");
8
+ const require_default_detection_model = require("../default-detection-model-DGkkGNxL.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-vWz15IrS.js");
10
+ const require_process_memory = require("../process-memory-D2e6wNF5.js");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_chunk.__toESM(node_os);
13
13
  let node_fs = require("node:fs");
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, At as runtimeDevices$1, Ft as supportedRuntimes$1, G as detectionPipelineCapability, J as enumerateInferenceDevices, Lt as errMsg, Ot as resolvePoolMemoryPolicy, Tt as resolveClusterStepModelId, V as defaultDeviceFor$1, Wt as BaseAddon, X as evaluateZoneRules, Yt as createEvent, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, gt as pickClusterStepSettings, hn as object, ht as pickClusterStepModels, in as parseJsonUnknown, it as loadContributionCapability, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, nt as inferModelProvider, pt as overlayClusterStepSettings, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, w as PoolMemoryWatchdog, yn as union, yt as pipelineExecutorCapability } from "../dist-Dzy3wAmT.mjs";
3
- import { o as readProcessCost } from "../node-D9DBz5HF.mjs";
4
- import { a as localFrameRegistry, c as ALL_STEPS, d as getStepDefinition, f as resolveModelForFormat, l as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as landmarkPrecisionVerdict, r as macroGateVerdict, s as ALL_PIPELINE_STEPS, u as getStep } from "../default-detection-model-pr2NMNpc.mjs";
2
+ import { $t as hydrateSchema, At as runtimeDevices$1, Ft as supportedRuntimes$1, G as detectionPipelineCapability, J as enumerateInferenceDevices, Lt as errMsg, Ot as resolvePoolMemoryPolicy, Tt as resolveClusterStepModelId, V as defaultDeviceFor$1, Wt as BaseAddon, X as evaluateZoneRules, Yt as createEvent, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, gt as pickClusterStepSettings, hn as object, ht as pickClusterStepModels, in as parseJsonUnknown, it as loadContributionCapability, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, nt as inferModelProvider, pt as overlayClusterStepSettings, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, w as PoolMemoryWatchdog, yn as union, yt as pipelineExecutorCapability } from "../dist-CGIdW7g5.mjs";
3
+ import { o as readProcessCost } from "../node-C7MbYv9I.mjs";
4
+ import { a as localFrameRegistry, c as ALL_STEPS, d as getStepDefinition, f as resolveModelForFormat, l as getDefaultModelForFormat, n as resolveDefaultDetectionModel, p as landmarkPrecisionVerdict, r as macroGateVerdict, s as ALL_PIPELINE_STEPS, u as getStep } from "../default-detection-model-Bm04eyB4.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BMpJ42op.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-3qXmcKQn.mjs";
7
7
  import * as os from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -15524,6 +15524,107 @@ var ExposeInputSchema = object({
15524
15524
  });
15525
15525
  var UnexposeInputSchema = object({ deviceId: string() });
15526
15526
  method(_void(), DeviceExportStatusSchema), method(_void(), array(DeviceKindSchema)), method(_void(), array(ExposedDeviceSchema)), method(ExposeInputSchema, _void(), { kind: "mutation" }), method(UnexposeInputSchema, _void(), { kind: "mutation" });
15527
+ /** Wire/storage schema for one icon id. */
15528
+ var LocationIconIdSchema = _enum([
15529
+ "map-pin",
15530
+ "house",
15531
+ "door-open",
15532
+ "sofa",
15533
+ "utensils",
15534
+ "bed-double",
15535
+ "bath",
15536
+ "briefcase",
15537
+ "car",
15538
+ "circle-parking",
15539
+ "route",
15540
+ "trees",
15541
+ "umbrella",
15542
+ "waves-ladder",
15543
+ "fence",
15544
+ "package",
15545
+ "warehouse",
15546
+ "store",
15547
+ "sun",
15548
+ "radar"
15549
+ ]);
15550
+ /**
15551
+ * One (location, icon) assignment as it travels.
15552
+ *
15553
+ * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
15554
+ * operator's casing. The registry matches labels trimmed + case-insensitively
15555
+ * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
15556
+ * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
15557
+ * map keyed on the displayed casing would orphan its entry on exactly that
15558
+ * edit. Consumers join by keying their own label through `locationIconKey`.
15559
+ */
15560
+ var LocationIconAssignmentSchema = object({
15561
+ locationKey: string(),
15562
+ icon: LocationIconIdSchema
15563
+ });
15564
+ /**
15565
+ * One (location, description) assignment as it travels.
15566
+ *
15567
+ * Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
15568
+ * reason: this lived for a while in the post-analysis addon's own settings,
15569
+ * keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
15570
+ * the Locations page carried the icon and silently orphaned the description —
15571
+ * two authorities for one thing, joined by two different rules. Now both hang
15572
+ * off the location itself, on `locationIconKey`.
15573
+ */
15574
+ var LocationDescriptionAssignmentSchema = object({
15575
+ locationKey: string(),
15576
+ description: string()
15577
+ });
15578
+ /**
15579
+ * A SITE ZONE — a named part of the property that several locations belong to.
15580
+ *
15581
+ * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
15582
+ * kitchen. A camera belongs to exactly one location, and a location to at most
15583
+ * one zone, so a camera's zone is derived and never stored on the device: the
15584
+ * whole point of this entity is that grouping rooms touches no device row.
15585
+ *
15586
+ * ## Why not `zone`
15587
+ *
15588
+ * Because `zone` is already the most loaded word in this product: 612 source
15589
+ * files and 24 Italian strings where it means a DETECTION zone drawn on a
15590
+ * camera. The two are unrelated — one is a polygon in a frame, the other is a
15591
+ * set of rooms — and a reader who confuses them will look for a camera's
15592
+ * bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
15593
+ * word by calling the drawn one what it actually is: a detection zone.
15594
+ *
15595
+ * ## The key
15596
+ *
15597
+ * `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
15598
+ * use (`locationIconKey`). Membership and the icon both hang off it, so a
15599
+ * case-only rename keeps them, which is exactly the orphaning that cost us a
15600
+ * silently-dropped location description.
15601
+ *
15602
+ * The icon vocabulary is the location one, unchanged: a zone is drawn on the
15603
+ * same two surfaces by the same glyph map, so a second vocabulary would be a
15604
+ * second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
15605
+ */
15606
+ /**
15607
+ * One zone as it travels: its key, the label the operator typed, its icon and
15608
+ * the locations inside it.
15609
+ *
15610
+ * The LABEL is carried alongside the key because the key is lossy on purpose —
15611
+ * a surface must show "Zona notte", not "zona notte". Locations are carried
15612
+ * here, rather than left to a second call, because every consumer wants both
15613
+ * at once and a viewer that asked twice could render a zone whose membership
15614
+ * it has not fetched yet.
15615
+ *
15616
+ * `icon: null` means nobody chose one, which is NOT the fallback pin: only one
15617
+ * of those two is a choice, and a picker has to draw them differently.
15618
+ */
15619
+ var SiteZoneSchema = object({
15620
+ zoneKey: string(),
15621
+ label: string(),
15622
+ icon: LocationIconIdSchema.nullable(),
15623
+ /** Folded location keys, sorted. A location listed here need not be
15624
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
15625
+ * the ones that most want grouping. */
15626
+ locationKeys: array(string())
15627
+ });
15527
15628
  var ProviderStatusSchema = object({
15528
15629
  connected: boolean(),
15529
15630
  deviceCount: number(),
@@ -16035,6 +16136,39 @@ method(object({
16035
16136
  }), object({ moved: number() }), {
16036
16137
  kind: "mutation",
16037
16138
  auth: "admin"
16139
+ }), method(_void(), array(LocationIconAssignmentSchema)), method(object({
16140
+ location: string(),
16141
+ icon: LocationIconIdSchema.nullable()
16142
+ }), _void(), {
16143
+ kind: "mutation",
16144
+ auth: "admin"
16145
+ }), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
16146
+ location: string(),
16147
+ description: string().max(400).nullable()
16148
+ }), _void(), {
16149
+ kind: "mutation",
16150
+ auth: "admin"
16151
+ }), method(_void(), array(SiteZoneSchema)), method(object({
16152
+ name: string(),
16153
+ icon: LocationIconIdSchema.nullable().optional()
16154
+ }), _void(), {
16155
+ kind: "mutation",
16156
+ auth: "admin"
16157
+ }), method(object({ name: string() }), _void(), {
16158
+ kind: "mutation",
16159
+ auth: "admin"
16160
+ }), method(object({
16161
+ from: string(),
16162
+ to: string()
16163
+ }), _void(), {
16164
+ kind: "mutation",
16165
+ auth: "admin"
16166
+ }), method(object({
16167
+ location: string(),
16168
+ zone: string().nullable()
16169
+ }), _void(), {
16170
+ kind: "mutation",
16171
+ auth: "admin"
16038
16172
  }), method(object({
16039
16173
  deviceId: number(),
16040
16174
  disabled: boolean()
@@ -36259,6 +36393,18 @@ Object.freeze({
36259
36393
  addonId: null,
36260
36394
  access: "view"
36261
36395
  },
36396
+ "deviceManager.listLocationDescriptions": {
36397
+ capName: "device-manager",
36398
+ capScope: "system",
36399
+ addonId: null,
36400
+ access: "view"
36401
+ },
36402
+ "deviceManager.listLocationIcons": {
36403
+ capName: "device-manager",
36404
+ capScope: "system",
36405
+ addonId: null,
36406
+ access: "view"
36407
+ },
36262
36408
  "deviceManager.listLocations": {
36263
36409
  capName: "device-manager",
36264
36410
  capScope: "system",
@@ -36271,6 +36417,12 @@ Object.freeze({
36271
36417
  addonId: null,
36272
36418
  access: "view"
36273
36419
  },
36420
+ "deviceManager.listSiteZones": {
36421
+ capName: "device-manager",
36422
+ capScope: "system",
36423
+ addonId: null,
36424
+ access: "view"
36425
+ },
36274
36426
  "deviceManager.listWrappersForCap": {
36275
36427
  capName: "device-manager",
36276
36428
  capScope: "system",
@@ -36355,12 +36507,24 @@ Object.freeze({
36355
36507
  addonId: null,
36356
36508
  access: "delete"
36357
36509
  },
36510
+ "deviceManager.removeSiteZone": {
36511
+ capName: "device-manager",
36512
+ capScope: "system",
36513
+ addonId: null,
36514
+ access: "delete"
36515
+ },
36358
36516
  "deviceManager.renameLocation": {
36359
36517
  capName: "device-manager",
36360
36518
  capScope: "system",
36361
36519
  addonId: null,
36362
36520
  access: "create"
36363
36521
  },
36522
+ "deviceManager.renameSiteZone": {
36523
+ capName: "device-manager",
36524
+ capScope: "system",
36525
+ addonId: null,
36526
+ access: "create"
36527
+ },
36364
36528
  "deviceManager.runDeviceAction": {
36365
36529
  capName: "device-manager",
36366
36530
  capScope: "system",
@@ -36403,6 +36567,24 @@ Object.freeze({
36403
36567
  addonId: null,
36404
36568
  access: "create"
36405
36569
  },
36570
+ "deviceManager.setLocationDescription": {
36571
+ capName: "device-manager",
36572
+ capScope: "system",
36573
+ addonId: null,
36574
+ access: "create"
36575
+ },
36576
+ "deviceManager.setLocationIcon": {
36577
+ capName: "device-manager",
36578
+ capScope: "system",
36579
+ addonId: null,
36580
+ access: "create"
36581
+ },
36582
+ "deviceManager.setLocationZone": {
36583
+ capName: "device-manager",
36584
+ capScope: "system",
36585
+ addonId: null,
36586
+ access: "create"
36587
+ },
36406
36588
  "deviceManager.setMetadata": {
36407
36589
  capName: "device-manager",
36408
36590
  capScope: "system",
@@ -36433,6 +36615,12 @@ Object.freeze({
36433
36615
  addonId: null,
36434
36616
  access: "create"
36435
36617
  },
36618
+ "deviceManager.setSiteZone": {
36619
+ capName: "device-manager",
36620
+ capScope: "system",
36621
+ addonId: null,
36622
+ access: "create"
36623
+ },
36436
36624
  "deviceManager.setStreamProfileMap": {
36437
36625
  capName: "device-manager",
36438
36626
  capScope: "system",
@@ -15524,6 +15524,107 @@ var ExposeInputSchema = object({
15524
15524
  });
15525
15525
  var UnexposeInputSchema = object({ deviceId: string() });
15526
15526
  method(_void(), DeviceExportStatusSchema), method(_void(), array(DeviceKindSchema)), method(_void(), array(ExposedDeviceSchema)), method(ExposeInputSchema, _void(), { kind: "mutation" }), method(UnexposeInputSchema, _void(), { kind: "mutation" });
15527
+ /** Wire/storage schema for one icon id. */
15528
+ var LocationIconIdSchema = _enum([
15529
+ "map-pin",
15530
+ "house",
15531
+ "door-open",
15532
+ "sofa",
15533
+ "utensils",
15534
+ "bed-double",
15535
+ "bath",
15536
+ "briefcase",
15537
+ "car",
15538
+ "circle-parking",
15539
+ "route",
15540
+ "trees",
15541
+ "umbrella",
15542
+ "waves-ladder",
15543
+ "fence",
15544
+ "package",
15545
+ "warehouse",
15546
+ "store",
15547
+ "sun",
15548
+ "radar"
15549
+ ]);
15550
+ /**
15551
+ * One (location, icon) assignment as it travels.
15552
+ *
15553
+ * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
15554
+ * operator's casing. The registry matches labels trimmed + case-insensitively
15555
+ * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
15556
+ * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
15557
+ * map keyed on the displayed casing would orphan its entry on exactly that
15558
+ * edit. Consumers join by keying their own label through `locationIconKey`.
15559
+ */
15560
+ var LocationIconAssignmentSchema = object({
15561
+ locationKey: string(),
15562
+ icon: LocationIconIdSchema
15563
+ });
15564
+ /**
15565
+ * One (location, description) assignment as it travels.
15566
+ *
15567
+ * Same key discipline as {@link LocationIconAssignmentSchema}, and for the same
15568
+ * reason: this lived for a while in the post-analysis addon's own settings,
15569
+ * keyed by a HAND-TYPED label matched exactly and case-sensitively. A rename in
15570
+ * the Locations page carried the icon and silently orphaned the description —
15571
+ * two authorities for one thing, joined by two different rules. Now both hang
15572
+ * off the location itself, on `locationIconKey`.
15573
+ */
15574
+ var LocationDescriptionAssignmentSchema = object({
15575
+ locationKey: string(),
15576
+ description: string()
15577
+ });
15578
+ /**
15579
+ * A SITE ZONE — a named part of the property that several locations belong to.
15580
+ *
15581
+ * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
15582
+ * kitchen. A camera belongs to exactly one location, and a location to at most
15583
+ * one zone, so a camera's zone is derived and never stored on the device: the
15584
+ * whole point of this entity is that grouping rooms touches no device row.
15585
+ *
15586
+ * ## Why not `zone`
15587
+ *
15588
+ * Because `zone` is already the most loaded word in this product: 612 source
15589
+ * files and 24 Italian strings where it means a DETECTION zone drawn on a
15590
+ * camera. The two are unrelated — one is a polygon in a frame, the other is a
15591
+ * set of rooms — and a reader who confuses them will look for a camera's
15592
+ * bedrooms. So the code says `siteZone` everywhere, and the UI frees the plain
15593
+ * word by calling the drawn one what it actually is: a detection zone.
15594
+ *
15595
+ * ## The key
15596
+ *
15597
+ * `siteZoneKey(label)` — trimmed, lower-cased, the SAME derivation locations
15598
+ * use (`locationIconKey`). Membership and the icon both hang off it, so a
15599
+ * case-only rename keeps them, which is exactly the orphaning that cost us a
15600
+ * silently-dropped location description.
15601
+ *
15602
+ * The icon vocabulary is the location one, unchanged: a zone is drawn on the
15603
+ * same two surfaces by the same glyph map, so a second vocabulary would be a
15604
+ * second thing to keep drawable (`scripts/check-location-icons-drawable.ts`).
15605
+ */
15606
+ /**
15607
+ * One zone as it travels: its key, the label the operator typed, its icon and
15608
+ * the locations inside it.
15609
+ *
15610
+ * The LABEL is carried alongside the key because the key is lossy on purpose —
15611
+ * a surface must show "Zona notte", not "zona notte". Locations are carried
15612
+ * here, rather than left to a second call, because every consumer wants both
15613
+ * at once and a viewer that asked twice could render a zone whose membership
15614
+ * it has not fetched yet.
15615
+ *
15616
+ * `icon: null` means nobody chose one, which is NOT the fallback pin: only one
15617
+ * of those two is a choice, and a picker has to draw them differently.
15618
+ */
15619
+ var SiteZoneSchema = object({
15620
+ zoneKey: string(),
15621
+ label: string(),
15622
+ icon: LocationIconIdSchema.nullable(),
15623
+ /** Folded location keys, sorted. A location listed here need not be
15624
+ * REGISTERED — devices carry labels nobody registered, and those rooms are
15625
+ * the ones that most want grouping. */
15626
+ locationKeys: array(string())
15627
+ });
15527
15628
  var ProviderStatusSchema = object({
15528
15629
  connected: boolean(),
15529
15630
  deviceCount: number(),
@@ -16035,6 +16136,39 @@ method(object({
16035
16136
  }), object({ moved: number() }), {
16036
16137
  kind: "mutation",
16037
16138
  auth: "admin"
16139
+ }), method(_void(), array(LocationIconAssignmentSchema)), method(object({
16140
+ location: string(),
16141
+ icon: LocationIconIdSchema.nullable()
16142
+ }), _void(), {
16143
+ kind: "mutation",
16144
+ auth: "admin"
16145
+ }), method(_void(), array(LocationDescriptionAssignmentSchema)), method(object({
16146
+ location: string(),
16147
+ description: string().max(400).nullable()
16148
+ }), _void(), {
16149
+ kind: "mutation",
16150
+ auth: "admin"
16151
+ }), method(_void(), array(SiteZoneSchema)), method(object({
16152
+ name: string(),
16153
+ icon: LocationIconIdSchema.nullable().optional()
16154
+ }), _void(), {
16155
+ kind: "mutation",
16156
+ auth: "admin"
16157
+ }), method(object({ name: string() }), _void(), {
16158
+ kind: "mutation",
16159
+ auth: "admin"
16160
+ }), method(object({
16161
+ from: string(),
16162
+ to: string()
16163
+ }), _void(), {
16164
+ kind: "mutation",
16165
+ auth: "admin"
16166
+ }), method(object({
16167
+ location: string(),
16168
+ zone: string().nullable()
16169
+ }), _void(), {
16170
+ kind: "mutation",
16171
+ auth: "admin"
16038
16172
  }), method(object({
16039
16173
  deviceId: number(),
16040
16174
  disabled: boolean()
@@ -36259,6 +36393,18 @@ Object.freeze({
36259
36393
  addonId: null,
36260
36394
  access: "view"
36261
36395
  },
36396
+ "deviceManager.listLocationDescriptions": {
36397
+ capName: "device-manager",
36398
+ capScope: "system",
36399
+ addonId: null,
36400
+ access: "view"
36401
+ },
36402
+ "deviceManager.listLocationIcons": {
36403
+ capName: "device-manager",
36404
+ capScope: "system",
36405
+ addonId: null,
36406
+ access: "view"
36407
+ },
36262
36408
  "deviceManager.listLocations": {
36263
36409
  capName: "device-manager",
36264
36410
  capScope: "system",
@@ -36271,6 +36417,12 @@ Object.freeze({
36271
36417
  addonId: null,
36272
36418
  access: "view"
36273
36419
  },
36420
+ "deviceManager.listSiteZones": {
36421
+ capName: "device-manager",
36422
+ capScope: "system",
36423
+ addonId: null,
36424
+ access: "view"
36425
+ },
36274
36426
  "deviceManager.listWrappersForCap": {
36275
36427
  capName: "device-manager",
36276
36428
  capScope: "system",
@@ -36355,12 +36507,24 @@ Object.freeze({
36355
36507
  addonId: null,
36356
36508
  access: "delete"
36357
36509
  },
36510
+ "deviceManager.removeSiteZone": {
36511
+ capName: "device-manager",
36512
+ capScope: "system",
36513
+ addonId: null,
36514
+ access: "delete"
36515
+ },
36358
36516
  "deviceManager.renameLocation": {
36359
36517
  capName: "device-manager",
36360
36518
  capScope: "system",
36361
36519
  addonId: null,
36362
36520
  access: "create"
36363
36521
  },
36522
+ "deviceManager.renameSiteZone": {
36523
+ capName: "device-manager",
36524
+ capScope: "system",
36525
+ addonId: null,
36526
+ access: "create"
36527
+ },
36364
36528
  "deviceManager.runDeviceAction": {
36365
36529
  capName: "device-manager",
36366
36530
  capScope: "system",
@@ -36403,6 +36567,24 @@ Object.freeze({
36403
36567
  addonId: null,
36404
36568
  access: "create"
36405
36569
  },
36570
+ "deviceManager.setLocationDescription": {
36571
+ capName: "device-manager",
36572
+ capScope: "system",
36573
+ addonId: null,
36574
+ access: "create"
36575
+ },
36576
+ "deviceManager.setLocationIcon": {
36577
+ capName: "device-manager",
36578
+ capScope: "system",
36579
+ addonId: null,
36580
+ access: "create"
36581
+ },
36582
+ "deviceManager.setLocationZone": {
36583
+ capName: "device-manager",
36584
+ capScope: "system",
36585
+ addonId: null,
36586
+ access: "create"
36587
+ },
36406
36588
  "deviceManager.setMetadata": {
36407
36589
  capName: "device-manager",
36408
36590
  capScope: "system",
@@ -36433,6 +36615,12 @@ Object.freeze({
36433
36615
  addonId: null,
36434
36616
  access: "create"
36435
36617
  },
36618
+ "deviceManager.setSiteZone": {
36619
+ capName: "device-manager",
36620
+ capScope: "system",
36621
+ addonId: null,
36622
+ access: "create"
36623
+ },
36436
36624
  "deviceManager.setStreamProfileMap": {
36437
36625
  capName: "device-manager",
36438
36626
  capScope: "system",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-BjiM0e6J.js");
5
+ const require_dist = require("../dist-DG74yV1a.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-Dzy3wAmT.mjs";
1
+ import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-CGIdW7g5.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-Dzy3wAmT.mjs";
1
+ import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-CGIdW7g5.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-BjiM0e6J.js");
2
+ const require_dist = require("./dist-DG74yV1a.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-BjiM0e6J.js");
7
- const require_node = require("../node-P2-C_t7H.js");
8
- const require_default_detection_model = require("../default-detection-model-ClJ9y701.js");
6
+ const require_dist = require("../dist-DG74yV1a.js");
7
+ const require_node = require("../node-hnHqauG8.js");
8
+ const require_default_detection_model = require("../default-detection-model-DGkkGNxL.js");
9
9
  const require_worker_protocol = require("../worker-protocol-B2MfQLlu.js");
10
10
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
11
11
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
@@ -1,6 +1,6 @@
1
- import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-Dzy3wAmT.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-D9DBz5HF.mjs";
3
- import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-pr2NMNpc.mjs";
1
+ import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-CGIdW7g5.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-C7MbYv9I.mjs";
3
+ import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-Bm04eyB4.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-C_W-P_g-.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
@@ -1,4 +1,4 @@
1
- import { mt as parseProcStatus } from "./dist-Dzy3wAmT.mjs";
1
+ import { mt as parseProcStatus } from "./dist-CGIdW7g5.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-BjiM0e6J.js");
2
+ const require_dist = require("./dist-DG74yV1a.js");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_chunk.__toESM(node_fs);
5
5
  let node_child_process = require("node:child_process");
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-BjiM0e6J.js");
7
- const require_node = require("../node-P2-C_t7H.js");
6
+ const require_dist = require("../dist-DG74yV1a.js");
7
+ const require_node = require("../node-hnHqauG8.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
9
  const require_restream_intent = require("../restream-intent-C4adO0P8.js");
10
10
  const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
@@ -1,5 +1,5 @@
1
- import { $t as hydrateSchema, C as OpsLogEntrySchema, Ct as recordingExportCapability, D as RECORDING_EXPORT_MAX_READ_BYTES, Dt as resolveLocationMode, H as deriveBatteryPresence, I as batteryCapability, Kt as DeviceFeature, Lt as errMsg, Mt as storageOccupancyCapability, O as RecordingConfigSchema, Pt as stripRetiredBandPreBufferSec, Q as evictionPolicyOfLocation, St as recordingCapability, W as deriveRecordingMode, Wt as BaseAddon, Xt as customAction, Y as evaluateSensorEdge, Z as evictionPolicyForMode, Zt as defineCustomActions, _n as record, bn as EventCategory, cn as _enum, ct as mayReadLocation, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, dt as modeMayWrite, et as gbToBytes, g as ExportRecordSchema, gn as preprocess, hn as object, i as BatteryStatusSchema, it as loadContributionCapability, jt as storageEvictableCapability, k as RecordingSignalStatusSchema, kt as resolveRecordingProfiles, ln as array, lt as mayWriteToLocation, mn as number, on as selectAssignedProfileSlots, qt as DeviceType, rn as nodePin, rt as isFirstLevelMacroClass, sn as sleep$1, un as boolean, ut as migrateLegacyDeviceSignalConfig, vn as string, wt as recordingSignalCapability } from "../dist-Dzy3wAmT.mjs";
2
- import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-D9DBz5HF.mjs";
1
+ import { $t as hydrateSchema, C as OpsLogEntrySchema, Ct as recordingExportCapability, D as RECORDING_EXPORT_MAX_READ_BYTES, Dt as resolveLocationMode, H as deriveBatteryPresence, I as batteryCapability, Kt as DeviceFeature, Lt as errMsg, Mt as storageOccupancyCapability, O as RecordingConfigSchema, Pt as stripRetiredBandPreBufferSec, Q as evictionPolicyOfLocation, St as recordingCapability, W as deriveRecordingMode, Wt as BaseAddon, Xt as customAction, Y as evaluateSensorEdge, Z as evictionPolicyForMode, Zt as defineCustomActions, _n as record, bn as EventCategory, cn as _enum, ct as mayReadLocation, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, dt as modeMayWrite, et as gbToBytes, g as ExportRecordSchema, gn as preprocess, hn as object, i as BatteryStatusSchema, it as loadContributionCapability, jt as storageEvictableCapability, k as RecordingSignalStatusSchema, kt as resolveRecordingProfiles, ln as array, lt as mayWriteToLocation, mn as number, on as selectAssignedProfileSlots, qt as DeviceType, rn as nodePin, rt as isFirstLevelMacroClass, sn as sleep$1, un as boolean, ut as migrateLegacyDeviceSignalConfig, vn as string, wt as recordingSignalCapability } from "../dist-CGIdW7g5.mjs";
2
+ import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-C7MbYv9I.mjs";
3
3
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
4
4
  import { c as PREBUFFER_MAX_MS, r as RECORDING_PRE_ROLL_REQUEST_MS, s as withRecordingIntent } from "../restream-intent-MeJhGCK9.mjs";
5
5
  import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-BjiM0e6J.js");
2
+ const require_dist = require("./dist-DG74yV1a.js");
3
3
  let node_child_process = require("node:child_process");
4
4
  //#region ../../node_modules/mp4box/dist/mp4box.all.js
5
5
  var require_mp4box_all = /* @__PURE__ */ require_chunk.__commonJSMin(((exports) => {