@camstack/system 1.2.276 → 1.2.277

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/console-logging/index.js +1 -1
  14. package/dist/builtins/console-logging/index.mjs +1 -1
  15. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  17. package/dist/builtins/device-manager/device-bindings-store.d.ts +10 -0
  18. package/dist/builtins/device-manager/device-manager.addon.js +63 -118
  19. package/dist/builtins/device-manager/device-manager.addon.mjs +64 -116
  20. package/dist/builtins/device-manager/device-meta-types.d.ts +15 -27
  21. package/dist/builtins/device-manager/device-source-activation.d.ts +9 -43
  22. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  23. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  24. package/dist/builtins/hub-forwarder/index.js +1 -1
  25. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  26. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  27. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  28. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  29. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  30. package/dist/builtins/local-network/local-network.addon.js +1 -1
  31. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  32. package/dist/builtins/loki-logging/index.js +1 -1
  33. package/dist/builtins/loki-logging/index.mjs +1 -1
  34. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  35. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  36. package/dist/builtins/platform-probe/index.js +1 -1
  37. package/dist/builtins/platform-probe/index.mjs +1 -1
  38. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  39. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  40. package/dist/builtins/snapshot/index.js +1 -1
  41. package/dist/builtins/snapshot/index.mjs +1 -1
  42. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  43. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  44. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  45. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  46. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  47. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  48. package/dist/builtins/system-config/system-config.addon.js +1 -1
  49. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  50. package/dist/builtins/winston-logging/index.js +1 -1
  51. package/dist/builtins/winston-logging/index.mjs +1 -1
  52. package/dist/{dist-D_OlSf31.js → dist-Bu8HN-KS.js} +36 -18
  53. package/dist/{dist-AHdiIdJH.mjs → dist-DOF9wnat.mjs} +36 -18
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +14 -67
  56. package/dist/index.mjs +16 -66
  57. package/dist/kernel/capability-registry.d.ts +12 -42
  58. package/dist/kernel/index.d.ts +0 -1
  59. package/dist/{retired-settings-keys-LwFyTKun.js → retired-settings-keys-BwE6S2eQ.js} +1 -1
  60. package/dist/{retired-settings-keys-Cp3oG_aH.mjs → retired-settings-keys-DXMfts8c.mjs} +1 -1
  61. package/package.json +1 -1
@@ -45,38 +45,26 @@ export type DriverConfigSchemaResult = {
45
45
  };
46
46
  /**
47
47
  * One `(device, capability)` row of the persisted wrapper-activation store —
48
- * the authority for every per-camera function switch (D62) and, since D556,
49
- * for which SOURCES a camera's collection cap has.
48
+ * the authority for every per-camera function switch (D62).
50
49
  *
51
- * The two fields answer two different cardinalities and are never both the
52
- * answer for one cap:
50
+ * SINGLETON capabilities only. `wrapperAddonId` is the bound wrapper, or the
51
+ * explicit `null` "operator disabled" marker that stops `getBindings` step 2
52
+ * re-binding a `defaultActive` wrapper; absent means the operator never touched
53
+ * this cap on this device.
53
54
  *
54
- * - `wrapperAddonId` — a SINGLETON cap's bound wrapper, or the explicit
55
- * `null` "operator disabled" marker that stops `getBindings` step 2
56
- * re-binding a `defaultActive` wrapper. Absent means the operator never
57
- * touched this cap on this device.
58
- * - `disabledSourceIds` — a COLLECTION cap's switched-OFF sources. A DENY
59
- * list on purpose: absence means every source the camera has, which is both
60
- * today's behaviour and the only shape under which a provider registered
61
- * later is seen without a second write (D556).
62
- *
63
- * `disabledSourceIds` holds SOURCE ids (`native:reolink:hub`), not addon ids.
64
- * One addon can serve several of a device's sources, so an addon-keyed entry
65
- * could only ever mean "all of them" — which is exactly how a LEGACY entry is
66
- * still read: {@link DeviceCapBinding.disabledSourceAddonIds} is never written
67
- * any more and every id in it denies every source that addon serves for this
68
- * device. One predicate, stated once, so an operator's existing decision does
69
- * not silently stop applying (D555).
55
+ * **A COLLECTION capability has no row here, by design.** Its providers are a
56
+ * SET, and the set is DERIVED from who provides the cap
57
+ * (`device-bindings-store.ts` step 0) — *"tutti i providers funzionano sempre,
58
+ * non serve disattivarli/attivarli … loro vivono lì"* (operator, 2026-09-20).
59
+ * Nothing persists it, so nothing has to be back-filled onto a fleet and
60
+ * nothing goes stale when an addon is deployed to a camera later.
61
+ * `setWrapperActive` REFUSES a collection cap rather than writing a field the
62
+ * enumeration does not read — `disabledSourceIds` / `disabledSourceAddonIds`
63
+ * (D556, D555) were exactly that, and
64
+ * `scripts/check-device-selection-authority.ts` now makes it unrepresentable.
70
65
  */
