@camstack/types 1.2.421 → 1.2.422

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 (39) hide show
  1. package/dist/addon.js +1 -1
  2. package/dist/addon.mjs +1 -1
  3. package/dist/capabilities/composer.cap.d.ts +129 -57
  4. package/dist/capabilities/core-blocks.cap.d.ts +936 -410
  5. package/dist/capabilities/index.d.ts +3 -1
  6. package/dist/capabilities/meter.cap.d.ts +53 -0
  7. package/dist/client.js +3 -0
  8. package/dist/client.mjs +3 -0
  9. package/dist/composition/composition-report.d.ts +45 -0
  10. package/dist/composition/composition.d.ts +196 -19
  11. package/dist/composition/helpers/compile-history.d.ts +13 -0
  12. package/dist/composition/helpers/compile.d.ts +2 -1
  13. package/dist/composition/helpers/energy.d.ts +8 -0
  14. package/dist/composition/helpers/history-math.d.ts +39 -0
  15. package/dist/composition/helpers/history-window.d.ts +71 -0
  16. package/dist/composition/helpers/index.d.ts +6 -2
  17. package/dist/composition/helpers/source-pick.d.ts +2 -0
  18. package/dist/composition/helpers/spec.d.ts +23 -10
  19. package/dist/{composition-B3Hkb6v7.js → composition-CPRAP41h.js} +792 -8
  20. package/dist/{composition-B2rw5L29.mjs → composition-CpETZ4HL.mjs} +595 -9
  21. package/dist/device/cap-vocabulary/entries/sensors.d.ts +1 -1
  22. package/dist/generated/addon-api.d.ts +14 -0
  23. package/dist/generated/addon-cap-facts.d.ts +1 -1
  24. package/dist/generated/cap-status-types.d.ts +3 -1
  25. package/dist/generated/capability-router-map.d.ts +5 -2
  26. package/dist/generated/device-local-state.d.ts +3 -0
  27. package/dist/generated/device-proxy.d.ts +3 -0
  28. package/dist/generated/device-scoped-caps.d.ts +1 -1
  29. package/dist/generated/history-catalog.d.ts +1 -1
  30. package/dist/generated/method-access-map.d.ts +1 -1
  31. package/dist/generated/method-device-selectors.d.ts +1 -1
  32. package/dist/generated/runtime-state-durability.d.ts +1 -1
  33. package/dist/index.js +747 -446
  34. package/dist/index.mjs +709 -447
  35. package/dist/node.js +1 -1
  36. package/dist/node.mjs +1 -1
  37. package/dist/{sleep-bykKrTgu.mjs → sleep-0sD_LHLI.mjs} +10 -1
  38. package/dist/{sleep-YJ6FVsUu.js → sleep-CEKGW7A5.js} +10 -1
  39. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-YJ6FVsUu.js");
2
+ const require_sleep = require("./sleep-CEKGW7A5.js");
3
3
  const require_event_category = require("./event-category-Ave2VSxY.js");
4
- const require_composition = require("./composition-B3Hkb6v7.js");
4
+ const require_composition = require("./composition-CPRAP41h.js");
5
5
  const require_node_color = require("./node-color.js");
6
6
  const require_err_msg = require("./err-msg-U7lLUMNz.js");
7
7
  const require_enums = require("./enums.js");
@@ -12627,7 +12627,8 @@ var CompositionProblemCodeSchema = zod.z.enum([
12627
12627
  "native-capability-replace",
12628
12628
  "mixed-quantity",
12629
12629
  "helper-mismatch",
12630
- "member-constraint"
12630
+ "member-constraint",
12631
+ "retention"
12631
12632
  ]);
12632
12633
  /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
