@camstack/addon-provider-homeassistant 1.2.66 → 1.2.69

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/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-hXonkb3t.js");
2
+ const require_dist = require("./dist-BULdaGgg.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-device-source.ts
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as presenceCapability, A as controlCapability, At as EventCategory, B as humiditySensorCapability, C as buildAddonRouteProvider, Ct as number, D as colorCapability, Dt as union, E as climateControlCapability, Et as string, F as eventEmitterCapability, G as motionCapability, H as lawnMowerControlCapability, I as fanControlCapability, J as notifierCapability, K as normalizeUnit, L as floodCapability, M as deviceAdoptionCapability, O as connectivityCapability, Ot as unknown, P as enumSensorCapability, Q as prepareNotification, R as gasCapability, S as brokerCapability, St as literal, T as carbonMonoxideCapability, Tt as record, U as lockControlCapability, V as imageCapability, W as mediaPlayerCapability, Y as numericSensorCapability, Z as powerMeterCapability, _ as automationControlCapability, _t as createEvent, at as temperatureSensorCapability, b as binaryCapability, bt as array, ct as valveCapability, d as TargetSchema, dt as weatherCapability, et as pressureSensorCapability, f as accessoriesCapability, ft as errMsg, g as ambientLightSensorCapability, gt as DeviceType, h as alarmPanelCapability, ht as DeviceRole, it as tamperCapability, j as coverCapability, k as contactCapability, kt as url, lt as vibrationCapability, m as airQualitySensorCapability, mt as DeviceFeature, n as BaseDevice, nt as smokeCapability, ot as updateCapability, p as addonRoutesCapability, q as notificationOutputCapability, r as BaseDeviceProvider, rt as switchCapability, s as EnumSensorDateTimeFormatSchema, st as vacuumControlCapability, tt as scriptRunnerCapability, ut as waterHeaterCapability, v as batteryCapability, w as buttonCapability, wt as object, x as brightnessCapability, xt as discriminatedUnion, y as bestLocationMatch, yt as _enum, z as humidifierCapability } from "./dist-Ddc6B6iE.mjs";
1
+ import { $ as presenceCapability, A as controlCapability, At as EventCategory, B as humiditySensorCapability, C as buildAddonRouteProvider, Ct as number, D as colorCapability, Dt as union, E as climateControlCapability, Et as string, F as eventEmitterCapability, G as motionCapability, H as lawnMowerControlCapability, I as fanControlCapability, J as notifierCapability, K as normalizeUnit, L as floodCapability, M as deviceAdoptionCapability, O as connectivityCapability, Ot as unknown, P as enumSensorCapability, Q as prepareNotification, R as gasCapability, S as brokerCapability, St as literal, T as carbonMonoxideCapability, Tt as record, U as lockControlCapability, V as imageCapability, W as mediaPlayerCapability, Y as numericSensorCapability, Z as powerMeterCapability, _ as automationControlCapability, _t as createEvent, at as temperatureSensorCapability, b as binaryCapability, bt as array, ct as valveCapability, d as TargetSchema, dt as weatherCapability, et as pressureSensorCapability, f as accessoriesCapability, ft as errMsg, g as ambientLightSensorCapability, gt as DeviceType, h as alarmPanelCapability, ht as DeviceRole, it as tamperCapability, j as coverCapability, k as contactCapability, kt as url, lt as vibrationCapability, m as airQualitySensorCapability, mt as DeviceFeature, n as BaseDevice, nt as smokeCapability, ot as updateCapability, p as addonRoutesCapability, q as notificationOutputCapability, r as BaseDeviceProvider, rt as switchCapability, s as EnumSensorDateTimeFormatSchema, st as vacuumControlCapability, tt as scriptRunnerCapability, ut as waterHeaterCapability, v as batteryCapability, w as buttonCapability, wt as object, x as brightnessCapability, xt as discriminatedUnion, y as bestLocationMatch, yt as _enum, z as humidifierCapability } from "./dist-CccnKDCg.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-device-source.ts
@@ -7921,7 +7921,8 @@ var OpsLogReasonSchema = _enum([
7921
7921
  "quota",
7922
7922
  "manual",
7923
7923
  "operator",
7924
- "maintenance"
7924
+ "maintenance",
7925
+ "orphaned-device"
7925
7926
  ]);
7926
7927
  /** One audit row, shared verbatim by both domains. */
