camstack 1.2.204 → 1.2.206

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -37,7 +37,7 @@ async function runServe(args) {
37
37
  ...typeof values.data === "string" ? { data: values.data } : {}
38
38
  };
39
39
  Object.assign(process.env, buildServeEnv(opts));
40
- await import("./launcher-H5B4UHLE.js");
40
+ await import("./launcher-XKPFUE4M.js");
41
41
  }
42
42
 
43
43
  // src/commands/agent.ts
@@ -82,7 +82,7 @@ async function runAgent(args) {
82
82
  ...typeof values.port === "string" ? { port: values.port } : {}
83
83
  };
84
84
  Object.assign(process.env, buildAgentEnv(opts));
85
- await import("./launcher-H5B4UHLE.js");
85
+ await import("./launcher-XKPFUE4M.js");
86
86
  }
87
87
 
88
88
  // src/commands/setup.ts
@@ -14777,7 +14777,7 @@ function date4(params) {
14777
14777
  // ../../node_modules/zod/v4/classic/external.js
14778
14778
  config(en_default());
14779
14779
 
14780
- // ../types/dist/sleep-DJFUfKvA.mjs
14780
+ // ../types/dist/sleep-CUp20JkO.mjs
14781
14781
  var AUDIO_CHUNK_FORMATS = [
14782
14782
  "f32le",
14783
14783
  "pcmu",
@@ -15322,7 +15322,11 @@ var ContributionSectionSchema = external_exports.object({
15322
15322
  external_exports.literal(4)
15323
15323
  ]).optional(),
15324
15324
  tab: external_exports.string().optional(),
15325
- location: external_exports.enum(["settings", "top-tab"]).optional(),
15325
+ location: external_exports.enum([
15326
+ "settings",
15327
+ "top-tab",
15328
+ "hero"
15329
+ ]).optional(),
15326
15330
  order: external_exports.number().optional(),
15327
15331
  fields: external_exports.array(external_exports.any())
15328
15332
  });
@@ -19118,7 +19122,11 @@ var ConfigSectionWithValuesSchema = external_exports.object({
19118
19122
  external_exports.literal(4)
19119
19123
  ]).optional(),
19120
19124
  tab: external_exports.string().optional(),
19121
- location: external_exports.enum(["settings", "top-tab"]).optional(),
19125
+ location: external_exports.enum([
19126
+ "settings",
19127
+ "top-tab",
19128
+ "hero"
19129
+ ]).optional(),
19122
19130
  order: external_exports.number().optional(),
19123
19131
  fields: external_exports.array(external_exports.any())
19124
19132
  });
@@ -23456,6 +23464,46 @@ var TierStatusSchema = external_exports.object({
23456
23464
  approxBytes: external_exports.number().nullable(),
23457
23465
  countedAt: external_exports.number().nullable()
23458
23466
  });
