@camstack/system 1.2.322 → 1.2.323

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 (61) 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/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.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/camera-grid/index.js +1 -1
  12. package/dist/builtins/camera-grid/index.mjs +1 -1
  13. package/dist/builtins/composer/composer.addon.js +2 -2
  14. package/dist/builtins/composer/composer.addon.mjs +2 -2
  15. package/dist/builtins/console-logging/index.js +1 -1
  16. package/dist/builtins/console-logging/index.mjs +1 -1
  17. package/dist/builtins/core-blocks/composition-api.d.ts +4 -2
  18. package/dist/builtins/core-blocks/core-blocks.addon.js +6 -4
  19. package/dist/builtins/core-blocks/core-blocks.addon.mjs +6 -4
  20. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  21. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  22. package/dist/builtins/doorbell/doorbell-composition-migration.d.ts +1 -13
  23. package/dist/builtins/doorbell/virtual-doorbell.addon.js +6 -64
  24. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +5 -63
  25. package/dist/builtins/hub-forwarder/index.js +1 -1
  26. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  27. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  28. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  29. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  30. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  31. package/dist/builtins/local-network/local-network.addon.js +1 -1
  32. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  33. package/dist/builtins/loki-logging/index.js +1 -1
  34. package/dist/builtins/loki-logging/index.mjs +1 -1
  35. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  36. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  37. package/dist/builtins/platform-probe/index.js +1 -1
  38. package/dist/builtins/platform-probe/index.mjs +1 -1
  39. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  40. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  41. package/dist/builtins/snapshot/index.js +1 -1
  42. package/dist/builtins/snapshot/index.mjs +1 -1
  43. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  44. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  45. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  46. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  47. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  48. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  49. package/dist/builtins/system-config/system-config.addon.js +1 -1
  50. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  51. package/dist/builtins/winston-logging/index.js +1 -1
  52. package/dist/builtins/winston-logging/index.mjs +1 -1
  53. package/dist/{composition-sources-RzhpNlEu.mjs → composition-sources-CeAPNF5Q.mjs} +1 -1
  54. package/dist/{composition-sources-CB_xQieM.js → composition-sources-DkVxrXLm.js} +1 -1
  55. package/dist/{dist-DENeGKrn.mjs → dist-Bs6UyVGd.mjs} +1702 -1232
  56. package/dist/{dist-D25eq33W.js → dist-Bup0sTZb.js} +1719 -1243
  57. package/dist/index.js +1 -1
  58. package/dist/index.mjs +1 -1
  59. package/dist/{retired-settings-keys-BH9LRNsg.js → retired-settings-keys-Db0P4Yvn.js} +1 -1
  60. package/dist/{retired-settings-keys-iFdgpbfM.mjs → retired-settings-keys-LROp1DXx.mjs} +1 -1
  61. 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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Gn as errMsg, Kn as BaseAddon, R as addonPagesCapability, gr as EventCategory } from "../../dist-DENeGKrn.mjs";
1
+ import { Kn as errMsg, R as addonPagesCapability, _r as EventCategory, qn as BaseAddon } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { B as addonWidgetsCapability, Gn as errMsg, Kn as BaseAddon, gr as EventCategory } from "../../dist-DENeGKrn.mjs";
1
+ import { B as addonWidgetsCapability, Kn as errMsg, _r as EventCategory, qn as BaseAddon } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Gn as errMsg, Kn as BaseAddon, V as alertsCapability, gr as EventCategory, n as AlertSchema, nr as createEvent } from "../../dist-DENeGKrn.mjs";
1
+ import { Kn as errMsg, V as alertsCapability, _r as EventCategory, n as AlertSchema, qn as BaseAddon, rr as createEvent } from "../../dist-Bs6UyVGd.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
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
7
  //#region src/builtins/autotrack/autotrack-config.ts
8
8
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
9
9
  deadZoneFraction: .5,
