@camstack/addon-training 0.1.85 → 0.1.87

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 (23) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +22 -0
  3. package/dist/{MotionZonesSettings-DTU9fMJZ.mjs → MotionZonesSettings-1v53BmVJ.mjs} +2 -2
  4. package/dist/{PrivacyMaskSettings-8MmRT5Ow.mjs → PrivacyMaskSettings-B1WrMGZy.mjs} +2 -2
  5. package/dist/{SceneMonitorEditor-qbsyyldN.mjs → SceneMonitorEditor-wJjFFoHA.mjs} +1 -1
  6. package/dist/_stub.js +5684 -5136
  7. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-_MdKeniv.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-BNJmzVCS.mjs} +3 -3
  8. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-VNxr7qQe.mjs +26 -0
  9. package/dist/addon-training.css +1 -1
  10. package/dist/{dist-vmoGj7S3.mjs → dist-CUYMVsX0.mjs} +144 -7
  11. package/dist/{dist-DIvqaK45.js → dist-CnS9QrjX.js} +144 -7
  12. package/dist/{hostInit-BKy0E1EU.mjs → hostInit-BxKuKvEv.mjs} +2 -2
  13. package/dist/index.js +1 -1
  14. package/dist/orchestrator/training.addon.js +1 -1
  15. package/dist/orchestrator/training.addon.mjs +1 -1
  16. package/dist/{player-overlays-B_I7m2Ml.mjs → player-overlays-BvnJqnez.mjs} +1 -1
  17. package/dist/providers/modal/training-modal.addon.js +1 -1
  18. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  19. package/dist/remoteEntry.js +1 -1
  20. package/dist/{responsive-BlFhgdjv.mjs → responsive-Dfx762zU.mjs} +1 -1
  21. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BH-X_-uQ.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BvSjPfq3.mjs} +1 -1
  22. package/package.json +4 -2
  23. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CHXZ7Vwy.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import "node:crypto";
2
- //#region ../types/dist/event-category-DHXxB8t9.mjs
2
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -325,6 +325,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
325
325
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
326
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
327
  /**
328
+ * A camera's package LLM confirm has failed closed three times in a row
329
+ * (D931, 2026-10-26). One edge per camera until
330
+ * {@link PipelinePackageLlmAnswered}.
331
+ */
332
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
333
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
334
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
335
+ /**
328
336
  * Per-camera pipeline config was mutated by the orchestrator
329
337
  * (a settings change via `setAgentInferenceDevices` /
330
338
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5567,7 +5575,7 @@ var ZodIssueCode = {
5567
5575
  var ZodFirstPartyTypeKind;
5568
5576
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5569
5577
  //#endregion
5570
- //#region ../types/dist/sleep-B81gwQuR.mjs
5578
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5571
5579
  /**
5572
5580
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5573
5581
  * window to float samples (D455).
@@ -8937,6 +8945,7 @@ var CAP_NAMES = Object.freeze([
8937
8945
  "filesystem-browse",
8938
8946
  "flood",
8939
8947
  "gas",
8948
+ "group-commands",
8940
8949
  "group-status",
8941
8950
  "heating-valve",
8942
8951
  "humidifier",
@@ -11101,7 +11110,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11101
11110
  return DeviceRole;
11102
11111
  }({});
11103
11112
  //#endregion
11104
- //#region ../types/dist/composition-B85l9j1M.mjs
11113
+ //#region ../types/dist/composition-OhpuespA.mjs
11105
11114
  /**
11106
11115
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11107
11116
  *
@@ -11880,7 +11889,9 @@ var GROUP_TEMPLATE_IDS = [
11880
11889
  "leak",
11881
11890
  "smoke",
11882
11891
  "occupancy",
11883
- "binary"
11892
+ "binary",
11893
+ "switch",
11894
+ "light"
11884
11895
  ];
11885
11896
  var NUMERIC_AGGREGATES = [
11886
11897
  "mean",
@@ -11890,6 +11901,8 @@ var NUMERIC_AGGREGATES = [
11890
11901
  "sum"
11891
11902
  ];
11892
11903
  var BINARY_AGGREGATES = ["any", "all"];
11904
+ /** How an actuator group decides it is on. Unknown members never count as off. */
11905
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
11893
11906
  var AGGREGATE_REDUCERS = [
11894
11907
  "mean",
11895
11908
  "median",
@@ -11901,6 +11914,7 @@ var AGGREGATE_REDUCERS = [
11901
11914
  ];
11902
11915
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11903
11916
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
11917
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
11904
11918
  /** One member. The field is stored so occupancy can name motion or binary. */
11905
11919
  var HelperMemberSchema = object({
11906
11920
  source: CompositionSourceRefSchema,
@@ -11911,7 +11925,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
11911
11925
  kind: literal("group"),
11912
11926
  templateId: GroupTemplateIdSchema,
11913
11927
  aggregate: AggregateReducerSchema,
11914
- members: array(HelperMemberSchema).min(1).max(64)
11928
+ members: array(HelperMemberSchema).min(1).max(64),
11929
+ /** Actuator groups only. Readings leave this unset. */
11930
+ active: ActiveCriterionSchema.optional()
11915
11931
  })]);
