@camstack/system 1.2.468 → 1.2.470

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 (94) hide show
  1. package/dist/addon-runner.js +56 -25
  2. package/dist/addon-runner.mjs +56 -25
  3. package/dist/{agent-https-DJ8OzQOr.js → agent-https-D_oo3PNv.js} +1 -1
  4. package/dist/{agent-https-DR1wmhYY.mjs → agent-https-DmNQyAl7.mjs} +1 -1
  5. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  9. package/dist/builtins/alerts/alerts.addon.js +1 -1
  10. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  11. package/dist/builtins/autotrack/index.js +1 -1
  12. package/dist/builtins/autotrack/index.mjs +1 -1
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  14. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  15. package/dist/builtins/calendars/calendars.addon.js +1 -1
  16. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  17. package/dist/builtins/camera-grid/index.js +1 -1
  18. package/dist/builtins/camera-grid/index.mjs +1 -1
  19. package/dist/builtins/composer/composer.addon.js +2 -2
  20. package/dist/builtins/composer/composer.addon.mjs +2 -2
  21. package/dist/builtins/console-logging/index.js +1 -1
  22. package/dist/builtins/console-logging/index.mjs +1 -1
  23. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  24. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  25. package/dist/builtins/device-history/capture/capture-engine.d.ts +24 -4
  26. package/dist/builtins/device-history/device-history.addon.js +319 -44
  27. package/dist/builtins/device-history/device-history.addon.mjs +319 -44
  28. package/dist/builtins/device-history/query/history-query.d.ts +19 -2
  29. package/dist/builtins/device-history/retention/orphans.d.ts +50 -0
  30. package/dist/builtins/device-history/retention/retention.d.ts +9 -2
  31. package/dist/builtins/device-history/runtime/history-runtime.d.ts +10 -2
  32. package/dist/builtins/device-history/store/history-store.d.ts +5 -0
  33. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  34. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  35. package/dist/builtins/device-manager/device-meta-types.d.ts +2 -2
  36. package/dist/builtins/hub-forwarder/index.js +1 -1
  37. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  38. package/dist/builtins/keychain/index.js +3 -3
  39. package/dist/builtins/keychain/index.mjs +3 -3
  40. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  41. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  42. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  43. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  44. package/dist/builtins/local-network/local-network.addon.js +2 -2
  45. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  46. package/dist/builtins/loki-logging/index.js +1 -1
  47. package/dist/builtins/loki-logging/index.mjs +1 -1
  48. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  49. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  50. package/dist/builtins/platform-probe/accelerator-reprobe.d.ts +23 -0
  51. package/dist/builtins/platform-probe/coral-accelerators.d.ts +37 -8
  52. package/dist/builtins/platform-probe/index.d.ts +17 -1
  53. package/dist/builtins/platform-probe/index.js +192 -11
  54. package/dist/builtins/platform-probe/index.mjs +192 -12
  55. package/dist/builtins/platform-probe/platform-scorer.d.ts +14 -0
  56. package/dist/builtins/record-entries/index.js +1 -1
  57. package/dist/builtins/record-entries/index.mjs +1 -1
  58. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  59. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  60. package/dist/builtins/snapshot/index.js +1 -1
  61. package/dist/builtins/snapshot/index.mjs +1 -1
  62. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  63. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  64. package/dist/builtins/sqlite-storage/index.js +1 -1
  65. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  66. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  67. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  68. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  69. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  70. package/dist/builtins/system-config/system-config.addon.js +3 -3
  71. package/dist/builtins/system-config/system-config.addon.mjs +3 -3
  72. package/dist/builtins/winston-logging/index.js +1 -1
  73. package/dist/builtins/winston-logging/index.mjs +1 -1
  74. package/dist/{composition-sources-Qto-S6MA.mjs → composition-sources-B0tqvf0t.mjs} +1 -1
  75. package/dist/{composition-sources-5rpWQhA1.js → composition-sources-CRJffEiB.js} +1 -1
  76. package/dist/{constants-BWli8Cju.mjs → constants--A505iuO.mjs} +1 -1
  77. package/dist/{constants-CuO3rcw4.js → constants-WF1AqoKF.js} +1 -1
  78. package/dist/{coral-accelerators-oUXmmbc2.js → coral-accelerators-Cri32b7q.js} +61 -24
  79. package/dist/{coral-accelerators-D_S1Fo5h.mjs → coral-accelerators-Dl-GnMHn.mjs} +56 -25
  80. package/dist/{device-ca-C5cLlah1.mjs → device-ca-DYmToMp8.mjs} +1 -1
  81. package/dist/{device-ca-CGcaSheI.js → device-ca-R4MZZtc0.js} +1 -1
  82. package/dist/{dist-l6zKmHEb.js → dist-DRL3rEfN.js} +335 -120
  83. package/dist/{dist-BpUtAgqR.mjs → dist-X1r44BdF.mjs} +324 -121
  84. package/dist/file-host-worker.js +1 -1
  85. package/dist/file-host-worker.mjs +1 -1
  86. package/dist/{hub-mdns-ciao-0KWDyIMD.mjs → hub-mdns-ciao-CZV5Hion.mjs} +2 -2
  87. package/dist/{hub-mdns-ciao-CIno_SNn.js → hub-mdns-ciao-DUoTS6jN.js} +2 -2
  88. package/dist/index.js +8 -8
  89. package/dist/index.mjs +8 -8
  90. package/dist/{restore-archive-B71JI-sP.js → restore-archive-Df6PsOHP.js} +1 -1
  91. package/dist/{restore-archive-DKxAZ9pI.mjs → restore-archive-X0ciGMmO.mjs} +1 -1
  92. package/dist/{wal-maintenance-BXYwFecW.mjs → wal-maintenance-D6J_MmZ8.mjs} +0 -0
  93. package/dist/{wal-maintenance-B6LSQ_OZ.js → wal-maintenance-DYvzJiuK.js} +0 -0
  94. package/package.json +1 -1
