@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
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  }) : target, mod));
33
33
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
34
  require("node:crypto");
35
- //#region ../types/dist/event-category-Ceif8n-v.mjs
35
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
36
36
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
37
37
  EventCategory["SystemBoot"] = "system.boot";
38
38
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -328,7 +328,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
328
328
  * TRANSITION into that state (never per dispatch), and the node is dropped
329
329
  * from the placement candidate set for as long as it holds.
330
330
  *
331
- * This exists because the state was previously invisible: little-unraid
331
+ * This exists because the state was previously invisible: agent-a
332
332
  * absorbed 283k inference errors in a day while still being handed cameras,
333
333
  * and nothing in the system said so.
334
334
  *
@@ -5600,7 +5600,7 @@ var ZodIssueCode = {
5600
5600
  var ZodFirstPartyTypeKind;
5601
5601
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5602
5602
  //#endregion
5603
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5603
+ //#region ../types/dist/sleep-BErAxhul.mjs
5604
5604
  /**
5605
5605
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5606
5606
  * window to float samples (D455).
@@ -8800,6 +8800,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8800
8800
  kind: "mutation",
8801
8801
  auth: "admin"
8802
8802
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8803
+ Object.freeze({ "doorbell": "lastPressedAt" });
8804
+ /** Every capability name, so addon code can check a name without the schema graph. */
8805
+ var CAP_NAMES = Object.freeze([
8806
+ "accessories",
8807
+ "addon-pages",
8808
+ "addon-pages-source",
8809
+ "addon-routes",
8810
+ "addon-settings",
8811
+ "addon-widgets",
8812
+ "addon-widgets-source",
8813
+ "addons",
8814
+ "admin-ui",
8815
+ "air-quality-sensor",
8816
+ "alarm-panel",
8817
+ "alerts",
8818
+ "ambient-light-sensor",
8819
+ "audio-analysis",
8820
+ "audio-analyzer",
8821
+ "audio-codec",
8822
+ "audio-metrics",
8823
+ "auth-provider",
8824
+ "automation-control",
8825
+ "backup",
8826
+ "battery",
8827
+ "binary",
8828
+ "brightness",
8829
+ "broker",
8830
+ "button",
8831
+ "calendar-source",
8832
+ "calendars",
8833
+ "camera-credentials",
8834
+ "camera-grid-layout",
8835
+ "camera-pipeline-config",
8836
+ "camera-streams",
8837
+ "carbon-monoxide",
8838
+ "climate-control",
8839
+ "color",
8840
+ "composer",
8841
+ "connection-test",
8842
+ "connectivity",
8843
+ "consumables",
8844
+ "contact",
8845
+ "control",
8846
+ "core-blocks",
8847
+ "cover",
8848
+ "custom-model-registry",
8849
+ "data-store-provider",
8850
+ "database-snapshot",
8851
+ "day-night",
8852
+ "decoder",
8853
+ "detection-pipeline",
8854
+ "device-admin-link",
8855
+ "device-adoption",
8856
+ "device-credentials",
8857
+ "device-discovery",
8858
+ "device-export",
8859
+ "device-extension",
8860
+ "device-history",
8861
+ "device-manager",
8862
+ "device-ops",
8863
+ "device-provider",
8864
+ "device-removal-hook",
8865
+ "device-state",
8866
+ "device-status",
8867
+ "dishwasher",
8868
+ "display-palette",
8869
+ "doorbell",
8870
+ "embedding-encoder",
8871
+ "enum-sensor",
8872
+ "event-emitter",
8873
+ "face-gallery",
8874
+ "failure-contribution",
8875
+ "fan-control",
8876
+ "feature-probe",
8877
+ "filesystem-browse",
8878
+ "flood",
8879
+ "gas",
8880
+ "heating-valve",
8881
+ "humidifier",
8882
+ "humidity-sensor",
8883
+ "image",
8884
+ "image-settings",
8885
+ "integrations",
8886
+ "intercom",
8887
+ "keychain",
8888
+ "keychain-admin",
8889
+ "lawn-mower-control",
8890
+ "llm",
8891
+ "llm-runtime",
8892
+ "load-contribution",
8893
+ "local-network",
8894
+ "lock-control",
8895
+ "log-channels",
8896
+ "log-destination",
8897
+ "login-method",
8898
+ "media-player",
8899
+ "mesh-network",
8900
+ "metrics-provider",
8901
+ "model-convert",
8902
+ "model-distributor",
8903
+ "motion",
8904
+ "motion-detection",
8905
+ "motion-trigger",
8906
+ "motion-zones",
8907
+ "mqtt-broker",
8908
+ "native-object-detection",
8909
+ "navigation",
8910
+ "network-access",
8911
+ "network-link",
8912
+ "network-quality",
8913
+ "node-certificates",
8914
+ "nodes",
8915
+ "notification-output",
8916
+ "notification-rules",
8917
+ "notifier",
8918
+ "numeric-sensor",
8919
+ "oauth-integration",
8920
+ "oidc-connections",
8921
+ "osd",
8922
+ "osd-manager",
8923
+ "pet-feeder",
8924
+ "pipeline-analytics",
8925
+ "pipeline-executor",
8926
+ "pipeline-orchestrator",
8927
+ "pipeline-runner",
8928
+ "plate-gallery",
8929
+ "platform-probe",
8930
+ "power-meter",
8931
+ "presence",
8932
+ "pressure-sensor",
8933
+ "privacy-mask",
8934
+ "ptz",
8935
+ "ptz-autotrack",
8936
+ "reboot",
8937
+ "record-entries",
8938
+ "recording",
8939
+ "recording-archive",
8940
+ "recording-export",
8941
+ "recording-onboard",
8942
+ "recording-signal",
8943
+ "records",
8944
+ "running-state",
8945
+ "scene-monitor",
8946
+ "script-runner",
8947
+ "server-management",
8948
+ "settings-store",
8949
+ "smoke",
8950
+ "smtp-provider",
8951
+ "snapshot",
8952
+ "sso-bridge",
8953
+ "storage",
8954
+ "storage-admin",
8955
+ "storage-evictable",
8956
+ "storage-migration",
8957
+ "storage-occupancy",
8958
+ "storage-provider",
8959
+ "stream-broker",
8960
+ "stream-catalog",
8961
+ "stream-params",
8962
+ "stream-signals",
8963
+ "switch",
8964
+ "system",
8965
+ "tamper",
8966
+ "temperature-sensor",
8967
+ "terminal-session",
8968
+ "toast",
8969
+ "training",
8970
+ "training-provider",
8971
+ "turn-provider",
8972
+ "update",
8973
+ "user-management",
8974
+ "user-passkeys",
8975
+ "vacuum-control",
8976
+ "valve",
8977
+ "vector-store",
8978
+ "vibration",
8979
+ "videoclips",
8980
+ "viewer-ui",
8981
+ "water-heater",
8982
+ "weather",
8983
+ "webrtc-session",
8984
+ "zone-analytics",
8985
+ "zone-rules",
8986
+ "zones"
8987
+ ]);
8988
+ Object.freeze({
8989
+ "air-quality-sensor": [
8990
+ {
8991
+ "path": "co2Ppm",
8992
+ "valueType": "number"
8993
+ },
8994
+ {
8995
+ "path": "vocPpb",
8996
+ "valueType": "number"
8997
+ },
8998
+ {
8999
+ "path": "pm25",
9000
+ "valueType": "number"
9001
+ },
9002
+ {
9003
+ "path": "pm10",
9004
+ "valueType": "number"
9005
+ },
9006
+ {
9007
+ "path": "aqi",
9008
+ "valueType": "number"
9009
+ },
9010
+ {
9011
+ "path": "unit",
9012
+ "valueType": "string"
9013
+ },
9014
+ {
9015
+ "path": "precision",
9016
+ "valueType": "number"
9017
+ }
9018
+ ],
9019
+ "alarm-panel": [
9020
+ {
9021
+ "path": "state",
9022
+ "valueType": "enum",
9023
+ "enumValues": [
9024
+ "disarmed",
9025
+ "armed_home",
9026
+ "armed_away",
9027
+ "armed_night",
9028
+ "armed_vacation",
9029
+ "armed_custom_bypass",
9030
+ "arming",
9031
+ "disarming",
9032
+ "pending",
9033
+ "triggered"
9034
+ ]
9035
+ },
9036
+ {
9037
+ "path": "targetMode",
9038
+ "valueType": "enum",
9039
+ "enumValues": [
9040
+ "home",
9041
+ "away",
9042
+ "night",
9043
+ "vacation",
9044
+ "custom_bypass"
9045
+ ]
9046
+ },
9047
+ {
9048
+ "path": "requiresCode",
9049
+ "valueType": "boolean"
9050
+ }
9051
+ ],
9052
+ "ambient-light-sensor": [
9053
+ {
9054
+ "path": "lux",
9055
+ "valueType": "number"
9056
+ },
9057
+ {
9058
+ "path": "unit",
9059
+ "valueType": "string"
9060
+ },
9061
+ {
9062
+ "path": "precision",
9063
+ "valueType": "number"
9064
+ }
9065
+ ],
9066
+ "audio-metrics": [
9067
+ {
9068
+ "path": "ts",
9069
+ "valueType": "number"
9070
+ },
9071
+ {
9072
+ "path": "windowSec",
9073
+ "valueType": "number"
9074
+ },
9075
+ {
9076
+ "path": "level.rms",
9077
+ "valueType": "number"
9078
+ },
9079
+ {
9080
+ "path": "level.dbfs",
9081
+ "valueType": "number"
9082
+ },
9083
+ {
9084
+ "path": "peakDbfs",
9085
+ "valueType": "number"
9086
+ },
9087
+ {
9088
+ "path": "avgDbfs",
9089
+ "valueType": "number"
9090
+ },
9091
+ {
9092
+ "path": "current.className",
9093
+ "valueType": "string"
9094
+ },
9095
+ {
9096
+ "path": "current.score",
9097
+ "valueType": "number"
9098
+ },
9099
+ {
9100
+ "path": "current.timestamp",
9101
+ "valueType": "number"
9102
+ }
9103
+ ],
9104
+ "automation-control": [
9105
+ {
9106
+ "path": "enabled",
9107
+ "valueType": "boolean"
9108
+ },
9109
+ {
9110
+ "path": "isRunning",
9111
+ "valueType": "boolean"
9112
+ },
9113
+ {
9114
+ "path": "lastTriggeredAt",
9115
+ "valueType": "number"
9116
+ },
9117
+ {
9118
+ "path": "lastError",
9119
+ "valueType": "string"
9120
+ }
9121
+ ],
9122
+ "battery": [
9123
+ {
9124
+ "path": "percentage",
9125
+ "valueType": "number"
9126
+ },
9127
+ {
9128
+ "path": "charging",
9129
+ "valueType": "enum",
9130
+ "enumValues": [
9131
+ "dc",
9132
+ "solar",
9133
+ "none",
9134
+ "unknown"
9135
+ ]
9136
+ },
9137
+ {
9138
+ "path": "sleeping",
9139
+ "valueType": "boolean"
9140
+ },
9141
+ {
9142
+ "path": "lastUpdated",
9143
+ "valueType": "number"
9144
+ },
9145
+ {
9146
+ "path": "lastContactAt",
9147
+ "valueType": "number"
9148
+ },
9149
+ {
9150
+ "path": "lastFullRefreshAt",
9151
+ "valueType": "number"
9152
+ },
9153
+ {
9154
+ "path": "binary",
9155
+ "valueType": "boolean"
9156
+ }
9157
+ ],
9158
+ "binary": [{
9159
+ "path": "on",
9160
+ "valueType": "boolean"
9161
+ }],
9162
+ "brightness": [{
9163
+ "path": "percentage",
9164
+ "valueType": "number"
9165
+ }],
9166
+ "broker": [{
9167
+ "path": "brokerCount",
9168
+ "valueType": "number"
9169
+ }, {
9170
+ "path": "connectedCount",
9171
+ "valueType": "number"
9172
+ }],
9173
+ "camera-credentials": [
9174
+ {
9175
+ "path": "host",
9176
+ "valueType": "string"
9177
+ },
9178
+ {
9179
+ "path": "port",
9180
+ "valueType": "number"
9181
+ },
9182
+ {
9183
+ "path": "onvifPort",
9184
+ "valueType": "number"
9185
+ },
9186
+ {
9187
+ "path": "rtspPort",
9188
+ "valueType": "number"
9189
+ },
9190
+ {
9191
+ "path": "https",
9192
+ "valueType": "boolean"
9193
+ },
9194
+ {
9195
+ "path": "hasUsername",
9196
+ "valueType": "boolean"
9197
+ },
9198
+ {
9199
+ "path": "hasPassword",
9200
+ "valueType": "boolean"
9201
+ },
9202
+ {
9203
+ "path": "onvifProfile",
9204
+ "valueType": "string"
9205
+ }
9206
+ ],
9207
+ "camera-streams": [
9208
+ {
9209
+ "path": "online",
9210
+ "valueType": "boolean"
9211
+ },
9212
+ {
9213
+ "path": "slotStatuses.high",
9214
+ "valueType": "enum",
9215
+ "enumValues": [
9216
+ "unassigned",
9217
+ "idle",
9218
+ "connecting",
9219
+ "streaming",
9220
+ "error"
9221
+ ]
9222
+ },
9223
+ {
9224
+ "path": "slotStatuses.mid",
9225
+ "valueType": "enum",
9226
+ "enumValues": [
9227
+ "unassigned",
9228
+ "idle",
9229
+ "connecting",
9230
+ "streaming",
9231
+ "error"
9232
+ ]
9233
+ },
9234
+ {
9235
+ "path": "slotStatuses.low",
9236
+ "valueType": "enum",
9237
+ "enumValues": [
9238
+ "unassigned",
9239
+ "idle",
9240
+ "connecting",
9241
+ "streaming",
9242
+ "error"
9243
+ ]
9244
+ },
9245
+ {
9246
+ "path": "slotErrors.high",
9247
+ "valueType": "string"
9248
+ },
9249
+ {
9250
+ "path": "slotErrors.mid",
9251
+ "valueType": "string"
9252
+ },
9253
+ {
9254
+ "path": "slotErrors.low",
9255
+ "valueType": "string"
9256
+ }
9257
+ ],
9258
+ "carbon-monoxide": [{
9259
+ "path": "detected",
9260
+ "valueType": "boolean"
9261
+ }],
9262
+ "climate-control": [
9263
+ {
9264
+ "path": "mode",
9265
+ "valueType": "enum",
9266
+ "enumValues": [
9267
+ "off",
9268
+ "heat",
9269
+ "cool",
9270
+ "auto",
9271
+ "heat_cool",
9272
+ "fan_only",
9273
+ "dry"
9274
+ ]
9275
+ },
9276
+ {
9277
+ "path": "fanMode",
9278
+ "valueType": "string"
9279
+ },
9280
+ {
9281
+ "path": "preset",
9282
+ "valueType": "string"
9283
+ },
9284
+ {
9285
+ "path": "target",
9286
+ "valueType": "number"
9287
+ },
9288
+ {
9289
+ "path": "targetHigh",
9290
+ "valueType": "number"
9291
+ },
9292
+ {
9293
+ "path": "targetLow",
9294
+ "valueType": "number"
9295
+ },
9296
+ {
9297
+ "path": "targetHumidity",
9298
+ "valueType": "number"
9299
+ },
9300
+ {
9301
+ "path": "currentTemp",
9302
+ "valueType": "number"
9303
+ },
9304
+ {
9305
+ "path": "currentHumidity",
9306
+ "valueType": "number"
9307
+ },
9308
+ {
9309
+ "path": "swingVertical",
9310
+ "valueType": "boolean"
9311
+ },
9312
+ {
9313
+ "path": "swingHorizontal",
9314
+ "valueType": "boolean"
9315
+ },
9316
+ {
9317
+ "path": "minTemp",
9318
+ "valueType": "number"
9319
+ },
9320
+ {
9321
+ "path": "maxTemp",
9322
+ "valueType": "number"
9323
+ },
9324
+ {
9325
+ "path": "tempStep",
9326
+ "valueType": "number"
9327
+ }
9328
+ ],
9329
+ "color": [
9330
+ {
9331
+ "path": "mode",
9332
+ "valueType": "enum",
9333
+ "enumValues": [
9334
+ "rgb",
9335
+ "hsv",
9336
+ "mired"
9337
+ ]
9338
+ },
9339
+ {
9340
+ "path": "rgb.r",
9341
+ "valueType": "number"
9342
+ },
9343
+ {
9344
+ "path": "rgb.g",
9345
+ "valueType": "number"
9346
+ },
9347
+ {
9348
+ "path": "rgb.b",
9349
+ "valueType": "number"
9350
+ },
9351
+ {
9352
+ "path": "hsv.h",
9353
+ "valueType": "number"
9354
+ },
9355
+ {
9356
+ "path": "hsv.s",
9357
+ "valueType": "number"
9358
+ },
9359
+ {
9360
+ "path": "hsv.v",
9361
+ "valueType": "number"
9362
+ },
9363
+ {
9364
+ "path": "mireds",
9365
+ "valueType": "number"
9366
+ }
9367
+ ],
9368
+ "connectivity": [{
9369
+ "path": "connected",
9370
+ "valueType": "boolean"
9371
+ }],
9372
+ "contact": [{
9373
+ "path": "entryOpen",
9374
+ "valueType": "boolean"
9375
+ }],
9376
+ "control": [
9377
+ {
9378
+ "path": "kind",
9379
+ "valueType": "enum",
9380
+ "enumValues": [
9381
+ "numeric",
9382
+ "select",
9383
+ "text",
9384
+ "datetime"
9385
+ ]
9386
+ },
9387
+ {
9388
+ "path": "unit",
9389
+ "valueType": "string"
9390
+ },
9391
+ {
9392
+ "path": "min",
9393
+ "valueType": "number"
9394
+ },
9395
+ {
9396
+ "path": "max",
9397
+ "valueType": "number"
9398
+ },
9399
+ {
9400
+ "path": "step",
9401
+ "valueType": "number"
9402
+ },
9403
+ {
9404
+ "path": "precision",
9405
+ "valueType": "number"
9406
+ },
9407
+ {
9408
+ "path": "format",
9409
+ "valueType": "enum",
9410
+ "enumValues": [
9411
+ "date",
9412
+ "time",
9413
+ "datetime"
9414
+ ]
9415
+ }
9416
+ ],
9417
+ "cover": [
9418
+ {
9419
+ "path": "state",
9420
+ "valueType": "enum",
9421
+ "enumValues": [
9422
+ "open",
9423
+ "opening",
9424
+ "closing",
9425
+ "closed",
9426
+ "stopped"
9427
+ ]
9428
+ },
9429
+ {
9430
+ "path": "position",
9431
+ "valueType": "number"
9432
+ },
9433
+ {
9434
+ "path": "tiltPosition",
9435
+ "valueType": "number"
9436
+ }
9437
+ ],
9438
+ "day-night": [
9439
+ {
9440
+ "path": "mode",
9441
+ "valueType": "enum",
9442
+ "enumValues": [
9443
+ "auto",
9444
+ "day",
9445
+ "night",
9446
+ "schedule"
9447
+ ]
9448
+ },
9449
+ {
9450
+ "path": "sensitivity",
9451
+ "valueType": "number"
9452
+ },
9453
+ {
9454
+ "path": "switchDelaySec",
9455
+ "valueType": "number"
9456
+ }
9457
+ ],
9458
+ "device-adoption": [
9459
+ {
9460
+ "path": "lastDiscoveryAt",
9461
+ "valueType": "number"
9462
+ },
9463
+ {
9464
+ "path": "candidateCount",
9465
+ "valueType": "number"
9466
+ },
9467
+ {
9468
+ "path": "adoptedCount",
9469
+ "valueType": "number"
9470
+ },
9471
+ {
9472
+ "path": "lastError",
9473
+ "valueType": "string"
9474
+ }
9475
+ ],
9476
+ "device-discovery": [{
9477
+ "path": "lastDiscoveryAt",
9478
+ "valueType": "number"
9479
+ }, {
9480
+ "path": "lastError",
9481
+ "valueType": "string"
9482
+ }],
9483
+ "device-export": [
9484
+ {
9485
+ "path": "linkState",
9486
+ "valueType": "enum",
9487
+ "enumValues": [
9488
+ "unlinked",
9489
+ "linked",
9490
+ "error"
9491
+ ]
9492
+ },
9493
+ {
9494
+ "path": "exposedDeviceCount",
9495
+ "valueType": "number"
9496
+ },
9497
+ {
9498
+ "path": "error",
9499
+ "valueType": "string"
9500
+ },
9501
+ {
9502
+ "path": "setup.qr",
9503
+ "valueType": "string"
9504
+ },
9505
+ {
9506
+ "path": "setup.note",
9507
+ "valueType": "string"
9508
+ }
9509
+ ],
9510
+ "device-status": [{
9511
+ "path": "online",
9512
+ "valueType": "boolean"
9513
+ }],
9514
+ "dishwasher": [
9515
+ {
9516
+ "path": "availability",
9517
+ "valueType": "enum",
9518
+ "enumValues": [
9519
+ "available",
9520
+ "offline",
9521
+ "description-missing"
9522
+ ]
9523
+ },
9524
+ {
9525
+ "path": "state",
9526
+ "valueType": "enum",
9527
+ "enumValues": [
9528
+ "idle",
9529
+ "running",
9530
+ "paused",
9531
+ "finished",
9532
+ "error",
9533
+ "unavailable"
9534
+ ]
9535
+ },
9536
+ {
9537
+ "path": "operationState",
9538
+ "valueType": "enum",
9539
+ "enumValues": [
9540
+ "Inactive",
9541
+ "Ready",
9542
+ "DelayedStart",
9543
+ "Run",
9544
+ "Pause",
9545
+ "ActionRequired",
9546
+ "Finished",
9547
+ "Error",
9548
+ "Aborting"
9549
+ ]
9550
+ },
9551
+ {
9552
+ "path": "program",
9553
+ "valueType": "string"
9554
+ },
9555
+ {
9556
+ "path": "selectedProgram",
9557
+ "valueType": "string"
9558
+ },
9559
+ {
9560
+ "path": "remainingSeconds",
9561
+ "valueType": "number"
9562
+ },
9563
+ {
9564
+ "path": "delayedStartSeconds",
9565
+ "valueType": "number"
9566
+ },
9567
+ {
9568
+ "path": "progressPercent",
9569
+ "valueType": "number"
9570
+ },
9571
+ {
9572
+ "path": "doorOpen",
9573
+ "valueType": "boolean"
9574
+ },
9575
+ {
9576
+ "path": "doorLocked",
9577
+ "valueType": "boolean"
9578
+ },
9579
+ {
9580
+ "path": "remoteStartAllowed",
9581
+ "valueType": "boolean"
9582
+ },
9583
+ {
9584
+ "path": "remoteControlActive",
9585
+ "valueType": "boolean"
9586
+ },
9587
+ {
9588
+ "path": "localControlActive",
9589
+ "valueType": "boolean"
9590
+ },
9591
+ {
9592
+ "path": "powerOn",
9593
+ "valueType": "boolean"
9594
+ },
9595
+ {
9596
+ "path": "powerState",
9597
+ "valueType": "string"
9598
+ },
9599
+ {
9600
+ "path": "filterCleaningDue",
9601
+ "valueType": "boolean"
9602
+ },
9603
+ {
9604
+ "path": "machineCareDue",
9605
+ "valueType": "boolean"
9606
+ },
9607
+ {
9608
+ "path": "machineCareRemainingRuns",
9609
+ "valueType": "number"
9610
+ },
9611
+ {
9612
+ "path": "halfLoad",
9613
+ "valueType": "boolean"
9614
+ },
9615
+ {
9616
+ "path": "hygienePlus",
9617
+ "valueType": "boolean"
9618
+ },
9619
+ {
9620
+ "path": "extraDry",
9621
+ "valueType": "boolean"
9622
+ },
9623
+ {
9624
+ "path": "intensiveZone",
9625
+ "valueType": "boolean"
9626
+ },
9627
+ {
9628
+ "path": "varioSpeedPlus",
9629
+ "valueType": "boolean"
9630
+ },
9631
+ {
9632
+ "path": "childLock",
9633
+ "valueType": "boolean"
9634
+ },
9635
+ {
9636
+ "path": "errorCode",
9637
+ "valueType": "number"
9638
+ },
9639
+ {
9640
+ "path": "errorLabel",
9641
+ "valueType": "string"
9642
+ }
9643
+ ],
9644
+ "doorbell": [{
9645
+ "path": "lastPressedAt",
9646
+ "valueType": "number"
9647
+ }, {
9648
+ "path": "pressCountSinceStart",
9649
+ "valueType": "number"
9650
+ }],
9651
+ "enum-sensor": [{
9652
+ "path": "value",
9653
+ "valueType": "string"
9654
+ }, {
9655
+ "path": "format",
9656
+ "valueType": "enum",
9657
+ "enumValues": [
9658
+ "date",
9659
+ "time",
9660
+ "datetime"
9661
+ ]
9662
+ }],
9663
+ "event-emitter": [
9664
+ {
9665
+ "path": "lastEvent.deviceId",
9666
+ "valueType": "number"
9667
+ },
9668
+ {
9669
+ "path": "lastEvent.eventType",
9670
+ "valueType": "string"
9671
+ },
9672
+ {
9673
+ "path": "lastEvent.timestamp",
9674
+ "valueType": "number"
9675
+ },
9676
+ {
9677
+ "path": "lastEvent.seq",
9678
+ "valueType": "number"
9679
+ },
9680
+ {
9681
+ "path": "eventCountSinceStart",
9682
+ "valueType": "number"
9683
+ }
9684
+ ],
9685
+ "fan-control": [
9686
+ {
9687
+ "path": "percentage",
9688
+ "valueType": "number"
9689
+ },
9690
+ {
9691
+ "path": "percentageStep",
9692
+ "valueType": "number"
9693
+ },
9694
+ {
9695
+ "path": "preset",
9696
+ "valueType": "string"
9697
+ },
9698
+ {
9699
+ "path": "direction",
9700
+ "valueType": "enum",
9701
+ "enumValues": ["forward", "reverse"]
9702
+ },
9703
+ {
9704
+ "path": "oscillating",
9705
+ "valueType": "boolean"
9706
+ }
9707
+ ],
9708
+ "feature-probe": [
9709
+ {
9710
+ "path": "deviceType",
9711
+ "valueType": "string"
9712
+ },
9713
+ {
9714
+ "path": "model",
9715
+ "valueType": "string"
9716
+ },
9717
+ {
9718
+ "path": "channelCount",
9719
+ "valueType": "number"
9720
+ },
9721
+ {
9722
+ "path": "lastProbedAt",
9723
+ "valueType": "number"
9724
+ }
9725
+ ],
9726
+ "flood": [{
9727
+ "path": "flooded",
9728
+ "valueType": "boolean"
9729
+ }],
9730
+ "gas": [{
9731
+ "path": "detected",
9732
+ "valueType": "boolean"
9733
+ }],
9734
+ "heating-valve": [{
9735
+ "path": "position",
9736
+ "valueType": "number"
9737
+ }],
9738
+ "humidifier": [
9739
+ {
9740
+ "path": "on",
9741
+ "valueType": "boolean"
9742
+ },
9743
+ {
9744
+ "path": "currentHumidity",
9745
+ "valueType": "number"
9746
+ },
9747
+ {
9748
+ "path": "targetHumidity",
9749
+ "valueType": "number"
9750
+ },
9751
+ {
9752
+ "path": "mode",
9753
+ "valueType": "string"
9754
+ },
9755
+ {
9756
+ "path": "action",
9757
+ "valueType": "string"
9758
+ },
9759
+ {
9760
+ "path": "minHumidity",
9761
+ "valueType": "number"
9762
+ },
9763
+ {
9764
+ "path": "maxHumidity",
9765
+ "valueType": "number"
9766
+ }
9767
+ ],
9768
+ "humidity-sensor": [
9769
+ {
9770
+ "path": "percent",
9771
+ "valueType": "number"
9772
+ },
9773
+ {
9774
+ "path": "unit",
9775
+ "valueType": "string"
9776
+ },
9777
+ {
9778
+ "path": "precision",
9779
+ "valueType": "number"
9780
+ }
9781
+ ],
9782
+ "image": [{
9783
+ "path": "url",
9784
+ "valueType": "string"
9785
+ }, {
9786
+ "path": "lastUpdated",
9787
+ "valueType": "number"
9788
+ }],
9789
+ "image-settings": [
9790
+ {
9791
+ "path": "brightness",
9792
+ "valueType": "number"
9793
+ },
9794
+ {
9795
+ "path": "contrast",
9796
+ "valueType": "number"
9797
+ },
9798
+ {
9799
+ "path": "saturation",
9800
+ "valueType": "number"
9801
+ },
9802
+ {
9803
+ "path": "sharpness",
9804
+ "valueType": "number"
9805
+ },
9806
+ {
9807
+ "path": "mirror",
9808
+ "valueType": "boolean"
9809
+ },
9810
+ {
9811
+ "path": "flip",
9812
+ "valueType": "boolean"
9813
+ },
9814
+ {
9815
+ "path": "rotate",
9816
+ "valueType": "enum",
9817
+ "enumValues": [
9818
+ "0",
9819
+ "90",
9820
+ "180",
9821
+ "270"
9822
+ ]
9823
+ },
9824
+ {
9825
+ "path": "whiteBalance",
9826
+ "valueType": "enum",
9827
+ "enumValues": ["auto", "manual"]
9828
+ },
9829
+ {
9830
+ "path": "warmth",
9831
+ "valueType": "number"
9832
+ },
9833
+ {
9834
+ "path": "exposureMode",
9835
+ "valueType": "enum",
9836
+ "enumValues": ["auto", "manual"]
9837
+ },
9838
+ {
9839
+ "path": "backlightMode",
9840
+ "valueType": "enum",
9841
+ "enumValues": [
9842
+ "off",
9843
+ "blc",
9844
+ "wdr",
9845
+ "hlc"
9846
+ ]
9847
+ }
9848
+ ],
9849
+ "intercom": [
9850
+ {
9851
+ "path": "talking",
9852
+ "valueType": "boolean"
9853
+ },
9854
+ {
9855
+ "path": "lastSessionAt",
9856
+ "valueType": "number"
9857
+ },
9858
+ {
9859
+ "path": "ability.sampleRate",
9860
+ "valueType": "number"
9861
+ },
9862
+ {
9863
+ "path": "ability.duplex",
9864
+ "valueType": "enum",
9865
+ "enumValues": ["half", "full"]
9866
+ },
9867
+ {
9868
+ "path": "ability.maxBacklogMs",
9869
+ "valueType": "number"
9870
+ }
9871
+ ],
9872
+ "lawn-mower-control": [
9873
+ {
9874
+ "path": "activity",
9875
+ "valueType": "enum",
9876
+ "enumValues": [
9877
+ "idle",
9878
+ "mowing",
9879
+ "paused",
9880
+ "docked",
9881
+ "error"
9882
+ ]
9883
+ },
9884
+ {
9885
+ "path": "batteryLevel",
9886
+ "valueType": "number"
9887
+ },
9888
+ {
9889
+ "path": "progressPercent",
9890
+ "valueType": "number"
9891
+ },
9892
+ {
9893
+ "path": "currentCode",
9894
+ "valueType": "number"
9895
+ },
9896
+ {
9897
+ "path": "currentCodeLabel",
9898
+ "valueType": "string"
9899
+ },
9900
+ {
9901
+ "path": "severity",
9902
+ "valueType": "enum",
9903
+ "enumValues": [
9904
+ "info",
9905
+ "warning",
9906
+ "error"
9907
+ ]
9908
+ }
9909
+ ],
9910
+ "lock-control": [{
9911
+ "path": "state",
9912
+ "valueType": "enum",
9913
+ "enumValues": [
9914
+ "locked",
9915
+ "unlocked",
9916
+ "locking",
9917
+ "unlocking",
9918
+ "jammed"
9919
+ ]
9920
+ }],
9921
+ "media-player": [
9922
+ {
9923
+ "path": "state",
9924
+ "valueType": "enum",
9925
+ "enumValues": [
9926
+ "off",
9927
+ "on",
9928
+ "idle",
9929
+ "playing",
9930
+ "paused",
9931
+ "buffering",
9932
+ "standby"
9933
+ ]
9934
+ },
9935
+ {
9936
+ "path": "volumeLevel",
9937
+ "valueType": "number"
9938
+ },
9939
+ {
9940
+ "path": "isMuted",
9941
+ "valueType": "boolean"
9942
+ },
9943
+ {
9944
+ "path": "source",
9945
+ "valueType": "string"
9946
+ },
9947
+ {
9948
+ "path": "currentMedia.type",
9949
+ "valueType": "string"
9950
+ },
9951
+ {
9952
+ "path": "currentMedia.title",
9953
+ "valueType": "string"
9954
+ },
9955
+ {
9956
+ "path": "currentMedia.artist",
9957
+ "valueType": "string"
9958
+ },
9959
+ {
9960
+ "path": "currentMedia.album",
9961
+ "valueType": "string"
9962
+ },
9963
+ {
9964
+ "path": "currentMedia.imageUrl",
9965
+ "valueType": "string"
9966
+ },
9967
+ {
9968
+ "path": "positionMs",
9969
+ "valueType": "number"
9970
+ },
9971
+ {
9972
+ "path": "durationMs",
9973
+ "valueType": "number"
9974
+ },
9975
+ {
9976
+ "path": "shuffle",
9977
+ "valueType": "boolean"
9978
+ },
9979
+ {
9980
+ "path": "repeat",
9981
+ "valueType": "enum",
9982
+ "enumValues": [
9983
+ "off",
9984
+ "all",
9985
+ "one"
9986
+ ]
9987
+ }
9988
+ ],
9989
+ "motion": [
9990
+ {
9991
+ "path": "detected",
9992
+ "valueType": "boolean"
9993
+ },
9994
+ {
9995
+ "path": "lastDetectedAt",
9996
+ "valueType": "number"
9997
+ },
9998
+ {
9999
+ "path": "autoClearAfterMs",
10000
+ "valueType": "number"
10001
+ }
10002
+ ],
10003
+ "motion-trigger": [{
10004
+ "path": "enabled",
10005
+ "valueType": "boolean"
10006
+ }],
10007
+ "motion-zones": [{
10008
+ "path": "enabled",
10009
+ "valueType": "boolean"
10010
+ }, {
10011
+ "path": "sensitivity",
10012
+ "valueType": "number"
10013
+ }],
10014
+ "mqtt-broker": [{
10015
+ "path": "brokerCount",
10016
+ "valueType": "number"
10017
+ }, {
10018
+ "path": "embeddedRunning",
10019
+ "valueType": "boolean"
10020
+ }],
10021
+ "native-object-detection": [{
10022
+ "path": "enabled",
10023
+ "valueType": "boolean"
10024
+ }],
10025
+ "navigation": [
10026
+ {
10027
+ "path": "mode",
10028
+ "valueType": "enum",
10029
+ "enumValues": [
10030
+ "idle",
10031
+ "cleaning",
10032
+ "spot",
10033
+ "following",
10034
+ "goto",
10035
+ "returning",
10036
+ "paused",
10037
+ "unknown"
10038
+ ]
10039
+ },
10040
+ {
10041
+ "path": "following",
10042
+ "valueType": "boolean"
10043
+ },
10044
+ {
10045
+ "path": "flash",
10046
+ "valueType": "boolean"
10047
+ },
10048
+ {
10049
+ "path": "lightMode",
10050
+ "valueType": "enum",
10051
+ "enumValues": ["auto", "manual"]
10052
+ },
10053
+ {
10054
+ "path": "lightLevel",
10055
+ "valueType": "number"
10056
+ }
10057
+ ],
10058
+ "network-link": [
10059
+ {
10060
+ "path": "type",
10061
+ "valueType": "enum",
10062
+ "enumValues": [
10063
+ "wifi",
10064
+ "ethernet",
10065
+ "cellular",
10066
+ "unknown"
10067
+ ]
10068
+ },
10069
+ {
10070
+ "path": "signalPercent",
10071
+ "valueType": "number"
10072
+ },
10073
+ {
10074
+ "path": "rssiDbm",
10075
+ "valueType": "number"
10076
+ },
10077
+ {
10078
+ "path": "ssid",
10079
+ "valueType": "string"
10080
+ },
10081
+ {
10082
+ "path": "lastUpdated",
10083
+ "valueType": "number"
10084
+ }
10085
+ ],
10086
+ "notifier": [
10087
+ {
10088
+ "path": "lastSentAt",
10089
+ "valueType": "number"
10090
+ },
10091
+ {
10092
+ "path": "lastError",
10093
+ "valueType": "string"
10094
+ },
10095
+ {
10096
+ "path": "queueDepth",
10097
+ "valueType": "number"
10098
+ },
10099
+ {
10100
+ "path": "supports.image",
10101
+ "valueType": "boolean"
10102
+ },
10103
+ {
10104
+ "path": "supports.priority",
10105
+ "valueType": "boolean"
10106
+ },
10107
+ {
10108
+ "path": "supports.data",
10109
+ "valueType": "boolean"
10110
+ },
10111
+ {
10112
+ "path": "supports.actions",
10113
+ "valueType": "boolean"
10114
+ },
10115
+ {
10116
+ "path": "supports.recipients",
10117
+ "valueType": "boolean"
10118
+ }
10119
+ ],
10120
+ "numeric-sensor": [
10121
+ {
10122
+ "path": "value",
10123
+ "valueType": "number"
10124
+ },
10125
+ {
10126
+ "path": "unit",
10127
+ "valueType": "string"
10128
+ },
10129
+ {
10130
+ "path": "precision",
10131
+ "valueType": "number"
10132
+ }
10133
+ ],
10134
+ "pet-feeder": [
10135
+ {
10136
+ "path": "foodLevel",
10137
+ "valueType": "number"
10138
+ },
10139
+ {
10140
+ "path": "food1",
10141
+ "valueType": "number"
10142
+ },
10143
+ {
10144
+ "path": "food2",
10145
+ "valueType": "number"
10146
+ },
10147
+ {
10148
+ "path": "lowFood",
10149
+ "valueType": "boolean"
10150
+ },
10151
+ {
10152
+ "path": "batteryPower",
10153
+ "valueType": "number"
10154
+ },
10155
+ {
10156
+ "path": "desiccantLeftDays",
10157
+ "valueType": "number"
10158
+ },
10159
+ {
10160
+ "path": "feeding",
10161
+ "valueType": "boolean"
10162
+ },
10163
+ {
10164
+ "path": "status",
10165
+ "valueType": "enum",
10166
+ "enumValues": [
10167
+ "normal",
10168
+ "offline",
10169
+ "on_batteries"
10170
+ ]
10171
+ },
10172
+ {
10173
+ "path": "error",
10174
+ "valueType": "string"
10175
+ },
10176
+ {
10177
+ "path": "errorCode",
10178
+ "valueType": "number"
10179
+ },
10180
+ {
10181
+ "path": "isDualHopper",
10182
+ "valueType": "boolean"
10183
+ },
10184
+ {
10185
+ "path": "childLock",
10186
+ "valueType": "boolean"
10187
+ },
10188
+ {
10189
+ "path": "indicatorLight",
10190
+ "valueType": "boolean"
10191
+ },
10192
+ {
10193
+ "path": "feedSound",
10194
+ "valueType": "boolean"
10195
+ },
10196
+ {
10197
+ "path": "volume",
10198
+ "valueType": "number"
10199
+ }
10200
+ ],
10201
+ "power-meter": [
10202
+ {
10203
+ "path": "watts",
10204
+ "valueType": "number"
10205
+ },
10206
+ {
10207
+ "path": "kwhTotal",
10208
+ "valueType": "number"
10209
+ },
10210
+ {
10211
+ "path": "volts",
10212
+ "valueType": "number"
10213
+ },
10214
+ {
10215
+ "path": "amps",
10216
+ "valueType": "number"
10217
+ },
10218
+ {
10219
+ "path": "va",
10220
+ "valueType": "number"
10221
+ },
10222
+ {
10223
+ "path": "powerFactor",
10224
+ "valueType": "number"
10225
+ },
10226
+ {
10227
+ "path": "unit",
10228
+ "valueType": "string"
10229
+ },
10230
+ {
10231
+ "path": "precision",
10232
+ "valueType": "number"
10233
+ }
10234
+ ],
10235
+ "presence": [
10236
+ {
10237
+ "path": "state",
10238
+ "valueType": "string"
10239
+ },
10240
+ {
10241
+ "path": "location",
10242
+ "valueType": "string"
10243
+ },
10244
+ {
10245
+ "path": "gps.latitude",
10246
+ "valueType": "number"
10247
+ },
10248
+ {
10249
+ "path": "gps.longitude",
10250
+ "valueType": "number"
10251
+ },
10252
+ {
10253
+ "path": "gps.accuracyMeters",
10254
+ "valueType": "number"
10255
+ },
10256
+ {
10257
+ "path": "batteryPercent",
10258
+ "valueType": "number"
10259
+ }
10260
+ ],
10261
+ "pressure-sensor": [
10262
+ {
10263
+ "path": "hpa",
10264
+ "valueType": "number"
10265
+ },
10266
+ {
10267
+ "path": "unit",
10268
+ "valueType": "string"
10269
+ },
10270
+ {
10271
+ "path": "precision",
10272
+ "valueType": "number"
10273
+ }
10274
+ ],
10275
+ "privacy-mask": [{
10276
+ "path": "enabled",
10277
+ "valueType": "boolean"
10278
+ }, {
10279
+ "path": "audioEnabled",
10280
+ "valueType": "boolean"
10281
+ }],
10282
+ "ptz": [
10283
+ {
10284
+ "path": "pan",
10285
+ "valueType": "number"
10286
+ },
10287
+ {
10288
+ "path": "tilt",
10289
+ "valueType": "number"
10290
+ },
10291
+ {
10292
+ "path": "zoom",
10293
+ "valueType": "number"
10294
+ },
10295
+ {
10296
+ "path": "autofocus",
10297
+ "valueType": "boolean"
10298
+ }
10299
+ ],
10300
+ "ptz-autotrack": [
10301
+ {
10302
+ "path": "enabled",
10303
+ "valueType": "boolean"
10304
+ },
10305
+ {
10306
+ "path": "currentSettings.targetType",
10307
+ "valueType": "string"
10308
+ },
10309
+ {
10310
+ "path": "currentSettings.stopDelaySeconds",
10311
+ "valueType": "number"
10312
+ },
10313
+ {
10314
+ "path": "currentSettings.disappearDelaySeconds",
10315
+ "valueType": "number"
10316
+ }
10317
+ ],
10318
+ "recording-archive": [
10319
+ {
10320
+ "path": "deviceId",
10321
+ "valueType": "number"
10322
+ },
10323
+ {
10324
+ "path": "enabled",
10325
+ "valueType": "boolean"
10326
+ },
10327
+ {
10328
+ "path": "activeMode",
10329
+ "valueType": "enum",
10330
+ "enumValues": [
10331
+ "off",
10332
+ "events",
10333
+ "continuous",
10334
+ "on-device-decision"
10335
+ ]
10336
+ },
10337
+ {
10338
+ "path": "nodeId",
10339
+ "valueType": "string"
10340
+ },
10341
+ {
10342
+ "path": "storageBytes",
10343
+ "valueType": "number"
10344
+ }
10345
+ ],
10346
+ "recording-onboard": [
10347
+ {
10348
+ "path": "primaryTrackId",
10349
+ "valueType": "string"
10350
+ },
10351
+ {
10352
+ "path": "enabled",
10353
+ "valueType": "boolean"
10354
+ },
10355
+ {
10356
+ "path": "overwriteWhenFull",
10357
+ "valueType": "boolean"
10358
+ },
10359
+ {
10360
+ "path": "preRecordSec",
10361
+ "valueType": "number"
10362
+ },
10363
+ {
10364
+ "path": "postRecordSec",
10365
+ "valueType": "number"
10366
+ },
10367
+ {
10368
+ "path": "segmentMinutes",
10369
+ "valueType": "number"
10370
+ },
10371
+ {
10372
+ "path": "unreadableWindows",
10373
+ "valueType": "number"
10374
+ },
10375
+ {
10376
+ "path": "recordingToNowhere",
10377
+ "valueType": "boolean"
10378
+ }
10379
+ ],
10380
+ "recording-signal": [{
10381
+ "path": "active",
10382
+ "valueType": "boolean"
10383
+ }, {
10384
+ "path": "reason",
10385
+ "valueType": "string"
10386
+ }],
10387
+ "running-state": [
10388
+ {
10389
+ "path": "running",
10390
+ "valueType": "boolean"
10391
+ },
10392
+ {
10393
+ "path": "since",
10394
+ "valueType": "number"
10395
+ },
10396
+ {
10397
+ "path": "source",
10398
+ "valueType": "enum",
10399
+ "enumValues": ["native", "assigned"]
10400
+ },
10401
+ {
10402
+ "path": "phase",
10403
+ "valueType": "string"
10404
+ }
10405
+ ],
10406
+ "script-runner": [
10407
+ {
10408
+ "path": "isRunning",
10409
+ "valueType": "boolean"
10410
+ },
10411
+ {
10412
+ "path": "lastRunAt",
10413
+ "valueType": "number"
10414
+ },
10415
+ {
10416
+ "path": "lastRunSuccess",
10417
+ "valueType": "boolean"
10418
+ },
10419
+ {
10420
+ "path": "lastError",
10421
+ "valueType": "string"
10422
+ }
10423
+ ],
10424
+ "smoke": [{
10425
+ "path": "detected",
10426
+ "valueType": "boolean"
10427
+ }],
10428
+ "snapshot": [
10429
+ {
10430
+ "path": "lastCapturedAt",
10431
+ "valueType": "number"
10432
+ },
10433
+ {
10434
+ "path": "cacheAgeMs",
10435
+ "valueType": "number"
10436
+ },
10437
+ {
10438
+ "path": "lastBytes",
10439
+ "valueType": "number"
10440
+ },
10441
+ {
10442
+ "path": "lastStreamId",
10443
+ "valueType": "string"
10444
+ }
10445
+ ],
10446
+ "stream-params": [
10447
+ {
10448
+ "path": "main.width",
10449
+ "valueType": "number"
10450
+ },
10451
+ {
10452
+ "path": "main.height",
10453
+ "valueType": "number"
10454
+ },
10455
+ {
10456
+ "path": "main.codec",
10457
+ "valueType": "enum",
10458
+ "enumValues": ["h264", "h265"]
10459
+ },
10460
+ {
10461
+ "path": "main.framerate",
10462
+ "valueType": "number"
10463
+ },
10464
+ {
10465
+ "path": "main.bitrate",
10466
+ "valueType": "number"
10467
+ },
10468
+ {
10469
+ "path": "main.bitrateMode",
10470
+ "valueType": "enum",
10471
+ "enumValues": ["vbr", "cbr"]
10472
+ },
10473
+ {
10474
+ "path": "main.encoderProfile",
10475
+ "valueType": "enum",
10476
+ "enumValues": [
10477
+ "high",
10478
+ "main",
10479
+ "baseline"
10480
+ ]
10481
+ },
10482
+ {
10483
+ "path": "main.gop",
10484
+ "valueType": "number"
10485
+ },
10486
+ {
10487
+ "path": "main.audio",
10488
+ "valueType": "boolean"
10489
+ },
10490
+ {
10491
+ "path": "sub.width",
10492
+ "valueType": "number"
10493
+ },
10494
+ {
10495
+ "path": "sub.height",
10496
+ "valueType": "number"
10497
+ },
10498
+ {
10499
+ "path": "sub.codec",
10500
+ "valueType": "enum",
10501
+ "enumValues": ["h264", "h265"]
10502
+ },
10503
+ {
10504
+ "path": "sub.framerate",
10505
+ "valueType": "number"
10506
+ },
10507
+ {
10508
+ "path": "sub.bitrate",
10509
+ "valueType": "number"
10510
+ },
10511
+ {
10512
+ "path": "sub.bitrateMode",
10513
+ "valueType": "enum",
10514
+ "enumValues": ["vbr", "cbr"]
10515
+ },
10516
+ {
10517
+ "path": "sub.encoderProfile",
10518
+ "valueType": "enum",
10519
+ "enumValues": [
10520
+ "high",
10521
+ "main",
10522
+ "baseline"
10523
+ ]
10524
+ },
10525
+ {
10526
+ "path": "sub.gop",
10527
+ "valueType": "number"
10528
+ },
10529
+ {
10530
+ "path": "sub.audio",
10531
+ "valueType": "boolean"
10532
+ },
10533
+ {
10534
+ "path": "ext.width",
10535
+ "valueType": "number"
10536
+ },
10537
+ {
10538
+ "path": "ext.height",
10539
+ "valueType": "number"
10540
+ },
10541
+ {
10542
+ "path": "ext.codec",
10543
+ "valueType": "enum",
10544
+ "enumValues": ["h264", "h265"]
10545
+ },
10546
+ {
10547
+ "path": "ext.framerate",
10548
+ "valueType": "number"
10549
+ },
10550
+ {
10551
+ "path": "ext.bitrate",
10552
+ "valueType": "number"
10553
+ },
10554
+ {
10555
+ "path": "ext.bitrateMode",
10556
+ "valueType": "enum",
10557
+ "enumValues": ["vbr", "cbr"]
10558
+ },
10559
+ {
10560
+ "path": "ext.encoderProfile",
10561
+ "valueType": "enum",
10562
+ "enumValues": [
10563
+ "high",
10564
+ "main",
10565
+ "baseline"
10566
+ ]
10567
+ },
10568
+ {
10569
+ "path": "ext.gop",
10570
+ "valueType": "number"
10571
+ },
10572
+ {
10573
+ "path": "ext.audio",
10574
+ "valueType": "boolean"
10575
+ }
10576
+ ],
10577
+ "switch": [{
10578
+ "path": "on",
10579
+ "valueType": "boolean"
10580
+ }],
10581
+ "tamper": [{
10582
+ "path": "tampered",
10583
+ "valueType": "boolean"
10584
+ }],
10585
+ "temperature-sensor": [
10586
+ {
10587
+ "path": "celsius",
10588
+ "valueType": "number"
10589
+ },
10590
+ {
10591
+ "path": "unit",
10592
+ "valueType": "string"
10593
+ },
10594
+ {
10595
+ "path": "precision",
10596
+ "valueType": "number"
10597
+ }
10598
+ ],
10599
+ "update": [
10600
+ {
10601
+ "path": "currentVersion",
10602
+ "valueType": "string"
10603
+ },
10604
+ {
10605
+ "path": "availableVersion",
10606
+ "valueType": "string"
10607
+ },
10608
+ {
10609
+ "path": "updatable",
10610
+ "valueType": "boolean"
10611
+ },
10612
+ {
10613
+ "path": "state",
10614
+ "valueType": "string"
10615
+ },
10616
+ {
10617
+ "path": "inProgress",
10618
+ "valueType": "boolean"
10619
+ }
10620
+ ],
10621
+ "vacuum-control": [
10622
+ {
10623
+ "path": "state",
10624
+ "valueType": "enum",
10625
+ "enumValues": [
10626
+ "idle",
10627
+ "cleaning",
10628
+ "paused",
10629
+ "returning",
10630
+ "docked",
10631
+ "drying",
10632
+ "error"
10633
+ ]
10634
+ },
10635
+ {
10636
+ "path": "batteryLevel",
10637
+ "valueType": "number"
10638
+ },
10639
+ {
10640
+ "path": "fanSpeed",
10641
+ "valueType": "string"
10642
+ },
10643
+ {
10644
+ "path": "progressPercent",
10645
+ "valueType": "number"
10646
+ },
10647
+ {
10648
+ "path": "errorCode",
10649
+ "valueType": "number"
10650
+ },
10651
+ {
10652
+ "path": "errorLabel",
10653
+ "valueType": "string"
10654
+ }
10655
+ ],
10656
+ "valve": [{
10657
+ "path": "state",
10658
+ "valueType": "enum",
10659
+ "enumValues": [
10660
+ "open",
10661
+ "opening",
10662
+ "closing",
10663
+ "closed",
10664
+ "stopped"
10665
+ ]
10666
+ }, {
10667
+ "path": "position",
10668
+ "valueType": "number"
10669
+ }],
10670
+ "vibration": [{
10671
+ "path": "detected",
10672
+ "valueType": "boolean"
10673
+ }],
10674
+ "water-heater": [
10675
+ {
10676
+ "path": "currentTemp",
10677
+ "valueType": "number"
10678
+ },
10679
+ {
10680
+ "path": "targetTemp",
10681
+ "valueType": "number"
10682
+ },
10683
+ {
10684
+ "path": "operationMode",
10685
+ "valueType": "string"
10686
+ },
10687
+ {
10688
+ "path": "away",
10689
+ "valueType": "boolean"
10690
+ },
10691
+ {
10692
+ "path": "minTemp",
10693
+ "valueType": "number"
10694
+ },
10695
+ {
10696
+ "path": "maxTemp",
10697
+ "valueType": "number"
10698
+ }
10699
+ ],
10700
+ "weather": [
10701
+ {
10702
+ "path": "condition",
10703
+ "valueType": "string"
10704
+ },
10705
+ {
10706
+ "path": "temperature",
10707
+ "valueType": "number"
10708
+ },
10709
+ {
10710
+ "path": "temperatureUnit",
10711
+ "valueType": "string"
10712
+ },
10713
+ {
10714
+ "path": "humidity",
10715
+ "valueType": "number"
10716
+ },
10717
+ {
10718
+ "path": "pressure",
10719
+ "valueType": "number"
10720
+ },
10721
+ {
10722
+ "path": "pressureUnit",
10723
+ "valueType": "string"
10724
+ },
10725
+ {
10726
+ "path": "windSpeed",
10727
+ "valueType": "number"
10728
+ },
10729
+ {
10730
+ "path": "windSpeedUnit",
10731
+ "valueType": "string"
10732
+ },
10733
+ {
10734
+ "path": "windBearing",
10735
+ "valueType": "number"
10736
+ }
10737
+ ],
10738
+ "zone-analytics": [
10739
+ {
10740
+ "path": "ts",
10741
+ "valueType": "number"
10742
+ },
10743
+ {
10744
+ "path": "frameWidth",
10745
+ "valueType": "number"
10746
+ },
10747
+ {
10748
+ "path": "frameHeight",
10749
+ "valueType": "number"
10750
+ },
10751
+ {
10752
+ "path": "frame.totalObjects",
10753
+ "valueType": "number"
10754
+ },
10755
+ {
10756
+ "path": "frame.standingObjects",
10757
+ "valueType": "number"
10758
+ },
10759
+ {
10760
+ "path": "frame.transientObjects",
10761
+ "valueType": "number"
10762
+ },
10763
+ {
10764
+ "path": "unzoned.totalObjects",
10765
+ "valueType": "number"
10766
+ },
10767
+ {
10768
+ "path": "unzoned.standingObjects",
10769
+ "valueType": "number"
10770
+ },
10771
+ {
10772
+ "path": "unzoned.transientObjects",
10773
+ "valueType": "number"
10774
+ }
10775
+ ]
10776
+ });
8803
10777
  object({
8804
10778
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8805
10779
  params: record(string(), union([string(), number()])).optional()
@@ -9148,7 +11122,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
9148
11122
  return DeviceRole;
9149
11123
  }({});
9150
11124
  //#endregion
9151
- //#region ../types/dist/composition-BJ8iAZb3.mjs
11125
+ //#region ../types/dist/composition-kEl9mevu.mjs
9152
11126
  /**
9153
11127
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9154
11128
  *
@@ -12381,7 +14355,7 @@ var LogChannelDescriptorSchema = object({
12381
14355
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12382
14356
  * consulted with the numeric device id, AND every line the channel admits
12383
14357
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12384
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14358
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12385
14359
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12386
14360
  * the body is the only way to filter.
12387
14361
  *
@@ -12569,7 +14543,7 @@ var ModelVariantGroupSchema = object({
12569
14543
  precision: _enum(["fp32", "int8"]).optional(),
12570
14544
  /**
12571
14545
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12572
- * an alternate training of the same family (Scrypted `relu_test`); chip
14546
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12573
14547
  * label is "Test".
12574
14548
  */
12575
14549
  optimization: _enum(["standard", "test"]).optional(),
@@ -12821,8 +14795,8 @@ var ModelCatalogEntrySchema = object({
12821
14795
  provider: ModelProviderIdSchema.optional(),
12822
14796
  /**
12823
14797
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12824
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12825
- * labels already ARE the CamStack macros (Scrypted identity map).
14798
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14799
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12826
14800
  */
12827
14801
  classMap: DetectionCatalogClassMapSchema.optional(),
12828
14802
  /**
@@ -15808,7 +17782,7 @@ method(object({
15808
17782
  * `1` is real time and is the ONLY value that allows the copy branch —
15809
17783
  * anything else forces `libx264` over the window. That was priced
15810
17784
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15811
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17785
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15812
17786
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15813
17787
  * once the decode is forced the width stops being free.
15814
17788
  */
@@ -16228,6 +18202,7 @@ var CompositionRunStatusSchema = _enum([
16228
18202
  "starting",
16229
18203
  "running",
16230
18204
  "degraded",
18205
+ "incomplete",
16231
18206
  "failed"
16232
18207
  ]);
16233
18208
  var CompositionFieldStateKindSchema = _enum([
@@ -16277,6 +18252,13 @@ var ComposerUnreadableBlockSchema = object({
16277
18252
  /** The parse error, in the operator's words. */
16278
18253
  error: string()
16279
18254
  });
18255
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
18256
+ var UnreleasedClaimSchema = object({
18257
+ deviceId: number().int(),
18258
+ capName: string(),
18259
+ owner: string(),
18260
+ error: string()
18261
+ });
16280
18262
  method(object({
16281
18263
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16282
18264
  integrationId: string().nullable(),
@@ -16286,7 +18268,13 @@ method(object({
16286
18268
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16287
18269
  restartBlockIds: array(string()),
16288
18270
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16289
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
18271
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
18272
+ /**
18273
+ * Operator-confirmed deletions. Their claims are released on this apply,
18274
+ * before any replacement block claims. A block that merely vanished from the
18275
+ * snapshot is not listed here and still waits for two applies (D49).
18276
+ */
18277
+ retiredBlockIds: array(string()).optional()
16290
18278
  }), object({
16291
18279
  blocks: array(object({
16292
18280
  blockId: string(),
@@ -16298,7 +18286,13 @@ method(object({
16298
18286
  * integration unknown, its own rows unread or read empty once). An empty
16299
18287
  * apply the caller owes is paid off only by one the composer acted on (D49).
16300
18288
  */
16301
- acted: boolean()
18289
+ acted: boolean(),
18290
+ /**
18291
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
18292
+ * every one landed (or there was nothing to hand back). Absent on a result
18293
+ * that never got that far.
18294
+ */
18295
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16302
18296
  }), {
16303
18297
  kind: "mutation",
16304
18298
  auth: "admin"
@@ -16422,6 +18416,7 @@ var CoreBlockStatusSchema = _enum([
16422
18416
  "starting",
16423
18417
  "running",
16424
18418
  "degraded",
18419
+ "incomplete",
16425
18420
  "failed"
16426
18421
  ]);
16427
18422
  /** path → TypeScript source for a multi-file block. */
@@ -38345,7 +40340,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38345
40340
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38346
40341
  * operator's casing. The registry matches labels trimmed + case-insensitively
38347
40342
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38348
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40343
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38349
40344
  * map keyed on the displayed casing would orphan its entry on exactly that
38350
40345
  * edit. Consumers join by keying their own label through `locationIconKey`.
38351
40346
  */
@@ -38370,7 +40365,7 @@ var LocationDescriptionAssignmentSchema = object({
38370
40365
  /**
38371
40366
  * A SITE ZONE — a named part of the property that several locations belong to.
38372
40367
  *
38373
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40368
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38374
40369
  * kitchen. A camera belongs to exactly one location, and a location to at most
38375
40370
  * one zone, so a camera's zone is derived and never stored on the device: the
38376
40371
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38399,7 +40394,7 @@ var LocationDescriptionAssignmentSchema = object({
38399
40394
  * the locations inside it.
38400
40395
  *
38401
40396
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38402
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40397
+ * a surface must show "Night zone", not "night zone". Locations are carried
38403
40398
  * here, rather than left to a second call, because every consumer wants both
38404
40399
  * at once and a viewer that asked twice could render a zone whose membership
38405
40400
  * it has not fetched yet.
@@ -40512,8 +42507,8 @@ var LoadContributionSchema = object({
40512
42507
  "unattributable"
40513
42508
  ]),
40514
42509
  /**
40515
- * What ONE entry is, in the contributor's own words — `615/high`,
40516
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42510
+ * What ONE entry is, in the contributor's own words — `101/high`,
42511
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40517
42512
  * family and inventing a common one would lose the only information that
40518
42513
  * makes two entries for the same camera distinguishable.
40519
42514
  */
@@ -42161,6 +44156,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42161
44156
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42162
44157
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42163
44158
  /**
44159
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
44160
+ * not entries. `heatmapScrub` is a mark, not an event kind.
44161
+ */
44162
+ var PALETTE_ENTRY_IDS = [
44163
+ "motion",
44164
+ "audio",
44165
+ "recording",
44166
+ "live",
44167
+ "heatmapScrub",
44168
+ "person",
44169
+ "vehicle",
44170
+ "animal",
44171
+ "package",
44172
+ "sensor",
44173
+ "control",
44174
+ "face",
44175
+ "plate",
44176
+ "car",
44177
+ "truck",
44178
+ "bus",
44179
+ "motorcycle",
44180
+ "bicycle",
44181
+ "airplane",
44182
+ "boat",
44183
+ "train",
44184
+ "bird",
44185
+ "dog",
44186
+ "cat",
44187
+ "horse",
44188
+ "sheep",
44189
+ "cow",
44190
+ "elephant",
44191
+ "bear",
44192
+ "zebra",
44193
+ "giraffe",
44194
+ "package-delivered",
44195
+ "package-picked-up",
44196
+ "suitcase",
44197
+ "backpack",
44198
+ "handbag",
44199
+ "contact",
44200
+ "motion-sensor",
44201
+ "smoke",
44202
+ "flood",
44203
+ "gas",
44204
+ "carbon-monoxide",
44205
+ "vibration",
44206
+ "tamper",
44207
+ "presence",
44208
+ "enum-sensor",
44209
+ "device-event",
44210
+ "lock",
44211
+ "cover",
44212
+ "switch",
44213
+ "siren",
44214
+ "button",
44215
+ "doorbell"
44216
+ ];
44217
+ var AUDIO_ENTRY_ID = "audio";
44218
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
44219
+ var AUDIO_GRADIENT_ALPHAS = [
44220
+ .3,
44221
+ .42,
44222
+ .55,
44223
+ .7,
44224
+ .85,
44225
+ 1
44226
+ ];
44227
+ var PALETTE_PRESET_IDS = [
44228
+ "camstack",
44229
+ "high-contrast",
44230
+ "okabe-ito"
44231
+ ];
44232
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
44233
+ var CAMSTACK_HEX = {
44234
+ motion: "#d946ef",
44235
+ audio: "#059eb8",
44236
+ recording: "#ef4444",
44237
+ live: "#8d7a00",
44238
+ heatmapScrub: "#4b32ff",
44239
+ person: "#11a64c",
44240
+ vehicle: "#3b82f6",
44241
+ animal: "#ea6a09",
44242
+ package: "#924667",
44243
+ sensor: "#624bbc",
44244
+ control: "#944d24",
44245
+ face: "#ed4f8d",
44246
+ plate: "#4b7027",
44247
+ car: "#9684cf",
44248
+ truck: "#0f9b89",
44249
+ bus: "#a734a9",
44250
+ motorcycle: "#c1133a",
44251
+ bicycle: "#0e6a9b",
44252
+ airplane: "#7c9928",
44253
+ boat: "#b17933",
44254
+ train: "#ad6ca3",
44255
+ bird: "#0f7c55",
44256
+ dog: "#c82700",
44257
+ cat: "#7268f2",
44258
+ horse: "#cb795e",
44259
+ sheep: "#b8636b",
44260
+ cow: "#cb2969",
44261
+ elephant: "#1158d2",
44262
+ bear: "#8d5e00",
44263
+ zebra: "#0097d6",
44264
+ giraffe: "#8f61bb",
44265
+ "package-delivered": "#cd3f9b",
44266
+ "package-picked-up": "#388a08",
44267
+ suitcase: "#666800",
44268
+ backpack: "#ec5022",
44269
+ handbag: "#a76ef8",
44270
+ contact: "#ab5a49",
44271
+ "motion-sensor": "#b95d1a",
44272
+ smoke: "#dd3858",
44273
+ flood: "#b31e7d",
44274
+ gas: "#5b70b5",
44275
+ "carbon-monoxide": "#7b4e8e",
44276
+ vibration: "#e65bba",
44277
+ tamper: "#98464b",
44278
+ presence: "#3a9468",
44279
+ "enum-sensor": "#7885f8",
44280
+ "device-event": "#8c43c8",
44281
+ lock: "#649653",
44282
+ cover: "#c67597",
44283
+ switch: "#7a812a",
44284
+ siren: "#ac5d7f",
44285
+ button: "#b276cd",
44286
+ doorbell: "#0087ab"
44287
+ };
44288
+ var CAMSTACK_FALLBACK = [
44289
+ "#b34dc7",
44290
+ "#1d7d34",
44291
+ "#db6b6c",
44292
+ "#a43d29",
44293
+ "#0e6ee6",
44294
+ "#29a10b",
44295
+ "#a98731",
44296
+ "#0181c6"
44297
+ ];
44298
+ var HIGH_CONTRAST_HEX = {
44299
+ motion: "#964360",
44300
+ audio: "#23a132",
44301
+ recording: "#2494ca",
44302
+ live: "#bd7e2b",
44303
+ heatmapScrub: "#ad6eea",
44304
+ person: "#62611e",
44305
+ vehicle: "#f4534c",
44306
+ animal: "#1556cd",
44307
+ package: "#9c4415",
44308
+ sensor: "#066c48",
44309
+ control: "#f2479f",
44310
+ face: "#139d8a",
44311
+ plate: "#909024",
44312
+ car: "#8e35ab",
44313
+ truck: "#bd0b2b",
44314
+ bus: "#7a88ca",
44315
+ motorcycle: "#e26725",
44316
+ bicycle: "#a6679b",
44317
+ airplane: "#7c5720",
44318
+ boat: "#467a1b",
44319
+ train: "#6f65a4",
44320
+ bird: "#cb717f",
44321
+ dog: "#c62490",
44322
+ cat: "#b36850",
44323
+ horse: "#1872ac",
44324
+ sheep: "#927939",
44325
+ cow: "#428a5c",
44326
+ elephant: "#d41160",
44327
+ bear: "#799453",
44328
+ zebra: "#a85455",
44329
+ giraffe: "#746be8",
44330
+ "package-delivered": "#824a80",
44331
+ "package-picked-up": "#614ac1",
44332
+ suitcase: "#2f77f3",
44333
+ backpack: "#fa476d",
44334
+ handbag: "#c14cbe",
44335
+ contact: "#c83921",
44336
+ "motion-sensor": "#a07ebd",
44337
+ smoke: "#a25b13",
44338
+ flood: "#526bab",
44339
+ gas: "#924938",
44340
+ "carbon-monoxide": "#bb7e53",
44341
+ vibration: "#b66182",
44342
+ tamper: "#3c6931",
44343
+ presence: "#6c851d",
44344
+ "enum-sensor": "#ad2d48",
44345
+ "device-event": "#5e9b04",
44346
+ lock: "#00a062",
44347
+ cover: "#ad8624",
44348
+ switch: "#d05259",
44349
+ siren: "#cd67b3",
44350
+ button: "#c9746a",
44351
+ doorbell: "#338eeb"
44352
+ };
44353
+ var HIGH_CONTRAST_FALLBACK = [
44354
+ "#817f3b",
44355
+ "#a0733e",
44356
+ "#8658b2",
44357
+ "#956301",
44358
+ "#bc652d",
44359
+ "#647331",
44360
+ "#a14c9e",
44361
+ "#d14e71"
44362
+ ];
44363
+ var OKABE_ITO_HEX = {
44364
+ motion: "#b88128",
44365
+ audio: "#1096c8",
44366
+ recording: "#009e73",
44367
+ live: "#9c8c22",
44368
+ heatmapScrub: "#0072b2",
44369
+ person: "#d55e00",
44370
+ vehicle: "#c0739f",
44371
+ animal: "#226d18",
44372
+ package: "#91446c",
44373
+ sensor: "#217b56",
44374
+ control: "#648647",
44375
+ face: "#c22998",
44376
+ plate: "#fa4575",
44377
+ car: "#956301",
44378
+ truck: "#2f77f3",
44379
+ bus: "#7a4e86",
44380
+ motorcycle: "#f54597",
44381
+ bicycle: "#bb3e75",
44382
+ airplane: "#e054c0",
44383
+ boat: "#457942",
44384
+ train: "#867afa",
44385
+ bird: "#88914c",
44386
+ dog: "#1556cd",
44387
+ cat: "#71702c",
44388
+ horse: "#9b4fa4",
44389
+ sheep: "#c0559d",
44390
+ cow: "#d14f65",
44391
+ elephant: "#98470f",
44392
+ bear: "#595896",
44393
+ zebra: "#96790e",
44394
+ giraffe: "#cb717b",
44395
+ "package-delivered": "#139d8a",
44396
+ "package-picked-up": "#906ead",
44397
+ suitcase: "#d02939",
44398
+ backpack: "#d41160",
44399
+ handbag: "#f64f54",
44400
+ contact: "#7258d2",
44401
+ "motion-sensor": "#b66182",
44402
+ smoke: "#627abb",
44403
+ flood: "#b86ae4",
44404
+ gas: "#a95261",
44405
+ "carbon-monoxide": "#c65d3c",
44406
+ vibration: "#7a40b7",
44407
+ tamper: "#914b34",
44408
+ presence: "#9481c3",
44409
+ "enum-sensor": "#ac6d47",
44410
+ "device-event": "#7b6fce",
44411
+ lock: "#c67662",
44412
+ cover: "#a6564d",
44413
+ switch: "#ad2c4e",
44414
+ siren: "#348e08",
44415
+ button: "#d27303",
44416
+ doorbell: "#55770f"
44417
+ };
44418
+ var OKABE_ITO_FALLBACK = [
44419
+ "#9a3784",
44420
+ "#a7392c",
44421
+ "#409d50",
44422
+ "#6987e7",
44423
+ "#ee5b3d",
44424
+ "#c0430d",
44425
+ "#af79b3",
44426
+ "#4b6628"
44427
+ ];
44428
+ /**
44429
+ * The display palette (D939). One table of colours, three presets, one
44430
+ * validator. Taxonomy colours and every consumer read this — there is no
44431
+ * second hex table.
44432
+ */
44433
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
44434
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
44435
+ form: literal("solid"),
44436
+ hex: paletteHexSchema
44437
+ }), object({
44438
+ form: literal("gradient"),
44439
+ hex: paletteHexSchema,
44440
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
44441
+ })]);
44442
+ var paletteReadySchema = object({
44443
+ status: literal("ready"),
44444
+ presetId: _enum(PALETTE_PRESET_IDS),
44445
+ customized: boolean(),
44446
+ source: _enum(["stored", "unconfigured"]),
44447
+ swatches: record(string(), paletteSwatchSchema),
44448
+ fallbacks: array(paletteHexSchema).length(8)
44449
+ });
44450
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
44451
+ status: literal("unknown"),
44452
+ reason: string()
44453
+ })]);
44454
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
44455
+ presetId: string(),
44456
+ overrides: record(string(), paletteSwatchSchema)
44457
+ })]);
44458
+ object({
44459
+ presetId: string(),
44460
+ overrides: record(string(), paletteSwatchSchema)
44461
+ });
44462
+ function solid(hex) {
44463
+ return {
44464
+ form: "solid",
44465
+ hex
44466
+ };
44467
+ }
44468
+ function audioGradient(hex) {
44469
+ return {
44470
+ form: "gradient",
44471
+ hex,
44472
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
44473
+ };
44474
+ }
44475
+ function swatchesFrom(hexes) {
44476
+ const out = {};
44477
+ for (const id of PALETTE_ENTRY_IDS) {
44478
+ const hex = hexes[id];
44479
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
44480
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
44481
+ }
44482
+ return out;
44483
+ }
44484
+ function preset(id, name, hexes, fallbacks) {
44485
+ return {
44486
+ id,
44487
+ name,
44488
+ swatches: swatchesFrom(hexes),
44489
+ fallbacks
44490
+ };
44491
+ }
44492
+ var DISPLAY_PRESETS = [
44493
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
44494
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
44495
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
44496
+ ];
44497
+ function presetById(id) {
44498
+ return DISPLAY_PRESETS.find((item) => item.id === id);
44499
+ }
44500
+ function bundledCamstack() {
44501
+ const presetRow = presetById("camstack");
44502
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
44503
+ return readyOf(presetRow, "unconfigured", false);
44504
+ }
44505
+ function readyOf(row, source, customized) {
44506
+ return {
44507
+ status: "ready",
44508
+ presetId: row.id,
44509
+ customized,
44510
+ source,
44511
+ swatches: row.swatches,
44512
+ fallbacks: [...row.fallbacks]
44513
+ };
44514
+ }
44515
+ function hashFallback(kind, fallbacks) {
44516
+ let hash = 0;
44517
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
44518
+ const hex = fallbacks[hash % fallbacks.length];
44519
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44520
+ return hex;
44521
+ }
44522
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
44523
+ function paintHex(swatches, fallbacks, kind) {
44524
+ const key = kind.trim().toLowerCase();
44525
+ if (key.startsWith("audio-")) {
44526
+ const audio = swatches[AUDIO_ENTRY_ID];
44527
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
44528
+ }
44529
+ const direct = swatches[key];
44530
+ if (direct !== void 0) return direct.hex;
44531
+ return hashFallback(key, fallbacks);
44532
+ }
44533
+ /**
42164
44534
  * Unified event-kind taxonomy — THE single source of truth for
42165
44535
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42166
44536
  * icon }`.
@@ -42174,109 +44544,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42174
44544
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42175
44545
  * - the COCO / audio class maps (macro ↔ sub relationships)
42176
44546
  *
42177
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42178
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42179
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42180
- * color or an icon: they read this dictionary (server descriptors carry the
42181
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
44547
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
44548
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
44549
+ * the bundled CamStack display palette (D939). The effective cluster palette
44550
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
44551
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42182
44552
  *
42183
44553
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42184
44554
  */
42185
- var TAXONOMY_COLORS = {
42186
- motion: "#f59e0b",
42187
- audio: "#06b6d4",
42188
- person: "#22c55e",
42189
- vehicle: "#3b82f6",
42190
- animal: "#f97316",
42191
- package: "#a855f7",
42192
- sensor: "#8b5cf6",
42193
- control: "#10b981",
42194
- genericDetection: "#64748b"
42195
- };
42196
- var DETECTION_SUB_COLORS = {
42197
- car: "#f59e0b",
42198
- truck: "#d97706",
42199
- bus: "#b45309",
42200
- motorcycle: "#eab308",
42201
- bicycle: "#ca8a04",
42202
- airplane: "#60a5fa",
42203
- boat: "#2563eb",
42204
- train: "#1d4ed8",
42205
- bird: "#14b8a6",
42206
- dog: "#84cc16",
42207
- cat: "#f97316",
42208
- horse: "#a16207",
42209
- sheep: "#a3a3a3",
42210
- cow: "#78716c",
42211
- elephant: "#6b7280",
42212
- bear: "#7c2d12",
42213
- zebra: "#404040",
42214
- giraffe: "#d4a373"
42215
- };
44555
+ var BUNDLED_PALETTE = bundledCamstack();
44556
+ function kindColor(kind) {
44557
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
44558
+ }
44559
+ function firstFallback(fallbacks) {
44560
+ const hex = fallbacks[0];
44561
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44562
+ return hex;
44563
+ }
44564
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42216
44565
  function titleCase(id) {
42217
44566
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42218
44567
  }
42219
44568
  var entries = /* @__PURE__ */ new Map();
42220
- function macro(kind, category, color, iconId, label) {
44569
+ function macro(kind, category, iconId, label) {
42221
44570
  entries.set(kind, {
42222
44571
  kind,
42223
44572
  parentKind: null,
42224
44573
  level: "macro",
42225
44574
  category,
42226
- color,
44575
+ color: kindColor(kind),
42227
44576
  iconId,
42228
44577
  labelKey: `eventKind.${kind}`,
42229
44578
  label
42230
44579
  });
42231
44580
  }
42232
- function sub(kind, parentKind, category, color, iconId, label) {
44581
+ function sub(kind, parentKind, category, iconId, label) {
42233
44582
  entries.set(kind, {
42234
44583
  kind,
42235
44584
  parentKind,
42236
44585
  level: "sub",
42237
44586
  category,
42238
- color,
44587
+ color: kindColor(kind),
42239
44588
  iconId,
42240
44589
  labelKey: `eventKind.${kind}`,
42241
44590
  label
42242
44591
  });
42243
44592
  }
42244
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42245
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42246
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42247
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42248
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42249
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42250
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42251
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
44593
+ macro("motion", "motion", "motion", "Motion");
44594
+ macro("audio", "audio", "audio", "Audio");
44595
+ macro("person", "detection", "person", "Person");
44596
+ macro("vehicle", "detection", "vehicle", "Vehicle");
44597
+ macro("animal", "detection", "animal", "Animal");
44598
+ macro("package", "package", "package", "Package");
44599
+ macro("sensor", "sensor", "sensor", "Sensor");
44600
+ macro("control", "control", "control", "Control");
42252
44601
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42253
44602
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42254
44603
  if (entries.has(cocoClass)) continue;
42255
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
44604
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
42256
44605
  }
42257
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42258
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42259
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42260
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42261
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42262
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42263
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42264
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42265
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42266
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42267
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42268
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42269
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42270
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42271
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42272
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42273
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42274
- sub("button", "control", "control", "#10b981", "button", "Button");
42275
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
44606
+ sub("package-delivered", "package", "package", "package", "Package delivered");
44607
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
44608
+ sub("contact", "sensor", "sensor", "door", "Contact");
44609
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
44610
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
44611
+ sub("flood", "sensor", "sensor", "water", "Water leak");
44612
+ sub("gas", "sensor", "sensor", "gas", "Gas");
44613
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
44614
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
44615
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
44616
+ sub("presence", "sensor", "sensor", "presence", "Presence");
44617
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
44618
+ sub("device-event", "sensor", "sensor", "button", "Device event");
44619
+ sub("lock", "control", "control", "lock", "Lock");
44620
+ sub("cover", "control", "control", "door", "Cover");
44621
+ sub("switch", "control", "control", "switch", "Switch");
44622
+ sub("siren", "control", "control", "siren", "Siren");
44623
+ sub("button", "control", "control", "button", "Button");
44624
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42276
44625
  for (const l of AUDIO_MACRO_LABELS) {
42277
44626
  const kind = `audio-${l.id}`;
42278
44627
  if (entries.has(kind)) continue;
42279
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
44628
+ sub(kind, "audio", "audio", kind, l.name);
42280
44629
  }
42281
44630
  /** The complete taxonomy dictionary, keyed by kind. */
42282
44631
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -43119,7 +45468,7 @@ var NcConditionsSchema = object({
43119
45468
  * with the list under it is worse than no switch (D62).
43120
45469
  *
43121
45470
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43122
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45471
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43123
45472
  * the operator fixed the spelling. The id reaches the record on
43124
45473
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43125
45474
  * `{{label}}` renders.
@@ -43670,7 +46019,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
43670
46019
  * A rule scoped to one camera and one zone silently became a rule that
43671
46020
  * matches EVERY event on EVERY camera, and lost its `media` policy
43672
46021
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
43673
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46022
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
43674
46023
  * within a minute of a two-field patch.
43675
46024
  *
43676
46025
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -45483,7 +47832,7 @@ var LabelAttributionSchema = object({
45483
47832
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
45484
47833
  *
45485
47834
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
45486
- * notification rule authored on "Gianluca" stopped matching the moment the
47835
+ * notification rule authored on "Alice" stopped matching the moment the
45487
47836
  * operator fixed the spelling in the gallery, and nothing said so. The id is
45488
47837
  * the thing that does not move, so it is what a rule matches on
45489
47838
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48022,7 +50371,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48022
50371
  /**
48023
50372
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48024
50373
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48025
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50374
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48026
50375
  * NOT inferred, these boxes are its output, and its children (the plate
48027
50376
  * reader) run on them through their own crop policy. Boxes are in the
48028
50377
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -49655,7 +52004,7 @@ var RunnerCameraConfigSchema = object({
49655
52004
  * detection session that asks for history. What shipped was a last-moment
49656
52005
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
49657
52006
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
49658
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52007
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
49659
52008
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
49660
52009
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
49661
52010
  * was decoded, and was freed.
@@ -51685,7 +54034,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
51685
54034
  * The signals a device can emit to WAKE its own stream.
51686
54035
  *
51687
54036
  * A camera whose stream is built on demand sleeps until something asks for it,
51688
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54037
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
51689
54038
  * puller holds a session open for ever, and treating that as demand would keep
51690
54039
  * a battery camera awake for ever, which is the whole thing the battery is for
51691
54040
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -52372,7 +54721,7 @@ var ClipSchema = object({
52372
54721
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
52373
54722
  *
52374
54723
  * Bounded because it is not a payload the surface pages through: one visit on
52375
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
54724
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
52376
54725
  * camera-day. Read {@link eventCount} for the true total.
52377
54726
  */
52378
54727
  eventIds: array(string()).optional(),
@@ -52517,7 +54866,7 @@ var ClipPlaybackSchema = object({
52517
54866
  * camera has no recordings", which is the defect this whole line of work is
52518
54867
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
52519
54868
  * reached at all (`unreachable`, also what a provider that THREW reports), a
52520
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
54869
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
52521
54870
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
52522
54871
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
52523
54872
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -52782,7 +55131,7 @@ DeviceType.Camera, method(object({
52782
55131
  *
52783
55132
  * It was optional, documented as "absent means the device's BOUND
52784
55133
  * provider, which is CamStack on every camera". No code implemented
52785
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55134
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
52786
55135
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
52787
55136
  * answered SIX rows, three from each source, merged newest-first:
52788
55137
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -53860,7 +56209,10 @@ object({
53860
56209
  DeviceType.Sensor;
53861
56210
  object({
53862
56211
  /** Current illuminance in lux (lx). */
53863
- lux: number().min(0),
56212
+ lux: number().min(0).meta({
56213
+ unit: "lx",
56214
+ label: "Illuminance"
56215
+ }),
53864
56216
  /** Ms epoch when the slice was last updated. */
53865
56217
  lastFetchedAt: number(),
53866
56218
  /** Live display unit from the upstream source (e.g. HA
@@ -54016,7 +56368,10 @@ var BatteryStatusSchema = object({
54016
56368
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
54017
56369
  * declines to band a non-finite reading, which is the correct shape.
54018
56370
  */
54019
- percentage: number().min(0).max(100).nullable(),
56371
+ percentage: number().min(0).max(100).nullable().meta({
56372
+ unit: "%",
56373
+ label: "Charge"
56374
+ }),
54020
56375
  /**
54021
56376
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
54022
56377
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -54035,13 +56390,13 @@ var BatteryStatusSchema = object({
54035
56390
  "solar",
54036
56391
  "none",
54037
56392
  "unknown"
54038
- ]),
56393
+ ]).meta({ label: "Charging source" }),
54039
56394
  /**
54040
56395
  * True when the camera firmware has gone into low-power mode. Battery
54041
56396
  * providers MUST avoid polling during sleep — reading the battery
54042
56397
  * wakes the camera up and drains charge.
54043
56398
  */
54044
- sleeping: boolean(),
56399
+ sleeping: boolean().meta({ label: "Sleeping" }),
54045
56400
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
54046
56401
  lastUpdated: number(),
54047
56402
  /**
@@ -54081,7 +56436,7 @@ var BatteryStatusSchema = object({
54081
56436
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
54082
56437
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
54083
56438
  */
54084
- binary: boolean().optional()
56439
+ binary: boolean().optional().meta({ label: "Binary indicator" })
54085
56440
  });
54086
56441
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat;
54087
56442
  method(object({
@@ -54096,7 +56451,7 @@ method(object({
54096
56451
  status: BatteryStatusSchema
54097
56452
  });
54098
56453
  object({
54099
- on: boolean(),
56454
+ on: boolean().meta({ label: "On" }),
54100
56455
  /** Ms epoch of the last transition. 0 if never observed. */
54101
56456
  lastChangedAt: number()
54102
56457
  });
@@ -54354,7 +56709,7 @@ var GridLayoutCellSchema = object({
54354
56709
  *
54355
56710
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
54356
56711
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
54357
- * the sources, because "this grid has no low" is not a finding — "615 has no
56712
+ * the sources, because "this grid has no low" is not a finding — "101 has no
54358
56713
  * low" is, and it is the one an operator can act on.
54359
56714
  */
54360
56715
  var GridProfileOfferSchema = object({
@@ -54986,6 +57341,30 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
54986
57341
  auth: "admin"
54987
57342
  });
54988
57343
  /**
57344
+ * display-palette — the cluster's one colour table (D939).
57345
+ *
57346
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
57347
+ * cannot be read; it does not pretend the bundled preset was stored.
57348
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
57349
+ * the pairs.
57350
+ */
57351
+ var presetSummarySchema = object({
57352
+ id: string(),
57353
+ name: string(),
57354
+ swatches: record(string(), paletteSwatchSchema),
57355
+ fallbacks: array(string())
57356
+ });
57357
+ method(_void(), paletteResultSchema, {
57358
+ auth: "protected",
57359
+ role: "viewer"
57360
+ }), method(_void(), array(presetSummarySchema).readonly(), {
57361
+ auth: "protected",
57362
+ role: "viewer"
57363
+ }), method(setPaletteInputSchema, paletteReadySchema, {
57364
+ kind: "mutation",
57365
+ auth: "admin"
57366
+ });
57367
+ /**
54989
57368
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
54990
57369
  * for every device, regardless of provider — the kernel needs a uniform
54991
57370
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -55881,7 +58260,10 @@ DeviceType.Humidifier, method(object({
55881
58260
  });
55882
58261
  object({
55883
58262
  /** Current relative humidity, 0..100. */
55884
- percent: number().min(0).max(100),
58263
+ percent: number().min(0).max(100).meta({
58264
+ unit: "%",
58265
+ label: "Humidity"
58266
+ }),
55885
58267
  /** Ms epoch when the slice was last updated. */
55886
58268
  lastFetchedAt: number(),
55887
58269
  /** Live display unit from the upstream source (e.g. HA
@@ -58658,9 +61040,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
58658
61040
  });
58659
61041
  object({
58660
61042
  /** Instantaneous power draw in watts. */
58661
- watts: number().optional(),
61043
+ watts: number().optional().meta({
61044
+ unit: "W",
61045
+ label: "Power"
61046
+ }),
58662
61047
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
58663
- kwhTotal: number().optional(),
61048
+ kwhTotal: number().optional().meta({
61049
+ unit: "kWh",
61050
+ label: "Energy"
61051
+ }),
58664
61052
  /** Voltage in volts. */
58665
61053
  volts: number().optional(),
58666
61054
  /** Current in amperes. */
@@ -58979,9 +61367,9 @@ var PtzOptionsSchema = object({
58979
61367
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
58980
61368
  * not one of the three cameras honours its own:
58981
61369
  *
58982
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
58983
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
58984
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
61370
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
61371
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
61372
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
58985
61373
  *
58986
61374
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
58987
61375
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -59128,7 +61516,7 @@ object({
59128
61516
  running: boolean().nullable(),
59129
61517
  /** Epoch ms the current boolean began; null while `running` is null. */
59130
61518
  since: number().nullable(),
59131
- source: RunningStateSourceSchema,
61519
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
59132
61520
  phase: string().nullable(),
59133
61521
  /** null until a reading has been published (D393). */
59134
61522
  lastFetchedAt: number().nullable()
@@ -59181,7 +61569,7 @@ var RecordingAvailabilitySchema = object({
59181
61569
  * would look identical. But the answer used to say nothing about that, so a
59182
61570
  * caller asking "what can I export?" read the single preferred profile as
59183
61571
  * the only one that exists — on this deployment every camera records `high`
59184
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
61572
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
59185
61573
  * UI could not see it.
59186
61574
  *
59187
61575
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -59280,7 +61668,7 @@ var RecordingSourceOptionsSchema = object({
59280
61668
  * `sparse` = gaps are the absence of one, and must be drawn as such.
59281
61669
  *
59282
61670
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
59283
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
61671
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
59284
61672
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
59285
61673
  coverage: _enum(["continuous", "sparse"]),
59286
61674
  /** Where the playhead may be put.
@@ -59356,7 +61744,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
59356
61744
  * merely discouraged (D554 amended).
59357
61745
  *
59358
61746
  * It was learned the expensive way on `videoclips.listClips`: measured
59359
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
61747
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
59360
61748
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
59361
61749
  * three from each source, merged — `device-collection-dispatch.ts`
59362
61750
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -59957,7 +62345,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
59957
62345
  * on a 10 h window holding 29,393 s of footage every range landed late by the
59958
62346
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
59959
62347
  * the video was a uniform timelapse, and the log line reported the five ranges
59960
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
62348
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
59961
62349
  *
59962
62350
  * Relative and not absolute epoch, because an absolute epoch would make every
59963
62351
  * call site responsible for the same subtraction.
@@ -60591,7 +62979,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusS
60591
62979
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
60592
62980
  * for the thing: a scene is a standing question about the property ("is the bin
60593
62981
  * still out"), and the operator's question is "which of my scenes have tripped",
60594
- * across every camera at once — not "what does camera 617 think". Buried one
62982
+ * across every camera at once — not "what does camera 102 think". Buried one
60595
62983
  * camera deep it also could not be found. The surface is now a top-level admin
60596
62984
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
60597
62985
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -61174,7 +63562,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), StreamParamsOptionsSch
61174
63562
  auth: "admin"
61175
63563
  }), method(object({ deviceId: number() }), unknown().nullable());
61176
63564
  object({
61177
- on: boolean(),
63565
+ on: boolean().meta({ label: "On" }),
61178
63566
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
61179
63567
  lastChangedAt: number()
61180
63568
  });
@@ -61737,7 +64125,10 @@ object({
61737
64125
  DeviceType.Sensor;
61738
64126
  object({
61739
64127
  /** Current temperature in Celsius. */
61740
- celsius: number(),
64128
+ celsius: number().meta({
64129
+ unit: "°C",
64130
+ label: "Temperature"
64131
+ }),
61741
64132
  /** Ms epoch when the slice was last updated (push or poll). */
61742
64133
  lastFetchedAt: number(),
61743
64134
  /** Live display unit from the upstream source (e.g. HA
@@ -62987,6 +65378,10 @@ var trainingCapability = {
62987
65378
  }
62988
65379
  };
62989
65380
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65381
+ 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;
65382
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
65383
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
65384
+ new Set(CAP_NAMES);
62990
65385
  Object.freeze({
62991
65386
  person: .5,
62992
65387
  vehicle: .5,
@@ -65986,6 +68381,27 @@ Object.freeze({
65986
68381
  access: "create",
65987
68382
  role: "viewer"
65988
68383
  },
68384
+ "displayPalette.getPalette": {
68385
+ capName: "display-palette",
68386
+ capScope: "system",
68387
+ addonId: null,
68388
+ access: "view",
68389
+ role: "viewer"
68390
+ },
68391
+ "displayPalette.listPresets": {
68392
+ capName: "display-palette",
68393
+ capScope: "system",
68394
+ addonId: null,
68395
+ access: "view",
68396
+ role: "viewer"
68397
+ },
68398
+ "displayPalette.setPalette": {
68399
+ capName: "display-palette",
68400
+ capScope: "system",
68401
+ addonId: null,
68402
+ access: "create",
68403
+ role: "admin"
68404
+ },
65989
68405
  "doorbell.getStatus": {
65990
68406
  capName: "doorbell",
65991
68407
  capScope: "device",
@@ -75903,7 +78319,7 @@ var SENSOR_CAP_VOCABULARY = {
75903
78319
  state: [{
75904
78320
  kind: "boolean",
75905
78321
  field: "on",
75906
- label: t("Active", "Attivo"),
78322
+ label: t("On", "Acceso"),
75907
78323
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
75908
78324
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
75909
78325
  icon: "toggle-right"
@@ -76442,6 +78858,7 @@ var SYSTEM_CAP_VOCABULARY = {
76442
78858
  "device-provider": system(INTERNAL),
76443
78859
  "device-removal-hook": system(INTERNAL),
76444
78860
  "device-state": system("the runtime-state mirror every trigger already reads through"),
78861
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
76445
78862
  "embedding-encoder": system(ML),
76446
78863
  "face-gallery": system("the face gallery — curated on its own page"),
76447
78864
  "failure-contribution": system(INTERNAL),
@@ -79326,7 +81743,6 @@ Object.freeze({
79326
81743
  "smtp-provider": "email"
79327
81744
  });
79328
81745
  DeviceType.Camera;
79329
- 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;
79330
81746
  /**
79331
81747
  * A saved Customize assignment (D936). The schema is the type: callers use
79332
81748
  * `z.infer`, they do not restate the shape.
@@ -79415,7 +81831,6 @@ object({
79415
81831
  ]),
79416
81832
  reason: string().nullable()
79417
81833
  });
79418
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
79419
81834
  var G711_SCALE_CORRECTION_DB = {
79420
81835
  PCMU: 20 * Math.log10(4),
79421
81836
  PCMA: 20 * Math.log10(8)
@@ -79788,7 +82203,7 @@ var STATE_SUMMARY_SECTION_VARS = [
79788
82203
  {
79789
82204
  name: "summaryStreams",
79790
82205
  label: "Summary: streams offline",
79791
- example: "Ingresso (high) — since 06:40",
82206
+ example: "Front door (high) — since 06:40",
79792
82207
  kinds: ["stream-offline", "stream-online"]
79793
82208
  },
79794
82209
  {
@@ -79806,13 +82221,13 @@ var STATE_SUMMARY_SECTION_VARS = [
79806
82221
  {
79807
82222
  name: "summaryDetection",
79808
82223
  label: "Summary: cameras detecting nothing",
79809
- example: "Ingresso — since 05:10",
82224
+ example: "Front door — since 05:10",
79810
82225
  kinds: ["detection-blind"]
79811
82226
  },
79812
82227
  {
79813
82228
  name: "summaryNodes",
79814
82229
  label: "Summary: nodes",
79815
- example: "little-unraid — offline since 03:00",
82230
+ example: "agent-a — offline since 03:00",
79816
82231
  kinds: [
79817
82232
  "node-offline",
79818
82233
  "node-online",