@camstack/addon-provider-homeassistant 1.2.158 → 1.2.159

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-M6hP_tw3.js");
2
+ const require_dist = require("./dist-BE_WMCdp.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
@@ -5142,7 +5142,7 @@ var HaIntegrationManager = class HaIntegrationManager {
5142
5142
  service: target.service
5143
5143
  };
5144
5144
  const targetEnvelope = {};
5145
- if (target.entityId !== void 0) targetEnvelope["entity_id"] = Array.isArray(target.entityId) ? [...target.entityId] : target.entityId;
5145
+ if (target.entityId !== void 0) targetEnvelope["entity_id"] = typeof target.entityId === "string" ? target.entityId : [...target.entityId];
5146
5146
  if (target.areaId) targetEnvelope["area_id"] = target.areaId;
5147
5147
  if (target.deviceId) targetEnvelope["device_id"] = target.deviceId;
5148
5148
  if (Object.keys(targetEnvelope).length > 0) message["target"] = targetEnvelope;
@@ -7163,6 +7163,14 @@ function createHaNotificationOutputProvider(deps) {
7163
7163
  addonId
7164
7164
  }));
7165
7165
  },
7166
+ getTarget: async ({ targetId }) => {
7167
+ const target = await store.getById(targetId);
7168
+ if (!target) throw new Error(`Unknown target '${targetId}'`);
7169
+ return {
7170
+ ...target,
7171
+ addonId
7172
+ };
7173
+ },
7166
7174
  discoverTargets: async ({ kind, config }) => {
7167
7175
  if (kind !== "homeassistant") return [];
7168
7176
  const explicit = config ? readBrokerId(config) : void 0;
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as connectivityCapability, At as record, B as floodCapability, C as buildAddonRouteProvider, Ct as _enum, D as carbonMonoxideCapability, Dt as literal, E as calendarSourceCapability, Et as discriminatedUnion, F as deviceAdoptionCapability, Ft as EventCategory, G as lawnMowerControlCapability, H as humidifierCapability, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, M as controlCapability, Mt as union, N as coverCapability, Nt as unknown, O as climateControlCapability, Ot as number, P as deviceAdminLinkCapability, Pt as url, Q as numericSensorCapability, R as eventEmitterCapability, S as brokerCapability, T as buttonCapability, Tt as boolean, 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 string, k as colorCapability, kt as object, 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 array, x as brightnessCapability, xt as createEvent, y as bestLocationMatch, yt as errMsg, z as fanControlCapability } from "./dist-BgTykMb6.mjs";
1
+ import { A as connectivityCapability, At as record, B as floodCapability, C as buildAddonRouteProvider, Ct as _enum, D as carbonMonoxideCapability, Dt as literal, E as calendarSourceCapability, Et as discriminatedUnion, F as deviceAdoptionCapability, Ft as EventCategory, G as lawnMowerControlCapability, H as humidifierCapability, J as motionCapability, K as lockControlCapability, L as enumSensorCapability, M as controlCapability, Mt as union, N as coverCapability, Nt as unknown, O as climateControlCapability, Ot as number, P as deviceAdminLinkCapability, Pt as url, Q as numericSensorCapability, R as eventEmitterCapability, S as brokerCapability, T as buttonCapability, Tt as boolean, 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 string, k as colorCapability, kt as object, 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 array, x as brightnessCapability, xt as createEvent, y as bestLocationMatch, yt as errMsg, z as fanControlCapability } from "./dist-Ck6d87Ov.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
@@ -5141,7 +5141,7 @@ var HaIntegrationManager = class HaIntegrationManager {
5141
5141
  service: target.service
5142
5142
  };
5143
5143
  const targetEnvelope = {};
5144
- if (target.entityId !== void 0) targetEnvelope["entity_id"] = Array.isArray(target.entityId) ? [...target.entityId] : target.entityId;
5144
+ if (target.entityId !== void 0) targetEnvelope["entity_id"] = typeof target.entityId === "string" ? target.entityId : [...target.entityId];
5145
5145
  if (target.areaId) targetEnvelope["area_id"] = target.areaId;
5146
5146
  if (target.deviceId) targetEnvelope["device_id"] = target.deviceId;
5147
5147
  if (Object.keys(targetEnvelope).length > 0) message["target"] = targetEnvelope;
@@ -7162,6 +7162,14 @@ function createHaNotificationOutputProvider(deps) {
7162
7162
  addonId
7163
7163
  }));
7164
7164
  },
