@camstack/system 1.2.330 → 1.2.331

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 (78) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/autotrack/index.js +3 -3
  10. package/dist/builtins/autotrack/index.mjs +3 -3
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  13. package/dist/builtins/camera-grid/index.js +1 -1
  14. package/dist/builtins/camera-grid/index.mjs +1 -1
  15. package/dist/builtins/composer/composer.addon.js +27 -8
  16. package/dist/builtins/composer/composer.addon.mjs +21 -3
  17. package/dist/builtins/console-logging/index.js +1 -1
  18. package/dist/builtins/console-logging/index.mjs +1 -1
  19. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  20. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  21. package/dist/builtins/device-manager/device-bindings-store.d.ts +7 -0
  22. package/dist/builtins/device-manager/device-manager.addon.d.ts +3 -0
  23. package/dist/builtins/device-manager/device-manager.addon.js +130 -3
  24. package/dist/builtins/device-manager/device-manager.addon.mjs +130 -3
  25. package/dist/builtins/device-manager/stale-wrapper-activations.d.ts +26 -0
  26. package/dist/builtins/hub-forwarder/index.js +1 -1
  27. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  28. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  29. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  30. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  31. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  32. package/dist/builtins/local-network/local-network.addon.js +1 -1
  33. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  34. package/dist/builtins/loki-logging/index.js +1 -1
  35. package/dist/builtins/loki-logging/index.mjs +1 -1
  36. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  37. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  38. package/dist/builtins/platform-probe/index.js +1 -1
  39. package/dist/builtins/platform-probe/index.mjs +1 -1
  40. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  41. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  42. package/dist/builtins/shared/device-state-changed.d.ts +3 -4
  43. package/dist/builtins/snapshot/index.js +1 -1
  44. package/dist/builtins/snapshot/index.mjs +1 -1
  45. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  46. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  47. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  48. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  49. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  50. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  51. package/dist/builtins/system-config/system-config.addon.js +1 -1
  52. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  53. package/dist/builtins/winston-logging/index.js +1 -1
  54. package/dist/builtins/winston-logging/index.mjs +1 -1
  55. package/dist/{child-cap-dispatch-C8uts1P4.js → child-cap-dispatch-93MfsaZL.js} +1 -0
  56. package/dist/{child-cap-dispatch-C2VINHu1.mjs → child-cap-dispatch-kLIiU1CG.mjs} +1 -0
  57. package/dist/{composition-sources-2XxNEet3.js → composition-sources-BXZorHDO.js} +1 -1
  58. package/dist/{composition-sources-Wj2kWund.mjs → composition-sources-aEEer5gE.mjs} +1 -1
  59. package/dist/{dist-Dp043AI0.mjs → dist-CoG8lY6H.mjs} +222 -374
  60. package/dist/{dist-Bx4zxM9N.js → dist-DRUzy1SF.js} +221 -421
  61. package/dist/index.js +2 -2
  62. package/dist/index.mjs +2 -2
  63. package/dist/{retired-settings-keys-DR2WMe5d.js → retired-settings-keys-BY9H1I2b.js} +1 -1
  64. package/dist/{retired-settings-keys-Dxf9vELs.mjs → retired-settings-keys-BcJDpASY.mjs} +1 -1
  65. package/package.json +1 -16
  66. package/dist/builtins/doorbell/binding-mirror.d.ts +0 -110
  67. package/dist/builtins/doorbell/doorbell-composition-migration.d.ts +0 -47
  68. package/dist/builtins/doorbell/doorbell-extension-slot.d.ts +0 -67
  69. package/dist/builtins/doorbell/doorbell-settings.d.ts +0 -58
  70. package/dist/builtins/doorbell/index.d.ts +0 -2
  71. package/dist/builtins/doorbell/index.js +0 -8
  72. package/dist/builtins/doorbell/index.mjs +0 -2
  73. package/dist/builtins/doorbell/trigger-engine.d.ts +0 -92
  74. package/dist/builtins/doorbell/virtual-doorbell.addon.d.ts +0 -218
  75. package/dist/builtins/doorbell/virtual-doorbell.addon.js +0 -1413
  76. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +0 -1407
  77. package/dist/device-state-changed-Bk7cvTnz.js +0 -31
  78. package/dist/device-state-changed-DoBbkyEI.mjs +0 -20
