@camstack/addon-model-studio 1.1.299 → 1.1.301

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 (21) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -0
  3. package/dist/{MotionZonesSettings-sz-ODYZW.mjs → MotionZonesSettings-DyZoYI0U.mjs} +2 -2
  4. package/dist/{PrivacyMaskSettings-6vNqzYvt.mjs → PrivacyMaskSettings-B37uji0h.mjs} +4 -4
  5. package/dist/{SceneMonitorEditor-DILUr4Mu.mjs → SceneMonitorEditor-adwuwWhh.mjs} +3 -3
  6. package/dist/_stub.js +631 -631
  7. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page--ME5lZcf.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BI-yAY3a.mjs} +3 -3
  8. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CrWbJfbZ.mjs +26 -0
  9. package/dist/addon-model-studio.css +1 -1
  10. package/dist/{hostInit-CtIHp-Co.mjs → hostInit-B4Xfj0Lp.mjs} +2 -2
  11. package/dist/model-studio.addon.js +144 -7
  12. package/dist/model-studio.addon.mjs +144 -7
  13. package/dist/{player-overlays-D_Gu9LQG.mjs → player-overlays-NWrAt23J.mjs} +1 -1
  14. package/dist/remoteEntry.js +1 -1
  15. package/dist/{responsive-EDVJCyVr.mjs → responsive-D0VqJmUb.mjs} +1 -1
  16. package/dist/{scene-monitor-copy-CNS1lQNa.mjs → scene-monitor-copy-CFRppIGJ.mjs} +1 -1
  17. package/dist/{square-DmAYvpZY.mjs → square-0_tIf9AN.mjs} +1 -1
  18. package/dist/{trash-2-C4LJKmdi.mjs → trash-2-BLOVJO98.mjs} +1 -1
  19. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-brpqeKaY.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-n-MaBs9H.mjs} +1 -1
  20. package/package.json +4 -2
  21. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Dcmr_zC_.mjs +0 -26
@@ -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,
@@ -394,7 +394,7 @@ function buildPluginCatalogRegistryDescriptor(entry) {
394
394
  };
395
395
  }
396
396
  //#endregion
397
- //#region ../types/dist/event-category-DHXxB8t9.mjs
397
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
398
398
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
399
399
  EventCategory["SystemBoot"] = "system.boot";
400
400
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -720,6 +720,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
720
720
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
721
721
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
722
722
  /**
723
+ * A camera's package LLM confirm has failed closed three times in a row
724
+ * (D931, 2026-10-26). One edge per camera until
725
+ * {@link PipelinePackageLlmAnswered}.
726
+ */
727
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
728
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
729
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
730
+ /**
723
731
  * Per-camera pipeline config was mutated by the orchestrator
724
732
  * (a settings change via `setAgentInferenceDevices` /
725
733
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5829,7 +5837,7 @@ var ZodIssueCode = {
5829
5837
  var ZodFirstPartyTypeKind;
5830
5838
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5831
5839
  //#endregion
5832
- //#region ../types/dist/sleep-B81gwQuR.mjs
5840
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5833
5841
  /**
5834
5842
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5835
5843
  * window to float samples (D455).
@@ -9032,6 +9040,7 @@ var CAP_NAMES = Object.freeze([
9032
9040
  "filesystem-browse",
9033
9041
  "flood",
9034
9042
  "gas",
9043
+ "group-commands",
9035
9044
  "group-status",
9036
9045
  "heating-valve",
9037
9046
  "humidifier",
@@ -11196,7 +11205,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11196
11205
  return DeviceRole;
11197
11206
  }({});
11198
11207
  //#endregion
11199
- //#region ../types/dist/composition-B85l9j1M.mjs
11208
+ //#region ../types/dist/composition-OhpuespA.mjs
11200
11209
  /**
11201
11210
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11202
11211
  *
@@ -11975,7 +11984,9 @@ var GROUP_TEMPLATE_IDS = [
11975
11984
  "leak",
11976
11985
  "smoke",
11977
11986
  "occupancy",
11978
- "binary"
11987
+ "binary",
11988
+ "switch",
11989
+ "light"
11979
11990
  ];
11980
11991
  var NUMERIC_AGGREGATES = [
11981
11992
  "mean",
@@ -11985,6 +11996,8 @@ var NUMERIC_AGGREGATES = [
11985
11996
  "sum"
11986
11997
  ];
11987
11998
  var BINARY_AGGREGATES = ["any", "all"];
11999
+ /** How an actuator group decides it is on. Unknown members never count as off. */
12000
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
11988
12001
  var AGGREGATE_REDUCERS = [
11989
12002
  "mean",
11990
12003
  "median",
@@ -11996,6 +12009,7 @@ var AGGREGATE_REDUCERS = [
11996
12009
  ];
11997
12010
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11998
12011
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
12012
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
11999
12013
  /** One member. The field is stored so occupancy can name motion or binary. */
12000
12014
  var HelperMemberSchema = object({
12001
12015
  source: CompositionSourceRefSchema,
@@ -12006,7 +12020,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
12006
12020
  kind: literal("group"),
12007
12021
  templateId: GroupTemplateIdSchema,
12008
12022
  aggregate: AggregateReducerSchema,
12009
- members: array(HelperMemberSchema).min(1).max(64)
12023
+ members: array(HelperMemberSchema).min(1).max(64),
12024
+ /** Actuator groups only. Readings leave this unset. */
12025
+ active: ActiveCriterionSchema.optional()
12010
12026
  })]);