@@ -1,4 +1,4 @@
1
- import { Gn as errMsg, Kn as BaseAddon, W as bareAddonId, _ as FIRST_LEVEL_MACRO_CLASSES, cr as isEvent, en as ptzAutotrackCapability, gr as EventCategory } from "../../dist-DENeGKrn.mjs";
1
+ import { Kn as errMsg, W as bareAddonId, _ as FIRST_LEVEL_MACRO_CLASSES, _r as EventCategory, lr as isEvent, qn as BaseAddon, rn as ptzAutotrackCapability } from "../../dist-Bs6UyVGd.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,
@@ -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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Ht as mayWriteToLocation, Kn as BaseAddon, U as backupCapability, gr as EventCategory, hn as storageOccupancyCapability } from "../../dist-DENeGKrn.mjs";
1
+ import { Gt as mayWriteToLocation, U as backupCapability, _r as EventCategory, qn as BaseAddon, vn as storageOccupancyCapability } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
7
  let zod = require("zod");
8
8
  let _camstack_types_node = require("@camstack/types/node");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { An as buildFfmpegArgs, Gn as errMsg, Hn as DeviceFeature, J as cameraGridLayoutCapability, Kn as BaseAddon, Kt as motionCapability, T as MOTION_CLOSE_AFTER_MS, Ut as memoizePinnedFfmpeg, Wn as DeviceType, _n as streamCatalogCapability, fn as snapshotCapability, gr as EventCategory, h as DeclaredDevices, i as BaseDevice, m as DERIVED_CAMERA_SILENCED_CAP_NAMES, nr as createEvent, or as hydrateSchema, ot as declarationOwnerNodeId } from "../../dist-DENeGKrn.mjs";
1
+ import { Gn as DeviceType, Kn as errMsg, Kt as memoizePinnedFfmpeg, T as MOTION_CLOSE_AFTER_MS, Un as DeviceFeature, Y as cameraGridLayoutCapability, Yt as motionCapability, _r as EventCategory, bn as streamCatalogCapability, h as DeclaredDevices, hn as snapshotCapability, i as BaseDevice, jn as buildFfmpegArgs, m as DERIVED_CAMERA_SILENCED_CAP_NAMES, qn as BaseAddon, rr as createEvent, sr as hydrateSchema, st as declarationOwnerNodeId } from "../../dist-Bs6UyVGd.mjs";
2
2
  import { z } from "zod";
3
3
  import { FfmpegProcess } from "@camstack/types/node";
4
4
  import { join } from "node:path";
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
7
  const require_device_state_changed = require("../../device-state-changed-Bk7cvTnz.js");
8
- const require_composition_sources = require("../../composition-sources-CB_xQieM.js");
8
+ const require_composition_sources = require("../../composition-sources-DkVxrXLm.js");
9
9
  //#region src/builtins/composer/composed-device.ts
10
10
  /**
11
11
  * A composed device: an ordinary `BaseDevice` whose caps are served by the
@@ -1,6 +1,6 @@
1
- import { Fn as compositionItemFieldPath, Gn as errMsg, In as compositionSliceKey, K as buildCapabilityLookup, Kn as BaseAddon, Ln as compositionSourceKey, Mn as composedDeviceRef, Nn as composedDeviceStableId, Pn as compositionFeatureEnabled, Rn as createStatefulExpressionMemory, Tn as COMPOSER_ADDON_ID, Vn as toExpressionValue, Wn as DeviceType, X as composerCapability, Z as compositionFieldKey, Zt as planComposition, c as COMPOSED_ITEM_FIXED_FIELDS, gr as EventCategory, h as DeclaredDevices, i as BaseDevice, jn as cloneStatefulExpressionMemory, nr as createEvent, t as ALL_CAPABILITY_DEFINITIONS, vt as evaluateCompositionField } from "../../dist-DENeGKrn.mjs";
1
+ import { Fn as compositionFeatureEnabled, Gn as DeviceType, Hn as toExpressionValue, In as compositionItemFieldPath, K as buildCapabilityLookup, Kn as errMsg, Ln as compositionSliceKey, Mn as cloneStatefulExpressionMemory, Nn as composedDeviceRef, On as COMPOSER_ADDON_ID, Pn as composedDeviceStableId, Q as compositionFieldKey, Rn as compositionSourceKey, Z as composerCapability, _r as EventCategory, c as COMPOSED_ITEM_FIXED_FIELDS, en as planComposition, h as DeclaredDevices, i as BaseDevice, qn as BaseAddon, rr as createEvent, t as ALL_CAPABILITY_DEFINITIONS, xt as evaluateCompositionField, zn as createStatefulExpressionMemory } from "../../dist-Bs6UyVGd.mjs";
2
2
  import { n as parseDeviceStateChanged, t as isRecord$2 } from "../../device-state-changed-DoBbkyEI.mjs";
3
- import { n as normalizedNativeOwner } from "../../composition-sources-RzhpNlEu.mjs";
3
+ import { n as normalizedNativeOwner } from "../../composition-sources-CeAPNF5Q.mjs";
4
4
  import { z } from "zod";
5
5
  //#region src/builtins/composer/composed-device.ts
6
6
  /**
@@ -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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Kn as BaseAddon, Rt as logDestinationCapability } from "../../dist-DENeGKrn.mjs";
1
+ import { Vt as logDestinationCapability, qn as BaseAddon } from "../../dist-Bs6UyVGd.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,4 +1,4 @@
1
- import { CapabilityLookup, CompositionBlockPatch, CompositionBlockState, CompositionSourceRef, CoreBlock, ICoreBlocksProvider, IScopedLogger } from '@camstack/types';
1
+ import { CapabilityDefinition, CapabilityLookup, CompositionBlockPatch, CompositionBlockState, CompositionSourceRef, CoreBlock, ICoreBlocksProvider, IScopedLogger } from '@camstack/types';
2
2
  import { NamedCompositionInput } from './core-block-store.js';
3
3
  import { CompositionDescriptions } from './composition-sources.js';
4
4
  export interface CompositionStoreView {
@@ -17,8 +17,10 @@ export interface CompositionApiDeps {
17
17
  readonly composerStates: (blockIds: readonly string[]) => Promise<readonly CompositionBlockState[]>;
18
18
  readonly convergeSoon: () => void;
19
19
  readonly logger: IScopedLogger;
20
+ /** Every capability definition — the listing is derived from them, never from the registry's live state. */
21
+ readonly capabilityDefinitions: readonly CapabilityDefinition[];
20
22
  }
