@camstack/addon-provider-homeassistant 1.2.38 → 1.2.40

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-3KejG9q2.js");
2
+ const require_dist = require("./dist-BoTrJXhA.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_zlib = require("node:zlib");
5
5
  //#region src/ha-device-source.ts
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-CJ3sUHKH.mjs";
1
+ import { $ as pressureSensorCapability, A as coverCapability, B as imageCapability, C as buttonCapability, Ct as record, D as connectivityCapability, Dt as url, E as colorCapability, Et as unknown, F as fanControlCapability, G as normalizeUnit, H as lockControlCapability, I as floodCapability, J as numericSensorCapability, K as notificationOutputCapability, L as gasCapability, N as enumSensorCapability, O as contactCapability, Ot as EventCategory, P as eventEmitterCapability, Q as presenceCapability, R as humidifierCapability, S as buildAddonRouteProvider, St as object, T as climateControlCapability, Tt as union, U as mediaPlayerCapability, V as lawnMowerControlCapability, W as motionCapability, X as powerMeterCapability, Z as prepareNotification, _ as batteryCapability, _t as _enum, at as updateCapability, b as brightnessCapability, bt as literal, ct as vibrationCapability, d as accessoriesCapability, dt as errMsg, et as scriptRunnerCapability, f as addonRoutesCapability, g as automationControlCapability, gt as createEvent, h as ambientLightSensorCapability, ht as DeviceType, it as temperatureSensorCapability, j as deviceAdoptionCapability, k as controlCapability, lt as waterHeaterCapability, m as alarmPanelCapability, mt as DeviceRole, n as BaseDevice, nt as switchCapability, o as EnumSensorDateTimeFormatSchema, ot as vacuumControlCapability, p as airQualitySensorCapability, pt as DeviceFeature, q as notifierCapability, r as BaseDeviceProvider, rt as tamperCapability, st as valveCapability, tt as smokeCapability, u as TargetSchema, ut as weatherCapability, v as bestLocationMatch, vt as array, w as carbonMonoxideCapability, wt as string, x as brokerCapability, xt as number, y as binaryCapability, yt as discriminatedUnion, z as humiditySensorCapability } from "./dist-DeursJRH.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
4
4
  //#region src/ha-device-source.ts
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-XfKNtfCc.mjs
1
+ //#region ../types/dist/event-category-CIa_iT6b.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -14,6 +14,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
14
14
  */
15
15
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
16
16
  /**
17
+ * The hub reissued its own TLS certificate at boot (`ensureTlsCert`).
18
+ * Emitted only when the material on disk actually changed, so an
19
+ * operator who trusted the old certificate by hand is told rather than
20
+ * discovering it as a browser error. Payload `TlsCertChangedPayload`.
21
+ *
22
+ * Rule: docs/decisions/adr-0227-*.md
23
+ */
24
+ EventCategory["SystemTlsCertChanged"] = "system.tls-cert-changed";
25
+ /**
17
26
  * A newer addon or server-root package version was found by the
18
27
  * authoritative registry check. Emitted once when any observed
19
28
  * `latestVersion` changes (or a package/node first appears behind);
@@ -8129,6 +8138,15 @@ var LabelDefinitionSchema = object({
8129
8138
  description: string().optional(),
8130
8139
  icon: string().optional()
8131
8140
  });
8141
+ var ClassMapDefinitionSchema = object({
8142
+ mapping: record(string(), _enum([
8143
+ "person",
8144
+ "vehicle",
8145
+ "animal",
8146
+ "package"
8147
+ ])),
8148
+ preserveOriginal: boolean()
8149
+ });
8132
8150
  var MODEL_FORMATS = [
8133
8151
  "onnx",
8134
8152
  "coreml",
@@ -8307,7 +8325,13 @@ var ModelCatalogEntrySchema = object({
8307
8325
  * `id` stays the source of truth for resolution/download/persistence; grouping
8308
8326
  * is a presentation overlay resolved back to an `id`.
8309
8327
  */
8310
- group: ModelVariantGroupSchema.optional()
8328
+ group: ModelVariantGroupSchema.optional(),
8329
+ /**
8330
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8331
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8332
+ * labels already ARE the CamStack macros (Scrypted identity map).
8333
+ */
8334
+ classMap: ClassMapDefinitionSchema.optional()
8311
8335
  });
8312
8336
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8313
8337
  format: literal("openvino"),
@@ -8336,7 +8360,8 @@ var ModelConvertMetadataSchema = object({
8336
8360
  "ocr",
8337
8361
  "segmentation"
8338
8362
  ]),
8339
- faceAlignment: boolean().optional()
8363
+ faceAlignment: boolean().optional(),
8364
+ classMap: ClassMapDefinitionSchema.optional()
8340
8365
  });
8341
8366
  var ConvertResultSchema = object({
8342
8367
  entry: ModelCatalogEntrySchema,
@@ -17804,6 +17829,33 @@ var NativeCropRefSchema = object({
17804
17829
  h: number()
17805
17830
  })
17806
17831
  });
