@camstack/addon-provider-homeassistant 1.2.622 → 1.2.624

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.
@@ -1,5 +1,5 @@
1
1
  require("node:crypto");
2
- //#region ../types/dist/event-category-Ceif8n-v.mjs
2
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -295,7 +295,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
295
295
  * TRANSITION into that state (never per dispatch), and the node is dropped
296
296
  * from the placement candidate set for as long as it holds.
297
297
  *
298
- * This exists because the state was previously invisible: little-unraid
298
+ * This exists because the state was previously invisible: agent-a
299
299
  * absorbed 283k inference errors in a day while still being handed cameras,
300
300
  * and nothing in the system said so.
301
301
  *
@@ -5567,7 +5567,7 @@ var ZodIssueCode = {
5567
5567
  var ZodFirstPartyTypeKind;
5568
5568
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5569
5569
  //#endregion
5570
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5570
+ //#region ../types/dist/sleep-BErAxhul.mjs
5571
5571
  /**
5572
5572
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5573
5573
  * window to float samples (D455).
@@ -8837,6 +8837,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8837
8837
  kind: "mutation",
8838
8838
  auth: "admin"
8839
8839
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8840
+ Object.freeze({ "doorbell": "lastPressedAt" });
8841
+ /** Every capability name, so addon code can check a name without the schema graph. */
8842
+ var CAP_NAMES = Object.freeze([
8843
+ "accessories",
8844
+ "addon-pages",
8845
+ "addon-pages-source",
8846
+ "addon-routes",
8847
+ "addon-settings",
8848
+ "addon-widgets",
8849
+ "addon-widgets-source",
8850
+ "addons",
8851
+ "admin-ui",
8852
+ "air-quality-sensor",
8853
+ "alarm-panel",
8854
+ "alerts",
8855
+ "ambient-light-sensor",
8856
+ "audio-analysis",
8857
+ "audio-analyzer",
8858
+ "audio-codec",
8859
+ "audio-metrics",
8860
+ "auth-provider",
8861
+ "automation-control",
8862
+ "backup",
8863
+ "battery",
8864
+ "binary",
8865
+ "brightness",
8866
+ "broker",
8867
+ "button",
8868
+ "calendar-source",
8869
+ "calendars",
8870
+ "camera-credentials",
8871
+ "camera-grid-layout",
8872
+ "camera-pipeline-config",
8873
+ "camera-streams",
8874
+ "carbon-monoxide",
8875
+ "climate-control",
8876
+ "color",
8877
+ "composer",
8878
+ "connection-test",
8879
+ "connectivity",
8880
+ "consumables",
8881
+ "contact",
8882
+ "control",
8883
+ "core-blocks",
8884
+ "cover",
8885
+ "custom-model-registry",
8886
+ "data-store-provider",
8887
+ "database-snapshot",
8888
+ "day-night",
8889
+ "decoder",
8890
+ "detection-pipeline",
8891
+ "device-admin-link",
8892
+ "device-adoption",
8893
+ "device-credentials",
8894
+ "device-discovery",
8895
+ "device-export",
8896
+ "device-extension",
8897
+ "device-history",
8898
+ "device-manager",
8899
+ "device-ops",
8900
+ "device-provider",
8901
+ "device-removal-hook",
8902
+ "device-state",
8903
+ "device-status",
8904
+ "dishwasher",
8905
+ "display-palette",
8906
+ "doorbell",
8907
+ "embedding-encoder",
8908
+ "enum-sensor",
8909
+ "event-emitter",
8910
+ "face-gallery",
8911
+ "failure-contribution",
8912
+ "fan-control",
8913
+ "feature-probe",
8914
+ "filesystem-browse",
8915
+ "flood",
8916
+ "gas",
8917
+ "heating-valve",
8918
+ "humidifier",
8919
+ "humidity-sensor",
8920
+ "image",
8921
+ "image-settings",
8922
+ "integrations",
8923
+ "intercom",
8924
+ "keychain",
8925
+ "keychain-admin",
8926
+ "lawn-mower-control",
8927
+ "llm",
8928
+ "llm-runtime",
8929
+ "load-contribution",
8930
+ "local-network",
8931
+ "lock-control",
8932
+ "log-channels",
8933
+ "log-destination",
8934
+ "login-method",
8935
+ "media-player",
8936
+ "mesh-network",
8937
+ "metrics-provider",
8938
+ "model-convert",
8939
+ "model-distributor",
8940
+ "motion",
8941
+ "motion-detection",
8942
+ "motion-trigger",
8943
+ "motion-zones",
8944
+ "mqtt-broker",
8945
+ "native-object-detection",
8946
+ "navigation",
8947
+ "network-access",
8948
+ "network-link",
8949
+ "network-quality",
8950
+ "node-certificates",
8951
+ "nodes",
8952
+ "notification-output",
8953
+ "notification-rules",
8954
+ "notifier",
8955
+ "numeric-sensor",
8956
+ "oauth-integration",
8957
+ "oidc-connections",
8958
+ "osd",
8959
+ "osd-manager",
8960
+ "pet-feeder",
8961
+ "pipeline-analytics",
8962
+ "pipeline-executor",
8963
+ "pipeline-orchestrator",
8964
+ "pipeline-runner",
8965
+ "plate-gallery",
8966
+ "platform-probe",
8967
+ "power-meter",
8968
+ "presence",
8969
+ "pressure-sensor",
8970
+ "privacy-mask",
8971
+ "ptz",
8972
+ "ptz-autotrack",
8973
+ "reboot",
8974
+ "record-entries",
8975
+ "recording",
8976
+ "recording-archive",
8977
+ "recording-export",
8978
+ "recording-onboard",
8979
+ "recording-signal",
8980
+ "records",
8981
+ "running-state",
8982
+ "scene-monitor",
8983
+ "script-runner",
8984
+ "server-management",
8985
+ "settings-store",
8986
+ "smoke",
8987
+ "smtp-provider",
8988
+ "snapshot",
8989
+ "sso-bridge",
8990
+ "storage",
8991
+ "storage-admin",
8992
+ "storage-evictable",
8993
+ "storage-migration",
8994
+ "storage-occupancy",
8995
+ "storage-provider",
8996
+ "stream-broker",
8997
+ "stream-catalog",
8998
+ "stream-params",
8999
+ "stream-signals",
9000
+ "switch",
9001
+ "system",
9002
+ "tamper",
9003
+ "temperature-sensor",
9004
+ "terminal-session",
9005
+ "toast",
9006
+ "training",
9007
+ "training-provider",
9008
+ "turn-provider",
9009
+ "update",
9010
+ "user-management",
9011
+ "user-passkeys",
9012
+ "vacuum-control",
9013
+ "valve",
9014
+ "vector-store",
9015
+ "vibration",
9016
+ "videoclips",
9017
+ "viewer-ui",
9018
+ "water-heater",
9019
+ "weather",
9020
+ "webrtc-session",
9021
+ "zone-analytics",
9022
+ "zone-rules",
9023
+ "zones"
9024
+ ]);
9025
+ Object.freeze({
9026
+ "air-quality-sensor": [
9027
+ {
9028
+ "path": "co2Ppm",
9029
+ "valueType": "number"
9030
+ },
9031
+ {
9032
+ "path": "vocPpb",
9033
+ "valueType": "number"
9034
+ },
9035
+ {
9036
+ "path": "pm25",
9037
+ "valueType": "number"
9038
+ },
9039
+ {
9040
+ "path": "pm10",
9041
+ "valueType": "number"
9042
+ },
9043
+ {
9044
+ "path": "aqi",
9045
+ "valueType": "number"
9046
+ },
9047
+ {
9048
+ "path": "unit",
9049
+ "valueType": "string"
9050
+ },
9051
+ {
9052
+ "path": "precision",
9053
+ "valueType": "number"
9054
+ }
9055
+ ],
9056
+ "alarm-panel": [
9057
+ {
9058
+ "path": "state",
9059
+ "valueType": "enum",
9060
+ "enumValues": [
9061
+ "disarmed",
9062
+ "armed_home",
9063
+ "armed_away",
9064
+ "armed_night",
9065
+ "armed_vacation",
9066
+ "armed_custom_bypass",
9067
+ "arming",
9068
+ "disarming",
9069
+ "pending",
9070
+ "triggered"
9071
+ ]
9072
+ },
9073
+ {
9074
+ "path": "targetMode",
9075
+ "valueType": "enum",
9076
+ "enumValues": [
9077
+ "home",
9078
+ "away",
9079
+ "night",
9080
+ "vacation",
9081
+ "custom_bypass"
9082
+ ]
9083
+ },
9084
+ {
9085
+ "path": "requiresCode",
9086
+ "valueType": "boolean"
9087
+ }
9088
+ ],
9089
+ "ambient-light-sensor": [
9090
+ {
9091
+ "path": "lux",
9092
+ "valueType": "number"
9093
+ },
9094
+ {
9095
+ "path": "unit",
9096
+ "valueType": "string"
9097
+ },
9098
+ {
9099
+ "path": "precision",
9100
+ "valueType": "number"
9101
+ }
9102
+ ],
9103
+ "audio-metrics": [
9104
+ {
9105
+ "path": "ts",
9106
+ "valueType": "number"
9107
+ },
9108
+ {
9109
+ "path": "windowSec",
9110
+ "valueType": "number"
9111
+ },
9112
+ {
9113
+ "path": "level.rms",
9114
+ "valueType": "number"
9115
+ },
9116
+ {
9117
+ "path": "level.dbfs",
9118
+ "valueType": "number"
9119
+ },
9120
+ {
9121
+ "path": "peakDbfs",
9122
+ "valueType": "number"
9123
+ },
9124
+ {
9125
+ "path": "avgDbfs",
9126
+ "valueType": "number"
9127
+ },
9128
+ {
9129
+ "path": "current.className",
9130
+ "valueType": "string"
9131
+ },
9132
+ {
9133
+ "path": "current.score",
9134
+ "valueType": "number"
9135
+ },
9136
+ {
9137
+ "path": "current.timestamp",
9138
+ "valueType": "number"
9139
+ }
9140
+ ],
9141
+ "automation-control": [
9142
+ {
9143
+ "path": "enabled",
9144
+ "valueType": "boolean"
9145
+ },
9146
+ {
9147
+ "path": "isRunning",
9148
+ "valueType": "boolean"
9149
+ },
9150
+ {
9151
+ "path": "lastTriggeredAt",
9152
+ "valueType": "number"
9153
+ },
9154
+ {
9155
+ "path": "lastError",
9156
+ "valueType": "string"
9157
+ }
9158
+ ],
9159
+ "battery": [
9160
+ {
9161
+ "path": "percentage",
9162
+ "valueType": "number"
9163
+ },
9164
+ {
9165
+ "path": "charging",
9166
+ "valueType": "enum",
9167
+ "enumValues": [
9168
+ "dc",
9169
+ "solar",
9170
+ "none",
9171
+ "unknown"
9172
+ ]
9173
+ },
9174
+ {
9175
+ "path": "sleeping",
9176
+ "valueType": "boolean"
9177
+ },
9178
+ {
9179
+ "path": "lastUpdated",
9180
+ "valueType": "number"
9181
+ },
9182
+ {
9183
+ "path": "lastContactAt",
9184
+ "valueType": "number"
9185
+ },
9186
+ {
9187
+ "path": "lastFullRefreshAt",
9188
+ "valueType": "number"
9189
+ },
9190
+ {
9191
+ "path": "binary",
9192
+ "valueType": "boolean"
9193
+ }
9194
+ ],
9195
+ "binary": [{
9196
+ "path": "on",
9197
+ "valueType": "boolean"
9198
+ }],
9199
+ "brightness": [{
9200
+ "path": "percentage",
9201
+ "valueType": "number"
9202
+ }],
9203
+ "broker": [{
9204
+ "path": "brokerCount",
9205
+ "valueType": "number"
9206
+ }, {
9207
+ "path": "connectedCount",
9208
+ "valueType": "number"
9209
+ }],
9210
+ "camera-credentials": [
9211
+ {
9212
+ "path": "host",
9213
+ "valueType": "string"
9214
+ },
9215
+ {
9216
+ "path": "port",
9217
+ "valueType": "number"
9218
+ },
9219
+ {
9220
+ "path": "onvifPort",
9221
+ "valueType": "number"
9222
+ },
9223
+ {
9224
+ "path": "rtspPort",
9225
+ "valueType": "number"
9226
+ },
9227
+ {
9228
+ "path": "https",
9229
+ "valueType": "boolean"
9230
+ },
9231
+ {
9232
+ "path": "hasUsername",
9233
+ "valueType": "boolean"
9234
+ },
9235
+ {
9236
+ "path": "hasPassword",
9237
+ "valueType": "boolean"
9238
+ },
9239
+ {
9240
+ "path": "onvifProfile",
9241
+ "valueType": "string"
9242
+ }
9243
+ ],
9244
+ "camera-streams": [
9245
+ {
9246
+ "path": "online",
9247
+ "valueType": "boolean"
9248
+ },
9249
+ {
9250
+ "path": "slotStatuses.high",
9251
+ "valueType": "enum",
9252
+ "enumValues": [
9253
+ "unassigned",
9254
+ "idle",
9255
+ "connecting",
9256
+ "streaming",
9257
+ "error"
9258
+ ]
9259
+ },
9260
+ {
9261
+ "path": "slotStatuses.mid",
9262
+ "valueType": "enum",
9263
+ "enumValues": [
9264
+ "unassigned",
9265
+ "idle",
9266
+ "connecting",
9267
+ "streaming",
9268
+ "error"
9269
+ ]
9270
+ },
9271
+ {
9272
+ "path": "slotStatuses.low",
9273
+ "valueType": "enum",
9274
+ "enumValues": [
9275
+ "unassigned",
9276
+ "idle",
9277
+ "connecting",
9278
+ "streaming",
9279
+ "error"
9280
+ ]
9281
+ },
9282
+ {
9283
+ "path": "slotErrors.high",
9284
+ "valueType": "string"
9285
+ },
9286
+ {
9287
+ "path": "slotErrors.mid",
9288
+ "valueType": "string"
9289
+ },
9290
+ {
9291
+ "path": "slotErrors.low",
9292
+ "valueType": "string"
9293
+ }
9294
+ ],
9295
+ "carbon-monoxide": [{
9296
+ "path": "detected",
9297
+ "valueType": "boolean"
9298
+ }],
9299
+ "climate-control": [
9300
+ {
9301
+ "path": "mode",
9302
+ "valueType": "enum",
9303
+ "enumValues": [
9304
+ "off",
9305
+ "heat",
9306
+ "cool",
9307
+ "auto",
9308
+ "heat_cool",
9309
+ "fan_only",
9310
+ "dry"
9311
+ ]
9312
+ },
9313
+ {
9314
+ "path": "fanMode",
9315
+ "valueType": "string"
9316
+ },
9317
+ {
9318
+ "path": "preset",
9319
+ "valueType": "string"
9320
+ },
9321
+ {
9322
+ "path": "target",
9323
+ "valueType": "number"
9324
+ },
9325
+ {
9326
+ "path": "targetHigh",
9327
+ "valueType": "number"
9328
+ },
9329
+ {
9330
+ "path": "targetLow",
9331
+ "valueType": "number"
9332
+ },
9333
+ {
9334
+ "path": "targetHumidity",
9335
+ "valueType": "number"
9336
+ },
9337
+ {
9338
+ "path": "currentTemp",
9339
+ "valueType": "number"
9340
+ },
9341
+ {
9342
+ "path": "currentHumidity",
9343
+ "valueType": "number"
9344
+ },
9345
+ {
9346
+ "path": "swingVertical",
9347
+ "valueType": "boolean"
9348
+ },
9349
+ {
9350
+ "path": "swingHorizontal",
9351
+ "valueType": "boolean"
9352
+ },
9353
+ {
9354
+ "path": "minTemp",
9355
+ "valueType": "number"
9356
+ },
9357
+ {
9358
+ "path": "maxTemp",
9359
+ "valueType": "number"
9360
+ },
9361
+ {
9362
+ "path": "tempStep",
9363
+ "valueType": "number"
9364
+ }
9365
+ ],
9366
+ "color": [
9367
+ {
9368
+ "path": "mode",
9369
+ "valueType": "enum",
9370
+ "enumValues": [
9371
+ "rgb",
9372
+ "hsv",
9373
+ "mired"
9374
+ ]
9375
+ },
9376
+ {
9377
+ "path": "rgb.r",
9378
+ "valueType": "number"
9379
+ },
9380
+ {
9381
+ "path": "rgb.g",
9382
+ "valueType": "number"
9383
+ },
9384
+ {
9385
+ "path": "rgb.b",
9386
+ "valueType": "number"
9387
+ },
9388
+ {
9389
+ "path": "hsv.h",
9390
+ "valueType": "number"
9391
+ },
9392
+ {
9393
+ "path": "hsv.s",
9394
+ "valueType": "number"
9395
+ },
9396
+ {
9397
+ "path": "hsv.v",
9398
+ "valueType": "number"
9399
+ },
9400
+ {
9401
+ "path": "mireds",
9402
+ "valueType": "number"
9403
+ }
9404
+ ],
9405
+ "connectivity": [{
9406
+ "path": "connected",
9407
+ "valueType": "boolean"
9408
+ }],
9409
+ "contact": [{
9410
+ "path": "entryOpen",
9411
+ "valueType": "boolean"
9412
+ }],
9413
+ "control": [
9414
+ {
9415
+ "path": "kind",
9416
+ "valueType": "enum",
9417
+ "enumValues": [
9418
+ "numeric",
9419
+ "select",
9420
+ "text",
9421
+ "datetime"
9422
+ ]
9423
+ },
9424
+ {
9425
+ "path": "unit",
9426
+ "valueType": "string"
9427
+ },
9428
+ {
9429
+ "path": "min",
9430
+ "valueType": "number"
9431
+ },
9432
+ {
9433
+ "path": "max",
9434
+ "valueType": "number"
9435
+ },
9436
+ {
9437
+ "path": "step",
9438
+ "valueType": "number"
9439
+ },
9440
+ {
9441
+ "path": "precision",
9442
+ "valueType": "number"
9443
+ },
9444
+ {
9445
+ "path": "format",
9446
+ "valueType": "enum",
9447
+ "enumValues": [
9448
+ "date",
9449
+ "time",
9450
+ "datetime"
9451
+ ]
9452
+ }
9453
+ ],
9454
+ "cover": [
9455
+ {
9456
+ "path": "state",
9457
+ "valueType": "enum",
9458
+ "enumValues": [
9459
+ "open",
9460
+ "opening",
9461
+ "closing",
9462
+ "closed",
9463
+ "stopped"
9464
+ ]
9465
+ },
9466
+ {
9467
+ "path": "position",
9468
+ "valueType": "number"
9469
+ },
9470
+ {
9471
+ "path": "tiltPosition",
9472
+ "valueType": "number"
9473
+ }
9474
+ ],
9475
+ "day-night": [
9476
+ {
9477
+ "path": "mode",
9478
+ "valueType": "enum",
9479
+ "enumValues": [
9480
+ "auto",
9481
+ "day",
9482
+ "night",
9483
+ "schedule"
9484
+ ]
9485
+ },
9486
+ {
9487
+ "path": "sensitivity",
9488
+ "valueType": "number"
9489
+ },
9490
+ {
9491
+ "path": "switchDelaySec",
9492
+ "valueType": "number"
9493
+ }
9494
+ ],
9495
+ "device-adoption": [
9496
+ {
9497
+ "path": "lastDiscoveryAt",
9498
+ "valueType": "number"
9499
+ },
9500
+ {
9501
+ "path": "candidateCount",
9502
+ "valueType": "number"
9503
+ },
9504
+ {
9505
+ "path": "adoptedCount",
9506
+ "valueType": "number"
9507
+ },
9508
+ {
9509
+ "path": "lastError",
9510
+ "valueType": "string"
9511
+ }
9512
+ ],
9513
+ "device-discovery": [{
9514
+ "path": "lastDiscoveryAt",
9515
+ "valueType": "number"
9516
+ }, {
9517
+ "path": "lastError",
9518
+ "valueType": "string"
9519
+ }],
9520
+ "device-export": [
9521
+ {
9522
+ "path": "linkState",
9523
+ "valueType": "enum",
9524
+ "enumValues": [
9525
+ "unlinked",
9526
+ "linked",
9527
+ "error"
9528
+ ]
9529
+ },
9530
+ {
9531
+ "path": "exposedDeviceCount",
9532
+ "valueType": "number"
9533
+ },
9534
+ {
9535
+ "path": "error",
9536
+ "valueType": "string"
9537
+ },
9538
+ {
9539
+ "path": "setup.qr",
9540
+ "valueType": "string"
9541
+ },
9542
+ {
9543
+ "path": "setup.note",
9544
+ "valueType": "string"
9545
+ }
9546
+ ],
9547
+ "device-status": [{
9548
+ "path": "online",
9549
+ "valueType": "boolean"
9550
+ }],
9551
+ "dishwasher": [
9552
+ {
9553
+ "path": "availability",
9554
+ "valueType": "enum",
9555
+ "enumValues": [
9556
+ "available",
9557
+ "offline",
9558
+ "description-missing"
9559
+ ]
9560
+ },
9561
+ {
9562
+ "path": "state",
9563
+ "valueType": "enum",
9564
+ "enumValues": [
9565
+ "idle",
9566
+ "running",
9567
+ "paused",
9568
+ "finished",
9569
+ "error",
9570
+ "unavailable"
9571
+ ]
9572
+ },
9573
+ {
9574
+ "path": "operationState",
9575
+ "valueType": "enum",
9576
+ "enumValues": [
9577
+ "Inactive",
9578
+ "Ready",
9579
+ "DelayedStart",
9580
+ "Run",
9581
+ "Pause",
9582
+ "ActionRequired",
9583
+ "Finished",
9584
+ "Error",
9585
+ "Aborting"
9586
+ ]
9587
+ },
9588
+ {
9589
+ "path": "program",
9590
+ "valueType": "string"
9591
+ },
9592
+ {
9593
+ "path": "selectedProgram",
9594
+ "valueType": "string"
9595
+ },
9596
+ {
9597
+ "path": "remainingSeconds",
9598
+ "valueType": "number"
9599
+ },
9600
+ {
9601
+ "path": "delayedStartSeconds",
9602
+ "valueType": "number"
9603
+ },
9604
+ {
9605
+ "path": "progressPercent",
9606
+ "valueType": "number"
9607
+ },
9608
+ {
9609
+ "path": "doorOpen",
9610
+ "valueType": "boolean"
9611
+ },
9612
+ {
9613
+ "path": "doorLocked",
9614
+ "valueType": "boolean"
9615
+ },
9616
+ {
9617
+ "path": "remoteStartAllowed",
9618
+ "valueType": "boolean"
9619
+ },
9620
+ {
9621
+ "path": "remoteControlActive",
9622
+ "valueType": "boolean"
9623
+ },
9624
+ {
9625
+ "path": "localControlActive",
9626
+ "valueType": "boolean"
9627
+ },
9628
+ {
9629
+ "path": "powerOn",
9630
+ "valueType": "boolean"
9631
+ },
9632
+ {
9633
+ "path": "powerState",
9634
+ "valueType": "string"
9635
+ },
9636
+ {
9637
+ "path": "filterCleaningDue",
9638
+ "valueType": "boolean"
9639
+ },
9640
+ {
9641
+ "path": "machineCareDue",
9642
+ "valueType": "boolean"
9643
+ },
9644
+ {
9645
+ "path": "machineCareRemainingRuns",
9646
+ "valueType": "number"
9647
+ },
9648
+ {
9649
+ "path": "halfLoad",
9650
+ "valueType": "boolean"
9651
+ },
9652
+ {
9653
+ "path": "hygienePlus",
9654
+ "valueType": "boolean"
9655
+ },
9656
+ {
9657
+ "path": "extraDry",
9658
+ "valueType": "boolean"
9659
+ },
9660
+ {
9661
+ "path": "intensiveZone",
9662
+ "valueType": "boolean"
9663
+ },
9664
+ {
9665
+ "path": "varioSpeedPlus",
9666
+ "valueType": "boolean"
9667
+ },
9668
+ {
9669
+ "path": "childLock",
9670
+ "valueType": "boolean"
9671
+ },
9672
+ {
9673
+ "path": "errorCode",
9674
+ "valueType": "number"
9675
+ },
9676
+ {
9677
+ "path": "errorLabel",
9678
+ "valueType": "string"
9679
+ }
9680
+ ],
9681
+ "doorbell": [{
9682
+ "path": "lastPressedAt",
9683
+ "valueType": "number"
9684
+ }, {
9685
+ "path": "pressCountSinceStart",
9686
+ "valueType": "number"
9687
+ }],
9688
+ "enum-sensor": [{
9689
+ "path": "value",
9690
+ "valueType": "string"
9691
+ }, {
9692
+ "path": "format",
9693
+ "valueType": "enum",
9694
+ "enumValues": [
9695
+ "date",
9696
+ "time",
9697
+ "datetime"
9698
+ ]
9699
+ }],
9700
+ "event-emitter": [
9701
+ {
9702
+ "path": "lastEvent.deviceId",
9703
+ "valueType": "number"
9704
+ },
9705
+ {
9706
+ "path": "lastEvent.eventType",
9707
+ "valueType": "string"
9708
+ },
9709
+ {
9710
+ "path": "lastEvent.timestamp",
9711
+ "valueType": "number"
9712
+ },
9713
+ {
9714
+ "path": "lastEvent.seq",
9715
+ "valueType": "number"
9716
+ },
9717
+ {
9718
+ "path": "eventCountSinceStart",
9719
+ "valueType": "number"
9720
+ }
9721
+ ],
9722
+ "fan-control": [
9723
+ {
9724
+ "path": "percentage",
9725
+ "valueType": "number"
9726
+ },
9727
+ {
9728
+ "path": "percentageStep",
9729
+ "valueType": "number"
9730
+ },
9731
+ {
9732
+ "path": "preset",
9733
+ "valueType": "string"
9734
+ },
9735
+ {
9736
+ "path": "direction",
9737
+ "valueType": "enum",
9738
+ "enumValues": ["forward", "reverse"]
9739
+ },
9740
+ {
9741
+ "path": "oscillating",
9742
+ "valueType": "boolean"
9743
+ }
9744
+ ],
9745
+ "feature-probe": [
9746
+ {
9747
+ "path": "deviceType",
9748
+ "valueType": "string"
9749
+ },
9750
+ {
9751
+ "path": "model",
9752
+ "valueType": "string"
9753
+ },
9754
+ {
9755
+ "path": "channelCount",
9756
+ "valueType": "number"
9757
+ },
9758
+ {
9759
+ "path": "lastProbedAt",
9760
+ "valueType": "number"
9761
+ }
9762
+ ],
9763
+ "flood": [{
9764
+ "path": "flooded",
9765
+ "valueType": "boolean"
9766
+ }],
9767
+ "gas": [{
9768
+ "path": "detected",
9769
+ "valueType": "boolean"
9770
+ }],
9771
+ "heating-valve": [{
9772
+ "path": "position",
9773
+ "valueType": "number"
9774
+ }],
9775
+ "humidifier": [
9776
+ {
9777
+ "path": "on",
9778
+ "valueType": "boolean"
9779
+ },
9780
+ {
9781
+ "path": "currentHumidity",
9782
+ "valueType": "number"
9783
+ },
9784
+ {
9785
+ "path": "targetHumidity",
9786
+ "valueType": "number"
9787
+ },
9788
+ {
9789
+ "path": "mode",
9790
+ "valueType": "string"
9791
+ },
9792
+ {
9793
+ "path": "action",
9794
+ "valueType": "string"
9795
+ },
9796
+ {
9797
+ "path": "minHumidity",
9798
+ "valueType": "number"
9799
+ },
9800
+ {
9801
+ "path": "maxHumidity",
9802
+ "valueType": "number"
9803
+ }
9804
+ ],
9805
+ "humidity-sensor": [
9806
+ {
9807
+ "path": "percent",
9808
+ "valueType": "number"
9809
+ },
9810
+ {
9811
+ "path": "unit",
9812
+ "valueType": "string"
9813
+ },
9814
+ {
9815
+ "path": "precision",
9816
+ "valueType": "number"
9817
+ }
9818
+ ],
9819
+ "image": [{
9820
+ "path": "url",
9821
+ "valueType": "string"
9822
+ }, {
9823
+ "path": "lastUpdated",
9824
+ "valueType": "number"
9825
+ }],
9826
+ "image-settings": [
9827
+ {
9828
+ "path": "brightness",
9829
+ "valueType": "number"
9830
+ },
9831
+ {
9832
+ "path": "contrast",
9833
+ "valueType": "number"
9834
+ },
9835
+ {
9836
+ "path": "saturation",
9837
+ "valueType": "number"
9838
+ },
9839
+ {
9840
+ "path": "sharpness",
9841
+ "valueType": "number"
9842
+ },
9843
+ {
9844
+ "path": "mirror",
9845
+ "valueType": "boolean"
9846
+ },
9847
+ {
9848
+ "path": "flip",
9849
+ "valueType": "boolean"
9850
+ },
9851
+ {
9852
+ "path": "rotate",
9853
+ "valueType": "enum",
9854
+ "enumValues": [
9855
+ "0",
9856
+ "90",
9857
+ "180",
9858
+ "270"
9859
+ ]
9860
+ },
9861
+ {
9862
+ "path": "whiteBalance",
9863
+ "valueType": "enum",
9864
+ "enumValues": ["auto", "manual"]
9865
+ },
9866
+ {
9867
+ "path": "warmth",
9868
+ "valueType": "number"
9869
+ },
9870
+ {
9871
+ "path": "exposureMode",
9872
+ "valueType": "enum",
9873
+ "enumValues": ["auto", "manual"]
9874
+ },
9875
+ {
9876
+ "path": "backlightMode",
9877
+ "valueType": "enum",
9878
+ "enumValues": [
9879
+ "off",
9880
+ "blc",
9881
+ "wdr",
9882
+ "hlc"
9883
+ ]
9884
+ }
9885
+ ],
9886
+ "intercom": [
9887
+ {
9888
+ "path": "talking",
9889
+ "valueType": "boolean"
9890
+ },
9891
+ {
9892
+ "path": "lastSessionAt",
9893
+ "valueType": "number"
9894
+ },
9895
+ {
9896
+ "path": "ability.sampleRate",
9897
+ "valueType": "number"
9898
+ },
9899
+ {
9900
+ "path": "ability.duplex",
9901
+ "valueType": "enum",
9902
+ "enumValues": ["half", "full"]
9903
+ },
9904
+ {
9905
+ "path": "ability.maxBacklogMs",
9906
+ "valueType": "number"
9907
+ }
9908
+ ],
9909
+ "lawn-mower-control": [
9910
+ {
9911
+ "path": "activity",
9912
+ "valueType": "enum",
9913
+ "enumValues": [
9914
+ "idle",
9915
+ "mowing",
9916
+ "paused",
9917
+ "docked",
9918
+ "error"
9919
+ ]
9920
+ },
9921
+ {
9922
+ "path": "batteryLevel",
9923
+ "valueType": "number"
9924
+ },
9925
+ {
9926
+ "path": "progressPercent",
9927
+ "valueType": "number"
9928
+ },
9929
+ {
9930
+ "path": "currentCode",
9931
+ "valueType": "number"
9932
+ },
9933
+ {
9934
+ "path": "currentCodeLabel",
9935
+ "valueType": "string"
9936
+ },
9937
+ {
9938
+ "path": "severity",
9939
+ "valueType": "enum",
9940
+ "enumValues": [
9941
+ "info",
9942
+ "warning",
9943
+ "error"
9944
+ ]
9945
+ }
9946
+ ],
9947
+ "lock-control": [{
9948
+ "path": "state",
9949
+ "valueType": "enum",
9950
+ "enumValues": [
9951
+ "locked",
9952
+ "unlocked",
9953
+ "locking",
9954
+ "unlocking",
9955
+ "jammed"
9956
+ ]
9957
+ }],
9958
+ "media-player": [
9959
+ {
9960
+ "path": "state",
9961
+ "valueType": "enum",
9962
+ "enumValues": [
9963
+ "off",
9964
+ "on",
9965
+ "idle",
9966
+ "playing",
9967
+ "paused",
9968
+ "buffering",
9969
+ "standby"
9970
+ ]
9971
+ },
9972
+ {
9973
+ "path": "volumeLevel",
9974
+ "valueType": "number"
9975
+ },
9976
+ {
9977
+ "path": "isMuted",
9978
+ "valueType": "boolean"
9979
+ },
9980
+ {
9981
+ "path": "source",
9982
+ "valueType": "string"
9983
+ },
9984
+ {
9985
+ "path": "currentMedia.type",
9986
+ "valueType": "string"
9987
+ },
9988
+ {
9989
+ "path": "currentMedia.title",
9990
+ "valueType": "string"
9991
+ },
9992
+ {
9993
+ "path": "currentMedia.artist",
9994
+ "valueType": "string"
9995
+ },
9996
+ {
9997
+ "path": "currentMedia.album",
9998
+ "valueType": "string"
9999
+ },
10000
+ {
10001
+ "path": "currentMedia.imageUrl",
10002
+ "valueType": "string"
10003
+ },
10004
+ {
10005
+ "path": "positionMs",
10006
+ "valueType": "number"
10007
+ },
10008
+ {
10009
+ "path": "durationMs",
10010
+ "valueType": "number"
10011
+ },
10012
+ {
10013
+ "path": "shuffle",
10014
+ "valueType": "boolean"
10015
+ },
10016
+ {
10017
+ "path": "repeat",
10018
+ "valueType": "enum",
10019
+ "enumValues": [
10020
+ "off",
10021
+ "all",
10022
+ "one"
10023
+ ]
10024
+ }
10025
+ ],
10026
+ "motion": [
10027
+ {
10028
+ "path": "detected",
10029
+ "valueType": "boolean"
10030
+ },
10031
+ {
10032
+ "path": "lastDetectedAt",
10033
+ "valueType": "number"
10034
+ },
10035
+ {
10036
+ "path": "autoClearAfterMs",
10037
+ "valueType": "number"
10038
+ }
10039
+ ],
10040
+ "motion-trigger": [{
10041
+ "path": "enabled",
10042
+ "valueType": "boolean"
10043
+ }],
10044
+ "motion-zones": [{
10045
+ "path": "enabled",
10046
+ "valueType": "boolean"
10047
+ }, {
10048
+ "path": "sensitivity",
10049
+ "valueType": "number"
10050
+ }],
10051
+ "mqtt-broker": [{
10052
+ "path": "brokerCount",
10053
+ "valueType": "number"
10054
+ }, {
10055
+ "path": "embeddedRunning",
10056
+ "valueType": "boolean"
10057
+ }],
10058
+ "native-object-detection": [{
10059
+ "path": "enabled",
10060
+ "valueType": "boolean"
10061
+ }],
10062
+ "navigation": [
10063
+ {
10064
+ "path": "mode",
10065
+ "valueType": "enum",
10066
+ "enumValues": [
10067
+ "idle",
10068
+ "cleaning",
10069
+ "spot",
10070
+ "following",
10071
+ "goto",
10072
+ "returning",
10073
+ "paused",
10074
+ "unknown"
10075
+ ]
10076
+ },
10077
+ {
10078
+ "path": "following",
10079
+ "valueType": "boolean"
10080
+ },
10081
+ {
10082
+ "path": "flash",
10083
+ "valueType": "boolean"
10084
+ },
10085
+ {
10086
+ "path": "lightMode",
10087
+ "valueType": "enum",
10088
+ "enumValues": ["auto", "manual"]
10089
+ },
10090
+ {
10091
+ "path": "lightLevel",
10092
+ "valueType": "number"
10093
+ }
10094
+ ],
10095
+ "network-link": [
10096
+ {
10097
+ "path": "type",
10098
+ "valueType": "enum",
10099
+ "enumValues": [
10100
+ "wifi",
10101
+ "ethernet",
10102
+ "cellular",
10103
+ "unknown"
10104
+ ]
10105
+ },
10106
+ {
10107
+ "path": "signalPercent",
10108
+ "valueType": "number"
10109
+ },
10110
+ {
10111
+ "path": "rssiDbm",
10112
+ "valueType": "number"
10113
+ },
10114
+ {
10115
+ "path": "ssid",
10116
+ "valueType": "string"
10117
+ },
10118
+ {
10119
+ "path": "lastUpdated",
10120
+ "valueType": "number"
10121
+ }
10122
+ ],
10123
+ "notifier": [
10124
+ {
10125
+ "path": "lastSentAt",
10126
+ "valueType": "number"
10127
+ },
10128
+ {
10129
+ "path": "lastError",
10130
+ "valueType": "string"
10131
+ },
10132
+ {
10133
+ "path": "queueDepth",
10134
+ "valueType": "number"
10135
+ },
10136
+ {
10137
+ "path": "supports.image",
10138
+ "valueType": "boolean"
10139
+ },
10140
+ {
10141
+ "path": "supports.priority",
10142
+ "valueType": "boolean"
10143
+ },
10144
+ {
10145
+ "path": "supports.data",
10146
+ "valueType": "boolean"
10147
+ },
10148
+ {
10149
+ "path": "supports.actions",
10150
+ "valueType": "boolean"
10151
+ },
10152
+ {
10153
+ "path": "supports.recipients",
10154
+ "valueType": "boolean"
10155
+ }
10156
+ ],
10157
+ "numeric-sensor": [
10158
+ {
10159
+ "path": "value",
10160
+ "valueType": "number"
10161
+ },
10162
+ {
10163
+ "path": "unit",
10164
+ "valueType": "string"
10165
+ },
10166
+ {
10167
+ "path": "precision",
10168
+ "valueType": "number"
10169
+ }
10170
+ ],
10171
+ "pet-feeder": [
10172
+ {
10173
+ "path": "foodLevel",
10174
+ "valueType": "number"
10175
+ },
10176
+ {
10177
+ "path": "food1",
10178
+ "valueType": "number"
10179
+ },
10180
+ {
10181
+ "path": "food2",
10182
+ "valueType": "number"
10183
+ },
10184
+ {
10185
+ "path": "lowFood",
10186
+ "valueType": "boolean"
10187
+ },
10188
+ {
10189
+ "path": "batteryPower",
10190
+ "valueType": "number"
10191
+ },
10192
+ {
10193
+ "path": "desiccantLeftDays",
10194
+ "valueType": "number"
10195
+ },
10196
+ {
10197
+ "path": "feeding",
10198
+ "valueType": "boolean"
10199
+ },
10200
+ {
10201
+ "path": "status",
10202
+ "valueType": "enum",
10203
+ "enumValues": [
10204
+ "normal",
10205
+ "offline",
10206
+ "on_batteries"
10207
+ ]
10208
+ },
10209
+ {
10210
+ "path": "error",
10211
+ "valueType": "string"
10212
+ },
10213
+ {
10214
+ "path": "errorCode",
10215
+ "valueType": "number"
10216
+ },
10217
+ {
10218
+ "path": "isDualHopper",
10219
+ "valueType": "boolean"
10220
+ },
10221
+ {
10222
+ "path": "childLock",
10223
+ "valueType": "boolean"
10224
+ },
10225
+ {
10226
+ "path": "indicatorLight",
10227
+ "valueType": "boolean"
10228
+ },
10229
+ {
10230
+ "path": "feedSound",
10231
+ "valueType": "boolean"
10232
+ },
10233
+ {
10234
+ "path": "volume",
10235
+ "valueType": "number"
10236
+ }
10237
+ ],
10238
+ "power-meter": [
10239
+ {
10240
+ "path": "watts",
10241
+ "valueType": "number"
10242
+ },
10243
+ {
10244
+ "path": "kwhTotal",
10245
+ "valueType": "number"
10246
+ },
10247
+ {
10248
+ "path": "volts",
10249
+ "valueType": "number"
10250
+ },
10251
+ {
10252
+ "path": "amps",
10253
+ "valueType": "number"
10254
+ },
10255
+ {
10256
+ "path": "va",
10257
+ "valueType": "number"
10258
+ },
10259
+ {
10260
+ "path": "powerFactor",
10261
+ "valueType": "number"
10262
+ },
10263
+ {
10264
+ "path": "unit",
10265
+ "valueType": "string"
10266
+ },
10267
+ {
10268
+ "path": "precision",
10269
+ "valueType": "number"
10270
+ }
10271
+ ],
10272
+ "presence": [
10273
+ {
10274
+ "path": "state",
10275
+ "valueType": "string"
10276
+ },
10277
+ {
10278
+ "path": "location",
10279
+ "valueType": "string"
10280
+ },
10281
+ {
10282
+ "path": "gps.latitude",
10283
+ "valueType": "number"
10284
+ },
10285
+ {
10286
+ "path": "gps.longitude",
10287
+ "valueType": "number"
10288
+ },
10289
+ {
10290
+ "path": "gps.accuracyMeters",
10291
+ "valueType": "number"
10292
+ },
10293
+ {
10294
+ "path": "batteryPercent",
10295
+ "valueType": "number"
10296
+ }
10297
+ ],
10298
+ "pressure-sensor": [
10299
+ {
10300
+ "path": "hpa",
10301
+ "valueType": "number"
10302
+ },
10303
+ {
10304
+ "path": "unit",
10305
+ "valueType": "string"
10306
+ },
10307
+ {
10308
+ "path": "precision",
10309
+ "valueType": "number"
10310
+ }
10311
+ ],
10312
+ "privacy-mask": [{
10313
+ "path": "enabled",
10314
+ "valueType": "boolean"
10315
+ }, {
10316
+ "path": "audioEnabled",
10317
+ "valueType": "boolean"
10318
+ }],
10319
+ "ptz": [
10320
+ {
10321
+ "path": "pan",
10322
+ "valueType": "number"
10323
+ },
10324
+ {
10325
+ "path": "tilt",
10326
+ "valueType": "number"
10327
+ },
10328
+ {
10329
+ "path": "zoom",
10330
+ "valueType": "number"
10331
+ },
10332
+ {
10333
+ "path": "autofocus",
10334
+ "valueType": "boolean"
10335
+ }
10336
+ ],
10337
+ "ptz-autotrack": [
10338
+ {
10339
+ "path": "enabled",
10340
+ "valueType": "boolean"
10341
+ },
10342
+ {
10343
+ "path": "currentSettings.targetType",
10344
+ "valueType": "string"
10345
+ },
10346
+ {
10347
+ "path": "currentSettings.stopDelaySeconds",
10348
+ "valueType": "number"
10349
+ },
10350
+ {
10351
+ "path": "currentSettings.disappearDelaySeconds",
10352
+ "valueType": "number"
10353
+ }
10354
+ ],
10355
+ "recording-archive": [
10356
+ {
10357
+ "path": "deviceId",
10358
+ "valueType": "number"
10359
+ },
10360
+ {
10361
+ "path": "enabled",
10362
+ "valueType": "boolean"
10363
+ },
10364
+ {
10365
+ "path": "activeMode",
10366
+ "valueType": "enum",
10367
+ "enumValues": [
10368
+ "off",
10369
+ "events",
10370
+ "continuous",
10371
+ "on-device-decision"
10372
+ ]
10373
+ },
10374
+ {
10375
+ "path": "nodeId",
10376
+ "valueType": "string"
10377
+ },
10378
+ {
10379
+ "path": "storageBytes",
10380
+ "valueType": "number"
10381
+ }
10382
+ ],
10383
+ "recording-onboard": [
10384
+ {
10385
+ "path": "primaryTrackId",
10386
+ "valueType": "string"
10387
+ },
10388
+ {
10389
+ "path": "enabled",
10390
+ "valueType": "boolean"
10391
+ },
10392
+ {
10393
+ "path": "overwriteWhenFull",
10394
+ "valueType": "boolean"
10395
+ },
10396
+ {
10397
+ "path": "preRecordSec",
10398
+ "valueType": "number"
10399
+ },
10400
+ {
10401
+ "path": "postRecordSec",
10402
+ "valueType": "number"
10403
+ },
10404
+ {
10405
+ "path": "segmentMinutes",
10406
+ "valueType": "number"
10407
+ },
10408
+ {
10409
+ "path": "unreadableWindows",
10410
+ "valueType": "number"
10411
+ },
10412
+ {
10413
+ "path": "recordingToNowhere",
10414
+ "valueType": "boolean"
10415
+ }
10416
+ ],
10417
+ "recording-signal": [{
10418
+ "path": "active",
10419
+ "valueType": "boolean"
10420
+ }, {
10421
+ "path": "reason",
10422
+ "valueType": "string"
10423
+ }],
10424
+ "running-state": [
10425
+ {
10426
+ "path": "running",
10427
+ "valueType": "boolean"
10428
+ },
10429
+ {
10430
+ "path": "since",
10431
+ "valueType": "number"
10432
+ },
10433
+ {
10434
+ "path": "source",
10435
+ "valueType": "enum",
10436
+ "enumValues": ["native", "assigned"]
10437
+ },
10438
+ {
10439
+ "path": "phase",
10440
+ "valueType": "string"
10441
+ }
10442
+ ],
10443
+ "script-runner": [
10444
+ {
10445
+ "path": "isRunning",
10446
+ "valueType": "boolean"
10447
+ },
10448
+ {
10449
+ "path": "lastRunAt",
10450
+ "valueType": "number"
10451
+ },
10452
+ {
10453
+ "path": "lastRunSuccess",
10454
+ "valueType": "boolean"
10455
+ },
10456
+ {
10457
+ "path": "lastError",
10458
+ "valueType": "string"
10459
+ }
10460
+ ],
10461
+ "smoke": [{
10462
+ "path": "detected",
10463
+ "valueType": "boolean"
10464
+ }],
10465
+ "snapshot": [
10466
+ {
10467
+ "path": "lastCapturedAt",
10468
+ "valueType": "number"
10469
+ },
10470
+ {
10471
+ "path": "cacheAgeMs",
10472
+ "valueType": "number"
10473
+ },
10474
+ {
10475
+ "path": "lastBytes",
10476
+ "valueType": "number"
10477
+ },
10478
+ {
10479
+ "path": "lastStreamId",
10480
+ "valueType": "string"
10481
+ }
10482
+ ],
10483
+ "stream-params": [
10484
+ {
10485
+ "path": "main.width",
10486
+ "valueType": "number"
10487
+ },
10488
+ {
10489
+ "path": "main.height",
10490
+ "valueType": "number"
10491
+ },
10492
+ {
10493
+ "path": "main.codec",
10494
+ "valueType": "enum",
10495
+ "enumValues": ["h264", "h265"]
10496
+ },
10497
+ {
10498
+ "path": "main.framerate",
10499
+ "valueType": "number"
10500
+ },
10501
+ {
10502
+ "path": "main.bitrate",
10503
+ "valueType": "number"
10504
+ },
10505
+ {
10506
+ "path": "main.bitrateMode",
10507
+ "valueType": "enum",
10508
+ "enumValues": ["vbr", "cbr"]
10509
+ },
10510
+ {
10511
+ "path": "main.encoderProfile",
10512
+ "valueType": "enum",
10513
+ "enumValues": [
10514
+ "high",
10515
+ "main",
10516
+ "baseline"
10517
+ ]
10518
+ },
10519
+ {
10520
+ "path": "main.gop",
10521
+ "valueType": "number"
10522
+ },
10523
+ {
10524
+ "path": "main.audio",
10525
+ "valueType": "boolean"
10526
+ },
10527
+ {
10528
+ "path": "sub.width",
10529
+ "valueType": "number"
10530
+ },
10531
+ {
10532
+ "path": "sub.height",
10533
+ "valueType": "number"
10534
+ },
10535
+ {
10536
+ "path": "sub.codec",
10537
+ "valueType": "enum",
10538
+ "enumValues": ["h264", "h265"]
10539
+ },
10540
+ {
10541
+ "path": "sub.framerate",
10542
+ "valueType": "number"
10543
+ },
10544
+ {
10545
+ "path": "sub.bitrate",
10546
+ "valueType": "number"
10547
+ },
10548
+ {
10549
+ "path": "sub.bitrateMode",
10550
+ "valueType": "enum",
10551
+ "enumValues": ["vbr", "cbr"]
10552
+ },
10553
+ {
10554
+ "path": "sub.encoderProfile",
10555
+ "valueType": "enum",
10556
+ "enumValues": [
10557
+ "high",
10558
+ "main",
10559
+ "baseline"
10560
+ ]
10561
+ },
10562
+ {
10563
+ "path": "sub.gop",
10564
+ "valueType": "number"
10565
+ },
10566
+ {
10567
+ "path": "sub.audio",
10568
+ "valueType": "boolean"
10569
+ },
10570
+ {
10571
+ "path": "ext.width",
10572
+ "valueType": "number"
10573
+ },
10574
+ {
10575
+ "path": "ext.height",
10576
+ "valueType": "number"
10577
+ },
10578
+ {
10579
+ "path": "ext.codec",
10580
+ "valueType": "enum",
10581
+ "enumValues": ["h264", "h265"]
10582
+ },
10583
+ {
10584
+ "path": "ext.framerate",
10585
+ "valueType": "number"
10586
+ },
10587
+ {
10588
+ "path": "ext.bitrate",
10589
+ "valueType": "number"
10590
+ },
10591
+ {
10592
+ "path": "ext.bitrateMode",
10593
+ "valueType": "enum",
10594
+ "enumValues": ["vbr", "cbr"]
10595
+ },
10596
+ {
10597
+ "path": "ext.encoderProfile",
10598
+ "valueType": "enum",
10599
+ "enumValues": [
10600
+ "high",
10601
+ "main",
10602
+ "baseline"
10603
+ ]
10604
+ },
10605
+ {
10606
+ "path": "ext.gop",
10607
+ "valueType": "number"
10608
+ },
10609
+ {
10610
+ "path": "ext.audio",
10611
+ "valueType": "boolean"
10612
+ }
10613
+ ],
10614
+ "switch": [{
10615
+ "path": "on",
10616
+ "valueType": "boolean"
10617
+ }],
10618
+ "tamper": [{
10619
+ "path": "tampered",
10620
+ "valueType": "boolean"
10621
+ }],
10622
+ "temperature-sensor": [
10623
+ {
10624
+ "path": "celsius",
10625
+ "valueType": "number"
10626
+ },
10627
+ {
10628
+ "path": "unit",
10629
+ "valueType": "string"
10630
+ },
10631
+ {
10632
+ "path": "precision",
10633
+ "valueType": "number"
10634
+ }
10635
+ ],
10636
+ "update": [
10637
+ {
10638
+ "path": "currentVersion",
10639
+ "valueType": "string"
10640
+ },
10641
+ {
10642
+ "path": "availableVersion",
10643
+ "valueType": "string"
10644
+ },
10645
+ {
10646
+ "path": "updatable",
10647
+ "valueType": "boolean"
10648
+ },
10649
+ {
10650
+ "path": "state",
10651
+ "valueType": "string"
10652
+ },
10653
+ {
10654
+ "path": "inProgress",
10655
+ "valueType": "boolean"
10656
+ }
10657
+ ],
10658
+ "vacuum-control": [
10659
+ {
10660
+ "path": "state",
10661
+ "valueType": "enum",
10662
+ "enumValues": [
10663
+ "idle",
10664
+ "cleaning",
10665
+ "paused",
10666
+ "returning",
10667
+ "docked",
10668
+ "drying",
10669
+ "error"
10670
+ ]
10671
+ },
10672
+ {
10673
+ "path": "batteryLevel",
10674
+ "valueType": "number"
10675
+ },
10676
+ {
10677
+ "path": "fanSpeed",
10678
+ "valueType": "string"
10679
+ },
10680
+ {
10681
+ "path": "progressPercent",
10682
+ "valueType": "number"
10683
+ },
10684
+ {
10685
+ "path": "errorCode",
10686
+ "valueType": "number"
10687
+ },
10688
+ {
10689
+ "path": "errorLabel",
10690
+ "valueType": "string"
10691
+ }
10692
+ ],
10693
+ "valve": [{
10694
+ "path": "state",
10695
+ "valueType": "enum",
10696
+ "enumValues": [
10697
+ "open",
10698
+ "opening",
10699
+ "closing",
10700
+ "closed",
10701
+ "stopped"
10702
+ ]
10703
+ }, {
10704
+ "path": "position",
10705
+ "valueType": "number"
10706
+ }],
10707
+ "vibration": [{
10708
+ "path": "detected",
10709
+ "valueType": "boolean"
10710
+ }],
10711
+ "water-heater": [
10712
+ {
10713
+ "path": "currentTemp",
10714
+ "valueType": "number"
10715
+ },
10716
+ {
10717
+ "path": "targetTemp",
10718
+ "valueType": "number"
10719
+ },
10720
+ {
10721
+ "path": "operationMode",
10722
+ "valueType": "string"
10723
+ },
10724
+ {
10725
+ "path": "away",
10726
+ "valueType": "boolean"
10727
+ },
10728
+ {
10729
+ "path": "minTemp",
10730
+ "valueType": "number"
10731
+ },
10732
+ {
10733
+ "path": "maxTemp",
10734
+ "valueType": "number"
10735
+ }
10736
+ ],
10737
+ "weather": [
10738
+ {
10739
+ "path": "condition",
10740
+ "valueType": "string"
10741
+ },
10742
+ {
10743
+ "path": "temperature",
10744
+ "valueType": "number"
10745
+ },
10746
+ {
10747
+ "path": "temperatureUnit",
10748
+ "valueType": "string"
10749
+ },
10750
+ {
10751
+ "path": "humidity",
10752
+ "valueType": "number"
10753
+ },
10754
+ {
10755
+ "path": "pressure",
10756
+ "valueType": "number"
10757
+ },
10758
+ {
10759
+ "path": "pressureUnit",
10760
+ "valueType": "string"
10761
+ },
10762
+ {
10763
+ "path": "windSpeed",
10764
+ "valueType": "number"
10765
+ },
10766
+ {
10767
+ "path": "windSpeedUnit",
10768
+ "valueType": "string"
10769
+ },
10770
+ {
10771
+ "path": "windBearing",
10772
+ "valueType": "number"
10773
+ }
10774
+ ],
10775
+ "zone-analytics": [
10776
+ {
10777
+ "path": "ts",
10778
+ "valueType": "number"
10779
+ },
10780
+ {
10781
+ "path": "frameWidth",
10782
+ "valueType": "number"
10783
+ },
10784
+ {
10785
+ "path": "frameHeight",
10786
+ "valueType": "number"
10787
+ },
10788
+ {
10789
+ "path": "frame.totalObjects",
10790
+ "valueType": "number"
10791
+ },
10792
+ {
10793
+ "path": "frame.standingObjects",
10794
+ "valueType": "number"
10795
+ },
10796
+ {
10797
+ "path": "frame.transientObjects",
10798
+ "valueType": "number"
10799
+ },
10800
+ {
10801
+ "path": "unzoned.totalObjects",
10802
+ "valueType": "number"
10803
+ },
10804
+ {
10805
+ "path": "unzoned.standingObjects",
10806
+ "valueType": "number"
10807
+ },
10808
+ {
10809
+ "path": "unzoned.transientObjects",
10810
+ "valueType": "number"
10811
+ }
10812
+ ]
10813
+ });
8840
10814
  object({
8841
10815
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8842
10816
  params: record(string(), union([string(), number()])).optional()
@@ -9195,7 +11169,7 @@ function errMsg(err) {
9195
11169
  return String(err);
9196
11170
  }
9197
11171
  //#endregion
9198
- //#region ../types/dist/composition-BJ8iAZb3.mjs
11172
+ //#region ../types/dist/composition-kEl9mevu.mjs
9199
11173
  /**
9200
11174
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9201
11175
  *
@@ -12554,7 +14528,7 @@ var LogChannelDescriptorSchema = object({
12554
14528
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12555
14529
  * consulted with the numeric device id, AND every line the channel admits
12556
14530
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12557
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14531
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12558
14532
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12559
14533
  * the body is the only way to filter.
12560
14534
  *
@@ -12742,7 +14716,7 @@ var ModelVariantGroupSchema = object({
12742
14716
  precision: _enum(["fp32", "int8"]).optional(),
12743
14717
  /**
12744
14718
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12745
- * an alternate training of the same family (Scrypted `relu_test`); chip
14719
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12746
14720
  * label is "Test".
12747
14721
  */
12748
14722
  optimization: _enum(["standard", "test"]).optional(),
@@ -12994,8 +14968,8 @@ var ModelCatalogEntrySchema = object({
12994
14968
  provider: ModelProviderIdSchema.optional(),
12995
14969
  /**
12996
14970
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12997
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12998
- * labels already ARE the CamStack macros (Scrypted identity map).
14971
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14972
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12999
14973
  */
13000
14974
  classMap: DetectionCatalogClassMapSchema.optional(),
13001
14975
  /**
@@ -16032,7 +18006,7 @@ method(object({
16032
18006
  * `1` is real time and is the ONLY value that allows the copy branch —
16033
18007
  * anything else forces `libx264` over the window. That was priced
16034
18008
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
16035
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
18009
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
16036
18010
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
16037
18011
  * once the decode is forced the width stops being free.
16038
18012
  */
@@ -16558,6 +18532,7 @@ var CompositionRunStatusSchema = _enum([
16558
18532
  "starting",
16559
18533
  "running",
16560
18534
  "degraded",
18535
+ "incomplete",
16561
18536
  "failed"
16562
18537
  ]);
16563
18538
  var CompositionFieldStateKindSchema = _enum([
@@ -16607,6 +18582,13 @@ var ComposerUnreadableBlockSchema = object({
16607
18582
  /** The parse error, in the operator's words. */
16608
18583
  error: string()
16609
18584
  });
18585
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
18586
+ var UnreleasedClaimSchema = object({
18587
+ deviceId: number().int(),
18588
+ capName: string(),
18589
+ owner: string(),
18590
+ error: string()
18591
+ });
16610
18592
  method(object({
16611
18593
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16612
18594
  integrationId: string().nullable(),
@@ -16616,7 +18598,13 @@ method(object({
16616
18598
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16617
18599
  restartBlockIds: array(string()),
16618
18600
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16619
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
18601
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
18602
+ /**
18603
+ * Operator-confirmed deletions. Their claims are released on this apply,
18604
+ * before any replacement block claims. A block that merely vanished from the
18605
+ * snapshot is not listed here and still waits for two applies (D49).
18606
+ */
18607
+ retiredBlockIds: array(string()).optional()
16620
18608
  }), object({
16621
18609
  blocks: array(object({
16622
18610
  blockId: string(),
@@ -16628,7 +18616,13 @@ method(object({
16628
18616
  * integration unknown, its own rows unread or read empty once). An empty
16629
18617
  * apply the caller owes is paid off only by one the composer acted on (D49).
16630
18618
  */
16631
- acted: boolean()
18619
+ acted: boolean(),
18620
+ /**
18621
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
18622
+ * every one landed (or there was nothing to hand back). Absent on a result
18623
+ * that never got that far.
18624
+ */
18625
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16632
18626
  }), {
16633
18627
  kind: "mutation",
16634
18628
  auth: "admin"
@@ -16752,6 +18746,7 @@ var CoreBlockStatusSchema = _enum([
16752
18746
  "starting",
16753
18747
  "running",
16754
18748
  "degraded",
18749
+ "incomplete",
16755
18750
  "failed"
16756
18751
  ]);
16757
18752
  /** path → TypeScript source for a multi-file block. */
@@ -39020,7 +41015,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
39020
41015
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
39021
41016
  * operator's casing. The registry matches labels trimmed + case-insensitively
39022
41017
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
39023
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
41018
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
39024
41019
  * map keyed on the displayed casing would orphan its entry on exactly that
39025
41020
  * edit. Consumers join by keying their own label through `locationIconKey`.
39026
41021
  */
@@ -39045,7 +41040,7 @@ var LocationDescriptionAssignmentSchema = object({
39045
41040
  /**
39046
41041
  * A SITE ZONE — a named part of the property that several locations belong to.
39047
41042
  *
39048
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
41043
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
39049
41044
  * kitchen. A camera belongs to exactly one location, and a location to at most
39050
41045
  * one zone, so a camera's zone is derived and never stored on the device: the
39051
41046
  * whole point of this entity is that grouping rooms touches no device row.
@@ -39074,7 +41069,7 @@ var LocationDescriptionAssignmentSchema = object({
39074
41069
  * the locations inside it.
39075
41070
  *
39076
41071
  * The LABEL is carried alongside the key because the key is lossy on purpose —
39077
- * a surface must show "Zona notte", not "zona notte". Locations are carried
41072
+ * a surface must show "Night zone", not "night zone". Locations are carried
39078
41073
  * here, rather than left to a second call, because every consumer wants both
39079
41074
  * at once and a viewer that asked twice could render a zone whose membership
39080
41075
  * it has not fetched yet.
@@ -41268,8 +43263,8 @@ var LoadContributionSchema = object({
41268
43263
  "unattributable"
41269
43264
  ]),
41270
43265
  /**
41271
- * What ONE entry is, in the contributor's own words — `615/high`,
41272
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
43266
+ * What ONE entry is, in the contributor's own words — `101/high`,
43267
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
41273
43268
  * family and inventing a common one would lose the only information that
41274
43269
  * makes two entries for the same camera distinguishable.
41275
43270
  */
@@ -42939,6 +44934,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42939
44934
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42940
44935
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42941
44936
  /**
44937
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
44938
+ * not entries. `heatmapScrub` is a mark, not an event kind.
44939
+ */
44940
+ var PALETTE_ENTRY_IDS = [
44941
+ "motion",
44942
+ "audio",
44943
+ "recording",
44944
+ "live",
44945
+ "heatmapScrub",
44946
+ "person",
44947
+ "vehicle",
44948
+ "animal",
44949
+ "package",
44950
+ "sensor",
44951
+ "control",
44952
+ "face",
44953
+ "plate",
44954
+ "car",
44955
+ "truck",
44956
+ "bus",
44957
+ "motorcycle",
44958
+ "bicycle",
44959
+ "airplane",
44960
+ "boat",
44961
+ "train",
44962
+ "bird",
44963
+ "dog",
44964
+ "cat",
44965
+ "horse",
44966
+ "sheep",
44967
+ "cow",
44968
+ "elephant",
44969
+ "bear",
44970
+ "zebra",
44971
+ "giraffe",
44972
+ "package-delivered",
44973
+ "package-picked-up",
44974
+ "suitcase",
44975
+ "backpack",
44976
+ "handbag",
44977
+ "contact",
44978
+ "motion-sensor",
44979
+ "smoke",
44980
+ "flood",
44981
+ "gas",
44982
+ "carbon-monoxide",
44983
+ "vibration",
44984
+ "tamper",
44985
+ "presence",
44986
+ "enum-sensor",
44987
+ "device-event",
44988
+ "lock",
44989
+ "cover",
44990
+ "switch",
44991
+ "siren",
44992
+ "button",
44993
+ "doorbell"
44994
+ ];
44995
+ var AUDIO_ENTRY_ID = "audio";
44996
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
44997
+ var AUDIO_GRADIENT_ALPHAS = [
44998
+ .3,
44999
+ .42,
45000
+ .55,
45001
+ .7,
45002
+ .85,
45003
+ 1
45004
+ ];
45005
+ var PALETTE_PRESET_IDS = [
45006
+ "camstack",
45007
+ "high-contrast",
45008
+ "okabe-ito"
45009
+ ];
45010
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
45011
+ var CAMSTACK_HEX = {
45012
+ motion: "#d946ef",
45013
+ audio: "#059eb8",
45014
+ recording: "#ef4444",
45015
+ live: "#8d7a00",
45016
+ heatmapScrub: "#4b32ff",
45017
+ person: "#11a64c",
45018
+ vehicle: "#3b82f6",
45019
+ animal: "#ea6a09",
45020
+ package: "#924667",
45021
+ sensor: "#624bbc",
45022
+ control: "#944d24",
45023
+ face: "#ed4f8d",
45024
+ plate: "#4b7027",
45025
+ car: "#9684cf",
45026
+ truck: "#0f9b89",
45027
+ bus: "#a734a9",
45028
+ motorcycle: "#c1133a",
45029
+ bicycle: "#0e6a9b",
45030
+ airplane: "#7c9928",
45031
+ boat: "#b17933",
45032
+ train: "#ad6ca3",
45033
+ bird: "#0f7c55",
45034
+ dog: "#c82700",
45035
+ cat: "#7268f2",
45036
+ horse: "#cb795e",
45037
+ sheep: "#b8636b",
45038
+ cow: "#cb2969",
45039
+ elephant: "#1158d2",
45040
+ bear: "#8d5e00",
45041
+ zebra: "#0097d6",
45042
+ giraffe: "#8f61bb",
45043
+ "package-delivered": "#cd3f9b",
45044
+ "package-picked-up": "#388a08",
45045
+ suitcase: "#666800",
45046
+ backpack: "#ec5022",
45047
+ handbag: "#a76ef8",
45048
+ contact: "#ab5a49",
45049
+ "motion-sensor": "#b95d1a",
45050
+ smoke: "#dd3858",
45051
+ flood: "#b31e7d",
45052
+ gas: "#5b70b5",
45053
+ "carbon-monoxide": "#7b4e8e",
45054
+ vibration: "#e65bba",
45055
+ tamper: "#98464b",
45056
+ presence: "#3a9468",
45057
+ "enum-sensor": "#7885f8",
45058
+ "device-event": "#8c43c8",
45059
+ lock: "#649653",
45060
+ cover: "#c67597",
45061
+ switch: "#7a812a",
45062
+ siren: "#ac5d7f",
45063
+ button: "#b276cd",
45064
+ doorbell: "#0087ab"
45065
+ };
45066
+ var CAMSTACK_FALLBACK = [
45067
+ "#b34dc7",
45068
+ "#1d7d34",
45069
+ "#db6b6c",
45070
+ "#a43d29",
45071
+ "#0e6ee6",
45072
+ "#29a10b",
45073
+ "#a98731",
45074
+ "#0181c6"
45075
+ ];
45076
+ var HIGH_CONTRAST_HEX = {
45077
+ motion: "#964360",
45078
+ audio: "#23a132",
45079
+ recording: "#2494ca",
45080
+ live: "#bd7e2b",
45081
+ heatmapScrub: "#ad6eea",
45082
+ person: "#62611e",
45083
+ vehicle: "#f4534c",
45084
+ animal: "#1556cd",
45085
+ package: "#9c4415",
45086
+ sensor: "#066c48",
45087
+ control: "#f2479f",
45088
+ face: "#139d8a",
45089
+ plate: "#909024",
45090
+ car: "#8e35ab",
45091
+ truck: "#bd0b2b",
45092
+ bus: "#7a88ca",
45093
+ motorcycle: "#e26725",
45094
+ bicycle: "#a6679b",
45095
+ airplane: "#7c5720",
45096
+ boat: "#467a1b",
45097
+ train: "#6f65a4",
45098
+ bird: "#cb717f",
45099
+ dog: "#c62490",
45100
+ cat: "#b36850",
45101
+ horse: "#1872ac",
45102
+ sheep: "#927939",
45103
+ cow: "#428a5c",
45104
+ elephant: "#d41160",
45105
+ bear: "#799453",
45106
+ zebra: "#a85455",
45107
+ giraffe: "#746be8",
45108
+ "package-delivered": "#824a80",
45109
+ "package-picked-up": "#614ac1",
45110
+ suitcase: "#2f77f3",
45111
+ backpack: "#fa476d",
45112
+ handbag: "#c14cbe",
45113
+ contact: "#c83921",
45114
+ "motion-sensor": "#a07ebd",
45115
+ smoke: "#a25b13",
45116
+ flood: "#526bab",
45117
+ gas: "#924938",
45118
+ "carbon-monoxide": "#bb7e53",
45119
+ vibration: "#b66182",
45120
+ tamper: "#3c6931",
45121
+ presence: "#6c851d",
45122
+ "enum-sensor": "#ad2d48",
45123
+ "device-event": "#5e9b04",
45124
+ lock: "#00a062",
45125
+ cover: "#ad8624",
45126
+ switch: "#d05259",
45127
+ siren: "#cd67b3",
45128
+ button: "#c9746a",
45129
+ doorbell: "#338eeb"
45130
+ };
45131
+ var HIGH_CONTRAST_FALLBACK = [
45132
+ "#817f3b",
45133
+ "#a0733e",
45134
+ "#8658b2",
45135
+ "#956301",
45136
+ "#bc652d",
45137
+ "#647331",
45138
+ "#a14c9e",
45139
+ "#d14e71"
45140
+ ];
45141
+ var OKABE_ITO_HEX = {
45142
+ motion: "#b88128",
45143
+ audio: "#1096c8",
45144
+ recording: "#009e73",
45145
+ live: "#9c8c22",
45146
+ heatmapScrub: "#0072b2",
45147
+ person: "#d55e00",
45148
+ vehicle: "#c0739f",
45149
+ animal: "#226d18",
45150
+ package: "#91446c",
45151
+ sensor: "#217b56",
45152
+ control: "#648647",
45153
+ face: "#c22998",
45154
+ plate: "#fa4575",
45155
+ car: "#956301",
45156
+ truck: "#2f77f3",
45157
+ bus: "#7a4e86",
45158
+ motorcycle: "#f54597",
45159
+ bicycle: "#bb3e75",
45160
+ airplane: "#e054c0",
45161
+ boat: "#457942",
45162
+ train: "#867afa",
45163
+ bird: "#88914c",
45164
+ dog: "#1556cd",
45165
+ cat: "#71702c",
45166
+ horse: "#9b4fa4",
45167
+ sheep: "#c0559d",
45168
+ cow: "#d14f65",
45169
+ elephant: "#98470f",
45170
+ bear: "#595896",
45171
+ zebra: "#96790e",
45172
+ giraffe: "#cb717b",
45173
+ "package-delivered": "#139d8a",
45174
+ "package-picked-up": "#906ead",
45175
+ suitcase: "#d02939",
45176
+ backpack: "#d41160",
45177
+ handbag: "#f64f54",
45178
+ contact: "#7258d2",
45179
+ "motion-sensor": "#b66182",
45180
+ smoke: "#627abb",
45181
+ flood: "#b86ae4",
45182
+ gas: "#a95261",
45183
+ "carbon-monoxide": "#c65d3c",
45184
+ vibration: "#7a40b7",
45185
+ tamper: "#914b34",
45186
+ presence: "#9481c3",
45187
+ "enum-sensor": "#ac6d47",
45188
+ "device-event": "#7b6fce",
45189
+ lock: "#c67662",
45190
+ cover: "#a6564d",
45191
+ switch: "#ad2c4e",
45192
+ siren: "#348e08",
45193
+ button: "#d27303",
45194
+ doorbell: "#55770f"
45195
+ };
45196
+ var OKABE_ITO_FALLBACK = [
45197
+ "#9a3784",
45198
+ "#a7392c",
45199
+ "#409d50",
45200
+ "#6987e7",
45201
+ "#ee5b3d",
45202
+ "#c0430d",
45203
+ "#af79b3",
45204
+ "#4b6628"
45205
+ ];
45206
+ /**
45207
+ * The display palette (D939). One table of colours, three presets, one
45208
+ * validator. Taxonomy colours and every consumer read this — there is no
45209
+ * second hex table.
45210
+ */
45211
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
45212
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
45213
+ form: literal("solid"),
45214
+ hex: paletteHexSchema
45215
+ }), object({
45216
+ form: literal("gradient"),
45217
+ hex: paletteHexSchema,
45218
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
45219
+ })]);
45220
+ var paletteReadySchema = object({
45221
+ status: literal("ready"),
45222
+ presetId: _enum(PALETTE_PRESET_IDS),
45223
+ customized: boolean(),
45224
+ source: _enum(["stored", "unconfigured"]),
45225
+ swatches: record(string(), paletteSwatchSchema),
45226
+ fallbacks: array(paletteHexSchema).length(8)
45227
+ });
45228
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
45229
+ status: literal("unknown"),
45230
+ reason: string()
45231
+ })]);
45232
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
45233
+ presetId: string(),
45234
+ overrides: record(string(), paletteSwatchSchema)
45235
+ })]);
45236
+ object({
45237
+ presetId: string(),
45238
+ overrides: record(string(), paletteSwatchSchema)
45239
+ });
45240
+ function solid(hex) {
45241
+ return {
45242
+ form: "solid",
45243
+ hex
45244
+ };
45245
+ }
45246
+ function audioGradient(hex) {
45247
+ return {
45248
+ form: "gradient",
45249
+ hex,
45250
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
45251
+ };
45252
+ }
45253
+ function swatchesFrom(hexes) {
45254
+ const out = {};
45255
+ for (const id of PALETTE_ENTRY_IDS) {
45256
+ const hex = hexes[id];
45257
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
45258
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
45259
+ }
45260
+ return out;
45261
+ }
45262
+ function preset(id, name, hexes, fallbacks) {
45263
+ return {
45264
+ id,
45265
+ name,
45266
+ swatches: swatchesFrom(hexes),
45267
+ fallbacks
45268
+ };
45269
+ }
45270
+ var DISPLAY_PRESETS = [
45271
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
45272
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
45273
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
45274
+ ];
45275
+ function presetById(id) {
45276
+ return DISPLAY_PRESETS.find((item) => item.id === id);
45277
+ }
45278
+ function bundledCamstack() {
45279
+ const presetRow = presetById("camstack");
45280
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
45281
+ return readyOf(presetRow, "unconfigured", false);
45282
+ }
45283
+ function readyOf(row, source, customized) {
45284
+ return {
45285
+ status: "ready",
45286
+ presetId: row.id,
45287
+ customized,
45288
+ source,
45289
+ swatches: row.swatches,
45290
+ fallbacks: [...row.fallbacks]
45291
+ };
45292
+ }
45293
+ function hashFallback(kind, fallbacks) {
45294
+ let hash = 0;
45295
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
45296
+ const hex = fallbacks[hash % fallbacks.length];
45297
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
45298
+ return hex;
45299
+ }
45300
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
45301
+ function paintHex(swatches, fallbacks, kind) {
45302
+ const key = kind.trim().toLowerCase();
45303
+ if (key.startsWith("audio-")) {
45304
+ const audio = swatches[AUDIO_ENTRY_ID];
45305
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
45306
+ }
45307
+ const direct = swatches[key];
45308
+ if (direct !== void 0) return direct.hex;
45309
+ return hashFallback(key, fallbacks);
45310
+ }
45311
+ /**
42942
45312
  * Unified event-kind taxonomy — THE single source of truth for
42943
45313
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42944
45314
  * icon }`.
@@ -42952,109 +45322,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42952
45322
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42953
45323
  * - the COCO / audio class maps (macro ↔ sub relationships)
42954
45324
  *
42955
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42956
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42957
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42958
- * color or an icon: they read this dictionary (server descriptors carry the
42959
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
45325
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
45326
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
45327
+ * the bundled CamStack display palette (D939). The effective cluster palette
45328
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
45329
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42960
45330
  *
42961
45331
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42962
45332
  */
42963
- var TAXONOMY_COLORS = {
42964
- motion: "#f59e0b",
42965
- audio: "#06b6d4",
42966
- person: "#22c55e",
42967
- vehicle: "#3b82f6",
42968
- animal: "#f97316",
42969
- package: "#a855f7",
42970
- sensor: "#8b5cf6",
42971
- control: "#10b981",
42972
- genericDetection: "#64748b"
42973
- };
42974
- var DETECTION_SUB_COLORS = {
42975
- car: "#f59e0b",
42976
- truck: "#d97706",
42977
- bus: "#b45309",
42978
- motorcycle: "#eab308",
42979
- bicycle: "#ca8a04",
42980
- airplane: "#60a5fa",
42981
- boat: "#2563eb",
42982
- train: "#1d4ed8",
42983
- bird: "#14b8a6",
42984
- dog: "#84cc16",
42985
- cat: "#f97316",
42986
- horse: "#a16207",
42987
- sheep: "#a3a3a3",
42988
- cow: "#78716c",
42989
- elephant: "#6b7280",
42990
- bear: "#7c2d12",
42991
- zebra: "#404040",
42992
- giraffe: "#d4a373"
42993
- };
45333
+ var BUNDLED_PALETTE = bundledCamstack();
45334
+ function kindColor(kind) {
45335
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
45336
+ }
45337
+ function firstFallback(fallbacks) {
45338
+ const hex = fallbacks[0];
45339
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
45340
+ return hex;
45341
+ }
45342
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42994
45343
  function titleCase(id) {
42995
45344
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42996
45345
  }
42997
45346
  var entries = /* @__PURE__ */ new Map();
42998
- function macro(kind, category, color, iconId, label) {
45347
+ function macro(kind, category, iconId, label) {
42999
45348
  entries.set(kind, {
43000
45349
  kind,
43001
45350
  parentKind: null,
43002
45351
  level: "macro",
43003
45352
  category,
43004
- color,
45353
+ color: kindColor(kind),
43005
45354
  iconId,
43006
45355
  labelKey: `eventKind.${kind}`,
43007
45356
  label
43008
45357
  });
43009
45358
  }
43010
- function sub(kind, parentKind, category, color, iconId, label) {
45359
+ function sub(kind, parentKind, category, iconId, label) {
43011
45360
  entries.set(kind, {
43012
45361
  kind,
43013
45362
  parentKind,
43014
45363
  level: "sub",
43015
45364
  category,
43016
- color,
45365
+ color: kindColor(kind),
43017
45366
  iconId,
43018
45367
  labelKey: `eventKind.${kind}`,
43019
45368
  label
43020
45369
  });
43021
45370
  }
43022
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
43023
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
43024
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
43025
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
43026
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
43027
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
43028
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
43029
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
45371
+ macro("motion", "motion", "motion", "Motion");
45372
+ macro("audio", "audio", "audio", "Audio");
45373
+ macro("person", "detection", "person", "Person");
45374
+ macro("vehicle", "detection", "vehicle", "Vehicle");
45375
+ macro("animal", "detection", "animal", "Animal");
45376
+ macro("package", "package", "package", "Package");
45377
+ macro("sensor", "sensor", "sensor", "Sensor");
45378
+ macro("control", "control", "control", "Control");
43030
45379
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
43031
45380
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
43032
45381
  if (entries.has(cocoClass)) continue;
43033
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
45382
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
43034
45383
  }
43035
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
43036
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
43037
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
43038
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
43039
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
43040
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
43041
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
43042
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
43043
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
43044
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
43045
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
43046
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
43047
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
43048
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
43049
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
43050
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
43051
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
43052
- sub("button", "control", "control", "#10b981", "button", "Button");
43053
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
45384
+ sub("package-delivered", "package", "package", "package", "Package delivered");
45385
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
45386
+ sub("contact", "sensor", "sensor", "door", "Contact");
45387
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
45388
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
45389
+ sub("flood", "sensor", "sensor", "water", "Water leak");
45390
+ sub("gas", "sensor", "sensor", "gas", "Gas");
45391
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
45392
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
45393
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
45394
+ sub("presence", "sensor", "sensor", "presence", "Presence");
45395
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
45396
+ sub("device-event", "sensor", "sensor", "button", "Device event");
45397
+ sub("lock", "control", "control", "lock", "Lock");
45398
+ sub("cover", "control", "control", "door", "Cover");
45399
+ sub("switch", "control", "control", "switch", "Switch");
45400
+ sub("siren", "control", "control", "siren", "Siren");
45401
+ sub("button", "control", "control", "button", "Button");
45402
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
43054
45403
  for (const l of AUDIO_MACRO_LABELS) {
43055
45404
  const kind = `audio-${l.id}`;
43056
45405
  if (entries.has(kind)) continue;
43057
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
45406
+ sub(kind, "audio", "audio", kind, l.name);
43058
45407
  }
43059
45408
  /** The complete taxonomy dictionary, keyed by kind. */
43060
45409
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -43941,7 +46290,7 @@ var NcConditionsSchema = object({
43941
46290
  * with the list under it is worse than no switch (D62).
43942
46291
  *
43943
46292
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43944
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
46293
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43945
46294
  * the operator fixed the spelling. The id reaches the record on
43946
46295
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43947
46296
  * `{{label}}` renders.
@@ -44492,7 +46841,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
44492
46841
  * A rule scoped to one camera and one zone silently became a rule that
44493
46842
  * matches EVERY event on EVERY camera, and lost its `media` policy
44494
46843
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
44495
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46844
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
44496
46845
  * within a minute of a two-field patch.
44497
46846
  *
44498
46847
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -46321,7 +48670,7 @@ var LabelAttributionSchema = object({
46321
48670
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
46322
48671
  *
46323
48672
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
46324
- * notification rule authored on "Gianluca" stopped matching the moment the
48673
+ * notification rule authored on "Alice" stopped matching the moment the
46325
48674
  * operator fixed the spelling in the gallery, and nothing said so. The id is
46326
48675
  * the thing that does not move, so it is what a rule matches on
46327
48676
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48860,7 +51209,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48860
51209
  /**
48861
51210
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48862
51211
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48863
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
51212
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48864
51213
  * NOT inferred, these boxes are its output, and its children (the plate
48865
51214
  * reader) run on them through their own crop policy. Boxes are in the
48866
51215
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -50537,7 +52886,7 @@ var RunnerCameraConfigSchema = object({
50537
52886
  * detection session that asks for history. What shipped was a last-moment
50538
52887
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
50539
52888
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
50540
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52889
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
50541
52890
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
50542
52891
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
50543
52892
  * was decoded, and was freed.
@@ -52567,7 +54916,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
52567
54916
  * The signals a device can emit to WAKE its own stream.
52568
54917
  *
52569
54918
  * A camera whose stream is built on demand sleeps until something asks for it,
52570
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54919
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
52571
54920
  * puller holds a session open for ever, and treating that as demand would keep
52572
54921
  * a battery camera awake for ever, which is the whole thing the battery is for
52573
54922
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -53287,7 +55636,7 @@ var ClipSchema = object({
53287
55636
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
53288
55637
  *
53289
55638
  * Bounded because it is not a payload the surface pages through: one visit on
53290
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
55639
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
53291
55640
  * camera-day. Read {@link eventCount} for the true total.
53292
55641
  */
53293
55642
  eventIds: array(string()).optional(),
@@ -53432,7 +55781,7 @@ var ClipPlaybackSchema = object({
53432
55781
  * camera has no recordings", which is the defect this whole line of work is
53433
55782
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
53434
55783
  * reached at all (`unreachable`, also what a provider that THREW reports), a
53435
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
55784
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
53436
55785
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
53437
55786
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
53438
55787
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -53697,7 +56046,7 @@ DeviceType.Camera, method(object({
53697
56046
  *
53698
56047
  * It was optional, documented as "absent means the device's BOUND
53699
56048
  * provider, which is CamStack on every camera". No code implemented
53700
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
56049
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
53701
56050
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
53702
56051
  * answered SIX rows, three from each source, merged newest-first:
53703
56052
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -54912,7 +57261,10 @@ var airQualitySensorCapability = {
54912
57261
  */
54913
57262
  var AmbientLightSensorStatusSchema = object({
54914
57263
  /** Current illuminance in lux (lx). */
54915
- lux: number().min(0),
57264
+ lux: number().min(0).meta({
57265
+ unit: "lx",
57266
+ label: "Illuminance"
57267
+ }),
54916
57268
  /** Ms epoch when the slice was last updated. */
54917
57269
  lastFetchedAt: number(),
54918
57270
  /** Live display unit from the upstream source (e.g. HA
@@ -54955,7 +57307,12 @@ var ambientLightSensorCapability = {
54955
57307
  } } },
54956
57308
  /** Clock fields: written, but excluded from the compare that decides
54957
57309
  * whether persisting is worth a SQLite commit. */
54958
- volatileStateFields: ["lastFetchedAt"]
57310
+ volatileStateFields: ["lastFetchedAt"],
57311
+ customize: {
57312
+ version: 1,
57313
+ advanced: "derive",
57314
+ targets: []
57315
+ }
54959
57316
  };
54960
57317
  /**
54961
57318
  * Per-class audio metrics aggregated over a sliding window.
@@ -55182,7 +57539,10 @@ var BatteryStatusSchema = object({
55182
57539
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
55183
57540
  * declines to band a non-finite reading, which is the correct shape.
55184
57541
  */
55185
- percentage: number().min(0).max(100).nullable(),
57542
+ percentage: number().min(0).max(100).nullable().meta({
57543
+ unit: "%",
57544
+ label: "Charge"
57545
+ }),
55186
57546
  /**
55187
57547
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
55188
57548
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -55201,13 +57561,13 @@ var BatteryStatusSchema = object({
55201
57561
  "solar",
55202
57562
  "none",
55203
57563
  "unknown"
55204
- ]),
57564
+ ]).meta({ label: "Charging source" }),
55205
57565
  /**
55206
57566
  * True when the camera firmware has gone into low-power mode. Battery
55207
57567
  * providers MUST avoid polling during sleep — reading the battery
55208
57568
  * wakes the camera up and drains charge.
55209
57569
  */
55210
- sleeping: boolean(),
57570
+ sleeping: boolean().meta({ label: "Sleeping" }),
55211
57571
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
55212
57572
  lastUpdated: number(),
55213
57573
  /**
@@ -55247,7 +57607,7 @@ var BatteryStatusSchema = object({
55247
57607
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
55248
57608
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
55249
57609
  */
55250
- binary: boolean().optional()
57610
+ binary: boolean().optional().meta({ label: "Binary indicator" })
55251
57611
  });
55252
57612
  var BATTERY_DEVICE_TYPES = [
55253
57613
  DeviceType.Camera,
@@ -55261,6 +57621,7 @@ var BATTERY_DEVICE_TYPES = [
55261
57621
  /** Generic Customize target for the percentage reading (D936). */
55262
57622
  var batteryCustomize = {
55263
57623
  version: 1,
57624
+ advanced: "derive",
55264
57625
  targets: [{
55265
57626
  id: "percentage",
55266
57627
  cardinality: "scalar",
@@ -55411,7 +57772,7 @@ onStatusChanged: { data: object({
55411
57772
  * with the right HomeKit / Alexa display category.
55412
57773
  */
55413
57774
  var BinaryStatusSchema = object({
55414
- on: boolean(),
57775
+ on: boolean().meta({ label: "On" }),
55415
57776
  /** Ms epoch of the last transition. 0 if never observed. */
55416
57777
  lastChangedAt: number()
55417
57778
  });
@@ -55440,7 +57801,12 @@ var binaryCapability = {
55440
57801
  history: { fields: { on: { kind: "boolean" } } },
55441
57802
  /** Clock fields: written, but excluded from the compare that decides
55442
57803
  * whether persisting is worth a SQLite commit. */
55443
- volatileStateFields: ["lastChangedAt"]
57804
+ volatileStateFields: ["lastChangedAt"],
57805
+ customize: {
57806
+ version: 1,
57807
+ advanced: "derive",
57808
+ targets: []
57809
+ }
55444
57810
  };
55445
57811
  /**
55446
57812
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -55773,7 +58139,7 @@ var GridLayoutCellSchema = object({
55773
58139
  *
55774
58140
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
55775
58141
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
55776
- * the sources, because "this grid has no low" is not a finding — "615 has no
58142
+ * the sources, because "this grid has no low" is not a finding — "101 has no
55777
58143
  * low" is, and it is the one an operator can act on.
55778
58144
  */
55779
58145
  var GridProfileOfferSchema = object({
@@ -56949,6 +59315,30 @@ var dayNightCapability = {
56949
59315
  volatileStateFields: ["lastFetchedAt"]
56950
59316
  };
56951
59317
  /**
59318
+ * display-palette — the cluster's one colour table (D939).
59319
+ *
59320
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
59321
+ * cannot be read; it does not pretend the bundled preset was stored.
59322
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
59323
+ * the pairs.
59324
+ */
59325
+ var presetSummarySchema = object({
59326
+ id: string(),
59327
+ name: string(),
59328
+ swatches: record(string(), paletteSwatchSchema),
59329
+ fallbacks: array(string())
59330
+ });
59331
+ method(_void(), paletteResultSchema, {
59332
+ auth: "protected",
59333
+ role: "viewer"
59334
+ }), method(_void(), array(presetSummarySchema).readonly(), {
59335
+ auth: "protected",
59336
+ role: "viewer"
59337
+ }), method(setPaletteInputSchema, paletteReadySchema, {
59338
+ kind: "mutation",
59339
+ auth: "admin"
59340
+ });
59341
+ /**
56952
59342
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
56953
59343
  * for every device, regardless of provider — the kernel needs a uniform
56954
59344
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -58281,7 +60671,10 @@ var humidifierCapability = {
58281
60671
  */
58282
60672
  var HumiditySensorStatusSchema = object({
58283
60673
  /** Current relative humidity, 0..100. */
58284
- percent: number().min(0).max(100),
60674
+ percent: number().min(0).max(100).meta({
60675
+ unit: "%",
60676
+ label: "Humidity"
60677
+ }),
58285
60678
  /** Ms epoch when the slice was last updated. */
58286
60679
  lastFetchedAt: number(),
58287
60680
  /** Live display unit from the upstream source (e.g. HA
@@ -58323,7 +60716,12 @@ var humiditySensorCapability = {
58323
60716
  } } },
58324
60717
  /** Clock fields: written, but excluded from the compare that decides
58325
60718
  * whether persisting is worth a SQLite commit. */
58326
- volatileStateFields: ["lastFetchedAt"]
60719
+ volatileStateFields: ["lastFetchedAt"],
60720
+ customize: {
60721
+ version: 1,
60722
+ advanced: "derive",
60723
+ targets: []
60724
+ }
58327
60725
  };
58328
60726
  /**
58329
60727
  * Image display cap. Models a single still image exposed by an integration —
@@ -61956,9 +64354,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
61956
64354
  */
61957
64355
  var PowerMeterStatusSchema = object({
61958
64356
  /** Instantaneous power draw in watts. */
61959
- watts: number().optional(),
64357
+ watts: number().optional().meta({
64358
+ unit: "W",
64359
+ label: "Power"
64360
+ }),
61960
64361
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
61961
- kwhTotal: number().optional(),
64362
+ kwhTotal: number().optional().meta({
64363
+ unit: "kWh",
64364
+ label: "Energy"
64365
+ }),
61962
64366
  /** Voltage in volts. */
61963
64367
  volts: number().optional(),
61964
64368
  /** Current in amperes. */
@@ -62043,7 +64447,12 @@ var powerMeterCapability = {
62043
64447
  } },
62044
64448
  /** Clock fields: written, but excluded from the compare that decides
62045
64449
  * whether persisting is worth a SQLite commit. */
62046
- volatileStateFields: ["lastFetchedAt"]
64450
+ volatileStateFields: ["lastFetchedAt"],
64451
+ customize: {
64452
+ version: 1,
64453
+ advanced: "derive",
64454
+ targets: []
64455
+ }
62047
64456
  };
62048
64457
  /**
62049
64458
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -62465,9 +64874,9 @@ var PtzOptionsSchema = object({
62465
64874
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
62466
64875
  * not one of the three cameras honours its own:
62467
64876
  *
62468
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
62469
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
62470
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
64877
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
64878
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
64879
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
62471
64880
  *
62472
64881
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
62473
64882
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -62719,7 +65128,7 @@ var RunningStateStatusSchema = object({
62719
65128
  running: boolean().nullable(),
62720
65129
  /** Epoch ms the current boolean began; null while `running` is null. */
62721
65130
  since: number().nullable(),
62722
- source: RunningStateSourceSchema,
65131
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
62723
65132
  phase: string().nullable(),
62724
65133
  /** null until a reading has been published (D393). */
62725
65134
  lastFetchedAt: number().nullable()
@@ -62733,6 +65142,7 @@ var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
62733
65142
  /** Generic Customize target for the running boolean (D936). */
62734
65143
  var runningCustomize = {
62735
65144
  version: 1,
65145
+ advanced: "derive",
62736
65146
  targets: [{
62737
65147
  id: "running",
62738
65148
  cardinality: "scalar",
@@ -62871,7 +65281,7 @@ var RecordingAvailabilitySchema = object({
62871
65281
  * would look identical. But the answer used to say nothing about that, so a
62872
65282
  * caller asking "what can I export?" read the single preferred profile as
62873
65283
  * the only one that exists — on this deployment every camera records `high`
62874
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
65284
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
62875
65285
  * UI could not see it.
62876
65286
  *
62877
65287
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -62970,7 +65380,7 @@ var RecordingSourceOptionsSchema = object({
62970
65380
  * `sparse` = gaps are the absence of one, and must be drawn as such.
62971
65381
  *
62972
65382
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
62973
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
65383
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
62974
65384
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
62975
65385
  coverage: _enum(["continuous", "sparse"]),
62976
65386
  /** Where the playhead may be put.
@@ -63046,7 +65456,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
63046
65456
  * merely discouraged (D554 amended).
63047
65457
  *
63048
65458
  * It was learned the expensive way on `videoclips.listClips`: measured
63049
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
65459
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
63050
65460
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
63051
65461
  * three from each source, merged — `device-collection-dispatch.ts`
63052
65462
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -63647,7 +66057,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
63647
66057
  * on a 10 h window holding 29,393 s of footage every range landed late by the
63648
66058
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
63649
66059
  * the video was a uniform timelapse, and the log line reported the five ranges
63650
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
66060
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
63651
66061
  *
63652
66062
  * Relative and not absolute epoch, because an absolute epoch would make every
63653
66063
  * call site responsible for the same subtraction.
@@ -64358,7 +66768,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
64358
66768
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
64359
66769
  * for the thing: a scene is a standing question about the property ("is the bin
64360
66770
  * still out"), and the operator's question is "which of my scenes have tripped",
64361
- * across every camera at once — not "what does camera 617 think". Buried one
66771
+ * across every camera at once — not "what does camera 102 think". Buried one
64362
66772
  * camera deep it also could not be found. The surface is now a top-level admin
64363
66773
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
64364
66774
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -65217,7 +67627,7 @@ var streamParamsCapability = {
65217
67627
  * `getSettingsUISchema()` surface.
65218
67628
  */
65219
67629
  var SwitchStatusSchema = object({
65220
- on: boolean(),
67630
+ on: boolean().meta({ label: "On" }),
65221
67631
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
65222
67632
  lastChangedAt: number()
65223
67633
  });
@@ -65276,7 +67686,12 @@ var switchCapability = {
65276
67686
  label: "On",
65277
67687
  kind: "boolean"
65278
67688
  }
65279
- }] }
67689
+ }] },
67690
+ customize: {
67691
+ version: 1,
67692
+ advanced: "derive",
67693
+ targets: []
67694
+ }
65280
67695
  };
65281
67696
  /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
65282
67697
  function hasControlCharacter(value) {
@@ -65872,7 +68287,10 @@ var tamperCapability = {
65872
68287
  */
65873
68288
  var TemperatureSensorStatusSchema = object({
65874
68289
  /** Current temperature in Celsius. */
65875
- celsius: number(),
68290
+ celsius: number().meta({
68291
+ unit: "°C",
68292
+ label: "Temperature"
68293
+ }),
65876
68294
  /** Ms epoch when the slice was last updated (push or poll). */
65877
68295
  lastFetchedAt: number(),
65878
68296
  /** Live display unit from the upstream source (e.g. HA
@@ -65915,7 +68333,12 @@ var temperatureSensorCapability = {
65915
68333
  } } },
65916
68334
  /** Clock fields: written, but excluded from the compare that decides
65917
68335
  * whether persisting is worth a SQLite commit. */
65918
- volatileStateFields: ["lastFetchedAt"]
68336
+ volatileStateFields: ["lastFetchedAt"],
68337
+ customize: {
68338
+ version: 1,
68339
+ advanced: "derive",
68340
+ targets: []
68341
+ }
65919
68342
  };
65920
68343
  /**
65921
68344
  * toast — system-scoped singleton capability that streams toast
@@ -67498,6 +69921,10 @@ function runningFromMediaPlayer(state, previous, fetchedAt, transitionAt) {
67498
69921
  return nativeSlice(false, state, previous, transitionAtMs, fetchedAt, null);
67499
69922
  }
67500
69923
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
69924
+ 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;
69925
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
69926
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
69927
+ new Set(CAP_NAMES);
67501
69928
  Object.freeze({
67502
69929
  person: .5,
67503
69930
  vehicle: .5,
@@ -68731,7 +71158,7 @@ var BaseDeviceProvider = class extends BaseAddon {
68731
71158
  * A top-level persisted row with NO configuration is a leftover, not a
68732
71159
  * device — quarantine it instead of dialling it.
68733
71160
  *
68734
- * Device 614 was deleted, resurrected as a config-less shell by a write
71161
+ * Device 105 was deleted, resurrected as a config-less shell by a write
68735
71162
  * already in flight (D376), and then dialled at every single boot: eight
68736
71163
  * `Failed to restore device — bounded retry scheduled` lines in one day,
68737
71164
  * each one the same Zod refusal on `host` and `password`. The bound was
@@ -72041,6 +74468,27 @@ Object.freeze({
72041
74468
  access: "create",
72042
74469
  role: "viewer"
72043
74470
  },
74471
+ "displayPalette.getPalette": {
74472
+ capName: "display-palette",
74473
+ capScope: "system",
74474
+ addonId: null,
74475
+ access: "view",
74476
+ role: "viewer"
74477
+ },
74478
+ "displayPalette.listPresets": {
74479
+ capName: "display-palette",
74480
+ capScope: "system",
74481
+ addonId: null,
74482
+ access: "view",
74483
+ role: "viewer"
74484
+ },
74485
+ "displayPalette.setPalette": {
74486
+ capName: "display-palette",
74487
+ capScope: "system",
74488
+ addonId: null,
74489
+ access: "create",
74490
+ role: "admin"
74491
+ },
72044
74492
  "doorbell.getStatus": {
72045
74493
  capName: "doorbell",
72046
74494
  capScope: "device",
@@ -81958,7 +84406,7 @@ var SENSOR_CAP_VOCABULARY = {
81958
84406
  state: [{
81959
84407
  kind: "boolean",
81960
84408
  field: "on",
81961
- label: t("Active", "Attivo"),
84409
+ label: t("On", "Acceso"),
81962
84410
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
81963
84411
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
81964
84412
  icon: "toggle-right"
@@ -82497,6 +84945,7 @@ var SYSTEM_CAP_VOCABULARY = {
82497
84945
  "device-provider": system(INTERNAL),
82498
84946
  "device-removal-hook": system(INTERNAL),
82499
84947
  "device-state": system("the runtime-state mirror every trigger already reads through"),
84948
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
82500
84949
  "embedding-encoder": system(ML),
82501
84950
  "face-gallery": system("the face gallery — curated on its own page"),
82502
84951
  "failure-contribution": system(INTERNAL),
@@ -85381,7 +87830,6 @@ Object.freeze({
85381
87830
  "smtp-provider": "email"
85382
87831
  });
85383
87832
  DeviceType.Camera;
85384
- 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;
85385
87833
  /**
85386
87834
  * A saved Customize assignment (D936). The schema is the type: callers use
85387
87835
  * `z.infer`, they do not restate the shape.
@@ -85470,7 +87918,6 @@ object({
85470
87918
  ]),
85471
87919
  reason: string().nullable()
85472
87920
  });
85473
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
85474
87921
  var G711_SCALE_CORRECTION_DB = {
85475
87922
  PCMU: 20 * Math.log10(4),
85476
87923
  PCMA: 20 * Math.log10(8)
@@ -86050,7 +88497,7 @@ var STATE_SUMMARY_SECTION_VARS = [
86050
88497
  {
86051
88498
  name: "summaryStreams",
86052
88499
  label: "Summary: streams offline",
86053
- example: "Ingresso (high) — since 06:40",
88500
+ example: "Front door (high) — since 06:40",
86054
88501
  kinds: ["stream-offline", "stream-online"]
86055
88502
  },
86056
88503
  {
@@ -86068,13 +88515,13 @@ var STATE_SUMMARY_SECTION_VARS = [
86068
88515
  {
86069
88516
  name: "summaryDetection",
86070
88517
  label: "Summary: cameras detecting nothing",
86071
- example: "Ingresso — since 05:10",
88518
+ example: "Front door — since 05:10",
86072
88519
  kinds: ["detection-blind"]
86073
88520
  },
86074
88521
  {
86075
88522
  name: "summaryNodes",
86076
88523
  label: "Summary: nodes",
86077
- example: "little-unraid — offline since 03:00",
88524
+ example: "agent-a — offline since 03:00",
86078
88525
  kinds: [
86079
88526
  "node-offline",
86080
88527
  "node-online",