@camstack/addon-provider-homeassistant 1.2.655 → 1.2.657

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.
@@ -5980,7 +5980,7 @@ var ZodIssueCode = {
5980
5980
  var ZodFirstPartyTypeKind;
5981
5981
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5982
5982
  //#endregion
5983
- //#region ../types/dist/sleep-BkzQdpzF.mjs
5983
+ //#region ../types/dist/sleep-Cv4Zmie9.mjs
5984
5984
  /**
5985
5985
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5986
5986
  * window to float samples (D455).
@@ -6590,7 +6590,7 @@ var NOT_RUN = {
6590
6590
  * throws: an unreachable or refusing engine is logged and reported `declared: false`,
6591
6591
  * because the hub (and this addon's boot) must not hang on a migration.
6592
6592
  */
6593
- async function runAddonMigrations(host, migrations, logger) {
6593
+ async function runAddonMigrations(host, migrations, logger, options = {}) {
6594
6594
  const first = migrations[0];
6595
6595
  if (first === void 0) return NOT_RUN;
6596
6596
  const owner = first.meta.owner;
@@ -6619,7 +6619,9 @@ async function runAddonMigrations(host, migrations, logger) {
6619
6619
  else if (status === "blocked") blocked.push(id);
6620
6620
  else skipped.push(id);
6621
6621
  };
6622
+ const selected = options.only === void 0 ? null : new Set(options.only);
6622
6623
  for (const step of declaration.steps) {
6624
+ if (selected !== null && !selected.has(step.id)) continue;
6623
6625
  const bound = byId.get(step.id);
6624
6626
  if (bound === void 0 || step.action === "skip") {
6625
6627
  skipped.push(step.id);
@@ -7779,14 +7781,18 @@ var BaseAddon = class {
7779
7781
  * nothing; the boot continues. A migration that FAILED (or was blocked by one)
7780
7782
  * and declares `onFailure: 'block-owner'` makes this throw, so the addon does not
7781
7783
  * serve data whose shape it cannot trust; `tolerate` migrations never do.
7784
+ *
7785
+ * ALWAYS pass the whole catalogue; a phase that must run only some of it passes
7786
+ * `{ only: [ids] }` — never a filtered catalogue (the engine would judge the
7787
+ * omitted applied ids "newer").
7782
7788
  */
7783
- async runMigrations(migrations) {
7789
+ async runMigrations(migrations, options) {
7784
7790
  const api = this.ctx.api.migrations;
7785
7791
  const report = await runAddonMigrations({
7786
7792
  declareOwner: (input) => api.declareOwner.mutate(input),
7787
7793
  startMigration: (input) => api.startMigration.mutate(input),
7788
7794
  finishMigration: (input) => api.finishMigration.mutate(input)
7789
- }, migrations, this.ctx.logger);
7795
+ }, migrations, this.ctx.logger, options);
7790
7796
  if (report.blockOwner.length > 0) throw new AddonMigrationsBlockedError(report.blockOwner);
7791
7797
  return report;
7792
7798
  }
@@ -8782,6 +8788,13 @@ var RecordsError = class extends Error {
8782
8788
  this.detail = detail;
8783
8789
  }
8784
8790
  };
8791
+ /** A write guarded by `ifRev` found another revision (or an existing row for `ifRev: 0`). */
8792
+ var RevConflictError = class extends RecordsError {
8793
+ constructor(detail) {
8794
+ super("rev-conflict", detail);
8795
+ this.name = "RevConflictError";
8796
+ }
8797
+ };
8785
8798
  /** The keychain could not store or serve a value: explicit, never an empty string. */
8786
8799
  var RecordSecretUnavailableError = class extends RecordsError {
8787
8800
  constructor(detail) {
@@ -8826,6 +8839,10 @@ var RECORD_SECRET_COLLECTION_PREFIX = "records:";
8826
8839
  * (`collectZodSecretPaths`): dotted keys, `[]` for "each element of this array"
8827
8840
  * (`auth.accessToken`, `headers[].value`).
8828
8841
  *
8842
+ * `{}` after a key means "each value of this map" (`applianceSecrets{}`): the map's own key
8843
+ * names the value (`applianceSecrets{fridge}`), so no id key is declared and a body that drops a
8844
+ * key releases exactly that key's secret.
8845
+ *
8829
8846
  * Array elements are matched by a DECLARED id key (`secretArrayKeys`:
8830
8847
  * `{ headers: 'name' }`), never by index, so reordering a list keeps every
8831
8848
  * keychain ref (the same rule as `arrayItemFieldPath`). The concrete path of a
@@ -8838,11 +8855,13 @@ function parseSecretPath(path) {
8838
8855
  if (path.length === 0) throw new InvalidRecordError("an empty secret path");
8839
8856
  return path.split(".").map((raw) => {
8840
8857
  const each = raw.endsWith("[]");
8841
- const key = each ? raw.slice(0, -2) : raw;
8858
+ const map = raw.endsWith("{}");
8859
+ const key = each || map ? raw.slice(0, -2) : raw;
8842
8860
  if (key.length === 0) throw new InvalidRecordError(`secret path "${path}" has an empty segment`);
8843
8861
  return {
8844
8862
  key,
8845
- each
8863
+ each,
8864
+ map
8846
8865
  };
8847
8866
  });
8848
8867
  }
@@ -8894,6 +8913,22 @@ function mapAt(node, segments, index, walkedKeys, concretePrefix, declared, arra
8894
8913
  [segment.key]: mapped
8895
8914
  };
8896
8915
  }
8916
+ if (segment.map) {
8917
+ if (!isRecord$4(child)) return node;
8918
+ const kept = Object.entries(child).map(([mapKey, value]) => {
8919
+ const concrete = `${concretePrefix}${concretePrefix.length > 0 ? "." : ""}${segment.key}{${encodeURIComponent(mapKey)}}`;
8920
+ if (!last) return [mapKey, mapAt(value, segments, index + 1, keys, concrete, declared, arrayKeys, visit)];
8921
+ return [mapKey, visit({
8922
+ declared,
8923
+ concrete,
8924
+ value
8925
+ })];
8926
+ }).filter(([, value]) => value !== REMOVE_LEAF);
8927
+ return {
8928
+ ...node,
8929
+ [segment.key]: Object.fromEntries(kept)
8930
+ };
8931
+ }
8897
8932
  const concrete = `${concretePrefix}${concretePrefix.length > 0 ? "." : ""}${segment.key}`;
8898
8933
  if (last) {
8899
8934
  const replacement = visit({
@@ -9035,7 +9070,8 @@ function isZodSecret(schema) {
9035
9070
  }
9036
9071
  /**
9037
9072
  * Every declared secret path in a config schema: dotted keys, `[]` for "each
9038
- * element of this array" (`connection.password`, `rows[].token`). A declared
9073
+ * element of this array" (`connection.password`, `rows[].token`), `{}` for "each value of this
9074
+ * map" (`applianceSecrets{}`). A declared
9039
9075
  * object or array is reported as one path and not descended into — everything
9040
9076
  * under it is secret.
9041
9077
  */
@@ -9046,6 +9082,7 @@ function collectZodSecretPaths(schema, prefix = "") {
9046
9082
  const def = defOf(layer);
9047
9083
  if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
9048
9084
  else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
9085
+ else if (def.type === "record" && def.valueType) paths.push(...collectZodSecretPaths(def.valueType, `${prefix}{}`));
9049
9086
  else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
9050
9087
  else if (def.type === "intersection") {
9051
9088
  if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
@@ -13422,11 +13459,49 @@ function buildCapturingReply(envelope) {
13422
13459
  };
13423
13460
  return wrapper;
13424
13461
  }
13462
+ /**
13463
+ * `RecordIntegrationInstances` - the `integration-instances` provider over ONE
13464
+ * entry kind, so an addon that holds a connection serves it in ~30 lines.
13465
+ *
13466
+ * Every instance is one record of the addon's own kind, keyed by the
13467
+ * `integrations` registry id. The records door does the secret work: a field the
13468
+ * kind marks `.meta({ secret: true })` is a keychain marker bound to the row, so
13469
+ * deleting the row deletes the secret, and one row's value is never another's.
13470
+ *
13471
+ * Patch rules for a secret (`updateInstance`): omitted, `''`, the redaction
13472
+ * token or the view the form was given KEEP the stored secret;
13473
+ * `{ $secretClear: true }` clears it; any other string replaces it.
13474
+ */
13425
13475
  /** The most instances one addon lists (an integrations page, not a table). */
13426
13476
  var INSTANCES_LIST_MAX = 1e3;
13427
13477
  /** The keys of the kind's secret fields that sit at the top level of the body. */
13428
13478
  function topLevelSecretKeys(paths) {
13429
- return new Set(paths.filter((p) => !p.includes(".") && !p.includes("[")));
13479
+ return new Set(paths.filter((p) => !p.includes(".") && !p.includes("[") && !p.includes("{")));
13480
+ }
13481
+ /** The keys of the kind's top-level MAPS whose values are secrets (`applianceSecrets{}`). */
13482
+ function secretMapKeys(paths) {
13483
+ return new Set(paths.filter((p) => p.endsWith("{}") && !p.slice(0, -2).match(/[.[{]/)).map((p) => p.slice(0, -2)));
13484
+ }
13485
+ /**
13486
+ * A patch value for a map of secrets: an entry that is omitted, `''`, the redaction token or the
13487
+ * view the form was given KEEPS its stored secret (it is left out of the merge); `{ $secretClear }`
13488
+ * or `null` removes the entry; any other string replaces it. Null when nothing is left to merge.
13489
+ */
13490
+ function secretMapPatch(value) {
13491
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
13492
+ const out = {};
13493
+ for (const [key, entry] of Object.entries(value)) if (entry === null || isSecretClear(entry)) out[key] = null;
13494
+ else if (typeof entry === "string" && entry !== "" && entry !== "__camstack_redacted__" && !isSecretFieldView(entry)) out[key] = entry;
13495
+ return Object.keys(out).length > 0 ? out : null;
13496
+ }
13497
+ /** Does the kind's body schema carry an `enabled` field? */
13498
+ function declaresEnabled(kind) {
13499
+ const json = toJSONSchema(kind.schema, {
13500
+ unrepresentable: "any",
13501
+ io: "input"
13502
+ });
13503
+ const properties = Reflect.get(json, "properties");
13504
+ return typeof properties === "object" && properties !== null && "enabled" in properties;
13430
13505
  }
13431
13506
  var RecordIntegrationInstances = class {
13432
13507
  records;
@@ -13434,14 +13509,20 @@ var RecordIntegrationInstances = class {
13434
13509
  hooks;
13435
13510
  handle;
13436
13511
  secretKeys;
13512
+ secretMaps;
13437
13513
  nameField;
13514
+ /** The `integrations` registry owns the on/off switch (`role: devices`); the body has none. */
13515
+ registryOwnsEnabled;
13438
13516
  constructor(records, kind, hooks) {
13439
13517
  this.records = records;
13440
13518
  this.kind = kind;
13441
13519
  this.hooks = hooks;
13442
13520
  this.handle = records.kind(kind);
13443
13521
  this.secretKeys = topLevelSecretKeys(kind.declaration.secretPaths);
13522
+ this.secretMaps = secretMapKeys(kind.declaration.secretPaths);
13444
13523
  this.nameField = kind.declaration.entry?.nameField ?? "name";
13524
+ this.registryOwnsEnabled = hooks.description.role === "devices";
13525
+ if (this.registryOwnsEnabled && declaresEnabled(kind)) throw new Error(`kind "${kind.name}": the integrations registry owns the on/off switch of a role "devices" addon, so the body must not declare "enabled"`);
13445
13526
  }
13446
13527
  /**
13447
13528
  * One instance read for the addon's own runtime; null when absent. When the keychain is
@@ -13492,7 +13573,7 @@ var RecordIntegrationInstances = class {
13492
13573
  id: record.id,
13493
13574
  name: typeof rawName === "string" ? rawName : record.id,
13494
13575
  configured: this.hooks.configured(record.data),
13495
- enabled: record.data.enabled !== false,
13576
+ ...this.registryOwnsEnabled ? {} : { enabled: record.data.enabled !== false },
13496
13577
  formValues: shown,
13497
13578
  ...kind !== void 0 ? { kind } : {},
13498
13579
  ...health?.status !== void 0 ? { status: health.status } : {},
@@ -13522,32 +13603,36 @@ var RecordIntegrationInstances = class {
13522
13603
  id: minted,
13523
13604
  data: this.hooks.initialBody(name, kind)
13524
13605
  }, { ifRev: 0 });
13525
- await this.hooks.onChanged?.(minted);
13606
+ await this.hooks.onChanged?.(minted, "created");
13526
13607
  return { id: minted };
13527
13608
  };
13528
13609
  updateInstance = async ({ id, name, values }) => {
13529
13610
  const patch = {};
13530
13611
  for (const [key, value] of Object.entries(values)) {
13531
13612
  if (value === void 0) continue;
13532
- if (!this.secretKeys.has(key)) patch[key] = value;
13613
+ if (this.secretMaps.has(key)) {
13614
+ const entries = secretMapPatch(value);
13615
+ if (entries !== null) patch[key] = entries;
13616
+ } else if (!this.secretKeys.has(key)) patch[key] = value;
13533
13617
  else if (isSecretClear(value)) patch[key] = null;
13534
13618
  else if (typeof value === "string" && value !== "" && value !== "__camstack_redacted__" && !isSecretFieldView(value)) patch[key] = value;
13535
13619
  }
13536
13620
  if (name !== void 0) patch[this.nameField] = name;
13537
13621
  await this.handle.patch(id, patch);
13538
- await this.hooks.onChanged?.(id);
13622
+ await this.hooks.onChanged?.(id, "updated");
13539
13623
  return { ok: true };
13540
13624
  };
13541
13625
  /** The switch lives in the record body; the addon is told so it applies it (D996). */
13542
13626
  setInstanceEnabled = async ({ id, enabled }) => {
13627
+ if (this.registryOwnsEnabled) throw new Error(`instance "${id}": the integrations registry owns the on/off switch of this addon; set it with integrations.update`);
13543
13628
  await this.handle.patch(id, { enabled });
13544
- await this.hooks.onChanged?.(id);
13629
+ await this.hooks.onChanged?.(id, "enabled");
13545
13630
  return { ok: true };
13546
13631
  };
13547
13632
  /** The row and its keychain refs go together (the records door). */
13548
13633
  deleteInstance = async ({ id }) => {
13549
13634
  await this.handle.delete(id);
13550
- await this.hooks.onChanged?.(id);
13635
+ await this.hooks.onChanged?.(id, "deleted");
13551
13636
  return { ok: true };
13552
13637
  };
13553
13638
  testInstance = async (input) => {
@@ -14645,7 +14730,13 @@ var MigrationLedgerEntrySchema = object({
14645
14730
  * joined by the engine from the catalogues it knows this boot. Absent when no
14646
14731
  * catalogue lists the id (a newer database).
14647
14732
  */
14648
- meta: MigrationMetaSchema.optional()
14733
+ meta: MigrationMetaSchema.optional(),
14734
+ /**
14735
+ * Set when this is an applied row of an addon owner whose catalogue the answering
14736
+ * process has not loaded (the owner has not declared yet): the row is applied, the
14737
+ * process just cannot judge it. Never `skipped-newer` — that needs the owner loaded.
14738
+ */
14739
+ ownerNotLoaded: boolean().optional()
14649
14740
  });
14650
14741
  /** A catalogued migration that is not applied, with where it stands. */
14651
14742
  var MigrationPendingEntrySchema = object({
@@ -56774,6 +56865,21 @@ var IntegrationInstanceKindSchema = object({
56774
56865
  disconnectPath: string().min(1).optional()
56775
56866
  });
56776
56867
  var IntegrationInstanceDescriptionSchema = object({
56868
+ /** What the instances are for the Integrations page; see {@link IntegrationInstanceRoleSchema}. */
56869
+ role: _enum([
56870
+ "devices",
56871
+ "services",
56872
+ "both"
56873
+ ]),
56874
+ /** How the devices of an instance are found; absent means `{ mode: 'none' }`. */
56875
+ discovery: object({
56876
+ mode: _enum([
56877
+ "none",
56878
+ "lan",
56879
+ "account"
56880
+ ]),
56881
+ scopedToInstance: boolean()
56882
+ }).optional(),
56777
56883
  /** `single`: at most one instance can exist (Loki). `multiple`: an account each. */
56778
56884
  instanceMode: IntegrationInstanceModeSchema,
56779
56885
  /** What the instance is, for the UI (`destination`, `relay`, `account`). */
@@ -56813,10 +56919,11 @@ var IntegrationInstanceSchema = object({
56813
56919
  /** The addon's own rule (an URL is present, a client id is present...). */
56814
56920
  configured: boolean(),
56815
56921
  /**
56816
- * The instance's own on/off switch (D996): always present, derived from the record body
56817
- * (`enabled !== false`, so a row written before the field existed is on).
56922
+ * The instance's own on/off switch (D996), derived from the record body (`enabled !== false`,
56923
+ * so a row written before the field existed is on). Absent when the `integrations` registry
56924
+ * owns the switch (`describe().role` is `devices`): read it from the registry row.
56818
56925
  */
56819
- enabled: boolean(),
56926
+ enabled: boolean().optional(),
56820
56927
  /** The kind of this instance (one of `describe().kinds[].id`), when the provider has kinds. */
56821
56928
  kind: string().optional(),
56822
56929
  /** Values for the instance form; a secret is a `SecretFieldView`, never text. */
@@ -98299,20 +98406,5 @@ function haInstanceSettingsPortsOver(api) {
98299
98406
  }
98300
98407
  };
98301
98408
  }
98302
- /** The brokerId → settings view of the instances: what a reader keeps per broker. */
98303
- function settingsByBroker(rows) {
98304
- const out = /* @__PURE__ */ new Map();
98305
- for (const row of rows) if (row.brokerId !== null) out.set(row.brokerId, row.settings);
98306
- return out;
98307
- }
98308
- /** Read the instances, or report why not and answer nothing (a reader falls back to the legacy key). */
98309
- async function listInstancesOrNothing(ports, onError) {
98310
- try {
98311
- return await ports.listInstances();
98312
- } catch (err) {
98313
- onError(errMsg(err));
98314
- return [];
98315
- }
98316
- }
98317
98409
  //#endregion
98318
- export { enumSensorCapability as $, baseUnitOf as $t, automationControlCapability as A, runExportedAction as At, calendarSourceCapability as B, tamperCapability as Bt, RecordIntegrationInstances as C, EventCategory as Cn, prepareNotification as Ct, airQualitySensorCapability as D, publicEndpointReaderFrom as Dt, addonRoutesCapability as E, pruneDeletedEntities as Et, brightnessCapability as F, scriptRunnerCapability as Ft, consumableFormOf as G, vacuumControlCapability as Gt, climateControlCapability as H, tryConvertDelta as Ht, brokerCapability as I, sendToExportedTarget as It, controlCapability as J, waterHeaterCapability as Jt, consumableKindOf as K, valveCapability as Kt, buildAddonRouteProvider as L, smokeCapability as Lt, bestLocationMatch as M, runningFromMediaPlayer as Mt, binaryCapability as N, runningFromVacuumState as Nt, alarmPanelCapability as O, quantityFromUnit as Ot, boardKeySourceCapability as P, runningStateCapability as Pt, deviceExportCapability as Q, RecordSecretUnavailableError as Qt, buildDeviceAdminUrl as R, statusInstanceOf as Rt, RUNNING_STATE_COLD as S, errMsg as Sn, preconditionOf as St, accessoriesCapability as T, pressureSensorCapability as Tt, colorCapability as U, tryConvertUnit as Ut, carbonMonoxideCapability as V, temperatureSensorCapability as Vt, connectivityCapability as W, updateCapability as Wt, deviceAdminLinkCapability as X, BaseAddon as Xt, coverCapability as Y, weatherCapability as Yt, deviceAdoptionCapability as Z, REDACTED_SECRET as Zt, ExportInstanceUnknownError as _, unknown as _n, notifierCapability as _t, HA_PROVIDER_ADDON_ID$1 as a, isReadingQuantity as an, gasCapability as at, MediaPlayerRepeatSchema as b, DeviceRole as bn, parseAdminBase as bt, BaseDevice as c, array as cn, imageCapability as ct, COCO_TO_MACRO as d, literal as dn, lawnMowerControlCapability as dt, createEvent as en, eventEmitterCapability as et, CameraSwitchIdSchema as f, number as fn, lockControlCapability as ft, EnumSensorDateTimeFormatSchema as g, union as gn, notificationOutputCapability as gt, ConsumableStatusSchema as h, string as hn, normalizeUnit as ht, HA_BROKER_KIND as i, entryBody as in, floodCapability as it, batteryCapability as j, runningFromLawnMower as jt, ambientLightSensorCapability as k, resolveAttachmentUrls as kt, BaseDeviceProvider as l, boolean as ln, ingestReading as lt, ConsumableItemSchema as m, record as mn, motionCapability as mt, listInstancesOrNothing as n, defineEntryKind as nn, flattenNestedRecords as nt, listHomeAssistantBrokers as o, nodePin as on, humidifierCapability as ot, ConsumableFormSchema as p, object as pn, mediaPlayerCapability as pt, contactCapability as q, vibrationCapability as qt, settingsByBroker as r, defineRecordKinds as rn, flattenPortsOver as rt, AlarmArmModeSchema as s, _enum as sn, humiditySensorCapability as st, haInstanceSettingsPortsOver as t, defineAddonMigrations as tn, fanControlCapability as tt, CAMERA_SWITCH_ORDER as u, discriminatedUnion as un, integrationInstancesCapability as ut, FanDirectionSchema as v, url as vn, numericSensorCapability as vt, TargetSchema as w, presenceCapability as wt, PLUG_APPLIANCE_TYPES as x, DeviceType as xn, powerMeterCapability as xt, HvacModeSchema as y, DeviceFeature as yn, oauthIntegrationCapability as yt, buttonCapability as z, switchCapability as zt };
98410
+ export { fanControlCapability as $, createEvent as $t, bestLocationMatch as A, runningFromMediaPlayer as At, climateControlCapability as B, tryConvertDelta as Bt, accessoriesCapability as C, pressureSensorCapability as Ct, ambientLightSensorCapability as D, resolveAttachmentUrls as Dt, alarmPanelCapability as E, quantityFromUnit as Et, buildAddonRouteProvider as F, smokeCapability as Ft, contactCapability as G, vibrationCapability as Gt, connectivityCapability as H, updateCapability as Ht, buildDeviceAdminUrl as I, statusInstanceOf as It, deviceAdminLinkCapability as J, BaseAddon as Jt, controlCapability as K, waterHeaterCapability as Kt, buttonCapability as L, switchCapability as Lt, boardKeySourceCapability as M, runningStateCapability as Mt, brightnessCapability as N, scriptRunnerCapability as Nt, automationControlCapability as O, runExportedAction as Ot, brokerCapability as P, sendToExportedTarget as Pt, eventEmitterCapability as Q, baseUnitOf as Qt, calendarSourceCapability as R, tamperCapability as Rt, TargetSchema as S, EventCategory as Sn, presenceCapability as St, airQualitySensorCapability as T, publicEndpointReaderFrom as Tt, consumableFormOf as U, vacuumControlCapability as Ut, colorCapability as V, tryConvertUnit as Vt, consumableKindOf as W, valveCapability as Wt, deviceExportCapability as X, RecordSecretUnavailableError as Xt, deviceAdoptionCapability as Y, REDACTED_SECRET as Yt, enumSensorCapability as Z, RevConflictError as Zt, HvacModeSchema as _, url as _n, oauthIntegrationCapability as _t, AlarmArmModeSchema as a, nodePin as an, humiditySensorCapability as at, RUNNING_STATE_COLD as b, DeviceType as bn, preconditionOf as bt, CAMERA_SWITCH_ORDER as c, boolean as cn, integrationInstancesCapability as ct, ConsumableFormSchema as d, number as dn, mediaPlayerCapability as dt, defineAddonMigrations as en, flattenNestedRecords as et, ConsumableItemSchema as f, object as fn, motionCapability as ft, FanDirectionSchema as g, unknown as gn, numericSensorCapability as gt, ExportInstanceUnknownError as h, union as hn, notifierCapability as ht, listHomeAssistantBrokers as i, isReadingQuantity as in, humidifierCapability as it, binaryCapability as j, runningFromVacuumState as jt, batteryCapability as k, runningFromLawnMower as kt, COCO_TO_MACRO as l, discriminatedUnion as ln, lawnMowerControlCapability as lt, EnumSensorDateTimeFormatSchema as m, string as mn, notificationOutputCapability as mt, HA_BROKER_KIND as n, defineRecordKinds as nn, floodCapability as nt, BaseDevice as o, _enum as on, imageCapability as ot, ConsumableStatusSchema as p, record as pn, normalizeUnit as pt, coverCapability as q, weatherCapability as qt, HA_PROVIDER_ADDON_ID$1 as r, entryBody as rn, gasCapability as rt, BaseDeviceProvider as s, array as sn, ingestReading as st, haInstanceSettingsPortsOver as t, defineEntryKind as tn, flattenPortsOver as tt, CameraSwitchIdSchema as u, literal as un, lockControlCapability as ut, MediaPlayerRepeatSchema as v, DeviceFeature as vn, parseAdminBase as vt, addonRoutesCapability as w, pruneDeletedEntities as wt, RecordIntegrationInstances as x, errMsg as xn, prepareNotification as xt, PLUG_APPLIANCE_TYPES as y, DeviceRole as yn, powerMeterCapability as yt, carbonMonoxideCapability as z, temperatureSensorCapability as zt };