12011
12027
  /** A composed device's stableId is this prefix plus the block id. */
12012
12028
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -18649,6 +18665,7 @@ function numeric(input) {
18649
18665
  family: "numeric",
18650
18666
  deviceType: DeviceType.Sensor,
18651
18667
  memberDeviceType: DeviceType.Sensor,
18668
+ commandCaps: [],
18652
18669
  baseUnit: baseUnitOf(input.quantity),
18653
18670
  aggregates: NUMERIC_AGGREGATES,
18654
18671
  accept: [{
@@ -18663,6 +18680,7 @@ function binary(input) {
18663
18680
  family: "binary",
18664
18681
  deviceType: DeviceType.Sensor,
18665
18682
  memberDeviceType: DeviceType.Sensor,
18683
+ commandCaps: [],
18666
18684
  quantity: "none",
18667
18685
  baseUnit: void 0,
18668
18686
  aggregates: BINARY_AGGREGATES,
@@ -18857,9 +18875,47 @@ var GROUP_TEMPLATES = [
18857
18875
  fieldPath: "on"
18858
18876
  }],
18859
18877
  companions: [CHANGED]
18878
+ }),
18879
+ actuator({
18880
+ id: "switch",
18881
+ 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.",
18882
+ deviceType: DeviceType.Switch,
18883
+ outputCap: "switch",
18884
+ commandCaps: ["switch"]
18885
+ }),
18886
+ actuator({
18887
+ id: "light",
18888
+ 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.",
18889
+ deviceType: DeviceType.Light,
18890
+ outputCap: "switch",
18891
+ commandCaps: [
18892
+ "switch",
18893
+ "brightness",
18894
+ "color"
18895
+ ]
18860
18896
  })
18861
18897
  ];
