@camstack/addon-training 0.1.76 → 0.1.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/dist/{MotionZonesSettings-D5qNBXG6.mjs → MotionZonesSettings-jORey4uC.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D-DPswdN.mjs → PrivacyMaskSettings-P24unULW.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-DtRIp_YE.mjs → SceneMonitorEditor-CkLN8Kee.mjs} +1 -1
  4. package/dist/_stub.js +5535 -5309
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-CHXpYatD.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-BbQzUVOo.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DiRkx0UL.mjs +26 -0
  7. package/dist/addon-training.css +1 -1
  8. package/dist/{dist-BWgu_wcI.js → dist-CKiSDi2Y.js} +183 -95
  9. package/dist/{dist-B_SLRS5u.mjs → dist-DeD2tKQ2.mjs} +183 -95
  10. package/dist/{hostInit-B52B1CB4.mjs → hostInit-ndHJ_k8s.mjs} +2 -2
  11. package/dist/index.js +1 -1
  12. package/dist/orchestrator/training.addon.js +1 -1
  13. package/dist/orchestrator/training.addon.mjs +1 -1
  14. package/dist/{player-overlays-DpkZn9vj.mjs → player-overlays-CD0eup2L.mjs} +1 -1
  15. package/dist/providers/modal/training-modal.addon.js +1 -1
  16. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  17. package/dist/remoteEntry.js +1 -1
  18. package/dist/{responsive-rqNDO6E-.mjs → responsive-CBG3O0ME.mjs} +1 -1
  19. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-B3b43ydO.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-X4iAyyQb.mjs} +1 -1
  20. package/package.json +1 -1
  21. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DoK4LRXI.mjs +0 -26
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  }) : target, mod));
33
33
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
34
  require("node:crypto");
35
- //#region ../types/dist/event-category-fDPduoeC.mjs
35
+ //#region ../types/dist/event-category-Ceif8n-v.mjs
36
36
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
37
37
  EventCategory["SystemBoot"] = "system.boot";
38
38
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -504,6 +504,10 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
504
504
  * on the device detail page.
505
505
  */
506
506
  EventCategory["DoorbellOnPressed"] = "doorbell.onPressed";
507
+ /** Mirrors `runningStateCapability.events.onStarted`. */
508
+ EventCategory["RunningStarted"] = "running.started";
509
+ /** Mirrors `runningStateCapability.events.onFinished`. */
510
+ EventCategory["RunningFinished"] = "running.finished";
507
511
  /**
508
512
  * Cap event fired by every device that registers the `event-emitter`
509
513
  * capability. Mirrors `eventEmitterCapability.events.onEvent`. Carries
@@ -5596,7 +5600,7 @@ var ZodIssueCode = {
5596
5600
  var ZodFirstPartyTypeKind;
5597
5601
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5598
5602
  //#endregion
5599
- //#region ../types/dist/sleep-CHIEEJkY.mjs
5603
+ //#region ../types/dist/sleep-CYfIZzGv.mjs
5600
5604
  /**
5601
5605
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5602
5606
  * window to float samples (D455).
@@ -5935,7 +5939,7 @@ Object.fromEntries([
5935
5939
  * `hydrateSchema` to skip the `value` injection for structural-only fields.
5936
5940
  */
5937
5941
  function isValuelessField(field) {
5938
- return field.type === "separator" || field.type === "info" || field.type === "qr-code" || field.type === "button" || field.type === "object-array" || field.type === "widget" || field.type === "addon-action-button" || field.type === "device-action-button";
5942
+ return field.type === "separator" || field.type === "info" || field.type === "qr-code" || field.type === "button" || field.type === "object-array" || field.type === "widget" || field.type === "addon-action-button" || field.type === "device-action-button" || field.type === "account-sign-in" || field.type === "secret-presence";
5939
5943
  }