12633
12634
  var CompositionProblemSchema = zod.z.object({
@@ -13023,6 +13024,20 @@ function inferExpressionKinds(input) {
13023
13024
  * planner (`composition-items.ts`). Internal to the composition module — NOT
13024
13025
  * in the barrel: these are planner internals, not a published contract.
13025
13026
  */
13027
+ function seriesKinds(source) {
13028
+ if (source.publish !== "value") return {
13029
+ ok: true,
13030
+ kinds: new Set(["number"])
13031
+ };
13032
+ if (source.empty === "null") return {
13033
+ ok: true,
13034
+ kinds: new Set(["number", "null"])
13035
+ };
13036
+ return {
13037
+ ok: true,
13038
+ kinds: new Set(["number"])
13039
+ };
13040
+ }
13026
13041
  function aggregateKinds(source) {
13027
13042
  if (source.publish !== "value") return {
13028
13043
  ok: true,
@@ -13069,6 +13084,7 @@ function sourceKinds(source, lookupCap) {
13069
13084
  message: "code fields arrive in slice 4"
13070
13085
  };
13071
13086
  if (source.kind === "aggregate") return aggregateKinds(source);
13087
+ if (source.kind === "series") return seriesKinds(source);
13072
13088
  const bindingKinds = /* @__PURE__ */ new Map();
13073
13089
  for (const [name, binding] of Object.entries(source.bindings)) {
13074
13090
  if (binding.kind === "literal") {
@@ -13270,7 +13286,7 @@ function planItems(def, feature, featureIndex, lookupCap, mode = "new") {
13270
13286
  * One catalog row per base reading a group helper can build (D944 §3).
13271
13287
  * Data, not a form default written into the block.
13272
13288
  */
13273
- var NOW = {
13289
+ var NOW$1 = {
13274
13290
  fieldPath: "lastFetchedAt",
13275
13291
  expr: "now"
13276
13292
  };
@@ -13316,7 +13332,7 @@ var GROUP_TEMPLATES = [
13316
13332
  quantity: "temperature",
13317
13333
  defaultAggregate: "mean",
13318
13334
  empty: "null",
13319
- companions: [NOW]
13335
+ companions: [NOW$1]
13320
13336
  }),
13321
13337
  numeric({
13322
13338
  id: "humidity",
@@ -13327,7 +13343,7 @@ var GROUP_TEMPLATES = [
13327
13343
  quantity: "humidity",
13328
13344
  defaultAggregate: "mean",
13329
13345
  empty: "null",
13330
- companions: [NOW]
13346
+ companions: [NOW$1]
13331
13347
  }),
13332
13348
  numeric({
13333
13349
  id: "pressure",
@@ -13338,7 +13354,7 @@ var GROUP_TEMPLATES = [
13338
13354
  quantity: "pressure",
13339
13355
  defaultAggregate: "mean",
13340
13356
  empty: "null",
13341
- companions: [NOW]
13357
+ companions: [NOW$1]
13342
13358
  }),
13343
13359
  numeric({
13344
13360
  id: "illuminance",
@@ -13349,7 +13365,7 @@ var GROUP_TEMPLATES = [
13349
13365
  quantity: "illuminance",
13350
13366
  defaultAggregate: "mean",
13351
13367
  empty: "null",
13352
- companions: [NOW]
13368
+ companions: [NOW$1]
13353
13369
  }),
13354
13370
  numeric({
13355
13371
  id: "power",
@@ -13360,7 +13376,7 @@ var GROUP_TEMPLATES = [
13360
13376
  quantity: "power",
13361
13377
  defaultAggregate: "sum",
13362
13378
  empty: "omit",
13363
- companions: [NOW]
13379
+ companions: [NOW$1]
13364
13380
  }),
13365
13381
  numeric({
13366
13382
  id: "energy",
@@ -13371,7 +13387,7 @@ var GROUP_TEMPLATES = [
13371
13387
  quantity: "energy",
13372
13388
  defaultAggregate: "sum",
13373
13389
  empty: "omit",
13374
- companions: [NOW]
13390
+ companions: [NOW$1]
13375
13391
  }),
13376
13392
  numeric({
13377
13393
  id: "battery",
@@ -13406,7 +13422,7 @@ var GROUP_TEMPLATES = [
13406
13422
  quantity: "device",
13407
13423
  defaultAggregate: "mean",
13408
13424
  empty: "null",
13409
- companions: [NOW]
13425
+ companions: [NOW$1]
13410
13426
  }),
13411
13427
  binary({
13412
13428
  id: "motion",
@@ -13723,6 +13739,545 @@ async function runFanOut(calls, invoke) {
13723
13739
  return results;
13724
13740
  }
13725
13741
  //#endregion
13742
+ //#region src/generated/history-catalog.ts
13743
+ /**
13744
+ * Cap history catalog, projected from every `*.cap.ts` `history` block.
13745
+ * 42 caps with series (76 series), 32 caps answered `'none'`.
13746
+ * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
13747
+ */
13748
+ var HISTORY_CATALOG = {
13749
+ "air-quality-sensor": {
13750
+ "co2Ppm": {
13751
+ kind: "gauge",
13752
+ unit: "ppm",
13753
+ deadband: 5
13754
+ },
13755
+ "vocPpb": {
13756
+ kind: "gauge",
13757
+ unit: "ppb",
13758
+ deadband: 5
13759
+ },
13760
+ "pm25": {
13761
+ kind: "gauge",
13762
+ unit: "µg/m³",
13763
+ deadband: 1
13764
+ },
13765
+ "pm10": {
13766
+ kind: "gauge",
13767
+ unit: "µg/m³",
13768
+ deadband: 1
13769
+ },
13770
+ "aqi": {
13771
+ kind: "gauge",
13772
+ unit: "count",
13773
+ deadband: 1
13774
+ }
13775
+ },
13776
+ "alarm-panel": { "state": {
13777
+ kind: "enum",
13778
+ values: [
13779
+ "disarmed",
13780
+ "armed_home",
13781
+ "armed_away",
13782
+ "armed_night",
13783
+ "armed_vacation",
13784
+ "armed_custom_bypass",
13785
+ "arming",
13786
+ "disarming",
13787
+ "pending",
13788
+ "triggered"
13789
+ ]
13790
+ } },
13791
+ "ambient-light-sensor": { "lux": {
13792
+ kind: "gauge",
13793
+ unit: "lx",
13794
+ deadbandPct: 10,
13795
+ minIntervalMs: 6e4
13796
+ } },
13797
+ "battery": {
13798
+ "percentage": {
13799
+ kind: "gauge",
13800
+ unit: "%"
13801
+ },
13802
+ "volts": {
13803
+ kind: "gauge",
13804
+ unit: "V"
13805
+ }
13806
+ },
13807
+ "binary": { "on": { kind: "boolean" } },
13808
+ "brightness": { "percentage": {
13809
+ kind: "gauge",
13810
+ unit: "%",
13811
+ minIntervalMs: 0
13812
+ } },
13813
+ "carbon-monoxide": { "detected": { kind: "boolean" } },
13814
+ "climate-control": {
13815
+ "currentTemp": {
13816
+ kind: "gauge",
13817
+ unit: "°C",
13818
+ deadband: .1
13819
+ },
13820
+ "currentHumidity": {
13821
+ kind: "gauge",
13822
+ unit: "%",
13823
+ deadband: .5
13824
+ },
13825
+ "target": {
13826
+ kind: "gauge",
13827
+ unit: "°C",
13828
+ minIntervalMs: 0
13829
+ },
13830
+ "targetHigh": {
13831
+ kind: "gauge",
13832
+ unit: "°C",
13833
+ minIntervalMs: 0
13834
+ },
13835
+ "targetLow": {
13836
+ kind: "gauge",
13837
+ unit: "°C",
13838
+ minIntervalMs: 0
13839
+ }
13840
+ },
13841
+ "connectivity": { "connected": { kind: "boolean" } },
13842
+ "contact": { "entryOpen": { kind: "boolean" } },
13843
+ "cover": { "position": {
13844
+ kind: "gauge",
13845
+ unit: "%",
13846
+ minIntervalMs: 0
13847
+ } },
13848
+ "device-status": { "online": { kind: "boolean" } },
13849
+ "dishwasher": {
13850
+ "progressPercent": {
13851
+ kind: "gauge",
13852
+ unit: "%",
13853
+ deadband: 2
13854
+ },
13855
+ "state": {
13856
+ kind: "enum",
13857
+ values: [
13858
+ "idle",
13859
+ "running",
13860
+ "paused",
13861
+ "finished",
13862
+ "error",
13863
+ "unavailable"
13864
+ ]
13865
+ },
13866
+ "operationState": {
13867
+ kind: "enum",
13868
+ values: [
13869
+ "Inactive",
13870
+ "Ready",
13871
+ "DelayedStart",
13872
+ "Run",
13873
+ "Pause",
13874
+ "ActionRequired",
13875
+ "Finished",
13876
+ "Error",
13877
+ "Aborting"
13878
+ ]
13879
+ },
13880
+ "remainingSeconds": {
13881
+ kind: "gauge",
13882
+ unit: "s",
13883
+ minIntervalMs: 6e4
13884
+ },
13885
+ "doorOpen": { kind: "boolean" },
13886
+ "powerOn": { kind: "boolean" }
13887
+ },
13888
+ "enum-sensor": { "value": {
13889
+ kind: "enum",
13890
+ skipWhenSet: "timestamp"
13891
+ } },
13892
+ "fan-control": {
13893
+ "percentage": {
13894
+ kind: "gauge",
13895
+ unit: "%",
13896
+ minIntervalMs: 0
13897
+ },
13898
+ "oscillating": { kind: "boolean" }
13899
+ },
13900
+ "flood": { "flooded": { kind: "boolean" } },
13901
+ "gas": { "detected": { kind: "boolean" } },
13902
+ "heating-valve": { "position": {
13903
+ kind: "gauge",
13904
+ unit: "%",
13905
+ deadband: 1
13906
+ } },
13907
+ "humidifier": {
13908
+ "currentHumidity": {
13909
+ kind: "gauge",
13910
+ unit: "%",
13911
+ deadband: .5
13912
+ },
13913
+ "on": { kind: "boolean" }
13914
+ },
13915
+ "humidity-sensor": { "percent": {
13916
+ kind: "gauge",
13917
+ unit: "%",
13918
+ deadband: .5
13919
+ } },
13920
+ "lawn-mower-control": { "batteryLevel": {
13921
+ kind: "gauge",
13922
+ unit: "%",
13923
+ deadband: 2
13924
+ } },
13925
+ "lock-control": { "state": {
13926
+ kind: "enum",
13927
+ values: [
13928
+ "locked",
13929
+ "unlocked",
13930
+ "locking",
13931
+ "unlocking",
13932
+ "jammed"
13933
+ ]
13934
+ } },
13935
+ "media-player": {
13936
+ "volumeLevel": {
13937
+ kind: "gauge",
13938
+ unit: "%",
13939
+ deadband: 1
13940
+ },
13941
+ "isMuted": { kind: "boolean" }
13942
+ },
13943
+ "meter": { "value": {
13944
+ kind: "counter",
13945
+ deadband: .001,
13946
+ minIntervalMs: 6e4
13947
+ } },
13948
+ "motion": { "detected": {
13949
+ kind: "boolean",
13950
+ excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
13951
+ } },
13952
+ "network-link": {
13953
+ "signalPercent": {
13954
+ kind: "gauge",
13955
+ unit: "%",
13956
+ deadband: 3,
13957
+ minIntervalMs: 6e4
13958
+ },
13959
+ "rssiDbm": {
13960
+ kind: "gauge",
13961
+ unit: "dBm",
13962
+ deadband: 2,
13963
+ minIntervalMs: 6e4
13964
+ }
13965
+ },
13966
+ "numeric-sensor": { "value": {
13967
+ kind: "gauge",
13968
+ minIntervalMs: 3e4
13969
+ } },
13970
+ "pet-feeder": {
13971
+ "foodLevel": { kind: "gauge" },
13972
+ "food1": { kind: "gauge" },
13973
+ "food2": { kind: "gauge" },
13974
+ "batteryPower": {
13975
+ kind: "gauge",
13976
+ unit: "%",
13977
+ deadband: 2
13978
+ },
13979
+ "desiccantLeftDays": {
13980
+ kind: "gauge",
13981
+ unit: "s"
13982
+ }
13983
+ },
13984
+ "power-meter": {
13985
+ "watts": {
13986
+ kind: "gauge",
13987
+ unit: "W",
13988
+ deadband: 1,
13989
+ minIntervalMs: 3e4
13990
+ },
13991
+ "kwhTotal": {
13992
+ kind: "counter",
13993
+ unit: "kWh",
13994
+ deadband: .01,
13995
+ minIntervalMs: 6e4
13996
+ },
13997
+ "volts": {
13998
+ kind: "gauge",
13999
+ unit: "V",
14000
+ deadband: 1,
14001
+ minIntervalMs: 3e4
14002
+ },
14003
+ "amps": {
14004
+ kind: "gauge",
14005
+ unit: "A",
14006
+ deadband: .05,
14007
+ minIntervalMs: 3e4
14008
+ },
14009
+ "va": {
14010
+ kind: "gauge",
14011
+ unit: "VA",
14012
+ deadband: 1,
14013
+ minIntervalMs: 3e4
14014
+ },
14015
+ "powerFactor": {
14016
+ kind: "gauge",
14017
+ unit: "ratio",
14018
+ deadband: .01,
14019
+ minIntervalMs: 6e4
14020
+ }
14021
+ },
14022
+ "presence": { "batteryPercent": {
14023
+ kind: "gauge",
14024
+ unit: "%",
14025
+ deadband: 1
14026
+ } },
14027
+ "pressure-sensor": { "hpa": {
14028
+ kind: "gauge",
14029
+ unit: "hPa",
14030
+ deadband: .1
14031
+ } },
14032
+ "running-state": { "running": { kind: "boolean" } },
14033
+ "smoke": { "detected": { kind: "boolean" } },
14034
+ "stream-params": {
14035
+ "main.bitrate": {
14036
+ kind: "gauge",
14037
+ unit: "kbps"
14038
+ },
14039
+ "main.framerate": {
14040
+ kind: "gauge",
14041
+ unit: "fps"
14042
+ },
14043
+ "sub.bitrate": {
14044
+ kind: "gauge",
14045
+ unit: "kbps"
14046
+ },
14047
+ "sub.framerate": {
14048
+ kind: "gauge",
14049
+ unit: "fps"
14050
+ }
14051
+ },
14052
+ "switch": { "on": { kind: "boolean" } },
14053
+ "tamper": { "tampered": { kind: "boolean" } },
14054
+ "temperature-sensor": { "celsius": {
14055
+ kind: "gauge",
14056
+ unit: "°C",
14057
+ deadband: .1
14058
+ } },
14059
+ "vacuum-control": { "batteryLevel": {
14060
+ kind: "gauge",
14061
+ unit: "%",
14062
+ deadband: 2
14063
+ } },
14064
+ "valve": { "position": {
14065
+ kind: "gauge",
14066
+ unit: "%",
14067
+ minIntervalMs: 0
14068
+ } },
14069
+ "vibration": { "detected": { kind: "boolean" } },
14070
+ "water-heater": {
14071
+ "currentTemp": {
14072
+ kind: "gauge",
14073
+ unit: "°C",
14074
+ deadband: .5
14075
+ },
14076
+ "targetTemp": {
14077
+ kind: "gauge",
14078
+ unit: "°C",
14079
+ minIntervalMs: 0
14080
+ }
14081
+ },
14082
+ "weather": {
14083
+ "temperature": {
14084
+ kind: "gauge",
14085
+ unit: "°C",
14086
+ deadband: .2
14087
+ },
14088
+ "humidity": {
14089
+ kind: "gauge",
14090
+ unit: "%",
14091
+ deadband: 1
14092
+ },
14093
+ "pressure": {
14094
+ kind: "gauge",
14095
+ unit: "hPa",
14096
+ deadband: .5
14097
+ },
14098
+ "windSpeed": {
14099
+ kind: "gauge",
14100
+ unit: "m/s",
14101
+ deadband: .5
14102
+ }
14103
+ }
14104
+ };
14105
+ /**
14106
+ * Keyed-array series (D917), projected from every `history.items` block:
14107
+ * 1 caps (3 item fields). The item key is the series SCOPE;
14108
+ * the series key is `cap:<capName>.<path>[].<field>`.
14109
+ */
14110
+ var HISTORY_ITEM_CATALOG = { "consumables": {
14111
+ path: "items",
14112
+ key: "key",
14113
+ label: "label",
14114
+ fields: {
14115
+ "level": {
14116
+ kind: "gauge",
14117
+ unit: "%",
14118
+ deadband: 2,
14119
+ displayName: "Level"
14120
+ },
14121
+ "status": {
14122
+ kind: "enum",
14123
+ displayName: "Status",
14124
+ values: [
14125
+ "ok",
14126
+ "low",
14127
+ "empty",
14128
+ "full",
14129
+ "replace"
14130
+ ]
14131
+ },
14132
+ "remaining.value": {
14133
+ kind: "gauge",
14134
+ deadband: 1,
14135
+ displayName: "Remaining"
14136
+ }
14137
+ }
14138
+ } };
14139
+ /** Caps that declared `history: 'none'`, sorted. */
14140
+ var HISTORY_NONE_CAPS = [
14141
+ "audio-metrics",
14142
+ "automation-control",
14143
+ "camera-streams",
14144
+ "color",
14145
+ "control",
14146
+ "day-night",
14147
+ "device-discovery",
14148
+ "doorbell",
14149
+ "event-emitter",
14150
+ "feature-probe",
14151
+ "group-commands",
14152
+ "group-status",
14153
+ "image",
14154
+ "image-settings",
14155
+ "intercom",
14156
+ "motion-trigger",
14157
+ "motion-zones",
14158
+ "native-object-detection",
14159
+ "navigation",
14160
+ "notifier",
14161
+ "privacy-mask",
14162
+ "ptz-autotrack",
14163
+ "recording-onboard",
14164
+ "recording-signal",
14165
+ "scene-monitor",
14166
+ "script-runner",
14167
+ "stream-catalog",
14168
+ "stream-signals",
14169
+ "update",
14170
+ "zone-analytics",
14171
+ "zone-rules",
14172
+ "zones"
14173
+ ];
14174
+ /** The series specs of `capName`; empty for a `'none'` cap or an unknown one. */
14175
+ function historyFieldsFor(capName) {
14176
+ return HISTORY_CATALOG[capName] ?? {};
14177
+ }
14178
+ //#endregion
14179
+ //#region src/composition/helpers/compile-history.ts
14180
+ /**
14181
+ * Project a statistics or integral helper onto a new device (D944 §3).
14182
+ * The value field is `series`: the composer fills it from history.
14183
+ */
14184
+ var NOW = {
14185
+ kind: "expression",
14186
+ expr: "now",
14187
+ bindings: {}
14188
+ };
14189
+ function series(member, publish, empty) {
14190
+ return {
14191
+ kind: "series",
14192
+ read: {
14193
+ source: member.source,
14194
+ cap: member.cap,
14195
+ fieldPath: member.fieldPath
14196
+ },
14197
+ publish,
14198
+ empty
14199
+ };
14200
+ }
14201
+ function counts(member) {
14202
+ return {
14203
+ included: series(member, "included", "offline"),
14204
+ excluded: series(member, "excluded", "offline"),
14205
+ total: series(member, "total", "offline")
14206
+ };
14207
+ }
14208
+ function declaredSeriesKind(member) {
14209
+ const field = historyFieldsFor(member.cap)[member.fieldPath];
14210
+ if (field === void 0) return null;
14211
+ return field.kind;
14212
+ }
14213
+ function historyProblems(member) {
14214
+ if (declaredSeriesKind(member) !== null) return [];
14215
+ return [problem("member-constraint", "helper.source", `${member.cap}.${member.fieldPath} has no history declaration`)];
14216
+ }
14217
+ function draft(input) {
14218
+ return {
14219
+ target: {
14220
+ kind: "new",
14221
+ type: require_err_msg.DeviceType.Sensor,
14222
+ role: input.role
14223
+ },
14224
+ helper: input.spec,
14225
+ features: [{
14226
+ kind: "fields",
14227
+ cap: input.cap,
14228
+ fields: {
14229
+ [input.field]: series(input.member, "value", input.empty),
14230
+ lastFetchedAt: NOW
14231
+ }
14232
+ }, {
14233
+ kind: "fields",
14234
+ cap: "group-status",
14235
+ fields: counts(input.member)
14236
+ }]
14237
+ };
14238
+ }
14239
+ function statisticDraft(spec, retention = require_composition.DEFAULT_HISTORY_RETENTION) {
14240
+ const problems = [...historyProblems(spec.source)];
14241
+ const kind = declaredSeriesKind(spec.source);
14242
+ if (kind === "enum") problems.push(problem("kind-mismatch", "helper.source", "a statistic reads a number or a boolean, not a state"));
14243
+ if (spec.stat === "sum" && kind !== "counter") problems.push(problem("kind-mismatch", "helper.stat", "a gauge has no sum — that is the integral template"));
14244
+ const tier = require_composition.planStatisticTier(spec.window, retention);
14245
+ if (!tier.ok) problems.push(problem("retention", "helper.window", tier.reason));
14246
+ return {
14247
+ problems,
14248
+ draft: draft({
14249
+ role: require_err_msg.DeviceRole.NumericSensor,
14250
+ cap: "numeric-sensor",
14251
+ field: "value",
14252
+ empty: "null",
14253
+ spec,
14254
+ member: spec.source
14255
+ })
14256
+ };
14257
+ }
14258
+ function integralDraft(spec, retention = require_composition.DEFAULT_HISTORY_RETENTION) {
14259
+ const problems = [...historyProblems(spec.source)];
14260
+ const kind = declaredSeriesKind(spec.source);
14261
+ const watts = spec.source.cap === "power-meter" && spec.source.fieldPath === "watts";
14262
+ if (kind === "counter" || kind === "boolean" || kind === "enum") problems.push(problem("kind-mismatch", "helper.source", "an integral reads an instantaneous gauge, not a counter or a state"));
14263
+ if (spec.output === "energy" && !watts) problems.push(problem("kind-mismatch", "helper.output", "energy is the integral of power-meter.watts; another reading uses the meter"));
14264
+ if (spec.output === "meter" && watts) problems.push(problem("kind-mismatch", "helper.output", "power integrates to power-meter.kwhTotal, which energy dashboards already read"));
14265
+ const tier = require_composition.planResetTier(spec.reset, retention);
14266
+ if (!tier.ok) problems.push(problem("retention", "helper.reset", tier.reason));
14267
+ const energy = spec.output === "energy";
14268
+ return {
14269
+ problems,
14270
+ draft: draft({
14271
+ role: energy ? require_err_msg.DeviceRole.EnergySensor : require_err_msg.DeviceRole.NumericSensor,
14272
+ cap: energy ? "power-meter" : "meter",
14273
+ field: energy ? "kwhTotal" : "value",
14274
+ empty: "offline",
14275
+ spec,
14276
+ member: spec.source
14277
+ })
14278
+ };
14279
+ }
14280
+ //#endregion
13726
14281
  //#region src/composition/helpers/compile.ts
13727
14282
  function sameSource(a, b) {
13728
14283
  return a.addonId === b.addonId && a.stableId === b.stableId;
@@ -13866,8 +14421,29 @@ function compileAppliance(spec) {
13866
14421
  });
13867
14422
  }
13868
14423
  /** Compile a helper template to a new-device composition. Refusals are named. */
13869
- function compileHelper(spec) {
13870
- if (spec.kind === "appliance") return compileAppliance(spec);
14424
+ function compileHelper(spec, retention = require_composition.DEFAULT_HISTORY_RETENTION) {
14425
+ switch (spec.kind) {
14426
+ case "group": return compileGroup(spec);
14427
+ case "appliance": return compileAppliance(spec);
14428
+ case "statistic": {
14429
+ const built = statisticDraft(spec, retention);
14430
+ if (built.problems.length > 0) return {
14431
+ ok: false,
14432
+ problems: built.problems
14433
+ };
14434
+ return parseDraft(built.draft);
14435
+ }
14436
+ case "integral": {
14437
+ const built = integralDraft(spec, retention);
14438
+ if (built.problems.length > 0) return {
14439
+ ok: false,
14440
+ problems: built.problems
14441
+ };
14442
+ return parseDraft(built.draft);
14443
+ }
14444
+ }
14445
+ }
14446
+ function compileGroup(spec) {
13871
14447
  const template = groupTemplate(spec.templateId);
13872
14448
  if (template === null) return {
13873
14449
  ok: false,
@@ -13898,6 +14474,7 @@ function sameHelperBody(stored, compiled) {
13898
14474
  }
13899
14475
  function templateDeviceType(spec) {
13900
14476
  if (spec.kind === "appliance") return require_composition.applianceDeviceType(spec.appliance);
14477
+ if (spec.kind !== "group") return null;
13901
14478
  return groupTemplate(spec.templateId)?.memberDeviceType ?? null;
13902
14479
  }
13903
14480
  //#endregion
@@ -13907,6 +14484,7 @@ function templateDeviceType(spec) {
13907
14484
  * this spec's, and members that report a quantity must share one (D944 §4).
13908
14485
  */
13909
14486
  function quantityProblems(spec, facts) {
14487
+ if (spec.kind !== "group") return [];
13910
14488
  const template = groupTemplate(spec.templateId);
13911
14489
  if (template === null || template.family !== "numeric") return [];
13912
14490
  const known = spec.members.flatMap((member, index) => {
@@ -13922,6 +14500,7 @@ function quantityProblems(spec, facts) {
13922
14500
  return [problem("mixed-quantity", "helper.members", `a numeric group requires one quantity; members report ${distinct.join(" and ")}`)];
13923
14501
  }
13924
14502
  function deviceTypeProblems(spec, facts) {
14503
+ if (spec.kind !== "group") return [];
13925
14504
  const template = groupTemplate(spec.templateId);
13926
14505
  if (template === null) return [];
13927
14506
  return spec.members.flatMap((member, index) => {
@@ -13941,6 +14520,7 @@ function helperSaveProblems(composition, facts) {
13941
14520
  if (!compiled.ok) return compiled.problems;
13942
14521
  if (!sameHelperBody(composition, compiled.composition)) return [problem("helper-mismatch", "helper", "the stored features are not this template — the helper spec is the only writer")];
13943
14522
  if (spec.kind === "appliance") return applianceMemberProblems(spec.member, facts);
14523
+ if (spec.kind !== "group") return [];
13944
14524
  return [...quantityProblems(spec, facts), ...deviceTypeProblems(spec, facts)];
13945
14525
  }
13946
14526
  function applianceMemberProblems(member, facts) {
@@ -66693,6 +67273,46 @@ var lockControlCapability = {
66693
67273
  volatileStateFields: ["lastChangedAt"]
66694
67274
  };
66695
67275
  //#endregion
67276
+ //#region src/capabilities/meter.cap.ts
67277
+ /**
67278
+ * A monotonic total between resets (D944). Energy uses `power-meter.kwhTotal`
67279
+ * so dashboards keep one series; every other instantaneous reading lands here.
67280
+ * `value` is the time integral in the source quantity's accumulated base
67281
+ * (base-unit seconds, or kWh on the power meter). `null` is a gap, never zero.
67282
+ */
67283
+ var MeterStatusSchema = zod.z.object({
67284
+ value: zod.z.number().nullable().meta(require_sleep.readingMeta("device", { label: "Total" })),
67285
+ lastFetchedAt: zod.z.number()
67286
+ });
67287
+ var meterCapability = {
67288
+ name: "meter",
67289
+ scope: "device",
67290
+ deviceNative: true,
67291
+ mode: "singleton",
67292
+ deviceTypes: [require_err_msg.DeviceType.Sensor],
67293
+ methods: {},
67294
+ status: {
67295
+ schema: MeterStatusSchema,
67296
+ kind: "push"
67297
+ },
67298
+ runtimeState: MeterStatusSchema,
67299
+ /**
67300
+ * Runtime-state durability: **restored** — the total is a cache of the
67301
+ * history integral. A restart shows it only until the history pass
67302
+ * recomputes the open period; it is not an in-memory buffer.
67303
+ *
67304
+ * See `RuntimeStateDurability`. Enforced by
67305
+ * `scripts/check-runtime-state-durability.ts`.
67306
+ */
67307
+ durability: "restored",
67308
+ history: { fields: { value: {
67309
+ kind: "counter",
67310
+ deadband: .001,
67311
+ minIntervalMs: 6e4
67312
+ } } },
67313
+ volatileStateFields: ["lastFetchedAt"]
67314
+ };
67315
+ //#endregion
66696
67316
  //#region src/capabilities/media-player.cap.ts
66697
67317
  /**
66698
67318
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -78153,6 +78773,35 @@ function sourcePickForTemplate(template) {
78153
78773
  exclude: []
78154
78774
  };
78155
78775
  }
78776
+ /** A statistic or integral reads one field that declares history. */
78777
+ function sourcePickForHistory(kind) {
78778
+ return {
78779
+ purpose: "historised",
78780
+ multiple: false,
78781
+ max: 1,
78782
+ deviceTypes: [],
78783
+ accept: historyAccept(kind),
78784
+ history: {
78785
+ required: true,
78786
+ minRetentionMs: null
78787
+ },
78788
+ mustBindCaps: [],
78789
+ exclude: []
78790
+ };
78791
+ }
78792
+ function historyAccept(kind) {
78793
+ const fields = [];
78794
+ for (const cap of Object.keys(HISTORY_CATALOG)) for (const [fieldPath, field] of Object.entries(historyFieldsFor(cap))) {
78795
+ if (field.kind === "enum") continue;
78796
+ if (kind === "integral" && field.kind !== "gauge") continue;
78797
+ fields.push({
78798
+ cap,
78799
+ fieldPath,
78800
+ valueKind: field.kind === "boolean" ? "boolean" : "number"
78801
+ });
78802
+ }
78803
+ return fields;
78804
+ }
78156
78805
  //#endregion
78157
78806
  //#region src/units/unit-table.ts
78158
78807
  /**
@@ -78779,6 +79428,13 @@ function evaluateCompositionField(input) {
78779
79428
  case "from": return fromReading(input.read(source), source);
78780
79429
  case "expression": return expressionOutcome(source, input.read, input.now, input.stateful);
78781
79430
  case "aggregate": return aggregateField(source, input.read);
79431
+ case "series": return {
79432
+ state: "unavailable",
79433
+ value: null,
79434
+ reason: "a series field is written from device history",
79435
+ fatal: false,
79436
+ confirmed: false
79437
+ };
78782
79438
  case "code": return {
78783
79439
  state: "unavailable",
78784
79440
  value: null,
@@ -81553,6 +82209,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
81553
82209
  lawnMowerControl: lawnMowerControlCapability,
81554
82210
  lockControl: lockControlCapability,
81555
82211
  mediaPlayer: mediaPlayerCapability,
82212
+ meter: meterCapability,
81556
82213
  motion: motionCapability,
81557
82214
  motionTrigger: motionTriggerCapability,
81558
82215
  motionZones: motionZonesCapability,
@@ -87846,6 +88503,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
87846
88503
  access: "create",
87847
88504
  role: "admin"
87848
88505
  },
88506
+ "meter.getStatus": {
88507
+ capName: "meter",
88508
+ capScope: "device",
88509
+ addonId: null,
88510
+ access: "view",
88511
+ role: "viewer"
88512
+ },
87849
88513
  "metricsProvider.collectSnapshot": {
87850
88514
  capName: "metrics-provider",
87851
88515
  capScope: "system",
@@ -93454,6 +94118,7 @@ var KNOWN_CAP_NAMES = [
93454
94118
  "login-method",
93455
94119
  "media-player",
93456
94120
  "mesh-network",
94121
+ "meter",
93457
94122
  "metrics-provider",
93458
94123
  "model-convert",
93459
94124
  "model-distributor",
@@ -93593,6 +94258,7 @@ var DEVICE_CAP_NAMES = [
93593
94258
  "lawn-mower-control",
93594
94259
  "lock-control",
93595
94260
  "media-player",
94261
+ "meter",
93596
94262
  "motion",
93597
94263
  "motion-detection",
93598
94264
  "motion-trigger",
@@ -97189,6 +97855,17 @@ var SENSOR_CAP_VOCABULARY = {
97189
97855
  }],
97190
97856
  events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
97191
97857
  },
97858
+ meter: {
97859
+ scope: "device",
97860
+ noun: t("Meter", "Contatore"),
97861
+ state: [{
97862
+ kind: "numeric",
97863
+ field: "value",
97864
+ quantity: t("the total", "il totale"),
97865
+ label: t("Total", "Totale"),
97866
+ icon: "gauge"
97867
+ }]
97868
+ },
97192
97869
  "numeric-sensor": {
97193
97870
  scope: "device",
97194
97871
  noun: t("Sensor", "Sensore"),
@@ -99387,6 +100064,7 @@ var CAP_NAMES_WITH_STATUS = [
99387
100064
  "lawn-mower-control",
99388
100065
  "lock-control",
99389
100066
  "media-player",
100067
+ "meter",
99390
100068
  "motion",
99391
100069
  "motion-trigger",
99392
100070
  "motion-zones",
@@ -99522,6 +100200,7 @@ var CAPABILITY_NAMES = {
99522
100200
  loginMethod: "login-method",
99523
100201
  mediaPlayer: "media-player",
99524
100202
  meshNetwork: "mesh-network",
100203
+ meter: "meter",
99525
100204
  metricsProvider: "metrics-provider",
99526
100205
  modelConvert: "model-convert",
99527
100206
  modelDistributor: "model-distributor",
@@ -99996,6 +100675,10 @@ var CAPABILITY_ROUTER_KEYS = [
99996
100675
  key: "meshNetwork",
99997
100676
  name: "mesh-network"
99998
100677
  },
100678
+ {
100679
+ key: "meter",
100680
+ name: "meter"
100681
+ },
99999
100682
  {
100000
100683
  key: "metricsProvider",
100001
100684
  name: "metrics-provider"
@@ -100451,6 +101134,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
100451
101134
  loginMethodCapability,
100452
101135
  mediaPlayerCapability,
100453
101136
  meshNetworkCapability,
101137
+ meterCapability,
100454
101138
  metricsProviderCapability,
100455
101139
  modelConvertCapability,
100456
101140
  modelDistributorCapability,
@@ -101717,6 +102401,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
101717
102401
  form: "single",
101718
102402
  optional: false
101719
102403
  }],
102404
+ "meter.getStatus": [{
102405
+ name: "deviceId",
102406
+ form: "single",
102407
+ optional: false
102408
+ }],
101720
102409
  "motion.getStatus": [{
101721
102410
  name: "deviceId",
101722
102411
  form: "single",
@@ -103528,7 +104217,7 @@ function getCapsByProviderKind(kind) {
103528
104217
  //#region src/generated/runtime-state-durability.ts
103529
104218
  /**
103530
104219
  * Per-cap runtime-state policy, projected from every `*.cap.ts` that declares
103531
- * `runtimeState`. 74 caps: 38 `restored`, 36 `session`.
104220
+ * `runtimeState`. 75 caps: 39 `restored`, 36 `session`.
103532
104221
  *
103533
104222
  * A cap absent from this map has no runtime-state slice at all. A cap PRESENT
103534
104223
  * with `durability: 'session'` has one and has decided not to keep it.
@@ -103690,6 +104379,10 @@ var RUNTIME_STATE_POLICY = {
103690
104379
  durability: "session",
103691
104380
  volatileFields: []
103692
104381
  },
104382
+ "meter": {
104383
+ durability: "restored",
104384
+ volatileFields: ["lastFetchedAt"]
104385
+ },
103693
104386
  "motion": {
103694
104387
  durability: "session",
103695
104388
  volatileFields: []
@@ -103871,6 +104564,7 @@ var RESTORED_CAP_NAMES = [
103871
104564
  "humidity-sensor",
103872
104565
  "image-settings",
103873
104566
  "lock-control",
104567
+ "meter",
103874
104568
  "motion-zones",
103875
104569
  "native-object-detection",
103876
104570
  "network-link",
@@ -103993,438 +104687,6 @@ var BucketAccumulator = class {
103993
104687
  }
103994
104688
  };
103995
104689
  //#endregion
103996
- //#region src/generated/history-catalog.ts
103997
- /**
103998
- * Cap history catalog, projected from every `*.cap.ts` `history` block.
103999
- * 41 caps with series (75 series), 32 caps answered `'none'`.
104000
- * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
104001
- */
104002
- var HISTORY_CATALOG = {
104003
- "air-quality-sensor": {
104004
- "co2Ppm": {
104005
- kind: "gauge",
104006
- unit: "ppm",
104007
- deadband: 5
104008
- },
104009
- "vocPpb": {
104010
- kind: "gauge",
104011
- unit: "ppb",
104012
- deadband: 5
104013
- },
104014
- "pm25": {
104015
- kind: "gauge",
104016
- unit: "µg/m³",
104017
- deadband: 1
104018
- },
104019
- "pm10": {
104020
- kind: "gauge",
104021
- unit: "µg/m³",
104022
- deadband: 1
104023
- },
104024
- "aqi": {
104025
- kind: "gauge",
104026
- unit: "count",
104027
- deadband: 1
104028
- }
104029
- },
104030
- "alarm-panel": { "state": {
104031
- kind: "enum",
104032
- values: [
104033
- "disarmed",
104034
- "armed_home",
104035
- "armed_away",
104036
- "armed_night",
104037
- "armed_vacation",
104038
- "armed_custom_bypass",
104039
- "arming",
104040
- "disarming",
104041
- "pending",
104042
- "triggered"
104043
- ]
104044
- } },
104045
- "ambient-light-sensor": { "lux": {
104046
- kind: "gauge",
104047
- unit: "lx",
104048
- deadbandPct: 10,
104049
- minIntervalMs: 6e4
104050
- } },
104051
- "battery": {
104052
- "percentage": {
104053
- kind: "gauge",
104054
- unit: "%"
104055
- },
104056
- "volts": {
104057
- kind: "gauge",
104058
- unit: "V"
104059
- }
104060
- },
104061
- "binary": { "on": { kind: "boolean" } },
104062
- "brightness": { "percentage": {
104063
- kind: "gauge",
104064
- unit: "%",
104065
- minIntervalMs: 0
104066
- } },
104067
- "carbon-monoxide": { "detected": { kind: "boolean" } },
104068
- "climate-control": {
104069
- "currentTemp": {
104070
- kind: "gauge",
104071
- unit: "°C",
104072
- deadband: .1
104073
- },
104074
- "currentHumidity": {
104075
- kind: "gauge",
104076
- unit: "%",
104077
- deadband: .5
104078
- },
104079
- "target": {
104080
- kind: "gauge",
104081
- unit: "°C",
104082
- minIntervalMs: 0
104083
- },
104084
- "targetHigh": {
104085
- kind: "gauge",
104086
- unit: "°C",
104087
- minIntervalMs: 0
104088
- },
104089
- "targetLow": {
104090
- kind: "gauge",
104091
- unit: "°C",
104092
- minIntervalMs: 0
104093
- }
104094
- },
104095
- "connectivity": { "connected": { kind: "boolean" } },
104096
- "contact": { "entryOpen": { kind: "boolean" } },
104097
- "cover": { "position": {
104098
- kind: "gauge",
104099
- unit: "%",
104100
- minIntervalMs: 0
104101
- } },
104102
- "device-status": { "online": { kind: "boolean" } },
104103
- "dishwasher": {
104104
- "progressPercent": {
104105
- kind: "gauge",
104106
- unit: "%",
104107
- deadband: 2
104108
- },
104109
- "state": {
104110
- kind: "enum",
104111
- values: [
104112
- "idle",
104113
- "running",
104114
- "paused",
104115
- "finished",
104116
- "error",
104117
- "unavailable"
104118
- ]
104119
- },
104120
- "operationState": {
104121
- kind: "enum",
104122
- values: [
104123
- "Inactive",
104124
- "Ready",
104125
- "DelayedStart",
104126
- "Run",
104127
- "Pause",
104128
- "ActionRequired",
104129
- "Finished",
104130
- "Error",
104131
- "Aborting"
104132
- ]
104133
- },
104134
- "remainingSeconds": {
104135
- kind: "gauge",
104136
- unit: "s",
104137
- minIntervalMs: 6e4
104138
- },
104139
- "doorOpen": { kind: "boolean" },
104140
- "powerOn": { kind: "boolean" }
104141
- },
104142
- "enum-sensor": { "value": {
104143
- kind: "enum",
104144
- skipWhenSet: "timestamp"
104145
- } },
104146
- "fan-control": {
104147
- "percentage": {
104148
- kind: "gauge",
104149
- unit: "%",
104150
- minIntervalMs: 0
104151
- },
104152
- "oscillating": { kind: "boolean" }
104153
- },
104154
- "flood": { "flooded": { kind: "boolean" } },
104155
- "gas": { "detected": { kind: "boolean" } },
104156
- "heating-valve": { "position": {
104157
- kind: "gauge",
104158
- unit: "%",
104159
- deadband: 1
104160
- } },
104161
- "humidifier": {
104162
- "currentHumidity": {
104163
- kind: "gauge",
104164
- unit: "%",
104165
- deadband: .5
104166
- },
104167
- "on": { kind: "boolean" }
104168
- },
104169
- "humidity-sensor": { "percent": {
104170
- kind: "gauge",
104171
- unit: "%",
104172
- deadband: .5
104173
- } },
104174
- "lawn-mower-control": { "batteryLevel": {
104175
- kind: "gauge",
104176
- unit: "%",
104177
- deadband: 2
104178
- } },
104179
- "lock-control": { "state": {
104180
- kind: "enum",
104181
- values: [
104182
- "locked",
104183
- "unlocked",
104184
- "locking",
104185
- "unlocking",
104186
- "jammed"
104187
- ]
104188
- } },
104189
- "media-player": {
104190
- "volumeLevel": {
104191
- kind: "gauge",
104192
- unit: "%",
104193
- deadband: 1
104194
- },
104195
- "isMuted": { kind: "boolean" }
104196
- },
104197
- "motion": { "detected": {
104198
- kind: "boolean",
104199
- excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
104200
- } },
104201
- "network-link": {
104202
- "signalPercent": {
104203
- kind: "gauge",
104204
- unit: "%",
104205
- deadband: 3,
104206
- minIntervalMs: 6e4
104207
- },
104208
- "rssiDbm": {
104209
- kind: "gauge",
104210
- unit: "dBm",
104211
- deadband: 2,
104212
- minIntervalMs: 6e4
104213
- }
104214
- },
104215
- "numeric-sensor": { "value": {
104216
- kind: "gauge",
104217
- minIntervalMs: 3e4
104218
- } },
104219
- "pet-feeder": {
104220
- "foodLevel": { kind: "gauge" },
104221
- "food1": { kind: "gauge" },
104222
- "food2": { kind: "gauge" },
104223
- "batteryPower": {
104224
- kind: "gauge",
104225
- unit: "%",
104226
- deadband: 2
104227
- },
104228
- "desiccantLeftDays": {
104229
- kind: "gauge",
104230
- unit: "s"
104231
- }
104232
- },
104233
- "power-meter": {
104234
- "watts": {
104235
- kind: "gauge",
104236
- unit: "W",
104237
- deadband: 1,
104238
- minIntervalMs: 3e4
104239
- },
104240
- "kwhTotal": {
104241
- kind: "counter",
104242
- unit: "kWh",
104243
- deadband: .01,
104244
- minIntervalMs: 6e4
104245
- },
104246
- "volts": {
104247
- kind: "gauge",
104248
- unit: "V",
104249
- deadband: 1,
104250
- minIntervalMs: 3e4
104251
- },
104252
- "amps": {
104253
- kind: "gauge",
104254
- unit: "A",
104255
- deadband: .05,
104256
- minIntervalMs: 3e4
104257
- },
104258
- "va": {
104259
- kind: "gauge",
104260
- unit: "VA",
104261
- deadband: 1,
104262
- minIntervalMs: 3e4
104263
- },
104264
- "powerFactor": {
104265
- kind: "gauge",
104266
- unit: "ratio",
104267
- deadband: .01,
104268
- minIntervalMs: 6e4
104269
- }
104270
- },
104271
- "presence": { "batteryPercent": {
104272
- kind: "gauge",
104273
- unit: "%",
104274
- deadband: 1
104275
- } },
104276
- "pressure-sensor": { "hpa": {
104277
- kind: "gauge",
104278
- unit: "hPa",
104279
- deadband: .1
104280
- } },
104281
- "running-state": { "running": { kind: "boolean" } },
104282
- "smoke": { "detected": { kind: "boolean" } },
104283
- "stream-params": {
104284
- "main.bitrate": {
104285
- kind: "gauge",
104286
- unit: "kbps"
104287
- },
104288
- "main.framerate": {
104289
- kind: "gauge",
104290
- unit: "fps"
104291
- },
104292
- "sub.bitrate": {
104293
- kind: "gauge",
104294
- unit: "kbps"
104295
- },
104296
- "sub.framerate": {
104297
- kind: "gauge",
104298
- unit: "fps"
104299
- }
104300
- },
104301
- "switch": { "on": { kind: "boolean" } },
104302
- "tamper": { "tampered": { kind: "boolean" } },
104303
- "temperature-sensor": { "celsius": {
104304
- kind: "gauge",
104305
- unit: "°C",
104306
- deadband: .1
104307
- } },
104308
- "vacuum-control": { "batteryLevel": {
104309
- kind: "gauge",
104310
- unit: "%",
104311
- deadband: 2
104312
- } },
104313
- "valve": { "position": {
104314
- kind: "gauge",
104315
- unit: "%",
104316
- minIntervalMs: 0
104317
- } },
104318
- "vibration": { "detected": { kind: "boolean" } },
104319
- "water-heater": {
104320
- "currentTemp": {
104321
- kind: "gauge",
104322
- unit: "°C",
104323
- deadband: .5
104324
- },
104325
- "targetTemp": {
104326
- kind: "gauge",
104327
- unit: "°C",
104328
- minIntervalMs: 0
104329
- }
104330
- },
104331
- "weather": {
104332
- "temperature": {
104333
- kind: "gauge",
104334
- unit: "°C",
104335
- deadband: .2
104336
- },
104337
- "humidity": {
104338
- kind: "gauge",
104339
- unit: "%",
104340
- deadband: 1
104341
- },
104342
- "pressure": {
104343
- kind: "gauge",
104344
- unit: "hPa",
104345
- deadband: .5
104346
- },
104347
- "windSpeed": {
104348
- kind: "gauge",
104349
- unit: "m/s",
104350
- deadband: .5
104351
- }
104352
- }
104353
- };
104354
- /**
104355
- * Keyed-array series (D917), projected from every `history.items` block:
104356
- * 1 caps (3 item fields). The item key is the series SCOPE;
104357
- * the series key is `cap:<capName>.<path>[].<field>`.
104358
- */
104359
- var HISTORY_ITEM_CATALOG = { "consumables": {
104360
- path: "items",
104361
- key: "key",
104362
- label: "label",
104363
- fields: {
104364
- "level": {
104365
- kind: "gauge",
104366
- unit: "%",
104367
- deadband: 2,
104368
- displayName: "Level"
104369
- },
104370
- "status": {
104371
- kind: "enum",
104372
- displayName: "Status",
104373
- values: [
104374
- "ok",
104375
- "low",
104376
- "empty",
104377
- "full",
104378
- "replace"
104379
- ]
104380
- },
104381
- "remaining.value": {
104382
- kind: "gauge",
104383
- deadband: 1,
104384
- displayName: "Remaining"
104385
- }
104386
- }
104387
- } };
104388
- /** Caps that declared `history: 'none'`, sorted. */
104389
- var HISTORY_NONE_CAPS = [
104390
- "audio-metrics",
104391
- "automation-control",
104392
- "camera-streams",
104393
- "color",
104394
- "control",
104395
- "day-night",
104396
- "device-discovery",
104397
- "doorbell",
104398
- "event-emitter",
104399
- "feature-probe",
104400
- "group-commands",
104401
- "group-status",
104402
- "image",
104403
- "image-settings",
104404
- "intercom",
104405
- "motion-trigger",
104406
- "motion-zones",
104407
- "native-object-detection",
104408
- "navigation",
104409
- "notifier",
104410
- "privacy-mask",
104411
- "ptz-autotrack",
104412
- "recording-onboard",
104413
- "recording-signal",
104414
- "scene-monitor",
104415
- "script-runner",
104416
- "stream-catalog",
104417
- "stream-signals",
104418
- "update",
104419
- "zone-analytics",
104420
- "zone-rules",
104421
- "zones"
104422
- ];
104423
- /** The series specs of `capName`; empty for a `'none'` cap or an unknown one. */
104424
- function historyFieldsFor(capName) {
104425
- return HISTORY_CATALOG[capName] ?? {};
104426
- }
104427
- //#endregion
104428
104690
  //#region src/capabilities/runtime-field-unit.ts
104429
104691
  /**
104430
104692
  * The unit a composed-device field row offers convert-unit from (D941, D944).
@@ -115855,6 +116117,7 @@ exports.BrokerTestConnectionResultSchema = TestConnectionResultSchema;
115855
116117
  exports.BrokerUnsubscribeInputSchema = UnsubscribeInputSchema;
115856
116118
  exports.BucketAccumulator = BucketAccumulator;
115857
116119
  exports.BulkRecordSchema = BulkRecordSchema;
116120
+ exports.CALENDAR_PERIODS = require_composition.CALENDAR_PERIODS;
115858
116121
  exports.CALLER_STAMPED_CAPABILITIES = require_sleep.CALLER_STAMPED_CAPABILITIES;
115859
116122
  exports.CAMERA_SENSORS_NOT_LOADED = CAMERA_SENSORS_NOT_LOADED;
115860
116123
  exports.CAMERA_SENSORS_SETTINGS_KEY = CAMERA_SENSORS_SETTINGS_KEY;
@@ -115923,6 +116186,7 @@ exports.CalendarPreferenceEntrySchema = CalendarPreferenceEntrySchema;
115923
116186
  exports.CalendarPreferencesSchema = CalendarPreferencesSchema;
115924
116187
  exports.CalendarSetPreferenceInputSchema = CalendarSetPreferenceInputSchema;
115925
116188
  exports.CalendarSourceKindSchema = CalendarSourceKindSchema;
116189
+ exports.CalendarWindowSchema = require_composition.CalendarWindowSchema;
115926
116190
  exports.CamProfileSchema = require_sleep.CamProfileSchema;
115927
116191
  exports.CamStreamDescriptorSchema = CamStreamDescriptorSchema;
115928
116192
  exports.CamStreamKindSchema = require_sleep.CamStreamKindSchema;
@@ -116053,6 +116317,7 @@ exports.CompositionProblemCodeSchema = CompositionProblemCodeSchema;
116053
116317
  exports.CompositionProblemSchema = CompositionProblemSchema;
116054
116318
  exports.CompositionRunStatusSchema = CompositionRunStatusSchema;
116055
116319
  exports.CompositionSchema = require_composition.CompositionSchema;
116320
+ exports.CompositionSeriesSourceSchema = require_composition.CompositionSeriesSourceSchema;
116056
116321
  exports.CompositionSourceRefSchema = require_composition.CompositionSourceRefSchema;
116057
116322
  exports.CompositionStateReadSchema = CompositionStateReadSchema;
116058
116323
  exports.CompositionTargetSchema = require_composition.CompositionTargetSchema;
@@ -116104,6 +116369,7 @@ exports.DATABASE_SNAPSHOT_TIMEOUT_MS = DATABASE_SNAPSHOT_TIMEOUT_MS;
116104
116369
  exports.DATAPLANE_SECRET_HEADER = require_sleep.DATAPLANE_SECRET_HEADER;
116105
116370
  exports.DATA_STORE_DATABASES = DATA_STORE_DATABASES;
116106
116371
  exports.DAYS_PER_WEEK = DAYS_PER_WEEK;
116372
+ exports.DAY_MS = require_composition.DAY_MS;
116107
116373
  exports.DAY_NAMES = DAY_NAMES;
116108
116374
  exports.DECLARED_DEVICE_SWEEP_LIMIT = DECLARED_DEVICE_SWEEP_LIMIT;
116109
116375
  exports.DECLARED_INTEGRATION_FIXED_KEY = DECLARED_INTEGRATION_FIXED_KEY;
@@ -116123,6 +116389,7 @@ exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
116123
116389
  exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
116124
116390
  exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
116125
116391
  exports.DEFAULT_HEADROOM = DEFAULT_HEADROOM;
116392
+ exports.DEFAULT_HISTORY_RETENTION = require_composition.DEFAULT_HISTORY_RETENTION;
116126
116393
  exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
116127
116394
  exports.DEFAULT_MIN_SESSIONS_PER_DEVICE = DEFAULT_MIN_SESSIONS_PER_DEVICE;
116128
116395
  exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
@@ -116418,10 +116685,14 @@ exports.HF_REPO = require_sleep.HF_REPO;
116418
116685
  exports.HISTORY_BUCKET_MS = HISTORY_BUCKET_MS;
116419
116686
  exports.HISTORY_CATALOG = HISTORY_CATALOG;
116420
116687
  exports.HISTORY_DEFAULT_MIN_INTERVAL_MS = require_sleep.HISTORY_DEFAULT_MIN_INTERVAL_MS;
116688
+ exports.HISTORY_FAST_MS = require_composition.HISTORY_FAST_MS;
116421
116689
  exports.HISTORY_ITEM_CATALOG = HISTORY_ITEM_CATALOG;
116422
116690
  exports.HISTORY_NONE_CAPS = HISTORY_NONE_CAPS;
116691
+ exports.HISTORY_SLOW_MS = require_composition.HISTORY_SLOW_MS;
116692
+ exports.HISTORY_TIERS = require_composition.HISTORY_TIERS;
116423
116693
  exports.HISTORY_UNIT_LABELS = require_sleep.HISTORY_UNIT_LABELS;
116424
116694
  exports.HOURS_PER_DAY = HOURS_PER_DAY;
116695
+ exports.HOUR_MS = require_composition.HOUR_MS;
116425
116696
  exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
116426
116697
  exports.HUB_MDNS_QUERY_NAME = HUB_MDNS_QUERY_NAME;
116427
116698
  exports.HUB_MDNS_ROLE = HUB_MDNS_ROLE;
@@ -116450,6 +116721,7 @@ exports.ICON_VIEWER_MODULES = ICON_VIEWER_MODULES;
116450
116721
  exports.INFERENCE_DEVICE_EXCLUSION_REASONS = INFERENCE_DEVICE_EXCLUSION_REASONS;
116451
116722
  exports.INITIAL_PULSE = INITIAL_PULSE;
116452
116723
  exports.INITIAL_SPAN = INITIAL_SPAN;
116724
+ exports.INTEGRAL_OUTPUTS = require_composition.INTEGRAL_OUTPUTS;
116453
116725
  exports.INVERTIBLE_CAPS = INVERTIBLE_CAPS;
116454
116726
  exports.IconKeySchema = IconKeySchema;
116455
116727
  exports.ImageContractSchema = ImageContractSchema;
@@ -116464,6 +116736,7 @@ exports.ImportModelBundleResultSchema = ImportModelBundleResultSchema;
116464
116736
  exports.InferenceDeviceExclusionReasonSchema = InferenceDeviceExclusionReasonSchema;
116465
116737
  exports.IngestOwnerSchema = IngestOwnerSchema;
116466
116738
  exports.InstalledPackageSchema = InstalledPackageSchema;
116739
+ exports.IntegralHelperSpecSchema = require_composition.IntegralHelperSpecSchema;
116467
116740
  exports.IntegrationLiteSchema = IntegrationLiteSchema;
116468
116741
  exports.IntegrationWithStateSchema = IntegrationWithStateSchema;
116469
116742
  exports.IntercomAbilitySchema = IntercomAbilitySchema;
@@ -116473,6 +116746,7 @@ exports.KEYCHAIN_MAX_REFS_PER_CALL = KEYCHAIN_MAX_REFS_PER_CALL;
116473
116746
  exports.KEYCHAIN_RESET_CONFIRMATION = KEYCHAIN_RESET_CONFIRMATION;
116474
116747
  exports.KEYCHAIN_RESET_TRIGGER_ACTOR = KEYCHAIN_RESET_TRIGGER_ACTOR;
116475
116748
  exports.KNOWN_CAP_NAMES = KNOWN_CAP_NAMES;
116749
+ exports.KWH_PER_WATT_MS = require_composition.KWH_PER_WATT_MS;
116476
116750
  exports.KeptReasonSchema = KeptReasonSchema;
116477
116751
  exports.KeyEventSchema = KeyEventSchema;
116478
116752
  exports.KeychainAdminSecretSchema = KeychainAdminSecretSchema;
@@ -116622,6 +116896,8 @@ exports.MEDIA_PRESENCE_OWNER_KINDS = MEDIA_PRESENCE_OWNER_KINDS;
116622
116896
  exports.METHOD_ACCESS_MAP = METHOD_ACCESS_MAP;
116623
116897
  exports.METHOD_DEVICE_SELECTORS = METHOD_DEVICE_SELECTORS;
116624
116898
  exports.MINUTES_PER_DAY = MINUTES_PER_DAY;
116899
+ exports.MINUTE_MS = require_composition.MINUTE_MS;
116900
+ exports.MIN_CUSTOM_MINUTES = require_composition.MIN_CUSTOM_MINUTES;
116625
116901
  exports.MIN_SCRUBBED_LENGTH = require_sleep.MIN_SCRUBBED_LENGTH;
116626
116902
  exports.MIN_SESSIONS_PER_DEVICE_RANGE = MIN_SESSIONS_PER_DEVICE_RANGE;
116627
116903
  exports.MODEL_FORMATS = require_sleep.MODEL_FORMATS;
@@ -116660,6 +116936,7 @@ exports.MediaRelocateModeSchema = MediaRelocateModeSchema;
116660
116936
  exports.MeshLeafInfoSchema = MeshLeafInfoSchema;
116661
116937
  exports.MeshPeerSchema = MeshPeerSchema;
116662
116938
  exports.MeshStatusSchema = MeshStatusSchema;
116939
+ exports.MeterStatusSchema = MeterStatusSchema;
116663
116940
  exports.MethodAccessSchema = MethodAccessSchema;
116664
116941
  exports.MigrateDeviceResultSchema = MigrateDeviceResultSchema;
116665
116942
  exports.MigrateSwitchOutcomeSchema = MigrateSwitchOutcomeSchema;
@@ -117170,12 +117447,14 @@ exports.REMOVED_MODEL_IDS = REMOVED_MODEL_IDS;
117170
117447
  exports.REMOVE_LEAF = require_sleep.REMOVE_LEAF;
117171
117448
  exports.RESERVED_BINDING_NAMES = require_composition.RESERVED_BINDING_NAMES;
117172
117449
  exports.RESERVED_COLLECTION_SOURCES = RESERVED_COLLECTION_SOURCES;
117450
+ exports.RESET_PERIODS = require_composition.RESET_PERIODS;
117173
117451
  exports.RESTORED_CAP_NAMES = RESTORED_CAP_NAMES;
117174
117452
  exports.RETRAIN_REVIEW_ADJUSTED_IOU = RETRAIN_REVIEW_ADJUSTED_IOU;
117175
117453
  exports.RETRAIN_REVIEW_MATCH_IOU = RETRAIN_REVIEW_MATCH_IOU;
117176
117454
  exports.RETRAIN_REVIEW_STATUSES = RETRAIN_REVIEW_STATUSES;
117177
117455
  exports.RETRAIN_REVISION_CONFLICT = RETRAIN_REVISION_CONFLICT;
117178
117456
  exports.REVALIDATE_AFTER_MS = require_sleep.REVALIDATE_AFTER_MS;
117457
+ exports.ROLLING_SPANS = require_composition.ROLLING_SPANS;
117179
117458
  exports.ROOM_EXAMPLE_MOTION_SOURCES = ROOM_EXAMPLE_MOTION_SOURCES;
117180
117459
  exports.ROOM_EXAMPLE_TEMPERATURE_SOURCES = ROOM_EXAMPLE_TEMPERATURE_SOURCES;
117181
117460
  exports.ROOM_OCCUPANCY_WINDOW_MS = ROOM_OCCUPANCY_WINDOW_MS;
@@ -117328,6 +117607,7 @@ exports.RetrainTransitionResultSchema = RetrainTransitionResultSchema;
117328
117607
  exports.RevConflictError = require_sleep.RevConflictError;
117329
117608
  exports.RevokeOwnDeviceCertificateResultSchema = RevokeOwnDeviceCertificateResultSchema;
117330
117609
  exports.RingBuffer = RingBuffer;
117610
+ exports.RollingWindowSchema = require_composition.RollingWindowSchema;
117331
117611
  exports.RootStepSupplySchema = RootStepSupplySchema;
117332
117612
  exports.RtpSourceSchema = RtpSourceSchema;
117333
117613
  exports.RtspRestreamEntrySchema = RtspRestreamEntrySchema;
@@ -117359,6 +117639,7 @@ exports.SECRET_REF_SCHEME = require_sleep.SECRET_REF_SCHEME;
117359
117639
  exports.SENSOR_FEATURES = SENSOR_FEATURES;
117360
117640
  exports.SENSOR_MAP = SENSOR_MAP;
117361
117641
  exports.SERIAL_CAPACITY_CAMERA_FPS = SERIAL_CAPACITY_CAMERA_FPS;
117642
+ exports.SERIES_KINDS = require_composition.SERIES_KINDS;
117362
117643
  exports.SERVER_NAME_MAX_LENGTH = SERVER_NAME_MAX_LENGTH;
117363
117644
  exports.SERVER_NAME_SETTING_KEY = SERVER_NAME_SETTING_KEY;
117364
117645
  exports.SESSION_PLACEMENT_SETTING_KEY = SESSION_PLACEMENT_SETTING_KEY;
@@ -117377,6 +117658,7 @@ exports.SSO_STATE_COOKIE_MAX_AGE_SEC = SSO_STATE_COOKIE_MAX_AGE_SEC;
117377
117658
  exports.STATE_LABELS = STATE_LABELS;
117378
117659
  exports.STATE_LABEL_KEYS = STATE_LABEL_KEYS;
117379
117660
  exports.STATIONARY_OVERLAY_STYLE = STATIONARY_OVERLAY_STYLE;
117661
+ exports.STATISTIC_STATS = require_composition.STATISTIC_STATS;
117380
117662
  exports.STORAGE_ACCESS_FALLBACK = STORAGE_ACCESS_FALLBACK;
117381
117663
  exports.STORAGE_BYTES_PER_GB = STORAGE_BYTES_PER_GB;
117382
117664
  exports.STORAGE_LOCATION_MODES = STORAGE_LOCATION_MODES;
@@ -117447,6 +117729,8 @@ exports.StaleDevicePinSchema = StaleDevicePinSchema;
117447
117729
  exports.StartEmbeddedInputSchema = StartEmbeddedInputSchema;
117448
117730
  exports.StartEnrollmentOutputSchema = StartEnrollmentOutputSchema;
117449
117731
  exports.StationaryObjectSchema = StationaryObjectSchema;
117732
+ exports.StatisticHelperSpecSchema = require_composition.StatisticHelperSpecSchema;
117733
+ exports.StatisticWindowSchema = require_composition.StatisticWindowSchema;
117450
117734
  exports.StorageAbortUploadInputSchema = AbortUploadInputSchema;
117451
117735
  exports.StorageAccessSchema = StorageAccessSchema;
117452
117736
  exports.StorageBeginDownloadInputSchema = BeginDownloadInputSchema;
@@ -117931,6 +118215,7 @@ exports.dayOfWeekToIndex = dayOfWeekToIndex;
117931
118215
  exports.declarationOwnerNodeId = declarationOwnerNodeId;
117932
118216
  exports.declarationsOf = require_sleep.declarationsOf;
117933
118217
  exports.declareLogChannel = declareLogChannel;
118218
+ exports.declaredSeriesKind = declaredSeriesKind;
117934
118219
  exports.decodeCompositionToCards = decodeCompositionToCards;
117935
118220
  exports.decodeKeyedArrayOverride = decodeKeyedArrayOverride;
117936
118221
  exports.decodePulseOverride = decodePulseOverride;
@@ -118033,6 +118318,7 @@ exports.evaluateRose = require_composition.evaluateRose;
118033
118318
  exports.evaluateSensorEdge = require_composition.evaluateSensorEdge;
118034
118319
  exports.evaluateSensorLevelEdge = require_composition.evaluateSensorLevelEdge;
118035
118320
  exports.evaluateStatefulExpressionCall = require_composition.evaluateStatefulExpressionCall;
118321
+ exports.evaluateStatistic = require_composition.evaluateStatistic;
118036
118322
  exports.evaluateZoneRules = evaluateZoneRules;
118037
118323
  exports.event = require_sleep.event;
118038
118324
  exports.eventEmitterCapability = eventEmitterCapability;
@@ -118127,6 +118413,9 @@ exports.inferExpressionKinds = inferExpressionKinds;
118127
118413
  exports.inferModelProvider = inferModelProvider;
118128
118414
  exports.ingestReading = ingestReading;
118129
118415
  exports.initialPoolMemoryState = initialPoolMemoryState;
118416
+ exports.integralCadenceMs = require_composition.integralCadenceMs;
118417
+ exports.integralDraft = integralDraft;
118418
+ exports.integrateReading = require_composition.integrateReading;
118130
118419
  exports.integrationsCapability = integrationsCapability;
118131
118420
  exports.intercomCapability = intercomCapability;
118132
118421
  exports.interpolate = interpolate;
@@ -118256,6 +118545,7 @@ exports.markdownToHtmlLite = markdownToHtmlLite;
118256
118545
  exports.markdownToText = markdownToText;
118257
118546
  exports.maskUrlCredentials = require_sleep.maskUrlCredentials;
118258
118547
  exports.matchDoAction = matchDoAction;
118548
+ exports.maxDurationMs = require_composition.maxDurationMs;
118259
118549
  exports.mayReadLocation = mayReadLocation;
118260
118550
  exports.mayWriteToLocation = mayWriteToLocation;
118261
118551
  exports.measuredCapacityFromResults = measuredCapacityFromResults;
@@ -118269,6 +118559,7 @@ exports.mergeSecretStatePaths = require_sleep.mergeSecretStatePaths;
118269
118559
  exports.mergeSettingsBags = mergeSettingsBags;
118270
118560
  exports.mergeSourceInfo = mergeSourceInfo;
118271
118561
  exports.meshNetworkCapability = meshNetworkCapability;
118562
+ exports.meterCapability = meterCapability;
118272
118563
  exports.method = require_sleep.method;
118273
118564
  exports.methodAccessForHttpMethod = methodAccessForHttpMethod;
118274
118565
  exports.methodRoleOf = methodRoleOf;
@@ -118295,6 +118586,7 @@ exports.ncMediaPolicyError = ncMediaPolicyError;
118295
118586
  exports.networkAccessCapability = networkAccessCapability;
118296
118587
  exports.networkLinkCapability = networkLinkCapability;
118297
118588
  exports.networkQualityCapability = networkQualityCapability;
118589
+ exports.nextLocalMidnight = require_composition.nextLocalMidnight;
118298
118590
  exports.nodeBenchmarkRefusals = nodeBenchmarkRefusals;
118299
118591
  exports.nodeCertificatesCapability = nodeCertificatesCapability;
118300
118592
  exports.nodePickerItems = nodePickerItems;
@@ -118321,6 +118613,8 @@ exports.objectInputDeclaresRequiredDeviceId = objectInputDeclaresRequiredDeviceI
118321
118613
  exports.occupancyScope = occupancyScope;
118322
118614
  exports.oidcConnectionsCapability = oidcConnectionsCapability;
118323
118615
  exports.omitTransientConfig = require_sleep.omitTransientConfig;
118616
+ exports.openReset = require_composition.openReset;
118617
+ exports.openStatistic = require_composition.openStatistic;
118324
118618
  exports.optionalAncestors = optionalAncestors;
118325
118619
  exports.optionalMethod = require_sleep.optionalMethod;
118326
118620
  exports.osdCapability = osdCapability;
@@ -118389,6 +118683,8 @@ exports.planItems = planItems;
118389
118683
  exports.planMotionCropRegions = planMotionCropRegions;
118390
118684
  exports.planMotionCrops = planMotionCrops;
118391
118685
  exports.planRecoveryCrops = planRecoveryCrops;
118686
+ exports.planResetTier = require_composition.planResetTier;
118687
+ exports.planStatisticTier = require_composition.planStatisticTier;
118392
118688
  exports.plateGalleryCapability = plateGalleryCapability;
118393
118689
  exports.platformProbeCapability = platformProbeCapability;
118394
118690
  exports.plusCatalogDefaultClassFloors = plusCatalogDefaultClassFloors;
@@ -118511,6 +118807,7 @@ exports.resultStandings = resultStandings;
118511
118807
  exports.retrainBoxIou = retrainBoxIou;
118512
118808
  exports.retrainRevisionConflictMessage = retrainRevisionConflictMessage;
118513
118809
  exports.roleSpec = roleSpec;
118810
+ exports.rollingDurationMs = require_composition.rollingDurationMs;
118514
118811
  exports.roomCompositionExample = roomCompositionExample;
118515
118812
  exports.rootSuppliesOf = rootSuppliesOf;
118516
118813
  exports.rootSupplyServes = rootSupplyServes;
@@ -118592,6 +118889,7 @@ exports.smokeCapability = smokeCapability;
118592
118889
  exports.smtpProviderCapability = smtpProviderCapability;
118593
118890
  exports.snapshotCapability = snapshotCapability;
118594
118891
  exports.sourcePickForAppliance = require_composition.sourcePickForAppliance;
118892
+ exports.sourcePickForHistory = sourcePickForHistory;
118595
118893
  exports.sourcePickForTemplate = sourcePickForTemplate;
118596
118894
  exports.splitTranslationRef = splitTranslationRef;
118597
118895
  exports.squareAround = squareAround;
@@ -118600,6 +118898,8 @@ exports.startMoverUnderClearance = startMoverUnderClearance;
118600
118898
  exports.startReachabilityPoll = startReachabilityPoll;
118601
118899
  exports.stateLabel = stateLabel;
118602
118900
  exports.stateVocabularyFor = stateVocabularyFor;
118901
+ exports.statisticCadenceMs = require_composition.statisticCadenceMs;
118902
+ exports.statisticDraft = statisticDraft;
118603
118903
  exports.stepModelRunsOnFormat = stepModelRunsOnFormat;
118604
118904
  exports.stepPulse = stepPulse;
118605
118905
  exports.stepSettingSource = stepSettingSource;
@@ -118711,6 +119011,7 @@ exports.viewerUiCapability = require_sleep.viewerUiCapability;
118711
119011
  exports.vocabularyActionsForDevice = actionsForDevice$1;
118712
119012
  exports.vocabularyTriggersForDevice = triggersForDevice;
118713
119013
  exports.waterHeaterCapability = waterHeaterCapability;
119014
+ exports.wattMillisecondsToKwh = require_composition.wattMillisecondsToKwh;
118714
119015
  exports.weatherCapability = weatherCapability;
118715
119016
  exports.webrtcClientHintsSchema = webrtcClientHintsSchema;
118716
119017
  exports.webrtcSessionCapability = webrtcSessionCapability;