@camstack/types 1.2.405 → 1.2.406

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 (41) hide show
  1. package/dist/addon.js +21 -2
  2. package/dist/addon.mjs +21 -2
  3. package/dist/capabilities/index.d.ts +4 -2
  4. package/dist/capabilities/notification-rules.cap.d.ts +3 -78
  5. package/dist/capabilities/osd-manager.cap.d.ts +0 -18
  6. package/dist/capabilities/running-state.cap.d.ts +76 -0
  7. package/dist/client.js +10 -62
  8. package/dist/client.mjs +10 -62
  9. package/dist/{composition-eoYYVfOp.js → composition-RmnnN39T.js} +86 -2
  10. package/dist/{composition-CB6PMT9p.mjs → composition-xz-ud5EQ.mjs} +86 -2
  11. package/dist/device/cap-vocabulary/entries/appliances.d.ts +1 -1
  12. package/dist/enums/event-category.d.ts +4 -0
  13. package/dist/enums.js +1 -1
  14. package/dist/enums.mjs +1 -1
  15. package/dist/{event-category-fDPduoeC.mjs → event-category-Ceif8n-v.mjs} +4 -0
  16. package/dist/{event-category-CXrwjC3e.js → event-category-DG6Vir8Z.js} +4 -0
  17. package/dist/expression/builtins.d.ts +7 -18
  18. package/dist/expression/expression-source.d.ts +14 -2
  19. package/dist/generated/addon-api.d.ts +14 -0
  20. package/dist/generated/addon-cap-facts.d.ts +1 -1
  21. package/dist/generated/cap-status-types.d.ts +3 -1
  22. package/dist/generated/capability-router-map.d.ts +5 -2
  23. package/dist/generated/device-local-state.d.ts +3 -0
  24. package/dist/generated/device-proxy.d.ts +3 -0
  25. package/dist/generated/device-scoped-caps.d.ts +1 -1
  26. package/dist/generated/history-catalog.d.ts +1 -1
  27. package/dist/generated/method-access-map.d.ts +1 -1
  28. package/dist/generated/method-device-selectors.d.ts +1 -1
  29. package/dist/generated/runtime-state-durability.d.ts +1 -1
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +345 -88
  32. package/dist/index.mjs +331 -88
  33. package/dist/interfaces/config-ui.d.ts +69 -2
  34. package/dist/node.js +1 -1
  35. package/dist/node.mjs +1 -1
  36. package/dist/running-state/assignment.d.ts +34 -0
  37. package/dist/running-state/defaults.d.ts +3 -0
  38. package/dist/running-state/from-operation.d.ts +14 -0
  39. package/dist/{sleep-CHIEEJkY.mjs → sleep-CYfIZzGv.mjs} +7 -3
  40. package/dist/{sleep-BKS4OPMo.js → sleep-UP964hNP.js} +7 -3
  41. 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-BKS4OPMo.js");
3
- const require_event_category = require("./event-category-CXrwjC3e.js");
4
- const require_composition = require("./composition-eoYYVfOp.js");
2
+ const require_sleep = require("./sleep-UP964hNP.js");
3
+ const require_event_category = require("./event-category-DG6Vir8Z.js");
4
+ const require_composition = require("./composition-RmnnN39T.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");
@@ -12871,7 +12871,15 @@ var BUILTIN_RESULT_KINDS = Object.freeze({
12871
12871
  kind: "fixed",
12872
12872
  result: ["number", "null"]
12873
12873
  },
12874
- count: NUMBER
12874
+ count: NUMBER,
12875
+ dwell: {
12876
+ kind: "fixed",
12877
+ result: ["boolean", "null"]
12878
+ },
12879
+ latchedAt: {
12880
+ kind: "fixed",
12881
+ result: ["number", "null"]
12882
+ }
12875
12883
  });
12876
12884
  var KindInferenceError = class extends Error {};
12877
12885
  function kindOfValue(value) {
@@ -43726,9 +43734,6 @@ var NcSystemEventKindSchema = zod.z.enum([
43726
43734
  "device-battery-normal",
43727
43735
  "device-consumable-low",
43728
43736
  "device-consumable-normal",
43729
- "device-tank-low",
43730
- "device-tank-full",
43731
- "device-tank-normal",
43732
43737
  "stream-online",
43733
43738
  "stream-offline",
43734
43739
  "node-online",
@@ -43775,18 +43780,19 @@ var NcSystemEventKindSchema = zod.z.enum([
43775
43780
  "camera-enabled"
43776
43781
  ]);
43777
43782
  /** The legacy tail of {@link NcSystemEventKindSchema} — see its docblock. */
43778
- var NC_LEGACY_SYSTEM_EVENT_KINDS = new Set([
43783
+ var NC_LEGACY_SYSTEM_EVENT_KINDS = [
43779
43784
  "camera-online",
43780
43785
  "camera-offline",
43781
43786
  "camera-disabled",
43782
43787
  "camera-enabled"
43783
- ]);
43788
+ ];
43789
+ var NC_LEGACY_SYSTEM_EVENT_KIND_SET = new Set(NC_LEGACY_SYSTEM_EVENT_KINDS);
43784
43790
  /**
43785
43791
  * The kinds a rule may be AUTHORED with — every schema member except the
43786
43792
  * legacy tail. Editors render THIS list; the schema still parses the tail so a
43787
43793
  * durable row (and an unmigrated rule) survives being read.
43788
43794
  */
43789
- var NC_AUTHORABLE_SYSTEM_EVENT_KINDS = NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KINDS.has(kind));
43795
+ var NC_AUTHORABLE_SYSTEM_EVENT_KINDS = NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KIND_SET.has(kind));
43790
43796
  /**
43791
43797
  * The panel's transitions, as ONE list.
43792
43798
  *
@@ -43831,12 +43837,6 @@ var NC_BATTERY_CONSUMABLE_SYSTEM_EVENT_KINDS = [
43831
43837
  * and both editors read it.
43832
43838
  */
43833
43839
  var NC_CONSUMABLE_SYSTEM_EVENT_KINDS = ["device-consumable-low", "device-consumable-normal"];
43834
- /** A vacuum's tank alerts (D642) — raised on the provider's own verdict. */
43835
- var NC_TANK_SYSTEM_EVENT_KINDS = [
43836
- "device-tank-low",
43837
- "device-tank-full",
43838
- "device-tank-normal"
43839
- ];
43840
43840
  /**
43841
43841
  * The consumable threshold a rule that does not state one judges at (D642).
43842
43842
  * The operator's number ("default 15 %, configurable on the rule"), and the
@@ -45072,18 +45072,18 @@ var NcRuleSchema = NcRuleInputSchema.extend({
45072
45072
  * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
45073
45073
  * job is not an open state, and the alarm stays instant.
45074
45074
  */
45075
- var NcStateSummarySectionIdSchema = zod.z.enum([
45075
+ var NC_STATE_SUMMARY_SECTION_IDS = [
45076
45076
  "device-state",
45077
45077
  "streams",
45078
45078
  "battery",
45079
45079
  "consumables",
45080
- "tanks",
45081
45080
  "detection-blind",
45082
45081
  "nodes",
45083
45082
  "addons",
45084
45083
  "addon-updates",
45085
45084
  "updates"
45086
- ]);
45085
+ ];
45086
+ var NcStateSummarySectionIdSchema = zod.z.enum(NC_STATE_SUMMARY_SECTION_IDS);
45087
45087
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
45088
45088
  var NcStateSummaryPreviewSectionSchema = zod.z.object({
45089
45089
  id: NcStateSummarySectionIdSchema,
@@ -45460,18 +45460,6 @@ var NC_CONDITION_CATALOG = [
45460
45460
  value: "device-consumable-normal",
45461
45461
  label: "Consumable replaced"
45462
45462
  },
45463
- {
45464
- value: "device-tank-low",
45465
- label: "Tank low (water, detergent)"
45466
- },
45467
- {
45468
- value: "device-tank-full",
45469
- label: "Tank full (dirty water, dust)"
45470
- },
45471
- {
45472
- value: "device-tank-normal",
45473
- label: "Tank back to normal"
45474
- },
45475
45463
  {
45476
45464
  value: "export-completed",
45477
45465
  label: "Export completed"
@@ -69601,6 +69589,43 @@ var ptzAutotrackCapability = {
69601
69589
  history: "none"
69602
69590
  };
69603
69591
  //#endregion
69592
+ //#region src/capabilities/running-state.cap.ts
69593
+ var RunningStateSourceSchema = zod.z.enum(["native", "assigned"]);
69594
+ var RunningStateStatusSchema = zod.z.object({
69595
+ /** null = unknown — never coerced to false (D393). */
69596
+ running: zod.z.boolean().nullable(),
69597
+ /** Epoch ms the current boolean began; null while `running` is null. */
69598
+ since: zod.z.number().nullable(),
69599
+ source: RunningStateSourceSchema,
69600
+ phase: zod.z.string().nullable(),
69601
+ lastFetchedAt: zod.z.number()
69602
+ });
69603
+ var RunningFlipEventDataSchema = zod.z.object({
69604
+ deviceId: zod.z.number(),
69605
+ since: zod.z.number().nullable(),
69606
+ phase: zod.z.string().nullable()
69607
+ });
69608
+ var runningStateCapability = {
69609
+ name: "running-state",
69610
+ scope: "device",
69611
+ deviceNative: true,
69612
+ mode: "singleton",
69613
+ deviceTypes: Object.values(require_err_msg.DeviceType),
69614
+ methods: {},
69615
+ events: {
69616
+ onStarted: { data: RunningFlipEventDataSchema },
69617
+ onFinished: { data: RunningFlipEventDataSchema }
69618
+ },
69619
+ status: {
69620
+ schema: RunningStateStatusSchema,
69621
+ kind: "push"
69622
+ },
69623
+ runtimeState: RunningStateStatusSchema,
69624
+ durability: "restored",
69625
+ history: { fields: { running: { kind: "boolean" } } },
69626
+ volatileStateFields: ["lastFetchedAt"]
69627
+ };
69628
+ //#endregion
69604
69629
  //#region src/capabilities/reboot.cap.ts
69605
69630
  /**
69606
69631
  * reboot — device-scoped capability for "soft" device reboots (firmware
@@ -75827,6 +75852,215 @@ var PIPELINE_OWNER_CAPABILITY_NAMES = [
75827
75852
  "pipeline-runner"
75828
75853
  ];
75829
75854
  //#endregion
75855
+ //#region src/running-state/assignment.ts
75856
+ function constant(literal) {
75857
+ return {
75858
+ kind: "expression",
75859
+ expr: literal,
75860
+ bindings: {}
75861
+ };
75862
+ }
75863
+ function fromRead(source, cap, fieldPath) {
75864
+ return {
75865
+ kind: "from",
75866
+ source,
75867
+ cap,
75868
+ fieldPath
75869
+ };
75870
+ }
75871
+ function sortKeys(value) {
75872
+ if (Array.isArray(value)) return value.map(sortKeys);
75873
+ if (typeof value !== "object" || value === null) return value;
75874
+ return Object.fromEntries(Object.entries(value).toSorted(([a], [b]) => a.localeCompare(b)).map(([key, inner]) => [key, sortKeys(inner)]));
75875
+ }
75876
+ function sameFeature(a, b) {
75877
+ return JSON.stringify(sortKeys(a)) === JSON.stringify(sortKeys(b));
75878
+ }
75879
+ function booleanRunningField(input) {
75880
+ if (input.source.kind !== "boolean") return null;
75881
+ const read = fromRead(input.source.source, input.source.cap, input.source.fieldPath);
75882
+ if (!input.invert) return read;
75883
+ return {
75884
+ kind: "expression",
75885
+ expr: "!x",
75886
+ bindings: { x: read }
75887
+ };
75888
+ }
75889
+ function sinceField(input) {
75890
+ if (input.source.kind === "boolean" && input.changedAtField !== null) return fromRead(input.source.source, input.source.cap, input.changedAtField);
75891
+ return {
75892
+ kind: "expression",
75893
+ expr: "latchedAt(running)",
75894
+ bindings: { running: fromRead(input.target, "running-state", "running") }
75895
+ };
75896
+ }
75897
+ function powerRunningField(input) {
75898
+ if (input.source.kind !== "number") return null;
75899
+ if (!Number.isFinite(input.thresholdWatts) || !Number.isFinite(input.startDelayMs) || !Number.isFinite(input.stopDelayMs) || input.thresholdWatts < 0 || input.startDelayMs < 0 || input.stopDelayMs < 0) return null;
75900
+ const read = fromRead(input.source.source, input.source.cap, input.source.fieldPath);
75901
+ return {
75902
+ kind: "expression",
75903
+ expr: `dwell(x >= ${input.thresholdWatts}, ${input.startDelayMs}, ${input.stopDelayMs})`,
75904
+ bindings: { x: read }
75905
+ };
75906
+ }
75907
+ function runningAssignmentFeature(input) {
75908
+ const running = input.source.kind === "number" ? powerRunningField(input) : booleanRunningField(input);
75909
+ if (running === null) return null;
75910
+ return {
75911
+ kind: "fields",
75912
+ cap: "running-state",
75913
+ fields: {
75914
+ source: constant("\"assigned\""),
75915
+ phase: constant("null"),
75916
+ lastFetchedAt: constant("now"),
75917
+ running,
75918
+ since: sinceField(input)
75919
+ }
75920
+ };
75921
+ }
75922
+ function booleanSourceFromRunningField(source) {
75923
+ if (source === void 0) return null;
75924
+ if (source.kind === "from") return {
75925
+ source: source.source,
75926
+ cap: source.cap,
75927
+ fieldPath: source.fieldPath,
75928
+ kind: "boolean"
75929
+ };
75930
+ if (source.kind !== "expression" || source.expr !== "!x") return null;
75931
+ const x = source.bindings["x"];
75932
+ if (x === void 0 || x.kind !== "from") return null;
75933
+ return {
75934
+ source: x.source,
75935
+ cap: x.cap,
75936
+ fieldPath: x.fieldPath,
75937
+ kind: "boolean"
75938
+ };
75939
+ }
75940
+ function recoverPowerRunning(running) {
75941
+ if (running === void 0 || running.kind !== "expression") return null;
75942
+ const match = /^dwell\(x >= ([\d.]+), (\d+), (\d+)\)$/.exec(running.expr);
75943
+ if (match === null) return null;
75944
+ const x = running.bindings["x"];
75945
+ if (x === void 0 || x.kind !== "from") return null;
75946
+ const thresholdWatts = Number(match[1]);
75947
+ const startDelayMs = Number(match[2]);
75948
+ const stopDelayMs = Number(match[3]);
75949
+ if (!Number.isFinite(thresholdWatts) || !Number.isFinite(startDelayMs) || !Number.isFinite(stopDelayMs)) return null;
75950
+ return {
75951
+ source: {
75952
+ ...x,
75953
+ kind: "number"
75954
+ },
75955
+ invert: false,
75956
+ thresholdWatts,
75957
+ startDelayMs,
75958
+ stopDelayMs
75959
+ };
75960
+ }
75961
+ /** Recover what {@link runningAssignmentFeature} wrote, else null. */
75962
+ function runningAssignmentRecovered(stored, target) {
75963
+ if (stored.cap !== "running-state" || stored.kind !== "fields") return null;
75964
+ const power = recoverPowerRunning(stored.fields["running"]);
75965
+ if (power !== null) return power;
75966
+ const booleanSource = booleanSourceFromRunningField(stored.fields["running"]);
75967
+ if (booleanSource === null) return null;
75968
+ const since = stored.fields["since"];
75969
+ let changedAtField = null;
75970
+ if (since?.kind === "from" && since.cap === booleanSource.cap && since.source.addonId === booleanSource.source.addonId && since.source.stableId === booleanSource.source.stableId) changedAtField = since.fieldPath;
75971
+ const rebuilt = runningAssignmentFeature({
75972
+ mode: "replace",
75973
+ target,
75974
+ source: booleanSource,
75975
+ changedAtField,
75976
+ invert: stored.fields["running"]?.kind === "expression" && stored.fields["running"].expr === "!x",
75977
+ thresholdWatts: 0,
75978
+ startDelayMs: 0,
75979
+ stopDelayMs: 0
75980
+ });
75981
+ if (rebuilt === null) return null;
75982
+ const { enabled: _e, ...rest } = stored;
75983
+ if (!sameFeature(rest, rebuilt)) return null;
75984
+ return {
75985
+ source: booleanSource,
75986
+ invert: stored.fields["running"]?.kind === "expression" && stored.fields["running"].expr === "!x",
75987
+ thresholdWatts: 0,
75988
+ startDelayMs: 0,
75989
+ stopDelayMs: 0
75990
+ };
75991
+ }
75992
+ function isRunningAssignmentFeature(stored, mode, target) {
75993
+ const recovered = runningAssignmentRecovered(stored, target);
75994
+ if (recovered === null) return false;
75995
+ const rebuilt = recovered.source.kind === "number" ? runningAssignmentFeature({
75996
+ mode,
75997
+ target,
75998
+ source: recovered.source,
75999
+ changedAtField: null,
76000
+ invert: false,
76001
+ thresholdWatts: recovered.thresholdWatts,
76002
+ startDelayMs: recovered.startDelayMs,
76003
+ stopDelayMs: recovered.stopDelayMs
76004
+ }) : runningAssignmentFeature({
76005
+ mode,
76006
+ target,
76007
+ source: recovered.source,
76008
+ changedAtField: stored.fields["since"]?.kind === "from" ? stored.fields["since"].fieldPath : null,
76009
+ invert: recovered.invert,
76010
+ thresholdWatts: 0,
76011
+ startDelayMs: 0,
76012
+ stopDelayMs: 0
76013
+ });
76014
+ if (rebuilt === null) return false;
76015
+ const { enabled: _enabled, ...rest } = stored;
76016
+ return sameFeature(rest, rebuilt);
76017
+ }
76018
+ //#endregion
76019
+ //#region src/running-state/defaults.ts
76020
+ var RUNNING_POWER_THRESHOLD_WATTS = 5;
76021
+ var RUNNING_POWER_START_DELAY_MS = 3e4;
76022
+ var RUNNING_POWER_STOP_DELAY_MS = 18e4;
76023
+ //#endregion
76024
+ //#region src/running-state/from-operation.ts
76025
+ function resolveSince(running, previous, sinceMs) {
76026
+ if (running === null) return null;
76027
+ if ((previous?.running ?? null) !== running) return sinceMs;
76028
+ return previous?.since ?? sinceMs;
76029
+ }
76030
+ function nativeSlice(running, phase, previous, sinceMs, now) {
76031
+ return {
76032
+ running,
76033
+ since: resolveSince(running, previous, sinceMs),
76034
+ source: "native",
76035
+ phase: running === null ? null : phase,
76036
+ lastFetchedAt: now
76037
+ };
76038
+ }
76039
+ function runningFromDishwasherOperation(operation, program, previous, now) {
76040
+ if (operation === null) return nativeSlice(null, null, previous, now, now);
76041
+ if (operation === "Run" || operation === "Aborting") return nativeSlice(true, program ?? operation, previous, now, now);
76042
+ if (operation === "Pause") return nativeSlice(false, "Pause", previous, now, now);
76043
+ return nativeSlice(false, operation, previous, now, now);
76044
+ }
76045
+ function runningFromVacuumState(state, previous, now) {
76046
+ if (state === null) return nativeSlice(null, null, previous, now, now);
76047
+ if (state === "cleaning" || state === "returning" || state === "drying") return nativeSlice(true, state, previous, now, now);
76048
+ if (state === "paused") return nativeSlice(false, "paused", previous, now, now);
76049
+ return nativeSlice(false, state, previous, now, now);
76050
+ }
76051
+ function runningFromLawnMower(activity, previous, now) {
76052
+ if (activity === null) return nativeSlice(null, null, previous, now, now);
76053
+ if (activity === "mowing") return nativeSlice(true, activity, previous, now, now);
76054
+ if (activity === "paused") return nativeSlice(false, "paused", previous, now, now);
76055
+ return nativeSlice(false, activity, previous, now, now);
76056
+ }
76057
+ function runningFromMediaPlayer(state, previous, now) {
76058
+ if (state === null) return nativeSlice(null, null, previous, now, now);
76059
+ if (state === "playing" || state === "buffering") return nativeSlice(true, state, previous, now, now);
76060
+ if (state === "paused") return nativeSlice(false, "paused", previous, now, now);
76061
+ return nativeSlice(false, state, previous, now, now);
76062
+ }
76063
+ //#endregion
75830
76064
  //#region src/clips/clip-event-labels.ts
75831
76065
  /**
75832
76066
  * Which of OUR object detections a clip window holds — the ONE overlap rule
@@ -76470,11 +76704,12 @@ function expressionOutcome(source, read, now, stateful) {
76470
76704
  return unavailable;
76471
76705
  }
76472
76706
  const deadlines = [];
76707
+ const hooks = {
76708
+ noteDeadline: (at) => deadlines.push(at),
76709
+ convert: (value, from, to) => tryConvertUnit(value, normalizeUnit(from) ?? from, normalizeUnit(to) ?? to) ?? null
76710
+ };
76473
76711
  const result = require_composition.evaluateExpressionSource(source.expr, values, now, {
76474
- hooks: {
76475
- noteDeadline: (at) => deadlines.push(at),
76476
- convert: (value, from, to) => tryConvertUnit(value, normalizeUnit(from) ?? from, normalizeUnit(to) ?? to) ?? null
76477
- },
76712
+ hooks,
76478
76713
  ...stateful === void 0 ? {} : { invokeStateful: (invocation) => require_composition.evaluateStatefulExpressionCall(stateful.callPathPrefix === void 0 ? invocation : {
76479
76714
  ...invocation,
76480
76715
  path: `${stateful.callPathPrefix}@${invocation.path}`
@@ -76482,7 +76717,7 @@ function expressionOutcome(source, read, now, stateful) {
76482
76717
  currentOutput: stateful.currentOutput,
76483
76718
  startedAtMs: stateful.startedAtMs,
76484
76719
  nowMs: now
76485
- }) }
76720
+ }, hooks) }
76486
76721
  });
76487
76722
  if (!result.ok) return {
76488
76723
  state: "unavailable",
@@ -77434,6 +77669,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
77434
77669
  ptzAutotrack: ptzAutotrackCapability,
77435
77670
  recordingOnboard: recordingOnboardCapability,
77436
77671
  recordingSignal: recordingSignalCapability,
77672
+ runningState: runningStateCapability,
77437
77673
  sceneMonitor: sceneMonitorCapability,
77438
77674
  scriptRunner: scriptRunnerCapability,
77439
77675
  smoke: smokeCapability,
@@ -87017,6 +87253,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
87017
87253
  access: "create",
87018
87254
  role: "admin"
87019
87255
  },
87256
+ "runningState.getStatus": {
87257
+ capName: "running-state",
87258
+ capScope: "device",
87259
+ addonId: null,
87260
+ access: "view",
87261
+ role: "viewer"
87262
+ },
87020
87263
  "sceneMonitor.captureReference": {
87021
87264
  capName: "scene-monitor",
87022
87265
  capScope: "device",
@@ -89306,6 +89549,7 @@ var KNOWN_CAP_NAMES = [
89306
89549
  "recording-onboard",
89307
89550
  "recording-signal",
89308
89551
  "records",
89552
+ "running-state",
89309
89553
  "scene-monitor",
89310
89554
  "script-runner",
89311
89555
  "server-management",
@@ -89420,6 +89664,7 @@ var DEVICE_CAP_NAMES = [
89420
89664
  "recording",
89421
89665
  "recording-onboard",
89422
89666
  "recording-signal",
89667
+ "running-state",
89423
89668
  "scene-monitor",
89424
89669
  "script-runner",
89425
89670
  "smoke",
@@ -92104,6 +92349,32 @@ var APPLIANCE_CAP_VOCABULARY = {
92104
92349
  }],
92105
92350
  events: { onSent: { notOperatorFacing: "a delivery receipt of a send this system made — not a fact about the world" } }
92106
92351
  },
92352
+ "running-state": {
92353
+ scope: "device",
92354
+ noun: t("Running", "In funzione"),
92355
+ state: [{
92356
+ kind: "boolean",
92357
+ field: "running",
92358
+ label: t("Running", "In funzione"),
92359
+ whenTrue: t("When {device} starts", "Quando {device} inizia"),
92360
+ whenFalse: t("When {device} finishes", "Quando {device} finisce"),
92361
+ icon: "play"
92362
+ }],
92363
+ events: {
92364
+ onStarted: {
92365
+ category: require_event_category.EventCategory.RunningStarted,
92366
+ label: t("Started running", "Ha iniziato a funzionare"),
92367
+ phrase: t("When {device} starts running", "Quando {device} inizia a funzionare"),
92368
+ icon: "play"
92369
+ },
92370
+ onFinished: {
92371
+ category: require_event_category.EventCategory.RunningFinished,
92372
+ label: t("Finished", "Ha finito"),
92373
+ phrase: t("When {device} finishes", "Quando {device} finisce"),
92374
+ icon: "square"
92375
+ }
92376
+ }
92377
+ },
92107
92378
  update: {
92108
92379
  scope: "device",
92109
92380
  noun: t("Firmware update", "Aggiornamento firmware"),
@@ -95044,6 +95315,7 @@ var CAP_NAMES_WITH_STATUS = [
95044
95315
  "recording-archive",
95045
95316
  "recording-onboard",
95046
95317
  "recording-signal",
95318
+ "running-state",
95047
95319
  "scene-monitor",
95048
95320
  "script-runner",
95049
95321
  "smoke",
@@ -95199,6 +95471,7 @@ var CAPABILITY_NAMES = {
95199
95471
  recordingOnboard: "recording-onboard",
95200
95472
  recordingSignal: "recording-signal",
95201
95473
  records: "records",
95474
+ runningState: "running-state",
95202
95475
  sceneMonitor: "scene-monitor",
95203
95476
  scriptRunner: "script-runner",
95204
95477
  serverManagement: "server-management",
@@ -95792,6 +96065,10 @@ var CAPABILITY_ROUTER_KEYS = [
95792
96065
  key: "records",
95793
96066
  name: "records"
95794
96067
  },
96068
+ {
96069
+ key: "runningState",
96070
+ name: "running-state"
96071
+ },
95795
96072
  {
95796
96073
  key: "sceneMonitor",
95797
96074
  name: "scene-monitor"
@@ -96108,6 +96385,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
96108
96385
  recordingOnboardCapability,
96109
96386
  recordingSignalCapability,
96110
96387
  recordsCapability,
96388
+ runningStateCapability,
96111
96389
  sceneMonitorCapability,
96112
96390
  scriptRunnerCapability,
96113
96391
  serverManagementCapability,
@@ -98424,6 +98702,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
98424
98702
  form: "single",
98425
98703
  optional: true
98426
98704
  }],
98705
+ "runningState.getStatus": [{
98706
+ name: "deviceId",
98707
+ form: "single",
98708
+ optional: false
98709
+ }],
98427
98710
  "sceneMonitor.captureReference": [{
98428
98711
  name: "deviceId",
98429
98712
  form: "single",
@@ -99125,7 +99408,7 @@ function getCapsByProviderKind(kind) {
99125
99408
  //#region src/generated/runtime-state-durability.ts
99126
99409
  /**
99127
99410
  * Per-cap runtime-state policy, projected from every `*.cap.ts` that declares
99128
- * `runtimeState`. 71 caps: 37 `restored`, 34 `session`.
99411
+ * `runtimeState`. 72 caps: 38 `restored`, 34 `session`.
99129
99412
  *
99130
99413
  * A cap absent from this map has no runtime-state slice at all. A cap PRESENT
99131
99414
  * with `durability: 'session'` has one and has decided not to keep it.
@@ -99343,6 +99626,10 @@ var RUNTIME_STATE_POLICY = {
99343
99626
  durability: "session",
99344
99627
  volatileFields: []
99345
99628
  },
99629
+ "running-state": {
99630
+ durability: "restored",
99631
+ volatileFields: ["lastFetchedAt"]
99632
+ },
99346
99633
  "scene-monitor": {
99347
99634
  durability: "session",
99348
99635
  volatileFields: []
@@ -99465,6 +99752,7 @@ var RESTORED_CAP_NAMES = [
99465
99752
  "pressure-sensor",
99466
99753
  "privacy-mask",
99467
99754
  "recording-onboard",
99755
+ "running-state",
99468
99756
  "smoke",
99469
99757
  "stream-catalog",
99470
99758
  "stream-params",
@@ -99580,7 +99868,7 @@ var BucketAccumulator = class {
99580
99868
  //#region src/generated/history-catalog.ts
99581
99869
  /**
99582
99870
  * Cap history catalog, projected from every `*.cap.ts` `history` block.
99583
- * 40 caps with series (73 series), 30 caps answered `'none'`.
99871
+ * 41 caps with series (74 series), 30 caps answered `'none'`.
99584
99872
  * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
99585
99873
  */
99586
99874
  var HISTORY_CATALOG = {
@@ -99857,6 +100145,7 @@ var HISTORY_CATALOG = {
99857
100145
  unit: "hPa",
99858
100146
  deadband: .1
99859
100147
  } },
100148
+ "running-state": { "running": { kind: "boolean" } },
99860
100149
  "smoke": { "detected": { kind: "boolean" } },
99861
100150
  "stream-params": {
99862
100151
  "main.bitrate": {
@@ -101660,6 +101949,7 @@ function prepareNotification(caps, n) {
101660
101949
  * narrows, and still fails CLOSED on a subject that cannot produce the identity
101661
101950
  * it tests (a device the mirror cannot name is not evidence of a camera).
101662
101951
  */
101952
+ var LEGACY_KINDS_WITHOUT_FILTERS = new Set(NC_LEGACY_SYSTEM_EVENT_KINDS);
101663
101953
  /**
101664
101954
  * Every filter, for the callers that must cover all of them (guards, tests).
101665
101955
  *
@@ -101683,6 +101973,7 @@ var NC_SYSTEM_EVENT_FILTER_KEYS = [
101683
101973
  * ignores it and an editor hides its input. It never means "excluded".
101684
101974
  */
101685
101975
  function systemEventFilterApplies(kind, filter) {
101976
+ if (LEGACY_KINDS_WITHOUT_FILTERS.has(kind)) return false;
101686
101977
  switch (filter) {
101687
101978
  case "deviceIds": return kind.startsWith("device-") || kind.startsWith("stream-") || kind === "detection-blind" || kind.startsWith("motion-") || kind.startsWith("recording-") || kind === "alarm-triggered";
101688
101979
  case "deviceTypes": return kind.startsWith("device-") || kind === "detection-blind" || kind.startsWith("motion-");
@@ -101737,9 +102028,6 @@ var NC_SYSTEM_EVENT_FAMILY = {
101737
102028
  "device-battery-normal": "device-events",
101738
102029
  "device-consumable-low": "device-events",
101739
102030
  "device-consumable-normal": "device-events",
101740
- "device-tank-low": "device-events",
101741
- "device-tank-full": "device-events",
101742
- "device-tank-normal": "device-events",
101743
102031
  "stream-online": "device-events",
101744
102032
  "stream-offline": "device-events",
101745
102033
  "detection-blind": "device-events",
@@ -101834,16 +102122,6 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
101834
102122
  label: "Consumables",
101835
102123
  kinds: ["device-consumable-low", "device-consumable-normal"]
101836
102124
  },
101837
- {
101838
- id: "tanks",
101839
- family: "device-events",
101840
- label: "Tanks",
101841
- kinds: [
101842
- "device-tank-low",
101843
- "device-tank-full",
101844
- "device-tank-normal"
101845
- ]
101846
- },
101847
102125
  {
101848
102126
  id: "detection-blind",
101849
102127
  family: "device-events",
@@ -103740,11 +104018,6 @@ var RULE_BODY_ONLY = ["body"];
103740
104018
  var RULE_TEXT = ["title", "body"];
103741
104019
  var BATTERY = ["device-battery-low", "device-battery-normal"];
103742
104020
  var CONSUMABLE = ["device-consumable-low", "device-consumable-normal"];
103743
- var TANK = [
103744
- "device-tank-low",
103745
- "device-tank-full",
103746
- "device-tank-normal"
103747
- ];
103748
104021
  var ALERT_EPISODE = [
103749
104022
  "alert-critical",
103750
104023
  "alert-error",
@@ -103776,7 +104049,6 @@ var DEVICE_EVENTS = [
103776
104049
  "device-enabled",
103777
104050
  ...BATTERY,
103778
104051
  ...CONSUMABLE,
103779
- ...TANK,
103780
104052
  "stream-online",
103781
104053
  "stream-offline",
103782
104054
  "detection-blind",
@@ -103822,12 +104094,6 @@ var STATE_SUMMARY_SECTION_VARS = [
103822
104094
  example: "Robot — filter 10 %",
103823
104095
  kinds: CONSUMABLE
103824
104096
  },
103825
- {
103826
- name: "summaryTanks",
103827
- label: "Summary: tanks",
103828
- example: "Robot — clean water low",
103829
- kinds: TANK
103830
- },
103831
104097
  {
103832
104098
  name: "summaryDetection",
103833
104099
  label: "Summary: cameras detecting nothing",
@@ -104236,18 +104502,7 @@ var NC_TEMPLATE_VARS = [
104236
104502
  families: ["rule"],
104237
104503
  fields: [...RULE_TEXT],
104238
104504
  kinds: ["system"],
104239
- systemEventKinds: [...CONSUMABLE, ...TANK]
104240
- },
104241
- {
104242
- name: "tank",
104243
- label: "Tank",
104244
- description: "Which tank, as a stable token: cleanWater, dirtyWater, detergent, dustBin, or the device key of any other supply (salt, rinse aid).",
104245
- example: "clean water",
104246
- group: "system",
104247
- families: ["rule"],
104248
- fields: [...RULE_TEXT],
104249
- kinds: ["system"],
104250
- systemEventKinds: [...TANK]
104505
+ systemEventKinds: [...CONSUMABLE]
104251
104506
  },
104252
104507
  {
104253
104508
  name: "profile",
@@ -104898,9 +105153,6 @@ var NC_TEMPLATE_VARS = [
104898
105153
  * delete it from here then, and the served catalog names it again.
104899
105154
  */
104900
105155
  var NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS = [
104901
- "device-tank-low",
104902
- "device-tank-full",
104903
- "device-tank-normal",
104904
105156
  "node-restarting",
104905
105157
  "node-updating",
104906
105158
  "alert-critical",
@@ -105062,15 +105314,6 @@ var NC_SYSTEM_EVENT_CLASS_SPECS = [
105062
105314
  snapshotLabel: "Consumables low now",
105063
105315
  snapshotSection: "consumables"
105064
105316
  },
105065
- {
105066
- id: "tanks",
105067
- family: "device-events",
105068
- label: "Tanks (low or full / back to normal)",
105069
- bad: ["device-tank-low", "device-tank-full"],
105070
- recovery: ["device-tank-normal"],
105071
- snapshotLabel: "Tanks low or full now",
105072
- snapshotSection: "tanks"
105073
- },
105074
105317
  {
105075
105318
  id: "motion-noise",
105076
105319
  family: "device-events",
@@ -111665,6 +111908,7 @@ exports.NC_GROUPING_MAX_SEC = NC_GROUPING_MAX_SEC;
111665
111908
  exports.NC_GROUPING_MIN_SEC = NC_GROUPING_MIN_SEC;
111666
111909
  exports.NC_HISTORY_LIMIT_DEFAULT = NC_HISTORY_LIMIT_DEFAULT;
111667
111910
  exports.NC_HISTORY_LIMIT_MAX = NC_HISTORY_LIMIT_MAX;
111911
+ exports.NC_LEGACY_SYSTEM_EVENT_KINDS = NC_LEGACY_SYSTEM_EVENT_KINDS;
111668
111912
  exports.NC_MAX_PER_TRACK_IMMEDIATE = NC_MAX_PER_TRACK_IMMEDIATE;
111669
111913
  exports.NC_MEDIA_IMAGE_MODES = NC_MEDIA_IMAGE_MODES;
111670
111914
  exports.NC_OCCUPANCY_DEFAULTS = NC_OCCUPANCY_DEFAULTS;
@@ -111679,6 +111923,7 @@ exports.NC_SENSOR_TRANSITION_NEVER_FIRES_WARNING = NC_SENSOR_TRANSITION_NEVER_FI
111679
111923
  exports.NC_SENSOR_TRANSITION_UNSUPPORTED_REASON = NC_SENSOR_TRANSITION_UNSUPPORTED_REASON;
111680
111924
  exports.NC_SERVER_PACKAGE_NAME = NC_SERVER_PACKAGE_NAME;
111681
111925
  exports.NC_SNOOZE_MAX_MINUTES = NC_SNOOZE_MAX_MINUTES;
111926
+ exports.NC_STATE_SUMMARY_SECTION_IDS = NC_STATE_SUMMARY_SECTION_IDS;
111682
111927
  exports.NC_SYSTEM_DELIVERY = NC_SYSTEM_DELIVERY;
111683
111928
  exports.NC_SYSTEM_EVENT_CLASS_SPECS = NC_SYSTEM_EVENT_CLASS_SPECS;
111684
111929
  exports.NC_SYSTEM_EVENT_CONDITION_FILTER_KEYS = NC_SYSTEM_EVENT_CONDITION_FILTER_KEYS;
@@ -111689,7 +111934,6 @@ exports.NC_SYSTEM_EVENT_FILTER_KEYS = NC_SYSTEM_EVENT_FILTER_KEYS;
111689
111934
  exports.NC_SYSTEM_EVENT_KIND_GROUP_SPECS = NC_SYSTEM_EVENT_KIND_GROUP_SPECS;
111690
111935
  exports.NC_SYSTEM_EVENT_SUMMARY_FAMILIES = NC_SYSTEM_EVENT_SUMMARY_FAMILIES;
111691
111936
  exports.NC_SYSTEM_RULE_KINDS = NC_SYSTEM_RULE_KINDS;
111692
- exports.NC_TANK_SYSTEM_EVENT_KINDS = NC_TANK_SYSTEM_EVENT_KINDS;
111693
111937
  exports.NC_TAXONOMY = NC_TAXONOMY;
111694
111938
  exports.NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS = NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS;
111695
111939
  exports.NC_TEMPLATE_VARS = NC_TEMPLATE_VARS;
@@ -112067,6 +112311,9 @@ exports.ROOT_CHILD_CONTAINMENT_MIN = ROOT_CHILD_CONTAINMENT_MIN;
112067
112311
  exports.ROOT_FACE_REFINE_INPUT_PX = ROOT_FACE_REFINE_INPUT_PX;
112068
112312
  exports.ROOT_FACE_REFINE_SCALE = ROOT_FACE_REFINE_SCALE;
112069
112313
  exports.ROOT_SUPPLIABLE_STEP_IDS = ROOT_SUPPLIABLE_STEP_IDS;
112314
+ exports.RUNNING_POWER_START_DELAY_MS = RUNNING_POWER_START_DELAY_MS;
112315
+ exports.RUNNING_POWER_STOP_DELAY_MS = RUNNING_POWER_STOP_DELAY_MS;
112316
+ exports.RUNNING_POWER_THRESHOLD_WATTS = RUNNING_POWER_THRESHOLD_WATTS;
112070
112317
  exports.RUNTIME_DEFAULTS = require_sleep.RUNTIME_DEFAULTS;
112071
112318
  exports.RUNTIME_STATE_POLICY = RUNTIME_STATE_POLICY;
112072
112319
  exports.RUNTIME_STATE_REFRESH_MISS_COOLDOWN_MS = RUNTIME_STATE_REFRESH_MISS_COOLDOWN_MS;
@@ -112218,6 +112465,8 @@ exports.RunnerJumpStepProvisioningSchema = RunnerJumpStepProvisioningSchema;
112218
112465
  exports.RunnerLocalLoadSchema = RunnerLocalLoadSchema;
112219
112466
  exports.RunnerLocalMetricsSchema = RunnerLocalMetricsSchema;
112220
112467
  exports.RunnerRefusalSchema = RunnerRefusalSchema;
112468
+ exports.RunningStateSourceSchema = RunningStateSourceSchema;
112469
+ exports.RunningStateStatusSchema = RunningStateStatusSchema;
112221
112470
  exports.SCENE_CONDITIONS = SCENE_CONDITIONS;
112222
112471
  exports.SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX = SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX;
112223
112472
  exports.SCENE_CONFIRM_DEFAULT_TIMEOUT_MS = SCENE_CONFIRM_DEFAULT_TIMEOUT_MS;
@@ -113031,6 +113280,7 @@ exports.isRemovedModelId = isRemovedModelId;
113031
113280
  exports.isRestoredCap = isRestoredCap;
113032
113281
  exports.isRetiredClearKey = isRetiredClearKey;
113033
113282
  exports.isRootSuppliableStepId = isRootSuppliableStepId;
113283
+ exports.isRunningAssignmentFeature = isRunningAssignmentFeature;
113034
113284
  exports.isSameAddonId = isSameAddonId;
113035
113285
  exports.isScheduleActive = isScheduleActive;
113036
113286
  exports.isSecretClear = require_sleep.isSecretClear;
@@ -113348,6 +113598,13 @@ exports.ruleSectionOf = ruleSectionOf;
113348
113598
  exports.ruleSeedForSection = ruleSeedForSection;
113349
113599
  exports.ruleTriggerZoneIds = ruleTriggerZoneIds;
113350
113600
  exports.runInferenceStep = runInferenceStep;
113601
+ exports.runningAssignmentFeature = runningAssignmentFeature;
113602
+ exports.runningAssignmentRecovered = runningAssignmentRecovered;
113603
+ exports.runningFromDishwasherOperation = runningFromDishwasherOperation;
113604
+ exports.runningFromLawnMower = runningFromLawnMower;
113605
+ exports.runningFromMediaPlayer = runningFromMediaPlayer;
113606
+ exports.runningFromVacuumState = runningFromVacuumState;
113607
+ exports.runningStateCapability = runningStateCapability;
113351
113608
  exports.runtimeDevices = runtimeDevices;
113352
113609
  exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
113353
113610
  exports.sameDoFamily = sameDoFamily;