@@ -762,7 +762,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
762
762
  return EventCategory;
763
763
  }({});
764
764
  //#endregion
765
- //#region ../types/dist/sleep-DJFUfKvA.mjs
765
+ //#region ../types/dist/sleep-CUp20JkO.mjs
766
766
  /**
767
767
  * The audio chunk plane's byte format, and the ONE expansion from a coded
768
768
  * window to float samples (D455).
@@ -4606,6 +4606,10 @@ zod.z.object({
4606
4606
  field: zod.z.string().min(1),
4607
4607
  on: zod.z.literal("advance")
4608
4608
  });
4609
+ /** The catalog field path of an item field: `<itemsPath>[].<field>` (`items[].level`). */
4610
+ function historyItemFieldPath(itemsPath, field) {
4611
+ return `${itemsPath}[].${field}`;
4612
+ }
4609
4613
  /** Capture floor (ms) applied to `gauge` / `counter` series when a field states none. */
4610
4614
  var HISTORY_DEFAULT_MIN_INTERVAL_MS = 1e4;
4611
4615
  /**
@@ -4647,7 +4651,11 @@ var ContributionSectionSchema = zod.z.object({
4647
4651
  zod.z.literal(4)
4648
4652
  ]).optional(),
4649
4653
  tab: zod.z.string().optional(),
4650
- location: zod.z.enum(["settings", "top-tab"]).optional(),
4654
+ location: zod.z.enum([
4655
+ "settings",
4656
+ "top-tab",
4657
+ "hero"
4658
+ ]).optional(),
4651
4659
  order: zod.z.number().optional(),
4652
4660
  fields: zod.z.array(zod.z.any())
4653
4661
  });
@@ -11351,7 +11359,11 @@ var ConfigSectionWithValuesSchema = zod.z.object({
11351
11359
  zod.z.literal(4)
11352
11360
  ]).optional(),
11353
11361
  tab: zod.z.string().optional(),
11354
- location: zod.z.enum(["settings", "top-tab"]).optional(),
11362
+ location: zod.z.enum([
11363
+ "settings",
11364
+ "top-tab",
11365
+ "hero"
11366
+ ]).optional(),
11355
11367
  order: zod.z.number().optional(),
11356
11368
  fields: zod.z.array(zod.z.any())
11357
11369
  });
@@ -17851,6 +17863,52 @@ var TierStatusSchema = zod.z.object({
17851
17863
  countedAt: zod.z.number().nullable()
17852
17864
  });
17853
17865
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17866
+ /**
17867
+ * Why a series is orphan. `device-gone`: its device is absent from the
17868
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17869
+ * key is declared by no capability any more (a field a cap removed).
17870
+ */
17871
+ var DeviceHistoryOrphanReasonSchema = zod.z.enum(["device-gone", "undeclared"]);
17872
+ /** Rows held per stored tier. */
17873
+ var TierRowsSchema = zod.z.object({
17874
+ raw: zod.z.number().int(),
17875
+ "5m": zod.z.number().int(),
17876
+ "1h": zod.z.number().int(),
17877
+ "1d": zod.z.number().int()
17878
+ });
17879
+ var OrphanSeriesSchema = zod.z.object({
17880
+ seriesId: zod.z.number().int(),
17881
+ deviceId: zod.z.number().int(),
17882
+ key: zod.z.string(),
17883
+ scope: zod.z.string(),
17884
+ /** The metric's display name; `null` when its metric row is gone too. */
17885
+ displayName: zod.z.string().nullable(),
17886
+ reason: DeviceHistoryOrphanReasonSchema,
17887
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17888
+ missingSince: zod.z.number().nullable(),
17889
+ firstTs: zod.z.number(),
17890
+ lastTs: zod.z.number(),
17891
+ rows: TierRowsSchema
17892
+ });
17893
+ var DeviceHistoryOrphanDeleteRefusalSchema = zod.z.enum([
17894
+ "not-found",
17895
+ "not-orphan",
17896
+ "failed"
17897
+ ]);
17898
+ var OrphanDeleteEntrySchema = zod.z.discriminatedUnion("ok", [zod.z.object({
17899
+ seriesId: zod.z.number().int(),
17900
+ ok: zod.z.literal(true),
17901
+ deleted: TierRowsSchema
17902
+ }), zod.z.object({
17903
+ seriesId: zod.z.number().int(),
17904
+ ok: zod.z.literal(false),
17905
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17906
+ })]);
17907
+ var OrphanListSchema = zod.z.object({
17908
+ series: zod.z.array(OrphanSeriesSchema).readonly(),
17909
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17910
+ truncated: zod.z.boolean()
17911
+ });
17854
17912
  var DeviceHistoryStatusSchema = zod.z.object({
17855
17913
  startedAt: zod.z.number(),
17856
17914
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17992,7 +18050,24 @@ var deviceHistoryCapability = {
17992
18050
  kind: "mutation",
17993
18051
  auth: "admin"
17994
18052
  }),
17995
- getStatus: method(zod.z.object({}), DeviceHistoryStatusSchema, { auth: "admin" })
18053
+ getStatus: method(zod.z.object({}), DeviceHistoryStatusSchema, { auth: "admin" }),
18054
+ /**
18055
+ * Device series no longer linked to a device (D917): the device is absent
18056
+ * from the listings, or the key is declared by no capability. REPORTED,
18057
+ * never purged by this judgement; each entry counts its rows per tier
18058
+ * (a primary-key range per series). Ordered by device, key, scope.
18059
+ */
18060
+ listOrphanSeries: method(zod.z.object({}), OrphanListSchema, { auth: "admin" }),
18061
+ /**
18062
+ * Delete orphan series by id. Each id is re-judged NOW: a series that is
18063
+ * not orphan (its device came back) is refused `not-orphan`, an unknown id
18064
+ * `not-found`. Deletes tier by tier in the retention slices, then the
18065
+ * series row; one entry per id, in order.
18066
+ */
18067
+ deleteOrphanSeries: method(zod.z.object({ seriesIds: zod.z.array(zod.z.number().int()).min(1).max(50) }), zod.z.object({ results: zod.z.array(OrphanDeleteEntrySchema).readonly() }), {
18068
+ kind: "mutation",
18069
+ auth: "admin"
18070
+ })
17996
18071
  }
