@camstack/addon-provider-homematic 1.2.53 → 1.2.56

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
@@ -7727,7 +7727,8 @@ var OpsLogReasonSchema = _enum([
7727
7727
  "quota",
7728
7728
  "manual",
7729
7729
  "operator",
7730
- "maintenance"
7730
+ "maintenance",
7731
+ "orphaned-device"
7731
7732
  ]);
7732
7733
  /** One audit row, shared verbatim by both domains. */
7733
7734
  var OpsLogEntrySchema = object({
@@ -13088,10 +13089,39 @@ var DevicePersistConfigPayloadSchema = object({
13088
13089
  deviceId: number(),
13089
13090
  data: record(string(), unknown())
13090
13091
  });
13092
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13093
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13094
+ var MigrateSwitchOutcomeSchema = _enum([
13095
+ "off",
13096
+ "on",
13097
+ "not-offered",
13098
+ "unreachable"
13099
+ ]);
13100
+ var MigrateSwitchReportSchema = object({
13101
+ deviceId: number(),
13102
+ switchId: CameraSwitchIdSchema,
13103
+ outcome: MigrateSwitchOutcomeSchema,
13104
+ detail: string().optional()
13105
+ });
13106
+ var MigrateDeviceResultSchema = object({
13107
+ sourceId: number(),
13108
+ targetId: number(),
13109
+ switches: array(MigrateSwitchReportSchema).readonly(),
13110
+ /** Switches that could NOT be turned off on the source. Empty is the only
13111
+ * value meaning the replaced hardware is quiet. */
13112
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13113
+ swapped: boolean()
13114
+ });
13091
13115
  method(object({
13092
13116
  addonId: string(),
13093
13117
  stableId: string()
13094
- }), 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({
13118
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13119
+ sourceId: number(),
13120
+ targetId: number()
13121
+ }), MigrateDeviceResultSchema, {
13122
+ kind: "mutation",
13123
+ auth: "admin"
13124
+ }), 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({
13095
13125
  deviceId: number(),
13096
13126
  name: string()
13097
13127
  }), _void(), {
@@ -13566,6 +13596,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13566
13596
  auth: "admin"
13567
13597
  });
13568
13598
  /**
13599
+ * Transport bounds for AI capability methods.
13600
+ *
13601
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13602
+ * each other: declaring the constant in either one hands the other `undefined`
13603
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13604
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13605
+ * reintroduced invisibly. Found by the guard, not by review.
13606
+ */
13607
+ /**
13608
+ * Ceiling for a cap method that runs inference or loads a model.
13609
+ *
13610
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13611
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13612
+ * never be the layer that gives up first: when it does, the failure is
13613
+ * reported as a transport error for a model that was still thinking, naming
13614
+ * the wrong layer and hiding the real one.
13615
+ *
13616
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13617
+ * more on a cold model load. With no declaration every digest failed at
13618
+ * exactly 60 s and shipped without its text.
13619
+ *
13620
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13621
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13622
+ * decide when to stop, because only they can say WHY.
13623
+ */
13624
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13625
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13626
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13627
+ /**
13569
13628
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13570
13629
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13571
13630
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13837,16 +13896,19 @@ method(LlmGenerateBaseInputSchema.extend({
13837
13896
  timeoutMs: number().int().positive().optional()
13838
13897
  }), LlmGenerateResultSchema, {
13839
13898
  kind: "mutation",
13840
- auth: "admin"
13899
+ auth: "admin",
13900
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13841
13901
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13842
13902
  kind: "mutation",
13843
- auth: "admin"
13903
+ auth: "admin",
13904
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13844
13905
  }), method(object({}), _void(), {
13845
13906
  kind: "mutation",
13846
13907
  auth: "admin"
13847
13908
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13848
13909
  kind: "mutation",
13849
- auth: "admin"
13910
+ auth: "admin",
13911
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13850
13912
  }), method(object({ file: string() }), _void(), {
13851
13913
  kind: "mutation",
13852
13914
  auth: "admin"
@@ -14014,7 +14076,13 @@ var ProfileRefInputSchema = object({
14014
14076
  addonId: string(),
14015
14077
  profileId: string()
14016
14078
  });
14017
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14079
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14080
+ kind: "mutation",
14081
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14082
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14083
+ kind: "mutation",
14084
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14085
+ }), method(object({
14018
14086
  addonId: string().optional(),
14019
14087
  requestId: string()
14020
14088
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14025,7 +14093,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14025
14093
  auth: "admin"
14026
14094
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14027
14095
  kind: "mutation",
14028
- auth: "admin"
14096
+ auth: "admin",
14097
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14029
14098
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14030
14099
  selector: LlmDefaultSelectorSchema,
14031
14100
  profileId: string().nullable()
@@ -34086,6 +34155,12 @@ Object.freeze({
34086
34155
  addonId: null,
34087
34156
  access: "view"
34088
34157
  },
34158
+ "deviceManager.migrateDevice": {
34159
+ capName: "device-manager",
34160
+ capScope: "system",
34161
+ addonId: null,
34162
+ access: "create"
34163
+ },
34089
34164
  "deviceManager.persistConfig": {
34090
34165
  capName: "device-manager",
34091
34166
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -7728,7 +7728,8 @@ var OpsLogReasonSchema = _enum([
7728
7728
  "quota",
7729
7729
  "manual",
7730
7730
  "operator",
7731
- "maintenance"
7731
+ "maintenance",
7732
+ "orphaned-device"
7732
7733
  ]);
7733
7734
  /** One audit row, shared verbatim by both domains. */
7734
7735
  var OpsLogEntrySchema = object({
@@ -13089,10 +13090,39 @@ var DevicePersistConfigPayloadSchema = object({
13089
13090
  deviceId: number(),
13090
13091
  data: record(string(), unknown())
13091
13092
  });
13093
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13094
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13095
+ var MigrateSwitchOutcomeSchema = _enum([
13096
+ "off",
13097
+ "on",
13098
+ "not-offered",
13099
+ "unreachable"
13100
+ ]);
13101
+ var MigrateSwitchReportSchema = object({
13102
+ deviceId: number(),
13103
+ switchId: CameraSwitchIdSchema,
13104
+ outcome: MigrateSwitchOutcomeSchema,
13105
+ detail: string().optional()
13106
+ });
13107
+ var MigrateDeviceResultSchema = object({
13108
+ sourceId: number(),
13109
+ targetId: number(),
13110
+ switches: array(MigrateSwitchReportSchema).readonly(),
13111
+ /** Switches that could NOT be turned off on the source. Empty is the only
13112
+ * value meaning the replaced hardware is quiet. */
13113
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13114
+ swapped: boolean()
13115
+ });
13092
13116
  method(object({
13093
13117
  addonId: string(),
13094
13118
  stableId: string()
13095
- }), 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({
13119
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13120
+ sourceId: number(),
13121
+ targetId: number()
13122
+ }), MigrateDeviceResultSchema, {
13123
+ kind: "mutation",
13124
+ auth: "admin"
13125
+ }), 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({
13096
13126
  deviceId: number(),
13097
13127
  name: string()
13098
13128
  }), _void(), {
@@ -13567,6 +13597,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13567
13597
  auth: "admin"
13568
13598
  });
13569
13599
  /**
13600
+ * Transport bounds for AI capability methods.
13601
+ *
13602
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13603
+ * each other: declaring the constant in either one hands the other `undefined`
13604
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13605
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13606
+ * reintroduced invisibly. Found by the guard, not by review.
13607
+ */
13608
+ /**
13609
+ * Ceiling for a cap method that runs inference or loads a model.
13610
+ *
13611
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13612
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13613
+ * never be the layer that gives up first: when it does, the failure is
13614
+ * reported as a transport error for a model that was still thinking, naming
13615
+ * the wrong layer and hiding the real one.
13616
+ *
13617
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13618
+ * more on a cold model load. With no declaration every digest failed at
13619
+ * exactly 60 s and shipped without its text.
13620
+ *
13621
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13622
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13623
+ * decide when to stop, because only they can say WHY.
13624
+ */
13625
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13626
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13627
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13628
+ /**
13570
13629
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13571
13630
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13572
13631
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13838,16 +13897,19 @@ method(LlmGenerateBaseInputSchema.extend({
13838
13897
  timeoutMs: number().int().positive().optional()
13839
13898
  }), LlmGenerateResultSchema, {
13840
13899
  kind: "mutation",
13841
- auth: "admin"
13900
+ auth: "admin",
13901
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13842
13902
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13843
13903
  kind: "mutation",
13844
- auth: "admin"
13904
+ auth: "admin",
13905
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13845
13906
  }), method(object({}), _void(), {
13846
13907
  kind: "mutation",
13847
13908
  auth: "admin"
13848
13909
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13849
13910
  kind: "mutation",
13850
- auth: "admin"
13911
+ auth: "admin",
13912
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13851
13913
  }), method(object({ file: string() }), _void(), {
13852
13914
  kind: "mutation",
13853
13915
  auth: "admin"
@@ -14015,7 +14077,13 @@ var ProfileRefInputSchema = object({
14015
14077
  addonId: string(),
14016
14078
  profileId: string()
14017
14079
  });
14018
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14080
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14081
+ kind: "mutation",
14082
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14083
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14084
+ kind: "mutation",
14085
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14086
+ }), method(object({
14019
14087
  addonId: string().optional(),
14020
14088
  requestId: string()
14021
14089
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14026,7 +14094,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14026
14094
  auth: "admin"
14027
14095
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14028
14096
  kind: "mutation",
14029
- auth: "admin"
14097
+ auth: "admin",
14098
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14030
14099
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14031
14100
  selector: LlmDefaultSelectorSchema,
14032
14101
  profileId: string().nullable()
@@ -34087,6 +34156,12 @@ Object.freeze({
34087
34156
  addonId: null,
34088
34157
  access: "view"
34089
34158
  },
34159
+ "deviceManager.migrateDevice": {
34160
+ capName: "device-manager",
34161
+ capScope: "system",
34162
+ addonId: null,
34163
+ access: "create"
34164
+ },
34090
34165
  "deviceManager.persistConfig": {
34091
34166
  capName: "device-manager",
34092
34167
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.53",
3
+ "version": "1.2.56",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",