@camstack/addon-pipeline-orchestrator 1.2.630 → 1.2.631

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.
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ node_fs = __toESM(node_fs);
30
30
  let node_path = require("node:path");
31
31
  node_path = __toESM(node_path);
32
32
  let node_url = require("node:url");
33
- //#region ../types/dist/event-category-DHXxB8t9.mjs
33
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
34
34
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
35
35
  EventCategory["SystemBoot"] = "system.boot";
36
36
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -356,6 +356,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
356
356
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
357
357
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
358
358
  /**
359
+ * A camera's package LLM confirm has failed closed three times in a row
360
+ * (D931, 2026-10-26). One edge per camera until
361
+ * {@link PipelinePackageLlmAnswered}.
362
+ */
363
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
364
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
365
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
366
+ /**
359
367
  * Per-camera pipeline config was mutated by the orchestrator
360
368
  * (a settings change via `setAgentInferenceDevices` /
361
369
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5598,7 +5606,7 @@ var ZodIssueCode = {
5598
5606
  var ZodFirstPartyTypeKind;
5599
5607
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5600
5608
  //#endregion
5601
- //#region ../types/dist/sleep-B81gwQuR.mjs
5609
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5602
5610
  /**
5603
5611
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5604
5612
  * window to float samples (D455).
@@ -9505,6 +9513,7 @@ var CAP_NAMES = Object.freeze([
9505
9513
  "filesystem-browse",
9506
9514
  "flood",
9507
9515
  "gas",
9516
+ "group-commands",
9508
9517
  "group-status",
9509
9518
  "heating-valve",
9510
9519
  "humidifier",
@@ -11703,7 +11712,7 @@ function errMsg$2(err) {
11703
11712
  return String(err);
11704
11713
  }
11705
11714
  //#endregion
11706
- //#region ../types/dist/composition-B85l9j1M.mjs
11715
+ //#region ../types/dist/composition-OhpuespA.mjs
11707
11716
  /**
11708
11717
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11709
11718
  *
@@ -12611,7 +12620,9 @@ var GROUP_TEMPLATE_IDS = [
12611
12620
  "leak",
12612
12621
  "smoke",
12613
12622
  "occupancy",
12614
- "binary"
12623
+ "binary",
12624
+ "switch",
12625
+ "light"
12615
12626
  ];
12616
12627
  var NUMERIC_AGGREGATES = [
12617
12628
  "mean",
@@ -12621,6 +12632,8 @@ var NUMERIC_AGGREGATES = [
12621
12632
  "sum"
12622
12633
  ];
12623
12634
  var BINARY_AGGREGATES = ["any", "all"];
12635
+ /** How an actuator group decides it is on. Unknown members never count as off. */
12636
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
12624
12637
  var AGGREGATE_REDUCERS = [
12625
12638
  "mean",
12626
12639
  "median",
@@ -12632,6 +12645,7 @@ var AGGREGATE_REDUCERS = [
12632
12645
  ];
12633
12646
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
12634
12647
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
12648
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
12635
12649
  /** One member. The field is stored so occupancy can name motion or binary. */
12636
12650
  var HelperMemberSchema = object({
12637
12651
  source: CompositionSourceRefSchema,
@@ -12642,7 +12656,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
12642
12656
  kind: literal("group"),
12643
12657
  templateId: GroupTemplateIdSchema,
12644
12658
  aggregate: AggregateReducerSchema,
12645
- members: array(HelperMemberSchema).min(1).max(64)
12659
+ members: array(HelperMemberSchema).min(1).max(64),
12660
+ /** Actuator groups only. Readings leave this unset. */
12661
+ active: ActiveCriterionSchema.optional()
12646
12662
  })]);