11916
11932
  /** A composed device's stableId is this prefix plus the block id. */
11917
11933
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -18433,6 +18449,7 @@ function numeric(input) {
18433
18449
  family: "numeric",
18434
18450
  deviceType: DeviceType.Sensor,
18435
18451
  memberDeviceType: DeviceType.Sensor,
18452
+ commandCaps: [],
18436
18453
  baseUnit: baseUnitOf(input.quantity),
18437
18454
  aggregates: NUMERIC_AGGREGATES,
18438
18455
  accept: [{
@@ -18447,6 +18464,7 @@ function binary(input) {
18447
18464
  family: "binary",
18448
18465
  deviceType: DeviceType.Sensor,
18449
18466
  memberDeviceType: DeviceType.Sensor,
18467
+ commandCaps: [],
18450
18468
  quantity: "none",
18451
18469
  baseUnit: void 0,
18452
18470
  aggregates: BINARY_AGGREGATES,
@@ -18641,9 +18659,47 @@ var GROUP_TEMPLATES = [
18641
18659
  fieldPath: "on"
18642
18660
  }],
18643
18661
  companions: [CHANGED]
18662
+ }),
18663
+ actuator({
18664
+ id: "switch",
18665
+ 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.",
18666
+ deviceType: DeviceType.Switch,
18667
+ outputCap: "switch",
18668
+ commandCaps: ["switch"]
18669
+ }),
18670
+ actuator({
18671
+ id: "light",
18672
+ 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.",
18673
+ deviceType: DeviceType.Light,
18674
+ outputCap: "switch",
18675
+ commandCaps: [
18676
+ "switch",
18677
+ "brightness",
18678
+ "color"
18679
+ ]
18644
18680
  })
18645
18681
  ];
