@camstack/addon-provider-dreame 0.2.154 → 0.2.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +2583 -129
  2. package/dist/addon.mjs +2583 -129
  3. package/package.json +7 -2
package/dist/addon.mjs CHANGED
@@ -41,7 +41,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
41
41
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
42
42
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
43
43
  //#endregion
44
- //#region ../types/dist/event-category-Ceif8n-v.mjs
44
+ //#region ../types/dist/event-category-DHXxB8t9.mjs
45
45
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
46
46
  EventCategory["SystemBoot"] = "system.boot";
47
47
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -337,7 +337,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
337
337
  * TRANSITION into that state (never per dispatch), and the node is dropped
338
338
  * from the placement candidate set for as long as it holds.
339
339
  *
340
- * This exists because the state was previously invisible: little-unraid
340
+ * This exists because the state was previously invisible: agent-a
341
341
  * absorbed 283k inference errors in a day while still being handed cameras,
342
342
  * and nothing in the system said so.
343
343
  *
@@ -5476,7 +5476,7 @@ var ZodIssueCode$1 = {
5476
5476
  var ZodFirstPartyTypeKind$1;
5477
5477
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5478
5478
  //#endregion
5479
- //#region ../types/dist/sleep-CYfIZzGv.mjs
5479
+ //#region ../types/dist/sleep-BErAxhul.mjs
5480
5480
  /**
5481
5481
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5482
5482
  * window to float samples (D455).
@@ -8499,6 +8499,1980 @@ method(object({ deviceId: number() }), array(StreamSourceEntrySchema)), method(o
8499
8499
  kind: "mutation",
8500
8500
  auth: "admin"
8501
8501
  }), method(object({ deviceId: number() }), unknown().nullable()), method(object({ deviceId: number() }), RawStateResultSchema.nullable(), { auth: "protected" });
8502
+ Object.freeze({ "doorbell": "lastPressedAt" });
8503
+ /** Every capability name, so addon code can check a name without the schema graph. */
8504
+ var CAP_NAMES = Object.freeze([
8505
+ "accessories",
8506
+ "addon-pages",
8507
+ "addon-pages-source",
8508
+ "addon-routes",
8509
+ "addon-settings",
8510
+ "addon-widgets",
8511
+ "addon-widgets-source",
8512
+ "addons",
8513
+ "admin-ui",
8514
+ "air-quality-sensor",
8515
+ "alarm-panel",
8516
+ "alerts",
8517
+ "ambient-light-sensor",
8518
+ "audio-analysis",
8519
+ "audio-analyzer",
8520
+ "audio-codec",
8521
+ "audio-metrics",
8522
+ "auth-provider",
8523
+ "automation-control",
8524
+ "backup",
8525
+ "battery",
8526
+ "binary",
8527
+ "brightness",
8528
+ "broker",
8529
+ "button",
8530
+ "calendar-source",
8531
+ "calendars",
8532
+ "camera-credentials",
8533
+ "camera-grid-layout",
8534
+ "camera-pipeline-config",
8535
+ "camera-streams",
8536
+ "carbon-monoxide",
8537
+ "climate-control",
8538
+ "color",
8539
+ "composer",
8540
+ "connection-test",
8541
+ "connectivity",
8542
+ "consumables",
8543
+ "contact",
8544
+ "control",
8545
+ "core-blocks",
8546
+ "cover",
8547
+ "custom-model-registry",
8548
+ "data-store-provider",
8549
+ "database-snapshot",
8550
+ "day-night",
8551
+ "decoder",
8552
+ "detection-pipeline",
8553
+ "device-admin-link",
8554
+ "device-adoption",
8555
+ "device-credentials",
8556
+ "device-discovery",
8557
+ "device-export",
8558
+ "device-extension",
8559
+ "device-history",
8560
+ "device-manager",
8561
+ "device-ops",
8562
+ "device-provider",
8563
+ "device-removal-hook",
8564
+ "device-state",
8565
+ "device-status",
8566
+ "dishwasher",
8567
+ "display-palette",
8568
+ "doorbell",
8569
+ "embedding-encoder",
8570
+ "enum-sensor",
8571
+ "event-emitter",
8572
+ "face-gallery",
8573
+ "failure-contribution",
8574
+ "fan-control",
8575
+ "feature-probe",
8576
+ "filesystem-browse",
8577
+ "flood",
8578
+ "gas",
8579
+ "heating-valve",
8580
+ "humidifier",
8581
+ "humidity-sensor",
8582
+ "image",
8583
+ "image-settings",
8584
+ "integrations",
8585
+ "intercom",
8586
+ "keychain",
8587
+ "keychain-admin",
8588
+ "lawn-mower-control",
8589
+ "llm",
8590
+ "llm-runtime",
8591
+ "load-contribution",
8592
+ "local-network",
8593
+ "lock-control",
8594
+ "log-channels",
8595
+ "log-destination",
8596
+ "login-method",
8597
+ "media-player",
8598
+ "mesh-network",
8599
+ "metrics-provider",
8600
+ "model-convert",
8601
+ "model-distributor",
8602
+ "motion",
8603
+ "motion-detection",
8604
+ "motion-trigger",
8605
+ "motion-zones",
8606
+ "mqtt-broker",
8607
+ "native-object-detection",
8608
+ "navigation",
8609
+ "network-access",
8610
+ "network-link",
8611
+ "network-quality",
8612
+ "node-certificates",
8613
+ "nodes",
8614
+ "notification-output",
8615
+ "notification-rules",
8616
+ "notifier",
8617
+ "numeric-sensor",
8618
+ "oauth-integration",
8619
+ "oidc-connections",
8620
+ "osd",
8621
+ "osd-manager",
8622
+ "pet-feeder",
8623
+ "pipeline-analytics",
8624
+ "pipeline-executor",
8625
+ "pipeline-orchestrator",
8626
+ "pipeline-runner",
8627
+ "plate-gallery",
8628
+ "platform-probe",
8629
+ "power-meter",
8630
+ "presence",
8631
+ "pressure-sensor",
8632
+ "privacy-mask",
8633
+ "ptz",
8634
+ "ptz-autotrack",
8635
+ "reboot",
8636
+ "record-entries",
8637
+ "recording",
8638
+ "recording-archive",
8639
+ "recording-export",
8640
+ "recording-onboard",
8641
+ "recording-signal",
8642
+ "records",
8643
+ "running-state",
8644
+ "scene-monitor",
8645
+ "script-runner",
8646
+ "server-management",
8647
+ "settings-store",
8648
+ "smoke",
8649
+ "smtp-provider",
8650
+ "snapshot",
8651
+ "sso-bridge",
8652
+ "storage",
8653
+ "storage-admin",
8654
+ "storage-evictable",
8655
+ "storage-migration",
8656
+ "storage-occupancy",
8657
+ "storage-provider",
8658
+ "stream-broker",
8659
+ "stream-catalog",
8660
+ "stream-params",
8661
+ "stream-signals",
8662
+ "switch",
8663
+ "system",
8664
+ "tamper",
8665
+ "temperature-sensor",
8666
+ "terminal-session",
8667
+ "toast",
8668
+ "training",
8669
+ "training-provider",
8670
+ "turn-provider",
8671
+ "update",
8672
+ "user-management",
8673
+ "user-passkeys",
8674
+ "vacuum-control",
8675
+ "valve",
8676
+ "vector-store",
8677
+ "vibration",
8678
+ "videoclips",
8679
+ "viewer-ui",
8680
+ "water-heater",
8681
+ "weather",
8682
+ "webrtc-session",
8683
+ "zone-analytics",
8684
+ "zone-rules",
8685
+ "zones"
8686
+ ]);
8687
+ Object.freeze({
8688
+ "air-quality-sensor": [
8689
+ {
8690
+ "path": "co2Ppm",
8691
+ "valueType": "number"
8692
+ },
8693
+ {
8694
+ "path": "vocPpb",
8695
+ "valueType": "number"
8696
+ },
8697
+ {
8698
+ "path": "pm25",
8699
+ "valueType": "number"
8700
+ },
8701
+ {
8702
+ "path": "pm10",
8703
+ "valueType": "number"
8704
+ },
8705
+ {
8706
+ "path": "aqi",
8707
+ "valueType": "number"
8708
+ },
8709
+ {
8710
+ "path": "unit",
8711
+ "valueType": "string"
8712
+ },
8713
+ {
8714
+ "path": "precision",
8715
+ "valueType": "number"
8716
+ }
8717
+ ],
8718
+ "alarm-panel": [
8719
+ {
8720
+ "path": "state",
8721
+ "valueType": "enum",
8722
+ "enumValues": [
8723
+ "disarmed",
8724
+ "armed_home",
8725
+ "armed_away",
8726
+ "armed_night",
8727
+ "armed_vacation",
8728
+ "armed_custom_bypass",
8729
+ "arming",
8730
+ "disarming",
8731
+ "pending",
8732
+ "triggered"
8733
+ ]
8734
+ },
8735
+ {
8736
+ "path": "targetMode",
8737
+ "valueType": "enum",
8738
+ "enumValues": [
8739
+ "home",
8740
+ "away",
8741
+ "night",
8742
+ "vacation",
8743
+ "custom_bypass"
8744
+ ]
8745
+ },
8746
+ {
8747
+ "path": "requiresCode",
8748
+ "valueType": "boolean"
8749
+ }
8750
+ ],
8751
+ "ambient-light-sensor": [
8752
+ {
8753
+ "path": "lux",
8754
+ "valueType": "number"
8755
+ },
8756
+ {
8757
+ "path": "unit",
8758
+ "valueType": "string"
8759
+ },
8760
+ {
8761
+ "path": "precision",
8762
+ "valueType": "number"
8763
+ }
8764
+ ],
8765
+ "audio-metrics": [
8766
+ {
8767
+ "path": "ts",
8768
+ "valueType": "number"
8769
+ },
8770
+ {
8771
+ "path": "windowSec",
8772
+ "valueType": "number"
8773
+ },
8774
+ {
8775
+ "path": "level.rms",
8776
+ "valueType": "number"
8777
+ },
8778
+ {
8779
+ "path": "level.dbfs",
8780
+ "valueType": "number"
8781
+ },
8782
+ {
8783
+ "path": "peakDbfs",
8784
+ "valueType": "number"
8785
+ },
8786
+ {
8787
+ "path": "avgDbfs",
8788
+ "valueType": "number"
8789
+ },
8790
+ {
8791
+ "path": "current.className",
8792
+ "valueType": "string"
8793
+ },
8794
+ {
8795
+ "path": "current.score",
8796
+ "valueType": "number"
8797
+ },
8798
+ {
8799
+ "path": "current.timestamp",
8800
+ "valueType": "number"
8801
+ }
8802
+ ],
8803
+ "automation-control": [
8804
+ {
8805
+ "path": "enabled",
8806
+ "valueType": "boolean"
8807
+ },
8808
+ {
8809
+ "path": "isRunning",
8810
+ "valueType": "boolean"
8811
+ },
8812
+ {
8813
+ "path": "lastTriggeredAt",
8814
+ "valueType": "number"
8815
+ },
8816
+ {
8817
+ "path": "lastError",
8818
+ "valueType": "string"
8819
+ }
8820
+ ],
8821
+ "battery": [
8822
+ {
8823
+ "path": "percentage",
8824
+ "valueType": "number"
8825
+ },
8826
+ {
8827
+ "path": "charging",
8828
+ "valueType": "enum",
8829
+ "enumValues": [
8830
+ "dc",
8831
+ "solar",
8832
+ "none",
8833
+ "unknown"
8834
+ ]
8835
+ },
8836
+ {
8837
+ "path": "sleeping",
8838
+ "valueType": "boolean"
8839
+ },
8840
+ {
8841
+ "path": "lastUpdated",
8842
+ "valueType": "number"
8843
+ },
8844
+ {
8845
+ "path": "lastContactAt",
8846
+ "valueType": "number"
8847
+ },
8848
+ {
8849
+ "path": "lastFullRefreshAt",
8850
+ "valueType": "number"
8851
+ },
8852
+ {
8853
+ "path": "binary",
8854
+ "valueType": "boolean"
8855
+ }
8856
+ ],
8857
+ "binary": [{
8858
+ "path": "on",
8859
+ "valueType": "boolean"
8860
+ }],
8861
+ "brightness": [{
8862
+ "path": "percentage",
8863
+ "valueType": "number"
8864
+ }],
8865
+ "broker": [{
8866
+ "path": "brokerCount",
8867
+ "valueType": "number"
8868
+ }, {
8869
+ "path": "connectedCount",
8870
+ "valueType": "number"
8871
+ }],
8872
+ "camera-credentials": [
8873
+ {
8874
+ "path": "host",
8875
+ "valueType": "string"
8876
+ },
8877
+ {
8878
+ "path": "port",
8879
+ "valueType": "number"
8880
+ },
8881
+ {
8882
+ "path": "onvifPort",
8883
+ "valueType": "number"
8884
+ },
8885
+ {
8886
+ "path": "rtspPort",
8887
+ "valueType": "number"
8888
+ },
8889
+ {
8890
+ "path": "https",
8891
+ "valueType": "boolean"
8892
+ },
8893
+ {
8894
+ "path": "hasUsername",
8895
+ "valueType": "boolean"
8896
+ },
8897
+ {
8898
+ "path": "hasPassword",
8899
+ "valueType": "boolean"
8900
+ },
8901
+ {
8902
+ "path": "onvifProfile",
8903
+ "valueType": "string"
8904
+ }
8905
+ ],
8906
+ "camera-streams": [
8907
+ {
8908
+ "path": "online",
8909
+ "valueType": "boolean"
8910
+ },
8911
+ {
8912
+ "path": "slotStatuses.high",
8913
+ "valueType": "enum",
8914
+ "enumValues": [
8915
+ "unassigned",
8916
+ "idle",
8917
+ "connecting",
8918
+ "streaming",
8919
+ "error"
8920
+ ]
8921
+ },
8922
+ {
8923
+ "path": "slotStatuses.mid",
8924
+ "valueType": "enum",
8925
+ "enumValues": [
8926
+ "unassigned",
8927
+ "idle",
8928
+ "connecting",
8929
+ "streaming",
8930
+ "error"
8931
+ ]
8932
+ },
8933
+ {
8934
+ "path": "slotStatuses.low",
8935
+ "valueType": "enum",
8936
+ "enumValues": [
8937
+ "unassigned",
8938
+ "idle",
8939
+ "connecting",
8940
+ "streaming",
8941
+ "error"
8942
+ ]
8943
+ },
8944
+ {
8945
+ "path": "slotErrors.high",
8946
+ "valueType": "string"
8947
+ },
8948
+ {
8949
+ "path": "slotErrors.mid",
8950
+ "valueType": "string"
8951
+ },
8952
+ {
8953
+ "path": "slotErrors.low",
8954
+ "valueType": "string"
8955
+ }
8956
+ ],
8957
+ "carbon-monoxide": [{
8958
+ "path": "detected",
8959
+ "valueType": "boolean"
8960
+ }],
8961
+ "climate-control": [
8962
+ {
8963
+ "path": "mode",
8964
+ "valueType": "enum",
8965
+ "enumValues": [
8966
+ "off",
8967
+ "heat",
8968
+ "cool",
8969
+ "auto",
8970
+ "heat_cool",
8971
+ "fan_only",
8972
+ "dry"
8973
+ ]
8974
+ },
8975
+ {
8976
+ "path": "fanMode",
8977
+ "valueType": "string"
8978
+ },
8979
+ {
8980
+ "path": "preset",
8981
+ "valueType": "string"
8982
+ },
8983
+ {
8984
+ "path": "target",
8985
+ "valueType": "number"
8986
+ },
8987
+ {
8988
+ "path": "targetHigh",
8989
+ "valueType": "number"
8990
+ },
8991
+ {
8992
+ "path": "targetLow",
8993
+ "valueType": "number"
8994
+ },
8995
+ {
8996
+ "path": "targetHumidity",
8997
+ "valueType": "number"
8998
+ },
8999
+ {
9000
+ "path": "currentTemp",
9001
+ "valueType": "number"
9002
+ },
9003
+ {
9004
+ "path": "currentHumidity",
9005
+ "valueType": "number"
9006
+ },
9007
+ {
9008
+ "path": "swingVertical",
9009
+ "valueType": "boolean"
9010
+ },
9011
+ {
9012
+ "path": "swingHorizontal",
9013
+ "valueType": "boolean"
9014
+ },
9015
+ {
9016
+ "path": "minTemp",
9017
+ "valueType": "number"
9018
+ },
9019
+ {
9020
+ "path": "maxTemp",
9021
+ "valueType": "number"
9022
+ },
9023
+ {
9024
+ "path": "tempStep",
9025
+ "valueType": "number"
9026
+ }
9027
+ ],
9028
+ "color": [
9029
+ {
9030
+ "path": "mode",
9031
+ "valueType": "enum",
9032
+ "enumValues": [
9033
+ "rgb",
9034
+ "hsv",
9035
+ "mired"
9036
+ ]
9037
+ },
9038
+ {
9039
+ "path": "rgb.r",
9040
+ "valueType": "number"
9041
+ },
9042
+ {
9043
+ "path": "rgb.g",
9044
+ "valueType": "number"
9045
+ },
9046
+ {
9047
+ "path": "rgb.b",
9048
+ "valueType": "number"
9049
+ },
9050
+ {
9051
+ "path": "hsv.h",
9052
+ "valueType": "number"
9053
+ },
9054
+ {
9055
+ "path": "hsv.s",
9056
+ "valueType": "number"
9057
+ },
9058
+ {
9059
+ "path": "hsv.v",
9060
+ "valueType": "number"
9061
+ },
9062
+ {
9063
+ "path": "mireds",
9064
+ "valueType": "number"
9065
+ }
9066
+ ],
9067
+ "connectivity": [{
9068
+ "path": "connected",
9069
+ "valueType": "boolean"
9070
+ }],
9071
+ "contact": [{
9072
+ "path": "entryOpen",
9073
+ "valueType": "boolean"
9074
+ }],
9075
+ "control": [
9076
+ {
9077
+ "path": "kind",
9078
+ "valueType": "enum",
9079
+ "enumValues": [
9080
+ "numeric",
9081
+ "select",
9082
+ "text",
9083
+ "datetime"
9084
+ ]
9085
+ },
9086
+ {
9087
+ "path": "unit",
9088
+ "valueType": "string"
9089
+ },
9090
+ {
9091
+ "path": "min",
9092
+ "valueType": "number"
9093
+ },
9094
+ {
9095
+ "path": "max",
9096
+ "valueType": "number"
9097
+ },
9098
+ {
9099
+ "path": "step",
9100
+ "valueType": "number"
9101
+ },
9102
+ {
9103
+ "path": "precision",
9104
+ "valueType": "number"
9105
+ },
9106
+ {
9107
+ "path": "format",
9108
+ "valueType": "enum",
9109
+ "enumValues": [
9110
+ "date",
9111
+ "time",
9112
+ "datetime"
9113
+ ]
9114
+ }
9115
+ ],
9116
+ "cover": [
9117
+ {
9118
+ "path": "state",
9119
+ "valueType": "enum",
9120
+ "enumValues": [
9121
+ "open",
9122
+ "opening",
9123
+ "closing",
9124
+ "closed",
9125
+ "stopped"
9126
+ ]
9127
+ },
9128
+ {
9129
+ "path": "position",
9130
+ "valueType": "number"
9131
+ },
9132
+ {
9133
+ "path": "tiltPosition",
9134
+ "valueType": "number"
9135
+ }
9136
+ ],
9137
+ "day-night": [
9138
+ {
9139
+ "path": "mode",
9140
+ "valueType": "enum",
9141
+ "enumValues": [
9142
+ "auto",
9143
+ "day",
9144
+ "night",
9145
+ "schedule"
9146
+ ]
9147
+ },
9148
+ {
9149
+ "path": "sensitivity",
9150
+ "valueType": "number"
9151
+ },
9152
+ {
9153
+ "path": "switchDelaySec",
9154
+ "valueType": "number"
9155
+ }
9156
+ ],
9157
+ "device-adoption": [
9158
+ {
9159
+ "path": "lastDiscoveryAt",
9160
+ "valueType": "number"
9161
+ },
9162
+ {
9163
+ "path": "candidateCount",
9164
+ "valueType": "number"
9165
+ },
9166
+ {
9167
+ "path": "adoptedCount",
9168
+ "valueType": "number"
9169
+ },
9170
+ {
9171
+ "path": "lastError",
9172
+ "valueType": "string"
9173
+ }
9174
+ ],
9175
+ "device-discovery": [{
9176
+ "path": "lastDiscoveryAt",
9177
+ "valueType": "number"
9178
+ }, {
9179
+ "path": "lastError",
9180
+ "valueType": "string"
9181
+ }],
9182
+ "device-export": [
9183
+ {
9184
+ "path": "linkState",
9185
+ "valueType": "enum",
9186
+ "enumValues": [
9187
+ "unlinked",
9188
+ "linked",
9189
+ "error"
9190
+ ]
9191
+ },
9192
+ {
9193
+ "path": "exposedDeviceCount",
9194
+ "valueType": "number"
9195
+ },
9196
+ {
9197
+ "path": "error",
9198
+ "valueType": "string"
9199
+ },
9200
+ {
9201
+ "path": "setup.qr",
9202
+ "valueType": "string"
9203
+ },
9204
+ {
9205
+ "path": "setup.note",
9206
+ "valueType": "string"
9207
+ }
9208
+ ],
9209
+ "device-status": [{
9210
+ "path": "online",
9211
+ "valueType": "boolean"
9212
+ }],
9213
+ "dishwasher": [
9214
+ {
9215
+ "path": "availability",
9216
+ "valueType": "enum",
9217
+ "enumValues": [
9218
+ "available",
9219
+ "offline",
9220
+ "description-missing"
9221
+ ]
9222
+ },
9223
+ {
9224
+ "path": "state",
9225
+ "valueType": "enum",
9226
+ "enumValues": [
9227
+ "idle",
9228
+ "running",
9229
+ "paused",
9230
+ "finished",
9231
+ "error",
9232
+ "unavailable"
9233
+ ]
9234
+ },
9235
+ {
9236
+ "path": "operationState",
9237
+ "valueType": "enum",
9238
+ "enumValues": [
9239
+ "Inactive",
9240
+ "Ready",
9241
+ "DelayedStart",
9242
+ "Run",
9243
+ "Pause",
9244
+ "ActionRequired",
9245
+ "Finished",
9246
+ "Error",
9247
+ "Aborting"
9248
+ ]
9249
+ },
9250
+ {
9251
+ "path": "program",
9252
+ "valueType": "string"
9253
+ },
9254
+ {
9255
+ "path": "selectedProgram",
9256
+ "valueType": "string"
9257
+ },
9258
+ {
9259
+ "path": "remainingSeconds",
9260
+ "valueType": "number"
9261
+ },
9262
+ {
9263
+ "path": "delayedStartSeconds",
9264
+ "valueType": "number"
9265
+ },
9266
+ {
9267
+ "path": "progressPercent",
9268
+ "valueType": "number"
9269
+ },
9270
+ {
9271
+ "path": "doorOpen",
9272
+ "valueType": "boolean"
9273
+ },
9274
+ {
9275
+ "path": "doorLocked",
9276
+ "valueType": "boolean"
9277
+ },
9278
+ {
9279
+ "path": "remoteStartAllowed",
9280
+ "valueType": "boolean"
9281
+ },
9282
+ {
9283
+ "path": "remoteControlActive",
9284
+ "valueType": "boolean"
9285
+ },
9286
+ {
9287
+ "path": "localControlActive",
9288
+ "valueType": "boolean"
9289
+ },
9290
+ {
9291
+ "path": "powerOn",
9292
+ "valueType": "boolean"
9293
+ },
9294
+ {
9295
+ "path": "powerState",
9296
+ "valueType": "string"
9297
+ },
9298
+ {
9299
+ "path": "filterCleaningDue",
9300
+ "valueType": "boolean"
9301
+ },
9302
+ {
9303
+ "path": "machineCareDue",
9304
+ "valueType": "boolean"
9305
+ },
9306
+ {
9307
+ "path": "machineCareRemainingRuns",
9308
+ "valueType": "number"
9309
+ },
9310
+ {
9311
+ "path": "halfLoad",
9312
+ "valueType": "boolean"
9313
+ },
9314
+ {
9315
+ "path": "hygienePlus",
9316
+ "valueType": "boolean"
9317
+ },
9318
+ {
9319
+ "path": "extraDry",
9320
+ "valueType": "boolean"
9321
+ },
9322
+ {
9323
+ "path": "intensiveZone",
9324
+ "valueType": "boolean"
9325
+ },
9326
+ {
9327
+ "path": "varioSpeedPlus",
9328
+ "valueType": "boolean"
9329
+ },
9330
+ {
9331
+ "path": "childLock",
9332
+ "valueType": "boolean"
9333
+ },
9334
+ {
9335
+ "path": "errorCode",
9336
+ "valueType": "number"
9337
+ },
9338
+ {
9339
+ "path": "errorLabel",
9340
+ "valueType": "string"
9341
+ }
9342
+ ],
9343
+ "doorbell": [{
9344
+ "path": "lastPressedAt",
9345
+ "valueType": "number"
9346
+ }, {
9347
+ "path": "pressCountSinceStart",
9348
+ "valueType": "number"
9349
+ }],
9350
+ "enum-sensor": [{
9351
+ "path": "value",
9352
+ "valueType": "string"
9353
+ }, {
9354
+ "path": "format",
9355
+ "valueType": "enum",
9356
+ "enumValues": [
9357
+ "date",
9358
+ "time",
9359
+ "datetime"
9360
+ ]
9361
+ }],
9362
+ "event-emitter": [
9363
+ {
9364
+ "path": "lastEvent.deviceId",
9365
+ "valueType": "number"
9366
+ },
9367
+ {
9368
+ "path": "lastEvent.eventType",
9369
+ "valueType": "string"
9370
+ },
9371
+ {
9372
+ "path": "lastEvent.timestamp",
9373
+ "valueType": "number"
9374
+ },
9375
+ {
9376
+ "path": "lastEvent.seq",
9377
+ "valueType": "number"
9378
+ },
9379
+ {
9380
+ "path": "eventCountSinceStart",
9381
+ "valueType": "number"
9382
+ }
9383
+ ],
9384
+ "fan-control": [
9385
+ {
9386
+ "path": "percentage",
9387
+ "valueType": "number"
9388
+ },
9389
+ {
9390
+ "path": "percentageStep",
9391
+ "valueType": "number"
9392
+ },
9393
+ {
9394
+ "path": "preset",
9395
+ "valueType": "string"
9396
+ },
9397
+ {
9398
+ "path": "direction",
9399
+ "valueType": "enum",
9400
+ "enumValues": ["forward", "reverse"]
9401
+ },
9402
+ {
9403
+ "path": "oscillating",
9404
+ "valueType": "boolean"
9405
+ }
9406
+ ],
9407
+ "feature-probe": [
9408
+ {
9409
+ "path": "deviceType",
9410
+ "valueType": "string"
9411
+ },
9412
+ {
9413
+ "path": "model",
9414
+ "valueType": "string"
9415
+ },
9416
+ {
9417
+ "path": "channelCount",
9418
+ "valueType": "number"
9419
+ },
9420
+ {
9421
+ "path": "lastProbedAt",
9422
+ "valueType": "number"
9423
+ }
9424
+ ],
9425
+ "flood": [{
9426
+ "path": "flooded",
9427
+ "valueType": "boolean"
9428
+ }],
9429
+ "gas": [{
9430
+ "path": "detected",
9431
+ "valueType": "boolean"
9432
+ }],
9433
+ "heating-valve": [{
9434
+ "path": "position",
9435
+ "valueType": "number"
9436
+ }],
9437
+ "humidifier": [
9438
+ {
9439
+ "path": "on",
9440
+ "valueType": "boolean"
9441
+ },
9442
+ {
9443
+ "path": "currentHumidity",
9444
+ "valueType": "number"
9445
+ },
9446
+ {
9447
+ "path": "targetHumidity",
9448
+ "valueType": "number"
9449
+ },
9450
+ {
9451
+ "path": "mode",
9452
+ "valueType": "string"
9453
+ },
9454
+ {
9455
+ "path": "action",
9456
+ "valueType": "string"
9457
+ },
9458
+ {
9459
+ "path": "minHumidity",
9460
+ "valueType": "number"
9461
+ },
9462
+ {
9463
+ "path": "maxHumidity",
9464
+ "valueType": "number"
9465
+ }
9466
+ ],
9467
+ "humidity-sensor": [
9468
+ {
9469
+ "path": "percent",
9470
+ "valueType": "number"
9471
+ },
9472
+ {
9473
+ "path": "unit",
9474
+ "valueType": "string"
9475
+ },
9476
+ {
9477
+ "path": "precision",
9478
+ "valueType": "number"
9479
+ }
9480
+ ],
9481
+ "image": [{
9482
+ "path": "url",
9483
+ "valueType": "string"
9484
+ }, {
9485
+ "path": "lastUpdated",
9486
+ "valueType": "number"
9487
+ }],
9488
+ "image-settings": [
9489
+ {
9490
+ "path": "brightness",
9491
+ "valueType": "number"
9492
+ },
9493
+ {
9494
+ "path": "contrast",
9495
+ "valueType": "number"
9496
+ },
9497
+ {
9498
+ "path": "saturation",
9499
+ "valueType": "number"
9500
+ },
9501
+ {
9502
+ "path": "sharpness",
9503
+ "valueType": "number"
9504
+ },
9505
+ {
9506
+ "path": "mirror",
9507
+ "valueType": "boolean"
9508
+ },
9509
+ {
9510
+ "path": "flip",
9511
+ "valueType": "boolean"
9512
+ },
9513
+ {
9514
+ "path": "rotate",
9515
+ "valueType": "enum",
9516
+ "enumValues": [
9517
+ "0",
9518
+ "90",
9519
+ "180",
9520
+ "270"
9521
+ ]
9522
+ },
9523
+ {
9524
+ "path": "whiteBalance",
9525
+ "valueType": "enum",
9526
+ "enumValues": ["auto", "manual"]
9527
+ },
9528
+ {
9529
+ "path": "warmth",
9530
+ "valueType": "number"
9531
+ },
9532
+ {
9533
+ "path": "exposureMode",
9534
+ "valueType": "enum",
9535
+ "enumValues": ["auto", "manual"]
9536
+ },
9537
+ {
9538
+ "path": "backlightMode",
9539
+ "valueType": "enum",
9540
+ "enumValues": [
9541
+ "off",
9542
+ "blc",
9543
+ "wdr",
9544
+ "hlc"
9545
+ ]
9546
+ }
9547
+ ],
9548
+ "intercom": [
9549
+ {
9550
+ "path": "talking",
9551
+ "valueType": "boolean"
9552
+ },
9553
+ {
9554
+ "path": "lastSessionAt",
9555
+ "valueType": "number"
9556
+ },
9557
+ {
9558
+ "path": "ability.sampleRate",
9559
+ "valueType": "number"
9560
+ },
9561
+ {
9562
+ "path": "ability.duplex",
9563
+ "valueType": "enum",
9564
+ "enumValues": ["half", "full"]
9565
+ },
9566
+ {
9567
+ "path": "ability.maxBacklogMs",
9568
+ "valueType": "number"
9569
+ }
9570
+ ],
9571
+ "lawn-mower-control": [
9572
+ {
9573
+ "path": "activity",
9574
+ "valueType": "enum",
9575
+ "enumValues": [
9576
+ "idle",
9577
+ "mowing",
9578
+ "paused",
9579
+ "docked",
9580
+ "error"
9581
+ ]
9582
+ },
9583
+ {
9584
+ "path": "batteryLevel",
9585
+ "valueType": "number"
9586
+ },
9587
+ {
9588
+ "path": "progressPercent",
9589
+ "valueType": "number"
9590
+ },
9591
+ {
9592
+ "path": "currentCode",
9593
+ "valueType": "number"
9594
+ },
9595
+ {
9596
+ "path": "currentCodeLabel",
9597
+ "valueType": "string"
9598
+ },
9599
+ {
9600
+ "path": "severity",
9601
+ "valueType": "enum",
9602
+ "enumValues": [
9603
+ "info",
9604
+ "warning",
9605
+ "error"
9606
+ ]
9607
+ }
9608
+ ],
9609
+ "lock-control": [{
9610
+ "path": "state",
9611
+ "valueType": "enum",
9612
+ "enumValues": [
9613
+ "locked",
9614
+ "unlocked",
9615
+ "locking",
9616
+ "unlocking",
9617
+ "jammed"
9618
+ ]
9619
+ }],
9620
+ "media-player": [
9621
+ {
9622
+ "path": "state",
9623
+ "valueType": "enum",
9624
+ "enumValues": [
9625
+ "off",
9626
+ "on",
9627
+ "idle",
9628
+ "playing",
9629
+ "paused",
9630
+ "buffering",
9631
+ "standby"
9632
+ ]
9633
+ },
9634
+ {
9635
+ "path": "volumeLevel",
9636
+ "valueType": "number"
9637
+ },
9638
+ {
9639
+ "path": "isMuted",
9640
+ "valueType": "boolean"
9641
+ },
9642
+ {
9643
+ "path": "source",
9644
+ "valueType": "string"
9645
+ },
9646
+ {
9647
+ "path": "currentMedia.type",
9648
+ "valueType": "string"
9649
+ },
9650
+ {
9651
+ "path": "currentMedia.title",
9652
+ "valueType": "string"
9653
+ },
9654
+ {
9655
+ "path": "currentMedia.artist",
9656
+ "valueType": "string"
9657
+ },
9658
+ {
9659
+ "path": "currentMedia.album",
9660
+ "valueType": "string"
9661
+ },
9662
+ {
9663
+ "path": "currentMedia.imageUrl",
9664
+ "valueType": "string"
9665
+ },
9666
+ {
9667
+ "path": "positionMs",
9668
+ "valueType": "number"
9669
+ },
9670
+ {
9671
+ "path": "durationMs",
9672
+ "valueType": "number"
9673
+ },
9674
+ {
9675
+ "path": "shuffle",
9676
+ "valueType": "boolean"
9677
+ },
9678
+ {
9679
+ "path": "repeat",
9680
+ "valueType": "enum",
9681
+ "enumValues": [
9682
+ "off",
9683
+ "all",
9684
+ "one"
9685
+ ]
9686
+ }
9687
+ ],
9688
+ "motion": [
9689
+ {
9690
+ "path": "detected",
9691
+ "valueType": "boolean"
9692
+ },
9693
+ {
9694
+ "path": "lastDetectedAt",
9695
+ "valueType": "number"
9696
+ },
9697
+ {
9698
+ "path": "autoClearAfterMs",
9699
+ "valueType": "number"
9700
+ }
9701
+ ],
9702
+ "motion-trigger": [{
9703
+ "path": "enabled",
9704
+ "valueType": "boolean"
9705
+ }],
9706
+ "motion-zones": [{
9707
+ "path": "enabled",
9708
+ "valueType": "boolean"
9709
+ }, {
9710
+ "path": "sensitivity",
9711
+ "valueType": "number"
9712
+ }],
9713
+ "mqtt-broker": [{
9714
+ "path": "brokerCount",
9715
+ "valueType": "number"
9716
+ }, {
9717
+ "path": "embeddedRunning",
9718
+ "valueType": "boolean"
9719
+ }],
9720
+ "native-object-detection": [{
9721
+ "path": "enabled",
9722
+ "valueType": "boolean"
9723
+ }],
9724
+ "navigation": [
9725
+ {
9726
+ "path": "mode",
9727
+ "valueType": "enum",
9728
+ "enumValues": [
9729
+ "idle",
9730
+ "cleaning",
9731
+ "spot",
9732
+ "following",
9733
+ "goto",
9734
+ "returning",
9735
+ "paused",
9736
+ "unknown"
9737
+ ]
9738
+ },
9739
+ {
9740
+ "path": "following",
9741
+ "valueType": "boolean"
9742
+ },
9743
+ {
9744
+ "path": "flash",
9745
+ "valueType": "boolean"
9746
+ },
9747
+ {
9748
+ "path": "lightMode",
9749
+ "valueType": "enum",
9750
+ "enumValues": ["auto", "manual"]
9751
+ },
9752
+ {
9753
+ "path": "lightLevel",
9754
+ "valueType": "number"
9755
+ }
9756
+ ],
9757
+ "network-link": [
9758
+ {
9759
+ "path": "type",
9760
+ "valueType": "enum",
9761
+ "enumValues": [
9762
+ "wifi",
9763
+ "ethernet",
9764
+ "cellular",
9765
+ "unknown"
9766
+ ]
9767
+ },
9768
+ {
9769
+ "path": "signalPercent",
9770
+ "valueType": "number"
9771
+ },
9772
+ {
9773
+ "path": "rssiDbm",
9774
+ "valueType": "number"
9775
+ },
9776
+ {
9777
+ "path": "ssid",
9778
+ "valueType": "string"
9779
+ },
9780
+ {
9781
+ "path": "lastUpdated",
9782
+ "valueType": "number"
9783
+ }
9784
+ ],
9785
+ "notifier": [
9786
+ {
9787
+ "path": "lastSentAt",
9788
+ "valueType": "number"
9789
+ },
9790
+ {
9791
+ "path": "lastError",
9792
+ "valueType": "string"
9793
+ },
9794
+ {
9795
+ "path": "queueDepth",
9796
+ "valueType": "number"
9797
+ },
9798
+ {
9799
+ "path": "supports.image",
9800
+ "valueType": "boolean"
9801
+ },
9802
+ {
9803
+ "path": "supports.priority",
9804
+ "valueType": "boolean"
9805
+ },
9806
+ {
9807
+ "path": "supports.data",
9808
+ "valueType": "boolean"
9809
+ },
9810
+ {
9811
+ "path": "supports.actions",
9812
+ "valueType": "boolean"
9813
+ },
9814
+ {
9815
+ "path": "supports.recipients",
9816
+ "valueType": "boolean"
9817
+ }
9818
+ ],
9819
+ "numeric-sensor": [
9820
+ {
9821
+ "path": "value",
9822
+ "valueType": "number"
9823
+ },
9824
+ {
9825
+ "path": "unit",
9826
+ "valueType": "string"
9827
+ },
9828
+ {
9829
+ "path": "precision",
9830
+ "valueType": "number"
9831
+ }
9832
+ ],
9833
+ "pet-feeder": [
9834
+ {
9835
+ "path": "foodLevel",
9836
+ "valueType": "number"
9837
+ },
9838
+ {
9839
+ "path": "food1",
9840
+ "valueType": "number"
9841
+ },
9842
+ {
9843
+ "path": "food2",
9844
+ "valueType": "number"
9845
+ },
9846
+ {
9847
+ "path": "lowFood",
9848
+ "valueType": "boolean"
9849
+ },
9850
+ {
9851
+ "path": "batteryPower",
9852
+ "valueType": "number"
9853
+ },
9854
+ {
9855
+ "path": "desiccantLeftDays",
9856
+ "valueType": "number"
9857
+ },
9858
+ {
9859
+ "path": "feeding",
9860
+ "valueType": "boolean"
9861
+ },
9862
+ {
9863
+ "path": "status",
9864
+ "valueType": "enum",
9865
+ "enumValues": [
9866
+ "normal",
9867
+ "offline",
9868
+ "on_batteries"
9869
+ ]
9870
+ },
9871
+ {
9872
+ "path": "error",
9873
+ "valueType": "string"
9874
+ },
9875
+ {
9876
+ "path": "errorCode",
9877
+ "valueType": "number"
9878
+ },
9879
+ {
9880
+ "path": "isDualHopper",
9881
+ "valueType": "boolean"
9882
+ },
9883
+ {
9884
+ "path": "childLock",
9885
+ "valueType": "boolean"
9886
+ },
9887
+ {
9888
+ "path": "indicatorLight",
9889
+ "valueType": "boolean"
9890
+ },
9891
+ {
9892
+ "path": "feedSound",
9893
+ "valueType": "boolean"
9894
+ },
9895
+ {
9896
+ "path": "volume",
9897
+ "valueType": "number"
9898
+ }
9899
+ ],
9900
+ "power-meter": [
9901
+ {
9902
+ "path": "watts",
9903
+ "valueType": "number"
9904
+ },
9905
+ {
9906
+ "path": "kwhTotal",
9907
+ "valueType": "number"
9908
+ },
9909
+ {
9910
+ "path": "volts",
9911
+ "valueType": "number"
9912
+ },
9913
+ {
9914
+ "path": "amps",
9915
+ "valueType": "number"
9916
+ },
9917
+ {
9918
+ "path": "va",
9919
+ "valueType": "number"
9920
+ },
9921
+ {
9922
+ "path": "powerFactor",
9923
+ "valueType": "number"
9924
+ },
9925
+ {
9926
+ "path": "unit",
9927
+ "valueType": "string"
9928
+ },
9929
+ {
9930
+ "path": "precision",
9931
+ "valueType": "number"
9932
+ }
9933
+ ],
9934
+ "presence": [
9935
+ {
9936
+ "path": "state",
9937
+ "valueType": "string"
9938
+ },
9939
+ {
9940
+ "path": "location",
9941
+ "valueType": "string"
9942
+ },
9943
+ {
9944
+ "path": "gps.latitude",
9945
+ "valueType": "number"
9946
+ },
9947
+ {
9948
+ "path": "gps.longitude",
9949
+ "valueType": "number"
9950
+ },
9951
+ {
9952
+ "path": "gps.accuracyMeters",
9953
+ "valueType": "number"
9954
+ },
9955
+ {
9956
+ "path": "batteryPercent",
9957
+ "valueType": "number"
9958
+ }
9959
+ ],
9960
+ "pressure-sensor": [
9961
+ {
9962
+ "path": "hpa",
9963
+ "valueType": "number"
9964
+ },
9965
+ {
9966
+ "path": "unit",
9967
+ "valueType": "string"
9968
+ },
9969
+ {
9970
+ "path": "precision",
9971
+ "valueType": "number"
9972
+ }
9973
+ ],
9974
+ "privacy-mask": [{
9975
+ "path": "enabled",
9976
+ "valueType": "boolean"
9977
+ }, {
9978
+ "path": "audioEnabled",
9979
+ "valueType": "boolean"
9980
+ }],
9981
+ "ptz": [
9982
+ {
9983
+ "path": "pan",
9984
+ "valueType": "number"
9985
+ },
9986
+ {
9987
+ "path": "tilt",
9988
+ "valueType": "number"
9989
+ },
9990
+ {
9991
+ "path": "zoom",
9992
+ "valueType": "number"
9993
+ },
9994
+ {
9995
+ "path": "autofocus",
9996
+ "valueType": "boolean"
9997
+ }
9998
+ ],
9999
+ "ptz-autotrack": [
10000
+ {
10001
+ "path": "enabled",
10002
+ "valueType": "boolean"
10003
+ },
10004
+ {
10005
+ "path": "currentSettings.targetType",
10006
+ "valueType": "string"
10007
+ },
10008
+ {
10009
+ "path": "currentSettings.stopDelaySeconds",
10010
+ "valueType": "number"
10011
+ },
10012
+ {
10013
+ "path": "currentSettings.disappearDelaySeconds",
10014
+ "valueType": "number"
10015
+ }
10016
+ ],
10017
+ "recording-archive": [
10018
+ {
10019
+ "path": "deviceId",
10020
+ "valueType": "number"
10021
+ },
10022
+ {
10023
+ "path": "enabled",
10024
+ "valueType": "boolean"
10025
+ },
10026
+ {
10027
+ "path": "activeMode",
10028
+ "valueType": "enum",
10029
+ "enumValues": [
10030
+ "off",
10031
+ "events",
10032
+ "continuous",
10033
+ "on-device-decision"
10034
+ ]
10035
+ },
10036
+ {
10037
+ "path": "nodeId",
10038
+ "valueType": "string"
10039
+ },
10040
+ {
10041
+ "path": "storageBytes",
10042
+ "valueType": "number"
10043
+ }
10044
+ ],
10045
+ "recording-onboard": [
10046
+ {
10047
+ "path": "primaryTrackId",
10048
+ "valueType": "string"
10049
+ },
10050
+ {
10051
+ "path": "enabled",
10052
+ "valueType": "boolean"
10053
+ },
10054
+ {
10055
+ "path": "overwriteWhenFull",
10056
+ "valueType": "boolean"
10057
+ },
10058
+ {
10059
+ "path": "preRecordSec",
10060
+ "valueType": "number"
10061
+ },
10062
+ {
10063
+ "path": "postRecordSec",
10064
+ "valueType": "number"
10065
+ },
10066
+ {
10067
+ "path": "segmentMinutes",
10068
+ "valueType": "number"
10069
+ },
10070
+ {
10071
+ "path": "unreadableWindows",
10072
+ "valueType": "number"
10073
+ },
10074
+ {
10075
+ "path": "recordingToNowhere",
10076
+ "valueType": "boolean"
10077
+ }
10078
+ ],
10079
+ "recording-signal": [{
10080
+ "path": "active",
10081
+ "valueType": "boolean"
10082
+ }, {
10083
+ "path": "reason",
10084
+ "valueType": "string"
10085
+ }],
10086
+ "running-state": [
10087
+ {
10088
+ "path": "running",
10089
+ "valueType": "boolean"
10090
+ },
10091
+ {
10092
+ "path": "since",
10093
+ "valueType": "number"
10094
+ },
10095
+ {
10096
+ "path": "source",
10097
+ "valueType": "enum",
10098
+ "enumValues": ["native", "assigned"]
10099
+ },
10100
+ {
10101
+ "path": "phase",
10102
+ "valueType": "string"
10103
+ }
10104
+ ],
10105
+ "script-runner": [
10106
+ {
10107
+ "path": "isRunning",
10108
+ "valueType": "boolean"
10109
+ },
10110
+ {
10111
+ "path": "lastRunAt",
10112
+ "valueType": "number"
10113
+ },
10114
+ {
10115
+ "path": "lastRunSuccess",
10116
+ "valueType": "boolean"
10117
+ },
10118
+ {
10119
+ "path": "lastError",
10120
+ "valueType": "string"
10121
+ }
10122
+ ],
10123
+ "smoke": [{
10124
+ "path": "detected",
10125
+ "valueType": "boolean"
10126
+ }],
10127
+ "snapshot": [
10128
+ {
10129
+ "path": "lastCapturedAt",
10130
+ "valueType": "number"
10131
+ },
10132
+ {
10133
+ "path": "cacheAgeMs",
10134
+ "valueType": "number"
10135
+ },
10136
+ {
10137
+ "path": "lastBytes",
10138
+ "valueType": "number"
10139
+ },
10140
+ {
10141
+ "path": "lastStreamId",
10142
+ "valueType": "string"
10143
+ }
10144
+ ],
10145
+ "stream-params": [
10146
+ {
10147
+ "path": "main.width",
10148
+ "valueType": "number"
10149
+ },
10150
+ {
10151
+ "path": "main.height",
10152
+ "valueType": "number"
10153
+ },
10154
+ {
10155
+ "path": "main.codec",
10156
+ "valueType": "enum",
10157
+ "enumValues": ["h264", "h265"]
10158
+ },
10159
+ {
10160
+ "path": "main.framerate",
10161
+ "valueType": "number"
10162
+ },
10163
+ {
10164
+ "path": "main.bitrate",
10165
+ "valueType": "number"
10166
+ },
10167
+ {
10168
+ "path": "main.bitrateMode",
10169
+ "valueType": "enum",
10170
+ "enumValues": ["vbr", "cbr"]
10171
+ },
10172
+ {
10173
+ "path": "main.encoderProfile",
10174
+ "valueType": "enum",
10175
+ "enumValues": [
10176
+ "high",
10177
+ "main",
10178
+ "baseline"
10179
+ ]
10180
+ },
10181
+ {
10182
+ "path": "main.gop",
10183
+ "valueType": "number"
10184
+ },
10185
+ {
10186
+ "path": "main.audio",
10187
+ "valueType": "boolean"
10188
+ },
10189
+ {
10190
+ "path": "sub.width",
10191
+ "valueType": "number"
10192
+ },
10193
+ {
10194
+ "path": "sub.height",
10195
+ "valueType": "number"
10196
+ },
10197
+ {
10198
+ "path": "sub.codec",
10199
+ "valueType": "enum",
10200
+ "enumValues": ["h264", "h265"]
10201
+ },
10202
+ {
10203
+ "path": "sub.framerate",
10204
+ "valueType": "number"
10205
+ },
10206
+ {
10207
+ "path": "sub.bitrate",
10208
+ "valueType": "number"
10209
+ },
10210
+ {
10211
+ "path": "sub.bitrateMode",
10212
+ "valueType": "enum",
10213
+ "enumValues": ["vbr", "cbr"]
10214
+ },
10215
+ {
10216
+ "path": "sub.encoderProfile",
10217
+ "valueType": "enum",
10218
+ "enumValues": [
10219
+ "high",
10220
+ "main",
10221
+ "baseline"
10222
+ ]
10223
+ },
10224
+ {
10225
+ "path": "sub.gop",
10226
+ "valueType": "number"
10227
+ },
10228
+ {
10229
+ "path": "sub.audio",
10230
+ "valueType": "boolean"
10231
+ },
10232
+ {
10233
+ "path": "ext.width",
10234
+ "valueType": "number"
10235
+ },
10236
+ {
10237
+ "path": "ext.height",
10238
+ "valueType": "number"
10239
+ },
10240
+ {
10241
+ "path": "ext.codec",
10242
+ "valueType": "enum",
10243
+ "enumValues": ["h264", "h265"]
10244
+ },
10245
+ {
10246
+ "path": "ext.framerate",
10247
+ "valueType": "number"
10248
+ },
10249
+ {
10250
+ "path": "ext.bitrate",
10251
+ "valueType": "number"
10252
+ },
10253
+ {
10254
+ "path": "ext.bitrateMode",
10255
+ "valueType": "enum",
10256
+ "enumValues": ["vbr", "cbr"]
10257
+ },
10258
+ {
10259
+ "path": "ext.encoderProfile",
10260
+ "valueType": "enum",
10261
+ "enumValues": [
10262
+ "high",
10263
+ "main",
10264
+ "baseline"
10265
+ ]
10266
+ },
10267
+ {
10268
+ "path": "ext.gop",
10269
+ "valueType": "number"
10270
+ },
10271
+ {
10272
+ "path": "ext.audio",
10273
+ "valueType": "boolean"
10274
+ }
10275
+ ],
10276
+ "switch": [{
10277
+ "path": "on",
10278
+ "valueType": "boolean"
10279
+ }],
10280
+ "tamper": [{
10281
+ "path": "tampered",
10282
+ "valueType": "boolean"
10283
+ }],
10284
+ "temperature-sensor": [
10285
+ {
10286
+ "path": "celsius",
10287
+ "valueType": "number"
10288
+ },
10289
+ {
10290
+ "path": "unit",
10291
+ "valueType": "string"
10292
+ },
10293
+ {
10294
+ "path": "precision",
10295
+ "valueType": "number"
10296
+ }
10297
+ ],
10298
+ "update": [
10299
+ {
10300
+ "path": "currentVersion",
10301
+ "valueType": "string"
10302
+ },
10303
+ {
10304
+ "path": "availableVersion",
10305
+ "valueType": "string"
10306
+ },
10307
+ {
10308
+ "path": "updatable",
10309
+ "valueType": "boolean"
10310
+ },
10311
+ {
10312
+ "path": "state",
10313
+ "valueType": "string"
10314
+ },
10315
+ {
10316
+ "path": "inProgress",
10317
+ "valueType": "boolean"
10318
+ }
10319
+ ],
10320
+ "vacuum-control": [
10321
+ {
10322
+ "path": "state",
10323
+ "valueType": "enum",
10324
+ "enumValues": [
10325
+ "idle",
10326
+ "cleaning",
10327
+ "paused",
10328
+ "returning",
10329
+ "docked",
10330
+ "drying",
10331
+ "error"
10332
+ ]
10333
+ },
10334
+ {
10335
+ "path": "batteryLevel",
10336
+ "valueType": "number"
10337
+ },
10338
+ {
10339
+ "path": "fanSpeed",
10340
+ "valueType": "string"
10341
+ },
10342
+ {
10343
+ "path": "progressPercent",
10344
+ "valueType": "number"
10345
+ },
10346
+ {
10347
+ "path": "errorCode",
10348
+ "valueType": "number"
10349
+ },
10350
+ {
10351
+ "path": "errorLabel",
10352
+ "valueType": "string"
10353
+ }
10354
+ ],
10355
+ "valve": [{
10356
+ "path": "state",
10357
+ "valueType": "enum",
10358
+ "enumValues": [
10359
+ "open",
10360
+ "opening",
10361
+ "closing",
10362
+ "closed",
10363
+ "stopped"
10364
+ ]
10365
+ }, {
10366
+ "path": "position",
10367
+ "valueType": "number"
10368
+ }],
10369
+ "vibration": [{
10370
+ "path": "detected",
10371
+ "valueType": "boolean"
10372
+ }],
10373
+ "water-heater": [
10374
+ {
10375
+ "path": "currentTemp",
10376
+ "valueType": "number"
10377
+ },
10378
+ {
10379
+ "path": "targetTemp",
10380
+ "valueType": "number"
10381
+ },
10382
+ {
10383
+ "path": "operationMode",
10384
+ "valueType": "string"
10385
+ },
10386
+ {
10387
+ "path": "away",
10388
+ "valueType": "boolean"
10389
+ },
10390
+ {
10391
+ "path": "minTemp",
10392
+ "valueType": "number"
10393
+ },
10394
+ {
10395
+ "path": "maxTemp",
10396
+ "valueType": "number"
10397
+ }
10398
+ ],
10399
+ "weather": [
10400
+ {
10401
+ "path": "condition",
10402
+ "valueType": "string"
10403
+ },
10404
+ {
10405
+ "path": "temperature",
10406
+ "valueType": "number"
10407
+ },
10408
+ {
10409
+ "path": "temperatureUnit",
10410
+ "valueType": "string"
10411
+ },
10412
+ {
10413
+ "path": "humidity",
10414
+ "valueType": "number"
10415
+ },
10416
+ {
10417
+ "path": "pressure",
10418
+ "valueType": "number"
10419
+ },
10420
+ {
10421
+ "path": "pressureUnit",
10422
+ "valueType": "string"
10423
+ },
10424
+ {
10425
+ "path": "windSpeed",
10426
+ "valueType": "number"
10427
+ },
10428
+ {
10429
+ "path": "windSpeedUnit",
10430
+ "valueType": "string"
10431
+ },
10432
+ {
10433
+ "path": "windBearing",
10434
+ "valueType": "number"
10435
+ }
10436
+ ],
10437
+ "zone-analytics": [
10438
+ {
10439
+ "path": "ts",
10440
+ "valueType": "number"
10441
+ },
10442
+ {
10443
+ "path": "frameWidth",
10444
+ "valueType": "number"
10445
+ },
10446
+ {
10447
+ "path": "frameHeight",
10448
+ "valueType": "number"
10449
+ },
10450
+ {
10451
+ "path": "frame.totalObjects",
10452
+ "valueType": "number"
10453
+ },
10454
+ {
10455
+ "path": "frame.standingObjects",
10456
+ "valueType": "number"
10457
+ },
10458
+ {
10459
+ "path": "frame.transientObjects",
10460
+ "valueType": "number"
10461
+ },
10462
+ {
10463
+ "path": "unzoned.totalObjects",
10464
+ "valueType": "number"
10465
+ },
10466
+ {
10467
+ "path": "unzoned.standingObjects",
10468
+ "valueType": "number"
10469
+ },
10470
+ {
10471
+ "path": "unzoned.transientObjects",
10472
+ "valueType": "number"
10473
+ }
10474
+ ]
10475
+ });
8502
10476
  object({
8503
10477
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8504
10478
  params: record(string(), union([string(), number()])).optional()
@@ -8871,7 +10845,7 @@ function errMsg(err) {
8871
10845
  return String(err);
8872
10846
  }
8873
10847
  //#endregion
8874
- //#region ../types/dist/composition-BJ8iAZb3.mjs
10848
+ //#region ../types/dist/composition-kEl9mevu.mjs
8875
10849
  /**
8876
10850
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8877
10851
  *
@@ -12086,7 +14060,7 @@ var LogChannelDescriptorSchema = object({
12086
14060
  * `true` is a PROMISE with two halves, and both must hold: the gate is
12087
14061
  * consulted with the numeric device id, AND every line the channel admits
12088
14062
  * carries `tags: { deviceId }` with that same numeric id. The second half is
12089
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
14063
+ * what makes `| json | deviceId="102"` work in Loki — `loki-payload.ts`
12090
14064
  * keeps `deviceId` out of the stream labels for cardinality, so the tag in
12091
14065
  * the body is the only way to filter.
12092
14066
  *
@@ -12274,7 +14248,7 @@ var ModelVariantGroupSchema = object({
12274
14248
  precision: _enum(["fp32", "int8"]).optional(),
12275
14249
  /**
12276
14250
  * Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
12277
- * an alternate training of the same family (Scrypted `relu_test`); chip
14251
+ * an alternate training of the same family (plugin catalog `relu_test`); chip
12278
14252
  * label is "Test".
12279
14253
  */
12280
14254
  optimization: _enum(["standard", "test"]).optional(),
@@ -12526,8 +14500,8 @@ var ModelCatalogEntrySchema = object({
12526
14500
  provider: ModelProviderIdSchema.optional(),
12527
14501
  /**
12528
14502
  * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
12529
- * applies (Frigate / COCO public catalog). Set on a custom model whose raw
12530
- * labels already ARE the CamStack macros (Scrypted identity map).
14503
+ * applies (plus catalog / COCO public catalog). Set on a custom model whose raw
14504
+ * labels already ARE the CamStack macros (plugin catalog identity map).
12531
14505
  */
12532
14506
  classMap: DetectionCatalogClassMapSchema.optional(),
12533
14507
  /**
@@ -15496,7 +17470,7 @@ method(object({
15496
17470
  * `1` is real time and is the ONLY value that allows the copy branch —
15497
17471
  * anything else forces `libx264` over the window. That was priced
15498
17472
  * before it was chosen: a per-event burst measured at 0.23 s and 254 KB
15499
- * on a real 615 720p cut, against 922 KB for the copy it replaces. A
17473
+ * on a real 101 720p cut, against 922 KB for the copy it replaces. A
15500
17474
  * re-encode is capped at 720p (`EVENT_CLIP_ENCODE_MAX_WIDTH`), because
15501
17475
  * once the decode is forced the width stops being free.
15502
17476
  */
@@ -16022,6 +17996,7 @@ var CompositionRunStatusSchema = _enum([
16022
17996
  "starting",
16023
17997
  "running",
16024
17998
  "degraded",
17999
+ "incomplete",
16025
18000
  "failed"
16026
18001
  ]);
16027
18002
  var CompositionFieldStateKindSchema = _enum([
@@ -16071,6 +18046,13 @@ var ComposerUnreadableBlockSchema = object({
16071
18046
  /** The parse error, in the operator's words. */
16072
18047
  error: string()
16073
18048
  });
18049
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
18050
+ var UnreleasedClaimSchema = object({
18051
+ deviceId: number().int(),
18052
+ capName: string(),
18053
+ owner: string(),
18054
+ error: string()
18055
+ });
16074
18056
  method(object({
16075
18057
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16076
18058
  integrationId: string().nullable(),
@@ -16080,7 +18062,13 @@ method(object({
16080
18062
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16081
18063
  restartBlockIds: array(string()),
16082
18064
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16083
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
18065
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
18066
+ /**
18067
+ * Operator-confirmed deletions. Their claims are released on this apply,
18068
+ * before any replacement block claims. A block that merely vanished from the
18069
+ * snapshot is not listed here and still waits for two applies (D49).
18070
+ */
18071
+ retiredBlockIds: array(string()).optional()
16084
18072
  }), object({
16085
18073
  blocks: array(object({
16086
18074
  blockId: string(),
@@ -16092,7 +18080,13 @@ method(object({
16092
18080
  * integration unknown, its own rows unread or read empty once). An empty
16093
18081
  * apply the caller owes is paid off only by one the composer acted on (D49).
16094
18082
  */
16095
- acted: boolean()
18083
+ acted: boolean(),
18084
+ /**
18085
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
18086
+ * every one landed (or there was nothing to hand back). Absent on a result
18087
+ * that never got that far.
18088
+ */
18089
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16096
18090
  }), {
16097
18091
  kind: "mutation",
16098
18092
  auth: "admin"
@@ -16216,6 +18210,7 @@ var CoreBlockStatusSchema = _enum([
16216
18210
  "starting",
16217
18211
  "running",
16218
18212
  "degraded",
18213
+ "incomplete",
16219
18214
  "failed"
16220
18215
  ]);
16221
18216
  /** path → TypeScript source for a multi-file block. */
@@ -38267,7 +40262,7 @@ var PRIMARY_CATEGORIES = new Set(ENTRIES.map((e) => e.primaryCategory));
38267
40262
  * `locationKey` is ALWAYS {@link locationIconKey} of the label — never the
38268
40263
  * operator's casing. The registry matches labels trimmed + case-insensitively
38269
40264
  * everywhere (`addLocation`, `removeLocation`, `renameLocation`), and a
38270
- * case-only rename (`cucina` → `Cucina`) is a real edit this repo supports; a
40265
+ * case-only rename (`kitchen` → `Kitchen`) is a real edit this repo supports; a
38271
40266
  * map keyed on the displayed casing would orphan its entry on exactly that
38272
40267
  * edit. Consumers join by keying their own label through `locationIconKey`.
38273
40268
  */
@@ -38292,7 +40287,7 @@ var LocationDescriptionAssignmentSchema = object({
38292
40287
  /**
38293
40288
  * A SITE ZONE — a named part of the property that several locations belong to.
38294
40289
  *
38295
- * "Zona notte" holds every bedroom; "Zona giorno" the living room and the
40290
+ * "Night zone" holds every bedroom; "Zona giorno" the living room and the
38296
40291
  * kitchen. A camera belongs to exactly one location, and a location to at most
38297
40292
  * one zone, so a camera's zone is derived and never stored on the device: the
38298
40293
  * whole point of this entity is that grouping rooms touches no device row.
@@ -38321,7 +40316,7 @@ var LocationDescriptionAssignmentSchema = object({
38321
40316
  * the locations inside it.
38322
40317
  *
38323
40318
  * The LABEL is carried alongside the key because the key is lossy on purpose —
38324
- * a surface must show "Zona notte", not "zona notte". Locations are carried
40319
+ * a surface must show "Night zone", not "night zone". Locations are carried
38325
40320
  * here, rather than left to a second call, because every consumer wants both
38326
40321
  * at once and a viewer that asked twice could render a zone whose membership
38327
40322
  * it has not fetched yet.
@@ -40527,8 +42522,8 @@ var LoadContributionSchema = object({
40527
42522
  "unattributable"
40528
42523
  ]),
40529
42524
  /**
40530
- * What ONE entry is, in the contributor's own words — `615/high`,
40531
- * `617/native`, `cuda:0 shared pool`. Free text because the unit differs per
42525
+ * What ONE entry is, in the contributor's own words — `101/high`,
42526
+ * `102/native`, `cuda:0 shared pool`. Free text because the unit differs per
40532
42527
  * family and inventing a common one would lose the only information that
40533
42528
  * makes two entries for the same camera distinguishable.
40534
42529
  */
@@ -42176,6 +44171,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42176
44171
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42177
44172
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42178
44173
  /**
44174
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
44175
+ * not entries. `heatmapScrub` is a mark, not an event kind.
44176
+ */
44177
+ var PALETTE_ENTRY_IDS = [
44178
+ "motion",
44179
+ "audio",
44180
+ "recording",
44181
+ "live",
44182
+ "heatmapScrub",
44183
+ "person",
44184
+ "vehicle",
44185
+ "animal",
44186
+ "package",
44187
+ "sensor",
44188
+ "control",
44189
+ "face",
44190
+ "plate",
44191
+ "car",
44192
+ "truck",
44193
+ "bus",
44194
+ "motorcycle",
44195
+ "bicycle",
44196
+ "airplane",
44197
+ "boat",
44198
+ "train",
44199
+ "bird",
44200
+ "dog",
44201
+ "cat",
44202
+ "horse",
44203
+ "sheep",
44204
+ "cow",
44205
+ "elephant",
44206
+ "bear",
44207
+ "zebra",
44208
+ "giraffe",
44209
+ "package-delivered",
44210
+ "package-picked-up",
44211
+ "suitcase",
44212
+ "backpack",
44213
+ "handbag",
44214
+ "contact",
44215
+ "motion-sensor",
44216
+ "smoke",
44217
+ "flood",
44218
+ "gas",
44219
+ "carbon-monoxide",
44220
+ "vibration",
44221
+ "tamper",
44222
+ "presence",
44223
+ "enum-sensor",
44224
+ "device-event",
44225
+ "lock",
44226
+ "cover",
44227
+ "switch",
44228
+ "siren",
44229
+ "button",
44230
+ "doorbell"
44231
+ ];
44232
+ var AUDIO_ENTRY_ID = "audio";
44233
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
44234
+ var AUDIO_GRADIENT_ALPHAS = [
44235
+ .3,
44236
+ .42,
44237
+ .55,
44238
+ .7,
44239
+ .85,
44240
+ 1
44241
+ ];
44242
+ var PALETTE_PRESET_IDS = [
44243
+ "camstack",
44244
+ "high-contrast",
44245
+ "okabe-ito"
44246
+ ];
44247
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
44248
+ var CAMSTACK_HEX = {
44249
+ motion: "#d946ef",
44250
+ audio: "#059eb8",
44251
+ recording: "#ef4444",
44252
+ live: "#8d7a00",
44253
+ heatmapScrub: "#4b32ff",
44254
+ person: "#11a64c",
44255
+ vehicle: "#3b82f6",
44256
+ animal: "#ea6a09",
44257
+ package: "#924667",
44258
+ sensor: "#624bbc",
44259
+ control: "#944d24",
44260
+ face: "#ed4f8d",
44261
+ plate: "#4b7027",
44262
+ car: "#9684cf",
44263
+ truck: "#0f9b89",
44264
+ bus: "#a734a9",
44265
+ motorcycle: "#c1133a",
44266
+ bicycle: "#0e6a9b",
44267
+ airplane: "#7c9928",
44268
+ boat: "#b17933",
44269
+ train: "#ad6ca3",
44270
+ bird: "#0f7c55",
44271
+ dog: "#c82700",
44272
+ cat: "#7268f2",
44273
+ horse: "#cb795e",
44274
+ sheep: "#b8636b",
44275
+ cow: "#cb2969",
44276
+ elephant: "#1158d2",
44277
+ bear: "#8d5e00",
44278
+ zebra: "#0097d6",
44279
+ giraffe: "#8f61bb",
44280
+ "package-delivered": "#cd3f9b",
44281
+ "package-picked-up": "#388a08",
44282
+ suitcase: "#666800",
44283
+ backpack: "#ec5022",
44284
+ handbag: "#a76ef8",
44285
+ contact: "#ab5a49",
44286
+ "motion-sensor": "#b95d1a",
44287
+ smoke: "#dd3858",
44288
+ flood: "#b31e7d",
44289
+ gas: "#5b70b5",
44290
+ "carbon-monoxide": "#7b4e8e",
44291
+ vibration: "#e65bba",
44292
+ tamper: "#98464b",
44293
+ presence: "#3a9468",
44294
+ "enum-sensor": "#7885f8",
44295
+ "device-event": "#8c43c8",
44296
+ lock: "#649653",
44297
+ cover: "#c67597",
44298
+ switch: "#7a812a",
44299
+ siren: "#ac5d7f",
44300
+ button: "#b276cd",
44301
+ doorbell: "#0087ab"
44302
+ };
44303
+ var CAMSTACK_FALLBACK = [
44304
+ "#b34dc7",
44305
+ "#1d7d34",
44306
+ "#db6b6c",
44307
+ "#a43d29",
44308
+ "#0e6ee6",
44309
+ "#29a10b",
44310
+ "#a98731",
44311
+ "#0181c6"
44312
+ ];
44313
+ var HIGH_CONTRAST_HEX = {
44314
+ motion: "#964360",
44315
+ audio: "#23a132",
44316
+ recording: "#2494ca",
44317
+ live: "#bd7e2b",
44318
+ heatmapScrub: "#ad6eea",
44319
+ person: "#62611e",
44320
+ vehicle: "#f4534c",
44321
+ animal: "#1556cd",
44322
+ package: "#9c4415",
44323
+ sensor: "#066c48",
44324
+ control: "#f2479f",
44325
+ face: "#139d8a",
44326
+ plate: "#909024",
44327
+ car: "#8e35ab",
44328
+ truck: "#bd0b2b",
44329
+ bus: "#7a88ca",
44330
+ motorcycle: "#e26725",
44331
+ bicycle: "#a6679b",
44332
+ airplane: "#7c5720",
44333
+ boat: "#467a1b",
44334
+ train: "#6f65a4",
44335
+ bird: "#cb717f",
44336
+ dog: "#c62490",
44337
+ cat: "#b36850",
44338
+ horse: "#1872ac",
44339
+ sheep: "#927939",
44340
+ cow: "#428a5c",
44341
+ elephant: "#d41160",
44342
+ bear: "#799453",
44343
+ zebra: "#a85455",
44344
+ giraffe: "#746be8",
44345
+ "package-delivered": "#824a80",
44346
+ "package-picked-up": "#614ac1",
44347
+ suitcase: "#2f77f3",
44348
+ backpack: "#fa476d",
44349
+ handbag: "#c14cbe",
44350
+ contact: "#c83921",
44351
+ "motion-sensor": "#a07ebd",
44352
+ smoke: "#a25b13",
44353
+ flood: "#526bab",
44354
+ gas: "#924938",
44355
+ "carbon-monoxide": "#bb7e53",
44356
+ vibration: "#b66182",
44357
+ tamper: "#3c6931",
44358
+ presence: "#6c851d",
44359
+ "enum-sensor": "#ad2d48",
44360
+ "device-event": "#5e9b04",
44361
+ lock: "#00a062",
44362
+ cover: "#ad8624",
44363
+ switch: "#d05259",
44364
+ siren: "#cd67b3",
44365
+ button: "#c9746a",
44366
+ doorbell: "#338eeb"
44367
+ };
44368
+ var HIGH_CONTRAST_FALLBACK = [
44369
+ "#817f3b",
44370
+ "#a0733e",
44371
+ "#8658b2",
44372
+ "#956301",
44373
+ "#bc652d",
44374
+ "#647331",
44375
+ "#a14c9e",
44376
+ "#d14e71"
44377
+ ];
44378
+ var OKABE_ITO_HEX = {
44379
+ motion: "#b88128",
44380
+ audio: "#1096c8",
44381
+ recording: "#009e73",
44382
+ live: "#9c8c22",
44383
+ heatmapScrub: "#0072b2",
44384
+ person: "#d55e00",
44385
+ vehicle: "#c0739f",
44386
+ animal: "#226d18",
44387
+ package: "#91446c",
44388
+ sensor: "#217b56",
44389
+ control: "#648647",
44390
+ face: "#c22998",
44391
+ plate: "#fa4575",
44392
+ car: "#956301",
44393
+ truck: "#2f77f3",
44394
+ bus: "#7a4e86",
44395
+ motorcycle: "#f54597",
44396
+ bicycle: "#bb3e75",
44397
+ airplane: "#e054c0",
44398
+ boat: "#457942",
44399
+ train: "#867afa",
44400
+ bird: "#88914c",
44401
+ dog: "#1556cd",
44402
+ cat: "#71702c",
44403
+ horse: "#9b4fa4",
44404
+ sheep: "#c0559d",
44405
+ cow: "#d14f65",
44406
+ elephant: "#98470f",
44407
+ bear: "#595896",
44408
+ zebra: "#96790e",
44409
+ giraffe: "#cb717b",
44410
+ "package-delivered": "#139d8a",
44411
+ "package-picked-up": "#906ead",
44412
+ suitcase: "#d02939",
44413
+ backpack: "#d41160",
44414
+ handbag: "#f64f54",
44415
+ contact: "#7258d2",
44416
+ "motion-sensor": "#b66182",
44417
+ smoke: "#627abb",
44418
+ flood: "#b86ae4",
44419
+ gas: "#a95261",
44420
+ "carbon-monoxide": "#c65d3c",
44421
+ vibration: "#7a40b7",
44422
+ tamper: "#914b34",
44423
+ presence: "#9481c3",
44424
+ "enum-sensor": "#ac6d47",
44425
+ "device-event": "#7b6fce",
44426
+ lock: "#c67662",
44427
+ cover: "#a6564d",
44428
+ switch: "#ad2c4e",
44429
+ siren: "#348e08",
44430
+ button: "#d27303",
44431
+ doorbell: "#55770f"
44432
+ };
44433
+ var OKABE_ITO_FALLBACK = [
44434
+ "#9a3784",
44435
+ "#a7392c",
44436
+ "#409d50",
44437
+ "#6987e7",
44438
+ "#ee5b3d",
44439
+ "#c0430d",
44440
+ "#af79b3",
44441
+ "#4b6628"
44442
+ ];
44443
+ /**
44444
+ * The display palette (D939). One table of colours, three presets, one
44445
+ * validator. Taxonomy colours and every consumer read this — there is no
44446
+ * second hex table.
44447
+ */
44448
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
44449
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
44450
+ form: literal("solid"),
44451
+ hex: paletteHexSchema
44452
+ }), object({
44453
+ form: literal("gradient"),
44454
+ hex: paletteHexSchema,
44455
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
44456
+ })]);
44457
+ var paletteReadySchema = object({
44458
+ status: literal("ready"),
44459
+ presetId: _enum(PALETTE_PRESET_IDS),
44460
+ customized: boolean(),
44461
+ source: _enum(["stored", "unconfigured"]),
44462
+ swatches: record(string(), paletteSwatchSchema),
44463
+ fallbacks: array(paletteHexSchema).length(8)
44464
+ });
44465
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
44466
+ status: literal("unknown"),
44467
+ reason: string()
44468
+ })]);
44469
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
44470
+ presetId: string(),
44471
+ overrides: record(string(), paletteSwatchSchema)
44472
+ })]);
44473
+ object({
44474
+ presetId: string(),
44475
+ overrides: record(string(), paletteSwatchSchema)
44476
+ });
44477
+ function solid(hex) {
44478
+ return {
44479
+ form: "solid",
44480
+ hex
44481
+ };
44482
+ }
44483
+ function audioGradient(hex) {
44484
+ return {
44485
+ form: "gradient",
44486
+ hex,
44487
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
44488
+ };
44489
+ }
44490
+ function swatchesFrom(hexes) {
44491
+ const out = {};
44492
+ for (const id of PALETTE_ENTRY_IDS) {
44493
+ const hex = hexes[id];
44494
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
44495
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
44496
+ }
44497
+ return out;
44498
+ }
44499
+ function preset(id, name, hexes, fallbacks) {
44500
+ return {
44501
+ id,
44502
+ name,
44503
+ swatches: swatchesFrom(hexes),
44504
+ fallbacks
44505
+ };
44506
+ }
44507
+ var DISPLAY_PRESETS = [
44508
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
44509
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
44510
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
44511
+ ];
44512
+ function presetById(id) {
44513
+ return DISPLAY_PRESETS.find((item) => item.id === id);
44514
+ }
44515
+ function bundledCamstack() {
44516
+ const presetRow = presetById("camstack");
44517
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
44518
+ return readyOf(presetRow, "unconfigured", false);
44519
+ }
44520
+ function readyOf(row, source, customized) {
44521
+ return {
44522
+ status: "ready",
44523
+ presetId: row.id,
44524
+ customized,
44525
+ source,
44526
+ swatches: row.swatches,
44527
+ fallbacks: [...row.fallbacks]
44528
+ };
44529
+ }
44530
+ function hashFallback(kind, fallbacks) {
44531
+ let hash = 0;
44532
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
44533
+ const hex = fallbacks[hash % fallbacks.length];
44534
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44535
+ return hex;
44536
+ }
44537
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
44538
+ function paintHex(swatches, fallbacks, kind) {
44539
+ const key = kind.trim().toLowerCase();
44540
+ if (key.startsWith("audio-")) {
44541
+ const audio = swatches[AUDIO_ENTRY_ID];
44542
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
44543
+ }
44544
+ const direct = swatches[key];
44545
+ if (direct !== void 0) return direct.hex;
44546
+ return hashFallback(key, fallbacks);
44547
+ }
44548
+ /**
42179
44549
  * Unified event-kind taxonomy — THE single source of truth for
42180
44550
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42181
44551
  * icon }`.
@@ -42189,109 +44559,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42189
44559
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42190
44560
  * - the COCO / audio class maps (macro ↔ sub relationships)
42191
44561
  *
42192
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42193
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42194
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42195
- * color or an icon: they read this dictionary (server descriptors carry the
42196
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
44562
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
44563
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
44564
+ * the bundled CamStack display palette (D939). The effective cluster palette
44565
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
44566
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42197
44567
  *
42198
44568
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42199
44569
  */
42200
- var TAXONOMY_COLORS = {
42201
- motion: "#f59e0b",
42202
- audio: "#06b6d4",
42203
- person: "#22c55e",
42204
- vehicle: "#3b82f6",
42205
- animal: "#f97316",
42206
- package: "#a855f7",
42207
- sensor: "#8b5cf6",
42208
- control: "#10b981",
42209
- genericDetection: "#64748b"
42210
- };
42211
- var DETECTION_SUB_COLORS = {
42212
- car: "#f59e0b",
42213
- truck: "#d97706",
42214
- bus: "#b45309",
42215
- motorcycle: "#eab308",
42216
- bicycle: "#ca8a04",
42217
- airplane: "#60a5fa",
42218
- boat: "#2563eb",
42219
- train: "#1d4ed8",
42220
- bird: "#14b8a6",
42221
- dog: "#84cc16",
42222
- cat: "#f97316",
42223
- horse: "#a16207",
42224
- sheep: "#a3a3a3",
42225
- cow: "#78716c",
42226
- elephant: "#6b7280",
42227
- bear: "#7c2d12",
42228
- zebra: "#404040",
42229
- giraffe: "#d4a373"
42230
- };
44570
+ var BUNDLED_PALETTE = bundledCamstack();
44571
+ function kindColor(kind) {
44572
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
44573
+ }
44574
+ function firstFallback(fallbacks) {
44575
+ const hex = fallbacks[0];
44576
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
44577
+ return hex;
44578
+ }
44579
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42231
44580
  function titleCase(id) {
42232
44581
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42233
44582
  }
42234
44583
  var entries = /* @__PURE__ */ new Map();
42235
- function macro(kind, category, color, iconId, label) {
44584
+ function macro(kind, category, iconId, label) {
42236
44585
  entries.set(kind, {
42237
44586
  kind,
42238
44587
  parentKind: null,
42239
44588
  level: "macro",
42240
44589
  category,
42241
- color,
44590
+ color: kindColor(kind),
42242
44591
  iconId,
42243
44592
  labelKey: `eventKind.${kind}`,
42244
44593
  label
42245
44594
  });
42246
44595
  }
42247
- function sub(kind, parentKind, category, color, iconId, label) {
44596
+ function sub(kind, parentKind, category, iconId, label) {
42248
44597
  entries.set(kind, {
42249
44598
  kind,
42250
44599
  parentKind,
42251
44600
  level: "sub",
42252
44601
  category,
42253
- color,
44602
+ color: kindColor(kind),
42254
44603
  iconId,
42255
44604
  labelKey: `eventKind.${kind}`,
42256
44605
  label
42257
44606
  });
42258
44607
  }
42259
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42260
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42261
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42262
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42263
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42264
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42265
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42266
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
44608
+ macro("motion", "motion", "motion", "Motion");
44609
+ macro("audio", "audio", "audio", "Audio");
44610
+ macro("person", "detection", "person", "Person");
44611
+ macro("vehicle", "detection", "vehicle", "Vehicle");
44612
+ macro("animal", "detection", "animal", "Animal");
44613
+ macro("package", "package", "package", "Package");
44614
+ macro("sensor", "sensor", "sensor", "Sensor");
44615
+ macro("control", "control", "control", "Control");
42267
44616
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42268
44617
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42269
44618
  if (entries.has(cocoClass)) continue;
42270
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
42271
- }
42272
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42273
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42274
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42275
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42276
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42277
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42278
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42279
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42280
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42281
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42282
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42283
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42284
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42285
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42286
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42287
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42288
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42289
- sub("button", "control", "control", "#10b981", "button", "Button");
42290
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
44619
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
44620
+ }
44621
+ sub("package-delivered", "package", "package", "package", "Package delivered");
44622
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
44623
+ sub("contact", "sensor", "sensor", "door", "Contact");
44624
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
44625
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
44626
+ sub("flood", "sensor", "sensor", "water", "Water leak");
44627
+ sub("gas", "sensor", "sensor", "gas", "Gas");
44628
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
44629
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
44630
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
44631
+ sub("presence", "sensor", "sensor", "presence", "Presence");
44632
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
44633
+ sub("device-event", "sensor", "sensor", "button", "Device event");
44634
+ sub("lock", "control", "control", "lock", "Lock");
44635
+ sub("cover", "control", "control", "door", "Cover");
44636
+ sub("switch", "control", "control", "switch", "Switch");
44637
+ sub("siren", "control", "control", "siren", "Siren");
44638
+ sub("button", "control", "control", "button", "Button");
44639
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42291
44640
  for (const l of AUDIO_MACRO_LABELS) {
42292
44641
  const kind = `audio-${l.id}`;
42293
44642
  if (entries.has(kind)) continue;
42294
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
44643
+ sub(kind, "audio", "audio", kind, l.name);
42295
44644
  }
42296
44645
  /** The complete taxonomy dictionary, keyed by kind. */
42297
44646
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -43178,7 +45527,7 @@ var NcConditionsSchema = object({
43178
45527
  * with the list under it is worse than no switch (D62).
43179
45528
  *
43180
45529
  * MEMBERS ARE FACE-GALLERY `Identity.id`s (uuid), not display names. A name is
43181
- * renameable, and a rule authored on "Gianluca" went silently dark the moment
45530
+ * renameable, and a rule authored on "Alice" went silently dark the moment
43182
45531
  * the operator fixed the spelling. The id reaches the record on
43183
45532
  * `LabelAttribution.identityId`; the name is what the editor shows and what
43184
45533
  * `{{label}}` renders.
@@ -43729,7 +46078,7 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
43729
46078
  * A rule scoped to one camera and one zone silently became a rule that
43730
46079
  * matches EVERY event on EVERY camera, and lost its `media` policy
43731
46080
  * (zoneCrop / gif / clip / frame) and its `priority` at the same time. Seen
43732
- * live on 2026-08-12: a rule scoped to device 617 fired on 590 and 615
46081
+ * live on 2026-08-12: a rule scoped to device 102 fired on 104 and 101
43733
46082
  * within a minute of a two-field patch.
43734
46083
  *
43735
46084
  * So every defaulted field is re-declared here WITHOUT its default. The
@@ -45542,7 +47891,7 @@ var LabelAttributionSchema = object({
45542
47891
  * `Identity.id` or a plate-gallery `Vehicle.id` (both `randomUUID`).
45543
47892
  *
45544
47893
  * The text alone is a DISPLAY NAME, and a display name is renameable: a
45545
- * notification rule authored on "Gianluca" stopped matching the moment the
47894
+ * notification rule authored on "Alice" stopped matching the moment the
45546
47895
  * operator fixed the spelling in the gallery, and nothing said so. The id is
45547
47896
  * the thing that does not move, so it is what a rule matches on
45548
47897
  * (`NcConditions.identities`) and the text is what a human is shown.
@@ -48081,7 +50430,7 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
48081
50430
  /**
48082
50431
  * Root-supplied detections for the tree's ROOT step (D730). Set by
48083
50432
  * `runDetailSubtree` when the camera's root model supplies a crop-kind
48084
- * step (a Frigate+ `license_plate` for `plate-detection`): the step is
50433
+ * step (a plus catalog `license_plate` for `plate-detection`): the step is
48085
50434
  * NOT inferred, these boxes are its output, and its children (the plate
48086
50435
  * reader) run on them through their own crop policy. Boxes are in the
48087
50436
  * PIXELS of the image this call carries. Absent ⇒ the root step runs.
@@ -49758,7 +52107,7 @@ var RunnerCameraConfigSchema = object({
49758
52107
  * detection session that asks for history. What shipped was a last-moment
49759
52108
  * discard — `FrameSlot`'s throttle compares wall clocks, and ~4 s of media
49760
52109
  * arriving inside a few hundred ms of wall clock looks to it like one frame's
49761
- * worth. Device 617, 2026-09-08: a re-run of the SAME model over the stored
52110
+ * worth. Device 102, 2026-09-08: a re-run of the SAME model over the stored
49762
52111
  * recording scored the subject `vehicle 0.5669` — above the 0.50 floor —
49763
52112
  * 1.68 s BEFORE the live track was born, on a frame that was in the pre-roll,
49764
52113
  * was decoded, and was freed.
@@ -51788,7 +54137,7 @@ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config:
51788
54137
  * The signals a device can emit to WAKE its own stream.
51789
54138
  *
51790
54139
  * A camera whose stream is built on demand sleeps until something asks for it,
51791
- * and "something" cannot be a consumer that is merely attached — a Frigate-style
54140
+ * and "something" cannot be a consumer that is merely attached — a external-catalog
51792
54141
  * puller holds a session open for ever, and treating that as demand would keep
51793
54142
  * a battery camera awake for ever, which is the whole thing the battery is for
51794
54143
  * (D173). So the wake has to come from the CAMERA: an event it noticed by
@@ -52508,7 +54857,7 @@ var ClipSchema = object({
52508
54857
  * {@link MAX_CLIP_EVENT_IDS}. Empty on footage-only clips.
52509
54858
  *
52510
54859
  * Bounded because it is not a payload the surface pages through: one visit on
52511
- * device 615 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
54860
+ * device 101 carried 2 345 ids, and `eventIds` was 99% of a 153 KB
52512
54861
  * camera-day. Read {@link eventCount} for the true total.
52513
54862
  */
52514
54863
  eventIds: array(string()).optional(),
@@ -52653,7 +55002,7 @@ var ClipPlaybackSchema = object({
52653
55002
  * camera has no recordings", which is the defect this whole line of work is
52654
55003
  * about: a battery camera nobody woke (`sleeping`), a camera that could not be
52655
55004
  * reached at all (`unreachable`, also what a provider that THREW reports), a
52656
- * camera whose SD card is not mounted (`no-storage`, measured on 640 —
55005
+ * camera whose SD card is not mounted (`no-storage`, measured on 106 —
52657
55006
  * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
52658
55007
  * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
52659
55008
  * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
@@ -52918,7 +55267,7 @@ DeviceType.Camera, method(object({
52918
55267
  *
52919
55268
  * It was optional, documented as "absent means the device's BOUND
52920
55269
  * provider, which is CamStack on every camera". No code implemented
52921
- * that. Measured on the live hub 2026-09-20 — device 592, bound to
55270
+ * that. Measured on the live hub 2026-09-20 — device 107, bound to
52922
55271
  * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
52923
55272
  * answered SIX rows, three from each source, merged newest-first:
52924
55273
  * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
@@ -54061,7 +56410,10 @@ var airQualitySensorCapability = {
54061
56410
  */
54062
56411
  var AmbientLightSensorStatusSchema = object({
54063
56412
  /** Current illuminance in lux (lx). */
54064
- lux: number().min(0),
56413
+ lux: number().min(0).meta({
56414
+ unit: "lx",
56415
+ label: "Illuminance"
56416
+ }),
54065
56417
  /** Ms epoch when the slice was last updated. */
54066
56418
  lastFetchedAt: number(),
54067
56419
  /** Live display unit from the upstream source (e.g. HA
@@ -54104,7 +56456,12 @@ var ambientLightSensorCapability = {
54104
56456
  } } },
54105
56457
  /** Clock fields: written, but excluded from the compare that decides
54106
56458
  * whether persisting is worth a SQLite commit. */
54107
- volatileStateFields: ["lastFetchedAt"]
56459
+ volatileStateFields: ["lastFetchedAt"],
56460
+ customize: {
56461
+ version: 1,
56462
+ advanced: "derive",
56463
+ targets: []
56464
+ }
54108
56465
  };
54109
56466
  /**
54110
56467
  * Per-class audio metrics aggregated over a sliding window.
@@ -54331,7 +56688,10 @@ var BatteryStatusSchema = object({
54331
56688
  * Consumers must SKIP a null rather than coerce it — `battery-band` already
54332
56689
  * declines to band a non-finite reading, which is the correct shape.
54333
56690
  */
54334
- percentage: number().min(0).max(100).nullable(),
56691
+ percentage: number().min(0).max(100).nullable().meta({
56692
+ unit: "%",
56693
+ label: "Charge"
56694
+ }),
54335
56695
  /**
54336
56696
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
54337
56697
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -54350,13 +56710,13 @@ var BatteryStatusSchema = object({
54350
56710
  "solar",
54351
56711
  "none",
54352
56712
  "unknown"
54353
- ]),
56713
+ ]).meta({ label: "Charging source" }),
54354
56714
  /**
54355
56715
  * True when the camera firmware has gone into low-power mode. Battery
54356
56716
  * providers MUST avoid polling during sleep — reading the battery
54357
56717
  * wakes the camera up and drains charge.
54358
56718
  */
54359
- sleeping: boolean(),
56719
+ sleeping: boolean().meta({ label: "Sleeping" }),
54360
56720
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
54361
56721
  lastUpdated: number(),
54362
56722
  /**
@@ -54396,7 +56756,7 @@ var BatteryStatusSchema = object({
54396
56756
  * sub-threshold = low). UI MUST render "Normal"/"Low" instead of a
54397
56757
  * misleading exact percentage. Absent/false → genuine 0–100 % reading.
54398
56758
  */
54399
- binary: boolean().optional()
56759
+ binary: boolean().optional().meta({ label: "Binary indicator" })
54400
56760
  });
54401
56761
  var BATTERY_DEVICE_TYPES = [
54402
56762
  DeviceType.Camera,
@@ -54410,6 +56770,7 @@ var BATTERY_DEVICE_TYPES = [
54410
56770
  /** Generic Customize target for the percentage reading (D936). */
54411
56771
  var batteryCustomize = {
54412
56772
  version: 1,
56773
+ advanced: "derive",
54413
56774
  targets: [{
54414
56775
  id: "percentage",
54415
56776
  cardinality: "scalar",
@@ -54560,7 +56921,7 @@ onStatusChanged: { data: object({
54560
56921
  * with the right HomeKit / Alexa display category.
54561
56922
  */
54562
56923
  var BinaryStatusSchema = object({
54563
- on: boolean(),
56924
+ on: boolean().meta({ label: "On" }),
54564
56925
  /** Ms epoch of the last transition. 0 if never observed. */
54565
56926
  lastChangedAt: number()
54566
56927
  });
@@ -54589,7 +56950,12 @@ var binaryCapability = {
54589
56950
  history: { fields: { on: { kind: "boolean" } } },
54590
56951
  /** Clock fields: written, but excluded from the compare that decides
54591
56952
  * whether persisting is worth a SQLite commit. */
54592
- volatileStateFields: ["lastChangedAt"]
56953
+ volatileStateFields: ["lastChangedAt"],
56954
+ customize: {
56955
+ version: 1,
56956
+ advanced: "derive",
56957
+ targets: []
56958
+ }
54593
56959
  };
54594
56960
  /**
54595
56961
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -54912,7 +57278,7 @@ var GridLayoutCellSchema = object({
54912
57278
  *
54913
57279
  * A grid's `high` composes its sources' `high` and its `low` their `low`, so a
54914
57280
  * profile is on offer only when EVERY source can serve it. The refusal NAMES
54915
- * the sources, because "this grid has no low" is not a finding — "615 has no
57281
+ * the sources, because "this grid has no low" is not a finding — "101 has no
54916
57282
  * low" is, and it is the one an operator can act on.
54917
57283
  */
54918
57284
  var GridProfileOfferSchema = object({
@@ -56086,6 +58452,30 @@ var dayNightCapability = {
56086
58452
  volatileStateFields: ["lastFetchedAt"]
56087
58453
  };
56088
58454
  /**
58455
+ * display-palette — the cluster's one colour table (D939).
58456
+ *
58457
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
58458
+ * cannot be read; it does not pretend the bundled preset was stored.
58459
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
58460
+ * the pairs.
58461
+ */
58462
+ var presetSummarySchema = object({
58463
+ id: string(),
58464
+ name: string(),
58465
+ swatches: record(string(), paletteSwatchSchema),
58466
+ fallbacks: array(string())
58467
+ });
58468
+ method(_void(), paletteResultSchema, {
58469
+ auth: "protected",
58470
+ role: "viewer"
58471
+ }), method(_void(), array(presetSummarySchema).readonly(), {
58472
+ auth: "protected",
58473
+ role: "viewer"
58474
+ }), method(setPaletteInputSchema, paletteReadySchema, {
58475
+ kind: "mutation",
58476
+ auth: "admin"
58477
+ });
58478
+ /**
56089
58479
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
56090
58480
  * for every device, regardless of provider — the kernel needs a uniform
56091
58481
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -56465,6 +58855,7 @@ var doorbellCustomize = {
56465
58855
  applyAuthority: { kind: "composition-claim" },
56466
58856
  eventName: "onPressed",
56467
58857
  edges: ["rising"],
58858
+ defaultEdge: "rising",
56468
58859
  timestampPath: "lastPressedAt",
56469
58860
  counterPath: "pressCountSinceStart",
56470
58861
  highWater: "composer-advance",
@@ -57418,7 +59809,10 @@ var humidifierCapability = {
57418
59809
  */
57419
59810
  var HumiditySensorStatusSchema = object({
57420
59811
  /** Current relative humidity, 0..100. */
57421
- percent: number().min(0).max(100),
59812
+ percent: number().min(0).max(100).meta({
59813
+ unit: "%",
59814
+ label: "Humidity"
59815
+ }),
57422
59816
  /** Ms epoch when the slice was last updated. */
57423
59817
  lastFetchedAt: number(),
57424
59818
  /** Live display unit from the upstream source (e.g. HA
@@ -57460,7 +59854,12 @@ var humiditySensorCapability = {
57460
59854
  } } },
57461
59855
  /** Clock fields: written, but excluded from the compare that decides
57462
59856
  * whether persisting is worth a SQLite commit. */
57463
- volatileStateFields: ["lastFetchedAt"]
59857
+ volatileStateFields: ["lastFetchedAt"],
59858
+ customize: {
59859
+ version: 1,
59860
+ advanced: "derive",
59861
+ targets: []
59862
+ }
57464
59863
  };
57465
59864
  /**
57466
59865
  * Image display cap. Models a single still image exposed by an integration —
@@ -61241,9 +63640,15 @@ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema)
61241
63640
  */
61242
63641
  var PowerMeterStatusSchema = object({
61243
63642
  /** Instantaneous power draw in watts. */
61244
- watts: number().optional(),
63643
+ watts: number().optional().meta({
63644
+ unit: "W",
63645
+ label: "Power"
63646
+ }),
61245
63647
  /** Cumulative energy in kilowatt-hours since the meter was reset. */
61246
- kwhTotal: number().optional(),
63648
+ kwhTotal: number().optional().meta({
63649
+ unit: "kWh",
63650
+ label: "Energy"
63651
+ }),
61247
63652
  /** Voltage in volts. */
61248
63653
  volts: number().optional(),
61249
63654
  /** Current in amperes. */
@@ -61328,7 +63733,12 @@ var powerMeterCapability = {
61328
63733
  } },
61329
63734
  /** Clock fields: written, but excluded from the compare that decides
61330
63735
  * whether persisting is worth a SQLite commit. */
61331
- volatileStateFields: ["lastFetchedAt"]
63736
+ volatileStateFields: ["lastFetchedAt"],
63737
+ customize: {
63738
+ version: 1,
63739
+ advanced: "derive",
63740
+ targets: []
63741
+ }
61332
63742
  };
61333
63743
  /**
61334
63744
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -61750,9 +64160,9 @@ var PtzOptionsSchema = object({
61750
64160
  * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
61751
64161
  * not one of the three cameras honours its own:
61752
64162
  *
61753
- * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
61754
- * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
61755
- * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
64163
+ * 107 Camera camera Carol (reolink) preset 0 holds "stanza"
64164
+ * 1438 Camera dispensa (hikvision) preset 1 holds "Credenza"
64165
+ * 3836 Camera studio (amcrest) preset 1 holds "Preset1"
61756
64166
  *
61757
64167
  * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
61758
64168
  * and two of the three swallowed the failure in a bare `catch`. For autotrack
@@ -62004,7 +64414,7 @@ var RunningStateStatusSchema = object({
62004
64414
  running: boolean().nullable(),
62005
64415
  /** Epoch ms the current boolean began; null while `running` is null. */
62006
64416
  since: number().nullable(),
62007
- source: RunningStateSourceSchema,
64417
+ source: RunningStateSourceSchema.meta({ label: "Source" }),
62008
64418
  phase: string().nullable(),
62009
64419
  /** null until a reading has been published (D393). */
62010
64420
  lastFetchedAt: number().nullable()
@@ -62018,6 +64428,7 @@ var RUNNING_DEVICE_TYPES = Object.values(DeviceType);
62018
64428
  /** Generic Customize target for the running boolean (D936). */
62019
64429
  var runningCustomize = {
62020
64430
  version: 1,
64431
+ advanced: "derive",
62021
64432
  targets: [{
62022
64433
  id: "running",
62023
64434
  cardinality: "scalar",
@@ -62053,6 +64464,7 @@ var runningCustomize = {
62053
64464
  requiredUnit: "W",
62054
64465
  transforms: [{
62055
64466
  kind: "threshold",
64467
+ comparisons: ["gte", "lte"],
62056
64468
  comparison: "gte",
62057
64469
  defaultThreshold: 5,
62058
64470
  defaultStartDwellMs: RUNNING_POWER_START_DELAY_MS,
@@ -62156,7 +64568,7 @@ var RecordingAvailabilitySchema = object({
62156
64568
  * would look identical. But the answer used to say nothing about that, so a
62157
64569
  * caller asking "what can I export?" read the single preferred profile as
62158
64570
  * the only one that exists — on this deployment every camera records `high`
62159
- * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
64571
+ * AND `low`, the low tree holding 14 GB for camera 101 alone, and the export
62160
64572
  * UI could not see it.
62161
64573
  *
62162
64574
  * Cheap: it is the same shallow directory read the profile CHOICE already
@@ -62255,7 +64667,7 @@ var RecordingSourceOptionsSchema = object({
62255
64667
  * `sparse` = gaps are the absence of one, and must be drawn as such.
62256
64668
  *
62257
64669
  * Not an onboard-only concession: measured 2026-09-24, OUR bar covers 98.8 %
62258
- * of 592's day and 1.2 % of 1436's. It is a fact about a (source, camera)
64670
+ * of 107's day and 1.2 % of 1436's. It is a fact about a (source, camera)
62259
64671
  * pair, and ours answers it per camera from `deriveRecordingMode`. */
62260
64672
  coverage: _enum(["continuous", "sparse"]),
62261
64673
  /** Where the playhead may be put.
@@ -62331,7 +64743,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(RecordingSourceS
62331
64743
  * merely discouraged (D554 amended).
62332
64744
  *
62333
64745
  * It was learned the expensive way on `videoclips.listClips`: measured
62334
- * on the live hub 2026-09-20, device 592 bound to `recorder` AND
64746
+ * on the live hub 2026-09-20, device 107 bound to `recorder` AND
62335
64747
  * `provider-reolink`, a bare call with `limit: 3` answered SIX rows,
62336
64748
  * three from each source, merged — `device-collection-dispatch.ts`
62337
64749
  * leaves an unpinned fan-out un-narrowed, so absence buys the union the
@@ -62932,7 +65344,7 @@ var ExportSpeedSchema = number().min(.25).max(32);
62932
65344
  * on a 10 h window holding 29,393 s of footage every range landed late by the
62933
65345
  * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
62934
65346
  * the video was a uniform timelapse, and the log line reported the five ranges
62935
- * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
65347
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 101).
62936
65348
  *
62937
65349
  * Relative and not absolute epoch, because an absolute epoch would make every
62938
65350
  * call site responsible for the same subtraction.
@@ -63643,7 +66055,7 @@ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) }
63643
66055
  * which put a "Scenes" tab on one camera's detail page. That is the wrong shape
63644
66056
  * for the thing: a scene is a standing question about the property ("is the bin
63645
66057
  * still out"), and the operator's question is "which of my scenes have tripped",
63646
- * across every camera at once — not "what does camera 617 think". Buried one
66058
+ * across every camera at once — not "what does camera 102 think". Buried one
63647
66059
  * camera deep it also could not be found. The surface is now a top-level admin
63648
66060
  * page (`/scenes`, `pages/Scenes.tsx`) that lists every scene on every camera and
63649
66061
  * picks the camera inside the create flow, the same shape Events and Faces have.
@@ -64502,7 +66914,7 @@ var streamParamsCapability = {
64502
66914
  * `getSettingsUISchema()` surface.
64503
66915
  */
64504
66916
  var SwitchStatusSchema = object({
64505
- on: boolean(),
66917
+ on: boolean().meta({ label: "On" }),
64506
66918
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
64507
66919
  lastChangedAt: number()
64508
66920
  });
@@ -64561,7 +66973,12 @@ var switchCapability = {
64561
66973
  label: "On",
64562
66974
  kind: "boolean"
64563
66975
  }
64564
- }] }
66976
+ }] },
66977
+ customize: {
66978
+ version: 1,
66979
+ advanced: "derive",
66980
+ targets: []
66981
+ }
64565
66982
  };
64566
66983
  /** C0 controls, DEL and the C1 range: none of them belongs in a name. */
64567
66984
  function hasControlCharacter(value) {
@@ -65157,7 +67574,10 @@ var tamperCapability = {
65157
67574
  */
65158
67575
  var TemperatureSensorStatusSchema = object({
65159
67576
  /** Current temperature in Celsius. */
65160
- celsius: number(),
67577
+ celsius: number().meta({
67578
+ unit: "°C",
67579
+ label: "Temperature"
67580
+ }),
65161
67581
  /** Ms epoch when the slice was last updated (push or poll). */
65162
67582
  lastFetchedAt: number(),
65163
67583
  /** Live display unit from the upstream source (e.g. HA
@@ -65200,7 +67620,12 @@ var temperatureSensorCapability = {
65200
67620
  } } },
65201
67621
  /** Clock fields: written, but excluded from the compare that decides
65202
67622
  * whether persisting is worth a SQLite commit. */
65203
- volatileStateFields: ["lastFetchedAt"]
67623
+ volatileStateFields: ["lastFetchedAt"],
67624
+ customize: {
67625
+ version: 1,
67626
+ advanced: "derive",
67627
+ targets: []
67628
+ }
65204
67629
  };
65205
67630
  /**
65206
67631
  * toast — system-scoped singleton capability that streams toast
@@ -66776,6 +69201,10 @@ function runningFromLawnMower(activity, previous, fetchedAt, transitionAt) {
66776
69201
  return nativeSlice(false, activity, previous, transitionAtMs, fetchedAt, null);
66777
69202
  }
66778
69203
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
69204
+ 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;
69205
+ String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
69206
+ DeviceRole.BinarySensor, DeviceRole.MotionSensor;
69207
+ new Set(CAP_NAMES);
66779
69208
  Object.freeze({
66780
69209
  person: .5,
66781
69210
  vehicle: .5,
@@ -68025,7 +70454,7 @@ var BaseDeviceProvider = class extends BaseAddon {
68025
70454
  * A top-level persisted row with NO configuration is a leftover, not a
68026
70455
  * device — quarantine it instead of dialling it.
68027
70456
  *
68028
- * Device 614 was deleted, resurrected as a config-less shell by a write
70457
+ * Device 105 was deleted, resurrected as a config-less shell by a write
68029
70458
  * already in flight (D376), and then dialled at every single boot: eight
68030
70459
  * `Failed to restore device — bounded retry scheduled` lines in one day,
68031
70460
  * each one the same Zod refusal on `host` and `password`. The bound was
@@ -71335,6 +73764,27 @@ Object.freeze({
71335
73764
  access: "create",
71336
73765
  role: "viewer"
71337
73766
  },
73767
+ "displayPalette.getPalette": {
73768
+ capName: "display-palette",
73769
+ capScope: "system",
73770
+ addonId: null,
73771
+ access: "view",
73772
+ role: "viewer"
73773
+ },
73774
+ "displayPalette.listPresets": {
73775
+ capName: "display-palette",
73776
+ capScope: "system",
73777
+ addonId: null,
73778
+ access: "view",
73779
+ role: "viewer"
73780
+ },
73781
+ "displayPalette.setPalette": {
73782
+ capName: "display-palette",
73783
+ capScope: "system",
73784
+ addonId: null,
73785
+ access: "create",
73786
+ role: "admin"
73787
+ },
71338
73788
  "doorbell.getStatus": {
71339
73789
  capName: "doorbell",
71340
73790
  capScope: "device",
@@ -81252,7 +83702,7 @@ var SENSOR_CAP_VOCABULARY = {
81252
83702
  state: [{
81253
83703
  kind: "boolean",
81254
83704
  field: "on",
81255
- label: t("Active", "Attivo"),
83705
+ label: t("On", "Acceso"),
81256
83706
  whenTrue: t("When {device} turns active", "Quando {device} si attiva"),
81257
83707
  whenFalse: t("When {device} turns inactive", "Quando {device} si disattiva"),
81258
83708
  icon: "toggle-right"
@@ -81791,6 +84241,7 @@ var SYSTEM_CAP_VOCABULARY = {
81791
84241
  "device-provider": system(INTERNAL),
81792
84242
  "device-removal-hook": system(INTERNAL),
81793
84243
  "device-state": system("the runtime-state mirror every trigger already reads through"),
84244
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
81794
84245
  "embedding-encoder": system(ML),
81795
84246
  "face-gallery": system("the face gallery — curated on its own page"),
81796
84247
  "failure-contribution": system(INTERNAL),
@@ -84675,7 +87126,6 @@ Object.freeze({
84675
87126
  "smtp-provider": "email"
84676
87127
  });
84677
87128
  DeviceType.Camera;
84678
- 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;
84679
87129
  /**
84680
87130
  * A saved Customize assignment (D936). The schema is the type: callers use
84681
87131
  * `z.infer`, they do not restate the shape.
@@ -84732,6 +87182,11 @@ var PulseOverrideDraftSchema = object({
84732
87182
  targetId: string().min(1),
84733
87183
  enabled: boolean(),
84734
87184
  debounceMs: number().nonnegative(),
87185
+ edges: array(_enum([
87186
+ "rising",
87187
+ "button",
87188
+ "native-event"
87189
+ ])).min(1).optional(),
84735
87190
  sources: array(OverrideSourceSchema).min(1)
84736
87191
  });
84737
87192
  var SpanSourceDraftSchema = OverrideSourceSchema.extend({ mode: _enum([
@@ -84764,7 +87219,6 @@ object({
84764
87219
  ]),
84765
87220
  reason: string().nullable()
84766
87221
  });
84767
- String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
84768
87222
  var G711_SCALE_CORRECTION_DB = {
84769
87223
  PCMU: 20 * Math.log10(4),
84770
87224
  PCMA: 20 * Math.log10(8)
@@ -85137,7 +87591,7 @@ var STATE_SUMMARY_SECTION_VARS = [
85137
87591
  {
85138
87592
  name: "summaryStreams",
85139
87593
  label: "Summary: streams offline",
85140
- example: "Ingresso (high) — since 06:40",
87594
+ example: "Front door (high) — since 06:40",
85141
87595
  kinds: ["stream-offline", "stream-online"]
85142
87596
  },
85143
87597
  {
@@ -85155,13 +87609,13 @@ var STATE_SUMMARY_SECTION_VARS = [
85155
87609
  {
85156
87610
  name: "summaryDetection",
85157
87611
  label: "Summary: cameras detecting nothing",
85158
- example: "Ingresso — since 05:10",
87612
+ example: "Front door — since 05:10",
85159
87613
  kinds: ["detection-blind"]
85160
87614
  },
85161
87615
  {
85162
87616
  name: "summaryNodes",
85163
87617
  label: "Summary: nodes",
85164
- example: "little-unraid — offline since 03:00",
87618
+ example: "agent-a — offline since 03:00",
85165
87619
  kinds: [
85166
87620
  "node-offline",
85167
87621
  "node-online",