5940
5944
  function hydrateSchema(schema, values, options = {}) {
5941
5945
  return {
@@ -9144,7 +9148,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
9144
9148
  return DeviceRole;
9145
9149
  }({});
9146
9150
  //#endregion
9147
- //#region ../types/dist/composition-CB6PMT9p.mjs
9151
+ //#region ../types/dist/composition-xz-ud5EQ.mjs
9148
9152
  /**
9149
9153
  * The ffmpeg build every CamStack node downloads, per platform and arch.
9150
9154
  *
@@ -9445,6 +9449,20 @@ var table = {
9445
9449
  apply: () => {
9446
9450
  throw new ExpressionEvalError("count: stateful evaluation context is required");
9447
9451
  }
9452
+ },
9453
+ dwell: {
9454
+ minArgs: 3,
9455
+ maxArgs: 3,
9456
+ apply: () => {
9457
+ throw new ExpressionEvalError("dwell: stateful evaluation context is required");
9458
+ }
9459
+ },
9460
+ latchedAt: {
9461
+ minArgs: 1,
9462
+ maxArgs: 1,
9463
+ apply: () => {
9464
+ throw new ExpressionEvalError("latchedAt: stateful evaluation context is required");
9465
+ }
9448
9466
  }
9449
9467
  };
9450
9468
  Object.freeze(Object.assign(Object.create(null), table));
@@ -16323,7 +16341,15 @@ Object.freeze({
16323
16341
  kind: "fixed",
16324
16342
  result: ["number", "null"]
16325
16343
  },
16326
- count: NUMBER
16344
+ count: NUMBER,
16345
+ dwell: {
16346
+ kind: "fixed",
16347
+ result: ["boolean", "null"]
16348
+ },
16349
+ latchedAt: {
16350
+ kind: "fixed",
16351
+ result: ["number", "null"]
16352
+ }
16327
16353
  });
16328
16354
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
16329
16355
  /**
@@ -42517,9 +42543,6 @@ var NcSystemEventKindSchema = _enum([
42517
42543
  "device-battery-normal",
42518
42544
  "device-consumable-low",
42519
42545
  "device-consumable-normal",
42520
- "device-tank-low",
42521
- "device-tank-full",
42522
- "device-tank-normal",
42523
42546
  "stream-online",
42524
42547
  "stream-offline",
42525
42548
  "node-online",
@@ -42566,13 +42589,14 @@ var NcSystemEventKindSchema = _enum([
42566
42589
  "camera-enabled"
42567
42590
  ]);
42568
42591
  /** The legacy tail of {@link NcSystemEventKindSchema} — see its docblock. */
42569
- var NC_LEGACY_SYSTEM_EVENT_KINDS = new Set([
42592
+ var NC_LEGACY_SYSTEM_EVENT_KINDS = [
42570
42593
  "camera-online",
42571
42594
  "camera-offline",
42572
42595
  "camera-disabled",
42573
42596
  "camera-enabled"
42574
- ]);
42575
- NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KINDS.has(kind));
42597
+ ];
42598
+ var NC_LEGACY_SYSTEM_EVENT_KIND_SET = new Set(NC_LEGACY_SYSTEM_EVENT_KINDS);
42599
+ NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KIND_SET.has(kind));
42576
42600
  /**
42577
42601
  * The panel's transitions, as ONE list.
42578
42602
  *
@@ -43691,18 +43715,11 @@ var NcRuleSchema = NcRuleInputSchema.extend({
43691
43715
  */
43692
43716
  disabledTargetIds: array(string()).default([])
43693
43717
  });
