@camstack/system 1.2.9 → 1.2.10

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 (48) hide show
  1. package/dist/addon-runner.js +2 -2
  2. package/dist/addon-runner.mjs +2 -2
  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/device-manager/device-manager.addon.js +1 -1
  14. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  15. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  16. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  17. package/dist/builtins/hub-forwarder/index.js +1 -1
  18. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  19. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  20. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  21. package/dist/builtins/local-network/local-network.addon.js +1 -1
  22. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  23. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  24. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  25. package/dist/builtins/platform-probe/index.js +1 -1
  26. package/dist/builtins/platform-probe/index.mjs +1 -1
  27. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  28. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  29. package/dist/builtins/snapshot/index.js +29 -1
  30. package/dist/builtins/snapshot/index.mjs +29 -1
  31. package/dist/builtins/snapshot/snapshot.addon.d.ts +6 -0
  32. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  33. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  34. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  35. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  36. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  37. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  38. package/dist/builtins/system-config/system-config.addon.js +1 -1
  39. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  40. package/dist/builtins/winston-logging/index.js +1 -1
  41. package/dist/builtins/winston-logging/index.mjs +1 -1
  42. package/dist/{dist-SI-yNpKE.js → dist-BQOCTD5b.js} +6 -0
  43. package/dist/{dist-CVCNYn7D.mjs → dist-DpKeSZel.mjs} +1 -1
  44. package/dist/index.js +2 -2
  45. package/dist/index.mjs +2 -2
  46. package/dist/{manifest-python-deps-CEwMAaKZ.js → manifest-python-deps-1I7WdPDD.js} +1 -1
  47. package/dist/{manifest-python-deps-DyEweBkB.mjs → manifest-python-deps-I2MGvDvo.mjs} +1 -1
  48. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-SI-yNpKE.js");
3
- const require_manifest_python_deps = require("./manifest-python-deps-CEwMAaKZ.js");
2
+ const require_dist = require("./dist-BQOCTD5b.js");
3
+ const require_manifest_python_deps = require("./manifest-python-deps-1I7WdPDD.js");
4
4
  const require_custom_action_registry = require("./custom-action-registry-jY0NOZK8.js");
5
5
  let node_fs = require("node:fs");
6
6
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,5 +1,5 @@
1
- import { M as isCollectionArrayMethod, t as ALL_CAPABILITY_DEFINITIONS } from "./dist-CVCNYn7D.mjs";
2
- import { Ct as resolveAddonClass, I as createUdsLoggerWithControl, L as LocalChildClient, at as setWorkerNativeCapsChangeListener, bt as installManifestNativeDeps, i as createUdsAddonContext, nt as getWorkerNativeCapProvider, rt as getWorkerNativeCapSnapshot, st as validateProviderRegistrations, t as installManifestPythonDeps } from "./manifest-python-deps-DyEweBkB.mjs";
1
+ import { N as isCollectionArrayMethod, t as ALL_CAPABILITY_DEFINITIONS } from "./dist-DpKeSZel.mjs";
2
+ import { Ct as resolveAddonClass, I as createUdsLoggerWithControl, L as LocalChildClient, at as setWorkerNativeCapsChangeListener, bt as installManifestNativeDeps, i as createUdsAddonContext, nt as getWorkerNativeCapProvider, rt as getWorkerNativeCapSnapshot, st as validateProviderRegistrations, t as installManifestPythonDeps } from "./manifest-python-deps-I2MGvDvo.mjs";
3
3
  import { t as CustomActionRegistry } from "./custom-action-registry-F__gp_VX.mjs";
