@camstack/system 1.2.187 → 1.2.189

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 (57) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/console-logging/index.js +1 -1
  12. package/dist/builtins/console-logging/index.mjs +1 -1
  13. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  14. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  15. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  16. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  17. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  18. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  19. package/dist/builtins/hub-forwarder/index.js +1 -1
  20. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  21. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  22. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  23. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  24. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  25. package/dist/builtins/local-network/local-network.addon.js +1 -1
  26. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  27. package/dist/builtins/loki-logging/index.js +1 -1
  28. package/dist/builtins/loki-logging/index.mjs +1 -1
  29. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  30. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  31. package/dist/builtins/platform-probe/index.js +1 -1
  32. package/dist/builtins/platform-probe/index.mjs +1 -1
  33. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  34. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  35. package/dist/builtins/snapshot/index.js +61 -5
  36. package/dist/builtins/snapshot/index.mjs +61 -5
  37. package/dist/builtins/snapshot/snapshot-fatigue.d.ts +41 -0
  38. package/dist/builtins/snapshot/snapshot.addon.d.ts +2 -0
  39. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  41. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  42. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  43. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  44. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  45. package/dist/builtins/system-config/system-config.addon.js +1 -1
  46. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  47. package/dist/builtins/winston-logging/index.js +1 -1
  48. package/dist/builtins/winston-logging/index.mjs +1 -1
  49. package/dist/{dist-C5PkvU4p.mjs → dist-D0_hqbgc.mjs} +13 -4
  50. package/dist/{dist-DNwhsXWi.js → dist-DlL8iWQo.js} +13 -4
  51. package/dist/index.js +2 -2
  52. package/dist/index.mjs +2 -2
  53. package/dist/{manifest-system-deps-BF-C5NDL.mjs → manifest-system-deps-726RBOX7.mjs} +8 -4
  54. package/dist/{manifest-system-deps-KBuTXH-y.js → manifest-system-deps-DvY1bY_n.js} +8 -4
  55. package/dist/{retired-settings-keys-BZU4lIH7.mjs → retired-settings-keys-AE2Qy3Xd.mjs} +1 -1
  56. package/dist/{retired-settings-keys-CUXClAIQ.js → retired-settings-keys-B5wVSU65.js} +1 -1
  57. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_manifest_system_deps = require("./manifest-system-deps-KBuTXH-y.js");
2
+ const require_manifest_system_deps = require("./manifest-system-deps-DvY1bY_n.js");
3
3
  const require_custom_action_registry = require("./custom-action-registry-jY0NOZK8.js");
4
4
  let node_path = require("node:path");
5
5
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { A as createUdsLoggerWithControl, Ft as RUNNER_RSS_BUDGET_ENV, Jt as startRunnerHeapWatch, Qt as emitHeapDiagnosticReport, a as createUdsAddonContext, bt as resolveAddonClass, it as setWorkerNativeCapsChangeListener, j as LocalChildClient, n as installManifestPythonDeps, nt as getWorkerNativeCapSnapshot, ot as validateProviderRegistrations, t as installManifestSystemDeps, tt as getWorkerNativeCapProvider, yt as installManifestNativeDeps } from "./manifest-system-deps-BF-C5NDL.mjs";
1
+ import { A as createUdsLoggerWithControl, Ft as RUNNER_RSS_BUDGET_ENV, Jt as startRunnerHeapWatch, Qt as emitHeapDiagnosticReport, a as createUdsAddonContext, bt as resolveAddonClass, it as setWorkerNativeCapsChangeListener, j as LocalChildClient, n as installManifestPythonDeps, nt as getWorkerNativeCapSnapshot, ot as validateProviderRegistrations, t as installManifestSystemDeps, tt as getWorkerNativeCapProvider, yt as installManifestNativeDeps } from "./manifest-system-deps-726RBOX7.mjs";
2
2
  import { t as CustomActionRegistry } from "./custom-action-registry-F__gp_VX.mjs";