18898
+ function actuator(input) {
18899
+ return {
18900
+ ...input,
18901
+ family: "actuator",
18902
+ role: void 0,
18903
+ memberDeviceType: input.deviceType,
18904
+ outputField: "on",
18905
+ quantity: "none",
18906
+ baseUnit: void 0,
18907
+ aggregates: BINARY_AGGREGATES,
18908
+ defaultAggregate: "any",
18909
+ empty: "offline",
18910
+ accept: [{
18911
+ cap: "switch",
18912
+ fieldPath: "on"
18913
+ }],
18914
+ companions: [CHANGED]
18915
+ };
18916
+ }
18862
18917
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18918
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18863
18919
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18864
18920
  /**
18865
18921
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -45460,6 +45516,8 @@ var NcSystemEventKindSchema = _enum([
45460
45516
  "detection-blind",
45461
45517
  "motion-noisy",
45462
45518
  "motion-calm",
45519
+ "package-llm-silent",
45520
+ "package-llm-answered",
45463
45521
  "recording-stalled",
45464
45522
  "recording-healthy",
45465
45523
  "recording-degraded",
@@ -56474,6 +56532,28 @@ var PackageVersionInfoSchema = object({
56474
56532
  deprecated: string().optional(),
56475
56533
  distTags: array(string()).readonly()
56476
56534
  });
56535
+ /**
56536
+ * One published document. `ok` is markdown from the registry. `missing` means
56537
+ * the registry answered and the file was not there. `error` is a registry or
56538
+ * tarball failure — never an empty string standing in for either.
56539
+ */
56540
+ var PackageDocBodySchema = discriminatedUnion("status", [
56541
+ object({
56542
+ status: literal("ok"),
56543
+ markdown: string()
56544
+ }),
56545
+ object({ status: literal("missing") }),
56546
+ object({
56547
+ status: literal("error"),
56548
+ message: string()
56549
+ })
56550
+ ]);
56551
+ var PackageDocsSchema = object({
56552
+ name: string(),
56553
+ version: string(),
56554
+ readme: PackageDocBodySchema,
56555
+ changelog: PackageDocBodySchema
56556
+ });
56477
56557
  var SearchResultSchema = object({
56478
56558
  name: string(),
56479
56559
  version: string(),
@@ -56692,7 +56772,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
56692
56772
  }), object({ success: literal(true) }), {
56693
56773
  kind: "mutation",
56694
56774
  auth: "admin"
56695
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
56775
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
56776
+ name: string().min(1),
56777
+ version: string().min(1).optional()
56778
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
56696
56779
  kind: "mutation",
56697
56780
  auth: "admin"
56698
56781
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -58714,6 +58797,18 @@ object({
58714
58797
  lastChangedAt: number()
58715
58798
  });
58716
58799
  DeviceType.Sensor;
58800
+ object({
58801
+ /** One row per member that has been commanded. A later command replaces that member's row. */
58802
+ results: array(object({
58803
+ deviceId: number().int().nonnegative(),
58804
+ cap: string().min(1),
58805
+ method: string().min(1),
58806
+ ok: boolean(),
58807
+ error: string().optional(),
58808
+ /** Ms epoch of the attempt. */
58809
+ at: number()
58810
+ })) });
58811
+ DeviceType.Switch, DeviceType.Light;
58717
58812
  object({
58718
58813
  /** Members whose current value entered the aggregate. */
58719
58814
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58731,7 +58826,7 @@ object({
58731
58826
  label: "Members"
58732
58827
  }))
58733
58828
  });