17832
+ object({
17833
+ crop: object({
17834
+ left: number(),
17835
+ top: number(),
17836
+ width: number().positive(),
17837
+ height: number().positive()
17838
+ }).optional(),
17839
+ content: object({
17840
+ width: number().int().positive(),
17841
+ height: number().int().positive()
17842
+ }),
17843
+ fit: _enum(["stretch", "contain"]),
17844
+ format: _enum([
17845
+ "rgb",
17846
+ "gray",
17847
+ "jpeg"
17848
+ ])
17849
+ });
17850
+ var FrameRefSchema = object({
17851
+ registryId: string().min(1),
17852
+ id: string().min(1),
17853
+ width: number().int().positive(),
17854
+ height: number().int().positive(),
17855
+ format: _enum(["rgb", "gray"]),
17856
+ timestamp: number(),
17857
+ capturedAt: number().optional()
17858
+ });
17807
17859
  var ModelFormatSchema$1 = _enum([
17808
17860
  "onnx",
17809
17861
  "coreml",
@@ -18048,6 +18100,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
18048
18100
  steps: array(PipelineStepInputSchema).min(1),
18049
18101
  frame: FrameInputSchema.optional(),
18050
18102
  /**
18103
+ * Process-local lazy frame. Valid only when caller and provider resolve
18104
+ * in the same execution-group process; split/cross-node callers use
18105
+ * `frame`/`image` inline compatibility instead.
18106
+ */
18107
+ frameRef: FrameRefSchema.optional(),
18108
+ /**
18051
18109
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
18052
18110
  * the decoded pixels live in. One more member of the one-of
18053
18111
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18343,7 +18401,10 @@ var NativeCropResultSchema = object({
18343
18401
  * Which source served this crop, so a quality-sensitive consumer (the native
18344
18402
  * `keyFrame`) can reject a degraded fallback:
18345
18403
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18346
- * quality path).
18404
+ * quality path). A subject-tile serve is also native-resolution and stays
18405
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18406
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18407
+ * internal crop result (`nativeHits` vs `tileHits`).
18347
18408
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18348
18409
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18349
18410
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18834,12 +18895,41 @@ var RunnerLocalLoadSchema = object({
18834
18895
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18835
18896
  * working unchanged when they switch to reading from the runner cap.
18836
18897
  */
18898
+ var FrameLazyCountersSchema = object({
18899
+ framesDecoded: number(),
18900
+ framesAdmitted: number(),
18901
+ framesDroppedPixelFree: number(),
18902
+ viewsMaterialized: number(),
18903
+ viewsSkipped: number(),
18904
+ workerToRunnerBytes: number(),
18905
+ runnerToPoolRawBytes: number(),
18906
+ runnerToPoolJpegBytes: number(),
18907
+ onDemandFullFrameRequests: number(),
18908
+ onDemandCropRequests: number(),
18909
+ nativeHits: number(),
18910
+ nativeMisses: number(),
18911
+ tileHits: number(),
18912
+ tileMisses: number(),
18913
+ fallbackHits: number(),
18914
+ fallbackMisses: number(),
18915
+ retainedWritesAvoided: number(),
18916
+ residentRefs: number(),
18917
+ residentBytes: number(),
18918
+ releases: number(),
18919
+ evictions: number(),
18920
+ staleMisses: number()
18921
+ });
18922
+ var FrameLazyMetricsSchema = object({
18923
+ node: FrameLazyCountersSchema,
18924
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18925
+ });
18837
18926
  var RunnerLocalMetricsSchema = object({
18838
18927
  nodeId: string(),
18839
18928
  activeCameras: number(),
18840
18929
  throttledCameras: number(),
18841
18930
  avgInferenceTimeMs: number(),
18842
- queueDepth: number()
18931
+ queueDepth: number(),
18932
+ frameLazy: FrameLazyMetricsSchema.optional()
18843
18933
  });
18844
18934
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
18845
18935
  handle: FrameHandleSchema,
@@ -20139,6 +20229,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20139
20229
  location: StorageLocationSchema,
20140
20230
  relativePath: string()
20141
20231
  }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
20232
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20233
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20234
+ var ProfileSettingsBagSchema = record(string(), unknown());
20142
20235
  /**
20143
20236
  * A live terminal session hosted by the provider addon. Output and input do
20144
20237
  * NOT flow through the capability — they use the addon data plane
@@ -20168,7 +20261,14 @@ var TerminalSessionInfoSchema = object({
20168
20261
  var TerminalProfileInfoSchema = object({
20169
20262
  profileId: string(),
20170
20263
  label: string(),
20171
- description: string().optional()
20264
+ description: string().optional(),
20265
+ /** Spawn defaults the instance form copies on create. */
20266
+ executable: string().optional(),
20267
+ args: array(string()).readonly().optional(),
20268
+ cwd: string().optional(),
20269
+ environment: array(string()).readonly().optional(),
20270
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20271
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20172
20272
  });