23467
+ var DeviceHistoryOrphanReasonSchema = external_exports.enum(["device-gone", "undeclared"]);
23468
+ var TierRowsSchema = external_exports.object({
23469
+ raw: external_exports.number().int(),
23470
+ "5m": external_exports.number().int(),
23471
+ "1h": external_exports.number().int(),
23472
+ "1d": external_exports.number().int()
23473
+ });
23474
+ var OrphanSeriesSchema = external_exports.object({
23475
+ seriesId: external_exports.number().int(),
23476
+ deviceId: external_exports.number().int(),
23477
+ key: external_exports.string(),
23478
+ scope: external_exports.string(),
23479
+ /** The metric's display name; `null` when its metric row is gone too. */
23480
+ displayName: external_exports.string().nullable(),
23481
+ reason: DeviceHistoryOrphanReasonSchema,
23482
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
23483
+ missingSince: external_exports.number().nullable(),
23484
+ firstTs: external_exports.number(),
23485
+ lastTs: external_exports.number(),
23486
+ rows: TierRowsSchema
23487
+ });
23488
+ var DeviceHistoryOrphanDeleteRefusalSchema = external_exports.enum([
23489
+ "not-found",
23490
+ "not-orphan",
23491
+ "failed"
23492
+ ]);
23493
+ var OrphanDeleteEntrySchema = external_exports.discriminatedUnion("ok", [external_exports.object({
23494
+ seriesId: external_exports.number().int(),
23495
+ ok: external_exports.literal(true),
23496
+ deleted: TierRowsSchema
23497
+ }), external_exports.object({
23498
+ seriesId: external_exports.number().int(),
23499
+ ok: external_exports.literal(false),
23500
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
23501
+ })]);
23502
+ var OrphanListSchema = external_exports.object({
23503
+ series: external_exports.array(OrphanSeriesSchema).readonly(),
23504
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
23505
+ truncated: external_exports.boolean()
23506
+ });
23459
23507
  var DeviceHistoryStatusSchema = external_exports.object({
23460
23508
  startedAt: external_exports.number(),
23461
23509
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -23597,7 +23645,24 @@ var deviceHistoryCapability = {
23597
23645
  kind: "mutation",
23598
23646
  auth: "admin"
23599
23647
  }),
23600
- getStatus: method(external_exports.object({}), DeviceHistoryStatusSchema, { auth: "admin" })
23648
+ getStatus: method(external_exports.object({}), DeviceHistoryStatusSchema, { auth: "admin" }),
23649
+ /**
23650
+ * Device series no longer linked to a device (D917): the device is absent
23651
+ * from the listings, or the key is declared by no capability. REPORTED,
23652
+ * never purged by this judgement; each entry counts its rows per tier
23653
+ * (a primary-key range per series). Ordered by device, key, scope.
23654
+ */
23655
+ listOrphanSeries: method(external_exports.object({}), OrphanListSchema, { auth: "admin" }),
23656
+ /**
23657
+ * Delete orphan series by id. Each id is re-judged NOW: a series that is
23658
+ * not orphan (its device came back) is refused `not-orphan`, an unknown id
23659
+ * `not-found`. Deletes tier by tier in the retention slices, then the
23660
+ * series row; one entry per id, in order.
23661
+ */
23662
+ deleteOrphanSeries: method(external_exports.object({ seriesIds: external_exports.array(external_exports.number().int()).min(1).max(50) }), external_exports.object({ results: external_exports.array(OrphanDeleteEntrySchema).readonly() }), {
23663
+ kind: "mutation",
23664
+ auth: "admin"
23665
+ })
23601
23666
  }
23602
23667
  };
