@camstack/addon-training 0.1.90 → 0.1.91

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-BmrNAOJO.mjs → MotionZonesSettings-kbJlg0c5.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-BzPCdIdZ.mjs → PrivacyMaskSettings-B3gzWS6Y.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-Xk84BCuE.mjs → SceneMonitorEditor-CjxaItjN.mjs} +1 -1
  4. package/dist/_stub.js +46 -46
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Bc9jWFjH.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs +26 -0
  7. package/dist/{dist-BypcWIVo.mjs → dist-B3Dz3xDZ.mjs} +168 -28
  8. package/dist/{dist-CbnB8LuE.js → dist-uLc6FQWF.js} +168 -28
  9. package/dist/{hostInit-D4bIo0lR.mjs → hostInit-C-l48gwp.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-CT4LlpcW.mjs → player-overlays-DrA4TUe3.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-Sb8JnuVU.mjs → responsive-C46lpRSX.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-Cxqt93xt.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.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-DZIdVQ_a.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-bykKrTgu.mjs
5611
+ //#region ../types/dist/sleep-0sD_LHLI.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).
@@ -9000,6 +9000,7 @@ var CAP_NAMES = Object.freeze([
9000
9000
  "login-method",
9001
9001
  "media-player",
9002
9002
  "mesh-network",
9003
+ "meter",
9003
9004
  "metrics-provider",
9004
9005
  "model-convert",
9005
9006
  "model-distributor",
@@ -10057,6 +10058,10 @@ Object.freeze({
10057
10058
  ]
10058
10059
  }
10059
10060
  ],
10061
+ "meter": [{
10062
+ "path": "value",
10063
+ "valueType": "number"
10064
+ }],
10060
10065
  "motion": [
10061
10066
  {
10062
10067
  "path": "detected",
@@ -11149,7 +11154,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11149
11154
  return DeviceRole;
11150
11155
  }({});
11151
11156
  //#endregion
11152
- //#region ../types/dist/composition-B2rw5L29.mjs
11157
+ //#region ../types/dist/composition-CpETZ4HL.mjs
11153
11158
  /**
11154
11159
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11155
11160
  *
@@ -11925,6 +11930,77 @@ var APPLIANCE_KINDS = [
11925
11930
  ];
11926
11931
  DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
11927
11932
  /**
11933
+ * Statistics and integrals over a history read (D944).
11934
+ *
11935
+ * Pure: the same points always give the same answer, so a restart recomputes
11936
+ * rather than trusting a buffer. A gauge mean is time-weighted (value × ms),
11937
+ * never the mean of the samples. A hole with no held value is not integrated
11938
+ * as zero. A truncated read is not published.
11939
+ */
11940
+ var STATISTIC_STATS = [
11941
+ "min",
11942
+ "max",
11943
+ "mean",
11944
+ "sum",
11945
+ "count",
11946
+ "change"
11947
+ ];
11948
+ /**
11949
+ * The range a statistics or integral helper asks history for (D944).
11950
+ *
11951
+ * Calendar edges are the hub's timezone, never UTC midnight: a day is 23, 24
11952
+ * or 25 hours across a DST change. A tier is eligible only when its retention
11953
+ * is strictly longer than the longest that range can be. Forever qualifies.
11954
+ * Equal to a tier's retention is a refusal, not a short answer.
11955
+ */
11956
+ var MINUTE_MS = 6e4;
11957
+ var HOUR_MS = 60 * MINUTE_MS;
11958
+ var DAY_MS = 24 * HOUR_MS;
11959
+ var ROLLING_SPANS = [
11960
+ "1h",
11961
+ "24h",
11962
+ "2d",
11963
+ "7d",
11964
+ "30d",
11965
+ "custom"
11966
+ ];
11967
+ var CALENDAR_PERIODS = [
11968
+ "today",
11969
+ "yesterday",
11970
+ "this-week",
11971
+ "this-month"
11972
+ ];
11973
+ var RESET_PERIODS = [
11974
+ "never",
11975
+ "daily",
11976
+ "weekly",
11977
+ "monthly"
11978
+ ];
11979
+ 5 * MINUTE_MS;
11980
+ 24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
11981
+ 7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
11982
+ var StatisticWindowSchema = discriminatedUnion("kind", [object({
11983
+ kind: literal("rolling"),
11984
+ span: _enum(ROLLING_SPANS),
11985
+ customMinutes: number().int().min(5).optional()
11986
+ }).check((payload) => {
11987
+ if (payload.value.span === "custom" && payload.value.customMinutes === void 0) payload.issues.push({
11988
+ code: "custom",
11989
+ message: "a custom range needs a duration in minutes",
11990
+ path: ["customMinutes"],
11991
+ input: payload.value
11992
+ });
11993
+ if (payload.value.span !== "custom" && payload.value.customMinutes !== void 0) payload.issues.push({
11994
+ code: "custom",
11995
+ message: "only a custom range carries a duration",
11996
+ path: ["customMinutes"],
11997
+ input: payload.value
11998
+ });
11999
+ }), object({
12000
+ kind: literal("calendar"),
12001
+ period: _enum(CALENDAR_PERIODS)
12002
+ })]);
12003
+ /**
11928
12004
  * A composition source identity: `(addonId, stableId)`, never a numeric device
11929
12005
  * id. Split out so helper schemas can name it without a cycle through
11930
12006
  * `composition.ts` (D659).
@@ -11980,22 +12056,37 @@ var HelperMemberSchema = object({
11980
12056
  cap: string().min(1),
11981
12057
  fieldPath: string().min(1)
11982
12058
  });
11983
- var HelperSpecSchema = discriminatedUnion("kind", [object({
11984
- kind: literal("group"),
11985
- templateId: GroupTemplateIdSchema,
11986
- aggregate: AggregateReducerSchema,
11987
- members: array(HelperMemberSchema).min(1).max(64),
11988
- /** Actuator groups only. Readings leave this unset. */
11989
- active: ActiveCriterionSchema.optional()
11990
- }), object({
11991
- kind: literal("appliance"),
11992
- templateId: literal(APPLIANCE_TEMPLATE_ID),
11993
- appliance: _enum(APPLIANCE_KINDS),
11994
- thresholdWatts: number().positive(),
11995
- startDwellMs: number().int().nonnegative(),
11996
- stopDwellMs: number().int().nonnegative(),
11997
- member: HelperMemberSchema
11998
- })]);
12059
+ var HelperSpecSchema = discriminatedUnion("kind", [
12060
+ object({
12061
+ kind: literal("group"),
12062
+ templateId: GroupTemplateIdSchema,
12063
+ aggregate: AggregateReducerSchema,
12064
+ members: array(HelperMemberSchema).min(1).max(64),
12065
+ /** Actuator groups only. Readings leave this unset. */
12066
+ active: ActiveCriterionSchema.optional()
12067
+ }),
12068
+ object({
12069
+ kind: literal("appliance"),
12070
+ templateId: literal(APPLIANCE_TEMPLATE_ID),
12071
+ appliance: _enum(APPLIANCE_KINDS),
12072
+ thresholdWatts: number().positive(),
12073
+ startDwellMs: number().int().nonnegative(),
12074
+ stopDwellMs: number().int().nonnegative(),
12075
+ member: HelperMemberSchema
12076
+ }),
12077
+ object({
12078
+ kind: literal("statistic"),
12079
+ stat: _enum(STATISTIC_STATS),
12080
+ window: StatisticWindowSchema,
12081
+ source: HelperMemberSchema
12082
+ }),
12083
+ object({
12084
+ kind: literal("integral"),
12085
+ reset: _enum(RESET_PERIODS),
12086
+ output: _enum(["energy", "meter"]),
12087
+ source: HelperMemberSchema
12088
+ })
12089
+ ]);
11999
12090
  /** A composed device's stableId is this prefix plus the block id. */
