@camstack/addon-provider-homeassistant 1.2.616 → 1.2.617

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-DMbVsggA.js");
2
+ const require_dist = require("./dist-CfZUXrNa.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
@@ -6874,14 +6874,14 @@ function haConfigSchema() {
6874
6874
  labelKey: "provider-homeassistant:haConfig.s_connection.service.label",
6875
6875
  required: true,
6876
6876
  placeholder: "mobile_app_pixel_7",
6877
- description: "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
6877
+ description: "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
6878
6878
  descriptionKey: "provider-homeassistant:haConfig.s_connection.service.description"
6879
6879
  }, {
6880
6880
  type: "text",
6881
6881
  key: "brokerId",
6882
6882
  label: "Broker",
6883
6883
  labelKey: "provider-homeassistant:haConfig.s_connection.brokerId.label",
6884
- description: "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker.",
6884
+ description: "Optional; blank uses the only configured broker.",
6885
6885
  descriptionKey: "provider-homeassistant:haConfig.s_connection.brokerId.description"
6886
6886
  }]
6887
6887
  }] };
@@ -8173,8 +8173,6 @@ var HaProviderAddon = class HaProviderAddon extends require_dist.BaseDeviceProvi
8173
8173
  id: "ha-calendars-import",
8174
8174
  title: "Calendars to import",
8175
8175
  titleKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.title",
8176
- description: "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
8177
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.description",
8178
8176
  columns: 1,
8179
8177
  fields: [{
8180
8178
  type: "multiselect",
@@ -8191,15 +8189,13 @@ var HaProviderAddon = class HaProviderAddon extends require_dist.BaseDeviceProvi
8191
8189
  id: "ha-broker",
8192
8190
  title: "Home Assistant broker",
8193
8191
  titleKey: "provider-homeassistant:globalSettings.s_ha-broker.title",
8194
- description: "Home Assistant brokers are managed in Connectivity → Brokers.",
8195
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-broker.description",
8196
8192
  columns: 1,
8197
8193
  fields: [{
8198
8194
  type: "info",
8199
8195
  key: "brokerHelp",
8200
8196
  label: "Brokers are managed separately",
8201
8197
  labelKey: "provider-homeassistant:globalSettings.s_ha-broker.brokerHelp.label",
8202
- content: "This integration links to a Home Assistant broker. Add, edit, or remove brokers from Connectivity → Brokers. The integration only stores a reference to its broker — no credentials are kept here."
8198
+ content: "This integration links to a Home Assistant broker managed under Connectivity → Brokers."
8203
8199
  }]
8204
8200
  }] });
8205
8201
  }
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as connectivityCapability, At as discriminatedUnion, B as floodCapability, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as _enum, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as string, G as lawnMowerControlCapability, H as humidifierCapability, It as union, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as unknown, M as controlCapability, Mt as number, N as coverCapability, Nt as object, O as climateControlCapability, Ot as array, P as deviceAdminLinkCapability, Pt as record, Q as numericSensorCapability, R as eventEmitterCapability, Rt as url, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as literal, k as colorCapability, kt as boolean, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as EventCategory } from "./dist-BQjwQmdj.mjs";
1
+ import { A as connectivityCapability, At as discriminatedUnion, B as floodCapability, C as buildAddonRouteProvider, Ct as defineEntryKind, D as carbonMonoxideCapability, Dt as _enum, E as calendarSourceCapability, F as deviceAdoptionCapability, Ft as string, G as lawnMowerControlCapability, H as humidifierCapability, It as union, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, Lt as unknown, M as controlCapability, Mt as number, N as coverCapability, Nt as object, O as climateControlCapability, Ot as array, P as deviceAdminLinkCapability, Pt as record, Q as numericSensorCapability, R as eventEmitterCapability, Rt as url, S as brokerCapability, St as createEvent, T as buttonCapability, Tt as entryBody, U as humiditySensorCapability, V as gasCapability, W as imageCapability, X as notificationOutputCapability, Y as normalizeUnit, Z as notifierCapability, _ as automationControlCapability, _t as DeviceRole, at as scriptRunnerCapability, b as binaryCapability, ct as tamperCapability, d as TargetSchema, dt as vacuumControlCapability, et as parseAdminBase, f as accessoriesCapability, ft as valveCapability, g as ambientLightSensorCapability, gt as DeviceFeature, h as alarmPanelCapability, ht as weatherCapability, it as pressureSensorCapability, j as contactCapability, jt as literal, k as colorCapability, kt as boolean, lt as temperatureSensorCapability, m as airQualitySensorCapability, mt as waterHeaterCapability, n as BaseDevice, nt as prepareNotification, ot as smokeCapability, p as addonRoutesCapability, pt as vibrationCapability, q as mediaPlayerCapability, r as BaseDeviceProvider, rt as presenceCapability, s as EnumSensorDateTimeFormatSchema, st as switchCapability, tt as powerMeterCapability, ut as updateCapability, v as batteryCapability, vt as DeviceType, w as buildDeviceAdminUrl, wt as defineRecordKinds, x as brightnessCapability, xt as RecordSecretUnavailableError, y as bestLocationMatch, yt as errMsg, z as fanControlCapability, zt as EventCategory } from "./dist-D6huwmAr.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
@@ -6856,14 +6856,14 @@ function haConfigSchema() {
6856
6856
  labelKey: "provider-homeassistant:haConfig.s_connection.service.label",
6857
6857
  required: true,
6858
6858
  placeholder: "mobile_app_pixel_7",
6859
- description: "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
6859
+ description: "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
6860
6860
  descriptionKey: "provider-homeassistant:haConfig.s_connection.service.description"
6861
6861
  }, {
6862
6862
  type: "text",
6863
6863
  key: "brokerId",
6864
6864
  label: "Broker",
6865
6865
  labelKey: "provider-homeassistant:haConfig.s_connection.brokerId.label",
6866
- description: "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker.",
6866
+ description: "Optional; blank uses the only configured broker.",
6867
6867
  descriptionKey: "provider-homeassistant:haConfig.s_connection.brokerId.description"
6868
6868
  }]