@@ -1,5 +1,5 @@
1
- import { Bt as legacyAutoLinkIds, Ct as enumerateItemArrayFields, D as MINUTES_PER_DAY, Dt as expandContainer, Jn as DeviceRole, P as STREAM_PROFILE_META, S as FieldClaimSchema, Sr as EventCategory, T as LocationIconIdSchema, Wt as locationIconKey, Xn as errMsg, Yn as DeviceType, Z as buildStreamParamsConfigSchema, Zn as BaseAddon, _t as deviceManagerCapability, br as sleep$1, ct as createDeviceExtensionProvider, en as normalizeUnit, fr as isDeviceConfigCap, g as DAY_NAMES, gt as deviceExtensionCapability, jt as formatMinutes, o as CAMERA_SWITCH_ORDER, pn as runtimeStatePolicyFor, pt as defineExtensionSlotProvider, qn as DeviceFeature, rn as parseStreamParamsFormPatch, rr as WELL_KNOWN_TAB_MAP, s as CAP_NAMES_WITH_STATUS, t as ALL_CAPABILITY_DEFINITIONS, vn as siteZoneKey, vt as deviceStateCapability, wt as enumerateSchemaFields, x as FieldClaimModeSchema, y as DeviceStatusSchema, yt as deviceStatusCapability } from "../../dist-Dp043AI0.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-Dxf9vELs.mjs";
1
+ import { $t as parseStreamParamsFormPatch, Bn as DeviceRole, Bt as locationIconKey, D as MINUTES_PER_DAY, Hn as errMsg, It as legacyAutoLinkIds, Ot as formatMinutes, P as STREAM_PROFILE_META, S as FieldClaimSchema, T as LocationIconIdSchema, Un as BaseAddon, Vn as DeviceType, X as buildStreamParamsConfigSchema, Xt as normalizeUnit, Yn as WELL_KNOWN_TAB_MAP, _t as deviceStateCapability, bt as enumerateItemArrayFields, fr as sleep$1, ft as defineExtensionSlotProvider, g as DAY_NAMES, gt as deviceManagerCapability, ht as deviceExtensionCapability, ir as isDeviceConfigCap, ln as runtimeStatePolicyFor, mn as siteZoneKey, mr as EventCategory, o as CAMERA_SWITCH_ORDER, s as CAP_NAMES_WITH_STATUS, st as createDeviceExtensionProvider, t as ALL_CAPABILITY_DEFINITIONS, vt as deviceStatusCapability, wt as expandContainer, x as FieldClaimModeSchema, xt as enumerateSchemaFields, y as DeviceStatusSchema, zn as DeviceFeature } from "../../dist-CoG8lY6H.mjs";
2
+ import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-BcJDpASY.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
@@ -1020,6 +1020,118 @@ function mergeAggregates(parts) {
1020
1020
  return out;
1021
1021
  }
1022
1022
  //#endregion
