@camstack/addon-training 0.1.79 → 0.1.81

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 (21) hide show
  1. package/dist/{MotionZonesSettings-CHoUtlZU.mjs → MotionZonesSettings-Ca-6XXfI.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-DfxPrf-U.mjs → PrivacyMaskSettings-BCUM9T8S.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-B32hWMGP.mjs → SceneMonitorEditor-CjJ891SK.mjs} +1 -1
  4. package/dist/_stub.js +5248 -5127
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-GwANcGcn.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cr7Pmc7w.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-9NmkfCw8.mjs +26 -0
  7. package/dist/addon-training.css +1 -1
  8. package/dist/{dist-we-Yi15l.mjs → dist-BEHbfGro.mjs} +2536 -121
  9. package/dist/{dist-DuaaneP-.js → dist-CdN9FdUa.js} +2536 -121
  10. package/dist/{hostInit-OSodFHgq.mjs → hostInit-XwE0hfA0.mjs} +3 -3
  11. package/dist/index.js +1 -1
  12. package/dist/orchestrator/training.addon.js +1 -1
  13. package/dist/orchestrator/training.addon.mjs +1 -1
  14. package/dist/{player-overlays-CN0bZ_0v.mjs → player-overlays-Bk8LUHwl.mjs} +1 -1
  15. package/dist/providers/modal/training-modal.addon.js +1 -1
  16. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  17. package/dist/remoteEntry.js +1 -1
  18. package/dist/{responsive-wQi9hajb.mjs → responsive-DkRlf-GQ.mjs} +1 -1
  19. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-CbTZ0yvt.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-DslbW4nN.mjs} +1 -1
  20. package/package.json +1 -1
  21. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-ff_0UQsH.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import "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).
@@ -8767,6 +8767,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8767
8767
  kind: "mutation",
8768
8768
  auth: "admin"
