@camstack/addon-provider-homeassistant 1.2.646 → 1.2.648

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.648] - 2026-11-02
11
+
12
+ ### Changed
13
+
14
+ - Home Assistant export: the Hub URL setting is gone; each Home Assistant instance now chooses whether its image links use the Internal address or the Public endpoint of the Network page.
15
+
16
+ ## [1.2.647] - 2026-11-02
17
+
18
+ ### Changed
19
+
20
+ - The new do-not-disturb capability is recorded as not exported to Home Assistant
21
+
10
22
  ## [1.2.646] - 2026-11-01
11
23
 
12
24
  ### Changed
package/README.md CHANGED
@@ -23,7 +23,7 @@ Edit these from System, Addons, this addon, Settings (a device's own settings ar
23
23
  - Home Assistant broker: Brokers are managed separately
24
24
  - Home Assistant connection: Auth mode, HA base URL, Long-lived access token, Supervisor token
25
25
  - Home Assistant instances: No brokers
26
- - Connection: Hub URL Home Assistant can reach
26
+ - Connection: per Home Assistant instance, the hub address role its image links use (Internal, or Public endpoint)
27
27
  - Advanced: Reconcile interval (s)
28
28
 
29
29
  ## Requirements
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_ha_broker_source = require("./ha-broker-source-gQYTcasw.js");
2
+ const require_ha_broker_source = require("./ha-broker-source-Ba20mhmb.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
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as humiditySensorCapability, $t as number, A as brokerCapability, At as temperatureSensorCapability, Bt as RecordSecretUnavailableError, C as alarmPanelCapability, Ct as runningFromVacuumState, D as bestLocationMatch, Dt as smokeCapability, E as batteryCapability, F as carbonMonoxideCapability, Ft as valveCapability, G as deviceAdoptionCapability, Gt as entryBody, H as controlCapability, Ht as createEvent, I as climateControlCapability, It as vibrationCapability, J as eventEmitterCapability, Jt as _enum, L as colorCapability, Lt as waterHeaterCapability, M as buildDeviceAdminUrl, Mt as tryConvertUnit, N as buttonCapability, Nt as updateCapability, O as binaryCapability, Ot as switchCapability, P as calendarSourceCapability, Pt as vacuumControlCapability, Q as humidifierCapability, Qt as literal, R as connectivityCapability, Rt as weatherCapability, S as airQualitySensorCapability, St as runningFromMediaPlayer, T as automationControlCapability, Tt as scriptRunnerCapability, U as coverCapability, Ut as defineEntryKind, V as contactCapability, Vt as baseUnitOf, W as deviceAdminLinkCapability, Wt as defineRecordKinds, X as floodCapability, Xt as boolean, Y as fanControlCapability, Yt as array, Z as gasCapability, Zt as discriminatedUnion, _t as publicEndpointReaderFrom, a as BaseDevice, an as url, at as motionCapability, b as accessoriesCapability, cn as DeviceType, ct as notifierCapability, dt as parseAdminBase, en as object, et as imageCapability, ft as powerMeterCapability, ht as pressureSensorCapability, in as unknown, it as mediaPlayerCapability, j as buildAddonRouteProvider, jt as tryConvertDelta, k as brightnessCapability, kt as tamperCapability, ln as errMsg, lt as numericSensorCapability, mt as presenceCapability, nn as string, nt as lawnMowerControlCapability, o as BaseDeviceProvider, on as DeviceFeature, ot as normalizeUnit, p as EnumSensorDateTimeFormatSchema, pt as prepareNotification, q as enumSensorCapability, rn as union, rt as lockControlCapability, sn as DeviceRole, st as notificationOutputCapability, t as HA_BROKER_KIND, tn as record, tt as ingestReading, un as EventCategory, v as RUNNING_STATE_COLD, vt as quantityFromUnit, w as ambientLightSensorCapability, wt as runningStateCapability, x as addonRoutesCapability, xt as runningFromLawnMower, y as TargetSchema, yt as resolveAttachmentUrls } from "./ha-broker-source-DRIYmtMd.mjs";
1
+ import { $ as humiditySensorCapability, $t as discriminatedUnion, A as brokerCapability, At as tamperCapability, C as alarmPanelCapability, Ct as runningFromMediaPlayer, D as bestLocationMatch, E as batteryCapability, Et as scriptRunnerCapability, F as carbonMonoxideCapability, Ft as vacuumControlCapability, G as deviceAdoptionCapability, Gt as defineEntryKind, H as controlCapability, Ht as baseUnitOf, I as climateControlCapability, It as valveCapability, J as eventEmitterCapability, Kt as defineRecordKinds, L as colorCapability, Lt as vibrationCapability, M as buildDeviceAdminUrl, Mt as tryConvertDelta, N as buttonCapability, Nt as tryConvertUnit, O as binaryCapability, Ot as smokeCapability, P as calendarSourceCapability, Pt as updateCapability, Q as humidifierCapability, Qt as boolean, R as connectivityCapability, Rt as waterHeaterCapability, S as airQualitySensorCapability, St as runningFromLawnMower, T as automationControlCapability, Tt as runningStateCapability, U as coverCapability, Ut as createEvent, V as contactCapability, Vt as RecordSecretUnavailableError, W as deviceAdminLinkCapability, X as floodCapability, Xt as _enum, Y as fanControlCapability, Z as gasCapability, Zt as array, a as BaseDevice, an as union, at as motionCapability, b as accessoriesCapability, bt as resolveAttachmentUrls, cn as DeviceFeature, ct as notifierCapability, dn as errMsg, dt as parseAdminBase, en as literal, et as imageCapability, fn as EventCategory, ft as powerMeterCapability, gt as pressureSensorCapability, ht as presenceCapability, in as string, it as mediaPlayerCapability, j as buildAddonRouteProvider, jt as temperatureSensorCapability, k as brightnessCapability, kt as switchCapability, ln as DeviceRole, lt as numericSensorCapability, mt as prepareNotification, nn as object, nt as lawnMowerControlCapability, o as BaseDeviceProvider, on as unknown, ot as normalizeUnit, p as EnumSensorDateTimeFormatSchema, q as enumSensorCapability, qt as entryBody, rn as record, rt as lockControlCapability, sn as url, st as notificationOutputCapability, t as HA_BROKER_KIND, tn as number, tt as ingestReading, un as DeviceType, v as RUNNING_STATE_COLD, vt as publicEndpointReaderFrom, w as ambientLightSensorCapability, wt as runningFromVacuumState, x as addonRoutesCapability, y as TargetSchema, yt as quantityFromUnit, zt as weatherCapability } from "./ha-broker-source-iLA_DsW8.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
@@ -5972,7 +5972,7 @@ var ZodIssueCode = {
5972
5972
  var ZodFirstPartyTypeKind;
5973
5973
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5974
5974
  //#endregion
5975
- //#region ../types/dist/sleep-_4vKNWxb.mjs
5975
+ //#region ../types/dist/sleep-Bei295Bz.mjs
5976
5976
  /**
5977
5977
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5978
5978
  * window to float samples (D455).
@@ -6488,6 +6488,53 @@ function emitReadiness(bus, params) {
6488
6488
  ts
6489
6489
  }));
6490
6490
  }
6491
+ /** Why a catalogue entry is not a runnable body of its declared kind. */
6492
+ var AddonMigrationDefinitionError = class extends Error {
6493
+ id;
6494
+ constructor(id, message) {
6495
+ super(`${id}: ${message}`);
6496
+ this.id = id;
6497
+ this.name = "AddonMigrationDefinitionError";
6498
+ }
6499
+ };
6500
+ /**
6501
+ * Bind a catalogue to the addon's ports. Throws {@link AddonMigrationDefinitionError} when
6502
+ * an entry's `bodyKind` does not match the body it carries, or is `sql` (a hub-only
6503
+ * body). A throwing body never escapes `execute`: it is reported as a failed result.
6504
+ */
6505
+ function defineAddonMigrations(catalogue, ports) {
6506
+ return catalogue.map((entry) => {
6507
+ const { meta } = entry;
6508
+ if ("plan" in entry) {
6509
+ if (meta.bodyKind !== "plan") throw new AddonMigrationDefinitionError(meta.id, `carries a plan body but declares "${meta.bodyKind}"`);
6510
+ return {
6511
+ meta,
6512
+ execute: () => guarded(async () => ({
6513
+ kind: "plan",
6514
+ plan: await entry.plan(ports)
6515
+ }))
6516
+ };
6517
+ }
6518
+ if (meta.bodyKind !== "procedure") throw new AddonMigrationDefinitionError(meta.id, `carries a procedure body but declares "${meta.bodyKind}"`);
6519
+ return {
6520
+ meta,
6521
+ execute: () => guarded(async () => ({
6522
+ kind: "procedure",
6523
+ result: await entry.procedure(ports)
6524
+ }))
6525
+ };
6526
+ });
6527
+ }
6528
+ async function guarded(work) {
6529
+ try {
6530
+ return await work();
6531
+ } catch (err) {
6532
+ return {
6533
+ kind: "failed",
6534
+ error: errMsg(err)
6535
+ };
6536
+ }
6537
+ }
6491
6538
  var NOT_RUN = {
6492
6539
  declared: false,
6493
6540
  snapshot: null,
@@ -9718,6 +9765,7 @@ var CAP_NAMES = Object.freeze([
9718
9765
  "device-status",
9719
9766
  "dishwasher",
9720
9767
  "display-palette",
9768
+ "do-not-disturb",
9721
9769
  "doorbell",
9722
9770
  "embedding-encoder",
9723
9771
  "enum-sensor",
@@ -10477,6 +10525,10 @@ Object.freeze({
10477
10525
  "valueType": "string"
10478
10526
  }
10479
10527
  ],
10528
+ "do-not-disturb": [{
10529
+ "path": "enabled",
10530
+ "valueType": "boolean"
10531
+ }],
10480
10532
  "doorbell": [{
10481
10533
  "path": "lastPressedAt",
10482
10534
  "valueType": "number"
@@ -14119,6 +14171,16 @@ var MigrationPlanSchema = object({ edits: array(discriminatedUnion("op", [
14119
14171
  precondition: PreconditionSchema
14120
14172
  })
14121
14173
  ])) });
14174
+ /** `JSON.stringify` with object keys sorted, so equal values spell the same. */
14175
+ function canonicalJson(value) {
14176
+ if (Array.isArray(value)) return `[${value.map((item) => canonicalJson(item)).join(",")}]`;
14177
+ if (typeof value === "object" && value !== null) return `{${Object.entries(value).filter(([, item]) => item !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`).join(",")}}`;
14178
+ return JSON.stringify(value) ?? "null";
14179
+ }
14180
+ /** The precondition string for a value a plan read (`null` when it read nothing). */
14181
+ function preconditionOf(value) {
14182
+ return canonicalJson(value ?? null);
14183
+ }
14122
14184
  /**
14123
14185
  * What a `procedure` body reports. `already-done` means the rerun observed the
14124
14186
  * work finished (a crash between the work and the ledger row, or a manual fix)
@@ -16067,8 +16129,18 @@ var LogChannelDescriptorSchema = object({
16067
16129
  * the operator narrows to one camera, sees nothing, and concludes the code
16068
16130
  * path was never taken.
16069
16131
  */
16070
- perDevice: boolean()
16071
- });
16132
+ perDevice: boolean(),
16133
+ /**
16134
+ * What the channel is FOR, so the UI can list the channels an addon offers.
16135
+ *
16136
+ * - `diagnostic` (the default): a per-component diagnostic armed from the
16137
+ * Levels page, emitted at its declared level.
16138
+ * - `debug`: a `debug.<channel>` dump watched live for a short window
16139
+ * (`ctx.debug`). Always per-device, and its lines are denied by the log
16140
+ * ring unless somebody is watching that device.
16141
+ */
16142
+ kind: _enum(["diagnostic", "debug"]).default("diagnostic")
16143
+ }).refine((d) => d.kind !== "debug" || d.name.startsWith("debug.") && d.perDevice, { message: "a debug channel is named debug.<channel> and is per-device" });
16072
16144
  /**
16073
16145
  * An armed window over one channel, as the document hands it to a mirror.
16074
16146
  *
@@ -20043,6 +20115,33 @@ var APPLIANCE_CAP_VOCABULARY = {
20043
20115
  }
20044
20116
  ]
20045
20117
  },
20118
+ "do-not-disturb": {
20119
+ scope: "device",
20120
+ noun: t("Do not disturb", "Non disturbare"),
20121
+ actions: [{
20122
+ id: "dnd.on",
20123
+ method: "setEnabled",
20124
+ label: t("Do not disturb on", "Attiva Non disturbare"),
20125
+ phrase: t("Turn on Do not disturb on {device}", "Attiva Non disturbare su {device}"),
20126
+ icon: "bell-off",
20127
+ args: { enabled: true }
20128
+ }, {
20129
+ id: "dnd.off",
20130
+ method: "setEnabled",
20131
+ label: t("Do not disturb off", "Disattiva Non disturbare"),
20132
+ phrase: t("Turn off Do not disturb on {device}", "Disattiva Non disturbare su {device}"),
20133
+ icon: "bell",
20134
+ args: { enabled: false }
20135
+ }],
20136
+ state: [{
20137
+ kind: "boolean",
20138
+ field: "enabled",
20139
+ label: t("Do not disturb", "Non disturbare"),
20140
+ whenTrue: t("When Do not disturb turns on on {device}", "Quando {device} attiva Non disturbare"),
20141
+ whenFalse: t("When Do not disturb turns off on {device}", "Quando {device} disattiva Non disturbare"),
20142
+ icon: "bell-off"
20143
+ }]
20144
+ },
20046
20145
  update: {
20047
20146
  scope: "device",
20048
20147
  noun: t("Firmware update", "Aggiornamento firmware"),
@@ -42253,14 +42352,16 @@ var DeviceIsLeafSchema = object({
42253
42352
  });
42254
42353
  /**
42255
42354
  * True when the camera currently has a PARKED object matching `subjects` in at
42256
- * least one of `zones`. Reads the zone-analytics snapshot through the same
42355
+ * least one of `zones` (`minCount` of them, default one). Reads the zone-analytics snapshot through the same
42257
42356
  * mirror as every other state leaf, so a dropped event never decides it (D49).
42258
42357
  */
42259
42358
  var StationaryPresentLeafSchema = object({
42260
42359
  kind: literal("stationary-present"),
42261
42360
  deviceId: number().int().nonnegative(),
42262
42361
  subjects: array(StationarySubjectSchema).min(1).optional(),
42263
- zones: array(string().min(1)).min(1).optional()
42362
+ zones: array(string().min(1)).min(1).optional(),
42363
+ /** How many matching parked objects must be there; absent means one. */
42364
+ minCount: number().int().positive().optional()
42264
42365
  });
42265
42366
  /**
42266
42367
  * The escape hatch: the bounded expression engine over named device bindings.
@@ -42772,6 +42873,28 @@ function convertLegacyRecipe(legacy) {
42772
42873
  * it. The output type is always the new one.
42773
42874
  */
42774
42875
  var AutomationRecipeSchema = union([CurrentAutomationRecipeSchema, LegacyAutomationRecipeSchema.transform(convertLegacyRecipe)]);
42876
+ var DETECTION_DESCRIPTIONS = {
42877
+ deviceId: "the camera that saw it",
42878
+ className: "what it saw",
42879
+ trackId: "the track",
42880
+ score: "how sure the detector was",
42881
+ label: "the label it matched (a name, a plate), empty when none"
42882
+ };
42883
+ var STATIONARY_DESCRIPTIONS = {
42884
+ deviceId: "the camera that saw it",
42885
+ className: "what it saw",
42886
+ zones: "the zones it is in",
42887
+ phase: "appeared or departed",
42888
+ entryId: "the stopped object"
42889
+ };
42890
+ function describe$1(descriptions) {
42891
+ return Object.entries(descriptions).map(([name, description]) => ({
42892
+ name,
42893
+ description
42894
+ }));
42895
+ }
42896
+ describe$1(DETECTION_DESCRIPTIONS);
42897
+ describe$1(STATIONARY_DESCRIPTIONS);
42775
42898
  new Set(Object.values(COCO_TO_MACRO.mapping));
42776
42899
  /**
42777
42900
  * Schedulers (D983) — an entity that performs actions over the day.
@@ -51559,6 +51682,45 @@ var deviceProviderCapability = {
51559
51682
  }
51560
51683
  };
51561
51684
  /**
51685
+ * What the passive listener of `local-network` saw on the wire, before any
51686
+ * provider classified it. Device-manager turns an observation into the hits
51687
+ * of the providers whose declared discovery modes it matches.
51688
+ */
51689
+ var DiscoveryObservationSchema = discriminatedUnion("kind", [object({
51690
+ kind: literal("mdns"),
51691
+ /** Normalised DNS-SD service type, e.g. `_esphomelib._tcp`. */
51692
+ serviceType: string(),
51693
+ instance: string(),
51694
+ host: string(),
51695
+ /** The A record address when the announcement carried one. */
51696
+ address: string().nullable(),
51697
+ port: number().int(),
51698
+ txt: record(string(), string())
51699
+ }), object({
51700
+ kind: literal("ssdp"),
51701
+ /** Sender address of the datagram. */
51702
+ host: string(),
51703
+ port: number().int(),
51704
+ /** `NT` of a NOTIFY, `ST` of a search response. */
51705
+ target: string(),
51706
+ headers: record(string(), string())
51707
+ })]);
51708
+ object({
51709
+ addonId: string(),
51710
+ candidate: DiscoveryCandidateSchema,
51711
+ firstSeenAt: number(),
51712
+ lastSeenAt: number(),
51713
+ dismissed: boolean()
51714
+ });
51715
+ var DiscoveryProposalSchema = object({
51716
+ id: string(),
51717
+ addonId: string(),
51718
+ candidate: DiscoveryCandidateSchema,
51719
+ firstSeenAt: number(),
51720
+ lastSeenAt: number(),
51721
+ dismissed: boolean()
51722
+ });
51723
+ /**
51562
51724
  * Device Manager capability — hub-side singleton that unifies device persistence,
51563
51725
  * live registry access, and all management operations into a single tRPC surface.
51564
51726
  *
@@ -52287,6 +52449,19 @@ method(object({
52287
52449
  }), object({ candidates: array(DiscoveryCandidateSchema).readonly() }), {
52288
52450
  kind: "mutation",
52289
52451
  auth: "admin"
52452
+ }), method(object({}), object({ proposals: array(DiscoveryProposalSchema).readonly() }), { auth: "admin" }), method(object({ id: string() }), object({ dismissed: boolean() }), {
52453
+ kind: "mutation",
52454
+ auth: "admin"
52455
+ }), method(object({ observations: array(DiscoveryObservationSchema).max(512) }), object({ proposed: number().int() }), {
52456
+ kind: "mutation",
52457
+ auth: "admin"
52458
+ }), method(object({}), object({
52459
+ providers: number().int(),
52460
+ proposed: number().int()
52461
+ }), {
52462
+ kind: "mutation",
52463
+ auth: "admin",
52464
+ timeoutMs: 12e4
52290
52465
  }), method(object({ addonId: string() }), object({ deviceType: _enum(DeviceType).nullable() }), { auth: "admin" }), method(object({ addonId: string() }), unknown(), { auth: "admin" }), method(object({
52291
52466
  deviceId: number(),
52292
52467
  key: string(),
@@ -53736,6 +53911,49 @@ method(_void(), paletteResultSchema, {
53736
53911
  kind: "mutation",
53737
53912
  auth: "admin"
53738
53913
  });
53914
+ /**
53915
+ * do-not-disturb - whether a speaker or display holds back its own sounds
53916
+ * (announcements, notifications, alarms) until the operator lets it speak again.
53917
+ *
53918
+ * It is NOT part of `media-player`: a player is about what it plays and how
53919
+ * loud, while Do Not Disturb is a household switch the vendor keeps per device.
53920
+ * `enabled` is null when the vendor has not said (never a guess of `false`).
53921
+ */
53922
+ var DoNotDisturbStatusSchema = object({
53923
+ /** True while Do Not Disturb is on; null when unknown. */
53924
+ enabled: boolean().nullable().meta({ label: "Do not disturb" }),
53925
+ /** Ms epoch of the last read or write that set `enabled`. */
53926
+ lastChangedAt: number()
53927
+ });
53928
+ var doNotDisturbCapability = {
53929
+ name: "do-not-disturb",
53930
+ scope: "device",
53931
+ deviceNative: true,
53932
+ mode: "singleton",
53933
+ deviceTypes: [DeviceType.MediaPlayer],
53934
+ methods: { setEnabled: method(object({
53935
+ deviceId: number().int(),
53936
+ enabled: boolean()
53937
+ }), _void(), {
53938
+ kind: "mutation",
53939
+ auth: "protected"
53940
+ }) },
53941
+ status: {
53942
+ schema: DoNotDisturbStatusSchema,
53943
+ kind: "push"
53944
+ },
53945
+ runtimeState: DoNotDisturbStatusSchema,
53946
+ /**
53947
+ * Runtime-state durability: **session** - the vendor owns the switch and the
53948
+ * device re-reads it on the next poll, so a restored value would only be stale.
53949
+ *
53950
+ * See `RuntimeStateDurability`. Enforced by
53951
+ * `scripts/check-runtime-state-durability.ts`.
53952
+ */
53953
+ durability: "session",
53954
+ /** History (D850): when Do Not Disturb was switched on and off. */
53955
+ history: { fields: { enabled: { kind: "boolean" } } }
53956
+ };
53739
53957
  /** Pulse override: a rising edge advances `lastPressedAt` and the press count. */
53740
53958
  var doorbellCustomize = {
53741
53959
  version: 1,
@@ -56337,6 +56555,14 @@ var LlmGenerateBaseInputSchema = object({
56337
56555
  topP: number().min(0).max(1).optional(),
56338
56556
  /** Per-call override of the profile default (top-k sampling). */
56339
56557
  topK: number().int().positive().optional(),
56558
+ /** Per-call override of `profile.reasoningEffort`. Sent only to a kind whose
56559
+ * descriptor offers the field; a kind that does not never sends it. */
56560
+ reasoningEffort: _enum([
56561
+ "off",
56562
+ "low",
56563
+ "medium",
56564
+ "high"
56565
+ ]).optional(),
56340
56566
  /** Per-call override of `profile.timeoutMs` — the total generation bound. */
56341
56567
  timeoutMs: number().int().positive().optional(),
56342
56568
  /** Per-call override; beats both the consumer table and the profile. */
@@ -56628,7 +56854,10 @@ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind i
56628
56854
  var LlmModelFeaturesSchema = object({
56629
56855
  vision: boolean(),
56630
56856
  tools: boolean(),
56631
- streaming: boolean()
56857
+ streaming: boolean(),
56858
+ /** Whether the model thinks before it answers. `null` = the endpoint does not
56859
+ * say; an editor then still offers the switch (unknown is not "no"). */
56860
+ reasoning: boolean().nullable().optional()
56632
56861
  });
56633
56862
  /** One model a provider offers. `features` overrides the kind's defaults, per field. */
56634
56863
  var LlmModelInfoSchema = object({
@@ -74838,9 +75067,17 @@ var ServerUpdateActionResultSchema = object({
74838
75067
  */
74839
75068
  requiredAddonUpdates: array(RequiredAddonUpdateSchema).optional()
74840
75069
  });
74841
- var LaunchOverridesSchema = object({
74842
- /** The persisted heap ceiling in MB, or `null` when none is set. */
74843
- heapMb: number().int().nullable() });
75070
+ var LaunchOverridesSchema = object({
75071
+ /** The persisted heap ceiling in MB, or `null` when none is set. */
75072
+ heapMb: number().int().nullable(),
75073
+ /** The persisted hub-main RSS budget in MB, or `null` when none is set. */
75074
+ rssBudgetMb: number().int().nullable()
75075
+ });
75076
+ var SetLaunchOverridesInputSchema = object({
75077
+ heapMb: number().int().min(512).max(65536).nullable(),
75078
+ /** Omitted keeps the stored budget; `null` clears it. */
75079
+ rssBudgetMb: number().int().min(512).max(65536).nullable().optional()
75080
+ });
74844
75081
  var SetLaunchOverridesResultSchema = LaunchOverridesSchema.extend({
74845
75082
  /** Always true: the override is read at launch, not by the running process. */
74846
75083
  restartRequired: boolean() });
@@ -74869,7 +75106,7 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
74869
75106
  }), method(_void(), ServerUpdateActionResultSchema, {
74870
75107
  kind: "mutation",
74871
75108
  auth: "admin"
74872
- }), method(_void(), LaunchOverridesSchema, { auth: "admin" }), method(object({ heapMb: number().int().min(512).max(65536).nullable() }), SetLaunchOverridesResultSchema, {
75109
+ }), method(_void(), LaunchOverridesSchema, { auth: "admin" }), method(SetLaunchOverridesInputSchema, SetLaunchOverridesResultSchema, {
74873
75110
  kind: "mutation",
74874
75111
  auth: "admin"
74875
75112
  });
@@ -76572,6 +76809,40 @@ var LoggingSettingsStateSchema = object({
76572
76809
  opsLogRetentionDays: number().int().min(0),
76573
76810
  persisted: boolean()
76574
76811
  });
76812
+ /**
76813
+ * Debug WATCH — a short, per-device window over `debug.<channel>` lines.
76814
+ *
76815
+ * `start` opens (or re-arms) a 10 minute window; `rearm` extends a LIVE one
76816
+ * and never revives a lapsed one; `stop` closes it; `list` only reads. No
76817
+ * chain of re-arms outlives 60 minutes from the first start. The hub holds the
76818
+ * watches in memory and pushes the interest to every node, so a watch lapses
76819
+ * by itself and survives nothing — a restart is a stop.
76820
+ */
76821
+ var DebugWatchInputSchema = object({
76822
+ action: _enum([
76823
+ "list",
76824
+ "start",
76825
+ "rearm",
76826
+ "stop"
76827
+ ]),
76828
+ /** Full channel names, `debug.<channel>`, each declared with `kind: 'debug'`. */
76829
+ channels: array(string().min(1)).readonly().default([]),
76830
+ /** Numeric device ids. Required (non-empty) for `start`. */
76831
+ deviceIds: array(number().int()).readonly().default([])
76832
+ });
76833
+ var DebugWatchStateSchema = object({
76834
+ channel: string(),
76835
+ deviceIds: array(number().int()).readonly(),
76836
+ startedAtMs: number(),
76837
+ untilMs: number(),
76838
+ capAtMs: number()
76839
+ });
76840
+ var DebugWatchResultSchema = object({
76841
+ nowMs: number(),
76842
+ watches: array(DebugWatchStateSchema).readonly(),
76843
+ /** Channels a `rearm` found already lapsed: nothing was revived. */
76844
+ lapsed: array(string()).readonly()
76845
+ });
76575
76846
  method(_void(), SystemInfoSchema), method(_void(), HealthStatusSchema), method(_void(), FeatureManifestSchema), method(_void(), array(NetworkAddressSchema).readonly()), method(_void(), unknown().nullable(), { auth: "admin" }), method(record(string(), unknown()), _null(), {
76576
76847
  kind: "mutation",
76577
76848
  auth: "admin"
@@ -76587,6 +76858,9 @@ method(_void(), SystemInfoSchema), method(_void(), HealthStatusSchema), method(_
76587
76858
  }), method(_void(), RequestCensusStatusSchema, { auth: "admin" }), method(_void(), array(ReportedLoadContributionSchema).readonly(), { auth: "admin" }), method(_void(), array(ReportedFailureContributionSchema).readonly(), { auth: "admin" }), method(GetLoggingSettingsInputSchema, LoggingSettingsStateSchema, { auth: "admin" }), method(SetLoggingSettingsInputSchema, LoggingSettingsStateSchema, {
76588
76859
  kind: "mutation",
76589
76860
  auth: "admin"
76861
+ }), method(DebugWatchInputSchema, DebugWatchResultSchema, {
76862
+ kind: "mutation",
76863
+ auth: "admin"
76590
76864
  });
76591
76865
  /**
76592
76866
  * Tamper / case-open detection sensor. Drives Home Assistant
@@ -80138,6 +80412,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
80138
80412
  deviceDiscovery: deviceDiscoveryCapability,
80139
80413
  deviceStatus: deviceStatusCapability,
80140
80414
  dishwasher: dishwasherCapability,
80415
+ doNotDisturb: doNotDisturbCapability,
80141
80416
  doorbell: doorbellCapability,
80142
80417
  enumSensor: enumSensorCapability,
80143
80418
  eventEmitter: eventEmitterCapability,
@@ -83695,6 +83970,13 @@ Object.freeze({
83695
83970
  access: "view",
83696
83971
  role: "admin"
83697
83972
  },
83973
+ "deviceManager.dismissDiscoveryProposal": {
83974
+ capName: "device-manager",
83975
+ capScope: "system",
83976
+ addonId: null,
83977
+ access: "create",
83978
+ role: "admin"
83979
+ },
83698
83980
  "deviceManager.enable": {
83699
83981
  capName: "device-manager",
83700
83982
  capScope: "system",
@@ -83877,6 +84159,13 @@ Object.freeze({
83877
84159
  access: "view",
83878
84160
  role: "viewer"
83879
84161
  },
84162
+ "deviceManager.listDiscoveryProposals": {
84163
+ capName: "device-manager",
84164
+ capScope: "system",
84165
+ addonId: null,
84166
+ access: "view",
84167
+ role: "admin"
84168
+ },
83880
84169
  "deviceManager.listLocationDescriptions": {
83881
84170
  capName: "device-manager",
83882
84171
  capScope: "system",
@@ -84031,6 +84320,13 @@ Object.freeze({
84031
84320
  access: "create",
84032
84321
  role: "admin"
84033
84322
  },
84323
+ "deviceManager.reportDiscoveryObservations": {
84324
+ capName: "device-manager",
84325
+ capScope: "system",
84326
+ addonId: null,
84327
+ access: "create",
84328
+ role: "admin"
84329
+ },
84034
84330
  "deviceManager.runDeviceAction": {
84035
84331
  capName: "device-manager",
84036
84332
  capScope: "system",
@@ -84038,6 +84334,13 @@ Object.freeze({
84038
84334
  access: "create",
84039
84335
  role: "admin"
84040
84336
  },
84337
+ "deviceManager.runDiscoverySweep": {
84338
+ capName: "device-manager",
84339
+ capScope: "system",
84340
+ addonId: null,
84341
+ access: "create",
84342
+ role: "admin"
84343
+ },
84041
84344
  "deviceManager.setChildLayout": {
84042
84345
  capName: "device-manager",
84043
84346
  capScope: "system",
@@ -84591,6 +84894,20 @@ Object.freeze({
84591
84894
  access: "create",
84592
84895
  role: "admin"
84593
84896
  },
84897
+ "doNotDisturb.getStatus": {
84898
+ capName: "do-not-disturb",
84899
+ capScope: "device",
84900
+ addonId: null,
84901
+ access: "view",
84902
+ role: "viewer"
84903
+ },
84904
+ "doNotDisturb.setEnabled": {
84905
+ capName: "do-not-disturb",
84906
+ capScope: "device",
84907
+ addonId: null,
84908
+ access: "create",
84909
+ role: "viewer"
84910
+ },
84594
84911
  "doorbell.getStatus": {
84595
84912
  capName: "doorbell",
84596
84913
  capScope: "device",
@@ -90611,6 +90928,13 @@ Object.freeze({
90611
90928
  access: "create",
90612
90929
  role: "viewer"
90613
90930
  },
90931
+ "system.debugWatch": {
90932
+ capName: "system",
90933
+ capScope: "system",
90934
+ addonId: null,
90935
+ access: "create",
90936
+ role: "admin"
90937
+ },
90614
90938
  "system.detectSiteLocation": {
90615
90939
  capName: "system",
90616
90940
  capScope: "system",
@@ -92790,6 +93114,16 @@ Object.freeze({
92790
93114
  form: "single",
92791
93115
  optional: false
92792
93116
  }],
93117
+ "doNotDisturb.getStatus": [{
93118
+ name: "deviceId",
93119
+ form: "single",
93120
+ optional: false
93121
+ }],
93122
+ "doNotDisturb.setEnabled": [{
93123
+ name: "deviceId",
93124
+ form: "single",
93125
+ optional: false
93126
+ }],
92793
93127
  "doorbell.getStatus": [{
92794
93128
  name: "deviceId",
92795
93129
  form: "single",
@@ -94530,6 +94864,11 @@ Object.freeze({
94530
94864
  form: "single",
94531
94865
  optional: false
94532
94866
  }],
94867
+ "system.debugWatch": [{
94868
+ name: "deviceIds",
94869
+ form: "array",
94870
+ optional: true
94871
+ }],
94533
94872
  "tamper.getStatus": [{
94534
94873
  name: "deviceId",
94535
94874
  form: "single",
@@ -97014,6 +97353,12 @@ Object.defineProperty(exports, "createEvent", {
97014
97353
  return createEvent;
97015
97354
  }
97016
97355
  });
97356
+ Object.defineProperty(exports, "defineAddonMigrations", {
97357
+ enumerable: true,
97358
+ get: function() {
97359
+ return defineAddonMigrations;
97360
+ }
97361
+ });
97017
97362
  Object.defineProperty(exports, "defineEntryKind", {
97018
97363
  enumerable: true,
97019
97364
  get: function() {
@@ -97218,6 +97563,12 @@ Object.defineProperty(exports, "powerMeterCapability", {
97218
97563
  return powerMeterCapability;
97219
97564
  }
97220
97565
  });
97566
+ Object.defineProperty(exports, "preconditionOf", {
97567
+ enumerable: true,
97568
+ get: function() {
97569
+ return preconditionOf;
97570
+ }
97571
+ });
97221
97572
  Object.defineProperty(exports, "prepareNotification", {
97222
97573
  enumerable: true,
97223
97574
  get: function() {