1023
+ //#region src/builtins/device-manager/stale-wrapper-activations.ts
1024
+ /**
1025
+ * A stored wrapper activation that names a cap with NO wrapper any more.
1026
+ *
1027
+ * `deviceBindings[device][cap].wrapperAddonId` is the operator's choice of a
1028
+ * wrapper. When a wrapper is RETIRED (the `virtual-doorbell` on `doorbell`,
1029
+ * slice 6, D671), its rows outlive it: nothing deletes them (spec S1 — the
1030
+ * cluster is not written by code), and the admin UI no longer offers a toggle
1031
+ * for a cap that is not a wrapper cap. Routed as before, such a row shadows
1032
+ * the device's native (a composed doorbell) behind an addon that no longer
1033
+ * exists, keeps the cap advertised to HA / HAP / Alexa, and refuses every
1034
+ * call — without a line (task 17 review M1, D391).
1035
+ *
1036
+ * So the row is judged against the cap's DECLARED definition — static at boot,
1037
+ * never the live registry, because a wrapper runner that is still starting must
1038
+ * not read as stale. A string `wrapperAddonId` on a cap that is declared and is
1039
+ * not `kind: 'wrapper'` is treated as ABSENT: the cap resolves to its native
1040
+ * (or to nothing), exactly as if the row were not there. That loses no
1041
+ * doorbell: with a native, the native serves it; without one, the retired
1042
+ * addon could not serve it either. A cap this build does not declare is NOT
1043
+ * judged (unknown is not stale).
1044
+ *
1045
+ * It is said once per (device, cap) per process, by name, with the call that
1046
+ * clears the row. The whole store is checked once per process, read-only, so a
1047
+ * device nobody asks about is still named; a read that fails changes nothing,
1048
+ * says it could not check, and the next answered read checks instead (D49).
1049
+ * Generic on purpose: the next wrapper retirement gets the same backstop.
1050
+ */
1051
+ var STALE_MESSAGE = "bindings: a stored wrapper activation names a cap with no wrapper — ignored, the cap resolves to its native";
1052
+ var UNCHECKED_MESSAGE = "bindings: could not read the stored wrapper activations — retired-wrapper rows not checked";
1053
+ var RECOVERY = "deviceManager.setWrapperActive({ deviceId, capName, wrapperAddonId, active: false })";
1054
+ /**
1055
+ * Every cap this build declares that is NOT a wrapper cap — built once from
1056
+ * the static table: `getAllBindings` is a scheduled hot path, and step 1 asks
1057
+ * this for every stored string activation (re-review N2).
1058
+ */
1059
+ var DECLARED_NON_WRAPPER_CAPS = new Set(ALL_CAPABILITY_DEFINITIONS.filter((cap) => cap.kind !== "wrapper").map((cap) => cap.name));
1060
+ /** True when `capName` is declared by this build and is NOT a wrapper cap. */
1061
+ function isDeclaredNonWrapperCap(capName) {
1062
+ return DECLARED_NON_WRAPPER_CAPS.has(capName);
1063
+ }
1064
+ function isRecord$1(value) {
1065
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1066
+ }
1067
+ /** A persisted activation of a wrapper on a cap that has none (see module docblock). */
1068
+ function isRetiredWrapperActivation(capName, wrapperAddonId) {
1069
+ return typeof wrapperAddonId === "string" && isDeclaredNonWrapperCap(capName);
1070
+ }
1071
+ /**
1072
+ * The per-process memory: which (device, cap) rows have been said, and whether
1073
+ * the whole store has been checked once. Owned by the device-manager instance.
1074
+ */
1075
+ var StaleWrapperActivations = class {
1076
+ logger;
1077
+ said = /* @__PURE__ */ new Set();
1078
+ checked = false;
1079
+ constructor(logger) {
1080
+ this.logger = logger;
1081
+ }
1082
+ /** Say one row, once per process. */
1083
+ report(deviceId, capName, wrapperAddonId) {
1084
+ const key = `${deviceId}\u0000${capName}`;
1085
+ if (this.said.has(key)) return;
1086
+ this.said.add(key);
1087
+ this.logger.warn(STALE_MESSAGE, {
1088
+ tags: { deviceId },
1089
+ meta: {
1090
+ capName,
1091
+ wrapperAddonId,
1092
+ recovery: RECOVERY
1093
+ }
1094
+ });
1095
+ }
1096
+ /**
1097
+ * Check a store that was already READ (by a bindings pass) — once per
1098
+ * process. It never throws: it runs inside every bindings pass and under the
1099
+ * boot `void` promise, so a corrupt entry (a null device or row, a hand edit,
1100
+ * a partial write) is skipped — a row it cannot read is not one it can judge
1101
+ * (re-review N1).
1102
+ */
1103
+ checkStore(store) {
1104
+ if (this.checked) return;
1105
+ this.checked = true;
1106
+ const devices = store.deviceBindings;
1107
+ if (!isRecord$1(devices)) return;
1108
+ for (const [deviceKey, perDevice] of Object.entries(devices)) {
1109
+ const deviceId = Number(deviceKey);
1110
+ if (!Number.isInteger(deviceId) || !isRecord$1(perDevice)) continue;
1111
+ for (const [capName, row] of Object.entries(perDevice)) {
1112
+ const wrapperAddonId = isRecord$1(row) ? row["wrapperAddonId"] : void 0;
1113
+ if (typeof wrapperAddonId === "string" && isDeclaredNonWrapperCap(capName)) this.report(deviceId, capName, wrapperAddonId);
1114
+ }
1115
+ }
1116
+ }
1117
+ /** Read the store (read-only) and check it; a failed read changes nothing. */
1118
+ async checkOnce(read) {
1119
+ if (this.checked) return;
1120
+ let store;
1121
+ try {
1122
+ store = await read();
1123
+ } catch (err) {
1124
+ this.logger.warn(UNCHECKED_MESSAGE, { meta: { error: err instanceof Error ? err.message : String(err) } });
1125
+ return;
1126
+ }
1127
+ try {
1128
+ this.checkStore(store);
1129
+ } catch (err) {
1130
+ this.logger.warn(UNCHECKED_MESSAGE, { meta: { error: err instanceof Error ? err.message : String(err) } });
1131
+ }
1132
+ }
1133
+ };
1134
+ //#endregion
1023
1135
  //#region src/builtins/device-manager/device-bindings-store.ts
