camstack 1.2.101 → 1.2.103

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.
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-DyO7xSEt.js
23637
- var require_dist_DyO7xSEt = __commonJS({
23638
- "../system/dist/dist-DyO7xSEt.js"(exports) {
23636
+ // ../system/dist/dist-C7g13BfN.js
23637
+ var require_dist_C7g13BfN = __commonJS({
23638
+ "../system/dist/dist-C7g13BfN.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -23719,6 +23719,7 @@ var require_dist_DyO7xSEt = __commonJS({
23719
23719
  EventCategory2["DeviceStateChanged"] = "device.state-changed";
23720
23720
  EventCategory2["ZoneAnalyticsOccupancyChanged"] = "zone-analytics.occupancy-changed";
23721
23721
  EventCategory2["BatteryOnStatusChanged"] = "battery.onStatusChanged";
23722
+ EventCategory2["NetworkLinkOnStatusChanged"] = "network-link.onStatusChanged";
23722
23723
  EventCategory2["BatteryOnWakeStarted"] = "battery.onWakeStarted";
23723
23724
  EventCategory2["DoorbellOnPressed"] = "doorbell.onPressed";
23724
23725
  EventCategory2["EventEmitted"] = "event-emitter.event";
@@ -42710,6 +42711,83 @@ var require_dist_DyO7xSEt = __commonJS({
42710
42711
  * whether persisting is worth a SQLite commit. */
42711
42712
  volatileStateFields: ["lastUpdated"]
42712
42713
  };
42714
+ var NetworkLinkStatusSchema = zod.z.object({
42715
+ /** The link the device is on. `'unknown'` = not read yet, not "no link". */
42716
+ type: zod.z.enum([
42717
+ "wifi",
42718
+ "ethernet",
42719
+ "cellular",
42720
+ "unknown"
42721
+ ]),
42722
+ /**
42723
+ * Link quality, 0..100 inclusive, normalised by the provider from whatever
42724
+ * the firmware reports (bars, RSSI, a vendor scale). **`null` means NOT
42725
+ * KNOWN or NOT APPLICABLE** — a wired link has no signal, and a wireless
42726
+ * one whose reading has not landed must not be drawn at 0 %. Consumers
42727
+ * SKIP a null rather than coerce it.
42728
+ */
42729
+ signalPercent: zod.z.number().min(0).max(100).nullable(),
42730
+ /** Raw received signal strength in dBm, when the firmware reports one. */
42731
+ rssiDbm: zod.z.number().optional(),
42732
+ /** Network name of a wireless link, when the firmware reports it. */
42733
+ ssid: zod.z.string().optional(),
42734
+ /** Ms epoch of the last observation. Lets consumers reason about freshness. */
42735
+ lastUpdated: zod.z.number()
42736
+ });
42737
+ var networkLinkCapability = {
42738
+ name: "network-link",
42739
+ scope: "device",
42740
+ deviceNative: true,
42741
+ mode: "singleton",
42742
+ deviceTypes: [
42743
+ DeviceType.Camera,
42744
+ DeviceType.Sensor,
42745
+ DeviceType.Button,
42746
+ DeviceType.Switch,
42747
+ DeviceType.Light,
42748
+ DeviceType.Lock,
42749
+ DeviceType.Siren
42750
+ ],
42751
+ methods: {},
42752
+ events: {
42753
+ /**
42754
+ * Emitted whenever the cached status changes (a link switch, a signal
42755
+ * reading that moved). Mirrored on the parent chain by the
42756
+ * DeviceEventPropagator like `battery.onStatusChanged`.
42757
+ */
42758
+ onStatusChanged: { data: zod.z.object({
42759
+ deviceId: zod.z.number(),
42760
+ status: NetworkLinkStatusSchema
42761
+ }) }
42762
+ },
42763
+ status: {
42764
+ schema: NetworkLinkStatusSchema,
42765
+ kind: "push",
42766
+ empty: {
42767
+ type: "unknown",
42768
+ signalPercent: null,
42769
+ lastUpdated: 0
42770
+ }
42771
+ },
42772
+ /**
42773
+ * Runtime-state slice — every provider stores the same shape under
42774
+ * `device.runtimeState['network-link']`, read once by the badge and the
42775
+ * Home Assistant projector regardless of the driver.
42776
+ */
42777
+ runtimeState: NetworkLinkStatusSchema,
42778
+ /**
42779
+ * Runtime-state durability: **restored** — a link reading is slow to
42780
+ * change and a sleeping battery camera may not report for hours; the
42781
+ * restored slice is what the badge shows until the next read.
42782
+ *
42783
+ * See `RuntimeStateDurability`. Enforced by
42784
+ * `scripts/check-runtime-state-durability.ts`.
42785
+ */
42786
+ durability: "restored",
42787
+ /** Clock fields: written, but excluded from the compare that decides
42788
+ * whether persisting is worth a SQLite commit. */
42789
+ volatileStateFields: ["lastUpdated"]
42790
+ };
42713
42791
  var BinaryStatusSchema = zod.z.object({
42714
42792
  on: zod.z.boolean(),
42715
42793
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -47415,6 +47493,169 @@ var require_dist_DyO7xSEt = __commonJS({
47415
47493
  */
47416
47494
  durability: "session"
47417
47495
  };
47496
+ var NavigationMoveCommandSchema = zod.z.object({
47497
+ pan: zod.z.number().min(-1).max(1).optional(),
47498
+ tilt: zod.z.number().min(-1).max(1).optional(),
47499
+ speed: zod.z.number().min(0).max(1).optional()
47500
+ });
47501
+ var NavigationActionIdSchema = zod.z.enum([
47502
+ "goHome",
47503
+ "locate",
47504
+ "spotClean",
47505
+ "findPet",
47506
+ "personFollow",
47507
+ "stop",
47508
+ "startClean",
47509
+ "pauseClean",
47510
+ "dockWash",
47511
+ "autoEmpty",
47512
+ "flashOn",
47513
+ "flashOff"
47514
+ ]);
47515
+ var NavigationEntryKindSchema = zod.z.enum(["action", "sound"]);
47516
+ var NavigationActionEntrySchema = zod.z.object({
47517
+ id: zod.z.string(),
47518
+ kind: NavigationEntryKindSchema,
47519
+ label: zod.z.string(),
47520
+ icon: zod.z.string(),
47521
+ /** Present only on `kind:'sound'` entries — the id to pass to `playSound`. */
47522
+ soundId: zod.z.number().int().optional(),
47523
+ /** Per-device feature flag — render this entry only when true. */
47524
+ enabled: zod.z.boolean()
47525
+ });
47526
+ var NavigationPointSchema = zod.z.object({
47527
+ x: zod.z.number(),
47528
+ y: zod.z.number()
47529
+ });
47530
+ var NavigationFeaturesSchema = zod.z.object({
47531
+ move: zod.z.boolean(),
47532
+ stop: zod.z.boolean(),
47533
+ goToPoint: zod.z.boolean(),
47534
+ runAction: zod.z.boolean(),
47535
+ playSound: zod.z.boolean(),
47536
+ light: zod.z.boolean(),
47537
+ lightMode: zod.z.boolean()
47538
+ });
47539
+ var NavigationLightModeSchema = zod.z.enum(["auto", "manual"]);
47540
+ var NavigationModeSchema = zod.z.enum([
47541
+ "idle",
47542
+ "cleaning",
47543
+ "spot",
47544
+ "following",
47545
+ "goto",
47546
+ "returning",
47547
+ "paused",
47548
+ "unknown"
47549
+ ]);
47550
+ var NavigationStatusSchema = zod.z.object({
47551
+ mode: NavigationModeSchema,
47552
+ following: zod.z.boolean(),
47553
+ flash: zod.z.boolean(),
47554
+ lightMode: NavigationLightModeSchema,
47555
+ lightLevel: zod.z.number().min(40).max(100),
47556
+ /** Ms epoch when the slice was last updated. */
47557
+ lastChangedAt: zod.z.number()
47558
+ });
47559
+ var NavigationRuntimeStateSchema = NavigationStatusSchema.extend({ lastFetchedAt: zod.z.number() });
47560
+ var navigationCapability = {
47561
+ name: "navigation",
47562
+ scope: "device",
47563
+ deviceNative: true,
47564
+ mode: "singleton",
47565
+ deviceTypes: [DeviceType.Camera],
47566
+ deviceConfig: { ui: {
47567
+ kind: "widget",
47568
+ widgetId: "host/navigation-panel",
47569
+ tab: "navigation",
47570
+ topTab: true,
47571
+ label: "Navigation",
47572
+ order: 0
47573
+ } },
47574
+ methods: {
47575
+ /**
47576
+ * Momentary drive nudge (the robot moves). `protected` — mirrors
47577
+ * `ptz.continuousMove` so the Viewer navigation panel (and the PTZ-mimic
47578
+ * path) works for any authenticated user, not admin-only. The UI sends
47579
+ * these at ~1 Hz while a control is held; the provider forwards each one to
47580
+ * a single drive write WITHOUT debouncing.
47581
+ */
47582
+ move: method(NavigationMoveCommandSchema.extend({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
47583
+ /** Halt all motion immediately (zero drive vector). */
47584
+ stop: method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
47585
+ /** Send the robot to a point on its live map. */
47586
+ goToPoint: method(NavigationPointSchema.extend({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
47587
+ /**
47588
+ * Enumerate the discrete controls THIS device supports (data-driven UI +
47589
+ * PTZ mimic). Camera-probed subset of {@link NAVIGATION_ACTION_CATALOG}.
47590
+ */
47591
+ listActions: method(zod.z.object({ deviceId: zod.z.number() }), zod.z.array(NavigationActionEntrySchema)),
47592
+ /**
47593
+ * Run one discrete action (a `kind:'action'` dictionary entry). Invalid /
47594
+ * unsupported action ids are rejected by the provider.
47595
+ */
47596
+ runAction: method(zod.z.object({
47597
+ deviceId: zod.z.number(),
47598
+ actionId: NavigationActionIdSchema
47599
+ }), zod.z.void(), { kind: "mutation" }),
47600
+ /** Play a sound by its wire id (the `soundId` of a `kind:'sound'` entry). */
47601
+ playSound: method(zod.z.object({
47602
+ deviceId: zod.z.number(),
47603
+ soundId: zod.z.number().int()
47604
+ }), zod.z.void(), { kind: "mutation" }),
47605
+ /**
47606
+ * Turn the on-camera fill light on / off (the `OpenFullLight` control —
47607
+ * works anytime, no active stream required).
47608
+ */
47609
+ setLightOn: method(zod.z.object({
47610
+ deviceId: zod.z.number(),
47611
+ on: zod.z.boolean()
47612
+ }), zod.z.void(), { kind: "mutation" }),
47613
+ /**
47614
+ * Set the fill-light mode (auto vs manual). `manual` optionally carries the
47615
+ * initial `level`. The auto/manual + level control is a CAMERA-service
47616
+ * action that generally needs an active camera stream/monitor session — the
47617
+ * UI shows the manual level slider ONLY when `mode === 'manual'`.
47618
+ */
47619
+ setLightMode: method(zod.z.object({
47620
+ deviceId: zod.z.number(),
47621
+ mode: NavigationLightModeSchema,
47622
+ level: zod.z.number().min(40).max(100).optional()
47623
+ }), zod.z.void(), { kind: "mutation" }),
47624
+ /** Set the MANUAL fill-light level (40..100). Implies `manual` mode. */
47625
+ setLightLevel: method(zod.z.object({
47626
+ deviceId: zod.z.number(),
47627
+ level: zod.z.number().min(40).max(100)
47628
+ }), zod.z.void(), { kind: "mutation" }),
47629
+ /**
47630
+ * Per-device FEATURE-FLAG report for the general primitives — drives which
47631
+ * controls the UI shows (the per-entry flags for the dictionary come back on
47632
+ * `listActions`).
47633
+ */
47634
+ getFeatures: method(zod.z.object({ deviceId: zod.z.number() }), NavigationFeaturesSchema)
47635
+ },
47636
+ events: { onStatusChanged: { data: zod.z.object({
47637
+ deviceId: zod.z.number(),
47638
+ status: NavigationStatusSchema
47639
+ }) } },
47640
+ status: {
47641
+ schema: NavigationStatusSchema,
47642
+ kind: "push"
47643
+ },
47644
+ /**
47645
+ * Runtime-state slice mirrored by the kernel. The navigation panel watches it
47646
+ * for live mode / follow / flash changes.
47647
+ */
47648
+ runtimeState: NavigationRuntimeStateSchema,
47649
+ /**
47650
+ * Runtime-state durability: **session** — like `vacuum-control`, a restored
47651
+ * `mode: cleaning` / `following: true` is a robot that is not actually doing
47652
+ * that. The live handle re-publishes on connect.
47653
+ *
47654
+ * See `RuntimeStateDurability`. Enforced by
47655
+ * `scripts/check-runtime-state-durability.ts`.
47656
+ */
47657
+ durability: "session"
47658
+ };
47418
47659
  var rebootCapability = {
47419
47660
  name: "reboot",
47420
47661
  scope: "device",
@@ -50735,6 +50976,8 @@ var require_dist_DyO7xSEt = __commonJS({
50735
50976
  "motion-zones",
50736
50977
  "mqtt-broker",
50737
50978
  "native-object-detection",
50979
+ "navigation",
50980
+ "network-link",
50738
50981
  "notifier",
50739
50982
  "numeric-sensor",
50740
50983
  "osd",
@@ -50851,7 +51094,9 @@ var require_dist_DyO7xSEt = __commonJS({
50851
51094
  motionZonesCapability,
50852
51095
  mqttBrokerCapability,
50853
51096
  nativeObjectDetectionCapability,
51097
+ navigationCapability,
50854
51098
  networkAccessCapability,
51099
+ networkLinkCapability,
50855
51100
  networkQualityCapability,
50856
51101
  nodesCapability,
50857
51102
  notificationOutputCapability,
@@ -53652,6 +53897,66 @@ var require_dist_DyO7xSEt = __commonJS({
53652
53897
  addonId: null,
53653
53898
  access: "create"
53654
53899
  },
53900
+ "navigation.getFeatures": {
53901
+ capName: "navigation",
53902
+ capScope: "device",
53903
+ addonId: null,
53904
+ access: "view"
53905
+ },
53906
+ "navigation.goToPoint": {
53907
+ capName: "navigation",
53908
+ capScope: "device",
53909
+ addonId: null,
53910
+ access: "create"
53911
+ },
53912
+ "navigation.listActions": {
53913
+ capName: "navigation",
53914
+ capScope: "device",
53915
+ addonId: null,
53916
+ access: "view"
53917
+ },
53918
+ "navigation.move": {
53919
+ capName: "navigation",
53920
+ capScope: "device",
53921
+ addonId: null,
53922
+ access: "create"
53923
+ },
53924
+ "navigation.playSound": {
53925
+ capName: "navigation",
53926
+ capScope: "device",
53927
+ addonId: null,
53928
+ access: "create"
53929
+ },
53930
+ "navigation.runAction": {
53931
+ capName: "navigation",
53932
+ capScope: "device",
53933
+ addonId: null,
53934
+ access: "create"
53935
+ },
53936
+ "navigation.setLightLevel": {
53937
+ capName: "navigation",
53938
+ capScope: "device",
53939
+ addonId: null,
53940
+ access: "create"
53941
+ },
53942
+ "navigation.setLightMode": {
53943
+ capName: "navigation",
53944
+ capScope: "device",
53945
+ addonId: null,
53946
+ access: "create"
53947
+ },
53948
+ "navigation.setLightOn": {
53949
+ capName: "navigation",
53950
+ capScope: "device",
53951
+ addonId: null,
53952
+ access: "create"
53953
+ },
53954
+ "navigation.stop": {
53955
+ capName: "navigation",
53956
+ capScope: "device",
53957
+ addonId: null,
53958
+ access: "create"
53959
+ },
53655
53960
  "networkAccess.getEndpoint": {
53656
53961
  capName: "network-access",
53657
53962
  capScope: "system",
@@ -57747,6 +58052,56 @@ var require_dist_DyO7xSEt = __commonJS({
57747
58052
  form: "single",
57748
58053
  optional: false
57749
58054
  }],
58055
+ "navigation.getFeatures": [{
58056
+ name: "deviceId",
58057
+ form: "single",
58058
+ optional: false
58059
+ }],
58060
+ "navigation.goToPoint": [{
58061
+ name: "deviceId",
58062
+ form: "single",
58063
+ optional: false
58064
+ }],
58065
+ "navigation.listActions": [{
58066
+ name: "deviceId",
58067
+ form: "single",
58068
+ optional: false
58069
+ }],
58070
+ "navigation.move": [{
58071
+ name: "deviceId",
58072
+ form: "single",
58073
+ optional: false
58074
+ }],
58075
+ "navigation.playSound": [{
58076
+ name: "deviceId",
58077
+ form: "single",
58078
+ optional: false
58079
+ }],
58080
+ "navigation.runAction": [{
58081
+ name: "deviceId",
58082
+ form: "single",
58083
+ optional: false
58084
+ }],
58085
+ "navigation.setLightLevel": [{
58086
+ name: "deviceId",
58087
+ form: "single",
58088
+ optional: false
58089
+ }],
58090
+ "navigation.setLightMode": [{
58091
+ name: "deviceId",
58092
+ form: "single",
58093
+ optional: false
58094
+ }],
58095
+ "navigation.setLightOn": [{
58096
+ name: "deviceId",
58097
+ form: "single",
58098
+ optional: false
58099
+ }],
58100
+ "navigation.stop": [{
58101
+ name: "deviceId",
58102
+ form: "single",
58103
+ optional: false
58104
+ }],
57750
58105
  "networkQuality.getDeviceStats": [{
57751
58106
  name: "deviceId",
57752
58107
  form: "single",
@@ -58944,6 +59299,14 @@ var require_dist_DyO7xSEt = __commonJS({
58944
59299
  durability: "restored",
58945
59300
  volatileFields: ["lastFetchedAt"]
58946
59301
  },
59302
+ "navigation": {
59303
+ durability: "session",
59304
+ volatileFields: []
59305
+ },
59306
+ "network-link": {
59307
+ durability: "restored",
59308
+ volatileFields: ["lastUpdated"]
59309
+ },
58947
59310
  "notifier": {
58948
59311
  durability: "session",
58949
59312
  volatileFields: []
@@ -60194,7 +60557,7 @@ var require_alerts_addon = __commonJS({
60194
60557
  [Symbol.toStringTag]: { value: "Module" }
60195
60558
  });
60196
60559
  require_chunk_Cek0wNdY();
60197
- var require_dist10 = require_dist_DyO7xSEt();
60560
+ var require_dist10 = require_dist_C7g13BfN();
60198
60561
  function selectExpired(alerts, cutoffMs) {
60199
60562
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
60200
60563
  }
@@ -61013,7 +61376,7 @@ var require_console_logging = __commonJS({
61013
61376
  [Symbol.toStringTag]: { value: "Module" }
61014
61377
  });
61015
61378
  require_chunk_Cek0wNdY();
61016
- var require_dist10 = require_dist_DyO7xSEt();
61379
+ var require_dist10 = require_dist_C7g13BfN();
61017
61380
  var require_formatter = require_formatter_DqAKDlvN();
61018
61381
  var LEVEL_RANK = {
61019
61382
  debug: 0,
@@ -61107,7 +61470,7 @@ var require_core_blocks_addon = __commonJS({
61107
61470
  "use strict";
61108
61471
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
61109
61472
  var require_chunk = require_chunk_Cek0wNdY();
61110
- var require_dist10 = require_dist_DyO7xSEt();
61473
+ var require_dist10 = require_dist_C7g13BfN();
61111
61474
  var node_crypto = __require("crypto");
61112
61475
  var node_fs_promises = __require("fs/promises");
61113
61476
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -62004,11 +62367,11 @@ var require_core_blocks = __commonJS({
62004
62367
  }
62005
62368
  });
62006
62369
 
62007
- // ../system/dist/retired-settings-keys-BD6-AoDL.js
62008
- var require_retired_settings_keys_BD6_AoDL = __commonJS({
62009
- "../system/dist/retired-settings-keys-BD6-AoDL.js"(exports) {
62370
+ // ../system/dist/retired-settings-keys-BT_YDV75.js
62371
+ var require_retired_settings_keys_BT_YDV75 = __commonJS({
62372
+ "../system/dist/retired-settings-keys-BT_YDV75.js"(exports) {
62010
62373
  "use strict";
62011
- var require_dist10 = require_dist_DyO7xSEt();
62374
+ var require_dist10 = require_dist_C7g13BfN();
62012
62375
  function settingsStoreIsAuthoritativeHere(env) {
62013
62376
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
62014
62377
  return raw === "" || raw === "hub";
@@ -64222,8 +64585,8 @@ var require_device_manager_addon = __commonJS({
64222
64585
  [Symbol.toStringTag]: { value: "Module" }
64223
64586
  });
64224
64587
  require_chunk_Cek0wNdY();
64225
- var require_dist10 = require_dist_DyO7xSEt();
64226
- var require_retired_settings_keys = require_retired_settings_keys_BD6_AoDL();
64588
+ var require_dist10 = require_dist_C7g13BfN();
64589
+ var require_retired_settings_keys = require_retired_settings_keys_BT_YDV75();
64227
64590
  var node_crypto = __require("crypto");
64228
64591
  var _camstack_types_node = require_node();
64229
64592
  var JOB_HISTORY = 20;
@@ -69738,7 +70101,7 @@ var require_hub_forwarder = __commonJS({
69738
70101
  [Symbol.toStringTag]: { value: "Module" }
69739
70102
  });
69740
70103
  require_chunk_Cek0wNdY();
69741
- var require_dist10 = require_dist_DyO7xSEt();
70104
+ var require_dist10 = require_dist_C7g13BfN();
69742
70105
  var require_formatter = require_formatter_DqAKDlvN();
69743
70106
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
69744
70107
  var HubForwarderDestination = class {
@@ -69875,7 +70238,7 @@ var require_liveness_monitor_addon = __commonJS({
69875
70238
  "use strict";
69876
70239
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
69877
70240
  require_chunk_Cek0wNdY();
69878
- var require_dist10 = require_dist_DyO7xSEt();
70241
+ var require_dist10 = require_dist_C7g13BfN();
69879
70242
  var NO_DEVICES = "liveness:no-devices";
69880
70243
  var ALL_OFFLINE = "liveness:all-devices-offline";
69881
70244
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -70071,7 +70434,7 @@ var require_local_auth_addon = __commonJS({
70071
70434
  [Symbol.toStringTag]: { value: "Module" }
70072
70435
  });
70073
70436
  var require_chunk = require_chunk_Cek0wNdY();
70074
- var require_dist10 = require_dist_DyO7xSEt();
70437
+ var require_dist10 = require_dist_C7g13BfN();
70075
70438
  var node_crypto = __require("crypto");
70076
70439
  node_crypto = require_chunk.__toESM(node_crypto);
70077
70440
  var crypto$1 = __require("crypto");
@@ -77884,7 +78247,7 @@ var require_loki_logging = __commonJS({
77884
78247
  [Symbol.toStringTag]: { value: "Module" }
77885
78248
  });
77886
78249
  require_chunk_Cek0wNdY();
77887
- var require_dist10 = require_dist_DyO7xSEt();
78250
+ var require_dist10 = require_dist_C7g13BfN();
77888
78251
  function sanitizeLabelName(raw) {
77889
78252
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
77890
78253
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -78449,7 +78812,7 @@ var require_native_metrics_addon = __commonJS({
78449
78812
  [Symbol.toStringTag]: { value: "Module" }
78450
78813
  });
78451
78814
  var require_chunk = require_chunk_Cek0wNdY();
78452
- var require_dist10 = require_dist_DyO7xSEt();
78815
+ var require_dist10 = require_dist_C7g13BfN();
78453
78816
  var node_fs_promises = __require("fs/promises");
78454
78817
  var node_child_process = __require("child_process");
78455
78818
  var node_util = __require("util");
@@ -81033,7 +81396,7 @@ var require_filesystem_storage_addon = __commonJS({
81033
81396
  [Symbol.toStringTag]: { value: "Module" }
81034
81397
  });
81035
81398
  var require_chunk = require_chunk_Cek0wNdY();
81036
- var require_dist10 = require_dist_DyO7xSEt();
81399
+ var require_dist10 = require_dist_C7g13BfN();
81037
81400
  var node_crypto = __require("crypto");
81038
81401
  var node_fs_promises = __require("fs/promises");
81039
81402
  var node_path = __require("path");
@@ -82149,8 +82512,8 @@ var require_sqlite_settings_addon = __commonJS({
82149
82512
  [Symbol.toStringTag]: { value: "Module" }
82150
82513
  });
82151
82514
  var require_chunk = require_chunk_Cek0wNdY();
82152
- var require_dist10 = require_dist_DyO7xSEt();
82153
- var require_retired_settings_keys = require_retired_settings_keys_BD6_AoDL();
82515
+ var require_dist10 = require_dist_C7g13BfN();
82516
+ var require_retired_settings_keys = require_retired_settings_keys_BT_YDV75();
82154
82517
  var node_crypto = __require("crypto");
82155
82518
  var node_fs = __require("fs");
82156
82519
  var node_module = __require("module");
@@ -84640,7 +85003,7 @@ var require_storage_orchestrator_addon = __commonJS({
84640
85003
  [Symbol.toStringTag]: { value: "Module" }
84641
85004
  });
84642
85005
  var require_chunk = require_chunk_Cek0wNdY();
84643
- var require_dist10 = require_dist_DyO7xSEt();
85006
+ var require_dist10 = require_dist_C7g13BfN();
84644
85007
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
84645
85008
  var zod = require_zod();
84646
85009
  var node_crypto = __require("crypto");
@@ -87591,7 +87954,7 @@ var require_system_config_addon = __commonJS({
87591
87954
  [Symbol.toStringTag]: { value: "Module" }
87592
87955
  });
87593
87956
  require_chunk_Cek0wNdY();
87594
- var require_dist10 = require_dist_DyO7xSEt();
87957
+ var require_dist10 = require_dist_C7g13BfN();
87595
87958
  var SECTION_TITLES = {
87596
87959
  server: "Server",
87597
87960
  auth: "Authentication"
@@ -105652,7 +106015,7 @@ var require_winston_logging = __commonJS({
105652
106015
  [Symbol.toStringTag]: { value: "Module" }
105653
106016
  });
105654
106017
  var require_chunk = require_chunk_Cek0wNdY();
105655
- var require_dist10 = require_dist_DyO7xSEt();
106018
+ var require_dist10 = require_dist_C7g13BfN();
105656
106019
  var require_formatter = require_formatter_DqAKDlvN();
105657
106020
  var node_path = __require("path");
105658
106021
  node_path = require_chunk.__toESM(node_path);
@@ -107428,9 +107791,9 @@ ${(0, node_fs.readFileSync)(ca.caCertPath, "utf-8").trimEnd()}
107428
107791
  }
107429
107792
  });
107430
107793
 
107431
- // ../types/dist/event-category-BaEgqJNv.js
107432
- var require_event_category_BaEgqJNv = __commonJS({
107433
- "../types/dist/event-category-BaEgqJNv.js"(exports) {
107794
+ // ../types/dist/event-category-b8kBSOTT.js
107795
+ var require_event_category_b8kBSOTT = __commonJS({
107796
+ "../types/dist/event-category-b8kBSOTT.js"(exports) {
107434
107797
  "use strict";
107435
107798
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
107436
107799
  EventCategory2["SystemBoot"] = "system.boot";
@@ -107513,6 +107876,7 @@ var require_event_category_BaEgqJNv = __commonJS({
107513
107876
  EventCategory2["DeviceStateChanged"] = "device.state-changed";
107514
107877
  EventCategory2["ZoneAnalyticsOccupancyChanged"] = "zone-analytics.occupancy-changed";
107515
107878
  EventCategory2["BatteryOnStatusChanged"] = "battery.onStatusChanged";
107879
+ EventCategory2["NetworkLinkOnStatusChanged"] = "network-link.onStatusChanged";
107516
107880
  EventCategory2["BatteryOnWakeStarted"] = "battery.onWakeStarted";
107517
107881
  EventCategory2["DoorbellOnPressed"] = "doorbell.onPressed";
107518
107882
  EventCategory2["EventEmitted"] = "event-emitter.event";
@@ -107595,11 +107959,11 @@ var require_event_category_BaEgqJNv = __commonJS({
107595
107959
  }
107596
107960
  });
107597
107961
 
107598
- // ../types/dist/sleep-DVTaZZHP.js
107599
- var require_sleep_DVTaZZHP = __commonJS({
107600
- "../types/dist/sleep-DVTaZZHP.js"(exports) {
107962
+ // ../types/dist/sleep-Dp0uukHR.js
107963
+ var require_sleep_Dp0uukHR = __commonJS({
107964
+ "../types/dist/sleep-Dp0uukHR.js"(exports) {
107601
107965
  "use strict";
107602
- var require_event_category = require_event_category_BaEgqJNv();
107966
+ var require_event_category = require_event_category_b8kBSOTT();
107603
107967
  var zod = require_zod();
107604
107968
  var WELL_KNOWN_TABS = [
107605
107969
  {
@@ -109992,6 +110356,8 @@ var require_sleep_DVTaZZHP = __commonJS({
109992
110356
  motionTrigger: createSliceHandle(stateSource, binding.deviceId, "motion-trigger"),
109993
110357
  motionZones: createSliceHandle(stateSource, binding.deviceId, "motion-zones"),
109994
110358
  nativeObjectDetection: createSliceHandle(stateSource, binding.deviceId, "native-object-detection"),
110359
+ navigation: createSliceHandle(stateSource, binding.deviceId, "navigation"),
110360
+ networkLink: createSliceHandle(stateSource, binding.deviceId, "network-link"),
109995
110361
  notifier: createSliceHandle(stateSource, binding.deviceId, "notifier"),
109996
110362
  numericSensor: createSliceHandle(stateSource, binding.deviceId, "numeric-sensor"),
109997
110363
  petFeeder: createSliceHandle(stateSource, binding.deviceId, "pet-feeder"),
@@ -110225,6 +110591,20 @@ var require_sleep_DVTaZZHP = __commonJS({
110225
110591
  setEnabled: (input) => dispatch("native-object-detection", "nativeObjectDetection", "setEnabled", "mutation", input),
110226
110592
  getStatus: (input) => dispatch("native-object-detection", "nativeObjectDetection", "getStatus", "query", input)
110227
110593
  },
110594
+ navigation: {
110595
+ move: (input) => dispatch("navigation", "navigation", "move", "mutation", input),
110596
+ stop: (input) => dispatch("navigation", "navigation", "stop", "mutation", input),
110597
+ goToPoint: (input) => dispatch("navigation", "navigation", "goToPoint", "mutation", input),
110598
+ listActions: (input) => dispatch("navigation", "navigation", "listActions", "query", input),
110599
+ runAction: (input) => dispatch("navigation", "navigation", "runAction", "mutation", input),
110600
+ playSound: (input) => dispatch("navigation", "navigation", "playSound", "mutation", input),
110601
+ setLightOn: (input) => dispatch("navigation", "navigation", "setLightOn", "mutation", input),
110602
+ setLightMode: (input) => dispatch("navigation", "navigation", "setLightMode", "mutation", input),
110603
+ setLightLevel: (input) => dispatch("navigation", "navigation", "setLightLevel", "mutation", input),
110604
+ getFeatures: (input) => dispatch("navigation", "navigation", "getFeatures", "query", input),
110605
+ getStatus: (input) => dispatch("navigation", "navigation", "getStatus", "query", input)
110606
+ },
110607
+ networkLink: { getStatus: (input) => dispatch("network-link", "networkLink", "getStatus", "query", input) },
110228
110608
  notificationRules: {
110229
110609
  listRules: (input) => dispatch("notification-rules", "notificationRules", "listRules", "query", input),
110230
110610
  getRule: (input) => dispatch("notification-rules", "notificationRules", "getRule", "query", input),
@@ -110671,6 +111051,8 @@ var require_sleep_DVTaZZHP = __commonJS({
110671
111051
  "motion-trigger",
110672
111052
  "motion-zones",
110673
111053
  "native-object-detection",
111054
+ "navigation",
111055
+ "network-link",
110674
111056
  "notifier",
110675
111057
  "numeric-sensor",
110676
111058
  "osd",
@@ -111286,8 +111668,8 @@ var require_addon = __commonJS({
111286
111668
  "../types/dist/addon.js"(exports) {
111287
111669
  "use strict";
111288
111670
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
111289
- var require_event_category = require_event_category_BaEgqJNv();
111290
- var require_sleep = require_sleep_DVTaZZHP();
111671
+ var require_event_category = require_event_category_b8kBSOTT();
111672
+ var require_sleep = require_sleep_Dp0uukHR();
111291
111673
  var require_err_msg = require_err_msg_COpsHMw2();
111292
111674
  var CAP_INPUT_DEFAULTS = Object.freeze({
111293
111675
  "addons": { "getLogs": { "limit": 100 } },
@@ -130247,7 +130629,7 @@ var require_dist3 = __commonJS({
130247
130629
  "use strict";
130248
130630
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
130249
130631
  var require_chunk = require_chunk_Cek0wNdY();
130250
- var require_dist10 = require_dist_DyO7xSEt();
130632
+ var require_dist10 = require_dist_C7g13BfN();
130251
130633
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
130252
130634
  require_alerts();
130253
130635
  var require_formatter = require_formatter_DqAKDlvN();
@@ -211343,7 +211725,7 @@ var require_enums = __commonJS({
211343
211725
  "../types/dist/enums.js"(exports) {
211344
211726
  "use strict";
211345
211727
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
211346
- var require_event_category = require_event_category_BaEgqJNv();
211728
+ var require_event_category = require_event_category_b8kBSOTT();
211347
211729
  var EventSourceType = /* @__PURE__ */ (function(EventSourceType2) {
211348
211730
  EventSourceType2["Addon"] = "addon";
211349
211731
  EventSourceType2["Core"] = "core";
@@ -211363,8 +211745,8 @@ var require_dist4 = __commonJS({
211363
211745
  "../types/dist/index.js"(exports) {
211364
211746
  "use strict";
211365
211747
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
211366
- var require_event_category = require_event_category_BaEgqJNv();
211367
- var require_sleep = require_sleep_DVTaZZHP();
211748
+ var require_event_category = require_event_category_b8kBSOTT();
211749
+ var require_sleep = require_sleep_Dp0uukHR();
211368
211750
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
211369
211751
  var require_enums2 = require_enums();
211370
211752
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -231288,6 +231670,94 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
231288
231670
  * whether persisting is worth a SQLite commit. */
231289
231671
  volatileStateFields: ["lastUpdated"]
231290
231672
  };
231673
+ var NETWORK_LINK_TYPES = [
231674
+ "wifi",
231675
+ "ethernet",
231676
+ "cellular",
231677
+ "unknown"
231678
+ ];
231679
+ var NetworkLinkStatusSchema = zod.z.object({
231680
+ /** The link the device is on. `'unknown'` = not read yet, not "no link". */
231681
+ type: zod.z.enum(NETWORK_LINK_TYPES),
231682
+ /**
231683
+ * Link quality, 0..100 inclusive, normalised by the provider from whatever
231684
+ * the firmware reports (bars, RSSI, a vendor scale). **`null` means NOT
231685
+ * KNOWN or NOT APPLICABLE** — a wired link has no signal, and a wireless
231686
+ * one whose reading has not landed must not be drawn at 0 %. Consumers
231687
+ * SKIP a null rather than coerce it.
231688
+ */
231689
+ signalPercent: zod.z.number().min(0).max(100).nullable(),
231690
+ /** Raw received signal strength in dBm, when the firmware reports one. */
231691
+ rssiDbm: zod.z.number().optional(),
231692
+ /** Network name of a wireless link, when the firmware reports it. */
231693
+ ssid: zod.z.string().optional(),
231694
+ /** Ms epoch of the last observation. Lets consumers reason about freshness. */
231695
+ lastUpdated: zod.z.number()
231696
+ });
231697
+ var NETWORK_LINK_UNKNOWN = {
231698
+ type: "unknown",
231699
+ signalPercent: null,
231700
+ lastUpdated: 0
231701
+ };
231702
+ function signalPercentFromBars(bars, maxBars) {
231703
+ if (bars === void 0 || !Number.isFinite(bars) || maxBars <= 0) return null;
231704
+ if (bars < 0 || bars > maxBars) return null;
231705
+ return Math.round(bars / maxBars * 100);
231706
+ }
231707
+ function signalPercentFromRssi(rssiDbm) {
231708
+ if (rssiDbm === void 0 || !Number.isFinite(rssiDbm) || rssiDbm > 0) return null;
231709
+ return Math.round((Math.min(-50, Math.max(-100, rssiDbm)) + 100) * 2);
231710
+ }
231711
+ var networkLinkCapability = {
231712
+ name: "network-link",
231713
+ scope: "device",
231714
+ deviceNative: true,
231715
+ mode: "singleton",
231716
+ deviceTypes: [
231717
+ require_sleep.DeviceType.Camera,
231718
+ require_sleep.DeviceType.Sensor,
231719
+ require_sleep.DeviceType.Button,
231720
+ require_sleep.DeviceType.Switch,
231721
+ require_sleep.DeviceType.Light,
231722
+ require_sleep.DeviceType.Lock,
231723
+ require_sleep.DeviceType.Siren
231724
+ ],
231725
+ methods: {},
231726
+ events: {
231727
+ /**
231728
+ * Emitted whenever the cached status changes (a link switch, a signal
231729
+ * reading that moved). Mirrored on the parent chain by the
231730
+ * DeviceEventPropagator like `battery.onStatusChanged`.
231731
+ */
231732
+ onStatusChanged: { data: zod.z.object({
231733
+ deviceId: zod.z.number(),
231734
+ status: NetworkLinkStatusSchema
231735
+ }) }
231736
+ },
231737
+ status: {
231738
+ schema: NetworkLinkStatusSchema,
231739
+ kind: "push",
231740
+ empty: NETWORK_LINK_UNKNOWN
231741
+ },
231742
+ /**
231743
+ * Runtime-state slice — every provider stores the same shape under
231744
+ * `device.runtimeState['network-link']`, read once by the badge and the
231745
+ * Home Assistant projector regardless of the driver.
231746
+ */
231747
+ runtimeState: NetworkLinkStatusSchema,
231748
+ /**
231749
+ * Runtime-state durability: **restored** — a link reading is slow to
231750
+ * change and a sleeping battery camera may not report for hours; the
231751
+ * restored slice is what the badge shows until the next read.
231752
+ *
231753
+ * See `RuntimeStateDurability`. Enforced by
231754
+ * `scripts/check-runtime-state-durability.ts`.
231755
+ */
231756
+ durability: "restored",
231757
+ /** Clock fields: written, but excluded from the compare that decides
231758
+ * whether persisting is worth a SQLite commit. */
231759
+ volatileStateFields: ["lastUpdated"]
231760
+ };
231291
231761
  var BinaryStatusSchema = zod.z.object({
231292
231762
  on: zod.z.boolean(),
231293
231763
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -236000,6 +236470,297 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
236000
236470
  */
236001
236471
  durability: "session"
236002
236472
  };
236473
+ var NavigationMoveCommandSchema = zod.z.object({
236474
+ pan: zod.z.number().min(-1).max(1).optional(),
236475
+ tilt: zod.z.number().min(-1).max(1).optional(),
236476
+ speed: zod.z.number().min(0).max(1).optional()
236477
+ });
236478
+ var NavigationActionIdSchema = zod.z.enum([
236479
+ "goHome",
236480
+ "locate",
236481
+ "spotClean",
236482
+ "findPet",
236483
+ "personFollow",
236484
+ "stop",
236485
+ "startClean",
236486
+ "pauseClean",
236487
+ "dockWash",
236488
+ "autoEmpty",
236489
+ "flashOn",
236490
+ "flashOff"
236491
+ ]);
236492
+ var NavigationEntryKindSchema = zod.z.enum(["action", "sound"]);
236493
+ var NavigationActionEntrySchema = zod.z.object({
236494
+ id: zod.z.string(),
236495
+ kind: NavigationEntryKindSchema,
236496
+ label: zod.z.string(),
236497
+ icon: zod.z.string(),
236498
+ /** Present only on `kind:'sound'` entries — the id to pass to `playSound`. */
236499
+ soundId: zod.z.number().int().optional(),
236500
+ /** Per-device feature flag — render this entry only when true. */
236501
+ enabled: zod.z.boolean()
236502
+ });
236503
+ var NAVIGATION_ACTION_CATALOG = [
236504
+ {
236505
+ id: "startClean",
236506
+ kind: "action",
236507
+ label: "Start cleaning",
236508
+ icon: "play",
236509
+ enabled: true
236510
+ },
236511
+ {
236512
+ id: "pauseClean",
236513
+ kind: "action",
236514
+ label: "Pause cleaning",
236515
+ icon: "pause",
236516
+ enabled: true
236517
+ },
236518
+ {
236519
+ id: "stop",
236520
+ kind: "action",
236521
+ label: "Stop",
236522
+ icon: "hand",
236523
+ enabled: true
236524
+ },
236525
+ {
236526
+ id: "goHome",
236527
+ kind: "action",
236528
+ label: "Return to dock",
236529
+ icon: "home",
236530
+ enabled: true
236531
+ },
236532
+ {
236533
+ id: "locate",
236534
+ kind: "action",
236535
+ label: "Locate",
236536
+ icon: "bell",
236537
+ enabled: true
236538
+ },
236539
+ {
236540
+ id: "spotClean",
236541
+ kind: "action",
236542
+ label: "Spot clean here",
236543
+ icon: "crosshair",
236544
+ enabled: true
236545
+ },
236546
+ {
236547
+ id: "findPet",
236548
+ kind: "action",
236549
+ label: "Find pet",
236550
+ icon: "paw-print",
236551
+ enabled: true
236552
+ },
236553
+ {
236554
+ id: "personFollow",
236555
+ kind: "action",
236556
+ label: "Follow me",
236557
+ icon: "footprints",
236558
+ enabled: true
236559
+ },
236560
+ {
236561
+ id: "dockWash",
236562
+ kind: "action",
236563
+ label: "Wash mop",
236564
+ icon: "droplets",
236565
+ enabled: true
236566
+ },
236567
+ {
236568
+ id: "autoEmpty",
236569
+ kind: "action",
236570
+ label: "Empty dustbin",
236571
+ icon: "trash-2",
236572
+ enabled: true
236573
+ },
236574
+ {
236575
+ id: "flashOn",
236576
+ kind: "action",
236577
+ label: "Flash on",
236578
+ icon: "flashlight",
236579
+ enabled: true
236580
+ },
236581
+ {
236582
+ id: "flashOff",
236583
+ kind: "action",
236584
+ label: "Flash off",
236585
+ icon: "flashlight-off",
236586
+ enabled: true
236587
+ },
236588
+ {
236589
+ id: "sound:meow",
236590
+ kind: "sound",
236591
+ label: "Meow",
236592
+ icon: "cat",
236593
+ soundId: 684,
236594
+ enabled: true
236595
+ },
236596
+ {
236597
+ id: "sound:bark",
236598
+ kind: "sound",
236599
+ label: "Woof",
236600
+ icon: "dog",
236601
+ soundId: 685,
236602
+ enabled: true
236603
+ },
236604
+ {
236605
+ id: "sound:footsteps",
236606
+ kind: "sound",
236607
+ label: "Footsteps",
236608
+ icon: "footprints",
236609
+ soundId: 686,
236610
+ enabled: true
236611
+ },
236612
+ {
236613
+ id: "sound:purring",
236614
+ kind: "sound",
236615
+ label: "Purring",
236616
+ icon: "cat",
236617
+ soundId: 687,
236618
+ enabled: true
236619
+ },
236620
+ {
236621
+ id: "sound:tickTock",
236622
+ kind: "sound",
236623
+ label: "Tick-tock",
236624
+ icon: "clock",
236625
+ soundId: 688,
236626
+ enabled: true
236627
+ }
236628
+ ];
236629
+ var NavigationPointSchema = zod.z.object({
236630
+ x: zod.z.number(),
236631
+ y: zod.z.number()
236632
+ });
236633
+ var NavigationFeaturesSchema = zod.z.object({
236634
+ move: zod.z.boolean(),
236635
+ stop: zod.z.boolean(),
236636
+ goToPoint: zod.z.boolean(),
236637
+ runAction: zod.z.boolean(),
236638
+ playSound: zod.z.boolean(),
236639
+ light: zod.z.boolean(),
236640
+ lightMode: zod.z.boolean()
236641
+ });
236642
+ var NavigationLightModeSchema = zod.z.enum(["auto", "manual"]);
236643
+ var NAVIGATION_LIGHT_LEVEL_MIN = 40;
236644
+ var NAVIGATION_LIGHT_LEVEL_MAX = 100;
236645
+ var NavigationModeSchema = zod.z.enum([
236646
+ "idle",
236647
+ "cleaning",
236648
+ "spot",
236649
+ "following",
236650
+ "goto",
236651
+ "returning",
236652
+ "paused",
236653
+ "unknown"
236654
+ ]);
236655
+ var NavigationStatusSchema = zod.z.object({
236656
+ mode: NavigationModeSchema,
236657
+ following: zod.z.boolean(),
236658
+ flash: zod.z.boolean(),
236659
+ lightMode: NavigationLightModeSchema,
236660
+ lightLevel: zod.z.number().min(40).max(100),
236661
+ /** Ms epoch when the slice was last updated. */
236662
+ lastChangedAt: zod.z.number()
236663
+ });
236664
+ var NavigationRuntimeStateSchema = NavigationStatusSchema.extend({ lastFetchedAt: zod.z.number() });
236665
+ var navigationCapability = {
236666
+ name: "navigation",
236667
+ scope: "device",
236668
+ deviceNative: true,
236669
+ mode: "singleton",
236670
+ deviceTypes: [require_sleep.DeviceType.Camera],
236671
+ deviceConfig: { ui: {
236672
+ kind: "widget",
236673
+ widgetId: "host/navigation-panel",
236674
+ tab: "navigation",
236675
+ topTab: true,
236676
+ label: "Navigation",
236677
+ order: 0
236678
+ } },
236679
+ methods: {
236680
+ /**
236681
+ * Momentary drive nudge (the robot moves). `protected` — mirrors
236682
+ * `ptz.continuousMove` so the Viewer navigation panel (and the PTZ-mimic
236683
+ * path) works for any authenticated user, not admin-only. The UI sends
236684
+ * these at ~1 Hz while a control is held; the provider forwards each one to
236685
+ * a single drive write WITHOUT debouncing.
236686
+ */
236687
+ move: require_sleep.method(NavigationMoveCommandSchema.extend({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
236688
+ /** Halt all motion immediately (zero drive vector). */
236689
+ stop: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
236690
+ /** Send the robot to a point on its live map. */
236691
+ goToPoint: require_sleep.method(NavigationPointSchema.extend({ deviceId: zod.z.number() }), zod.z.void(), { kind: "mutation" }),
236692
+ /**
236693
+ * Enumerate the discrete controls THIS device supports (data-driven UI +
236694
+ * PTZ mimic). Camera-probed subset of {@link NAVIGATION_ACTION_CATALOG}.
236695
+ */
236696
+ listActions: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.array(NavigationActionEntrySchema)),
236697
+ /**
236698
+ * Run one discrete action (a `kind:'action'` dictionary entry). Invalid /
236699
+ * unsupported action ids are rejected by the provider.
236700
+ */
236701
+ runAction: require_sleep.method(zod.z.object({
236702
+ deviceId: zod.z.number(),
236703
+ actionId: NavigationActionIdSchema
236704
+ }), zod.z.void(), { kind: "mutation" }),
236705
+ /** Play a sound by its wire id (the `soundId` of a `kind:'sound'` entry). */
236706
+ playSound: require_sleep.method(zod.z.object({
236707
+ deviceId: zod.z.number(),
236708
+ soundId: zod.z.number().int()
236709
+ }), zod.z.void(), { kind: "mutation" }),
236710
+ /**
236711
+ * Turn the on-camera fill light on / off (the `OpenFullLight` control —
236712
+ * works anytime, no active stream required).
236713
+ */
236714
+ setLightOn: require_sleep.method(zod.z.object({
236715
+ deviceId: zod.z.number(),
236716
+ on: zod.z.boolean()
236717
+ }), zod.z.void(), { kind: "mutation" }),
236718
+ /**
236719
+ * Set the fill-light mode (auto vs manual). `manual` optionally carries the
236720
+ * initial `level`. The auto/manual + level control is a CAMERA-service
236721
+ * action that generally needs an active camera stream/monitor session — the
236722
+ * UI shows the manual level slider ONLY when `mode === 'manual'`.
236723
+ */
236724
+ setLightMode: require_sleep.method(zod.z.object({
236725
+ deviceId: zod.z.number(),
236726
+ mode: NavigationLightModeSchema,
236727
+ level: zod.z.number().min(40).max(100).optional()
236728
+ }), zod.z.void(), { kind: "mutation" }),
236729
+ /** Set the MANUAL fill-light level (40..100). Implies `manual` mode. */
236730
+ setLightLevel: require_sleep.method(zod.z.object({
236731
+ deviceId: zod.z.number(),
236732
+ level: zod.z.number().min(40).max(100)
236733
+ }), zod.z.void(), { kind: "mutation" }),
236734
+ /**
236735
+ * Per-device FEATURE-FLAG report for the general primitives — drives which
236736
+ * controls the UI shows (the per-entry flags for the dictionary come back on
236737
+ * `listActions`).
236738
+ */
236739
+ getFeatures: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), NavigationFeaturesSchema)
236740
+ },
236741
+ events: { onStatusChanged: { data: zod.z.object({
236742
+ deviceId: zod.z.number(),
236743
+ status: NavigationStatusSchema
236744
+ }) } },
236745
+ status: {
236746
+ schema: NavigationStatusSchema,
236747
+ kind: "push"
236748
+ },
236749
+ /**
236750
+ * Runtime-state slice mirrored by the kernel. The navigation panel watches it
236751
+ * for live mode / follow / flash changes.
236752
+ */
236753
+ runtimeState: NavigationRuntimeStateSchema,
236754
+ /**
236755
+ * Runtime-state durability: **session** — like `vacuum-control`, a restored
236756
+ * `mode: cleaning` / `following: true` is a robot that is not actually doing
236757
+ * that. The live handle re-publishes on connect.
236758
+ *
236759
+ * See `RuntimeStateDurability`. Enforced by
236760
+ * `scripts/check-runtime-state-durability.ts`.
236761
+ */
236762
+ durability: "session"
236763
+ };
236003
236764
  var rebootCapability = {
236004
236765
  name: "reboot",
236005
236766
  scope: "device",
@@ -239371,6 +240132,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
239371
240132
  motionTrigger: motionTriggerCapability,
239372
240133
  motionZones: motionZonesCapability,
239373
240134
  nativeObjectDetection: nativeObjectDetectionCapability,
240135
+ navigation: navigationCapability,
240136
+ networkLink: networkLinkCapability,
239374
240137
  notifier: notifierCapability,
239375
240138
  numericSensor: numericSensorCapability,
239376
240139
  petFeeder: petFeederCapability,
@@ -241850,6 +242613,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
241850
242613
  "motion-zones",
241851
242614
  "mqtt-broker",
241852
242615
  "native-object-detection",
242616
+ "navigation",
242617
+ "network-link",
241853
242618
  "notifier",
241854
242619
  "numeric-sensor",
241855
242620
  "osd",
@@ -241966,7 +242731,9 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
241966
242731
  motionZones: "motion-zones",
241967
242732
  mqttBroker: "mqtt-broker",
241968
242733
  nativeObjectDetection: "native-object-detection",
242734
+ navigation: "navigation",
241969
242735
  networkAccess: "network-access",
242736
+ networkLink: "network-link",
241970
242737
  networkQuality: "network-quality",
241971
242738
  nodes: "nodes",
241972
242739
  notificationOutput: "notification-output",
@@ -242387,10 +243154,18 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
242387
243154
  key: "nativeObjectDetection",
242388
243155
  name: "native-object-detection"
242389
243156
  },
243157
+ {
243158
+ key: "navigation",
243159
+ name: "navigation"
243160
+ },
242390
243161
  {
242391
243162
  key: "networkAccess",
242392
243163
  name: "network-access"
242393
243164
  },
243165
+ {
243166
+ key: "networkLink",
243167
+ name: "network-link"
243168
+ },
242394
243169
  {
242395
243170
  key: "networkQuality",
242396
243171
  name: "network-quality"
@@ -242730,7 +243505,9 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
242730
243505
  motionZonesCapability,
242731
243506
  mqttBrokerCapability,
242732
243507
  nativeObjectDetectionCapability,
243508
+ navigationCapability,
242733
243509
  networkAccessCapability,
243510
+ networkLinkCapability,
242734
243511
  networkQualityCapability,
242735
243512
  nodesCapability,
242736
243513
  notificationOutputCapability,
@@ -245531,6 +246308,66 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
245531
246308
  addonId: null,
245532
246309
  access: "create"
245533
246310
  },
246311
+ "navigation.getFeatures": {
246312
+ capName: "navigation",
246313
+ capScope: "device",
246314
+ addonId: null,
246315
+ access: "view"
246316
+ },
246317
+ "navigation.goToPoint": {
246318
+ capName: "navigation",
246319
+ capScope: "device",
246320
+ addonId: null,
246321
+ access: "create"
246322
+ },
246323
+ "navigation.listActions": {
246324
+ capName: "navigation",
246325
+ capScope: "device",
246326
+ addonId: null,
246327
+ access: "view"
246328
+ },
246329
+ "navigation.move": {
246330
+ capName: "navigation",
246331
+ capScope: "device",
246332
+ addonId: null,
246333
+ access: "create"
246334
+ },
246335
+ "navigation.playSound": {
246336
+ capName: "navigation",
246337
+ capScope: "device",
246338
+ addonId: null,
246339
+ access: "create"
246340
+ },
246341
+ "navigation.runAction": {
246342
+ capName: "navigation",
246343
+ capScope: "device",
246344
+ addonId: null,
246345
+ access: "create"
246346
+ },
246347
+ "navigation.setLightLevel": {
246348
+ capName: "navigation",
246349
+ capScope: "device",
246350
+ addonId: null,
246351
+ access: "create"
246352
+ },
246353
+ "navigation.setLightMode": {
246354
+ capName: "navigation",
246355
+ capScope: "device",
246356
+ addonId: null,
246357
+ access: "create"
246358
+ },
246359
+ "navigation.setLightOn": {
246360
+ capName: "navigation",
246361
+ capScope: "device",
246362
+ addonId: null,
246363
+ access: "create"
246364
+ },
246365
+ "navigation.stop": {
246366
+ capName: "navigation",
246367
+ capScope: "device",
246368
+ addonId: null,
246369
+ access: "create"
246370
+ },
245534
246371
  "networkAccess.getEndpoint": {
245535
246372
  capName: "network-access",
245536
246373
  capScope: "system",
@@ -248923,6 +249760,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
248923
249760
  "motion-zones",
248924
249761
  "mqtt-broker",
248925
249762
  "native-object-detection",
249763
+ "navigation",
248926
249764
  "network-access",
248927
249765
  "network-quality",
248928
249766
  "nodes",
@@ -249010,6 +249848,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249010
249848
  "motion-trigger",
249011
249849
  "motion-zones",
249012
249850
  "native-object-detection",
249851
+ "navigation",
249013
249852
  "notifier",
249014
249853
  "osd",
249015
249854
  "pet-feeder",
@@ -249884,6 +250723,56 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249884
250723
  form: "single",
249885
250724
  optional: false
249886
250725
  }],
250726
+ "navigation.getFeatures": [{
250727
+ name: "deviceId",
250728
+ form: "single",
250729
+ optional: false
250730
+ }],
250731
+ "navigation.goToPoint": [{
250732
+ name: "deviceId",
250733
+ form: "single",
250734
+ optional: false
250735
+ }],
250736
+ "navigation.listActions": [{
250737
+ name: "deviceId",
250738
+ form: "single",
250739
+ optional: false
250740
+ }],
250741
+ "navigation.move": [{
250742
+ name: "deviceId",
250743
+ form: "single",
250744
+ optional: false
250745
+ }],
250746
+ "navigation.playSound": [{
250747
+ name: "deviceId",
250748
+ form: "single",
250749
+ optional: false
250750
+ }],
250751
+ "navigation.runAction": [{
250752
+ name: "deviceId",
250753
+ form: "single",
250754
+ optional: false
250755
+ }],
250756
+ "navigation.setLightLevel": [{
250757
+ name: "deviceId",
250758
+ form: "single",
250759
+ optional: false
250760
+ }],
250761
+ "navigation.setLightMode": [{
250762
+ name: "deviceId",
250763
+ form: "single",
250764
+ optional: false
250765
+ }],
250766
+ "navigation.setLightOn": [{
250767
+ name: "deviceId",
250768
+ form: "single",
250769
+ optional: false
250770
+ }],
250771
+ "navigation.stop": [{
250772
+ name: "deviceId",
250773
+ form: "single",
250774
+ optional: false
250775
+ }],
249887
250776
  "networkQuality.getDeviceStats": [{
249888
250777
  name: "deviceId",
249889
250778
  form: "single",
@@ -251231,6 +252120,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
251231
252120
  durability: "restored",
251232
252121
  volatileFields: ["lastFetchedAt"]
251233
252122
  },
252123
+ "navigation": {
252124
+ durability: "session",
252125
+ volatileFields: []
252126
+ },
252127
+ "network-link": {
252128
+ durability: "restored",
252129
+ volatileFields: ["lastUpdated"]
252130
+ },
251234
252131
  "notifier": {
251235
252132
  durability: "session",
251236
252133
  volatileFields: []
@@ -251363,6 +252260,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
251363
252260
  "lock-control",
251364
252261
  "motion-zones",
251365
252262
  "native-object-detection",
252263
+ "network-link",
251366
252264
  "numeric-sensor",
251367
252265
  "power-meter",
251368
252266
  "presence",
@@ -255287,6 +256185,9 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
255287
256185
  exports.NATIVE_LEASE_SECTION_ID = NATIVE_LEASE_SECTION_ID;
255288
256186
  exports.NATIVE_LEASE_TILE_BUDGET_FIELD = NATIVE_LEASE_TILE_BUDGET_FIELD;
255289
256187
  exports.NATIVE_LEASE_TILE_BUDGET_KEY = NATIVE_LEASE_TILE_BUDGET_KEY;
256188
+ exports.NAVIGATION_ACTION_CATALOG = NAVIGATION_ACTION_CATALOG;
256189
+ exports.NAVIGATION_LIGHT_LEVEL_MAX = NAVIGATION_LIGHT_LEVEL_MAX;
256190
+ exports.NAVIGATION_LIGHT_LEVEL_MIN = NAVIGATION_LIGHT_LEVEL_MIN;
255290
256191
  exports.NC_ALARM_SYSTEM_EVENT_KINDS = NC_ALARM_SYSTEM_EVENT_KINDS;
255291
256192
  exports.NC_AUDIO_CONFIRM_HITS_DEFAULT = NC_AUDIO_CONFIRM_HITS_DEFAULT;
255292
256193
  exports.NC_AUDIO_CONFIRM_HITS_MAX = NC_AUDIO_CONFIRM_HITS_MAX;
@@ -255324,6 +256225,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
255324
256225
  exports.NC_SYSTEM_DELIVERY = NC_SYSTEM_DELIVERY;
255325
256226
  exports.NC_SYSTEM_EVENT_FILTER_KEYS = NC_SYSTEM_EVENT_FILTER_KEYS;
255326
256227
  exports.NC_TAXONOMY = NC_TAXONOMY;
256228
+ exports.NETWORK_LINK_TYPES = NETWORK_LINK_TYPES;
256229
+ exports.NETWORK_LINK_UNKNOWN = NETWORK_LINK_UNKNOWN;
255327
256230
  exports.NativeCropBboxSchema = NativeCropBboxSchema;
255328
256231
  exports.NativeCropRefSchema = NativeCropRefSchema;
255329
256232
  exports.NativeCropResultSchema = NativeCropResultSchema;
@@ -255333,6 +256236,16 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
255333
256236
  exports.NativeObjectClassEnum = NativeObjectClassEnum;
255334
256237
  exports.NativeObjectDetectionRuntimeStateSchema = NativeObjectDetectionRuntimeStateSchema;
255335
256238
  exports.NativeObjectDetectionStatusSchema = NativeObjectDetectionStatusSchema;
256239
+ exports.NavigationActionEntrySchema = NavigationActionEntrySchema;
256240
+ exports.NavigationActionIdSchema = NavigationActionIdSchema;
256241
+ exports.NavigationEntryKindSchema = NavigationEntryKindSchema;
256242
+ exports.NavigationFeaturesSchema = NavigationFeaturesSchema;
256243
+ exports.NavigationLightModeSchema = NavigationLightModeSchema;
256244
+ exports.NavigationModeSchema = NavigationModeSchema;
256245
+ exports.NavigationMoveCommandSchema = NavigationMoveCommandSchema;
256246
+ exports.NavigationPointSchema = NavigationPointSchema;
256247
+ exports.NavigationRuntimeStateSchema = NavigationRuntimeStateSchema;
256248
+ exports.NavigationStatusSchema = NavigationStatusSchema;
255336
256249
  exports.NcAlarmConfigSchema = NcAlarmConfigSchema;
255337
256250
  exports.NcAlarmModeCoverageSchema = NcAlarmModeCoverageSchema;
255338
256251
  exports.NcAlarmSettingsPatchSchema = NcAlarmSettingsPatchSchema;
@@ -255382,6 +256295,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
255382
256295
  exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
255383
256296
  exports.NetworkAddressSchema = NetworkAddressSchema;
255384
256297
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
256298
+ exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
255385
256299
  exports.NotificationActionIconSchema = NotificationActionIconSchema;
255386
256300
  exports.NotificationActionSchema = NotificationActionSchema;
255387
256301
  exports.NotificationFormatSchema = NotificationFormatSchema;
@@ -256040,7 +256954,9 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256040
256954
  exports.motionZonesCapability = motionZonesCapability;
256041
256955
  exports.mqttBrokerCapability = mqttBrokerCapability;
256042
256956
  exports.nativeObjectDetectionCapability = nativeObjectDetectionCapability;
256957
+ exports.navigationCapability = navigationCapability;
256043
256958
  exports.networkAccessCapability = networkAccessCapability;
256959
+ exports.networkLinkCapability = networkLinkCapability;
256044
256960
  exports.networkQualityCapability = networkQualityCapability;
256045
256961
  exports.nodePin = require_sleep.nodePin;
256046
256962
  exports.nodesCapability = nodesCapability;
@@ -256154,6 +257070,8 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
256154
257070
  exports.serverManagementCapability = serverManagementCapability;
256155
257071
  exports.setByPath = setByPath;
256156
257072
  exports.settingsStoreCapability = settingsStoreCapability;
257073
+ exports.signalPercentFromBars = signalPercentFromBars;
257074
+ exports.signalPercentFromRssi = signalPercentFromRssi;
256157
257075
  exports.sleep = require_sleep.sleep;
256158
257076
  exports.sleepCancellable = require_sleep.sleepCancellable;
256159
257077
  exports.sliceActiveValue = sliceActiveValue;