8769
8769
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8770
+ Object.freeze({ "doorbell": "lastPressedAt" });
8771
+ /** Every capability name, so addon code can check a name without the schema graph. */
8772
+ var CAP_NAMES = Object.freeze([
8773
+ "accessories",
8774
+ "addon-pages",
8775
+ "addon-pages-source",
8776
+ "addon-routes",
8777
+ "addon-settings",
8778
+ "addon-widgets",
8779
+ "addon-widgets-source",
8780
+ "addons",
8781
+ "admin-ui",
8782
+ "air-quality-sensor",
8783
+ "alarm-panel",
8784
+ "alerts",
8785
+ "ambient-light-sensor",
8786
+ "audio-analysis",
8787
+ "audio-analyzer",
8788
+ "audio-codec",
8789
+ "audio-metrics",
8790
+ "auth-provider",
8791
+ "automation-control",
8792
+ "backup",
8793
+ "battery",
8794
+ "binary",
8795
+ "brightness",
8796
+ "broker",
8797
+ "button",
8798
+ "calendar-source",
8799
+ "calendars",
8800
+ "camera-credentials",
8801
+ "camera-grid-layout",
8802
+ "camera-pipeline-config",
8803
+ "camera-streams",
8804
+ "carbon-monoxide",
8805
+ "climate-control",
8806
+ "color",
8807
+ "composer",
8808
+ "connection-test",
8809
+ "connectivity",
8810
+ "consumables",
8811
+ "contact",
8812
+ "control",
8813
+ "core-blocks",
8814
+ "cover",
8815
+ "custom-model-registry",
8816
+ "data-store-provider",
8817
+ "database-snapshot",
8818
+ "day-night",
8819
+ "decoder",
8820
+ "detection-pipeline",
8821
+ "device-admin-link",
8822
+ "device-adoption",
8823
+ "device-credentials",
8824
+ "device-discovery",
8825
+ "device-export",
8826
+ "device-extension",
8827
+ "device-history",
8828
+ "device-manager",
8829
+ "device-ops",
8830
+ "device-provider",
8831
+ "device-removal-hook",
8832
+ "device-state",
8833
+ "device-status",
8834
+ "dishwasher",
8835
+ "display-palette",
8836
+ "doorbell",
8837
+ "embedding-encoder",
8838
+ "enum-sensor",
8839
+ "event-emitter",
8840
+ "face-gallery",
8841
+ "failure-contribution",
8842
+ "fan-control",
8843
+ "feature-probe",
8844
+ "filesystem-browse",
8845
+ "flood",
8846
+ "gas",
8847
+ "heating-valve",
8848
+ "humidifier",
8849
+ "humidity-sensor",
8850
+ "image",
8851
+ "image-settings",
8852
+ "integrations",
8853
+ "intercom",
8854
+ "keychain",
8855
+ "keychain-admin",
8856
+ "lawn-mower-control",
8857
+ "llm",
8858
+ "llm-runtime",
8859
+ "load-contribution",
8860
+ "local-network",
8861
+ "lock-control",
8862
+ "log-channels",
8863
+ "log-destination",
8864
+ "login-method",
8865
+ "media-player",
8866
+ "mesh-network",
8867
+ "metrics-provider",
8868
+ "model-convert",
8869
+ "model-distributor",
8870
+ "motion",
8871
+ "motion-detection",
8872
+ "motion-trigger",
8873
+ "motion-zones",
8874
+ "mqtt-broker",
8875
+ "native-object-detection",
8876
+ "navigation",
8877
+ "network-access",
8878
+ "network-link",
8879
+ "network-quality",
8880
+ "node-certificates",
8881
+ "nodes",
8882
+ "notification-output",
8883
+ "notification-rules",
8884
+ "notifier",
8885
+ "numeric-sensor",
8886
+ "oauth-integration",
8887
+ "oidc-connections",
8888
+ "osd",
8889
+ "osd-manager",
8890
+ "pet-feeder",
8891
+ "pipeline-analytics",
8892
+ "pipeline-executor",
8893
+ "pipeline-orchestrator",
8894
+ "pipeline-runner",
8895
+ "plate-gallery",
8896
+ "platform-probe",
8897
+ "power-meter",
8898
+ "presence",
8899
+ "pressure-sensor",
8900
+ "privacy-mask",
8901
+ "ptz",
8902
+ "ptz-autotrack",
8903
+ "reboot",
8904
+ "record-entries",
8905
+ "recording",
8906
+ "recording-archive",
8907
+ "recording-export",
8908
+ "recording-onboard",
8909
+ "recording-signal",
8910
+ "records",
8911
+ "running-state",
8912
+ "scene-monitor",
8913
+ "script-runner",
8914
+ "server-management",
8915
+ "settings-store",
8916
+ "smoke",
8917
+ "smtp-provider",
8918
+ "snapshot",
8919
+ "sso-bridge",
8920
+ "storage",
8921
+ "storage-admin",
8922
+ "storage-evictable",
8923
+ "storage-migration",
8924
+ "storage-occupancy",
8925
+ "storage-provider",
8926
+ "stream-broker",
8927
+ "stream-catalog",
8928
+ "stream-params",
8929
+ "stream-signals",
8930
+ "switch",
8931
+ "system",
8932
+ "tamper",
8933
+ "temperature-sensor",
8934
+ "terminal-session",
8935
+ "toast",
8936
+ "training",
8937
+ "training-provider",
8938
+ "turn-provider",
8939
+ "update",
8940
+ "user-management",
8941
+ "user-passkeys",
8942
+ "vacuum-control",
8943
+ "valve",
8944
+ "vector-store",
8945
+ "vibration",
8946
+ "videoclips",
8947
+ "viewer-ui",
8948
+ "water-heater",
8949
+ "weather",
8950
+ "webrtc-session",
8951
+ "zone-analytics",
8952
+ "zone-rules",
8953
+ "zones"
8954
+ ]);
8955
+ Object.freeze({
8956
+ "air-quality-sensor": [
8957
+ {
8958
+ "path": "co2Ppm",
8959
+ "valueType": "number"
8960
+ },
8961
+ {
8962
+ "path": "vocPpb",
8963
+ "valueType": "number"
8964
+ },
8965
+ {
8966
+ "path": "pm25",
8967
+ "valueType": "number"
8968
+ },
8969
+ {
8970
+ "path": "pm10",
8971
+ "valueType": "number"
8972
+ },
8973
+ {
8974
+ "path": "aqi",
8975
+ "valueType": "number"
8976
+ },
8977
+ {
8978
+ "path": "unit",
8979
+ "valueType": "string"
8980
+ },
8981
+ {
8982
+ "path": "precision",
8983
+ "valueType": "number"
8984
+ }
8985
+ ],
8986
+ "alarm-panel": [
8987
+ {
8988
+ "path": "state",
8989
+ "valueType": "enum",
8990
+ "enumValues": [
8991
+ "disarmed",
8992
+ "armed_home",
8993
+ "armed_away",
8994
+ "armed_night",
8995
+ "armed_vacation",
8996
+ "armed_custom_bypass",
8997
+ "arming",
8998
+ "disarming",
8999
+ "pending",
9000
+ "triggered"
9001
+ ]
9002
+ },
9003
+ {
9004
+ "path": "targetMode",
9005
+ "valueType": "enum",
9006
+ "enumValues": [
9007
+ "home",
9008
+ "away",
9009
+ "night",
9010
+ "vacation",
9011
+ "custom_bypass"
9012
+ ]
9013
+ },
9014
+ {
9015
+ "path": "requiresCode",
9016
+ "valueType": "boolean"
9017
+ }
9018
+ ],
9019
+ "ambient-light-sensor": [
9020
+ {
9021
+ "path": "lux",
9022
+ "valueType": "number"
9023
+ },
9024
+ {
9025
+ "path": "unit",
9026
+ "valueType": "string"
9027
+ },
9028
+ {
9029
+ "path": "precision",
9030
+ "valueType": "number"
9031
+ }
9032
+ ],
9033
+ "audio-metrics": [
9034
+ {
9035
+ "path": "ts",
9036
+ "valueType": "number"
9037
+ },
9038
+ {
9039
+ "path": "windowSec",
9040
+ "valueType": "number"
9041
+ },
9042
+ {
9043
+ "path": "level.rms",
9044
+ "valueType": "number"
9045
+ },
9046
+ {
9047
+ "path": "level.dbfs",
9048
+ "valueType": "number"
9049
+ },
9050
+ {
9051
+ "path": "peakDbfs",
9052
+ "valueType": "number"
9053
+ },
9054
+ {
9055
+ "path": "avgDbfs",
9056
+ "valueType": "number"
9057
+ },
9058
+ {
9059
+ "path": "current.className",
9060
+ "valueType": "string"
9061
+ },
9062
+ {
9063
+ "path": "current.score",
9064
+ "valueType": "number"
9065
+ },
9066
+ {
9067
+ "path": "current.timestamp",
9068
+ "valueType": "number"
9069
+ }
9070
+ ],
9071
+ "automation-control": [
9072
+ {
9073
+ "path": "enabled",
9074
+ "valueType": "boolean"
9075
+ },
9076
+ {
9077
+ "path": "isRunning",
9078
+ "valueType": "boolean"
9079
+ },
9080
+ {
9081
+ "path": "lastTriggeredAt",
9082
+ "valueType": "number"
9083
+ },
9084
+ {
9085
+ "path": "lastError",
9086
+ "valueType": "string"
9087
+ }
9088
+ ],
9089
+ "battery": [
9090
+ {
9091
+ "path": "percentage",
9092
+ "valueType": "number"
9093
+ },
9094
+ {
9095
+ "path": "charging",
9096
+ "valueType": "enum",
9097
+ "enumValues": [
9098
+ "dc",
9099
+ "solar",
9100
+ "none",
9101
+ "unknown"
9102
+ ]
9103
+ },
9104
+ {
9105
+ "path": "sleeping",
9106
+ "valueType": "boolean"
9107
+ },
9108
+ {
9109
+ "path": "lastUpdated",
9110
+ "valueType": "number"
9111
+ },
9112
+ {
9113
+ "path": "lastContactAt",
9114
+ "valueType": "number"
9115
+ },
9116
+ {
9117
+ "path": "lastFullRefreshAt",
9118
+ "valueType": "number"
9119
+ },
9120
+ {
9121
+ "path": "binary",
9122
+ "valueType": "boolean"
9123
+ }
9124
+ ],
9125
+ "binary": [{
9126
+ "path": "on",
9127
+ "valueType": "boolean"
9128
+ }],
9129
+ "brightness": [{
9130
+ "path": "percentage",
9131
+ "valueType": "number"
9132
+ }],
9133
+ "broker": [{
9134
+ "path": "brokerCount",
9135
+ "valueType": "number"
9136
+ }, {
9137
+ "path": "connectedCount",
9138
+ "valueType": "number"
9139
+ }],
9140
+ "camera-credentials": [
9141
+ {
9142
+ "path": "host",
9143
+ "valueType": "string"
9144
+ },
9145
+ {
9146
+ "path": "port",
9147
+ "valueType": "number"
9148
+ },
9149
+ {
9150
+ "path": "onvifPort",
9151
+ "valueType": "number"
9152
+ },
9153
+ {
9154
+ "path": "rtspPort",
9155
+ "valueType": "number"
9156
+ },
9157
+ {
9158
+ "path": "https",
9159
+ "valueType": "boolean"
9160
+ },
9161
+ {
9162
+ "path": "hasUsername",
9163
+ "valueType": "boolean"
9164
+ },
9165
+ {
9166
+ "path": "hasPassword",
9167
+ "valueType": "boolean"
9168
+ },
9169
+ {
9170
+ "path": "onvifProfile",
9171
+ "valueType": "string"
9172
+ }
9173
+ ],
9174
+ "camera-streams": [
9175
+ {
9176
+ "path": "online",
9177
+ "valueType": "boolean"
9178
+ },
9179
+ {
9180
+ "path": "slotStatuses.high",
9181
+ "valueType": "enum",
9182
+ "enumValues": [
9183
+ "unassigned",
9184
+ "idle",
9185
+ "connecting",
9186
+ "streaming",
9187
+ "error"
9188
+ ]
9189
+ },
9190
+ {
9191
+ "path": "slotStatuses.mid",
9192
+ "valueType": "enum",
9193
+ "enumValues": [
9194
+ "unassigned",
9195
+ "idle",
9196
+ "connecting",
9197
+ "streaming",
9198
+ "error"
9199
+ ]
9200
+ },
9201
+ {
9202
+ "path": "slotStatuses.low",
9203
+ "valueType": "enum",
9204
+ "enumValues": [
9205
+ "unassigned",
9206
+ "idle",
9207
+ "connecting",
9208
+ "streaming",
9209
+ "error"
9210
+ ]
9211
+ },
9212
+ {
9213
+ "path": "slotErrors.high",
9214
+ "valueType": "string"
9215
+ },
9216
+ {
9217
+ "path": "slotErrors.mid",
9218
+ "valueType": "string"
9219
+ },
9220
+ {
9221
+ "path": "slotErrors.low",
9222
+ "valueType": "string"
9223
+ }
9224
+ ],
9225
+ "carbon-monoxide": [{
9226
+ "path": "detected",
9227
+ "valueType": "boolean"
9228
+ }],
9229
+ "climate-control": [
9230
+ {
9231
+ "path": "mode",
9232
+ "valueType": "enum",
9233
+ "enumValues": [
9234
+ "off",
9235
+ "heat",
9236
+ "cool",
9237
+ "auto",
9238
+ "heat_cool",
9239
+ "fan_only",
9240
+ "dry"
9241
+ ]
9242
+ },
9243
+ {
9244
+ "path": "fanMode",
9245
+ "valueType": "string"
9246
+ },
9247
+ {
9248
+ "path": "preset",
9249
+ "valueType": "string"
9250
+ },
9251
+ {
9252
+ "path": "target",
9253
+ "valueType": "number"
9254
+ },
9255
+ {
9256
+ "path": "targetHigh",
9257
+ "valueType": "number"
9258
+ },
9259
+ {
9260
+ "path": "targetLow",
9261
+ "valueType": "number"
9262
+ },
9263
+ {
9264
+ "path": "targetHumidity",
9265
+ "valueType": "number"
9266
+ },
9267
+ {
9268
+ "path": "currentTemp",
9269
+ "valueType": "number"
9270
+ },
9271
+ {
9272
+ "path": "currentHumidity",
9273
+ "valueType": "number"
9274
+ },
9275
+ {
9276
+ "path": "swingVertical",
9277
+ "valueType": "boolean"
9278
+ },
9279
+ {
9280
+ "path": "swingHorizontal",
9281
+ "valueType": "boolean"
9282
+ },
9283
+ {
9284
+ "path": "minTemp",
9285
+ "valueType": "number"
9286
+ },
9287
+ {
9288
+ "path": "maxTemp",
9289
+ "valueType": "number"
9290
+ },
9291
+ {
9292
+ "path": "tempStep",
9293
+ "valueType": "number"
9294
+ }
9295
+ ],
9296
+ "color": [
9297
+ {
9298
+ "path": "mode",
9299
+ "valueType": "enum",
9300
+ "enumValues": [
9301
+ "rgb",
9302
+ "hsv",
9303
+ "mired"
9304
+ ]
9305
+ },
9306
+ {
9307
+ "path": "rgb.r",
9308
+ "valueType": "number"
9309
+ },
9310
+ {
9311
+ "path": "rgb.g",
9312
+ "valueType": "number"
9313
+ },
9314
+ {
9315
+ "path": "rgb.b",
9316
+ "valueType": "number"
9317
+ },
9318
+ {
9319
+ "path": "hsv.h",
9320
+ "valueType": "number"
9321
+ },
9322
+ {
9323
+ "path": "hsv.s",
9324
+ "valueType": "number"
9325
+ },
9326
+ {
9327
+ "path": "hsv.v",
9328
+ "valueType": "number"
9329
+ },
9330
+ {
9331
+ "path": "mireds",
9332
+ "valueType": "number"
9333
+ }
9334
+ ],
9335
+ "connectivity": [{
9336
+ "path": "connected",
9337
+ "valueType": "boolean"
9338
+ }],
9339
+ "contact": [{
9340
+ "path": "entryOpen",
9341
+ "valueType": "boolean"
9342
+ }],
9343
+ "control": [
9344
+ {
9345
+ "path": "kind",
9346
+ "valueType": "enum",
9347
+ "enumValues": [
9348
+ "numeric",
9349
+ "select",
9350
+ "text",
9351
+ "datetime"
9352
+ ]
9353
+ },
9354
+ {
9355
+ "path": "unit",
9356
+ "valueType": "string"
9357
+ },
9358
+ {
9359
+ "path": "min",
9360
+ "valueType": "number"
9361
+ },
9362
+ {
9363
+ "path": "max",
9364
+ "valueType": "number"
9365
+ },
9366
+ {
9367
+ "path": "step",
9368
+ "valueType": "number"
9369
+ },
9370
+ {
9371
+ "path": "precision",
9372
+ "valueType": "number"
9373
+ },
9374
+ {
9375
+ "path": "format",
9376
+ "valueType": "enum",
9377
+ "enumValues": [
9378
+ "date",
9379
+ "time",
9380
+ "datetime"
9381
+ ]
9382
+ }
9383
+ ],
9384
+ "cover": [
9385
+ {
9386
+ "path": "state",
9387
+ "valueType": "enum",
9388
+ "enumValues": [
9389
+ "open",
9390
+ "opening",
9391
+ "closing",
9392
+ "closed",
9393
+ "stopped"
9394
+ ]
9395
+ },
9396
+ {
9397
+ "path": "position",
9398
+ "valueType": "number"
9399
+ },
9400
+ {
9401
+ "path": "tiltPosition",
9402
+ "valueType": "number"
9403
+ }
9404
+ ],
9405
+ "day-night": [
9406
+ {
9407
+ "path": "mode",
9408
+ "valueType": "enum",
9409
+ "enumValues": [
9410
+ "auto",
9411
+ "day",
9412
+ "night",
9413
+ "schedule"
9414
+ ]
9415
+ },
9416
+ {
9417
+ "path": "sensitivity",
9418
+ "valueType": "number"
9419
+ },
9420
+ {
9421
+ "path": "switchDelaySec",
9422
+ "valueType": "number"
9423
+ }
9424
+ ],
9425
+ "device-adoption": [
9426
+ {
9427
+ "path": "lastDiscoveryAt",
9428
+ "valueType": "number"
9429
+ },
9430
+ {
9431
+ "path": "candidateCount",
9432
+ "valueType": "number"
9433
+ },
9434
+ {
9435
+ "path": "adoptedCount",
9436
+ "valueType": "number"
9437
+ },
9438
+ {
9439
+ "path": "lastError",
9440
+ "valueType": "string"
9441
+ }
9442
+ ],
9443
+ "device-discovery": [{
9444
+ "path": "lastDiscoveryAt",
9445
+ "valueType": "number"
9446
+ }, {
9447
+ "path": "lastError",
9448
+ "valueType": "string"
9449
+ }],
9450
+ "device-export": [
9451
+ {
9452
+ "path": "linkState",
9453
+ "valueType": "enum",
9454
+ "enumValues": [
9455
+ "unlinked",
9456
+ "linked",
9457
+ "error"
9458
+ ]
9459
+ },
9460
+ {
9461
+ "path": "exposedDeviceCount",
9462
+ "valueType": "number"
9463
+ },
9464
+ {
9465
+ "path": "error",
9466
+ "valueType": "string"
9467
+ },
9468
+ {
9469
+ "path": "setup.qr",
9470
+ "valueType": "string"
9471
+ },
9472
+ {
9473
+ "path": "setup.note",
9474
+ "valueType": "string"
9475
+ }
9476
+ ],
9477
+ "device-status": [{
9478
+ "path": "online",
9479
+ "valueType": "boolean"
9480
+ }],
9481
+ "dishwasher": [
9482
+ {
9483
+ "path": "availability",
9484
+ "valueType": "enum",
9485
+ "enumValues": [
9486
+ "available",
9487
+ "offline",
9488
+ "description-missing"
9489
+ ]
9490
+ },
9491
+ {
9492
+ "path": "state",
9493
+ "valueType": "enum",
9494
+ "enumValues": [
9495
+ "idle",
9496
+ "running",
9497
+ "paused",
9498
+ "finished",
9499
+ "error",
9500
+ "unavailable"
9501
+ ]
9502
+ },
9503
+ {
9504
+ "path": "operationState",
9505
+ "valueType": "enum",
9506
+ "enumValues": [
9507
+ "Inactive",
9508
+ "Ready",
9509
+ "DelayedStart",
9510
+ "Run",
9511
+ "Pause",
9512
+ "ActionRequired",
9513
+ "Finished",
9514
+ "Error",
9515
+ "Aborting"
9516
+ ]
9517
+ },
9518
+ {
9519
+ "path": "program",
9520
+ "valueType": "string"
9521
+ },
9522
+ {
9523
+ "path": "selectedProgram",
9524
+ "valueType": "string"
9525
+ },
9526
+ {
9527
+ "path": "remainingSeconds",
9528
+ "valueType": "number"
9529
+ },
9530
+ {
9531
+ "path": "delayedStartSeconds",
9532
+ "valueType": "number"
9533
+ },
9534
+ {
9535
+ "path": "progressPercent",
9536
+ "valueType": "number"
9537
+ },
9538
+ {
9539
+ "path": "doorOpen",
9540
+ "valueType": "boolean"
9541
+ },
9542
+ {
9543
+ "path": "doorLocked",
9544
+ "valueType": "boolean"
9545
+ },
9546
+ {
9547
+ "path": "remoteStartAllowed",
9548
+ "valueType": "boolean"
9549
+ },
9550
+ {
9551
+ "path": "remoteControlActive",
9552
+ "valueType": "boolean"
9553
+ },
9554
+ {
9555
+ "path": "localControlActive",
9556
+ "valueType": "boolean"
9557
+ },
9558
+ {
9559
+ "path": "powerOn",
9560
+ "valueType": "boolean"
9561
+ },
9562
+ {
9563
+ "path": "powerState",
9564
+ "valueType": "string"
9565
+ },
9566
+ {
9567
+ "path": "filterCleaningDue",
9568
+ "valueType": "boolean"
9569
+ },
9570
+ {
9571
+ "path": "machineCareDue",
9572
+ "valueType": "boolean"
9573
+ },
9574
+ {
9575
+ "path": "machineCareRemainingRuns",
9576
+ "valueType": "number"
9577
+ },
9578
+ {
9579
+ "path": "halfLoad",
9580
+ "valueType": "boolean"
9581
+ },
9582
+ {
9583
+ "path": "hygienePlus",
9584
+ "valueType": "boolean"
9585
+ },
9586
+ {
9587
+ "path": "extraDry",
9588
+ "valueType": "boolean"
9589
+ },
9590
+ {
9591
+ "path": "intensiveZone",
9592
+ "valueType": "boolean"
9593
+ },
9594
+ {
9595
+ "path": "varioSpeedPlus",
9596
+ "valueType": "boolean"
9597
+ },
9598
+ {
9599
+ "path": "childLock",
9600
+ "valueType": "boolean"
9601
+ },
9602
+ {
9603
+ "path": "errorCode",
9604
+ "valueType": "number"
9605
+ },
9606
+ {
9607
+ "path": "errorLabel",
9608
+ "valueType": "string"
9609
+ }
9610
+ ],
9611
+ "doorbell": [{
9612
+ "path": "lastPressedAt",
9613
+ "valueType": "number"
9614
+ }, {
9615
+ "path": "pressCountSinceStart",
9616
+ "valueType": "number"
9617
+ }],
9618
+ "enum-sensor": [{
9619
+ "path": "value",
9620
+ "valueType": "string"
9621
+ }, {
9622
+ "path": "format",
9623
+ "valueType": "enum",
9624
+ "enumValues": [
9625
+ "date",
9626
+ "time",
9627
+ "datetime"
9628
+ ]
9629
+ }],
9630
+ "event-emitter": [
9631
+ {
9632
+ "path": "lastEvent.deviceId",
9633
+ "valueType": "number"
9634
+ },
9635
+ {
9636
+ "path": "lastEvent.eventType",
9637
+ "valueType": "string"
9638
+ },
9639
+ {
9640
+ "path": "lastEvent.timestamp",
9641
+ "valueType": "number"
9642
+ },
9643
+ {
9644
+ "path": "lastEvent.seq",
9645
+ "valueType": "number"
9646
+ },
9647
+ {
9648
+ "path": "eventCountSinceStart",
9649
+ "valueType": "number"
9650
+ }
9651
+ ],
9652
+ "fan-control": [
9653
+ {
9654
+ "path": "percentage",
9655
+ "valueType": "number"
9656
+ },
9657
+ {
9658
+ "path": "percentageStep",
9659
+ "valueType": "number"
9660
+ },
9661
+ {
9662
+ "path": "preset",
9663
+ "valueType": "string"
9664
+ },
9665
+ {
9666
+ "path": "direction",
9667
+ "valueType": "enum",
9668
+ "enumValues": ["forward", "reverse"]
9669
+ },
9670
+ {
9671
+ "path": "oscillating",
9672
+ "valueType": "boolean"
9673
+ }
9674
+ ],
9675
+ "feature-probe": [
9676
+ {
9677
+ "path": "deviceType",
9678
+ "valueType": "string"
9679
+ },
9680
+ {
9681
+ "path": "model",
9682
+ "valueType": "string"
9683
+ },
9684
+ {
9685
+ "path": "channelCount",
9686
+ "valueType": "number"
9687
+ },
9688
+ {
9689
+ "path": "lastProbedAt",
9690
+ "valueType": "number"
9691
+ }
9692
+ ],
9693
+ "flood": [{
9694
+ "path": "flooded",
9695
+ "valueType": "boolean"
9696
+ }],
9697
+ "gas": [{
9698
+ "path": "detected",
9699
+ "valueType": "boolean"
9700
+ }],
9701
+ "heating-valve": [{
9702
+ "path": "position",
9703
+ "valueType": "number"
9704
+ }],
9705
+ "humidifier": [
9706
+ {
9707
+ "path": "on",
9708
+ "valueType": "boolean"
9709
+ },
9710
+ {
9711
+ "path": "currentHumidity",
9712
+ "valueType": "number"
9713
+ },
9714
+ {
9715
+ "path": "targetHumidity",
9716
+ "valueType": "number"
9717
+ },
9718
+ {
9719
+ "path": "mode",
9720
+ "valueType": "string"
9721
+ },
9722
+ {
9723
+ "path": "action",
9724
+ "valueType": "string"
9725
+ },
9726
+ {
9727
+ "path": "minHumidity",
9728
+ "valueType": "number"
9729
+ },
9730
+ {
9731
+ "path": "maxHumidity",
9732
+ "valueType": "number"
9733
+ }
9734
+ ],
9735
+ "humidity-sensor": [
9736
+ {
9737
+ "path": "percent",
9738
+ "valueType": "number"
9739
+ },
9740
+ {
9741
+ "path": "unit",
9742
+ "valueType": "string"
9743
+ },
9744
+ {
9745
+ "path": "precision",
9746
+ "valueType": "number"
9747
+ }
9748
+ ],
9749
+ "image": [{
9750
+ "path": "url",
9751
+ "valueType": "string"
9752
+ }, {
9753
+ "path": "lastUpdated",
9754
+ "valueType": "number"
9755
+ }],
9756
+ "image-settings": [
9757
+ {
9758
+ "path": "brightness",
9759
+ "valueType": "number"
9760
+ },
9761
+ {
9762
+ "path": "contrast",
9763
+ "valueType": "number"
9764
+ },
9765
+ {
9766
+ "path": "saturation",
9767
+ "valueType": "number"
9768
+ },
9769
+ {
9770
+ "path": "sharpness",
9771
+ "valueType": "number"
9772
+ },
9773
+ {
9774
+ "path": "mirror",
9775
+ "valueType": "boolean"
9776
+ },
9777
+ {
9778
+ "path": "flip",
9779
+ "valueType": "boolean"
9780
+ },
9781
+ {
9782
+ "path": "rotate",
9783
+ "valueType": "enum",
9784
+ "enumValues": [
9785
+ "0",
9786
+ "90",
9787
+ "180",
9788
+ "270"
9789
+ ]
9790
+ },
9791
+ {
9792
+ "path": "whiteBalance",
9793
+ "valueType": "enum",
9794
+ "enumValues": ["auto", "manual"]
9795
+ },
9796
+ {
9797
+ "path": "warmth",
9798
+ "valueType": "number"
9799
+ },
9800
+ {
9801
+ "path": "exposureMode",
9802
+ "valueType": "enum",
9803
+ "enumValues": ["auto", "manual"]
9804
+ },
9805
+ {
9806
+ "path": "backlightMode",
9807
+ "valueType": "enum",
9808
+ "enumValues": [
9809
+ "off",
9810
+ "blc",
9811
+ "wdr",
9812
+ "hlc"
9813
+ ]
9814
+ }
9815
+ ],
9816
+ "intercom": [
9817
+ {
9818
+ "path": "talking",
9819
+ "valueType": "boolean"
9820
+ },
9821
+ {
9822
+ "path": "lastSessionAt",
9823
+ "valueType": "number"
9824
+ },
9825
+ {
9826
+ "path": "ability.sampleRate",
9827
+ "valueType": "number"
9828
+ },
9829
+ {
9830
+ "path": "ability.duplex",
9831
+ "valueType": "enum",
9832
+ "enumValues": ["half", "full"]
9833
+ },
9834
+ {
9835
+ "path": "ability.maxBacklogMs",
9836
+ "valueType": "number"
9837
+ }
9838
+ ],
9839
+ "lawn-mower-control": [
9840
+ {
9841
+ "path": "activity",
9842
+ "valueType": "enum",
9843
+ "enumValues": [
9844
+ "idle",
9845
+ "mowing",
9846
+ "paused",
9847
+ "docked",
9848
+ "error"
9849
+ ]
9850
+ },
9851
+ {
9852
+ "path": "batteryLevel",
9853
+ "valueType": "number"
9854
+ },
9855
+ {
9856
+ "path": "progressPercent",
9857
+ "valueType": "number"
9858
+ },
9859
+ {
9860
+ "path": "currentCode",
9861
+ "valueType": "number"
9862
+ },
9863
+ {
9864
+ "path": "currentCodeLabel",
9865
+ "valueType": "string"
9866
+ },
9867
+ {
9868
+ "path": "severity",
9869
+ "valueType": "enum",
9870
+ "enumValues": [
9871
+ "info",
9872
+ "warning",
9873
+ "error"
9874
+ ]
9875
+ }
9876
+ ],
9877
+ "lock-control": [{
9878
+ "path": "state",
9879
+ "valueType": "enum",
9880
+ "enumValues": [
9881
+ "locked",
9882
+ "unlocked",
9883
+ "locking",
9884
+ "unlocking",
9885
+ "jammed"
9886
+ ]
9887
+ }],
9888
+ "media-player": [
9889
+ {
9890
+ "path": "state",
9891
+ "valueType": "enum",
9892
+ "enumValues": [
9893
+ "off",
9894
+ "on",
9895
+ "idle",
9896
+ "playing",
9897
+ "paused",
9898
+ "buffering",
9899
+ "standby"
9900
+ ]
9901
+ },
9902
+ {
9903
+ "path": "volumeLevel",
9904
+ "valueType": "number"
9905
+ },
9906
+ {
9907
+ "path": "isMuted",
9908
+ "valueType": "boolean"
9909
+ },
9910
+ {
9911
+ "path": "source",
9912
+ "valueType": "string"
9913
+ },
9914
+ {
9915
+ "path": "currentMedia.type",
9916
+ "valueType": "string"
9917
+ },
9918
+ {
9919
+ "path": "currentMedia.title",
9920
+ "valueType": "string"
9921
+ },
9922
+ {
9923
+ "path": "currentMedia.artist",
9924
+ "valueType": "string"
9925
+ },
9926
+ {
9927
+ "path": "currentMedia.album",
9928
+ "valueType": "string"
9929
+ },
9930
+ {
9931
+ "path": "currentMedia.imageUrl",
9932
+ "valueType": "string"
9933
+ },
9934
+ {
9935
+ "path": "positionMs",
9936
+ "valueType": "number"
9937
+ },
9938
+ {
9939
+ "path": "durationMs",
9940
+ "valueType": "number"
9941
+ },
9942
+ {
9943
+ "path": "shuffle",
9944
+ "valueType": "boolean"
9945
+ },
9946
+ {
9947
+ "path": "repeat",
9948
+ "valueType": "enum",
9949
+ "enumValues": [
9950
+ "off",
9951
+ "all",
9952
+ "one"
9953
+ ]
9954
+ }
9955
+ ],
9956
+ "motion": [
9957
+ {
9958
+ "path": "detected",
9959
+ "valueType": "boolean"
9960
+ },
9961
+ {
9962
+ "path": "lastDetectedAt",
9963
+ "valueType": "number"
9964
+ },
9965
+ {
9966
+ "path": "autoClearAfterMs",
9967
+ "valueType": "number"
9968
+ }
9969
+ ],
9970
+ "motion-trigger": [{
9971
+ "path": "enabled",
9972
+ "valueType": "boolean"
9973
+ }],
9974
+ "motion-zones": [{
9975
+ "path": "enabled",
9976
+ "valueType": "boolean"
9977
+ }, {
9978
+ "path": "sensitivity",
9979
+ "valueType": "number"
9980
+ }],
9981
+ "mqtt-broker": [{
9982
+ "path": "brokerCount",
9983
+ "valueType": "number"
9984
+ }, {
9985
+ "path": "embeddedRunning",
9986
+ "valueType": "boolean"
9987
+ }],
9988
+ "native-object-detection": [{
9989
+ "path": "enabled",
9990
+ "valueType": "boolean"
9991
+ }],
9992
+ "navigation": [
9993
+ {
9994
+ "path": "mode",
9995
+ "valueType": "enum",
9996
+ "enumValues": [
9997
+ "idle",
9998
+ "cleaning",
9999
+ "spot",
10000
+ "following",
10001
+ "goto",
10002
+ "returning",
10003
+ "paused",
10004
+ "unknown"
10005
+ ]
10006
+ },
10007
+ {
10008
+ "path": "following",
10009
+ "valueType": "boolean"
10010
+ },
10011
+ {
10012
+ "path": "flash",
10013
+ "valueType": "boolean"
10014
+ },
10015
+ {
10016
+ "path": "lightMode",
10017
+ "valueType": "enum",
10018
+ "enumValues": ["auto", "manual"]
10019
+ },
10020
+ {
10021
+ "path": "lightLevel",
10022
+ "valueType": "number"
10023
+ }
10024
+ ],
10025
+ "network-link": [
10026
+ {
10027
+ "path": "type",
10028
+ "valueType": "enum",
10029
+ "enumValues": [
10030
+ "wifi",
10031
+ "ethernet",
10032
+ "cellular",
10033
+ "unknown"
10034
+ ]
10035
+ },
10036
+ {
10037
+ "path": "signalPercent",
10038
+ "valueType": "number"
10039
+ },
10040
+ {
10041
+ "path": "rssiDbm",
10042
+ "valueType": "number"
10043
+ },
10044
+ {
10045
+ "path": "ssid",
10046
+ "valueType": "string"
10047
+ },
10048
+ {
10049
+ "path": "lastUpdated",
10050
+ "valueType": "number"
10051
+ }
10052
+ ],
10053
+ "notifier": [
10054
+ {
10055
+ "path": "lastSentAt",
10056
+ "valueType": "number"
10057
+ },
10058
+ {
10059
+ "path": "lastError",
10060
+ "valueType": "string"
10061
+ },
10062
+ {
10063
+ "path": "queueDepth",
10064
+ "valueType": "number"
10065
+ },
10066
+ {
10067
+ "path": "supports.image",
10068
+ "valueType": "boolean"
10069
+ },
10070
+ {
10071
+ "path": "supports.priority",
10072
+ "valueType": "boolean"
10073
+ },
10074
+ {
10075
+ "path": "supports.data",
10076
+ "valueType": "boolean"
10077
+ },
10078
+ {
10079
+ "path": "supports.actions",
10080
+ "valueType": "boolean"
10081
+ },
10082
+ {
10083
+ "path": "supports.recipients",
10084
+ "valueType": "boolean"
10085
+ }
10086
+ ],
10087
+ "numeric-sensor": [
10088
+ {
10089
+ "path": "value",
10090
+ "valueType": "number"
10091
+ },
10092
+ {
10093
+ "path": "unit",
10094
+ "valueType": "string"
10095
+ },
10096
+ {
10097
+ "path": "precision",
10098
+ "valueType": "number"
10099
+ }
10100
+ ],
10101
+ "pet-feeder": [
10102
+ {
10103
+ "path": "foodLevel",
10104
+ "valueType": "number"
10105
+ },
10106
+ {
10107
+ "path": "food1",
10108
+ "valueType": "number"
10109
+ },
10110
+ {
10111
+ "path": "food2",
10112
+ "valueType": "number"
10113
+ },
10114
+ {
10115
+ "path": "lowFood",
10116
+ "valueType": "boolean"
10117
+ },
10118
+ {
10119
+ "path": "batteryPower",
10120
+ "valueType": "number"
10121
+ },
10122
+ {
10123
+ "path": "desiccantLeftDays",
10124
+ "valueType": "number"
10125
+ },
10126
+ {
10127
+ "path": "feeding",
10128
+ "valueType": "boolean"
10129
+ },
10130
+ {
10131
+ "path": "status",
10132
+ "valueType": "enum",
10133
+ "enumValues": [
10134
+ "normal",
10135
+ "offline",
10136
+ "on_batteries"
10137
+ ]
10138
+ },
10139
+ {
10140
+ "path": "error",
10141
+ "valueType": "string"
10142
+ },
10143
+ {
10144
+ "path": "errorCode",
10145
+ "valueType": "number"
10146
+ },
10147
+ {
10148
+ "path": "isDualHopper",
10149
+ "valueType": "boolean"
10150
+ },
10151
+ {
10152
+ "path": "childLock",
10153
+ "valueType": "boolean"
10154
+ },
10155
+ {
10156
+ "path": "indicatorLight",
10157
+ "valueType": "boolean"
10158
+ },
10159
+ {
10160
+ "path": "feedSound",
10161
+ "valueType": "boolean"
10162
+ },
10163
+ {
10164
+ "path": "volume",
10165
+ "valueType": "number"
10166
+ }
10167
+ ],
10168
+ "power-meter": [
10169
+ {
10170
+ "path": "watts",
10171
+ "valueType": "number"
10172
+ },
10173
+ {
10174
+ "path": "kwhTotal",
10175
+ "valueType": "number"
10176
+ },
10177
+ {
10178
+ "path": "volts",
10179
+ "valueType": "number"
10180
+ },
10181
+ {
10182
+ "path": "amps",
10183
+ "valueType": "number"
10184
+ },
10185
+ {
10186
+ "path": "va",
10187
+ "valueType": "number"
10188
+ },
10189
+ {
10190
+ "path": "powerFactor",
10191
+ "valueType": "number"
10192
+ },
10193
+ {
10194
+ "path": "unit",
10195
+ "valueType": "string"
10196
+ },
10197
+ {
10198
+ "path": "precision",
10199
+ "valueType": "number"
10200
+ }
10201
+ ],
10202
+ "presence": [
10203
+ {
10204
+ "path": "state",
10205
+ "valueType": "string"
10206
+ },
10207
+ {
10208
+ "path": "location",
10209
+ "valueType": "string"
10210
+ },
10211
+ {
10212
+ "path": "gps.latitude",
10213
+ "valueType": "number"
10214
+ },
10215
+ {
10216
+ "path": "gps.longitude",
10217
+ "valueType": "number"
10218
+ },
10219
+ {
10220
+ "path": "gps.accuracyMeters",
10221
+ "valueType": "number"
10222
+ },
10223
+ {
10224
+ "path": "batteryPercent",
10225
+ "valueType": "number"
10226
+ }
10227
+ ],
10228
+ "pressure-sensor": [
10229
+ {
10230
+ "path": "hpa",
10231
+ "valueType": "number"
10232
+ },
10233
+ {
10234
+ "path": "unit",
10235
+ "valueType": "string"
10236
+ },
10237
+ {
10238
+ "path": "precision",
10239
+ "valueType": "number"
10240
+ }
10241
+ ],
10242
+ "privacy-mask": [{
10243
+ "path": "enabled",
10244
+ "valueType": "boolean"
10245
+ }, {
10246
+ "path": "audioEnabled",
10247
+ "valueType": "boolean"
10248
+ }],
10249
+ "ptz": [
10250
+ {
10251
+ "path": "pan",
10252
+ "valueType": "number"
10253
+ },
10254
+ {
10255
+ "path": "tilt",
10256
+ "valueType": "number"
10257
+ },
10258
+ {
10259
+ "path": "zoom",
10260
+ "valueType": "number"
10261
+ },
10262
+ {
10263
+ "path": "autofocus",
10264
+ "valueType": "boolean"
10265
+ }
10266
+ ],
10267
+ "ptz-autotrack": [
10268
+ {
10269
+ "path": "enabled",
10270
+ "valueType": "boolean"
10271
+ },
10272
+ {
10273
+ "path": "currentSettings.targetType",
10274
+ "valueType": "string"
10275
+ },
10276
+ {
10277
+ "path": "currentSettings.stopDelaySeconds",
10278
+ "valueType": "number"
10279
+ },
10280
+ {
10281
+ "path": "currentSettings.disappearDelaySeconds",
10282
+ "valueType": "number"
10283
+ }
10284
+ ],
10285
+ "recording-archive": [
10286
+ {
10287
+ "path": "deviceId",
10288
+ "valueType": "number"
10289
+ },
10290
+ {
10291
+ "path": "enabled",
10292
+ "valueType": "boolean"
10293
+ },
10294
+ {
10295
+ "path": "activeMode",
10296
+ "valueType": "enum",
10297
+ "enumValues": [
10298
+ "off",
10299
+ "events",
10300
+ "continuous",
10301
+ "on-device-decision"
10302
+ ]
10303
+ },
10304
+ {
10305
+ "path": "nodeId",
10306
+ "valueType": "string"
10307
+ },
10308
+ {
10309
+ "path": "storageBytes",
10310
+ "valueType": "number"
10311
+ }
10312
+ ],
10313
+ "recording-onboard": [
10314
+ {
10315
+ "path": "primaryTrackId",
10316
+ "valueType": "string"
10317
+ },
10318
+ {
10319
+ "path": "enabled",
10320
+ "valueType": "boolean"
10321
+ },
10322
+ {
10323
+ "path": "overwriteWhenFull",
10324
+ "valueType": "boolean"
10325
+ },
10326
+ {
10327
+ "path": "preRecordSec",
10328
+ "valueType": "number"
10329
+ },
10330
+ {
10331
+ "path": "postRecordSec",
10332
+ "valueType": "number"
10333
+ },
10334
+ {
10335
+ "path": "segmentMinutes",
10336
+ "valueType": "number"
10337
+ },
10338
+ {
10339
+ "path": "unreadableWindows",
10340
+ "valueType": "number"
10341
+ },
10342
+ {
10343
+ "path": "recordingToNowhere",
10344
+ "valueType": "boolean"
10345
+ }
10346
+ ],
10347
+ "recording-signal": [{
10348
+ "path": "active",
10349
+ "valueType": "boolean"
10350
+ }, {
10351
+ "path": "reason",
10352
+ "valueType": "string"
10353
+ }],
10354
+ "running-state": [
10355
+ {
10356
+ "path": "running",
10357
+ "valueType": "boolean"
10358
+ },
10359
+ {
10360
+ "path": "since",
10361
+ "valueType": "number"
10362
+ },
10363
+ {
10364
+ "path": "source",
10365
+ "valueType": "enum",
10366
+ "enumValues": ["native", "assigned"]
10367
+ },
10368
+ {
10369
+ "path": "phase",
10370
+ "valueType": "string"
10371
+ }
10372
+ ],
10373
+ "script-runner": [
10374
+ {
10375
+ "path": "isRunning",
10376
+ "valueType": "boolean"
10377
+ },
10378
+ {
10379
+ "path": "lastRunAt",
10380
+ "valueType": "number"
10381
+ },
10382
+ {
10383
+ "path": "lastRunSuccess",
10384
+ "valueType": "boolean"
10385
+ },
10386
+ {
10387
+ "path": "lastError",
10388
+ "valueType": "string"
10389
+ }
10390
+ ],
10391
+ "smoke": [{
10392
+ "path": "detected",
10393
+ "valueType": "boolean"
10394
+ }],
10395
+ "snapshot": [
10396
+ {
10397
+ "path": "lastCapturedAt",
10398
+ "valueType": "number"
10399
+ },
10400
+ {
10401
+ "path": "cacheAgeMs",
10402
+ "valueType": "number"
10403
+ },
10404
+ {
10405
+ "path": "lastBytes",
10406
+ "valueType": "number"
10407
+ },
10408
+ {
10409
+ "path": "lastStreamId",
10410
+ "valueType": "string"
10411
+ }
10412
+ ],
10413
+ "stream-params": [
10414
+ {
10415
+ "path": "main.width",
10416
+ "valueType": "number"
10417
+ },
10418
+ {
10419
+ "path": "main.height",
10420
+ "valueType": "number"
10421
+ },
10422
+ {
10423
+ "path": "main.codec",
10424
+ "valueType": "enum",
10425
+ "enumValues": ["h264", "h265"]
10426
+ },
10427
+ {
10428
+ "path": "main.framerate",
10429
+ "valueType": "number"
10430
+ },
10431
+ {
10432
+ "path": "main.bitrate",
10433
+ "valueType": "number"
10434
+ },
10435
+ {
10436
+ "path": "main.bitrateMode",
10437
+ "valueType": "enum",
10438
+ "enumValues": ["vbr", "cbr"]
10439
+ },
10440
+ {
10441
+ "path": "main.encoderProfile",
10442
+ "valueType": "enum",
10443
+ "enumValues": [
10444
+ "high",
10445
+ "main",
10446
+ "baseline"
10447
+ ]
10448
+ },
10449
+ {
10450
+ "path": "main.gop",
10451
+ "valueType": "number"
10452
+ },
10453
+ {
10454
+ "path": "main.audio",
10455
+ "valueType": "boolean"
10456
+ },
10457
+ {
10458
+ "path": "sub.width",
10459
+ "valueType": "number"
10460
+ },
10461
+ {
10462
+ "path": "sub.height",
10463
+ "valueType": "number"
10464
+ },
10465
+ {
10466
+ "path": "sub.codec",
10467
+ "valueType": "enum",
10468
+ "enumValues": ["h264", "h265"]
10469
+ },
10470
+ {
10471
+ "path": "sub.framerate",
10472
+ "valueType": "number"
10473
+ },
10474
+ {
10475
+ "path": "sub.bitrate",
10476
+ "valueType": "number"
10477
+ },
10478
+ {
10479
+ "path": "sub.bitrateMode",
10480
+ "valueType": "enum",
10481
+ "enumValues": ["vbr", "cbr"]
10482
+ },
10483
+ {
10484
+ "path": "sub.encoderProfile",
10485
+ "valueType": "enum",
10486
+ "enumValues": [
10487
+ "high",
10488
+ "main",
10489
+ "baseline"
10490
+ ]
10491
+ },
10492
+ {
10493
+ "path": "sub.gop",
10494
+ "valueType": "number"
10495
+ },
10496
+ {
10497
+ "path": "sub.audio",
10498
+ "valueType": "boolean"
10499
+ },
10500
+ {
10501
+ "path": "ext.width",
10502
+ "valueType": "number"
10503
+ },
10504
+ {
10505
+ "path": "ext.height",
10506
+ "valueType": "number"
10507
+ },
10508
+ {
10509
+ "path": "ext.codec",
10510
+ "valueType": "enum",
10511
+ "enumValues": ["h264", "h265"]
10512
+ },
10513
+ {
10514
+ "path": "ext.framerate",
10515
+ "valueType": "number"
10516
+ },
10517
+ {
10518
+ "path": "ext.bitrate",
10519
+ "valueType": "number"
10520
+ },
10521
+ {
10522
+ "path": "ext.bitrateMode",
10523
+ "valueType": "enum",
10524
+ "enumValues": ["vbr", "cbr"]
10525
+ },
10526
+ {
10527
+ "path": "ext.encoderProfile",
10528
+ "valueType": "enum",
10529
+ "enumValues": [
10530
+ "high",
10531
+ "main",
10532
+ "baseline"
10533
+ ]
10534
+ },
10535
+ {
10536
+ "path": "ext.gop",
10537
+ "valueType": "number"
10538
+ },
10539
+ {
10540
+ "path": "ext.audio",
10541
+ "valueType": "boolean"
10542
+ }
10543
+ ],
10544
+ "switch": [{
10545
+ "path": "on",
10546
+ "valueType": "boolean"
10547
+ }],
10548
+ "tamper": [{
10549
+ "path": "tampered",
10550
+ "valueType": "boolean"
10551
+ }],
10552
+ "temperature-sensor": [
10553
+ {
10554
+ "path": "celsius",
10555
+ "valueType": "number"
10556
+ },
10557
+ {
10558
+ "path": "unit",
10559
+ "valueType": "string"
10560
+ },
10561
+ {
10562
+ "path": "precision",
10563
+ "valueType": "number"
10564
+ }
10565
+ ],
10566
+ "update": [
10567
+ {
10568
+ "path": "currentVersion",
10569
+ "valueType": "string"
10570
+ },
10571
+ {
10572
+ "path": "availableVersion",
10573
+ "valueType": "string"
10574
+ },
10575
+ {
10576
+ "path": "updatable",
10577
+ "valueType": "boolean"
10578
+ },
10579
+ {
10580
+ "path": "state",
10581
+ "valueType": "string"
10582
+ },
10583
+ {
10584
+ "path": "inProgress",
10585
+ "valueType": "boolean"
10586
+ }
10587
+ ],
10588
+ "vacuum-control": [
10589
+ {
10590
+ "path": "state",
10591
+ "valueType": "enum",
10592
+ "enumValues": [
10593
+ "idle",
10594
+ "cleaning",
10595
+ "paused",
10596
+ "returning",
10597
+ "docked",
10598
+ "drying",
10599
+ "error"
10600
+ ]
10601
+ },
10602
+ {
10603
+ "path": "batteryLevel",
10604
+ "valueType": "number"
10605
+ },
10606
+ {
10607
+ "path": "fanSpeed",
10608
+ "valueType": "string"
10609
+ },
10610
+ {
10611
+ "path": "progressPercent",
10612
+ "valueType": "number"
10613
+ },
10614
+ {
10615
+ "path": "errorCode",
10616
+ "valueType": "number"
10617
+ },
10618
+ {
10619
+ "path": "errorLabel",
10620
+ "valueType": "string"
10621
+ }
10622
+ ],
10623
+ "valve": [{
10624
+ "path": "state",
10625
+ "valueType": "enum",
10626
+ "enumValues": [
10627
+ "open",
10628
+ "opening",
10629
+ "closing",
10630
+ "closed",
10631
+ "stopped"
10632
+ ]
10633
+ }, {
10634
+ "path": "position",
10635
+ "valueType": "number"
10636
+ }],
10637
+ "vibration": [{
10638
+ "path": "detected",
10639
+ "valueType": "boolean"
10640
+ }],
10641
+ "water-heater": [
10642
+ {
10643
+ "path": "currentTemp",
10644
+ "valueType": "number"
10645
+ },
10646
+ {
10647
+ "path": "targetTemp",
10648
+ "valueType": "number"
10649
+ },
10650
+ {
10651
+ "path": "operationMode",
10652
+ "valueType": "string"
10653
+ },
10654
+ {
10655
+ "path": "away",
10656
+ "valueType": "boolean"
10657
+ },
10658
+ {
10659
+ "path": "minTemp",
10660
+ "valueType": "number"
10661
+ },
10662
+ {
10663
+ "path": "maxTemp",
10664
+ "valueType": "number"
10665
+ }
10666
+ ],
10667
+ "weather": [
10668
+ {
10669
+ "path": "condition",
10670
+ "valueType": "string"
10671
+ },
10672
+ {
10673
+ "path": "temperature",
10674
+ "valueType": "number"
10675
+ },
10676
+ {
10677
+ "path": "temperatureUnit",
10678
+ "valueType": "string"
10679
+ },
10680
+ {
10681
+ "path": "humidity",
10682
+ "valueType": "number"
10683
+ },
10684
+ {
10685
+ "path": "pressure",
10686
+ "valueType": "number"
10687
+ },
10688
+ {
10689
+ "path": "pressureUnit",
10690
+ "valueType": "string"
10691
+ },
10692
+ {
10693
+ "path": "windSpeed",
10694
+ "valueType": "number"
10695
+ },
10696
+ {
10697
+ "path": "windSpeedUnit",
10698
+ "valueType": "string"
10699
+ },
10700
+ {
10701
+ "path": "windBearing",
10702
+ "valueType": "number"
10703
+ }
10704
+ ],
10705
+ "zone-analytics": [
10706
+ {
10707
+ "path": "ts",
10708
+ "valueType": "number"
10709
+ },
10710
+ {
10711
+ "path": "frameWidth",
10712
+ "valueType": "number"
10713
+ },
10714
+ {
10715
+ "path": "frameHeight",
10716
+ "valueType": "number"
10717
+ },
10718
+ {
10719
+ "path": "frame.totalObjects",
10720
+ "valueType": "number"
10721
+ },
10722
+ {
10723
+ "path": "frame.standingObjects",
10724
+ "valueType": "number"
10725
+ },
10726
+ {
10727
+ "path": "frame.transientObjects",
10728
+ "valueType": "number"
10729
+ },
10730
+ {
10731
+ "path": "unzoned.totalObjects",
10732
+ "valueType": "number"
10733
+ },
10734
+ {
10735
+ "path": "unzoned.standingObjects",
10736
+ "valueType": "number"
10737
+ },
10738
+ {
10739
+ "path": "unzoned.transientObjects",
10740
+ "valueType": "number"
10741
+ }
10742
+ ]
10743
+ });
8770
10744
  object({
8771
10745
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8772
10746
  params: record(string(), union([string(), number()])).optional()
@@ -9115,7 +11089,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
9115
11089
  return DeviceRole;
9116
11090
  }({});
9117
11091
  //#endregion
9118
- //#region ../types/dist/composition-BJ8iAZb3.mjs
11092
+ //#region ../types/dist/composition-kEl9mevu.mjs
9119
11093
  /**
9120
11094
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9121
11095
  *
@@ -12348,7 +14322,7 @@ var LogChannelDescriptorSchema = object({
12348
14322
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12349
14323
  * consulted with the numeric device id, AND every line the channel admits
12350
14324
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12351
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14325
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12352
14326
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12353
14327
  * the body is the only way to filter.
12354
14328
  *
@@ -12536,7 +14510,7 @@ var ModelVariantGroupSchema = object({
12536
14510
  precision: _enum(["fp32", "int8"]).optional(),
12537
14511
  /**
12538
14512
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12539
- * an alternate training of the same family (Scrypted `relu_test`); chip
14513
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12540
14514
  * label is "Test".
12541
14515
  */
12542
14516
  optimization: _enum(["standard", "test"]).optional(),
@@ -12788,8 +14762,8 @@ var ModelCatalogEntrySchema = object({
12788
14762
  provider: ModelProviderIdSchema.optional(),
12789
14763
  /**
12790
14764
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12791
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12792
- * labels already ARE the CamStack macros (Scrypted identity map).
14765
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14766
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12793
14767
  */
12794
14768
  classMap: DetectionCatalogClassMapSchema.optional(),
12795
14769
  /**
@@ -15775,7 +17749,7 @@ method(object({
15775
17749
  * `1` is real time and is the ONLY value that allows the copy branch —
15776
17750
  * anything else forces `libx264` over the window. That was priced
15777
17751
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15778
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17752
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15779
17753
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15780
17754
  * once the decode is forced the width stops being free.
15781
17755
  */
@@ -16195,6 +18169,7 @@ var CompositionRunStatusSchema = _enum([
16195
18169
  "starting",
16196
18170
  "running",
16197
18171
  "degraded",
18172
+ "incomplete",
16198
18173
  "failed"
16199
18174
  ]);
16200
18175
  var CompositionFieldStateKindSchema = _enum([
@@ -16244,6 +18219,13 @@ var ComposerUnreadableBlockSchema = object({
16244
18219
  /** The parse error, in the operator's words. */
16245
18220
  error: string()
16246
18221
  });
18222
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
18223
+ var UnreleasedClaimSchema = object({
18224
+ deviceId: number().int(),
18225
+ capName: string(),
18226
+ owner: string(),
18227
+ error: string()
18228
+ });
16247
18229
  method(object({
16248
18230
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16249
18231
  integrationId: string().nullable(),
@@ -16253,7 +18235,13 @@ method(object({
16253
18235
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16254
18236
  restartBlockIds: array(string()),
16255
18237
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16256
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
18238
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
18239
+ /**
18240
+ * Operator-confirmed deletions. Their claims are released on this apply,
18241
+ * before any replacement block claims. A block that merely vanished from the
18242
+ * snapshot is not listed here and still waits for two applies (D49).
18243
+ */
18244
+ retiredBlockIds: array(string()).optional()
16257
18245
  }), object({
16258
18246
  blocks: array(object({
16259
18247
  blockId: string(),
@@ -16265,7 +18253,13 @@ method(object({
16265
18253
  * integration unknown, its own rows unread or read empty once). An empty
16266
18254
  * apply the caller owes is paid off only by one the composer acted on (D49).
16267
18255
  */
16268
- acted: boolean()
18256
+ acted: boolean(),
18257
+ /**
18258
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
18259
+ * every one landed (or there was nothing to hand back). Absent on a result
18260
+ * that never got that far.
18261
+ */
18262
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16269
18263
  }), {
16270
18264
  kind: "mutation",
16271
18265
  auth: "admin"
@@ -16389,6 +18383,7 @@ var CoreBlockStatusSchema = _enum([
16389
18383
  "starting",
16390
18384
  "running",
16391
18385
  "degraded",
18386
+ "incomplete",
16392
18387
  "failed"
16393
18388
  ]);
16394
18389
  /** path → TypeScript source for a multi-file block. */
@@ -38312,7 +40307,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38312
40307
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38313
40308
  * operator's casing. The registry matches labels trimmed + case-insensitively
38314
40309
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38315
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40310
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38316
40311
  * map keyed on the displayed casing would orphan its entry on exactly that
38317
40312
  * edit. Consumers join by keying their own label through `locationIconKey`.
38318
40313
  */
@@ -38337,7 +40332,7 @@ var LocationDescriptionAssignmentSchema = object({
38337
40332
  /**
38338
40333
  * A SITE ZONE — a named part of the property that several locations belong to.
38339
40334
  *
38340
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40335
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38341
40336
  * kitchen. A camera belongs to exactly one location, and a location to at most
38342
40337
  * one zone, so a camera's zone is derived and never stored on the device: the
38343
40338
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38366,7 +40361,7 @@ var LocationDescriptionAssignmentSchema = object({
38366
40361
  * the locations inside it.
38367
40362
  *
38368
40363
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38369
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40364
+ * a surface must show "Night zone", not "night zone". Locations are carried
38370
40365
  * here, rather than left to a second call, because every consumer wants both
38371
40366
  * at once and a viewer that asked twice could render a zone whose membership
38372
40367
  * it has not fetched yet.
@@ -40479,8 +42474,8 @@ var LoadContributionSchema = object({
40479
42474
  "unattributable"
40480
42475
  ]),
40481
42476
  /**
40482
- * What ONE entry is, in the contributor's own words — `615/high`,
40483
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42477
+ * What ONE entry is, in the contributor's own words — `101/high`,
42478
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40484
42479
  * family and inventing a common one would lose the only information that
40485
42480
  * makes two entries for the same camera distinguishable.
40486
42481
  */
@@ -42128,6 +44123,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42128
44123
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42129
44124
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42130
44125
  /**
44126
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
44127
+ * not entries. `heatmapScrub` is a mark, not an event kind.
44128
+ */
44129
+ var PALETTE_ENTRY_IDS = [
44130
+ "motion",
44131
+ "audio",
44132
+ "recording",
44133
+ "live",
44134
+ "heatmapScrub",
44135
+ "person",
44136
+ "vehicle",
44137
+ "animal",
44138
+ "package",
44139
+ "sensor",
44140
+ "control",
44141
+ "face",
44142
+ "plate",
44143
+ "car",
44144
+ "truck",
44145
+ "bus",
44146
+ "motorcycle",
44147
+ "bicycle",
44148
+ "airplane",
44149
+ "boat",
44150
+ "train",
44151
+ "bird",
44152
+ "dog",
44153
+ "cat",
44154
+ "horse",
44155
+ "sheep",
44156
+ "cow",
44157
+ "elephant",
44158
+ "bear",
44159
+ "zebra",
44160
+ "giraffe",
44161
+ "package-delivered",
44162
+ "package-picked-up",
44163
+ "suitcase",
44164
+ "backpack",
44165
+ "handbag",
44166
+ "contact",
44167
+ "motion-sensor",
44168
+ "smoke",
44169
+ "flood",
44170
+ "gas",
44171
+ "carbon-monoxide",
44172
+ "vibration",
44173
+ "tamper",
44174
+ "presence",
44175
+ "enum-sensor",
44176
+ "device-event",
44177
+ "lock",
44178
+ "cover",
44179
+ "switch",
44180
+ "siren",
44181
+ "button",
44182
+ "doorbell"
44183
+ ];
44184
+ var AUDIO_ENTRY_ID = "audio";
44185
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
44186
+ var AUDIO_GRADIENT_ALPHAS = [
44187
+ .3,
44188
+ .42,
44189
+ .55,
44190
+ .7,
44191
+ .85,
44192
+ 1
44193
+ ];
44194
+ var PALETTE_PRESET_IDS = [
44195
+ "camstack",
44196
+ "high-contrast",
44197
+ "okabe-ito"
44198
+ ];
44199
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
44200
+ var CAMSTACK_HEX = {
44201
+ motion: "#d946ef",
44202
+ audio: "#059eb8",
44203
+ recording: "#ef4444",
44204
+ live: "#8d7a00",
44205
+ heatmapScrub: "#4b32ff",
44206
+ person: "#11a64c",
44207
+ vehicle: "#3b82f6",
44208
+ animal: "#ea6a09",
44209
+ package: "#924667",
44210
+ sensor: "#624bbc",
44211
+ control: "#944d24",
44212
+ face: "#ed4f8d",
44213
+ plate: "#4b7027",
44214
+ car: "#9684cf",
44215
+ truck: "#0f9b89",
44216
+ bus: "#a734a9",
44217
+ motorcycle: "#c1133a",
44218
+ bicycle: "#0e6a9b",
44219
+ airplane: "#7c9928",
44220
+ boat: "#b17933",
44221
+ train: "#ad6ca3",
44222
+ bird: "#0f7c55",
44223
+ dog: "#c82700",
44224
+ cat: "#7268f2",
44225
+ horse: "#cb795e",
44226
+ sheep: "#b8636b",
44227
+ cow: "#cb2969",
44228
+ elephant: "#1158d2",
44229
+ bear: "#8d5e00",
44230
+ zebra: "#0097d6",
44231
+ giraffe: "#8f61bb",
44232
+ "package-delivered": "#cd3f9b",
44233
+ "package-picked-up": "#388a08",
44234
+ suitcase: "#666800",
44235
+ backpack: "#ec5022",
44236
+ handbag: "#a76ef8",
44237
+ contact: "#ab5a49",
44238
+ "motion-sensor": "#b95d1a",
44239
+ smoke: "#dd3858",
44240
+ flood: "#b31e7d",
44241
+ gas: "#5b70b5",
44242
+ "carbon-monoxide": "#7b4e8e",
44243
+ vibration: "#e65bba",
44244
+ tamper: "#98464b",
44245
+ presence: "#3a9468",
44246
+ "enum-sensor": "#7885f8",
44247
+ "device-event": "#8c43c8",
44248
+ lock: "#649653",
44249
+ cover: "#c67597",
44250
+ switch: "#7a812a",
44251
+ siren: "#ac5d7f",
44252
+ button: "#b276cd",
44253
+ doorbell: "#0087ab"
44254
+ };
44255
+ var CAMSTACK_FALLBACK = [
44256
+ "#b34dc7",
44257
+ "#1d7d34",
44258
+ "#db6b6c",
44259
+ "#a43d29",
44260
+ "#0e6ee6",
44261
+ "#29a10b",
44262
+ "#a98731",
44263
+ "#0181c6"
44264
+ ];
44265
+ var HIGH_CONTRAST_HEX = {
44266
+ motion: "#964360",
44267
+ audio: "#23a132",
44268
+ recording: "#2494ca",
44269
+ live: "#bd7e2b",
44270
+ heatmapScrub: "#ad6eea",
44271
+ person: "#62611e",
44272
+ vehicle: "#f4534c",
44273
+ animal: "#1556cd",
44274
+ package: "#9c4415",
44275
+ sensor: "#066c48",
44276
+ control: "#f2479f",
44277
+ face: "#139d8a",
44278
+ plate: "#909024",
44279
+ car: "#8e35ab",
44280
+ truck: "#bd0b2b",
44281
+ bus: "#7a88ca",
44282
+ motorcycle: "#e26725",
44283
+ bicycle: "#a6679b",
44284
+ airplane: "#7c5720",
44285
+ boat: "#467a1b",
44286
+ train: "#6f65a4",
44287
+ bird: "#cb717f",
44288
+ dog: "#c62490",
44289
+ cat: "#b36850",
44290
+ horse: "#1872ac",
44291
+ sheep: "#927939",
44292
+ cow: "#428a5c",
44293
+ elephant: "#d41160",
44294
+ bear: "#799453",
44295
+ zebra: "#a85455",
44296
+ giraffe: "#746be8",
44297
+ "package-delivered": "#824a80",
44298
+ "package-picked-up": "#614ac1",
44299
+ suitcase: "#2f77f3",
44300
+ backpack: "#fa476d",
44301
+ handbag: "#c14cbe",
44302
+ contact: "#c83921",
44303
+ "motion-sensor": "#a07ebd",
44304
+ smoke: "#a25b13",
44305
+ flood: "#526bab",
44306
+ gas: "#924938",
44307
+ "carbon-monoxide": "#bb7e53",
44308
+ vibration: "#b66182",
44309
+ tamper: "#3c6931",
44310
+ presence: "#6c851d",
44311
+ "enum-sensor": "#ad2d48",
44312
+ "device-event": "#5e9b04",
44313
+ lock: "#00a062",
44314
+ cover: "#ad8624",
44315
+ switch: "#d05259",
44316
+ siren: "#cd67b3",
44317
+ button: "#c9746a",
44318
+ doorbell: "#338eeb"
44319
+ };
44320
+ var HIGH_CONTRAST_FALLBACK = [
44321
+ "#817f3b",
44322
+ "#a0733e",
44323
+ "#8658b2",
44324
+ "#956301",
44325
+ "#bc652d",
44326
+ "#647331",
44327
+ "#a14c9e",
44328
+ "#d14e71"
44329
+ ];
44330
+ var OKABE_ITO_HEX = {
44331
+ motion: "#b88128",
44332
+ audio: "#1096c8",
44333
+ recording: "#009e73",
44334
+ live: "#9c8c22",
44335
+ heatmapScrub: "#0072b2",
44336
+ person: "#d55e00",
44337
+ vehicle: "#c0739f",
44338
+ animal: "#226d18",
44339
+ package: "#91446c",
44340
+ sensor: "#217b56",
44341
+ control: "#648647",
44342
+ face: "#c22998",
44343
+ plate: "#fa4575",
44344
+ car: "#956301",
44345
+ truck: "#2f77f3",
44346
+ bus: "#7a4e86",
44347
+ motorcycle: "#f54597",
44348
+ bicycle: "#bb3e75",
44349
+ airplane: "#e054c0",
44350
+ boat: "#457942",
44351
+ train: "#867afa",
44352
+ bird: "#88914c",
44353
+ dog: "#1556cd",
44354
+ cat: "#71702c",
44355
+ horse: "#9b4fa4",
44356
+ sheep: "#c0559d",
44357
+ cow: "#d14f65",
44358
+ elephant: "#98470f",
44359
+ bear: "#595896",
44360
+ zebra: "#96790e",
44361
+ giraffe: "#cb717b",
44362
+ "package-delivered": "#139d8a",
44363
+ "package-picked-up": "#906ead",
44364
+ suitcase: "#d02939",
44365
+ backpack: "#d41160",
44366
+ handbag: "#f64f54",
44367
+ contact: "#7258d2",
44368
+ "motion-sensor": "#b66182",
44369
+ smoke: "#627abb",
44370
+ flood: "#b86ae4",
44371
+ gas: "#a95261",
44372
+ "carbon-monoxide": "#c65d3c",
44373
+ vibration: "#7a40b7",
44374
+ tamper: "#914b34",
44375
+ presence: "#9481c3",
44376
+ "enum-sensor": "#ac6d47",
44377
+ "device-event": "#7b6fce",
44378
+ lock: "#c67662",
44379
+ cover: "#a6564d",
44380
+ switch: "#ad2c4e",
44381
+ siren: "#348e08",
44382
+ button: "#d27303",
44383
+ doorbell: "#55770f"
44384
+ };
44385
+ var OKABE_ITO_FALLBACK = [
44386
+ "#9a3784",
44387
+ "#a7392c",
44388
+ "#409d50",
44389
+ "#6987e7",
44390
+ "#ee5b3d",
44391
+ "#c0430d",
44392
+ "#af79b3",
44393
+ "#4b6628"
44394
+ ];
44395
+ /**
44396
+ * The display palette (D939). One table of colours, three presets, one
44397
+ * validator. Taxonomy colours and every consumer read this — there is no
44398
+ * second hex table.
44399
+ */
44400
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
44401
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
44402
+ form: literal("solid"),
44403
+ hex: paletteHexSchema
44404
+ }), object({
44405
+ form: literal("gradient"),
44406
+ hex: paletteHexSchema,
44407
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
44408
+ })]);
44409
+ var paletteReadySchema = object({
44410
+ status: literal("ready"),
44411
+ presetId: _enum(PALETTE_PRESET_IDS),
44412
+ customized: boolean(),
44413
+ source: _enum(["stored", "unconfigured"]),
44414
+ swatches: record(string(), paletteSwatchSchema),
44415
+ fallbacks: array(paletteHexSchema).length(8)
44416
+ });
44417
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
44418
+ status: literal("unknown"),
44419
+ reason: string()
44420
+ })]);
44421
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
44422
+ presetId: string(),
44423
+ overrides: record(string(), paletteSwatchSchema)
44424
+ })]);
44425
+ object({
44426
+ presetId: string(),
44427
+ overrides: record(string(), paletteSwatchSchema)
44428
+ });
44429
+ function solid(hex) {
44430
+ return {
44431
+ form: "solid",
44432
+ hex
44433
+ };
44434
+ }
44435
+ function audioGradient(hex) {
44436
+ return {
44437
+ form: "gradient",
44438
+ hex,
44439
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
44440
+ };
44441
+ }
44442
+ function swatchesFrom(hexes) {
44443
+ const out = {};
44444
+ for (const id of PALETTE_ENTRY_IDS) {
44445
+ const hex = hexes[id];
44446
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
44447
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
44448
+ }
44449
+ return out;
44450
+ }
44451
+ function preset(id, name, hexes, fallbacks) {
44452
+ return {
44453
+ id,
44454
+ name,
44455
+ swatches: swatchesFrom(hexes),
44456
+ fallbacks
44457
+ };
44458
+ }
44459
+ var DISPLAY_PRESETS = [
44460
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
44461
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
44462
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
44463
+ ];
44464
+ function presetById(id) {
44465
+ return DISPLAY_PRESETS.find((item) => item.id === id);
44466
+ }
44467
+ function bundledCamstack() {
44468
+ const presetRow = presetById("camstack");
44469
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
44470
+ return readyOf(presetRow, "unconfigured", false);
44471
+ }
44472
+ function readyOf(row, source, customized) {
44473
+ return {
44474
+ status: "ready",
44475
+ presetId: row.id,
44476
+ customized,
44477
+ source,
44478
+ swatches: row.swatches,
44479
+ fallbacks: [...row.fallbacks]
44480
+ };
44481
+ }
44482
+ function hashFallback(kind, fallbacks) {
44483
+ let hash = 0;
44484
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
44485
+ const hex = fallbacks[hash % fallbacks.length];
44486
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44487
+ return hex;
44488
+ }
44489
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
44490
+ function paintHex(swatches, fallbacks, kind) {
44491
+ const key = kind.trim().toLowerCase();
44492
+ if (key.startsWith("audio-")) {
44493
+ const audio = swatches[AUDIO_ENTRY_ID];
44494
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
44495
+ }
44496
+ const direct = swatches[key];
44497
+ if (direct !== void 0) return direct.hex;
44498
+ return hashFallback(key, fallbacks);
44499
+ }
44500
+ /**
42131
44501
  * Unified event-kind taxonomy — THE single source of truth for
42132
44502
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42133
44503
  * icon }`.
@@ -42141,109 +44511,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42141
44511
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42142
44512
  * - the COCO / audio class maps (macro ↔ sub relationships)
42143
44513
  *
42144
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42145
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42146
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42147
- * color or an icon: they read this dictionary (server descriptors carry the
42148
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
44514
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
44515
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
44516
+ * the bundled CamStack display palette (D939). The effective cluster palette
44517
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
44518
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42149
44519
  *
42150
44520
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42151
44521
  */
42152
- var TAXONOMY_COLORS = {
42153
- motion: "#f59e0b",
42154
- audio: "#06b6d4",
42155
- person: "#22c55e",
42156
- vehicle: "#3b82f6",
42157
- animal: "#f97316",
42158
- package: "#a855f7",
42159
- sensor: "#8b5cf6",
42160
- control: "#10b981",
42161
- genericDetection: "#64748b"
42162
- };
42163
- var DETECTION_SUB_COLORS = {
42164
- car: "#f59e0b",
42165
- truck: "#d97706",
42166
- bus: "#b45309",
42167
- motorcycle: "#eab308",
42168
- bicycle: "#ca8a04",
42169
- airplane: "#60a5fa",
42170
- boat: "#2563eb",
42171
- train: "#1d4ed8",
42172
- bird: "#14b8a6",
42173
- dog: "#84cc16",
42174
- cat: "#f97316",
42175
- horse: "#a16207",
42176
- sheep: "#a3a3a3",
42177
- cow: "#78716c",
42178
- elephant: "#6b7280",
42179
- bear: "#7c2d12",
42180
- zebra: "#404040",
42181
- giraffe: "#d4a373"
42182
- };
44522
+ var BUNDLED_PALETTE = bundledCamstack();
44523
+ function kindColor(kind) {
44524
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
44525
+ }
44526
+ function firstFallback(fallbacks) {
44527
+ const hex = fallbacks[0];
44528
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44529
+ return hex;
44530
+ }
44531
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42183
44532
  function titleCase(id) {
42184
44533
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42185
44534
  }
42186
44535
  var entries = /* @__PURE__ */ new Map();
42187
- function macro(kind, category, color, iconId, label) {
44536
+ function macro(kind, category, iconId, label) {
42188
44537
  entries.set(kind, {
42189
44538
  kind,
42190
44539
  parentKind: null,
42191
44540
  level: "macro",
42192
44541
  category,
42193
- color,
44542
+ color: kindColor(kind),
42194
44543
  iconId,
42195
44544
  labelKey: `eventKind.${kind}`,
42196
44545
  label
42197
44546
  });
42198
44547
  }
42199
- function sub(kind, parentKind, category, color, iconId, label) {
44548
+ function sub(kind, parentKind, category, iconId, label) {
42200
44549
  entries.set(kind, {
42201
44550
  kind,
42202
44551
  parentKind,
42203
44552
  level: "sub",
42204
44553
  category,
42205
- color,
44554
+ color: kindColor(kind),
42206
44555
  iconId,
42207
44556
  labelKey: `eventKind.${kind}`,
42208
44557
  label
42209
44558
  });
42210
44559
  }
42211
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42212
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42213
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42214
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42215
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42216
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42217
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42218
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
44560
+ macro("motion", "motion", "motion", "Motion");
44561
+ macro("audio", "audio", "audio", "Audio");
44562
+ macro("person", "detection", "person", "Person");
44563
+ macro("vehicle", "detection", "vehicle", "Vehicle");
44564
+ macro("animal", "detection", "animal", "Animal");
44565
+ macro("package", "package", "package", "Package");
44566
+ macro("sensor", "sensor", "sensor", "Sensor");
44567
+ macro("control", "control", "control", "Control");
42219
44568
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42220
44569
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42221
44570
  if (entries.has(cocoClass)) continue;
42222
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
44571
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
42223
44572
  }
42224
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42225
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42226
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42227
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42228
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42229
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42230
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42231
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42232
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42233
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42234
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42235
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42236
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42237
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42238
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42239
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42240
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42241
- sub("button", "control", "control", "#10b981", "button", "Button");
42242
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
44573
+ sub("package-delivered", "package", "package", "package", "Package delivered");
44574
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
44575
+ sub("contact", "sensor", "sensor", "door", "Contact");
44576
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
44577
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
44578
+ sub("flood", "sensor", "sensor", "water", "Water leak");
44579
+ sub("gas", "sensor", "sensor", "gas", "Gas");
44580
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
44581
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
44582
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
44583
+ sub("presence", "sensor", "sensor", "presence", "Presence");
44584
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
44585
+ sub("device-event", "sensor", "sensor", "button", "Device event");
44586
+ sub("lock", "control", "control", "lock", "Lock");
44587
+ sub("cover", "control", "control", "door", "Cover");
44588
+ sub("switch", "control", "control", "switch", "Switch");
44589
+ sub("siren", "control", "control", "siren", "Siren");
44590
+ sub("button", "control", "control", "button", "Button");
44591
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42243
44592
  for (const l of AUDIO_MACRO_LABELS) {
42244
44593
  const kind = `audio-${l.id}`;
42245
44594
  if (entries.has(kind)) continue;
42246
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
44595
+ sub(kind, "audio", "audio", kind, l.name);
42247
44596
  }
42248
44597
  /** The complete taxonomy dictionary, keyed by kind. */
42249
44598
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -43086,7 +45435,7 @@ var NcConditionsSchema = object({
43086
45435
  * with the list under it is worse than no switch (D62).
43087
45436
  *
43088
45437
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43089
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45438
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43090
45439
  * the operator fixed the spelling. The id reaches the record on
43091
45440
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43092
45441
  * `{{label}}` renders.
@@ -43637,7 +45986,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
43637
45986
  * A rule scoped to one camera and one zone silently became a rule that
43638
45987
  * matches EVERY event on EVERY camera, and lost its `media` policy
43639
45988
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
43640
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
45989
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
43641
45990
  * within a minute of a two-field patch.
43642
45991
  *
43643
45992
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -45450,7 +47799,7 @@ var LabelAttributionSchema = object({
45450
47799
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
45451
47800
  *
45452
47801
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
45453
- * notification rule authored on "Gianluca" stopped matching the moment the
47802
+ * notification rule authored on "Alice" stopped matching the moment the
45454
47803
  * operator fixed the spelling in the gallery, and nothing said so. The id is
45455
47804
  * the thing that does not move, so it is what a rule matches on
45456
47805
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -47989,7 +50338,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
47989
50338
  /**
47990
50339
  * Root-supplied detections for the tree's ROOT step (D730). Set by
47991
50340
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
47992
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50341
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
47993
50342
  * NOT inferred, these boxes are its output, and its children (the plate
47994
50343
  * reader) run on them through their own crop policy. Boxes are in the
47995
50344
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -49622,7 +51971,7 @@ var RunnerCameraConfigSchema = object({
49622
51971
  * detection session that asks for history. What shipped was a last-moment
49623
51972
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
49624
51973
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
49625
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
51974
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
49626
51975
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
49627
51976
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
49628
51977
  * was decoded, and was freed.
@@ -51652,7 +54001,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
51652
54001
  * The signals a device can emit to WAKE its own stream.
51653
54002
  *
51654
54003
  * A camera whose stream is built on demand sleeps until something asks for it,
51655
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54004
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
51656
54005
  * puller holds a session open for ever, and treating that as demand would keep
51657
54006
  * a battery camera awake for ever, which is the whole thing the battery is for
51658
54007
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -52339,7 +54688,7 @@ var ClipSchema = object({
52339
54688
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
52340
54689
  *
52341
54690
  * Bounded because it is not a payload the surface pages through: one visit on
52342
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
54691
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
52343
54692
  * camera-day. Read {@link eventCount} for the true total.
52344
54693
  */
52345
54694
  eventIds: array(string()).optional(),
@@ -52484,7 +54833,7 @@ var ClipPlaybackSchema = object({
52484
54833
  * camera has no recordings", which is the defect this whole line of work is
52485
54834
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
52486
54835
  * reached at all (`unreachable`, also what a provider that THREW reports), a
52487
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
54836
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
52488
54837
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
52489
54838
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
52490
54839
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -52749,7 +55098,7 @@ DeviceType.Camera, method(object({
52749
55098
  *
52750
55099
  * It was optional, documented as "absent means the device's BOUND
52751
55100
  * provider, which is CamStack on every camera". No code implemented
52752
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55101
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
52753
55102
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
52754
55103
  * answered SIX rows, three from each source, merged newest-first:
52755
55104
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -53827,7 +56176,10 @@ object({
53827
56176
  DeviceType.Sensor;
53828
56177
  object({
53829
56178
  /** Current illuminance in lux (lx). */
53830
- lux: number().min(0),
56179
+ lux: number().min(0).meta({
56180
+ unit: "lx",
56181
+ label: "Illuminance"
56182
+ }),
53831
56183
  /** Ms epoch when the slice was last updated. */
53832
56184
  lastFetchedAt: number(),
53833
56185
  /** Live display unit from the upstream source (e.g. HA
@@ -53983,7 +56335,10 @@ var BatteryStatusSchema = object({
53983
56335
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
53984
56336
  * declines to band a non-finite reading, which is the correct shape.
53985
56337
  */
53986
- percentage: number().min(0).max(100).nullable(),
56338
+ percentage: number().min(0).max(100).nullable().meta({
56339
+ unit: "%",
56340
+ label: "Charge"
56341
+ }),
53987
56342
  /**
53988
56343
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
53989
56344
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -54002,13 +56357,13 @@ var BatteryStatusSchema = object({
54002
56357
  "solar",
54003
56358
  "none",
54004
56359
  "unknown"
54005
- ]),
56360
+ ]).meta({ label: "Charging source" }),
54006
56361
  /**
54007
56362
  * True when the camera firmware has gone into low-power mode. Battery
54008
56363
  * providers MUST avoid polling during sleep — reading the battery
54009
56364
  * wakes the camera up and drains charge.
54010
56365
  */
54011
- sleeping: boolean(),
56366
+ sleeping: boolean().meta({ label: "Sleeping" }),
54012
56367
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
54013
56368
  lastUpdated: number(),
54014
56369
  /**
@@ -54048,7 +56403,7 @@ var BatteryStatusSchema = object({
54048
56403
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
54049
56404
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
54050
56405
  */
54051
- binary: boolean().optional()
56406
+ binary: boolean().optional().meta({ label: "Binary indicator" })
54052
56407
  });
54053
56408
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
54054
56409
  method(object({
@@ -54063,7 +56418,7 @@ method(object({
54063
56418
  status: BatteryStatusSchema
54064
56419
  });
54065
56420
  object({
54066
- on: boolean(),
56421
+ on: boolean().meta({ label: "On" }),
54067
56422
  /** Ms epoch of the last transition. 0 if never observed. */
54068
56423
  lastChangedAt: number()
54069
56424
  });
@@ -54321,7 +56676,7 @@ var GridLayoutCellSchema = object({
54321
56676
  *
54322
56677
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
54323
56678
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
54324
- * the sources, because "this grid has no low" is not a finding — "615 has no
56679
+ * the sources, because "this grid has no low" is not a finding — "101 has no
54325
56680
  * low" is, and it is the one an operator can act on.
54326
56681
  */
54327
56682
  var GridProfileOfferSchema = object({
@@ -54953,6 +57308,30 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
54953
57308
  auth: "admin"
54954
57309
  });
54955
57310
  /**
57311
+ * display-palette — the cluster's one colour table (D939).
57312
+ *
57313
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
57314
+ * cannot be read; it does not pretend the bundled preset was stored.
57315
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
57316
+ * the pairs.
57317
+ */
57318
+ var presetSummarySchema = object({
57319
+ id: string(),
57320
+ name: string(),
57321
+ swatches: record(string(), paletteSwatchSchema),
57322
+ fallbacks: array(string())
57323
+ });
57324
+ method(_void(), paletteResultSchema, {
57325
+ auth: "protected",
57326
+ role: "viewer"
57327
+ }), method(_void(), array(presetSummarySchema).readonly(), {
57328
+ auth: "protected",
57329
+ role: "viewer"
57330
+ }), method(setPaletteInputSchema, paletteReadySchema, {
57331
+ kind: "mutation",
57332
+ auth: "admin"
57333
+ });
57334
+ /**
54956
57335
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
54957
57336
  * for every device, regardless of provider — the kernel needs a uniform
54958
57337
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -55848,7 +58227,10 @@ DeviceType.Humidifier, method(object({
55848
58227
  });
55849
58228
  object({
55850
58229
  /** Current relative humidity, 0..100. */
55851
- percent: number().min(0).max(100),
58230
+ percent: number().min(0).max(100).meta({
58231
+ unit: "%",
58232
+ label: "Humidity"
58233
+ }),
55852
58234
  /** Ms epoch when the slice was last updated. */
55853
58235
  lastFetchedAt: number(),
55854
58236
  /** Live display unit from the upstream source (e.g. HA
@@ -58625,9 +61007,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
58625
61007
  });
58626
61008
  object({
58627
61009
  /** Instantaneous power draw in watts. */
58628
- watts: number().optional(),
61010
+ watts: number().optional().meta({
61011
+ unit: "W",
61012
+ label: "Power"
61013
+ }),
58629
61014
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
58630
- kwhTotal: number().optional(),
61015
+ kwhTotal: number().optional().meta({
61016
+ unit: "kWh",
61017
+ label: "Energy"
61018
+ }),
58631
61019
  /** Voltage in volts. */
58632
61020
  volts: number().optional(),
58633
61021
  /** Current in amperes. */
@@ -58946,9 +61334,9 @@ var PtzOptionsSchema = object({
58946
61334
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
58947
61335
  * not one of the three cameras honours its own:
58948
61336
  *
58949
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
58950
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
58951
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
61337
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
61338
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
61339
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
58952
61340
  *
58953
61341
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
58954
61342
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -59095,7 +61483,7 @@ object({
59095
61483
  running: boolean().nullable(),
59096
61484
  /** Epoch ms the current boolean began; null while `running` is null. */
59097
61485
  since: number().nullable(),
59098
- source: RunningStateSourceSchema,
61486
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
59099
61487
  phase: string().nullable(),
59100
61488
  /** null until a reading has been published (D393). */
59101
61489
  lastFetchedAt: number().nullable()
@@ -59148,7 +61536,7 @@ var RecordingAvailabilitySchema = object({
59148
61536
  * would look identical. But the answer used to say nothing about that, so a
59149
61537
  * caller asking "what can I export?" read the single preferred profile as
59150
61538
  * the only one that exists — on this deployment every camera records `high`
59151
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
61539
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
59152
61540
  * UI could not see it.
59153
61541
  *
59154
61542
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -59247,7 +61635,7 @@ var RecordingSourceOptionsSchema = object({
59247
61635
  * `sparse` = gaps are the absence of one, and must be drawn as such.
59248
61636
  *
59249
61637
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
59250
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
61638
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
59251
61639
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
59252
61640
  coverage: _enum(["continuous", "sparse"]),
59253
61641
  /** Where the playhead may be put.
@@ -59323,7 +61711,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
59323
61711
  * merely discouraged (D554 amended).
59324
61712
  *
59325
61713
  * It was learned the expensive way on `videoclips.listClips`: measured
59326
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
61714
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
59327
61715
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
59328
61716
  * three from each source, merged — `device-collection-dispatch.ts`
59329
61717
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -59924,7 +62312,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
59924
62312
  * on a 10 h window holding 29,393 s of footage every range landed late by the
59925
62313
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
59926
62314
  * the video was a uniform timelapse, and the log line reported the five ranges
59927
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
62315
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
59928
62316
  *
59929
62317
  * Relative and not absolute epoch, because an absolute epoch would make every
59930
62318
  * call site responsible for the same subtraction.
@@ -60558,7 +62946,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusS
60558
62946
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
60559
62947
  * for the thing: a scene is a standing question about the property ("is the bin
60560
62948
  * still out"), and the operator's question is "which of my scenes have tripped",
60561
- * across every camera at once — not "what does camera 617 think". Buried one
62949
+ * across every camera at once — not "what does camera 102 think". Buried one
60562
62950
  * camera deep it also could not be found. The surface is now a top-level admin
60563
62951
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
60564
62952
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -61141,7 +63529,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), StreamParamsOptionsSch
61141
63529
  auth: "admin"
61142
63530
  }), method(object({ deviceId: number() }), unknown().nullable());
61143
63531
  object({
61144
- on: boolean(),
63532
+ on: boolean().meta({ label: "On" }),
61145
63533
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
61146
63534
  lastChangedAt: number()
61147
63535
  });
@@ -61704,7 +64092,10 @@ object({
61704
64092
  DeviceType.Sensor;
61705
64093
  object({
61706
64094
  /** Current temperature in Celsius. */
61707
- celsius: number(),
64095
+ celsius: number().meta({
64096
+ unit: "°C",
64097
+ label: "Temperature"
64098
+ }),
61708
64099
  /** Ms epoch when the slice was last updated (push or poll). */
61709
64100
  lastFetchedAt: number(),
61710
64101
  /** Live display unit from the upstream source (e.g. HA
@@ -62954,6 +65345,10 @@ var trainingCapability = {
62954
65345
  }
62955
65346
  };
62956
65347
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65348
+ 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;
65349
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
65350
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
65351
+ new Set(CAP_NAMES);
62957
65352
  Object.freeze({
62958
65353
  person: .5,
62959
65354
  vehicle: .5,
@@ -65953,6 +68348,27 @@ Object.freeze({
65953
68348
  access: "create",
65954
68349
  role: "viewer"
65955
68350
  },
68351
+ "displayPalette.getPalette": {
68352
+ capName: "display-palette",
68353
+ capScope: "system",
68354
+ addonId: null,
68355
+ access: "view",
68356
+ role: "viewer"
68357
+ },
68358
+ "displayPalette.listPresets": {
68359
+ capName: "display-palette",
68360
+ capScope: "system",
68361
+ addonId: null,
68362
+ access: "view",
68363
+ role: "viewer"
68364
+ },
68365
+ "displayPalette.setPalette": {
68366
+ capName: "display-palette",
68367
+ capScope: "system",
68368
+ addonId: null,
68369
+ access: "create",
68370
+ role: "admin"
68371
+ },
65956
68372
  "doorbell.getStatus": {
65957
68373
  capName: "doorbell",
65958
68374
  capScope: "device",
@@ -75870,7 +78286,7 @@ var SENSOR_CAP_VOCABULARY = {
75870
78286
  state: [{
75871
78287
  kind: "boolean",
75872
78288
  field: "on",
75873
- label: t("Active", "Attivo"),
78289
+ label: t("On", "Acceso"),
75874
78290
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
75875
78291
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
75876
78292
  icon: "toggle-right"
@@ -76409,6 +78825,7 @@ var SYSTEM_CAP_VOCABULARY = {
76409
78825
  "device-provider": system(INTERNAL),
76410
78826
  "device-removal-hook": system(INTERNAL),
76411
78827
  "device-state": system("the runtime-state mirror every trigger already reads through"),
78828
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
76412
78829
  "embedding-encoder": system(ML),
76413
78830
  "face-gallery": system("the face gallery — curated on its own page"),
76414
78831
  "failure-contribution": system(INTERNAL),
@@ -79293,7 +81710,6 @@ Object.freeze({
79293
81710
  "smtp-provider": "email"
79294
81711
  });
79295
81712
  DeviceType.Camera;
79296
- 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;
79297
81713
  /**
79298
81714
  * A saved Customize assignment (D936). The schema is the type: callers use
79299
81715
  * `z.infer`, they do not restate the shape.
@@ -79382,7 +81798,6 @@ object({
79382
81798
  ]),
79383
81799
  reason: string().nullable()
79384
81800
  });
79385
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
79386
81801
  var G711_SCALE_CORRECTION_DB = {
79387
81802
  PCMU: 20 * Math.log10(4),
79388
81803
  PCMA: 20 * Math.log10(8)
@@ -79755,7 +82170,7 @@ var STATE_SUMMARY_SECTION_VARS = [
79755
82170
  {
79756
82171
  name: "summaryStreams",
79757
82172
  label: "Summary: streams offline",
79758
- example: "Ingresso (high) — since 06:40",
82173
+ example: "Front door (high) — since 06:40",
79759
82174
  kinds: ["stream-offline", "stream-online"]
79760
82175
  },
79761
82176
  {
@@ -79773,13 +82188,13 @@ var STATE_SUMMARY_SECTION_VARS = [
79773
82188
  {
79774
82189
  name: "summaryDetection",
79775
82190
  label: "Summary: cameras detecting nothing",
79776
- example: "Ingresso — since 05:10",
82191
+ example: "Front door — since 05:10",
79777
82192
  kinds: ["detection-blind"]
79778
82193
  },
79779
82194
  {
79780
82195
  name: "summaryNodes",
79781
82196
  label: "Summary: nodes",
79782
- example: "little-unraid — offline since 03:00",
82197
+ example: "agent-a — offline since 03:00",
79783
82198
  kinds: [
79784
82199
  "node-offline",
79785
82200
  "node-online",