71
66
  export interface DeviceCapBinding {
72
67
  readonly wrapperAddonId?: string | null;
73
- /** SOURCE ids the operator switched off for this device. */
74
- readonly disabledSourceIds?: readonly string[];
75
- /**
76
- * @deprecated Pre-re-key entries, keyed by ADDON id. Read, never written:
77
- * an id here denies every source that addon serves for this device.
78
- */
79
- readonly disabledSourceAddonIds?: readonly string[];
80
68
  }
81
69
  export interface DeviceBindingsStore {
82
70
  readonly deviceBindings: Record<string, Record<string, DeviceCapBinding>>;
@@ -1,5 +1,4 @@
1
- import { AddonContext, ICapabilityRegistry, IScopedLogger } from '@camstack/types';
2
- import { DeviceBindingsStore } from './device-meta-types.js';
1
+ import { AddonContext, ICapabilityRegistry } from '@camstack/types';
3
2
  import { WriteLock } from './write-lock.js';
4
3
  /**
5
4
  * What a wrapper-activation write needs, and nothing more.
@@ -20,51 +19,18 @@ export interface WrapperActivationInput {
20
19
  readonly deviceId: number;
21
20
  readonly capName: string;
22
21
  readonly wrapperAddonId: string;
23
- /**
24
- * The SOURCE to toggle, for a collection cap. Absent keeps the cap-wide
25
- * meaning D556 shipped — every source this addon serves for this device —
26
- * which is also how a pre-re-key entry is read.
27
- */
28
- readonly sourceId?: string;
29
22
  readonly active: boolean;
30
23
  }
31
- /**
32
- * Is `source` denied for a device, given the persisted deny set?
33
- *
34
- * The ONE place the migration rule lives: an entry matches either the source's
35
- * own id or the id of the addon that serves it. New writes are always source
36
- * ids; an addon id can only be a pre-re-key entry, and it still means "every
37
- * source this addon serves here".
38
- */
39
- export declare function isSourceDenied(denied: readonly string[], source: {
40
- readonly sourceId?: string;
41
- readonly addonId: string;
42
- }): boolean;
43
- /**
44
- * The deny list after one toggle. Pure, order-preserving, idempotent — a
45
- * second "off" on an addon already off changes nothing.
46
- */
47
- export declare function nextDisabledSources(current: readonly string[], key: string, active: boolean): readonly string[];
48
- /**
49
- * Replay the whole persisted store onto a fresh registry.
50
- *
51
- * The projection is in-memory, so a hub restart starts it empty — and an empty
52
- * deny list means "every source", which would silently switch every source the
53
- * operator turned off back ON. That is precisely the D62 failure (an off switch
54
- * that reports on), so the replay is not an optimisation: it is what makes the
55
- * authority durable. Called from the device-manager's `onInitialize`, before
56
- * any camera can be asked for its clips, and safe to call again.
57
- */
58
- export declare function restoreDeviceSourceActivations(registry: ICapabilityRegistry, store: Partial<DeviceBindingsStore>, logger: IScopedLogger): number;
59
24
  /**
60
25
  * Activate or deactivate a wrapper for one device.
61
26
  *
62
- * Singleton caps keep the shape D62 fixed: one `wrapperAddonId`, or the
63
- * explicit `null` marker that stops `getBindings` step 2 re-binding a
64
- * `defaultActive` wrapper. Collection caps write `disabledSourceAddonIds`
65
- * instead — their `wrapperAddonId` is left exactly as it was, because a cap
66
- * with several sources has no "which one" for `getBindings` to answer (D554
67
- * context 3) and inventing one would turn a source toggle into a cap-wide off
68
- * switch.
27
+ * SINGLETON caps only, and that is now enforced rather than assumed: one
28
+ * `wrapperAddonId`, or the explicit `null` "operator disabled" marker that
29
+ * stops `getBindings` step 2 re-binding a `defaultActive` wrapper.
30
+ *
31
+ * A COLLECTION cap is REFUSED by name. Its providers are a derived SET
32
+ * (`device-bindings-store.ts` step 0) — there is nothing to activate, and a
33
+ * verb that accepted the call and wrote a store nobody reads is exactly what
34
+ * this module shipped until 2026-09-20.
69
35
  */