21
- export type CompositionApi = Pick<ICoreBlocksProvider, 'createComposition' | 'updateComposition' | 'getComposition' | 'listCompositions' | 'validateComposition' | 'getCustomization'>;
23
+ export type CompositionApi = Pick<ICoreBlocksProvider, 'createComposition' | 'updateComposition' | 'getComposition' | 'listCompositions' | 'validateComposition' | 'getCustomization' | 'listComposableCaps'>;
22
24
  /**
23
25
  * Every write runs validate-then-persist on ONE chain. Validation awaits a
24
26
  * source read before the save lands; two unserialized saves (A reads B, B
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-D25eq33W.js");
4
- const require_composition_sources = require("../../composition-sources-CB_xQieM.js");
3
+ const require_dist = require("../../dist-Bup0sTZb.js");
4
+ const require_composition_sources = require("../../composition-sources-DkVxrXLm.js");
5
5
  let node_crypto = require("node:crypto");
6
6
  let _camstack_types_node = require("@camstack/types/node");
7
7
  let node_fs_promises = require("node:fs/promises");
@@ -1407,7 +1407,8 @@ function buildCompositionApi(deps) {
1407
1407
  }
1408
1408
  };
1409
1409
  },
1410
- validateComposition: async ({ composition, blockId }) => validateAgainstStore(deps, composition, blockId ?? null)
1410
+ validateComposition: async ({ composition, blockId }) => validateAgainstStore(deps, composition, blockId ?? null),
1411
+ listComposableCaps: async ({ deviceType }) => ({ caps: [...require_dist.describeComposableCaps(deps.capabilityDefinitions, deviceType)] })
1411
1412
  };
1412
1413
  }
1413
1414
  //#endregion
@@ -1705,7 +1706,8 @@ var CoreBlocksAddon = class extends require_dist.BaseAddon {
1705
1706
  lookupCap: require_dist.buildCapabilityLookup(require_dist.ALL_CAPABILITY_DEFINITIONS),
1706
1707
  composerStates: async (blockIds) => (await requireApi().composer.getStates.query({ blockIds: [...blockIds] })).states,
1707
1708
  convergeSoon: () => this.convergeSoon(),
1708
- logger: this.ctx.logger.child("compositions")
1709
+ logger: this.ctx.logger.child("compositions"),
1710
+ capabilityDefinitions: require_dist.ALL_CAPABILITY_DEFINITIONS
1709
1711
  });
1710
1712
  }
1711
1713
  };
@@ -1,5 +1,5 @@
1
- import { $ as coreBlockAddonId, Gn as errMsg, K as buildCapabilityLookup, Kn as BaseAddon, Ln as compositionSourceKey, Mn as composedDeviceRef, Q as compositionSourceRefs, Zt as planComposition, bn as validateComposition, d as CORE_BLOCK_ADDON_PREFIX, et as coreBlockComposition, f as CoreBlockSchema, h as DeclaredDevices, l as COMPOSER_RUNNER_ID, nn as replacedFieldKeys, nt as coreBlockSourceKind, rt as coreBlocksCapability, t as ALL_CAPABILITY_DEFINITIONS, tt as coreBlockIdFromAddonId, u as CORE_BLOCKS_ADDON_ID } from "../../dist-DENeGKrn.mjs";
2
- import { t as describeCompositionSources } from "../../composition-sources-RzhpNlEu.mjs";
1
+ import { $ as compositionSourceRefs, Cn as validateComposition, K as buildCapabilityLookup, Kn as errMsg, Nn as composedDeviceRef, Rn as compositionSourceKey, an as replacedFieldKeys, d as CORE_BLOCK_ADDON_PREFIX, dt as describeComposableCaps, en as planComposition, et as coreBlockAddonId, f as CoreBlockSchema, h as DeclaredDevices, it as coreBlocksCapability, l as COMPOSER_RUNNER_ID, nt as coreBlockIdFromAddonId, qn as BaseAddon, rt as coreBlockSourceKind, t as ALL_CAPABILITY_DEFINITIONS, tt as coreBlockComposition, u as CORE_BLOCKS_ADDON_ID } from "../../dist-Bs6UyVGd.mjs";
2
+ import { t as describeCompositionSources } from "../../composition-sources-CeAPNF5Q.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { customizationBlockName } from "@camstack/types/node";
5
5
  import * as fs from "node:fs/promises";
@@ -1403,7 +1403,8 @@ function buildCompositionApi(deps) {
1403
1403
  }
1404
1404
  };
1405
1405
  },
1406
- validateComposition: async ({ composition, blockId }) => validateAgainstStore(deps, composition, blockId ?? null)
1406
+ validateComposition: async ({ composition, blockId }) => validateAgainstStore(deps, composition, blockId ?? null),
1407
+ listComposableCaps: async ({ deviceType }) => ({ caps: [...describeComposableCaps(deps.capabilityDefinitions, deviceType)] })
1407
1408
  };
1408
1409
  }
1409
1410
  //#endregion
@@ -1701,7 +1702,8 @@ var CoreBlocksAddon = class extends BaseAddon {
1701
1702
  lookupCap: buildCapabilityLookup(ALL_CAPABILITY_DEFINITIONS),
1702
1703
  composerStates: async (blockIds) => (await requireApi().composer.getStates.query({ blockIds: [...blockIds] })).states,
1703
1704
  convergeSoon: () => this.convergeSoon(),
1704
- logger: this.ctx.logger.child("compositions")
1705
+ logger: this.ctx.logger.child("compositions"),
1706
+ capabilityDefinitions: ALL_CAPABILITY_DEFINITIONS
1705
1707
  });
1706
1708
  }
1707
1709
  };
@@ -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-D25eq33W.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-BH9LRNsg.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-Db0P4Yvn.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
10
10
  let _camstack_types_node = require("@camstack/types/node");
@@ -1,5 +1,5 @@
1
- import { Gn as errMsg, Hn as DeviceFeature, Kn as BaseAddon, Lt as locationIconKey, Nt as legacyAutoLinkIds, Qn as WELL_KNOWN_TAB_MAP, S as LocationIconIdSchema, Un as DeviceRole, Wn as DeviceType, Xt as parseStreamParamsFormPatch, _t as enumerateSchemaFields, bt as expandContainer, ct as defineExtensionSlotProvider, dn as siteZoneKey, dt as deviceManagerCapability, ft as deviceStateCapability, g as DeviceStatusSchema, gr as EventCategory, gt as enumerateItemArrayFields, hr as sleep$1, it as createDeviceExtensionProvider, j as STREAM_PROFILE_META, o as CAMERA_SWITCH_ORDER, on as runtimeStatePolicyFor, p as DAY_NAMES, pt as deviceStatusCapability, q as buildStreamParamsConfigSchema, qt as normalizeUnit, s as CAP_NAMES_WITH_STATUS, sr as isDeviceConfigCap, t as ALL_CAPABILITY_DEFINITIONS, ut as deviceExtensionCapability, v as FieldClaimModeSchema, w as MINUTES_PER_DAY, wt as formatMinutes, y as FieldClaimSchema } from "../../dist-DENeGKrn.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-iFdgpbfM.mjs";
1
+ import { $n as WELL_KNOWN_TAB_MAP, $t as parseStreamParamsFormPatch, Bt as locationIconKey, Ct as expandContainer, Dt as formatMinutes, Gn as DeviceType, It as legacyAutoLinkIds, J as buildStreamParamsConfigSchema, Kn as errMsg, S as LocationIconIdSchema, Un as DeviceFeature, Wn as DeviceRole, Xt as normalizeUnit, _r as EventCategory, at as createDeviceExtensionProvider, bt as enumerateSchemaFields, cr as isDeviceConfigCap, ft as deviceExtensionCapability, g as DeviceStatusSchema, gr as sleep$1, ht as deviceStatusCapability, j as STREAM_PROFILE_META, ln as runtimeStatePolicyFor, lt as defineExtensionSlotProvider, mn as siteZoneKey, mt as deviceStateCapability, o as CAMERA_SWITCH_ORDER, p as DAY_NAMES, pt as deviceManagerCapability, qn as BaseAddon, s as CAP_NAMES_WITH_STATUS, t as ALL_CAPABILITY_DEFINITIONS, v as FieldClaimModeSchema, w as MINUTES_PER_DAY, y as FieldClaimSchema, yt as enumerateItemArrayFields } from "../../dist-Bs6UyVGd.mjs";
2
+ import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-LROp1DXx.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
@@ -1,4 +1,4 @@
1
- import { CompositionFieldsFeature, CompositionSourceRef, DeviceType, ICoreBlocksProvider, IScopedLogger } from '@camstack/types';
1
+ import { DeviceType, ICoreBlocksProvider, IScopedLogger } from '@camstack/types';
2
2
  import { BindingEntryView } from './binding-mirror.js';
3
3
  import { DoorbellSource } from './doorbell-settings.js';
4
4
  export declare const DOORBELL_COMPOSITION_MIGRATION_STATE_KEY = "doorbell-source-composition-migration-v1";
@@ -32,17 +32,6 @@ export interface DoorbellCompositionMigrationDeps {
32
32
  readonly isComplete: () => Promise<boolean>;
33
33
  readonly markComplete: () => Promise<void>;
34
34
  }
35
- interface DoorbellFeatureSource {
36
- readonly source: CompositionSourceRef;
37
- readonly cap: string;
38
- readonly activeField: string;
39
- readonly changedAtField: string;
40
- }
41
- export declare function buildDoorbellCompositionFeature(input: {
42
- readonly camera: CompositionSourceRef;
43
- readonly sources: readonly DoorbellFeatureSource[];
44
- readonly enabled: boolean;
45
- }): CompositionFieldsFeature;
46
35
  export declare class DoorbellCompositionMigration {
47
36
  private readonly deps;
48
37
  private rerunRequested;
@@ -56,4 +45,3 @@ export declare class DoorbellCompositionMigration {
56
45
  private runAttempt;
57
46
  private warnCamera;
58
47
  }
59
- export {};
@@ -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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
7
  const require_device_state_changed = require("../../device-state-changed-Bk7cvTnz.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/doorbell/trigger-engine.ts
@@ -612,50 +612,6 @@ var DOORBELL_COMPOSITION_MIGRATION_CALLER = {
612
612
  userId: "system:doorbell-source-migration",
613
613
  isAdmin: true
614
614
  };
615
- function buildDoorbellCompositionFeature(input) {
616
- const sources = [...input.sources].toSorted((a, b) => `${a.source.addonId}/${a.source.stableId}#${a.cap}`.localeCompare(`${b.source.addonId}/${b.source.stableId}#${b.cap}`));
617
- if (sources.length === 0) throw new Error("doorbell composition needs at least one source");
618
- const edgeBindings = {};
619
- sources.forEach((entry, index) => {
620
- edgeBindings[`active${index}`] = {
621
- kind: "from",
622
- source: entry.source,
623
- cap: entry.cap,
624
- fieldPath: entry.activeField
625
- };
626
- edgeBindings[`changed${index}`] = {
627
- kind: "from",
628
- source: entry.source,
629
- cap: entry.cap,
630
- fieldPath: entry.changedAtField
631
- };
632
- });
633
- return {
634
- kind: "fields",
635
- cap: "doorbell",
636
- enabled: input.enabled,
637
- fields: {
638
- lastPressedAt: {
639
- kind: "expression",
640
- expr: `latest(${sources.map((_, index) => `rose(active${index}, changed${index}, 2000)`).join(", ")})`,
641
- bindings: edgeBindings
642
- },
643
- pressCountSinceStart: {
644
- kind: "expression",
645
- expr: "count(lastPressedAt)",
646
- bindings: { lastPressedAt: {
647
- kind: "from",
648
- source: {
649
- addonId: input.camera.addonId,
650
- stableId: input.camera.stableId
651
- },
652
- cap: "doorbell",
653
- fieldPath: "lastPressedAt"
654
- } }
655
- }
656
- }
657
- };
658
- }
659
615
  function isRecord(value) {
660
616
  return typeof value === "object" && value !== null && !Array.isArray(value);
661
617
  }
@@ -671,32 +627,18 @@ function withoutEnabled(feature) {
671
627
  const { enabled: _enabled, ...rest } = feature;
672
628
  return rest;
673
629
  }
674
- function bindingHasCap(entries, cap) {
675
- return entries.some((entry) => entry.capName === cap);
676
- }
677
630
  function migrationSources(camera, configured, devicesById, bindingsById) {
678
631
  const sources = [];
679
632
  for (const configuredSource of configured) {
680
633
  const device = devicesById.get(configuredSource.deviceId);
681
634
  const entries = bindingsById.get(configuredSource.deviceId);
682
635
  if (device === void 0 || entries === void 0) throw new Error(`source device ${configuredSource.deviceId} could not be resolved and read`);
683
- const ref = {
636
+ const found = require_dist.doorbellFeatureSources({
684
637
  addonId: device.addonId,
685
638
  stableId: device.stableId
686
- };
687
- const supportedCaps = Object.keys(require_dist.SOURCE_CAP_ACTIVE_FIELD).filter((cap) => Object.hasOwn(require_dist.SOURCE_CAP_CHANGED_AT_FIELD, cap) && bindingHasCap(entries, cap)).toSorted();
688
- if (supportedCaps.length === 0) throw new Error(`source device ${configuredSource.deviceId} has no supported source capability`);
689
- for (const cap of supportedCaps) {
690
- const activeField = require_dist.SOURCE_CAP_ACTIVE_FIELD[cap];
691
- const changedAtField = require_dist.SOURCE_CAP_CHANGED_AT_FIELD[cap];
692
- if (activeField === void 0 || changedAtField === void 0) throw new Error(`source capability ${cap} has no transition field mapping`);
693
- sources.push({
694
- source: ref,
695
- cap,
696
- activeField,
697
- changedAtField
698
- });
699
- }
639
+ }, entries.map((entry) => entry.capName));
640
+ if (found.length === 0) throw new Error(`source device ${configuredSource.deviceId} has no supported source capability`);
641
+ sources.push(...found);
700
642
  }
701
643
  if (sources.length === 0) throw new Error(`camera ${camera.id} has no resolvable doorbell sources`);
702
644
  return sources;
@@ -803,7 +745,7 @@ var DoorbellCompositionMigration = class {
803
745
  const composerBound = composerIsBound(entries);
804
746
  const crashRecovery = !wrapperActive && composerBound && existingDoorbell?.kind === "fields" && existingDoorbell.enabled === true;
805
747
  const enabled = wrapperActive || crashRecovery;
806
- const canonical = buildDoorbellCompositionFeature({
748
+ const canonical = require_dist.buildDoorbellCompositionFeature({
807
749
  camera: cameraRef,
808
750
  sources,
809
751
  enabled
@@ -1,4 +1,4 @@
1
- import { At as isSameAddonId, Bn as isSourceCap, Dn as SOURCE_CAPS, Gn as errMsg, Kn as BaseAddon, On as SOURCE_CAP_ACTIVE_FIELD, W as bareAddonId, Wn as DeviceType, ct as defineExtensionSlotProvider, gr as EventCategory, it as createDeviceExtensionProvider, kn as SOURCE_CAP_CHANGED_AT_FIELD, mt as doorbellCapability, nr as createEvent, ut as deviceExtensionCapability, zn as evaluateSensorEdge } from "../../dist-DENeGKrn.mjs";
1
+ import { An as SOURCE_CAPS, Bn as evaluateSensorEdge, Gn as DeviceType, Kn as errMsg, Nt as isSameAddonId, Vn as isSourceCap, W as bareAddonId, _r as EventCategory, _t as doorbellFeatureSources, at as createDeviceExtensionProvider, ft as deviceExtensionCapability, gt as doorbellCapability, lt as defineExtensionSlotProvider, q as buildDoorbellCompositionFeature, qn as BaseAddon, rr as createEvent } from "../../dist-Bs6UyVGd.mjs";
2
2
  import { n as parseDeviceStateChanged } from "../../device-state-changed-DoBbkyEI.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/doorbell/trigger-engine.ts
@@ -607,50 +607,6 @@ var DOORBELL_COMPOSITION_MIGRATION_CALLER = {
607
607
  userId: "system:doorbell-source-migration",
608
608
  isAdmin: true
609
609
  };
610
- function buildDoorbellCompositionFeature(input) {
611
- const sources = [...input.sources].toSorted((a, b) => `${a.source.addonId}/${a.source.stableId}#${a.cap}`.localeCompare(`${b.source.addonId}/${b.source.stableId}#${b.cap}`));
612
- if (sources.length === 0) throw new Error("doorbell composition needs at least one source");
613
- const edgeBindings = {};
614
- sources.forEach((entry, index) => {
615
- edgeBindings[`active${index}`] = {
616
- kind: "from",
617
- source: entry.source,
618
- cap: entry.cap,
619
- fieldPath: entry.activeField
620
- };
621
- edgeBindings[`changed${index}`] = {
622
- kind: "from",
623
- source: entry.source,
624
- cap: entry.cap,
625
- fieldPath: entry.changedAtField
626
- };
627
- });
628
- return {
629
- kind: "fields",
630
- cap: "doorbell",
631
- enabled: input.enabled,
632
- fields: {
633
- lastPressedAt: {
634
- kind: "expression",
635
- expr: `latest(${sources.map((_, index) => `rose(active${index}, changed${index}, 2000)`).join(", ")})`,
636
- bindings: edgeBindings
637
- },
638
- pressCountSinceStart: {
639
- kind: "expression",
640
- expr: "count(lastPressedAt)",
641
- bindings: { lastPressedAt: {
642
- kind: "from",
643
- source: {
644
- addonId: input.camera.addonId,
645
- stableId: input.camera.stableId
646
- },
647
- cap: "doorbell",
648
- fieldPath: "lastPressedAt"
649
- } }
650
- }
651
- }
652
- };
653
- }
654
610
  function isRecord(value) {
655
611
  return typeof value === "object" && value !== null && !Array.isArray(value);
656
612
  }
@@ -666,32 +622,18 @@ function withoutEnabled(feature) {
666
622
  const { enabled: _enabled, ...rest } = feature;
667
623
  return rest;
668
624
  }
669
- function bindingHasCap(entries, cap) {
670
- return entries.some((entry) => entry.capName === cap);
671
- }
672
625
  function migrationSources(camera, configured, devicesById, bindingsById) {
673
626
  const sources = [];
674
627
  for (const configuredSource of configured) {
675
628
  const device = devicesById.get(configuredSource.deviceId);
676
629
  const entries = bindingsById.get(configuredSource.deviceId);
677
630
  if (device === void 0 || entries === void 0) throw new Error(`source device ${configuredSource.deviceId} could not be resolved and read`);
678
- const ref = {
631
+ const found = doorbellFeatureSources({
679
632
  addonId: device.addonId,
680
633
  stableId: device.stableId
681
- };
682
- const supportedCaps = Object.keys(SOURCE_CAP_ACTIVE_FIELD).filter((cap) => Object.hasOwn(SOURCE_CAP_CHANGED_AT_FIELD, cap) && bindingHasCap(entries, cap)).toSorted();
683
- if (supportedCaps.length === 0) throw new Error(`source device ${configuredSource.deviceId} has no supported source capability`);
684
- for (const cap of supportedCaps) {
685
- const activeField = SOURCE_CAP_ACTIVE_FIELD[cap];
686
- const changedAtField = SOURCE_CAP_CHANGED_AT_FIELD[cap];
687
- if (activeField === void 0 || changedAtField === void 0) throw new Error(`source capability ${cap} has no transition field mapping`);
688
- sources.push({
689
- source: ref,
690
- cap,
691
- activeField,
692
- changedAtField
693
- });
694
- }
634
+ }, entries.map((entry) => entry.capName));
635
+ if (found.length === 0) throw new Error(`source device ${configuredSource.deviceId} has no supported source capability`);
636
+ sources.push(...found);
695
637
  }
696
638
  if (sources.length === 0) throw new Error(`camera ${camera.id} has no resolvable doorbell sources`);
697
639
  return sources;
@@ -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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Kn as BaseAddon, Rt as logDestinationCapability } from "../../dist-DENeGKrn.mjs";
1
+ import { Vt as logDestinationCapability, qn as BaseAddon } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
3
+ const require_dist = require("../../dist-Bup0sTZb.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 { E as RECORDING_SOURCE_CAMSTACK_ADDON, Gn as errMsg, Kn as BaseAddon, gr as EventCategory, k as RecordingStatusSchema, nr as createEvent } from "../../dist-DENeGKrn.mjs";
1
+ import { E as RECORDING_SOURCE_CAMSTACK_ADDON, Kn as errMsg, _r as EventCategory, k as RecordingStatusSchema, qn as BaseAddon, rr as createEvent } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { H as authProviderCapability, Kn as BaseAddon, L as UserRecordSchema, M as ScopedTokenSchema, r as ApiKeyRecordSchema, yn as userManagementCapability } from "../../dist-DENeGKrn.mjs";
2
+ import { H as authProviderCapability, L as UserRecordSchema, M as ScopedTokenSchema, Sn as userManagementCapability, qn as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
3
+ const require_dist = require("../../dist-Bup0sTZb.js");
4
4
  const require_tls = require("../../tls-D_wUeOTD.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 { It as localNetworkCapability, Kn as BaseAddon, gr as EventCategory } from "../../dist-DENeGKrn.mjs";
1
+ import { _r as EventCategory, qn as BaseAddon, zt as localNetworkCapability } from "../../dist-Bs6UyVGd.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-IM-v7JV4.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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 { Kn as BaseAddon, Rt as logDestinationCapability } from "../../dist-DENeGKrn.mjs";
1
+ import { Vt as logDestinationCapability, qn as BaseAddon } from "../../dist-Bs6UyVGd.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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.js");
7
7
  const require_proc_stat = require("../../proc-stat-DL-WUOhl.js");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { Ct as foldSnapshotByFunction, Gn as errMsg, Kn as BaseAddon, Wt as metricsProviderCapability, gr as EventCategory, nr as createEvent, rn as resolveBucketMs, tn as reducePoints } from "../../dist-DENeGKrn.mjs";
1
+ import { Et as foldSnapshotByFunction, Kn as errMsg, _r as EventCategory, in as reducePoints, on as resolveBucketMs, qn as BaseAddon, qt as metricsProviderCapability, rr as createEvent } from "../../dist-Bs6UyVGd.mjs";
2
2
  import { a as parseProcStat, i as nodeProcReader, n as elapsedSecSince, o as parseProcStatusRss, r as lifetimeCpuPercent, t as commandFromCmdline } from "../../proc-stat-CbC55Kqi.mjs";
3
3
  import { access, readFile, readdir } from "node:fs/promises";
4
4
  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-D25eq33W.js");
6
+ const require_dist = require("../../dist-Bup0sTZb.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,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Gn as errMsg, Kn as BaseAddon, Qt as platformProbeCapability, gr as EventCategory, ht as enumerateInferenceDevices, ir as emitReadiness, ln as scoreRuntimes } from "../../dist-DENeGKrn.mjs";
2
+ import { Kn as errMsg, _r as EventCategory, ar as emitReadiness, fn as scoreRuntimes, qn as BaseAddon, tn as platformProbeCapability, vt as enumerateInferenceDevices } from "../../dist-Bs6UyVGd.mjs";
3
3
  import * as fs from "node:fs";
4
4
  import { execFile } from "node:child_process";
5
5
  import * as os from "node:os";