@camstack/addon-provider-bosch 0.1.22 → 0.1.23

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
  *
@@ -5434,7 +5434,7 @@ var ZodIssueCode = {
5434
5434
  var ZodFirstPartyTypeKind;
5435
5435
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5436
5436
  //#endregion
5437
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5437
+ //#region ../types/dist/sleep-BErAxhul.mjs
5438
5438
  /**
5439
5439
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5440
5440
  * window to float samples (D455).
@@ -8483,6 +8483,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8483
8483
  kind: "mutation",
8484
8484
  auth: "admin"
8485
8485
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8486
+ Object.freeze({ "doorbell": "lastPressedAt" });
8487
+ /** Every capability name, so addon code can check a name without the schema graph. */
8488
+ var CAP_NAMES = Object.freeze([
8489
+ "accessories",
8490
+ "addon-pages",
8491
+ "addon-pages-source",
8492
+ "addon-routes",
8493
+ "addon-settings",
8494
+ "addon-widgets",
8495
+ "addon-widgets-source",
8496
+ "addons",
8497
+ "admin-ui",
8498
+ "air-quality-sensor",
8499
+ "alarm-panel",
8500
+ "alerts",
8501
+ "ambient-light-sensor",
8502
+ "audio-analysis",
8503
+ "audio-analyzer",
8504
+ "audio-codec",
8505
+ "audio-metrics",
8506
+ "auth-provider",
8507
+ "automation-control",
8508
+ "backup",
8509
+ "battery",
8510
+ "binary",
8511
+ "brightness",
8512
+ "broker",
8513
+ "button",
8514
+ "calendar-source",
8515
+ "calendars",
8516
+ "camera-credentials",
8517
+ "camera-grid-layout",
8518
+ "camera-pipeline-config",
8519
+ "camera-streams",
8520
+ "carbon-monoxide",
8521
+ "climate-control",
8522
+ "color",
8523
+ "composer",
8524
+ "connection-test",
8525
+ "connectivity",
8526
+ "consumables",
8527
+ "contact",
8528
+ "control",
8529
+ "core-blocks",
8530
+ "cover",
8531
+ "custom-model-registry",
8532
+ "data-store-provider",
8533
+ "database-snapshot",
8534
+ "day-night",
8535
+ "decoder",
8536
+ "detection-pipeline",
8537
+ "device-admin-link",
8538
+ "device-adoption",
8539
+ "device-credentials",
8540
+ "device-discovery",
8541
+ "device-export",
8542
+ "device-extension",
8543
+ "device-history",
8544
+ "device-manager",
8545
+ "device-ops",
8546
+ "device-provider",
8547
+ "device-removal-hook",
8548
+ "device-state",
8549
+ "device-status",
8550
+ "dishwasher",
8551
+ "display-palette",
8552
+ "doorbell",
8553
+ "embedding-encoder",
8554
+ "enum-sensor",
8555
+ "event-emitter",
8556
+ "face-gallery",
8557
+ "failure-contribution",
8558
+ "fan-control",
8559
+ "feature-probe",
8560
+ "filesystem-browse",
8561
+ "flood",
8562
+ "gas",
8563
+ "heating-valve",
8564
+ "humidifier",
8565
+ "humidity-sensor",
8566
+ "image",
8567
+ "image-settings",
8568
+ "integrations",
8569
+ "intercom",
8570
+ "keychain",
8571
+ "keychain-admin",
8572
+ "lawn-mower-control",
8573
+ "llm",
8574
+ "llm-runtime",
8575
+ "load-contribution",
8576
+ "local-network",
8577
+ "lock-control",
8578
+ "log-channels",
8579
+ "log-destination",
8580
+ "login-method",
8581
+ "media-player",
8582
+ "mesh-network",
8583
+ "metrics-provider",
8584
+ "model-convert",
8585
+ "model-distributor",
8586
+ "motion",
8587
+ "motion-detection",
8588
+ "motion-trigger",
8589
+ "motion-zones",
8590
+ "mqtt-broker",
8591
+ "native-object-detection",
8592
+ "navigation",
8593
+ "network-access",
8594
+ "network-link",
8595
+ "network-quality",
8596
+ "node-certificates",
8597
+ "nodes",
8598
+ "notification-output",
8599
+ "notification-rules",
8600
+ "notifier",
8601
+ "numeric-sensor",
8602
+ "oauth-integration",
8603
+ "oidc-connections",
8604
+ "osd",
8605
+ "osd-manager",
8606
+ "pet-feeder",
8607
+ "pipeline-analytics",
8608
+ "pipeline-executor",
8609
+ "pipeline-orchestrator",
8610
+ "pipeline-runner",
8611
+ "plate-gallery",
8612
+ "platform-probe",
8613
+ "power-meter",
8614
+ "presence",
8615
+ "pressure-sensor",
8616
+ "privacy-mask",
8617
+ "ptz",
8618
+ "ptz-autotrack",
8619
+ "reboot",
8620
+ "record-entries",
8621
+ "recording",
8622
+ "recording-archive",
8623
+ "recording-export",
8624
+ "recording-onboard",
8625
+ "recording-signal",
8626
+ "records",
8627
+ "running-state",
8628
+ "scene-monitor",
8629
+ "script-runner",
8630
+ "server-management",
8631
+ "settings-store",
8632
+ "smoke",
8633
+ "smtp-provider",
8634
+ "snapshot",
8635
+ "sso-bridge",
8636
+ "storage",
8637
+ "storage-admin",
8638
+ "storage-evictable",
8639
+ "storage-migration",
8640
+ "storage-occupancy",
8641
+ "storage-provider",
8642
+ "stream-broker",
8643
+ "stream-catalog",
8644
+ "stream-params",
8645
+ "stream-signals",
8646
+ "switch",
8647
+ "system",
8648
+ "tamper",
8649
+ "temperature-sensor",
8650
+ "terminal-session",
8651
+ "toast",
8652
+ "training",
8653
+ "training-provider",
8654
+ "turn-provider",
8655
+ "update",
8656
+ "user-management",
8657
+ "user-passkeys",
8658
+ "vacuum-control",
8659
+ "valve",
8660
+ "vector-store",
8661
+ "vibration",
8662
+ "videoclips",
8663
+ "viewer-ui",
8664
+ "water-heater",
8665
+ "weather",
8666
+ "webrtc-session",
8667
+ "zone-analytics",
8668
+ "zone-rules",
8669
+ "zones"
8670
+ ]);
8671
+ Object.freeze({
8672
+ "air-quality-sensor": [
8673
+ {
8674
+ "path": "co2Ppm",
8675
+ "valueType": "number"
8676
+ },
8677
+ {
8678
+ "path": "vocPpb",
8679
+ "valueType": "number"
8680
+ },
8681
+ {
8682
+ "path": "pm25",
8683
+ "valueType": "number"
8684
+ },
8685
+ {
8686
+ "path": "pm10",
8687
+ "valueType": "number"
8688
+ },
8689
+ {
8690
+ "path": "aqi",
8691
+ "valueType": "number"
8692
+ },
8693
+ {
8694
+ "path": "unit",
8695
+ "valueType": "string"
8696
+ },
8697
+ {
8698
+ "path": "precision",
8699
+ "valueType": "number"
8700
+ }
8701
+ ],
8702
+ "alarm-panel": [
8703
+ {
8704
+ "path": "state",
8705
+ "valueType": "enum",
8706
+ "enumValues": [
8707
+ "disarmed",
8708
+ "armed_home",
8709
+ "armed_away",
8710
+ "armed_night",
8711
+ "armed_vacation",
8712
+ "armed_custom_bypass",
8713
+ "arming",
8714
+ "disarming",
8715
+ "pending",
8716
+ "triggered"
8717
+ ]
8718
+ },
8719
+ {
8720
+ "path": "targetMode",
8721
+ "valueType": "enum",
8722
+ "enumValues": [
8723
+ "home",
8724
+ "away",
8725
+ "night",
8726
+ "vacation",
8727
+ "custom_bypass"
8728
+ ]
8729
+ },
8730
+ {
8731
+ "path": "requiresCode",
8732
+ "valueType": "boolean"
8733
+ }
8734
+ ],
8735
+ "ambient-light-sensor": [
8736
+ {
8737
+ "path": "lux",
8738
+ "valueType": "number"
8739
+ },
8740
+ {
8741
+ "path": "unit",
8742
+ "valueType": "string"
8743
+ },
8744
+ {
8745
+ "path": "precision",
8746
+ "valueType": "number"
8747
+ }
8748
+ ],
8749
+ "audio-metrics": [
8750
+ {
8751
+ "path": "ts",
8752
+ "valueType": "number"
8753
+ },
8754
+ {
8755
+ "path": "windowSec",
8756
+ "valueType": "number"
8757
+ },
8758
+ {
8759
+ "path": "level.rms",
8760
+ "valueType": "number"
8761
+ },
8762
+ {
8763
+ "path": "level.dbfs",
8764
+ "valueType": "number"
8765
+ },
8766
+ {
8767
+ "path": "peakDbfs",
8768
+ "valueType": "number"
8769
+ },
8770
+ {
8771
+ "path": "avgDbfs",
8772
+ "valueType": "number"
8773
+ },
8774
+ {
8775
+ "path": "current.className",
8776
+ "valueType": "string"
8777
+ },
8778
+ {
8779
+ "path": "current.score",
8780
+ "valueType": "number"
8781
+ },
8782
+ {
8783
+ "path": "current.timestamp",
8784
+ "valueType": "number"
8785
+ }
8786
+ ],
8787
+ "automation-control": [
8788
+ {
8789
+ "path": "enabled",
8790
+ "valueType": "boolean"
8791
+ },
8792
+ {
8793
+ "path": "isRunning",
8794
+ "valueType": "boolean"
8795
+ },
8796
+ {
8797
+ "path": "lastTriggeredAt",
8798
+ "valueType": "number"
8799
+ },
8800
+ {
8801
+ "path": "lastError",
8802
+ "valueType": "string"
8803
+ }
8804
+ ],
8805
+ "battery": [
8806
+ {
8807
+ "path": "percentage",
8808
+ "valueType": "number"
8809
+ },
8810
+ {
8811
+ "path": "charging",
8812
+ "valueType": "enum",
8813
+ "enumValues": [
8814
+ "dc",
8815
+ "solar",
8816
+ "none",
8817
+ "unknown"
8818
+ ]
8819
+ },
8820
+ {
8821
+ "path": "sleeping",
8822
+ "valueType": "boolean"
8823
+ },
8824
+ {
8825
+ "path": "lastUpdated",
8826
+ "valueType": "number"
8827
+ },
8828
+ {
8829
+ "path": "lastContactAt",
8830
+ "valueType": "number"
8831
+ },
8832
+ {
8833
+ "path": "lastFullRefreshAt",
8834
+ "valueType": "number"
8835
+ },
8836
+ {
8837
+ "path": "binary",
8838
+ "valueType": "boolean"
8839
+ }
8840
+ ],
8841
+ "binary": [{
8842
+ "path": "on",
8843
+ "valueType": "boolean"
8844
+ }],
8845
+ "brightness": [{
8846
+ "path": "percentage",
8847
+ "valueType": "number"
8848
+ }],
8849
+ "broker": [{
8850
+ "path": "brokerCount",
8851
+ "valueType": "number"
8852
+ }, {
8853
+ "path": "connectedCount",
8854
+ "valueType": "number"
8855
+ }],
8856
+ "camera-credentials": [
8857
+ {
8858
+ "path": "host",
8859
+ "valueType": "string"
8860
+ },
8861
+ {
8862
+ "path": "port",
8863
+ "valueType": "number"
8864
+ },
8865
+ {
8866
+ "path": "onvifPort",
8867
+ "valueType": "number"
8868
+ },
8869
+ {
8870
+ "path": "rtspPort",
8871
+ "valueType": "number"
8872
+ },
8873
+ {
8874
+ "path": "https",
8875
+ "valueType": "boolean"
8876
+ },
8877
+ {
8878
+ "path": "hasUsername",
8879
+ "valueType": "boolean"
8880
+ },
8881
+ {
8882
+ "path": "hasPassword",
8883
+ "valueType": "boolean"
8884
+ },
8885
+ {
8886
+ "path": "onvifProfile",
8887
+ "valueType": "string"
8888
+ }
8889
+ ],
8890
+ "camera-streams": [
8891
+ {
8892
+ "path": "online",
8893
+ "valueType": "boolean"
8894
+ },
8895
+ {
8896
+ "path": "slotStatuses.high",
8897
+ "valueType": "enum",
8898
+ "enumValues": [
8899
+ "unassigned",
8900
+ "idle",
8901
+ "connecting",
8902
+ "streaming",
8903
+ "error"
8904
+ ]
8905
+ },
8906
+ {
8907
+ "path": "slotStatuses.mid",
8908
+ "valueType": "enum",
8909
+ "enumValues": [
8910
+ "unassigned",
8911
+ "idle",
8912
+ "connecting",
8913
+ "streaming",
8914
+ "error"
8915
+ ]
8916
+ },
8917
+ {
8918
+ "path": "slotStatuses.low",
8919
+ "valueType": "enum",
8920
+ "enumValues": [
8921
+ "unassigned",
8922
+ "idle",
8923
+ "connecting",
8924
+ "streaming",
8925
+ "error"
8926
+ ]
8927
+ },
8928
+ {
8929
+ "path": "slotErrors.high",
8930
+ "valueType": "string"
8931
+ },
8932
+ {
8933
+ "path": "slotErrors.mid",
8934
+ "valueType": "string"
8935
+ },
8936
+ {
8937
+ "path": "slotErrors.low",
8938
+ "valueType": "string"
8939
+ }
8940
+ ],
8941
+ "carbon-monoxide": [{
8942
+ "path": "detected",
8943
+ "valueType": "boolean"
8944
+ }],
8945
+ "climate-control": [
8946
+ {
8947
+ "path": "mode",
8948
+ "valueType": "enum",
8949
+ "enumValues": [
8950
+ "off",
8951
+ "heat",
8952
+ "cool",
8953
+ "auto",
8954
+ "heat_cool",
8955
+ "fan_only",
8956
+ "dry"
8957
+ ]
8958
+ },
8959
+ {
8960
+ "path": "fanMode",
8961
+ "valueType": "string"
8962
+ },
8963
+ {
8964
+ "path": "preset",
8965
+ "valueType": "string"
8966
+ },
8967
+ {
8968
+ "path": "target",
8969
+ "valueType": "number"
8970
+ },
8971
+ {
8972
+ "path": "targetHigh",
8973
+ "valueType": "number"
8974
+ },
8975
+ {
8976
+ "path": "targetLow",
8977
+ "valueType": "number"
8978
+ },
8979
+ {
8980
+ "path": "targetHumidity",
8981
+ "valueType": "number"
8982
+ },
8983
+ {
8984
+ "path": "currentTemp",
8985
+ "valueType": "number"
8986
+ },
8987
+ {
8988
+ "path": "currentHumidity",
8989
+ "valueType": "number"
8990
+ },
8991
+ {
8992
+ "path": "swingVertical",
8993
+ "valueType": "boolean"
8994
+ },
8995
+ {
8996
+ "path": "swingHorizontal",
8997
+ "valueType": "boolean"
8998
+ },
8999
+ {
9000
+ "path": "minTemp",
9001
+ "valueType": "number"
9002
+ },
9003
+ {
9004
+ "path": "maxTemp",
9005
+ "valueType": "number"
9006
+ },
9007
+ {
9008
+ "path": "tempStep",
9009
+ "valueType": "number"
9010
+ }
9011
+ ],
9012
+ "color": [
9013
+ {
9014
+ "path": "mode",
9015
+ "valueType": "enum",
9016
+ "enumValues": [
9017
+ "rgb",
9018
+ "hsv",
9019
+ "mired"
9020
+ ]
9021
+ },
9022
+ {
9023
+ "path": "rgb.r",
9024
+ "valueType": "number"
9025
+ },
9026
+ {
9027
+ "path": "rgb.g",
9028
+ "valueType": "number"
9029
+ },
9030
+ {
9031
+ "path": "rgb.b",
9032
+ "valueType": "number"
9033
+ },
9034
+ {
9035
+ "path": "hsv.h",
9036
+ "valueType": "number"
9037
+ },
9038
+ {
9039
+ "path": "hsv.s",
9040
+ "valueType": "number"
9041
+ },
9042
+ {
9043
+ "path": "hsv.v",
9044
+ "valueType": "number"
9045
+ },
9046
+ {
9047
+ "path": "mireds",
9048
+ "valueType": "number"
9049
+ }
9050
+ ],
9051
+ "connectivity": [{
9052
+ "path": "connected",
9053
+ "valueType": "boolean"
9054
+ }],
9055
+ "contact": [{
9056
+ "path": "entryOpen",
9057
+ "valueType": "boolean"
9058
+ }],
9059
+ "control": [
9060
+ {
9061
+ "path": "kind",
9062
+ "valueType": "enum",
9063
+ "enumValues": [
9064
+ "numeric",
9065
+ "select",
9066
+ "text",
9067
+ "datetime"
9068
+ ]
9069
+ },
9070
+ {
9071
+ "path": "unit",
9072
+ "valueType": "string"
9073
+ },
9074
+ {
9075
+ "path": "min",
9076
+ "valueType": "number"
9077
+ },
9078
+ {
9079
+ "path": "max",
9080
+ "valueType": "number"
9081
+ },
9082
+ {
9083
+ "path": "step",
9084
+ "valueType": "number"
9085
+ },
9086
+ {
9087
+ "path": "precision",
9088
+ "valueType": "number"
9089
+ },
9090
+ {
9091
+ "path": "format",
9092
+ "valueType": "enum",
9093
+ "enumValues": [
9094
+ "date",
9095
+ "time",
9096
+ "datetime"
9097
+ ]
9098
+ }
9099
+ ],
9100
+ "cover": [
9101
+ {
9102
+ "path": "state",
9103
+ "valueType": "enum",
9104
+ "enumValues": [
9105
+ "open",
9106
+ "opening",
9107
+ "closing",
9108
+ "closed",
9109
+ "stopped"
9110
+ ]
9111
+ },
9112
+ {
9113
+ "path": "position",
9114
+ "valueType": "number"
9115
+ },
9116
+ {
9117
+ "path": "tiltPosition",
9118
+ "valueType": "number"
9119
+ }
9120
+ ],
9121
+ "day-night": [
9122
+ {
9123
+ "path": "mode",
9124
+ "valueType": "enum",
9125
+ "enumValues": [
9126
+ "auto",
9127
+ "day",
9128
+ "night",
9129
+ "schedule"
9130
+ ]
9131
+ },
9132
+ {
9133
+ "path": "sensitivity",
9134
+ "valueType": "number"
9135
+ },
9136
+ {
9137
+ "path": "switchDelaySec",
9138
+ "valueType": "number"
9139
+ }
9140
+ ],
9141
+ "device-adoption": [
9142
+ {
9143
+ "path": "lastDiscoveryAt",
9144
+ "valueType": "number"
9145
+ },
9146
+ {
9147
+ "path": "candidateCount",
9148
+ "valueType": "number"
9149
+ },
9150
+ {
9151
+ "path": "adoptedCount",
9152
+ "valueType": "number"
9153
+ },
9154
+ {
9155
+ "path": "lastError",
9156
+ "valueType": "string"
9157
+ }
9158
+ ],
9159
+ "device-discovery": [{
9160
+ "path": "lastDiscoveryAt",
9161
+ "valueType": "number"
9162
+ }, {
9163
+ "path": "lastError",
9164
+ "valueType": "string"
9165
+ }],
9166
+ "device-export": [
9167
+ {
9168
+ "path": "linkState",
9169
+ "valueType": "enum",
9170
+ "enumValues": [
9171
+ "unlinked",
9172
+ "linked",
9173
+ "error"
9174
+ ]
9175
+ },
9176
+ {
9177
+ "path": "exposedDeviceCount",
9178
+ "valueType": "number"
9179
+ },
9180
+ {
9181
+ "path": "error",
9182
+ "valueType": "string"
9183
+ },
9184
+ {
9185
+ "path": "setup.qr",
9186
+ "valueType": "string"
9187
+ },
9188
+ {
9189
+ "path": "setup.note",
9190
+ "valueType": "string"
9191
+ }
9192
+ ],
9193
+ "device-status": [{
9194
+ "path": "online",
9195
+ "valueType": "boolean"
9196
+ }],
9197
+ "dishwasher": [
9198
+ {
9199
+ "path": "availability",
9200
+ "valueType": "enum",
9201
+ "enumValues": [
9202
+ "available",
9203
+ "offline",
9204
+ "description-missing"
9205
+ ]
9206
+ },
9207
+ {
9208
+ "path": "state",
9209
+ "valueType": "enum",
9210
+ "enumValues": [
9211
+ "idle",
9212
+ "running",
9213
+ "paused",
9214
+ "finished",
9215
+ "error",
9216
+ "unavailable"
9217
+ ]
9218
+ },
9219
+ {
9220
+ "path": "operationState",
9221
+ "valueType": "enum",
9222
+ "enumValues": [
9223
+ "Inactive",
9224
+ "Ready",
9225
+ "DelayedStart",
9226
+ "Run",
9227
+ "Pause",
9228
+ "ActionRequired",
9229
+ "Finished",
9230
+ "Error",
9231
+ "Aborting"
9232
+ ]
9233
+ },
9234
+ {
9235
+ "path": "program",
9236
+ "valueType": "string"
9237
+ },
9238
+ {
9239
+ "path": "selectedProgram",
9240
+ "valueType": "string"
9241
+ },
9242
+ {
9243
+ "path": "remainingSeconds",
9244
+ "valueType": "number"
9245
+ },
9246
+ {
9247
+ "path": "delayedStartSeconds",
9248
+ "valueType": "number"
9249
+ },
9250
+ {
9251
+ "path": "progressPercent",
9252
+ "valueType": "number"
9253
+ },
9254
+ {
9255
+ "path": "doorOpen",
9256
+ "valueType": "boolean"
9257
+ },
9258
+ {
9259
+ "path": "doorLocked",
9260
+ "valueType": "boolean"
9261
+ },
9262
+ {
9263
+ "path": "remoteStartAllowed",
9264
+ "valueType": "boolean"
9265
+ },
9266
+ {
9267
+ "path": "remoteControlActive",
9268
+ "valueType": "boolean"
9269
+ },
9270
+ {
9271
+ "path": "localControlActive",
9272
+ "valueType": "boolean"
9273
+ },
9274
+ {
9275
+ "path": "powerOn",
9276
+ "valueType": "boolean"
9277
+ },
9278
+ {
9279
+ "path": "powerState",
9280
+ "valueType": "string"
9281
+ },
9282
+ {
9283
+ "path": "filterCleaningDue",
9284
+ "valueType": "boolean"
9285
+ },
9286
+ {
9287
+ "path": "machineCareDue",
9288
+ "valueType": "boolean"
9289
+ },
9290
+ {
9291
+ "path": "machineCareRemainingRuns",
9292
+ "valueType": "number"
9293
+ },
9294
+ {
9295
+ "path": "halfLoad",
9296
+ "valueType": "boolean"
9297
+ },
9298
+ {
9299
+ "path": "hygienePlus",
9300
+ "valueType": "boolean"
9301
+ },
9302
+ {
9303
+ "path": "extraDry",
9304
+ "valueType": "boolean"
9305
+ },
9306
+ {
9307
+ "path": "intensiveZone",
9308
+ "valueType": "boolean"
9309
+ },
9310
+ {
9311
+ "path": "varioSpeedPlus",
9312
+ "valueType": "boolean"
9313
+ },
9314
+ {
9315
+ "path": "childLock",
9316
+ "valueType": "boolean"
9317
+ },
9318
+ {
9319
+ "path": "errorCode",
9320
+ "valueType": "number"
9321
+ },
9322
+ {
9323
+ "path": "errorLabel",
9324
+ "valueType": "string"
9325
+ }
9326
+ ],
9327
+ "doorbell": [{
9328
+ "path": "lastPressedAt",
9329
+ "valueType": "number"
9330
+ }, {
9331
+ "path": "pressCountSinceStart",
9332
+ "valueType": "number"
9333
+ }],
9334
+ "enum-sensor": [{
9335
+ "path": "value",
9336
+ "valueType": "string"
9337
+ }, {
9338
+ "path": "format",
9339
+ "valueType": "enum",
9340
+ "enumValues": [
9341
+ "date",
9342
+ "time",
9343
+ "datetime"
9344
+ ]
9345
+ }],
9346
+ "event-emitter": [
9347
+ {
9348
+ "path": "lastEvent.deviceId",
9349
+ "valueType": "number"
9350
+ },
9351
+ {
9352
+ "path": "lastEvent.eventType",
9353
+ "valueType": "string"
9354
+ },
9355
+ {
9356
+ "path": "lastEvent.timestamp",
9357
+ "valueType": "number"
9358
+ },
9359
+ {
9360
+ "path": "lastEvent.seq",
9361
+ "valueType": "number"
9362
+ },
9363
+ {
9364
+ "path": "eventCountSinceStart",
9365
+ "valueType": "number"
9366
+ }
9367
+ ],
9368
+ "fan-control": [
9369
+ {
9370
+ "path": "percentage",
9371
+ "valueType": "number"
9372
+ },
9373
+ {
9374
+ "path": "percentageStep",
9375
+ "valueType": "number"
9376
+ },
9377
+ {
9378
+ "path": "preset",
9379
+ "valueType": "string"
9380
+ },
9381
+ {
9382
+ "path": "direction",
9383
+ "valueType": "enum",
9384
+ "enumValues": ["forward", "reverse"]
9385
+ },
9386
+ {
9387
+ "path": "oscillating",
9388
+ "valueType": "boolean"
9389
+ }
9390
+ ],
9391
+ "feature-probe": [
9392
+ {
9393
+ "path": "deviceType",
9394
+ "valueType": "string"
9395
+ },
9396
+ {
9397
+ "path": "model",
9398
+ "valueType": "string"
9399
+ },
9400
+ {
9401
+ "path": "channelCount",
9402
+ "valueType": "number"
9403
+ },
9404
+ {
9405
+ "path": "lastProbedAt",
9406
+ "valueType": "number"
9407
+ }
9408
+ ],
9409
+ "flood": [{
9410
+ "path": "flooded",
9411
+ "valueType": "boolean"
9412
+ }],
9413
+ "gas": [{
9414
+ "path": "detected",
9415
+ "valueType": "boolean"
9416
+ }],
9417
+ "heating-valve": [{
9418
+ "path": "position",
9419
+ "valueType": "number"
9420
+ }],
9421
+ "humidifier": [
9422
+ {
9423
+ "path": "on",
9424
+ "valueType": "boolean"
9425
+ },
9426
+ {
9427
+ "path": "currentHumidity",
9428
+ "valueType": "number"
9429
+ },
9430
+ {
9431
+ "path": "targetHumidity",
9432
+ "valueType": "number"
9433
+ },
9434
+ {
9435
+ "path": "mode",
9436
+ "valueType": "string"
9437
+ },
9438
+ {
9439
+ "path": "action",
9440
+ "valueType": "string"
9441
+ },
9442
+ {
9443
+ "path": "minHumidity",
9444
+ "valueType": "number"
9445
+ },
9446
+ {
9447
+ "path": "maxHumidity",
9448
+ "valueType": "number"
9449
+ }
9450
+ ],
9451
+ "humidity-sensor": [
9452
+ {
9453
+ "path": "percent",
9454
+ "valueType": "number"
9455
+ },
9456
+ {
9457
+ "path": "unit",
9458
+ "valueType": "string"
9459
+ },
9460
+ {
9461
+ "path": "precision",
9462
+ "valueType": "number"
9463
+ }
9464
+ ],
9465
+ "image": [{
9466
+ "path": "url",
9467
+ "valueType": "string"
9468
+ }, {
9469
+ "path": "lastUpdated",
9470
+ "valueType": "number"
9471
+ }],
9472
+ "image-settings": [
9473
+ {
9474
+ "path": "brightness",
9475
+ "valueType": "number"
9476
+ },
9477
+ {
9478
+ "path": "contrast",
9479
+ "valueType": "number"
9480
+ },
9481
+ {
9482
+ "path": "saturation",
9483
+ "valueType": "number"
9484
+ },
9485
+ {
9486
+ "path": "sharpness",
9487
+ "valueType": "number"
9488
+ },
9489
+ {
9490
+ "path": "mirror",
9491
+ "valueType": "boolean"
9492
+ },
9493
+ {
9494
+ "path": "flip",
9495
+ "valueType": "boolean"
9496
+ },
9497
+ {
9498
+ "path": "rotate",
9499
+ "valueType": "enum",
9500
+ "enumValues": [
9501
+ "0",
9502
+ "90",
9503
+ "180",
9504
+ "270"
9505
+ ]
9506
+ },
9507
+ {
9508
+ "path": "whiteBalance",
9509
+ "valueType": "enum",
9510
+ "enumValues": ["auto", "manual"]
9511
+ },
9512
+ {
9513
+ "path": "warmth",
9514
+ "valueType": "number"
9515
+ },
9516
+ {
9517
+ "path": "exposureMode",
9518
+ "valueType": "enum",
9519
+ "enumValues": ["auto", "manual"]
9520
+ },
9521
+ {
9522
+ "path": "backlightMode",
9523
+ "valueType": "enum",
9524
+ "enumValues": [
9525
+ "off",
9526
+ "blc",
9527
+ "wdr",
9528
+ "hlc"
9529
+ ]
9530
+ }
9531
+ ],
9532
+ "intercom": [
9533
+ {
9534
+ "path": "talking",
9535
+ "valueType": "boolean"
9536
+ },
9537
+ {
9538
+ "path": "lastSessionAt",
9539
+ "valueType": "number"
9540
+ },
9541
+ {
9542
+ "path": "ability.sampleRate",
9543
+ "valueType": "number"
9544
+ },
9545
+ {
9546
+ "path": "ability.duplex",
9547
+ "valueType": "enum",
9548
+ "enumValues": ["half", "full"]
9549
+ },
9550
+ {
9551
+ "path": "ability.maxBacklogMs",
9552
+ "valueType": "number"
9553
+ }
9554
+ ],
9555
+ "lawn-mower-control": [
9556
+ {
9557
+ "path": "activity",
9558
+ "valueType": "enum",
9559
+ "enumValues": [
9560
+ "idle",
9561
+ "mowing",
9562
+ "paused",
9563
+ "docked",
9564
+ "error"
9565
+ ]
9566
+ },
9567
+ {
9568
+ "path": "batteryLevel",
9569
+ "valueType": "number"
9570
+ },
9571
+ {
9572
+ "path": "progressPercent",
9573
+ "valueType": "number"
9574
+ },
9575
+ {
9576
+ "path": "currentCode",
9577
+ "valueType": "number"
9578
+ },
9579
+ {
9580
+ "path": "currentCodeLabel",
9581
+ "valueType": "string"
9582
+ },
9583
+ {
9584
+ "path": "severity",
9585
+ "valueType": "enum",
9586
+ "enumValues": [
9587
+ "info",
9588
+ "warning",
9589
+ "error"
9590
+ ]
9591
+ }
9592
+ ],
9593
+ "lock-control": [{
9594
+ "path": "state",
9595
+ "valueType": "enum",
9596
+ "enumValues": [
9597
+ "locked",
9598
+ "unlocked",
9599
+ "locking",
9600
+ "unlocking",
9601
+ "jammed"
9602
+ ]
9603
+ }],
9604
+ "media-player": [
9605
+ {
9606
+ "path": "state",
9607
+ "valueType": "enum",
9608
+ "enumValues": [
9609
+ "off",
9610
+ "on",
9611
+ "idle",
9612
+ "playing",
9613
+ "paused",
9614
+ "buffering",
9615
+ "standby"
9616
+ ]
9617
+ },
9618
+ {
9619
+ "path": "volumeLevel",
9620
+ "valueType": "number"
9621
+ },
9622
+ {
9623
+ "path": "isMuted",
9624
+ "valueType": "boolean"
9625
+ },
9626
+ {
9627
+ "path": "source",
9628
+ "valueType": "string"
9629
+ },
9630
+ {
9631
+ "path": "currentMedia.type",
9632
+ "valueType": "string"
9633
+ },
9634
+ {
9635
+ "path": "currentMedia.title",
9636
+ "valueType": "string"
9637
+ },
9638
+ {
9639
+ "path": "currentMedia.artist",
9640
+ "valueType": "string"
9641
+ },
9642
+ {
9643
+ "path": "currentMedia.album",
9644
+ "valueType": "string"
9645
+ },
9646
+ {
9647
+ "path": "currentMedia.imageUrl",
9648
+ "valueType": "string"
9649
+ },
9650
+ {
9651
+ "path": "positionMs",
9652
+ "valueType": "number"
9653
+ },
9654
+ {
9655
+ "path": "durationMs",
9656
+ "valueType": "number"
9657
+ },
9658
+ {
9659
+ "path": "shuffle",
9660
+ "valueType": "boolean"
9661
+ },
9662
+ {
9663
+ "path": "repeat",
9664
+ "valueType": "enum",
9665
+ "enumValues": [
9666
+ "off",
9667
+ "all",
9668
+ "one"
9669
+ ]
9670
+ }
9671
+ ],
9672
+ "motion": [
9673
+ {
9674
+ "path": "detected",
9675
+ "valueType": "boolean"
9676
+ },
9677
+ {
9678
+ "path": "lastDetectedAt",
9679
+ "valueType": "number"
9680
+ },
9681
+ {
9682
+ "path": "autoClearAfterMs",
9683
+ "valueType": "number"
9684
+ }
9685
+ ],
9686
+ "motion-trigger": [{
9687
+ "path": "enabled",
9688
+ "valueType": "boolean"
9689
+ }],
9690
+ "motion-zones": [{
9691
+ "path": "enabled",
9692
+ "valueType": "boolean"
9693
+ }, {
9694
+ "path": "sensitivity",
9695
+ "valueType": "number"
9696
+ }],
9697
+ "mqtt-broker": [{
9698
+ "path": "brokerCount",
9699
+ "valueType": "number"
9700
+ }, {
9701
+ "path": "embeddedRunning",
9702
+ "valueType": "boolean"
9703
+ }],
9704
+ "native-object-detection": [{
9705
+ "path": "enabled",
9706
+ "valueType": "boolean"
9707
+ }],
9708
+ "navigation": [
9709
+ {
9710
+ "path": "mode",
9711
+ "valueType": "enum",
9712
+ "enumValues": [
9713
+ "idle",
9714
+ "cleaning",
9715
+ "spot",
9716
+ "following",
9717
+ "goto",
9718
+ "returning",
9719
+ "paused",
9720
+ "unknown"
9721
+ ]
9722
+ },
9723
+ {
9724
+ "path": "following",
9725
+ "valueType": "boolean"
9726
+ },
9727
+ {
9728
+ "path": "flash",
9729
+ "valueType": "boolean"
9730
+ },
9731
+ {
9732
+ "path": "lightMode",
9733
+ "valueType": "enum",
9734
+ "enumValues": ["auto", "manual"]
9735
+ },
9736
+ {
9737
+ "path": "lightLevel",
9738
+ "valueType": "number"
9739
+ }
9740
+ ],
9741
+ "network-link": [
9742
+ {
9743
+ "path": "type",
9744
+ "valueType": "enum",
9745
+ "enumValues": [
9746
+ "wifi",
9747
+ "ethernet",
9748
+ "cellular",
9749
+ "unknown"
9750
+ ]
9751
+ },
9752
+ {
9753
+ "path": "signalPercent",
9754
+ "valueType": "number"
9755
+ },
9756
+ {
9757
+ "path": "rssiDbm",
9758
+ "valueType": "number"
9759
+ },
9760
+ {
9761
+ "path": "ssid",
9762
+ "valueType": "string"
9763
+ },
9764
+ {
9765
+ "path": "lastUpdated",
9766
+ "valueType": "number"
9767
+ }
9768
+ ],
9769
+ "notifier": [
9770
+ {
9771
+ "path": "lastSentAt",
9772
+ "valueType": "number"
9773
+ },
9774
+ {
9775
+ "path": "lastError",
9776
+ "valueType": "string"
9777
+ },
9778
+ {
9779
+ "path": "queueDepth",
9780
+ "valueType": "number"
9781
+ },
9782
+ {
9783
+ "path": "supports.image",
9784
+ "valueType": "boolean"
9785
+ },
9786
+ {
9787
+ "path": "supports.priority",
9788
+ "valueType": "boolean"
9789
+ },
9790
+ {
9791
+ "path": "supports.data",
9792
+ "valueType": "boolean"
9793
+ },
9794
+ {
9795
+ "path": "supports.actions",
9796
+ "valueType": "boolean"
9797
+ },
9798
+ {
9799
+ "path": "supports.recipients",
9800
+ "valueType": "boolean"
9801
+ }
9802
+ ],
9803
+ "numeric-sensor": [
9804
+ {
9805
+ "path": "value",
9806
+ "valueType": "number"
9807
+ },
9808
+ {
9809
+ "path": "unit",
9810
+ "valueType": "string"
9811
+ },
9812
+ {
9813
+ "path": "precision",
9814
+ "valueType": "number"
9815
+ }
9816
+ ],
9817
+ "pet-feeder": [
9818
+ {
9819
+ "path": "foodLevel",
9820
+ "valueType": "number"
9821
+ },
9822
+ {
9823
+ "path": "food1",
9824
+ "valueType": "number"
9825
+ },
9826
+ {
9827
+ "path": "food2",
9828
+ "valueType": "number"
9829
+ },
9830
+ {
9831
+ "path": "lowFood",
9832
+ "valueType": "boolean"
9833
+ },
9834
+ {
9835
+ "path": "batteryPower",
9836
+ "valueType": "number"
9837
+ },
9838
+ {
9839
+ "path": "desiccantLeftDays",
9840
+ "valueType": "number"
9841
+ },
9842
+ {
9843
+ "path": "feeding",
9844
+ "valueType": "boolean"
9845
+ },
9846
+ {
9847
+ "path": "status",
9848
+ "valueType": "enum",
9849
+ "enumValues": [
9850
+ "normal",
9851
+ "offline",
9852
+ "on_batteries"
9853
+ ]
9854
+ },
9855
+ {
9856
+ "path": "error",
9857
+ "valueType": "string"
9858
+ },
9859
+ {
9860
+ "path": "errorCode",
9861
+ "valueType": "number"
9862
+ },
9863
+ {
9864
+ "path": "isDualHopper",
9865
+ "valueType": "boolean"
9866
+ },
9867
+ {
9868
+ "path": "childLock",
9869
+ "valueType": "boolean"
9870
+ },
9871
+ {
9872
+ "path": "indicatorLight",
9873
+ "valueType": "boolean"
9874
+ },
9875
+ {
9876
+ "path": "feedSound",
9877
+ "valueType": "boolean"
9878
+ },
9879
+ {
9880
+ "path": "volume",
9881
+ "valueType": "number"
9882
+ }
9883
+ ],
9884
+ "power-meter": [
9885
+ {
9886
+ "path": "watts",
9887
+ "valueType": "number"
9888
+ },
9889
+ {
9890
+ "path": "kwhTotal",
9891
+ "valueType": "number"
9892
+ },
9893
+ {
9894
+ "path": "volts",
9895
+ "valueType": "number"
9896
+ },
9897
+ {
9898
+ "path": "amps",
9899
+ "valueType": "number"
9900
+ },
9901
+ {
9902
+ "path": "va",
9903
+ "valueType": "number"
9904
+ },
9905
+ {
9906
+ "path": "powerFactor",
9907
+ "valueType": "number"
9908
+ },
9909
+ {
9910
+ "path": "unit",
9911
+ "valueType": "string"
9912
+ },
9913
+ {
9914
+ "path": "precision",
9915
+ "valueType": "number"
9916
+ }
9917
+ ],
9918
+ "presence": [
9919
+ {
9920
+ "path": "state",
9921
+ "valueType": "string"
9922
+ },
9923
+ {
9924
+ "path": "location",
9925
+ "valueType": "string"
9926
+ },
9927
+ {
9928
+ "path": "gps.latitude",
9929
+ "valueType": "number"
9930
+ },
9931
+ {
9932
+ "path": "gps.longitude",
9933
+ "valueType": "number"
9934
+ },
9935
+ {
9936
+ "path": "gps.accuracyMeters",
9937
+ "valueType": "number"
9938
+ },
9939
+ {
9940
+ "path": "batteryPercent",
9941
+ "valueType": "number"
9942
+ }
9943
+ ],
9944
+ "pressure-sensor": [
9945
+ {
9946
+ "path": "hpa",
9947
+ "valueType": "number"
9948
+ },
9949
+ {
9950
+ "path": "unit",
9951
+ "valueType": "string"
9952
+ },
9953
+ {
9954
+ "path": "precision",
9955
+ "valueType": "number"
9956
+ }
9957
+ ],
9958
+ "privacy-mask": [{
9959
+ "path": "enabled",
9960
+ "valueType": "boolean"
9961
+ }, {
9962
+ "path": "audioEnabled",
9963
+ "valueType": "boolean"
9964
+ }],
9965
+ "ptz": [
9966
+ {
9967
+ "path": "pan",
9968
+ "valueType": "number"
9969
+ },
9970
+ {
9971
+ "path": "tilt",
9972
+ "valueType": "number"
9973
+ },
9974
+ {
9975
+ "path": "zoom",
9976
+ "valueType": "number"
9977
+ },
9978
+ {
9979
+ "path": "autofocus",
9980
+ "valueType": "boolean"
9981
+ }
9982
+ ],
9983
+ "ptz-autotrack": [
9984
+ {
9985
+ "path": "enabled",
9986
+ "valueType": "boolean"
9987
+ },
9988
+ {
9989
+ "path": "currentSettings.targetType",
9990
+ "valueType": "string"
9991
+ },
9992
+ {
9993
+ "path": "currentSettings.stopDelaySeconds",
9994
+ "valueType": "number"
9995
+ },
9996
+ {
9997
+ "path": "currentSettings.disappearDelaySeconds",
9998
+ "valueType": "number"
9999
+ }
10000
+ ],
10001
+ "recording-archive": [
10002
+ {
10003
+ "path": "deviceId",
10004
+ "valueType": "number"
10005
+ },
10006
+ {
10007
+ "path": "enabled",
10008
+ "valueType": "boolean"
10009
+ },
10010
+ {
10011
+ "path": "activeMode",
10012
+ "valueType": "enum",
10013
+ "enumValues": [
10014
+ "off",
10015
+ "events",
10016
+ "continuous",
10017
+ "on-device-decision"
10018
+ ]
10019
+ },
10020
+ {
10021
+ "path": "nodeId",
10022
+ "valueType": "string"
10023
+ },
10024
+ {
10025
+ "path": "storageBytes",
10026
+ "valueType": "number"
10027
+ }
10028
+ ],
10029
+ "recording-onboard": [
10030
+ {
10031
+ "path": "primaryTrackId",
10032
+ "valueType": "string"
10033
+ },
10034
+ {
10035
+ "path": "enabled",
10036
+ "valueType": "boolean"
10037
+ },
10038
+ {
10039
+ "path": "overwriteWhenFull",
10040
+ "valueType": "boolean"
10041
+ },
10042
+ {
10043
+ "path": "preRecordSec",
10044
+ "valueType": "number"
10045
+ },
10046
+ {
10047
+ "path": "postRecordSec",
10048
+ "valueType": "number"
10049
+ },
10050
+ {
10051
+ "path": "segmentMinutes",
10052
+ "valueType": "number"
10053
+ },
10054
+ {
10055
+ "path": "unreadableWindows",
10056
+ "valueType": "number"
10057
+ },
10058
+ {
10059
+ "path": "recordingToNowhere",
10060
+ "valueType": "boolean"
10061
+ }
10062
+ ],
10063
+ "recording-signal": [{
10064
+ "path": "active",
10065
+ "valueType": "boolean"
10066
+ }, {
10067
+ "path": "reason",
10068
+ "valueType": "string"
10069
+ }],
10070
+ "running-state": [
10071
+ {
10072
+ "path": "running",
10073
+ "valueType": "boolean"
10074
+ },
10075
+ {
10076
+ "path": "since",
10077
+ "valueType": "number"
10078
+ },
10079
+ {
10080
+ "path": "source",
10081
+ "valueType": "enum",
10082
+ "enumValues": ["native", "assigned"]
10083
+ },
10084
+ {
10085
+ "path": "phase",
10086
+ "valueType": "string"
10087
+ }
10088
+ ],
10089
+ "script-runner": [
10090
+ {
10091
+ "path": "isRunning",
10092
+ "valueType": "boolean"
10093
+ },
10094
+ {
10095
+ "path": "lastRunAt",
10096
+ "valueType": "number"
10097
+ },
10098
+ {
10099
+ "path": "lastRunSuccess",
10100
+ "valueType": "boolean"
10101
+ },
10102
+ {
10103
+ "path": "lastError",
10104
+ "valueType": "string"
10105
+ }
10106
+ ],
10107
+ "smoke": [{
10108
+ "path": "detected",
10109
+ "valueType": "boolean"
10110
+ }],
10111
+ "snapshot": [
10112
+ {
10113
+ "path": "lastCapturedAt",
10114
+ "valueType": "number"
10115
+ },
10116
+ {
10117
+ "path": "cacheAgeMs",
10118
+ "valueType": "number"
10119
+ },
10120
+ {
10121
+ "path": "lastBytes",
10122
+ "valueType": "number"
10123
+ },
10124
+ {
10125
+ "path": "lastStreamId",
10126
+ "valueType": "string"
10127
+ }
10128
+ ],
10129
+ "stream-params": [
10130
+ {
10131
+ "path": "main.width",
10132
+ "valueType": "number"
10133
+ },
10134
+ {
10135
+ "path": "main.height",
10136
+ "valueType": "number"
10137
+ },
10138
+ {
10139
+ "path": "main.codec",
10140
+ "valueType": "enum",
10141
+ "enumValues": ["h264", "h265"]
10142
+ },
10143
+ {
10144
+ "path": "main.framerate",
10145
+ "valueType": "number"
10146
+ },
10147
+ {
10148
+ "path": "main.bitrate",
10149
+ "valueType": "number"
10150
+ },
10151
+ {
10152
+ "path": "main.bitrateMode",
10153
+ "valueType": "enum",
10154
+ "enumValues": ["vbr", "cbr"]
10155
+ },
10156
+ {
10157
+ "path": "main.encoderProfile",
10158
+ "valueType": "enum",
10159
+ "enumValues": [
10160
+ "high",
10161
+ "main",
10162
+ "baseline"
10163
+ ]
10164
+ },
10165
+ {
10166
+ "path": "main.gop",
10167
+ "valueType": "number"
10168
+ },
10169
+ {
10170
+ "path": "main.audio",
10171
+ "valueType": "boolean"
10172
+ },
10173
+ {
10174
+ "path": "sub.width",
10175
+ "valueType": "number"
10176
+ },
10177
+ {
10178
+ "path": "sub.height",
10179
+ "valueType": "number"
10180
+ },
10181
+ {
10182
+ "path": "sub.codec",
10183
+ "valueType": "enum",
10184
+ "enumValues": ["h264", "h265"]
10185
+ },
10186
+ {
10187
+ "path": "sub.framerate",
10188
+ "valueType": "number"
10189
+ },
10190
+ {
10191
+ "path": "sub.bitrate",
10192
+ "valueType": "number"
10193
+ },
10194
+ {
10195
+ "path": "sub.bitrateMode",
10196
+ "valueType": "enum",
10197
+ "enumValues": ["vbr", "cbr"]
10198
+ },
10199
+ {
10200
+ "path": "sub.encoderProfile",
10201
+ "valueType": "enum",
10202
+ "enumValues": [
10203
+ "high",
10204
+ "main",
10205
+ "baseline"
10206
+ ]
10207
+ },
10208
+ {
10209
+ "path": "sub.gop",
10210
+ "valueType": "number"
10211
+ },
10212
+ {
10213
+ "path": "sub.audio",
10214
+ "valueType": "boolean"
10215
+ },
10216
+ {
10217
+ "path": "ext.width",
10218
+ "valueType": "number"
10219
+ },
10220
+ {
10221
+ "path": "ext.height",
10222
+ "valueType": "number"
10223
+ },
10224
+ {
10225
+ "path": "ext.codec",
10226
+ "valueType": "enum",
10227
+ "enumValues": ["h264", "h265"]
10228
+ },
10229
+ {
10230
+ "path": "ext.framerate",
10231
+ "valueType": "number"
10232
+ },
10233
+ {
10234
+ "path": "ext.bitrate",
10235
+ "valueType": "number"
10236
+ },
10237
+ {
10238
+ "path": "ext.bitrateMode",
10239
+ "valueType": "enum",
10240
+ "enumValues": ["vbr", "cbr"]
10241
+ },
10242
+ {
10243
+ "path": "ext.encoderProfile",
10244
+ "valueType": "enum",
10245
+ "enumValues": [
10246
+ "high",
10247
+ "main",
10248
+ "baseline"
10249
+ ]
10250
+ },
10251
+ {
10252
+ "path": "ext.gop",
10253
+ "valueType": "number"
10254
+ },
10255
+ {
10256
+ "path": "ext.audio",
10257
+ "valueType": "boolean"
10258
+ }
10259
+ ],
10260
+ "switch": [{
10261
+ "path": "on",
10262
+ "valueType": "boolean"
10263
+ }],
10264
+ "tamper": [{
10265
+ "path": "tampered",
10266
+ "valueType": "boolean"
10267
+ }],
10268
+ "temperature-sensor": [
10269
+ {
10270
+ "path": "celsius",
10271
+ "valueType": "number"
10272
+ },
10273
+ {
10274
+ "path": "unit",
10275
+ "valueType": "string"
10276
+ },
10277
+ {
10278
+ "path": "precision",
10279
+ "valueType": "number"
10280
+ }
10281
+ ],
10282
+ "update": [
10283
+ {
10284
+ "path": "currentVersion",
10285
+ "valueType": "string"
10286
+ },
10287
+ {
10288
+ "path": "availableVersion",
10289
+ "valueType": "string"
10290
+ },
10291
+ {
10292
+ "path": "updatable",
10293
+ "valueType": "boolean"
10294
+ },
10295
+ {
10296
+ "path": "state",
10297
+ "valueType": "string"
10298
+ },
10299
+ {
10300
+ "path": "inProgress",
10301
+ "valueType": "boolean"
10302
+ }
10303
+ ],
10304
+ "vacuum-control": [
10305
+ {
10306
+ "path": "state",
10307
+ "valueType": "enum",
10308
+ "enumValues": [
10309
+ "idle",
10310
+ "cleaning",
10311
+ "paused",
10312
+ "returning",
10313
+ "docked",
10314
+ "drying",
10315
+ "error"
10316
+ ]
10317
+ },
10318
+ {
10319
+ "path": "batteryLevel",
10320
+ "valueType": "number"
10321
+ },
10322
+ {
10323
+ "path": "fanSpeed",
10324
+ "valueType": "string"
10325
+ },
10326
+ {
10327
+ "path": "progressPercent",
10328
+ "valueType": "number"
10329
+ },
10330
+ {
10331
+ "path": "errorCode",
10332
+ "valueType": "number"
10333
+ },
10334
+ {
10335
+ "path": "errorLabel",
10336
+ "valueType": "string"
10337
+ }
10338
+ ],
10339
+ "valve": [{
10340
+ "path": "state",
10341
+ "valueType": "enum",
10342
+ "enumValues": [
10343
+ "open",
10344
+ "opening",
10345
+ "closing",
10346
+ "closed",
10347
+ "stopped"
10348
+ ]
10349
+ }, {
10350
+ "path": "position",
10351
+ "valueType": "number"
10352
+ }],
10353
+ "vibration": [{
10354
+ "path": "detected",
10355
+ "valueType": "boolean"
10356
+ }],
10357
+ "water-heater": [
10358
+ {
10359
+ "path": "currentTemp",
10360
+ "valueType": "number"
10361
+ },
10362
+ {
10363
+ "path": "targetTemp",
10364
+ "valueType": "number"
10365
+ },
10366
+ {
10367
+ "path": "operationMode",
10368
+ "valueType": "string"
10369
+ },
10370
+ {
10371
+ "path": "away",
10372
+ "valueType": "boolean"
10373
+ },
10374
+ {
10375
+ "path": "minTemp",
10376
+ "valueType": "number"
10377
+ },
10378
+ {
10379
+ "path": "maxTemp",
10380
+ "valueType": "number"
10381
+ }
10382
+ ],
10383
+ "weather": [
10384
+ {
10385
+ "path": "condition",
10386
+ "valueType": "string"
10387
+ },
10388
+ {
10389
+ "path": "temperature",
10390
+ "valueType": "number"
10391
+ },
10392
+ {
10393
+ "path": "temperatureUnit",
10394
+ "valueType": "string"
10395
+ },
10396
+ {
10397
+ "path": "humidity",
10398
+ "valueType": "number"
10399
+ },
10400
+ {
10401
+ "path": "pressure",
10402
+ "valueType": "number"
10403
+ },
10404
+ {
10405
+ "path": "pressureUnit",
10406
+ "valueType": "string"
10407
+ },
10408
+ {
10409
+ "path": "windSpeed",
10410
+ "valueType": "number"
10411
+ },
10412
+ {
10413
+ "path": "windSpeedUnit",
10414
+ "valueType": "string"
10415
+ },
10416
+ {
10417
+ "path": "windBearing",
10418
+ "valueType": "number"
10419
+ }
10420
+ ],
10421
+ "zone-analytics": [
10422
+ {
10423
+ "path": "ts",
10424
+ "valueType": "number"
10425
+ },
10426
+ {
10427
+ "path": "frameWidth",
10428
+ "valueType": "number"
10429
+ },
10430
+ {
10431
+ "path": "frameHeight",
10432
+ "valueType": "number"
10433
+ },
10434
+ {
10435
+ "path": "frame.totalObjects",
10436
+ "valueType": "number"
10437
+ },
10438
+ {
10439
+ "path": "frame.standingObjects",
10440
+ "valueType": "number"
10441
+ },
10442
+ {
10443
+ "path": "frame.transientObjects",
10444
+ "valueType": "number"
10445
+ },
10446
+ {
10447
+ "path": "unzoned.totalObjects",
10448
+ "valueType": "number"
10449
+ },
10450
+ {
10451
+ "path": "unzoned.standingObjects",
10452
+ "valueType": "number"
10453
+ },
10454
+ {
10455
+ "path": "unzoned.transientObjects",
10456
+ "valueType": "number"
10457
+ }
10458
+ ]
10459
+ });
8486
10460
  object({
8487
10461
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8488
10462
  params: record(string(), union([string(), number()])).optional()
@@ -8841,7 +10815,7 @@ function errMsg(err) {
8841
10815
  return String(err);
8842
10816
  }
8843
10817
  //#endregion
8844
- //#region ../types/dist/composition-BJ8iAZb3.mjs
10818
+ //#region ../types/dist/composition-kEl9mevu.mjs
8845
10819
  /**
8846
10820
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8847
10821
  *
@@ -12056,7 +14030,7 @@ var LogChannelDescriptorSchema = object({
12056
14030
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12057
14031
  * consulted with the numeric device id, AND every line the channel admits
12058
14032
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12059
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14033
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12060
14034
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12061
14035
  * the body is the only way to filter.
12062
14036
  *
@@ -12244,7 +14218,7 @@ var ModelVariantGroupSchema = object({
12244
14218
  precision: _enum(["fp32", "int8"]).optional(),
12245
14219
  /**
12246
14220
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12247
- * an alternate training of the same family (Scrypted `relu_test`); chip
14221
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12248
14222
  * label is "Test".
12249
14223
  */
12250
14224
  optimization: _enum(["standard", "test"]).optional(),
@@ -12496,8 +14470,8 @@ var ModelCatalogEntrySchema = object({
12496
14470
  provider: ModelProviderIdSchema.optional(),
12497
14471
  /**
12498
14472
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12499
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12500
- * labels already ARE the CamStack macros (Scrypted identity map).
14473
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14474
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12501
14475
  */
12502
14476
  classMap: DetectionCatalogClassMapSchema.optional(),
12503
14477
  /**
@@ -15466,7 +17440,7 @@ method(object({
15466
17440
  * `1` is real time and is the ONLY value that allows the copy branch —
15467
17441
  * anything else forces `libx264` over the window. That was priced
15468
17442
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15469
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17443
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15470
17444
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15471
17445
  * once the decode is forced the width stops being free.
15472
17446
  */
@@ -15992,6 +17966,7 @@ var CompositionRunStatusSchema = _enum([
15992
17966
  "starting",
15993
17967
  "running",
15994
17968
  "degraded",
17969
+ "incomplete",
15995
17970
  "failed"
15996
17971
  ]);
15997
17972
  var CompositionFieldStateKindSchema = _enum([
@@ -16041,6 +18016,13 @@ var ComposerUnreadableBlockSchema = object({
16041
18016
  /** The parse error, in the operator's words. */
16042
18017
  error: string()
16043
18018
  });
18019
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
18020
+ var UnreleasedClaimSchema = object({
18021
+ deviceId: number().int(),
18022
+ capName: string(),
18023
+ owner: string(),
18024
+ error: string()
18025
+ });
16044
18026
  method(object({
16045
18027
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16046
18028
  integrationId: string().nullable(),
@@ -16050,7 +18032,13 @@ method(object({
16050
18032
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16051
18033
  restartBlockIds: array(string()),
16052
18034
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16053
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
18035
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
18036
+ /**
18037
+ * Operator-confirmed deletions. Their claims are released on this apply,
18038
+ * before any replacement block claims. A block that merely vanished from the
18039
+ * snapshot is not listed here and still waits for two applies (D49).
18040
+ */
18041
+ retiredBlockIds: array(string()).optional()
16054
18042
  }), object({
16055
18043
  blocks: array(object({
16056
18044
  blockId: string(),
@@ -16062,7 +18050,13 @@ method(object({
16062
18050
  * integration unknown, its own rows unread or read empty once). An empty
16063
18051
  * apply the caller owes is paid off only by one the composer acted on (D49).
16064
18052
  */
16065
- acted: boolean()
18053
+ acted: boolean(),
18054
+ /**
18055
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
18056
+ * every one landed (or there was nothing to hand back). Absent on a result
18057
+ * that never got that far.
18058
+ */
18059
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16066
18060
  }), {
16067
18061
  kind: "mutation",
16068
18062
  auth: "admin"
@@ -16186,6 +18180,7 @@ var CoreBlockStatusSchema = _enum([
16186
18180
  "starting",
16187
18181
  "running",
16188
18182
  "degraded",
18183
+ "incomplete",
16189
18184
  "failed"
16190
18185
  ]);
16191
18186
  /** path → TypeScript source for a multi-file block. */
@@ -38237,7 +40232,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38237
40232
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38238
40233
  * operator's casing. The registry matches labels trimmed + case-insensitively
38239
40234
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38240
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40235
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38241
40236
  * map keyed on the displayed casing would orphan its entry on exactly that
38242
40237
  * edit. Consumers join by keying their own label through `locationIconKey`.
38243
40238
  */
@@ -38262,7 +40257,7 @@ var LocationDescriptionAssignmentSchema = object({
38262
40257
  /**
38263
40258
  * A SITE ZONE — a named part of the property that several locations belong to.
38264
40259
  *
38265
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40260
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38266
40261
  * kitchen. A camera belongs to exactly one location, and a location to at most
38267
40262
  * one zone, so a camera's zone is derived and never stored on the device: the
38268
40263
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38291,7 +40286,7 @@ var LocationDescriptionAssignmentSchema = object({
38291
40286
  * the locations inside it.
38292
40287
  *
38293
40288
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38294
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40289
+ * a surface must show "Night zone", not "night zone". Locations are carried
38295
40290
  * here, rather than left to a second call, because every consumer wants both
38296
40291
  * at once and a viewer that asked twice could render a zone whose membership
38297
40292
  * it has not fetched yet.
@@ -40485,8 +42480,8 @@ var LoadContributionSchema = object({
40485
42480
  "unattributable"
40486
42481
  ]),
40487
42482
  /**
40488
- * What ONE entry is, in the contributor's own words — `615/high`,
40489
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42483
+ * What ONE entry is, in the contributor's own words — `101/high`,
42484
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40490
42485
  * family and inventing a common one would lose the only information that
40491
42486
  * makes two entries for the same camera distinguishable.
40492
42487
  */
@@ -42134,6 +44129,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42134
44129
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42135
44130
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42136
44131
  /**
44132
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
44133
+ * not entries. `heatmapScrub` is a mark, not an event kind.
44134
+ */
44135
+ var PALETTE_ENTRY_IDS = [
44136
+ "motion",
44137
+ "audio",
44138
+ "recording",
44139
+ "live",
44140
+ "heatmapScrub",
44141
+ "person",
44142
+ "vehicle",
44143
+ "animal",
44144
+ "package",
44145
+ "sensor",
44146
+ "control",
44147
+ "face",
44148
+ "plate",
44149
+ "car",
44150
+ "truck",
44151
+ "bus",
44152
+ "motorcycle",
44153
+ "bicycle",
44154
+ "airplane",
44155
+ "boat",
44156
+ "train",
44157
+ "bird",
44158
+ "dog",
44159
+ "cat",
44160
+ "horse",
44161
+ "sheep",
44162
+ "cow",
44163
+ "elephant",
44164
+ "bear",
44165
+ "zebra",
44166
+ "giraffe",
44167
+ "package-delivered",
44168
+ "package-picked-up",
44169
+ "suitcase",
44170
+ "backpack",
44171
+ "handbag",
44172
+ "contact",
44173
+ "motion-sensor",
44174
+ "smoke",
44175
+ "flood",
44176
+ "gas",
44177
+ "carbon-monoxide",
44178
+ "vibration",
44179
+ "tamper",
44180
+ "presence",
44181
+ "enum-sensor",
44182
+ "device-event",
44183
+ "lock",
44184
+ "cover",
44185
+ "switch",
44186
+ "siren",
44187
+ "button",
44188
+ "doorbell"
44189
+ ];
44190
+ var AUDIO_ENTRY_ID = "audio";
44191
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
44192
+ var AUDIO_GRADIENT_ALPHAS = [
44193
+ .3,
44194
+ .42,
44195
+ .55,
44196
+ .7,
44197
+ .85,
44198
+ 1
44199
+ ];
44200
+ var PALETTE_PRESET_IDS = [
44201
+ "camstack",
44202
+ "high-contrast",
44203
+ "okabe-ito"
44204
+ ];
44205
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
44206
+ var CAMSTACK_HEX = {
44207
+ motion: "#d946ef",
44208
+ audio: "#059eb8",
44209
+ recording: "#ef4444",
44210
+ live: "#8d7a00",
44211
+ heatmapScrub: "#4b32ff",
44212
+ person: "#11a64c",
44213
+ vehicle: "#3b82f6",
44214
+ animal: "#ea6a09",
44215
+ package: "#924667",
44216
+ sensor: "#624bbc",
44217
+ control: "#944d24",
44218
+ face: "#ed4f8d",
44219
+ plate: "#4b7027",
44220
+ car: "#9684cf",
44221
+ truck: "#0f9b89",
44222
+ bus: "#a734a9",
44223
+ motorcycle: "#c1133a",
44224
+ bicycle: "#0e6a9b",
44225
+ airplane: "#7c9928",
44226
+ boat: "#b17933",
44227
+ train: "#ad6ca3",
44228
+ bird: "#0f7c55",
44229
+ dog: "#c82700",
44230
+ cat: "#7268f2",
44231
+ horse: "#cb795e",
44232
+ sheep: "#b8636b",
44233
+ cow: "#cb2969",
44234
+ elephant: "#1158d2",
44235
+ bear: "#8d5e00",
44236
+ zebra: "#0097d6",
44237
+ giraffe: "#8f61bb",
44238
+ "package-delivered": "#cd3f9b",
44239
+ "package-picked-up": "#388a08",
44240
+ suitcase: "#666800",
44241
+ backpack: "#ec5022",
44242
+ handbag: "#a76ef8",
44243
+ contact: "#ab5a49",
44244
+ "motion-sensor": "#b95d1a",
44245
+ smoke: "#dd3858",
44246
+ flood: "#b31e7d",
44247
+ gas: "#5b70b5",
44248
+ "carbon-monoxide": "#7b4e8e",
44249
+ vibration: "#e65bba",
44250
+ tamper: "#98464b",
44251
+ presence: "#3a9468",
44252
+ "enum-sensor": "#7885f8",
44253
+ "device-event": "#8c43c8",
44254
+ lock: "#649653",
44255
+ cover: "#c67597",
44256
+ switch: "#7a812a",
44257
+ siren: "#ac5d7f",
44258
+ button: "#b276cd",
44259
+ doorbell: "#0087ab"
44260
+ };
44261
+ var CAMSTACK_FALLBACK = [
44262
+ "#b34dc7",
44263
+ "#1d7d34",
44264
+ "#db6b6c",
44265
+ "#a43d29",
44266
+ "#0e6ee6",
44267
+ "#29a10b",
44268
+ "#a98731",
44269
+ "#0181c6"
44270
+ ];
44271
+ var HIGH_CONTRAST_HEX = {
44272
+ motion: "#964360",
44273
+ audio: "#23a132",
44274
+ recording: "#2494ca",
44275
+ live: "#bd7e2b",
44276
+ heatmapScrub: "#ad6eea",
44277
+ person: "#62611e",
44278
+ vehicle: "#f4534c",
44279
+ animal: "#1556cd",
44280
+ package: "#9c4415",
44281
+ sensor: "#066c48",
44282
+ control: "#f2479f",
44283
+ face: "#139d8a",
44284
+ plate: "#909024",
44285
+ car: "#8e35ab",
44286
+ truck: "#bd0b2b",
44287
+ bus: "#7a88ca",
44288
+ motorcycle: "#e26725",
44289
+ bicycle: "#a6679b",
44290
+ airplane: "#7c5720",
44291
+ boat: "#467a1b",
44292
+ train: "#6f65a4",
44293
+ bird: "#cb717f",
44294
+ dog: "#c62490",
44295
+ cat: "#b36850",
44296
+ horse: "#1872ac",
44297
+ sheep: "#927939",
44298
+ cow: "#428a5c",
44299
+ elephant: "#d41160",
44300
+ bear: "#799453",
44301
+ zebra: "#a85455",
44302
+ giraffe: "#746be8",
44303
+ "package-delivered": "#824a80",
44304
+ "package-picked-up": "#614ac1",
44305
+ suitcase: "#2f77f3",
44306
+ backpack: "#fa476d",
44307
+ handbag: "#c14cbe",
44308
+ contact: "#c83921",
44309
+ "motion-sensor": "#a07ebd",
44310
+ smoke: "#a25b13",
44311
+ flood: "#526bab",
44312
+ gas: "#924938",
44313
+ "carbon-monoxide": "#bb7e53",
44314
+ vibration: "#b66182",
44315
+ tamper: "#3c6931",
44316
+ presence: "#6c851d",
44317
+ "enum-sensor": "#ad2d48",
44318
+ "device-event": "#5e9b04",
44319
+ lock: "#00a062",
44320
+ cover: "#ad8624",
44321
+ switch: "#d05259",
44322
+ siren: "#cd67b3",
44323
+ button: "#c9746a",
44324
+ doorbell: "#338eeb"
44325
+ };
44326
+ var HIGH_CONTRAST_FALLBACK = [
44327
+ "#817f3b",
44328
+ "#a0733e",
44329
+ "#8658b2",
44330
+ "#956301",
44331
+ "#bc652d",
44332
+ "#647331",
44333
+ "#a14c9e",
44334
+ "#d14e71"
44335
+ ];
44336
+ var OKABE_ITO_HEX = {
44337
+ motion: "#b88128",
44338
+ audio: "#1096c8",
44339
+ recording: "#009e73",
44340
+ live: "#9c8c22",
44341
+ heatmapScrub: "#0072b2",
44342
+ person: "#d55e00",
44343
+ vehicle: "#c0739f",
44344
+ animal: "#226d18",
44345
+ package: "#91446c",
44346
+ sensor: "#217b56",
44347
+ control: "#648647",
44348
+ face: "#c22998",
44349
+ plate: "#fa4575",
44350
+ car: "#956301",
44351
+ truck: "#2f77f3",
44352
+ bus: "#7a4e86",
44353
+ motorcycle: "#f54597",
44354
+ bicycle: "#bb3e75",
44355
+ airplane: "#e054c0",
44356
+ boat: "#457942",
44357
+ train: "#867afa",
44358
+ bird: "#88914c",
44359
+ dog: "#1556cd",
44360
+ cat: "#71702c",
44361
+ horse: "#9b4fa4",
44362
+ sheep: "#c0559d",
44363
+ cow: "#d14f65",
44364
+ elephant: "#98470f",
44365
+ bear: "#595896",
44366
+ zebra: "#96790e",
44367
+ giraffe: "#cb717b",
44368
+ "package-delivered": "#139d8a",
44369
+ "package-picked-up": "#906ead",
44370
+ suitcase: "#d02939",
44371
+ backpack: "#d41160",
44372
+ handbag: "#f64f54",
44373
+ contact: "#7258d2",
44374
+ "motion-sensor": "#b66182",
44375
+ smoke: "#627abb",
44376
+ flood: "#b86ae4",
44377
+ gas: "#a95261",
44378
+ "carbon-monoxide": "#c65d3c",
44379
+ vibration: "#7a40b7",
44380
+ tamper: "#914b34",
44381
+ presence: "#9481c3",
44382
+ "enum-sensor": "#ac6d47",
44383
+ "device-event": "#7b6fce",
44384
+ lock: "#c67662",
44385
+ cover: "#a6564d",
44386
+ switch: "#ad2c4e",
44387
+ siren: "#348e08",
44388
+ button: "#d27303",
44389
+ doorbell: "#55770f"
44390
+ };
44391
+ var OKABE_ITO_FALLBACK = [
44392
+ "#9a3784",
44393
+ "#a7392c",
44394
+ "#409d50",
44395
+ "#6987e7",
44396
+ "#ee5b3d",
44397
+ "#c0430d",
44398
+ "#af79b3",
44399
+ "#4b6628"
44400
+ ];
44401
+ /**
44402
+ * The display palette (D939). One table of colours, three presets, one
44403
+ * validator. Taxonomy colours and every consumer read this — there is no
44404
+ * second hex table.
44405
+ */
44406
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
44407
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
44408
+ form: literal("solid"),
44409
+ hex: paletteHexSchema
44410
+ }), object({
44411
+ form: literal("gradient"),
44412
+ hex: paletteHexSchema,
44413
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
44414
+ })]);
44415
+ var paletteReadySchema = object({
44416
+ status: literal("ready"),
44417
+ presetId: _enum(PALETTE_PRESET_IDS),
44418
+ customized: boolean(),
44419
+ source: _enum(["stored", "unconfigured"]),
44420
+ swatches: record(string(), paletteSwatchSchema),
44421
+ fallbacks: array(paletteHexSchema).length(8)
44422
+ });
44423
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
44424
+ status: literal("unknown"),
44425
+ reason: string()
44426
+ })]);
44427
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
44428
+ presetId: string(),
44429
+ overrides: record(string(), paletteSwatchSchema)
44430
+ })]);
44431
+ object({
44432
+ presetId: string(),
44433
+ overrides: record(string(), paletteSwatchSchema)
44434
+ });
44435
+ function solid(hex) {
44436
+ return {
44437
+ form: "solid",
44438
+ hex
44439
+ };
44440
+ }
44441
+ function audioGradient(hex) {
44442
+ return {
44443
+ form: "gradient",
44444
+ hex,
44445
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
44446
+ };
44447
+ }
44448
+ function swatchesFrom(hexes) {
44449
+ const out = {};
44450
+ for (const id of PALETTE_ENTRY_IDS) {
44451
+ const hex = hexes[id];
44452
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
44453
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
44454
+ }
44455
+ return out;
44456
+ }
44457
+ function preset(id, name, hexes, fallbacks) {
44458
+ return {
44459
+ id,
44460
+ name,
44461
+ swatches: swatchesFrom(hexes),
44462
+ fallbacks
44463
+ };
44464
+ }
44465
+ var DISPLAY_PRESETS = [
44466
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
44467
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
44468
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
44469
+ ];
44470
+ function presetById(id) {
44471
+ return DISPLAY_PRESETS.find((item) => item.id === id);
44472
+ }
44473
+ function bundledCamstack() {
44474
+ const presetRow = presetById("camstack");
44475
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
44476
+ return readyOf(presetRow, "unconfigured", false);
44477
+ }
44478
+ function readyOf(row, source, customized) {
44479
+ return {
44480
+ status: "ready",
44481
+ presetId: row.id,
44482
+ customized,
44483
+ source,
44484
+ swatches: row.swatches,
44485
+ fallbacks: [...row.fallbacks]
44486
+ };
44487
+ }
44488
+ function hashFallback(kind, fallbacks) {
44489
+ let hash = 0;
44490
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
44491
+ const hex = fallbacks[hash % fallbacks.length];
44492
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44493
+ return hex;
44494
+ }
44495
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
44496
+ function paintHex(swatches, fallbacks, kind) {
44497
+ const key = kind.trim().toLowerCase();
44498
+ if (key.startsWith("audio-")) {
44499
+ const audio = swatches[AUDIO_ENTRY_ID];
44500
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
44501
+ }
44502
+ const direct = swatches[key];
44503
+ if (direct !== void 0) return direct.hex;
44504
+ return hashFallback(key, fallbacks);
44505
+ }
44506
+ /**
42137
44507
  * Unified event-kind taxonomy — THE single source of truth for
42138
44508
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42139
44509
  * icon }`.
@@ -42147,109 +44517,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42147
44517
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42148
44518
  * - the COCO / audio class maps (macro ↔ sub relationships)
42149
44519
  *
42150
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42151
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42152
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42153
- * color or an icon: they read this dictionary (server descriptors carry the
42154
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
44520
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
44521
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
44522
+ * the bundled CamStack display palette (D939). The effective cluster palette
44523
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
44524
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42155
44525
  *
42156
44526
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42157
44527
  */
42158
- var TAXONOMY_COLORS = {
42159
- motion: "#f59e0b",
42160
- audio: "#06b6d4",
42161
- person: "#22c55e",
42162
- vehicle: "#3b82f6",
42163
- animal: "#f97316",
42164
- package: "#a855f7",
42165
- sensor: "#8b5cf6",
42166
- control: "#10b981",
42167
- genericDetection: "#64748b"
42168
- };
42169
- var DETECTION_SUB_COLORS = {
42170
- car: "#f59e0b",
42171
- truck: "#d97706",
42172
- bus: "#b45309",
42173
- motorcycle: "#eab308",
42174
- bicycle: "#ca8a04",
42175
- airplane: "#60a5fa",
42176
- boat: "#2563eb",
42177
- train: "#1d4ed8",
42178
- bird: "#14b8a6",
42179
- dog: "#84cc16",
42180
- cat: "#f97316",
42181
- horse: "#a16207",
42182
- sheep: "#a3a3a3",
42183
- cow: "#78716c",
42184
- elephant: "#6b7280",
42185
- bear: "#7c2d12",
42186
- zebra: "#404040",
42187
- giraffe: "#d4a373"
42188
- };
44528
+ var BUNDLED_PALETTE = bundledCamstack();
44529
+ function kindColor(kind) {
44530
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
44531
+ }
44532
+ function firstFallback(fallbacks) {
44533
+ const hex = fallbacks[0];
44534
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44535
+ return hex;
44536
+ }
44537
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42189
44538
  function titleCase(id) {
42190
44539
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42191
44540
  }
42192
44541
  var entries = /* @__PURE__ */ new Map();
42193
- function macro(kind, category, color, iconId, label) {
44542
+ function macro(kind, category, iconId, label) {
42194
44543
  entries.set(kind, {
42195
44544
  kind,
42196
44545
  parentKind: null,
42197
44546
  level: "macro",
42198
44547
  category,
42199
- color,
44548
+ color: kindColor(kind),
42200
44549
  iconId,
42201
44550
  labelKey: `eventKind.${kind}`,
42202
44551
  label
42203
44552
  });
42204
44553
  }
42205
- function sub(kind, parentKind, category, color, iconId, label) {
44554
+ function sub(kind, parentKind, category, iconId, label) {
42206
44555
  entries.set(kind, {
42207
44556
  kind,
42208
44557
  parentKind,
42209
44558
  level: "sub",
42210
44559
  category,
42211
- color,
44560
+ color: kindColor(kind),
42212
44561
  iconId,
42213
44562
  labelKey: `eventKind.${kind}`,
42214
44563
  label
42215
44564
  });
42216
44565
  }
42217
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42218
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42219
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42220
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42221
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42222
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42223
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42224
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
44566
+ macro("motion", "motion", "motion", "Motion");
44567
+ macro("audio", "audio", "audio", "Audio");
44568
+ macro("person", "detection", "person", "Person");
44569
+ macro("vehicle", "detection", "vehicle", "Vehicle");
44570
+ macro("animal", "detection", "animal", "Animal");
44571
+ macro("package", "package", "package", "Package");
44572
+ macro("sensor", "sensor", "sensor", "Sensor");
44573
+ macro("control", "control", "control", "Control");
42225
44574
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42226
44575
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42227
44576
  if (entries.has(cocoClass)) continue;
42228
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
44577
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
42229
44578
  }
42230
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42231
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42232
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42233
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42234
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42235
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42236
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42237
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42238
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42239
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42240
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42241
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42242
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42243
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42244
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42245
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42246
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42247
- sub("button", "control", "control", "#10b981", "button", "Button");
42248
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
44579
+ sub("package-delivered", "package", "package", "package", "Package delivered");
44580
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
44581
+ sub("contact", "sensor", "sensor", "door", "Contact");
44582
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
44583
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
44584
+ sub("flood", "sensor", "sensor", "water", "Water leak");
44585
+ sub("gas", "sensor", "sensor", "gas", "Gas");
44586
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
44587
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
44588
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
44589
+ sub("presence", "sensor", "sensor", "presence", "Presence");
44590
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
44591
+ sub("device-event", "sensor", "sensor", "button", "Device event");
44592
+ sub("lock", "control", "control", "lock", "Lock");
44593
+ sub("cover", "control", "control", "door", "Cover");
44594
+ sub("switch", "control", "control", "switch", "Switch");
44595
+ sub("siren", "control", "control", "siren", "Siren");
44596
+ sub("button", "control", "control", "button", "Button");
44597
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42249
44598
  for (const l of AUDIO_MACRO_LABELS) {
42250
44599
  const kind = `audio-${l.id}`;
42251
44600
  if (entries.has(kind)) continue;
42252
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
44601
+ sub(kind, "audio", "audio", kind, l.name);
42253
44602
  }
42254
44603
  /** The complete taxonomy dictionary, keyed by kind. */
42255
44604
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -43136,7 +45485,7 @@ var NcConditionsSchema = object({
43136
45485
  * with the list under it is worse than no switch (D62).
43137
45486
  *
43138
45487
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43139
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45488
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43140
45489
  * the operator fixed the spelling. The id reaches the record on
43141
45490
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43142
45491
  * `{{label}}` renders.
@@ -43687,7 +46036,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
43687
46036
  * A rule scoped to one camera and one zone silently became a rule that
43688
46037
  * matches EVERY event on EVERY camera, and lost its `media` policy
43689
46038
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
43690
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46039
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
43691
46040
  * within a minute of a two-field patch.
43692
46041
  *
43693
46042
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -45500,7 +47849,7 @@ var LabelAttributionSchema = object({
45500
47849
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
45501
47850
  *
45502
47851
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
45503
- * notification rule authored on "Gianluca" stopped matching the moment the
47852
+ * notification rule authored on "Alice" stopped matching the moment the
45504
47853
  * operator fixed the spelling in the gallery, and nothing said so. The id is
45505
47854
  * the thing that does not move, so it is what a rule matches on
45506
47855
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48039,7 +50388,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48039
50388
  /**
48040
50389
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48041
50390
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48042
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50391
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48043
50392
  * NOT inferred, these boxes are its output, and its children (the plate
48044
50393
  * reader) run on them through their own crop policy. Boxes are in the
48045
50394
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -49716,7 +52065,7 @@ var RunnerCameraConfigSchema = object({
49716
52065
  * detection session that asks for history. What shipped was a last-moment
49717
52066
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
49718
52067
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
49719
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52068
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
49720
52069
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
49721
52070
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
49722
52071
  * was decoded, and was freed.
@@ -51746,7 +54095,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
51746
54095
  * The signals a device can emit to WAKE its own stream.
51747
54096
  *
51748
54097
  * A camera whose stream is built on demand sleeps until something asks for it,
51749
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54098
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
51750
54099
  * puller holds a session open for ever, and treating that as demand would keep
51751
54100
  * a battery camera awake for ever, which is the whole thing the battery is for
51752
54101
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -52466,7 +54815,7 @@ var ClipSchema = object({
52466
54815
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
52467
54816
  *
52468
54817
  * Bounded because it is not a payload the surface pages through: one visit on
52469
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
54818
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
52470
54819
  * camera-day. Read {@link eventCount} for the true total.
52471
54820
  */
52472
54821
  eventIds: array(string()).optional(),
@@ -52611,7 +54960,7 @@ var ClipPlaybackSchema = object({
52611
54960
  * camera has no recordings", which is the defect this whole line of work is
52612
54961
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
52613
54962
  * reached at all (`unreachable`, also what a provider that THREW reports), a
52614
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
54963
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
52615
54964
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
52616
54965
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
52617
54966
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -52876,7 +55225,7 @@ DeviceType.Camera, method(object({
52876
55225
  *
52877
55226
  * It was optional, documented as "absent means the device's BOUND
52878
55227
  * provider, which is CamStack on every camera". No code implemented
52879
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55228
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
52880
55229
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
52881
55230
  * answered SIX rows, three from each source, merged newest-first:
52882
55231
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -54019,7 +56368,10 @@ var airQualitySensorCapability = {
54019
56368
  */
54020
56369
  var AmbientLightSensorStatusSchema = object({
54021
56370
  /** Current illuminance in lux (lx). */
54022
- lux: number().min(0),
56371
+ lux: number().min(0).meta({
56372
+ unit: "lx",
56373
+ label: "Illuminance"
56374
+ }),
54023
56375
  /** Ms epoch when the slice was last updated. */
54024
56376
  lastFetchedAt: number(),
54025
56377
  /** Live display unit from the upstream source (e.g. HA
@@ -54062,7 +56414,12 @@ var ambientLightSensorCapability = {
54062
56414
  } } },
54063
56415
  /** Clock fields: written, but excluded from the compare that decides
54064
56416
  * whether persisting is worth a SQLite commit. */
54065
- volatileStateFields: ["lastFetchedAt"]
56417
+ volatileStateFields: ["lastFetchedAt"],
56418
+ customize: {
56419
+ version: 1,
56420
+ advanced: "derive",
56421
+ targets: []
56422
+ }
54066
56423
  };
54067
56424
  /**
54068
56425
  * Per-class audio metrics aggregated over a sliding window.
@@ -54289,7 +56646,10 @@ var BatteryStatusSchema = object({
54289
56646
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
54290
56647
  * declines to band a non-finite reading, which is the correct shape.
54291
56648
  */
54292
- percentage: number().min(0).max(100).nullable(),
56649
+ percentage: number().min(0).max(100).nullable().meta({
56650
+ unit: "%",
56651
+ label: "Charge"
56652
+ }),
54293
56653
  /**
54294
56654
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
54295
56655
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -54308,13 +56668,13 @@ var BatteryStatusSchema = object({
54308
56668
  "solar",
54309
56669
  "none",
54310
56670
  "unknown"
54311
- ]),
56671
+ ]).meta({ label: "Charging source" }),
54312
56672
  /**
54313
56673
  * True when the camera firmware has gone into low-power mode. Battery
54314
56674
  * providers MUST avoid polling during sleep — reading the battery
54315
56675
  * wakes the camera up and drains charge.
54316
56676
  */
54317
- sleeping: boolean(),
56677
+ sleeping: boolean().meta({ label: "Sleeping" }),
54318
56678
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
54319
56679
  lastUpdated: number(),
54320
56680
  /**
@@ -54354,7 +56714,7 @@ var BatteryStatusSchema = object({
54354
56714
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
54355
56715
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
54356
56716
  */
54357
- binary: boolean().optional()
56717
+ binary: boolean().optional().meta({ label: "Binary indicator" })
54358
56718
  });
54359
56719
  var BATTERY_DEVICE_TYPES = [
54360
56720
  DeviceType.Camera,
@@ -54368,6 +56728,7 @@ var BATTERY_DEVICE_TYPES = [
54368
56728
  /** Generic Customize target for the percentage reading (D936). */
54369
56729
  var batteryCustomize = {
54370
56730
  version: 1,
56731
+ advanced: "derive",
54371
56732
  targets: [{
54372
56733
  id: "percentage",
54373
56734
  cardinality: "scalar",
@@ -54518,7 +56879,7 @@ onStatusChanged: { data: object({
54518
56879
  * with the right HomeKit / Alexa display category.
54519
56880
  */
54520
56881
  var BinaryStatusSchema = object({
54521
- on: boolean(),
56882
+ on: boolean().meta({ label: "On" }),
54522
56883
  /** Ms epoch of the last transition. 0 if never observed. */
54523
56884
  lastChangedAt: number()
54524
56885
  });
@@ -54547,7 +56908,12 @@ var binaryCapability = {
54547
56908
  history: { fields: { on: { kind: "boolean" } } },
54548
56909
  /** Clock fields: written, but excluded from the compare that decides
54549
56910
  * whether persisting is worth a SQLite commit. */
54550
- volatileStateFields: ["lastChangedAt"]
56911
+ volatileStateFields: ["lastChangedAt"],
56912
+ customize: {
56913
+ version: 1,
56914
+ advanced: "derive",
56915
+ targets: []
56916
+ }
54551
56917
  };
54552
56918
  /**
54553
56919
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -54853,7 +57219,7 @@ var GridLayoutCellSchema = object({
54853
57219
  *
54854
57220
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
54855
57221
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
54856
- * the sources, because "this grid has no low" is not a finding — "615 has no
57222
+ * the sources, because "this grid has no low" is not a finding — "101 has no
54857
57223
  * low" is, and it is the one an operator can act on.
54858
57224
  */
54859
57225
  var GridProfileOfferSchema = object({
@@ -56023,6 +58389,30 @@ var dayNightCapability = {
56023
58389
  volatileStateFields: ["lastFetchedAt"]
56024
58390
  };
56025
58391
  /**
58392
+ * display-palette — the cluster's one colour table (D939).
58393
+ *
58394
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
58395
+ * cannot be read; it does not pretend the bundled preset was stored.
58396
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
58397
+ * the pairs.
58398
+ */
58399
+ var presetSummarySchema = object({
58400
+ id: string(),
58401
+ name: string(),
58402
+ swatches: record(string(), paletteSwatchSchema),
58403
+ fallbacks: array(string())
58404
+ });
58405
+ method(_void(), paletteResultSchema, {
58406
+ auth: "protected",
58407
+ role: "viewer"
58408
+ }), method(_void(), array(presetSummarySchema).readonly(), {
58409
+ auth: "protected",
58410
+ role: "viewer"
58411
+ }), method(setPaletteInputSchema, paletteReadySchema, {
58412
+ kind: "mutation",
58413
+ auth: "admin"
58414
+ });
58415
+ /**
56026
58416
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
56027
58417
  * for every device, regardless of provider — the kernel needs a uniform
56028
58418
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -57355,7 +59745,10 @@ var humidifierCapability = {
57355
59745
  */
57356
59746
  var HumiditySensorStatusSchema = object({
57357
59747
  /** Current relative humidity, 0..100. */
57358
- percent: number().min(0).max(100),
59748
+ percent: number().min(0).max(100).meta({
59749
+ unit: "%",
59750
+ label: "Humidity"
59751
+ }),
57359
59752
  /** Ms epoch when the slice was last updated. */
57360
59753
  lastFetchedAt: number(),
57361
59754
  /** Live display unit from the upstream source (e.g. HA
@@ -57397,7 +59790,12 @@ var humiditySensorCapability = {
57397
59790
  } } },
57398
59791
  /** Clock fields: written, but excluded from the compare that decides
57399
59792
  * whether persisting is worth a SQLite commit. */
57400
- volatileStateFields: ["lastFetchedAt"]
59793
+ volatileStateFields: ["lastFetchedAt"],
59794
+ customize: {
59795
+ version: 1,
59796
+ advanced: "derive",
59797
+ targets: []
59798
+ }
57401
59799
  };
57402
59800
  /**
57403
59801
  * Image display cap. Models a single still image exposed by an integration —
@@ -61030,9 +63428,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
61030
63428
  */
61031
63429
  var PowerMeterStatusSchema = object({
61032
63430
  /** Instantaneous power draw in watts. */
61033
- watts: number().optional(),
63431
+ watts: number().optional().meta({
63432
+ unit: "W",
63433
+ label: "Power"
63434
+ }),
61034
63435
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
61035
- kwhTotal: number().optional(),
63436
+ kwhTotal: number().optional().meta({
63437
+ unit: "kWh",
63438
+ label: "Energy"
63439
+ }),
61036
63440
  /** Voltage in volts. */
61037
63441
  volts: number().optional(),
61038
63442
  /** Current in amperes. */
@@ -61117,7 +63521,12 @@ var powerMeterCapability = {
61117
63521
  } },
61118
63522
  /** Clock fields: written, but excluded from the compare that decides
61119
63523
  * whether persisting is worth a SQLite commit. */
61120
- volatileStateFields: ["lastFetchedAt"]
63524
+ volatileStateFields: ["lastFetchedAt"],
63525
+ customize: {
63526
+ version: 1,
63527
+ advanced: "derive",
63528
+ targets: []
63529
+ }
61121
63530
  };
61122
63531
  /**
61123
63532
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -61539,9 +63948,9 @@ var PtzOptionsSchema = object({
61539
63948
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
61540
63949
  * not one of the three cameras honours its own:
61541
63950
  *
61542
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
61543
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
61544
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
63951
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
63952
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
63953
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
61545
63954
  *
61546
63955
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
61547
63956
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -61793,7 +64202,7 @@ var RunningStateStatusSchema = object({
61793
64202
  running: boolean().nullable(),
61794
64203
  /** Epoch ms the current boolean began; null while `running` is null. */
61795
64204
  since: number().nullable(),
61796
- source: RunningStateSourceSchema,
64205
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
61797
64206
  phase: string().nullable(),
61798
64207
  /** null until a reading has been published (D393). */
61799
64208
  lastFetchedAt: number().nullable()
@@ -61807,6 +64216,7 @@ var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
61807
64216
  /** Generic Customize target for the running boolean (D936). */
61808
64217
  var runningCustomize = {
61809
64218
  version: 1,
64219
+ advanced: "derive",
61810
64220
  targets: [{
61811
64221
  id: "running",
61812
64222
  cardinality: "scalar",
@@ -61945,7 +64355,7 @@ var RecordingAvailabilitySchema = object({
61945
64355
  * would look identical. But the answer used to say nothing about that, so a
61946
64356
  * caller asking "what can I export?" read the single preferred profile as
61947
64357
  * the only one that exists — on this deployment every camera records `high`
61948
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
64358
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
61949
64359
  * UI could not see it.
61950
64360
  *
61951
64361
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -62044,7 +64454,7 @@ var RecordingSourceOptionsSchema = object({
62044
64454
  * `sparse` = gaps are the absence of one, and must be drawn as such.
62045
64455
  *
62046
64456
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
62047
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
64457
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
62048
64458
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
62049
64459
  coverage: _enum(["continuous", "sparse"]),
62050
64460
  /** Where the playhead may be put.
@@ -62120,7 +64530,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
62120
64530
  * merely discouraged (D554 amended).
62121
64531
  *
62122
64532
  * It was learned the expensive way on `videoclips.listClips`: measured
62123
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
64533
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
62124
64534
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
62125
64535
  * three from each source, merged — `device-collection-dispatch.ts`
62126
64536
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -62721,7 +65131,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
62721
65131
  * on a 10 h window holding 29,393 s of footage every range landed late by the
62722
65132
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
62723
65133
  * the video was a uniform timelapse, and the log line reported the five ranges
62724
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
65134
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
62725
65135
  *
62726
65136
  * Relative and not absolute epoch, because an absolute epoch would make every
62727
65137
  * call site responsible for the same subtraction.
@@ -63432,7 +65842,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
63432
65842
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
63433
65843
  * for the thing: a scene is a standing question about the property ("is the bin
63434
65844
  * still out"), and the operator's question is "which of my scenes have tripped",
63435
- * across every camera at once — not "what does camera 617 think". Buried one
65845
+ * across every camera at once — not "what does camera 102 think". Buried one
63436
65846
  * camera deep it also could not be found. The surface is now a top-level admin
63437
65847
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
63438
65848
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -64291,7 +66701,7 @@ var streamParamsCapability = {
64291
66701
  * `getSettingsUISchema()` surface.
64292
66702
  */
64293
66703
  var SwitchStatusSchema = object({
64294
- on: boolean(),
66704
+ on: boolean().meta({ label: "On" }),
64295
66705
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
64296
66706
  lastChangedAt: number()
64297
66707
  });
@@ -64350,7 +66760,12 @@ var switchCapability = {
64350
66760
  label: "On",
64351
66761
  kind: "boolean"
64352
66762
  }
64353
- }] }
66763
+ }] },
66764
+ customize: {
66765
+ version: 1,
66766
+ advanced: "derive",
66767
+ targets: []
66768
+ }
64354
66769
  };
64355
66770
  /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
64356
66771
  function hasControlCharacter(value) {
@@ -64946,7 +67361,10 @@ var tamperCapability = {
64946
67361
  */
64947
67362
  var TemperatureSensorStatusSchema = object({
64948
67363
  /** Current temperature in Celsius. */
64949
- celsius: number(),
67364
+ celsius: number().meta({
67365
+ unit: "°C",
67366
+ label: "Temperature"
67367
+ }),
64950
67368
  /** Ms epoch when the slice was last updated (push or poll). */
64951
67369
  lastFetchedAt: number(),
64952
67370
  /** Live display unit from the upstream source (e.g. HA
@@ -64989,7 +67407,12 @@ var temperatureSensorCapability = {
64989
67407
  } } },
64990
67408
  /** Clock fields: written, but excluded from the compare that decides
64991
67409
  * whether persisting is worth a SQLite commit. */
64992
- volatileStateFields: ["lastFetchedAt"]
67410
+ volatileStateFields: ["lastFetchedAt"],
67411
+ customize: {
67412
+ version: 1,
67413
+ advanced: "derive",
67414
+ targets: []
67415
+ }
64993
67416
  };
64994
67417
  /**
64995
67418
  * toast — system-scoped singleton capability that streams toast
@@ -66566,6 +68989,10 @@ function runningFromDishwasherOperation(operation, program, previous, fetchedAt,
66566
68989
  return nativeSlice(false, operation, previous, transitionAtMs, fetchedAt, null);
66567
68990
  }
66568
68991
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
68992
+ 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;
68993
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
68994
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
68995
+ new Set(CAP_NAMES);
66569
68996
  Object.freeze({
66570
68997
  person: .5,
66571
68998
  vehicle: .5,
@@ -67799,7 +70226,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67799
70226
  * A top-level persisted row with NO configuration is a leftover, not a
67800
70227
  * device — quarantine it instead of dialling it.
67801
70228
  *
67802
- * Device 614 was deleted, resurrected as a config-less shell by a write
70229
+ * Device 105 was deleted, resurrected as a config-less shell by a write
67803
70230
  * already in flight (D376), and then dialled at every single boot: eight
67804
70231
  * `Failed to restore device — bounded retry scheduled` lines in one day,
67805
70232
  * each one the same Zod refusal on `host` and `password`. The bound was
@@ -71109,6 +73536,27 @@ Object.freeze({
71109
73536
  access: "create",
71110
73537
  role: "viewer"
71111
73538
  },
73539
+ "displayPalette.getPalette": {
73540
+ capName: "display-palette",
73541
+ capScope: "system",
73542
+ addonId: null,
73543
+ access: "view",
73544
+ role: "viewer"
73545
+ },
73546
+ "displayPalette.listPresets": {
73547
+ capName: "display-palette",
73548
+ capScope: "system",
73549
+ addonId: null,
73550
+ access: "view",
73551
+ role: "viewer"
73552
+ },
73553
+ "displayPalette.setPalette": {
73554
+ capName: "display-palette",
73555
+ capScope: "system",
73556
+ addonId: null,
73557
+ access: "create",
73558
+ role: "admin"
73559
+ },
71112
73560
  "doorbell.getStatus": {
71113
73561
  capName: "doorbell",
71114
73562
  capScope: "device",
@@ -81026,7 +83474,7 @@ var SENSOR_CAP_VOCABULARY = {
81026
83474
  state: [{
81027
83475
  kind: "boolean",
81028
83476
  field: "on",
81029
- label: t("Active", "Attivo"),
83477
+ label: t("On", "Acceso"),
81030
83478
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
81031
83479
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
81032
83480
  icon: "toggle-right"
@@ -81565,6 +84013,7 @@ var SYSTEM_CAP_VOCABULARY = {
81565
84013
  "device-provider": system(INTERNAL),
81566
84014
  "device-removal-hook": system(INTERNAL),
81567
84015
  "device-state": system("the runtime-state mirror every trigger already reads through"),
84016
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
81568
84017
  "embedding-encoder": system(ML),
81569
84018
  "face-gallery": system("the face gallery — curated on its own page"),
81570
84019
  "failure-contribution": system(INTERNAL),
@@ -84449,7 +86898,6 @@ Object.freeze({
84449
86898
  "smtp-provider": "email"
84450
86899
  });
84451
86900
  DeviceType.Camera;
84452
- 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;
84453
86901
  /**
84454
86902
  * A saved Customize assignment (D936). The schema is the type: callers use
84455
86903
  * `z.infer`, they do not restate the shape.
@@ -84538,7 +86986,6 @@ object({
84538
86986
  ]),
84539
86987
  reason: string().nullable()
84540
86988
  });
84541
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
84542
86989
  var G711_SCALE_CORRECTION_DB = {
84543
86990
  PCMU: 20 * Math.log10(4),
84544
86991
  PCMA: 20 * Math.log10(8)
@@ -84911,7 +87358,7 @@ var STATE_SUMMARY_SECTION_VARS = [
84911
87358
  {
84912
87359
  name: "summaryStreams",
84913
87360
  label: "Summary: streams offline",
84914
- example: "Ingresso (high) — since 06:40",
87361
+ example: "Front door (high) — since 06:40",
84915
87362
  kinds: ["stream-offline", "stream-online"]
84916
87363
  },
84917
87364
  {
@@ -84929,13 +87376,13 @@ var STATE_SUMMARY_SECTION_VARS = [
84929
87376
  {
84930
87377
  name: "summaryDetection",
84931
87378
  label: "Summary: cameras detecting nothing",
84932
- example: "Ingresso — since 05:10",
87379
+ example: "Front door — since 05:10",
84933
87380
  kinds: ["detection-blind"]
84934
87381
  },
84935
87382
  {
84936
87383
  name: "summaryNodes",
84937
87384
  label: "Summary: nodes",
84938
- example: "little-unraid — offline since 03:00",
87385
+ example: "agent-a — offline since 03:00",
84939
87386
  kinds: [
84940
87387
  "node-offline",
84941
87388
  "node-online",