@camstack/types 1.2.440 → 1.2.441

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 (33) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/addon.js +9 -3
  3. package/dist/addon.mjs +9 -3
  4. package/dist/capabilities/customize-catalog.d.ts +3 -0
  5. package/dist/capabilities/customize-spec.d.ts +20 -2
  6. package/dist/capabilities/index.d.ts +6 -2
  7. package/dist/capabilities/media-player.cap.d.ts +50 -0
  8. package/dist/capabilities/pet-feeder.cap.d.ts +9 -0
  9. package/dist/capabilities/remote.cap.d.ts +264 -0
  10. package/dist/capabilities/template.cap.d.ts +161 -0
  11. package/dist/client.js +14 -0
  12. package/dist/client.mjs +14 -0
  13. package/dist/generated/addon-api.d.ts +86 -0
  14. package/dist/generated/addon-cap-facts.d.ts +1 -1
  15. package/dist/generated/cap-input-defaults.d.ts +1 -1
  16. package/dist/generated/capability-router-map.d.ts +10 -4
  17. package/dist/generated/collection-array-methods.d.ts +1 -1
  18. package/dist/generated/customize-catalog.d.ts +18 -1
  19. package/dist/generated/method-access-map.d.ts +1 -1
  20. package/dist/generated/method-device-selectors.d.ts +2 -2
  21. package/dist/generated/system-proxy.d.ts +4 -0
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.js +861 -71
  24. package/dist/index.mjs +814 -72
  25. package/dist/interfaces/device-call-redirect.d.ts +42 -0
  26. package/dist/interfaces/kernel-abstractions.d.ts +12 -0
  27. package/dist/remote/remote-config.d.ts +116 -0
  28. package/dist/remote/remote-roles.d.ts +21 -0
  29. package/dist/remote/smartir-draft.d.ts +25 -0
  30. package/dist/{sleep-g6ZjBHBL.js → sleep-BpwNJ1Su.js} +19 -0
  31. package/dist/{sleep-BAvUCi_2.mjs → sleep-DJws6ho7.mjs} +19 -0
  32. package/dist/template/template-kinds.d.ts +26 -0
  33. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.441] - 2026-10-29
11
+
12
+ ### Added
13
+
14
+ - New ir-transmitter and remote capabilities for infrared control, and media-player status now says whether its state is reported or assumed
15
+ - Remote: a generic template collection, a remote Customize extension for media players, and media-player commands that run a bound IR/Actions binding first
16
+
17
+ ### Changed
18
+
19
+ - Pet feeder: the status carries the last manual-feed portion so a client can start from it
20
+
10
21
  ## [1.2.440] - 2026-10-28
11
22
 
12
23
  ### Changed
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-g6ZjBHBL.js");
2
+ const require_sleep = require("./sleep-BpwNJ1Su.js");
3
3
  const require_event_category = require("./event-category-E17zaHjN.js");
4
4
  const require_err_msg = require("./err-msg-COHgq7Mb.js");
5
5
  //#region src/generated/cap-input-defaults.ts
@@ -16,7 +16,7 @@ const require_err_msg = require("./err-msg-COHgq7Mb.js");
16
16
  * Plain data, zero Zod: a forked runner must not import the schema barrel
17
17
  * (~144MB RSS per runner — D28).
18
18
  *
19
- * Coverage: 29 caps, 72 methods with defaults.
19
+ * Coverage: 30 caps, 75 methods with defaults.
20
20
  */