1024
1136
  /**
1025
1137
  * Wire the push-fed cross-process native-cap cache (`remoteNativeCaps`).
@@ -1260,6 +1372,7 @@ function collectionBindings(deps, deviceId, deviceType) {
1260
1372
  }
1261
1373
  async function getBindings(deps, input) {
1262
1374
  const [row, store] = await Promise.all([deps.rows.get(input.deviceId), readBindingsStore(deps)]);
1375
+ deps.staleWrapperActivations.checkStore(store);
1263
1376
  return resolveBindingsForDevice(deps, input.deviceId, row, {
1264
1377
  store,
1265
1378
  ledgerNonEmpty: onceLedgerNonEmpty(deps)
@@ -1304,6 +1417,10 @@ async function resolveBindingsForDevice(deps, deviceId, row, pass) {
1304
1417
  const resolveRemote = (capName) => deps.remoteNativeCaps.get(deviceId)?.get(capName) ?? resolveRemoteNativeCapFromRegistry(deps, capName, deviceId);
1305
1418
  for (const [capName, { wrapperAddonId }] of Object.entries(perDevice)) {
1306
1419
  if (wrapperAddonId === void 0) continue;
1420
+ if (isRetiredWrapperActivation(capName, wrapperAddonId)) {
1421
+ deps.staleWrapperActivations.report(deviceId, capName, wrapperAddonId);
1422
+ continue;
1423
+ }
1307
1424
  const hubLocalNative = deps.capabilityRegistry?.getNativeAddonId(capName, deviceId) ?? null;
1308
1425
  const remoteNative = resolveRemote(capName);
1309
1426
  const nativeAddonId = hubLocalNative ?? remoteNative?.addonId ?? "";
@@ -1428,6 +1545,7 @@ async function resolveBindingsForDevice(deps, deviceId, row, pass) {
1428
1545
  async function getBindingsBatch(deps, input) {
1429
1546
  const ids = [...new Set(input.deviceIds)];
1430
1547
  const [rows, store] = await Promise.all([deps.rows.getMany(ids), readBindingsStore(deps)]);
1548
+ deps.staleWrapperActivations.checkStore(store);
1431
1549
  const pass = {
1432
1550
  store,
1433
1551
  ledgerNonEmpty: onceLedgerNonEmpty(deps)
@@ -1458,6 +1576,7 @@ async function getBindingsBatch(deps, input) {
1458
1576
  */
