@camstack/addon-pipeline 1.2.618 → 1.2.620

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 (38) hide show
  1. package/dist/audio-analyzer/index.js +3 -3
  2. package/dist/audio-analyzer/index.mjs +3 -3
  3. package/dist/{custom-model-catalog-BT8HKaes.mjs → custom-model-catalog-BW0-xhwJ.mjs} +2 -2
  4. package/dist/{custom-model-catalog-Yu1sxc4A.js → custom-model-catalog-YxQheit5.js} +2 -2
  5. package/dist/detection-pipeline/index.js +153 -6
  6. package/dist/detection-pipeline/index.mjs +153 -6
  7. package/dist/{dist-CGDR6bSg.js → dist-CoLjAw2z.js} +213 -86
  8. package/dist/{dist-OImyOnr3.mjs → dist-mOyFhoa8.mjs} +213 -86
  9. package/dist/{model-catalogs-DV562sqJ.js → model-catalogs-BstZN0ZA.js} +1 -1
  10. package/dist/{model-catalogs-Cj101H8x.mjs → model-catalogs-PmNZKpMR.mjs} +1 -1
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-CSFdbFlw.js → node-CzmiyMnw.js} +1 -1
  14. package/dist/{node-DciF_ZRl.mjs → node-Qmp6FkS2.mjs} +1 -1
  15. package/dist/pipeline-runner/index.js +52 -20
  16. package/dist/pipeline-runner/index.mjs +52 -20
  17. package/dist/{process-memory-CJEkTpRM.js → process-memory-C5Cw8Cxz.js} +1 -1
  18. package/dist/{process-memory-DjIov9TF.mjs → process-memory-DXbuHvOX.mjs} +1 -1
  19. package/dist/recorder/index.js +2 -72
  20. package/dist/recorder/index.mjs +2 -72
  21. package/dist/{segment-demux-js-BsqG99U7.js → segment-demux-js-DGFHiiIf.js} +1 -1
  22. package/dist/{segment-demux-js-B5PU-E-G.mjs → segment-demux-js-Din-INnw.mjs} +1 -1
  23. package/dist/stream-broker/_stub.js +2 -2
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BZysHyCo.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets--TcGAfJ-.mjs} +3 -3
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BaoBRCJs.mjs +26 -0
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Dx-WrMx0.mjs +26 -0
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-NqO2jvV2.mjs → hostInit-DOiI--7i.mjs} +3 -3
  30. package/dist/stream-broker/index.js +3 -3
  31. package/dist/stream-broker/index.mjs +3 -3
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -1
  34. package/python/inference_pool.py +2 -0
  35. package/python/pool_platform.py +35 -0
  36. package/python/test_pool_platform.py +48 -0
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C1yyuAzs.mjs +0 -26
  38. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-TnEvW5tZ.mjs +0 -26