18682
+ function actuator(input) {
18683
+ return {
18684
+ ...input,
18685
+ family: "actuator",
18686
+ role: void 0,
18687
+ memberDeviceType: input.deviceType,
18688
+ outputField: "on",
18689
+ quantity: "none",
18690
+ baseUnit: void 0,
18691
+ aggregates: BINARY_AGGREGATES,
18692
+ defaultAggregate: "any",
18693
+ empty: "offline",
18694
+ accept: [{
18695
+ cap: "switch",
18696
+ fieldPath: "on"
18697
+ }],
18698
+ companions: [CHANGED]
18699
+ };
18700
+ }
18646
18701
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18702
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18647
18703
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18648
18704
  /**
18649
18705
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -45210,6 +45266,8 @@ var NcSystemEventKindSchema = _enum([
45210
45266
  "detection-blind",
45211
45267
  "motion-noisy",
45212
45268
  "motion-calm",
45269
+ "package-llm-silent",
45270
+ "package-llm-answered",
45213
45271
  "recording-stalled",
45214
45272
  "recording-healthy",
45215
45273
  "recording-degraded",
@@ -56224,6 +56282,28 @@ var PackageVersionInfoSchema = object({
56224
56282
  deprecated: string().optional(),
56225
56283
  distTags: array(string()).readonly()
56226
56284
  });
56285
+ /**
56286
+ * One published document. `ok` is markdown from the registry. `missing` means
56287
+ * the registry answered and the file was not there. `error` is a registry or
56288
+ * tarball failure — never an empty string standing in for either.
56289
+ */
56290
+ var PackageDocBodySchema = discriminatedUnion("status", [
56291
+ object({
56292
+ status: literal("ok"),
56293
+ markdown: string()
56294
+ }),
56295
+ object({ status: literal("missing") }),
56296
+ object({
56297
+ status: literal("error"),
56298
+ message: string()
56299
+ })
56300
+ ]);
56301
+ var PackageDocsSchema = object({
56302
+ name: string(),
56303
+ version: string(),
56304
+ readme: PackageDocBodySchema,
56305
+ changelog: PackageDocBodySchema
56306
+ });
56227
56307
  var SearchResultSchema = object({
56228
56308
  name: string(),
56229
56309
  version: string(),
@@ -56442,7 +56522,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
56442
56522
  }), object({ success: literal(true) }), {
56443
56523
  kind: "mutation",
56444
56524
  auth: "admin"
56445
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
56525
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
56526
+ name: string().min(1),
56527
+ version: string().min(1).optional()
56528
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
56446
56529
  kind: "mutation",
56447
56530
  auth: "admin"
56448
56531
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -58464,6 +58547,18 @@ object({
58464
58547
  lastChangedAt: number()
58465
58548
  });
58466
58549
  DeviceType.Sensor;
58550
+ object({
58551
+ /** One row per member that has been commanded. A later command replaces that member's row. */
58552
+ results: array(object({
58553
+ deviceId: number().int().nonnegative(),
58554
+ cap: string().min(1),
58555
+ method: string().min(1),
58556
+ ok: boolean(),
58557
+ error: string().optional(),
58558
+ /** Ms epoch of the attempt. */
58559
+ at: number()
58560
+ })) });
58561
+ DeviceType.Switch, DeviceType.Light;
58467
58562
  object({
58468
58563
  /** Members whose current value entered the aggregate. */
58469
58564
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58481,7 +58576,7 @@ object({
58481
58576
  label: "Members"
58482
58577
  }))
58483
58578
  });