1459
1577
  async function getAllBindings(deps) {
1460
1578
  const [fleet, store] = await Promise.all([deps.rows.listAll(), readBindingsStore(deps)]);
1579
+ deps.staleWrapperActivations.checkStore(store);
1461
1580
  const rowById = /* @__PURE__ */ new Map();
1462
1581
  const ids = /* @__PURE__ */ new Set();
1463
1582
  for (const row of fleet) {
@@ -9633,6 +9752,12 @@ var DeviceManagerAddon = class extends BaseAddon {
9633
9752
  * one key range is the same defect one level up. Handed to both.
9634
9753
  */
9635
9754
  addonStoreWriteLock = createWriteLock();
9755
+ /** Stored activations of RETIRED wrappers, said once per process (task 17 review M1). */
9756
+ staleWrapperActivationsImpl = null;
9757
+ get staleWrapperActivations() {
9758
+ this.staleWrapperActivationsImpl ??= new StaleWrapperActivations(this.ctx.logger);
9759
+ return this.staleWrapperActivationsImpl;
9760
+ }
9636
9761
  /** Build the dependency context the extracted binding resolvers consume. */
9637
9762
  get bindingsDeps() {
9638
9763
  const rows = this.deviceRows;
@@ -9642,7 +9767,8 @@ var DeviceManagerAddon = class extends BaseAddon {
9642
9767
  capabilityRegistry: this.capabilityRegistry,
9643
9768
  remoteNativeCaps: this.remoteNativeCaps,
9644
9769
  rows,
9645
- withAddonStoreWriteLock: this.addonStoreWriteLock
9770
+ withAddonStoreWriteLock: this.addonStoreWriteLock,
9771
+ staleWrapperActivations: this.staleWrapperActivations
9646
9772
  };
9647
9773
  }
9648
9774
  async getBindings(input) {
@@ -9717,6 +9843,7 @@ var DeviceManagerAddon = class extends BaseAddon {
9717
9843
  const deviceRows = new DeviceRowStore(deviceRowBackendOf(settingsStoreApi), this.ctx.logger.child("rows"));
9718
9844
  await deviceRows.declare();
9719
9845
  this.deviceRows = deviceRows;
9846
+ this.staleWrapperActivations.checkOnce(() => readBindingsStore(this.bindingsDeps));
9720
9847
  try {
9721
9848
  await purgeRetiredSettingsRows(deviceRows.retiredRowStore(), this.ctx.logger.child("RetiredRows"));
9722
9849
  } catch (err) {
@@ -0,0 +1,26 @@
1
+ import { IScopedLogger } from '@camstack/types';
2
+ import { DeviceBindingsStore } from './device-meta-types.js';
3
+ /** A persisted activation of a wrapper on a cap that has none (see module docblock). */
4
+ export declare function isRetiredWrapperActivation(capName: string, wrapperAddonId: string | null | undefined): wrapperAddonId is string;
5
+ /**
6
+ * The per-process memory: which (device, cap) rows have been said, and whether
7
+ * the whole store has been checked once. Owned by the device-manager instance.
8
+ */
9
+ export declare class StaleWrapperActivations {
10
+ private readonly logger;
11
+ private readonly said;
12
+ private checked;
13
+ constructor(logger: IScopedLogger);
14
+ /** Say one row, once per process. */
15
+ report(deviceId: number, capName: string, wrapperAddonId: string): void;
16
+ /**
17
+ * Check a store that was already READ (by a bindings pass) — once per
18
+ * process. It never throws: it runs inside every bindings pass and under the
19
+ * boot `void` promise, so a corrupt entry (a null device or row, a hand edit,
20
+ * a partial write) is skipped — a row it cannot read is not one it can judge
21
+ * (re-review N1).
22
+ */
23
+ checkStore(store: DeviceBindingsStore): void;
24
+ /** Read the store (read-only) and check it; a failed read changes nothing. */
25
+ checkOnce(read: () => Promise<DeviceBindingsStore>): Promise<void>;
26
+ }
@@ -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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Gt as logDestinationCapability, Zn as BaseAddon } from "../../dist-Dp043AI0.mjs";
1
+ import { Un as BaseAddon, Vt as logDestinationCapability } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
3
+ const require_dist = require("../../dist-DRUzy1SF.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 { M as RecordingStatusSchema, Sr as EventCategory, Xn as errMsg, Zn as BaseAddon, k as RECORDING_SOURCE_CAMSTACK_ADDON, sr as createEvent } from "../../dist-Dp043AI0.mjs";
1
+ import { $n as createEvent, Hn as errMsg, M as RecordingStatusSchema, Un as BaseAddon, k as RECORDING_SOURCE_CAMSTACK_ADDON, mr as EventCategory } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { B as UserRecordSchema, En as userManagementCapability, F as ScopedTokenSchema, G as authProviderCapability, Zn as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-Dp043AI0.mjs";
2
+ import { B as UserRecordSchema, F as ScopedTokenSchema, G as authProviderCapability, Sn as userManagementCapability, Un as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
3
+ const require_dist = require("../../dist-DRUzy1SF.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 { Sr as EventCategory, Ut as localNetworkCapability, Zn as BaseAddon } from "../../dist-Dp043AI0.mjs";
1
+ import { Un as BaseAddon, mr as EventCategory, zt as localNetworkCapability } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Gt as logDestinationCapability, Zn as BaseAddon } from "../../dist-Dp043AI0.mjs";
1
+ import { Un as BaseAddon, Vt as logDestinationCapability } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { At as foldSnapshotByFunction, Sr as EventCategory, Xn as errMsg, Zn as BaseAddon, Zt as metricsProviderCapability, cn as reducePoints, sr as createEvent, un as resolveBucketMs } from "../../dist-Dp043AI0.mjs";
1
+ import { $n as createEvent, Dt as foldSnapshotByFunction, Hn as errMsg, Un as BaseAddon, in as reducePoints, mr as EventCategory, on as resolveBucketMs, qt as metricsProviderCapability } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Sr as EventCategory, St as enumerateInferenceDevices, Xn as errMsg, Zn as BaseAddon, an as platformProbeCapability, gn as scoreRuntimes, lr as emitReadiness } from "../../dist-Dp043AI0.mjs";
2
+ import { Hn as errMsg, Un as BaseAddon, fn as scoreRuntimes, mr as EventCategory, tn as platformProbeCapability, tr as emitReadiness, yt as enumerateInferenceDevices } from "../../dist-CoG8lY6H.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";
@@ -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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Sr as EventCategory, Zn as BaseAddon } from "../../dist-Dp043AI0.mjs";
1
+ import { Un as BaseAddon, mr as EventCategory } from "../../dist-CoG8lY6H.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * The ONE cast-free narrowing of the `device.state-changed` payload. The
3
3
  * category is not part of the typed `EventCatalog` — every subscriber validates
4
- * at the boundary, and until D659 two of them (virtual-doorbell, composer)
5
- * carried a verbatim copy each. Shared by the builtins, like
6
- * `./settle-sources.ts`; addons never import each other, and both consumers
7
- * live in this package.
4
+ * at the boundary, and the builtins share this one narrowing instead of a
5
+ * verbatim copy each (D659), like `./settle-sources.ts`; addons never import
6
+ * each other, and its consumers live in this package.
8
7
  */
9
8
  /** Narrowed payload of a `DeviceStateChanged` bus event. */
10
9
  export interface DeviceStateChangedData {
@@ -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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.js");
7
7
  const require_snapshot_courtesy = require("../../snapshot-courtesy-Cqs7GkOV.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { J as batteryCapability, Sr as EventCategory, Tn as streamQualityLabel, Xn as errMsg, Xt as memoizePinnedFfmpeg, Yn as DeviceType, Zn as BaseAddon, a as BatteryStatusSchema, mr as nodePin, mt as deriveBatteryPresence, q as bareAddonId, qn as DeviceFeature, yn as snapshotCapability } from "../../dist-Dp043AI0.mjs";
1
+ import { Hn as errMsg, J as batteryCapability, Kt as memoizePinnedFfmpeg, Un as BaseAddon, Vn as DeviceType, a as BatteryStatusSchema, hn as snapshotCapability, mr as EventCategory, or as nodePin, pt as deriveBatteryPresence, q as bareAddonId, xn as streamQualityLabel, zn as DeviceFeature } from "../../dist-CoG8lY6H.mjs";
2
2
  import { i as renderCourtesyOverlayJpeg, n as courtesyCacheKey, r as renderCourtesyJpeg } from "../../snapshot-courtesy-CZPvteq2.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Cn as storageProviderCapability, Zn as BaseAddon, kt as filesystemBrowseCapability } from "../../dist-Dp043AI0.mjs";
1
+ import { Et as filesystemBrowseCapability, Un as BaseAddon, yn as storageProviderCapability } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.js");
7
7
  const require_hub_cap_forward = require("../../hub-cap-forward-DmHNjbB0.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { $ as collectSecretConfigKeys, A as REDACTED_SECRET, Et as evictionPolicyOfLocation, Ft as isLocationEnabled, I as StorageCleanupJobSchema, Jt as mayReadLocation, L as StorageLocationModeSchema, Mt as gbToBytes, Qt as modeMayWrite, R as StorageLocationTypeSchema, Sr as EventCategory, Vt as legacyModeOf, Yt as mayWriteToLocation, Zn as BaseAddon, _n as settingsStoreCapability, bn as storageCapability, dn as resolveLocationMode, hr as parseJsonObject, jn as withLocationMode, w as LegacyStorageLocationDefaultSchema, xn as storageMigrationCapability, z as StorageMigrationJobSchema } from "../../dist-Dp043AI0.mjs";
1
+ import { A as REDACTED_SECRET, Ct as evictionPolicyOfLocation, Dn as withLocationMode, Gt as mayWriteToLocation, I as StorageCleanupJobSchema, Jt as modeMayWrite, L as StorageLocationModeSchema, Lt as legacyModeOf, Mt as isLocationEnabled, Q as collectSecretConfigKeys, R as StorageLocationTypeSchema, Un as BaseAddon, Wt as mayReadLocation, _n as storageMigrationCapability, gn as storageCapability, kt as gbToBytes, mr as EventCategory, pn as settingsStoreCapability, sn as resolveLocationMode, sr as parseJsonObject, w as LegacyStorageLocationDefaultSchema, z as StorageMigrationJobSchema } from "../../dist-CoG8lY6H.mjs";
2
2
  import { t as HUB_CAP_FWD_ACTION } from "../../hub-cap-forward-BdT320dq.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Xn as errMsg, Zn as BaseAddon, dr as hydrateSchema } from "../../dist-Dp043AI0.mjs";
1
+ import { Hn as errMsg, Un as BaseAddon, rr as hydrateSchema } from "../../dist-CoG8lY6H.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-Bx4zxM9N.js");
6
+ const require_dist = require("../../dist-DRUzy1SF.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 { Gt as logDestinationCapability, Zn as BaseAddon } from "../../dist-Dp043AI0.mjs";
1
+ import { Un as BaseAddon, Vt as logDestinationCapability } from "../../dist-CoG8lY6H.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";
@@ -7926,6 +7926,7 @@ var RING_BUFFER_DENY_PATTERNS = [
7926
7926
  "pipeline-analytics.track-started",
7927
7927
  "pipeline-analytics.track-ended",
7928
7928
  "motion.on-motion-changed",
7929
+ "provider.motion",
7929
7930
  "capability.binding-changed"
7930
7931
  ];
7931
7932
  /**
@@ -7923,6 +7923,7 @@ var RING_BUFFER_DENY_PATTERNS = [
7923
7923
  "pipeline-analytics.track-started",
7924
7924
  "pipeline-analytics.track-ended",
7925
7925
  "motion.on-motion-changed",
7926
+ "provider.motion",
7926
7927
  "capability.binding-changed"
7927
7928
  ];
7928
7929
  /**
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-Bx4zxM9N.js");
1
+ const require_dist = require("./dist-DRUzy1SF.js");
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation
@@ -1,4 +1,4 @@
1
- import { Hn as compositionSourceKey, Xn as errMsg } from "./dist-Dp043AI0.mjs";
1
+ import { Hn as errMsg, In as compositionSourceKey } from "./dist-CoG8lY6H.mjs";
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation