@camstack/types 1.2.418 → 1.2.419

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 (45) hide show
  1. package/dist/addon.js +2 -2
  2. package/dist/addon.mjs +2 -2
  3. package/dist/capabilities/addons.cap.d.ts +67 -1
  4. package/dist/capabilities/color.cap.d.ts +1 -0
  5. package/dist/capabilities/composer.cap.d.ts +3 -0
  6. package/dist/capabilities/core-blocks.cap.d.ts +21 -0
  7. package/dist/capabilities/group-commands.cap.d.ts +49 -0
  8. package/dist/capabilities/group-status.cap.d.ts +1 -1
  9. package/dist/capabilities/index.d.ts +4 -2
  10. package/dist/capabilities/notification-rules.cap.d.ts +46 -0
  11. package/dist/capabilities/osd-manager.cap.d.ts +12 -0
  12. package/dist/client.js +34 -5
  13. package/dist/client.mjs +34 -5
  14. package/dist/composition/composition.d.ts +1 -0
  15. package/dist/composition/helpers/actuator.d.ts +58 -0
  16. package/dist/composition/helpers/catalog.d.ts +7 -2
  17. package/dist/composition/helpers/index.d.ts +2 -1
  18. package/dist/composition/helpers/spec.d.ts +6 -1
  19. package/dist/{composition-B85l9j1M.mjs → composition-OhpuespA.mjs} +10 -3
  20. package/dist/{composition-OJKOJJD-.js → composition-re1aezX9.js} +21 -2
  21. package/dist/device/cap-vocabulary/entries/sensors.d.ts +1 -1
  22. package/dist/enums/event-category.d.ts +8 -0
  23. package/dist/enums.js +1 -1
  24. package/dist/enums.mjs +1 -1
  25. package/dist/{event-category-DXZ3f9Q5.js → event-category-Ave2VSxY.js} +8 -0
  26. package/dist/{event-category-DHXxB8t9.mjs → event-category-CT-hz5Rb.mjs} +8 -0
  27. package/dist/generated/addon-api.d.ts +21 -0
  28. package/dist/generated/cap-status-types.d.ts +3 -1
  29. package/dist/generated/capability-router-map.d.ts +5 -2
  30. package/dist/generated/device-local-state.d.ts +3 -0
  31. package/dist/generated/device-proxy.d.ts +3 -0
  32. package/dist/generated/device-scoped-caps.d.ts +1 -1
  33. package/dist/generated/history-catalog.d.ts +1 -1
  34. package/dist/generated/method-access-map.d.ts +1 -1
  35. package/dist/generated/method-device-selectors.d.ts +1 -1
  36. package/dist/generated/runtime-state-durability.d.ts +1 -1
  37. package/dist/generated/system-proxy.d.ts +1 -1
  38. package/dist/index.js +341 -19
  39. package/dist/index.mjs +328 -20
  40. package/dist/interfaces/event-bus.d.ts +15 -0
  41. package/dist/node.js +1 -1
  42. package/dist/node.mjs +1 -1
  43. package/dist/{sleep-7Gw3GJ4n.js → sleep-YJ6FVsUu.js} +8 -2
  44. package/dist/{sleep-B81gwQuR.mjs → sleep-bykKrTgu.mjs} +8 -2
  45. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-7Gw3GJ4n.js");
3
- const require_event_category = require("./event-category-DXZ3f9Q5.js");
4
- const require_composition = require("./composition-OJKOJJD-.js");
2
+ const require_sleep = require("./sleep-YJ6FVsUu.js");
3
+ const require_event_category = require("./event-category-Ave2VSxY.js");
4
+ const require_composition = require("./composition-re1aezX9.js");
5
5
  const require_node_color = require("./node-color.js");
6
6
  const require_err_msg = require("./err-msg-BhVbr0NX.js");
7
7
  const require_enums = require("./enums.js");
@@ -13284,6 +13284,7 @@ function numeric(input) {
13284
13284
  family: "numeric",
13285
13285
  deviceType: require_err_msg.DeviceType.Sensor,
13286
13286
  memberDeviceType: require_err_msg.DeviceType.Sensor,
13287
+ commandCaps: [],
13287
13288
  baseUnit: require_sleep.baseUnitOf(input.quantity),
13288
13289
  aggregates: require_composition.NUMERIC_AGGREGATES,
13289
13290
  accept: [{
@@ -13298,6 +13299,7 @@ function binary(input) {
13298
13299
  family: "binary",
13299
13300
  deviceType: require_err_msg.DeviceType.Sensor,
13300
13301
  memberDeviceType: require_err_msg.DeviceType.Sensor,
13302
+ commandCaps: [],
13301
13303
  quantity: "none",
13302
13304
  baseUnit: void 0,
13303
13305
  aggregates: require_composition.BINARY_AGGREGATES,
@@ -13492,13 +13494,139 @@ var GROUP_TEMPLATES = [
13492
13494
  fieldPath: "on"
13493
13495
  }],
13494
13496
  companions: [CHANGED]
13497
+ }),
13498
+ actuator({
13499
+ id: "switch",
13500
+ 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.",
13501
+ deviceType: require_err_msg.DeviceType.Switch,
13502
+ outputCap: "switch",
13503
+ commandCaps: ["switch"]
13504
+ }),
13505
+ actuator({
13506
+ id: "light",
13507
+ 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.",
13508
+ deviceType: require_err_msg.DeviceType.Light,
13509
+ outputCap: "switch",
13510
+ commandCaps: [
13511
+ "switch",
13512
+ "brightness",
13513
+ "color"
13514
+ ]
13495
13515
  })
13496
13516
  ];
13517
+ function actuator(input) {
13518
+ return {
13519
+ ...input,
13520
+ family: "actuator",
13521
+ role: void 0,
13522
+ memberDeviceType: input.deviceType,
13523
+ outputField: "on",
13524
+ quantity: "none",
13525
+ baseUnit: void 0,
13526
+ aggregates: require_composition.BINARY_AGGREGATES,
13527
+ defaultAggregate: "any",
13528
+ empty: "offline",
13529
+ accept: [{
13530
+ cap: "switch",
13531
+ fieldPath: "on"
13532
+ }],
13533
+ companions: [CHANGED]
13534
+ };
13535
+ }
13497
13536
  var BY_ID = new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
13498
13537
  function groupTemplate(id) {
13499
13538
  return BY_ID.get(id) ?? null;
13500
13539
  }
13501
13540
  //#endregion
13541
+ //#region src/composition/helpers/actuator.ts
13542
+ /**
13543
+ * Actuator groups (D944 phase 1b). The active boolean is the binary reducer
13544
+ * with unknown members left out. A command is one call per member that binds
13545
+ * the cap, including members that are offline. One failure does not cancel
13546
+ * the others.
13547
+ */
13548
+ /** Caps a light group may expose, in display order. Switch is the active state. */
13549
+ var LIGHT_SHARED_CAPS = [
13550
+ "switch",
13551
+ "brightness",
13552
+ "color"
13553
+ ];
13554
+ var COLOR_MODE_FEATURES = [
13555
+ require_err_msg.DeviceFeature.LightColorRgb,
13556
+ require_err_msg.DeviceFeature.LightColorHsv,
13557
+ require_err_msg.DeviceFeature.LightColorMired
13558
+ ];
13559
+ /** How many member calls run at once. The rest wait; none are dropped. */
13560
+ var FAN_OUT_CONCURRENCY = 4;
13561
+ /** `at-least-one` is any included member on; `all` is every included member on. */
13562
+ function reducerForActive(active) {
13563
+ return active === "all" ? "all" : "any";
13564
+ }
13565
+ function activeForReducer(reducer) {
13566
+ return reducer === "all" ? "all" : "at-least-one";
13567
+ }
13568
+ /**
13569
+ * Caps every member binds, from {@link LIGHT_SHARED_CAPS}. An empty member
13570
+ * list shares nothing. A member that lacks colour drops colour from the group.
13571
+ */
13572
+ function sharedLightCaps(memberCaps) {
13573
+ if (memberCaps.length === 0) return [];
13574
+ return LIGHT_SHARED_CAPS.filter((cap) => memberCaps.every((bound) => bound.includes(cap)));
13575
+ }
13576
+ /**
13577
+ * Colour modes every member advertises. Offline does not remove a mode:
13578
+ * the caller passes device features, not liveness. No members → no mode.
13579
+ */
13580
+ function sharedColorModes(memberFeatures) {
13581
+ if (memberFeatures.length === 0) return [];
13582
+ return COLOR_MODE_FEATURES.filter((mode) => memberFeatures.every((features) => features.includes(mode)));
13583
+ }
13584
+ /**
13585
+ * One call per member that binds `cap`. Offline members stay in the list.
13586
+ * A member without the cap is not called — the command cannot reach it.
13587
+ */
13588
+ function fanOutTargets(members, cap, method, args) {
13589
+ return members.flatMap((member) => member.caps.includes(cap) ? [{
13590
+ deviceId: member.deviceId,
13591
+ cap,
13592
+ method,
13593
+ args: { ...args }
13594
+ }] : []);
13595
+ }
13596
+ /**
13597
+ * Run every call. A throw is that member's result; the other calls still run.
13598
+ * At most {@link FAN_OUT_CONCURRENCY} are in flight.
13599
+ */
13600
+ async function runFanOut(calls, invoke) {
13601
+ const results = [];
13602
+ let next = 0;
13603
+ const worker = async () => {
13604
+ for (;;) {
13605
+ const index = next;
13606
+ next += 1;
13607
+ const call = calls[index];
13608
+ if (call === void 0) return;
13609
+ try {
13610
+ await invoke(call);
13611
+ results[index] = {
13612
+ deviceId: call.deviceId,
13613
+ ok: true
13614
+ };
13615
+ } catch (err) {
13616
+ const error = err instanceof Error ? err.message : String(err);
13617
+ results[index] = {
13618
+ deviceId: call.deviceId,
13619
+ ok: false,
13620
+ error
13621
+ };
13622
+ }
13623
+ }
13624
+ };
13625
+ const width = Math.min(4, calls.length);
13626
+ await Promise.all(Array.from({ length: width }, () => worker()));
13627
+ return results;
13628
+ }
13629
+ //#endregion
13502
13630
  //#region src/composition/helpers/compile.ts
