@camstack/system 1.2.74 → 1.2.76

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 (49) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  8. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  9. package/dist/builtins/console-logging/index.js +1 -1
  10. package/dist/builtins/console-logging/index.mjs +1 -1
  11. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  12. package/dist/builtins/core-blocks/core-blocks.addon.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/liveness-monitor/liveness-monitor.addon.js +1 -1
  20. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  21. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  22. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  23. package/dist/builtins/local-network/local-network.addon.js +1 -1
  24. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  25. package/dist/builtins/loki-logging/index.js +1 -1
  26. package/dist/builtins/loki-logging/index.mjs +1 -1
  27. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  28. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  29. package/dist/builtins/platform-probe/index.js +1 -1
  30. package/dist/builtins/platform-probe/index.mjs +1 -1
  31. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  32. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  33. package/dist/builtins/snapshot/index.js +20 -7
  34. package/dist/builtins/snapshot/index.mjs +20 -7
  35. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  36. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  37. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  39. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  40. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  41. package/dist/builtins/system-config/system-config.addon.js +1 -1
  42. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  43. package/dist/builtins/winston-logging/index.js +1 -1
  44. package/dist/builtins/winston-logging/index.mjs +1 -1
  45. package/dist/{dist-I0WgqQQ-.js → dist-B1W4mT4z.js} +54 -7
  46. package/dist/{dist-Daxx9CB0.mjs → dist-CX8Z8M6S.mjs} +54 -7
  47. package/dist/index.js +9 -3
  48. package/dist/index.mjs +9 -3
  49. package/package.json +1 -1
@@ -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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, _ as addonPagesCapability, mt as BaseAddon, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, _ as addonPagesCapability, mt as BaseAddon, pt as errMsg } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, mt as BaseAddon, pt as errMsg, y as addonWidgetsCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, mt as BaseAddon, pt as errMsg, y as addonWidgetsCapability } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, Dt as createEvent, b as alertsCapability, mt as BaseAddon, n as AlertSchema, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, Dt as createEvent, b as alertsCapability, mt as BaseAddon, n as AlertSchema, pt as errMsg } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, S as backupCapability, mt as BaseAddon } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, S as backupCapability, mt as BaseAddon } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { mt as BaseAddon, q as logDestinationCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { mt as BaseAddon, q as logDestinationCapability } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
3
+ const require_dist = require("../../dist-B1W4mT4z.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 { D as coreBlocksCapability, E as coreBlockIdFromAddonId, T as coreBlockAddonId, c as CoreBlockSchema, l as DeclaredDevices, mt as BaseAddon, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX } from "../../dist-Daxx9CB0.mjs";
1
+ import { D as coreBlocksCapability, E as coreBlockIdFromAddonId, T as coreBlockAddonId, c as CoreBlockSchema, l as DeclaredDevices, mt as BaseAddon, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX } from "../../dist-CX8Z8M6S.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,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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let _camstack_types_node = require("@camstack/types/node");
9
9
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -1,4 +1,4 @@
1
- import { $ as parseStreamParamsFormPatch, A as deviceManagerCapability, Bt as EventCategory, Ct as WELL_KNOWN_TAB_MAP, F as enumerateItemArrayFields, I as enumerateSchemaFields, M as deviceStatusCapability, Mt as isDeviceConfigCap, Z as normalizeUnit, a as CAP_NAMES_WITH_STATUS, bt as DeviceType, j as deviceStateCapability, mt as BaseAddon, p as STREAM_PROFILE_META, pt as errMsg, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, vt as DeviceFeature, w as buildStreamParamsConfigSchema, yt as DeviceRole, zt as sleep } from "../../dist-Daxx9CB0.mjs";
1
+ import { $ as parseStreamParamsFormPatch, A as deviceManagerCapability, Bt as EventCategory, Ct as WELL_KNOWN_TAB_MAP, F as enumerateItemArrayFields, I as enumerateSchemaFields, M as deviceStatusCapability, Mt as isDeviceConfigCap, Z as normalizeUnit, a as CAP_NAMES_WITH_STATUS, bt as DeviceType, j as deviceStateCapability, mt as BaseAddon, p as STREAM_PROFILE_META, pt as errMsg, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, vt as DeviceFeature, w as buildStreamParamsConfigSchema, yt as DeviceRole, zt as sleep } from "../../dist-CX8Z8M6S.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
4
4
  //#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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, C as bareAddonId, Dt as createEvent, H as isSameAddonId, N as doorbellCapability, bt as DeviceType, mt as BaseAddon, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, C as bareAddonId, Dt as createEvent, H as isSameAddonId, N as doorbellCapability, bt as DeviceType, mt as BaseAddon, pt as errMsg } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { mt as BaseAddon, q as logDestinationCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { mt as BaseAddon, q as logDestinationCapability } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
3
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, Dt as createEvent, mt as BaseAddon, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, Dt as createEvent, mt as BaseAddon, pt as errMsg } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { g as UserRecordSchema, m as ScopedTokenSchema, mt as BaseAddon, r as ApiKeyRecordSchema, ut as userManagementCapability, x as authProviderCapability } from "../../dist-Daxx9CB0.mjs";
2
+ import { g as UserRecordSchema, m as ScopedTokenSchema, mt as BaseAddon, r as ApiKeyRecordSchema, ut as userManagementCapability, x as authProviderCapability } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
3
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, K as localNetworkCapability, mt as BaseAddon } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, K as localNetworkCapability, mt as BaseAddon } from "../../dist-CX8Z8M6S.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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { mt as BaseAddon, q as logDestinationCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { mt as BaseAddon, q as logDestinationCapability } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,4 +1,4 @@
1
- import { Bt as EventCategory, Dt as createEvent, X as metricsProviderCapability, mt as BaseAddon } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, Dt as createEvent, X as metricsProviderCapability, mt as BaseAddon } from "../../dist-CX8Z8M6S.mjs";
2
2
  import { execFile, execFileSync } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as os from "node:os";
