@camstack/addon-training 0.1.91 → 0.1.92

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 (20) hide show
  1. package/dist/{MotionZonesSettings-kbJlg0c5.mjs → MotionZonesSettings-Cli21_S4.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-B3gzWS6Y.mjs → PrivacyMaskSettings-BqMnLgR4.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-CjxaItjN.mjs → SceneMonitorEditor-TOlMkkSx.mjs} +1 -1
  4. package/dist/_stub.js +55 -54
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Ki3rRnXi.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-COkV6wxS.mjs +26 -0
  7. package/dist/{dist-B3Dz3xDZ.mjs → dist-BLeIfxL-.mjs} +243 -24
  8. package/dist/{dist-uLc6FQWF.js → dist-BYGiAfO5.js} +243 -24
  9. package/dist/{hostInit-C-l48gwp.mjs → hostInit-SSLNnzqp.mjs} +2 -2
  10. package/dist/index.js +1 -1
  11. package/dist/orchestrator/training.addon.js +1 -1
  12. package/dist/orchestrator/training.addon.mjs +1 -1
  13. package/dist/{player-overlays-DrA4TUe3.mjs → player-overlays-CpnLw8Tf.mjs} +1 -1
  14. package/dist/providers/modal/training-modal.addon.js +1 -1
  15. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  16. package/dist/remoteEntry.js +1 -1
  17. package/dist/{responsive-C46lpRSX.mjs → responsive-wZ7jMF7F.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-CG3LeBz1.mjs} +1 -1
  19. package/package.json +1 -1
  20. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs +0 -26
@@ -5608,7 +5608,7 @@ var ZodIssueCode = {
5608
5608
  var ZodFirstPartyTypeKind;
5609
5609
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5610
5610
  //#endregion
5611
- //#region ../types/dist/sleep-0sD_LHLI.mjs
5611
+ //#region ../types/dist/sleep--jXS9hWo.mjs
5612
5612
  /**
5613
5613
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5614
5614
  * window to float samples (D455).
@@ -8978,6 +8978,7 @@ var CAP_NAMES = Object.freeze([
8978
8978
  "filesystem-browse",
8979
8979
  "flood",
8980
8980
  "gas",
8981
+ "group-active",
8981
8982
  "group-commands",
8982
8983
  "group-status",
8983
8984
  "heating-valve",
@@ -9799,6 +9800,10 @@ Object.freeze({
9799
9800
  "path": "detected",
9800
9801
  "valueType": "boolean"
9801
9802
  }],
9803
+ "group-active": [{
9804
+ "path": "active",
9805
+ "valueType": "boolean"
9806
+ }],
9802
9807
  "group-status": [
9803
9808
  {
9804
9809
  "path": "included",
@@ -11154,7 +11159,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11154
11159
  return DeviceRole;
11155
11160
  }({});
11156
11161
  //#endregion
11157
- //#region ../types/dist/composition-CpETZ4HL.mjs
11162
+ //#region ../types/dist/composition-Bb8iwHEJ.mjs
11158
11163
  /**
11159
11164
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11160
11165
  *
@@ -11469,6 +11474,13 @@ var table = {
11469
11474
  apply: () => {
11470
11475
  throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
11471
11476
  }
11477
+ },
11478
+ schmitt: {
11479
+ minArgs: 3,
11480
+ maxArgs: 5,
11481
+ apply: () => {
11482
+ throw new ExpressionEvalError("schmitt: stateful evaluation context is required");
11483
+ }
11472
11484
  }
11473
11485
  };
11474
11486
  Object.freeze(Object.assign(Object.create(null), table));
@@ -11979,7 +11991,7 @@ var RESET_PERIODS = [
11979
11991
  5 * MINUTE_MS;
11980
11992
  24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
11981
11993
  7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
11982
- var StatisticWindowSchema = discriminatedUnion("kind", [object({
11994
+ var rollingWindowObject = object({
11983
11995
  kind: literal("rolling"),
11984
11996
  span: _enum(ROLLING_SPANS),
11985
11997
  customMinutes: number().int().min(5).optional()
@@ -11996,7 +12008,9 @@ var StatisticWindowSchema = discriminatedUnion("kind", [object({
11996
12008
  path: ["customMinutes"],
11997
12009
  input: payload.value
11998
12010
  });
11999
- }), object({
12011
+ });
12012
+ var RollingWindowSchema = rollingWindowObject;
12013
+ var StatisticWindowSchema = discriminatedUnion("kind", [rollingWindowObject, object({
12000
12014
  kind: literal("calendar"),
12001
12015
  period: _enum(CALENDAR_PERIODS)
12002
12016
  })]);
@@ -12026,7 +12040,13 @@ var GROUP_TEMPLATE_IDS = [
12026
12040
  "occupancy",
12027
12041
  "binary",
12028
12042
  "switch",
12029
- "light"
12043
+ "light",
12044
+ "fan",
12045
+ "cover",
12046
+ "valve",
12047
+ "lock",
12048
+ "media-player",
12049
+ "climate"
12030
12050
  ];
12031
12051
  var NUMERIC_AGGREGATES = [
12032
12052
  "mean",
@@ -12085,6 +12105,42 @@ var HelperSpecSchema = discriminatedUnion("kind", [
12085
12105
  reset: _enum(RESET_PERIODS),
12086
12106
  output: _enum(["energy", "meter"]),
12087
12107
  source: HelperMemberSchema
12108
+ }),
12109
+ object({
12110
+ kind: literal("threshold"),
12111
+ source: HelperMemberSchema,
12112
+ high: number(),
12113
+ low: number(),
12114
+ onForMs: number().int().nonnegative(),
12115
+ offForMs: number().int().nonnegative()
12116
+ }),
12117
+ object({
12118
+ kind: literal("arithmetic"),
12119
+ op: _enum([
12120
+ "sum",
12121
+ "difference",
12122
+ "ratio"
12123
+ ]),
12124
+ inputs: array(HelperMemberSchema).min(2).max(64)
12125
+ }),
12126
+ object({
12127
+ kind: literal("expression"),
12128
+ expr: string().min(1),
12129
+ inputs: array(object({
12130
+ name: string().min(1),
12131
+ member: HelperMemberSchema
12132
+ })).min(1).max(64),
12133
+ output: _enum(["number", "boolean"])
12134
+ }),
12135
+ object({
12136
+ kind: literal("derivative"),
12137
+ window: RollingWindowSchema,
12138
+ per: _enum([
12139
+ "second",
12140
+ "minute",
12141
+ "hour"
12142
+ ]),
12143
+ source: HelperMemberSchema
12088
12144
  })
12089
12145
  ]);
12090
12146
  /** A composed device's stableId is this prefix plus the block id. */
@@ -12147,6 +12203,12 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12147
12203
  "all"
12148
12204
  ]),