70
36
  export declare function setWrapperActive(deps: WrapperActivationDeps, input: WrapperActivationInput): Promise<void>;
@@ -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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { B as bareAddonId, Fn as EventCategory, T as SOURCE_DEVICE_TYPES, at as evaluateSensorEdge, cn as BaseAddon, gt as isSourceCap, ht as isSameAddonId, mn as DeviceType, on as errMsg, tt as doorbellCapability, w as SOURCE_CAPS, xn as createEvent } from "../../dist-AHdiIdJH.mjs";
1
+ import { B as bareAddonId, Fn as EventCategory, T as SOURCE_DEVICE_TYPES, at as evaluateSensorEdge, cn as BaseAddon, gt as isSourceCap, ht as isSameAddonId, mn as DeviceType, on as errMsg, tt as doorbellCapability, w as SOURCE_CAPS, xn as createEvent } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-AHdiIdJH.mjs";
1
+ import { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-DOF9wnat.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-D_OlSf31.js");
3
+ const require_dist = require("../../dist-Bu8HN-KS.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 { C as RecordingStatusSchema, Fn as EventCategory, cn as BaseAddon, on as errMsg, xn as createEvent } from "../../dist-AHdiIdJH.mjs";
1
+ import { C as RecordingStatusSchema, Fn as EventCategory, cn as BaseAddon, on as errMsg, xn as createEvent } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { N as UserRecordSchema, O as ScopedTokenSchema, R as authProviderCapability, cn as BaseAddon, nn as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-AHdiIdJH.mjs";
2
+ import { N as UserRecordSchema, O as ScopedTokenSchema, R as authProviderCapability, cn as BaseAddon, nn as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-DOF9wnat.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-D_OlSf31.js");
3
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Fn as EventCategory, cn as BaseAddon, xt as localNetworkCapability } from "../../dist-AHdiIdJH.mjs";
1
+ import { Fn as EventCategory, cn as BaseAddon, xt as localNetworkCapability } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-AHdiIdJH.mjs";
1
+ import { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.js");
7
7
  let node_fs_promises = require("node:fs/promises");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { Fn as EventCategory, Ot as metricsProviderCapability, Rt as reducePoints, cn as BaseAddon, lt as foldSnapshotByFunction, on as errMsg, xn as createEvent, zt as resolveBucketMs } from "../../dist-AHdiIdJH.mjs";
1
+ import { Fn as EventCategory, Ot as metricsProviderCapability, Rt as reducePoints, cn as BaseAddon, lt as foldSnapshotByFunction, on as errMsg, xn as createEvent, zt as resolveBucketMs } from "../../dist-DOF9wnat.mjs";
2
2
  import { access, readFile, readdir } from "node:fs/promises";
3
3
  import * as fs from "node:fs";
4
4
  import { constants, readFileSync } 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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Cn as emitReadiness, Fn as EventCategory, Ft as platformProbeCapability, Kt as scoreRuntimes, cn as BaseAddon, nt as enumerateInferenceDevices, on as errMsg } from "../../dist-AHdiIdJH.mjs";
2
+ import { Cn as emitReadiness, Fn as EventCategory, Ft as platformProbeCapability, Kt as scoreRuntimes, cn as BaseAddon, nt as enumerateInferenceDevices, on as errMsg } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Fn as EventCategory, cn as BaseAddon } from "../../dist-AHdiIdJH.mjs";
1
+ import { Fn as EventCategory, cn as BaseAddon } from "../../dist-DOF9wnat.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { B as bareAddonId, Fn as EventCategory, On as nodePin, V as batteryCapability, Yt as snapshotCapability, Z as deriveBatteryPresence, a as BatteryStatusSchema, cn as BaseAddon, fn as DeviceFeature, mn as DeviceType, on as errMsg, tn as streamQualityLabel } from "../../dist-AHdiIdJH.mjs";
1
+ import { B as bareAddonId, Fn as EventCategory, On as nodePin, V as batteryCapability, Yt as snapshotCapability, Z as deriveBatteryPresence, a as BatteryStatusSchema, cn as BaseAddon, fn as DeviceFeature, mn as DeviceType, on as errMsg, tn as streamQualityLabel } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { $t as storageProviderCapability, cn as BaseAddon, ct as filesystemBrowseCapability } from "../../dist-AHdiIdJH.mjs";
1
+ import { $t as storageProviderCapability, cn as BaseAddon, ct as filesystemBrowseCapability } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { A as StorageLocationModeSchema, Dt as mayWriteToLocation, Et as mayReadLocation, Fn as EventCategory, M as StorageMigrationJobSchema, Vt as resolveLocationMode, W as collectSecretConfigKeys, Xt as storageCapability, Zt as storageMigrationCapability, _ as LegacyStorageLocationDefaultSchema, an as withLocationMode, cn as BaseAddon, j as StorageLocationTypeSchema, k as StorageCleanupJobSchema, kn as parseJsonObject, kt as modeMayWrite, ot as evictionPolicyOfLocation, pt as isLocationEnabled, qt as settingsStoreCapability, ut as gbToBytes, x as REDACTED_SECRET, yt as legacyModeOf } from "../../dist-AHdiIdJH.mjs";
1
+ import { A as StorageLocationModeSchema, Dt as mayWriteToLocation, Et as mayReadLocation, Fn as EventCategory, M as StorageMigrationJobSchema, Vt as resolveLocationMode, W as collectSecretConfigKeys, Xt as storageCapability, Zt as storageMigrationCapability, _ as LegacyStorageLocationDefaultSchema, an as withLocationMode, cn as BaseAddon, j as StorageLocationTypeSchema, k as StorageCleanupJobSchema, kn as parseJsonObject, kt as modeMayWrite, ot as evictionPolicyOfLocation, pt as isLocationEnabled, qt as settingsStoreCapability, ut as gbToBytes, x as REDACTED_SECRET, yt as legacyModeOf } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Tn as hydrateSchema, cn as BaseAddon, on as errMsg } from "../../dist-AHdiIdJH.mjs";
1
+ import { Tn as hydrateSchema, cn as BaseAddon, on as errMsg } from "../../dist-DOF9wnat.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-D_OlSf31.js");
6
+ const require_dist = require("../../dist-Bu8HN-KS.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 { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-AHdiIdJH.mjs";
1
+ import { Ct as logDestinationCapability, cn as BaseAddon } from "../../dist-DOF9wnat.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";
@@ -691,7 +691,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
691
691
  return EventCategory;
692
692
  }({});