13503
13631
  function sameSource(a, b) {
13504
13632
  return a.addonId === b.addonId && a.stableId === b.stableId;
@@ -13548,7 +13676,7 @@ function draftOf$1(template, spec) {
13548
13676
  target: {
13549
13677
  kind: "new",
13550
13678
  type: template.deviceType,
13551
- role: template.role
13679
+ ...template.role === void 0 ? {} : { role: template.role }
13552
13680
  },
13553
13681
  helper: spec,
13554
13682
  features: [{
@@ -13569,6 +13697,16 @@ function draftOf$1(template, spec) {
13569
13697
  }]
13570
13698
  };
13571
13699
  }
13700
+ function criterionProblems(template, spec) {
13701
+ if (template.family === "actuator") {
13702
+ if (spec.active === void 0) return [problem("kind-mismatch", "helper.active", `a ${template.id} group needs an active criterion (at-least-one or all)`)];
13703
+ const reducer = reducerForActive(spec.active);
13704
+ if (spec.aggregate !== reducer) return [problem("kind-mismatch", "helper.aggregate", `active \`${spec.active}\` aggregates by \`${reducer}\`, not \`${spec.aggregate}\``)];
13705
+ return [];
13706
+ }
13707
+ if (spec.active !== void 0) return [problem("kind-mismatch", "helper.active", `a ${template.id} group has no active criterion — that belongs to an actuator group`)];
13708
+ return [];
13709
+ }
13572
13710
  function parseDraft(draft) {
13573
13711
  const parsed = require_composition.CompositionSchema.safeParse(draft);
13574
13712
  if (parsed.success) return {
@@ -13587,6 +13725,11 @@ function compileHelper(spec) {
13587
13725
  ok: false,
13588
13726
  problems: [problem("member-constraint", "helper.templateId", `unknown template \`${spec.templateId}\``)]
13589
13727
  };
13728
+ const criterion = criterionProblems(template, spec);
13729
+ if (criterion.length > 0) return {
13730
+ ok: false,
13731
+ problems: criterion
13732
+ };
13590
13733
  if (!template.aggregates.includes(spec.aggregate)) {
13591
13734
  const allowed = template.aggregates.join(", ");
13592
13735
  return {
@@ -13853,11 +13996,22 @@ function composableCap(feature, at, lookupCap) {
13853
13996
  * required field. A REPLACE needs none of it: the cap is bound (a fact), the
13854
13997
  * native keeps serving its methods, and only the named fields are owned (D663).
13855
13998
  */
13856
- function builtCapProblems({ def, state, fields: targetFields }, feature, at, deviceType) {
13999
+ /**
14000
+ * Caps an actuator helper is allowed to serve. A free composition, and a
14001
+ * reading group, get an empty set — `has-commands` stays for them.
14002
+ */
14003
+ function actuatorCommandCaps(composition) {
14004
+ const spec = composition.helper;
14005
+ if (spec === void 0) return /* @__PURE__ */ new Set();
14006
+ const template = groupTemplate(spec.templateId);
14007
+ if (template === null || template.family !== "actuator") return /* @__PURE__ */ new Set();
14008
+ return new Set(template.commandCaps);
14009
+ }
14010
+ function builtCapProblems({ def, state, fields: targetFields }, feature, at, deviceType, servedCommands) {
13857
14011
  const problems = [];
13858
14012
  if (def.deviceTypes !== void 0 && !def.deviceTypes.includes(deviceType)) problems.push(problem("wrong-device-type", `${at}.cap`, `\`${def.name}\` is not offered on a \`${deviceType}\` device (it allows ${def.deviceTypes.join(", ")})`));
13859
14013
  const served = Object.entries(def.methods).filter(([name, m]) => m.systemOnly !== true && def.composedMethods?.[name] === void 0).map(([name]) => `\`${name}\``);
13860
- if (served.length > 0) problems.push(problem("has-commands", `${at}.cap`, `\`${def.name}\` has ${served.join(", ")}, which a composed device cannot serve until commands arrive (slice 3)`));
14014
+ if (served.length > 0 && !servedCommands.has(def.name)) problems.push(problem("has-commands", `${at}.cap`, `\`${def.name}\` has ${served.join(", ")}, which a composed device cannot serve until commands arrive (slice 3)`));
13861
14015
  const itemArrayPath = feature.items === void 0 ? null : def.status?.itemArray?.path ?? null;
13862
14016
  for (const key of requiredTopLevelKeys(state)) {
13863
14017
  if (key === itemArrayPath) continue;
@@ -13898,11 +14052,11 @@ function planTopLevelField({ def, fields }, field, mode, lookupCap) {
13898
14052
  events: []
13899
14053
  };
13900
14054
  }
13901
- function planFeature(feature, featureIndex, target, lookupCap) {
14055
+ function planFeature(feature, featureIndex, target, lookupCap, servedCommands) {
13902
14056
  const at = `features[${featureIndex}]`;
13903
14057
  const cap = composableCap(feature, at, lookupCap);
13904
14058
  if ("code" in cap) return refused(cap);
13905
- const capProblems = target.mode === "replace" ? [] : [...builtCapProblems(cap, feature, at, target.deviceType)];
14059
+ const capProblems = target.mode === "replace" ? [] : [...builtCapProblems(cap, feature, at, target.deviceType, servedCommands)];
13906
14060
  if (feature.commands !== void 0 && Object.keys(feature.commands).length > 0) capProblems.push(problem("reserved-variant", `${at}.commands`, "commands (`forward`) arrive in slice 3"));
13907
14061
  const perField = Object.entries(feature.fields).map(([path, source]) => planTopLevelField(cap, {
13908
14062
  featureIndex,
@@ -13988,6 +14142,7 @@ function featureTargetOf(target, cap, at) {
13988
14142
  function planComposition(composition, lookupCap, target) {
13989
14143
  const planTarget = planTargetOf(composition, target);
13990
14144
  if ("code" in planTarget) return refused(planTarget);
14145
+ const servedCommands = actuatorCommandCaps(composition);
13991
14146
  const results = composition.features.map((feature, index) => {
13992
14147
  const at = `features[${index}]`;
13993
14148
  if (feature.kind === "passthrough") return refused(problem("reserved-variant", at, `whole-capability passthrough of \`${feature.cap}\` arrives in slice 3`));
@@ -14002,9 +14157,9 @@ function planComposition(composition, lookupCap, target) {
14002
14157
  return nativeReplaceOrBlock(featureTarget, planFeature(feature, index, {
14003
14158
  mode: "add",
14004
14159
  deviceType: planTarget.found.type
14005
- }, lookupCap));
14160
+ }, lookupCap, servedCommands));
14006
14161
  }
14007
- const result = planFeature(feature, index, featureTarget, lookupCap);
14162
+ const result = planFeature(feature, index, featureTarget, lookupCap, servedCommands);
14008
14163
  return require_composition.compositionFeatureEnabled(feature) ? result : {
14009
14164
  problems: result.problems,
14010
14165
  fields: [],
@@ -44918,6 +45073,8 @@ var NcSystemEventKindSchema = zod.z.enum([
44918
45073
  "detection-blind",
44919
45074
  "motion-noisy",
44920
45075
  "motion-calm",
45076
+ "package-llm-silent",
45077
+ "package-llm-answered",
44921
45078
  "recording-stalled",
44922
45079
  "recording-healthy",
44923
45080
  "recording-degraded",
@@ -46562,6 +46719,14 @@ var NC_CONDITION_CATALOG = [
46562
46719
  value: "motion-calm",
46563
46720
  label: "Camera motion calm again"
46564
46721
  },
46722
+ {
46723
+ value: "package-llm-silent",
46724
+ label: "Package confirm not answering"
46725
+ },
46726
+ {
46727
+ value: "package-llm-answered",
46728
+ label: "Package confirm answering again"
46729
+ },
46565
46730
  {
46566
46731
  value: "recording-stalled",
46567
46732
  label: "Recording stalled"
@@ -60593,6 +60758,28 @@ var PackageVersionInfoSchema = zod.z.object({
60593
60758
  deprecated: zod.z.string().optional(),
60594
60759
  distTags: zod.z.array(zod.z.string()).readonly()
60595
60760
  });
60761
+ /**
60762
+ * One published document. `ok` is markdown from the registry. `missing` means
60763
+ * the registry answered and the file was not there. `error` is a registry or
60764
+ * tarball failure — never an empty string standing in for either.
60765
+ */
60766
+ var PackageDocBodySchema = zod.z.discriminatedUnion("status", [
60767
+ zod.z.object({
60768
+ status: zod.z.literal("ok"),
60769
+ markdown: zod.z.string()
60770
+ }),
60771
+ zod.z.object({ status: zod.z.literal("missing") }),
60772
+ zod.z.object({
60773
+ status: zod.z.literal("error"),
60774
+ message: zod.z.string()
60775
+ })
60776
+ ]);
60777
+ var PackageDocsSchema = zod.z.object({
60778
+ name: zod.z.string(),
60779
+ version: zod.z.string(),
60780
+ readme: PackageDocBodySchema,
60781
+ changelog: PackageDocBodySchema
60782
+ });
60596
60783
  var SearchResultSchema = zod.z.object({
60597
60784
  name: zod.z.string(),
60598
60785
  version: zod.z.string(),
@@ -60959,6 +61146,15 @@ var addonsCapability = {
60959
61146
  auth: "admin"
60960
61147
  }),
60961
61148
  getVersions: require_sleep.method(zod.z.object({ name: zod.z.string() }), zod.z.array(PackageVersionInfoSchema).readonly()),
61149
+ /**
61150
+ * README and CHANGELOG for one registry package, read on the hub and
61151
+ * cached. `version` omitted resolves the `latest` dist-tag. The browser
61152
+ * never talks to the registry.
61153
+ */
61154
+ getPackageDocs: require_sleep.method(zod.z.object({
61155
+ name: zod.z.string().min(1),
61156
+ version: zod.z.string().min(1).optional()
61157
+ }), PackageDocsSchema, { auth: "admin" }),
60962
61158
  restartAddon: require_sleep.method(zod.z.object({ addonId: zod.z.string() }), RestartAddonResultSchema, {
60963
61159
  kind: "mutation",
60964
61160
  auth: "admin"
@@ -62520,6 +62716,10 @@ var ColorStatusSchema = zod.z.object({
62520
62716
  /** Ms epoch of the last operator-driven change. */
62521
62717
  lastChangedAt: zod.z.number()
62522
62718
  });
62719
+ function parseColorInput(value) {
62720
+ const parsed = ColorInputSchema.safeParse(value);
62721
+ return parsed.success ? parsed.data : null;
62722
+ }
62523
62723
  var colorCapability = {
62524
62724
  name: "color",
62525
62725
  scope: "device",
@@ -64718,6 +64918,48 @@ var gasCapability = {
64718
64918
  volatileStateFields: ["lastChangedAt"]
64719
64919
  };
64720
64920
  //#endregion
64921
+ //#region src/capabilities/group-commands.cap.ts
64922
+ /**
64923
+ * The last command a helper actuator group sent to each member (D944).
64924
+ * The composer writes this slice; the aggregate pass does not, so a later
64925
+ * reading does not wipe it. History is none — the outcome is the latest
64926
+ * attempt, not a series.
64927
+ */
64928
+ var GroupCommandResultSchema = zod.z.object({
64929
+ deviceId: zod.z.number().int().nonnegative(),
64930
+ cap: zod.z.string().min(1),
64931
+ method: zod.z.string().min(1),
64932
+ ok: zod.z.boolean(),
64933
+ error: zod.z.string().optional(),
64934
+ /** Ms epoch of the attempt. */
64935
+ at: zod.z.number()
64936
+ });
64937
+ var GroupCommandsSchema = zod.z.object({
64938
+ /** One row per member that has been commanded. A later command replaces that member's row. */
64939
+ results: zod.z.array(GroupCommandResultSchema) });
64940
+ var groupCommandsCapability = {
64941
+ name: "group-commands",
64942
+ scope: "device",
64943
+ deviceNative: true,
64944
+ mode: "singleton",
64945
+ deviceTypes: [require_err_msg.DeviceType.Switch, require_err_msg.DeviceType.Light],
64946
+ methods: {},
64947
+ status: {
64948
+ schema: GroupCommandsSchema,
64949
+ kind: "push"
64950
+ },
64951
+ runtimeState: GroupCommandsSchema,
64952
+ /**
64953
+ * Runtime-state durability: **session** — the last attempt. A restored
64954
+ * failure would outlive the command that caused it.
64955
+ *
64956
+ * See `RuntimeStateDurability`. Enforced by
64957
+ * `scripts/check-runtime-state-durability.ts`.
64958
+ */
64959
+ durability: "session",
64960
+ history: "none"
64961
+ };
64962
+ //#endregion
64721
64963
  //#region src/capabilities/group-status.cap.ts
64722
64964
  /**
64723
64965
  * How many members of a helper group answered (D944). Counts are integers,
@@ -64747,7 +64989,11 @@ var groupStatusCapability = {
64747
64989
  scope: "device",
64748
64990
  deviceNative: true,
64749
64991
  mode: "singleton",
64750
- deviceTypes: [require_err_msg.DeviceType.Sensor],
64992
+ deviceTypes: [
64993
+ require_err_msg.DeviceType.Sensor,
64994
+ require_err_msg.DeviceType.Switch,
64995
+ require_err_msg.DeviceType.Light
64996
+ ],
64751
64997
  methods: {},
64752
64998
  status: {
64753
64999
  schema: GroupStatusSchema,
@@ -77734,7 +77980,7 @@ function sourcePickForTemplate(template) {
77734
77980
  required: false,
77735
77981
  minRetentionMs: null
77736
77982
  },
77737
- mustBindCaps: [],
77983
+ mustBindCaps: template.family === "actuator" ? [template.outputCap] : [],
77738
77984
  exclude: []
77739
77985
  };
77740
77986
  }
@@ -81219,6 +81465,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
81219
81465
  featureProbe: featureProbeCapability,
81220
81466
  flood: floodCapability,
81221
81467
  gas: gasCapability,
81468
+ groupCommands: groupCommandsCapability,
81222
81469
  groupStatus: groupStatusCapability,
81223
81470
  heatingValve: heatingValveCapability,
81224
81471
  humidifier: humidifierCapability,
@@ -83437,6 +83684,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
83437
83684
  access: "view",
83438
83685
  role: "admin"
83439
83686
  },
83687
+ "addons.getPackageDocs": {
83688
+ capName: "addons",
83689
+ capScope: "system",
83690
+ addonId: null,
83691
+ access: "view",
83692
+ role: "admin"
83693
+ },
83440
83694
  "addons.getVersions": {
83441
83695
  capName: "addons",
83442
83696
  capScope: "system",
@@ -86545,6 +86799,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
86545
86799
  access: "view",
86546
86800
  role: "viewer"
86547
86801
  },
86802
+ "groupCommands.getStatus": {
86803
+ capName: "group-commands",
86804
+ capScope: "device",
86805
+ addonId: null,
86806
+ access: "view",
86807
+ role: "viewer"
86808
+ },
86548
86809
  "groupStatus.getStatus": {
86549
86810
  capName: "group-status",
86550
86811
  capScope: "device",
@@ -93090,6 +93351,7 @@ var KNOWN_CAP_NAMES = [
93090
93351
  "filesystem-browse",
93091
93352
  "flood",
93092
93353
  "gas",
93354
+ "group-commands",
93093
93355
  "group-status",
93094
93356
  "heating-valve",
93095
93357
  "humidifier",
@@ -93239,6 +93501,7 @@ var DEVICE_CAP_NAMES = [
93239
93501
  "feature-probe",
93240
93502
  "flood",
93241
93503
  "gas",
93504
+ "group-commands",
93242
93505
  "group-status",
93243
93506
  "heating-valve",
93244
93507
  "humidifier",
@@ -96757,6 +97020,10 @@ var SENSOR_CAP_VOCABULARY = {
96757
97020
  icon: "flame"
96758
97021
  }]
96759
97022
  },
97023
+ "group-commands": {
97024
+ scope: "device",
97025
+ noun: t("Group command", "Comando di gruppo")
97026
+ },
96760
97027
  "group-status": {
96761
97028
  scope: "device",
96762
97029
  noun: t("Group", "Gruppo"),
@@ -98921,6 +99188,7 @@ var CAP_NAMES_WITH_STATUS = [
98921
99188
  "feature-probe",
98922
99189
  "flood",
98923
99190
  "gas",
99191
+ "group-commands",
98924
99192
  "group-status",
98925
99193
  "heating-valve",
98926
99194
  "humidifier",
@@ -99044,6 +99312,7 @@ var CAPABILITY_NAMES = {
99044
99312
  filesystemBrowse: "filesystem-browse",
99045
99313
  flood: "flood",
99046
99314
  gas: "gas",
99315
+ groupCommands: "group-commands",
99047
99316
  groupStatus: "group-status",
99048
99317
  heatingValve: "heating-valve",
99049
99318
  humidifier: "humidifier",
@@ -99451,6 +99720,10 @@ var CAPABILITY_ROUTER_KEYS = [
99451
99720
  key: "gas",
99452
99721
  name: "gas"
99453
99722
  },
99723
+ {
99724
+ key: "groupCommands",
99725
+ name: "group-commands"
99726
+ },
99454
99727
  {
99455
99728
  key: "groupStatus",
99456
99729
  name: "group-status"
@@ -99968,6 +100241,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
99968
100241
  filesystemBrowseCapability,
99969
100242
  floodCapability,
99970
100243
  gasCapability,
100244
+ groupCommandsCapability,
99971
100245
  groupStatusCapability,
99972
100246
  heatingValveCapability,
99973
100247
  humidifierCapability,
@@ -101045,6 +101319,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
101045
101319
  form: "single",
101046
101320
  optional: false
101047
101321
  }],
101322
+ "groupCommands.getStatus": [{
101323
+ name: "deviceId",
101324
+ form: "single",
101325
+ optional: false
101326
+ }],
101048
101327
  "groupStatus.getStatus": [{
101049
101328
  name: "deviceId",
101050
101329
  form: "single",
@@ -103061,7 +103340,7 @@ function getCapsByProviderKind(kind) {
103061
103340
  //#region src/generated/runtime-state-durability.ts
103062
103341
  /**
103063
103342
  * Per-cap runtime-state policy, projected from every `*.cap.ts` that declares
103064
- * `runtimeState`. 73 caps: 38 `restored`, 35 `session`.
103343
+ * `runtimeState`. 74 caps: 38 `restored`, 36 `session`.
103065
103344
  *
103066
103345
  * A cap absent from this map has no runtime-state slice at all. A cap PRESENT
103067
103346
  * with `durability: 'session'` has one and has decided not to keep it.
@@ -103179,6 +103458,10 @@ var RUNTIME_STATE_POLICY = {
103179
103458
  durability: "restored",
103180
103459
  volatileFields: ["lastChangedAt"]
103181
103460
  },
103461
+ "group-commands": {
103462
+ durability: "session",
103463
+ volatileFields: []
103464
+ },
103182
103465
  "group-status": {
103183
103466
  durability: "session",
103184
103467
  volatileFields: []
@@ -103525,7 +103808,7 @@ var BucketAccumulator = class {
103525
103808
  //#region src/generated/history-catalog.ts
103526
103809
  /**
103527
103810
  * Cap history catalog, projected from every `*.cap.ts` `history` block.
103528
- * 41 caps with series (75 series), 31 caps answered `'none'`.
103811
+ * 41 caps with series (75 series), 32 caps answered `'none'`.
103529
103812
  * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
103530
103813
  */
103531
103814
  var HISTORY_CATALOG = {
@@ -103926,6 +104209,7 @@ var HISTORY_NONE_CAPS = [
103926
104209
  "doorbell",
103927
104210
  "event-emitter",
103928
104211
  "feature-probe",
104212
+ "group-commands",
103929
104213
  "group-status",
103930
104214
  "image",
103931
104215
  "image-settings",
@@ -104505,6 +104789,7 @@ function createSystemProxy(api) {
104505
104789
  listCapabilityProviders: (input) => dispatch("addons", "listCapabilityProviders", "query", input),
104506
104790
  setCapabilityProviderEnabled: (input) => dispatch("addons", "setCapabilityProviderEnabled", "mutation", input),
104507
104791
  getVersions: (input) => dispatch("addons", "getVersions", "query", input),
104792
+ getPackageDocs: (input) => dispatch("addons", "getPackageDocs", "query", input),
104508
104793
  restartAddon: (input) => dispatch("addons", "restartAddon", "mutation", input),
104509
104794
  retryLoad: (input) => dispatch("addons", "retryLoad", "mutation", input),
104510
104795
  getAutoUpdateSettings: (input) => dispatch("addons", "getAutoUpdateSettings", "query", input),
@@ -106087,8 +106372,8 @@ var NC_SYSTEM_EVENT_FILTER_KEYS = [
106087
106372
  function systemEventFilterApplies(kind, filter) {
106088
106373
  if (LEGACY_KINDS_WITHOUT_FILTERS.has(kind)) return false;
106089
106374
  switch (filter) {
106090
- case "deviceIds": return kind.startsWith("device-") || kind.startsWith("stream-") || kind === "detection-blind" || kind.startsWith("motion-") || kind.startsWith("recording-") || kind === "alarm-triggered";
106091
- case "deviceTypes": return kind.startsWith("device-") || kind === "detection-blind" || kind.startsWith("motion-");
106375
+ case "deviceIds": return kind.startsWith("device-") || kind.startsWith("stream-") || kind === "detection-blind" || kind.startsWith("motion-") || kind.startsWith("package-llm-") || kind.startsWith("recording-") || kind === "alarm-triggered";
106376
+ case "deviceTypes": return kind.startsWith("device-") || kind === "detection-blind" || kind.startsWith("motion-") || kind.startsWith("package-llm-");
106092
106377
  case "nodeIds": return kind.startsWith("node-") || kind === "addon-crash-loop" || kind === "addon-update-available" || kind === "addon-updated" || kind === "server-update-available" || kind === "wrapper-update-available" || kind === "server-updated" || kind.startsWith("storage-location-") || kind.startsWith("alert-");
106093
106378
  case "packageNames": return kind.endsWith("update-available") || kind === "addon-updated" || kind === "node-updating" || kind === "server-updated";
106094
106379
  case "consumableLowPercent": return NC_CONSUMABLE_SYSTEM_EVENT_KINDS.includes(kind);
@@ -106145,6 +106430,8 @@ var NC_SYSTEM_EVENT_FAMILY = {
106145
106430
  "detection-blind": "device-events",
106146
106431
  "motion-noisy": "device-events",
106147
106432
  "motion-calm": "device-events",
106433
+ "package-llm-silent": "device-events",
106434
+ "package-llm-answered": "device-events",
106148
106435
  "recording-stalled": "device-events",
106149
106436
  "recording-healthy": "device-events",
106150
106437
  "recording-degraded": "device-events",
@@ -106246,6 +106533,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
106246
106533
  label: "Motion without a subject",
106247
106534
  kinds: ["motion-noisy", "motion-calm"]
106248
106535
  },
106536
+ {
106537
+ id: "package-llm",
106538
+ family: "device-events",
106539
+ label: "Package confirm",
106540
+ kinds: ["package-llm-silent", "package-llm-answered"]
106541
+ },
106249
106542
  {
106250
106543
  id: "recording",
106251
106544
  family: "device-events",
@@ -108166,6 +108459,8 @@ var DEVICE_EVENTS = [
108166
108459
  "detection-blind",
108167
108460
  "motion-noisy",
108168
108461
  "motion-calm",
108462
+ "package-llm-silent",
108463
+ "package-llm-answered",
108169
108464
  "recording-stalled",
108170
108465
  "recording-healthy",
108171
108466
  "recording-degraded",
@@ -108769,7 +109064,8 @@ var NC_TEMPLATE_VARS = [
108769
109064
  systemEventKinds: [
108770
109065
  "recording-degraded",
108771
109066
  ...DEVICE_ATTENTION,
108772
- ...ALERT_EPISODE
109067
+ ...ALERT_EPISODE,
109068
+ "package-llm-silent"
108773
109069
  ]
108774
109070
  },
108775
109071
  {
@@ -108862,7 +109158,8 @@ var NC_TEMPLATE_VARS = [
108862
109158
  systemEventKinds: [
108863
109159
  "storage-location-low",
108864
109160
  "storage-location-critical",
108865
- "storage-location-ok"
109161
+ "storage-location-ok",
109162
+ "package-llm-silent"
108866
109163
  ]
108867
109164
  },
108868
109165
  {
@@ -109273,7 +109570,9 @@ var NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS = [
109273
109570
  "device-attention-required",
109274
109571
  "device-attention-resolved",
109275
109572
  "rule-broken",
109276
- "rule-repaired"
109573
+ "rule-repaired",
109574
+ "package-llm-silent",
109575
+ "package-llm-answered"
109277
109576
  ];
109278
109577
  /**
109279
109578
  * The catalog as `getTemplateCatalog` SERVES it: every descriptor, with the
@@ -109435,6 +109734,15 @@ var NC_SYSTEM_EVENT_CLASS_SPECS = [
109435
109734
  snapshotLabel: "Cameras with constant motion now",
109436
109735
  snapshotSection: null
109437
109736
  },
109737
+ {
109738
+ id: "package-llm-confirm",
109739
+ family: "device-events",
109740
+ label: "Package confirm (not answering / answering again)",
109741
+ bad: ["package-llm-silent"],
109742
+ recovery: ["package-llm-answered"],
109743
+ snapshotLabel: "Cameras whose package confirm is not answering",
109744
+ snapshotSection: null
109745
+ },
109438
109746
  {
109439
109747
  id: "recording-health",
109440
109748
  family: "device-events",
@@ -115178,6 +115486,7 @@ function armRemovalReconcile(opts) {
115178
115486
  //#endregion
115179
115487
  exports.ACCESSORY_LABEL = ACCESSORY_LABEL;
115180
115488
  exports.ACCESS_ROLES = ACCESS_ROLES;
115489
+ exports.ACTIVE_CRITERIA = require_composition.ACTIVE_CRITERIA;
115181
115490
  exports.ADMIN_SCOPE = ADMIN_SCOPE;
115182
115491
  exports.AGENT_MDNS_QUERY_NAME = AGENT_MDNS_QUERY_NAME;
115183
115492
  exports.AGENT_MDNS_SERVICE_TYPE = AGENT_MDNS_SERVICE_TYPE;
@@ -115216,6 +115525,7 @@ exports.AcceleratorComputeSchema = AcceleratorComputeSchema;
115216
115525
  exports.AcceleratorKindSchema = AcceleratorKindSchema;
115217
115526
  exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
115218
115527
  exports.AccessoryKind = AccessoryKind;
115528
+ exports.ActiveCriterionSchema = require_composition.ActiveCriterionSchema;
115219
115529
  exports.AddBrokerInputSchema = AddBrokerInputSchema;
115220
115530
  exports.AddRetrainFrameFromRecordingResultSchema = AddRetrainFrameFromRecordingResultSchema;
115221
115531
  exports.AddonAutoUpdateSchema = AddonAutoUpdateSchema;
@@ -115869,6 +116179,7 @@ exports.FACE_RESCORE_INTERVAL_FIELD = FACE_RESCORE_INTERVAL_FIELD;
115869
116179
  exports.FACE_RESCORE_INTERVAL_KEY = FACE_RESCORE_INTERVAL_KEY;
115870
116180
  exports.FACE_RESCORE_INTERVAL_MIN_RUNNING = FACE_RESCORE_INTERVAL_MIN_RUNNING;
115871
116181
  exports.FACE_RESCORE_SECTION_ID = FACE_RESCORE_SECTION_ID;
116182
+ exports.FAN_OUT_CONCURRENCY = FAN_OUT_CONCURRENCY;
115872
116183
  exports.FEEDER_EXAMPLE_ADDON_ID = FEEDER_EXAMPLE_ADDON_ID;
115873
116184
  exports.FEEDER_EXAMPLE_HA_DEVICE_ID = FEEDER_EXAMPLE_HA_DEVICE_ID;
115874
116185
  exports.FFMPEG_PATH_ENV = require_composition.FFMPEG_PATH_ENV;
@@ -115900,6 +116211,8 @@ exports.GetStreamWithCodecInputSchema = GetStreamWithCodecInputSchema;
115900
116211
  exports.GlobalMetricsSchema = GlobalMetricsSchema;
115901
116212
  exports.GridLayoutPatchSchema = GridLayoutPatchSchema;
115902
116213
  exports.GridLayoutViewSchema = GridLayoutViewSchema;
116214
+ exports.GroupCommandResultSchema = GroupCommandResultSchema;
116215
+ exports.GroupCommandsSchema = GroupCommandsSchema;
115903
116216
  exports.GroupHelperSpecSchema = require_composition.GroupHelperSpecSchema;
115904
116217
  exports.GroupStatusSchema = GroupStatusSchema;
115905
116218
  exports.GroupTemplateIdSchema = require_composition.GroupTemplateIdSchema;
@@ -115987,6 +116300,7 @@ exports.LABEL_SUPPLY_MACRO = LABEL_SUPPLY_MACRO;
115987
116300
  exports.LABEL_SUPPLY_STEP_IDS = LABEL_SUPPLY_STEP_IDS;
115988
116301
  exports.LABEL_SUPPLY_VOCABULARIES = LABEL_SUPPLY_VOCABULARIES;
115989
116302
  exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
116303
+ exports.LIGHT_SHARED_CAPS = LIGHT_SHARED_CAPS;
115990
116304
  exports.LINKED_DEVICES_SLOT = LINKED_DEVICES_SLOT;
115991
116305
  exports.LINKED_LABEL_STEP_PREFIX = LINKED_LABEL_STEP_PREFIX;
115992
116306
  exports.LLM_PROFILE_KIND_PATTERN = LLM_PROFILE_KIND_PATTERN;
@@ -117196,6 +117510,7 @@ exports.actionsForDevice = actionsForDevice;
117196
117510
  exports.actionsForDeviceType = actionsForDeviceType;
117197
117511
  exports.actionsForDevices = actionsForDevices;
117198
117512
  exports.activateAlarmProfile = activateAlarmProfile;
117513
+ exports.activeForReducer = activeForReducer;
117199
117514
  exports.addonCatalogHref = addonCatalogHref;
117200
117515
  exports.addonPagesCapability = addonPagesCapability;
117201
117516
  exports.addonPagesSourceCapability = addonPagesSourceCapability;
@@ -117543,6 +117858,7 @@ exports.faceGalleryCapability = faceGalleryCapability;
117543
117858
  exports.failureContributionCapability = failureContributionCapability;
117544
117859
  exports.failureRate = failureRate;
117545
117860
  exports.fanControlCapability = fanControlCapability;
117861
+ exports.fanOutTargets = fanOutTargets;
117546
117862
  exports.featureFieldEntries = require_composition.featureFieldEntries;
117547
117863
  exports.featureOfRole = featureOfRole;
117548
117864
  exports.featureProbeCapability = featureProbeCapability;
@@ -117586,6 +117902,7 @@ exports.gifFilterComplex = gifFilterComplex;
117586
117902
  exports.gifFromMp4Args = gifFromMp4Args;
117587
117903
  exports.globalSecretScope = require_sleep.globalSecretScope;
117588
117904
  exports.grantRowsOf = grantRowsOf;
117905
+ exports.groupCommandsCapability = groupCommandsCapability;
117589
117906
  exports.groupStatusCapability = groupStatusCapability;
117590
117907
  exports.groupTemplate = groupTemplate;
117591
117908
  exports.hasModelBoundOverrides = hasModelBoundOverrides;
@@ -117825,6 +118142,7 @@ exports.parseAppAuthCallback = parseAppAuthCallback;
117825
118142
  exports.parseAppFlowRequest = parseAppFlowRequest;
117826
118143
  exports.parseAppPageLang = parseAppPageLang;
117827
118144
  exports.parseCameraStreamConfig = parseCameraStreamConfig;
118145
+ exports.parseColorInput = parseColorInput;
117828
118146
  exports.parseCredentialScopes = parseCredentialScopes;
117829
118147
  exports.parseDeviceEnrollmentLink = parseDeviceEnrollmentLink;
117830
118148
  exports.parseExpression = require_composition.parseExpression;
@@ -117934,6 +118252,7 @@ exports.recordsCapability = recordsCapability;
117934
118252
  exports.recordsErrorFromMessage = require_sleep.recordsErrorFromMessage;
117935
118253
  exports.rectsToCells = rectsToCells;
117936
118254
  exports.reducePoints = reducePoints;
118255
+ exports.reducerForActive = reducerForActive;
117937
118256
  exports.registerKnownSecret = require_sleep.registerKnownSecret;
117938
118257
  exports.remapCropDetections = remapCropDetections;
117939
118258
  exports.renameAlarmProfile = renameAlarmProfile;
@@ -118010,6 +118329,7 @@ exports.ruleSection = ruleSection;
118010
118329
  exports.ruleSectionOf = ruleSectionOf;
118011
118330
  exports.ruleSeedForSection = ruleSeedForSection;
118012
118331
  exports.ruleTriggerZoneIds = ruleTriggerZoneIds;
118332
+ exports.runFanOut = runFanOut;
118013
118333
  exports.runInferenceStep = runInferenceStep;
118014
118334
  exports.runningFromDishwasherOperation = runningFromDishwasherOperation;
118015
118335
  exports.runningFromLawnMower = runningFromLawnMower;
@@ -118058,6 +118378,8 @@ exports.settingValuesEqual = settingValuesEqual;
118058
118378
  exports.settingsBelow = settingsBelow;
118059
118379
  exports.settingsStoreCapability = settingsStoreCapability;
118060
118380
  exports.shareViewGrantOf = shareViewGrantOf;
118381
+ exports.sharedColorModes = sharedColorModes;
118382
+ exports.sharedLightCaps = sharedLightCaps;
118061
118383
  exports.shortHostname = shortHostname;
118062
118384
  exports.shortSecretRefHash = require_sleep.shortSecretRefHash;
118063
118385
  exports.signalPercentFromBars = signalPercentFromBars;