17997
18072
  };
17998
18073
  var DeviceCaStatusSchema = zod.z.discriminatedUnion("state", [
@@ -54354,6 +54429,19 @@ var NodeInferenceDeviceSchema = zod.z.object({
54354
54429
  /** Whether the node's live probe reports the device as usable right now. */
54355
54430
  available: zod.z.boolean(),
54356
54431
  /**
54432
+ * Is the device on the node at all (D919)? `present` — the live probe
54433
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
54434
+ * its stored settings remain (unplugged, moved to another node): never
54435
+ * eligible, whatever its stored `enabled`, and forgettable with
54436
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
54437
+ * claimed (D315). Optional only for an orchestrator older than the field.
54438
+ */
54439
+ presence: zod.z.enum([
54440
+ "present",
54441
+ "absent",
54442
+ "unknown"
54443
+ ]).optional(),
54444
+ /**
54357
54445
  * Whether this device participates in dispatch. AUTO default (spec C2):
54358
54446
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
54359
54447
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -54787,6 +54875,20 @@ var pipelineOrchestratorCapability = {
54787
54875
  */
54788
54876
  getNodeInferenceDevices: method(zod.z.object({ nodeId: zod.z.string() }), NodeInferenceDevicesSchema),
54789
54877
  /**
54878
+ * Delete ONE stored device entry of a node — the "forget" of a device the
54879
+ * node no longer has (D919). Refused unless the node's probe ANSWERED and
54880
+ * did not report the key: a present device is switched off, not forgotten,
54881
+ * and an unreachable node proves nothing about its hardware. The rest of
54882
+ * the node's map is kept as stored.
54883
+ */
54884
+ forgetInferenceDevice: method(zod.z.object({
54885
+ agentNodeId: zod.z.string(),
54886
+ deviceKey: zod.z.string()
54887
+ }), zod.z.object({ success: zod.z.literal(true) }), {
54888
+ kind: "mutation",
54889
+ auth: "admin"
54890
+ }),
54891
+ /**
54790
54892
  * Reset one node's pipeline to its hardware-aware defaults — the HONEST
54791
54893
  * reset (replaces the executor's legacy `resetToDefault`, which cleared a
54792
54894
  * dead persisted step-tree seed nothing in the live path read):
@@ -60958,17 +61060,69 @@ var connectivityCapability = {
60958
61060
  volatileStateFields: ["lastChangedAt"]
60959
61061
  };
60960
61062
  /**
60961
- * Generic device-consumables capability — surfaces a device's
60962
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
60963
- * descaling cycles, …) with their remaining life and an optional
60964
- * "Replaced" reset action. Device-agnostic: any provider that knows its
60965
- * device tracks consumables can register it; the cap declares no
60966
- * vocabulary of its own — the provider names each item verbatim.
61063
+ * Generic device-consumables capability — the ONE place a device reports what
61064
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
61065
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
61066
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
61067
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
61068
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
61069
+ * its device tracks consumables registers it; the provider names each item
61070
+ * verbatim and says which `kind` it is.
61071
+ *
61072
+ * The admin UI renders it as ONE collapsible section directly under the
61073
+ * device page's hero card (`placement: 'hero'`), for every device bound to
61074
+ * this cap — never drawn by a device type's hero card itself (D915).
60967
61075
  *
60968
61076
  * Like `childLayout`, the cap is INERT until a provider sets items: no
60969
61077
  * provider populates it by guessing (no HA inference). The UI renders a
60970
61078
  * "No consumables reported" placeholder when `items` is empty.
60971
61079
  */
61080
+ /**
61081
+ * What an item IS, which decides which direction is bad:
61082
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
61083
+ * - `supply` — something the device draws from (clean water, detergent,
61084
+ * salt, rinse aid); low or empty is bad.
61085
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
61086
+ * bad.
61087
+ * Absent = `wear`.
61088
+ */
61089
+ var ConsumableKindSchema = zod.z.enum([
61090
+ "wear",
61091
+ "supply",
61092
+ "waste"
61093
+ ]);
61094
+ /**
61095
+ * What an item LOOKS like, which decides how a client draws it — independent
61096
+ * of `kind`, which decides which direction is bad:
61097
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
61098
+ * remaining time and a reset.
61099
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
61100
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
61101
+ * a stepped level and "refill".
61102
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
61103
+ * that warns when full.
61104
+ * Absent = derived from the kind ({@link consumableFormOf}).
61105
+ */
61106
+ var ConsumableFormSchema = zod.z.enum([
61107
+ "part",
61108
+ "tank",
61109
+ "product",
61110
+ "bin"
61111
+ ]);
61112
+ /** The provider's own discrete verdict on an item. */
61113
+ var ConsumableStatusSchema = zod.z.enum([
61114
+ "ok",
61115
+ "low",
61116
+ "empty",
61117
+ "full",
61118
+ "replace"
61119
+ ]);
61120
+ zod.z.enum([
61121
+ "ok",
61122
+ "low",
61123
+ "empty",
61124
+ "full"
61125
+ ]);
60972
61126
  /** Units a remaining-life counter is reported in. Closed: the panel renders
60973
61127
  * each. */
60974
61128
  var ConsumableRemainingUnitSchema = zod.z.enum([
@@ -60983,18 +61137,23 @@ var ConsumableRemainingSchema = zod.z.object({
60983
61137
  unit: ConsumableRemainingUnitSchema
60984
61138
  });
60985
61139
  /** A single consumable item. Either a continuous `level` (remaining
60986
- * life %) or a discrete `status` may be known — both may be null when a
60987
- * provider only knows the item exists. `level` and `status` are not
60988
- * mutually exclusive; a provider may report both. */
61140
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
61141
+ * may be known — both may be null when a provider only knows the item
61142
+ * exists. `level` and `status` are not mutually exclusive; a provider may
61143
+ * report both. */
60989
61144
  var ConsumableItemSchema = zod.z.object({
60990
61145
  /** Stable id, e.g. 'main-brush'. */
60991
61146
  key: zod.z.string().min(1),
60992
61147
  /** Display name. */
60993
61148
  label: zod.z.string().min(1),
60994
- /** Remaining life % when known (0..100). */
61149
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
60995
61150
  level: zod.z.number().min(0).max(100).nullable(),
60996
- /** Discrete state when known (binary mode). */
60997
- status: zod.z.enum(["ok", "replace"]).nullable(),
61151
+ /** The provider's discrete verdict when known (binary mode). */
61152
+ status: ConsumableStatusSchema.nullable(),
61153
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
61154
+ kind: ConsumableKindSchema.optional(),
61155
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
61156
+ form: ConsumableFormSchema.optional(),
60998
61157
  /** Ms epoch of the last replace, when known. */
60999
61158
  lastResetAt: zod.z.number().nullable(),
61000
61159
  /** Whether `reset()` is meaningful for this item. */
@@ -61017,7 +61176,7 @@ var consumablesCapability = {
61017
61176
  kind: "widget",
61018
61177
  widgetId: "host/consumables-panel",
61019
61178
  tab: "consumables",
61020
- topTab: true,
61179
+ placement: "hero",
61021
61180
  label: "Consumables",
61022
61181
  order: 5
61023
61182
  } },
@@ -61078,9 +61237,37 @@ reset: method(zod.z.object({
61078
61237
  */
61079
61238
  durability: "restored",
61080
61239
  /**
61081
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
61240
+ * History (D850, D917): one series per (item field, item `key`) — the item key
61241
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
61242
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
61243
+ * their provider reports them; an item that appears later gets its series.
61082
61244
  */
61083
- history: "none",
61245
+ history: {
61246
+ fields: {},
61247
+ items: {
61248
+ path: "items",
61249
+ key: "key",
61250
+ label: "label",
61251
+ fields: {
61252
+ level: {
61253
+ kind: "gauge",
61254
+ unit: "%",
61255
+ deadband: 2,
61256
+ displayName: "Level"
61257
+ },
61258
+ status: {
61259
+ kind: "enum",
61260
+ displayName: "Status"
61261
+ },
61262
+ "remaining.value": {
61263
+ kind: "gauge",
61264
+ unitFrom: "remaining.unit",
61265
+ deadband: 1,
61266
+ displayName: "Remaining"
61267
+ }
61268
+ }
61269
+ }
61270
+ },
61084
61271
  /** Clocks, not content: a re-read that changed no item costs no commit. */
61085
61272
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
61086
61273
  };
@@ -61541,8 +61728,9 @@ onStatusChanged: { data: zod.z.object({
61541
61728
  volatileStateFields: ["lastChangedAt"]
61542
61729
  };
61543
61730
  /**
61544
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
61545
- * consumable levels (salt, rinse aid) and common program options.
61731
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
61732
+ * common program options. Salt and rinse aid are NOT here: they are items of
61733
+ * the device's `consumables` cap, like every other device's (D915).
61546
61734
  *
61547
61735
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
61548
61736
  * by any integration that exposes the same program / option surface.
@@ -61590,11 +61778,6 @@ var DishwasherAvailabilitySchema = zod.z.enum([
61590
61778
  "offline",
61591
61779
  "description-missing"
61592
61780
  ]);
61593
- var DishwasherConsumableLevelSchema = zod.z.enum([
61594
- "ok",
61595
- "low",
61596
- "empty"
61597
- ]);
61598
61781
  var DishwasherStatusSchema = zod.z.object({
61599
61782
  availability: DishwasherAvailabilitySchema,
61600
61783
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -61627,8 +61810,6 @@ var DishwasherStatusSchema = zod.z.object({
61627
61810
  powerOn: zod.z.boolean().nullable(),
61628
61811
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
61629
61812
  powerState: zod.z.string().nullable(),
61630
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
61631
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
61632
61813
  /**
61633
61814
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
61634
61815
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -64838,7 +65019,7 @@ var motionTriggerCapability = {
64838
65019
  enabled: zod.z.boolean()
64839
65020
  }), zod.z.void(), {
64840
65021
  kind: "mutation",
64841
- auth: "admin"
65022
+ auth: "protected"
64842
65023
  }) },
64843
65024
  events: { onMotionTriggerChanged: { data: zod.z.object({
64844
65025
  deviceId: zod.z.number(),
@@ -65581,6 +65762,13 @@ var TopologyNodeSchema = zod.z.object({
65581
65762
  cpuModel: zod.z.string().nullable(),
65582
65763
  cpuCores: zod.z.number(),
65583
65764
  memoryMB: zod.z.number(),
65765
+ /**
65766
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
65767
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
65768
+ * about whether its hardware is there (a Coral delegate stays installed
65769
+ * after the stick leaves, D919); the live device set is
65770
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
65771
+ */
65584
65772
  engines: zod.z.array(zod.z.string()).readonly(),
65585
65773
  isHub: zod.z.boolean(),
65586
65774
  isOnline: zod.z.boolean(),
@@ -66896,6 +67084,24 @@ var ResolvedInferenceConfigSchema = zod.z.object({
66896
67084
  format: ModelFormatSchema,
66897
67085
  reason: zod.z.string()
66898
67086
  });
67087
+ /**
67088
+ * The answer of an accelerator rescan (D919): the node's device list after
67089
+ * the re-probe, what changed, and the evidence that decided the Coral answer
67090
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
67091
+ * bus, the installed-delegate fallback, or nothing).
67092
+ */
67093
+ var AcceleratorRescanSchema = zod.z.object({
67094
+ devices: zod.z.array(InferenceDeviceDescriptorSchema).readonly(),
67095
+ appeared: zod.z.array(zod.z.string()).readonly(),
67096
+ disappeared: zod.z.array(zod.z.string()).readonly(),
67097
+ usbBus: zod.z.enum(["observed", "unobservable"]),
67098
+ decidedBy: zod.z.enum([
67099
+ "usb-ids",
67100
+ "pci",
67101
+ "delegate-fallback",
67102
+ "none"
67103
+ ])
67104
+ });
66899
67105
  var platformProbeCapability = {
66900
67106
  name: "platform-probe",
66901
67107
  scope: "system",
@@ -66904,7 +67110,18 @@ var platformProbeCapability = {
66904
67110
  getCapabilities: method(zod.z.void(), PlatformCapabilitiesSchema),
66905
67111
  getHardware: method(zod.z.void(), HardwareInfoSchema),
66906
67112
  resolveInferenceConfig: method(zod.z.object({ requirements: zod.z.array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema),
66907
- resolveHwAccel: method(zod.z.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema)
67113
+ resolveHwAccel: method(zod.z.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema),
67114
+ /**
67115
+ * Re-probe this node's accelerators NOW (Coral USB ids + PCIe apex units;
67116
+ * `/sys` and `/dev` reads, no model load) and rebuild the device list that
67117
+ * `getCapabilities` serves. The same re-probe runs every 60 s on its own;
67118
+ * this is the operator's "rescan inference devices". Target a node with the
67119
+ * `{ nodeId }` routing input, like `getCapabilities`.
67120
+ */
67121
+ rescanAccelerators: method(zod.z.void(), AcceleratorRescanSchema, {
67122
+ kind: "mutation",
67123
+ auth: "admin"
67124
+ })
66908
67125
  }
66909
67126
  };
66910
67127
  /**
@@ -71987,14 +72204,9 @@ var userManagementCapability = {
71987
72204
  * validates it against the vacuum's own list. `locate` triggers the
71988
72205
  * find-me chirp; `returnToBase` sends it home.
71989
72206
  *
71990
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
71991
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
71992
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
71993
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
71994
- * only when the device has no such tank at all, and use a `TankStatus`
71995
- * with both inner fields `null` when the tank exists but its level is
71996
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
71997
- * so the HA provider leaves all four `null`.
72207
+ * Tanks (clean water, dirty water, detergent, dust bin) are NOT here: they
72208
+ * are `supply` / `waste` items of the device's `consumables` cap, like every
72209
+ * other device's consumables (D915).
71998
72210
  */
71999
72211
  var VacuumStateSchema = zod.z.enum([
72000
72212
  "idle",
@@ -72005,23 +72217,6 @@ var VacuumStateSchema = zod.z.enum([
72005
72217
  "drying",
72006
72218
  "error"
72007
72219
  ]);
72008
- /**
72009
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
72010
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
72011
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
72012
- * level is currently unknown; the OWNING field being `null` means the
72013
- * hardware has no such tank at all.
72014
- */
72015
- var TankStatusSchema = zod.z.object({
72016
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
72017
- level: zod.z.number().min(0).max(100).nullable(),
72018
- /** Discrete state when the hardware is binary-mode; null otherwise. */
72019
- status: zod.z.enum([
72020
- "ok",
72021
- "low",
72022
- "full"
72023
- ]).nullable()
72024
- });
72025
72220
  var VacuumControlStatusSchema = zod.z.object({
72026
72221
  /** Lifecycle state of the vacuum. */
72027
72222
  state: VacuumStateSchema,
@@ -72033,14 +72228,6 @@ var VacuumControlStatusSchema = zod.z.object({
72033
72228
  fanSpeed: zod.z.string().nullable(),
72034
72229
  /** Speed tokens the hardware accepts — drives the UI selector. */
72035
72230
  availableFanSpeeds: zod.z.array(zod.z.string()),
72036
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
72037
- cleanWater: TankStatusSchema.nullable(),
72038
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
72039
- dirtyWater: TankStatusSchema.nullable(),
72040
- /** Detergent tank. Null when the hardware has no detergent tank. */
72041
- detergent: TankStatusSchema.nullable(),
72042
- /** Dust bin. Null when the hardware has no dust bin. */
72043
- dustBin: TankStatusSchema.nullable(),
72044
72231
  /** 0..100 cleaning-completion percentage of the current task, or null. */
72045
72232
  progressPercent: zod.z.number().min(0).max(100).nullable(),
72046
72233
  /** Current error code (0 / null = no error). */
@@ -72102,35 +72289,14 @@ var vacuumControlCapability = {
72102
72289
  */
72103
72290
  durability: "session",
72104
72291
  /**
72105
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
72292
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
72293
+ * items are keyed by runtime ids and record no history.
72106
72294
  */
72107
- history: { fields: {
72108
- batteryLevel: {
72109
- kind: "gauge",
72110
- unit: "%",
72111
- deadband: 2
72112
- },
72113
- "cleanWater.level": {
72114
- kind: "gauge",
72115
- unit: "%",
72116
- deadband: 2
72117
- },
72118
- "dirtyWater.level": {
72119
- kind: "gauge",
72120
- unit: "%",
72121
- deadband: 2
72122
- },
72123
- "detergent.level": {
72124
- kind: "gauge",
72125
- unit: "%",
72126
- deadband: 2
72127
- },
72128
- "dustBin.level": {
72129
- kind: "gauge",
72130
- unit: "%",
72131
- deadband: 2
72132
- }
72133
- } }
72295
+ history: { fields: { batteryLevel: {
72296
+ kind: "gauge",
72297
+ unit: "%",
72298
+ deadband: 2
72299
+ } } }
72134
72300
  };
72135
72301
  /**
72136
72302
  * Pipe / water / gas valve cap. Models HA `valve.*` entities — anything
@@ -76899,6 +77065,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
76899
77065
  addonId: null,
76900
77066
  access: "create"
76901
77067
  },
77068
+ "deviceHistory.deleteOrphanSeries": {
77069
+ capName: "device-history",
77070
+ capScope: "system",
77071
+ addonId: null,
77072
+ access: "delete"
77073
+ },
76902
77074
  "deviceHistory.getDeviceEnabled": {
76903
77075
  capName: "device-history",
76904
77076
  capScope: "system",
@@ -76917,6 +77089,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
76917
77089
  addonId: null,
76918
77090
  access: "view"
76919
77091
  },
77092
+ "deviceHistory.listOrphanSeries": {
77093
+ capName: "device-history",
77094
+ capScope: "system",
77095
+ addonId: null,
77096
+ access: "view"
77097
+ },
76920
77098
  "deviceHistory.listSeries": {
76921
77099
  capName: "device-history",
76922
77100
  capScope: "system",
@@ -80541,6 +80719,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
80541
80719
  addonId: null,
80542
80720
  access: "delete"
80543
80721
  },
80722
+ "pipelineOrchestrator.forgetInferenceDevice": {
80723
+ capName: "pipeline-orchestrator",
80724
+ capScope: "system",
80725
+ addonId: null,
80726
+ access: "delete"
80727
+ },
80544
80728
  "pipelineOrchestrator.getAgentLoad": {
80545
80729
  capName: "pipeline-orchestrator",
80546
80730
  capScope: "system",
@@ -81117,6 +81301,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
81117
81301
  addonId: null,
81118
81302
  access: "view"
81119
81303
  },
81304
+ "platformProbe.rescanAccelerators": {
81305
+ capName: "platform-probe",
81306
+ capScope: "system",
81307
+ addonId: null,
81308
+ access: "create"
81309
+ },
81120
81310
  "platformProbe.resolveHwAccel": {
81121
81311
  capName: "platform-probe",
81122
81312
  capScope: "system",
@@ -86942,7 +87132,7 @@ var SESSION_ONLY_POLICY = {
86942
87132
  };
86943
87133
  /**
86944
87134
  * Cap history catalog, projected from every `*.cap.ts` `history` block.
86945
- * 40 caps with series (77 series), 31 caps answered `'none'`.
87135
+ * 40 caps with series (73 series), 30 caps answered `'none'`.
86946
87136
  * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
86947
87137
  */
86948
87138
  var HISTORY_CATALOG = {
@@ -87245,33 +87435,11 @@ var HISTORY_CATALOG = {
87245
87435
  unit: "°C",
87246
87436
  deadband: .1
87247
87437
  } },
87248
- "vacuum-control": {
87249
- "batteryLevel": {
87250
- kind: "gauge",
87251
- unit: "%",
87252
- deadband: 2
87253
- },
87254
- "cleanWater.level": {
87255
- kind: "gauge",
87256
- unit: "%",
87257
- deadband: 2
87258
- },
87259
- "dirtyWater.level": {
87260
- kind: "gauge",
87261
- unit: "%",
87262
- deadband: 2
87263
- },
87264
- "detergent.level": {
87265
- kind: "gauge",
87266
- unit: "%",
87267
- deadband: 2
87268
- },
87269
- "dustBin.level": {
87270
- kind: "gauge",
87271
- unit: "%",
87272
- deadband: 2
87273
- }
87274
- },
87438
+ "vacuum-control": { "batteryLevel": {
87439
+ kind: "gauge",
87440
+ unit: "%",
87441
+ deadband: 2
87442
+ } },
87275
87443
  "valve": { "position": {
87276
87444
  kind: "gauge",
87277
87445
  unit: "%",
@@ -87313,6 +87481,41 @@ var HISTORY_CATALOG = {
87313
87481
  }
87314
87482
  }
87315
87483
  };
87484
+ /**
87485
+ * Keyed-array series (D917), projected from every `history.items` block:
87486
+ * 1 caps (3 item fields). The item key is the series SCOPE;
87487
+ * the series key is `cap:<capName>.<path>[].<field>`.
87488
+ */
87489
+ var HISTORY_ITEM_CATALOG = { "consumables": {
87490
+ path: "items",
87491
+ key: "key",
87492
+ label: "label",
87493
+ fields: {
87494
+ "level": {
87495
+ kind: "gauge",
87496
+ unit: "%",
87497
+ deadband: 2,
87498
+ displayName: "Level"
87499
+ },
87500
+ "status": {
87501
+ kind: "enum",
87502
+ displayName: "Status",
87503
+ values: [
87504
+ "ok",
87505
+ "low",
87506
+ "empty",
87507
+ "full",
87508
+ "replace"
87509
+ ]
87510
+ },
87511
+ "remaining.value": {
87512
+ kind: "gauge",
87513
+ unitFrom: "remaining.unit",
87514
+ deadband: 1,
87515
+ displayName: "Remaining"
87516
+ }
87517
+ }
87518
+ } };
87316
87519
  var G711_SCALE_CORRECTION_DB = {
87317
87520
  PCMU: 20 * Math.log10(4),
87318
87521
  PCMA: 20 * Math.log10(8)
@@ -87915,7 +88118,7 @@ var STATE_SUMMARY_VARS = [
87915
88118
  ([...RULE_TEXT], [...COMBINED_ALARM]),
87916
88119
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
87917
88120
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
87918
- ([...RULE_TEXT], [...CONSUMABLE]),
88121
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
87919
88122
  ([...RULE_TEXT], [...TANK]),
87920
88123
  [...RULE_TEXT],
87921
88124
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
@@ -89331,6 +89534,12 @@ Object.defineProperty(exports, "HISTORY_DEFAULT_MIN_INTERVAL_MS", {
89331
89534
  return HISTORY_DEFAULT_MIN_INTERVAL_MS;
89332
89535
  }
89333
89536
  });
89537
+ Object.defineProperty(exports, "HISTORY_ITEM_CATALOG", {
89538
+ enumerable: true,
89539
+ get: function() {
89540
+ return HISTORY_ITEM_CATALOG;
89541
+ }
89542
+ });
89334
89543
  Object.defineProperty(exports, "HUB_MDNS_SERVICE_TYPE", {
89335
89544
  enumerable: true,
89336
89545
  get: function() {
@@ -90153,6 +90362,12 @@ Object.defineProperty(exports, "gbToBytes", {
90153
90362
  return gbToBytes;
90154
90363
  }
90155
90364
  });
90365
+ Object.defineProperty(exports, "historyItemFieldPath", {
90366
+ enumerable: true,
90367
+ get: function() {
90368
+ return historyItemFieldPath;
90369
+ }
90370
+ });
90156
90371
  Object.defineProperty(exports, "hydrateSchema", {
90157
90372
  enumerable: true,
90158
90373
  get: function() {