12647
12663
  /**
12648
12664
  * A COMPOSITION: a device assembled from other devices' state (D659).
@@ -19537,6 +19553,7 @@ function numeric(input) {
19537
19553
  family: "numeric",
19538
19554
  deviceType: DeviceType.Sensor,
19539
19555
  memberDeviceType: DeviceType.Sensor,
19556
+ commandCaps: [],
19540
19557
  baseUnit: baseUnitOf(input.quantity),
19541
19558
  aggregates: NUMERIC_AGGREGATES,
19542
19559
  accept: [{
@@ -19551,6 +19568,7 @@ function binary(input) {
19551
19568
  family: "binary",
19552
19569
  deviceType: DeviceType.Sensor,
19553
19570
  memberDeviceType: DeviceType.Sensor,
19571
+ commandCaps: [],
19554
19572
  quantity: "none",
19555
19573
  baseUnit: void 0,
19556
19574
  aggregates: BINARY_AGGREGATES,
@@ -19745,9 +19763,47 @@ var GROUP_TEMPLATES = [
19745
19763
  fieldPath: "on"
19746
19764
  }],
19747
19765
  companions: [CHANGED]
19766
+ }),
19767
+ actuator({
19768
+ id: "switch",
19769
+ 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.",
19770
+ deviceType: DeviceType.Switch,
19771
+ outputCap: "switch",
19772
+ commandCaps: ["switch"]
19773
+ }),
19774
+ actuator({
19775
+ id: "light",
19776
+ 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.",
19777
+ deviceType: DeviceType.Light,
19778
+ outputCap: "switch",
19779
+ commandCaps: [
19780
+ "switch",
19781
+ "brightness",
19782
+ "color"
19783
+ ]
19748
19784
  })
19749
19785
  ];
19786
+ function actuator(input) {
19787
+ return {
19788
+ ...input,
19789
+ family: "actuator",
19790
+ role: void 0,
19791
+ memberDeviceType: input.deviceType,
19792
+ outputField: "on",
19793
+ quantity: "none",
19794
+ baseUnit: void 0,
19795
+ aggregates: BINARY_AGGREGATES,
19796
+ defaultAggregate: "any",
19797
+ empty: "offline",
19798
+ accept: [{
19799
+ cap: "switch",
19800
+ fieldPath: "on"
19801
+ }],
19802
+ companions: [CHANGED]
19803
+ };
19804
+ }
19750
19805
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
19806
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
19751
19807
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
19752
19808
  /**
19753
19809
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -46582,6 +46638,8 @@ var NcSystemEventKindSchema = _enum([
46582
46638
  "detection-blind",
46583
46639
  "motion-noisy",
46584
46640
  "motion-calm",
46641
+ "package-llm-silent",
46642
+ "package-llm-answered",
46585
46643
  "recording-stalled",
46586
46644
  "recording-healthy",
46587
46645
  "recording-degraded",
@@ -58519,6 +58577,28 @@ var PackageVersionInfoSchema = object({
58519
58577
  deprecated: string().optional(),
58520
58578
  distTags: array(string()).readonly()
58521
58579
  });
58580
+ /**
58581
+ * One published document. `ok` is markdown from the registry. `missing` means
58582
+ * the registry answered and the file was not there. `error` is a registry or
58583
+ * tarball failure — never an empty string standing in for either.
58584
+ */
58585
+ var PackageDocBodySchema = discriminatedUnion("status", [
58586
+ object({
58587
+ status: literal("ok"),
58588
+ markdown: string()
58589
+ }),
58590
+ object({ status: literal("missing") }),
58591
+ object({
58592
+ status: literal("error"),
58593
+ message: string()
58594
+ })
58595
+ ]);
58596
+ var PackageDocsSchema = object({
58597
+ name: string(),
58598
+ version: string(),
58599
+ readme: PackageDocBodySchema,
58600
+ changelog: PackageDocBodySchema
58601
+ });
58522
58602
  var SearchResultSchema = object({
58523
58603
  name: string(),
58524
58604
  version: string(),
@@ -58737,7 +58817,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
58737
58817
  }), object({ success: literal(true) }), {
58738
58818
  kind: "mutation",
58739
58819
  auth: "admin"
58740
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
58820
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
58821
+ name: string().min(1),
58822
+ version: string().min(1).optional()
58823
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
58741
58824
  kind: "mutation",
58742
58825
  auth: "admin"
58743
58826
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -60768,6 +60851,18 @@ object({
60768
60851
  lastChangedAt: number()
60769
60852
  });
60770
60853
  DeviceType.Sensor;
60854
+ object({
60855
+ /** One row per member that has been commanded. A later command replaces that member's row. */
60856
+ results: array(object({
60857
+ deviceId: number().int().nonnegative(),
60858
+ cap: string().min(1),
60859
+ method: string().min(1),
60860
+ ok: boolean(),
60861
+ error: string().optional(),
60862
+ /** Ms epoch of the attempt. */
60863
+ at: number()
60864
+ })) });
60865
+ DeviceType.Switch, DeviceType.Light;
60771
60866
  object({
60772
60867
  /** Members whose current value entered the aggregate. */
60773
60868
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -60785,7 +60880,7 @@ object({
60785
60880
  label: "Members"
60786
60881
  }))
60787
60882
  });