20173
20273
  /**
20174
20274
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20181,7 +20281,12 @@ var TerminalInstanceInfoSchema = object({
20181
20281
  profileId: string(),
20182
20282
  profileLabel: string(),
20183
20283
  name: string(),
20184
- enabled: boolean()
20284
+ enabled: boolean(),
20285
+ executable: string(),
20286
+ args: array(string()).readonly(),
20287
+ cwd: string(),
20288
+ environment: array(string()).readonly(),
20289
+ profileSettings: ProfileSettingsBagSchema
20185
20290
  });
20186
20291
  var TerminalLegacyCameraSchema = object({
20187
20292
  stableId: string(),
@@ -20211,7 +20316,23 @@ var TerminalOutputBatchSchema = object({
20211
20316
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20212
20317
  targetNodeId: string().min(1),
20213
20318
  profileId: string().min(1),
20214
- name: string().trim().min(1).max(160).optional()
20319
+ name: string().trim().min(1).max(160).optional(),
20320
+ executable: string().max(1024).optional(),
20321
+ args: array(string().max(2048)).max(64).optional(),
20322
+ cwd: string().max(1024).optional(),
20323
+ environment: array(string().max(4096)).max(64).optional(),
20324
+ profileSettings: ProfileSettingsBagSchema.optional()
20325
+ }), TerminalInstanceInfoSchema, {
20326
+ kind: "mutation",
20327
+ auth: "admin"
20328
+ }), method(object({
20329
+ instanceId: string().min(1),
20330
+ name: string().trim().min(1).max(160).optional(),
20331
+ executable: string().max(1024).optional(),
20332
+ args: array(string().max(2048)).max(64).optional(),
20333
+ cwd: string().max(1024).optional(),
20334
+ environment: array(string().max(4096)).max(64).optional(),
20335
+ profileSettings: ProfileSettingsBagSchema.optional()
20215
20336
  }), TerminalInstanceInfoSchema, {
20216
20337
  kind: "mutation",
20217
20338
  auth: "admin"
@@ -20233,7 +20354,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20233
20354
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20234
20355
  profileId: string(),
20235
20356
  cols: number().int().positive(),
20236
- rows: number().int().positive()
20357
+ rows: number().int().positive(),
20358
+ executable: string().max(1024).optional(),
20359
+ args: array(string().max(2048)).max(64).optional(),
20360
+ cwd: string().max(1024).optional(),
20361
+ environment: array(string().max(4096)).max(64).optional()
20237
20362
  }), TerminalSessionInfoSchema, {
20238
20363
  kind: "mutation",
20239
20364
  auth: "admin"
@@ -24197,10 +24322,10 @@ var lawnMowerControlCapability = {
24197
24322
  *
24198
24323
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24199
24324
  * to receive an ordered list of candidate base URLs it should race
24200
- * on connect — LAN IPv4 first (lowest latency when on same network),
24201
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24202
- * race them with short timeouts and stick with the winner for the
24203
- * session.
24325
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24326
+ * when on the same network), then public hostname (if a tunnel is
24327
+ * up). The SDK can race them with short timeouts and stick with the
24328
+ * winner for the session.
24204
24329
  *
24205
24330
  * Why hub-only: agents are not directly addressable by the operator's
24206
24331
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24355,6 +24480,17 @@ var NotificationEndpointSchema = object({
24355
24480
  /** What the ranking currently resolves to (null when nothing is reachable). */
24356
24481
  resolved: string().nullable()
24357
24482
  });
24483
+ /**
24484
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24485
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24486
+ * currently expands to, so the UI can show the effective set either way.
24487
+ */
24488
+ var ViewerEndpointsSchema = object({
24489
+ /** The operator's explicit race set, or empty for AUTO. */
24490
+ baseUrls: array(string()).readonly(),
24491
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24492
+ resolved: array(string()).readonly()
24493
+ });
24358
24494
  var AllowedAddressesSchema = object({
24359
24495
  /**
24360
24496
  * Allowlist of interface addresses operators have explicitly opted
@@ -24363,6 +24499,20 @@ var AllowedAddressesSchema = object({
24363
24499
  * Network Addresses admin page and persisted by the addon.
24364
24500
  */
24365
24501
  addresses: array(string()).readonly() });
24502
+ var TlsStatusSchema = object({
24503
+ mode: _enum([
24504
+ "generated",
24505
+ "uploaded",
24506
+ "disabled"
24507
+ ]),
24508
+ leafFingerprintSha256: string().nullable(),
24509
+ caFingerprintSha256: string().nullable(),
24510
+ validTo: string().nullable(),
24511
+ sans: array(string()),
24512
+ caCertPem: string().nullable(),
24513
+ reissueError: string().nullable(),
24514
+ restartRequired: boolean()
24515
+ });
24366
24516
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24367
24517
  /**
24368
24518
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24372,17 +24522,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24372
24522
  */
24373
24523
  port: number().int().min(1).max(65535).optional(),
24374
24524
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24375
- * candidate. Default `true`. */
24525
+ * candidate. Default `false` — loopback is not a client route. */
24376
24526
  includeLoopback: boolean().optional(),
24377
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24378
- * Default `false`. */
24527
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24528
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24529
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24379
24530
  ipv4Only: boolean().optional(),
24380
24531
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24381
24532
  * Pass `'https'` when the caller is itself loaded over HTTPS
24382
24533
  * to avoid mixed-content blocks in the browser. The public
24383
24534
  * tunnel always emits `https://` regardless. */
24384
24535
  scheme: _enum(["http", "https"]).optional()
24385
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
24536
+ }), 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, {
24537
+ kind: "mutation",
24538
+ auth: "admin"
24539
+ }), method(object({
24540
+ certPem: string().min(1),
24541
+ keyPem: string().min(1),
24542
+ caPem: string().optional()
24543
+ }), TlsStatusSchema, {
24544
+ kind: "mutation",
24545
+ auth: "admin"
24546
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24547
+ kind: "mutation",
24548
+ auth: "admin"
24549
+ });
24386
24550
  var LockControlStatusSchema = object({
24387
24551
  /** Lifecycle state of the lock. `jammed` means the motor reported
24388
24552
  * failure to reach the target — operator intervention required. */
@@ -32409,6 +32573,12 @@ Object.freeze({
32409
32573
  addonId: null,
32410
32574
  access: "create"
32411
32575
  },
32576
+ "localNetwork.downloadCa": {
32577
+ capName: "local-network",
32578
+ capScope: "system",
32579
+ addonId: null,
32580
+ access: "view"
32581
+ },
32412
32582
  "localNetwork.getAllowedAddresses": {
32413
32583
  capName: "local-network",
32414
32584
  capScope: "system",
@@ -32433,18 +32603,42 @@ Object.freeze({
32433
32603
  addonId: null,
32434
32604
  access: "view"
32435
32605
  },
32606
+ "localNetwork.getTlsStatus": {
32607
+ capName: "local-network",
32608
+ capScope: "system",
32609
+ addonId: null,
32610
+ access: "view"
32611
+ },
32612
+ "localNetwork.getViewerEndpoints": {
32613
+ capName: "local-network",
32614
+ capScope: "system",
32615
+ addonId: null,
32616
+ access: "view"
32617
+ },
32436
32618
  "localNetwork.list": {
32437
32619
  capName: "local-network",
32438
32620
  capScope: "system",
32439
32621
  addonId: null,
32440
32622
  access: "view"
32441
32623
  },
32624
+ "localNetwork.regenerateCertificate": {
32625
+ capName: "local-network",
32626
+ capScope: "system",
32627
+ addonId: null,
32628
+ access: "create"
32629
+ },
32442
32630
  "localNetwork.resetAllowlistToBestMatch": {
32443
32631
  capName: "local-network",
32444
32632
  capScope: "system",
32445
32633
  addonId: null,
32446
32634
  access: "delete"
32447
32635
  },
32636
+ "localNetwork.revertToGeneratedCertificate": {
32637
+ capName: "local-network",
32638
+ capScope: "system",
32639
+ addonId: null,
32640
+ access: "create"
32641
+ },
32448
32642
  "localNetwork.setAllowedAddresses": {
32449
32643
  capName: "local-network",
32450
32644
  capScope: "system",
@@ -32457,6 +32651,18 @@ Object.freeze({
32457
32651
  addonId: null,
32458
32652
  access: "create"
32459
32653
  },
32654
+ "localNetwork.setViewerEndpoints": {
32655
+ capName: "local-network",
32656
+ capScope: "system",
32657
+ addonId: null,
32658
+ access: "create"
32659
+ },
32660
+ "localNetwork.uploadCertificate": {
32661
+ capName: "local-network",
32662
+ capScope: "system",
32663
+ addonId: null,
32664
+ access: "create"
32665
+ },
32460
32666
  "lockControl.lock": {
32461
32667
  capName: "lock-control",
32462
32668
  capScope: "device",
@@ -35337,6 +35543,12 @@ Object.freeze({
35337
35543
  addonId: null,
35338
35544
  access: "create"
35339
35545
  },
35546
+ "terminalSession.updateInstance": {
35547
+ capName: "terminal-session",
35548
+ capScope: "system",
35549
+ addonId: null,
35550
+ access: "create"
35551
+ },
35340
35552
  "terminalSession.writeInput": {
35341
35553
  capName: "terminal-session",
35342
35554
  capScope: "system",
@@ -38031,6 +38243,35 @@ Object.freeze(Object.fromEntries([{
38031
38243
  }]
38032
38244
  }].map((s) => [s.stepId, s.defaultModelId])));
38033
38245
  string().min(1);
38246
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38247
+ stepId: "face-embedding",
38248
+ key: "minLandmarkFaceSize",
38249
+ label: "Min face size for recognition (detection px)",
38250
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
38251
+ type: "slider",
38252
+ min: 0,
38253
+ max: 64,
38254
+ step: 2,
38255
+ default: 24
38256
+ }];
38257
+ function clusterStepSettingKey(stepId, fieldKey) {
38258
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38259
+ }
38260
+ var ClusterSettingNumberSchema = number().finite();
38261
+ function readClusterStepSettings(config) {
38262
+ const out = {};
38263
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38264
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38265
+ const value = parsed.success ? parsed.data : field.default;
38266
+ const existing = out[field.stepId] ?? {};
38267
+ out[field.stepId] = {
38268
+ ...existing,
38269
+ [field.key]: value
38270
+ };
38271
+ }
38272
+ return out;
38273
+ }
38274
+ readClusterStepSettings({});
38034
38275
  object({
38035
38276
  /**
38036
38277
  * Fraction of the box's own size added on EACH side before cutting.
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-XfKNtfCc.mjs
1
+ //#region ../types/dist/event-category-CIa_iT6b.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -14,6 +14,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
14
14
  */
15
15
  EventCategory["SystemRestartCompleted"] = "system.restart-completed";
16
16
  /**
17
+ * The hub reissued its own TLS certificate at boot (`ensureTlsCert`).
18
+ * Emitted only when the material on disk actually changed, so an
19
+ * operator who trusted the old certificate by hand is told rather than
20
+ * discovering it as a browser error. Payload `TlsCertChangedPayload`.
21
+ *
22
+ * Rule: docs/decisions/adr-0227-*.md
23
+ */
24
+ EventCategory["SystemTlsCertChanged"] = "system.tls-cert-changed";
25
+ /**
17
26
  * A newer addon or server-root package version was found by the
18
27
  * authoritative registry check. Emitted once when any observed
19
28
  * `latestVersion` changes (or a package/node first appears behind);
@@ -8129,6 +8138,15 @@ var LabelDefinitionSchema = object({
8129
8138
  description: string().optional(),
8130
8139
  icon: string().optional()
8131
8140
  });
8141
+ var ClassMapDefinitionSchema = object({
8142
+ mapping: record(string(), _enum([
8143
+ "person",
8144
+ "vehicle",
8145
+ "animal",
8146
+ "package"
8147
+ ])),
8148
+ preserveOriginal: boolean()
8149
+ });
8132
8150
  var MODEL_FORMATS = [
8133
8151
  "onnx",
8134
8152
  "coreml",
@@ -8307,7 +8325,13 @@ var ModelCatalogEntrySchema = object({
8307
8325
  * `id` stays the source of truth for resolution/download/persistence; grouping
8308
8326
  * is a presentation overlay resolved back to an `id`.
8309
8327
  */
8310
- group: ModelVariantGroupSchema.optional()
8328
+ group: ModelVariantGroupSchema.optional(),
8329
+ /**
8330
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8331
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8332
+ * labels already ARE the CamStack macros (Scrypted identity map).
8333
+ */
8334
+ classMap: ClassMapDefinitionSchema.optional()
8311
8335
  });
8312
8336
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8313
8337
  format: literal("openvino"),
@@ -8336,7 +8360,8 @@ var ModelConvertMetadataSchema = object({
8336
8360
  "ocr",
8337
8361
  "segmentation"
8338
8362
  ]),
8339
- faceAlignment: boolean().optional()
8363
+ faceAlignment: boolean().optional(),
8364
+ classMap: ClassMapDefinitionSchema.optional()
8340
8365
  });
8341
8366
  var ConvertResultSchema = object({
8342
8367
  entry: ModelCatalogEntrySchema,
@@ -17804,6 +17829,33 @@ var NativeCropRefSchema = object({
17804
17829
  h: number()
17805
17830
  })
17806
17831
  });
17832
+ object({
17833
+ crop: object({
17834
+ left: number(),
17835
+ top: number(),
17836
+ width: number().positive(),
17837
+ height: number().positive()
17838
+ }).optional(),
17839
+ content: object({
17840
+ width: number().int().positive(),
17841
+ height: number().int().positive()
17842
+ }),
17843
+ fit: _enum(["stretch", "contain"]),
17844
+ format: _enum([
17845
+ "rgb",
17846
+ "gray",
17847
+ "jpeg"
17848
+ ])
17849
+ });
17850
+ var FrameRefSchema = object({
17851
+ registryId: string().min(1),
17852
+ id: string().min(1),
17853
+ width: number().int().positive(),
17854
+ height: number().int().positive(),
17855
+ format: _enum(["rgb", "gray"]),
17856
+ timestamp: number(),
17857
+ capturedAt: number().optional()
17858
+ });
17807
17859
  var ModelFormatSchema$1 = _enum([
17808
17860
  "onnx",
17809
17861
  "coreml",
@@ -18048,6 +18100,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
18048
18100
  steps: array(PipelineStepInputSchema).min(1),
18049
18101
  frame: FrameInputSchema.optional(),
18050
18102
  /**
18103
+ * Process-local lazy frame. Valid only when caller and provider resolve
18104
+ * in the same execution-group process; split/cross-node callers use
18105
+ * `frame`/`image` inline compatibility instead.
18106
+ */
18107
+ frameRef: FrameRefSchema.optional(),
18108
+ /**
18051
18109
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
18052
18110
  * the decoded pixels live in. One more member of the one-of
18053
18111
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18343,7 +18401,10 @@ var NativeCropResultSchema = object({
18343
18401
  * Which source served this crop, so a quality-sensitive consumer (the native
18344
18402
  * `keyFrame`) can reject a degraded fallback:
18345
18403
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18346
- * quality path).
18404
+ * quality path). A subject-tile serve is also native-resolution and stays
18405
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18406
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18407
+ * internal crop result (`nativeHits` vs `tileHits`).
18347
18408
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18348
18409
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18349
18410
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18834,12 +18895,41 @@ var RunnerLocalLoadSchema = object({
18834
18895
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18835
18896
  * working unchanged when they switch to reading from the runner cap.
18836
18897
  */
18898
+ var FrameLazyCountersSchema = object({
18899
+ framesDecoded: number(),
18900
+ framesAdmitted: number(),
18901
+ framesDroppedPixelFree: number(),
18902
+ viewsMaterialized: number(),
18903
+ viewsSkipped: number(),
18904
+ workerToRunnerBytes: number(),
18905
+ runnerToPoolRawBytes: number(),
18906
+ runnerToPoolJpegBytes: number(),
18907
+ onDemandFullFrameRequests: number(),
18908
+ onDemandCropRequests: number(),
18909
+ nativeHits: number(),
18910
+ nativeMisses: number(),
18911
+ tileHits: number(),
18912
+ tileMisses: number(),
18913
+ fallbackHits: number(),
18914
+ fallbackMisses: number(),
18915
+ retainedWritesAvoided: number(),
18916
+ residentRefs: number(),
18917
+ residentBytes: number(),
18918
+ releases: number(),
18919
+ evictions: number(),
18920
+ staleMisses: number()
18921
+ });
18922
+ var FrameLazyMetricsSchema = object({
18923
+ node: FrameLazyCountersSchema,
18924
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18925
+ });
18837
18926
  var RunnerLocalMetricsSchema = object({
18838
18927
  nodeId: string(),
18839
18928
  activeCameras: number(),
18840
18929
  throttledCameras: number(),
18841
18930
  avgInferenceTimeMs: number(),
18842
- queueDepth: number()
18931
+ queueDepth: number(),
18932
+ frameLazy: FrameLazyMetricsSchema.optional()
18843
18933
  });
18844
18934
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
18845
18935
  handle: FrameHandleSchema,
@@ -20139,6 +20229,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20139
20229
  location: StorageLocationSchema,
20140
20230
  relativePath: string()
20141
20231
  }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
20232
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20233
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20234
+ var ProfileSettingsBagSchema = record(string(), unknown());
20142
20235
  /**
20143
20236
  * A live terminal session hosted by the provider addon. Output and input do
20144
20237
  * NOT flow through the capability — they use the addon data plane
@@ -20168,7 +20261,14 @@ var TerminalSessionInfoSchema = object({
20168
20261
  var TerminalProfileInfoSchema = object({
20169
20262
  profileId: string(),
20170
20263
  label: string(),
20171
- description: string().optional()
20264
+ description: string().optional(),
20265
+ /** Spawn defaults the instance form copies on create. */
20266
+ executable: string().optional(),
20267
+ args: array(string()).readonly().optional(),
20268
+ cwd: string().optional(),
20269
+ environment: array(string()).readonly().optional(),
20270
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20271
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20172
20272
  });
20173
20273
  /**
20174
20274
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20181,7 +20281,12 @@ var TerminalInstanceInfoSchema = object({
20181
20281
  profileId: string(),
20182
20282
  profileLabel: string(),
20183
20283
  name: string(),
20184
- enabled: boolean()
20284
+ enabled: boolean(),
20285
+ executable: string(),
20286
+ args: array(string()).readonly(),
20287
+ cwd: string(),
20288
+ environment: array(string()).readonly(),
20289
+ profileSettings: ProfileSettingsBagSchema
20185
20290
  });
20186
20291
  var TerminalLegacyCameraSchema = object({
20187
20292
  stableId: string(),
@@ -20211,7 +20316,23 @@ var TerminalOutputBatchSchema = object({
20211
20316
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20212
20317
  targetNodeId: string().min(1),
20213
20318
  profileId: string().min(1),
20214
- name: string().trim().min(1).max(160).optional()
20319
+ name: string().trim().min(1).max(160).optional(),
20320
+ executable: string().max(1024).optional(),
20321
+ args: array(string().max(2048)).max(64).optional(),
20322
+ cwd: string().max(1024).optional(),
20323
+ environment: array(string().max(4096)).max(64).optional(),
20324
+ profileSettings: ProfileSettingsBagSchema.optional()
20325
+ }), TerminalInstanceInfoSchema, {
20326
+ kind: "mutation",
20327
+ auth: "admin"
20328
+ }), method(object({
20329
+ instanceId: string().min(1),
20330
+ name: string().trim().min(1).max(160).optional(),
20331
+ executable: string().max(1024).optional(),
20332
+ args: array(string().max(2048)).max(64).optional(),
20333
+ cwd: string().max(1024).optional(),
20334
+ environment: array(string().max(4096)).max(64).optional(),
20335
+ profileSettings: ProfileSettingsBagSchema.optional()
20215
20336
  }), TerminalInstanceInfoSchema, {
20216
20337
  kind: "mutation",
20217
20338
  auth: "admin"
@@ -20233,7 +20354,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20233
20354
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20234
20355
  profileId: string(),
20235
20356
  cols: number().int().positive(),
20236
- rows: number().int().positive()
20357
+ rows: number().int().positive(),
20358
+ executable: string().max(1024).optional(),
20359
+ args: array(string().max(2048)).max(64).optional(),
20360
+ cwd: string().max(1024).optional(),
20361
+ environment: array(string().max(4096)).max(64).optional()
20237
20362
  }), TerminalSessionInfoSchema, {
20238
20363
  kind: "mutation",
20239
20364
  auth: "admin"
@@ -24197,10 +24322,10 @@ var lawnMowerControlCapability = {
24197
24322
  *
24198
24323
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24199
24324
  * to receive an ordered list of candidate base URLs it should race
24200
- * on connect — LAN IPv4 first (lowest latency when on same network),
24201
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24202
- * race them with short timeouts and stick with the winner for the
24203
- * session.
24325
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24326
+ * when on the same network), then public hostname (if a tunnel is
24327
+ * up). The SDK can race them with short timeouts and stick with the
24328
+ * winner for the session.
24204
24329
  *
24205
24330
  * Why hub-only: agents are not directly addressable by the operator's
24206
24331
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24355,6 +24480,17 @@ var NotificationEndpointSchema = object({
24355
24480
  /** What the ranking currently resolves to (null when nothing is reachable). */
24356
24481
  resolved: string().nullable()
24357
24482
  });
24483
+ /**
24484
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24485
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24486
+ * currently expands to, so the UI can show the effective set either way.
24487
+ */
24488
+ var ViewerEndpointsSchema = object({
24489
+ /** The operator's explicit race set, or empty for AUTO. */
24490
+ baseUrls: array(string()).readonly(),
24491
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24492
+ resolved: array(string()).readonly()
24493
+ });
24358
24494
  var AllowedAddressesSchema = object({
24359
24495
  /**
24360
24496
  * Allowlist of interface addresses operators have explicitly opted
@@ -24363,6 +24499,20 @@ var AllowedAddressesSchema = object({
24363
24499
  * Network Addresses admin page and persisted by the addon.
24364
24500
  */
24365
24501
  addresses: array(string()).readonly() });
24502
+ var TlsStatusSchema = object({
24503
+ mode: _enum([
24504
+ "generated",
24505
+ "uploaded",
24506
+ "disabled"
24507
+ ]),
24508
+ leafFingerprintSha256: string().nullable(),
24509
+ caFingerprintSha256: string().nullable(),
24510
+ validTo: string().nullable(),
24511
+ sans: array(string()),
24512
+ caCertPem: string().nullable(),
24513
+ reissueError: string().nullable(),
24514
+ restartRequired: boolean()
24515
+ });
24366
24516
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24367
24517
  /**
24368
24518
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24372,17 +24522,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24372
24522
  */
24373
24523
  port: number().int().min(1).max(65535).optional(),
24374
24524
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24375
- * candidate. Default `true`. */
24525
+ * candidate. Default `false` — loopback is not a client route. */
24376
24526
  includeLoopback: boolean().optional(),
24377
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24378
- * Default `false`. */
24527
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24528
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24529
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24379
24530
  ipv4Only: boolean().optional(),
24380
24531
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24381
24532
  * Pass `'https'` when the caller is itself loaded over HTTPS
24382
24533
  * to avoid mixed-content blocks in the browser. The public
24383
24534
  * tunnel always emits `https://` regardless. */
24384
24535
  scheme: _enum(["http", "https"]).optional()
24385
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
24536
+ }), 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, {
24537
+ kind: "mutation",
24538
+ auth: "admin"
24539
+ }), method(object({
24540
+ certPem: string().min(1),
24541
+ keyPem: string().min(1),
24542
+ caPem: string().optional()
24543
+ }), TlsStatusSchema, {
24544
+ kind: "mutation",
24545
+ auth: "admin"
24546
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24547
+ kind: "mutation",
24548
+ auth: "admin"
24549
+ });
24386
24550
  var LockControlStatusSchema = object({
24387
24551
  /** Lifecycle state of the lock. `jammed` means the motor reported
24388
24552
  * failure to reach the target — operator intervention required. */
@@ -32409,6 +32573,12 @@ Object.freeze({
32409
32573
  addonId: null,
32410
32574
  access: "create"
32411
32575
  },
32576
+ "localNetwork.downloadCa": {
32577
+ capName: "local-network",
32578
+ capScope: "system",
32579
+ addonId: null,
32580
+ access: "view"
32581
+ },
32412
32582
  "localNetwork.getAllowedAddresses": {
32413
32583
  capName: "local-network",
32414
32584
  capScope: "system",
@@ -32433,18 +32603,42 @@ Object.freeze({
32433
32603
  addonId: null,
32434
32604
  access: "view"
32435
32605
  },
32606
+ "localNetwork.getTlsStatus": {
32607
+ capName: "local-network",
32608
+ capScope: "system",
32609
+ addonId: null,
32610
+ access: "view"
32611
+ },
32612
+ "localNetwork.getViewerEndpoints": {
32613
+ capName: "local-network",
32614
+ capScope: "system",
32615
+ addonId: null,
32616
+ access: "view"
32617
+ },
32436
32618
  "localNetwork.list": {
32437
32619
  capName: "local-network",
32438
32620
  capScope: "system",
32439
32621
  addonId: null,
32440
32622
  access: "view"
32441
32623
  },
32624
+ "localNetwork.regenerateCertificate": {
32625
+ capName: "local-network",
32626
+ capScope: "system",
32627
+ addonId: null,
32628
+ access: "create"
32629
+ },
32442
32630
  "localNetwork.resetAllowlistToBestMatch": {
32443
32631
  capName: "local-network",
32444
32632
  capScope: "system",
32445
32633
  addonId: null,
32446
32634
  access: "delete"
32447
32635
  },
32636
+ "localNetwork.revertToGeneratedCertificate": {
32637
+ capName: "local-network",
32638
+ capScope: "system",
32639
+ addonId: null,
32640
+ access: "create"
32641
+ },
32448
32642
  "localNetwork.setAllowedAddresses": {
32449
32643
  capName: "local-network",
32450
32644
  capScope: "system",
@@ -32457,6 +32651,18 @@ Object.freeze({
32457
32651
  addonId: null,
32458
32652
  access: "create"
32459
32653
  },
32654
+ "localNetwork.setViewerEndpoints": {
32655
+ capName: "local-network",
32656
+ capScope: "system",
32657
+ addonId: null,
32658
+ access: "create"
32659
+ },
32660
+ "localNetwork.uploadCertificate": {
32661
+ capName: "local-network",
32662
+ capScope: "system",
32663
+ addonId: null,
32664
+ access: "create"
32665
+ },
32460
32666
  "lockControl.lock": {
32461
32667
  capName: "lock-control",
32462
32668
  capScope: "device",
@@ -35337,6 +35543,12 @@ Object.freeze({
35337
35543
  addonId: null,
35338
35544
  access: "create"
35339
35545
  },
35546
+ "terminalSession.updateInstance": {
35547
+ capName: "terminal-session",
35548
+ capScope: "system",
35549
+ addonId: null,
35550
+ access: "create"
35551
+ },
35340
35552
  "terminalSession.writeInput": {
35341
35553
  capName: "terminal-session",
35342
35554
  capScope: "system",
@@ -38031,6 +38243,35 @@ Object.freeze(Object.fromEntries([{
38031
38243
  }]
38032
38244
  }].map((s) => [s.stepId, s.defaultModelId])));
38033
38245
  string().min(1);
38246
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38247
+ stepId: "face-embedding",
38248
+ key: "minLandmarkFaceSize",
38249
+ label: "Min face size for recognition (detection px)",
38250
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
38251
+ type: "slider",
38252
+ min: 0,
38253
+ max: 64,
38254
+ step: 2,
38255
+ default: 24
38256
+ }];
38257
+ function clusterStepSettingKey(stepId, fieldKey) {
38258
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38259
+ }
38260
+ var ClusterSettingNumberSchema = number().finite();
38261
+ function readClusterStepSettings(config) {
38262
+ const out = {};
38263
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38264
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38265
+ const value = parsed.success ? parsed.data : field.default;
38266
+ const existing = out[field.stepId] ?? {};
38267
+ out[field.stepId] = {
38268
+ ...existing,
38269
+ [field.key]: value
38270
+ };
38271
+ }
38272
+ return out;
38273
+ }
38274
+ readClusterStepSettings({});
38034
38275
  object({
38035
38276
  /**
38036
38277
  * Fraction of the box's own size added on EACH side before cutting.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  //#endregion
6
- const require_dist = require("../dist-3KejG9q2.js");
6
+ const require_dist = require("../dist-BoTrJXhA.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 { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-CJ3sUHKH.mjs";
1
+ import { M as deviceExportCapability, Ot as EventCategory, S as buildAddonRouteProvider, Y as oauthIntegrationCapability, a as CameraSwitchIdSchema, c as HvacModeSchema, f as addonRoutesCapability, ft as BaseAddon, i as COCO_TO_MACRO, l as MediaPlayerRepeatSchema, s as FanDirectionSchema, t as AlarmArmModeSchema, wt as string } from "../dist-DeursJRH.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.38",
3
+ "version": "1.2.40",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",