12000
12091
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
12001
12092
  /** Longest snippet a `code` source may carry (slice 4). */
@@ -12069,6 +12160,26 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
12069
12160
  "omit",
12070
12161
  "offline"
12071
12162
  ])
12163
+ }),
12164
+ object({
12165
+ kind: literal("series"),
12166
+ read: CompositionFieldReadSchema,
12167
+ /** `value` is the statistic or the integral. The others are the gap counts. */
12168
+ publish: _enum([
12169
+ "value",
12170
+ "included",
12171
+ "excluded",
12172
+ "total"
12173
+ ]),
12174
+ /**
12175
+ * What an unanswered `value` does. Counts ignore this. `offline` leaves the
12176
+ * device unseeded until history answers, so a restart cannot publish 0.
12177
+ */
12178
+ empty: _enum([
12179
+ "null",
12180
+ "omit",
12181
+ "offline"
12182
+ ])
12072
12183
  })
12073
12184
  ]);
12074
12185
  var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
@@ -18262,7 +18373,8 @@ var CompositionProblemSchema = object({
18262
18373
  "native-capability-replace",
18263
18374
  "mixed-quantity",
18264
18375
  "helper-mismatch",
18265
- "member-constraint"
18376
+ "member-constraint",
18377
+ "retention"
18266
18378
  ]),
