@camstack/addon-provider-homeassistant 1.2.637 → 1.2.639

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/CHANGELOG.md CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.639] - 2026-10-29
11
+
12
+ ### Changed
13
+
14
+ - Home Assistant state changes reach CamStack once each, not once per listener.
15
+
16
+ ## [1.2.638] - 2026-10-29
17
+
18
+ ### Changed
19
+
20
+ - Runs in the shared integrations runner with the other low-traffic integration addons
21
+
10
22
  ## [1.2.637] - 2026-10-29
11
23
 
12
24
  ### Added
@@ -17,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
17
29
 
18
30
  - The pet fountain capability is listed as not exported to Home Assistant
19
31
  - The exported node memory sensor stays unknown when the node's memory could not be read
32
+ - The Home Assistant export runs in the shared integrations runner with the other low-traffic integration addons, saving one process of memory
20
33
 
21
34
  ## [1.2.636] - 2026-10-29
22
35
 
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("./dist-DYCWN6ge.js");
2
+ const require_dist = require("./dist-C_XoeULr.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-admin-link.ts
@@ -5354,8 +5354,10 @@ function subscribeEntities(opts) {
5354
5354
  * the same HA broker for overlapping entity sets. We keep ONE
5355
5355
  * upstream `subscribe_entities` to HA with the UNION of every
5356
5356
  * active subscription's entity ids, and fan inbound state changes
5357
- * out via `EventCategory.BrokerMessage` once per matching
5358
- * subscription.
5357
+ * out via `EventCategory.BrokerMessage` ONCE per change when at
5358
+ * least one subscription matches (the bus is shared and consumers
5359
+ * filter by `key`). A new subscriber's cache replay is the one
5360
+ * targeted emission: it carries that subscription's id.
5359
5361
  * - When the active union changes (subscribe / unsubscribe call),
5360
5362
  * we re-issue the upstream subscribe with the new set. HA accepts
5361
5363
  * this efficiently (server-side filter).
@@ -5367,6 +5369,10 @@ function subscribeEntities(opts) {
5367
5369
  * subscribe's initial `a` (add) frames.
5368
5370
  */
5369
5371
  var HA_KIND$1 = "home-assistant";
5372
+ /** `subscriptionId` of a `broker.message` that is not addressed to one
5373
+ * subscription (a live state change fanned out once). The payload type
5374
+ * requires the field; the empty string is the repo convention for "none". */
5375
+ var FANOUT_SUBSCRIPTION_ID = "";
5370
5376
  /**
5371
5377
  * Curated device-event allowlist for the per-broker bus-event aggregator
5372
5378
  * (Case 2). Home Assistant fires arbitrary events on its bus; subscribing
@@ -5645,7 +5651,10 @@ var HaIntegrationManager = class HaIntegrationManager {
5645
5651
  for (const entityId of changed) {
5646
5652
  const state = next[entityId] ?? null;
5647
5653
  if (state === null) continue;
5648
- for (const sub of this.subscriptions.values()) if (this.subscriptionMatches(sub, entityId)) this.emitBrokerMessage(sub.id, entityId, state);
5654
+ for (const sub of this.subscriptions.values()) if (this.subscriptionMatches(sub, entityId)) {
5655
+ this.emitBrokerMessage(FANOUT_SUBSCRIPTION_ID, entityId, state);
5656
+ break;
5657
+ }
5649
5658
  }
5650
5659
  }
5651
5660
  subscriptionMatches(sub, entityId) {
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as lawnMowerControlCapability, $t as object, A as buttonCapability, At as valveCapability, B as coverCapability, Bt as baseUnitOf, C as batteryCapability, Ct as switchCapability, D as brokerCapability, Dt as tryConvertUnit, E as brightnessCapability, Et as tryConvertDelta, F as connectivityCapability, Ft as DeviceRole, G as eventEmitterCapability, H as deviceAdoptionCapability, Ht as defineEntryKind, It as DeviceType, J as gasCapability, Jt as array, K as fanControlCapability, Lt as errMsg, M as carbonMonoxideCapability, Mt as waterHeaterCapability, N as climateControlCapability, Nt as weatherCapability, O as buildAddonRouteProvider, Ot as updateCapability, P as colorCapability, Pt as DeviceFeature, Q as ingestReading, Qt as number, R as contactCapability, S as automationControlCapability, St as smokeCapability, T as binaryCapability, Tt as temperatureSensorCapability, Ut as defineRecordKinds, V as deviceAdminLinkCapability, Vt as createEvent, W as enumSensorCapability, Wt as entryBody, X as humiditySensorCapability, Xt as discriminatedUnion, Y as humidifierCapability, Yt as boolean, Z as imageCapability, Zt as literal, _ as accessoriesCapability, _t as runningFromMediaPlayer, an as EventCategory, at as notifierCapability, b as alarmPanelCapability, bt as scriptRunnerCapability, ct as parseAdminBase, dt as presenceCapability, en as record, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromLawnMower, h as RUNNING_STATE_COLD, in as url, it as notificationOutputCapability, j as calendarSourceCapability, jt as vibrationCapability, k as buildDeviceAdminUrl, kt as vacuumControlCapability, lt as powerMeterCapability, mt as quantityFromUnit, n as BaseDevice, nn as union, nt as motionCapability, ot as numericSensorCapability, q as floodCapability, qt as _enum, r as BaseDeviceProvider, rn as unknown, rt as normalizeUnit, tn as string, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as runningFromVacuumState, w as bestLocationMatch, wt as tamperCapability, x as ambientLightSensorCapability, y as airQualitySensorCapability, yt as runningStateCapability, z as controlCapability, zt as RecordSecretUnavailableError } from "./dist-Co6d8Y_P.mjs";
1
+ import { $ as lawnMowerControlCapability, $t as object, A as buttonCapability, At as valveCapability, B as coverCapability, Bt as baseUnitOf, C as batteryCapability, Ct as switchCapability, D as brokerCapability, Dt as tryConvertUnit, E as brightnessCapability, Et as tryConvertDelta, F as connectivityCapability, Ft as DeviceRole, G as eventEmitterCapability, H as deviceAdoptionCapability, Ht as defineEntryKind, It as DeviceType, J as gasCapability, Jt as array, K as fanControlCapability, Lt as errMsg, M as carbonMonoxideCapability, Mt as waterHeaterCapability, N as climateControlCapability, Nt as weatherCapability, O as buildAddonRouteProvider, Ot as updateCapability, P as colorCapability, Pt as DeviceFeature, Q as ingestReading, Qt as number, R as contactCapability, S as automationControlCapability, St as smokeCapability, T as binaryCapability, Tt as temperatureSensorCapability, Ut as defineRecordKinds, V as deviceAdminLinkCapability, Vt as createEvent, W as enumSensorCapability, Wt as entryBody, X as humiditySensorCapability, Xt as discriminatedUnion, Y as humidifierCapability, Yt as boolean, Z as imageCapability, Zt as literal, _ as accessoriesCapability, _t as runningFromMediaPlayer, an as EventCategory, at as notifierCapability, b as alarmPanelCapability, bt as scriptRunnerCapability, ct as parseAdminBase, dt as presenceCapability, en as record, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromLawnMower, h as RUNNING_STATE_COLD, in as url, it as notificationOutputCapability, j as calendarSourceCapability, jt as vibrationCapability, k as buildDeviceAdminUrl, kt as vacuumControlCapability, lt as powerMeterCapability, mt as quantityFromUnit, n as BaseDevice, nn as union, nt as motionCapability, ot as numericSensorCapability, q as floodCapability, qt as _enum, r as BaseDeviceProvider, rn as unknown, rt as normalizeUnit, tn as string, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as runningFromVacuumState, w as bestLocationMatch, wt as tamperCapability, x as ambientLightSensorCapability, y as airQualitySensorCapability, yt as runningStateCapability, z as controlCapability, zt as RecordSecretUnavailableError } from "./dist-Cvz76AD1.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-admin-link.ts
@@ -5353,8 +5353,10 @@ function subscribeEntities(opts) {
5353
5353
  * the same HA broker for overlapping entity sets. We keep ONE
5354
5354
  * upstream `subscribe_entities` to HA with the UNION of every
5355
5355
  * active subscription's entity ids, and fan inbound state changes
5356
- * out via `EventCategory.BrokerMessage` once per matching
5357
- * subscription.
5356
+ * out via `EventCategory.BrokerMessage` ONCE per change when at
5357
+ * least one subscription matches (the bus is shared and consumers
5358
+ * filter by `key`). A new subscriber's cache replay is the one
5359
+ * targeted emission: it carries that subscription's id.
5358
5360
  * - When the active union changes (subscribe / unsubscribe call),
5359
5361
  * we re-issue the upstream subscribe with the new set. HA accepts
5360
5362
  * this efficiently (server-side filter).
@@ -5366,6 +5368,10 @@ function subscribeEntities(opts) {
5366
5368
  * subscribe's initial `a` (add) frames.
5367
5369
  */
5368
5370
  var HA_KIND$1 = "home-assistant";
5371
+ /** `subscriptionId` of a `broker.message` that is not addressed to one
5372
+ * subscription (a live state change fanned out once). The payload type
5373
+ * requires the field; the empty string is the repo convention for "none". */
5374
+ var FANOUT_SUBSCRIPTION_ID = "";
5369
5375
  /**
5370
5376
  * Curated device-event allowlist for the per-broker bus-event aggregator
5371
5377
  * (Case 2). Home Assistant fires arbitrary events on its bus; subscribing
@@ -5644,7 +5650,10 @@ var HaIntegrationManager = class HaIntegrationManager {
5644
5650
  for (const entityId of changed) {
5645
5651
  const state = next[entityId] ?? null;
5646
5652
  if (state === null) continue;
5647
- for (const sub of this.subscriptions.values()) if (this.subscriptionMatches(sub, entityId)) this.emitBrokerMessage(sub.id, entityId, state);
5653
+ for (const sub of this.subscriptions.values()) if (this.subscriptionMatches(sub, entityId)) {
5654
+ this.emitBrokerMessage(FANOUT_SUBSCRIPTION_ID, entityId, state);
5655
+ break;
5656
+ }
5648
5657
  }
5649
5658
  }
5650
5659
  subscriptionMatches(sub, entityId) {
@@ -55875,6 +55875,12 @@ var ServerUpdateActionResultSchema = object({
55875
55875
  */
55876
55876
  blockers: array(UpdateBlockerSchema).optional()
55877
55877
  });
55878
+ var LaunchOverridesSchema = object({
55879
+ /** The persisted heap ceiling in MB, or `null` when none is set. */
55880
+ heapMb: number().int().nullable() });
55881
+ var SetLaunchOverridesResultSchema = LaunchOverridesSchema.extend({
55882
+ /** Always true: the override is read at launch, not by the running process. */
55883
+ restartRequired: boolean() });
55878
55884
  method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
55879
55885
  kind: "mutation",
55880
55886
  auth: "admin"
@@ -55897,6 +55903,9 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
55897
55903
  }), method(_void(), ServerUpdateActionResultSchema, {
55898
55904
  kind: "mutation",
55899
55905
  auth: "admin"
55906
+ }), method(_void(), LaunchOverridesSchema, { auth: "admin" }), method(object({ heapMb: number().int().min(512).max(65536).nullable() }), SetLaunchOverridesResultSchema, {
55907
+ kind: "mutation",
55908
+ auth: "admin"
55900
55909
  });
