@camstack/addon-pipeline 1.2.624 → 1.2.626

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.
Files changed (54) hide show
  1. package/THIRD_PARTY_MODELS.md +2 -2
  2. package/dist/audio-analyzer/index.js +3 -3
  3. package/dist/audio-analyzer/index.mjs +3 -3
  4. package/dist/{custom-model-catalog-Dx6W1kAo.mjs → custom-model-catalog-CacTUROW.mjs} +6 -6
  5. package/dist/{custom-model-catalog-6zwaRe6H.js → custom-model-catalog-CgxVHzSZ.js} +6 -6
  6. package/dist/detection-pipeline/index.js +16 -16
  7. package/dist/detection-pipeline/index.mjs +16 -16
  8. package/dist/{dist-BK3z-nti.mjs → dist-Bg9whnXR.mjs} +2055 -58
  9. package/dist/{dist-63VVVhpw.js → dist-CtbRj-Dn.js} +2055 -58
  10. package/dist/{model-catalogs-DyOMg-xZ.js → model-catalogs-BQqKruf-.js} +3 -3
  11. package/dist/{model-catalogs-CllYj2Q2.mjs → model-catalogs-D04DNvMI.mjs} +3 -3
  12. package/dist/motion-wasm/index.js +1 -1
  13. package/dist/motion-wasm/index.mjs +1 -1
  14. package/dist/{node-BAcWHimZ.mjs → node-CfgKBxdH.mjs} +2 -2
  15. package/dist/{node-DdaBnHEq.js → node-PivXOnUx.js} +2 -2
  16. package/dist/pipeline-runner/index.js +20 -20
  17. package/dist/pipeline-runner/index.mjs +20 -20
  18. package/dist/{process-memory-CUlknrLl.js → process-memory-68U4DnuZ.js} +1 -1
  19. package/dist/{process-memory-OZwib1pK.mjs → process-memory-Z6v2Fm60.mjs} +1 -1
  20. package/dist/recorder/index.js +26 -1816
  21. package/dist/recorder/index.mjs +26 -1816
  22. package/dist/{restream-intent-DyGmLAU9.mjs → restream-intent-DvzCnthK.mjs} +1 -1
  23. package/dist/{restream-intent-7uDNqMKs.js → restream-intent-DzrZ_EHP.js} +1 -1
  24. package/dist/{segment-demux-js-WNlg0SXP.js → segment-demux-js-BcnG-zVD.js} +1 -1
  25. package/dist/{segment-demux-js-C3rhCLCG.mjs → segment-demux-js-CRzvBMVr.mjs} +1 -1
  26. package/dist/session-decode/decode-worker-main.js +8 -8
  27. package/dist/session-decode/decode-worker-main.mjs +8 -8
  28. package/dist/stream-broker/_stub.js +1 -1
  29. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Di7t7N3r.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B9jSVeoa.mjs} +3 -3
  30. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D-GlPMcf.mjs +26 -0
  31. package/dist/stream-broker/demux-worker-child.js +1 -1
  32. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  33. package/dist/stream-broker/{hostInit-CMDvBrqv.mjs → hostInit-C_J8Mxe2.mjs} +3 -3
  34. package/dist/stream-broker/index.js +34 -34
  35. package/dist/stream-broker/index.mjs +34 -34
  36. package/dist/stream-broker/remoteEntry.js +1 -1
  37. package/package.json +1 -1
  38. package/python/inference_pool.py +3 -3
  39. package/python/postprocessors/ctc.py +1 -1
  40. package/python/postprocessors/plate_slots.py +2 -2
  41. package/python/postprocessors/test_ctc.py +1 -1
  42. package/python/postprocessors/test_plate_slots.py +1 -1
  43. package/python/postprocessors/test_ssd.py +1 -1
  44. package/python/postprocessors/test_yolo_split_dfl.py +3 -3
  45. package/python/postprocessors/test_yolo_split_dfl_numpy.py +5 -5
  46. package/python/postprocessors/test_yolonas.py +5 -5
  47. package/python/postprocessors/test_yolov9_edgetpu_concat.py +3 -3
  48. package/python/postprocessors/testdata/yunet_int8_outputs.json +2 -2
  49. package/python/postprocessors/yolo_split_dfl.py +5 -5
  50. package/python/postprocessors/yolonas.py +3 -3
  51. package/python/test_dequant_edgetpu.py +2 -2
  52. package/python/test_inference_pool_preprocess.py +2 -2
  53. package/python/webgpu_isolated.py +1 -1
  54. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DDRGMoJ1.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region ../types/dist/event-category-Ceif8n-v.mjs
2
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -295,7 +295,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
295
295
  * TRANSITION into that state (never per dispatch), and the node is dropped
296
296
  * from the placement candidate set for as long as it holds.
297
297
  *
298
- * This exists because the state was previously invisible: little-unraid
298
+ * This exists because the state was previously invisible: agent-a
299
299
  * absorbed 283k inference errors in a day while still being handed cameras,
300
300
  * and nothing in the system said so.
301
301
  *
@@ -5567,7 +5567,7 @@ var ZodIssueCode = {
5567
5567
  var ZodFirstPartyTypeKind;
5568
5568
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5569
5569
  //#endregion
5570
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5570
+ //#region ../types/dist/sleep-BErAxhul.mjs
5571
5571
  /**
5572
5572
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5573
5573
  * window to float samples (D455).
@@ -8929,6 +8929,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8929
8929
  kind: "mutation",
8930
8930
  auth: "admin"
8931
8931
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8932
+ Object.freeze({ "doorbell": "lastPressedAt" });
8933
+ /** Every capability name, so addon code can check a name without the schema graph. */
8934
+ var CAP_NAMES = Object.freeze([
8935
+ "accessories",
8936
+ "addon-pages",
8937
+ "addon-pages-source",
8938
+ "addon-routes",
8939
+ "addon-settings",
8940
+ "addon-widgets",
8941
+ "addon-widgets-source",
8942
+ "addons",
8943
+ "admin-ui",
8944
+ "air-quality-sensor",
8945
+ "alarm-panel",
8946
+ "alerts",
8947
+ "ambient-light-sensor",
8948
+ "audio-analysis",
8949
+ "audio-analyzer",
8950
+ "audio-codec",
8951
+ "audio-metrics",
8952
+ "auth-provider",
8953
+ "automation-control",
8954
+ "backup",
8955
+ "battery",
8956
+ "binary",
8957
+ "brightness",
8958
+ "broker",
8959
+ "button",
8960
+ "calendar-source",
8961
+ "calendars",
8962
+ "camera-credentials",
8963
+ "camera-grid-layout",
8964
+ "camera-pipeline-config",
8965
+ "camera-streams",
8966
+ "carbon-monoxide",
8967
+ "climate-control",
8968
+ "color",
8969
+ "composer",
8970
+ "connection-test",
8971
+ "connectivity",
8972
+ "consumables",
8973
+ "contact",
8974
+ "control",
8975
+ "core-blocks",
8976
+ "cover",
8977
+ "custom-model-registry",
8978
+ "data-store-provider",
8979
+ "database-snapshot",
8980
+ "day-night",
8981
+ "decoder",
8982
+ "detection-pipeline",
8983
+ "device-admin-link",
8984
+ "device-adoption",
8985
+ "device-credentials",
8986
+ "device-discovery",
8987
+ "device-export",
8988
+ "device-extension",
8989
+ "device-history",
8990
+ "device-manager",
8991
+ "device-ops",
8992
+ "device-provider",
8993
+ "device-removal-hook",
8994
+ "device-state",
8995
+ "device-status",
8996
+ "dishwasher",
8997
+ "display-palette",
8998
+ "doorbell",
8999
+ "embedding-encoder",
9000
+ "enum-sensor",
9001
+ "event-emitter",
9002
+ "face-gallery",
9003
+ "failure-contribution",
9004
+ "fan-control",
9005
+ "feature-probe",
9006
+ "filesystem-browse",
9007
+ "flood",
9008
+ "gas",
9009
+ "heating-valve",
9010
+ "humidifier",
9011
+ "humidity-sensor",
9012
+ "image",
9013
+ "image-settings",
9014
+ "integrations",
9015
+ "intercom",
9016
+ "keychain",
9017
+ "keychain-admin",
9018
+ "lawn-mower-control",
9019
+ "llm",
9020
+ "llm-runtime",
9021
+ "load-contribution",
9022
+ "local-network",
9023
+ "lock-control",
9024
+ "log-channels",
9025
+ "log-destination",
9026
+ "login-method",
9027
+ "media-player",
9028
+ "mesh-network",
9029
+ "metrics-provider",
9030
+ "model-convert",
9031
+ "model-distributor",
9032
+ "motion",
9033
+ "motion-detection",
9034
+ "motion-trigger",
9035
+ "motion-zones",
9036
+ "mqtt-broker",
9037
+ "native-object-detection",
9038
+ "navigation",
9039
+ "network-access",
9040
+ "network-link",
9041
+ "network-quality",
9042
+ "node-certificates",
9043
+ "nodes",
9044
+ "notification-output",
9045
+ "notification-rules",
9046
+ "notifier",
9047
+ "numeric-sensor",
9048
+ "oauth-integration",
9049
+ "oidc-connections",
9050
+ "osd",
9051
+ "osd-manager",
9052
+ "pet-feeder",
9053
+ "pipeline-analytics",
9054
+ "pipeline-executor",
9055
+ "pipeline-orchestrator",
9056
+ "pipeline-runner",
9057
+ "plate-gallery",
9058
+ "platform-probe",
9059
+ "power-meter",
9060
+ "presence",
9061
+ "pressure-sensor",
9062
+ "privacy-mask",
9063
+ "ptz",
9064
+ "ptz-autotrack",
9065
+ "reboot",
9066
+ "record-entries",
9067
+ "recording",
9068
+ "recording-archive",
9069
+ "recording-export",
9070
+ "recording-onboard",
9071
+ "recording-signal",
9072
+ "records",
9073
+ "running-state",
9074
+ "scene-monitor",
9075
+ "script-runner",
9076
+ "server-management",
9077
+ "settings-store",
9078
+ "smoke",
9079
+ "smtp-provider",
9080
+ "snapshot",
9081
+ "sso-bridge",
9082
+ "storage",
9083
+ "storage-admin",
9084
+ "storage-evictable",
9085
+ "storage-migration",
9086
+ "storage-occupancy",
9087
+ "storage-provider",
9088
+ "stream-broker",
9089
+ "stream-catalog",
9090
+ "stream-params",
9091
+ "stream-signals",
9092
+ "switch",
9093
+ "system",
9094
+ "tamper",
9095
+ "temperature-sensor",
9096
+ "terminal-session",
9097
+ "toast",
9098
+ "training",
9099
+ "training-provider",
9100
+ "turn-provider",
9101
+ "update",
9102
+ "user-management",
9103
+ "user-passkeys",
9104
+ "vacuum-control",
9105
+ "valve",
9106
+ "vector-store",
9107
+ "vibration",
9108
+ "videoclips",
9109
+ "viewer-ui",
9110
+ "water-heater",
9111
+ "weather",
9112
+ "webrtc-session",
9113
+ "zone-analytics",
9114
+ "zone-rules",
9115
+ "zones"
9116
+ ]);
9117
+ Object.freeze({
9118
+ "air-quality-sensor": [
9119
+ {
9120
+ "path": "co2Ppm",
9121
+ "valueType": "number"
9122
+ },
9123
+ {
9124
+ "path": "vocPpb",
9125
+ "valueType": "number"
9126
+ },
9127
+ {
9128
+ "path": "pm25",
9129
+ "valueType": "number"
9130
+ },
9131
+ {
9132
+ "path": "pm10",
9133
+ "valueType": "number"
9134
+ },
9135
+ {
9136
+ "path": "aqi",
9137
+ "valueType": "number"
9138
+ },
9139
+ {
9140
+ "path": "unit",
9141
+ "valueType": "string"
9142
+ },
9143
+ {
9144
+ "path": "precision",
9145
+ "valueType": "number"
9146
+ }
9147
+ ],
9148
+ "alarm-panel": [
9149
+ {
9150
+ "path": "state",
9151
+ "valueType": "enum",
9152
+ "enumValues": [
9153
+ "disarmed",
9154
+ "armed_home",
9155
+ "armed_away",
9156
+ "armed_night",
9157
+ "armed_vacation",
9158
+ "armed_custom_bypass",
9159
+ "arming",
9160
+ "disarming",
9161
+ "pending",
9162
+ "triggered"
9163
+ ]
9164
+ },
9165
+ {
9166
+ "path": "targetMode",
9167
+ "valueType": "enum",
9168
+ "enumValues": [
9169
+ "home",
9170
+ "away",
9171
+ "night",
9172
+ "vacation",
9173
+ "custom_bypass"
9174
+ ]
9175
+ },
9176
+ {
9177
+ "path": "requiresCode",
9178
+ "valueType": "boolean"
9179
+ }
9180
+ ],
9181
+ "ambient-light-sensor": [
9182
+ {
9183
+ "path": "lux",
9184
+ "valueType": "number"
9185
+ },
9186
+ {
9187
+ "path": "unit",
9188
+ "valueType": "string"
9189
+ },
9190
+ {
9191
+ "path": "precision",
9192
+ "valueType": "number"
9193
+ }
9194
+ ],
9195
+ "audio-metrics": [
9196
+ {
9197
+ "path": "ts",
9198
+ "valueType": "number"
9199
+ },
9200
+ {
9201
+ "path": "windowSec",
9202
+ "valueType": "number"
9203
+ },
9204
+ {
9205
+ "path": "level.rms",
9206
+ "valueType": "number"
9207
+ },
9208
+ {
9209
+ "path": "level.dbfs",
9210
+ "valueType": "number"
9211
+ },
9212
+ {
9213
+ "path": "peakDbfs",
9214
+ "valueType": "number"
9215
+ },
9216
+ {
9217
+ "path": "avgDbfs",
9218
+ "valueType": "number"
9219
+ },
9220
+ {
9221
+ "path": "current.className",
9222
+ "valueType": "string"
9223
+ },
9224
+ {
9225
+ "path": "current.score",
9226
+ "valueType": "number"
9227
+ },
9228
+ {
9229
+ "path": "current.timestamp",
9230
+ "valueType": "number"
9231
+ }
9232
+ ],
9233
+ "automation-control": [
9234
+ {
9235
+ "path": "enabled",
9236
+ "valueType": "boolean"
9237
+ },
9238
+ {
9239
+ "path": "isRunning",
9240
+ "valueType": "boolean"
9241
+ },
9242
+ {
9243
+ "path": "lastTriggeredAt",
9244
+ "valueType": "number"
9245
+ },
9246
+ {
9247
+ "path": "lastError",
9248
+ "valueType": "string"
9249
+ }
9250
+ ],
9251
+ "battery": [
9252
+ {
9253
+ "path": "percentage",
9254
+ "valueType": "number"
9255
+ },
9256
+ {
9257
+ "path": "charging",
9258
+ "valueType": "enum",
9259
+ "enumValues": [
9260
+ "dc",
9261
+ "solar",
9262
+ "none",
9263
+ "unknown"
9264
+ ]
9265
+ },
9266
+ {
9267
+ "path": "sleeping",
9268
+ "valueType": "boolean"
9269
+ },
9270
+ {
9271
+ "path": "lastUpdated",
9272
+ "valueType": "number"
9273
+ },
9274
+ {
9275
+ "path": "lastContactAt",
9276
+ "valueType": "number"
9277
+ },
9278
+ {
9279
+ "path": "lastFullRefreshAt",
9280
+ "valueType": "number"
9281
+ },
9282
+ {
9283
+ "path": "binary",
9284
+ "valueType": "boolean"
9285
+ }
9286
+ ],
9287
+ "binary": [{
9288
+ "path": "on",
9289
+ "valueType": "boolean"
9290
+ }],
9291
+ "brightness": [{
9292
+ "path": "percentage",
9293
+ "valueType": "number"
9294
+ }],
9295
+ "broker": [{
9296
+ "path": "brokerCount",
9297
+ "valueType": "number"
9298
+ }, {
9299
+ "path": "connectedCount",
9300
+ "valueType": "number"
9301
+ }],
9302
+ "camera-credentials": [
9303
+ {
9304
+ "path": "host",
9305
+ "valueType": "string"
9306
+ },
9307
+ {
9308
+ "path": "port",
9309
+ "valueType": "number"
9310
+ },
9311
+ {
9312
+ "path": "onvifPort",
9313
+ "valueType": "number"
9314
+ },
9315
+ {
9316
+ "path": "rtspPort",
9317
+ "valueType": "number"
9318
+ },
9319
+ {
9320
+ "path": "https",
9321
+ "valueType": "boolean"
9322
+ },
9323
+ {
9324
+ "path": "hasUsername",
9325
+ "valueType": "boolean"
9326
+ },
9327
+ {
9328
+ "path": "hasPassword",
9329
+ "valueType": "boolean"
9330
+ },
9331
+ {
9332
+ "path": "onvifProfile",
9333
+ "valueType": "string"
9334
+ }
9335
+ ],
9336
+ "camera-streams": [
9337
+ {
9338
+ "path": "online",
9339
+ "valueType": "boolean"
9340
+ },
9341
+ {
9342
+ "path": "slotStatuses.high",
9343
+ "valueType": "enum",
9344
+ "enumValues": [
9345
+ "unassigned",
9346
+ "idle",
9347
+ "connecting",
9348
+ "streaming",
9349
+ "error"
9350
+ ]
9351
+ },
9352
+ {
9353
+ "path": "slotStatuses.mid",
9354
+ "valueType": "enum",
9355
+ "enumValues": [
9356
+ "unassigned",
9357
+ "idle",
9358
+ "connecting",
9359
+ "streaming",
9360
+ "error"
9361
+ ]
9362
+ },
9363
+ {
9364
+ "path": "slotStatuses.low",
9365
+ "valueType": "enum",
9366
+ "enumValues": [
9367
+ "unassigned",
9368
+ "idle",
9369
+ "connecting",
9370
+ "streaming",
9371
+ "error"
9372
+ ]
9373
+ },
9374
+ {
9375
+ "path": "slotErrors.high",
9376
+ "valueType": "string"
9377
+ },
9378
+ {
9379
+ "path": "slotErrors.mid",
9380
+ "valueType": "string"
9381
+ },
9382
+ {
9383
+ "path": "slotErrors.low",
9384
+ "valueType": "string"
9385
+ }
9386
+ ],
9387
+ "carbon-monoxide": [{
9388
+ "path": "detected",
9389
+ "valueType": "boolean"
9390
+ }],
9391
+ "climate-control": [
9392
+ {
9393
+ "path": "mode",
9394
+ "valueType": "enum",
9395
+ "enumValues": [
9396
+ "off",
9397
+ "heat",
9398
+ "cool",
9399
+ "auto",
9400
+ "heat_cool",
9401
+ "fan_only",
9402
+ "dry"
9403
+ ]
9404
+ },
9405
+ {
9406
+ "path": "fanMode",
9407
+ "valueType": "string"
9408
+ },
9409
+ {
9410
+ "path": "preset",
9411
+ "valueType": "string"
9412
+ },
9413
+ {
9414
+ "path": "target",
9415
+ "valueType": "number"
9416
+ },
9417
+ {
9418
+ "path": "targetHigh",
9419
+ "valueType": "number"
9420
+ },
9421
+ {
9422
+ "path": "targetLow",
9423
+ "valueType": "number"
9424
+ },
9425
+ {
9426
+ "path": "targetHumidity",
9427
+ "valueType": "number"
9428
+ },
9429
+ {
9430
+ "path": "currentTemp",
9431
+ "valueType": "number"
9432
+ },
9433
+ {
9434
+ "path": "currentHumidity",
9435
+ "valueType": "number"
9436
+ },
9437
+ {
9438
+ "path": "swingVertical",
9439
+ "valueType": "boolean"
9440
+ },
9441
+ {
9442
+ "path": "swingHorizontal",
9443
+ "valueType": "boolean"
9444
+ },
9445
+ {
9446
+ "path": "minTemp",
9447
+ "valueType": "number"
9448
+ },
9449
+ {
9450
+ "path": "maxTemp",
9451
+ "valueType": "number"
9452
+ },
9453
+ {
9454
+ "path": "tempStep",
9455
+ "valueType": "number"
9456
+ }
9457
+ ],
9458
+ "color": [
9459
+ {
9460
+ "path": "mode",
9461
+ "valueType": "enum",
9462
+ "enumValues": [
9463
+ "rgb",
9464
+ "hsv",
9465
+ "mired"
9466
+ ]
9467
+ },
9468
+ {
9469
+ "path": "rgb.r",
9470
+ "valueType": "number"
9471
+ },
9472
+ {
9473
+ "path": "rgb.g",
9474
+ "valueType": "number"
9475
+ },
9476
+ {
9477
+ "path": "rgb.b",
9478
+ "valueType": "number"
9479
+ },
9480
+ {
9481
+ "path": "hsv.h",
9482
+ "valueType": "number"
9483
+ },
9484
+ {
9485
+ "path": "hsv.s",
9486
+ "valueType": "number"
9487
+ },
9488
+ {
9489
+ "path": "hsv.v",
9490
+ "valueType": "number"
9491
+ },
9492
+ {
9493
+ "path": "mireds",
9494
+ "valueType": "number"
9495
+ }
9496
+ ],
9497
+ "connectivity": [{
9498
+ "path": "connected",
9499
+ "valueType": "boolean"
9500
+ }],
9501
+ "contact": [{
9502
+ "path": "entryOpen",
9503
+ "valueType": "boolean"
9504
+ }],
9505
+ "control": [
9506
+ {
9507
+ "path": "kind",
9508
+ "valueType": "enum",
9509
+ "enumValues": [
9510
+ "numeric",
9511
+ "select",
9512
+ "text",
9513
+ "datetime"
9514
+ ]
9515
+ },
9516
+ {
9517
+ "path": "unit",
9518
+ "valueType": "string"
9519
+ },
9520
+ {
9521
+ "path": "min",
9522
+ "valueType": "number"
9523
+ },
9524
+ {
9525
+ "path": "max",
9526
+ "valueType": "number"
9527
+ },
9528
+ {
9529
+ "path": "step",
9530
+ "valueType": "number"
9531
+ },
9532
+ {
9533
+ "path": "precision",
9534
+ "valueType": "number"
9535
+ },
9536
+ {
9537
+ "path": "format",
9538
+ "valueType": "enum",
9539
+ "enumValues": [
9540
+ "date",
9541
+ "time",
9542
+ "datetime"
9543
+ ]
9544
+ }
9545
+ ],
9546
+ "cover": [
9547
+ {
9548
+ "path": "state",
9549
+ "valueType": "enum",
9550
+ "enumValues": [
9551
+ "open",
9552
+ "opening",
9553
+ "closing",
9554
+ "closed",
9555
+ "stopped"
9556
+ ]
9557
+ },
9558
+ {
9559
+ "path": "position",
9560
+ "valueType": "number"
9561
+ },
9562
+ {
9563
+ "path": "tiltPosition",
9564
+ "valueType": "number"
9565
+ }
9566
+ ],
9567
+ "day-night": [
9568
+ {
9569
+ "path": "mode",
9570
+ "valueType": "enum",
9571
+ "enumValues": [
9572
+ "auto",
9573
+ "day",
9574
+ "night",
9575
+ "schedule"
9576
+ ]
9577
+ },
9578
+ {
9579
+ "path": "sensitivity",
9580
+ "valueType": "number"
9581
+ },
9582
+ {
9583
+ "path": "switchDelaySec",
9584
+ "valueType": "number"
9585
+ }
9586
+ ],
9587
+ "device-adoption": [
9588
+ {
9589
+ "path": "lastDiscoveryAt",
9590
+ "valueType": "number"
9591
+ },
9592
+ {
9593
+ "path": "candidateCount",
9594
+ "valueType": "number"
9595
+ },
9596
+ {
9597
+ "path": "adoptedCount",
9598
+ "valueType": "number"
9599
+ },
9600
+ {
9601
+ "path": "lastError",
9602
+ "valueType": "string"
9603
+ }
9604
+ ],
9605
+ "device-discovery": [{
9606
+ "path": "lastDiscoveryAt",
9607
+ "valueType": "number"
9608
+ }, {
9609
+ "path": "lastError",
9610
+ "valueType": "string"
9611
+ }],
9612
+ "device-export": [
9613
+ {
9614
+ "path": "linkState",
9615
+ "valueType": "enum",
9616
+ "enumValues": [
9617
+ "unlinked",
9618
+ "linked",
9619
+ "error"
9620
+ ]
9621
+ },
9622
+ {
9623
+ "path": "exposedDeviceCount",
9624
+ "valueType": "number"
9625
+ },
9626
+ {
9627
+ "path": "error",
9628
+ "valueType": "string"
9629
+ },
9630
+ {
9631
+ "path": "setup.qr",
9632
+ "valueType": "string"
9633
+ },
9634
+ {
9635
+ "path": "setup.note",
9636
+ "valueType": "string"
9637
+ }
9638
+ ],
9639
+ "device-status": [{
9640
+ "path": "online",
9641
+ "valueType": "boolean"
9642
+ }],
9643
+ "dishwasher": [
9644
+ {
9645
+ "path": "availability",
9646
+ "valueType": "enum",
9647
+ "enumValues": [
9648
+ "available",
9649
+ "offline",
9650
+ "description-missing"
9651
+ ]
9652
+ },
9653
+ {
9654
+ "path": "state",
9655
+ "valueType": "enum",
9656
+ "enumValues": [
9657
+ "idle",
9658
+ "running",
9659
+ "paused",
9660
+ "finished",
9661
+ "error",
9662
+ "unavailable"
9663
+ ]
9664
+ },
9665
+ {
9666
+ "path": "operationState",
9667
+ "valueType": "enum",
9668
+ "enumValues": [
9669
+ "Inactive",
9670
+ "Ready",
9671
+ "DelayedStart",
9672
+ "Run",
9673
+ "Pause",
9674
+ "ActionRequired",
9675
+ "Finished",
9676
+ "Error",
9677
+ "Aborting"
9678
+ ]
9679
+ },
9680
+ {
9681
+ "path": "program",
9682
+ "valueType": "string"
9683
+ },
9684
+ {
9685
+ "path": "selectedProgram",
9686
+ "valueType": "string"
9687
+ },
9688
+ {
9689
+ "path": "remainingSeconds",
9690
+ "valueType": "number"
9691
+ },
9692
+ {
9693
+ "path": "delayedStartSeconds",
9694
+ "valueType": "number"
9695
+ },
9696
+ {
9697
+ "path": "progressPercent",
9698
+ "valueType": "number"
9699
+ },
9700
+ {
9701
+ "path": "doorOpen",
9702
+ "valueType": "boolean"
9703
+ },
9704
+ {
9705
+ "path": "doorLocked",
9706
+ "valueType": "boolean"
9707
+ },
9708
+ {
9709
+ "path": "remoteStartAllowed",
9710
+ "valueType": "boolean"
9711
+ },
9712
+ {
9713
+ "path": "remoteControlActive",
9714
+ "valueType": "boolean"
9715
+ },
9716
+ {
9717
+ "path": "localControlActive",
9718
+ "valueType": "boolean"
9719
+ },
9720
+ {
9721
+ "path": "powerOn",
9722
+ "valueType": "boolean"
9723
+ },
9724
+ {
9725
+ "path": "powerState",
9726
+ "valueType": "string"
9727
+ },
9728
+ {
9729
+ "path": "filterCleaningDue",
9730
+ "valueType": "boolean"
9731
+ },
9732
+ {
9733
+ "path": "machineCareDue",
9734
+ "valueType": "boolean"
9735
+ },
9736
+ {
9737
+ "path": "machineCareRemainingRuns",
9738
+ "valueType": "number"
9739
+ },
9740
+ {
9741
+ "path": "halfLoad",
9742
+ "valueType": "boolean"
9743
+ },
9744
+ {
9745
+ "path": "hygienePlus",
9746
+ "valueType": "boolean"
9747
+ },
9748
+ {
9749
+ "path": "extraDry",
9750
+ "valueType": "boolean"
9751
+ },
9752
+ {
9753
+ "path": "intensiveZone",
9754
+ "valueType": "boolean"
9755
+ },
9756
+ {
9757
+ "path": "varioSpeedPlus",
9758
+ "valueType": "boolean"
9759
+ },
9760
+ {
9761
+ "path": "childLock",
9762
+ "valueType": "boolean"
9763
+ },
9764
+ {
9765
+ "path": "errorCode",
9766
+ "valueType": "number"
9767
+ },
9768
+ {
9769
+ "path": "errorLabel",
9770
+ "valueType": "string"
9771
+ }
9772
+ ],
9773
+ "doorbell": [{
9774
+ "path": "lastPressedAt",
9775
+ "valueType": "number"
9776
+ }, {
9777
+ "path": "pressCountSinceStart",
9778
+ "valueType": "number"
9779
+ }],
9780
+ "enum-sensor": [{
9781
+ "path": "value",
9782
+ "valueType": "string"
9783
+ }, {
9784
+ "path": "format",
9785
+ "valueType": "enum",
9786
+ "enumValues": [
9787
+ "date",
9788
+ "time",
9789
+ "datetime"
9790
+ ]
9791
+ }],
9792
+ "event-emitter": [
9793
+ {
9794
+ "path": "lastEvent.deviceId",
9795
+ "valueType": "number"
9796
+ },
9797
+ {
9798
+ "path": "lastEvent.eventType",
9799
+ "valueType": "string"
9800
+ },
9801
+ {
9802
+ "path": "lastEvent.timestamp",
9803
+ "valueType": "number"
9804
+ },
9805
+ {
9806
+ "path": "lastEvent.seq",
9807
+ "valueType": "number"
9808
+ },
9809
+ {
9810
+ "path": "eventCountSinceStart",
9811
+ "valueType": "number"
9812
+ }
9813
+ ],
9814
+ "fan-control": [
9815
+ {
9816
+ "path": "percentage",
9817
+ "valueType": "number"
9818
+ },
9819
+ {
9820
+ "path": "percentageStep",
9821
+ "valueType": "number"
9822
+ },
9823
+ {
9824
+ "path": "preset",
9825
+ "valueType": "string"
9826
+ },
9827
+ {
9828
+ "path": "direction",
9829
+ "valueType": "enum",
9830
+ "enumValues": ["forward", "reverse"]
9831
+ },
9832
+ {
9833
+ "path": "oscillating",
9834
+ "valueType": "boolean"
9835
+ }
9836
+ ],
9837
+ "feature-probe": [
9838
+ {
9839
+ "path": "deviceType",
9840
+ "valueType": "string"
9841
+ },
9842
+ {
9843
+ "path": "model",
9844
+ "valueType": "string"
9845
+ },
9846
+ {
9847
+ "path": "channelCount",
9848
+ "valueType": "number"
9849
+ },
9850
+ {
9851
+ "path": "lastProbedAt",
9852
+ "valueType": "number"
9853
+ }
9854
+ ],
9855
+ "flood": [{
9856
+ "path": "flooded",
9857
+ "valueType": "boolean"
9858
+ }],
9859
+ "gas": [{
9860
+ "path": "detected",
9861
+ "valueType": "boolean"
9862
+ }],
9863
+ "heating-valve": [{
9864
+ "path": "position",
9865
+ "valueType": "number"
9866
+ }],
9867
+ "humidifier": [
9868
+ {
9869
+ "path": "on",
9870
+ "valueType": "boolean"
9871
+ },
9872
+ {
9873
+ "path": "currentHumidity",
9874
+ "valueType": "number"
9875
+ },
9876
+ {
9877
+ "path": "targetHumidity",
9878
+ "valueType": "number"
9879
+ },
9880
+ {
9881
+ "path": "mode",
9882
+ "valueType": "string"
9883
+ },
9884
+ {
9885
+ "path": "action",
9886
+ "valueType": "string"
9887
+ },
9888
+ {
9889
+ "path": "minHumidity",
9890
+ "valueType": "number"
9891
+ },
9892
+ {
9893
+ "path": "maxHumidity",
9894
+ "valueType": "number"
9895
+ }
9896
+ ],
9897
+ "humidity-sensor": [
9898
+ {
9899
+ "path": "percent",
9900
+ "valueType": "number"
9901
+ },
9902
+ {
9903
+ "path": "unit",
9904
+ "valueType": "string"
9905
+ },
9906
+ {
9907
+ "path": "precision",
9908
+ "valueType": "number"
9909
+ }
9910
+ ],
9911
+ "image": [{
9912
+ "path": "url",
9913
+ "valueType": "string"
9914
+ }, {
9915
+ "path": "lastUpdated",
9916
+ "valueType": "number"
9917
+ }],
9918
+ "image-settings": [
9919
+ {
9920
+ "path": "brightness",
9921
+ "valueType": "number"
9922
+ },
9923
+ {
9924
+ "path": "contrast",
9925
+ "valueType": "number"
9926
+ },
9927
+ {
9928
+ "path": "saturation",
9929
+ "valueType": "number"
9930
+ },
9931
+ {
9932
+ "path": "sharpness",
9933
+ "valueType": "number"
9934
+ },
9935
+ {
9936
+ "path": "mirror",
9937
+ "valueType": "boolean"
9938
+ },
9939
+ {
9940
+ "path": "flip",
9941
+ "valueType": "boolean"
9942
+ },
9943
+ {
9944
+ "path": "rotate",
9945
+ "valueType": "enum",
9946
+ "enumValues": [
9947
+ "0",
9948
+ "90",
9949
+ "180",
9950
+ "270"
9951
+ ]
9952
+ },
9953
+ {
9954
+ "path": "whiteBalance",
9955
+ "valueType": "enum",
9956
+ "enumValues": ["auto", "manual"]
9957
+ },
9958
+ {
9959
+ "path": "warmth",
9960
+ "valueType": "number"
9961
+ },
9962
+ {
9963
+ "path": "exposureMode",
9964
+ "valueType": "enum",
9965
+ "enumValues": ["auto", "manual"]
9966
+ },
9967
+ {
9968
+ "path": "backlightMode",
9969
+ "valueType": "enum",
9970
+ "enumValues": [
9971
+ "off",
9972
+ "blc",
9973
+ "wdr",
9974
+ "hlc"
9975
+ ]
9976
+ }
9977
+ ],
9978
+ "intercom": [
9979
+ {
9980
+ "path": "talking",
9981
+ "valueType": "boolean"
9982
+ },
9983
+ {
9984
+ "path": "lastSessionAt",
9985
+ "valueType": "number"
9986
+ },
9987
+ {
9988
+ "path": "ability.sampleRate",
9989
+ "valueType": "number"
9990
+ },
9991
+ {
9992
+ "path": "ability.duplex",
9993
+ "valueType": "enum",
9994
+ "enumValues": ["half", "full"]
9995
+ },
9996
+ {
9997
+ "path": "ability.maxBacklogMs",
9998
+ "valueType": "number"
9999
+ }
10000
+ ],
10001
+ "lawn-mower-control": [
10002
+ {
10003
+ "path": "activity",
10004
+ "valueType": "enum",
10005
+ "enumValues": [
10006
+ "idle",
10007
+ "mowing",
10008
+ "paused",
10009
+ "docked",
10010
+ "error"
10011
+ ]
10012
+ },
10013
+ {
10014
+ "path": "batteryLevel",
10015
+ "valueType": "number"
10016
+ },
10017
+ {
10018
+ "path": "progressPercent",
10019
+ "valueType": "number"
10020
+ },
10021
+ {
10022
+ "path": "currentCode",
10023
+ "valueType": "number"
10024
+ },
10025
+ {
10026
+ "path": "currentCodeLabel",
10027
+ "valueType": "string"
10028
+ },
10029
+ {
10030
+ "path": "severity",
10031
+ "valueType": "enum",
10032
+ "enumValues": [
10033
+ "info",
10034
+ "warning",
10035
+ "error"
10036
+ ]
10037
+ }
10038
+ ],
10039
+ "lock-control": [{
10040
+ "path": "state",
10041
+ "valueType": "enum",
10042
+ "enumValues": [
10043
+ "locked",
10044
+ "unlocked",
10045
+ "locking",
10046
+ "unlocking",
10047
+ "jammed"
10048
+ ]
10049
+ }],
10050
+ "media-player": [
10051
+ {
10052
+ "path": "state",
10053
+ "valueType": "enum",
10054
+ "enumValues": [
10055
+ "off",
10056
+ "on",
10057
+ "idle",
10058
+ "playing",
10059
+ "paused",
10060
+ "buffering",
10061
+ "standby"
10062
+ ]
10063
+ },
10064
+ {
10065
+ "path": "volumeLevel",
10066
+ "valueType": "number"
10067
+ },
10068
+ {
10069
+ "path": "isMuted",
10070
+ "valueType": "boolean"
10071
+ },
10072
+ {
10073
+ "path": "source",
10074
+ "valueType": "string"
10075
+ },
10076
+ {
10077
+ "path": "currentMedia.type",
10078
+ "valueType": "string"
10079
+ },
10080
+ {
10081
+ "path": "currentMedia.title",
10082
+ "valueType": "string"
10083
+ },
10084
+ {
10085
+ "path": "currentMedia.artist",
10086
+ "valueType": "string"
10087
+ },
10088
+ {
10089
+ "path": "currentMedia.album",
10090
+ "valueType": "string"
10091
+ },
10092
+ {
10093
+ "path": "currentMedia.imageUrl",
10094
+ "valueType": "string"
10095
+ },
10096
+ {
10097
+ "path": "positionMs",
10098
+ "valueType": "number"
10099
+ },
10100
+ {
10101
+ "path": "durationMs",
10102
+ "valueType": "number"
10103
+ },
10104
+ {
10105
+ "path": "shuffle",
10106
+ "valueType": "boolean"
10107
+ },
10108
+ {
10109
+ "path": "repeat",
10110
+ "valueType": "enum",
10111
+ "enumValues": [
10112
+ "off",
10113
+ "all",
10114
+ "one"
10115
+ ]
10116
+ }
10117
+ ],
10118
+ "motion": [
10119
+ {
10120
+ "path": "detected",
10121
+ "valueType": "boolean"
10122
+ },
10123
+ {
10124
+ "path": "lastDetectedAt",
10125
+ "valueType": "number"
10126
+ },
10127
+ {
10128
+ "path": "autoClearAfterMs",
10129
+ "valueType": "number"
10130
+ }
10131
+ ],
10132
+ "motion-trigger": [{
10133
+ "path": "enabled",
10134
+ "valueType": "boolean"
10135
+ }],
10136
+ "motion-zones": [{
10137
+ "path": "enabled",
10138
+ "valueType": "boolean"
10139
+ }, {
10140
+ "path": "sensitivity",
10141
+ "valueType": "number"
10142
+ }],
10143
+ "mqtt-broker": [{
10144
+ "path": "brokerCount",
10145
+ "valueType": "number"
10146
+ }, {
10147
+ "path": "embeddedRunning",
10148
+ "valueType": "boolean"
10149
+ }],
10150
+ "native-object-detection": [{
10151
+ "path": "enabled",
10152
+ "valueType": "boolean"
10153
+ }],
10154
+ "navigation": [
10155
+ {
10156
+ "path": "mode",
10157
+ "valueType": "enum",
10158
+ "enumValues": [
10159
+ "idle",
10160
+ "cleaning",
10161
+ "spot",
10162
+ "following",
10163
+ "goto",
10164
+ "returning",
10165
+ "paused",
10166
+ "unknown"
10167
+ ]
10168
+ },
10169
+ {
10170
+ "path": "following",
10171
+ "valueType": "boolean"
10172
+ },
10173
+ {
10174
+ "path": "flash",
10175
+ "valueType": "boolean"
10176
+ },
10177
+ {
10178
+ "path": "lightMode",
10179
+ "valueType": "enum",
10180
+ "enumValues": ["auto", "manual"]
10181
+ },
10182
+ {
10183
+ "path": "lightLevel",
10184
+ "valueType": "number"
10185
+ }
10186
+ ],
10187
+ "network-link": [
10188
+ {
10189
+ "path": "type",
10190
+ "valueType": "enum",
10191
+ "enumValues": [
10192
+ "wifi",
10193
+ "ethernet",
10194
+ "cellular",
10195
+ "unknown"
10196
+ ]
10197
+ },
10198
+ {
10199
+ "path": "signalPercent",
10200
+ "valueType": "number"
10201
+ },
10202
+ {
10203
+ "path": "rssiDbm",
10204
+ "valueType": "number"
10205
+ },
10206
+ {
10207
+ "path": "ssid",
10208
+ "valueType": "string"
10209
+ },
10210
+ {
10211
+ "path": "lastUpdated",
10212
+ "valueType": "number"
10213
+ }
10214
+ ],
10215
+ "notifier": [
10216
+ {
10217
+ "path": "lastSentAt",
10218
+ "valueType": "number"
10219
+ },
10220
+ {
10221
+ "path": "lastError",
10222
+ "valueType": "string"
10223
+ },
10224
+ {
10225
+ "path": "queueDepth",
10226
+ "valueType": "number"
10227
+ },
10228
+ {
10229
+ "path": "supports.image",
10230
+ "valueType": "boolean"
10231
+ },
10232
+ {
10233
+ "path": "supports.priority",
10234
+ "valueType": "boolean"
10235
+ },
10236
+ {
10237
+ "path": "supports.data",
10238
+ "valueType": "boolean"
10239
+ },
10240
+ {
10241
+ "path": "supports.actions",
10242
+ "valueType": "boolean"
10243
+ },
10244
+ {
10245
+ "path": "supports.recipients",
10246
+ "valueType": "boolean"
10247
+ }
10248
+ ],
10249
+ "numeric-sensor": [
10250
+ {
10251
+ "path": "value",
10252
+ "valueType": "number"
10253
+ },
10254
+ {
10255
+ "path": "unit",
10256
+ "valueType": "string"
10257
+ },
10258
+ {
10259
+ "path": "precision",
10260
+ "valueType": "number"
10261
+ }
10262
+ ],
10263
+ "pet-feeder": [
10264
+ {
10265
+ "path": "foodLevel",
10266
+ "valueType": "number"
10267
+ },
10268
+ {
10269
+ "path": "food1",
10270
+ "valueType": "number"
10271
+ },
10272
+ {
10273
+ "path": "food2",
10274
+ "valueType": "number"
10275
+ },
10276
+ {
10277
+ "path": "lowFood",
10278
+ "valueType": "boolean"
10279
+ },
10280
+ {
10281
+ "path": "batteryPower",
10282
+ "valueType": "number"
10283
+ },
10284
+ {
10285
+ "path": "desiccantLeftDays",
10286
+ "valueType": "number"
10287
+ },
10288
+ {
10289
+ "path": "feeding",
10290
+ "valueType": "boolean"
10291
+ },
10292
+ {
10293
+ "path": "status",
10294
+ "valueType": "enum",
10295
+ "enumValues": [
10296
+ "normal",
10297
+ "offline",
10298
+ "on_batteries"
10299
+ ]
10300
+ },
10301
+ {
10302
+ "path": "error",
10303
+ "valueType": "string"
10304
+ },
10305
+ {
10306
+ "path": "errorCode",
10307
+ "valueType": "number"
10308
+ },
10309
+ {
10310
+ "path": "isDualHopper",
10311
+ "valueType": "boolean"
10312
+ },
10313
+ {
10314
+ "path": "childLock",
10315
+ "valueType": "boolean"
10316
+ },
10317
+ {
10318
+ "path": "indicatorLight",
10319
+ "valueType": "boolean"
10320
+ },
10321
+ {
10322
+ "path": "feedSound",
10323
+ "valueType": "boolean"
10324
+ },
10325
+ {
10326
+ "path": "volume",
10327
+ "valueType": "number"
10328
+ }
10329
+ ],
10330
+ "power-meter": [
10331
+ {
10332
+ "path": "watts",
10333
+ "valueType": "number"
10334
+ },
10335
+ {
10336
+ "path": "kwhTotal",
10337
+ "valueType": "number"
10338
+ },
10339
+ {
10340
+ "path": "volts",
10341
+ "valueType": "number"
10342
+ },
10343
+ {
10344
+ "path": "amps",
10345
+ "valueType": "number"
10346
+ },
10347
+ {
10348
+ "path": "va",
10349
+ "valueType": "number"
10350
+ },
10351
+ {
10352
+ "path": "powerFactor",
10353
+ "valueType": "number"
10354
+ },
10355
+ {
10356
+ "path": "unit",
10357
+ "valueType": "string"
10358
+ },
10359
+ {
10360
+ "path": "precision",
10361
+ "valueType": "number"
10362
+ }
10363
+ ],
10364
+ "presence": [
10365
+ {
10366
+ "path": "state",
10367
+ "valueType": "string"
10368
+ },
10369
+ {
10370
+ "path": "location",
10371
+ "valueType": "string"
10372
+ },
10373
+ {
10374
+ "path": "gps.latitude",
10375
+ "valueType": "number"
10376
+ },
10377
+ {
10378
+ "path": "gps.longitude",
10379
+ "valueType": "number"
10380
+ },
10381
+ {
10382
+ "path": "gps.accuracyMeters",
10383
+ "valueType": "number"
10384
+ },
10385
+ {
10386
+ "path": "batteryPercent",
10387
+ "valueType": "number"
10388
+ }
10389
+ ],
10390
+ "pressure-sensor": [
10391
+ {
10392
+ "path": "hpa",
10393
+ "valueType": "number"
10394
+ },
10395
+ {
10396
+ "path": "unit",
10397
+ "valueType": "string"
10398
+ },
10399
+ {
10400
+ "path": "precision",
10401
+ "valueType": "number"
10402
+ }
10403
+ ],
10404
+ "privacy-mask": [{
10405
+ "path": "enabled",
10406
+ "valueType": "boolean"
10407
+ }, {
10408
+ "path": "audioEnabled",
10409
+ "valueType": "boolean"
10410
+ }],
10411
+ "ptz": [
10412
+ {
10413
+ "path": "pan",
10414
+ "valueType": "number"
10415
+ },
10416
+ {
10417
+ "path": "tilt",
10418
+ "valueType": "number"
10419
+ },
10420
+ {
10421
+ "path": "zoom",
10422
+ "valueType": "number"
10423
+ },
10424
+ {
10425
+ "path": "autofocus",
10426
+ "valueType": "boolean"
10427
+ }
10428
+ ],
10429
+ "ptz-autotrack": [
10430
+ {
10431
+ "path": "enabled",
10432
+ "valueType": "boolean"
10433
+ },
10434
+ {
10435
+ "path": "currentSettings.targetType",
10436
+ "valueType": "string"
10437
+ },
10438
+ {
10439
+ "path": "currentSettings.stopDelaySeconds",
10440
+ "valueType": "number"
10441
+ },
10442
+ {
10443
+ "path": "currentSettings.disappearDelaySeconds",
10444
+ "valueType": "number"
10445
+ }
10446
+ ],
10447
+ "recording-archive": [
10448
+ {
10449
+ "path": "deviceId",
10450
+ "valueType": "number"
10451
+ },
10452
+ {
10453
+ "path": "enabled",
10454
+ "valueType": "boolean"
10455
+ },
10456
+ {
10457
+ "path": "activeMode",
10458
+ "valueType": "enum",
10459
+ "enumValues": [
10460
+ "off",
10461
+ "events",
10462
+ "continuous",
10463
+ "on-device-decision"
10464
+ ]
10465
+ },
10466
+ {
10467
+ "path": "nodeId",
10468
+ "valueType": "string"
10469
+ },
10470
+ {
10471
+ "path": "storageBytes",
10472
+ "valueType": "number"
10473
+ }
10474
+ ],
10475
+ "recording-onboard": [
10476
+ {
10477
+ "path": "primaryTrackId",
10478
+ "valueType": "string"
10479
+ },
10480
+ {
10481
+ "path": "enabled",
10482
+ "valueType": "boolean"
10483
+ },
10484
+ {
10485
+ "path": "overwriteWhenFull",
10486
+ "valueType": "boolean"
10487
+ },
10488
+ {
10489
+ "path": "preRecordSec",
10490
+ "valueType": "number"
10491
+ },
10492
+ {
10493
+ "path": "postRecordSec",
10494
+ "valueType": "number"
10495
+ },
10496
+ {
10497
+ "path": "segmentMinutes",
10498
+ "valueType": "number"
10499
+ },
10500
+ {
10501
+ "path": "unreadableWindows",
10502
+ "valueType": "number"
10503
+ },
10504
+ {
10505
+ "path": "recordingToNowhere",
10506
+ "valueType": "boolean"
10507
+ }
10508
+ ],
10509
+ "recording-signal": [{
10510
+ "path": "active",
10511
+ "valueType": "boolean"
10512
+ }, {
10513
+ "path": "reason",
10514
+ "valueType": "string"
10515
+ }],
10516
+ "running-state": [
10517
+ {
10518
+ "path": "running",
10519
+ "valueType": "boolean"
10520
+ },
10521
+ {
10522
+ "path": "since",
10523
+ "valueType": "number"
10524
+ },
10525
+ {
10526
+ "path": "source",
10527
+ "valueType": "enum",
10528
+ "enumValues": ["native", "assigned"]
10529
+ },
10530
+ {
10531
+ "path": "phase",
10532
+ "valueType": "string"
10533
+ }
10534
+ ],
10535
+ "script-runner": [
10536
+ {
10537
+ "path": "isRunning",
10538
+ "valueType": "boolean"
10539
+ },
10540
+ {
10541
+ "path": "lastRunAt",
10542
+ "valueType": "number"
10543
+ },
10544
+ {
10545
+ "path": "lastRunSuccess",
10546
+ "valueType": "boolean"
10547
+ },
10548
+ {
10549
+ "path": "lastError",
10550
+ "valueType": "string"
10551
+ }
10552
+ ],
10553
+ "smoke": [{
10554
+ "path": "detected",
10555
+ "valueType": "boolean"
10556
+ }],
10557
+ "snapshot": [
10558
+ {
10559
+ "path": "lastCapturedAt",
10560
+ "valueType": "number"
10561
+ },
10562
+ {
10563
+ "path": "cacheAgeMs",
10564
+ "valueType": "number"
10565
+ },
10566
+ {
10567
+ "path": "lastBytes",
10568
+ "valueType": "number"
10569
+ },
10570
+ {
10571
+ "path": "lastStreamId",
10572
+ "valueType": "string"
10573
+ }
10574
+ ],
10575
+ "stream-params": [
10576
+ {
10577
+ "path": "main.width",
10578
+ "valueType": "number"
10579
+ },
10580
+ {
10581
+ "path": "main.height",
10582
+ "valueType": "number"
10583
+ },
10584
+ {
10585
+ "path": "main.codec",
10586
+ "valueType": "enum",
10587
+ "enumValues": ["h264", "h265"]
10588
+ },
10589
+ {
10590
+ "path": "main.framerate",
10591
+ "valueType": "number"
10592
+ },
10593
+ {
10594
+ "path": "main.bitrate",
10595
+ "valueType": "number"
10596
+ },
10597
+ {
10598
+ "path": "main.bitrateMode",
10599
+ "valueType": "enum",
10600
+ "enumValues": ["vbr", "cbr"]
10601
+ },
10602
+ {
10603
+ "path": "main.encoderProfile",
10604
+ "valueType": "enum",
10605
+ "enumValues": [
10606
+ "high",
10607
+ "main",
10608
+ "baseline"
10609
+ ]
10610
+ },
10611
+ {
10612
+ "path": "main.gop",
10613
+ "valueType": "number"
10614
+ },
10615
+ {
10616
+ "path": "main.audio",
10617
+ "valueType": "boolean"
10618
+ },
10619
+ {
10620
+ "path": "sub.width",
10621
+ "valueType": "number"
10622
+ },
10623
+ {
10624
+ "path": "sub.height",
10625
+ "valueType": "number"
10626
+ },
10627
+ {
10628
+ "path": "sub.codec",
10629
+ "valueType": "enum",
10630
+ "enumValues": ["h264", "h265"]
10631
+ },
10632
+ {
10633
+ "path": "sub.framerate",
10634
+ "valueType": "number"
10635
+ },
10636
+ {
10637
+ "path": "sub.bitrate",
10638
+ "valueType": "number"
10639
+ },
10640
+ {
10641
+ "path": "sub.bitrateMode",
10642
+ "valueType": "enum",
10643
+ "enumValues": ["vbr", "cbr"]
10644
+ },
10645
+ {
10646
+ "path": "sub.encoderProfile",
10647
+ "valueType": "enum",
10648
+ "enumValues": [
10649
+ "high",
10650
+ "main",
10651
+ "baseline"
10652
+ ]
10653
+ },
10654
+ {
10655
+ "path": "sub.gop",
10656
+ "valueType": "number"
10657
+ },
10658
+ {
10659
+ "path": "sub.audio",
10660
+ "valueType": "boolean"
10661
+ },
10662
+ {
10663
+ "path": "ext.width",
10664
+ "valueType": "number"
10665
+ },
10666
+ {
10667
+ "path": "ext.height",
10668
+ "valueType": "number"
10669
+ },
10670
+ {
10671
+ "path": "ext.codec",
10672
+ "valueType": "enum",
10673
+ "enumValues": ["h264", "h265"]
10674
+ },
10675
+ {
10676
+ "path": "ext.framerate",
10677
+ "valueType": "number"
10678
+ },
10679
+ {
10680
+ "path": "ext.bitrate",
10681
+ "valueType": "number"
10682
+ },
10683
+ {
10684
+ "path": "ext.bitrateMode",
10685
+ "valueType": "enum",
10686
+ "enumValues": ["vbr", "cbr"]
10687
+ },
10688
+ {
10689
+ "path": "ext.encoderProfile",
10690
+ "valueType": "enum",
10691
+ "enumValues": [
10692
+ "high",
10693
+ "main",
10694
+ "baseline"
10695
+ ]
10696
+ },
10697
+ {
10698
+ "path": "ext.gop",
10699
+ "valueType": "number"
10700
+ },
10701
+ {
10702
+ "path": "ext.audio",
10703
+ "valueType": "boolean"
10704
+ }
10705
+ ],
10706
+ "switch": [{
10707
+ "path": "on",
10708
+ "valueType": "boolean"
10709
+ }],
10710
+ "tamper": [{
10711
+ "path": "tampered",
10712
+ "valueType": "boolean"
10713
+ }],
10714
+ "temperature-sensor": [
10715
+ {
10716
+ "path": "celsius",
10717
+ "valueType": "number"
10718
+ },
10719
+ {
10720
+ "path": "unit",
10721
+ "valueType": "string"
10722
+ },
10723
+ {
10724
+ "path": "precision",
10725
+ "valueType": "number"
10726
+ }
10727
+ ],
10728
+ "update": [
10729
+ {
10730
+ "path": "currentVersion",
10731
+ "valueType": "string"
10732
+ },
10733
+ {
10734
+ "path": "availableVersion",
10735
+ "valueType": "string"
10736
+ },
10737
+ {
10738
+ "path": "updatable",
10739
+ "valueType": "boolean"
10740
+ },
10741
+ {
10742
+ "path": "state",
10743
+ "valueType": "string"
10744
+ },
10745
+ {
10746
+ "path": "inProgress",
10747
+ "valueType": "boolean"
10748
+ }
10749
+ ],
10750
+ "vacuum-control": [
10751
+ {
10752
+ "path": "state",
10753
+ "valueType": "enum",
10754
+ "enumValues": [
10755
+ "idle",
10756
+ "cleaning",
10757
+ "paused",
10758
+ "returning",
10759
+ "docked",
10760
+ "drying",
10761
+ "error"
10762
+ ]
10763
+ },
10764
+ {
10765
+ "path": "batteryLevel",
10766
+ "valueType": "number"
10767
+ },
10768
+ {
10769
+ "path": "fanSpeed",
10770
+ "valueType": "string"
10771
+ },
10772
+ {
10773
+ "path": "progressPercent",
10774
+ "valueType": "number"
10775
+ },
10776
+ {
10777
+ "path": "errorCode",
10778
+ "valueType": "number"
10779
+ },
10780
+ {
10781
+ "path": "errorLabel",
10782
+ "valueType": "string"
10783
+ }
10784
+ ],
10785
+ "valve": [{
10786
+ "path": "state",
10787
+ "valueType": "enum",
10788
+ "enumValues": [
10789
+ "open",
10790
+ "opening",
10791
+ "closing",
10792
+ "closed",
10793
+ "stopped"
10794
+ ]
10795
+ }, {
10796
+ "path": "position",
10797
+ "valueType": "number"
10798
+ }],
10799
+ "vibration": [{
10800
+ "path": "detected",
10801
+ "valueType": "boolean"
10802
+ }],
10803
+ "water-heater": [
10804
+ {
10805
+ "path": "currentTemp",
10806
+ "valueType": "number"
10807
+ },
10808
+ {
10809
+ "path": "targetTemp",
10810
+ "valueType": "number"
10811
+ },
10812
+ {
10813
+ "path": "operationMode",
10814
+ "valueType": "string"
10815
+ },
10816
+ {
10817
+ "path": "away",
10818
+ "valueType": "boolean"
10819
+ },
10820
+ {
10821
+ "path": "minTemp",
10822
+ "valueType": "number"
10823
+ },
10824
+ {
10825
+ "path": "maxTemp",
10826
+ "valueType": "number"
10827
+ }
10828
+ ],
10829
+ "weather": [
10830
+ {
10831
+ "path": "condition",
10832
+ "valueType": "string"
10833
+ },
10834
+ {
10835
+ "path": "temperature",
10836
+ "valueType": "number"
10837
+ },
10838
+ {
10839
+ "path": "temperatureUnit",
10840
+ "valueType": "string"
10841
+ },
10842
+ {
10843
+ "path": "humidity",
10844
+ "valueType": "number"
10845
+ },
10846
+ {
10847
+ "path": "pressure",
10848
+ "valueType": "number"
10849
+ },
10850
+ {
10851
+ "path": "pressureUnit",
10852
+ "valueType": "string"
10853
+ },
10854
+ {
10855
+ "path": "windSpeed",
10856
+ "valueType": "number"
10857
+ },
10858
+ {
10859
+ "path": "windSpeedUnit",
10860
+ "valueType": "string"
10861
+ },
10862
+ {
10863
+ "path": "windBearing",
10864
+ "valueType": "number"
10865
+ }
10866
+ ],
10867
+ "zone-analytics": [
10868
+ {
10869
+ "path": "ts",
10870
+ "valueType": "number"
10871
+ },
10872
+ {
10873
+ "path": "frameWidth",
10874
+ "valueType": "number"
10875
+ },
10876
+ {
10877
+ "path": "frameHeight",
10878
+ "valueType": "number"
10879
+ },
10880
+ {
10881
+ "path": "frame.totalObjects",
10882
+ "valueType": "number"
10883
+ },
10884
+ {
10885
+ "path": "frame.standingObjects",
10886
+ "valueType": "number"
10887
+ },
10888
+ {
10889
+ "path": "frame.transientObjects",
10890
+ "valueType": "number"
10891
+ },
10892
+ {
10893
+ "path": "unzoned.totalObjects",
10894
+ "valueType": "number"
10895
+ },
10896
+ {
10897
+ "path": "unzoned.standingObjects",
10898
+ "valueType": "number"
10899
+ },
10900
+ {
10901
+ "path": "unzoned.transientObjects",
10902
+ "valueType": "number"
10903
+ }
10904
+ ]
10905
+ });
8932
10906
  var HF_REPO = "camstack/camstack-models";
8933
10907
  `${HF_REPO}`;
8934
10908
  object({
@@ -9439,7 +11413,7 @@ function errMsg(err) {
9439
11413
  return String(err);
9440
11414
  }
9441
11415
  //#endregion
9442
- //#region ../types/dist/composition-BJ8iAZb3.mjs
11416
+ //#region ../types/dist/composition-kEl9mevu.mjs
9443
11417
  var AUDIO_ENCODER_BY_CODEC = {
9444
11418
  opus: "libopus",
9445
11419
  aac: "aac",
@@ -9700,7 +11674,7 @@ function buildStdoutOrRtspSinkArgs(sink) {
9700
11674
  * frame, loses the race, and skips to the following one: **every fragment comes
9701
11675
  * out at twice the requested length.**
9702
11676
  *
9703
- * Measured on the live fleet 2026-08-07, camera 615, `-c:v copy` (D84):
11677
+ * Measured on the live fleet 2026-08-07, camera 101, `-c:v copy` (D84):
9704
11678
  *
9705
11679
  * | slot | GOP | `-min_frag_duration` | median gap |
9706
11680
  * | --- | --- | --- | --- |
@@ -11495,7 +13469,7 @@ function gifDeriveSpeed(gifSpeed, videoSpeed) {
11495
13469
  * runs at `fps / speed` in SOURCE time and `setpts` multiplies what survived.
11496
13470
  * The trailing `fps` re-declares the rate, which is NOT redundant: `setpts`
11497
13471
  * leaves the filter link advertising the sampled rate and the gif muxer
11498
- * believes the link — measured on 615 as a 3.01 s gif of ten frames.
13472
+ * believes the link — measured on 101 as a 3.01 s gif of ten frames.
11499
13473
  */
11500
13474
  function gifFilterComplex(input) {
11501
13475
  const speed = input.speed > 0 ? input.speed : 1;
@@ -14188,7 +16162,7 @@ var LogChannelDescriptorSchema = object({
14188
16162
  * `true` is a PROMISE with two halves, and both must hold: the gate is
14189
16163
  * consulted with the numeric device id, AND every line the channel admits
14190
16164
  * carries `tags: { deviceId }` with that same numeric id. The second half is
14191
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
16165
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
14192
16166
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
14193
16167
  * the body is the only way to filter.
14194
16168
  *
@@ -14764,7 +16738,7 @@ function effectFor(stepId, label) {
14764
16738
  * - label kind: a label counts for a step only when the classMap sends it to
14765
16739
  * that step's macro AND it names a vocabulary entry. Every root is judged
14766
16740
  * the same way — a COCO model supplies the animal classifier with the six
14767
- * species COCO names, exactly as a Frigate+ model supplies seven.
16741
+ * species COCO names, exactly as a plus catalog model supplies seven.
14768
16742
  * - crop kind: the labelmap carries one of the step's root labels. Those
14769
16743
  * labels are deliberately left out of the classMap, so they never make a
14770
16744
  * track of their own.
@@ -15021,7 +16995,7 @@ var ModelVariantGroupSchema = object({
15021
16995
  precision: _enum(["fp32", "int8"]).optional(),
15022
16996
  /**
15023
16997
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
15024
- * an alternate training of the same family (Scrypted `relu_test`); chip
16998
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
15025
16999
  * label is "Test".
15026
17000
  */
15027
17001
  optimization: _enum(["standard", "test"]).optional(),
@@ -15042,9 +17016,9 @@ var ModelProviderIdSchema = _enum([
15042
17016
  ]);
15043
17017
  /**
15044
17018
  * Resolve a catalog entry's picker provider. An explicit stamp always wins;
15045
- * otherwise Frigate/Scrypted are recognised from id prefix or description.
17019
+ * otherwise plus catalog/plugin catalog are recognised from id prefix or description.
15046
17020
  * Unstamped BYO registry rows fall through to `custom`. Family `yolov9` is
15047
- * NOT a Scrypted signal — CamStack ships that family too.
17021
+ * NOT a plugin catalog signal — CamStack ships that family too.
15048
17022
  */
15049
17023
  function inferModelProvider(entry) {
15050
17024
  if (entry.provider !== void 0) return entry.provider;
@@ -15286,8 +17260,8 @@ var ModelCatalogEntrySchema = object({
15286
17260
  provider: ModelProviderIdSchema.optional(),
15287
17261
  /**
15288
17262
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
15289
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
15290
- * labels already ARE the CamStack macros (Scrypted identity map).
17263
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
17264
+ * labels already ARE the CamStack macros (plugin catalog identity map).
15291
17265
  */
15292
17266
  classMap: DetectionCatalogClassMapSchema.optional(),
15293
17267
  /**
@@ -18473,7 +20447,7 @@ var streamBrokerCapability = {
18473
20447
  * `1` is real time and is the ONLY value that allows the copy branch —
18474
20448
  * anything else forces `libx264` over the window. That was priced
18475
20449
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
18476
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
20450
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
18477
20451
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
18478
20452
  * once the decode is forced the width stops being free.
18479
20453
  */
@@ -19148,6 +21122,7 @@ var CompositionRunStatusSchema = _enum([
19148
21122
  "starting",
19149
21123
  "running",
19150
21124
  "degraded",
21125
+ "incomplete",
19151
21126
  "failed"
19152
21127
  ]);
19153
21128
  var CompositionFieldStateKindSchema = _enum([
@@ -19361,6 +21336,7 @@ var CoreBlockStatusSchema = _enum([
19361
21336
  "starting",
19362
21337
  "running",
19363
21338
  "degraded",
21339
+ "incomplete",
19364
21340
  "failed"
19365
21341
  ]);
19366
21342
  /** path → TypeScript source for a multi-file block. */
@@ -41315,7 +43291,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
41315
43291
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
41316
43292
  * operator's casing. The registry matches labels trimmed + case-insensitively
41317
43293
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
41318
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
43294
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
41319
43295
  * map keyed on the displayed casing would orphan its entry on exactly that
41320
43296
  * edit. Consumers join by keying their own label through `locationIconKey`.
41321
43297
  */
@@ -41340,7 +43316,7 @@ var LocationDescriptionAssignmentSchema = object({
41340
43316
  /**
41341
43317
  * A SITE ZONE — a named part of the property that several locations belong to.
41342
43318
  *
41343
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
43319
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
41344
43320
  * kitchen. A camera belongs to exactly one location, and a location to at most
41345
43321
  * one zone, so a camera's zone is derived and never stored on the device: the
41346
43322
  * whole point of this entity is that grouping rooms touches no device row.
@@ -41369,7 +43345,7 @@ var LocationDescriptionAssignmentSchema = object({
41369
43345
  * the locations inside it.
41370
43346
  *
41371
43347
  * The LABEL is carried alongside the key because the key is lossy on purpose —
41372
- * a surface must show "Zona notte", not "zona notte". Locations are carried
43348
+ * a surface must show "Night zone", not "night zone". Locations are carried
41373
43349
  * here, rather than left to a second call, because every consumer wants both
41374
43350
  * at once and a viewer that asked twice could render a zone whose membership
41375
43351
  * it has not fetched yet.
@@ -43518,8 +45494,8 @@ var LoadContributionSchema = object({
43518
45494
  "unattributable"
43519
45495
  ]),
43520
45496
  /**
43521
- * What ONE entry is, in the contributor's own words — `615/high`,
43522
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
45497
+ * What ONE entry is, in the contributor's own words — `101/high`,
45498
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
43523
45499
  * family and inventing a common one would lose the only information that
43524
45500
  * makes two entries for the same camera distinguishable.
43525
45501
  */
@@ -46857,7 +48833,7 @@ var NcConditionsSchema = object({
46857
48833
  * with the list under it is worse than no switch (D62).
46858
48834
  *
46859
48835
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
46860
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
48836
+ * renameable, and a rule authored on "Alice" went silently dark the moment
46861
48837
  * the operator fixed the spelling. The id reaches the record on
46862
48838
  * `LabelAttribution.identityId`; the name is what the editor shows and what
46863
48839
  * `{{label}}` renders.
@@ -47408,7 +49384,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
47408
49384
  * A rule scoped to one camera and one zone silently became a rule that
47409
49385
  * matches EVERY event on EVERY camera, and lost its `media` policy
47410
49386
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
47411
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
49387
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
47412
49388
  * within a minute of a two-field patch.
47413
49389
  *
47414
49390
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -49268,7 +51244,7 @@ var LabelAttributionSchema = object({
49268
51244
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
49269
51245
  *
49270
51246
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
49271
- * notification rule authored on "Gianluca" stopped matching the moment the
51247
+ * notification rule authored on "Alice" stopped matching the moment the
49272
51248
  * operator fixed the spelling in the gallery, and nothing said so. The id is
49273
51249
  * the thing that does not move, so it is what a rule matches on
49274
51250
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -51920,7 +53896,7 @@ var pipelineExecutorCapability = {
51920
53896
  /**
51921
53897
  * Root-supplied detections for the tree's ROOT step (D730). Set by
51922
53898
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
51923
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
53899
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
51924
53900
  * NOT inferred, these boxes are its output, and its children (the plate
51925
53901
  * reader) run on them through their own crop policy. Boxes are in the
51926
53902
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -53613,7 +55589,7 @@ var RunnerCameraConfigSchema = object({
53613
55589
  * detection session that asks for history. What shipped was a last-moment
53614
55590
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
53615
55591
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
53616
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
55592
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
53617
55593
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
53618
55594
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
53619
55595
  * was decoded, and was freed.
@@ -53819,7 +55795,7 @@ var pipelineRunnerCapability = {
53819
55795
  *
53820
55796
  * The periodic recheck (`occupancyRecheckSec`, 300 s) exists to watch a
53821
55797
  * still scene. It is the wrong instrument for a QUESTION that has just been
53822
- * asked: on device 617 a parked car's departure was observed, a departure
55798
+ * asked: on device 102 a parked car's departure was observed, a departure
53823
55799
  * strike was armed — and then the motion session ended, the strike decayed
53824
55800
  * after its 30 s TTL, and the next periodic look arrived up to five minutes
53825
55801
  * later with nothing left to confirm. Every one of those departures was
@@ -55891,7 +57867,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
55891
57867
  * The signals a device can emit to WAKE its own stream.
55892
57868
  *
55893
57869
  * A camera whose stream is built on demand sleeps until something asks for it,
55894
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
57870
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
55895
57871
  * puller holds a session open for ever, and treating that as demand would keep
55896
57872
  * a battery camera awake for ever, which is the whole thing the battery is for
55897
57873
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -56591,7 +58567,7 @@ var ClipSchema = object({
56591
58567
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
56592
58568
  *
56593
58569
  * Bounded because it is not a payload the surface pages through: one visit on
56594
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
58570
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
56595
58571
  * camera-day. Read {@link eventCount} for the true total.
56596
58572
  */
56597
58573
  eventIds: array(string()).optional(),
@@ -56736,7 +58712,7 @@ var ClipPlaybackSchema = object({
56736
58712
  * camera has no recordings", which is the defect this whole line of work is
56737
58713
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
56738
58714
  * reached at all (`unreachable`, also what a provider that THREW reports), a
56739
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
58715
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
56740
58716
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
56741
58717
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
56742
58718
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -57116,7 +59092,7 @@ var videoclipsCapability = {
57116
59092
  *
57117
59093
  * It was optional, documented as "absent means the device's BOUND
57118
59094
  * provider, which is CamStack on every camera". No code implemented
57119
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
59095
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
57120
59096
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
57121
59097
  * answered SIX rows, three from each source, merged newest-first:
57122
59098
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -58438,7 +60414,10 @@ object({
58438
60414
  DeviceType.Sensor;
58439
60415
  object({
58440
60416
  /** Current illuminance in lux (lx). */
58441
- lux: number().min(0),
60417
+ lux: number().min(0).meta({
60418
+ unit: "lx",
60419
+ label: "Illuminance"
60420
+ }),
58442
60421
  /** Ms epoch when the slice was last updated. */
58443
60422
  lastFetchedAt: number(),
58444
60423
  /** Live display unit from the upstream source (e.g. HA
@@ -58594,7 +60573,10 @@ var BatteryStatusSchema = object({
58594
60573
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
58595
60574
  * declines to band a non-finite reading, which is the correct shape.
58596
60575
  */
58597
- percentage: number().min(0).max(100).nullable(),
60576
+ percentage: number().min(0).max(100).nullable().meta({
60577
+ unit: "%",
60578
+ label: "Charge"
60579
+ }),
58598
60580
  /**
58599
60581
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
58600
60582
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -58613,13 +60595,13 @@ var BatteryStatusSchema = object({
58613
60595
  "solar",
58614
60596
  "none",
58615
60597
  "unknown"
58616
- ]),
60598
+ ]).meta({ label: "Charging source" }),
58617
60599
  /**
58618
60600
  * True when the camera firmware has gone into low-power mode. Battery
58619
60601
  * providers MUST avoid polling during sleep — reading the battery
58620
60602
  * wakes the camera up and drains charge.
58621
60603
  */
58622
- sleeping: boolean(),
60604
+ sleeping: boolean().meta({ label: "Sleeping" }),
58623
60605
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
58624
60606
  lastUpdated: number(),
58625
60607
  /**
@@ -58659,7 +60641,7 @@ var BatteryStatusSchema = object({
58659
60641
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
58660
60642
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
58661
60643
  */
58662
- binary: boolean().optional()
60644
+ binary: boolean().optional().meta({ label: "Binary indicator" })
58663
60645
  });
58664
60646
  var BATTERY_DEVICE_TYPES = [
58665
60647
  DeviceType.Camera,
@@ -58673,6 +60655,7 @@ var BATTERY_DEVICE_TYPES = [
58673
60655
  /** Generic Customize target for the percentage reading (D936). */
58674
60656
  var batteryCustomize = {
58675
60657
  version: 1,
60658
+ advanced: "derive",
58676
60659
  targets: [{
58677
60660
  id: "percentage",
58678
60661
  cardinality: "scalar",
@@ -58812,7 +60795,7 @@ onStatusChanged: { data: object({
58812
60795
  volatileStateFields: ["lastUpdated"]
58813
60796
  };
58814
60797
  object({
58815
- on: boolean(),
60798
+ on: boolean().meta({ label: "On" }),
58816
60799
  /** Ms epoch of the last transition. 0 if never observed. */
58817
60800
  lastChangedAt: number()
58818
60801
  });
@@ -59070,7 +61053,7 @@ var GridLayoutCellSchema = object({
59070
61053
  *
59071
61054
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
59072
61055
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
59073
- * the sources, because "this grid has no low" is not a finding — "615 has no
61056
+ * the sources, because "this grid has no low" is not a finding — "101 has no
59074
61057
  * low" is, and it is the one an operator can act on.
59075
61058
  */
59076
61059
  var GridProfileOfferSchema = object({
@@ -60621,7 +62604,10 @@ DeviceType.Humidifier, method(object({
60621
62604
  });
60622
62605
  object({
60623
62606
  /** Current relative humidity, 0..100. */
60624
- percent: number().min(0).max(100),
62607
+ percent: number().min(0).max(100).meta({
62608
+ unit: "%",
62609
+ label: "Humidity"
62610
+ }),
60625
62611
  /** Ms epoch when the slice was last updated. */
60626
62612
  lastFetchedAt: number(),
60627
62613
  /** Live display unit from the upstream source (e.g. HA
@@ -63398,9 +65384,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
63398
65384
  });
63399
65385
  object({
63400
65386
  /** Instantaneous power draw in watts. */
63401
- watts: number().optional(),
65387
+ watts: number().optional().meta({
65388
+ unit: "W",
65389
+ label: "Power"
65390
+ }),
63402
65391
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
63403
- kwhTotal: number().optional(),
65392
+ kwhTotal: number().optional().meta({
65393
+ unit: "kWh",
65394
+ label: "Energy"
65395
+ }),
63404
65396
  /** Voltage in volts. */
63405
65397
  volts: number().optional(),
63406
65398
  /** Current in amperes. */
@@ -63719,9 +65711,9 @@ var PtzOptionsSchema = object({
63719
65711
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
63720
65712
  * not one of the three cameras honours its own:
63721
65713
  *
63722
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
63723
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
63724
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
65714
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
65715
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
65716
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
63725
65717
  *
63726
65718
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
63727
65719
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -63868,7 +65860,7 @@ object({
63868
65860
  running: boolean().nullable(),
63869
65861
  /** Epoch ms the current boolean began; null while `running` is null. */
63870
65862
  since: number().nullable(),
63871
- source: RunningStateSourceSchema,
65863
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
63872
65864
  phase: string().nullable(),
63873
65865
  /** null until a reading has been published (D393). */
63874
65866
  lastFetchedAt: number().nullable()
@@ -63980,7 +65972,7 @@ var RecordingAvailabilitySchema = object({
63980
65972
  * would look identical. But the answer used to say nothing about that, so a
63981
65973
  * caller asking "what can I export?" read the single preferred profile as
63982
65974
  * the only one that exists — on this deployment every camera records `high`
63983
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
65975
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
63984
65976
  * UI could not see it.
63985
65977
  *
63986
65978
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -64079,7 +66071,7 @@ var RecordingSourceOptionsSchema = object({
64079
66071
  * `sparse` = gaps are the absence of one, and must be drawn as such.
64080
66072
  *
64081
66073
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
64082
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
66074
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
64083
66075
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
64084
66076
  coverage: _enum(["continuous", "sparse"]),
64085
66077
  /** Where the playhead may be put.
@@ -64190,7 +66182,7 @@ var recordingCapability = {
64190
66182
  * merely discouraged (D554 amended).
64191
66183
  *
64192
66184
  * It was learned the expensive way on `videoclips.listClips`: measured
64193
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
66185
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
64194
66186
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
64195
66187
  * three from each source, merged — `device-collection-dispatch.ts`
64196
66188
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -65014,7 +67006,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
65014
67006
  * on a 10 h window holding 29,393 s of footage every range landed late by the
65015
67007
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
65016
67008
  * the video was a uniform timelapse, and the log line reported the five ranges
65017
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
67009
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
65018
67010
  *
65019
67011
  * Relative and not absolute epoch, because an absolute epoch would make every
65020
67012
  * call site responsible for the same subtraction.
@@ -65855,7 +67847,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
65855
67847
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
65856
67848
  * for the thing: a scene is a standing question about the property ("is the bin
65857
67849
  * still out"), and the operator's question is "which of my scenes have tripped",
65858
- * across every camera at once — not "what does camera 617 think". Buried one
67850
+ * across every camera at once — not "what does camera 102 think". Buried one
65859
67851
  * camera deep it also could not be found. The surface is now a top-level admin
65860
67852
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
65861
67853
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -66438,7 +68430,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), StreamParamsOptionsSch
66438
68430
  auth: "admin"
66439
68431
  }), method(object({ deviceId: number() }), unknown().nullable());
66440
68432
  object({
66441
- on: boolean(),
68433
+ on: boolean().meta({ label: "On" }),
66442
68434
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
66443
68435
  lastChangedAt: number()
66444
68436
  });
@@ -67001,7 +68993,10 @@ object({
67001
68993
  DeviceType.Sensor;
67002
68994
  object({
67003
68995
  /** Current temperature in Celsius. */
67004
- celsius: number(),
68996
+ celsius: number().meta({
68997
+ unit: "°C",
68998
+ label: "Temperature"
68999
+ }),
67005
69000
  /** Ms epoch when the slice was last updated (push or poll). */
67006
69001
  lastFetchedAt: number(),
67007
69002
  /** Live display unit from the upstream source (e.g. HA
@@ -68189,6 +70184,10 @@ function dominantClipLabels(events) {
68189
70184
  return [...counts.entries()].toSorted((x, y) => y[1] - x[1]).slice(0, 3).map(([name]) => name);
68190
70185
  }
68191
70186
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
70187
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
70188
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
70189
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
70190
+ new Set(CAP_NAMES);
68192
70191
  Object.freeze({
68193
70192
  person: .5,
68194
70193
  vehicle: .5,
@@ -81144,7 +83143,7 @@ var SENSOR_CAP_VOCABULARY = {
81144
83143
  state: [{
81145
83144
  kind: "boolean",
81146
83145
  field: "on",
81147
- label: t("Active", "Attivo"),
83146
+ label: t("On", "Acceso"),
81148
83147
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
81149
83148
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
81150
83149
  icon: "toggle-right"
@@ -84568,7 +86567,6 @@ Object.freeze({
84568
86567
  "smtp-provider": "email"
84569
86568
  });
84570
86569
  DeviceType.Camera;
84571
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
84572
86570
  /**
84573
86571
  * A saved Customize assignment (D936). The schema is the type: callers use
84574
86572
  * `z.infer`, they do not restate the shape.
@@ -84657,7 +86655,6 @@ object({
84657
86655
  ]),
84658
86656
  reason: string().nullable()
84659
86657
  });
84660
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
84661
86658
  var G711_SCALE_CORRECTION_DB = {
84662
86659
  PCMU: 20 * Math.log10(4),
84663
86660
  PCMA: 20 * Math.log10(8)
@@ -85080,7 +87077,7 @@ var STATE_SUMMARY_SECTION_VARS = [
85080
87077
  {
85081
87078
  name: "summaryStreams",
85082
87079
  label: "Summary: streams offline",
85083
- example: "Ingresso (high) — since 06:40",
87080
+ example: "Front door (high) — since 06:40",
85084
87081
  kinds: ["stream-offline", "stream-online"]
85085
87082
  },
85086
87083
  {
@@ -85098,13 +87095,13 @@ var STATE_SUMMARY_SECTION_VARS = [
85098
87095
  {
85099
87096
  name: "summaryDetection",
85100
87097
  label: "Summary: cameras detecting nothing",
85101
- example: "Ingresso — since 05:10",
87098
+ example: "Front door — since 05:10",
85102
87099
  kinds: ["detection-blind"]
85103
87100
  },
85104
87101
  {
85105
87102
  name: "summaryNodes",
85106
87103
  label: "Summary: nodes",
85107
- example: "little-unraid — offline since 03:00",
87104
+ example: "agent-a — offline since 03:00",
85108
87105
  kinds: [
85109
87106
  "node-offline",
85110
87107
  "node-online",
@@ -85946,7 +87943,7 @@ function classifyRegion(region, uncovered) {
85946
87943
  * The pass report counts the passes that RAN, so "the second pass stops running
85947
87944
  * when a person is beside the dog" — a plausible reading of
85948
87945
  * {@link RECOVERY_MAX_REGION_FRAME_FRACTION} and
85949
- * {@link RECOVERY_MIN_UNCOVERED_FRACTION}, and a live hypothesis on camera 615
87946
+ * {@link RECOVERY_MIN_UNCOVERED_FRACTION}, and a live hypothesis on camera 101
85950
87947
  * — could not be confirmed or killed from the logs at all. This classifies the
85951
87948
  * regions a frame offered, against the same predicate the planner filters on.
85952
87949
  */
@@ -86252,7 +88249,7 @@ function planMotionCropRegions(input) {
86252
88249
  * — and ceilinged at {@link RECOVERY_CROP_MAX_SIDE_PX}. The ceiling is NOT a
86253
88250
  * simplification either: at 1024 px the same 320 model scored the reference
86254
88251
  * dog 0.52–0.76, and at 1280 px lost it entirely
86255
- * (`docs/benchmarks/pipeline-frame-model-eval.md`, case `miss-dog-615`). A
88252
+ * (`docs/benchmarks/pipeline-frame-model-eval.md`, case `miss-dog-101`). A
86256
88253
  * region longer than the ceiling is TILED along its longer axis, never zoomed
86257
88254
  * out.
86258
88255
  */