18267
18379
  path: string(),
18268
18380
  message: string()
@@ -18502,7 +18614,7 @@ Object.freeze({
18502
18614
  * One catalog row per base reading a group helper can build (D944 §3).
18503
18615
  * Data, not a form default written into the block.
18504
18616
  */
18505
- var NOW = {
18617
+ var NOW$1 = {
18506
18618
  fieldPath: "lastFetchedAt",
18507
18619
  expr: "now"
18508
18620
  };
@@ -18548,7 +18660,7 @@ var GROUP_TEMPLATES = [
18548
18660
  quantity: "temperature",
18549
18661
  defaultAggregate: "mean",
18550
18662
  empty: "null",
18551
- companions: [NOW]
18663
+ companions: [NOW$1]
18552
18664
  }),
18553
18665
  numeric({
18554
18666
  id: "humidity",
@@ -18559,7 +18671,7 @@ var GROUP_TEMPLATES = [
18559
18671
  quantity: "humidity",
18560
18672
  defaultAggregate: "mean",
18561
18673
  empty: "null",
18562
- companions: [NOW]
18674
+ companions: [NOW$1]
18563
18675
  }),
18564
18676
  numeric({
18565
18677
  id: "pressure",
@@ -18570,7 +18682,7 @@ var GROUP_TEMPLATES = [
18570
18682
  quantity: "pressure",
18571
18683
  defaultAggregate: "mean",
18572
18684
  empty: "null",
18573
- companions: [NOW]
18685
+ companions: [NOW$1]
18574
18686
  }),
18575
18687
  numeric({
18576
18688
  id: "illuminance",
@@ -18581,7 +18693,7 @@ var GROUP_TEMPLATES = [
18581
18693
  quantity: "illuminance",
18582
18694
  defaultAggregate: "mean",
18583
18695
  empty: "null",
18584
- companions: [NOW]
18696
+ companions: [NOW$1]
18585
18697
  }),
18586
18698
  numeric({
18587
18699
  id: "power",
@@ -18592,7 +18704,7 @@ var GROUP_TEMPLATES = [
18592
18704
  quantity: "power",
18593
18705
  defaultAggregate: "sum",
18594
18706
  empty: "omit",
18595
- companions: [NOW]
18707
+ companions: [NOW$1]
18596
18708
  }),
18597
18709
  numeric({
18598
18710
  id: "energy",
@@ -18603,7 +18715,7 @@ var GROUP_TEMPLATES = [
18603
18715
  quantity: "energy",
18604
18716
  defaultAggregate: "sum",
18605
18717
  empty: "omit",
18606
- companions: [NOW]
18718
+ companions: [NOW$1]
18607
18719
  }),
18608
18720
  numeric({
18609
18721
  id: "battery",
@@ -18638,7 +18750,7 @@ var GROUP_TEMPLATES = [
18638
18750
  quantity: "device",
18639
18751
  defaultAggregate: "mean",
18640
18752
  empty: "null",
18641
- companions: [NOW]
18753
+ companions: [NOW$1]
18642
18754
  }),
18643
18755
  binary({
18644
18756
  id: "motion",
@@ -18767,6 +18879,7 @@ function actuator(input) {
18767
18879
  }
18768
18880
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18769
18881
  DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18882
+ DeviceType.Camera;
18770
18883
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18771
18884
  /**
18772
18885
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -59558,6 +59671,11 @@ DeviceType.Lock, method(object({
59558
59671
  kind: "mutation",
59559
59672
  auth: "protected"
59560
59673
  });
59674
+ object({
59675
+ value: number().nullable().meta(readingMeta("device", { label: "Total" })),
59676
+ lastFetchedAt: number()
59677
+ });
59678
+ DeviceType.Sensor;
59561
59679
  /**
59562
59680
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
59563
59681
  * Apple TV, Spotify, Roku, generic OTT receivers, …) on
@@ -69998,6 +70116,13 @@ Object.freeze({
69998
70116
  access: "create",
69999
70117
  role: "admin"
70000
70118
  },
70119
+ "meter.getStatus": {
70120
+ capName: "meter",
70121
+ capScope: "device",
70122
+ addonId: null,
70123
+ access: "view",
70124
+ role: "viewer"
70125
+ },
70001
70126
  "metricsProvider.collectSnapshot": {
70002
70127
  capName: "metrics-provider",
70003
70128
  capScope: "system",
@@ -78956,6 +79081,17 @@ var SENSOR_CAP_VOCABULARY = {
78956
79081
  }],
78957
79082
  events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
78958
79083
  },
79084
+ meter: {
79085
+ scope: "device",
79086
+ noun: t("Meter", "Contatore"),
79087
+ state: [{
79088
+ kind: "numeric",
79089
+ field: "value",
79090
+ quantity: t("the total", "il totale"),
79091
+ label: t("Total", "Totale"),
79092
+ icon: "gauge"
79093
+ }]
79094
+ },
78959
79095
  "numeric-sensor": {
78960
79096
  scope: "device",
78961
79097
  noun: t("Sensor", "Sensore"),
@@ -80645,6 +80781,11 @@ Object.freeze({
80645
80781
  form: "single",
80646
80782
  optional: false
80647
80783
  }],
80784
+ "meter.getStatus": [{
80785
+ name: "deviceId",
80786
+ form: "single",
80787
+ optional: false
80788
+ }],
80648
80789
  "motion.getStatus": [{
80649
80790
  name: "deviceId",
80650
80791
  form: "single",
@@ -82252,7 +82393,6 @@ Object.freeze({
82252
82393
  "network-access": "ingress",
82253
82394
  "smtp-provider": "email"
82254
82395
  });
82255
- DeviceType.Camera;
82256
82396
  /**
82257
82397
  * A saved Customize assignment (D936). The schema is the type: callers use
82258
82398
  * `z.infer`, they do not restate the shape.
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.421",
39
+ version: "1.2.422",
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.333",
84
+ version: "1.2.334",
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-CbnB8LuE.js");
2
+ require("./dist-uLc6FQWF.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-CbnB8LuE.js");
2
+ const require_dist = require("../dist-uLc6FQWF.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-BypcWIVo.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-B3Dz3xDZ.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-Sb8JnuVU.mjs";
4
+ import { g as l } from "./responsive-C46lpRSX.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-CbnB8LuE.js");
2
+ const require_dist = require("../../dist-uLc6FQWF.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-BypcWIVo.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-B3Dz3xDZ.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-Cxqt93xt.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.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 { O as c } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DZIdVQ_a.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";
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-Bc9jWFjH.mjs")).catch((e) => {
2765
+ return ir ||= or(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.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.90",
3
+ "version": "0.1.91",
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",