@@ -5564,7 +5564,7 @@ var ZodIssueCode = {
5564
5564
  var ZodFirstPartyTypeKind;
5565
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5566
5566
  //#endregion
5567
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5567
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5568
5568
  /**
5569
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5570
5570
  * window to float samples (D455).
@@ -8773,7 +8773,11 @@ var ContributionSectionSchema = object({
8773
8773
  literal(4)
8774
8774
  ]).optional(),
8775
8775
  tab: string().optional(),
8776
- location: _enum(["settings", "top-tab"]).optional(),
8776
+ location: _enum([
8777
+ "settings",
8778
+ "top-tab",
8779
+ "hero"
8780
+ ]).optional(),
8777
8781
  order: number().optional(),
8778
8782
  fields: array(any())
8779
8783
  });
@@ -16072,7 +16076,11 @@ var ConfigSectionWithValuesSchema = object({
16072
16076
  literal(4)
16073
16077
  ]).optional(),
16074
16078
  tab: string().optional(),
16075
- location: _enum(["settings", "top-tab"]).optional(),
16079
+ location: _enum([
16080
+ "settings",
16081
+ "top-tab",
16082
+ "hero"
16083
+ ]).optional(),
16076
16084
  order: number().optional(),
16077
16085
  fields: array(any())
16078
16086
  });
@@ -20318,6 +20326,52 @@ var TierStatusSchema = object({
20318
20326
  countedAt: number().nullable()
20319
20327
  });
20320
20328
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
20329
+ /**
20330
+ * Why a series is orphan. `device-gone`: its device is absent from the
20331
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
20332
+ * key is declared by no capability any more (a field a cap removed).
20333
+ */
20334
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
20335
+ /** Rows held per stored tier. */
20336
+ var TierRowsSchema = object({
20337
+ raw: number().int(),
20338
+ "5m": number().int(),
20339
+ "1h": number().int(),
20340
+ "1d": number().int()
20341
+ });
20342
+ var OrphanSeriesSchema = object({
20343
+ seriesId: number().int(),
20344
+ deviceId: number().int(),
20345
+ key: string(),
20346
+ scope: string(),
20347
+ /** The metric's display name; `null` when its metric row is gone too. */
20348
+ displayName: string().nullable(),
20349
+ reason: DeviceHistoryOrphanReasonSchema,
20350
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
20351
+ missingSince: number().nullable(),
20352
+ firstTs: number(),
20353
+ lastTs: number(),
20354
+ rows: TierRowsSchema
20355
+ });
20356
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
20357
+ "not-found",
20358
+ "not-orphan",
20359
+ "failed"
20360
+ ]);
20361
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
20362
+ seriesId: number().int(),
20363
+ ok: literal(true),
20364
+ deleted: TierRowsSchema
20365
+ }), object({
20366
+ seriesId: number().int(),
20367
+ ok: literal(false),
20368
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
20369
+ })]);
20370
+ var OrphanListSchema = object({
20371
+ series: array(OrphanSeriesSchema).readonly(),
20372
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
20373
+ truncated: boolean()
20374
+ });
20321
20375
  var DeviceHistoryStatusSchema = object({
20322
20376
  startedAt: number(),
20323
20377
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -20415,7 +20469,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
20415
20469
  }), object({ enabled: boolean() }), {
20416
20470
  kind: "mutation",
20417
20471
  auth: "admin"
20418
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
20472
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
20473
+ kind: "mutation",
20474
+ auth: "admin"
20475
+ });
20419
20476
  var DeviceCaStatusSchema = discriminatedUnion("state", [
20420
20477
  object({ state: literal("absent") }),
20421
20478
  object({
@@ -53989,6 +54046,19 @@ var NodeInferenceDeviceSchema = object({
53989
54046
  /** Whether the node's live probe reports the device as usable right now. */
53990
54047
  available: boolean(),
53991
54048
  /**
54049
+ * Is the device on the node at all (D919)? `present` — the live probe
54050
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
54051
+ * its stored settings remain (unplugged, moved to another node): never
54052
+ * eligible, whatever its stored `enabled`, and forgettable with
54053
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
54054
+ * claimed (D315). Optional only for an orchestrator older than the field.
54055
+ */
54056
+ presence: _enum([
54057
+ "present",
54058
+ "absent",
54059
+ "unknown"
54060
+ ]).optional(),
54061
+ /**
53992
54062
  * Whether this device participates in dispatch. AUTO default (spec C2):
53993
54063
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
53994
54064
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -54214,7 +54284,13 @@ method(object({
54214
54284
  }), object({ success: literal(true) }), {
54215
54285
  kind: "mutation",
54216
54286
  auth: "admin"
54217
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
54287
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
54288
+ agentNodeId: string(),
54289
+ deviceKey: string()
54290
+ }), object({ success: literal(true) }), {
54291
+ kind: "mutation",
54292
+ auth: "admin"
54293
+ }), method(object({ agentNodeId: string() }), object({
54218
54294
  success: literal(true),
54219
54295
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
54220
54296
  effectiveModelId: string().nullable(),
@@ -58828,17 +58904,69 @@ object({
58828
58904
  });
58829
58905
  DeviceType.Sensor;
58830
58906
  /**
58831
- * Generic device-consumables capability — surfaces a device's
58832
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
58833
- * descaling cycles, …) with their remaining life and an optional
58834
- * "Replaced" reset action. Device-agnostic: any provider that knows its
58835
- * device tracks consumables can register it; the cap declares no
58836
- * vocabulary of its own — the provider names each item verbatim.
58907
+ * Generic device-consumables capability — the ONE place a device reports what
58908
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
58909
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
58910
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
58911
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
58912
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
58913
+ * its device tracks consumables registers it; the provider names each item
58914
+ * verbatim and says which `kind` it is.
58915
+ *
58916
+ * The admin UI renders it as ONE collapsible section directly under the
58917
+ * device page's hero card (`placement: 'hero'`), for every device bound to
58918
+ * this cap — never drawn by a device type's hero card itself (D915).
58837
58919
  *
58838
58920
  * Like `childLayout`, the cap is INERT until a provider sets items: no
58839
58921
  * provider populates it by guessing (no HA inference). The UI renders a
58840
58922
  * "No consumables reported" placeholder when `items` is empty.
58841
58923
  */
58924
+ /**
58925
+ * What an item IS, which decides which direction is bad:
58926
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
58927
+ * - `supply` — something the device draws from (clean water, detergent,
58928
+ * salt, rinse aid); low or empty is bad.
58929
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
58930
+ * bad.
58931
+ * Absent = `wear`.
58932
+ */
58933
+ var ConsumableKindSchema = _enum([
58934
+ "wear",
58935
+ "supply",
58936
+ "waste"
58937
+ ]);
58938
+ /**
58939
+ * What an item LOOKS like, which decides how a client draws it — independent
58940
+ * of `kind`, which decides which direction is bad:
58941
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
58942
+ * remaining time and a reset.
58943
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
58944
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
58945
+ * a stepped level and "refill".
58946
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
58947
+ * that warns when full.
58948
+ * Absent = derived from the kind ({@link consumableFormOf}).
58949
+ */
58950
+ var ConsumableFormSchema = _enum([
58951
+ "part",
58952
+ "tank",
58953
+ "product",
58954
+ "bin"
58955
+ ]);
58956
+ /** The provider's own discrete verdict on an item. */
58957
+ var ConsumableStatusSchema = _enum([
58958
+ "ok",
58959
+ "low",
58960
+ "empty",
58961
+ "full",
58962
+ "replace"
58963
+ ]);
58964
+ _enum([
58965
+ "ok",
58966
+ "low",
58967
+ "empty",
58968
+ "full"
58969
+ ]);
58842
58970
  /** Units a remaining-life counter is reported in. Closed: the panel renders
58843
58971
  * each. */
58844
58972
  var ConsumableRemainingUnitSchema = _enum([
@@ -58858,10 +58986,14 @@ var ConsumablesStatusSchema = object({
58858
58986
  key: string().min(1),
58859
58987
  /** Display name. */
58860
58988
  label: string().min(1),
58861
- /** Remaining life % when known (0..100). */
58989
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
58862
58990
  level: number().min(0).max(100).nullable(),
58863
- /** Discrete state when known (binary mode). */
58864
- status: _enum(["ok", "replace"]).nullable(),
58991
+ /** The provider's discrete verdict when known (binary mode). */
58992
+ status: ConsumableStatusSchema.nullable(),
58993
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
58994
+ kind: ConsumableKindSchema.optional(),
58995
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
58996
+ form: ConsumableFormSchema.optional(),
58865
58997
  /** Ms epoch of the last replace, when known. */
58866
58998
  lastResetAt: number().nullable(),
58867
58999
  /** Whether `reset()` is meaningful for this item. */
@@ -59096,8 +59228,9 @@ object({
59096
59228
  status: DeviceStatusSchema
59097
59229
  });
59098
59230
  /**
59099
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
59100
- * consumable levels (salt, rinse aid) and common program options.
59231
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
59232
+ * common program options. Salt and rinse aid are NOT here: they are items of
59233
+ * the device's `consumables` cap, like every other device's (D915).
59101
59234
  *
59102
59235
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
59103
59236
  * by any integration that exposes the same program / option surface.
@@ -59145,11 +59278,6 @@ var DishwasherAvailabilitySchema = _enum([
59145
59278
  "offline",
59146
59279
  "description-missing"
59147
59280
  ]);
59148
- var DishwasherConsumableLevelSchema = _enum([
59149
- "ok",
59150
- "low",
59151
- "empty"
59152
- ]);
59153
59281
  object({
59154
59282
  availability: DishwasherAvailabilitySchema,
59155
59283
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -59182,8 +59310,6 @@ object({
59182
59310
  powerOn: boolean().nullable(),
59183
59311
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
59184
59312
  powerState: string().nullable(),
59185
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
59186
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
59187
59313
  /**
59188
59314
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
59189
59315
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -61223,7 +61349,7 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
61223
61349
  enabled: boolean()
61224
61350
  }), _void(), {
61225
61351
  kind: "mutation",
61226
- auth: "admin"
61352
+ auth: "protected"
61227
61353
  }), object({
61228
61354
  deviceId: number(),
61229
61355
  enabled: boolean(),
@@ -61713,6 +61839,13 @@ var TopologyNodeSchema = object({
61713
61839
  cpuModel: string().nullable(),
61714
61840
  cpuCores: number(),
61715
61841
  memoryMB: number(),
61842
+ /**
61843
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
61844
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
61845
+ * about whether its hardware is there (a Coral delegate stays installed
61846
+ * after the stick leaves, D919); the live device set is
61847
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
61848
+ */
61716
61849
  engines: array(string()).readonly(),
61717
61850
  isHub: boolean(),
61718
61851
  isOnline: boolean(),
@@ -62677,7 +62810,28 @@ var ResolvedInferenceConfigSchema = object({
62677
62810
  format: ModelFormatSchema,
62678
62811
  reason: string()
62679
62812
  });
62680
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
62813
+ /**
62814
+ * The answer of an accelerator rescan (D919): the node's device list after
62815
+ * the re-probe, what changed, and the evidence that decided the Coral answer
62816
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
62817
+ * bus, the installed-delegate fallback, or nothing).
62818
+ */
62819
+ var AcceleratorRescanSchema = object({
62820
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
62821
+ appeared: array(string()).readonly(),
62822
+ disappeared: array(string()).readonly(),
62823
+ usbBus: _enum(["observed", "unobservable"]),
62824
+ decidedBy: _enum([
62825
+ "usb-ids",
62826
+ "pci",
62827
+ "delegate-fallback",
62828
+ "none"
62829
+ ])
62830
+ });
62831
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
62832
+ kind: "mutation",
62833
+ auth: "admin"
62834
+ });
62681
62835
  object({
62682
62836
  /** Instantaneous power draw in watts. */
62683
62837
  watts: number().optional(),
@@ -66490,60 +66644,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66490
66644
  auth: "admin",
66491
66645
  access: "delete"
66492
66646
  });
66493
- /**
66494
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
66495
- * cleaning lifecycle plus a return-to-base / locate surface and an
66496
- * optional fan-speed selector.
66497
- *
66498
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
66499
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
66500
- * (0..100) is nullable — some vacuums don't report a battery
66501
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
66502
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
66503
- * tokens the hardware accepts so the UI renders only supported choices.
66504
- *
66505
- * The `setFanSpeed` method takes the bare `speed` token — the provider
66506
- * validates it against the vacuum's own list. `locate` triggers the
66507
- * find-me chirp; `returnToBase` sends it home.
66508
- *
66509
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
66510
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
66511
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
66512
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
66513
- * only when the device has no such tank at all, and use a `TankStatus`
66514
- * with both inner fields `null` when the tank exists but its level is
66515
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
66516
- * so the HA provider leaves all four `null`.
66517
- */
66518
- var VacuumStateSchema = _enum([
66519
- "idle",
66520
- "cleaning",
66521
- "paused",
66522
- "returning",
66523
- "docked",
66524
- "drying",
66525
- "error"
66526
- ]);
66527
- /**
66528
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
66529
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
66530
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
66531
- * level is currently unknown; the OWNING field being `null` means the
66532
- * hardware has no such tank at all.
66533
- */
66534
- var TankStatusSchema = object({
66535
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
66536
- level: number().min(0).max(100).nullable(),
66537
- /** Discrete state when the hardware is binary-mode; null otherwise. */
66538
- status: _enum([
66539
- "ok",
66540
- "low",
66541
- "full"
66542
- ]).nullable()
66543
- });
66544
66647
  object({
66545
66648
  /** Lifecycle state of the vacuum. */
66546
- state: VacuumStateSchema,
66649
+ state: _enum([
66650
+ "idle",
66651
+ "cleaning",
66652
+ "paused",
66653
+ "returning",
66654
+ "docked",
66655
+ "drying",
66656
+ "error"
66657
+ ]),
66547
66658
  /** 0..100 battery percentage. Null when the device has no battery
66548
66659
  * reading. */
66549
66660
  batteryLevel: number().min(0).max(100).nullable(),
@@ -66552,14 +66663,6 @@ object({
66552
66663
  fanSpeed: string().nullable(),
66553
66664
  /** Speed tokens the hardware accepts — drives the UI selector. */
66554
66665
  availableFanSpeeds: array(string()),
66555
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
66556
- cleanWater: TankStatusSchema.nullable(),
66557
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
66558
- dirtyWater: TankStatusSchema.nullable(),
66559
- /** Detergent tank. Null when the hardware has no detergent tank. */
66560
- detergent: TankStatusSchema.nullable(),
66561
- /** Dust bin. Null when the hardware has no dust bin. */
66562
- dustBin: TankStatusSchema.nullable(),
66563
66666
  /** 0..100 cleaning-completion percentage of the current task, or null. */
66564
66667
  progressPercent: number().min(0).max(100).nullable(),
66565
66668
  /** Current error code (0 / null = no error). */
@@ -69118,6 +69221,12 @@ Object.freeze({
69118
69221
  addonId: null,
69119
69222
  access: "create"
69120
69223
  },
69224
+ "deviceHistory.deleteOrphanSeries": {
69225
+ capName: "device-history",
69226
+ capScope: "system",
69227
+ addonId: null,
69228
+ access: "delete"
69229
+ },
69121
69230
  "deviceHistory.getDeviceEnabled": {
69122
69231
  capName: "device-history",
69123
69232
  capScope: "system",
@@ -69136,6 +69245,12 @@ Object.freeze({
69136
69245
  addonId: null,
69137
69246
  access: "view"
69138
69247
  },
69248
+ "deviceHistory.listOrphanSeries": {
69249
+ capName: "device-history",
69250
+ capScope: "system",
69251
+ addonId: null,
69252
+ access: "view"
69253
+ },
69139
69254
  "deviceHistory.listSeries": {
69140
69255
  capName: "device-history",
69141
69256
  capScope: "system",
@@ -72760,6 +72875,12 @@ Object.freeze({
72760
72875
  addonId: null,
72761
72876
  access: "delete"
72762
72877
  },
72878
+ "pipelineOrchestrator.forgetInferenceDevice": {
72879
+ capName: "pipeline-orchestrator",
72880
+ capScope: "system",
72881
+ addonId: null,
72882
+ access: "delete"
72883
+ },
72763
72884
  "pipelineOrchestrator.getAgentLoad": {
72764
72885
  capName: "pipeline-orchestrator",
72765
72886
  capScope: "system",
@@ -73336,6 +73457,12 @@ Object.freeze({
73336
73457
  addonId: null,
73337
73458
  access: "view"
73338
73459
  },
73460
+ "platformProbe.rescanAccelerators": {
73461
+ capName: "platform-probe",
73462
+ capScope: "system",
73463
+ addonId: null,
73464
+ access: "create"
73465
+ },
73339
73466
  "platformProbe.resolveHwAccel": {
73340
73467
  capName: "platform-probe",
73341
73468
  capScope: "system",
@@ -79191,7 +79318,7 @@ var STATE_SUMMARY_VARS = [
79191
79318
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79192
79319
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79193
79320
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79194
- ([...RULE_TEXT], [...CONSUMABLE]),
79321
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79195
79322
  ([...RULE_TEXT], [...TANK]),
79196
79323
  [...RULE_TEXT],
79197
79324
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CGDR6bSg.js");
1
+ const require_dist = require("./dist-CoLjAw2z.js");
2
2
  //#region src/detection-pipeline/registry/model-licenses.ts
3
3
  var COCO_DATA = {
4
4
  name: "COCO 2017",
@@ -1,4 +1,4 @@
1
- import { Gn as hfModelUrl, f as COCO_80_LABELS } from "./dist-OImyOnr3.mjs";
1
+ import { Gn as hfModelUrl, f as COCO_80_LABELS } from "./dist-mOyFhoa8.mjs";
2
2
  //#region src/detection-pipeline/registry/model-licenses.ts
3
3
  var COCO_DATA = {
4
4
  name: "COCO 2017",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CGDR6bSg.js");
5
+ const require_dist = require("../dist-CoLjAw2z.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ct as evaluateZoneRules, Gt as motionDetectionCapability, Kn as hydrateSchema, Pn as BaseAddon, jn as DeviceType } from "../dist-OImyOnr3.mjs";
1
+ import { Ct as evaluateZoneRules, Gt as motionDetectionCapability, Kn as hydrateSchema, Pn as BaseAddon, jn as DeviceType } from "../dist-mOyFhoa8.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-CGDR6bSg.js");
2
+ const require_dist = require("./dist-CoLjAw2z.js");
3
3
  require("node:os");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { En as buildFfmpegArgs, Mn as errMsg, Tn as Fmp4BoxSplitter, kn as isSoftwareDecode } from "./dist-OImyOnr3.mjs";
1
+ import { En as buildFfmpegArgs, Mn as errMsg, Tn as Fmp4BoxSplitter, kn as isSoftwareDecode } from "./dist-mOyFhoa8.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-CGDR6bSg.js");
7
- const require_node = require("../node-CSFdbFlw.js");
8
- const require_custom_model_catalog = require("../custom-model-catalog-Yu1sxc4A.js");
6
+ const require_dist = require("../dist-CoLjAw2z.js");
7
+ const require_node = require("../node-CzmiyMnw.js");
8
+ const require_custom_model_catalog = require("../custom-model-catalog-YxQheit5.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
10
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
11
11
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
@@ -6073,10 +6073,15 @@ var PipelineTimingSampler = class {
6073
6073
  belowFloor = new BelowFloorAccumulator();
6074
6074
  reportTimer = null;
6075
6075
  log = null;
6076
+ electedDeviceKey = null;
6076
6077
  runtimeInfo = {};
6077
6078
  setLogger(logger) {
6078
6079
  this.log = logger;
6079
6080
  }
6081
+ /** Who answers "which device serves this camera" for the per-camera line. */
6082
+ setElectedDeviceKeyResolver(resolver) {
6083
+ this.electedDeviceKey = resolver;
6084
+ }
6080
6085
  start() {
6081
6086
  if (this.reportTimer) return;
6082
6087
  this.reportTimer = setInterval(() => this.report(), REPORT_INTERVAL_MS);
@@ -6194,6 +6199,7 @@ var PipelineTimingSampler = class {
6194
6199
  detections: totalDet,
6195
6200
  belowFloor: this.belowFloor.drain(deviceId),
6196
6201
  dropped,
6202
+ deviceKey: this.electedDeviceKey?.(deviceId) ?? null,
6197
6203
  pipelineRuntime: rt.pipelineRuntime ?? null,
6198
6204
  pipelineModels: rt.pipelineModels ?? null
6199
6205
  }
@@ -8105,6 +8111,40 @@ function isUsable(bbox) {
8105
8111
  return bbox.width > 0 && bbox.height > 0;
8106
8112
  }
8107
8113
  //#endregion
8114
+ //#region src/pipeline-runner/local-resident-engines.ts
8115
+ var NO_LOCAL_EXECUTOR = "no pipeline-executor provider in this process";
8116
+ /**
8117
+ * The provider is the co-tenant's own object, in this process; the guard
8118
+ * checks the one method this read calls (the type boundary of an
8119
+ * untyped registry lookup).
8120
+ */
8121
+ function isLocalEngineLister(value) {
8122
+ return typeof value === "object" && value !== null && "listLoadedEngines" in value && typeof value.listLoadedEngines === "function";
8123
+ }
8124
+ async function readLocalResidentEngines(capabilities) {
8125
+ const provider = capabilities?.get("pipeline-executor");
8126
+ if (!isLocalEngineLister(provider)) return {
8127
+ kind: "failed",
8128
+ error: NO_LOCAL_EXECUTOR
8129
+ };
8130
+ try {
8131
+ return {
8132
+ kind: "read",
8133
+ engines: (await provider.listLoadedEngines()).map((r) => ({
8134
+ backend: r.engine.backend,
8135
+ ...r.engine.device !== void 0 ? { device: r.engine.device } : {},
8136
+ kind: r.kind,
8137
+ modelsLoaded: r.modelsLoaded
8138
+ }))
8139
+ };
8140
+ } catch (err) {
8141
+ return {
8142
+ kind: "failed",
8143
+ error: require_dist.errMsg(err)
8144
+ };
8145
+ }
8146
+ }
8147
+ //#endregion
8108
8148
  //#region src/pipeline-runner/runtime-labels.ts
8109
8149
  /**
8110
8150
  * `null` means the read FAILED; `[]` means nothing is resident. Both omit the
@@ -8295,8 +8335,8 @@ var TILE_CUT_DROP_LOG_INTERVAL_MS = 6e4;
8295
8335
  * operator re-selects one or lazy provisioning completes — not per frame.
8296
8336
  */
8297
8337
  var RUNTIME_INFO_REFRESH_MS = 3e5;
8298
- /** Sentinel for "no api" so it is one transition, not a per-refresh line. */
8299
- var NO_API_FAILURE = "no addon api";
8338
+ /** Sentinel for "no context yet" so it is one transition, not a per-refresh line. */
8339
+ var NO_CONTEXT_FAILURE = "no addon context";
8300
8340
  /** How often a camera reports parcels that left without a release (D422). */
8301
8341
  var PARKED_EVICTION_LOG_INTERVAL_MS = 6e4;
8302
8342
  /**
@@ -9082,6 +9122,7 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
9082
9122
  workerFootprintMb: decodeWorkerFootprintMb(this.nativeLease.current())
9083
9123
  });
9084
9124
  this.runner.timingSampler.setLogger(this.ctx.logger.child("timing"));
9125
+ this.runner.timingSampler.setElectedDeviceKeyResolver((deviceId) => this.attached.get(deviceId)?.config?.deviceKey ?? null);
9085
9126
  this.refreshRuntimeInfo();
9086
9127
  this.runtimeInfoTimer = setInterval(() => void this.refreshRuntimeInfo(), RUNTIME_INFO_REFRESH_MS);
9087
9128
  this.runtimeInfoTimer.unref?.();
@@ -10759,24 +10800,15 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
10759
10800
  * field in the line is the signal, and the hub writes `info`.
10760
10801
  */
10761
10802
  async refreshRuntimeInfo() {
10762
- const api = this.ctxIfReady?.api;
10803
+ const ctx = this.ctxIfReady;
10763
10804
  const sampler = this.runner?.timingSampler;
10764
- if (!api || sampler === void 0 || sampler === null) {
10765
- this.noteRuntimeInfoFailure(NO_API_FAILURE);
10805
+ if (!ctx || sampler === void 0 || sampler === null) {
10806
+ this.noteRuntimeInfoFailure(NO_CONTEXT_FAILURE);
10766
10807
  return;
10767
10808
  }
10768
- let engines = null;
10769
- let failure = null;
10770
- try {
10771
- engines = (await api.pipelineExecutor.listLoadedEngines.query()).map((r) => ({
10772
- backend: r.engine.backend,
10773
- ...r.engine.device !== void 0 ? { device: r.engine.device } : {},
10774
- kind: r.kind,
10775
- modelsLoaded: r.modelsLoaded
10776
- }));
10777
- } catch (err) {
10778
- failure = require_dist.errMsg(err);
10779
- }
10809
+ const read = await readLocalResidentEngines(ctx.capabilities);
10810
+ const engines = read.kind === "read" ? read.engines : null;
10811
+ const failure = read.kind === "failed" ? read.error : null;
10780
10812
  this.noteRuntimeInfoFailure(failure);
10781
10813
  sampler.runtimeInfo = {
10782
10814
  ...sampler.runtimeInfo,