@camstack/types 1.1.10 → 1.1.12

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.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as SubscribeAudioChunksResultSchema, A as ReadinessRegistry, B as CamStreamResolutionSchema, C as asJsonObject, D as parseJsonObject, E as parseJsonArray, F as BrokerStatsSchema, G as FrameHandleFormatSchema, H as DecodedAudioChunkSchema, I as BrokerStatusSchema, J as ProfileSlotSchema, K as FrameHandleSchema, L as CAM_PROFILE_ORDER, M as emitDownForOwnedCaps, N as readinessKey, O as parseJsonUnknown, P as scopeKey, Q as SubscribeAudioChunksInputSchema, R as CamProfileSchema, S as asJsonArray, T as asString, U as DecodedFrameSchema, V as CameraStreamSchema, W as EncodedPacketSchema, X as StreamSourceEntrySchema, Y as ProfileSlotStatusSchema, Z as StreamSourceSchema, _ as ChargingStatus, a as adminUiCapability, at as selectAssignedProfileSlots, b as DeviceType, c as createMirrorSource, ct as createDurableState, d as DEVICE_STATUS_METHOD, dt as isEvent, et as SubscribeFramesInputSchema, f as event, ft as WELL_KNOWN_TABS, g as resolveCapMount, gt as DisposerChain, h as method, ht as EventCategory, i as deviceOpsCapability, it as parseProfileBrokerId, j as ReadinessTimeoutError, k as DATAPLANE_SECRET_HEADER, l as createSliceHandle, lt as createEvent, m as isDeviceConfigCap, mt as hydrateSchema, n as sleepCancellable, nt as makeProfileBrokerId, o as createDeviceProxy, ot as BaseAddon, p as expandCapMethods, pt as WELL_KNOWN_TAB_MAP, q as ProfileRtspEntrySchema, r as RawStateResultSchema, rt as makeSourceBrokerId, s as createLazyTrpcSource, st as normalizeAddonInitResult, t as sleep, tt as SubscribeFramesResultSchema, u as DEVICE_SETTINGS_CONTRIBUTION_METHODS, ut as emitReadiness, v as DeviceFeature, w as asNumber, x as asBoolean, y as DeviceRole, z as CamStreamKindSchema } from "./sleep-B3AOslwX.mjs";
1
+ import { $ as SubscribeAudioChunksResultSchema, A as ReadinessRegistry, B as CamStreamResolutionSchema, C as asJsonObject, D as parseJsonObject, E as parseJsonArray, F as BrokerStatsSchema, G as FrameHandleFormatSchema, H as DecodedAudioChunkSchema, I as BrokerStatusSchema, J as ProfileSlotSchema, K as FrameHandleSchema, L as CAM_PROFILE_ORDER, M as emitDownForOwnedCaps, N as readinessKey, O as parseJsonUnknown, P as scopeKey, Q as SubscribeAudioChunksInputSchema, R as CamProfileSchema, S as asJsonArray, T as asString, U as DecodedFrameSchema, V as CameraStreamSchema, W as EncodedPacketSchema, X as StreamSourceEntrySchema, Y as ProfileSlotStatusSchema, Z as StreamSourceSchema, _ as ChargingStatus, a as adminUiCapability, at as selectAssignedProfileSlots, b as DeviceType, c as createMirrorSource, ct as createDurableState, d as DEVICE_STATUS_METHOD, dt as isEvent, et as SubscribeFramesInputSchema, f as event, ft as WELL_KNOWN_TABS, g as resolveCapMount, gt as DisposerChain, h as method, ht as EventCategory, i as deviceOpsCapability, it as parseProfileBrokerId, j as ReadinessTimeoutError, k as DATAPLANE_SECRET_HEADER, l as createSliceHandle, lt as createEvent, m as isDeviceConfigCap, mt as hydrateSchema, n as sleepCancellable, nt as makeProfileBrokerId, o as createDeviceProxy, ot as BaseAddon, p as expandCapMethods, pt as WELL_KNOWN_TAB_MAP, q as ProfileRtspEntrySchema, r as RawStateResultSchema, rt as makeSourceBrokerId, s as createLazyTrpcSource, st as normalizeAddonInitResult, t as sleep, tt as SubscribeFramesResultSchema, u as DEVICE_SETTINGS_CONTRIBUTION_METHODS, ut as emitReadiness, v as DeviceFeature, w as asNumber, x as asBoolean, y as DeviceRole, z as CamStreamKindSchema } from "./sleep-C2M2zF7x.mjs";
2
2
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/health/wiring-health.ts
@@ -4215,7 +4215,7 @@ var climateControlCapability = {
4215
4215
  scope: "device",
4216
4216
  deviceNative: true,
4217
4217
  mode: "singleton",
4218
- deviceTypes: [DeviceType.Thermostat],
4218
+ deviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
4219
4219
  methods: {
4220
4220
  setMode: method(z.object({
4221
4221
  deviceId: z.number().int().nonnegative(),
@@ -9426,10 +9426,30 @@ var deviceProviderCapability = {
9426
9426
  type: z.string()
9427
9427
  }))),
9428
9428
  supportsDiscovery: method(z.object({}), z.boolean()),
9429
- discoverDevices: method(z.object({}), z.array(DiscoveryCandidateSchema), {
9429
+ /**
9430
+ * Run a network scan. `params` carries optional provider-specific scan
9431
+ * inputs (e.g. a broadcast address / subnet for cross-subnet discovery),
9432
+ * shaped by `getDiscoveryParamsSchema`. Omitted for the generic scan
9433
+ * (provider uses its local-network default).
9434
+ */
9435
+ discoverDevices: method(z.object({ params: z.record(z.string(), z.unknown()).optional() }), z.array(DiscoveryCandidateSchema), {
9430
9436
  kind: "mutation",
9431
9437
  auth: "admin"
9432
9438
  }),
9439
+ /**
9440
+ * Optional form schema (`ConfigUISchema`) for the EXTRA per-scan inputs a
9441
+ * provider accepts (e.g. Gree's broadcast address for a different subnet).
9442
+ * `null` when the provider takes no extra scan params — the generic
9443
+ * aggregated scan never renders this; the per-integration scan does.
9444
+ */
9445
+ getDiscoveryParamsSchema: method(z.object({}), CreationSchemaOutputSchema),
9446
+ /**
9447
+ * The DeviceType this provider creates via manual add (Camera for
9448
+ * Reolink/ONVIF, Container for Gree, Hub for Ecowitt). `null` when the
9449
+ * provider does not support manual creation. Lets the Add-Device dialog
9450
+ * pick the right type instead of assuming Camera.
9451
+ */
9452
+ getManualCreationType: method(z.object({}), z.object({ deviceType: z.enum(DeviceType).nullable() })),
9433
9453
  adoptDiscoveredDevice: method(z.object({ candidate: DiscoveryCandidateSchema }), DeviceSummarySchema, {
9434
9454
  kind: "mutation",
9435
9455
  auth: "admin"
@@ -9555,9 +9575,23 @@ var BaseDeviceProvider = class extends BaseAddon {
9555
9575
  async supportsDiscovery() {
9556
9576
  return false;
9557
9577
  }
9558
- async discoverDevices() {
9578
+ async discoverDevices(_input) {
9559
9579
  return [];
9560
9580
  }
9581
+ /** Extra per-scan input form (e.g. a broadcast address for another subnet).
9582
+ * Null = no extra params. Override in providers that support scoped scans. */
9583
+ async getDiscoveryParamsSchema() {
9584
+ return null;
9585
+ }
9586
+ /**
9587
+ * The DeviceType this provider creates via manual add — derived from the
9588
+ * `deviceClasses` map (first registered type). `null` when manual creation is
9589
+ * unsupported. Lets the Add-Device dialog pick the right type per provider.
9590
+ */
9591
+ async getManualCreationType() {
9592
+ if (!await this.supportsManualCreation()) return { deviceType: null };
9593
+ return { deviceType: Object.values(DeviceType).find((t) => this.deviceClasses[t] !== void 0) ?? null };
9594
+ }
9561
9595
  async adoptDiscoveredDevice(_input) {
9562
9596
  throw new Error(`${this.providerName} provider does not support discovery-based adoption`);
9563
9597
  }
@@ -10168,11 +10202,17 @@ function createSystemProxy(api) {
10168
10202
  getCreationSchema: (input) => dispatch("deviceManager", "getCreationSchema", "query", input),
10169
10203
  createDevice: (input) => dispatch("deviceManager", "createDevice", "mutation", input),
10170
10204
  testCreationField: (input) => dispatch("deviceManager", "testCreationField", "mutation", input),
10205
+ adoptionListCandidateFilters: (input) => dispatch("deviceManager", "adoptionListCandidateFilters", "query", input),
10171
10206
  adoptionListCandidates: (input) => dispatch("deviceManager", "adoptionListCandidates", "query", input),
10172
10207
  adoptionRefresh: (input) => dispatch("deviceManager", "adoptionRefresh", "mutation", input),
10173
10208
  adoptionAdopt: (input) => dispatch("deviceManager", "adoptionAdopt", "mutation", input),
10174
10209
  adoptionRelease: (input) => dispatch("deviceManager", "adoptionRelease", "mutation", input),
10175
- adoptionResync: (input) => dispatch("deviceManager", "adoptionResync", "mutation", input)
10210
+ adoptionResync: (input) => dispatch("deviceManager", "adoptionResync", "mutation", input),
10211
+ discoveryProviders: (input) => dispatch("deviceManager", "discoveryProviders", "query", input),
10212
+ discoverAllProviders: (input) => dispatch("deviceManager", "discoverAllProviders", "mutation", input),
10213
+ discoverProvider: (input) => dispatch("deviceManager", "discoverProvider", "mutation", input),
10214
+ providerCreationType: (input) => dispatch("deviceManager", "providerCreationType", "query", input),
10215
+ providerDiscoveryParamsSchema: (input) => dispatch("deviceManager", "providerDiscoveryParamsSchema", "query", input)
10176
10216
  },
10177
10217
  deviceProvider: {
10178
10218
  start: (input) => dispatch("deviceProvider", "start", "mutation", input),
@@ -10181,6 +10221,8 @@ function createSystemProxy(api) {
10181
10221
  getDevices: (input) => dispatch("deviceProvider", "getDevices", "query", input),
10182
10222
  supportsDiscovery: (input) => dispatch("deviceProvider", "supportsDiscovery", "query", input),
10183
10223
  discoverDevices: (input) => dispatch("deviceProvider", "discoverDevices", "mutation", input),
10224
+ getDiscoveryParamsSchema: (input) => dispatch("deviceProvider", "getDiscoveryParamsSchema", "query", input),
10225
+ getManualCreationType: (input) => dispatch("deviceProvider", "getManualCreationType", "query", input),
10184
10226
  adoptDiscoveredDevice: (input) => dispatch("deviceProvider", "adoptDiscoveredDevice", "mutation", input),
10185
10227
  supportsManualCreation: (input) => dispatch("deviceProvider", "supportsManualCreation", "query", input),
10186
10228
  getChildCreationSchema: (input) => dispatch("deviceProvider", "getChildCreationSchema", "query", input),
@@ -13650,6 +13692,12 @@ var deviceManagerCapability = {
13650
13692
  kind: "mutation",
13651
13693
  auth: "admin"
13652
13694
  }),
13695
+ /** List candidate filter chips for an integration via its device-adoption
13696
+ * provider — addonId-routed so it never hits the singleton shadow. */
13697
+ adoptionListCandidateFilters: method(z.object({
13698
+ addonId: z.string(),
13699
+ integrationId: z.string()
13700
+ }), z.object({ filters: z.array(AdoptionFilterSchema) }), { auth: "admin" }),
13653
13701
  /** List adoption candidates for an integration via its device-adoption provider. */
13654
13702
  adoptionListCandidates: method(ListCandidatesInputSchema.extend({ addonId: z.string() }), ListCandidatesOutputSchema, { auth: "admin" }),
13655
13703
  /** Trigger a discovery refresh on the integration's device-adoption provider. */
@@ -13680,6 +13728,36 @@ var deviceManagerCapability = {
13680
13728
  kind: "mutation",
13681
13729
  auth: "admin"
13682
13730
  }),
13731
+ /** Addons whose device-provider reports `supportsDiscovery` (for the modal). */
13732
+ discoveryProviders: method(z.object({}), z.object({ providers: z.array(z.object({
13733
+ addonId: z.string(),
13734
+ label: z.string()
13735
+ })).readonly() }), { auth: "admin" }),
13736
+ /** Scan EVERY discovery-capable provider; returns candidates grouped by addon. */
13737
+ discoverAllProviders: method(z.object({}), z.object({ groups: z.array(z.object({
13738
+ addonId: z.string(),
13739
+ label: z.string(),
13740
+ candidates: z.array(DiscoveryCandidateSchema).readonly(),
13741
+ error: z.string().nullable()
13742
+ })).readonly() }), {
13743
+ kind: "mutation",
13744
+ auth: "admin"
13745
+ }),
13746
+ /** Scan ONE provider with optional provider-specific params (subnet /
13747
+ * broadcast addr) — the per-integration "Scan network" surface. */
13748
+ discoverProvider: method(z.object({
13749
+ addonId: z.string(),
13750
+ params: z.record(z.string(), z.unknown()).optional()
13751
+ }), z.object({ candidates: z.array(DiscoveryCandidateSchema).readonly() }), {
13752
+ kind: "mutation",
13753
+ auth: "admin"
13754
+ }),
13755
+ /** The device type a provider creates via manual add (Camera/Container/Hub),
13756
+ * so the Add-Device dialog uses the right type instead of assuming Camera. */
13757
+ providerCreationType: method(z.object({ addonId: z.string() }), z.object({ deviceType: z.enum(DeviceType).nullable() }), { auth: "admin" }),
13758
+ /** A provider's extra per-scan param form (ConfigUISchema) for the
13759
+ * per-integration scan, or null when it takes none. */
13760
+ providerDiscoveryParamsSchema: method(z.object({ addonId: z.string() }), z.unknown(), { auth: "admin" }),
13683
13761
  /**
13684
13762
  * Test a field value on an existing device (e.g. probe an RTSP URL).
13685
13763
  * Routes through the device-provider for the owning addon.
@@ -17659,6 +17737,17 @@ var AvailableIntegrationTypeSchema = z.object({
17659
17737
  iconUrl: z.string().nullable(),
17660
17738
  color: z.string(),
17661
17739
  instanceMode: z.string(),
17740
+ /**
17741
+ * Integration wizard `mode` (LOCKED MODEL): `standalone` (create
17742
+ * immediately then add devices, no config step/button), `account` (config
17743
+ * step), or `broker` (broker step). Derived server-side by
17744
+ * `getAvailableTypes` when the addon manifest omits an explicit `mode`.
17745
+ */
17746
+ mode: z.enum([
17747
+ "standalone",
17748
+ "account",
17749
+ "broker"
17750
+ ]),
17662
17751
  discoveryMode: z.string(),
17663
17752
  /**
17664
17753
  * Which integration-marker cap the addon declared, so the wizard can
@@ -21853,6 +21942,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
21853
21942
  addonId: null,
21854
21943
  access: "create"
21855
21944
  },
21945
+ "deviceManager.adoptionListCandidateFilters": {
21946
+ capName: "device-manager",
21947
+ capScope: "system",
21948
+ addonId: null,
21949
+ access: "view"
21950
+ },
21856
21951
  "deviceManager.adoptionListCandidates": {
21857
21952
  capName: "device-manager",
21858
21953
  capScope: "system",
@@ -21901,12 +21996,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
21901
21996
  addonId: null,
21902
21997
  access: "create"
21903
21998
  },
21999
+ "deviceManager.discoverAllProviders": {
22000
+ capName: "device-manager",
22001
+ capScope: "system",
22002
+ addonId: null,
22003
+ access: "create"
22004
+ },
21904
22005
  "deviceManager.discoverDevices": {
21905
22006
  capName: "device-manager",
21906
22007
  capScope: "system",
21907
22008
  addonId: null,
21908
22009
  access: "create"
21909
22010
  },
22011
+ "deviceManager.discoverProvider": {
22012
+ capName: "device-manager",
22013
+ capScope: "system",
22014
+ addonId: null,
22015
+ access: "create"
22016
+ },
22017
+ "deviceManager.discoveryProviders": {
22018
+ capName: "device-manager",
22019
+ capScope: "system",
22020
+ addonId: null,
22021
+ access: "view"
22022
+ },
21910
22023
  "deviceManager.enable": {
21911
22024
  capName: "device-manager",
21912
22025
  capScope: "system",
@@ -22057,6 +22170,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
22057
22170
  addonId: null,
22058
22171
  access: "create"
22059
22172
  },
22173
+ "deviceManager.providerCreationType": {
22174
+ capName: "device-manager",
22175
+ capScope: "system",
22176
+ addonId: null,
22177
+ access: "view"
22178
+ },
22179
+ "deviceManager.providerDiscoveryParamsSchema": {
22180
+ capName: "device-manager",
22181
+ capScope: "system",
22182
+ addonId: null,
22183
+ access: "view"
22184
+ },
22060
22185
  "deviceManager.registerDevice": {
22061
22186
  capName: "device-manager",
22062
22187
  capScope: "system",
@@ -22273,6 +22398,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
22273
22398
  addonId: null,
22274
22399
  access: "view"
22275
22400
  },
22401
+ "deviceProvider.getDiscoveryParamsSchema": {
22402
+ capName: "device-provider",
22403
+ capScope: "system",
22404
+ addonId: null,
22405
+ access: "view"
22406
+ },
22407
+ "deviceProvider.getManualCreationType": {
22408
+ capName: "device-provider",
22409
+ capScope: "system",
22410
+ addonId: null,
22411
+ access: "view"
22412
+ },
22276
22413
  "deviceProvider.getStatus": {
22277
22414
  capName: "device-provider",
22278
22415
  capScope: "system",
@@ -809,6 +809,22 @@ export interface AddonDeclaration {
809
809
  readonly slot?: PipelineSlot | null;
810
810
  /** Instance mode: 'unique' or 'multiple'. Default: 'multiple' */
811
811
  readonly instanceMode?: 'unique' | 'multiple';
812
+ /**
813
+ * Integration `mode` — how the Add-Integration wizard behaves for this
814
+ * addon (LOCKED MODEL, supersedes `instanceMode` for wizard routing):
815
+ * - `'standalone'` — NO integration-level config; picking creates the
816
+ * integration immediately (empty settings) and goes straight to
817
+ * adding/discovering the first device. No config step, no config
818
+ * button on the detail page. (Reolink/ONVIF/Ecowitt/Gree.)
819
+ * - `'account'` — account/connection config; wizard shows the config
820
+ * step, then `integrations.create` with those settings.
821
+ * (Dreo/Wyze/Dreame.)
822
+ * - `'broker'` — the shared-bus/session broker step. (HomeAssistant/MQTT.)
823
+ * Optional/transitional: when absent, `getAvailableTypes` DERIVES the mode
824
+ * (broker cap + brokerKind → broker; device-adoption → account; else →
825
+ * standalone). `instanceMode` is kept for now.
826
+ */
827
+ readonly mode?: 'standalone' | 'account' | 'broker';
812
828
  /**
813
829
  * For `device-adoption` integration addons (Approach A): the broker
814
830
  * kind the integration wizard must create or link (e.g.
@@ -97,6 +97,13 @@ export interface IntegrationTypeInfo {
97
97
  readonly iconUrl: string | null;
98
98
  readonly color: string;
99
99
  readonly instanceMode: 'unique' | 'multiple';
100
+ /**
101
+ * Integration wizard `mode` — how the Add-Integration flow behaves:
102
+ * `'standalone'` (create immediately → add devices, no config),
103
+ * `'account'` (config step), or `'broker'` (broker step). Derived by
104
+ * `getAvailableTypes` when the manifest omits an explicit `mode`.
105
+ */
106
+ readonly mode: 'standalone' | 'account' | 'broker';
100
107
  readonly discoveryMode: string;
101
108
  readonly existingInstances: ReadonlyArray<{
102
109
  readonly id: string;
@@ -1,20 +1,20 @@
1
- import type { ISettingsBackend, IEmbeddingsBackend } from './storage.js';
2
- import type { ILogDestination } from './logging.js';
3
- import type { IAddonPageProvider } from './addon.js';
4
1
  import type { IAuthProvider } from '../capabilities/auth-provider.cap.js';
5
- import type { IAddonRouteProvider } from './addon-routes.js';
6
- import type { IRestreamer } from './restreamer.js';
7
- import type { IWebRtcProvider } from './webrtc-provider.js';
8
- import type { streamBrokerCapability } from '../capabilities/stream-broker.cap.js';
9
2
  import type { InferProvider } from '../capabilities/capability-definition.js';
10
3
  import type { ISnapshotOrchestrator } from '../capabilities/snapshot.cap.js';
11
- import type { IStreamingEngine } from './streaming.js';
4
+ import type { streamBrokerCapability } from '../capabilities/stream-broker.cap.js';
5
+ import type { CollectionCapabilityName, SingletonCapabilityName } from '../generated/capability-router-map.js';
6
+ import type { StepDefinition } from '../types/pipeline-step.js';
7
+ import type { IAddonPageProvider } from './addon.js';
8
+ import type { IAddonRouteProvider } from './addon-routes.js';
9
+ import type { IDecoderProvider } from './decoder.js';
10
+ import type { ILogDestination } from './logging.js';
12
11
  import type { IPipelineExecutorProvider } from './pipeline-executor-capability.js';
13
12
  import type { IPipelineOrchestratorProvider } from './pipeline-orchestrator-capability.js';
14
13
  import type { IPipelineRunnerProvider } from './pipeline-runner-capability.js';
15
- import type { IDecoderProvider } from './decoder.js';
16
- import type { StepDefinition } from '../types/pipeline-step.js';
17
- import type { SingletonCapabilityName, CollectionCapabilityName } from '../generated/capability-router-map.js';
14
+ import type { IRestreamer } from './restreamer.js';
15
+ import type { IEmbeddingsBackend, ISettingsBackend } from './storage.js';
16
+ import type { IStreamingEngine } from './streaming.js';
17
+ import type { IWebRtcProvider } from './webrtc-provider.js';
18
18
  /**
19
19
  * Pipeline step capability — each step is a separate capability
20
20
  * named `pipeline-step:{stepId}` (e.g., `pipeline-step:object-detection`).
@@ -20,8 +20,8 @@ export declare const taskPhaseSchema: z.ZodEnum<{
20
20
  }>;
21
21
  export type TaskPhase = z.infer<typeof taskPhaseSchema>;
22
22
  export declare const taskTargetSchema: z.ZodEnum<{
23
- addon: "addon";
24
23
  framework: "framework";
24
+ addon: "addon";
25
25
  }>;
26
26
  export type TaskTarget = z.infer<typeof taskTargetSchema>;
27
27
  export declare const taskLogEntrySchema: z.ZodObject<{
@@ -50,8 +50,8 @@ export declare const lifecycleTaskSchema: z.ZodObject<{
50
50
  fromVersion: z.ZodNullable<z.ZodString>;
51
51
  toVersion: z.ZodString;
52
52
  target: z.ZodEnum<{
53
- addon: "addon";
54
53
  framework: "framework";
54
+ addon: "addon";
55
55
  }>;
56
56
  phase: z.ZodEnum<{
57
57
  failed: "failed";
@@ -126,8 +126,8 @@ export declare const lifecycleJobSchema: z.ZodObject<{
126
126
  fromVersion: z.ZodNullable<z.ZodString>;
127
127
  toVersion: z.ZodString;
128
128
  target: z.ZodEnum<{
129
- addon: "addon";
130
129
  framework: "framework";
130
+ addon: "addon";
131
131
  }>;
132
132
  phase: z.ZodEnum<{
133
133
  failed: "failed";
@@ -2162,6 +2162,12 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
2162
2162
  DeviceType["Switch"] = "switch";
2163
2163
  DeviceType["Sensor"] = "sensor";
2164
2164
  DeviceType["Thermostat"] = "thermostat";
2165
+ /** Air-conditioner / heat-pump climate device (HVAC) — shares the
2166
+ * `climate-control` cap surface with `Thermostat` but renders a
2167
+ * dedicated AC-appropriate control UI (mode chips, fan speed,
2168
+ * independent vertical/horizontal swing). Sources: native Gree, and
2169
+ * reusable by other AC integrations. */
2170
+ DeviceType["Climate"] = "climate";
2165
2171
  DeviceType["Button"] = "button";
2166
2172
  /** Generic stateless event emitter — carries a device's EXACT declared
2167
2173
  * event vocabulary verbatim (no normalization). Installed with the
@@ -2162,6 +2162,12 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
2162
2162
  DeviceType["Switch"] = "switch";
2163
2163
  DeviceType["Sensor"] = "sensor";
2164
2164
  DeviceType["Thermostat"] = "thermostat";
2165
+ /** Air-conditioner / heat-pump climate device (HVAC) — shares the
2166
+ * `climate-control` cap surface with `Thermostat` but renders a
2167
+ * dedicated AC-appropriate control UI (mode chips, fan speed,
2168
+ * independent vertical/horizontal swing). Sources: native Gree, and
2169
+ * reusable by other AC integrations. */
2170
+ DeviceType["Climate"] = "climate";
2165
2171
  DeviceType["Button"] = "button";
2166
2172
  /** Generic stateless event emitter — carries a device's EXACT declared
2167
2173
  * event vocabulary verbatim (no normalization). Installed with the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",