@@ -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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.js");
7
7
  let node_child_process = require("node:child_process");
8
8
  let node_util = require("node:util");
9
9
  let node_os = require("node:os");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Bt as EventCategory, P as enumerateInferenceDevices, et as platformProbeCapability, it as scoreRuntimes, kt as emitReadiness, mt as BaseAddon, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
2
+ import { Bt as EventCategory, P as enumerateInferenceDevices, et as platformProbeCapability, it as scoreRuntimes, kt as emitReadiness, mt as BaseAddon, pt as errMsg } from "../../dist-CX8Z8M6S.mjs";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import * as os from "node:os";
@@ -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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { Bt as EventCategory, mt as BaseAddon } from "../../dist-Daxx9CB0.mjs";
1
+ import { Bt as EventCategory, mt as BaseAddon } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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");
@@ -788,6 +788,13 @@ function parseVerifiedSnapshotLink(input) {
788
788
  * answers inside it, short enough that a dead camera cannot stall the batch.
789
789
  */
790
790
  var LINK_MINT_DEADLINE_MS = 2500;
791
+ /**
792
+ * A links RPC is one Viewer-wide batch. Never let one slow camera hold every
793
+ * fast camera behind its individual capture deadline: wait briefly for the
794
+ * common fast path, then mint from the cache as it stands. Slow captures keep
795
+ * running and their new generation is returned by the next 5 s poll.
796
+ */
797
+ var LINK_BATCH_WAIT_MS = 750;
791
798
  /** Frames older than this are never represented as current by the Viewer. */
792
799
  var LINK_CURRENT_MAX_AGE_MS = 15e3;
793
800
  /** Default cache window for non-battery cams (seconds). 10s feels live. */
@@ -1053,12 +1060,18 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1053
1060
  const expMs = snapshotLinkExpiry(now, SNAPSHOT_LINK_TTL_MS);
1054
1061
  const served = this.linkDataPlane !== null && secret !== null;
1055
1062
  const prefix = this.linkRoutePrefix();
1056
- const rows = await Promise.all(input.targets.map(async (target) => {
1063
+ const sleepingByDevice = /* @__PURE__ */ new Map();
1064
+ const refreshes = input.targets.map(async (target) => {
1065
+ const width = target.width === void 0 ? void 0 : snapSnapshotWidth(target.width);
1066
+ this.subscriptions.note(target.deviceId, void 0, width, now);
1067
+ const sleeping = await this.isSleepingBatteryDevice(target.deviceId);
1068
+ sleepingByDevice.set(target.deviceId, sleeping);
1069
+ if (!sleeping) await this.awaitFreshEnough(target.deviceId);
1070
+ });
1071
+ await raceForResult(Promise.allSettled(refreshes), LINK_BATCH_WAIT_MS);
1072
+ const rows = input.targets.map((target) => {
1057
1073
  const { deviceId } = target;
1058
1074
  const width = target.width === void 0 ? void 0 : snapSnapshotWidth(target.width);
1059
- this.subscriptions.note(deviceId, void 0, width, now);
1060
- const sleeping = await this.isSleepingBatteryDevice(deviceId);
1061
- if (!sleeping) await this.awaitFreshEnough(deviceId);
1062
1075
  const capturedAt = this.cache.latest(deviceId)?.ts ?? null;
1063
1076
  const answeredAt = Date.now();
1064
1077
  return {
@@ -1076,9 +1089,9 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
1076
1089
  expiresAt: served ? expMs : null,
1077
1090
  width: width ?? null,
1078
1091
  neverCaptured: capturedAt === null,
1079
- sleeping
1092
+ sleeping: sleepingByDevice.get(deviceId) ?? false
1080
1093
  };
1081
- }));
1094
+ });
1082
1095
  this.ctx.logger.debug("snapshot: minted links", { meta: {
1083
1096
  targets: input.targets.length,
1084
1097
  served,
@@ -1,4 +1,4 @@
1
- import { C as bareAddonId, Nt as nodePin, bt as DeviceType, i as BatteryStatusSchema, lt as streamQualityLabel, mt as BaseAddon, ot as snapshotCapability, pt as errMsg, vt as DeviceFeature } from "../../dist-Daxx9CB0.mjs";
1
+ import { C as bareAddonId, Nt as nodePin, bt as DeviceType, i as BatteryStatusSchema, lt as streamQualityLabel, mt as BaseAddon, ot as snapshotCapability, pt as errMsg, vt as DeviceFeature } from "../../dist-CX8Z8M6S.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
@@ -783,6 +783,13 @@ function parseVerifiedSnapshotLink(input) {
783
783
  * answers inside it, short enough that a dead camera cannot stall the batch.
784
784
  */
785
785
  var LINK_MINT_DEADLINE_MS = 2500;
786
+ /**
787
+ * A links RPC is one Viewer-wide batch. Never let one slow camera hold every
788
+ * fast camera behind its individual capture deadline: wait briefly for the
789
+ * common fast path, then mint from the cache as it stands. Slow captures keep
790
+ * running and their new generation is returned by the next 5 s poll.
791
+ */
792
+ var LINK_BATCH_WAIT_MS = 750;
786
793
  /** Frames older than this are never represented as current by the Viewer. */
787
794
  var LINK_CURRENT_MAX_AGE_MS = 15e3;
788
795
  /** Default cache window for non-battery cams (seconds). 10s feels live. */
@@ -1048,12 +1055,18 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1048
1055
  const expMs = snapshotLinkExpiry(now, SNAPSHOT_LINK_TTL_MS);
1049
1056
  const served = this.linkDataPlane !== null && secret !== null;
1050
1057
  const prefix = this.linkRoutePrefix();
1051
- const rows = await Promise.all(input.targets.map(async (target) => {
1058
+ const sleepingByDevice = /* @__PURE__ */ new Map();
1059
+ const refreshes = input.targets.map(async (target) => {
1060
+ const width = target.width === void 0 ? void 0 : snapSnapshotWidth(target.width);
1061
+ this.subscriptions.note(target.deviceId, void 0, width, now);
1062
+ const sleeping = await this.isSleepingBatteryDevice(target.deviceId);
1063
+ sleepingByDevice.set(target.deviceId, sleeping);
1064
+ if (!sleeping) await this.awaitFreshEnough(target.deviceId);
1065
+ });
1066
+ await raceForResult(Promise.allSettled(refreshes), LINK_BATCH_WAIT_MS);
1067
+ const rows = input.targets.map((target) => {
1052
1068
  const { deviceId } = target;
1053
1069
  const width = target.width === void 0 ? void 0 : snapSnapshotWidth(target.width);
1054
- this.subscriptions.note(deviceId, void 0, width, now);
1055
- const sleeping = await this.isSleepingBatteryDevice(deviceId);
1056
- if (!sleeping) await this.awaitFreshEnough(deviceId);
1057
1070
  const capturedAt = this.cache.latest(deviceId)?.ts ?? null;
1058
1071
  const answeredAt = Date.now();
1059
1072
  return {
@@ -1071,9 +1084,9 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
1071
1084
  expiresAt: served ? expMs : null,
1072
1085
  width: width ?? null,
1073
1086
  neverCaptured: capturedAt === null,
1074
- sleeping
1087
+ sleeping: sleepingByDevice.get(deviceId) ?? false
1075
1088
  };
1076
- }));
1089
+ });
1077
1090
  this.ctx.logger.debug("snapshot: minted links", { meta: {
1078
1091
  targets: input.targets.length,
1079
1092
  served,
@@ -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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { R as filesystemBrowseCapability, ct as storageProviderCapability, mt as BaseAddon } from "../../dist-Daxx9CB0.mjs";
1
+ import { R as filesystemBrowseCapability, ct as storageProviderCapability, mt as BaseAddon } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs = require("node:fs");
9
9
  let node_module = require("node:module");
@@ -1,4 +1,4 @@
1
- import { C as bareAddonId, Ft as parseJsonUnknown, O as dataStoreProviderCapability, dt as vectorDimFromBase64, f as RUNTIME_DEFAULTS, ft as vectorStoreCapability, k as decodeVectorBase64, mt as BaseAddon, pt as errMsg, wt as asJsonObject } from "../../dist-Daxx9CB0.mjs";
1
+ import { C as bareAddonId, Ft as parseJsonUnknown, O as dataStoreProviderCapability, dt as vectorDimFromBase64, f as RUNTIME_DEFAULTS, ft as vectorStoreCapability, k as decodeVectorBase64, mt as BaseAddon, pt as errMsg, wt as asJsonObject } from "../../dist-CX8Z8M6S.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { statSync } 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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.js");
7
7
  let node_fs_promises = require("node:fs/promises");
8
8
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Pt as parseJsonObject, at as settingsStoreCapability, h as StorageLocationTypeSchema, mt as BaseAddon, st as storageCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { Pt as parseJsonObject, at as settingsStoreCapability, h as StorageLocationTypeSchema, mt as BaseAddon, st as storageCapability } from "../../dist-CX8Z8M6S.mjs";
2
2
  import * as fs from "node:fs/promises";
3
3
  import * as path$1 from "node:path";
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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { jt as hydrateSchema, mt as BaseAddon, pt as errMsg } from "../../dist-Daxx9CB0.mjs";
1
+ import { jt as hydrateSchema, mt as BaseAddon, pt as errMsg } from "../../dist-CX8Z8M6S.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-I0WgqQQ-.js");
6
+ const require_dist = require("../../dist-B1W4mT4z.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 { mt as BaseAddon, q as logDestinationCapability } from "../../dist-Daxx9CB0.mjs";
1
+ import { mt as BaseAddon, q as logDestinationCapability } from "../../dist-CX8Z8M6S.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";
@@ -1,5 +1,5 @@
1
1
  let zod = require("zod");
2
- //#region ../types/dist/event-category-41fKf-q9.mjs
2
+ //#region ../types/dist/event-category-Cv9dO26A.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -15,6 +15,13 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
15
15
  */
16
16
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
17
17
  /**
18
+ * A newer addon or server-root package version was found by the
19
+ * authoritative registry check. Emitted once per
20
+ * `(target, packageName, currentVersion, latestVersion)` transition; repeated
21
+ * polling of the same result is deduplicated by the checker.
22
+ */
23
+ EventCategory["UpdateAvailable"] = "update.available";
24
+ /**
18
25
  * Readiness transition for a capability provider. Every producer emits
19
26
  * this event on `onInitialize` completion, `onDestroy`, and
20
27
  * `$node.reconnect`; every consumer that needs to gate on a cross-process
@@ -11933,8 +11940,35 @@ var NcDeliverySchema = zod.z.enum([
11933
11940
  "immediate",
11934
11941
  "track-end",
11935
11942
  "device-event",
11936
- "package-event"
11943
+ "package-event",
11944
+ "system-event"
11945
+ ]);
11946
+ /**
11947
+ * Stable Notification Center vocabulary over infrastructure/liveness events.
11948
+ * Bus categories are normalized into these intent-level kinds so rules do not
11949
+ * depend on a provider's raw event name or payload shape.
11950
+ */
11951
+ var NcSystemEventKindSchema = zod.z.enum([
11952
+ "camera-online",
11953
+ "camera-offline",
11954
+ "stream-online",
11955
+ "stream-offline",
11956
+ "node-online",
11957
+ "node-offline",
11958
+ "addon-update-available",
11959
+ "server-update-available"
11937
11960
  ]);
11961
+ /**
11962
+ * One coherent system-event condition. `kinds` is the required opt-in safety
11963
+ * gate; the remaining lists are optional narrowing filters relevant to the
11964
+ * selected kinds.
11965
+ */
11966
+ var NcSystemEventConditionSchema = zod.z.object({
11967
+ kinds: zod.z.array(NcSystemEventKindSchema).min(1),
11968
+ deviceIds: zod.z.array(zod.z.number().int()).min(1).optional(),
11969
+ nodeIds: zod.z.array(zod.z.string().min(1)).min(1).optional(),
11970
+ packageNames: zod.z.array(zod.z.string().min(1)).min(1).optional()
11971
+ });
11938
11972
  /** One weekly activation window. `startMinute > endMinute` crosses midnight. */
11939
11973
  var NcScheduleWindowSchema = zod.z.object({
11940
11974
  /** Days of week the window STARTS on (0 = Sunday … 6 = Saturday). */
@@ -12252,6 +12286,8 @@ var NcConditionsSchema = zod.z.object({
12252
12286
  "picked-up",
12253
12287
  "both"
12254
12288
  ]).optional(),
12289
+ /** Infrastructure/liveness/update event matcher (`system-event` delivery). */
12290
+ systemEvent: NcSystemEventConditionSchema.optional(),
12255
12291
  /**
12256
12292
  * PERSONAL-RULE custom zones (viewer-drawn). Inline normalized polygons
12257
12293
  * (MaskShape vocabulary). A record passes when its bbox overlaps ANY
@@ -12471,7 +12507,8 @@ var NcTestResultSchema = zod.z.object({
12471
12507
  "object-event",
12472
12508
  "track",
12473
12509
  "device-event",
12474
- "package-event"
12510
+ "package-event",
12511
+ "system-event"
12475
12512
  ]),
12476
12513
  deviceId: zod.z.number(),
12477
12514
  timestamp: zod.z.number(),
@@ -12493,7 +12530,8 @@ var NcConditionDescriptorSchema = zod.z.object({
12493
12530
  "schedule",
12494
12531
  "device",
12495
12532
  "package",
12496
- "occupancy"
12533
+ "occupancy",
12534
+ "system"
12497
12535
  ]),
12498
12536
  label: zod.z.string(),
12499
12537
  /** Editor widget the UI renders — never hardcode per-condition forms. */
@@ -12511,7 +12549,8 @@ var NcConditionDescriptorSchema = zod.z.object({
12511
12549
  "crossingSelect",
12512
12550
  "polygonDraw",
12513
12551
  "occupancy",
12514
- "deviceState"
12552
+ "deviceState",
12553
+ "systemEvent"
12515
12554
  ]),
12516
12555
  operator: zod.z.enum([
12517
12556
  "in",
@@ -12570,7 +12609,8 @@ var NcHistoryRecordKindSchema = zod.z.enum([
12570
12609
  "object-event",
12571
12610
  "track-end",
12572
12611
  "device-event",
12573
- "package-event"
12612
+ "package-event",
12613
+ "system-event"
12574
12614
  ]);
12575
12615
  /** Subject summary frozen on the row at fire time (survives rule/record edits). */
12576
12616
  var NcHistorySubjectSchema = zod.z.object({
@@ -12578,7 +12618,14 @@ var NcHistorySubjectSchema = zod.z.object({
12578
12618
  label: zod.z.string().optional(),
12579
12619
  confidence: zod.z.number().optional(),
12580
12620
  zones: zod.z.array(zod.z.string()),
12581
- timestamp: zod.z.number()
12621
+ timestamp: zod.z.number(),
12622
+ systemEvent: zod.z.object({
12623
+ kind: NcSystemEventKindSchema,
12624
+ subject: zod.z.string(),
12625
+ title: zod.z.string(),
12626
+ body: zod.z.string(),
12627
+ data: zod.z.record(zod.z.string(), zod.z.unknown())
12628
+ }).optional()
12582
12629
  });
12583
12630
  /**
12584
12631
  * One delivery-history row. This is a read-only VIEW over the durable
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- //#region ../types/dist/event-category-41fKf-q9.mjs
2
+ //#region ../types/dist/event-category-Cv9dO26A.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -15,6 +15,13 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
15
15
  */
16
16
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
17
17
  /**
18
+ * A newer addon or server-root package version was found by the
19
+ * authoritative registry check. Emitted once per
20
+ * `(target, packageName, currentVersion, latestVersion)` transition; repeated
21
+ * polling of the same result is deduplicated by the checker.
22
+ */
23
+ EventCategory["UpdateAvailable"] = "update.available";
24
+ /**
18
25
  * Readiness transition for a capability provider. Every producer emits
19
26
  * this event on `onInitialize` completion, `onDestroy`, and
20
27
  * `$node.reconnect`; every consumer that needs to gate on a cross-process
@@ -11933,8 +11940,35 @@ var NcDeliverySchema = z.enum([
11933
11940
  "immediate",
11934
11941
  "track-end",
11935
11942
  "device-event",
11936
- "package-event"
11943
+ "package-event",
11944
+ "system-event"
11945
+ ]);
11946
+ /**
11947
+ * Stable Notification Center vocabulary over infrastructure/liveness events.
11948
+ * Bus categories are normalized into these intent-level kinds so rules do not
11949
+ * depend on a provider's raw event name or payload shape.
11950
+ */
11951
+ var NcSystemEventKindSchema = z.enum([
11952
+ "camera-online",
11953
+ "camera-offline",
11954
+ "stream-online",
11955
+ "stream-offline",
11956
+ "node-online",
11957
+ "node-offline",
11958
+ "addon-update-available",
11959
+ "server-update-available"
11937
11960
  ]);
11961
+ /**
11962
+ * One coherent system-event condition. `kinds` is the required opt-in safety
11963
+ * gate; the remaining lists are optional narrowing filters relevant to the
11964
+ * selected kinds.
11965
+ */
11966
+ var NcSystemEventConditionSchema = z.object({
11967
+ kinds: z.array(NcSystemEventKindSchema).min(1),
11968
+ deviceIds: z.array(z.number().int()).min(1).optional(),
11969
+ nodeIds: z.array(z.string().min(1)).min(1).optional(),
11970
+ packageNames: z.array(z.string().min(1)).min(1).optional()
11971
+ });
11938
11972
  /** One weekly activation window. `startMinute > endMinute` crosses midnight. */
11939
11973
  var NcScheduleWindowSchema = z.object({
11940
11974
  /** Days of week the window STARTS on (0 = Sunday … 6 = Saturday). */
@@ -12252,6 +12286,8 @@ var NcConditionsSchema = z.object({
12252
12286
  "picked-up",
12253
12287
  "both"
12254
12288
  ]).optional(),
12289
+ /** Infrastructure/liveness/update event matcher (`system-event` delivery). */
12290
+ systemEvent: NcSystemEventConditionSchema.optional(),
12255
12291
  /**
12256
12292
  * PERSONAL-RULE custom zones (viewer-drawn). Inline normalized polygons
12257
12293
  * (MaskShape vocabulary). A record passes when its bbox overlaps ANY
@@ -12471,7 +12507,8 @@ var NcTestResultSchema = z.object({
12471
12507
  "object-event",
12472
12508
  "track",
12473
12509
  "device-event",
12474
- "package-event"
12510
+ "package-event",
12511
+ "system-event"
12475
12512
  ]),
12476
12513
  deviceId: z.number(),
12477
12514
  timestamp: z.number(),
@@ -12493,7 +12530,8 @@ var NcConditionDescriptorSchema = z.object({
12493
12530
  "schedule",
12494
12531
  "device",
12495
12532
  "package",
12496
- "occupancy"
12533
+ "occupancy",
12534
+ "system"
12497
12535
  ]),
12498
12536
  label: z.string(),
12499
12537
  /** Editor widget the UI renders — never hardcode per-condition forms. */
@@ -12511,7 +12549,8 @@ var NcConditionDescriptorSchema = z.object({
12511
12549
  "crossingSelect",
12512
12550
  "polygonDraw",
12513
12551
  "occupancy",
12514
- "deviceState"
12552
+ "deviceState",
12553
+ "systemEvent"
12515
12554
  ]),
12516
12555
  operator: z.enum([
12517
12556
  "in",
@@ -12570,7 +12609,8 @@ var NcHistoryRecordKindSchema = z.enum([
12570
12609
  "object-event",
12571
12610
  "track-end",
12572
12611
  "device-event",
12573
- "package-event"
12612
+ "package-event",
12613
+ "system-event"
12574
12614
  ]);
12575
12615
  /** Subject summary frozen on the row at fire time (survives rule/record edits). */
12576
12616
  var NcHistorySubjectSchema = z.object({
@@ -12578,7 +12618,14 @@ var NcHistorySubjectSchema = z.object({
12578
12618
  label: z.string().optional(),
12579
12619
  confidence: z.number().optional(),
12580
12620
  zones: z.array(z.string()),
12581
- timestamp: z.number()
12621
+ timestamp: z.number(),
12622
+ systemEvent: z.object({
12623
+ kind: NcSystemEventKindSchema,
12624
+ subject: z.string(),
12625
+ title: z.string(),
12626
+ body: z.string(),
12627
+ data: z.record(z.string(), z.unknown())
12628
+ }).optional()
12582
12629
  });
12583
12630
  /**
12584
12631
  * One delivery-history row. This is a read-only VIEW over the durable
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-I0WgqQQ-.js");
3
+ const require_dist = require("./dist-B1W4mT4z.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");
@@ -407,11 +407,17 @@ function proxyToUpstream(opts) {
407
407
  path: upstreamPath,
408
408
  headers
409
409
  }, (upRes) => {
410
- clientRes.writeHead(upRes.statusCode ?? 502, upRes.headers);
410
+ clientRes.writeHead(upRes.statusCode ?? 502, {
411
+ "access-control-allow-origin": "*",
412
+ ...upRes.headers
413
+ });
411
414
  upRes.pipe(clientRes);
412
415
  });
413
416
  upstream.on("error", (err) => {
414
- if (!clientRes.headersSent) clientRes.writeHead(502, { "content-type": "application/json" });
417
+ if (!clientRes.headersSent) clientRes.writeHead(502, {
418
+ "content-type": "application/json",
419
+ "access-control-allow-origin": "*"
420
+ });
415
421
  clientRes.end(JSON.stringify({
416
422
  error: "data-plane upstream error",
417
423
  detail: String(err)
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 { At as expandCapMethods, B as isCollectionArrayMethod, Bt as EventCategory$1, Dt as createEvent, Et as asString$1, Ft as parseJsonUnknown$1, G as lifecycleJobSchema, It as readinessKey, J as logLevelAtMost, L as extractNestedAddonId, Lt as resolveCapMount, Ot as emitDownForOwnedCaps, Pt as parseJsonObject, Q as objectInputDeclaresAddonId, Rt as scopeKey, St as ReadinessTimeoutError, Tt as asNumber, U as isVoidInput, V as isObjectInput, W as kebabToCamel, Y as looseSchema, _t as DEVICE_STATUS_METHOD, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, gt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, ht as DATAPLANE_SECRET_HEADER$1, nt as scopesAllowAddon, pt as errMsg$1, rt as scopesAllowDeviceCap, t as ALL_CAPABILITY_DEFINITIONS, tt as procedureAuthKey, v as addonSettingsCapability, wt as asJsonObject$1, xt as ReadinessRegistry, z as isArrayOutputSchema } from "./dist-Daxx9CB0.mjs";
2
+ import { At as expandCapMethods, B as isCollectionArrayMethod, Bt as EventCategory$1, Dt as createEvent, Et as asString$1, Ft as parseJsonUnknown$1, G as lifecycleJobSchema, It as readinessKey, J as logLevelAtMost, L as extractNestedAddonId, Lt as resolveCapMount, Ot as emitDownForOwnedCaps, Pt as parseJsonObject, Q as objectInputDeclaresAddonId, Rt as scopeKey, St as ReadinessTimeoutError, Tt as asNumber, U as isVoidInput, V as isObjectInput, W as kebabToCamel, Y as looseSchema, _t as DEVICE_STATUS_METHOD, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, gt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, ht as DATAPLANE_SECRET_HEADER$1, nt as scopesAllowAddon, pt as errMsg$1, rt as scopesAllowDeviceCap, t as ALL_CAPABILITY_DEFINITIONS, tt as procedureAuthKey, v as addonSettingsCapability, wt as asJsonObject$1, xt as ReadinessRegistry, z as isArrayOutputSchema } from "./dist-CX8Z8M6S.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";
@@ -399,11 +399,17 @@ function proxyToUpstream(opts) {
399
399
  path: upstreamPath,
400
400
  headers
401
401
  }, (upRes) => {
402
- clientRes.writeHead(upRes.statusCode ?? 502, upRes.headers);
402
+ clientRes.writeHead(upRes.statusCode ?? 502, {
403
+ "access-control-allow-origin": "*",
404
+ ...upRes.headers
405
+ });
403
406
  upRes.pipe(clientRes);
404
407
  });
405
408
  upstream.on("error", (err) => {
406
- if (!clientRes.headersSent) clientRes.writeHead(502, { "content-type": "application/json" });
409
+ if (!clientRes.headersSent) clientRes.writeHead(502, {
410
+ "content-type": "application/json",
411
+ "access-control-allow-origin": "*"
412
+ });
407
413
  clientRes.end(JSON.stringify({
408
414
  error: "data-plane upstream error",
409
415
  detail: String(err)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.74",
3
+ "version": "1.2.76",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",