@camstack/system 1.2.486 → 1.2.488

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 (86) hide show
  1. package/dist/{agent-https-DP-Ds2hU.js → agent-https-0EEnqeUL.js} +1 -1
  2. package/dist/{agent-https-C4PLR74Z.mjs → agent-https-C24nO-la.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 +1 -1
  10. package/dist/builtins/autotrack/index.mjs +1 -1
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  13. package/dist/builtins/calendars/calendars.addon.js +1 -1
  14. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  15. package/dist/builtins/camera-grid/index.js +1 -1
  16. package/dist/builtins/camera-grid/index.mjs +1 -1
  17. package/dist/builtins/composer/actuator-dispatch.d.ts +13 -0
  18. package/dist/builtins/composer/actuator-groups.d.ts +54 -0
  19. package/dist/builtins/composer/actuator-invoke.d.ts +11 -0
  20. package/dist/builtins/composer/composed-device.d.ts +13 -24
  21. package/dist/builtins/composer/composer.addon.js +408 -8
  22. package/dist/builtins/composer/composer.addon.mjs +408 -8
  23. package/dist/builtins/composer/composer.d.ts +11 -1
  24. package/dist/builtins/console-logging/index.js +1 -1
  25. package/dist/builtins/console-logging/index.mjs +1 -1
  26. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  27. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  28. package/dist/builtins/device-history/device-history.addon.js +2 -2
  29. package/dist/builtins/device-history/device-history.addon.mjs +2 -2
  30. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  31. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  32. package/dist/builtins/hub-forwarder/index.js +1 -1
  33. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  34. package/dist/builtins/keychain/index.js +3 -3
  35. package/dist/builtins/keychain/index.mjs +3 -3
  36. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  37. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  38. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  39. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  40. package/dist/builtins/local-network/local-network.addon.js +2 -2
  41. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  42. package/dist/builtins/loki-logging/index.js +1 -1
  43. package/dist/builtins/loki-logging/index.mjs +1 -1
  44. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  45. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  46. package/dist/builtins/platform-probe/index.js +1 -1
  47. package/dist/builtins/platform-probe/index.mjs +1 -1
  48. package/dist/builtins/record-entries/index.js +1 -1
  49. package/dist/builtins/record-entries/index.mjs +1 -1
  50. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  51. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  52. package/dist/builtins/snapshot/index.js +1 -1
  53. package/dist/builtins/snapshot/index.mjs +1 -1
  54. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  55. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  56. package/dist/builtins/sqlite-storage/index.js +1 -1
  57. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  58. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  59. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  60. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  61. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  62. package/dist/builtins/system-config/system-config.addon.js +3 -3
  63. package/dist/builtins/system-config/system-config.addon.mjs +3 -3
  64. package/dist/builtins/winston-logging/index.js +1 -1
  65. package/dist/builtins/winston-logging/index.mjs +1 -1
  66. package/dist/{composition-sources-IxiUkrz1.mjs → composition-sources-BA2e5vh_.mjs} +1 -1
  67. package/dist/{composition-sources-CN8K2Q91.js → composition-sources-BulDAgW2.js} +1 -1
  68. package/dist/{constants-1S7BBGMb.js → constants-BntdWx4k.js} +1 -1
  69. package/dist/{constants-DLyGFHZ2.mjs → constants-DZKo4kM2.mjs} +1 -1
  70. package/dist/{device-ca-DoOFG0nm.js → device-ca-BuRg4V4x.js} +1 -1
  71. package/dist/{device-ca-Cbf7_R9t.mjs → device-ca-DXm8IH3p.mjs} +1 -1
  72. package/dist/{dist-D-d_UWL4.js → dist-CrsVjBbk.js} +375 -15
  73. package/dist/{dist-HBue971z.mjs → dist-Dfwxsc_Y.mjs} +310 -16
  74. package/dist/file-host-worker.js +1 -1
  75. package/dist/file-host-worker.mjs +1 -1
  76. package/dist/{hub-mdns-ciao-CuEWb6gB.mjs → hub-mdns-ciao-BbI8MNtQ.mjs} +2 -2
  77. package/dist/{hub-mdns-ciao-dcacrwqd.js → hub-mdns-ciao-CLroVKhP.js} +2 -2
  78. package/dist/index.js +7 -7
  79. package/dist/index.mjs +7 -7
  80. package/dist/{restore-archive-DHdXrKwG.js → restore-archive-CPoja7N3.js} +1 -1
  81. package/dist/{restore-archive-BGBRadFJ.mjs → restore-archive-CSsOMQuX.mjs} +1 -1
  82. package/dist/{retention-ChgrkTfz.js → retention-DgA4qLBj.js} +1 -1
  83. package/dist/{retention-8uqDWll8.mjs → retention-Dz5t6cWO.mjs} +1 -1
  84. package/dist/{wal-maintenance-DubGwqz2.mjs → wal-maintenance-BJi3_DBN.mjs} +0 -0
  85. package/dist/{wal-maintenance-BOT7wWvH.js → wal-maintenance-CL9hrbnn.js} +0 -0
  86. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-D-d_UWL4.js");
2
+ const require_dist = require("./dist-CrsVjBbk.js");
3
3
  const require_x509_es = require("./x509.es-WtnRNyYS.js");
4
4
  let zod = require("zod");
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { Ji as defineRecordKinds } from "./dist-HBue971z.mjs";
1
+ import { aa as defineRecordKinds } from "./dist-Dfwxsc_Y.mjs";
2
2
  import { C as backdatedNotBefore, S as withUtcTimeEncoding, _ as NameConstraints, a as KeyUsageFlags, c as Pkcs10CertificateRequest, d as SubjectKeyIdentifierExtension, f as X509Certificate$1, g as GeneralSubtrees, h as GeneralSubtree, i as Extension, l as Pkcs10CertificateRequestGenerator, m as cryptoProvider, n as BasicConstraintsExtension, o as KeyUsagesExtension, p as X509CertificateGenerator, r as ExtendedKeyUsageExtension, s as PemConverter, t as AuthorityKeyIdentifierExtension, u as SubjectAlternativeNameExtension, v as GeneralName, x as AsnConvert } from "./x509.es-BRiJgOvu.mjs";
3
3
  import { z } from "zod";
4
4
  import { X509Certificate, createHash, createPrivateKey, randomBytes, webcrypto } 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-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.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 { _t as addonPagesCapability, ja as EventCategory, ni as BaseAddon, ti as errMsg } from "../../dist-HBue971z.mjs";
1
+ import { Ha as EventCategory, fi as errMsg, pi as BaseAddon, vt as addonPagesCapability } from "../../dist-Dfwxsc_Y.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-D-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.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 { ja as EventCategory, ni as BaseAddon, ti as errMsg, yt as addonWidgetsCapability } from "../../dist-HBue971z.mjs";
1
+ import { Ha as EventCategory, bt as addonWidgetsCapability, fi as errMsg, pi as BaseAddon } from "../../dist-Dfwxsc_Y.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-D-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
8
  //#region src/builtins/alerts/alert-episode-policy.ts
9
9
  /**
@@ -1,4 +1,4 @@
1
- import { Gi as createEvent, Ji as defineRecordKinds, St as alertsCapability, bn as isAlertEpisodeSeverity, bt as alertEpisodeId, i as AlertSchema, ja as EventCategory, ni as BaseAddon, ti as errMsg, xt as alertEpisodePayload, yn as isAlertEpisodeOpen } from "../../dist-HBue971z.mjs";
1
+ import { Ct as alertsCapability, En as isAlertEpisodeSeverity, Ha as EventCategory, St as alertEpisodePayload, Tn as isAlertEpisodeOpen, aa as defineRecordKinds, fi as errMsg, i as AlertSchema, na as createEvent, pi as BaseAddon, xt as alertEpisodeId } from "../../dist-Dfwxsc_Y.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
3
  //#region src/builtins/alerts/alert-episode-policy.ts
4
4
  /**
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-D-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.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 { Et as bareAddonId, I as FIRST_LEVEL_MACRO_CLASSES, ja as EventCategory, ni as BaseAddon, ra as isEvent, rr as ptzAutotrackCapability, ti as errMsg } from "../../dist-HBue971z.mjs";
1
+ import { Dt as bareAddonId, Ha as EventCategory, I as FIRST_LEVEL_MACRO_CLASSES, fi as errMsg, ma as isEvent, pi as BaseAddon, ur as ptzAutotrackCapability } from "../../dist-Dfwxsc_Y.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,
@@ -3,9 +3,9 @@ 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-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
- const require_restore_archive = require("../../restore-archive-DHdXrKwG.js");
8
+ const require_restore_archive = require("../../restore-archive-CPoja7N3.js");
9
9
  let node_crypto = require("node:crypto");
10
10
  let node_fs_promises = require("node:fs/promises");
11
11
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,6 +1,6 @@
1
- import { Ea as toNodeId, Or as storageOccupancyCapability, Tt as backupCapability, Vn as mayWriteToLocation, fa as nodePin, ja as EventCategory, ni as BaseAddon } from "../../dist-HBue971z.mjs";
1
+ import { Ca as nodePin, Et as backupCapability, Ha as EventCategory, La as toNodeId, Rr as storageOccupancyCapability, pi as BaseAddon, qn as mayWriteToLocation } from "../../dist-Dfwxsc_Y.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { _ as backupRecordStoresOf, a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, g as backupOrchestratorRecordKinds, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-BGBRadFJ.mjs";
3
+ import { _ as backupRecordStoresOf, a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, g as backupOrchestratorRecordKinds, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-CSsOMQuX.mjs";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import * as fsp from "node:fs/promises";
6
6
  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-D-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/calendars/calendar-color.ts
@@ -1,4 +1,4 @@
1
- import { Ji as defineRecordKinds, Mt as calendarsCapability, g as CalendarPreferencesSchema, ni as BaseAddon } from "../../dist-HBue971z.mjs";
1
+ import { Pt as calendarsCapability, aa as defineRecordKinds, g as CalendarPreferencesSchema, pi as BaseAddon } from "../../dist-Dfwxsc_Y.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/calendars/calendar-color.ts
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-D-d_UWL4.js");
6
+ const require_dist = require("../../dist-CrsVjBbk.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 { Ar as streamCatalogCapability, Cr as snapshotCapability, Gi as createEvent, Gn as motionCapability, Hn as memoizePinnedFfmpeg, N as DeclaredDevices, Nt as cameraGridLayoutCapability, Qr as DeviceFeature, T as DERIVED_CAMERA_SILENCED_CAP_NAMES, Vr as buildFfmpegArgs, X as MOTION_CLOSE_AFTER_MS, a as BaseDevice, ei as DeviceType, ja as EventCategory, ni as BaseAddon, qt as declarationOwnerNodeId, ta as hydrateSchema, ti as errMsg } from "../../dist-HBue971z.mjs";
1
+ import { Br as streamCatalogCapability, Ft as cameraGridLayoutCapability, Ha as EventCategory, Jn as memoizePinnedFfmpeg, N as DeclaredDevices, Nr as snapshotCapability, Qr as buildFfmpegArgs, T as DERIVED_CAMERA_SILENCED_CAP_NAMES, Xt as declarationOwnerNodeId, Z as MOTION_CLOSE_AFTER_MS, Zn as motionCapability, a as BaseDevice, di as DeviceType, fa as hydrateSchema, fi as errMsg, li as DeviceFeature, na as createEvent, pi as BaseAddon } from "../../dist-Dfwxsc_Y.mjs";
2
2
  import { z } from "zod";
3
3
  import { FfmpegProcess } from "@camstack/types/node";
4
4
  import { join } from "node:path";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The composed device calls this when an operator or an automation commands
3
+ * the group. The composer installs the one dispatcher for the process.
4
+ */
5
+ export interface ActuatorDispatchInput {
6
+ readonly groupDeviceId: number;
7
+ readonly cap: string;
8
+ readonly method: string;
9
+ readonly args: Readonly<Record<string, unknown>>;
10
+ }
11
+ export type ActuatorDispatcher = (input: ActuatorDispatchInput) => Promise<void>;
12
+ export declare function setActuatorDispatcher(next: ActuatorDispatcher | null): void;
13
+ export declare function actuatorDispatcher(): ActuatorDispatcher | null;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Live actuator helpers (D944). State is the aggregate the composer already
3
+ * runs. Commands are fanned out here: every member that binds the cap,
4
+ * including one that is offline, and a failure on one does not cancel the rest.
5
+ * A light's brightness and colour are registered only while every member binds
6
+ * them, and recomputed when a member's bindings change.
7
+ */
8
+ import { type CompositionSourceRef, type DeviceFeature, type FanOutCall, type GroupCommandResult, type GroupHelperSpec, type IScopedLogger } from "@camstack/types";
9
+ export interface ActuatorMemberReady {
10
+ readonly kind: "ready";
11
+ readonly caps: readonly string[];
12
+ readonly features: readonly string[];
13
+ }
14
+ export interface ActuatorMemberUnread {
15
+ readonly kind: "unreadable";
16
+ readonly error: string;
17
+ }
18
+ export type ActuatorMemberLookup = ActuatorMemberReady | ActuatorMemberUnread;
19
+ export declare function isActuatorGroupDevice(device: object): device is ActuatorGroupDevice;
20
+ export interface ActuatorGroupDevice {
21
+ readonly id: number;
22
+ syncShared(caps: readonly string[], modes: readonly DeviceFeature[]): void;
23
+ recordCommands(results: readonly GroupCommandResult[]): void;
24
+ }
25
+ export interface ActuatorBlock {
26
+ readonly id: string;
27
+ readonly helper: GroupHelperSpec | undefined;
28
+ }
29
+ export interface ActuatorGroupsDeps {
30
+ readonly logger: IScopedLogger;
31
+ readonly now: () => number;
32
+ readonly resolve: (ref: CompositionSourceRef) => {
33
+ readonly kind: "found";
34
+ readonly deviceId: number;
35
+ } | {
36
+ readonly kind: "other";
37
+ };
38
+ readonly readMember: (deviceId: number) => Promise<ActuatorMemberLookup>;
39
+ readonly deviceOf: (blockId: string) => ActuatorGroupDevice | null;
40
+ readonly invoke: (call: FanOutCall) => Promise<void>;
41
+ }
42
+ export declare class ActuatorGroups {
43
+ private readonly deps;
44
+ private groups;
45
+ private readonly bound;
46
+ constructor(deps: ActuatorGroupsDeps);
47
+ shutdown(): void;
48
+ sync(blocks: readonly ActuatorBlock[]): Promise<void>;
49
+ onMemberBindings(deviceId: number): Promise<void>;
50
+ private remember;
51
+ private viewMembers;
52
+ private logCapChange;
53
+ private command;
54
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Turn one fan-out call into the member's existing cap method. A bad argument
3
+ * fails that member only — the caller still attempts the rest.
4
+ */
5
+ import { type ColorInput, type FanOutCall } from "@camstack/types";
6
+ export interface ActuatorInvokeApi {
7
+ switchSetState(deviceId: number, on: boolean): Promise<void>;
8
+ setBrightness(deviceId: number, percentage: number): Promise<void>;
9
+ setColor(deviceId: number, color: ColorInput): Promise<void>;
10
+ }
11
+ export declare function invokeActuatorCall(api: ActuatorInvokeApi, call: FanOutCall): Promise<void>;
@@ -1,26 +1,4 @@
1
- /**
2
- * A composed device: an ordinary `BaseDevice` whose caps are served by the
3
- * composer (D659). Every consumer (exporters, NC, UI, HomeKit) reads it
4
- * through its bindings, unchanged.
5
- *
6
- * It serves NO command method: slice 1 refuses any cap with one
7
- * (`has-commands`), and commands arrive with `forward` in slice 3. So each
8
- * composed cap is registered with an EMPTY native provider, and `getStatus`
9
- * (R4) is the kernel's: `registerNativeCap` installs a default that reads the
10
- * device's runtime slice for any cap declaring both `status` and
11
- * `runtimeState` (`device-cap-proxy.ts`, "Default `getStatus`"), on the
12
- * registry path and the forked-runner (UDS) path alike. Every composable cap
13
- * qualifies: the validator refuses a cap with no `runtimeState`
14
- * (`validate-composition.ts`, `not-composable`). The default is correct only
15
- * because, for every composable cap, `status.schema` and `runtimeState` have
16
- * one shape — `composed-device.spec.ts` enumerates the real cap registry and
17
- * fails the day one breaks it (slice 3 lifting `has-commands` makes
18
- * `recording-signal` such a cap). `room-device.e2e.spec.ts` proves R4 through
19
- * the real registry. Its type comes from the declaration, not from
20
- * `deviceMeta`: a failed meta read builds a device as `generic`, and the
21
- * declaration is the authority for what this device is.
22
- */
23
- import { BaseDevice, type CapabilityDefinition, type DeviceConstructor, type DeviceContext, type DeviceFeature, type DeviceType, type IDevice } from "@camstack/types";
1
+ import { BaseDevice, type CapabilityDefinition, type DeviceConstructor, type DeviceContext, type DeviceFeature, DeviceType, type GroupCommandResult, type IDevice } from "@camstack/types";
24
2
  import { z } from "zod";
25
3
  import type { ComposedWriteTarget, WriteOutcome } from "./composition-runtime.js";
26
4
  import type { SlicePatch } from "./slice-assembler.js";
@@ -29,8 +7,19 @@ export interface ComposedDeviceHandle extends ComposedWriteTarget {
29
7
  readonly name: string;
30
8
  }
31
9
  export declare class ComposedDevice extends BaseDevice<typeof COMPOSED_DEVICE_CONFIG_SCHEMA> implements ComposedDeviceHandle {
32
- readonly features: readonly DeviceFeature[];
10
+ private sharedFeatures;
11
+ private extraCaps;
12
+ get features(): readonly DeviceFeature[];
33
13
  constructor(ctx: DeviceContext, type: DeviceType, caps: readonly CapabilityDefinition[]);
14
+ /**
15
+ * Register or drop brightness and colour, and publish the shared colour
16
+ * modes. Switch stays: it is the active state, registered with the device.
17
+ */
18
+ syncShared(caps: readonly string[], modes: readonly DeviceFeature[]): void;
19
+ /** Keep each member's latest attempt. A later command replaces that member only. */
20
+ recordCommands(incoming: readonly GroupCommandResult[]): void;
21
+ private ensureExtra;
22
+ private dispatch;
34
23
  seed(capName: string, slice: SlicePatch): WriteOutcome;
35
24
  patch(capName: string, patch: SlicePatch): WriteOutcome;
36
25
  setAvailable(available: boolean): void;