21
21
  var CAP_INPUT_DEFAULTS = Object.freeze({
22
22
  "addons": { "getLogs": { "limit": 100 } },
@@ -243,6 +243,11 @@ var CAP_INPUT_DEFAULTS = Object.freeze({
243
243
  "setDeviceConfig": { "config": { "__nested__": { "bands": [] } } }
244
244
  },
245
245
  "records": { "query": { "limit": 100 } },
246
+ "remote": {
247
+ "sendCommand": { "repeat": 1 },
248
+ "sendMediaCommand": { "repeat": 1 },
249
+ "setConfig": { "config": { "__nested__": { "defaultTransmitterId": null } } }
250
+ },
246
251
  "storage": { "upsertLocation": { "isSystem": false } },
247
252
  "storage-admin": { "readRecords": { "limit": 100 } },
248
253
  "storage-provider": {
@@ -362,7 +367,7 @@ function materialise(defaults) {
362
367
  * barrel (`ALL_CAPABILITY_DEFINITIONS`), which would cost ~144MB RSS per
363
368
  * forked runner. See docs/decisions/adr-0028.md.
364
369
  *
365
- * Coverage: 27 collection caps, 45 array methods.
370
+ * Coverage: 28 collection caps, 46 array methods.
366
371
  */
367
372
  var COLLECTION_ARRAY_METHODS = Object.freeze({
368
373
  "action-source": ["listActions"],
@@ -400,6 +405,7 @@ var COLLECTION_ARRAY_METHODS = Object.freeze({
400
405
  "recording": ["listSources"],
401
406
  "storage-occupancy": ["getOccupancy"],
402
407
  "storage-provider": ["list"],
408
+ "template": ["list"],
403
409
  "training-provider": [
404
410
  "describe",
405
411
  "describeTypes",
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as expandCapMethods, $n as REVALIDATE_AFTER_MS, $r as isSecretMarker, $t as RecordFieldPathSchema, A as HF_REPO, An as RecordUniqueViolationError, Ar as buildSecretRef, B as withoutCallerStamp, Bn as RECORD_CLASSES, C as addonSliceHandleApi, Cn as InvalidRecordError, Dn as RecordNotFoundError, En as RECORDS_ERROR_CODES, Fn as UnknownRecordKindError, Fr as parseSecretRef, G as adminUiCapability, Gn as RECORD_MAX_DATA_BYTES, Hn as RECORD_DEFAULT_MAX_DATA_BYTES, I as deviceOpsCapability, In as asRecordsError, Jn as RECORD_QUERY_MAX, Jt as defineEntryKind, Kn as RECORD_MAX_INDEXES, L as viewerUiCapability, Ln as recordsErrorFromMessage, M as CAP_ADVANCE_FIELDS, Mn as RevConflictError, Mr as globalSecretScope, Nn as TransactRefusedError, Nr as isSecretRef, On as RecordSecretUnavailableError, Or as SECRET_REF_SCHEME, P as CAP_STATE_LEAVES, Pn as UnindexedFilterError, Pr as normalizeSecretOwner, Qn as resolveSecretViewsIn, Qr as isSecretFieldView, Qt as EntryDescriptorSchema, R as DEVICE_CHILDREN_BATCH_MAX, Rn as RECORD_BATCH_MAX, Rr as createEvent, Sn as ForeignSecretMarkerError, Tn as PlaintextSecretError, U as describeCustomActions, Un as RECORD_DELETE_BATCH, Vn as RECORD_DATABASES, Wn as RECORD_ID_MAX_LENGTH, Xn as RECORD_SETTINGS_MAX_ROWS, Xr as classifySecretWrite, Xt as createRecordsAccess, Yn as RECORD_SECRET_COLLECTION_PREFIX, Yr as SECRET_CLEAR, Yt as entryBody, Zn as RECORD_SWEEP_INTERVAL_MS, Zr as isSecretClear, Zt as assertTransactScope, _ as readErrorI18n, _n as collectZodSecretPaths, an as assertValidDeclaration, ar as registerKnownSecret, b as isDeviceScopedCap, bn as DeclarationRefusedError, c as asString, cn as REMOVE_LEAF, cr as PEER_BYTES_CHUNK_BYTES, ct as readNodePin, d as parseJsonUnknown, dn as parseSecretPath, dr as PEER_BYTES_TICKET_TTL_MS, dt as ReadinessRegistry, ei as isSecretMarkerLike, en as RecordIndexSchema, er as createSecretsAccess, f as hfModelUrl, fn as recordArrayItemPath, ft as ReadinessTimeoutError, g as ErrorI18nPayloadSchema, gr as BaseAddon, hn as secretArrayPrefixes, hr as DisposerChain, ht as scopeKey, in as StoredRecordKindDeclarationSchema, ir as knownSecretCount, jn as RecordsError, jr as formatSecretScope, kn as RecordTooLargeError, kr as arrayItemFieldPath, ln as collectSecretLeaves, lr as PEER_BYTES_MAX_OUTSTANDING, mn as recordSecretRef, ni as toSecretFieldView, nn as RecordKindNameSchema, nr as clearKnownSecrets, o as asJsonObject, on as declarationsOf, or as scrubKnownSecrets, p as BOOT_RECOVERY_BACKOFF_MS, pn as recordSecretCollection, pr as DATAPLANE_SECRET_HEADER, qn as RECORD_MAX_INDEX_FIELDS, qt as makeInMemoryRecords, r as maskUrlCredentials, rn as RecordRetentionSchema, rr as forgetKnownSecret, sn as defineRecordKinds, sr as shortSecretRefHash, st as nodePin, t as sleep, ti as makeSecretMarker, tn as RecordKindDeclarationSchema, tr as MIN_SCRUBBED_LENGTH, un as mapSecretLeaves, ur as PEER_BYTES_STALL_MS, ut as MODEL_FORMATS, vn as isZodSecret, vr as normalizeAddonInitResult, w as createEventBusSliceSource, wn as NoCallerError, x as createDeviceProxy, xn as FilterRequiredError, y as DEVICE_SCOPED_CAPS, yn as BatchTooLargeError, z as CALLER_STAMPED_CAPABILITIES, zn as RECORD_BATCH_MAX_BYTES, zr as emitReadiness } from "./sleep-BAvUCi_2.mjs";
1
+ import { $ as expandCapMethods, $n as REVALIDATE_AFTER_MS, $r as isSecretMarker, $t as RecordFieldPathSchema, A as HF_REPO, An as RecordUniqueViolationError, Ar as buildSecretRef, B as withoutCallerStamp, Bn as RECORD_CLASSES, C as addonSliceHandleApi, Cn as InvalidRecordError, Dn as RecordNotFoundError, En as RECORDS_ERROR_CODES, Fn as UnknownRecordKindError, Fr as parseSecretRef, G as adminUiCapability, Gn as RECORD_MAX_DATA_BYTES, Hn as RECORD_DEFAULT_MAX_DATA_BYTES, I as deviceOpsCapability, In as asRecordsError, Jn as RECORD_QUERY_MAX, Jt as defineEntryKind, Kn as RECORD_MAX_INDEXES, L as viewerUiCapability, Ln as recordsErrorFromMessage, M as CAP_ADVANCE_FIELDS, Mn as RevConflictError, Mr as globalSecretScope, Nn as TransactRefusedError, Nr as isSecretRef, On as RecordSecretUnavailableError, Or as SECRET_REF_SCHEME, P as CAP_STATE_LEAVES, Pn as UnindexedFilterError, Pr as normalizeSecretOwner, Qn as resolveSecretViewsIn, Qr as isSecretFieldView, Qt as EntryDescriptorSchema, R as DEVICE_CHILDREN_BATCH_MAX, Rn as RECORD_BATCH_MAX, Rr as createEvent, Sn as ForeignSecretMarkerError, Tn as PlaintextSecretError, U as describeCustomActions, Un as RECORD_DELETE_BATCH, Vn as RECORD_DATABASES, Wn as RECORD_ID_MAX_LENGTH, Xn as RECORD_SETTINGS_MAX_ROWS, Xr as classifySecretWrite, Xt as createRecordsAccess, Yn as RECORD_SECRET_COLLECTION_PREFIX, Yr as SECRET_CLEAR, Yt as entryBody, Zn as RECORD_SWEEP_INTERVAL_MS, Zr as isSecretClear, Zt as assertTransactScope, _ as readErrorI18n, _n as collectZodSecretPaths, an as assertValidDeclaration, ar as registerKnownSecret, b as isDeviceScopedCap, bn as DeclarationRefusedError, c as asString, cn as REMOVE_LEAF, cr as PEER_BYTES_CHUNK_BYTES, ct as readNodePin, d as parseJsonUnknown, dn as parseSecretPath, dr as PEER_BYTES_TICKET_TTL_MS, dt as ReadinessRegistry, ei as isSecretMarkerLike, en as RecordIndexSchema, er as createSecretsAccess, f as hfModelUrl, fn as recordArrayItemPath, ft as ReadinessTimeoutError, g as ErrorI18nPayloadSchema, gr as BaseAddon, hn as secretArrayPrefixes, hr as DisposerChain, ht as scopeKey, in as StoredRecordKindDeclarationSchema, ir as knownSecretCount, jn as RecordsError, jr as formatSecretScope, kn as RecordTooLargeError, kr as arrayItemFieldPath, ln as collectSecretLeaves, lr as PEER_BYTES_MAX_OUTSTANDING, mn as recordSecretRef, ni as toSecretFieldView, nn as RecordKindNameSchema, nr as clearKnownSecrets, o as asJsonObject, on as declarationsOf, or as scrubKnownSecrets, p as BOOT_RECOVERY_BACKOFF_MS, pn as recordSecretCollection, pr as DATAPLANE_SECRET_HEADER, qn as RECORD_MAX_INDEX_FIELDS, qt as makeInMemoryRecords, r as maskUrlCredentials, rn as RecordRetentionSchema, rr as forgetKnownSecret, sn as defineRecordKinds, sr as shortSecretRefHash, st as nodePin, t as sleep, ti as makeSecretMarker, tn as RecordKindDeclarationSchema, tr as MIN_SCRUBBED_LENGTH, un as mapSecretLeaves, ur as PEER_BYTES_STALL_MS, ut as MODEL_FORMATS, vn as isZodSecret, vr as normalizeAddonInitResult, w as createEventBusSliceSource, wn as NoCallerError, x as createDeviceProxy, xn as FilterRequiredError, y as DEVICE_SCOPED_CAPS, yn as BatchTooLargeError, z as CALLER_STAMPED_CAPABILITIES, zn as RECORD_BATCH_MAX_BYTES, zr as emitReadiness } from "./sleep-DJws6ho7.mjs";
2
2
  import { t as EventCategory } from "./event-category-DmZDPDf_.mjs";
3
3
  import { a as DeviceType, t as errMsg } from "./err-msg-BCdlR2Li.mjs";
4
4
  //#region src/generated/cap-input-defaults.ts
@@ -15,7 +15,7 @@ import { a as DeviceType, t as errMsg } from "./err-msg-BCdlR2Li.mjs";
15
15
  * Plain data, zero Zod: a forked runner must not import the schema barrel
16
16
  * (~144MB RSS per runner — D28).
17
17
  *
18
- * Coverage: 29 caps, 72 methods with defaults.
18
+ * Coverage: 30 caps, 75 methods with defaults.
19
19
  */
20
20
  var CAP_INPUT_DEFAULTS = Object.freeze({
21
21
  "addons": { "getLogs": { "limit": 100 } },
@@ -242,6 +242,11 @@ var CAP_INPUT_DEFAULTS = Object.freeze({
242
242
  "setDeviceConfig": { "config": { "__nested__": { "bands": [] } } }
243
243
  },
244
244
  "records": { "query": { "limit": 100 } },
245
+ "remote": {
246
+ "sendCommand": { "repeat": 1 },
247
+ "sendMediaCommand": { "repeat": 1 },
248
+ "setConfig": { "config": { "__nested__": { "defaultTransmitterId": null } } }
249
+ },
245
250
  "storage": { "upsertLocation": { "isSystem": false } },
246
251
  "storage-admin": { "readRecords": { "limit": 100 } },
247
252
  "storage-provider": {
@@ -361,7 +366,7 @@ function materialise(defaults) {
361
366
  * barrel (`ALL_CAPABILITY_DEFINITIONS`), which would cost ~144MB RSS per
362
367
  * forked runner. See docs/decisions/adr-0028.md.
363
368
  *
364
- * Coverage: 27 collection caps, 45 array methods.
369
+ * Coverage: 28 collection caps, 46 array methods.
365
370
  */
366
371
  var COLLECTION_ARRAY_METHODS = Object.freeze({
367
372
  "action-source": ["listActions"],
@@ -399,6 +404,7 @@ var COLLECTION_ARRAY_METHODS = Object.freeze({
399
404
  "recording": ["listSources"],
400
405
  "storage-occupancy": ["getOccupancy"],
401
406
  "storage-provider": ["list"],
407
+ "template": ["list"],
402
408
  "training-provider": [
403
409
  "describe",
404
410
  "describeTypes",
@@ -83,6 +83,9 @@ export interface CustomizeCatalogTarget {
83
83
  readonly sourceModes?: readonly CameraSensorCustomizeMode[];
84
84
  readonly start?: 'rising-edge';
85
85
  readonly end?: 'falling-edge-or-timeout';
86
+ /** A `config` target: the cap methods that read and write the stored configuration. */
87
+ readonly readMethod?: string;
88
+ readonly writeMethod?: string;
86
89
  readonly vocabularyCap: string;
87
90
  readonly vocabularyStateField?: string;
88
91
  readonly vocabularyEvent?: string;
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import type { z } from 'zod';
9
9
  import type { DeviceType } from '../device/device-type.js';
10
- export type CustomizeCardinality = 'scalar' | 'keyedArray' | 'event';
10
+ export type CustomizeCardinality = 'scalar' | 'keyedArray' | 'event' | 'config';
11
11
  export type CustomizeValueKind = 'boolean' | 'number' | 'string' | 'enum';
12
12
  /** An extension is offered only when the device lacks the capability (D944). */
13
13
  export type CustomizeApplyMode = 'add';
@@ -15,7 +15,7 @@ export interface CapabilityCustomizeSpec {
15
15
  readonly version: 1;
16
16
  readonly targets: readonly CapabilityCustomizeTarget[];
17
17
  }
18
- export type CapabilityCustomizeTarget = ScalarCustomizeTarget | KeyedArrayCustomizeTarget | EventCustomizeTarget;
18
+ export type CapabilityCustomizeTarget = ScalarCustomizeTarget | KeyedArrayCustomizeTarget | EventCustomizeTarget | ConfigCustomizeTarget;
19
19
  export interface CustomizeVocabularyRef {
20
20
  readonly cap: string;
21
21
  readonly stateField?: string;
@@ -206,3 +206,21 @@ export interface SpanEventCustomizeTarget extends EventCustomizeTargetBase {
206
206
  readonly sourceModes?: readonly CameraSensorCustomizeMode[];
207
207
  }
208
208
  export type EventCustomizeTarget = PulseEventCustomizeTarget | SpanEventCustomizeTarget;
209
+ /**
210
+ * An extension that is not a value composed from other devices but a
211
+ * configuration the operator keeps for the device (D963: the remote). It has no
212
+ * sources, no composition claim and no runtime-state path: the capability reads
213
+ * and writes it through two of its own methods, both taking a top-level
214
+ * `deviceId`, and the editor is derived from that pair.
215
+ */
216
+ export interface ConfigCustomizeTarget {
217
+ readonly id: string;
218
+ readonly cardinality: 'config';
219
+ readonly vocabulary: CustomizeVocabularyRef;
220
+ readonly deviceTypes?: readonly DeviceType[];
221
+ readonly apply: CustomizeApplyMode;
222
+ /** The query that returns the stored configuration of a device. */
223
+ readonly readMethod: string;
224
+ /** The mutation that replaces it. */
225
+ readonly writeMethod: string;
226
+ }
@@ -157,6 +157,8 @@ export { type AutomationControlStatus, AutomationControlStatusSchema, automation
157
157
  export { type BatteryStatus, BatteryStatusSchema, batteryCapability, type IBatteryProvider, } from './battery.cap.js';
158
158
  export { type BinaryStatus, BinaryStatusSchema, binaryCapability, type IBinaryProvider, } from './binary.cap.js';
159
159
  export { type BrightnessStatus, BrightnessStatusSchema, brightnessCapability, type IBrightnessProvider, } from './brightness.cap.js';
160
+ export { type IRemoteProvider, REMOTE_CONFIG_REFUSALS, REMOTE_MAX_REPEAT, REMOTE_MEDIA_COMMANDS, REMOTE_REFUSAL_REASONS, type RemoteBoundCommand, type RemoteCommandList, RemoteCommandListSchema, RemoteBoundCommandSchema, type RemoteMediaCommand, type RemoteMediaCommandResult, RemoteMediaCommandResultSchema, RemoteMediaCommandSchema, type RemoteRefusalReason, RemoteRefusalReasonSchema, type RemoteSendResult, RemoteSendResultSchema, type RemoteSetConfigResult, RemoteSetConfigResultSchema, remoteCapability, } from './remote.cap.js';
161
+ export { type ITemplateProvider, TEMPLATE_WRITE_REFUSALS, type TemplateDeleteResult, TemplateDeleteResultSchema, type TemplateRecord, TemplateRecordSchema, type TemplateUser, TemplateUserSchema, type TemplateWriteResult, TemplateWriteResultSchema, templateCapability, } from './template.cap.js';
160
162
  export { buttonCapability, type IButtonProvider } from './button.cap.js';
161
163
  export { irTransmitterCapability, TransmitSettingKeySchema, IrMediumSchema, IrSendResultSchema, IrTransmitterInfoSchema, type IIrTransmitterProvider, type TransmitSettingKey, type IrMedium, type IrSendResult, type IrTransmitterInfo, } from './ir-transmitter.cap.js';
162
164
  export type { CalendarEvent, CalendarInfo, CalendarListEventsInput, CalendarLocalSpan, CalendarSourceKind, ICalendarSourceProvider, } from './calendar-source.cap.js';
@@ -203,7 +205,7 @@ export { type AdvertisedLocalPort, type ConnectionEndpoint, type HubAddressBook,
203
205
  export { type ILockControlProvider, type LockControlStatus, LockControlStatusSchema, type LockState, LockStateSchema, lockControlCapability, } from './lock-control.cap.js';
204
206
  export { type MaskGridDims, MaskGridDimsSchema, type MaskGridShape, MaskGridShapeSchema, type MaskLineShape, MaskLineShapeSchema, type MaskPoint, MaskPointSchema, type MaskPolygonShape, MaskPolygonShapeSchema, type MaskPolygonVertices, MaskPolygonVerticesSchema, type MaskRectShape, MaskRectShapeSchema, type MaskShape, type MaskShapeKind, MaskShapeKindSchema, MaskShapeSchema, } from './mask-shape.js';
205
207
  export { type MeterStatus, MeterStatusSchema, meterCapability, type IMeterProvider, } from './meter.cap.js';
206
- export { type IMediaPlayerProvider, type MediaInfo, type MediaPlayerRepeat, MediaPlayerRepeatSchema, type MediaPlayerState, MediaPlayerStateSchema, type MediaPlayerStatus, MediaPlayerStatusSchema, mediaPlayerCapability, } from './media-player.cap.js';
208
+ export { type IMediaPlayerProvider, type MediaInfo, type MediaPlayerRepeat, MediaPlayerRepeatSchema, type MediaPlayerState, MediaPlayerStateSchema, type MediaPlayerStateSource, MediaPlayerStateSourceSchema, MediaPlayerAssumedFieldSchema, type MediaPlayerAssumedField, type MediaPlayerStatus, MediaPlayerStatusSchema, mediaPlayerCapability, } from './media-player.cap.js';
207
209
  export { type IMeshNetworkProvider, type MeshEndpoint, type MeshPeer, MeshPeerSchema, type MeshStatus, MeshStatusSchema, meshNetworkCapability, } from './mesh-network.cap.js';
208
210
  export { type IMotionProvider, MOTION_CLOSE_AFTER_MS, MOTION_SPAN_TIMEOUT_MS, type MotionOnMotionChangedData, MotionOnMotionChangedDataSchema, type MotionStatus, MotionStatusSchema, motionCapability, } from './motion.cap.js';
209
211
  export { type IMotionTriggerProvider, type MotionTriggerRuntimeState, MotionTriggerRuntimeStateSchema, type MotionTriggerStatus, MotionTriggerStatusSchema, motionTriggerCapability, } from './motion-trigger.cap.js';
@@ -291,6 +293,8 @@ import type { brightnessCapability } from './brightness.cap.js';
291
293
  import type { brokerCapability } from './broker.cap.js';
292
294
  import type { buttonCapability } from './button.cap.js';
293
295
  import type { irTransmitterCapability } from './ir-transmitter.cap.js';
296
+ import type { remoteCapability } from './remote.cap.js';
297
+ import type { templateCapability } from './template.cap.js';
294
298
  import type { calendarSourceCapability } from './calendar-source.cap.js';
295
299
  import type { calendarsCapability } from './calendars.cap.js';
296
300
  import type { cameraCredentialsCapability } from './camera-credentials.cap.js';
@@ -451,6 +455,6 @@ import type { trainingProviderCapability } from './training-provider.cap.js';
451
455
  import type { zoneAnalyticsCapability } from './zone-analytics.cap.js';
452
456
  import type { zoneRulesCapability } from './zone-rules.cap.js';
453
457
  import type { zonesCapability } from './zones.cap.js';
454
- type AnyCapability = typeof streamSignalsCapability | typeof addonSettingsCapability | typeof alertsCapability | typeof storageCapability | typeof storageMigrationCapability | typeof storageProviderCapability | typeof storageEvictableCapability | typeof storageOccupancyCapability | typeof filesystemBrowseCapability | typeof backupCapability | typeof terminalSessionCapability | typeof settingsStoreCapability | typeof dataStoreProviderCapability | typeof databaseSnapshotCapability | typeof storageAdminCapability | typeof recordsCapability | typeof recordEntriesCapability | typeof deviceHistoryCapability | typeof keychainCapability | typeof keychainAdminCapability | typeof deviceCredentialsCapability | typeof nodeCertificatesCapability | typeof logChannelsCapability | typeof logDestinationCapability | typeof loadContributionCapability | typeof failureContributionCapability | typeof deviceRemovalHookCapability | typeof adminUiCapability | typeof viewerUiCapability | typeof ssoBridgeCapability | typeof userPasskeysCapability | typeof smtpProviderCapability | typeof mqttBrokerCapability | typeof brokerCapability | typeof deviceAdoptionCapability | typeof deviceAdminLinkCapability | typeof deviceExportCapability | typeof addonPagesCapability | typeof addonPagesSourceCapability | typeof addonWidgetsCapability | typeof addonWidgetsSourceCapability | typeof customModelRegistryCapability | typeof modelDistributorCapability | typeof modelConvertCapability | typeof addonRoutesCapability | typeof streamBrokerCapability | typeof decoderCapability | typeof webrtcSessionCapability | typeof cameraStreamsCapability | typeof calendarSourceCapability | typeof calendarsCapability | typeof motionDetectionCapability | typeof pipelineExecutorCapability | typeof detectionPipelineCapability | typeof cameraPipelineConfigCapability | typeof pipelineRunnerCapability | typeof pipelineOrchestratorCapability | typeof audioAnalyzerCapability | typeof audioAnalysisCapability | typeof audioCodecCapability | typeof embeddingEncoderCapability | typeof vectorStoreCapability | typeof deviceProviderCapability | typeof deviceManagerCapability | typeof deviceStateCapability | typeof authProviderCapability | typeof loginMethodCapability | typeof networkAccessCapability | typeof turnProviderCapability | typeof snapshotCapability | typeof llmCapability | typeof llmRuntimeCapability | typeof notificationOutputCapability | typeof composerCapability | typeof coreBlocksCapability | typeof notificationRulesCapability | typeof pipelineAnalyticsCapability | typeof metricsProviderCapability | typeof ptzCapability | typeof ptzAutotrackCapability | typeof navigationCapability | typeof consumablesCapability | typeof connectionTestCapability | typeof runningStateCapability | typeof rebootCapability | typeof deviceDiscoveryCapability | typeof brightnessCapability | typeof colorCapability | typeof climateControlCapability | typeof coverCapability | typeof valveCapability | typeof humidifierCapability | typeof waterHeaterCapability | typeof weatherCapability | typeof imageCapability | typeof lockControlCapability | typeof vacuumControlCapability | typeof petFeederCapability | typeof lawnMowerControlCapability | typeof fanControlCapability | typeof controlCapability | typeof notifierCapability | typeof mediaPlayerCapability | typeof meterCapability | typeof alarmPanelCapability | typeof presenceCapability | typeof scriptRunnerCapability | typeof actionSourceCapability | typeof actionsCapability | typeof automationControlCapability | typeof motionTriggerCapability | typeof zonesCapability | typeof zoneRulesCapability | typeof trainingCapability | typeof trainingProviderCapability | typeof zoneAnalyticsCapability | typeof audioMetricsCapability | typeof motionCapability | typeof contactCapability | typeof floodCapability | typeof smokeCapability | typeof carbonMonoxideCapability | typeof gasCapability | typeof groupActiveCapability | typeof groupCommandsCapability | typeof groupStatusCapability | typeof tamperCapability | typeof vibrationCapability | typeof connectivityCapability | typeof binaryCapability | typeof temperatureSensorCapability | typeof heatingValveCapability | typeof humiditySensorCapability | typeof ambientLightSensorCapability | typeof pressureSensorCapability | typeof powerMeterCapability | typeof airQualitySensorCapability | typeof numericSensorCapability | typeof enumSensorCapability | typeof recordingCapability | typeof recordingArchiveCapability | typeof recordingExportCapability | typeof recordingSignalCapability | typeof deviceOpsCapability | typeof displayPaletteCapability | typeof platformProbeCapability | typeof localNetworkCapability | typeof meshNetworkCapability | typeof userManagementCapability | typeof systemCapability | typeof networkQualityCapability | typeof toastCapability | typeof nodesCapability | typeof serverManagementCapability | typeof integrationsCapability | typeof addonsCapability | typeof oauthIntegrationCapability | typeof oidcConnectionsCapability | typeof streamParamsCapability | typeof streamCatalogCapability | typeof motionZonesCapability | typeof cameraGridLayoutCapability | typeof sceneMonitorCapability | typeof privacyMaskCapability | typeof dayNightCapability | typeof recordingOnboardCapability | typeof imageSettingsCapability | typeof osdCapability | typeof osdManagerCapability | typeof accessoriesCapability | typeof batteryCapability | typeof networkLinkCapability | typeof buttonCapability | typeof irTransmitterCapability | typeof cameraCredentialsCapability | typeof deviceStatusCapability | typeof doorbellCapability | typeof eventEmitterCapability | typeof faceGalleryCapability | typeof featureProbeCapability | typeof intercomCapability | typeof nativeObjectDetectionCapability | typeof plateGalleryCapability | typeof switchCapability | typeof updateCapability | typeof videoclipsCapability | typeof deviceExtensionCapability | typeof dishwasherCapability;
458
+ type AnyCapability = typeof streamSignalsCapability | typeof addonSettingsCapability | typeof alertsCapability | typeof storageCapability | typeof storageMigrationCapability | typeof storageProviderCapability | typeof storageEvictableCapability | typeof storageOccupancyCapability | typeof filesystemBrowseCapability | typeof backupCapability | typeof terminalSessionCapability | typeof settingsStoreCapability | typeof dataStoreProviderCapability | typeof databaseSnapshotCapability | typeof storageAdminCapability | typeof recordsCapability | typeof recordEntriesCapability | typeof deviceHistoryCapability | typeof keychainCapability | typeof keychainAdminCapability | typeof deviceCredentialsCapability | typeof nodeCertificatesCapability | typeof logChannelsCapability | typeof logDestinationCapability | typeof loadContributionCapability | typeof failureContributionCapability | typeof deviceRemovalHookCapability | typeof adminUiCapability | typeof viewerUiCapability | typeof ssoBridgeCapability | typeof userPasskeysCapability | typeof smtpProviderCapability | typeof mqttBrokerCapability | typeof brokerCapability | typeof deviceAdoptionCapability | typeof deviceAdminLinkCapability | typeof deviceExportCapability | typeof addonPagesCapability | typeof addonPagesSourceCapability | typeof addonWidgetsCapability | typeof addonWidgetsSourceCapability | typeof customModelRegistryCapability | typeof modelDistributorCapability | typeof modelConvertCapability | typeof addonRoutesCapability | typeof streamBrokerCapability | typeof decoderCapability | typeof webrtcSessionCapability | typeof cameraStreamsCapability | typeof calendarSourceCapability | typeof calendarsCapability | typeof motionDetectionCapability | typeof pipelineExecutorCapability | typeof detectionPipelineCapability | typeof cameraPipelineConfigCapability | typeof pipelineRunnerCapability | typeof pipelineOrchestratorCapability | typeof audioAnalyzerCapability | typeof audioAnalysisCapability | typeof audioCodecCapability | typeof embeddingEncoderCapability | typeof vectorStoreCapability | typeof deviceProviderCapability | typeof deviceManagerCapability | typeof deviceStateCapability | typeof authProviderCapability | typeof loginMethodCapability | typeof networkAccessCapability | typeof turnProviderCapability | typeof snapshotCapability | typeof llmCapability | typeof llmRuntimeCapability | typeof notificationOutputCapability | typeof composerCapability | typeof coreBlocksCapability | typeof notificationRulesCapability | typeof pipelineAnalyticsCapability | typeof metricsProviderCapability | typeof ptzCapability | typeof ptzAutotrackCapability | typeof navigationCapability | typeof consumablesCapability | typeof connectionTestCapability | typeof runningStateCapability | typeof rebootCapability | typeof deviceDiscoveryCapability | typeof brightnessCapability | typeof colorCapability | typeof climateControlCapability | typeof coverCapability | typeof valveCapability | typeof humidifierCapability | typeof waterHeaterCapability | typeof weatherCapability | typeof imageCapability | typeof lockControlCapability | typeof vacuumControlCapability | typeof petFeederCapability | typeof lawnMowerControlCapability | typeof fanControlCapability | typeof controlCapability | typeof notifierCapability | typeof mediaPlayerCapability | typeof meterCapability | typeof alarmPanelCapability | typeof presenceCapability | typeof scriptRunnerCapability | typeof actionSourceCapability | typeof actionsCapability | typeof automationControlCapability | typeof motionTriggerCapability | typeof zonesCapability | typeof zoneRulesCapability | typeof trainingCapability | typeof trainingProviderCapability | typeof zoneAnalyticsCapability | typeof audioMetricsCapability | typeof motionCapability | typeof contactCapability | typeof floodCapability | typeof smokeCapability | typeof carbonMonoxideCapability | typeof gasCapability | typeof groupActiveCapability | typeof groupCommandsCapability | typeof groupStatusCapability | typeof tamperCapability | typeof vibrationCapability | typeof connectivityCapability | typeof binaryCapability | typeof temperatureSensorCapability | typeof heatingValveCapability | typeof humiditySensorCapability | typeof ambientLightSensorCapability | typeof pressureSensorCapability | typeof powerMeterCapability | typeof airQualitySensorCapability | typeof numericSensorCapability | typeof enumSensorCapability | typeof recordingCapability | typeof recordingArchiveCapability | typeof recordingExportCapability | typeof recordingSignalCapability | typeof deviceOpsCapability | typeof displayPaletteCapability | typeof platformProbeCapability | typeof localNetworkCapability | typeof meshNetworkCapability | typeof userManagementCapability | typeof systemCapability | typeof networkQualityCapability | typeof toastCapability | typeof nodesCapability | typeof serverManagementCapability | typeof integrationsCapability | typeof addonsCapability | typeof oauthIntegrationCapability | typeof oidcConnectionsCapability | typeof streamParamsCapability | typeof streamCatalogCapability | typeof motionZonesCapability | typeof cameraGridLayoutCapability | typeof sceneMonitorCapability | typeof privacyMaskCapability | typeof dayNightCapability | typeof recordingOnboardCapability | typeof imageSettingsCapability | typeof osdCapability | typeof osdManagerCapability | typeof accessoriesCapability | typeof batteryCapability | typeof networkLinkCapability | typeof buttonCapability | typeof irTransmitterCapability | typeof remoteCapability | typeof templateCapability | typeof cameraCredentialsCapability | typeof deviceStatusCapability | typeof doorbellCapability | typeof eventEmitterCapability | typeof faceGalleryCapability | typeof featureProbeCapability | typeof intercomCapability | typeof nativeObjectDetectionCapability | typeof plateGalleryCapability | typeof switchCapability | typeof updateCapability | typeof videoclipsCapability | typeof deviceExtensionCapability | typeof dishwasherCapability;
455
459
  export type CapabilityName = AnyCapability['name'];
456
460
  export type ITypedReadinessRegistry = IReadinessRegistry<CapabilityName>;
@@ -37,6 +37,26 @@ declare const MediaInfoSchema: z.ZodObject<{
37
37
  imageUrl: z.ZodOptional<z.ZodString>;
38
38
  }, z.core.$strip>;
39
39
  export type MediaInfo = z.infer<typeof MediaInfoSchema>;
40
+ /**
41
+ * Where `state`, `volumeLevel`, `isMuted` and `source` come from. `reported`:
42
+ * the device said so. `assumed`: the driver has no feedback (infrared) and
43
+ * tracks what it last SENT; it moves only after a send was accepted, and a
44
+ * human at the real remote makes it wrong. A UI shows an assumed value as a
45
+ * guess, never as a reading.
46
+ */
47
+ export declare const MediaPlayerStateSourceSchema: z.ZodEnum<{
48
+ assumed: "assumed";
49
+ reported: "reported";
50
+ }>;
51
+ export type MediaPlayerStateSource = z.infer<typeof MediaPlayerStateSourceSchema>;
52
+ /** The fields of a media-player status a driver can only guess. */
53
+ export declare const MediaPlayerAssumedFieldSchema: z.ZodEnum<{
54
+ isMuted: "isMuted";
55
+ source: "source";
56
+ state: "state";
57
+ volumeLevel: "volumeLevel";
58
+ }>;
59
+ export type MediaPlayerAssumedField = z.infer<typeof MediaPlayerAssumedFieldSchema>;
40
60
  export declare const MediaPlayerStatusSchema: z.ZodObject<{
41
61
  state: z.ZodEnum<{
42
62
  buffering: "buffering";
@@ -47,6 +67,16 @@ export declare const MediaPlayerStatusSchema: z.ZodObject<{
47
67
  playing: "playing";
48
68
  standby: "standby";
49
69
  }>;
70
+ stateSource: z.ZodDefault<z.ZodEnum<{
71
+ assumed: "assumed";
72
+ reported: "reported";
73
+ }>>;
74
+ assumedFields: z.ZodDefault<z.ZodArray<z.ZodEnum<{
75
+ isMuted: "isMuted";
76
+ source: "source";
77
+ state: "state";
78
+ volumeLevel: "volumeLevel";
79
+ }>>>;
50
80
  volumeLevel: z.ZodNullable<z.ZodNumber>;
51
81
  isMuted: z.ZodNullable<z.ZodBoolean>;
52
82
  source: z.ZodString;
@@ -136,6 +166,16 @@ export declare const mediaPlayerCapability: {
136
166
  playing: "playing";
137
167
  standby: "standby";
138
168
  }>;
169
+ stateSource: z.ZodDefault<z.ZodEnum<{
170
+ assumed: "assumed";
171
+ reported: "reported";
172
+ }>>;
173
+ assumedFields: z.ZodDefault<z.ZodArray<z.ZodEnum<{
174
+ isMuted: "isMuted";
175
+ source: "source";
176
+ state: "state";
177
+ volumeLevel: "volumeLevel";
178
+ }>>>;
139
179
  volumeLevel: z.ZodNullable<z.ZodNumber>;
140
180
  isMuted: z.ZodNullable<z.ZodBoolean>;
141
181
  source: z.ZodString;
@@ -174,6 +214,16 @@ export declare const mediaPlayerCapability: {
174
214
  playing: "playing";
175
215
  standby: "standby";
176
216
  }>;
217
+ stateSource: z.ZodDefault<z.ZodEnum<{
218
+ assumed: "assumed";
219
+ reported: "reported";
220
+ }>>;
221
+ assumedFields: z.ZodDefault<z.ZodArray<z.ZodEnum<{
222
+ isMuted: "isMuted";
223
+ source: "source";
224
+ state: "state";
225
+ volumeLevel: "volumeLevel";
226
+ }>>>;
177
227
  volumeLevel: z.ZodNullable<z.ZodNumber>;
178
228
  isMuted: z.ZodNullable<z.ZodBoolean>;
179
229
  source: z.ZodString;
@@ -71,6 +71,9 @@ export declare const PetFeederStatusSchema: z.ZodObject<{
71
71
  indicatorLight: z.ZodBoolean;
72
72
  feedSound: z.ZodBoolean;
73
73
  volume: z.ZodNumber;
74
+ lastFeedGrams: z.ZodNullable<z.ZodNumber>;
75
+ lastFeedHopper1: z.ZodNullable<z.ZodNumber>;
76
+ lastFeedHopper2: z.ZodNullable<z.ZodNumber>;
74
77
  lastFetchedAt: z.ZodNumber;
75
78
  }, z.core.$strip>;
76
79
  export type PetFeederStatus = z.infer<typeof PetFeederStatusSchema>;
@@ -166,6 +169,9 @@ export declare const petFeederCapability: {
166
169
  indicatorLight: z.ZodBoolean;
167
170
  feedSound: z.ZodBoolean;
168
171
  volume: z.ZodNumber;
172
+ lastFeedGrams: z.ZodNullable<z.ZodNumber>;
173
+ lastFeedHopper1: z.ZodNullable<z.ZodNumber>;
174
+ lastFeedHopper2: z.ZodNullable<z.ZodNumber>;
169
175
  lastFetchedAt: z.ZodNumber;
170
176
  }, z.core.$strip>;
171
177
  readonly kind: 'poll';
@@ -202,6 +208,9 @@ export declare const petFeederCapability: {
202
208
  indicatorLight: z.ZodBoolean;
203
209
  feedSound: z.ZodBoolean;
204
210
  volume: z.ZodNumber;
211
+ lastFeedGrams: z.ZodNullable<z.ZodNumber>;
212
+ lastFeedHopper1: z.ZodNullable<z.ZodNumber>;
213
+ lastFeedHopper2: z.ZodNullable<z.ZodNumber>;
205
214
  lastFetchedAt: z.ZodNumber;
206
215
  }, z.core.$strip>;
207
216
  /**
@@ -0,0 +1,264 @@
1
+ import { z } from 'zod';
2
+ import { type InferProvider } from './capability-definition.js';
3
+ import { DeviceType } from '../device/device-type.js';
4
+ /**
5
+ * remote — a button panel over a device (D963). The operator binds a ROLE
6
+ * (`power`, `volume_up`, `custom:source_hdmi_1`, …) to an action — a cap method
7
+ * called on a device, the shape an Action step has — and picks a layout
8
+ * template that places the roles on a grid. What a button does is the action's
9
+ * business: an infrared code is `ir-transmitter.send` on the transmitter, a smart
10
+ * TV is whatever cap drives it.
11
+ *
12
+ * It is a Customize extension (D944) of a media player: the configuration is
13
+ * the operator's, stored per device, and the editor is derived from the
14
+ * `config` target below. A media-player command whose role is bound here goes
15
+ * through the binding for EVERY caller (UI, automation, exporter); an unbound
16
+ * role falls back to the native cap.
17
+ *
18
+ * `sendCommand` answers a typed result and never throws for an expected
19
+ * refusal, so a caller tells "that role is not bound" from "the board is off"
20
+ * without parsing text. How many times a command is sent is the CALLER's
21
+ * (`repeat`, volume steps), never a stored setting.
22
+ */
23
+ export declare const REMOTE_MAX_REPEAT = 50;
24
+ export declare const RemoteBoundCommandSchema: z.ZodObject<{
25
+ role: z.ZodString;
26
+ label: z.ZodOptional<z.ZodString>;
27
+ custom: z.ZodBoolean;
28
+ }, z.core.$strip>;
29
+ export type RemoteBoundCommand = z.infer<typeof RemoteBoundCommandSchema>;
30
+ export declare const RemoteCommandListSchema: z.ZodObject<{
31
+ layoutTemplateId: z.ZodNullable<z.ZodString>;
32
+ power: z.ZodObject<{
33
+ mode: z.ZodEnum<{
34
+ discrete: "discrete";
35
+ toggle: "toggle";
36
+ }>;
37
+ }, z.core.$strip>;
38
+ commands: z.ZodArray<z.ZodObject<{
39
+ role: z.ZodString;
40
+ label: z.ZodOptional<z.ZodString>;
41
+ custom: z.ZodBoolean;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ export type RemoteCommandList = z.infer<typeof RemoteCommandListSchema>;
45
+ export declare const REMOTE_REFUSAL_REASONS: readonly ['no-remote', 'unbound-role', 'action-failed'];
46
+ export declare const RemoteRefusalReasonSchema: z.ZodEnum<{
47
+ "action-failed": "action-failed";
48
+ "no-remote": "no-remote";
49
+ "unbound-role": "unbound-role";
50
+ }>;
51
+ export type RemoteRefusalReason = z.infer<typeof RemoteRefusalReasonSchema>;
52
+ export declare const RemoteSendResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
53
+ status: z.ZodLiteral<"sent">;
54
+ sends: z.ZodNumber;
55
+ }, z.core.$strip>, z.ZodObject<{
56
+ status: z.ZodLiteral<"skipped">;
57
+ reason: z.ZodLiteral<"already-in-state">;
58
+ }, z.core.$strip>, z.ZodObject<{
59
+ status: z.ZodLiteral<"refused">;
60
+ reason: z.ZodEnum<{
61
+ "action-failed": "action-failed";
62
+ "no-remote": "no-remote";
63
+ "unbound-role": "unbound-role";
64
+ }>;
65
+ detail: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>], "status">;
67
+ export type RemoteSendResult = z.infer<typeof RemoteSendResultSchema>;
68
+ /** The media-player commands a bound remote role takes over (precedence, D963). */
69
+ export declare const REMOTE_MEDIA_COMMANDS: readonly ['play', 'pause', 'stop', 'next', 'previous', 'setMute', 'selectSource'];
70
+ export declare const RemoteMediaCommandSchema: z.ZodEnum<{
71
+ next: "next";
72
+ pause: "pause";
73
+ play: "play";
74
+ previous: "previous";
75
+ selectSource: "selectSource";
76
+ setMute: "setMute";
77
+ stop: "stop";
78
+ }>;
79
+ export type RemoteMediaCommand = z.infer<typeof RemoteMediaCommandSchema>;
80
+ /** A send result, or `not-routed`: the role is not bound, so the native cap answers. */
81
+ export declare const RemoteMediaCommandResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
82
+ status: z.ZodLiteral<"sent">;
83
+ sends: z.ZodNumber;
84
+ }, z.core.$strip>, z.ZodObject<{
85
+ status: z.ZodLiteral<"skipped">;
86
+ reason: z.ZodLiteral<"already-in-state">;
87
+ }, z.core.$strip>, z.ZodObject<{
88
+ status: z.ZodLiteral<"refused">;
89
+ reason: z.ZodEnum<{
90
+ "action-failed": "action-failed";
91
+ "no-remote": "no-remote";
92
+ "unbound-role": "unbound-role";
93
+ }>;
94
+ detail: z.ZodOptional<z.ZodString>;
95
+ }, z.core.$strip>, z.ZodObject<{
96
+ status: z.ZodLiteral<"not-routed">;
97
+ }, z.core.$strip>], "status">;
98
+ export type RemoteMediaCommandResult = z.infer<typeof RemoteMediaCommandResultSchema>;
99
+ export declare const REMOTE_CONFIG_REFUSALS: readonly ['unknown-template', 'not-a-media-player'];
100
+ export declare const RemoteSetConfigResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
101
+ status: z.ZodLiteral<"saved">;
102
+ }, z.core.$strip>, z.ZodObject<{
103
+ status: z.ZodLiteral<"refused">;
104
+ reason: z.ZodEnum<{
105
+ "not-a-media-player": "not-a-media-player";
106
+ "unknown-template": "unknown-template";
107
+ }>;
108
+ detail: z.ZodString;
109
+ }, z.core.$strip>], "status">;
110
+ export type RemoteSetConfigResult = z.infer<typeof RemoteSetConfigResultSchema>;
111
+ export declare const remoteCapability: {
112
+ readonly name: 'remote';
113
+ readonly scope: 'system';
114
+ readonly mode: 'singleton';
115
+ readonly methods: {
116
+ readonly getConfig: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
117
+ deviceId: z.ZodNumber;
118
+ }, z.core.$strip>, z.ZodObject<{
119
+ layoutTemplateId: z.ZodNullable<z.ZodString>;
120
+ defaultTransmitterId: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
121
+ bindings: z.ZodRecord<z.ZodString, z.ZodObject<{
122
+ action: z.ZodObject<{
123
+ kind: z.ZodLiteral<"cap">;
124
+ cap: z.ZodString;
125
+ method: z.ZodString;
126
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
127
+ deviceId: z.ZodNumber;
128
+ }, z.core.$strip>;
129
+ }, z.core.$strip>>;
130
+ customButtons: z.ZodArray<z.ZodObject<{
131
+ key: z.ZodString;
132
+ name: z.ZodString;
133
+ }, z.core.$strip>>;
134
+ power: z.ZodObject<{
135
+ mode: z.ZodEnum<{
136
+ discrete: "discrete";
137
+ toggle: "toggle";
138
+ }>;
139
+ }, z.core.$strip>;
140
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
141
+ readonly setConfig: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
142
+ deviceId: z.ZodNumber;
143
+ config: z.ZodObject<{
144
+ layoutTemplateId: z.ZodNullable<z.ZodString>;
145
+ defaultTransmitterId: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
146
+ bindings: z.ZodRecord<z.ZodString, z.ZodObject<{
147
+ action: z.ZodObject<{
148
+ kind: z.ZodLiteral<"cap">;
149
+ cap: z.ZodString;
150
+ method: z.ZodString;
151
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
152
+ deviceId: z.ZodNumber;
153
+ }, z.core.$strip>;
154
+ }, z.core.$strip>>;
155
+ customButtons: z.ZodArray<z.ZodObject<{
156
+ key: z.ZodString;
157
+ name: z.ZodString;
158
+ }, z.core.$strip>>;
159
+ power: z.ZodObject<{
160
+ mode: z.ZodEnum<{
161
+ discrete: "discrete";
162
+ toggle: "toggle";
163
+ }>;
164
+ }, z.core.$strip>;
165
+ }, z.core.$strip>;
166
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
167
+ status: z.ZodLiteral<"saved">;
168
+ }, z.core.$strip>, z.ZodObject<{
169
+ status: z.ZodLiteral<"refused">;
170
+ reason: z.ZodEnum<{
171
+ "not-a-media-player": "not-a-media-player";
172
+ "unknown-template": "unknown-template";
173
+ }>;
174
+ detail: z.ZodString;
175
+ }, z.core.$strip>], "status">, "mutation">;
176
+ readonly listCommands: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
177
+ deviceId: z.ZodNumber;
178
+ }, z.core.$strip>, z.ZodObject<{
179
+ layoutTemplateId: z.ZodNullable<z.ZodString>;
180
+ power: z.ZodObject<{
181
+ mode: z.ZodEnum<{
182
+ discrete: "discrete";
183
+ toggle: "toggle";
184
+ }>;
185
+ }, z.core.$strip>;
186
+ commands: z.ZodArray<z.ZodObject<{
187
+ role: z.ZodString;
188
+ label: z.ZodOptional<z.ZodString>;
189
+ custom: z.ZodBoolean;
190
+ }, z.core.$strip>>;
191
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
192
+ readonly sendCommand: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
193
+ deviceId: z.ZodNumber;
194
+ role: z.ZodString;
195
+ repeat: z.ZodDefault<z.ZodNumber>;
196
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
197
+ status: z.ZodLiteral<"sent">;
198
+ sends: z.ZodNumber;
199
+ }, z.core.$strip>, z.ZodObject<{
200
+ status: z.ZodLiteral<"skipped">;
201
+ reason: z.ZodLiteral<"already-in-state">;
202
+ }, z.core.$strip>, z.ZodObject<{
203
+ status: z.ZodLiteral<"refused">;
204
+ reason: z.ZodEnum<{
205
+ "action-failed": "action-failed";
206
+ "no-remote": "no-remote";
207
+ "unbound-role": "unbound-role";
208
+ }>;
209
+ detail: z.ZodOptional<z.ZodString>;
210
+ }, z.core.$strip>], "status">, "mutation">;
211
+ /**
212
+ * A media-player command, offered to the remote first. Answers `not-routed`
213
+ * when the command's role is not bound, so the caller runs the native cap.
214
+ * The dispatch redirect calls this for every caller (UI, automation,
215
+ * exporter); `repeat` is the caller's count where it has one.
216
+ */
217
+ readonly sendMediaCommand: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
218
+ deviceId: z.ZodNumber;
219
+ command: z.ZodEnum<{
220
+ next: "next";
221
+ pause: "pause";
222
+ play: "play";
223
+ previous: "previous";
224
+ selectSource: "selectSource";
225
+ setMute: "setMute";
226
+ stop: "stop";
227
+ }>;
228
+ muted: z.ZodOptional<z.ZodBoolean>;
229
+ source: z.ZodOptional<z.ZodString>;
230
+ repeat: z.ZodDefault<z.ZodNumber>;
231
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
232
+ status: z.ZodLiteral<"sent">;
233
+ sends: z.ZodNumber;
234
+ }, z.core.$strip>, z.ZodObject<{
235
+ status: z.ZodLiteral<"skipped">;
236
+ reason: z.ZodLiteral<"already-in-state">;
237
+ }, z.core.$strip>, z.ZodObject<{
238
+ status: z.ZodLiteral<"refused">;
239
+ reason: z.ZodEnum<{
240
+ "action-failed": "action-failed";
241
+ "no-remote": "no-remote";
242
+ "unbound-role": "unbound-role";
243
+ }>;
244
+ detail: z.ZodOptional<z.ZodString>;
245
+ }, z.core.$strip>, z.ZodObject<{
246
+ status: z.ZodLiteral<"not-routed">;
247
+ }, z.core.$strip>], "status">, "mutation">;
248
+ };
249
+ readonly customize: {
250
+ readonly version: 1;
251
+ readonly targets: readonly [{
252
+ readonly id: 'remote';
253
+ readonly cardinality: 'config';
254
+ readonly vocabulary: {
255
+ readonly cap: 'remote';
256
+ };
257
+ readonly deviceTypes: readonly [DeviceType.MediaPlayer];
258
+ readonly apply: 'add';
259
+ readonly readMethod: 'getConfig';
260
+ readonly writeMethod: 'setConfig';
261
+ }];
262
+ };
263
+ };
264
+ export type IRemoteProvider = InferProvider<typeof remoteCapability>;