43694
- /**
43695
- * The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
43696
- * report a still-true state. `addons` is the crash-looped addons only and
43697
- * `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
43698
- * job is not an open state, and the alarm stays instant.
43699
- */
43700
43718
  var NcStateSummarySectionIdSchema = _enum([
43701
43719
  "device-state",
43702
43720
  "streams",
43703
43721
  "battery",
43704
43722
  "consumables",
43705
- "tanks",
43706
43723
  "detection-blind",
43707
43724
  "nodes",
43708
43725
  "addons",
@@ -45003,6 +45020,18 @@ Object.freeze({
45003
45020
  reason: "camera sensor mappings not loaded"
45004
45021
  });
45005
45022
  /**
45023
+ * What the vision model must answer before a package event is emitted
45024
+ * when a packages rule has "Confirm with the LLM" on.
45025
+ *
45026
+ * `package` is the verdict. `confidence` is 0..1. `reason` is the model's
45027
+ * one-line explanation, stored on the event so a drop is not silent.
45028
+ */
45029
+ var PackageLlmVerdictSchema = object({
45030
+ package: boolean(),
45031
+ confidence: number().min(0).max(1),
45032
+ reason: string().min(1)
45033
+ });
45034
+ /**
45006
45035
  * A model choice has a SCOPE, and a scope change has a workflow.
45007
45036
  *
45008
45037
  * ## The two scopes
@@ -45939,6 +45968,21 @@ var ObjectEventSchema = object({
45939
45968
  * pick-up written before D684 — UNKNOWN, never 0 and never `timestamp`.
45940
45969
  */
45941
45970
  observedAt: number().optional(),
45971
+ /**
45972
+ * The delivery was emitted without a vision-model yes (D931).
45973
+ *
45974
+ * Set only when the packages rule asked for an LLM confirm and the model
45975
+ * was unreachable, timed out, or answered something that did not parse.
45976
+ * A notification reads it so it can say "possible" instead of a definite
45977
+ * delivery. Absent on every other row, and on a confirm that said yes.
45978
+ */
45979
+ packagePossible: boolean().optional(),
45980
+ /**
45981
+ * The vision model's verdict, when a packages rule asked for one and the
45982
+ * model answered the schema (D931). A "no" never becomes a row — the
45983
+ * detector drops it and logs the reason. Present on a yes.
45984
+ */
45985
+ packageLlmVerdict: PackageLlmVerdictSchema.optional(),
45942
45986
  /** The parent track's key-event importance [0,1], propagated to every object
45943
45987
  * event of the track (so an event row can be sorted by importance without a
45944
45988
  * track join). Absent on legacy rows / before the track was scored. */
@@ -48146,11 +48190,18 @@ var KeptReasonSchema = _enum(["custom-pin"]);
48146
48190
  * Where a choice's latency came from (D791): this node's own benchmark
48147
48191
  * result, or the hardware-class table. Measured on the node beats the table.
48148
48192
  */
48149
- var LatencySourceSchema = discriminatedUnion("kind", [object({ kind: literal("table") }), object({
48150
- kind: literal("node-benchmark"),
48151
- resultId: string(),
48152
- measuredAtMs: number()
48153
- })]);
48193
+ var LatencySourceSchema = discriminatedUnion("kind", [
48194
+ object({ kind: literal("table") }),
48195
+ object({
48196
+ kind: literal("node-benchmark"),
48197
+ resultId: string(),
48198
+ measuredAtMs: number()
48199
+ }),
48200
+ object({
48201
+ kind: literal("estimated"),
48202
+ estimatedFrom: HardwareClassIdSchema
48203
+ })
48204
+ ]);
48154
48205
  var DeviceModelChoiceSchema = object({
48155
48206
  modelId: string(),
48156
48207
  p50Ms: number(),
@@ -48158,6 +48209,11 @@ var DeviceModelChoiceSchema = object({
48158
48209
  measured: boolean(),
48159
48210
  /** Absent on a plan from before D791 — read as the table. */
48160
48211
  source: LatencySourceSchema.optional(),
48212
+ /**
48213
+ * The measured class this latency was scaled from (D930). Absent when the
48214
+ * cell is the table or a node benchmark.
48215
+ */
48216
+ estimatedFrom: HardwareClassIdSchema.optional(),
48161
48217
  /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
48162
48218
  capacitySessions: number(),
48163
48219
  personRecall: number()
@@ -58387,6 +58443,30 @@ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly(
58387
58443
  kind: "mutation",
58388
58444
  auth: "admin"
58389
58445
  });
58446
+ var CORE_ULTRA_265K_IGPU_CLOCK_MHZ = 2e3;
58447
+ var positiveOrNull = number().nullable().transform((value) => value !== null && Number.isFinite(value) && value > 0 ? value : null);
58448
+ var textOrNull = string().nullable().transform((value) => value !== null && value.trim() !== "" ? value : null);
58449
+ var PrecisionGopsSchema = object({
58450
+ int8: positiveOrNull,
58451
+ fp16: positiveOrNull
58452
+ });
58453
+ /** What one accelerator device reported. Every failed query is null. */
58454
+ var AcceleratorComputeSchema = object({
58455
+ deviceKey: string(),
58456
+ fullDeviceName: textOrNull,
58457
+ executionUnits: positiveOrNull,
58458
+ clockMHz: positiveOrNull,
58459
+ gops: PrecisionGopsSchema.nullable(),
58460
+ architecture: textOrNull,
58461
+ npuName: textOrNull,
58462
+ tops: positiveOrNull,
58463
+ vendor: textOrNull,
58464
+ webgpuArchitecture: textOrNull,
58465
+ webgpuDevice: textOrNull,
58466
+ computeUnits: positiveOrNull
58467
+ });
58468
+ object({ accelerators: array(AcceleratorComputeSchema).nullable() });
58469
+ 64 * CORE_ULTRA_265K_IGPU_CLOCK_MHZ;
58390
58470
  var ModelFormatSchema = _enum(MODEL_FORMATS);
58391
58471
  var HwAccelBackendInputSchema = _enum([
58392
58472
  "videotoolbox",
@@ -58500,7 +58580,12 @@ var HardwareInfoSchema = object({
58500
58580
  availableRAM_MB: number(),
58501
58581
  gpu: GpuInfoSchema.nullable(),
58502
58582
  npu: NpuInfoSchema.nullable(),
58503
- coral: CoralInfoSchema.nullable().optional()
58583
+ coral: CoralInfoSchema.nullable().optional(),
58584
+ /**
58585
+ * Per-accelerator compute (D930). Omitted by a node that has not probed it.
58586
+ * `null` fields inside an entry are a failed query, never a zero.
58587
+ */
58588
+ accelerators: array(AcceleratorComputeSchema).readonly().optional()
58504
58589
  });
58505
58590
  var PlatformScoreSchema = object({
58506
58591
  runtime: literal("python"),
@@ -59033,6 +59118,22 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
59033
59118
  deviceId: number(),
59034
59119
  status: PtzAutotrackStatusSchema
59035
59120
  });
59121
+ var RunningStateSourceSchema = _enum(["native", "assigned"]);
59122
+ object({
59123
+ /** null = unknown — never coerced to false (D393). */
59124
+ running: boolean().nullable(),
59125
+ /** Epoch ms the current boolean began; null while `running` is null. */
59126
+ since: number().nullable(),
59127
+ source: RunningStateSourceSchema,
59128
+ phase: string().nullable(),
59129
+ lastFetchedAt: number()
59130
+ });
59131
+ object({
59132
+ deviceId: number(),
59133
+ since: number().nullable(),
59134
+ phase: string().nullable()
59135
+ });
59136
+ Object.values(DeviceType);
59036
59137
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
59037
59138
  kind: "mutation",
59038
59139
  auth: "admin"
@@ -60872,7 +60973,20 @@ var ZoneRuleSchema = object({
60872
60973
  * Defaults to `true` so operators creating a rule via the UI
60873
60974
  * see it active immediately.
60874
60975
  */
60875
- enabled: boolean().default(true)
60976
+ enabled: boolean().default(true),
60977
+ /**
60978
+ * Package stage only. When true, a package candidate may open from a
60979
+ * scene difference in this rule's zone after a person leaves. The
60980
+ * package model, when it boxes something overlapping, is extra evidence
60981
+ * and is not the gate. Absent or false keeps today's model path.
60982
+ */
60983
+ detectBySceneDifference: boolean().optional(),
60984
+ /**
60985
+ * Package stage only. When true, a promoted package is shown to the
60986
+ * `llm` cap before the delivery event is emitted. Absent or false emits
60987
+ * as today. Usable with or without `detectBySceneDifference`.
60988
+ */
60989
+ confirmWithLlm: boolean().optional()
60876
60990
  });
60877
60991
  array(ZoneRuleSchema).readonly();
60878
60992
  object({
@@ -70416,6 +70530,13 @@ Object.freeze({
70416
70530
  access: "create",
70417
70531
  role: "admin"
70418
70532
  },
70533
+ "runningState.getStatus": {
70534
+ capName: "running-state",
70535
+ capScope: "device",
70536
+ addonId: null,
70537
+ access: "view",
70538
+ role: "viewer"
70539
+ },
70419
70540
  "sceneMonitor.captureReference": {
70420
70541
  capName: "scene-monitor",
70421
70542
  capScope: "device",
@@ -75130,6 +75251,32 @@ var APPLIANCE_CAP_VOCABULARY = {
75130
75251
  }],
75131
75252
  events: { onSent: { notOperatorFacing: "a delivery receipt of a send this system made — not a fact about the world" } }
75132
75253
  },
75254
+ "running-state": {
75255
+ scope: "device",
75256
+ noun: t("Running", "In funzione"),
75257
+ state: [{
75258
+ kind: "boolean",
75259
+ field: "running",
75260
+ label: t("Running", "In funzione"),
75261
+ whenTrue: t("When {device} starts", "Quando {device} inizia"),
75262
+ whenFalse: t("When {device} finishes", "Quando {device} finisce"),
75263
+ icon: "play"
75264
+ }],
75265
+ events: {
75266
+ onStarted: {
75267
+ category: EventCategory.RunningStarted,
75268
+ label: t("Started running", "Ha iniziato a funzionare"),
75269
+ phrase: t("When {device} starts running", "Quando {device} inizia a funzionare"),
75270
+ icon: "play"
75271
+ },
75272
+ onFinished: {
75273
+ category: EventCategory.RunningFinished,
75274
+ label: t("Finished", "Ha finito"),
75275
+ phrase: t("When {device} finishes", "Quando {device} finisce"),
75276
+ icon: "square"
75277
+ }
75278
+ }
75279
+ },
75133
75280
  update: {
75134
75281
  scope: "device",
75135
75282
  noun: t("Firmware update", "Aggiornamento firmware"),
@@ -78670,6 +78817,11 @@ Object.freeze({
78670
78817
  form: "single",
78671
78818
  optional: true
78672
78819
  }],
78820
+ "runningState.getStatus": [{
78821
+ name: "deviceId",
78822
+ form: "single",
78823
+ optional: false
78824
+ }],
78673
78825
  "sceneMonitor.captureReference": [{
78674
78826
  name: "deviceId",
78675
78827
  form: "single",
@@ -79220,40 +79372,7 @@ var NC_AUDIO_DEFAULTS = {
79220
79372
  samplingSeconds: 10
79221
79373
  };
79222
79374
  new Set(["devices", "classes"]);
79223
- /**
79224
- * WHICH narrowing filter speaks about WHICH system-event kind — one predicate,
79225
- * consumed by the rule ENGINE and by every rule EDITOR.
79226
- *
79227
- * ── The failure this file exists for ───────────────────────────────────────
79228
- * `NcSystemEventConditionSchema` carries four optional narrowing lists
79229
- * (`deviceIds`, `deviceTypes`, `nodeIds`, `packageNames`) beside a required
79230
- * `kinds` gate. They are not four filters over one vocabulary: each belongs to
79231
- * a FAMILY of kinds and is meaningless outside it. A node going away has no
79232
- * device type; a completed export has no package; `stream-offline` deliberately
79233
- * carries no device type at all (a stream belongs to a camera by construction).
79234
- *
79235
- * The engine applied all four to every kind, so a filter from one family failed
79236
- * a kind from another family CLOSED. The operator's live rule "Eventi di
79237
- * sistema" selected eleven kinds and set `deviceTypes: ['camera']` — the only
79238
- * way to say "only my cameras" about the two liveness kinds — and NINE of the
79239
- * eleven silently stopped being deliverable. Four days of history contained
79240
- * `device-online` and `device-offline` and nothing else, across a window in
79241
- * which agents were restarted and addons were updated.
79242
- *
79243
- * Both editors already computed this scoping, to decide which filter boxes to
79244
- * render; the cap's own docblock already promised it ("Narrow a `device-*` kind
79245
- * to these device TYPES"). Only the engine disagreed, and it disagreed in the
79246
- * destructive direction. So the rule is stated ONCE, here, and the engine and
79247
- * the editors are readers of it rather than three independent authors.
79248
- *
79249
- * ── The direction ─────────────────────────────────────────────────────────
79250
- * Out of family ⇒ the filter is IGNORED, never fail-closed. An editor that
79251
- * hides a box has already told the operator this filter does not speak about
79252
- * these kinds, so honouring it as an exclusion contradicts the only
79253
- * explanation the operator was ever given. Inside its family the filter still
79254
- * narrows, and still fails CLOSED on a subject that cannot produce the identity
79255
- * it tests (a device the mirror cannot name is not evidence of a camera).
79256
- */
79375
+ new Set(NC_LEGACY_SYSTEM_EVENT_KINDS);
79257
79376
  /**
79258
79377
  * Every filter, for the callers that must cover all of them (guards, tests).
79259
79378
  *
@@ -79279,9 +79398,6 @@ new Map(Object.entries({
79279
79398
  "device-battery-normal": "device-events",
79280
79399
  "device-consumable-low": "device-events",
79281
79400
  "device-consumable-normal": "device-events",
79282
- "device-tank-low": "device-events",
79283
- "device-tank-full": "device-events",
79284
- "device-tank-normal": "device-events",
79285
79401
  "stream-online": "device-events",
79286
79402
  "stream-offline": "device-events",
79287
79403
  "detection-blind": "device-events",
@@ -79358,16 +79474,6 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
79358
79474
  label: "Consumables",
79359
79475
  kinds: ["device-consumable-low", "device-consumable-normal"]
79360
79476
  },
79361
- {
79362
- id: "tanks",
79363
- family: "device-events",
79364
- label: "Tanks",
79365
- kinds: [
79366
- "device-tank-low",
79367
- "device-tank-full",
79368
- "device-tank-normal"
79369
- ]
79370
- },
79371
79477
  {
79372
79478
  id: "detection-blind",
79373
79479
  family: "device-events",
@@ -79525,11 +79631,6 @@ var RULE_BODY_ONLY = ["body"];
79525
79631
  var RULE_TEXT = ["title", "body"];
79526
79632
  var BATTERY = ["device-battery-low", "device-battery-normal"];
79527
79633
  var CONSUMABLE = ["device-consumable-low", "device-consumable-normal"];
79528
- var TANK = [
79529
- "device-tank-low",
79530
- "device-tank-full",
79531
- "device-tank-normal"
79532
- ];
79533
79634
  var ALERT_EPISODE = [
79534
79635
  "alert-critical",
79535
79636
  "alert-error",
@@ -79561,7 +79662,6 @@ var DEVICE_EVENTS = [
79561
79662
  "device-enabled",
79562
79663
  ...BATTERY,
79563
79664
  ...CONSUMABLE,
79564
- ...TANK,
79565
79665
  "stream-online",
79566
79666
  "stream-offline",
79567
79667
  "detection-blind",
@@ -79607,12 +79707,6 @@ var STATE_SUMMARY_SECTION_VARS = [
79607
79707
  example: "Robot — filter 10 %",
79608
79708
  kinds: CONSUMABLE
79609
79709
  },
79610
- {
79611
- name: "summaryTanks",
79612
- label: "Summary: tanks",
79613
- example: "Robot — clean water low",
79614
- kinds: TANK
79615
- },
79616
79710
  {
79617
79711
  name: "summaryDetection",
79618
79712
  label: "Summary: cameras detecting nothing",
@@ -79728,8 +79822,7 @@ var STATE_SUMMARY_VARS = [
79728
79822
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79729
79823
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79730
79824
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79731
- ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79732
- ([...RULE_TEXT], [...TANK]),
79825
+ ([...RULE_TEXT], [...CONSUMABLE]),
79733
79826
  [...RULE_TEXT],
79734
79827
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
79735
79828
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
@@ -79833,15 +79926,6 @@ new Map([
79833
79926
  snapshotLabel: "Consumables low now",
79834
79927
  snapshotSection: "consumables"
79835
79928
  },
79836
- {
79837
- id: "tanks",
79838
- family: "device-events",
79839
- label: "Tanks (low or full / back to normal)",
79840
- bad: ["device-tank-low", "device-tank-full"],
79841
- recovery: ["device-tank-normal"],
79842
- snapshotLabel: "Tanks low or full now",
79843
- snapshotSection: "tanks"
79844
- },
79845
79929
  {
79846
79930
  id: "motion-noise",
79847
79931
  family: "device-events",
@@ -80243,6 +80327,10 @@ TimelapseRuleInputSchema.extend({
80243
80327
  updatedAt: number()
80244
80328
  });
80245
80329
  MotionOnMotionChangedDataSchema.omit({ triggeredBy: true });
80330
+ Object.freeze({
80331
+ person: .8,
80332
+ vehicle: .8
80333
+ });
80246
80334
  object({
80247
80335
  /**
80248
80336
  * Fraction of the box's own size added on EACH side before cutting.