7165
+ getTarget: async ({ targetId }) => {
7166
+ const target = await store.getById(targetId);
7167
+ if (!target) throw new Error(`Unknown target '${targetId}'`);
7168
+ return {
7169
+ ...target,
7170
+ addonId
7171
+ };
7172
+ },
7165
7173
  discoverTargets: async ({ kind, config }) => {
7166
7174
  if (kind !== "homeassistant") return [];
7167
7175
  const explicit = config ? readBrokerId(config) : void 0;
@@ -10737,11 +10737,11 @@ var ModelVariantGroupSchema = object({
10737
10737
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10738
10738
  precision: _enum(["fp32", "int8"]).optional(),
10739
10739
  /**
10740
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10741
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10742
- * future performance variants plug into.
10740
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10741
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10742
+ * label is "Test".
10743
10743
  */
10744
- optimization: _enum(["standard", "fast"]).optional(),
10744
+ optimization: _enum(["standard", "test"]).optional(),
10745
10745
  /**
10746
10746
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10747
10747
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10764,9 +10764,10 @@ var ModelProviderIdSchema = _enum([
10764
10764
  * are per upstream. A persisted custom-model row written when this field was a
10765
10765
  * string still parses — the string is lifted into `{ weights }`.
10766
10766
  *
10767
- * Every licence surface (the admin "Models and licenses" page,
10768
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10769
- * these records by `scripts/gen-model-licenses.ts` (D661).
10767
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10768
+ * model table) is GENERATED from these records by
10769
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10770
+ * `camstack/docs` → `/docs/detection/models`.
10770
10771
  */
10771
10772
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10772
10773
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14465,7 +14466,7 @@ DeviceType.Camera;
14465
14466
  * This matters here more than anywhere else in the repo, because every provider
14466
14467
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14467
14468
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14468
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14469
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14469
14470
  * camera's own page will ask for its own login. That is correct, and pre-
14470
14471
  * filling it is the operator's business, not ours.
14471
14472
  *
@@ -17871,7 +17872,7 @@ method(object({
17871
17872
  timeoutMs: 6e5
17872
17873
  });
17873
17874
  method(object({
17874
- nodeId: string(),
17875
+ targetNodeId: string(),
17875
17876
  modelId: string(),
17876
17877
  format: _enum(MODEL_FORMATS),
17877
17878
  entry: ModelCatalogEntrySchema
@@ -20397,8 +20398,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20397
20398
  disabledTargetIds: array(string()).default([])
20398
20399
  });
20399
20400
  /**
20400
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20401
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
20401
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
20402
+ * report a still-true state. `addons` is the crash-looped addons only and
20403
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
20402
20404
  * job is not an open state, and the alarm stays instant.
20403
20405
  */
20404
20406
  var NcStateSummarySectionIdSchema = _enum([
@@ -20410,6 +20412,7 @@ var NcStateSummarySectionIdSchema = _enum([
20410
20412
  "detection-blind",
20411
20413
  "nodes",
20412
20414
  "addons",
20415
+ "addon-updates",
20413
20416
  "updates"
20414
20417
  ]);
20415
20418
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20890,7 +20893,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20890
20893
  * When this mode may be armed. Absent / null = always allowed (same as a
20891
20894
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20892
20895
  */
20893
- schedule: NcScheduleSchema.optional()
20896
+ schedule: NcScheduleSchema.optional(),
20897
+ /**
20898
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20899
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20900
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20901
+ */
20902
+ notifyDuringEntryDelay: boolean().optional(),
20903
+ /**
20904
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20905
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20906
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20907
+ */
20908
+ notifySensorRewatched: boolean().optional()
20894
20909
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20895
20910
  var NcAlarmModeDelaysEditListSchema = array(object({
20896
20911
  mode: AlarmArmModeSchema,
@@ -20899,7 +20914,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20899
20914
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20900
20915
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20901
20916
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20902
- schedule: NcScheduleSchema.nullable().optional()
20917
+ schedule: NcScheduleSchema.nullable().optional(),
20918
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20919
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20920
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20921
+ notifySensorRewatched: boolean().nullable().optional()
20903
20922
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20904
20923
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20905
20924
  var NcAlarmNonBlockingEditSchema = object({
@@ -21876,39 +21895,19 @@ Object.freeze(Object.fromEntries([{
21876
21895
  label: "Face recognition model",
21877
21896
  defaultModelId: "auraface-r100",
21878
21897
  indexName: "the enrolled face gallery",
21879
- options: [
21880
- {
21881
- id: "auraface-r100",
21882
- label: "AuraFace R100"
21883
- },
21884
- {
21885
- id: "arcface-r100",
21886
- label: "ArcFace (ResNet34)"
21887
- },
21888
- {
21889
- id: "inception-resnet-v1",
21890
- label: "Inception ResNet V1"
21891
- }
21892
- ]
21898
+ options: [{
21899
+ id: "auraface-r100",
21900
+ label: "AuraFace R100"
21901
+ }]
21893
21902
  }, {
21894
21903
  stepId: "clip-embedding",
21895
21904
  label: "Semantic search model",
21896
- defaultModelId: "mobileclip-s1",
21905
+ defaultModelId: "siglip2-b16-224",
21897
21906
  indexName: "the object semantic-search index",
21898
- options: [
21899
- {
21900
- id: "mobileclip-s1",
21901
- label: "MobileCLIP S1"
21902
- },
21903
- {
21904
- id: "mobileclip-s2",
21905
- label: "MobileCLIP S2"
21906
- },
21907
- {
21908
- id: "siglip2-b16-224",
21909
- label: "SigLIP2 B/16 (Apache-2.0)"
21910
- }
21911
- ]
21907
+ options: [{
21908
+ id: "siglip2-b16-224",
21909
+ label: "SigLIP2 B/16 (Apache-2.0)"
21910
+ }]
21912
21911
  }].map((s) => [s.stepId, s.defaultModelId])));
21913
21912
  var CLUSTER_STEP_SETTING_FIELDS = [{
21914
21913
  stepId: "face-embedding",
@@ -24796,6 +24795,22 @@ var MotionSourceEnum = _enum([
24796
24795
  "device-activity"
24797
24796
  ]);
24798
24797
  /**
24798
+ * What opened an on-motion detection SESSION: the motion source that passed the
24799
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24800
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24801
+ * device name as the orchestrator's camera-sensors resolution last read it;
24802
+ * absent when unknown or when the camera itself triggered.
24803
+ *
24804
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24805
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24806
+ * runner never decides anything on it.
24807
+ */
24808
+ var SessionTriggerSchema = object({
24809
+ source: MotionSourceEnum,
24810
+ triggeredBy: MotionTriggeredBySchema,
24811
+ sensorName: string().optional()
24812
+ });
24813
+ /**
24799
24814
  * List of motion sources active on a camera. Empty array is valid:
24800
24815
  * "no source" — happens for battery cams without firmware motion when
24801
24816
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -25047,6 +25062,14 @@ var RunnerCameraConfigSchema = object({
25047
25062
  */
25048
25063
  motionSources: MotionSourcesSchema.default(["analyzer"]),
25049
25064
  /**
25065
+ * What opened this attach, on a SESSION attach only (see
25066
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
25067
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
25068
+ * behind it, and every attach from an orchestrator older than the field — the
25069
+ * runner then names no source on the phase event.
25070
+ */
25071
+ sessionTrigger: SessionTriggerSchema.optional(),
25072
+ /**
25050
25073
  * WHICH root detector runs for this camera. The detection counterpart of
25051
25074
  * {@link motionSources}, same shape and same discipline: a per-camera list
25052
25075
  * of sources the system understands, vendor-agnostic, owned here.
@@ -32533,7 +32556,7 @@ var LocalInterfaceSchema = object({
32533
32556
  name: string(),
32534
32557
  family: _enum(["IPv4", "IPv6"]),
32535
32558
  address: string(),
32536
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
32559
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
32537
32560
  cidr: string(),
32538
32561
  /** OS netmask. Stable across calls so the SDK can hash on it. */
32539
32562
  netmask: string(),
@@ -32587,7 +32610,8 @@ var ConnectionEndpointSchema = object({
32587
32610
  "lan-ipv4",
32588
32611
  "lan-ipv6",
32589
32612
  "public",
32590
- "loopback"
32613
+ "loopback",
32614
+ "app-link"
32591
32615
  ]),
32592
32616
  /**
32593
32617
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -32656,15 +32680,27 @@ var GetConnectionEndpointsResultSchema = object({
32656
32680
  localPort: AdvertisedLocalPortSchema
32657
32681
  });
32658
32682
  /**
32659
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
32660
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
32661
- * what AUTO currently picks, so the UI can show the effective value either way.
32683
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
32684
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
32685
+ * so the UI can show it either way.
32662
32686
  */
32663
32687
  var NotificationEndpointSchema = object({
32664
32688
  /** The operator's explicit choice, or null for AUTO. */
32665
32689
  baseUrl: string().nullable(),
32666
- /** What the ranking currently resolves to (null when nothing is reachable). */
32667
- resolved: string().nullable()
32690
+ /**
32691
+ * The effective flagged address: the explicit choice, else (AUTO) the
32692
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
32693
+ * answered the public tunnel / mesh here, or null.
32694
+ */
32695
+ resolved: string().nullable(),
32696
+ /**
32697
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
32698
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
32699
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
32700
+ * hub advertises neither; the app link is then minted without `hub=`.
32701
+ * Absent on a pre-D709 hub.
32702
+ */
32703
+ appLinkHub: string().nullable()
32668
32704
  });
32669
32705
  /**
32670
32706
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -32718,7 +32754,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
32718
32754
  * Pass `'https'` when the caller is itself loaded over HTTPS
32719
32755
  * to avoid mixed-content blocks in the browser. The public
32720
32756
  * tunnel always emits `https://` regardless. */
32721
- scheme: _enum(["http", "https"]).optional()
32757
+ scheme: _enum(["http", "https"]).optional(),
32758
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
32759
+ * an address notification links can be flagged with, not a hub
32760
+ * route. Default `false`: racers and rankers never see it. */
32761
+ includeAppLink: boolean().optional()
32722
32762
  }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
32723
32763
  kind: "mutation",
32724
32764
  auth: "admin"
@@ -33047,7 +33087,7 @@ var MeshPeerSchema = object({
33047
33087
  tags: array(string()).readonly(),
33048
33088
  /** True when the peer advertises itself as an exit-node candidate. */
33049
33089
  exitNodeOption: boolean(),
33050
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
33090
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
33051
33091
  advertisedRoutes: array(string()).readonly(),
33052
33092
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
33053
33093
  userLogin: string().nullable(),
@@ -34375,7 +34415,13 @@ var OsdStatusSchema = object({ overlays: array(object({
34375
34415
  */
34376
34416
  availablePositions: array(OsdPositionEnum).readonly(),
34377
34417
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
34378
- readOnly: boolean().optional()
34418
+ readOnly: boolean().optional(),
34419
+ /**
34420
+ * Firmware text ceiling for this overlay. Absent = no known limit.
34421
+ * The OSD manager truncates here on every write — never stores its own
34422
+ * copy on the binding.
34423
+ */
34424
+ maxCharacters: number().int().positive().optional()
34379
34425
  })).readonly() });
34380
34426
  var OsdOverlayPatchSchema = object({
34381
34427
  enabled: boolean().optional(),
@@ -34426,7 +34472,9 @@ var OsdTemplateBindingSchema = object({
34426
34472
  valuePath: string().min(1).max(64),
34427
34473
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
34428
34474
  displayUnit: string().max(16).optional(),
34429
- maxDecimals: number().int().min(0).max(4).default(1)
34475
+ maxDecimals: number().int().min(0).max(4).default(1),
34476
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
34477
+ valueMap: record(string(), string()).optional()
34430
34478
  });
34431
34479
  /**
34432
34480
  * A named template: bindings (alias → leaf field) + a parser that
@@ -34476,18 +34524,11 @@ var OsdSlotBindingSchema = object({
34476
34524
  source: OsdSourceSchema,
34477
34525
  /** `${value}` and `${unit}` are substituted; every occurrence. */
34478
34526
  template: string().max(96).default("${value}"),
34479
- /** Truncate with an ellipsis past this length. Absent = no limit. */
34480
- maxCharacters: number().int().min(4).max(64).optional(),
34481
34527
  /**
34482
34528
  * Decimal places for a numeric value. `0` yields an integer — the
34483
34529
  * documented workaround for firmwares that reject `.` in overlay text.
34484
34530
  */
34485
34531
  maxDecimals: number().int().min(0).max(4).default(1),
34486
- /**
34487
- * Appended via `${unit}` when no unit conversion produces a label.
34488
- * Prefer `source.displayUnit` for converted device-state values.
34489
- */
34490
- unitLabel: string().max(8).optional(),
34491
34532
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
34492
34533
  valueMap: record(string(), string()).optional(),
34493
34534
  /** Time windows in which the slot is shown. Absent = always. */
@@ -34496,9 +34537,7 @@ var OsdSlotBindingSchema = object({
34496
34537
  * Display gate, in the notification centre's condition vocabulary.
34497
34538
  * Only the keys reported by `getConditionSupport` are accepted.
34498
34539
  */
34499
- conditions: NcConditionsSchema.optional(),
34500
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
34501
- fallbackText: string().max(64).default("")
34540
+ conditions: NcConditionsSchema.optional()
34502
34541
  });
34503
34542
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
34504
34543
  var OsdSlotViewSchema = object({
@@ -52938,12 +52977,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52938
52977
  {
52939
52978
  id: "addons",
52940
52979
  family: "system",
52941
- label: "Addons",
52942
- kinds: [
52943
- "addon-crash-loop",
52944
- "addon-update-available",
52945
- "addon-updated"
52946
- ]
52980
+ label: "Addons stopped",
52981
+ kinds: ["addon-crash-loop"]
52982
+ },
52983
+ {
52984
+ id: "addon-updates",
52985
+ family: "system",
52986
+ label: "Addon updates",
52987
+ kinds: ["addon-update-available", "addon-updated"]
52947
52988
  },
52948
52989
  {
52949
52990
  id: "updates",
@@ -53103,13 +53144,15 @@ var STATE_SUMMARY_SECTION_VARS = [
53103
53144
  },
53104
53145
  {
53105
53146
  name: "summaryAddons",
53106
- label: "Summary: addons",
53107
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
53108
- kinds: [
53109
- "addon-crash-loop",
53110
- "addon-update-available",
53111
- "addon-updated"
53112
- ]
53147
+ label: "Summary: addons stopped",
53148
+ example: "hub — recorder stopped after repeated crashes",
53149
+ kinds: ["addon-crash-loop"]
53150
+ },
53151
+ {
53152
+ name: "summaryAddonUpdates",
53153
+ label: "Summary: addon updates",
53154
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
53155
+ kinds: ["addon-update-available", "addon-updated"]
53113
53156
  },
53114
53157
  {
53115
53158
  name: "summaryUpdates",
@@ -53193,6 +53236,7 @@ var STATE_SUMMARY_VARS = [
53193
53236
  [...RULE_BODY_ONLY],
53194
53237
  [...RULE_TEXT],
53195
53238
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
53239
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
53196
53240
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
53197
53241
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
53198
53242
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -53233,6 +53277,8 @@ var STATE_SUMMARY_VARS = [
53233
53277
  [...RULE_TEXT],
53234
53278
  [...RULE_TEXT],
53235
53279
  [...RULE_TEXT],
53280
+ [...RULE_TEXT],
53281
+ [...RULE_TEXT],
53236
53282
  ...STATE_SUMMARY_VARS
53237
53283
  ];
53238
53284
  new Set([
@@ -10736,11 +10736,11 @@ var ModelVariantGroupSchema = object({
10736
10736
  /** Quantization axis. Omit ⇒ the fp32 base build. */
10737
10737
  precision: _enum(["fp32", "int8"]).optional(),
10738
10738
  /**
10739
- * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
10740
- * latency-optimized export (e.g. ReLU-activation variant) — the slot the
10741
- * future performance variants plug into.
10739
+ * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
10740
+ * an alternate training of the same family (Scrypted `relu_test`); chip
10741
+ * label is "Test".
10742
10742
  */
10743
- optimization: _enum(["standard", "fast"]).optional(),
10743
+ optimization: _enum(["standard", "test"]).optional(),
10744
10744
  /**
10745
10745
  * Input-resolution axis (square input side, px). Omit ⇒ the family's native
10746
10746
  * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
@@ -10763,9 +10763,10 @@ var ModelProviderIdSchema = _enum([
10763
10763
  * are per upstream. A persisted custom-model row written when this field was a
10764
10764
  * string still parses — the string is lifted into `{ weights }`.
10765
10765
  *
10766
- * Every licence surface (the admin "Models and licenses" page,
10767
- * `THIRD_PARTY_MODELS.md`, the Hugging Face model table) is GENERATED from
10768
- * these records by `scripts/gen-model-licenses.ts` (D661).
10766
+ * Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
10767
+ * model table) is GENERATED from these records by
10768
+ * `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
10769
+ * `camstack/docs` → `/docs/detection/models`.
10769
10770
  */
10770
10771
  var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
10771
10772
  /** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
@@ -14464,7 +14465,7 @@ DeviceType.Camera;
14464
14465
  * This matters here more than anywhere else in the repo, because every provider
14465
14466
  * that knows a device's host knows its PASSWORD too: `{ host, port, username,
14466
14467
  * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
14467
- * and `http://admin:hunter2@192.168.x.x/` is a URL a browser accepts. The
14468
+ * and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
14468
14469
  * camera's own page will ask for its own login. That is correct, and pre-
14469
14470
  * filling it is the operator's business, not ours.
14470
14471
  *
@@ -17870,7 +17871,7 @@ method(object({
17870
17871
  timeoutMs: 6e5
17871
17872
  });
17872
17873
  method(object({
17873
- nodeId: string(),
17874
+ targetNodeId: string(),
17874
17875
  modelId: string(),
17875
17876
  format: _enum(MODEL_FORMATS),
17876
17877
  entry: ModelCatalogEntrySchema
@@ -20396,8 +20397,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20396
20397
  disabledTargetIds: array(string()).default([])
20397
20398
  });
20398
20399
  /**
20399
- * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20400
- * still-true state. `backups-exports` and `alarm` are not sections — a completed
20400
+ * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
20401
+ * report a still-true state. `addons` is the crash-looped addons only and
20402
+ * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
20401
20403
  * job is not an open state, and the alarm stays instant.
20402
20404
  */
20403
20405
  var NcStateSummarySectionIdSchema = _enum([
@@ -20409,6 +20411,7 @@ var NcStateSummarySectionIdSchema = _enum([
20409
20411
  "detection-blind",
20410
20412
  "nodes",
20411
20413
  "addons",
20414
+ "addon-updates",
20412
20415
  "updates"
20413
20416
  ]);
20414
20417
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
@@ -20889,7 +20892,19 @@ var NcAlarmModeDelaysListSchema = array(object({
20889
20892
  * When this mode may be armed. Absent / null = always allowed (same as a
20890
20893
  * rule with no `schedule`). Evaluated with {@link isScheduleActive}.
20891
20894
  */
20892
- schedule: NcScheduleSchema.optional()
20895
+ schedule: NcScheduleSchema.optional(),
20896
+ /**
20897
+ * D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
20898
+ * intrusion naming the locations)? Absent = false — the entry-delay notification is the
20899
+ * only one, and the matches ride the triggered notification's mosaic (D705).
20900
+ */
20901
+ notifyDuringEntryDelay: boolean().optional(),
20902
+ /**
20903
+ * D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
20904
+ * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
20905
+ * is the one that starts the entry delay — the entry-delay notification already names it.
20906
+ */
20907
+ notifySensorRewatched: boolean().optional()
20893
20908
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
20894
20909
  var NcAlarmModeDelaysEditListSchema = array(object({
20895
20910
  mode: AlarmArmModeSchema,
@@ -20898,7 +20913,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
20898
20913
  triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
20899
20914
  postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
20900
20915
  /** Set a schedule, or `null` to clear (mode always allowed again). */
20901
- schedule: NcScheduleSchema.nullable().optional()
20916
+ schedule: NcScheduleSchema.nullable().optional(),
20917
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20918
+ notifyDuringEntryDelay: boolean().nullable().optional(),
20919
+ /** D706: set the switch, or `null` to clear it (back to the default, false). */
20920
+ notifySensorRewatched: boolean().nullable().optional()
20902
20921
  })).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
20903
20922
  /** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
20904
20923
  var NcAlarmNonBlockingEditSchema = object({
@@ -21875,39 +21894,19 @@ Object.freeze(Object.fromEntries([{
21875
21894
  label: "Face recognition model",
21876
21895
  defaultModelId: "auraface-r100",
21877
21896
  indexName: "the enrolled face gallery",
21878
- options: [
21879
- {
21880
- id: "auraface-r100",
21881
- label: "AuraFace R100"
21882
- },
21883
- {
21884
- id: "arcface-r100",
21885
- label: "ArcFace (ResNet34)"
21886
- },
21887
- {
21888
- id: "inception-resnet-v1",
21889
- label: "Inception ResNet V1"
21890
- }
21891
- ]
21897
+ options: [{
21898
+ id: "auraface-r100",
21899
+ label: "AuraFace R100"
21900
+ }]
21892
21901
  }, {
21893
21902
  stepId: "clip-embedding",
21894
21903
  label: "Semantic search model",
21895
- defaultModelId: "mobileclip-s1",
21904
+ defaultModelId: "siglip2-b16-224",
21896
21905
  indexName: "the object semantic-search index",
21897
- options: [
21898
- {
21899
- id: "mobileclip-s1",
21900
- label: "MobileCLIP S1"
21901
- },
21902
- {
21903
- id: "mobileclip-s2",
21904
- label: "MobileCLIP S2"
21905
- },
21906
- {
21907
- id: "siglip2-b16-224",
21908
- label: "SigLIP2 B/16 (Apache-2.0)"
21909
- }
21910
- ]
21906
+ options: [{
21907
+ id: "siglip2-b16-224",
21908
+ label: "SigLIP2 B/16 (Apache-2.0)"
21909
+ }]
21911
21910
  }].map((s) => [s.stepId, s.defaultModelId])));
21912
21911
  var CLUSTER_STEP_SETTING_FIELDS = [{
21913
21912
  stepId: "face-embedding",
@@ -24795,6 +24794,22 @@ var MotionSourceEnum = _enum([
24795
24794
  "device-activity"
24796
24795
  ]);
24797
24796
  /**
24797
+ * What opened an on-motion detection SESSION: the motion source that passed the
24798
+ * camera's `motionSources` gate, and what raised it (the camera itself, or a
24799
+ * sensor the operator attached — D672). `sensorName` is the attached sensor's
24800
+ * device name as the orchestrator's camera-sensors resolution last read it;
24801
+ * absent when unknown or when the camera itself triggered.
24802
+ *
24803
+ * Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
24804
+ * can say what started the session (D672 rule 11, amended 2026-10-06). The
24805
+ * runner never decides anything on it.
24806
+ */
24807
+ var SessionTriggerSchema = object({
24808
+ source: MotionSourceEnum,
24809
+ triggeredBy: MotionTriggeredBySchema,
24810
+ sensorName: string().optional()
24811
+ });
24812
+ /**
24798
24813
  * List of motion sources active on a camera. Empty array is valid:
24799
24814
  * "no source" — happens for battery cams without firmware motion when
24800
24815
  * the operator hasn't opted into the SW analyzer (would hold the
@@ -25046,6 +25061,14 @@ var RunnerCameraConfigSchema = object({
25046
25061
  */
25047
25062
  motionSources: MotionSourcesSchema.default(["analyzer"]),
25048
25063
  /**
25064
+ * What opened this attach, on a SESSION attach only (see
25065
+ * {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
25066
+ * standing attach, an occupancy burst, a re-dispatch with no motion event
25067
+ * behind it, and every attach from an orchestrator older than the field — the
25068
+ * runner then names no source on the phase event.
25069
+ */
25070
+ sessionTrigger: SessionTriggerSchema.optional(),
25071
+ /**
25049
25072
  * WHICH root detector runs for this camera. The detection counterpart of
25050
25073
  * {@link motionSources}, same shape and same discipline: a per-camera list
25051
25074
  * of sources the system understands, vendor-agnostic, owned here.
@@ -32532,7 +32555,7 @@ var LocalInterfaceSchema = object({
32532
32555
  name: string(),
32533
32556
  family: _enum(["IPv4", "IPv6"]),
32534
32557
  address: string(),
32535
- /** CIDR shorthand (e.g. `192.168.x.x/24`). Empty when OS doesn't expose. */
32558
+ /** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
32536
32559
  cidr: string(),
32537
32560
  /** OS netmask. Stable across calls so the SDK can hash on it. */
32538
32561
  netmask: string(),
@@ -32586,7 +32609,8 @@ var ConnectionEndpointSchema = object({
32586
32609
  "lan-ipv4",
32587
32610
  "lan-ipv6",
32588
32611
  "public",
32589
- "loopback"
32612
+ "loopback",
32613
+ "app-link"
32590
32614
  ]),
32591
32615
  /**
32592
32616
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -32655,15 +32679,27 @@ var GetConnectionEndpointsResultSchema = object({
32655
32679
  localPort: AdvertisedLocalPortSchema
32656
32680
  });
32657
32681
  /**
32658
- * The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
32659
- * AUTO (resolved from the candidate ranking at send time); `resolved` reports
32660
- * what AUTO currently picks, so the UI can show the effective value either way.
32682
+ * The address flagged for notification links. `baseUrl: null` = AUTO, which
32683
+ * since D709 is the CamStack app link; `resolved` reports the effective value,
32684
+ * so the UI can show it either way.
32661
32685
  */
32662
32686
  var NotificationEndpointSchema = object({
32663
32687
  /** The operator's explicit choice, or null for AUTO. */
32664
32688
  baseUrl: string().nullable(),
32665
- /** What the ranking currently resolves to (null when nothing is reachable). */
32666
- resolved: string().nullable()
32689
+ /**
32690
+ * The effective flagged address: the explicit choice, else (AUTO) the
32691
+ * CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
32692
+ * answered the public tunnel / mesh here, or null.
32693
+ */
32694
+ resolved: string().nullable(),
32695
+ /**
32696
+ * The hub origin an app link carries as `hub=` (D709): the hub's best
32697
+ * public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
32698
+ * picked from this cap's own palette by `pickAppLinkHub`. `null` when the
32699
+ * hub advertises neither; the app link is then minted without `hub=`.
32700
+ * Absent on a pre-D709 hub.
32701
+ */
32702
+ appLinkHub: string().nullable()
32667
32703
  });
32668
32704
  /**
32669
32705
  * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
@@ -32717,7 +32753,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
32717
32753
  * Pass `'https'` when the caller is itself loaded over HTTPS
32718
32754
  * to avoid mixed-content blocks in the browser. The public
32719
32755
  * tunnel always emits `https://` regardless. */
32720
- scheme: _enum(["http", "https"]).optional()
32756
+ scheme: _enum(["http", "https"]).optional(),
32757
+ /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
32758
+ * an address notification links can be flagged with, not a hub
32759
+ * route. Default `false`: racers and rankers never see it. */
32760
+ includeAppLink: boolean().optional()
32721
32761
  }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
32722
32762
  kind: "mutation",
32723
32763
  auth: "admin"
@@ -33046,7 +33086,7 @@ var MeshPeerSchema = object({
33046
33086
  tags: array(string()).readonly(),
33047
33087
  /** True when the peer advertises itself as an exit-node candidate. */
33048
33088
  exitNodeOption: boolean(),
33049
- /** Subnet routes the peer advertises (e.g. `["192.168.x.x/24"]`). */
33089
+ /** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
33050
33090
  advertisedRoutes: array(string()).readonly(),
33051
33091
  /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
33052
33092
  userLogin: string().nullable(),
@@ -34374,7 +34414,13 @@ var OsdStatusSchema = object({ overlays: array(object({
34374
34414
  */
34375
34415
  availablePositions: array(OsdPositionEnum).readonly(),
34376
34416
  /** Firmware does not allow editing the `text` field (e.g. timestamp). */
34377
- readOnly: boolean().optional()
34417
+ readOnly: boolean().optional(),
34418
+ /**
34419
+ * Firmware text ceiling for this overlay. Absent = no known limit.
34420
+ * The OSD manager truncates here on every write — never stores its own
34421
+ * copy on the binding.
34422
+ */
34423
+ maxCharacters: number().int().positive().optional()
34378
34424
  })).readonly() });
34379
34425
  var OsdOverlayPatchSchema = object({
34380
34426
  enabled: boolean().optional(),
@@ -34425,7 +34471,9 @@ var OsdTemplateBindingSchema = object({
34425
34471
  valuePath: string().min(1).max(64),
34426
34472
  /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
34427
34473
  displayUnit: string().max(16).optional(),
34428
- maxDecimals: number().int().min(0).max(4).default(1)
34474
+ maxDecimals: number().int().min(0).max(4).default(1),
34475
+ /** Raw value → display text (same shape as slot binding). Empty string hides. */
34476
+ valueMap: record(string(), string()).optional()
34429
34477
  });
34430
34478
  /**
34431
34479
  * A named template: bindings (alias → leaf field) + a parser that
@@ -34475,18 +34523,11 @@ var OsdSlotBindingSchema = object({
34475
34523
  source: OsdSourceSchema,
34476
34524
  /** `${value}` and `${unit}` are substituted; every occurrence. */
34477
34525
  template: string().max(96).default("${value}"),
34478
- /** Truncate with an ellipsis past this length. Absent = no limit. */
34479
- maxCharacters: number().int().min(4).max(64).optional(),
34480
34526
  /**
34481
34527
  * Decimal places for a numeric value. `0` yields an integer — the
34482
34528
  * documented workaround for firmwares that reject `.` in overlay text.
34483
34529
  */
34484
34530
  maxDecimals: number().int().min(0).max(4).default(1),
34485
- /**
34486
- * Appended via `${unit}` when no unit conversion produces a label.
34487
- * Prefer `source.displayUnit` for converted device-state values.
34488
- */
34489
- unitLabel: string().max(8).optional(),
34490
34531
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
34491
34532
  valueMap: record(string(), string()).optional(),
34492
34533
  /** Time windows in which the slot is shown. Absent = always. */
@@ -34495,9 +34536,7 @@ var OsdSlotBindingSchema = object({
34495
34536
  * Display gate, in the notification centre's condition vocabulary.
34496
34537
  * Only the keys reported by `getConditionSupport` are accepted.
34497
34538
  */
34498
- conditions: NcConditionsSchema.optional(),
34499
- /** Rendered when the gate is closed or the value unreadable. Empty = hide. */
34500
- fallbackText: string().max(64).default("")
34539
+ conditions: NcConditionsSchema.optional()
34501
34540
  });
34502
34541
  /** One camera slot, as the operator sees it: firmware truth + our binding. */
34503
34542
  var OsdSlotViewSchema = object({
@@ -52937,12 +52976,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52937
52976
  {
52938
52977
  id: "addons",
52939
52978
  family: "system",
52940
- label: "Addons",
52941
- kinds: [
52942
- "addon-crash-loop",
52943
- "addon-update-available",
52944
- "addon-updated"
52945
- ]
52979
+ label: "Addons stopped",
52980
+ kinds: ["addon-crash-loop"]
52981
+ },
52982
+ {
52983
+ id: "addon-updates",
52984
+ family: "system",
52985
+ label: "Addon updates",
52986
+ kinds: ["addon-update-available", "addon-updated"]
52946
52987
  },
52947
52988
  {
52948
52989
  id: "updates",
@@ -53102,13 +53143,15 @@ var STATE_SUMMARY_SECTION_VARS = [
53102
53143
  },
53103
53144
  {
53104
53145
  name: "summaryAddons",
53105
- label: "Summary: addons",
53106
- example: "@camstack/addon-recorder 1.2.3 → 1.2.4",
53107
- kinds: [
53108
- "addon-crash-loop",
53109
- "addon-update-available",
53110
- "addon-updated"
53111
- ]
53146
+ label: "Summary: addons stopped",
53147
+ example: "hub — recorder stopped after repeated crashes",
53148
+ kinds: ["addon-crash-loop"]
53149
+ },
53150
+ {
53151
+ name: "summaryAddonUpdates",
53152
+ label: "Summary: addon updates",
53153
+ example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
53154
+ kinds: ["addon-update-available", "addon-updated"]
53112
53155
  },
53113
53156
  {
53114
53157
  name: "summaryUpdates",
@@ -53192,6 +53235,7 @@ var STATE_SUMMARY_VARS = [
53192
53235
  [...RULE_BODY_ONLY],
53193
53236
  [...RULE_TEXT],
53194
53237
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
53238
+ ([...RULE_TEXT], [...COMBINED_ALARM]),
53195
53239
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
53196
53240
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
53197
53241
  ([...RULE_TEXT], [...CONSUMABLE]),
@@ -53232,6 +53276,8 @@ var STATE_SUMMARY_VARS = [
53232
53276
  [...RULE_TEXT],
53233
53277
  [...RULE_TEXT],
53234
53278
  [...RULE_TEXT],
53279
+ [...RULE_TEXT],
53280
+ [...RULE_TEXT],
53235
53281
  ...STATE_SUMMARY_VARS
53236
53282
  ];
53237
53283
  new Set([
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  //#endregion
6
- const require_dist = require("../dist-M6hP_tw3.js");
6
+ const require_dist = require("../dist-BE_WMCdp.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  //#region src/ha-export/topics.ts
9
9
  /**
@@ -1,4 +1,4 @@
1
- import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Ft as EventCategory, I as deviceExportCapability, St as nodePin, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, jt as string, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-BgTykMb6.mjs";
1
+ import { $ as oauthIntegrationCapability, C as buildAddonRouteProvider, Ft as EventCategory, I as deviceExportCapability, St as nodePin, a as COCO_TO_MACRO, bt as BaseAddon, c as FanDirectionSchema, i as CAMERA_SWITCH_ORDER, jt as string, l as HvacModeSchema, o as CameraSwitchIdSchema, p as addonRoutesCapability, t as AlarmArmModeSchema, u as MediaPlayerRepeatSchema } from "../dist-Ck6d87Ov.mjs";
2
2
  import { createHmac, timingSafeEqual } from "node:crypto";
3
3
  //#region src/ha-export/topics.ts
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.158",
3
+ "version": "1.2.159",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",