7927
7928
  var OpsLogEntrySchema = object({
@@ -13371,10 +13372,39 @@ var DevicePersistConfigPayloadSchema = object({
13371
13372
  deviceId: number(),
13372
13373
  data: record(string(), unknown())
13373
13374
  });
13375
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13376
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13377
+ var MigrateSwitchOutcomeSchema = _enum([
13378
+ "off",
13379
+ "on",
13380
+ "not-offered",
13381
+ "unreachable"
13382
+ ]);
13383
+ var MigrateSwitchReportSchema = object({
13384
+ deviceId: number(),
13385
+ switchId: CameraSwitchIdSchema,
13386
+ outcome: MigrateSwitchOutcomeSchema,
13387
+ detail: string().optional()
13388
+ });
13389
+ var MigrateDeviceResultSchema = object({
13390
+ sourceId: number(),
13391
+ targetId: number(),
13392
+ switches: array(MigrateSwitchReportSchema).readonly(),
13393
+ /** Switches that could NOT be turned off on the source. Empty is the only
13394
+ * value meaning the replaced hardware is quiet. */
13395
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13396
+ swapped: boolean()
13397
+ });
13374
13398
  method(object({
13375
13399
  addonId: string(),
13376
13400
  stableId: string()
13377
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13401
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13402
+ sourceId: number(),
13403
+ targetId: number()
13404
+ }), MigrateDeviceResultSchema, {
13405
+ kind: "mutation",
13406
+ auth: "admin"
13407
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13378
13408
  deviceId: number(),
13379
13409
  name: string()
13380
13410
  }), _void(), {
@@ -13849,6 +13879,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13849
13879
  auth: "admin"
13850
13880
  });
13851
13881
  /**
13882
+ * Transport bounds for AI capability methods.
13883
+ *
13884
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13885
+ * each other: declaring the constant in either one hands the other `undefined`
13886
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13887
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13888
+ * reintroduced invisibly. Found by the guard, not by review.
13889
+ */
13890
+ /**
13891
+ * Ceiling for a cap method that runs inference or loads a model.
13892
+ *
13893
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13894
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13895
+ * never be the layer that gives up first: when it does, the failure is
13896
+ * reported as a transport error for a model that was still thinking, naming
13897
+ * the wrong layer and hiding the real one.
13898
+ *
13899
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13900
+ * more on a cold model load. With no declaration every digest failed at
13901
+ * exactly 60 s and shipped without its text.
13902
+ *
13903
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13904
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13905
+ * decide when to stop, because only they can say WHY.
13906
+ */
13907
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13908
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13909
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13910
+ /**
13852
13911
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13853
13912
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13854
13913
  * caps stay wire-compatible without a circular cap→cap import.
@@ -14120,16 +14179,19 @@ method(LlmGenerateBaseInputSchema.extend({
14120
14179
  timeoutMs: number().int().positive().optional()
14121
14180
  }), LlmGenerateResultSchema, {
14122
14181
  kind: "mutation",
14123
- auth: "admin"
14182
+ auth: "admin",
14183
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14124
14184
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
14125
14185
  kind: "mutation",
14126
- auth: "admin"
14186
+ auth: "admin",
14187
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14127
14188
  }), method(object({}), _void(), {
14128
14189
  kind: "mutation",
14129
14190
  auth: "admin"
14130
14191
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
14131
14192
  kind: "mutation",
14132
- auth: "admin"
14193
+ auth: "admin",
14194
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
14133
14195
  }), method(object({ file: string() }), _void(), {
14134
14196
  kind: "mutation",
14135
14197
  auth: "admin"
@@ -14297,7 +14359,13 @@ var ProfileRefInputSchema = object({
14297
14359
  addonId: string(),
14298
14360
  profileId: string()
14299
14361
  });
14300
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14362
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14363
+ kind: "mutation",
14364
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14365
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14366
+ kind: "mutation",
14367
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14368
+ }), method(object({
14301
14369
  addonId: string().optional(),
14302
14370
  requestId: string()
14303
14371
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14308,7 +14376,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14308
14376
  auth: "admin"
14309
14377
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14310
14378
  kind: "mutation",
14311
- auth: "admin"
14379
+ auth: "admin",
14380
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14312
14381
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14313
14382
  selector: LlmDefaultSelectorSchema,
14314
14383
  profileId: string().nullable()
@@ -34488,6 +34557,12 @@ Object.freeze({
34488
34557
  addonId: null,
34489
34558
  access: "view"
34490
34559
  },
34560
+ "deviceManager.migrateDevice": {
34561
+ capName: "device-manager",
34562
+ capScope: "system",
34563
+ addonId: null,
34564
+ access: "create"
34565
+ },
34491
34566
  "deviceManager.persistConfig": {
34492
34567
  capName: "device-manager",
34493
34568
  capScope: "system",
@@ -7921,7 +7921,8 @@ var OpsLogReasonSchema = _enum([
7921
7921
  "quota",
7922
7922
  "manual",
7923
7923
  "operator",
7924
- "maintenance"
7924
+ "maintenance",
7925
+ "orphaned-device"
7925
7926
  ]);
7926
7927
  /** One audit row, shared verbatim by both domains. */
7927
7928
  var OpsLogEntrySchema = object({
@@ -13371,10 +13372,39 @@ var DevicePersistConfigPayloadSchema = object({
13371
13372
  deviceId: number(),
13372
13373
  data: record(string(), unknown())
13373
13374
  });
13375
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13376
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13377
+ var MigrateSwitchOutcomeSchema = _enum([
13378
+ "off",
13379
+ "on",
13380
+ "not-offered",
13381
+ "unreachable"
13382
+ ]);
13383
+ var MigrateSwitchReportSchema = object({
13384
+ deviceId: number(),
13385
+ switchId: CameraSwitchIdSchema,
13386
+ outcome: MigrateSwitchOutcomeSchema,
13387
+ detail: string().optional()
13388
+ });
13389
+ var MigrateDeviceResultSchema = object({
13390
+ sourceId: number(),
13391
+ targetId: number(),
13392
+ switches: array(MigrateSwitchReportSchema).readonly(),
13393
+ /** Switches that could NOT be turned off on the source. Empty is the only
13394
+ * value meaning the replaced hardware is quiet. */
13395
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13396
+ swapped: boolean()
13397
+ });
13374
13398
  method(object({
13375
13399
  addonId: string(),
13376
13400
  stableId: string()
13377
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13401
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13402
+ sourceId: number(),
13403
+ targetId: number()
13404
+ }), MigrateDeviceResultSchema, {
13405
+ kind: "mutation",
13406
+ auth: "admin"
13407
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13378
13408
  deviceId: number(),
13379
13409
  name: string()
13380
13410
  }), _void(), {
@@ -13849,6 +13879,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13849
13879
  auth: "admin"
13850
13880
  });
13851
13881
  /**
13882
+ * Transport bounds for AI capability methods.
13883
+ *
13884
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13885
+ * each other: declaring the constant in either one hands the other `undefined`
13886
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13887
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13888
+ * reintroduced invisibly. Found by the guard, not by review.
13889
+ */
13890
+ /**
13891
+ * Ceiling for a cap method that runs inference or loads a model.
13892
+ *
13893
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13894
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13895
+ * never be the layer that gives up first: when it does, the failure is
13896
+ * reported as a transport error for a model that was still thinking, naming
13897
+ * the wrong layer and hiding the real one.
13898
+ *
13899
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13900
+ * more on a cold model load. With no declaration every digest failed at
13901
+ * exactly 60 s and shipped without its text.
13902
+ *
13903
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13904
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13905
+ * decide when to stop, because only they can say WHY.
13906
+ */
13907
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13908
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13909
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13910
+ /**
13852
13911
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13853
13912
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13854
13913
  * caps stay wire-compatible without a circular cap→cap import.
@@ -14120,16 +14179,19 @@ method(LlmGenerateBaseInputSchema.extend({
14120
14179
  timeoutMs: number().int().positive().optional()
14121
14180
  }), LlmGenerateResultSchema, {
14122
14181
  kind: "mutation",
14123
- auth: "admin"
14182
+ auth: "admin",
14183
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14124
14184
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
14125
14185
  kind: "mutation",
14126
- auth: "admin"
14186
+ auth: "admin",
14187
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14127
14188
  }), method(object({}), _void(), {
14128
14189
  kind: "mutation",
14129
14190
  auth: "admin"
14130
14191
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
14131
14192
  kind: "mutation",
14132
- auth: "admin"
14193
+ auth: "admin",
14194
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
14133
14195
  }), method(object({ file: string() }), _void(), {
14134
14196
  kind: "mutation",
14135
14197
  auth: "admin"
@@ -14297,7 +14359,13 @@ var ProfileRefInputSchema = object({
14297
14359
  addonId: string(),
14298
14360
  profileId: string()
14299
14361
  });
14300
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14362
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14363
+ kind: "mutation",
14364
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14365
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14366
+ kind: "mutation",
14367
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14368
+ }), method(object({
14301
14369
  addonId: string().optional(),
14302
14370
  requestId: string()
14303
14371
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14308,7 +14376,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14308
14376
  auth: "admin"
14309
14377
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14310
14378
  kind: "mutation",
14311
- auth: "admin"
14379
+ auth: "admin",
14380
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14312
14381
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14313
14382
  selector: LlmDefaultSelectorSchema,
14314
14383
  profileId: string().nullable()
@@ -34488,6 +34557,12 @@ Object.freeze({
34488
34557
  addonId: null,
34489
34558
  access: "view"
34490
34559
  },
34560
+ "deviceManager.migrateDevice": {
34561
+ capName: "device-manager",
34562
+ capScope: "system",
34563
+ addonId: null,
34564
+ access: "create"
34565
+ },
34491
34566
  "deviceManager.persistConfig": {
34492
34567
  capName: "device-manager",
34493
34568
  capScope: "system",
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  //#endregion
6
- const require_dist = require("../dist-hXonkb3t.js");
6
+ const require_dist = require("../dist-BULdaGgg.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  //#region src/ha-export/topics.ts
9
9
  /**
@@ -1,4 +1,4 @@
1
- import { At as EventCategory, C as buildAddonRouteProvider, Et as string, N as deviceExportCapability, X as oauthIntegrationCapability, a as COCO_TO_MACRO, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, pt as BaseAddon, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, vt as nodePin } from "../dist-Ddc6B6iE.mjs";
1
+ import { At as EventCategory, C as buildAddonRouteProvider, Et as string, N as deviceExportCapability, X as oauthIntegrationCapability, a as COCO_TO_MACRO, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, pt as BaseAddon, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, vt as nodePin } from "../dist-CccnKDCg.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  //#region src/ha-export/topics.ts
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.66",
3
+ "version": "1.2.69",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",