23603
23668
  var DeviceCaStatusSchema = external_exports.discriminatedUnion("state", [
@@ -56548,6 +56613,19 @@ var NodeInferenceDeviceSchema = external_exports.object({
56548
56613
  /** Whether the node's live probe reports the device as usable right now. */
56549
56614
  available: external_exports.boolean(),
56550
56615
  /**
56616
+ * Is the device on the node at all (D919)? `present` — the live probe
56617
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
56618
+ * its stored settings remain (unplugged, moved to another node): never
56619
+ * eligible, whatever its stored `enabled`, and forgettable with
56620
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
56621
+ * claimed (D315). Optional only for an orchestrator older than the field.
56622
+ */
56623
+ presence: external_exports.enum([
56624
+ "present",
56625
+ "absent",
56626
+ "unknown"
56627
+ ]).optional(),
56628
+ /**
56551
56629
  * Whether this device participates in dispatch. AUTO default (spec C2):
56552
56630
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
56553
56631
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -56946,6 +57024,20 @@ var pipelineOrchestratorCapability = {
56946
57024
  */
56947
57025
  getNodeInferenceDevices: method(external_exports.object({ nodeId: external_exports.string() }), NodeInferenceDevicesSchema),
56948
57026
  /**
57027
+ * Delete ONE stored device entry of a node — the "forget" of a device the
57028
+ * node no longer has (D919). Refused unless the node's probe ANSWERED and
57029
+ * did not report the key: a present device is switched off, not forgotten,
57030
+ * and an unreachable node proves nothing about its hardware. The rest of
57031
+ * the node's map is kept as stored.
57032
+ */
57033
+ forgetInferenceDevice: method(external_exports.object({
57034
+ agentNodeId: external_exports.string(),
57035
+ deviceKey: external_exports.string()
57036
+ }), external_exports.object({ success: external_exports.literal(true) }), {
57037
+ kind: "mutation",
57038
+ auth: "admin"
57039
+ }),
57040
+ /**
56949
57041
  * Reset one node's pipeline to its hardware-aware defaults — the HONEST
56950
57042
  * reset (replaces the executor's legacy `resetToDefault`, which cleared a
56951
57043
  * dead persisted step-tree seed nothing in the live path read):
@@ -61993,6 +62085,30 @@ var connectivityCapability = {
61993
62085
  * whether persisting is worth a SQLite commit. */
61994
62086
  volatileStateFields: ["lastChangedAt"]
61995
62087
  };
62088
+ var ConsumableKindSchema = external_exports.enum([
62089
+ "wear",
62090
+ "supply",
62091
+ "waste"
62092
+ ]);
62093
+ var ConsumableFormSchema = external_exports.enum([
62094
+ "part",
62095
+ "tank",
62096
+ "product",
62097
+ "bin"
62098
+ ]);
62099
+ var ConsumableStatusSchema = external_exports.enum([
62100
+ "ok",
62101
+ "low",
62102
+ "empty",
62103
+ "full",
62104
+ "replace"
62105
+ ]);
62106
+ var ConsumableLevelSchema = external_exports.enum([
62107
+ "ok",
62108
+ "low",
62109
+ "empty",
62110
+ "full"
62111
+ ]);
61996
62112
  var ConsumableRemainingUnitSchema = external_exports.enum([
61997
62113
  "days",
61998
62114
  "hours",
@@ -62007,10 +62123,14 @@ var ConsumableItemSchema = external_exports.object({
62007
62123
  key: external_exports.string().min(1),
62008
62124
  /** Display name. */
62009
62125
  label: external_exports.string().min(1),
62010
- /** Remaining life % when known (0..100). */
62126
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
62011
62127
  level: external_exports.number().min(0).max(100).nullable(),
62012
- /** Discrete state when known (binary mode). */
62013
- status: external_exports.enum(["ok", "replace"]).nullable(),
62128
+ /** The provider's discrete verdict when known (binary mode). */
62129
+ status: ConsumableStatusSchema.nullable(),
62130
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
62131
+ kind: ConsumableKindSchema.optional(),
62132
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
62133
+ form: ConsumableFormSchema.optional(),
62014
62134
  /** Ms epoch of the last replace, when known. */
62015
62135
  lastResetAt: external_exports.number().nullable(),
62016
62136
  /** Whether `reset()` is meaningful for this item. */
@@ -62033,7 +62153,7 @@ var consumablesCapability = {
62033
62153
  kind: "widget",
62034
62154
  widgetId: "host/consumables-panel",
62035
62155
  tab: "consumables",
62036
- topTab: true,
62156
+ placement: "hero",
62037
62157
  label: "Consumables",
62038
62158
  order: 5
62039
62159
  } },
@@ -62095,9 +62215,37 @@ var consumablesCapability = {
62095
62215
  */
62096
62216
  durability: "restored",
62097
62217
  /**
62098
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
62218
+ * History (D850, D917): one series per (item field, item `key`) — the item key
62219
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
62220
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
62221
+ * their provider reports them; an item that appears later gets its series.
62099
62222
  */
62100
- history: "none",
62223
+ history: {
62224
+ fields: {},
62225
+ items: {
62226
+ path: "items",
62227
+ key: "key",
62228
+ label: "label",
62229
+ fields: {
62230
+ level: {
62231
+ kind: "gauge",
62232
+ unit: "%",
62233
+ deadband: 2,
62234
+ displayName: "Level"
62235
+ },
62236
+ status: {
62237
+ kind: "enum",
62238
+ displayName: "Status"
62239
+ },
62240
+ "remaining.value": {
62241
+ kind: "gauge",
62242
+ unitFrom: "remaining.unit",
62243
+ deadband: 1,
62244
+ displayName: "Remaining"
62245
+ }
62246
+ }
62247
+ }
62248
+ },
62101
62249
  /** Clocks, not content: a re-read that changed no item costs no commit. */
62102
62250
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
62103
62251
  };
@@ -62458,11 +62606,6 @@ var DishwasherAvailabilitySchema = external_exports.enum([
62458
62606
  "offline",
62459
62607
  "description-missing"
62460
62608
  ]);
62461
- var DishwasherConsumableLevelSchema = external_exports.enum([
62462
- "ok",
62463
- "low",
62464
- "empty"
62465
- ]);
62466
62609
  var DishwasherStatusSchema = external_exports.object({
62467
62610
  availability: DishwasherAvailabilitySchema,
62468
62611
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -62495,8 +62638,6 @@ var DishwasherStatusSchema = external_exports.object({
62495
62638
  powerOn: external_exports.boolean().nullable(),
62496
62639
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
62497
62640
  powerState: external_exports.string().nullable(),
62498
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
62499
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
62500
62641
  /**
62501
62642
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
62502
62643
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -65230,7 +65371,7 @@ var motionTriggerCapability = {
65230
65371
  enabled: external_exports.boolean()
65231
65372
  }), external_exports.void(), {
65232
65373
  kind: "mutation",
65233
- auth: "admin"
65374
+ auth: "protected"
65234
65375
  }) },
65235
65376
  events: { onMotionTriggerChanged: { data: external_exports.object({
65236
65377
  deviceId: external_exports.number(),
@@ -65775,6 +65916,13 @@ var TopologyNodeSchema = external_exports.object({
65775
65916
  cpuModel: external_exports.string().nullable(),
65776
65917
  cpuCores: external_exports.number(),
65777
65918
  memoryMB: external_exports.number(),
65919
+ /**
65920
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
65921
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
65922
+ * about whether its hardware is there (a Coral delegate stays installed
65923
+ * after the stick leaves, D919); the live device set is
65924
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
65925
+ */
65778
65926
  engines: external_exports.array(external_exports.string()).readonly(),
65779
65927
  isHub: external_exports.boolean(),
65780
65928
  isOnline: external_exports.boolean(),
@@ -66962,6 +67110,18 @@ var ResolvedInferenceConfigSchema = external_exports.object({
66962
67110
  format: ModelFormatSchema,
66963
67111
  reason: external_exports.string()
66964
67112
  });
67113
+ var AcceleratorRescanSchema = external_exports.object({
67114
+ devices: external_exports.array(InferenceDeviceDescriptorSchema).readonly(),
67115
+ appeared: external_exports.array(external_exports.string()).readonly(),
67116
+ disappeared: external_exports.array(external_exports.string()).readonly(),
67117
+ usbBus: external_exports.enum(["observed", "unobservable"]),
67118
+ decidedBy: external_exports.enum([
67119
+ "usb-ids",
67120
+ "pci",
67121
+ "delegate-fallback",
67122
+ "none"
67123
+ ])
67124
+ });
66965
67125
  var platformProbeCapability = {
66966
67126
  name: "platform-probe",
66967
67127
  scope: "system",
@@ -66970,7 +67130,18 @@ var platformProbeCapability = {
66970
67130
  getCapabilities: method(external_exports.void(), PlatformCapabilitiesSchema),
66971
67131
  getHardware: method(external_exports.void(), HardwareInfoSchema),
66972
67132
  resolveInferenceConfig: method(external_exports.object({ requirements: external_exports.array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema),
66973
- resolveHwAccel: method(external_exports.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema)
67133
+ resolveHwAccel: method(external_exports.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema),
67134
+ /**
67135
+ * Re-probe this node's accelerators NOW (Coral USB ids + PCIe apex units;
67136
+ * `/sys` and `/dev` reads, no model load) and rebuild the device list that
67137
+ * `getCapabilities` serves. The same re-probe runs every 60 s on its own;
67138
+ * this is the operator's "rescan inference devices". Target a node with the
67139
+ * `{ nodeId }` routing input, like `getCapabilities`.
67140
+ */
67141
+ rescanAccelerators: method(external_exports.void(), AcceleratorRescanSchema, {
67142
+ kind: "mutation",
67143
+ auth: "admin"
67144
+ })
66974
67145
  }
66975
67146
  };
66976
67147
  var PowerMeterStatusSchema = external_exports.object({
@@ -70572,16 +70743,6 @@ var VacuumStateSchema = external_exports.enum([
70572
70743
  "drying",
70573
70744
  "error"
70574
70745
  ]);
70575
- var TankStatusSchema = external_exports.object({
70576
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
70577
- level: external_exports.number().min(0).max(100).nullable(),
70578
- /** Discrete state when the hardware is binary-mode; null otherwise. */
70579
- status: external_exports.enum([
70580
- "ok",
70581
- "low",
70582
- "full"
70583
- ]).nullable()
70584
- });
70585
70746
  var VacuumControlStatusSchema = external_exports.object({
70586
70747
  /** Lifecycle state of the vacuum. */
70587
70748
  state: VacuumStateSchema,
@@ -70593,14 +70754,6 @@ var VacuumControlStatusSchema = external_exports.object({
70593
70754
  fanSpeed: external_exports.string().nullable(),
70594
70755
  /** Speed tokens the hardware accepts — drives the UI selector. */
70595
70756
  availableFanSpeeds: external_exports.array(external_exports.string()),
70596
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
70597
- cleanWater: TankStatusSchema.nullable(),
70598
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
70599
- dirtyWater: TankStatusSchema.nullable(),
70600
- /** Detergent tank. Null when the hardware has no detergent tank. */
70601
- detergent: TankStatusSchema.nullable(),
70602
- /** Dust bin. Null when the hardware has no dust bin. */
70603
- dustBin: TankStatusSchema.nullable(),
70604
70757
  /** 0..100 cleaning-completion percentage of the current task, or null. */
70605
70758
  progressPercent: external_exports.number().min(0).max(100).nullable(),
70606
70759
  /** Current error code (0 / null = no error). */
@@ -70662,35 +70815,14 @@ var vacuumControlCapability = {
70662
70815
  */
70663
70816
  durability: "session",
70664
70817
  /**
70665
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
70818
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
70819
+ * items are keyed by runtime ids and record no history.
70666
70820
  */
70667
- history: { fields: {
70668
- batteryLevel: {
70669
- kind: "gauge",
70670
- unit: "%",
70671
- deadband: 2
70672
- },
70673
- "cleanWater.level": {
70674
- kind: "gauge",
70675
- unit: "%",
70676
- deadband: 2
70677
- },
70678
- "dirtyWater.level": {
70679
- kind: "gauge",
70680
- unit: "%",
70681
- deadband: 2
70682
- },
70683
- "detergent.level": {
70684
- kind: "gauge",
70685
- unit: "%",
70686
- deadband: 2
70687
- },
70688
- "dustBin.level": {
70689
- kind: "gauge",
70690
- unit: "%",
70691
- deadband: 2
70692
- }
70693
- } }
70821
+ history: { fields: { batteryLevel: {
70822
+ kind: "gauge",
70823
+ unit: "%",
70824
+ deadband: 2
70825
+ } } }
70694
70826
  };
70695
70827
  var ValveStateSchema = external_exports.enum([
70696
70828
  "open",
@@ -73671,6 +73803,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
73671
73803
  addonId: null,
73672
73804
  access: "create"
73673
73805
  },
73806
+ "deviceHistory.deleteOrphanSeries": {
73807
+ capName: "device-history",
73808
+ capScope: "system",
73809
+ addonId: null,
73810
+ access: "delete"
73811
+ },
73674
73812
  "deviceHistory.getDeviceEnabled": {
73675
73813
  capName: "device-history",
73676
73814
  capScope: "system",
@@ -73689,6 +73827,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
73689
73827
  addonId: null,
73690
73828
  access: "view"
73691
73829
  },
73830
+ "deviceHistory.listOrphanSeries": {
73831
+ capName: "device-history",
73832
+ capScope: "system",
73833
+ addonId: null,
73834
+ access: "view"
73835
+ },
73692
73836
  "deviceHistory.listSeries": {
73693
73837
  capName: "device-history",
73694
73838
  capScope: "system",
@@ -77313,6 +77457,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
77313
77457
  addonId: null,
77314
77458
  access: "delete"
77315
77459
  },
77460
+ "pipelineOrchestrator.forgetInferenceDevice": {
77461
+ capName: "pipeline-orchestrator",
77462
+ capScope: "system",
77463
+ addonId: null,
77464
+ access: "delete"
77465
+ },
77316
77466
  "pipelineOrchestrator.getAgentLoad": {
77317
77467
  capName: "pipeline-orchestrator",
77318
77468
  capScope: "system",
@@ -77889,6 +78039,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
77889
78039
  addonId: null,
77890
78040
  access: "view"
77891
78041
  },
78042
+ "platformProbe.rescanAccelerators": {
78043
+ capName: "platform-probe",
78044
+ capScope: "system",
78045
+ addonId: null,
78046
+ access: "create"
78047
+ },
77892
78048
  "platformProbe.resolveHwAccel": {
77893
78049
  capName: "platform-probe",
77894
78050
  capScope: "system",
@@ -83484,33 +83640,11 @@ var HISTORY_CATALOG = {
83484
83640
  unit: "\xB0C",
83485
83641
  deadband: 0.1
83486
83642
  } },
83487
- "vacuum-control": {
83488
- "batteryLevel": {
83489
- kind: "gauge",
83490
- unit: "%",
83491
- deadband: 2
83492
- },
83493
- "cleanWater.level": {
83494
- kind: "gauge",
83495
- unit: "%",
83496
- deadband: 2
83497
- },
83498
- "dirtyWater.level": {
83499
- kind: "gauge",
83500
- unit: "%",
83501
- deadband: 2
83502
- },
83503
- "detergent.level": {
83504
- kind: "gauge",
83505
- unit: "%",
83506
- deadband: 2
83507
- },
83508
- "dustBin.level": {
83509
- kind: "gauge",
83510
- unit: "%",
83511
- deadband: 2
83512
- }
83513
- },
83643
+ "vacuum-control": { "batteryLevel": {
83644
+ kind: "gauge",
83645
+ unit: "%",
83646
+ deadband: 2
83647
+ } },
83514
83648
  "valve": { "position": {
83515
83649
  kind: "gauge",
83516
83650
  unit: "%",
@@ -84295,17 +84429,18 @@ var NC_TEMPLATE_VARS = [
84295
84429
  {
84296
84430
  name: "item",
84297
84431
  label: "Consumable",
84432
+ description: "The device's own name for the item: a filter, a brush, the salt, a tank.",
84298
84433
  example: "Filtro",
84299
84434
  group: "system",
84300
84435
  families: ["rule"],
84301
84436
  fields: [...RULE_TEXT],
84302
84437
  kinds: ["system"],
84303
- systemEventKinds: [...CONSUMABLE]
84438
+ systemEventKinds: [...CONSUMABLE, ...TANK]
84304
84439
  },
84305
84440
  {
84306
84441
  name: "tank",
84307
84442
  label: "Tank",
84308
- description: "Which tank: clean water, dirty water, detergent or dust bin.",
84443
+ description: "Which tank, as a stable token: cleanWater, dirtyWater, detergent, dustBin, or the device key of any other supply (salt, rinse aid).",
84309
84444
  example: "clean water",
84310
84445
  group: "system",
84311
84446
  families: ["rule"],