3
3
  import { register } from "node:module";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { E as addonPagesCapability, Ft as BaseAddon, Pt as errMsg, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { E as addonPagesCapability, Ft as BaseAddon, Pt as errMsg, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, O as addonWidgetsCapability, Pt as errMsg, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, O as addonWidgetsCapability, Pt as errMsg, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  //#region src/builtins/alerts/prune-policy.ts
8
8
  /**
9
9
  * Ids older than `cutoffMs`, oldest first.
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, k as alertsCapability, n as AlertSchema, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, k as alertsCapability, n as AlertSchema, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/alerts/prune-policy.ts
3
3
  /**
4
4
  * Ids older than `cutoffMs`, oldest first.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let buffer = require("buffer");
9
9
  let node_fs_promises = require("node:fs/promises");
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, j as backupCapability, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, j as backupCapability, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  import { randomBytes, randomUUID } from "node:crypto";
3
3
  import { Buffer as Buffer$1 } from "buffer";
4
4
  import * as fsp from "node:fs/promises";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/console-logging/console-destination.ts
9
9
  var LEVEL_RANK = {
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/console-logging/console-destination.ts
4
4
  var LEVEL_RANK = {
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DNwhsXWi.js");
3
+ const require_dist = require("../../dist-DlL8iWQo.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs_promises = require("node:fs/promises");
6
6
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, I as coreBlockAddonId, L as coreBlockIdFromAddonId, Pt as errMsg, R as coreBlocksCapability, c as CORE_BLOCK_ADDON_PREFIX, d as DeclaredDevices, l as CoreBlockSchema, s as CORE_BLOCKS_ADDON_ID } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, I as coreBlockAddonId, L as coreBlockIdFromAddonId, Pt as errMsg, R as coreBlocksCapability, c as CORE_BLOCK_ADDON_PREFIX, d as DeclaredDevices, l as CoreBlockSchema, s as CORE_BLOCKS_ADDON_ID } from "../../dist-D0_hqbgc.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-CUXClAIQ.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-B5wVSU65.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
10
10
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -1,5 +1,5 @@
1
- import { $t as isDeviceConfigCap, Bt as DeviceRole, Ft as BaseAddon, H as deviceManagerCapability, J as enumerateSchemaFields, P as buildStreamParamsConfigSchema, Pt as errMsg, U as deviceStateCapability, Vt as DeviceType, W as deviceStatusCapability, Wt as WELL_KNOWN_TAB_MAP, a as CAMERA_SWITCH_ORDER, b as STREAM_PROFILE_META, f as DeviceStatusSchema, ft as normalizeUnit, mt as parseStreamParamsFormPatch, o as CAP_NAMES_WITH_STATUS, on as sleep, q as enumerateItemArrayFields, sn as EventCategory, t as ALL_CAPABILITY_DEFINITIONS, xt as runtimeStatePolicyFor, yt as resolveContainerPrimaryChild, zt as DeviceFeature } from "../../dist-C5PkvU4p.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-BZU4lIH7.mjs";
1
+ import { $t as isDeviceConfigCap, Bt as DeviceRole, Ft as BaseAddon, H as deviceManagerCapability, J as enumerateSchemaFields, P as buildStreamParamsConfigSchema, Pt as errMsg, U as deviceStateCapability, Vt as DeviceType, W as deviceStatusCapability, Wt as WELL_KNOWN_TAB_MAP, a as CAMERA_SWITCH_ORDER, b as STREAM_PROFILE_META, f as DeviceStatusSchema, ft as normalizeUnit, mt as parseStreamParamsFormPatch, o as CAP_NAMES_WITH_STATUS, on as sleep, q as enumerateItemArrayFields, sn as EventCategory, t as ALL_CAPABILITY_DEFINITIONS, xt as runtimeStatePolicyFor, yt as resolveContainerPrimaryChild, zt as DeviceFeature } from "../../dist-D0_hqbgc.mjs";
2
+ import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-AE2Qy3Xd.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
5
5
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  //#region src/builtins/doorbell/trigger-engine.ts
8
8
  /**
9
9
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, G as doorbellCapability, Jt as createEvent, M as bareAddonId, Pt as errMsg, Vt as DeviceType, Y as evaluateSensorEdge, _ as SOURCE_CAPS, nt as isSameAddonId, rt as isSourceCap, sn as EventCategory, v as SOURCE_DEVICE_TYPES } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, G as doorbellCapability, Jt as createEvent, M as bareAddonId, Pt as errMsg, Vt as DeviceType, Y as evaluateSensorEdge, _ as SOURCE_CAPS, nt as isSameAddonId, rt as isSourceCap, sn as EventCategory, v as SOURCE_DEVICE_TYPES } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/doorbell/trigger-engine.ts
3
3
  /**
4
4
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
9
9
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
4
4
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DNwhsXWi.js");
3
+ const require_dist = require("../../dist-DlL8iWQo.js");
4
4
  //#region src/builtins/liveness-monitor/liveness-checks.ts
5
5
  var NO_DEVICES = "liveness:no-devices";
6
6
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/liveness-monitor/liveness-checks.ts
3
3
  var NO_DEVICES = "liveness:no-devices";
4
4
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  node_crypto = require_chunk.__toESM(node_crypto);
9
9
  let crypto$1 = require("crypto");
@@ -1,5 +1,5 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
2
- import { A as authProviderCapability, Ft as BaseAddon, T as UserRecordSchema, jt as userManagementCapability, r as ApiKeyRecordSchema, x as ScopedTokenSchema } from "../../dist-C5PkvU4p.mjs";
2
+ import { A as authProviderCapability, Ft as BaseAddon, T as UserRecordSchema, jt as userManagementCapability, r as ApiKeyRecordSchema, x as ScopedTokenSchema } from "../../dist-D0_hqbgc.mjs";
3
3
  import * as crypto$2 from "node:crypto";
4
4
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
5
5
  import nodeCrypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DNwhsXWi.js");
3
+ const require_dist = require("../../dist-DlL8iWQo.js");
4
4
  const require_tls = require("../../tls-BxQlomxd.js");
5
5
  let node_fs_promises = require("node:fs/promises");
6
6
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, sn as EventCategory, st as localNetworkCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, sn as EventCategory, st as localNetworkCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  import { S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, i as writeExtraSans, l as reissueTlsLeaf, n as readTlsAccessStatus, o as validateUploadedTls, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, y as applyLanHttp } from "../../tls-DOTmtLCW.mjs";
3
3
  import { mkdir, writeFile } from "node:fs/promises";
4
4
  import { join } from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  //#region src/builtins/loki-logging/loki-payload.ts
8
8
  /**
9
9
  * Loki rejects a label name that is not a valid Prometheus label
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/loki-logging/loki-payload.ts
3
3
  /**
4
4
  * Loki rejects a label name that is not a valid Prometheus label
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let node_fs_promises = require("node:fs/promises");
8
8
  let node_child_process = require("node:child_process");
9
9
  let node_util = require("node:util");
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, Q as foldSnapshotByFunction, _t as reducePoints, dt as metricsProviderCapability, sn as EventCategory, vt as resolveBucketMs } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, Jt as createEvent, Pt as errMsg, Q as foldSnapshotByFunction, _t as reducePoints, dt as metricsProviderCapability, sn as EventCategory, vt as resolveBucketMs } from "../../dist-D0_hqbgc.mjs";
2
2
  import { readFile, readdir } from "node:fs/promises";
3
3
  import { execFile, execFileSync } from "node:child_process";
4
4
  import { promisify } from "node:util";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Ft as BaseAddon, K as enumerateInferenceDevices, Pt as errMsg, Xt as emitReadiness, ht as platformProbeCapability, sn as EventCategory, wt as scoreRuntimes } from "../../dist-C5PkvU4p.mjs";
2
+ import { Ft as BaseAddon, K as enumerateInferenceDevices, Pt as errMsg, Xt as emitReadiness, ht as platformProbeCapability, sn as EventCategory, wt as scoreRuntimes } from "../../dist-D0_hqbgc.mjs";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import * as fs from "node:fs";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
8
8
  /**
9
9
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, sn as EventCategory } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, sn as EventCategory } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let zod = require("zod");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
@@ -458,6 +458,41 @@ async function renderCourtesyOverlayJpeg(background, spec) {
458
458
  if (bytes.length === 0) throw new Error("courtesy overlay produced no bytes");
459
459
  return bytes;
460
460
  }
461
+ var NativeSnapshotFatigue = class {
462
+ baseMs;
463
+ maxMs;
464
+ entries = /* @__PURE__ */ new Map();
465
+ constructor(options = {}) {
466
+ this.baseMs = options.baseMs ?? 1e4;
467
+ this.maxMs = options.maxMs ?? 3e5;
468
+ }
469
+ /** The instant the rest ends, or `null` when the camera may be dialled now. */
470
+ restingUntil(deviceId, now) {
471
+ const entry = this.entries.get(deviceId);
472
+ if (entry === void 0 || entry.restingUntil <= now) return null;
473
+ return entry.restingUntil;
474
+ }
475
+ /** A dial that did not produce a frame — thrown or answered `null`. */
476
+ recordFailure(deviceId, now) {
477
+ const streak = (this.entries.get(deviceId)?.streak ?? 0) + 1;
478
+ const restMs = Math.min(this.maxMs, this.baseMs * 2 ** (streak - 1));
479
+ this.entries.set(deviceId, {
480
+ streak,
481
+ restingUntil: now + restMs
482
+ });
483
+ return {
484
+ streak,
485
+ restMs
486
+ };
487
+ }
488
+ /** A frame landed: the camera is answering again. */
489
+ recordSuccess(deviceId) {
490
+ this.entries.delete(deviceId);
491
+ }
492
+ forget(deviceId) {
493
+ this.entries.delete(deviceId);
494
+ }
495
+ };
461
496
  //#endregion
462
497
  //#region src/builtins/snapshot/snapshot-link-url.ts
463
498
  /**
@@ -1046,6 +1081,8 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1046
1081
  * that silently left the cache is the reason a later capture had to happen,
1047
1082
  * and per-camera is the only way that question is ever asked.
1048
1083
  */
1084
+ /** Cameras resting after a native miss — see `snapshot-fatigue.ts`. */
1085
+ fatigue = new NativeSnapshotFatigue();
1049
1086
  cache = new SnapshotCache({ onEvict: (deviceId, streamId, reason) => {
1050
1087
  this.ctx.logger.debug("snapshot cache evicted", {
1051
1088
  tags: { deviceId },
@@ -1847,11 +1884,17 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1847
1884
  const now = Date.now();
1848
1885
  let nativeError = null;
1849
1886
  let nativeAbsent = false;
1887
+ const restingUntil = input.force === true ? null : this.fatigue.restingUntil(deviceId, now);
1850
1888
  try {
1851
- const native = this.ctx.getNativeProvider(require_dist.snapshotCapability, deviceId);
1852
- if (native) {
1889
+ const native = restingUntil === null ? this.ctx.getNativeProvider(require_dist.snapshotCapability, deviceId) : null;
1890
+ if (restingUntil !== null) log.info("native snapshot: camera resting after a miss — not dialled", {
1891
+ tags: { deviceId },
1892
+ meta: { restMsLeft: restingUntil - now }
1893
+ });
1894
+ else if (native) {
1853
1895
  const result = await this.nativePool.run(() => native.getSnapshot(input));
1854
1896
  if (result) {
1897
+ this.fatigue.recordSuccess(deviceId);
1855
1898
  this.stateFrames.delete(deviceId);
1856
1899
  this.cache.set(deviceId, effectiveStreamId, {
1857
1900
  data: result,
@@ -1863,7 +1906,14 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1863
1906
  image: result
1864
1907
  };
1865
1908
  }
1866
- log.debug("native snapshot returned null — falling through to broker", { tags: { deviceId } });
1909
+ const rest = this.fatigue.recordFailure(deviceId, now);
1910
+ log.debug("native snapshot returned null — falling through to broker", {
1911
+ tags: { deviceId },
1912
+ meta: {
1913
+ restMs: rest.restMs,
1914
+ streak: rest.streak
1915
+ }
1916
+ });
1867
1917
  } else {
1868
1918
  nativeAbsent = true;
1869
1919
  log.debug("native snapshot provider not resolved — falling through to broker", { tags: { deviceId } });
@@ -1878,9 +1928,14 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1878
1928
  });
1879
1929
  } else {
1880
1930
  nativeError = err;
1931
+ const rest = this.fatigue.recordFailure(deviceId, now);
1881
1932
  log.warn("native snapshot failed", {
1882
1933
  tags: { deviceId },
1883
- meta: { error: msg }
1934
+ meta: {
1935
+ error: msg,
1936
+ restMs: rest.restMs,
1937
+ streak: rest.streak
1938
+ }
1884
1939
  });
1885
1940
  }
1886
1941
  }
@@ -2062,6 +2117,7 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
2062
2117
  */
2063
2118
  evictRemovedDevice(deviceId, reason) {
2064
2119
  this.dropDeviceCaches(deviceId);
2120
+ this.fatigue.forget(deviceId);
2065
2121
  this.ctx.logger.info("snapshot: dropped cache for removed device", {
2066
2122
  tags: { deviceId },
2067
2123
  meta: { reason }
@@ -1,4 +1,4 @@
1
- import { At as streamQualityLabel, Et as snapshotCapability, Ft as BaseAddon, M as bareAddonId, N as batteryCapability, Pt as errMsg, V as deriveBatteryPresence, Vt as DeviceType, en as nodePin, i as BatteryStatusSchema, sn as EventCategory, zt as DeviceFeature } from "../../dist-C5PkvU4p.mjs";
1
+ import { At as streamQualityLabel, Et as snapshotCapability, Ft as BaseAddon, M as bareAddonId, N as batteryCapability, Pt as errMsg, V as deriveBatteryPresence, Vt as DeviceType, en as nodePin, i as BatteryStatusSchema, sn as EventCategory, zt as DeviceFeature } from "../../dist-D0_hqbgc.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
@@ -452,6 +452,41 @@ async function renderCourtesyOverlayJpeg(background, spec) {
452
452
  if (bytes.length === 0) throw new Error("courtesy overlay produced no bytes");
453
453
  return bytes;
454
454
  }
455
+ var NativeSnapshotFatigue = class {
456
+ baseMs;
457
+ maxMs;
458
+ entries = /* @__PURE__ */ new Map();
459
+ constructor(options = {}) {
460
+ this.baseMs = options.baseMs ?? 1e4;
461
+ this.maxMs = options.maxMs ?? 3e5;
462
+ }
463
+ /** The instant the rest ends, or `null` when the camera may be dialled now. */
464
+ restingUntil(deviceId, now) {
465
+ const entry = this.entries.get(deviceId);
466
+ if (entry === void 0 || entry.restingUntil <= now) return null;
467
+ return entry.restingUntil;
468
+ }
469
+ /** A dial that did not produce a frame — thrown or answered `null`. */
470
+ recordFailure(deviceId, now) {
471
+ const streak = (this.entries.get(deviceId)?.streak ?? 0) + 1;
472
+ const restMs = Math.min(this.maxMs, this.baseMs * 2 ** (streak - 1));
473
+ this.entries.set(deviceId, {
474
+ streak,
475
+ restingUntil: now + restMs
476
+ });
477
+ return {
478
+ streak,
479
+ restMs
480
+ };
481
+ }
482
+ /** A frame landed: the camera is answering again. */
483
+ recordSuccess(deviceId) {
484
+ this.entries.delete(deviceId);
485
+ }
486
+ forget(deviceId) {
487
+ this.entries.delete(deviceId);
488
+ }
489
+ };
455
490
  //#endregion
456
491
  //#region src/builtins/snapshot/snapshot-link-url.ts
457
492
  /**
@@ -1040,6 +1075,8 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1040
1075
  * that silently left the cache is the reason a later capture had to happen,
1041
1076
  * and per-camera is the only way that question is ever asked.
1042
1077
  */
1078
+ /** Cameras resting after a native miss — see `snapshot-fatigue.ts`. */
1079
+ fatigue = new NativeSnapshotFatigue();
1043
1080
  cache = new SnapshotCache({ onEvict: (deviceId, streamId, reason) => {
1044
1081
  this.ctx.logger.debug("snapshot cache evicted", {
1045
1082
  tags: { deviceId },
@@ -1841,11 +1878,17 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1841
1878
  const now = Date.now();
1842
1879
  let nativeError = null;
1843
1880
  let nativeAbsent = false;
1881
+ const restingUntil = input.force === true ? null : this.fatigue.restingUntil(deviceId, now);
1844
1882
  try {
1845
- const native = this.ctx.getNativeProvider(snapshotCapability, deviceId);
1846
- if (native) {
1883
+ const native = restingUntil === null ? this.ctx.getNativeProvider(snapshotCapability, deviceId) : null;
1884
+ if (restingUntil !== null) log.info("native snapshot: camera resting after a miss — not dialled", {
1885
+ tags: { deviceId },
1886
+ meta: { restMsLeft: restingUntil - now }
1887
+ });
1888
+ else if (native) {
1847
1889
  const result = await this.nativePool.run(() => native.getSnapshot(input));
1848
1890
  if (result) {
1891
+ this.fatigue.recordSuccess(deviceId);
1849
1892
  this.stateFrames.delete(deviceId);
1850
1893
  this.cache.set(deviceId, effectiveStreamId, {
1851
1894
  data: result,
@@ -1857,7 +1900,14 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1857
1900
  image: result
1858
1901
  };
1859
1902
  }
1860
- log.debug("native snapshot returned null — falling through to broker", { tags: { deviceId } });
1903
+ const rest = this.fatigue.recordFailure(deviceId, now);
1904
+ log.debug("native snapshot returned null — falling through to broker", {
1905
+ tags: { deviceId },
1906
+ meta: {
1907
+ restMs: rest.restMs,
1908
+ streak: rest.streak
1909
+ }
1910
+ });
1861
1911
  } else {
1862
1912
  nativeAbsent = true;
1863
1913
  log.debug("native snapshot provider not resolved — falling through to broker", { tags: { deviceId } });
@@ -1872,9 +1922,14 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1872
1922
  });
1873
1923
  } else {
1874
1924
  nativeError = err;
1925
+ const rest = this.fatigue.recordFailure(deviceId, now);
1875
1926
  log.warn("native snapshot failed", {
1876
1927
  tags: { deviceId },
1877
- meta: { error: msg }
1928
+ meta: {
1929
+ error: msg,
1930
+ restMs: rest.restMs,
1931
+ streak: rest.streak
1932
+ }
1878
1933
  });
1879
1934
  }
1880
1935
  }
@@ -2056,6 +2111,7 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
2056
2111
  */
2057
2112
  evictRemovedDevice(deviceId, reason) {
2058
2113
  this.dropDeviceCaches(deviceId);
2114
+ this.fatigue.forget(deviceId);
2059
2115
  this.ctx.logger.info("snapshot: dropped cache for removed device", {
2060
2116
  tags: { deviceId },
2061
2117
  meta: { reason }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Rest for a camera that could not answer a native snapshot.
3
+ *
4
+ * The wrapper is polled — grids, cards, the media plane — and every miss used
5
+ * to be followed by another ISAPI/CGI dial on the next poll. On a camera that
6
+ * is already struggling ("Videocamera retro casa" answered HTTP 503 to 68
7
+ * native dials in one hour on 2026-09-05) that is the load that keeps it
8
+ * struggling. So a miss earns a rest window during which the native provider
9
+ * is NOT dialled: the request falls through to the stream-broker frame grab
10
+ * and the stale cache, which cost the camera nothing. The window doubles with
11
+ * consecutive misses and is capped; the first frame that lands ends it.
12
+ *
13
+ * Generic on purpose: every vendor's native provider sits behind this one
14
+ * wrapper, so one ledger here covers them all (D62 spirit: one owner).
15
+ * `force` bypasses it — an operator's deliberate wake is never held back.
16
+ */
17
+ export interface NativeSnapshotFatigueOptions {
18
+ /** Rest after the first miss. */
19
+ readonly baseMs?: number;
20
+ /** Longest rest a streak can earn. */
21
+ readonly maxMs?: number;
22
+ }
23
+ export interface FatigueVerdict {
24
+ readonly streak: number;
25
+ readonly restMs: number;
26
+ }
27
+ export declare const NATIVE_SNAPSHOT_REST_BASE_MS = 10000;
28
+ export declare const NATIVE_SNAPSHOT_REST_MAX_MS = 300000;
29
+ export declare class NativeSnapshotFatigue {
30
+ private readonly baseMs;
31
+ private readonly maxMs;
32
+ private readonly entries;
33
+ constructor(options?: NativeSnapshotFatigueOptions);
34
+ /** The instant the rest ends, or `null` when the camera may be dialled now. */
35
+ restingUntil(deviceId: number, now: number): number | null;
36
+ /** A dial that did not produce a frame — thrown or answered `null`. */
37
+ recordFailure(deviceId: number, now: number): FatigueVerdict;
38
+ /** A frame landed: the camera is answering again. */
39
+ recordSuccess(deviceId: number): void;
40
+ forget(deviceId: number): void;
41
+ }
@@ -36,6 +36,8 @@ export declare class SnapshotAddon extends BaseAddon<SnapshotAddonConfig> {
36
36
  * that silently left the cache is the reason a later capture had to happen,
37
37
  * and per-camera is the only way that question is ever asked.
38
38
  */
39
+ /** Cameras resting after a native miss — see `snapshot-fatigue.ts`. */
40
+ private readonly fatigue;
39
41
  private readonly cache;
40
42
  /** Card-sized derivatives of the frames above, keyed by width and validated
41
43
  * against the source frame's timestamp. */
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, Z as filesystemBrowseCapability, kt as storageProviderCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, Z as filesystemBrowseCapability, kt as storageProviderCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_hub_cap_forward = require("../../hub-cap-forward-DmHNjbB0.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { C as StorageLocationTypeSchema, Dt as storageCapability, F as collectSecretConfigKeys, Ft as BaseAddon, Ot as storageMigrationCapability, S as StorageCleanupJobSchema, Tt as settingsStoreCapability, h as REDACTED_SECRET, tn as parseJsonObject, w as StorageMigrationJobSchema } from "../../dist-C5PkvU4p.mjs";
1
+ import { C as StorageLocationTypeSchema, Dt as storageCapability, F as collectSecretConfigKeys, Ft as BaseAddon, Ot as storageMigrationCapability, S as StorageCleanupJobSchema, Tt as settingsStoreCapability, h as REDACTED_SECRET, tn as parseJsonObject, w as StorageMigrationJobSchema } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as HUB_CAP_FWD_ACTION } from "../../hub-cap-forward-BdT320dq.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  //#region src/builtins/system-config/system-config.addon.ts
8
8
  /**
9
9
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, Pt as errMsg, Qt as hydrateSchema } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, Pt as errMsg, Qt as hydrateSchema } from "../../dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/system-config/system-config.addon.ts
3
3
  /**
4
4
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DNwhsXWi.js");
6
+ const require_dist = require("../../dist-DlL8iWQo.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-C5PkvU4p.mjs";
1
+ import { Ft as BaseAddon, ct as logDestinationCapability } from "../../dist-D0_hqbgc.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  import * as path$1 from "node:path";
4
4
  import path from "node:path";
@@ -3676,7 +3676,8 @@ var CameraSwitchAuthoritySchema = z.discriminatedUnion("kind", [
3676
3676
  var CameraSwitchUnavailableReasonSchema = z.enum([
3677
3677
  "no-provider",
3678
3678
  "source-unreachable",
3679
- "not-configured"
3679
+ "not-configured",
3680
+ "device-disabled"
3680
3681
  ]);
3681
3682
  /**
3682
3683
  * One switch, resolved for one camera.
@@ -24352,12 +24353,20 @@ var BatteryStatusSchema = z.object({
24352
24353
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
24353
24354
  * Reolink-specific for the Solar Panel 2 accessory (will become
24354
24355
  * common on other battery cams). `'none'` means running on battery
24355
- * alone.
24356
+ * alone — a NEGATIVE the firmware actually reported.
24357
+ *
24358
+ * `'unknown'` is the absence of an answer: the provider has not read the
24359
+ * power fields yet, or the firmware reported neither. Before it existed,
24360
+ * two unreadable fields produced `'none'`, and a camera nobody had reached
24361
+ * was drawn "on battery alone" — the same D315 defect `percentage` closed
24362
+ * by going nullable. Consumers SKIP it (no charger state published, no
24363
+ * glyph, no HomeKit ChargingState) rather than coerce it either way.
24356
24364
  */
24357
24365
  charging: z.enum([
24358
24366
  "dc",
24359
24367
  "solar",
24360
- "none"
24368
+ "none",
24369
+ "unknown"
24361
24370
  ]),
24362
24371
  /**
24363
24372
  * True when the camera firmware has gone into low-power mode. Battery
@@ -24447,7 +24456,7 @@ onStatusChanged: { data: z.object({
24447
24456
  kind: "push",
24448
24457
  empty: {
24449
24458
  percentage: 0,
24450
- charging: "none",
24459
+ charging: "unknown",
24451
24460
  sleeping: false,
24452
24461
  lastUpdated: 0
24453
24462
  }
@@ -3676,7 +3676,8 @@ var CameraSwitchAuthoritySchema = zod.z.discriminatedUnion("kind", [
3676
3676
  var CameraSwitchUnavailableReasonSchema = zod.z.enum([
3677
3677
  "no-provider",
3678
3678
  "source-unreachable",
3679
- "not-configured"
3679
+ "not-configured",
3680
+ "device-disabled"
3680
3681
  ]);
3681
3682
  /**
3682
3683
  * One switch, resolved for one camera.
@@ -24352,12 +24353,20 @@ var BatteryStatusSchema = zod.z.object({
24352
24353
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
24353
24354
  * Reolink-specific for the Solar Panel 2 accessory (will become
24354
24355
  * common on other battery cams). `'none'` means running on battery
24355
- * alone.
24356
+ * alone — a NEGATIVE the firmware actually reported.
24357
+ *
24358
+ * `'unknown'` is the absence of an answer: the provider has not read the
24359
+ * power fields yet, or the firmware reported neither. Before it existed,
24360
+ * two unreadable fields produced `'none'`, and a camera nobody had reached
24361
+ * was drawn "on battery alone" — the same D315 defect `percentage` closed
24362
+ * by going nullable. Consumers SKIP it (no charger state published, no
24363
+ * glyph, no HomeKit ChargingState) rather than coerce it either way.
24356
24364
  */
24357
24365
  charging: zod.z.enum([
24358
24366
  "dc",
24359
24367
  "solar",
24360
- "none"
24368
+ "none",
24369
+ "unknown"
24361
24370
  ]),
24362
24371
  /**
24363
24372
  * True when the camera firmware has gone into low-power mode. Battery
@@ -24447,7 +24456,7 @@ onStatusChanged: { data: zod.z.object({
24447
24456
  kind: "push",
24448
24457
  empty: {
24449
24458
  percentage: 0,
24450
- charging: "none",
24459
+ charging: "unknown",
24451
24460
  sleeping: false,
24452
24461
  lastUpdated: 0
24453
24462
  }
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-DNwhsXWi.js");
3
+ const require_dist = require("./dist-DlL8iWQo.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_formatter = require("./formatter-DqAKDlvN.js");
@@ -27,7 +27,7 @@ require("./builtins/system-config/index.js");
27
27
  const require_builtins_winston_logging_index = require("./builtins/winston-logging/index.js");
28
28
  const require_file_data_plane = require("./file-data-plane-DO8KbxCe.js");
29
29
  const require_tls$1 = require("./tls-BxQlomxd.js");
30
- const require_manifest_system_deps = require("./manifest-system-deps-KBuTXH-y.js");
30
+ const require_manifest_system_deps = require("./manifest-system-deps-DvY1bY_n.js");
31
31
  const require_resource_monitor = require("./resource-monitor-CdnzxBLP.js");
32
32
  const require_custom_action_registry = require("./custom-action-registry-jY0NOZK8.js");
33
33
  let zod = require("zod");
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { $ as isArrayOutputSchema, Ct as scopesAllowDeviceCap, D as addonSettingsCapability, Gt as asJsonObject$1, Ht as ReadinessRegistry, It as DATAPLANE_SECRET_HEADER$1, Jt as createEvent, Kt as asNumber, Lt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Pt as errMsg$1, Rt as DEVICE_STATUS_METHOD, St as scopesAllowAddon, Ut as ReadinessTimeoutError, X as extractNestedAddonId, Yt as emitDownForOwnedCaps, Zt as expandCapMethods, an as scopeKey, at as kebabToCamel, bt as resolveMethodAuth, et as isCollectionArrayMethod, g as RUNTIME_DEFAULTS, gt as procedureAuthKey, in as resolveCapMount, it as isVoidInput, lt as logLevelAtMost, m as METHOD_ACCESS_MAP, nn as parseJsonUnknown, ot as lifecycleJobSchema, p as LOG_LEVEL_RANK, pt as objectInputDeclaresAddonId, qt as asString$1, rn as readinessKey, sn as EventCategory$1, t as ALL_CAPABILITY_DEFINITIONS, tn as parseJsonObject, tt as isObjectInput, ut as looseSchema } from "./dist-C5PkvU4p.mjs";
2
+ import { $ as isArrayOutputSchema, Ct as scopesAllowDeviceCap, D as addonSettingsCapability, Gt as asJsonObject$1, Ht as ReadinessRegistry, It as DATAPLANE_SECRET_HEADER$1, Jt as createEvent, Kt as asNumber, Lt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Pt as errMsg$1, Rt as DEVICE_STATUS_METHOD, St as scopesAllowAddon, Ut as ReadinessTimeoutError, X as extractNestedAddonId, Yt as emitDownForOwnedCaps, Zt as expandCapMethods, an as scopeKey, at as kebabToCamel, bt as resolveMethodAuth, et as isCollectionArrayMethod, g as RUNTIME_DEFAULTS, gt as procedureAuthKey, in as resolveCapMount, it as isVoidInput, lt as logLevelAtMost, m as METHOD_ACCESS_MAP, nn as parseJsonUnknown, ot as lifecycleJobSchema, p as LOG_LEVEL_RANK, pt as objectInputDeclaresAddonId, qt as asString$1, rn as readinessKey, sn as EventCategory$1, t as ALL_CAPABILITY_DEFINITIONS, tn as parseJsonObject, tt as isObjectInput, ut as looseSchema } from "./dist-D0_hqbgc.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { t as formatLogLine } from "./formatter-B7qW8bPJ.mjs";
@@ -26,7 +26,7 @@ import "./builtins/system-config/index.mjs";
26
26
  import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
27
27
  import { a as parseTokenizedUrl, c as collectModelFiles, d as downloadModel, f as ensureModel, h as isModelDownloaded, i as parseRangeHeader, l as deleteModelFromDisk, m as getModelFilePath, n as contentTypeFor, o as resolveFilePath, p as fetchJson, r as createAuthenticatedFileServer, s as ModelDownloadService, t as createFileDataPlaneHandler, u as downloadFile } from "./file-data-plane-BhKdxJgf.mjs";
28
28
  import { C as registerLanHttpHandler, S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, b as bindPendingLanHttp, c as loadTlsCert, d as collectCertIdentity, f as CA_VALIDITY_DAYS, g as evaluateExistingCert, h as SERVER_AUTH_OID, i as writeExtraSans, l as reissueTlsLeaf, m as MAX_LEAF_VALIDITY_DAYS, n as readTlsAccessStatus, o as validateUploadedTls, p as LEAF_RENEWAL_WINDOW_DAYS, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, u as CA_COMMON_NAME, v as allFamiliesListenHost, x as closeLanHttp, y as applyLanHttp } from "./tls-DOTmtLCW.mjs";
29
- import { $ as buildUdsNativeCapProxy, $t as formatHeapSpaces, A as createUdsLoggerWithControl, At as HUB_MAIN_RSS_BUDGET_MB, B as readMoleculerFanoutMode, Bt as createV8Reclaimer, C as ipcParentLink, Ct as createAddonDataPlaneFacility, D as createUdsEventBus, Dt as HEAP_WATCH_INTERVAL_MS, E as createUdsEventBridge, Et as HEAP_RECLAIM_TRIGGER_MB, F as AGENT_CAP_FWD_SERVICE, Ft as RUNNER_RSS_BUDGET_ENV, G as createLocalTransport, Gt as reclaimIntervalMs, H as PARENT_ROUTED_PROVIDER_ADDON_ID, Ht as hubMainRssBudget, I as CapRouteResolver, It as ZERO_LOOP_DELAY, J as SocketChannel, Jt as startRunnerHeapWatch, K as UdsLocalTransportClient, Kt as shouldReclaim, L as CapRouteError, Lt as buildHeapSample, M as LocalChildRegistry, Mt as RSS_BUDGET_REANNOUNCE_MIN_MS, N as UDS_NO_ROUTE_PREFIX, Nt as RSS_BUDGET_RELEASE_RATIO, O as udsChildLogToWorkerEntry, Ot as HEAP_WATCH_WARN_RATIO, P as AGENT_CAP_FWD_ACTION, Pt as RUNNER_HEAP_WATCH_INTERVAL_MS, Q as buildNativeCapProxy, Qt as emitHeapDiagnosticReport, R as classifyCapRoute, Rt as createDeferredHeapWatchSink, S as buildLinkChain, St as runNpm, T as createParentUnownedCallHandler, Tt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, U as __resetCapUsageRegistryForTests, Ut as nextRssBudgetState, V as CapUsageRegistry, Vt as describeRss, W as getCapUsageRegistry, Wt as parseRssBudgetMb, X as FrameDecoder, Xt as DECISIVE_HEAP_SPACES, Y as localEndpointPath, Yt as strandedMb, Z as encodeFrame, Zt as HEAP_SPACE_REPORT_MIN_MB, _ as AddonDepsManager, _n as createEventPlaneReader, _t as CapabilityUnavailableError, a as createUdsAddonContext, an as createSocketPlaneMeter, at as createAddonService, b as brokerCallForCap, bt as resolveAddonClass, c as getOrInitReadinessRegistryForClient, cn as formatSocketPlane, ct as capActionName, d as clusterEventTopic, dn as recordSocketFrame, dt as capServiceName, en as heapSpaceField, et as createBrokerDeviceManagerApi, f as getBrokerEventBus, fn as sampleSocketDirection, ft as parseCapAction, g as subscribePassthrough, gn as createEventPlaneMeter, gt as CapabilityHandle, h as setNodeEventInterest, hn as EVENT_PLANE_TOP_N, ht as DeviceRegistry, i as createAddonContext, in as SOCKET_PLANE_TOP_N, j as LocalChildClient, jt as HUB_RSS_BUDGET_ENV, k as createUdsLogger, kt as HUB_MAIN_HEAP_WATCH_LABEL, l as setHubConnected, ln as EMPTY_SOCKET_DIRECTION, lt as capActionSuffix, m as registerEventBusService, mn as socketDirectionMessages, mt as serializeTypedArrays, n as installManifestPythonDeps, nn as selectReportedSpaces, o as getWorkerDeviceRegistry, on as createSocketPlaneReader, ot as validateProviderRegistrations, p as getMoleculerEventStats, pn as socketDirectionBytes, pt as deserializeTypedArrays, q as UdsLocalTransportServer, qt as startHeapWatch, r as adaptBrokerToCluster, rn as EMPTY_SOCKET_PLANE_BASELINE, rt as mountNativeCapService, s as getOrInitReadinessRegistry, sn as diffSocketPlane, st as NATIVE_PROVIDER_SERVICE_INFIX, t as installManifestSystemDeps, tn as readHeapSpaces, u as EVENT_TOPIC_PREFIX, un as createSocketDirectionCounters, ut as capBareAction, v as createKernelHwAccel, vn as diffEventPlane, vt as copyBundledNativeModules, w as localProviderLink, wt as HEAP_RECLAIM_MIN_INTERVAL_MS, x as brokerTransportLink, xt as resolveNpmInvocation, y as resolveHwAccel, yn as formatEventPlane, yt as installManifestNativeDeps, z as callWithServiceDiscovery, zt as createLoopDelayMeter } from "./manifest-system-deps-BF-C5NDL.mjs";
29
+ import { $ as buildUdsNativeCapProxy, $t as formatHeapSpaces, A as createUdsLoggerWithControl, At as HUB_MAIN_RSS_BUDGET_MB, B as readMoleculerFanoutMode, Bt as createV8Reclaimer, C as ipcParentLink, Ct as createAddonDataPlaneFacility, D as createUdsEventBus, Dt as HEAP_WATCH_INTERVAL_MS, E as createUdsEventBridge, Et as HEAP_RECLAIM_TRIGGER_MB, F as AGENT_CAP_FWD_SERVICE, Ft as RUNNER_RSS_BUDGET_ENV, G as createLocalTransport, Gt as reclaimIntervalMs, H as PARENT_ROUTED_PROVIDER_ADDON_ID, Ht as hubMainRssBudget, I as CapRouteResolver, It as ZERO_LOOP_DELAY, J as SocketChannel, Jt as startRunnerHeapWatch, K as UdsLocalTransportClient, Kt as shouldReclaim, L as CapRouteError, Lt as buildHeapSample, M as LocalChildRegistry, Mt as RSS_BUDGET_REANNOUNCE_MIN_MS, N as UDS_NO_ROUTE_PREFIX, Nt as RSS_BUDGET_RELEASE_RATIO, O as udsChildLogToWorkerEntry, Ot as HEAP_WATCH_WARN_RATIO, P as AGENT_CAP_FWD_ACTION, Pt as RUNNER_HEAP_WATCH_INTERVAL_MS, Q as buildNativeCapProxy, Qt as emitHeapDiagnosticReport, R as classifyCapRoute, Rt as createDeferredHeapWatchSink, S as buildLinkChain, St as runNpm, T as createParentUnownedCallHandler, Tt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, U as __resetCapUsageRegistryForTests, Ut as nextRssBudgetState, V as CapUsageRegistry, Vt as describeRss, W as getCapUsageRegistry, Wt as parseRssBudgetMb, X as FrameDecoder, Xt as DECISIVE_HEAP_SPACES, Y as localEndpointPath, Yt as strandedMb, Z as encodeFrame, Zt as HEAP_SPACE_REPORT_MIN_MB, _ as AddonDepsManager, _n as createEventPlaneReader, _t as CapabilityUnavailableError, a as createUdsAddonContext, an as createSocketPlaneMeter, at as createAddonService, b as brokerCallForCap, bt as resolveAddonClass, c as getOrInitReadinessRegistryForClient, cn as formatSocketPlane, ct as capActionName, d as clusterEventTopic, dn as recordSocketFrame, dt as capServiceName, en as heapSpaceField, et as createBrokerDeviceManagerApi, f as getBrokerEventBus, fn as sampleSocketDirection, ft as parseCapAction, g as subscribePassthrough, gn as createEventPlaneMeter, gt as CapabilityHandle, h as setNodeEventInterest, hn as EVENT_PLANE_TOP_N, ht as DeviceRegistry, i as createAddonContext, in as SOCKET_PLANE_TOP_N, j as LocalChildClient, jt as HUB_RSS_BUDGET_ENV, k as createUdsLogger, kt as HUB_MAIN_HEAP_WATCH_LABEL, l as setHubConnected, ln as EMPTY_SOCKET_DIRECTION, lt as capActionSuffix, m as registerEventBusService, mn as socketDirectionMessages, mt as serializeTypedArrays, n as installManifestPythonDeps, nn as selectReportedSpaces, o as getWorkerDeviceRegistry, on as createSocketPlaneReader, ot as validateProviderRegistrations, p as getMoleculerEventStats, pn as socketDirectionBytes, pt as deserializeTypedArrays, q as UdsLocalTransportServer, qt as startHeapWatch, r as adaptBrokerToCluster, rn as EMPTY_SOCKET_PLANE_BASELINE, rt as mountNativeCapService, s as getOrInitReadinessRegistry, sn as diffSocketPlane, st as NATIVE_PROVIDER_SERVICE_INFIX, t as installManifestSystemDeps, tn as readHeapSpaces, u as EVENT_TOPIC_PREFIX, un as createSocketDirectionCounters, ut as capBareAction, v as createKernelHwAccel, vn as diffEventPlane, vt as copyBundledNativeModules, w as localProviderLink, wt as HEAP_RECLAIM_MIN_INTERVAL_MS, x as brokerTransportLink, xt as resolveNpmInvocation, y as resolveHwAccel, yn as formatEventPlane, yt as installManifestNativeDeps, z as callWithServiceDiscovery, zt as createLoopDelayMeter } from "./manifest-system-deps-726RBOX7.mjs";
30
30
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-BWmQ5i-o.mjs";
31
31
  import { t as CustomActionRegistry } from "./custom-action-registry-F__gp_VX.mjs";
32
32
  import { z } from "zod";
@@ -1504,7 +1504,8 @@ function createAddonDataPlaneFacility(args) {
1504
1504
  prefix,
1505
1505
  access: entry.access,
1506
1506
  baseUrl,
1507
- secret
1507
+ secret,
1508
+ ...entry.share !== void 0 ? { share: entry.share } : {}
1508
1509
  }));
1509
1510
  args.sink?.set(args.addonId, endpoints);
1510
1511
  };
@@ -1514,7 +1515,8 @@ function createAddonDataPlaneFacility(args) {
1514
1515
  await ensureServer();
1515
1516
  served.set(prefix, {
1516
1517
  access: options.access,
1517
- handler: options.handler
1518
+ handler: options.handler,
1519
+ ...options.share !== void 0 ? { share: options.share } : {}
1518
1520
  });
1519
1521
  publish();
1520
1522
  args.logger.info("data-plane endpoint served", { meta: {
@@ -7551,9 +7553,11 @@ function createParentUnownedCallHandler(deps) {
7551
7553
  }
7552
7554
  throw new Error(`no provider registered for cap "${input.capName}" (resolver miss after boot-window retry; forked-addon provider not yet registered — ${input.method})`);
7553
7555
  }
7554
- deps.logger?.warn?.("routing child unowned cap call via broker fallback", {
7556
+ deps.logger?.debug?.("routing child unowned cap call via the hub-core `$core-caps` bridge", {
7555
7557
  capName: input.capName,
7556
- method: input.method
7558
+ method: input.method,
7559
+ callerAddonId: input.callerAddonId,
7560
+ route: "$core-caps"
7557
7561
  });
7558
7562
  return await brokerCallForCap(deps.broker, input.capName, input.method, input.args);
7559
7563
  } catch (cause) {
@@ -1507,7 +1507,8 @@ function createAddonDataPlaneFacility(args) {
1507
1507
  prefix,
1508
1508
  access: entry.access,
1509
1509
  baseUrl,
1510
- secret
1510
+ secret,
1511
+ ...entry.share !== void 0 ? { share: entry.share } : {}
1511
1512
  }));
1512
1513
  args.sink?.set(args.addonId, endpoints);
1513
1514
  };
@@ -1517,7 +1518,8 @@ function createAddonDataPlaneFacility(args) {
1517
1518
  await ensureServer();
1518
1519
  served.set(prefix, {
1519
1520
  access: options.access,
1520
- handler: options.handler
1521
+ handler: options.handler,
1522
+ ...options.share !== void 0 ? { share: options.share } : {}
1521
1523
  });
1522
1524
  publish();
1523
1525
  args.logger.info("data-plane endpoint served", { meta: {
@@ -7554,9 +7556,11 @@ function createParentUnownedCallHandler(deps) {
7554
7556
  }
7555
7557
  throw new Error(`no provider registered for cap "${input.capName}" (resolver miss after boot-window retry; forked-addon provider not yet registered — ${input.method})`);
7556
7558
  }
7557
- deps.logger?.warn?.("routing child unowned cap call via broker fallback", {
7559
+ deps.logger?.debug?.("routing child unowned cap call via the hub-core `$core-caps` bridge", {
7558
7560
  capName: input.capName,
7559
- method: input.method
7561
+ method: input.method,
7562
+ callerAddonId: input.callerAddonId,
7563
+ route: "$core-caps"
7560
7564
  });
7561
7565
  return await brokerCallForCap(deps.broker, input.capName, input.method, input.args);
7562
7566
  } catch (cause) {
@@ -1,4 +1,4 @@
1
- import { Gt as asJsonObject } from "./dist-C5PkvU4p.mjs";
1
+ import { Gt as asJsonObject } from "./dist-D0_hqbgc.mjs";
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-DNwhsXWi.js");
1
+ const require_dist = require("./dist-DlL8iWQo.js");
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.187",
3
+ "version": "1.2.189",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",