6869
6869
  }] };
@@ -8155,8 +8155,6 @@ var HaProviderAddon = class HaProviderAddon extends BaseDeviceProvider {
8155
8155
  id: "ha-calendars-import",
8156
8156
  title: "Calendars to import",
8157
8157
  titleKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.title",
8158
- description: "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
8159
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-calendars-import.description",
8160
8158
  columns: 1,
8161
8159
  fields: [{
8162
8160
  type: "multiselect",
@@ -8173,15 +8171,13 @@ var HaProviderAddon = class HaProviderAddon extends BaseDeviceProvider {
8173
8171
  id: "ha-broker",
8174
8172
  title: "Home Assistant broker",
8175
8173
  titleKey: "provider-homeassistant:globalSettings.s_ha-broker.title",
8176
- description: "Home Assistant brokers are managed in Connectivity → Brokers.",
8177
- descriptionKey: "provider-homeassistant:globalSettings.s_ha-broker.description",
8178
8174
  columns: 1,
8179
8175
  fields: [{
8180
8176
  type: "info",
8181
8177
  key: "brokerHelp",
8182
8178
  label: "Brokers are managed separately",
8183
8179
  labelKey: "provider-homeassistant:globalSettings.s_ha-broker.brokerHelp.label",
8184
- content: "This integration links to a Home Assistant broker. Add, edit, or remove brokers from Connectivity → Brokers. The integration only stores a reference to its broker — no credentials are kept here."
8180
+ content: "This integration links to a Home Assistant broker managed under Connectivity → Brokers."
8185
8181
  }]
8186
8182
  }] });
8187
8183
  }
@@ -1,5 +1,5 @@
1
1
  require("node:crypto");
2
- //#region ../types/dist/event-category-7pZEBmVg.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5555,7 +5564,7 @@ var ZodIssueCode = {
5555
5564
  var ZodFirstPartyTypeKind;
5556
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5557
5566
  //#endregion
5558
- //#region ../types/dist/sleep-CueztlR1.mjs
5567
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5559
5568
  /**
5560
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5561
5570
  * window to float samples (D455).
@@ -8154,7 +8163,7 @@ var EntryDescriptorSchema = object({
8154
8163
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8155
8164
  fields: record(string(), unknown())
8156
8165
  }).strict();
8157
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8166
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8158
8167
  var RecordKindDeclarationSchema = object({
8159
8168
  database: _enum(RECORD_DATABASES).default("settings"),
8160
8169
  class: _enum(RECORD_CLASSES),
@@ -8173,14 +8182,6 @@ var RecordKindDeclarationSchema = object({
8173
8182
  secretPaths: array(string().min(1)).default([]),
8174
8183
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8175
8184
  secretArrayKeys: record(string(), string()).default({}),
8176
- /**
8177
- * RETIRED (D900): the legacy table a kind adopted from during the records
8178
- * migration. Nothing declares it any more and nothing reads it; the schema
8179
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8180
- * (an orphaned kind is never redeclared) and an addon built before the
8181
- * removal still sends it. Never set it.
8182
- */
8183
- adoptsFrom: string().min(1).optional(),
8184
8185
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8185
8186
  transactFamily: string().min(1).optional(),
8186
8187
  entry: EntryDescriptorSchema.optional()
@@ -13179,17 +13180,6 @@ object({
13179
13180
  createdAt: number(),
13180
13181
  updatedAt: number()
13181
13182
  });