60788
- DeviceType.Sensor;
60883
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
60789
60884
  object({
60790
60885
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
60791
60886
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -68792,6 +68887,13 @@ Object.freeze({
68792
68887
  access: "view",
68793
68888
  role: "admin"
68794
68889
  },
68890
+ "addons.getPackageDocs": {
68891
+ capName: "addons",
68892
+ capScope: "system",
68893
+ addonId: null,
68894
+ access: "view",
68895
+ role: "admin"
68896
+ },
68795
68897
  "addons.getVersions": {
68796
68898
  capName: "addons",
68797
68899
  capScope: "system",
@@ -71900,6 +72002,13 @@ Object.freeze({
71900
72002
  access: "view",
71901
72003
  role: "viewer"
71902
72004
  },
72005
+ "groupCommands.getStatus": {
72006
+ capName: "group-commands",
72007
+ capScope: "device",
72008
+ addonId: null,
72009
+ access: "view",
72010
+ role: "viewer"
72011
+ },
71903
72012
  "groupStatus.getStatus": {
71904
72013
  capName: "group-status",
71905
72014
  capScope: "device",
@@ -81729,6 +81838,10 @@ var SENSOR_CAP_VOCABULARY = {
81729
81838
  icon: "flame"
81730
81839
  }]
81731
81840
  },
81841
+ "group-commands": {
81842
+ scope: "device",
81843
+ noun: t("Group command", "Comando di gruppo")
81844
+ },
81732
81845
  "group-status": {
81733
81846
  scope: "device",
81734
81847
  noun: t("Group", "Gruppo"),
@@ -83249,6 +83362,11 @@ Object.freeze({
83249
83362
  form: "single",
83250
83363
  optional: false
83251
83364
  }],
83365
+ "groupCommands.getStatus": [{
83366
+ name: "deviceId",
83367
+ form: "single",
83368
+ optional: false
83369
+ }],
83252
83370
  "groupStatus.getStatus": [{
83253
83371
  name: "deviceId",
83254
83372
  form: "single",
@@ -85335,6 +85453,8 @@ new Map(Object.entries({
85335
85453
  "detection-blind": "device-events",
85336
85454
  "motion-noisy": "device-events",
85337
85455
  "motion-calm": "device-events",
85456
+ "package-llm-silent": "device-events",
85457
+ "package-llm-answered": "device-events",
85338
85458
  "recording-stalled": "device-events",
85339
85459
  "recording-healthy": "device-events",
85340
85460
  "recording-degraded": "device-events",
@@ -85418,6 +85538,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
85418
85538
  label: "Motion without a subject",
85419
85539
  kinds: ["motion-noisy", "motion-calm"]
85420
85540
  },
85541
+ {
85542
+ id: "package-llm",
85543
+ family: "device-events",
85544
+ label: "Package confirm",
85545
+ kinds: ["package-llm-silent", "package-llm-answered"]
85546
+ },
85421
85547
  {
85422
85548
  id: "recording",
85423
85549
  family: "device-events",
@@ -85599,6 +85725,8 @@ var DEVICE_EVENTS = [
85599
85725
  "detection-blind",
85600
85726
  "motion-noisy",
85601
85727
  "motion-calm",
85728
+ "package-llm-silent",
85729
+ "package-llm-answered",
85602
85730
  "recording-stalled",
85603
85731
  "recording-healthy",
85604
85732
  "recording-degraded",
@@ -85867,6 +85995,15 @@ new Map([
85867
85995
  snapshotLabel: "Cameras with constant motion now",
85868
85996
  snapshotSection: null
85869
85997
  },
85998
+ {
85999
+ id: "package-llm-confirm",
86000
+ family: "device-events",
86001
+ label: "Package confirm (not answering / answering again)",
86002
+ bad: ["package-llm-silent"],
86003
+ recovery: ["package-llm-answered"],
86004
+ snapshotLabel: "Cameras whose package confirm is not answering",
86005
+ snapshotSection: null
86006
+ },
85870
86007
  {
85871
86008
  id: "recording-health",
85872
86009
  family: "device-events",
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- //#region ../types/dist/event-category-DHXxB8t9.mjs
5
+ //#region ../types/dist/event-category-CT-hz5Rb.mjs
6
6
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
7
7
  EventCategory["SystemBoot"] = "system.boot";
8
8
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -328,6 +328,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
328
328
  /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
329
329
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
330
330
  /**
331
+ * A camera's package LLM confirm has failed closed three times in a row
332
+ * (D931, 2026-10-26). One edge per camera until
333
+ * {@link PipelinePackageLlmAnswered}.
334
+ */
335
+ EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
336
+ /** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
337
+ EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
338
+ /**
331
339
  * Per-camera pipeline config was mutated by the orchestrator
332
340
  * (a settings change via `setAgentInferenceDevices` /
333
341
  * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
@@ -5570,7 +5578,7 @@ var ZodIssueCode = {
5570
5578
  var ZodFirstPartyTypeKind;
5571
5579
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5572
5580
  //#endregion
5573
- //#region ../types/dist/sleep-B81gwQuR.mjs
5581
+ //#region ../types/dist/sleep-bykKrTgu.mjs
5574
5582
  /**
5575
5583
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5576
5584
  * window to float samples (D455).
@@ -9477,6 +9485,7 @@ var CAP_NAMES = Object.freeze([
9477
9485
  "filesystem-browse",
9478
9486
  "flood",
9479
9487
  "gas",
9488
+ "group-commands",
9480
9489
  "group-status",
9481
9490
  "heating-valve",
9482
9491
  "humidifier",
@@ -11675,7 +11684,7 @@ function errMsg$2(err) {
11675
11684
  return String(err);
11676
11685
  }
11677
11686
  //#endregion
11678
- //#region ../types/dist/composition-B85l9j1M.mjs
11687
+ //#region ../types/dist/composition-OhpuespA.mjs
11679
11688
  /**
11680
11689
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11681
11690
  *
@@ -12583,7 +12592,9 @@ var GROUP_TEMPLATE_IDS = [
12583
12592
  "leak",
12584
12593
  "smoke",
12585
12594
  "occupancy",
12586
- "binary"
12595
+ "binary",
12596
+ "switch",
12597
+ "light"
12587
12598
  ];
12588
12599
  var NUMERIC_AGGREGATES = [
12589
12600
  "mean",
@@ -12593,6 +12604,8 @@ var NUMERIC_AGGREGATES = [
12593
12604
  "sum"
12594
12605
  ];
12595
12606
  var BINARY_AGGREGATES = ["any", "all"];
12607
+ /** How an actuator group decides it is on. Unknown members never count as off. */
12608
+ var ACTIVE_CRITERIA = ["at-least-one", "all"];
12596
12609
  var AGGREGATE_REDUCERS = [
12597
12610
  "mean",
12598
12611
  "median",
@@ -12604,6 +12617,7 @@ var AGGREGATE_REDUCERS = [
12604
12617
  ];
12605
12618
  var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
12606
12619
  var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
12620
+ var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
12607
12621
  /** One member. The field is stored so occupancy can name motion or binary. */
12608
12622
  var HelperMemberSchema = object({
12609
12623
  source: CompositionSourceRefSchema,
@@ -12614,7 +12628,9 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
12614
12628
  kind: literal("group"),
12615
12629
  templateId: GroupTemplateIdSchema,
12616
12630
  aggregate: AggregateReducerSchema,
12617
- members: array(HelperMemberSchema).min(1).max(64)
12631
+ members: array(HelperMemberSchema).min(1).max(64),
12632
+ /** Actuator groups only. Readings leave this unset. */
12633
+ active: ActiveCriterionSchema.optional()
12618
12634
  })]);
12619
12635
  /**
12620
12636
  * A COMPOSITION: a device assembled from other devices' state (D659).
@@ -19509,6 +19525,7 @@ function numeric(input) {
19509
19525
  family: "numeric",
19510
19526
  deviceType: DeviceType.Sensor,
19511
19527
  memberDeviceType: DeviceType.Sensor,
19528
+ commandCaps: [],
19512
19529
  baseUnit: baseUnitOf(input.quantity),
19513
19530
  aggregates: NUMERIC_AGGREGATES,
19514
19531
  accept: [{
@@ -19523,6 +19540,7 @@ function binary(input) {
19523
19540
  family: "binary",
19524
19541
  deviceType: DeviceType.Sensor,
19525
19542
  memberDeviceType: DeviceType.Sensor,
19543
+ commandCaps: [],
19526
19544
  quantity: "none",
19527
19545
  baseUnit: void 0,
19528
19546
  aggregates: BINARY_AGGREGATES,
@@ -19717,9 +19735,47 @@ var GROUP_TEMPLATES = [
19717
19735
  fieldPath: "on"
19718
19736
  }],
19719
19737
  companions: [CHANGED]
19738
+ }),
19739
+ actuator({
19740
+ id: "switch",
19741
+ 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.",
19742
+ deviceType: DeviceType.Switch,
19743
+ outputCap: "switch",
19744
+ commandCaps: ["switch"]
19745
+ }),
19746
+ actuator({
19747
+ id: "light",
19748
+ 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.",
19749
+ deviceType: DeviceType.Light,
19750
+ outputCap: "switch",
19751
+ commandCaps: [
19752
+ "switch",
19753
+ "brightness",
19754
+ "color"
19755
+ ]
19720
19756
  })
19721
19757
  ];
19758
+ function actuator(input) {
19759
+ return {
19760
+ ...input,
19761
+ family: "actuator",
19762
+ role: void 0,
19763
+ memberDeviceType: input.deviceType,
19764
+ outputField: "on",
19765
+ quantity: "none",
19766
+ baseUnit: void 0,
19767
+ aggregates: BINARY_AGGREGATES,
19768
+ defaultAggregate: "any",
19769
+ empty: "offline",
19770
+ accept: [{
19771
+ cap: "switch",
19772
+ fieldPath: "on"
19773
+ }],
19774
+ companions: [CHANGED]
19775
+ };
19776
+ }
19722
19777
  new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
19778
+ DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
19723
19779
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
19724
19780
  /**
19725
19781
  * What a composition may BUILD on a device type (G2, D676): the caps a new
@@ -46554,6 +46610,8 @@ var NcSystemEventKindSchema = _enum([
46554
46610
  "detection-blind",
46555
46611
  "motion-noisy",
46556
46612
  "motion-calm",
46613
+ "package-llm-silent",
46614
+ "package-llm-answered",
46557
46615
  "recording-stalled",
46558
46616
  "recording-healthy",
46559
46617
  "recording-degraded",
@@ -58491,6 +58549,28 @@ var PackageVersionInfoSchema = object({
58491
58549
  deprecated: string().optional(),
58492
58550
  distTags: array(string()).readonly()
58493
58551
  });
58552
+ /**
58553
+ * One published document. `ok` is markdown from the registry. `missing` means
58554
+ * the registry answered and the file was not there. `error` is a registry or
58555
+ * tarball failure — never an empty string standing in for either.
58556
+ */
58557
+ var PackageDocBodySchema = discriminatedUnion("status", [
58558
+ object({
58559
+ status: literal("ok"),
58560
+ markdown: string()
58561
+ }),
58562
+ object({ status: literal("missing") }),
58563
+ object({
58564
+ status: literal("error"),
58565
+ message: string()
58566
+ })
58567
+ ]);
58568
+ var PackageDocsSchema = object({
58569
+ name: string(),
58570
+ version: string(),
58571
+ readme: PackageDocBodySchema,
58572
+ changelog: PackageDocBodySchema
58573
+ });
58494
58574
  var SearchResultSchema = object({
58495
58575
  name: string(),
58496
58576
  version: string(),
@@ -58709,7 +58789,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
58709
58789
  }), object({ success: literal(true) }), {
58710
58790
  kind: "mutation",
58711
58791
  auth: "admin"
58712
- }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
58792
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
58793
+ name: string().min(1),
58794
+ version: string().min(1).optional()
58795
+ }), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
58713
58796
  kind: "mutation",
58714
58797
  auth: "admin"
58715
58798
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -60740,6 +60823,18 @@ object({
60740
60823
  lastChangedAt: number()
60741
60824
  });
60742
60825
  DeviceType.Sensor;
60826
+ object({
60827
+ /** One row per member that has been commanded. A later command replaces that member's row. */
60828
+ results: array(object({
60829
+ deviceId: number().int().nonnegative(),
60830
+ cap: string().min(1),
60831
+ method: string().min(1),
60832
+ ok: boolean(),
60833
+ error: string().optional(),
60834
+ /** Ms epoch of the attempt. */
60835
+ at: number()
60836
+ })) });
60837
+ DeviceType.Switch, DeviceType.Light;
60743
60838
  object({
60744
60839
  /** Members whose current value entered the aggregate. */
60745
60840
  included: number().int().nonnegative().meta(readingMeta("count", {
@@ -60757,7 +60852,7 @@ object({
60757
60852
  label: "Members"
60758
60853
  }))
60759
60854
  });
60760
- DeviceType.Sensor;
60855
+ DeviceType.Sensor, DeviceType.Switch, DeviceType.Light;
60761
60856
  object({
60762
60857
  /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
60763
60858
  position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -68764,6 +68859,13 @@ Object.freeze({
68764
68859
  access: "view",
68765
68860
  role: "admin"
68766
68861
  },
68862
+ "addons.getPackageDocs": {
68863
+ capName: "addons",
68864
+ capScope: "system",
68865
+ addonId: null,
68866
+ access: "view",
68867
+ role: "admin"
68868
+ },
68767
68869
  "addons.getVersions": {
68768
68870
  capName: "addons",
68769
68871
  capScope: "system",
@@ -71872,6 +71974,13 @@ Object.freeze({
71872
71974
  access: "view",
71873
71975
  role: "viewer"
71874
71976
  },
71977
+ "groupCommands.getStatus": {
71978
+ capName: "group-commands",
71979
+ capScope: "device",
71980
+ addonId: null,
71981
+ access: "view",
71982
+ role: "viewer"
71983
+ },
71875
71984
  "groupStatus.getStatus": {
71876
71985
  capName: "group-status",
71877
71986
  capScope: "device",
@@ -81701,6 +81810,10 @@ var SENSOR_CAP_VOCABULARY = {
81701
81810
  icon: "flame"
81702
81811
  }]
81703
81812
  },
81813
+ "group-commands": {
81814
+ scope: "device",
81815
+ noun: t("Group command", "Comando di gruppo")
81816
+ },
81704
81817
  "group-status": {
81705
81818
  scope: "device",
81706
81819
  noun: t("Group", "Gruppo"),
@@ -83221,6 +83334,11 @@ Object.freeze({
83221
83334
  form: "single",
83222
83335
  optional: false
83223
83336
  }],
83337
+ "groupCommands.getStatus": [{
83338
+ name: "deviceId",
83339
+ form: "single",
83340
+ optional: false
83341
+ }],
83224
83342
  "groupStatus.getStatus": [{
83225
83343
  name: "deviceId",
83226
83344
  form: "single",
@@ -85307,6 +85425,8 @@ new Map(Object.entries({
85307
85425
  "detection-blind": "device-events",
85308
85426
  "motion-noisy": "device-events",
85309
85427
  "motion-calm": "device-events",
85428
+ "package-llm-silent": "device-events",
85429
+ "package-llm-answered": "device-events",
85310
85430
  "recording-stalled": "device-events",
85311
85431
  "recording-healthy": "device-events",
85312
85432
  "recording-degraded": "device-events",
@@ -85390,6 +85510,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
85390
85510
  label: "Motion without a subject",
85391
85511
  kinds: ["motion-noisy", "motion-calm"]
85392
85512
  },
85513
+ {
85514
+ id: "package-llm",
85515
+ family: "device-events",
85516
+ label: "Package confirm",
85517
+ kinds: ["package-llm-silent", "package-llm-answered"]
85518
+ },
85393
85519
  {
85394
85520
  id: "recording",
85395
85521
  family: "device-events",
@@ -85571,6 +85697,8 @@ var DEVICE_EVENTS = [
85571
85697
  "detection-blind",
85572
85698
  "motion-noisy",
85573
85699
  "motion-calm",
85700
+ "package-llm-silent",
85701
+ "package-llm-answered",
85574
85702
  "recording-stalled",
85575
85703
  "recording-healthy",
85576
85704
  "recording-degraded",
@@ -85839,6 +85967,15 @@ new Map([
85839
85967
  snapshotLabel: "Cameras with constant motion now",
85840
85968
  snapshotSection: null
85841
85969
  },
85970
+ {
85971
+ id: "package-llm-confirm",
85972
+ family: "device-events",
85973
+ label: "Package confirm (not answering / answering again)",
85974
+ bad: ["package-llm-silent"],
85975
+ recovery: ["package-llm-answered"],
85976
+ snapshotLabel: "Cameras whose package confirm is not answering",
85977
+ snapshotSection: null
85978
+ },
85842
85979
  {
85843
85980
  id: "recording-health",
85844
85981
  family: "device-events",
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-WH0qcOc8.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-B749Uhfl.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.2.630",
3
+ "version": "1.2.631",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",
@@ -75,7 +75,9 @@
75
75
  },
76
76
  "files": [
77
77
  "dist",
78
- "assets"
78
+ "assets",
79
+ "README.md",
80
+ "CHANGELOG.md"
79
81
  ],
80
82
  "scripts": {
81
83
  "build": "vite build && vite build --config vite.widgets.config.ts",