55901
55910
  /**
55902
55911
  * `smtp-provider` — pluggable email delivery surface.
@@ -82184,6 +82193,13 @@ Object.freeze({
82184
82193
  access: "create",
82185
82194
  role: "admin"
82186
82195
  },
82196
+ "serverManagement.getLaunchOverrides": {
82197
+ capName: "server-management",
82198
+ capScope: "system",
82199
+ addonId: null,
82200
+ access: "view",
82201
+ role: "admin"
82202
+ },
82187
82203
  "serverManagement.getServerPackageStatus": {
82188
82204
  capName: "server-management",
82189
82205
  capScope: "system",
@@ -82205,6 +82221,13 @@ Object.freeze({
82205
82221
  access: "create",
82206
82222
  role: "admin"
82207
82223
  },
82224
+ "serverManagement.setLaunchOverrides": {
82225
+ capName: "server-management",
82226
+ capScope: "system",
82227
+ addonId: null,
82228
+ access: "create",
82229
+ role: "admin"
82230
+ },
82208
82231
  "settingsStore.aggregate": {
82209
82232
  capName: "settings-store",
82210
82233
  capScope: "system",
@@ -55874,6 +55874,12 @@ var ServerUpdateActionResultSchema = object({
55874
55874
  */
55875
55875
  blockers: array(UpdateBlockerSchema).optional()