4
4
  import { register } from "node:module";
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
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, at as BaseAddon, f as addonPagesCapability, it as errMsg } from "../../dist-CVCNYn7D.mjs";
1
+ import { at as errMsg, jt as EventCategory, ot as BaseAddon, p as addonPagesCapability } from "../../dist-DpKeSZel.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import * as fs from "node:fs";
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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, at as BaseAddon, it as errMsg, m as addonWidgetsCapability } from "../../dist-CVCNYn7D.mjs";
1
+ import { at as errMsg, h as addonWidgetsCapability, jt as EventCategory, ot as BaseAddon } from "../../dist-DpKeSZel.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import * as fs from "node:fs";
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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  //#region src/builtins/alerts/alerts.addon.ts
8
8
  var CATEGORY_MAPPINGS = {
9
9
  "addon.crashed": {
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, at as BaseAddon, h as alertsCapability, it as errMsg, n as AlertSchema, vt as createEvent } from "../../dist-CVCNYn7D.mjs";
1
+ import { at as errMsg, g as alertsCapability, jt as EventCategory, n as AlertSchema, ot as BaseAddon, yt as createEvent } from "../../dist-DpKeSZel.mjs";
2
2
  //#region src/builtins/alerts/alerts.addon.ts
3
3
  var CATEGORY_MAPPINGS = {
4
4
  "addon.crashed": {
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_fs$1 = require_chunk.__toESM(node_fs, 1);
9
9
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, at as BaseAddon, v as backupCapability } from "../../dist-CVCNYn7D.mjs";
1
+ import { jt as EventCategory, ot as BaseAddon, y as backupCapability } from "../../dist-DpKeSZel.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import Kt from "node:fs";
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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { R as logDestinationCapability, at as BaseAddon } from "../../dist-CVCNYn7D.mjs";
1
+ import { ot as BaseAddon, z as logDestinationCapability } from "../../dist-DpKeSZel.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 = {
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let _camstack_types_node = require("@camstack/types/node");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { A as getByPath, At as EventCategory, Ct as isDeviceConfigCap, D as evaluateLinkExpression, E as enumerateSchemaFields, H as normalizeUnit, S as deviceStatusCapability, T as enumerateItemArrayFields, W as parseStreamParamsFormPatch, Y as setByPath, a as DeviceStatusSchema, at as BaseAddon, b as deviceManagerCapability, c as STREAM_PROFILE_META, dt as DeviceType, g as applyTransform, i as CAP_NAMES_WITH_STATUS, it as errMsg, kt as sleep, lt as DeviceFeature, mt as WELL_KNOWN_TAB_MAP, rt as validateExpressionSource, t as ALL_CAPABILITY_DEFINITIONS, tt as toExpressionValue, ut as DeviceRole, x as deviceStateCapability, y as buildStreamParamsConfigSchema } from "../../dist-CVCNYn7D.mjs";
1
+ import { At as sleep, C as deviceStatusCapability, D as enumerateSchemaFields, E as enumerateItemArrayFields, G as parseStreamParamsFormPatch, O as evaluateLinkExpression, S as deviceStateCapability, U as normalizeUnit, X as setByPath, _ as applyTransform, a as CAP_NAMES_WITH_STATUS, at as errMsg, b as buildStreamParamsConfigSchema, dt as DeviceRole, ft as DeviceType, ht as WELL_KNOWN_TAB_MAP, it as validateExpressionSource, j as getByPath, jt as EventCategory, l as STREAM_PROFILE_META, nt as toExpressionValue, o as DeviceStatusSchema, ot as BaseAddon, t as ALL_CAPABILITY_DEFINITIONS, ut as DeviceFeature, wt as isDeviceConfigCap, x as deviceManagerCapability } from "../../dist-DpKeSZel.mjs";
2
2
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { At as EventCategory, C as doorbellCapability, at as BaseAddon, dt as DeviceType, it as errMsg, vt as createEvent } from "../../dist-CVCNYn7D.mjs";
1
+ import { at as errMsg, ft as DeviceType, jt as EventCategory, ot as BaseAddon, w as doorbellCapability, yt as createEvent } from "../../dist-DpKeSZel.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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { R as logDestinationCapability, at as BaseAddon } from "../../dist-CVCNYn7D.mjs";
1
+ import { ot as BaseAddon, z as logDestinationCapability } from "../../dist-DpKeSZel.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;
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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,4 +1,4 @@
1
- import { _ as authProviderCapability, at as BaseAddon, d as UserRecordSchema, l as ScopedTokenSchema, nt as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-CVCNYn7D.mjs";
1
+ import { f as UserRecordSchema, ot as BaseAddon, r as ApiKeyRecordSchema, rt as userManagementCapability, u as ScopedTokenSchema, v as authProviderCapability } from "../../dist-DpKeSZel.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as crypto$1 from "node:crypto";
4
4
  import { randomUUID } from "node: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-SI-yNpKE.js");
3
+ const require_dist = require("../../dist-BQOCTD5b.js");
4
4
  let node_os = require("node:os");
5
5
  node_os = require_chunk.__toESM(node_os);
6
6
  //#region src/builtins/local-network/local-network.addon.ts
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, L as localNetworkCapability, at as BaseAddon } from "../../dist-CVCNYn7D.mjs";
1
+ import { R as localNetworkCapability, jt as EventCategory, ot as BaseAddon } from "../../dist-DpKeSZel.mjs";
2
2
  import * as os from "node:os";
3
3
  //#region src/builtins/local-network/local-network.addon.ts
4
4
  /**
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_chunk.__toESM(node_fs);
9
9
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, B as metricsProviderCapability, at as BaseAddon, vt as createEvent } from "../../dist-CVCNYn7D.mjs";
1
+ import { V as metricsProviderCapability, jt as EventCategory, ot as BaseAddon, yt as createEvent } from "../../dist-DpKeSZel.mjs";
2
2
  import * as fs from "node:fs";
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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_chunk.__toESM(node_fs);
9
9
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, G as platformProbeCapability, J as scoreRuntimes, at as BaseAddon, bt as emitReadiness, it as errMsg, w as enumerateInferenceDevices } from "../../dist-CVCNYn7D.mjs";
1
+ import { K as platformProbeCapability, T as enumerateInferenceDevices, Y as scoreRuntimes, at as errMsg, jt as EventCategory, ot as BaseAddon, xt as emitReadiness } from "../../dist-DpKeSZel.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } 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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { At as EventCategory, at as BaseAddon } from "../../dist-CVCNYn7D.mjs";
1
+ import { jt as EventCategory, ot as BaseAddon } from "../../dist-DpKeSZel.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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  //#region src/builtins/snapshot/snapshot-coalescing.ts
9
9
  /**
@@ -485,6 +485,16 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
485
485
  });
486
486
  return hit ? hit.data : null;
487
487
  }
488
+ if (!force && isBatteryDevice && await this.isDeviceSleeping(deviceId)) {
489
+ log.debug("snapshot: sleeping battery cam and no force — serving cache, not capturing", {
490
+ tags: { deviceId },
491
+ meta: {
492
+ hasCache: hit !== void 0,
493
+ ageMs: hit ? now - hit.ts : null
494
+ }
495
+ });
496
+ return hit ? hit.data : null;
497
+ }
488
498
  const flightKey = `${deviceId}:${effectiveStreamId ?? "auto"}`;
489
499
  const flight = this.captureFlight.run(flightKey, () => this.captureFresh({
490
500
  deviceId,
@@ -755,7 +765,25 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
755
765
  * missing, RPC timeout) is swallowed and treated as "awake" — we'd
756
766
  * rather pay a wake-up than strand the caller on a cache that's
757
767
  * semantically stale. Debug-logged for observability.
768
+ *
769
+ * Cheap: a battery provider serves this from its runtime-state slice,
770
+ * so the probe costs one RPC and zero camera traffic. Only consulted
771
+ * on the path that would otherwise CAPTURE — a fresh cache hit
772
+ * returns before we get here.
758
773
  */
774
+ async isDeviceSleeping(deviceId) {
775
+ try {
776
+ const raw = await this.ctx.api.battery.getStatus.query({ deviceId });
777
+ const parsed = require_dist.BatteryStatusSchema.safeParse(raw);
778
+ return parsed.success && parsed.data.sleeping;
779
+ } catch (err) {
780
+ this.ctx.logger.debug("snapshot: battery sleep probe failed — assuming awake", {
781
+ tags: { deviceId },
782
+ meta: { error: require_dist.errMsg(err) }
783
+ });
784
+ return false;
785
+ }
786
+ }
759
787
  /**
760
788
  * True when at least one of the device's brokers is actively
761
789
  * streaming (status === 'streaming'). Used by the battery-cam guard
@@ -1,4 +1,4 @@
1
- import { V as nodePin, Z as snapshotCapability, at as BaseAddon, dt as DeviceType, et as streamQualityLabel, it as errMsg, lt as DeviceFeature } from "../../dist-CVCNYn7D.mjs";
1
+ import { H as nodePin, Q as snapshotCapability, at as errMsg, ft as DeviceType, i as BatteryStatusSchema, ot as BaseAddon, tt as streamQualityLabel, ut as DeviceFeature } from "../../dist-DpKeSZel.mjs";
2
2
  import { execFile } from "node:child_process";
3
3
  //#region src/builtins/snapshot/snapshot-coalescing.ts
4
4
  /**
@@ -480,6 +480,16 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
480
480
  });
481
481
  return hit ? hit.data : null;
482
482
  }
483
+ if (!force && isBatteryDevice && await this.isDeviceSleeping(deviceId)) {
484
+ log.debug("snapshot: sleeping battery cam and no force — serving cache, not capturing", {
485
+ tags: { deviceId },
486
+ meta: {
487
+ hasCache: hit !== void 0,
488
+ ageMs: hit ? now - hit.ts : null
489
+ }
490
+ });
491
+ return hit ? hit.data : null;
492
+ }
483
493
  const flightKey = `${deviceId}:${effectiveStreamId ?? "auto"}`;
484
494
  const flight = this.captureFlight.run(flightKey, () => this.captureFresh({
485
495
  deviceId,
@@ -750,7 +760,25 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
750
760
  * missing, RPC timeout) is swallowed and treated as "awake" — we'd
751
761
  * rather pay a wake-up than strand the caller on a cache that's
752
762
  * semantically stale. Debug-logged for observability.
763
+ *
764
+ * Cheap: a battery provider serves this from its runtime-state slice,
765
+ * so the probe costs one RPC and zero camera traffic. Only consulted
766
+ * on the path that would otherwise CAPTURE — a fresh cache hit
767
+ * returns before we get here.
753
768
  */
769
+ async isDeviceSleeping(deviceId) {
770
+ try {
771
+ const raw = await this.ctx.api.battery.getStatus.query({ deviceId });
772
+ const parsed = BatteryStatusSchema.safeParse(raw);
773
+ return parsed.success && parsed.data.sleeping;
774
+ } catch (err) {
775
+ this.ctx.logger.debug("snapshot: battery sleep probe failed — assuming awake", {
776
+ tags: { deviceId },
777
+ meta: { error: errMsg(err) }
778
+ });
779
+ return false;
780
+ }
781
+ }
754
782
  /**
755
783
  * True when at least one of the device's brokers is actively
756
784
  * streaming (status === 'streaming'). Used by the battery-cam guard
@@ -176,7 +176,13 @@ export declare class SnapshotAddon extends BaseAddon<SnapshotAddonConfig> {
176
176
  * missing, RPC timeout) is swallowed and treated as "awake" — we'd
177
177
  * rather pay a wake-up than strand the caller on a cache that's
178
178
  * semantically stale. Debug-logged for observability.
179
+ *
180
+ * Cheap: a battery provider serves this from its runtime-state slice,
181
+ * so the probe costs one RPC and zero camera traffic. Only consulted
182
+ * on the path that would otherwise CAPTURE — a fresh cache hit
183
+ * returns before we get here.
179
184
  */
185
+ private isDeviceSleeping;
180
186
  /**
181
187
  * True when at least one of the device's brokers is actively
182
188
  * streaming (status === 'streaming'). Used by the battery-cam guard
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_chunk.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $ as storageProviderCapability, at as BaseAddon, k as filesystemBrowseCapability } from "../../dist-CVCNYn7D.mjs";
1
+ import { A as filesystemBrowseCapability, et as storageProviderCapability, ot as BaseAddon } from "../../dist-DpKeSZel.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import * as path$1 from "node:path";
4
4
  import { basename, dirname, join, resolve, sep } 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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let better_sqlite3 = require("better-sqlite3");
9
9
  better_sqlite3 = require_chunk.__toESM(better_sqlite3);
@@ -1,4 +1,4 @@
1
- import { Tt as parseJsonUnknown, X as settingsStoreCapability, at as BaseAddon, ht as asJsonObject, it as errMsg, s as RUNTIME_DEFAULTS } from "../../dist-CVCNYn7D.mjs";
1
+ import { Et as parseJsonUnknown, Z as settingsStoreCapability, at as errMsg, c as RUNTIME_DEFAULTS, gt as asJsonObject, ot as BaseAddon } from "../../dist-DpKeSZel.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import Database from "better-sqlite3";
4
4
  //#region src/builtins/sqlite-storage/sqlite-settings-backend.ts
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.js");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_chunk.__toESM(node_path);
9
9
  let node_fs_promises = require("node:fs/promises");
@@ -1,4 +1,4 @@
1
- import { Q as storageCapability, at as BaseAddon, u as StorageLocationTypeSchema, wt as parseJsonObject } from "../../dist-CVCNYn7D.mjs";
1
+ import { $ as storageCapability, Tt as parseJsonObject, d as StorageLocationTypeSchema, ot as BaseAddon } from "../../dist-DpKeSZel.mjs";
2
2
  import * as path$1 from "node:path";
3
3
  import * as fs from "node:fs/promises";
4
4
  import { buildStorageLocationRegistry } from "@camstack/system";
@@ -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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { St as hydrateSchema, at as BaseAddon, it as errMsg } from "../../dist-CVCNYn7D.mjs";
1
+ import { Ct as hydrateSchema, at as errMsg, ot as BaseAddon } from "../../dist-DpKeSZel.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-SI-yNpKE.js");
6
+ const require_dist = require("../../dist-BQOCTD5b.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 { R as logDestinationCapability, at as BaseAddon } from "../../dist-CVCNYn7D.mjs";
1
+ import { ot as BaseAddon, z as logDestinationCapability } from "../../dist-DpKeSZel.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";
@@ -28213,6 +28213,12 @@ Object.defineProperty(exports, "BaseAddon", {
28213
28213
  return BaseAddon;
28214
28214
  }
28215
28215
  });
28216
+ Object.defineProperty(exports, "BatteryStatusSchema", {
28217
+ enumerable: true,
28218
+ get: function() {
28219
+ return BatteryStatusSchema;
28220
+ }
28221
+ });
28216
28222
  Object.defineProperty(exports, "CAP_NAMES_WITH_STATUS", {
28217
28223
  enumerable: true,
28218
28224
  get: function() {
@@ -28189,4 +28189,4 @@ function enumerateInferenceDevices(hw) {
28189
28189
  return out;
28190
28190
  }
28191
28191
  //#endregion
28192
- export { storageProviderCapability as $, getByPath as A, EventCategory as At, metricsProviderCapability as B, doorbellCapability as C, isDeviceConfigCap as Ct, evaluateLinkExpression as D, resolveCapMount as Dt, enumerateSchemaFields as E, readinessKey as Et, kebabToCamel as F, platformProbeCapability as G, normalizeUnit as H, lifecycleJobSchema as I, scoreRuntimes as J, procedureAuthKey as K, localNetworkCapability as L, isCollectionArrayMethod as M, isObjectInput as N, extractNestedAddonId as O, scopeKey as Ot, isVoidInput as P, storageCapability as Q, logDestinationCapability as R, deviceStatusCapability as S, hydrateSchema as St, enumerateItemArrayFields as T, parseJsonUnknown as Tt, objectInputDeclaresAddonId as U, nodePin as V, parseStreamParamsFormPatch as W, settingsStoreCapability as X, setByPath as Y, snapshotCapability as Z, authProviderCapability as _, asString as _t, DeviceStatusSchema as a, BaseAddon as at, deviceManagerCapability as b, emitReadiness as bt, STREAM_PROFILE_META as c, DEVICE_STATUS_METHOD as ct, UserRecordSchema as d, DeviceType as dt, streamQualityLabel as et, addonPagesCapability as f, ReadinessRegistry as ft, applyTransform as g, asNumber as gt, alertsCapability as h, asJsonObject as ht, CAP_NAMES_WITH_STATUS as i, errMsg as it, isArrayOutputSchema as j, filesystemBrowseCapability as k, sleep as kt, ScopedTokenSchema as l, DeviceFeature as lt, addonWidgetsCapability as m, WELL_KNOWN_TAB_MAP as mt, AlertSchema as n, userManagementCapability as nt, METHOD_ACCESS_MAP as o, DATAPLANE_SECRET_HEADER as ot, addonSettingsCapability as p, ReadinessTimeoutError as pt, readNodePin as q, ApiKeyRecordSchema as r, validateExpressionSource as rt, RUNTIME_DEFAULTS as s, DEVICE_SETTINGS_CONTRIBUTION_METHODS as st, ALL_CAPABILITY_DEFINITIONS as t, toExpressionValue as tt, StorageLocationTypeSchema as u, DeviceRole as ut, backupCapability as v, createEvent as vt, enumerateInferenceDevices as w, parseJsonObject as wt, deviceStateCapability as x, expandCapMethods as xt, buildStreamParamsConfigSchema as y, emitDownForOwnedCaps as yt, looseSchema as z };
28192
+ export { storageCapability as $, filesystemBrowseCapability as A, sleep as At, looseSchema as B, deviceStatusCapability as C, hydrateSchema as Ct, enumerateSchemaFields as D, readinessKey as Dt, enumerateItemArrayFields as E, parseJsonUnknown as Et, isVoidInput as F, parseStreamParamsFormPatch as G, nodePin as H, kebabToCamel as I, readNodePin as J, platformProbeCapability as K, lifecycleJobSchema as L, isArrayOutputSchema as M, isCollectionArrayMethod as N, evaluateLinkExpression as O, resolveCapMount as Ot, isObjectInput as P, snapshotCapability as Q, localNetworkCapability as R, deviceStateCapability as S, expandCapMethods as St, enumerateInferenceDevices as T, parseJsonObject as Tt, normalizeUnit as U, metricsProviderCapability as V, objectInputDeclaresAddonId as W, setByPath as X, scoreRuntimes as Y, settingsStoreCapability as Z, applyTransform as _, asNumber as _t, CAP_NAMES_WITH_STATUS as a, errMsg as at, buildStreamParamsConfigSchema as b, emitDownForOwnedCaps as bt, RUNTIME_DEFAULTS as c, DEVICE_SETTINGS_CONTRIBUTION_METHODS as ct, StorageLocationTypeSchema as d, DeviceRole as dt, storageProviderCapability as et, UserRecordSchema as f, DeviceType as ft, alertsCapability as g, asJsonObject as gt, addonWidgetsCapability as h, WELL_KNOWN_TAB_MAP as ht, BatteryStatusSchema as i, validateExpressionSource as it, getByPath as j, EventCategory as jt, extractNestedAddonId as k, scopeKey as kt, STREAM_PROFILE_META as l, DEVICE_STATUS_METHOD as lt, addonSettingsCapability as m, ReadinessTimeoutError as mt, AlertSchema as n, toExpressionValue as nt, DeviceStatusSchema as o, BaseAddon as ot, addonPagesCapability as p, ReadinessRegistry as pt, procedureAuthKey as q, ApiKeyRecordSchema as r, userManagementCapability as rt, METHOD_ACCESS_MAP as s, DATAPLANE_SECRET_HEADER as st, ALL_CAPABILITY_DEFINITIONS as t, streamQualityLabel as tt, ScopedTokenSchema as u, DeviceFeature as ut, authProviderCapability as v, asString as vt, doorbellCapability as w, isDeviceConfigCap as wt, deviceManagerCapability as x, emitReadiness as xt, backupCapability as y, createEvent as yt, logDestinationCapability as z };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-SI-yNpKE.js");
3
+ const require_dist = require("./dist-BQOCTD5b.js");
4
4
  const require_model_download_service = require("./model-download-service-hf0ookyy.js");
5
- const require_manifest_python_deps = require("./manifest-python-deps-CEwMAaKZ.js");
5
+ const require_manifest_python_deps = require("./manifest-python-deps-1I7WdPDD.js");
6
6
  const require_resource_monitor = require("./resource-monitor-DNNomR-i.js");
7
7
  const require_builtins_sqlite_storage_filesystem_storage_addon = require("./builtins/sqlite-storage/filesystem-storage.addon.js");
8
8
  const require_builtins_sqlite_storage_sqlite_settings_addon = require("./builtins/sqlite-storage/sqlite-settings.addon.js");
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { At as EventCategory$1, Dt as resolveCapMount, Et as readinessKey, F as kebabToCamel, I as lifecycleJobSchema, K as procedureAuthKey, M as isCollectionArrayMethod, N as isObjectInput, O as extractNestedAddonId, Ot as scopeKey, P as isVoidInput, Tt as parseJsonUnknown$1, U as objectInputDeclaresAddonId, _t as asString$1, ct as DEVICE_STATUS_METHOD, ft as ReadinessRegistry, gt as asNumber, ht as asJsonObject$1, it as errMsg$1, j as isArrayOutputSchema, o as METHOD_ACCESS_MAP, ot as DATAPLANE_SECRET_HEADER$1, p as addonSettingsCapability, pt as ReadinessTimeoutError, s as RUNTIME_DEFAULTS, st as DEVICE_SETTINGS_CONTRIBUTION_METHODS, t as ALL_CAPABILITY_DEFINITIONS, vt as createEvent, wt as parseJsonObject, xt as expandCapMethods, yt as emitDownForOwnedCaps, z as looseSchema } from "./dist-CVCNYn7D.mjs";
1
+ import { B as looseSchema, Dt as readinessKey, Et as parseJsonUnknown$1, F as isVoidInput, I as kebabToCamel, L as lifecycleJobSchema, M as isArrayOutputSchema, N as isCollectionArrayMethod, Ot as resolveCapMount, P as isObjectInput, St as expandCapMethods, Tt as parseJsonObject, W as objectInputDeclaresAddonId, _t as asNumber, at as errMsg$1, bt as emitDownForOwnedCaps, c as RUNTIME_DEFAULTS, ct as DEVICE_SETTINGS_CONTRIBUTION_METHODS, gt as asJsonObject$1, jt as EventCategory$1, k as extractNestedAddonId, kt as scopeKey, lt as DEVICE_STATUS_METHOD, m as addonSettingsCapability, mt as ReadinessTimeoutError, pt as ReadinessRegistry, q as procedureAuthKey, s as METHOD_ACCESS_MAP, st as DATAPLANE_SECRET_HEADER$1, t as ALL_CAPABILITY_DEFINITIONS, vt as asString$1, yt as createEvent } from "./dist-DpKeSZel.mjs";
2
2
  import { a as downloadModel, c as getModelFilePath, d as contentTypeFor, f as createAuthenticatedFileServer, h as resolveFilePath, i as downloadFile, l as isModelDownloaded, m as parseTokenizedUrl, n as collectModelFiles, o as ensureModel, p as parseRangeHeader, r as deleteModelFromDisk, s as fetchJson, t as ModelDownloadService, u as createFileDataPlaneHandler } from "./model-download-service-Cp9f4dk6.mjs";
3
- import { $ as buildNativeCapProxy, A as createHubCapForwardService, B as AGENT_CAP_FWD_ACTION, C as brokerTransportLink, Ct as resolveAddonClass, D as localProviderLink, E as ipcParentLink, F as createUdsLogger, G as callWithServiceDiscovery, H as CapRouteResolver, I as createUdsLoggerWithControl, J as UdsLocalTransportServer, K as createLocalTransport, L as LocalChildClient, M as createUdsEventBridge, N as createUdsEventBus, O as HUB_CAP_FWD_ACTION, P as udsChildLogToWorkerEntry, Q as encodeFrame, R as LocalChildRegistry, S as brokerCallForCap, St as runNpm, T as ipcChildLink, U as CapRouteError, V as AGENT_CAP_FWD_SERVICE, W as classifyCapRoute, X as localEndpointPath, Y as SocketChannel, Z as FrameDecoder, _ as createKernelHwAccel, _t as CapabilityHandle, a as getWorkerDeviceRegistry, b as __resetCapUsageRegistryForTests, bt as installManifestNativeDeps, c as setHubConnected, ct as NATIVE_PROVIDER_SERVICE_INFIX, d as getBrokerEventBus, dt as capBareAction, et as buildUdsNativeCapProxy, f as getMoleculerEventStats, ft as capServiceName, g as AddonDepsManager, gt as DeviceRegistry, h as subscribePassthrough, ht as serializeTypedArrays, i as createUdsAddonContext, it as mountNativeCapService, j as createParentUnownedCallHandler, k as HUB_CAP_FWD_SERVICE, l as EVENT_TOPIC_PREFIX, lt as capActionName, m as setNodeEventInterest, mt as deserializeTypedArrays, n as adaptBrokerToCluster, o as getOrInitReadinessRegistry, ot as createAddonService, p as registerEventBusService, pt as parseCapAction, q as UdsLocalTransportClient, r as createAddonContext, s as getOrInitReadinessRegistryForClient, st as validateProviderRegistrations, t as installManifestPythonDeps, tt as createBrokerDeviceManagerApi, u as clusterEventTopic, ut as capActionSuffix, v as resolveHwAccel, vt as CapabilityUnavailableError, w as buildLinkChain, wt as createAddonDataPlaneFacility, x as getCapUsageRegistry, xt as resolveNpmInvocation, y as CapUsageRegistry, yt as copyBundledNativeModules, z as UDS_NO_ROUTE_PREFIX } from "./manifest-python-deps-DyEweBkB.mjs";
3
+ import { $ as buildNativeCapProxy, A as createHubCapForwardService, B as AGENT_CAP_FWD_ACTION, C as brokerTransportLink, Ct as resolveAddonClass, D as localProviderLink, E as ipcParentLink, F as createUdsLogger, G as callWithServiceDiscovery, H as CapRouteResolver, I as createUdsLoggerWithControl, J as UdsLocalTransportServer, K as createLocalTransport, L as LocalChildClient, M as createUdsEventBridge, N as createUdsEventBus, O as HUB_CAP_FWD_ACTION, P as udsChildLogToWorkerEntry, Q as encodeFrame, R as LocalChildRegistry, S as brokerCallForCap, St as runNpm, T as ipcChildLink, U as CapRouteError, V as AGENT_CAP_FWD_SERVICE, W as classifyCapRoute, X as localEndpointPath, Y as SocketChannel, Z as FrameDecoder, _ as createKernelHwAccel, _t as CapabilityHandle, a as getWorkerDeviceRegistry, b as __resetCapUsageRegistryForTests, bt as installManifestNativeDeps, c as setHubConnected, ct as NATIVE_PROVIDER_SERVICE_INFIX, d as getBrokerEventBus, dt as capBareAction, et as buildUdsNativeCapProxy, f as getMoleculerEventStats, ft as capServiceName, g as AddonDepsManager, gt as DeviceRegistry, h as subscribePassthrough, ht as serializeTypedArrays, i as createUdsAddonContext, it as mountNativeCapService, j as createParentUnownedCallHandler, k as HUB_CAP_FWD_SERVICE, l as EVENT_TOPIC_PREFIX, lt as capActionName, m as setNodeEventInterest, mt as deserializeTypedArrays, n as adaptBrokerToCluster, o as getOrInitReadinessRegistry, ot as createAddonService, p as registerEventBusService, pt as parseCapAction, q as UdsLocalTransportClient, r as createAddonContext, s as getOrInitReadinessRegistryForClient, st as validateProviderRegistrations, t as installManifestPythonDeps, tt as createBrokerDeviceManagerApi, u as clusterEventTopic, ut as capActionSuffix, v as resolveHwAccel, vt as CapabilityUnavailableError, w as buildLinkChain, wt as createAddonDataPlaneFacility, x as getCapUsageRegistry, xt as resolveNpmInvocation, y as CapUsageRegistry, yt as copyBundledNativeModules, z as UDS_NO_ROUTE_PREFIX } from "./manifest-python-deps-I2MGvDvo.mjs";
4
4
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-Le3l0qS2.mjs";
5
5
  import { FilesystemStorageAddon, t as FilesystemStorageProvider } from "./builtins/sqlite-storage/filesystem-storage.addon.mjs";
6
6
  import { SqliteSettingsAddon, t as SqliteSettingsBackend } from "./builtins/sqlite-storage/sqlite-settings.addon.mjs";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-SI-yNpKE.js");
2
+ const require_dist = require("./dist-BQOCTD5b.js");
3
3
  let _camstack_types_node = require("@camstack/types/node");
4
4
  let node_http = require("node:http");
5
5
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { q as readNodePin } from "./dist-CVCNYn7D.mjs";
1
+ import { J as readNodePin } from "./dist-DpKeSZel.mjs";
2
2
  import { ensureBinary, ensureFfmpeg, ensurePython, installPythonPackages, installPythonRequirements } from "@camstack/types/node";
3
3
  import { createServer } from "node:http";
4
4
  import * as fs from "node:fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.9",
3
+ "version": "1.2.10",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",