13182
- object({
13183
- id: string(),
13184
- label: string(),
13185
- isAdmin: boolean().default(false),
13186
- allowedProviders: AllowedProviderSchema,
13187
- allowedDevices: AllowedDevicesSchema,
13188
- tokenHash: string(),
13189
- tokenPrefix: string(),
13190
- createdAt: number(),
13191
- lastUsedAt: number().optional()
13192
- });
13193
13183
  object({
13194
13184
  id: string(),
13195
13185
  userId: string(),
@@ -17239,16 +17229,36 @@ var RecordKindStateSchema = _enum([
17239
17229
  var DeclareKindResultSchema = object({
17240
17230
  kindId: number().int(),
17241
17231
  state: RecordKindStateSchema,
17242
- createdIndexes: array(string()),
17243
- /**
17244
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17245
- * it stays on the wire, null, because an addon built before the removal reads
17246
- * an ABSENT field as "adoption pending" and refuses to start.
17247
- */
17248
- adoptionPending: _null()
17232
+ createdIndexes: array(string())
17249
17233
  });
17250
17234
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17251
17235
  var SecretRefsList = array(string());
17236
+ /**
17237
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17238
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17239
+ */
17240
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17241
+ object({
17242
+ op: literal("put"),
17243
+ kind: RecordKindNameSchema,
17244
+ record: RecordInputSchema,
17245
+ ifRev: number().int().min(0).optional()
17246
+ }),
17247
+ object({
17248
+ op: literal("patch"),
17249
+ kind: RecordKindNameSchema,
17250
+ id: RecordIdSchema,
17251
+ data: RecordBodySchema,
17252
+ at: number().int().nullable().optional(),
17253
+ expiresAt: number().int().nullable().optional(),
17254
+ ifRev: number().int().min(1).optional()
17255
+ }),
17256
+ object({
17257
+ op: literal("delete"),
17258
+ kind: RecordKindNameSchema,
17259
+ id: RecordIdSchema
17260
+ })
17261
+ ]);
17252
17262
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17253
17263
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17254
17264
  kind: "mutation",
@@ -17355,6 +17365,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17355
17365
  }), {
17356
17366
  kind: "mutation",
17357
17367
  auth: "admin"
17368
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17369
+ results: array(object({
17370
+ rev: number().int().nullable(),
17371
+ deleted: boolean()
17372
+ })),
17373
+ releasedRefs: SecretRefsList,
17374
+ secretRefs: SecretRefsList
17375
+ }), {
17376
+ kind: "mutation",
17377
+ auth: "admin"
17358
17378
  }), method(object({
17359
17379
  deviceId: number().int(),
17360
17380
  kinds: array(RecordKindNameSchema).optional()
@@ -43205,9 +43225,13 @@ var NcSystemEventKindSchema = _enum([
43205
43225
  "node-updating",
43206
43226
  "node-inference-unavailable",
43207
43227
  "detection-blind",
43228
+ "motion-noisy",
43229
+ "motion-calm",
43208
43230
  "recording-stalled",
43209
43231
  "recording-healthy",
43210
43232
  "recording-degraded",
43233
+ "device-attention-required",
43234
+ "device-attention-resolved",
43211
43235
  "storage-location-low",
43212
43236
  "storage-location-critical",
43213
43237
  "storage-location-ok",
@@ -56646,6 +56670,16 @@ var DishwasherStatusSchema = object({
56646
56670
  powerState: string().nullable(),
56647
56671
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56648
56672
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56673
+ /**
56674
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56675
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56676
+ * when none is reported. A cleared reminder is not an unknown one.
56677
+ */
56678
+ filterCleaningDue: boolean().nullable(),
56679
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56680
+ machineCareDue: boolean().nullable(),
56681
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56682
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56649
56683
  /** Option states: null when the appliance does not expose the option or has not said. */
56650
56684
  halfLoad: boolean().nullable(),
56651
56685
  hygienePlus: boolean().nullable(),
@@ -65296,16 +65330,6 @@ var UpdateUserInputSchema = object({
65296
65330
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65297
65331
  scopes: array(TokenScopeSchema).optional()
65298
65332
  });
65299
- var ApiKeySummarySchema = object({
65300
- id: string(),
65301
- label: string(),
65302
- isAdmin: boolean().default(false),
65303
- allowedProviders: union([array(string()), literal("*")]).optional(),
65304
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65305
- tokenPrefix: string(),
65306
- createdAt: number(),
65307
- lastUsedAt: number().optional()
65308
- });
65309
65333
  var OauthSessionSummarySchema = object({
65310
65334
  id: string(),
65311
65335
  userId: string(),
@@ -65327,8 +65351,7 @@ var TotpStatusSchema = object({
65327
65351
  confirmedAt: number().nullable()
65328
65352
  });
65329
65353
  /**
65330
- * user-management — singleton capability for user accounts and the
65331
- * legacy API-key rows.
65354
+ * user-management — singleton capability for user accounts.
65332
65355
  *
65333
65356
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65334
65357
  * — the subset check on `setUserScopes` is moot
@@ -65384,10 +65407,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65384
65407
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65385
65408
  kind: "mutation",
65386
65409
  access: "view"
65387
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65388
- kind: "mutation",
65389
- auth: "admin",
65390
- access: "delete"
65391
65410
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65392
65411
  kind: "mutation",
65393
65412
  auth: "admin",
@@ -74843,6 +74862,12 @@ Object.freeze({
74843
74862
  addonId: null,
74844
74863
  access: "view"
74845
74864
  },
74865
+ "records.transact": {
74866
+ capName: "records",
74867
+ capScope: "system",
74868
+ addonId: null,
74869
+ access: "create"
74870
+ },
74846
74871
  "sceneMonitor.captureReference": {
74847
74872
  capName: "scene-monitor",
74848
74873
  capScope: "device",
@@ -76175,12 +76200,6 @@ Object.freeze({
76175
76200
  addonId: null,
76176
76201
  access: "view"
76177
76202
  },
76178
- "userManagement.listApiKeys": {
76179
- capName: "user-management",
76180
- capScope: "system",
76181
- addonId: null,
76182
- access: "view"
76183
- },
76184
76203
  "userManagement.listExternalIdentities": {
76185
76204
  capName: "user-management",
76186
76205
  capScope: "system",
@@ -76235,12 +76254,6 @@ Object.freeze({
76235
76254
  addonId: null,
76236
76255
  access: "create"
76237
76256
  },
76238
- "userManagement.revokeApiKey": {
76239
- capName: "user-management",
76240
- capScope: "system",
76241
- addonId: null,
76242
- access: "delete"
76243
- },
76244
76257
  "userManagement.revokeOauthSession": {
76245
76258
  capName: "user-management",
76246
76259
  capScope: "system",
@@ -79812,9 +79825,13 @@ new Map(Object.entries({
79812
79825
  "stream-online": "device-events",
79813
79826
  "stream-offline": "device-events",
79814
79827
  "detection-blind": "device-events",
79828
+ "motion-noisy": "device-events",
79829
+ "motion-calm": "device-events",
79815
79830
  "recording-stalled": "device-events",
79816
79831
  "recording-healthy": "device-events",
79817
79832
  "recording-degraded": "device-events",
79833
+ "device-attention-required": "device-events",
79834
+ "device-attention-resolved": "device-events",
79818
79835
  "node-online": "system",
79819
79836
  "node-offline": "system",
79820
79837
  "node-restarting": "system",
@@ -79897,6 +79914,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79897
79914
  label: "Detecting nothing",
79898
79915
  kinds: ["detection-blind"]
79899
79916
  },
79917
+ {
79918
+ id: "motion-noise",
79919
+ family: "device-events",
79920
+ label: "Motion without a subject",
79921
+ kinds: ["motion-noisy", "motion-calm"]
79922
+ },
79900
79923
  {
79901
79924
  id: "recording",
79902
79925
  family: "device-events",
@@ -79907,6 +79930,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79907
79930
  "recording-degraded"
79908
79931
  ]
79909
79932
  },
79933
+ {
79934
+ id: "device-attention",
79935
+ family: "device-events",
79936
+ label: "Needs attention",
79937
+ kinds: ["device-attention-required", "device-attention-resolved"]
79938
+ },
79910
79939
  {
79911
79940
  id: "nodes",
79912
79941
  family: "system",
@@ -80046,6 +80075,7 @@ var ALERT_EPISODE = [
80046
80075
  "alert-error",
80047
80076
  "alert-critical-resolved"
80048
80077
  ];
80078
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80049
80079
  var UPDATES = [
80050
80080
  "addon-update-available",
80051
80081
  "server-update-available",
@@ -80075,9 +80105,12 @@ var DEVICE_EVENTS = [
80075
80105
  "stream-online",
80076
80106
  "stream-offline",
80077
80107
  "detection-blind",
80108
+ "motion-noisy",
80109
+ "motion-calm",
80078
80110
  "recording-stalled",
80079
80111
  "recording-healthy",
80080
80112
  "recording-degraded",
80113
+ ...DEVICE_ATTENTION,
80081
80114
  ...ALARM
80082
80115
  ];
80083
80116
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80245,7 +80278,9 @@ var STATE_SUMMARY_VARS = [
80245
80278
  [...RULE_TEXT],
80246
80279
  [...RULE_TEXT],
80247
80280
  [...RULE_TEXT],
80248
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80281
+ [...RULE_TEXT],
80282
+ [...RULE_TEXT],
80283
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80249
80284
  [...RULE_TEXT],
80250
80285
  [...RULE_TEXT],
80251
80286
  [...RULE_TEXT],
@@ -80267,11 +80302,11 @@ var STATE_SUMMARY_VARS = [
80267
80302
  [...RULE_TEXT],
80268
80303
  [...RULE_TEXT],
80269
80304
  [...RULE_TEXT],
80305
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80270
80306
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80307
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80271
80308
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80272
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80273
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80274
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80309
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80275
80310
  [...RULE_TEXT],
80276
80311
  [...RULE_TEXT],
80277
80312
  [...RULE_TEXT],
@@ -80347,6 +80382,15 @@ new Map([
80347
80382
  snapshotLabel: "Tanks low or full now",
80348
80383
  snapshotSection: "tanks"
80349
80384
  },
80385
+ {
80386
+ id: "motion-noise",
80387
+ family: "device-events",
80388
+ label: "Motion without a subject (constant / calm again)",
80389
+ bad: ["motion-noisy"],
80390
+ recovery: ["motion-calm"],
80391
+ snapshotLabel: "Cameras with constant motion now",
80392
+ snapshotSection: null
80393
+ },
80350
80394
  {
80351
80395
  id: "recording-health",
80352
80396
  family: "device-events",
@@ -80356,6 +80400,15 @@ new Map([
80356
80400
  snapshotLabel: "Recordings stalled now",
80357
80401
  snapshotSection: null
80358
80402
  },
80403
+ {
80404
+ id: "device-attention",
80405
+ family: "device-events",
80406
+ label: "Device needs attention (raised / resolved)",
80407
+ bad: ["device-attention-required"],
80408
+ recovery: ["device-attention-resolved"],
80409
+ snapshotLabel: "Devices needing attention now",
80410
+ snapshotSection: null
80411
+ },
80359
80412
  {
80360
80413
  id: "node-connectivity",
80361
80414
  family: "system",
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-7pZEBmVg.mjs
1
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -315,6 +315,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
315
315
  */
316
316
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
317
317
  /**
318
+ * A camera's motion source has fired constantly with no subject for an hour
319
+ * (motion duty or session count over the bar, zero detections) — it is not
320
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
321
+ * {@link PipelineMotionCalm}.
322
+ */
323
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
324
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
325
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
326
+ /**
318
327
  * Per-camera pipeline config was mutated by the orchestrator
319
328
  * (3-level settings change via `setAgentAddonDefaults` /
320
329
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5554,7 +5563,7 @@ var ZodIssueCode = {
5554
5563
  var ZodFirstPartyTypeKind;
5555
5564
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5556
5565
  //#endregion
5557
- //#region ../types/dist/sleep-CueztlR1.mjs
5566
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5558
5567
  /**
5559
5568
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5560
5569
  * window to float samples (D455).
@@ -8153,7 +8162,7 @@ var EntryDescriptorSchema = object({
8153
8162
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8154
8163
  fields: record(string(), unknown())
8155
8164
  }).strict();
8156
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8165
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8157
8166
  var RecordKindDeclarationSchema = object({
8158
8167
  database: _enum(RECORD_DATABASES).default("settings"),
8159
8168
  class: _enum(RECORD_CLASSES),
@@ -8172,14 +8181,6 @@ var RecordKindDeclarationSchema = object({
8172
8181
  secretPaths: array(string().min(1)).default([]),
8173
8182
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8174
8183
  secretArrayKeys: record(string(), string()).default({}),
8175
- /**
8176
- * RETIRED (D900): the legacy table a kind adopted from during the records
8177
- * migration. Nothing declares it any more and nothing reads it; the schema
8178
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8179
- * (an orphaned kind is never redeclared) and an addon built before the
8180
- * removal still sends it. Never set it.
8181
- */
8182
- adoptsFrom: string().min(1).optional(),
8183
8184
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8184
8185
  transactFamily: string().min(1).optional(),
8185
8186
  entry: EntryDescriptorSchema.optional()
@@ -13178,17 +13179,6 @@ object({
13178
13179
  createdAt: number(),
13179
13180
  updatedAt: number()
13180
13181
  });
13181
- object({
13182
- id: string(),
13183
- label: string(),
13184
- isAdmin: boolean().default(false),
13185
- allowedProviders: AllowedProviderSchema,
13186
- allowedDevices: AllowedDevicesSchema,
13187
- tokenHash: string(),
13188
- tokenPrefix: string(),
13189
- createdAt: number(),
13190
- lastUsedAt: number().optional()
13191
- });
13192
13182
  object({
13193
13183
  id: string(),
13194
13184
  userId: string(),
@@ -17238,16 +17228,36 @@ var RecordKindStateSchema = _enum([
17238
17228
  var DeclareKindResultSchema = object({
17239
17229
  kindId: number().int(),
17240
17230
  state: RecordKindStateSchema,
17241
- createdIndexes: array(string()),
17242
- /**
17243
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
17244
- * it stays on the wire, null, because an addon built before the removal reads
17245
- * an ABSENT field as "adoption pending" and refuses to start.
17246
- */
17247
- adoptionPending: _null()
17231
+ createdIndexes: array(string())
17248
17232
  });
17249
17233
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
17250
17234
  var SecretRefsList = array(string());
17235
+ /**
17236
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
17237
+ * All ops of one call share ONE database file and ONE `transactFamily`.
17238
+ */
17239
+ var RecordTransactOpSchema = discriminatedUnion("op", [
17240
+ object({
17241
+ op: literal("put"),
17242
+ kind: RecordKindNameSchema,
17243
+ record: RecordInputSchema,
17244
+ ifRev: number().int().min(0).optional()
17245
+ }),
17246
+ object({
17247
+ op: literal("patch"),
17248
+ kind: RecordKindNameSchema,
17249
+ id: RecordIdSchema,
17250
+ data: RecordBodySchema,
17251
+ at: number().int().nullable().optional(),
17252
+ expiresAt: number().int().nullable().optional(),
17253
+ ifRev: number().int().min(1).optional()
17254
+ }),
17255
+ object({
17256
+ op: literal("delete"),
17257
+ kind: RecordKindNameSchema,
17258
+ id: RecordIdSchema
17259
+ })
17260
+ ]);
17251
17261
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
17252
17262
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
17253
17263
  kind: "mutation",
@@ -17354,6 +17364,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
17354
17364
  }), {
17355
17365
  kind: "mutation",
17356
17366
  auth: "admin"
17367
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17368
+ results: array(object({
17369
+ rev: number().int().nullable(),
17370
+ deleted: boolean()
17371
+ })),
17372
+ releasedRefs: SecretRefsList,
17373
+ secretRefs: SecretRefsList
17374
+ }), {
17375
+ kind: "mutation",
17376
+ auth: "admin"
17357
17377
  }), method(object({
17358
17378
  deviceId: number().int(),
17359
17379
  kinds: array(RecordKindNameSchema).optional()
@@ -43204,9 +43224,13 @@ var NcSystemEventKindSchema = _enum([
43204
43224
  "node-updating",
43205
43225
  "node-inference-unavailable",
43206
43226
  "detection-blind",
43227
+ "motion-noisy",
43228
+ "motion-calm",
43207
43229
  "recording-stalled",
43208
43230
  "recording-healthy",
43209
43231
  "recording-degraded",
43232
+ "device-attention-required",
43233
+ "device-attention-resolved",
43210
43234
  "storage-location-low",
43211
43235
  "storage-location-critical",
43212
43236
  "storage-location-ok",
@@ -56645,6 +56669,16 @@ var DishwasherStatusSchema = object({
56645
56669
  powerState: string().nullable(),
56646
56670
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
56647
56671
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56672
+ /**
56673
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56674
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
56675
+ * when none is reported. A cleared reminder is not an unknown one.
56676
+ */
56677
+ filterCleaningDue: boolean().nullable(),
56678
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
56679
+ machineCareDue: boolean().nullable(),
56680
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
56681
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
56648
56682
  /** Option states: null when the appliance does not expose the option or has not said. */
56649
56683
  halfLoad: boolean().nullable(),
56650
56684
  hygienePlus: boolean().nullable(),
@@ -65295,16 +65329,6 @@ var UpdateUserInputSchema = object({
65295
65329
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65296
65330
  scopes: array(TokenScopeSchema).optional()
65297
65331
  });
65298
- var ApiKeySummarySchema = object({
65299
- id: string(),
65300
- label: string(),
65301
- isAdmin: boolean().default(false),
65302
- allowedProviders: union([array(string()), literal("*")]).optional(),
65303
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
65304
- tokenPrefix: string(),
65305
- createdAt: number(),
65306
- lastUsedAt: number().optional()
65307
- });
65308
65332
  var OauthSessionSummarySchema = object({
65309
65333
  id: string(),
65310
65334
  userId: string(),
@@ -65326,8 +65350,7 @@ var TotpStatusSchema = object({
65326
65350
  confirmedAt: number().nullable()
65327
65351
  });
65328
65352
  /**
65329
- * user-management — singleton capability for user accounts and the
65330
- * legacy API-key rows.
65353
+ * user-management — singleton capability for user accounts.
65331
65354
  *
65332
65355
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
65333
65356
  * — the subset check on `setUserScopes` is moot
@@ -65383,10 +65406,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65383
65406
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
65384
65407
  kind: "mutation",
65385
65408
  access: "view"
65386
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
65387
- kind: "mutation",
65388
- auth: "admin",
65389
- access: "delete"
65390
65409
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
65391
65410
  kind: "mutation",
65392
65411
  auth: "admin",
@@ -74842,6 +74861,12 @@ Object.freeze({
74842
74861
  addonId: null,
74843
74862
  access: "view"
74844
74863
  },
74864
+ "records.transact": {
74865
+ capName: "records",
74866
+ capScope: "system",
74867
+ addonId: null,
74868
+ access: "create"
74869
+ },
74845
74870
  "sceneMonitor.captureReference": {
74846
74871
  capName: "scene-monitor",
74847
74872
  capScope: "device",
@@ -76174,12 +76199,6 @@ Object.freeze({
76174
76199
  addonId: null,
76175
76200
  access: "view"
76176
76201
  },
76177
- "userManagement.listApiKeys": {
76178
- capName: "user-management",
76179
- capScope: "system",
76180
- addonId: null,
76181
- access: "view"
76182
- },
76183
76202
  "userManagement.listExternalIdentities": {
76184
76203
  capName: "user-management",
76185
76204
  capScope: "system",
@@ -76234,12 +76253,6 @@ Object.freeze({
76234
76253
  addonId: null,
76235
76254
  access: "create"
76236
76255
  },
76237
- "userManagement.revokeApiKey": {
76238
- capName: "user-management",
76239
- capScope: "system",
76240
- addonId: null,
76241
- access: "delete"
76242
- },
76243
76256
  "userManagement.revokeOauthSession": {
76244
76257
  capName: "user-management",
76245
76258
  capScope: "system",
@@ -79811,9 +79824,13 @@ new Map(Object.entries({
79811
79824
  "stream-online": "device-events",
79812
79825
  "stream-offline": "device-events",
79813
79826
  "detection-blind": "device-events",
79827
+ "motion-noisy": "device-events",
79828
+ "motion-calm": "device-events",
79814
79829
  "recording-stalled": "device-events",
79815
79830
  "recording-healthy": "device-events",
79816
79831
  "recording-degraded": "device-events",
79832
+ "device-attention-required": "device-events",
79833
+ "device-attention-resolved": "device-events",
79817
79834
  "node-online": "system",
79818
79835
  "node-offline": "system",
79819
79836
  "node-restarting": "system",
@@ -79896,6 +79913,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79896
79913
  label: "Detecting nothing",
79897
79914
  kinds: ["detection-blind"]
79898
79915
  },
79916
+ {
79917
+ id: "motion-noise",
79918
+ family: "device-events",
79919
+ label: "Motion without a subject",
79920
+ kinds: ["motion-noisy", "motion-calm"]
79921
+ },
79899
79922
  {
79900
79923
  id: "recording",
79901
79924
  family: "device-events",
@@ -79906,6 +79929,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79906
79929
  "recording-degraded"
79907
79930
  ]
79908
79931
  },
79932
+ {
79933
+ id: "device-attention",
79934
+ family: "device-events",
79935
+ label: "Needs attention",
79936
+ kinds: ["device-attention-required", "device-attention-resolved"]
79937
+ },
79909
79938
  {
79910
79939
  id: "nodes",
79911
79940
  family: "system",
@@ -80045,6 +80074,7 @@ var ALERT_EPISODE = [
80045
80074
  "alert-error",
80046
80075
  "alert-critical-resolved"
80047
80076
  ];
80077
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
80048
80078
  var UPDATES = [
80049
80079
  "addon-update-available",
80050
80080
  "server-update-available",
@@ -80074,9 +80104,12 @@ var DEVICE_EVENTS = [
80074
80104
  "stream-online",
80075
80105
  "stream-offline",
80076
80106
  "detection-blind",
80107
+ "motion-noisy",
80108
+ "motion-calm",
80077
80109
  "recording-stalled",
80078
80110
  "recording-healthy",
80079
80111
  "recording-degraded",
80112
+ ...DEVICE_ATTENTION,
80080
80113
  ...ALARM
80081
80114
  ];
80082
80115
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -80244,7 +80277,9 @@ var STATE_SUMMARY_VARS = [
80244
80277
  [...RULE_TEXT],
80245
80278
  [...RULE_TEXT],
80246
80279
  [...RULE_TEXT],
80247
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80280
+ [...RULE_TEXT],
80281
+ [...RULE_TEXT],
80282
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80248
80283
  [...RULE_TEXT],
80249
80284
  [...RULE_TEXT],
80250
80285
  [...RULE_TEXT],
@@ -80266,11 +80301,11 @@ var STATE_SUMMARY_VARS = [
80266
80301
  [...RULE_TEXT],
80267
80302
  [...RULE_TEXT],
80268
80303
  [...RULE_TEXT],
80304
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80269
80305
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80306
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80270
80307
  ([...RULE_TEXT], [...ALERT_EPISODE]),
80271
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80272
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80273
- ([...RULE_TEXT], [...ALERT_EPISODE]),
80308
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
80274
80309
  [...RULE_TEXT],
80275
80310
  [...RULE_TEXT],
80276
80311
  [...RULE_TEXT],
@@ -80346,6 +80381,15 @@ new Map([
80346
80381
  snapshotLabel: "Tanks low or full now",
80347
80382
  snapshotSection: "tanks"
80348
80383
  },
80384
+ {
80385
+ id: "motion-noise",
80386
+ family: "device-events",
80387
+ label: "Motion without a subject (constant / calm again)",
80388
+ bad: ["motion-noisy"],
80389
+ recovery: ["motion-calm"],
80390
+ snapshotLabel: "Cameras with constant motion now",
80391
+ snapshotSection: null
80392
+ },
80349
80393
  {
80350
80394
  id: "recording-health",
80351
80395
  family: "device-events",
@@ -80355,6 +80399,15 @@ new Map([
80355
80399
  snapshotLabel: "Recordings stalled now",
80356
80400
  snapshotSection: null
80357
80401
  },
80402
+ {
80403
+ id: "device-attention",
80404
+ family: "device-events",
80405
+ label: "Device needs attention (raised / resolved)",
80406
+ bad: ["device-attention-required"],
80407
+ recovery: ["device-attention-resolved"],
80408
+ snapshotLabel: "Devices needing attention now",
80409
+ snapshotSection: null
80410
+ },
80358
80411
  {
80359
80412
  id: "node-connectivity",
80360
80413
  family: "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-DMbVsggA.js");
27
+ const require_dist = require("../dist-CfZUXrNa.js");
28
28
  let node_crypto = require("node:crypto");
29
29
  require("node:zlib");
30
30
  let node_fs = require("node:fs");
@@ -8455,7 +8455,6 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8455
8455
  type: "boolean",
8456
8456
  key: `exportTo:${broker.id}`,
8457
8457
  label: broker.name,
8458
- description: `Push entities to this Home Assistant instance (${broker.id}).`,
8459
8458
  style: "switch",
8460
8459
  default: false
8461
8460
  }));
@@ -8464,7 +8463,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8464
8463
  id: "ha-export-brokers",
8465
8464
  title: "Home Assistant instances",
8466
8465
  titleKey: "provider-homeassistant:globalSettings.s_ha-export-brokers.title",
8467
- description: brokerFields.length > 0 ? "One switch per Home Assistant broker. An instance that is off receives nothing; the devices exported to it are remembered and resume when it is turned back on." : "No Home Assistant broker is registered yet. Add one under External systems → Brokers and it will appear here.",
8466
+ description: brokerFields.length > 0 ? "An instance that is off receives nothing; its exported devices resume when it is turned back on." : "No Home Assistant broker is registered yet.",
8468
8467
  columns: 1,
8469
8468
  fields: brokerFields.length > 0 ? brokerFields : [{
8470
8469
  type: "info",
@@ -8485,7 +8484,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8485
8484
  key: "publicBaseUrl",
8486
8485
  label: "Hub URL Home Assistant can reach",
8487
8486
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.label",
8488
- description: "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
8487
+ description: "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
8489
8488
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.description",
8490
8489
  default: ""
8491
8490
  }]
@@ -8502,7 +8501,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8502
8501
  key: "reconcileIntervalSec",
8503
8502
  label: "Reconcile interval (s)",
8504
8503
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.label",
8505
- description: "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
8504
+ description: "Full re-announce and re-push cadence.",
8506
8505
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.description",
8507
8506
  default: DEFAULT_CONFIG.reconcileIntervalSec
8508
8507
  }]
@@ -8526,7 +8525,6 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8526
8525
  type: "boolean",
8527
8526
  key: `haExport:${deviceId}:${brokerId}`,
8528
8527
  label: `Export to ${this.brokerName(brokerId)}`,
8529
- description: "Entities for this device are pushed to that Home Assistant instance.",
8530
8528
  style: "switch",
8531
8529
  value: isExposed(this.config.membership, brokerId, idStr),
8532
8530
  immediate: true
@@ -8542,7 +8540,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
8542
8540
  id: "ha-export",
8543
8541
  title: "Home Assistant",
8544
8542
  titleKey: "provider-homeassistant:contribution.s_ha-export.title",
8545
- description: enabled.length > 0 ? "Each Home Assistant instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export. Turn one on in the Home Assistant Export addon settings.",
8543
+ description: enabled.length > 0 ? "Each instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export.",
8546
8544
  tab: "export",
8547
8545
  columns: 1,
8548
8546
  order: 30,
@@ -1,4 +1,4 @@
1
- import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Et as nodePin, Ft as string, I as deviceExportCapability, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, zt as EventCategory } from "../dist-BQjwQmdj.mjs";
1
+ import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Et as nodePin, Ft as string, I as deviceExportCapability, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema, zt as EventCategory } from "../dist-D6huwmAr.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  import "node:zlib";
4
4
  import "node:fs";
@@ -8427,7 +8427,6 @@ var HaExportAddon = class extends BaseAddon {
8427
8427
  type: "boolean",
8428
8428
  key: `exportTo:${broker.id}`,
8429
8429
  label: broker.name,
8430
- description: `Push entities to this Home Assistant instance (${broker.id}).`,
8431
8430
  style: "switch",
8432
8431
  default: false
8433
8432
  }));
@@ -8436,7 +8435,7 @@ var HaExportAddon = class extends BaseAddon {
8436
8435
  id: "ha-export-brokers",
8437
8436
  title: "Home Assistant instances",
8438
8437
  titleKey: "provider-homeassistant:globalSettings.s_ha-export-brokers.title",
8439
- description: brokerFields.length > 0 ? "One switch per Home Assistant broker. An instance that is off receives nothing; the devices exported to it are remembered and resume when it is turned back on." : "No Home Assistant broker is registered yet. Add one under External systems → Brokers and it will appear here.",
8438
+ description: brokerFields.length > 0 ? "An instance that is off receives nothing; its exported devices resume when it is turned back on." : "No Home Assistant broker is registered yet.",
8440
8439
  columns: 1,
8441
8440
  fields: brokerFields.length > 0 ? brokerFields : [{
8442
8441
  type: "info",
@@ -8457,7 +8456,7 @@ var HaExportAddon = class extends BaseAddon {
8457
8456
  key: "publicBaseUrl",
8458
8457
  label: "Hub URL Home Assistant can reach",
8459
8458
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.label",
8460
- description: "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
8459
+ description: "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
8461
8460
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-transport.publicBaseUrl.description",
8462
8461
  default: ""
8463
8462
  }]
@@ -8474,7 +8473,7 @@ var HaExportAddon = class extends BaseAddon {
8474
8473
  key: "reconcileIntervalSec",
8475
8474
  label: "Reconcile interval (s)",
8476
8475
  labelKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.label",
8477
- description: "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
8476
+ description: "Full re-announce and re-push cadence.",
8478
8477
  descriptionKey: "provider-homeassistant:globalSettings.s_ha-export-advanced.reconcileIntervalSec.description",
8479
8478
  default: DEFAULT_CONFIG.reconcileIntervalSec
8480
8479
  }]
@@ -8498,7 +8497,6 @@ var HaExportAddon = class extends BaseAddon {
8498
8497
  type: "boolean",
8499
8498
  key: `haExport:${deviceId}:${brokerId}`,
8500
8499
  label: `Export to ${this.brokerName(brokerId)}`,
8501
- description: "Entities for this device are pushed to that Home Assistant instance.",
8502
8500
  style: "switch",
8503
8501
  value: isExposed(this.config.membership, brokerId, idStr),
8504
8502
  immediate: true
@@ -8514,7 +8512,7 @@ var HaExportAddon = class extends BaseAddon {
8514
8512
  id: "ha-export",
8515
8513
  title: "Home Assistant",
8516
8514
  titleKey: "provider-homeassistant:contribution.s_ha-export.title",
8517
- description: enabled.length > 0 ? "Each Home Assistant instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export. Turn one on in the Home Assistant Export addon settings.",
8515
+ description: enabled.length > 0 ? "Each instance receives only the devices switched on for it." : "No Home Assistant instance is enabled for export.",
8518
8516
  tab: "export",
8519
8517
  columns: 1,
8520
8518
  order: 30,
package/i18n/en.json CHANGED
@@ -1,10 +1,8 @@
1
1
  {
2
2
  "globalSettings.s_ha-calendars-import.title": "Calendars to import",
3
- "globalSettings.s_ha-calendars-import.description": "Pick which Home Assistant calendar entities feed System → Calendars. Nothing selected = no calendars imported.",
4
3
  "globalSettings.s_ha-calendars-import.calendarIds.label": "Calendars",
5
4
  "globalSettings.s_ha-calendars-import.calendarIds.description": "Discovered from connected HA brokers. Select at least one to import; leave empty to import none.",
6
5
  "globalSettings.s_ha-broker.title": "Home Assistant broker",
7
- "globalSettings.s_ha-broker.description": "Home Assistant brokers are managed in Connectivity → Brokers.",
8
6
  "globalSettings.s_ha-broker.brokerHelp.label": "Brokers are managed separately",
9
7
  "haBrokerSettings.s_ha-broker-credentials.title": "Home Assistant connection",
10
8
  "haBrokerSettings.s_ha-broker-credentials.authKind.label": "Auth mode",
@@ -17,14 +15,14 @@
17
15
  "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "No brokers",
18
16
  "globalSettings.s_ha-export-transport.title": "Connection",
19
17
  "globalSettings.s_ha-export-transport.publicBaseUrl.label": "Hub URL Home Assistant can reach",
20
- "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Used to build the signed image links Home Assistant fetches. Leave empty to derive one from the network capabilities; a link that cannot be built is never sent.",
18
+ "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Used for the signed image links Home Assistant fetches; leave empty to derive one automatically.",
21
19
  "globalSettings.s_ha-export-advanced.title": "Advanced",
22
20
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Reconcile interval (s)",
23
- "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Full re-announce and re-push cadence. Bus events are telemetry and may be dropped; this is the contract.",
21
+ "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Full re-announce and re-push cadence.",
24
22
  "contribution.s_ha-export.title": "Home Assistant",
25
23
  "haConfig.s_connection.title": "Home Assistant notify",
26
24
  "haConfig.s_connection.service.label": "Notify service",
27
- "haConfig.s_connection.service.description": "The Home Assistant notify service to call — the part after `notify.` (e.g. `mobile_app_pixel_7`). Use Discover to list available services.",
25
+ "haConfig.s_connection.service.description": "The part after `notify.` (e.g. `mobile_app_pixel_7`); use Discover to list them.",
28
26
  "haConfig.s_connection.brokerId.label": "Broker",
29
- "haConfig.s_connection.brokerId.description": "Optional — the Home Assistant broker id to route through. Leave blank to use the only configured broker."
27
+ "haConfig.s_connection.brokerId.description": "Optional; blank uses the only configured broker."
30
28
  }
package/i18n/it.json CHANGED
@@ -1,10 +1,8 @@
1
1
  {
2
2
  "globalSettings.s_ha-calendars-import.title": "Calendari da importare",
3
- "globalSettings.s_ha-calendars-import.description": "Scegli quali entità calendario di Home Assistant alimentano Sistema → Calendari. Nessuna selezione = nessun calendario importato.",
4
3
  "globalSettings.s_ha-calendars-import.calendarIds.label": "Calendari",
5
4
  "globalSettings.s_ha-calendars-import.calendarIds.description": "Rilevati dai broker HA collegati. Seleziona almeno un calendario da importare; lascia vuoto per non importarne nessuno.",
6
5
  "globalSettings.s_ha-broker.title": "Broker Home Assistant",
7
- "globalSettings.s_ha-broker.description": "I broker Home Assistant si gestiscono in Connettività → Broker.",
8
6
  "globalSettings.s_ha-broker.brokerHelp.label": "I broker si gestiscono separatamente",
9
7
  "haBrokerSettings.s_ha-broker-credentials.title": "Connessione a Home Assistant",
10
8
  "haBrokerSettings.s_ha-broker-credentials.authKind.label": "Modalità di autenticazione",
@@ -17,14 +15,14 @@
17
15
  "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "Nessun broker",
18
16
  "globalSettings.s_ha-export-transport.title": "Connessione",
19
17
  "globalSettings.s_ha-export-transport.publicBaseUrl.label": "URL dell'hub raggiungibile da Home Assistant",
20
- "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Serve a costruire i link firmati alle immagini che Home Assistant scarica. Lascia vuoto per ricavarlo dalle capacità di rete; un link che non si può costruire non viene mai inviato.",
18
+ "globalSettings.s_ha-export-transport.publicBaseUrl.description": "Usato per i link firmati delle immagini che Home Assistant scarica; lascia vuoto per ricavarlo automaticamente.",
21
19
  "globalSettings.s_ha-export-advanced.title": "Avanzate",
22
20
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Intervallo di riconciliazione (s)",
23
- "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Frequenza di ripubblicazione completa e di nuovo invio. Gli eventi del bus sono telemetria e possono andare persi: questo è il contratto.",
21
+ "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Cadenza di ri-annuncio e ri-invio completo.",
24
22
  "contribution.s_ha-export.title": "Home Assistant",
25
23
  "haConfig.s_connection.title": "Notifica Home Assistant",
26
24
  "haConfig.s_connection.service.label": "Servizio di notifica",
27
- "haConfig.s_connection.service.description": "Il servizio di notifica di Home Assistant da chiamare: la parte dopo `notify.` (ad es. `mobile_app_pixel_7`). Usa Rileva per elencare i servizi disponibili.",
25
+ "haConfig.s_connection.service.description": "La parte dopo `notify.` (es. `mobile_app_pixel_7`); usa Discover per elencarli.",
28
26
  "haConfig.s_connection.brokerId.label": "Broker",
29
- "haConfig.s_connection.brokerId.description": "Facoltativo: l'id del broker Home Assistant da cui passare. Lascia vuoto per usare l'unico broker configurato."
27
+ "haConfig.s_connection.brokerId.description": "Facoltativo; se vuoto usa l'unico broker configurato."
30
28
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.616",
3
+ "version": "1.2.617",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",