58484
- DeviceType.Sensor;
58579
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58485
58580
  object({
58486
58581
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58487
58582
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -65755,6 +65850,13 @@ Object.freeze({
65755
65850
  access: "view",
65756
65851
  role: "admin"
65757
65852
  },
65853
+ "addons.getPackageDocs": {
65854
+ capName: "addons",
65855
+ capScope: "system",
65856
+ addonId: null,
65857
+ access: "view",
65858
+ role: "admin"
65859
+ },
65758
65860
  "addons.getVersions": {
65759
65861
  capName: "addons",
65760
65862
  capScope: "system",
@@ -68863,6 +68965,13 @@ Object.freeze({
68863
68965
  access: "view",
68864
68966
  role: "viewer"
68865
68967
  },
68968
+ "groupCommands.getStatus": {
68969
+ capName: "group-commands",
68970
+ capScope: "device",
68971
+ addonId: null,
68972
+ access: "view",
68973
+ role: "viewer"
68974
+ },
68866
68975
  "groupStatus.getStatus": {
68867
68976
  capName: "group-status",
68868
68977
  capScope: "device",
@@ -78692,6 +78801,10 @@ var SENSOR_CAP_VOCABULARY = {
78692
78801
  icon: "flame"
78693
78802
  }]
78694
78803
  },
78804
+ "group-commands": {
78805
+ scope: "device",
78806
+ noun: t("Group command", "Comando di gruppo")
78807
+ },
78695
78808
  "group-status": {
78696
78809
  scope: "device",
78697
78810
  noun: t("Group", "Gruppo"),
@@ -80184,6 +80297,11 @@ Object.freeze({
80184
80297
  form: "single",
80185
80298
  optional: false
80186
80299
  }],
80300
+ "groupCommands.getStatus": [{
80301
+ name: "deviceId",
80302
+ form: "single",
80303
+ optional: false
80304
+ }],
80187
80305
  "groupStatus.getStatus": [{
80188
80306
  name: "deviceId",
80189
80307
  form: "single",
@@ -82173,6 +82291,8 @@ new Map(Object.entries({
82173
82291
  "detection-blind": "device-events",
82174
82292
  "motion-noisy": "device-events",
82175
82293
  "motion-calm": "device-events",
82294
+ "package-llm-silent": "device-events",
82295
+ "package-llm-answered": "device-events",
82176
82296
  "recording-stalled": "device-events",
82177
82297
  "recording-healthy": "device-events",
82178
82298
  "recording-degraded": "device-events",
@@ -82256,6 +82376,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
82256
82376
  label: "Motion without a subject",
82257
82377
  kinds: ["motion-noisy", "motion-calm"]
82258
82378
  },
82379
+ {
82380
+ id: "package-llm",
82381
+ family: "device-events",
82382
+ label: "Package confirm",
82383
+ kinds: ["package-llm-silent", "package-llm-answered"]
82384
+ },
82259
82385
  {
82260
82386
  id: "recording",
82261
82387
  family: "device-events",
@@ -82437,6 +82563,8 @@ var DEVICE_EVENTS = [
82437
82563
  "detection-blind",
82438
82564
  "motion-noisy",
82439
82565
  "motion-calm",
82566
+ "package-llm-silent",
82567
+ "package-llm-answered",
82440
82568
  "recording-stalled",
82441
82569
  "recording-healthy",
82442
82570
  "recording-degraded",
@@ -82705,6 +82833,15 @@ new Map([
82705
82833
  snapshotLabel: "Cameras with constant motion now",
82706
82834
  snapshotSection: null
82707
82835
  },
82836
+ {
82837
+ id: "package-llm-confirm",
82838
+ family: "device-events",
82839
+ label: "Package confirm (not answering / answering again)",
82840
+ bad: ["package-llm-silent"],
82841
+ recovery: ["package-llm-answered"],
82842
+ snapshotLabel: "Cameras whose package confirm is not answering",
82843
+ snapshotSection: null
82844
+ },
82708
82845
  {
82709
82846
  id: "recording-health",
82710
82847
  family: "device-events",
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  }) : target, mod));
33
33
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
34
  require("node:crypto");
35
- //#region ../types/dist/event-category-DHXxB8t9.mjs
35
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
36
36
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
37
37
  EventCategory["SystemBoot"] = "system.boot";
38
38
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -358,6 +358,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
358
358
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
359
359
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
360
360
  /**
361
+ * A camera's package LLM confirm has failed closed three times in a row
362
+ * (D931, 2026-10-26). One edge per camera until
363
+ * {@link PipelinePackageLlmAnswered}.
364
+ */
365
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
366
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
367
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
368
+ /**
361
369
  * Per-camera pipeline config was mutated by the orchestrator
362
370
  * (a settings change via `setAgentInferenceDevices` /
363
371
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5600,7 +5608,7 @@ var ZodIssueCode = {
5600
5608
  var ZodFirstPartyTypeKind;
5601
5609
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5602
5610
  //#endregion
5603
- //#region ../types/dist/sleep-B81gwQuR.mjs
5611
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5604
5612
  /**
5605
5613
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5606
5614
  * window to float samples (D455).
@@ -8970,6 +8978,7 @@ var CAP_NAMES = Object.freeze([
8970
8978
  "filesystem-browse",
8971
8979
  "flood",
8972
8980
  "gas",
8981
+ "group-commands",
8973
8982
  "group-status",
8974
8983
  "heating-valve",
8975
8984
  "humidifier",
@@ -11134,7 +11143,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11134
11143
  return DeviceRole;
11135
11144
  }({});
11136
11145
  //#endregion
11137
- //#region ../types/dist/composition-B85l9j1M.mjs
11146
+ //#region ../types/dist/composition-OhpuespA.mjs
11138
11147
  /**
11139
11148
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11140
11149
  *
@@ -11913,7 +11922,9 @@ var GROUP_TEMPLATE_IDS = [
11913
11922
  "leak",
11914
11923
  "smoke",
11915
11924
  "occupancy",
11916
- "binary"
11925
+ "binary",
11926
+ "switch",
11927
+ "light"
11917
11928
  ];
11918
11929
  var NUMERIC_AGGREGATES = [
11919
11930
  "mean",
@@ -11923,6 +11934,8 @@ var NUMERIC_AGGREGATES = [
11923
11934
  "sum"
11924
11935
  ];
11925
11936
  var BINARY_AGGREGATES = ["any", "all"];
11937
+ /** How an actuator group decides it is on. Unknown members never count as off. */
11938
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
11926
11939
  var AGGREGATE_REDUCERS = [
11927
11940
  "mean",
11928
11941
  "median",
@@ -11934,6 +11947,7 @@ var AGGREGATE_REDUCERS = [
11934
11947
  ];
11935
11948
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11936
11949
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
11950
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
11937
11951
  /** One member. The field is stored so occupancy can name motion or binary. */
11938
11952
  var HelperMemberSchema = object({
11939
11953
  source: CompositionSourceRefSchema,
@@ -11944,7 +11958,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
11944
11958
  kind: literal("group"),
11945
11959
  templateId: GroupTemplateIdSchema,
11946
11960
  aggregate: AggregateReducerSchema,
11947
- members: array(HelperMemberSchema).min(1).max(64)
11961
+ members: array(HelperMemberSchema).min(1).max(64),
11962
+ /** Actuator groups only. Readings leave this unset. */
11963
+ active: ActiveCriterionSchema.optional()
11948
11964
  })]);
11949
11965
  /** A composed device's stableId is this prefix plus the block id. */
11950
11966
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -18466,6 +18482,7 @@ function numeric(input) {
18466
18482
  family: "numeric",
18467
18483
  deviceType: DeviceType.Sensor,
18468
18484
  memberDeviceType: DeviceType.Sensor,
18485
+ commandCaps: [],
18469
18486
  baseUnit: baseUnitOf(input.quantity),
18470
18487
  aggregates: NUMERIC_AGGREGATES,
18471
18488
  accept: [{
@@ -18480,6 +18497,7 @@ function binary(input) {
18480
18497
  family: "binary",
18481
18498
  deviceType: DeviceType.Sensor,
18482
18499
  memberDeviceType: DeviceType.Sensor,
18500
+ commandCaps: [],
18483
18501
  quantity: "none",
18484
18502
  baseUnit: void 0,
18485
18503
  aggregates: BINARY_AGGREGATES,
@@ -18674,9 +18692,47 @@ var GROUP_TEMPLATES = [
18674
18692
  fieldPath: "on"
18675
18693
  }],
18676
18694
  companions: [CHANGED]
18695
+ }),
18696
+ actuator({
18697
+ id: "switch",
18698
+ 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.",
18699
+ deviceType: DeviceType.Switch,
18700
+ outputCap: "switch",
18701
+ commandCaps: ["switch"]
18702
+ }),
18703
+ actuator({
18704
+ id: "light",
18705
+ 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.",
18706
+ deviceType: DeviceType.Light,
18707
+ outputCap: "switch",
18708
+ commandCaps: [
18709
+ "switch",
18710
+ "brightness",
18711
+ "color"
18712
+ ]
18677
18713
  })
18678
18714
  ];
18715
+ function actuator(input) {
18716
+ return {
18717
+ ...input,
18718
+ family: "actuator",
18719
+ role: void 0,
18720
+ memberDeviceType: input.deviceType,
18721
+ outputField: "on",
18722
+ quantity: "none",
18723
+ baseUnit: void 0,
18724
+ aggregates: BINARY_AGGREGATES,
18725
+ defaultAggregate: "any",
18726
+ empty: "offline",
18727
+ accept: [{
18728
+ cap: "switch",
18729
+ fieldPath: "on"
18730
+ }],
18731
+ companions: [CHANGED]
18732
+ };
18733
+ }
18679
18734
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18735
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18680
18736
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18681
18737
  /**
18682
18738
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -45243,6 +45299,8 @@ var NcSystemEventKindSchema = _enum([
45243
45299
  "detection-blind",
45244
45300
  "motion-noisy",
45245
45301
  "motion-calm",
45302
+ "package-llm-silent",
45303
+ "package-llm-answered",
45246
45304
  "recording-stalled",
45247
45305
  "recording-healthy",
45248
45306
  "recording-degraded",
@@ -56257,6 +56315,28 @@ var PackageVersionInfoSchema = object({
56257
56315
  deprecated: string().optional(),
56258
56316
  distTags: array(string()).readonly()
56259
56317
  });
56318
+ /**
56319
+ * One published document. `ok` is markdown from the registry. `missing` means
56320
+ * the registry answered and the file was not there. `error` is a registry or
56321
+ * tarball failure — never an empty string standing in for either.
56322
+ */
56323
+ var PackageDocBodySchema = discriminatedUnion("status", [
56324
+ object({
56325
+ status: literal("ok"),
56326
+ markdown: string()
56327
+ }),
56328
+ object({ status: literal("missing") }),
56329
+ object({
56330
+ status: literal("error"),
56331
+ message: string()
56332
+ })
56333
+ ]);
56334
+ var PackageDocsSchema = object({
56335
+ name: string(),
56336
+ version: string(),
56337
+ readme: PackageDocBodySchema,
56338
+ changelog: PackageDocBodySchema
56339
+ });
56260
56340
  var SearchResultSchema = object({
56261
56341
  name: string(),
56262
56342
  version: string(),
@@ -56475,7 +56555,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
56475
56555
  }), object({ success: literal(true) }), {
56476
56556
  kind: "mutation",
56477
56557
  auth: "admin"
56478
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
56558
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
56559
+ name: string().min(1),
56560
+ version: string().min(1).optional()
56561
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
56479
56562
  kind: "mutation",
56480
56563
  auth: "admin"
56481
56564
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -58497,6 +58580,18 @@ object({
58497
58580
  lastChangedAt: number()
58498
58581
  });
58499
58582
  DeviceType.Sensor;
58583
+ object({
58584
+ /** One row per member that has been commanded. A later command replaces that member's row. */
58585
+ results: array(object({
58586
+ deviceId: number().int().nonnegative(),
58587
+ cap: string().min(1),
58588
+ method: string().min(1),
58589
+ ok: boolean(),
58590
+ error: string().optional(),
58591
+ /** Ms epoch of the attempt. */
58592
+ at: number()
58593
+ })) });
58594
+ DeviceType.Switch, DeviceType.Light;
58500
58595
  object({
58501
58596
  /** Members whose current value entered the aggregate. */
58502
58597
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58514,7 +58609,7 @@ object({
58514
58609
  label: "Members"
58515
58610
  }))
58516
58611
  });
58517
- DeviceType.Sensor;
58612
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58518
58613
  object({
58519
58614
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58520
58615
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -65788,6 +65883,13 @@ Object.freeze({
65788
65883
  access: "view",
65789
65884
  role: "admin"
65790
65885
  },
65886
+ "addons.getPackageDocs": {
65887
+ capName: "addons",
65888
+ capScope: "system",
65889
+ addonId: null,
65890
+ access: "view",
65891
+ role: "admin"
65892
+ },
65791
65893
  "addons.getVersions": {
65792
65894
  capName: "addons",
65793
65895
  capScope: "system",
@@ -68896,6 +68998,13 @@ Object.freeze({
68896
68998
  access: "view",
68897
68999
  role: "viewer"
68898
69000
  },
69001
+ "groupCommands.getStatus": {
69002
+ capName: "group-commands",
69003
+ capScope: "device",
69004
+ addonId: null,
69005
+ access: "view",
69006
+ role: "viewer"
69007
+ },
68899
69008
  "groupStatus.getStatus": {
68900
69009
  capName: "group-status",
68901
69010
  capScope: "device",
@@ -78725,6 +78834,10 @@ var SENSOR_CAP_VOCABULARY = {
78725
78834
  icon: "flame"
78726
78835
  }]
78727
78836
  },
78837
+ "group-commands": {
78838
+ scope: "device",
78839
+ noun: t("Group command", "Comando di gruppo")
78840
+ },
78728
78841
  "group-status": {
78729
78842
  scope: "device",
78730
78843
  noun: t("Group", "Gruppo"),
@@ -80217,6 +80330,11 @@ Object.freeze({
80217
80330
  form: "single",
80218
80331
  optional: false
80219
80332
  }],
80333
+ "groupCommands.getStatus": [{
80334
+ name: "deviceId",
80335
+ form: "single",
80336
+ optional: false
80337
+ }],
80220
80338
  "groupStatus.getStatus": [{
80221
80339
  name: "deviceId",
80222
80340
  form: "single",
@@ -82206,6 +82324,8 @@ new Map(Object.entries({
82206
82324
  "detection-blind": "device-events",
82207
82325
  "motion-noisy": "device-events",
82208
82326
  "motion-calm": "device-events",
82327
+ "package-llm-silent": "device-events",
82328
+ "package-llm-answered": "device-events",
82209
82329
  "recording-stalled": "device-events",
82210
82330
  "recording-healthy": "device-events",
82211
82331
  "recording-degraded": "device-events",
@@ -82289,6 +82409,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
82289
82409
  label: "Motion without a subject",
82290
82410
  kinds: ["motion-noisy", "motion-calm"]
82291
82411
  },
82412
+ {
82413
+ id: "package-llm",
82414
+ family: "device-events",
82415
+ label: "Package confirm",
82416
+ kinds: ["package-llm-silent", "package-llm-answered"]
82417
+ },
82292
82418
  {
82293
82419
  id: "recording",
82294
82420
  family: "device-events",
@@ -82470,6 +82596,8 @@ var DEVICE_EVENTS = [
82470
82596
  "detection-blind",
82471
82597
  "motion-noisy",
82472
82598
  "motion-calm",
82599
+ "package-llm-silent",
82600
+ "package-llm-answered",
82473
82601
  "recording-stalled",
82474
82602
  "recording-healthy",
82475
82603
  "recording-degraded",
@@ -82738,6 +82866,15 @@ new Map([
82738
82866
  snapshotLabel: "Cameras with constant motion now",
82739
82867
  snapshotSection: null
82740
82868
  },
82869
+ {
82870
+ id: "package-llm-confirm",
82871
+ family: "device-events",
82872
+ label: "Package confirm (not answering / answering again)",
82873
+ bad: ["package-llm-silent"],
82874
+ recovery: ["package-llm-answered"],
82875
+ snapshotLabel: "Cameras whose package confirm is not answering",
82876
+ snapshotSection: null
82877
+ },
82741
82878
  {
82742
82879
  id: "recording-health",
82743
82880
  family: "device-events",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.418",
39
+ version: "1.2.419",
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.328",
84
+ version: "1.2.330",
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-DIvqaK45.js");
2
+ require("./dist-CnS9QrjX.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-DIvqaK45.js");
2
+ const require_dist = require("../dist-CnS9QrjX.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-vmoGj7S3.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-CUYMVsX0.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-BlFhgdjv.mjs";
4
+ import { g as l } from "./responsive-Dfx762zU.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 }) {