58734
- DeviceType.Sensor;
58829
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58735
58830
  object({
58736
58831
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58737
58832
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -66001,6 +66096,13 @@ Object.freeze({
66001
66096
  access: "view",
66002
66097
  role: "admin"
66003
66098
  },
66099
+ "addons.getPackageDocs": {
66100
+ capName: "addons",
66101
+ capScope: "system",
66102
+ addonId: null,
66103
+ access: "view",
66104
+ role: "admin"
66105
+ },
66004
66106
  "addons.getVersions": {
66005
66107
  capName: "addons",
66006
66108
  capScope: "system",
@@ -69109,6 +69211,13 @@ Object.freeze({
69109
69211
  access: "view",
69110
69212
  role: "viewer"
69111
69213
  },
69214
+ "groupCommands.getStatus": {
69215
+ capName: "group-commands",
69216
+ capScope: "device",
69217
+ addonId: null,
69218
+ access: "view",
69219
+ role: "viewer"
69220
+ },
69112
69221
  "groupStatus.getStatus": {
69113
69222
  capName: "group-status",
69114
69223
  capScope: "device",
@@ -78938,6 +79047,10 @@ var SENSOR_CAP_VOCABULARY = {
78938
79047
  icon: "flame"
78939
79048
  }]
78940
79049
  },
79050
+ "group-commands": {
79051
+ scope: "device",
79052
+ noun: t("Group command", "Comando di gruppo")
79053
+ },
78941
79054
  "group-status": {
78942
79055
  scope: "device",
78943
79056
  noun: t("Group", "Gruppo"),
@@ -80430,6 +80543,11 @@ Object.freeze({
80430
80543
  form: "single",
80431
80544
  optional: false
80432
80545
  }],
80546
+ "groupCommands.getStatus": [{
80547
+ name: "deviceId",
80548
+ form: "single",
80549
+ optional: false
80550
+ }],
80433
80551
  "groupStatus.getStatus": [{
80434
80552
  name: "deviceId",
80435
80553
  form: "single",
@@ -82419,6 +82537,8 @@ new Map(Object.entries({
82419
82537
  "detection-blind": "device-events",
82420
82538
  "motion-noisy": "device-events",
82421
82539
  "motion-calm": "device-events",
82540
+ "package-llm-silent": "device-events",
82541
+ "package-llm-answered": "device-events",
82422
82542
  "recording-stalled": "device-events",
82423
82543
  "recording-healthy": "device-events",
82424
82544
  "recording-degraded": "device-events",
@@ -82502,6 +82622,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
82502
82622
  label: "Motion without a subject",
82503
82623
  kinds: ["motion-noisy", "motion-calm"]
82504
82624
  },
82625
+ {
82626
+ id: "package-llm",
82627
+ family: "device-events",
82628
+ label: "Package confirm",
82629
+ kinds: ["package-llm-silent", "package-llm-answered"]
82630
+ },
82505
82631
  {
82506
82632
  id: "recording",
82507
82633
  family: "device-events",
@@ -82683,6 +82809,8 @@ var DEVICE_EVENTS = [
82683
82809
  "detection-blind",
82684
82810
  "motion-noisy",
82685
82811
  "motion-calm",
82812
+ "package-llm-silent",
82813
+ "package-llm-answered",
82686
82814
  "recording-stalled",
82687
82815
  "recording-healthy",
82688
82816
  "recording-degraded",
@@ -82951,6 +83079,15 @@ new Map([
82951
83079
  snapshotLabel: "Cameras with constant motion now",
82952
83080
  snapshotSection: null
82953
83081
  },
83082
+ {
83083
+ id: "package-llm-confirm",
83084
+ family: "device-events",
83085
+ label: "Package confirm (not answering / answering again)",
83086
+ bad: ["package-llm-silent"],
83087
+ recovery: ["package-llm-answered"],
83088
+ snapshotLabel: "Cameras whose package confirm is not answering",
83089
+ snapshotSection: null
83090
+ },
82954
83091
  {
82955
83092
  id: "recording-health",
82956
83093
  family: "device-events",
@@ -368,7 +368,7 @@ function buildPluginCatalogRegistryDescriptor(entry) {
368
368
  };
369
369
  }
370
370
  //#endregion
371
- //#region ../types/dist/event-category-DHXxB8t9.mjs
371
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
372
372
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
373
373
  EventCategory["SystemBoot"] = "system.boot";
374
374
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -694,6 +694,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
694
694
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
695
695
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
696
696
  /**
697
+ * A camera's package LLM confirm has failed closed three times in a row
698
+ * (D931, 2026-10-26). One edge per camera until
699
+ * {@link PipelinePackageLlmAnswered}.
700
+ */
701
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
702
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
703
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
704
+ /**
697
705
  * Per-camera pipeline config was mutated by the orchestrator
698
706
  * (a settings change via `setAgentInferenceDevices` /
699
707
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5803,7 +5811,7 @@ var ZodIssueCode = {
5803
5811
  var ZodFirstPartyTypeKind;
5804
5812
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5805
5813
  //#endregion
5806
- //#region ../types/dist/sleep-B81gwQuR.mjs
5814
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5807
5815
  /**
5808
5816
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5809
5817
  * window to float samples (D455).
@@ -9006,6 +9014,7 @@ var CAP_NAMES = Object.freeze([
9006
9014
  "filesystem-browse",
9007
9015
  "flood",
9008
9016
  "gas",
9017
+ "group-commands",
9009
9018
  "group-status",
9010
9019
  "heating-valve",
9011
9020
  "humidifier",
@@ -11170,7 +11179,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11170
11179
  return DeviceRole;
11171
11180
  }({});
11172
11181
  //#endregion
11173
- //#region ../types/dist/composition-B85l9j1M.mjs
11182
+ //#region ../types/dist/composition-OhpuespA.mjs
11174
11183
  /**
11175
11184
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11176
11185
  *
@@ -11949,7 +11958,9 @@ var GROUP_TEMPLATE_IDS = [
11949
11958
  "leak",
11950
11959
  "smoke",
11951
11960
  "occupancy",
11952
- "binary"
11961
+ "binary",
11962
+ "switch",
11963
+ "light"
11953
11964
  ];
11954
11965
  var NUMERIC_AGGREGATES = [
11955
11966
  "mean",
@@ -11959,6 +11970,8 @@ var NUMERIC_AGGREGATES = [
11959
11970
  "sum"
11960
11971
  ];
11961
11972
  var BINARY_AGGREGATES = ["any", "all"];
11973
+ /** How an actuator group decides it is on. Unknown members never count as off. */
11974
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
11962
11975
  var AGGREGATE_REDUCERS = [
11963
11976
  "mean",
11964
11977
  "median",
@@ -11970,6 +11983,7 @@ var AGGREGATE_REDUCERS = [
11970
11983
  ];
11971
11984
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
11972
11985
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
11986
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
11973
11987
  /** One member. The field is stored so occupancy can name motion or binary. */
11974
11988
  var HelperMemberSchema = object({
11975
11989
  source: CompositionSourceRefSchema,
@@ -11980,7 +11994,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
11980
11994
  kind: literal("group"),
11981
11995
  templateId: GroupTemplateIdSchema,
11982
11996
  aggregate: AggregateReducerSchema,
11983
- members: array(HelperMemberSchema).min(1).max(64)
11997
+ members: array(HelperMemberSchema).min(1).max(64),
11998
+ /** Actuator groups only. Readings leave this unset. */
11999
+ active: ActiveCriterionSchema.optional()
11984
12000
  })]);
11985
12001
  /** A composed device's stableId is this prefix plus the block id. */
11986
12002
  var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
@@ -18623,6 +18639,7 @@ function numeric(input) {
18623
18639
  family: "numeric",
18624
18640
  deviceType: DeviceType.Sensor,
18625
18641
  memberDeviceType: DeviceType.Sensor,
18642
+ commandCaps: [],
18626
18643
  baseUnit: baseUnitOf(input.quantity),
18627
18644
  aggregates: NUMERIC_AGGREGATES,
18628
18645
  accept: [{
@@ -18637,6 +18654,7 @@ function binary(input) {
18637
18654
  family: "binary",
18638
18655
  deviceType: DeviceType.Sensor,
18639
18656
  memberDeviceType: DeviceType.Sensor,
18657
+ commandCaps: [],
18640
18658
  quantity: "none",
18641
18659
  baseUnit: void 0,
18642
18660
  aggregates: BINARY_AGGREGATES,
@@ -18831,9 +18849,47 @@ var GROUP_TEMPLATES = [
18831
18849
  fieldPath: "on"
18832
18850
  }],
18833
18851
  companions: [CHANGED]
18852
+ }),
18853
+ actuator({
18854
+ id: "switch",
18855
+ 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.",
18856
+ deviceType: DeviceType.Switch,
18857
+ outputCap: "switch",
18858
+ commandCaps: ["switch"]
18859
+ }),
18860
+ actuator({
18861
+ id: "light",
18862
+ 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.",
18863
+ deviceType: DeviceType.Light,
18864
+ outputCap: "switch",
18865
+ commandCaps: [
18866
+ "switch",
18867
+ "brightness",
18868
+ "color"
18869
+ ]
18834
18870
  })
18835
18871
  ];
18872
+ function actuator(input) {
18873
+ return {
18874
+ ...input,
18875
+ family: "actuator",
18876
+ role: void 0,
18877
+ memberDeviceType: input.deviceType,
18878
+ outputField: "on",
18879
+ quantity: "none",
18880
+ baseUnit: void 0,
18881
+ aggregates: BINARY_AGGREGATES,
18882
+ defaultAggregate: "any",
18883
+ empty: "offline",
18884
+ accept: [{
18885
+ cap: "switch",
18886
+ fieldPath: "on"
18887
+ }],
18888
+ companions: [CHANGED]
18889
+ };
18890
+ }
18836
18891
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
18892
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
18837
18893
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
18838
18894
  /**
18839
18895
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -45434,6 +45490,8 @@ var NcSystemEventKindSchema = _enum([
45434
45490
  "detection-blind",
45435
45491
  "motion-noisy",
45436
45492
  "motion-calm",
45493
+ "package-llm-silent",
45494
+ "package-llm-answered",
45437
45495
  "recording-stalled",
45438
45496
  "recording-healthy",
45439
45497
  "recording-degraded",
@@ -56448,6 +56506,28 @@ var PackageVersionInfoSchema = object({
56448
56506
  deprecated: string().optional(),
56449
56507
  distTags: array(string()).readonly()
56450
56508
  });
56509
+ /**
56510
+ * One published document. `ok` is markdown from the registry. `missing` means
56511
+ * the registry answered and the file was not there. `error` is a registry or
56512
+ * tarball failure — never an empty string standing in for either.
56513
+ */
56514
+ var PackageDocBodySchema = discriminatedUnion("status", [
56515
+ object({
56516
+ status: literal("ok"),
56517
+ markdown: string()
56518
+ }),
56519
+ object({ status: literal("missing") }),
56520
+ object({
56521
+ status: literal("error"),
56522
+ message: string()
56523
+ })
56524
+ ]);
56525
+ var PackageDocsSchema = object({
56526
+ name: string(),
56527
+ version: string(),
56528
+ readme: PackageDocBodySchema,
56529
+ changelog: PackageDocBodySchema
56530
+ });
56451
56531
  var SearchResultSchema = object({
56452
56532
  name: string(),
56453
56533
  version: string(),
@@ -56666,7 +56746,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
56666
56746
  }), object({ success: literal(true) }), {
56667
56747
  kind: "mutation",
56668
56748
  auth: "admin"
56669
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
56749
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
56750
+ name: string().min(1),
56751
+ version: string().min(1).optional()
56752
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
56670
56753
  kind: "mutation",
56671
56754
  auth: "admin"
56672
56755
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -58688,6 +58771,18 @@ object({
58688
58771
  lastChangedAt: number()
58689
58772
  });
58690
58773
  DeviceType.Sensor;
58774
+ object({
58775
+ /** One row per member that has been commanded. A later command replaces that member's row. */
58776
+ results: array(object({
58777
+ deviceId: number().int().nonnegative(),
58778
+ cap: string().min(1),
58779
+ method: string().min(1),
58780
+ ok: boolean(),
58781
+ error: string().optional(),
58782
+ /** Ms epoch of the attempt. */
58783
+ at: number()
58784
+ })) });
58785
+ DeviceType.Switch, DeviceType.Light;
58691
58786
  object({
58692
58787
  /** Members whose current value entered the aggregate. */
58693
58788
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -58705,7 +58800,7 @@ object({
58705
58800
  label: "Members"
58706
58801
  }))
58707
58802
  });
58708
- DeviceType.Sensor;
58803
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
58709
58804
  object({
58710
58805
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
58711
58806
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -65975,6 +66070,13 @@ Object.freeze({
65975
66070
  access: "view",
65976
66071
  role: "admin"
65977
66072
  },
66073
+ "addons.getPackageDocs": {
66074
+ capName: "addons",
66075
+ capScope: "system",
66076
+ addonId: null,
66077
+ access: "view",
66078
+ role: "admin"
66079
+ },
65978
66080
  "addons.getVersions": {
65979
66081
  capName: "addons",
65980
66082
  capScope: "system",
@@ -69083,6 +69185,13 @@ Object.freeze({
69083
69185
  access: "view",
69084
69186
  role: "viewer"
69085
69187
  },
69188
+ "groupCommands.getStatus": {
69189
+ capName: "group-commands",
69190
+ capScope: "device",
69191
+ addonId: null,
69192
+ access: "view",
69193
+ role: "viewer"
69194
+ },
69086
69195
  "groupStatus.getStatus": {
69087
69196
  capName: "group-status",
69088
69197
  capScope: "device",
@@ -78912,6 +79021,10 @@ var SENSOR_CAP_VOCABULARY = {
78912
79021
  icon: "flame"
78913
79022
  }]
78914
79023
  },
79024
+ "group-commands": {
79025
+ scope: "device",
79026
+ noun: t("Group command", "Comando di gruppo")
79027
+ },
78915
79028
  "group-status": {
78916
79029
  scope: "device",
78917
79030
  noun: t("Group", "Gruppo"),
@@ -80404,6 +80517,11 @@ Object.freeze({
80404
80517
  form: "single",
80405
80518
  optional: false
80406
80519
  }],
80520
+ "groupCommands.getStatus": [{
80521
+ name: "deviceId",
80522
+ form: "single",
80523
+ optional: false
80524
+ }],
80407
80525
  "groupStatus.getStatus": [{
80408
80526
  name: "deviceId",
80409
80527
  form: "single",
@@ -82393,6 +82511,8 @@ new Map(Object.entries({
82393
82511
  "detection-blind": "device-events",
82394
82512
  "motion-noisy": "device-events",
82395
82513
  "motion-calm": "device-events",
82514
+ "package-llm-silent": "device-events",
82515
+ "package-llm-answered": "device-events",
82396
82516
  "recording-stalled": "device-events",
82397
82517
  "recording-healthy": "device-events",
82398
82518
  "recording-degraded": "device-events",
@@ -82476,6 +82596,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
82476
82596
  label: "Motion without a subject",
82477
82597
  kinds: ["motion-noisy", "motion-calm"]
82478
82598
  },
82599
+ {
82600
+ id: "package-llm",
82601
+ family: "device-events",
82602
+ label: "Package confirm",
82603
+ kinds: ["package-llm-silent", "package-llm-answered"]
82604
+ },
82479
82605
  {
82480
82606
  id: "recording",
82481
82607
  family: "device-events",
@@ -82657,6 +82783,8 @@ var DEVICE_EVENTS = [
82657
82783
  "detection-blind",
82658
82784
  "motion-noisy",
82659
82785
  "motion-calm",
82786
+ "package-llm-silent",
82787
+ "package-llm-answered",
82660
82788
  "recording-stalled",
82661
82789
  "recording-healthy",
82662
82790
  "recording-degraded",
@@ -82925,6 +83053,15 @@ new Map([
82925
83053
  snapshotLabel: "Cameras with constant motion now",
82926
83054
  snapshotSection: null
82927
83055
  },
83056
+ {
83057
+ id: "package-llm-confirm",
83058
+ family: "device-events",
83059
+ label: "Package confirm (not answering / answering again)",
83060
+ bad: ["package-llm-silent"],
83061
+ recovery: ["package-llm-answered"],
83062
+ snapshotLabel: "Cameras whose package confirm is not answering",
83063
+ snapshotSection: null
83064
+ },
82928
83065
  {
82929
83066
  id: "recording-health",
82930
83067
  family: "device-events",
@@ -1,6 +1,6 @@
1
1
  import { S as e, d as t, u as n, v as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import { n as i, r as a, t as o } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { _ as s, g as c } from "./responsive-EDVJCyVr.mjs";
3
+ import { _ as s, g as c } from "./responsive-D0VqJmUb.mjs";
4
4
  var l = s("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
6
6
  key: "qrunsl"
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-brpqeKaY.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-n-MaBs9H.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { S as e, d as t, g as n, i as r, l as i, n as a, r as o, u as s, v as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { b as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Dcmr_zC_.mjs";
3
+ import { x as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CrWbJfbZ.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  e();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,6 +1,6 @@
1
1
  import { S as e, g as t, l as n, v as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import { n as i } from "./ui-text-BqZa5BNK.mjs";
3
- import { _ as a } from "./responsive-EDVJCyVr.mjs";
3
+ import { _ as a } from "./responsive-D0VqJmUb.mjs";
4
4
  var o = a("camera", [["path", {
5
5
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
6
6
  key: "18u6gg"