55876
55876
  });
55877
+ var LaunchOverridesSchema = object({
55878
+ /** The persisted heap ceiling in MB, or `null` when none is set. */
55879
+ heapMb: number().int().nullable() });
55880
+ var SetLaunchOverridesResultSchema = LaunchOverridesSchema.extend({
55881
+ /** Always true: the override is read at launch, not by the running process. */
55882
+ restartRequired: boolean() });
55877
55883
  method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
55878
55884
  kind: "mutation",
55879
55885
  auth: "admin"
@@ -55896,6 +55902,9 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
55896
55902
  }), method(_void(), ServerUpdateActionResultSchema, {
55897
55903
  kind: "mutation",
55898
55904
  auth: "admin"
55905
+ }), method(_void(), LaunchOverridesSchema, { auth: "admin" }), method(object({ heapMb: number().int().min(512).max(65536).nullable() }), SetLaunchOverridesResultSchema, {
55906
+ kind: "mutation",
55907
+ auth: "admin"
55899
55908
  });
55900
55909
  /**
55901
55910
  * `smtp-provider` — pluggable email delivery surface.
@@ -82183,6 +82192,13 @@ Object.freeze({
82183
82192
  access: "create",
82184
82193
  role: "admin"
82185
82194
  },
82195
+ "serverManagement.getLaunchOverrides": {
82196
+ capName: "server-management",
82197
+ capScope: "system",
82198
+ addonId: null,
82199
+ access: "view",
82200
+ role: "admin"
82201
+ },
82186
82202
  "serverManagement.getServerPackageStatus": {
82187
82203
  capName: "server-management",
82188
82204
  capScope: "system",
@@ -82204,6 +82220,13 @@ Object.freeze({
82204
82220
  access: "create",
82205
82221
  role: "admin"
82206
82222
  },
82223
+ "serverManagement.setLaunchOverrides": {
82224
+ capName: "server-management",
82225
+ capScope: "system",
82226
+ addonId: null,
82227
+ access: "create",
82228
+ role: "admin"
82229
+ },
82207
82230
  "settingsStore.aggregate": {
82208
82231
  capName: "settings-store",
82209
82232
  capScope: "system",
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-DYCWN6ge.js");
27
+ const require_dist = require("../dist-C_XoeULr.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { $t as object, Bt as baseUnitOf, Gt as isReadingQuantity, I as consumableFormOf, Jt as array, Kt as nodePin, L as consumableKindOf, O as buildAddonRouteProvider, Rt as BaseAddon, U as deviceExportCapability, a as COCO_TO_MACRO, an as EventCategory, c as ConsumableItemSchema, d as FanDirectionSchema, f as HvacModeSchema, ht as runExportedAction, i as CAMERA_SWITCH_ORDER, l as ConsumableStatusSchema, m as PLUG_APPLIANCE_TYPES, o as CameraSwitchIdSchema, p as MediaPlayerRepeatSchema, pt as pruneDeletedEntities, rn as unknown, s as ConsumableFormSchema, st as oauthIntegrationCapability, t as AlarmArmModeSchema, tn as string, v as addonRoutesCapability, xt as sendToExportedTarget } from "../dist-Co6d8Y_P.mjs";
1
+ import { $t as object, Bt as baseUnitOf, Gt as isReadingQuantity, I as consumableFormOf, Jt as array, Kt as nodePin, L as consumableKindOf, O as buildAddonRouteProvider, Rt as BaseAddon, U as deviceExportCapability, a as COCO_TO_MACRO, an as EventCategory, c as ConsumableItemSchema, d as FanDirectionSchema, f as HvacModeSchema, ht as runExportedAction, i as CAMERA_SWITCH_ORDER, l as ConsumableStatusSchema, m as PLUG_APPLIANCE_TYPES, o as CameraSwitchIdSchema, p as MediaPlayerRepeatSchema, pt as pruneDeletedEntities, rn as unknown, s as ConsumableFormSchema, st as oauthIntegrationCapability, t as AlarmArmModeSchema, tn as string, v as addonRoutesCapability, xt as sendToExportedTarget } from "../dist-Cvz76AD1.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.637",
3
+ "version": "1.2.639",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",
@@ -106,7 +106,8 @@
106
106
  "icon": "assets/icon.svg",
107
107
  "color": "#41bdf5",
108
108
  "execution": {
109
- "placement": "hub-only"
109
+ "placement": "hub-only",
110
+ "group": "integrations"
110
111
  },
111
112
  "capabilities": [
112
113
  {