693
693
  //#endregion
694
- //#region ../types/dist/sleep-CopaBJss.mjs
694
+ //#region ../types/dist/sleep-7AN_Txmu.mjs
695
695
  /**
696
696
  * The audio chunk plane's byte format, and the ONE expansion from a coded
697
697
  * window to float samples (D455).
@@ -892,12 +892,6 @@ var WELL_KNOWN_TAB_MAP = Object.fromEntries([
892
892
  icon: "circle-dot",
893
893
  order: 40
894
894
  },
895
- {
896
- id: "clips",
897
- label: "Clips",
898
- icon: "clapperboard",
899
- order: 41
900
- },
901
895
  {
902
896
  id: "engine",
903
897
  label: "Inference Engine",
@@ -26256,17 +26250,31 @@ var videoclipsCapability = {
26256
26250
  * `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
26257
26251
  * binding entry derives the same section a native one does.
26258
26252
  *
26259
- * `topTab` because the browser owns the whole pane (a day's clips, a source
26260
- * list and a player), exactly as `ptz` does; the widget itself is
26261
- * `host/clips-browser` in ui-library's `HOST_WIDGETS`.
26253
+ * **It is a SECTION of the Recording tab, at the end of it — not a tab of
26254
+ * its own.** It shipped as a `clips` top-tab and the operator rejected the
26255
+ * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
26256
+ * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
26257
+ * already holds the recorder's panel, the schedule bands and the unified
26258
+ * retention policy; footage the camera itself holds is the same question,
26259
+ * asked of a different store. `order: 100` puts it after all of them with
26260
+ * room left in front. The `clips` entry in `WELL_KNOWN_TABS` went with it —
26261
+ * a well-known id nobody declares is an invitation to mint the tab again.
26262
+ *
26263
+ * `topTab` stays: the browser owns a pane (a day's tiles, a source list and
26264
+ * a player) and the Config tab's inner bar has no room for one. The widget
26265
+ * itself is `host/clips-browser` in ui-library's `HOST_WIDGETS`, and because
26266
+ * the admin Recordings page renders every `location:'top-tab'` +
26267
+ * `tab:'recording'` section behind its camera picker
26268
+ * (`CameraRecordingSettingsSection`), this declaration lands the section on
26269
+ * BOTH surfaces with no second wiring.
26262
26270
  */