12149
12205
  reads: array(CompositionFieldReadSchema).min(1).max(64),
12206
+ /**
12207
+ * Set when the reads are an enum state, not a yes/no: the listed states
12208
+ * count as active (a cover is `open`). A state outside the list is inactive;
12209
+ * a read that is not a state at all is left out. Only `any` / `all` use it.
12210
+ */
12211
+ activeWhen: array(string().min(1)).min(1).optional(),
12150
12212
  /** `value` is the reading; the others are the member counts. */
12151
12213
  publish: _enum([
12152
12214
  "value",
@@ -18608,13 +18670,17 @@ Object.freeze({
18608
18670
  latchedAt: {
18609
18671
  kind: "fixed",
18610
18672
  result: ["number", "null"]
18673
+ },
18674
+ schmitt: {
18675
+ kind: "fixed",
18676
+ result: ["boolean", "null"]
18611
18677
  }
18612
18678
  });
18613
18679
  /**
18614
18680
  * One catalog row per base reading a group helper can build (D944 §3).
18615
18681
  * Data, not a form default written into the block.
18616
18682
  */
18617
- var NOW$1 = {
18683
+ var NOW$2 = {
18618
18684
  fieldPath: "lastFetchedAt",
18619
18685
  expr: "now"
18620
18686
  };
@@ -18628,6 +18694,8 @@ function numeric(input) {
18628
18694
  family: "numeric",
18629
18695
  deviceType: DeviceType.Sensor,
18630
18696
  memberDeviceType: DeviceType.Sensor,
18697
+ memberDeviceTypes: [DeviceType.Sensor],
18698
+ activeWhen: void 0,
18631
18699
  commandCaps: [],
18632
18700
  baseUnit: baseUnitOf(input.quantity),
18633
18701
  aggregates: NUMERIC_AGGREGATES,
@@ -18643,6 +18711,8 @@ function binary(input) {
18643
18711
  family: "binary",
18644
18712
  deviceType: DeviceType.Sensor,
18645
18713
  memberDeviceType: DeviceType.Sensor,
18714
+ memberDeviceTypes: [DeviceType.Sensor],
18715
+ activeWhen: void 0,
18646
18716
  commandCaps: [],
18647
18717
  quantity: "none",
18648
18718
  baseUnit: void 0,
@@ -18660,7 +18730,7 @@ var GROUP_TEMPLATES = [
18660
18730
  quantity: "temperature",
18661
18731
  defaultAggregate: "mean",
18662
18732
  empty: "null",
18663
- companions: [NOW$1]
18733
+ companions: [NOW$2]
18664
18734
  }),
18665
18735
  numeric({
18666
18736
  id: "humidity",
@@ -18671,7 +18741,7 @@ var GROUP_TEMPLATES = [
18671
18741
  quantity: "humidity",
18672
18742
  defaultAggregate: "mean",
18673
18743
  empty: "null",
18674
- companions: [NOW$1]
18744
+ companions: [NOW$2]
18675
18745
  }),
18676
18746
  numeric({
18677
18747
  id: "pressure",
@@ -18682,7 +18752,7 @@ var GROUP_TEMPLATES = [
18682
18752
  quantity: "pressure",
18683
18753
  defaultAggregate: "mean",
18684
18754
  empty: "null",
18685
- companions: [NOW$1]
18755
+ companions: [NOW$2]
18686
18756
  }),
18687
18757
  numeric({
18688
18758
  id: "illuminance",
@@ -18693,7 +18763,7 @@ var GROUP_TEMPLATES = [
18693
18763
  quantity: "illuminance",
18694
18764
  defaultAggregate: "mean",
18695
18765
  empty: "null",
18696
- companions: [NOW$1]
18766
+ companions: [NOW$2]
18697
18767
  }),
18698
18768
  numeric({
18699
18769
  id: "power",
@@ -18704,7 +18774,7 @@ var GROUP_TEMPLATES = [
18704
18774
  quantity: "power",
18705
18775
  defaultAggregate: "sum",
18706
18776
  empty: "omit",
18707
- companions: [NOW$1]
18777
+ companions: [NOW$2]
18708
18778
  }),
18709
18779
  numeric({
18710
18780
  id: "energy",
@@ -18715,7 +18785,7 @@ var GROUP_TEMPLATES = [
18715
18785
  quantity: "energy",
18716
18786
  defaultAggregate: "sum",
18717
18787
  empty: "omit",
18718
- companions: [NOW$1]
18788
+ companions: [NOW$2]
18719
18789
  }),
18720
18790
  numeric({
18721
18791
  id: "battery",
@@ -18750,7 +18820,7 @@ var GROUP_TEMPLATES = [
18750
18820
  quantity: "device",
18751
18821
  defaultAggregate: "mean",
18752
18822
  empty: "null",
18753
- companions: [NOW$1]
18823
+ companions: [NOW$2]
18754
18824
  }),
18755
18825
  binary({
18756
18826
  id: "motion",
@@ -18844,6 +18914,11 @@ var GROUP_TEMPLATES = [
18844
18914
  summary: "On when at least one switch is on, or when all of them are. Offline and unknown members are left out of that decision, never read as off, and still receive the command.",
18845
18915
  deviceType: DeviceType.Switch,
18846
18916
  outputCap: "switch",
18917
+ outputField: "on",
18918
+ member: {
18919
+ cap: "switch",
18920
+ fieldPath: "on"
18921
+ },
18847
18922
  commandCaps: ["switch"]
18848
18923
  }),
18849
18924
  actuator({
@@ -18851,29 +18926,130 @@ var GROUP_TEMPLATES = [
18851
18926
  summary: "On when at least one light is on, or when all of them are. Brightness and colour are offered only when every member has them. A command is not sent to a member that lacks it.",
18852
18927
  deviceType: DeviceType.Light,
18853
18928
  outputCap: "switch",
18929
+ outputField: "on",
18930
+ member: {
18931
+ cap: "switch",
18932
+ fieldPath: "on"
18933
+ },
18854
18934
  commandCaps: [
18855
18935
  "switch",
18856
18936
  "brightness",
18857
18937
  "color"
18858
18938
  ]
18939
+ }),
18940
+ actuator({
18941
+ id: "fan",
18942
+ summary: "On when at least one fan is on, or when all of them are. Speed, preset, direction and oscillation are offered only when every fan has them. A command is not sent to a fan that lacks it.",
18943
+ deviceType: DeviceType.Fan,
18944
+ outputCap: "switch",
18945
+ outputField: "on",
18946
+ member: {
18947
+ cap: "switch",
18948
+ fieldPath: "on"
18949
+ },
18950
+ commandCaps: ["switch", "fan-control"]
18951
+ }),
18952
+ actuator({
18953
+ id: "cover",
18954
+ summary: "Open when at least one cover is open or part-open, or only when all of them are. Position and tilt are offered only when every cover has them. A cover that reports nothing is left out, never read as closed.",
18955
+ deviceType: DeviceType.Cover,
18956
+ outputCap: "group-active",
18957
+ outputField: "active",
18958
+ member: {
18959
+ cap: "cover",
18960
+ fieldPath: "state"
18961
+ },
18962
+ activeWhen: [
18963
+ "open",
18964
+ "opening",
18965
+ "stopped"
18966
+ ],
18967
+ commandCaps: ["cover"]
18968
+ }),
18969
+ actuator({
18970
+ id: "valve",
18971
+ summary: "Open when at least one valve is open or part-open, or only when all of them are. Position is offered only when every valve has it. A valve that reports nothing is left out, never read as closed.",
18972
+ deviceType: DeviceType.Valve,
18973
+ outputCap: "group-active",
18974
+ outputField: "active",
18975
+ member: {
18976
+ cap: "valve",
18977
+ fieldPath: "state"
18978
+ },
18979
+ activeWhen: [
18980
+ "open",
18981
+ "opening",
18982
+ "stopped"
18983
+ ],
18984
+ commandCaps: ["valve"]
18985
+ }),
18986
+ actuator({
18987
+ id: "lock",
18988
+ summary: "Locked when at least one lock is locked, or only when all of them are. A jammed or moving lock is not locked. Locking is one tap; unlocking the group needs a confirmation every time, and nothing is sent without it.",
18989
+ deviceType: DeviceType.Lock,
18990
+ outputCap: "group-active",
18991
+ outputField: "active",
18992
+ member: {
18993
+ cap: "lock-control",
18994
+ fieldPath: "state"
18995
+ },
18996
+ activeWhen: ["locked"],
18997
+ commandCaps: ["lock-control"]
18998
+ }),
18999
+ actuator({
19000
+ id: "media-player",
19001
+ summary: "Playing when at least one player is playing, or only when all of them are. Volume is offered only when every player has it. A player that reports nothing is left out, never read as stopped.",
19002
+ deviceType: DeviceType.MediaPlayer,
19003
+ outputCap: "group-active",
19004
+ outputField: "active",
19005
+ member: {
19006
+ cap: "media-player",
19007
+ fieldPath: "state"
19008
+ },
19009
+ activeWhen: ["playing", "buffering"],
19010
+ commandCaps: ["media-player"]
19011
+ }),
19012
+ actuator({
19013
+ id: "climate",
19014
+ summary: "Running when at least one thermostat or air conditioner is not off, or only when all of them are. Target temperature and fan are offered only when every device has them. A device that reports nothing is left out, never read as off.",
19015
+ deviceType: DeviceType.Thermostat,
19016
+ memberDeviceTypes: [DeviceType.Thermostat, DeviceType.Climate],
19017
+ outputCap: "group-active",
19018
+ outputField: "active",
19019
+ member: {
19020
+ cap: "climate-control",
19021
+ fieldPath: "mode"
19022
+ },
19023
+ activeWhen: [
19024
+ "heat",
19025
+ "cool",
19026
+ "auto",
19027
+ "heat_cool",
19028
+ "fan_only",
19029
+ "dry"
19030
+ ],
19031
+ commandCaps: ["climate-control"]
18859
19032
  })
18860
19033
  ];
18861
19034
  function actuator(input) {
18862
19035
  return {
18863
- ...input,
19036
+ id: input.id,
19037
+ summary: input.summary,
19038
+ deviceType: input.deviceType,
19039
+ outputCap: input.outputCap,
19040
+ outputField: input.outputField,
19041
+ commandCaps: input.commandCaps,
18864
19042
  family: "actuator",
18865
19043
  role: void 0,
18866
19044
  memberDeviceType: input.deviceType,
18867
- outputField: "on",
19045
+ memberDeviceTypes: input.memberDeviceTypes ?? [input.deviceType],
19046
+ activeWhen: input.activeWhen,
18868
19047
  quantity: "none",
18869
19048
  baseUnit: void 0,
18870
19049
  aggregates: BINARY_AGGREGATES,
18871
19050
  defaultAggregate: "any",
18872
19051
  empty: "offline",
18873
- accept: [{
18874
- cap: "switch",
18875
- fieldPath: "on"
18876
- }],
19052
+ accept: [input.member],
18877
19053
  companions: [CHANGED]
18878
19054
  };
18879
19055
  }
@@ -46537,7 +46713,20 @@ var NcRuleInputSchema = object({
46537
46713
  * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
46538
46714
  * path does not run Zod defaults.
46539
46715
  */
46540
- groupingSec: number().int().min(5).max(60).optional()
46716
+ groupingSec: number().int().min(5).max(60).optional(),
46717
+ /**
46718
+ * ASK ME TO CONFIRM DETECTIONS (#243): a DETECTION notification of this rule
46719
+ * carries "Correct" / "Wrong" buttons (and, where the channel has room, a
46720
+ * "Wrong, it is a <class>" choice). A tap marks the track for retraining, the
46721
+ * same mark the Library writes, and records whose notification it was and
46722
+ * when. A channel with no buttons gets the same two choices as links.
46723
+ *
46724
+ * `.optional()`, never `.default()` (a Zod default does not run on the addon
46725
+ * cap path): absent and `false` both mean off, which is what every rule
46726
+ * authored before this field meant. An editor turns it off by writing
46727
+ * `false`, so it needs no `clear` key.
46728
+ */
46729
+ askVerdict: boolean().optional()
46541
46730
  });
46542
46731
  /**
46543
46732
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -58738,7 +58927,13 @@ results: array(object({
58738
58927
  /** Ms epoch of the attempt. */
58739
58928
  at: number()
58740
58929
  })) });
58741
- DeviceType.Switch, DeviceType.Light;
58930
+ DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
58931
+ object({
58932
+ active: boolean().meta({ label: "Active" }),
58933
+ /** Ms epoch when the slice was last updated. */
58934
+ lastChangedAt: number()
58935
+ });
58936
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Climate, DeviceType.Thermostat;
58742
58937
  object({
58743
58938
  /** Members whose current value entered the aggregate. */
58744
58939
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58756,7 +58951,7 @@ object({
58756
58951
  label: "Members"
58757
58952
  }))
58758
58953
  });
58759
- DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58954
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Cover, DeviceType.Valve, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.Thermostat, DeviceType.Climate;
58760
58955
  object({
58761
58956
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58762
58957
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -59663,7 +59858,14 @@ DeviceType.Lock, method(object({
59663
59858
  auth: "protected"
59664
59859
  }), method(object({
59665
59860
  deviceId: number().int().nonnegative(),
59666
- code: string().min(1).optional()
59861
+ code: string().min(1).optional(),
59862
+ /**
59863
+ * Honoured by a helper lock GROUP only (D944): unlocking several doors
59864
+ * with one call is refused unless the caller says it was confirmed. A
59865
+ * single lock ignores it. The refusal lives in the callee, so no
59866
+ * automation or API caller reaches the doors by skipping a dialog.
59867
+ */
59868
+ confirm: boolean().optional()
59667
59869
  }), _void(), {
59668
59870
  kind: "mutation",
59669
59871
  auth: "protected"
@@ -64079,7 +64281,7 @@ object({
64079
64281
  /** Ms epoch of the last state change. Useful for UI "X minutes ago". */
64080
64282
  lastChangedAt: number()
64081
64283
  });
64082
- DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
64284
+ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, method(object({
64083
64285
  deviceId: number(),
64084
64286
  on: boolean()
64085
64287
  }), _void(), {
@@ -65873,6 +66075,7 @@ var trainingCapability = {
65873
66075
  })
65874
66076
  }
65875
66077
  };
66078
+ DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
65876
66079
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
65877
66080
  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.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
65878
66081
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
@@ -69150,6 +69353,13 @@ Object.freeze({
69150
69353
  access: "view",
69151
69354
  role: "viewer"
69152
69355
  },
69356
+ "groupActive.getStatus": {
69357
+ capName: "group-active",
69358
+ capScope: "device",
69359
+ addonId: null,
69360
+ access: "view",
69361
+ role: "viewer"
69362
+ },
69153
69363
  "groupCommands.getStatus": {
69154
69364
  capName: "group-commands",
69155
69365
  capScope: "device",
@@ -79025,6 +79235,10 @@ var SENSOR_CAP_VOCABULARY = {
79025
79235
  icon: "flame"
79026
79236
  }]
79027
79237
  },
79238
+ "group-active": {
79239
+ scope: "device",
79240
+ noun: t("Group state", "Stato del gruppo")
79241
+ },
79028
79242
  "group-commands": {
79029
79243
  scope: "device",
79030
79244
  noun: t("Group command", "Comando di gruppo")
@@ -80571,6 +80785,11 @@ Object.freeze({
80571
80785
  form: "single",
80572
80786
  optional: false
80573
80787
  }],
80788
+ "groupActive.getStatus": [{
80789
+ name: "deviceId",
80790
+ form: "single",
80791
+ optional: false
80792
+ }],
80574
80793
  "groupCommands.getStatus": [{
80575
80794
  name: "deviceId",
80576
80795
  form: "single",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.422",
39
+ version: "1.2.424",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -81,7 +81,7 @@ async function r() {
81
81
  }
82
82
  },
83
83
  "@camstack/ui-library": {
84
- version: "1.2.334",
84
+ version: "1.2.335",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./dist-uLc6FQWF.js");
2
+ require("./dist-BYGiAfO5.js");
3
3
  const require_orchestrator_training_addon = require("./orchestrator/training.addon.js");
4
4
  const require_providers_modal_training_modal_addon = require("./providers/modal/training-modal.addon.js");
5
5
  //#region src/providers/fake/fake-provider.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-uLc6FQWF.js");
2
+ const require_dist = require("../dist-BYGiAfO5.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-B3Dz3xDZ.mjs";
1
+ import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-BLeIfxL-.mjs";
2
2
  import path from "node:path";
3
3
  import { createHash } from "node:crypto";
4
4
  import { createReadStream } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import { d as e, u as t, w as n, y as r } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  import { n as i, r as a, t as o } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
3
3
  import { n as s, t as c } from "./chevron-right-cA8Hucbi.mjs";
4
- import { g as l } from "./responsive-C46lpRSX.mjs";
4
+ import { g as l } from "./responsive-wZ7jMF7F.mjs";
5
5
  //#region ../ui-library/src/composites/widget-panel.tsx
6
6
  n();
7
7
  function u({ title: e, icon: t, headerRight: n, collapsible: l = !1, defaultOpen: u = !0, open: d, onOpenChange: f, bodyClassName: p = "p-3", children: m }) {
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../../dist-uLc6FQWF.js");
2
+ const require_dist = require("../../dist-BYGiAfO5.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-B3Dz3xDZ.mjs";
1
+ import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-BLeIfxL-.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import path, { dirname, posix } from "node:path";
4
4
  import { createHash, createPrivateKey, createPublicKey, createSign, randomBytes, randomUUID } from "node:crypto";
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-CG3LeBz1.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { b as e, d as t, g as n, l as r, n as i, u as a, w as o, y as s } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
3
- import { k as c } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs";
3
+ import { O as c } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-COkV6wxS.mjs";
4
4
  //#region ../ui-library/src/lib/shared-context.ts
5
5
  o();
6
6
  function l(e, t) {
@@ -2762,7 +2762,7 @@ async function or(e) {
2762
2762
  }
2763
2763
  }
2764
2764
  async function sr() {
2765
- return ir ||= or(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs")).catch((e) => {
2765
+ return ir ||= or(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Ki3rRnXi.mjs")).catch((e) => {
2766
2766
  throw ir = void 0, e;
2767
2767
  }), ir;
2768
2768
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-training",
3
- "version": "0.1.91",
3
+ "version": "0.1.92",
4
4
  "description": "Cloud training for CamStack: fine-tune the root detector on your own frames, on your own GPU-cloud account",
5
5
  "keywords": [
6
6
  "camstack",