26263
26271
  deviceConfig: { ui: {
26264
26272
  kind: "widget",
26265
26273
  widgetId: "host/clips-browser",
26266
- tab: "clips",
26274
+ tab: "recording",
26267
26275
  topTab: true,
26268
26276
  label: "Clips",
26269
- order: 0
26277
+ order: 100
26270
26278
  } },
26271
26279
  methods: {
26272
26280
  listClips: method(zod.z.object({
@@ -26275,13 +26283,23 @@ var videoclipsCapability = {
26275
26283
  until: zod.z.number(),
26276
26284
  limit: zod.z.number().int().positive().optional(),
26277
26285
  /**
26278
- * View filter over {@link ClipSourceSchema.source} values — the
26279
- * picker's selection, forwarded so a provider need not list what
26280
- * nobody is looking at. ABSENT means every source this camera has,
26281
- * which is the honest default for a surface whose whole point is that
26282
- * nothing is hidden (D554 3). A provider with one source ignores it.
26286
+ * WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
26287
+ * carries, never a source id and never a list.
26288
+ *
26289
+ * Absent means the device's BOUND provider, which is CamStack on every
26290
+ * camera today because that is what `deviceManager.getBindings`
26291
+ * answers with. A provider the device is not bound to is refused by
26292
+ * name rather than answered by another one (D552's
26293
+ * `rejectUnresolvedAddonPin` rule).
26294
+ *
26295
+ * It replaced `sources?: string[]`, a VIEW filter over source ids that
26296
+ * assumed the answer was a fan-out over everything a camera has. The
26297
+ * operator settled otherwise on 2026-09-20 — *"il get videoclips
26298
+ * prendere un provider opzionale, di default va su camstack"*,
26299
+ * *"l'utilizzatore è uno solo"* — so the list is asked of one provider
26300
+ * at a time and there is nothing to filter out of it.
26283
26301
  */
26284
- sources: zod.z.array(zod.z.string()).optional()
26302
+ provider: zod.z.string().optional()
26285
26303
  }), zod.z.array(ClipSchema).readonly(), {
26286
26304
  kind: "query",
26287
26305
  auth: "protected"
@@ -691,7 +691,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
691
691
  return EventCategory;
692
692
  }({});
693
693
  //#endregion
694
- //#region ../types/dist/sleep-CopaBJss.mjs
694
+ //#region ../types/dist/sleep-7AN_Txmu.mjs
695
695
  /**
696
696
  * The audio chunk plane's byte format, and the ONE expansion from a coded
697
697
  * window to float samples (D455).
@@ -892,12 +892,6 @@ var WELL_KNOWN_TAB_MAP = Object.fromEntries([
892
892
  icon: "circle-dot",
893
893
  order: 40
894
894
  },
895
- {
896
- id: "clips",
897
- label: "Clips",
898
- icon: "clapperboard",
899
- order: 41
900
- },
901
895
  {
902
896
  id: "engine",
903
897
  label: "Inference Engine",
@@ -26256,17 +26250,31 @@ var videoclipsCapability = {
26256
26250
  * `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
26257
26251
  * binding entry derives the same section a native one does.
26258
26252
  *
26259
- * `topTab` because the browser owns the whole pane (a day's clips, a source
26260
- * list and a player), exactly as `ptz` does; the widget itself is
26261
- * `host/clips-browser` in ui-library's `HOST_WIDGETS`.
26253
+ * **It is a SECTION of the Recording tab, at the end of it — not a tab of
26254
+ * its own.** It shipped as a `clips` top-tab and the operator rejected the
26255
+ * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
26256
+ * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
26257
+ * already holds the recorder's panel, the schedule bands and the unified
26258
+ * retention policy; footage the camera itself holds is the same question,
26259
+ * asked of a different store. `order: 100` puts it after all of them with
26260
+ * room left in front. The `clips` entry in `WELL_KNOWN_TABS` went with it —
26261
+ * a well-known id nobody declares is an invitation to mint the tab again.
26262
+ *
26263
+ * `topTab` stays: the browser owns a pane (a day's tiles, a source list and
26264
+ * a player) and the Config tab's inner bar has no room for one. The widget
26265
+ * itself is `host/clips-browser` in ui-library's `HOST_WIDGETS`, and because
26266
+ * the admin Recordings page renders every `location:'top-tab'` +
26267
+ * `tab:'recording'` section behind its camera picker
26268
+ * (`CameraRecordingSettingsSection`), this declaration lands the section on
26269
+ * BOTH surfaces with no second wiring.
26262
26270
  */
26263
26271
  deviceConfig: { ui: {
26264
26272
  kind: "widget",
26265
26273
  widgetId: "host/clips-browser",
26266
- tab: "clips",
26274
+ tab: "recording",
26267
26275
  topTab: true,
26268
26276
  label: "Clips",
26269
- order: 0
26277
+ order: 100
26270
26278
  } },
26271
26279
  methods: {
26272
26280
  listClips: method(z.object({
@@ -26275,13 +26283,23 @@ var videoclipsCapability = {
26275
26283
  until: z.number(),
26276
26284
  limit: z.number().int().positive().optional(),
26277
26285
  /**
26278
- * View filter over {@link ClipSourceSchema.source} values — the
26279
- * picker's selection, forwarded so a provider need not list what
26280
- * nobody is looking at. ABSENT means every source this camera has,
26281
- * which is the honest default for a surface whose whole point is that
26282
- * nothing is hidden (D554 3). A provider with one source ignores it.
26286
+ * WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
26287
+ * carries, never a source id and never a list.
26288
+ *
26289
+ * Absent means the device's BOUND provider, which is CamStack on every
26290
+ * camera today because that is what `deviceManager.getBindings`
26291
+ * answers with. A provider the device is not bound to is refused by
26292
+ * name rather than answered by another one (D552's
26293
+ * `rejectUnresolvedAddonPin` rule).
26294
+ *
26295
+ * It replaced `sources?: string[]`, a VIEW filter over source ids that
26296
+ * assumed the answer was a fan-out over everything a camera has. The
26297
+ * operator settled otherwise on 2026-09-20 — *"il get videoclips
26298
+ * prendere un provider opzionale, di default va su camstack"*,
26299
+ * *"l'utilizzatore è uno solo"* — so the list is asked of one provider
26300
+ * at a time and there is nothing to filter out of it.
26283
26301
  */
26284
- sources: z.array(z.string()).optional()
26302
+ provider: z.string().optional()
26285
26303
  }), z.array(ClipSchema).readonly(), {
26286
26304
  kind: "query",
26287
26305
  auth: "protected"
package/dist/index.d.ts CHANGED
@@ -22,7 +22,7 @@ export { DeviceManagerAddon } from './builtins/device-manager/index.js';
22
22
  * projection — a spec that proves "activate, then list" must be able to drive
23
23
  * the real one, not a re-implementation of it.
24
24
  */
25
- export { isSourceDenied, nextDisabledSources, restoreDeviceSourceActivations, setWrapperActive, type WrapperActivationDeps, type WrapperActivationInput, } from './builtins/device-manager/device-source-activation.js';
25
+ export { setWrapperActive, type WrapperActivationDeps, type WrapperActivationInput, } from './builtins/device-manager/device-source-activation.js';
26
26
  export { HubForwarderAddon, HubForwarderDestination } from './builtins/hub-forwarder/index.js';
27
27
  export { LivenessMonitorAddon } from './builtins/liveness-monitor/index.js';
28
28
  export { LocalAuthAddon } from './builtins/local-auth/index.js';