@camstack/addon-pipeline 1.2.188 → 1.2.190

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 (126) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/detection-pipeline/index.js +5 -5
  4. package/dist/detection-pipeline/index.mjs +4 -4
  5. package/dist/{dist-CKr6Q6Qu.js → dist-C31OZkZP.js} +41 -1
  6. package/dist/{dist-CxYG8IUX.mjs → dist-CZkzc0WB.mjs} +41 -1
  7. package/dist/{lazy-sharp-D-HdRPo5.js → lazy-sharp-DhHuLuQf.js} +1 -1
  8. package/dist/{local-frame-registry-DP5yyEWE.mjs → local-frame-registry-B8_L3v0O.mjs} +1 -1
  9. package/dist/{local-frame-registry-B4Bd4tnU.js → local-frame-registry-CkIaPLcW.js} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-CmRTB9W4.js → node-CIpenwbm.js} +1 -1
  13. package/dist/{node-DhccO0of.mjs → node-kSXNMrbg.mjs} +1 -1
  14. package/dist/pipeline-runner/index.js +98 -38
  15. package/dist/pipeline-runner/index.mjs +97 -37
  16. package/dist/{process-memory-BW7XFoPY.js → process-memory-BQTHtzan.js} +1 -1
  17. package/dist/{process-memory-L6mHI28P.mjs → process-memory-CphvVq1H.mjs} +1 -1
  18. package/dist/recorder/index.js +2 -2
  19. package/dist/recorder/index.mjs +2 -2
  20. package/dist/{segment-demux-js-D2zZJQU4.mjs → segment-demux-js-AELUnBau.mjs} +1 -1
  21. package/dist/{segment-demux-js-BTSHcSwg.js → segment-demux-js-CYjZAotp.js} +1 -1
  22. package/dist/session-decode/decode-worker-child.js +2 -2
  23. package/dist/session-decode/decode-worker-child.mjs +1 -1
  24. package/dist/stream-broker/_stub.js +2 -2
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BttlkJ1n.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BA9MaopY.mjs} +3 -3
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CDtnQr69.mjs +26 -0
  27. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BOR2heMq.mjs +26 -0
  28. package/dist/stream-broker/demux-worker-child.js +1 -1
  29. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  30. package/dist/stream-broker/{hostInit-BlXTzO4s.mjs → hostInit-0htGr-yV.mjs} +3 -3
  31. package/dist/stream-broker/index.js +3 -3
  32. package/dist/stream-broker/index.mjs +3 -3
  33. package/dist/stream-broker/remoteEntry.js +1 -1
  34. package/dist/{worker-protocol-C8ZBUm08.js → worker-protocol-BSgTKhW7.js} +1 -1
  35. package/dist/{worker-protocol-Br-omhiX.mjs → worker-protocol-Bcy8Ti5P.mjs} +1 -1
  36. package/package.json +1 -1
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BFlcZNb6.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-ZzdpzejS.mjs +0 -26
  39. package/python/__pycache__/inference_pool.cpython-312.pyc +0 -0
  40. package/python/__pycache__/inference_pool.cpython-313.pyc +0 -0
  41. package/python/__pycache__/inference_pool.cpython-314.pyc +0 -0
  42. package/python/__pycache__/test_inference_pool_backpressure.cpython-312-pytest-9.1.1.pyc +0 -0
  43. package/python/__pycache__/test_inference_pool_backpressure.cpython-312.pyc +0 -0
  44. package/python/__pycache__/test_inference_pool_backpressure.cpython-314.pyc +0 -0
  45. package/python/__pycache__/test_inference_pool_coreml_cache.cpython-312-pytest-9.1.1.pyc +0 -0
  46. package/python/__pycache__/test_inference_pool_coreml_cache.cpython-312.pyc +0 -0
  47. package/python/__pycache__/test_inference_pool_coreml_cache.cpython-314.pyc +0 -0
  48. package/python/__pycache__/test_inference_pool_deadline.cpython-314.pyc +0 -0
  49. package/python/__pycache__/test_inference_pool_device_selection.cpython-312-pytest-9.1.1.pyc +0 -0
  50. package/python/__pycache__/test_inference_pool_device_selection.cpython-312.pyc +0 -0
  51. package/python/__pycache__/test_inference_pool_device_selection.cpython-314.pyc +0 -0
  52. package/python/__pycache__/test_inference_pool_layout.cpython-312-pytest-9.1.1.pyc +0 -0
  53. package/python/__pycache__/test_inference_pool_layout.cpython-314.pyc +0 -0
  54. package/python/__pycache__/test_inference_pool_memstats.cpython-312-pytest-9.1.1.pyc +0 -0
  55. package/python/__pycache__/test_inference_pool_memstats.cpython-312.pyc +0 -0
  56. package/python/__pycache__/test_inference_pool_memstats.cpython-314.pyc +0 -0
  57. package/python/__pycache__/test_inference_pool_ov_ppp.cpython-312-pytest-9.1.1.pyc +0 -0
  58. package/python/__pycache__/test_inference_pool_ov_ppp.cpython-312.pyc +0 -0
  59. package/python/__pycache__/test_inference_pool_ov_ppp.cpython-314.pyc +0 -0
  60. package/python/__pycache__/test_inference_pool_preprocess.cpython-312-pytest-9.1.1.pyc +0 -0
  61. package/python/__pycache__/test_inference_pool_preprocess.cpython-314.pyc +0 -0
  62. package/python/__pycache__/test_inference_pool_reconfigure.cpython-314.pyc +0 -0
  63. package/python/__pycache__/test_inference_pool_static_batch.cpython-312-pytest-9.1.1.pyc +0 -0
  64. package/python/__pycache__/test_inference_pool_static_batch.cpython-312.pyc +0 -0
  65. package/python/__pycache__/test_inference_pool_static_batch.cpython-314.pyc +0 -0
  66. package/python/__pycache__/yamnet_audio.cpython-314.pyc +0 -0
  67. package/python/postprocessors/__pycache__/__init__.cpython-312.pyc +0 -0
  68. package/python/postprocessors/__pycache__/__init__.cpython-313.pyc +0 -0
  69. package/python/postprocessors/__pycache__/__init__.cpython-314.pyc +0 -0
  70. package/python/postprocessors/__pycache__/_safety.cpython-313.pyc +0 -0
  71. package/python/postprocessors/__pycache__/arcface.cpython-312.pyc +0 -0
  72. package/python/postprocessors/__pycache__/arcface.cpython-313.pyc +0 -0
  73. package/python/postprocessors/__pycache__/arcface.cpython-314.pyc +0 -0
  74. package/python/postprocessors/__pycache__/clip.cpython-312.pyc +0 -0
  75. package/python/postprocessors/__pycache__/clip.cpython-313.pyc +0 -0
  76. package/python/postprocessors/__pycache__/clip.cpython-314.pyc +0 -0
  77. package/python/postprocessors/__pycache__/ctc.cpython-312.pyc +0 -0
  78. package/python/postprocessors/__pycache__/ctc.cpython-313.pyc +0 -0
  79. package/python/postprocessors/__pycache__/ctc.cpython-314.pyc +0 -0
  80. package/python/postprocessors/__pycache__/plate_slots.cpython-312.pyc +0 -0
  81. package/python/postprocessors/__pycache__/plate_slots.cpython-314.pyc +0 -0
  82. package/python/postprocessors/__pycache__/rfdetr.cpython-312.pyc +0 -0
  83. package/python/postprocessors/__pycache__/rfdetr.cpython-314.pyc +0 -0
  84. package/python/postprocessors/__pycache__/saliency.cpython-312.pyc +0 -0
  85. package/python/postprocessors/__pycache__/saliency.cpython-313.pyc +0 -0
  86. package/python/postprocessors/__pycache__/saliency.cpython-314.pyc +0 -0
  87. package/python/postprocessors/__pycache__/scrfd.cpython-312.pyc +0 -0
  88. package/python/postprocessors/__pycache__/scrfd.cpython-313.pyc +0 -0
  89. package/python/postprocessors/__pycache__/scrfd.cpython-314.pyc +0 -0
  90. package/python/postprocessors/__pycache__/softmax.cpython-312.pyc +0 -0
  91. package/python/postprocessors/__pycache__/softmax.cpython-313.pyc +0 -0
  92. package/python/postprocessors/__pycache__/softmax.cpython-314.pyc +0 -0
  93. package/python/postprocessors/__pycache__/ssd.cpython-312.pyc +0 -0
  94. package/python/postprocessors/__pycache__/ssd.cpython-313.pyc +0 -0
  95. package/python/postprocessors/__pycache__/ssd.cpython-314.pyc +0 -0
  96. package/python/postprocessors/__pycache__/test_clip.cpython-312-pytest-9.1.1.pyc +0 -0
  97. package/python/postprocessors/__pycache__/test_clip.cpython-313-pytest-9.1.1.pyc +0 -0
  98. package/python/postprocessors/__pycache__/test_ctc.cpython-312-pytest-9.1.1.pyc +0 -0
  99. package/python/postprocessors/__pycache__/test_ctc.cpython-312.pyc +0 -0
  100. package/python/postprocessors/__pycache__/test_ctc.cpython-313-pytest-9.1.1.pyc +0 -0
  101. package/python/postprocessors/__pycache__/test_ctc.cpython-313.pyc +0 -0
  102. package/python/postprocessors/__pycache__/test_ctc.cpython-314.pyc +0 -0
  103. package/python/postprocessors/__pycache__/test_plate_slots.cpython-312-pytest-9.1.1.pyc +0 -0
  104. package/python/postprocessors/__pycache__/test_rfdetr.cpython-312-pytest-9.1.1.pyc +0 -0
  105. package/python/postprocessors/__pycache__/test_rfdetr.cpython-314.pyc +0 -0
  106. package/python/postprocessors/__pycache__/test_saliency.cpython-312-pytest-9.1.1.pyc +0 -0
  107. package/python/postprocessors/__pycache__/test_saliency.cpython-313-pytest-9.1.1.pyc +0 -0
  108. package/python/postprocessors/__pycache__/test_saliency.cpython-314.pyc +0 -0
  109. package/python/postprocessors/__pycache__/test_softmax.cpython-312-pytest-9.1.1.pyc +0 -0
  110. package/python/postprocessors/__pycache__/test_softmax.cpython-314.pyc +0 -0
  111. package/python/postprocessors/__pycache__/test_yolo_nms.cpython-312-pytest-9.1.1.pyc +0 -0
  112. package/python/postprocessors/__pycache__/test_yolo_nms.cpython-314.pyc +0 -0
  113. package/python/postprocessors/__pycache__/test_yolo_nms.cpython-39.pyc +0 -0
  114. package/python/postprocessors/__pycache__/test_yolonas.cpython-312-pytest-9.1.1.pyc +0 -0
  115. package/python/postprocessors/__pycache__/yamnet.cpython-312.pyc +0 -0
  116. package/python/postprocessors/__pycache__/yamnet.cpython-313.pyc +0 -0
  117. package/python/postprocessors/__pycache__/yamnet.cpython-314.pyc +0 -0
  118. package/python/postprocessors/__pycache__/yolo.cpython-312.pyc +0 -0
  119. package/python/postprocessors/__pycache__/yolo.cpython-313.pyc +0 -0
  120. package/python/postprocessors/__pycache__/yolo.cpython-314.pyc +0 -0
  121. package/python/postprocessors/__pycache__/yolo.cpython-39.pyc +0 -0
  122. package/python/postprocessors/__pycache__/yolo_seg.cpython-312.pyc +0 -0
  123. package/python/postprocessors/__pycache__/yolo_seg.cpython-313.pyc +0 -0
  124. package/python/postprocessors/__pycache__/yolo_seg.cpython-314.pyc +0 -0
  125. package/python/postprocessors/__pycache__/yolonas.cpython-312.pyc +0 -0
  126. package/python/postprocessors/__pycache__/yolonas.cpython-314.pyc +0 -0
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CKr6Q6Qu.js");
6
- const require_process_memory = require("../process-memory-BW7XFoPY.js");
5
+ const require_dist = require("../dist-C31OZkZP.js");
6
+ const require_process_memory = require("../process-memory-BQTHtzan.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_dist.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-CxYG8IUX.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-L6mHI28P.mjs";
2
+ import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-CZkzc0WB.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CphvVq1H.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -2,12 +2,12 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CKr6Q6Qu.js");
6
- const require_node = require("../node-CmRTB9W4.js");
7
- const require_local_frame_registry = require("../local-frame-registry-B4Bd4tnU.js");
8
- const require_lazy_sharp = require("../lazy-sharp-D-HdRPo5.js");
5
+ const require_dist = require("../dist-C31OZkZP.js");
6
+ const require_node = require("../node-CIpenwbm.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-CkIaPLcW.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-DhHuLuQf.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-BW7XFoPY.js");
10
+ const require_process_memory = require("../process-memory-BQTHtzan.js");
11
11
  let node_fs = require("node:fs");
12
12
  node_fs = require_dist.__toESM(node_fs);
13
13
  let node_path = require("node:path");
@@ -1,10 +1,10 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-CxYG8IUX.mjs";
3
- import { a as readProcessCost } from "../node-DhccO0of.mjs";
4
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-DP5yyEWE.mjs";
2
+ import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-CZkzc0WB.mjs";
3
+ import { a as readProcessCost } from "../node-kSXNMrbg.mjs";
4
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-B8_L3v0O.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { n as startEventLoopStallMonitor } from "../event-loop-stall-monitor-DXLNBMkY.mjs";
7
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-L6mHI28P.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-CphvVq1H.mjs";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
10
10
  import { dirname, join } from "node:path";
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  }) : target, mod));
23
23
  //#endregion
24
24
  let node_crypto = require("node:crypto");
25
- //#region ../types/dist/event-category-BZL-fdNj.mjs
25
+ //#region ../types/dist/event-category-zAv7pMUz.mjs
26
26
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
27
27
  EventCategory["SystemBoot"] = "system.boot";
28
28
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -394,6 +394,13 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
394
394
  */
395
395
  EventCategory["BatteryOnStatusChanged"] = "battery.onStatusChanged";
396
396
  /**
397
+ * Cap event fired by every device that registers the `network-link`
398
+ * capability. Mirrors the cap definition's `onStatusChanged`. Carries
399
+ * `{ deviceId, status: NetworkLinkStatus }` — a link switch or a signal
400
+ * reading that moved.
401
+ */
402
+ EventCategory["NetworkLinkOnStatusChanged"] = "network-link.onStatusChanged";
403
+ /**
397
404
  * Emitted by the battery cap provider WHEN `wakeForStream` enters the
398
405
  * "wake in progress" window — between the Baichuan wake-up issue and
399
406
  * the camera's first dialed-back RTP packet. The stream-broker
@@ -26013,6 +26020,39 @@ onStatusChanged: { data: object({
26013
26020
  * whether persisting is worth a SQLite commit. */
26014
26021
  volatileStateFields: ["lastUpdated"]
26015
26022
  };
26023
+ /**
26024
+ * Network-link snapshot. Same shape for every provider (a Reolink wifi
26025
+ * camera, a Home Assistant device with a signal-strength sensor, a Tapo
26026
+ * plug): one slice under `device.runtimeState['network-link']`, one badge,
26027
+ * one Home Assistant projection.
26028
+ */
26029
+ var NetworkLinkStatusSchema = object({
26030
+ /** The link the device is on. `'unknown'` = not read yet, not "no link". */
26031
+ type: _enum([
26032
+ "wifi",
26033
+ "ethernet",
26034
+ "cellular",
26035
+ "unknown"
26036
+ ]),
26037
+ /**
26038
+ * Link quality, 0..100 inclusive, normalised by the provider from whatever
26039
+ * the firmware reports (bars, RSSI, a vendor scale). **`null` means NOT
26040
+ * KNOWN or NOT APPLICABLE** — a wired link has no signal, and a wireless
26041
+ * one whose reading has not landed must not be drawn at 0 %. Consumers
26042
+ * SKIP a null rather than coerce it.
26043
+ */
26044
+ signalPercent: number().min(0).max(100).nullable(),
26045
+ /** Raw received signal strength in dBm, when the firmware reports one. */
26046
+ rssiDbm: number().optional(),
26047
+ /** Network name of a wireless link, when the firmware reports it. */
26048
+ ssid: string().optional(),
26049
+ /** Ms epoch of the last observation. Lets consumers reason about freshness. */
26050
+ lastUpdated: number()
26051
+ });
26052
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.Light, DeviceType.Lock, DeviceType.Siren, object({
26053
+ deviceId: number(),
26054
+ status: NetworkLinkStatusSchema
26055
+ });
26016
26056
  object({
26017
26057
  on: boolean(),
26018
26058
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region ../types/dist/event-category-BZL-fdNj.mjs
2
+ //#region ../types/dist/event-category-zAv7pMUz.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -371,6 +371,13 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
371
371
  */
372
372
  EventCategory["BatteryOnStatusChanged"] = "battery.onStatusChanged";
373
373
  /**
374
+ * Cap event fired by every device that registers the `network-link`
375
+ * capability. Mirrors the cap definition's `onStatusChanged`. Carries
376
+ * `{ deviceId, status: NetworkLinkStatus }` — a link switch or a signal
377
+ * reading that moved.
378
+ */
379
+ EventCategory["NetworkLinkOnStatusChanged"] = "network-link.onStatusChanged";
380
+ /**
374
381
  * Emitted by the battery cap provider WHEN `wakeForStream` enters the
375
382
  * "wake in progress" window — between the Baichuan wake-up issue and
376
383
  * the camera's first dialed-back RTP packet. The stream-broker
@@ -25990,6 +25997,39 @@ onStatusChanged: { data: object({
25990
25997
  * whether persisting is worth a SQLite commit. */
25991
25998
  volatileStateFields: ["lastUpdated"]
25992
25999
  };
26000
+ /**
26001
+ * Network-link snapshot. Same shape for every provider (a Reolink wifi
26002
+ * camera, a Home Assistant device with a signal-strength sensor, a Tapo
26003
+ * plug): one slice under `device.runtimeState['network-link']`, one badge,
26004
+ * one Home Assistant projection.
26005
+ */
26006
+ var NetworkLinkStatusSchema = object({
26007
+ /** The link the device is on. `'unknown'` = not read yet, not "no link". */
26008
+ type: _enum([
26009
+ "wifi",
26010
+ "ethernet",
26011
+ "cellular",
26012
+ "unknown"
26013
+ ]),
26014
+ /**
26015
+ * Link quality, 0..100 inclusive, normalised by the provider from whatever
26016
+ * the firmware reports (bars, RSSI, a vendor scale). **`null` means NOT
26017
+ * KNOWN or NOT APPLICABLE** — a wired link has no signal, and a wireless
26018
+ * one whose reading has not landed must not be drawn at 0 %. Consumers
26019
+ * SKIP a null rather than coerce it.
26020
+ */
26021
+ signalPercent: number().min(0).max(100).nullable(),
26022
+ /** Raw received signal strength in dBm, when the firmware reports one. */
26023
+ rssiDbm: number().optional(),
26024
+ /** Network name of a wireless link, when the firmware reports it. */
26025
+ ssid: string().optional(),
26026
+ /** Ms epoch of the last observation. Lets consumers reason about freshness. */
26027
+ lastUpdated: number()
26028
+ });
26029
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.Light, DeviceType.Lock, DeviceType.Siren, object({
26030
+ deviceId: number(),
26031
+ status: NetworkLinkStatusSchema
26032
+ });
25993
26033
  object({
25994
26034
  on: boolean(),
25995
26035
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CKr6Q6Qu.js");
1
+ const require_dist = require("./dist-C31OZkZP.js");
2
2
  let node_path = require("node:path");
3
3
  node_path = require_dist.__toESM(node_path);
4
4
  let node_url = require("node:url");
@@ -1,4 +1,4 @@
1
- import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-CxYG8IUX.mjs";
1
+ import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-CZkzc0WB.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CKr6Q6Qu.js");
1
+ const require_dist = require("./dist-C31OZkZP.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CKr6Q6Qu.js");
6
- const require_lazy_sharp = require("../lazy-sharp-D-HdRPo5.js");
5
+ const require_dist = require("../dist-C31OZkZP.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-DhHuLuQf.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-CxYG8IUX.mjs";
1
+ import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-CZkzc0WB.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,4 +1,4 @@
1
- const require_dist = require("./dist-CKr6Q6Qu.js");
1
+ const require_dist = require("./dist-C31OZkZP.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_dist.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-CxYG8IUX.mjs";
1
+ import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-CZkzc0WB.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import "node:fs";
4
4
  import "node:path";
@@ -2,12 +2,12 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CKr6Q6Qu.js");
6
- const require_node = require("../node-CmRTB9W4.js");
7
- const require_local_frame_registry = require("../local-frame-registry-B4Bd4tnU.js");
8
- const require_worker_protocol = require("../worker-protocol-C8ZBUm08.js");
5
+ const require_dist = require("../dist-C31OZkZP.js");
6
+ const require_node = require("../node-CIpenwbm.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-CkIaPLcW.js");
8
+ const require_worker_protocol = require("../worker-protocol-BSgTKhW7.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
- const require_lazy_sharp = require("../lazy-sharp-D-HdRPo5.js");
10
+ const require_lazy_sharp = require("../lazy-sharp-DhHuLuQf.js");
11
11
  const require_restream_intent = require("../restream-intent-Cv9x3jmu.js");
12
12
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
13
13
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
@@ -301,6 +301,16 @@ var DEFAULT_NODE_DECODE_BUDGET_MB = 8192;
301
301
  * `native-lease-config.ts` on why "unset" includes a knob sitting at its
302
302
  * default); anything absent falls back to what the worker ships with.
303
303
  */
304
+ /**
305
+ * How many frames of one camera the runner may have in inference at once:
306
+ * the worker's hold minus one, never below one. The hold evicts oldest-first
307
+ * when a newer marked frame lands, so the (hold)th outstanding ref is the one
308
+ * that makes the first unreadable. See `runner.ts` `maxInflightPerCamera`.
309
+ */
310
+ function maxInflightPerCamera(override) {
311
+ const holdFrames = override.holdFrames ?? require_dist.DEFAULT_NATIVE_LEASE_SETTINGS.holdFrames;
312
+ return Math.max(1, holdFrames - 1);
313
+ }
304
314
  function decodeWorkerFootprintMb(override) {
305
315
  const budgetMb = override.budgetMb ?? require_dist.DEFAULT_NATIVE_LEASE_SETTINGS.budgetMb;
306
316
  const holdFrames = override.holdFrames ?? require_dist.DEFAULT_NATIVE_LEASE_SETTINGS.holdFrames;
@@ -918,6 +928,55 @@ function cropRgb(frame, bbox, maxWidth) {
918
928
  };
919
929
  }
920
930
  //#endregion
931
+ //#region src/pipeline-runner/frame-cutter-binding.ts
932
+ /** The per-frame binding key — the same identity the retention handle carries. */
933
+ function frameCutterKey(handle) {
934
+ return `${handle.shmId}#${handle.slot}#${handle.seq}`;
935
+ }
936
+ var FrameCutterBinding = class {
937
+ max;
938
+ map = /* @__PURE__ */ new Map();
939
+ constructor(max) {
940
+ this.max = max;
941
+ }
942
+ /** Bind at delivery. Re-binding the same handle replaces without stranding the first. */
943
+ bind(handle, cutter) {
944
+ const key = frameCutterKey(handle);
945
+ this.map.delete(key);
946
+ this.map.set(key, cutter);
947
+ while (this.map.size > this.max) {
948
+ const oldest = this.map.keys().next().value;
949
+ if (oldest === void 0) break;
950
+ const stale = this.map.get(oldest);
951
+ this.map.delete(oldest);
952
+ release(stale);
953
+ }
954
+ }
955
+ /** Consume the binding for a frame whose result arrived. `undefined` when already ended. */
956
+ take(handle) {
957
+ const key = frameCutterKey(handle);
958
+ const cutter = this.map.get(key);
959
+ this.map.delete(key);
960
+ return cutter;
961
+ }
962
+ /**
963
+ * End the hold of a frame the runner let go without a result. A no-op for a
964
+ * frame whose result already consumed the binding, so the two paths cannot
965
+ * double-release.
966
+ */
967
+ drop(handle) {
968
+ release(this.take(handle));
969
+ }
970
+ get size() {
971
+ return this.map.size;
972
+ }
973
+ };
974
+ function release(cutter) {
975
+ try {
976
+ cutter?.release();
977
+ } catch {}
978
+ }
979
+ //#endregion
921
980
  //#region src/session-decode/session-decode-coordinator.ts
922
981
  /** How long to wait after `kill()` before escalating to `kill('SIGKILL')`. */
923
982
  var SIGKILL_FALLBACK_MS = 1e3;
@@ -4520,6 +4579,7 @@ var PipelineRunner = class {
4520
4579
  detectionQueue,
4521
4580
  inferenceTimes: [],
4522
4581
  shedFrames: 0,
4582
+ inflight: 0,
4523
4583
  processedCount: 0,
4524
4584
  startTime: Date.now(),
4525
4585
  phase: initialPhase,
@@ -4626,8 +4686,23 @@ var PipelineRunner = class {
4626
4686
  * time so the pump can copy the pixels while the frame is still reserved.
4627
4687
  */
4628
4688
  detectionBackpressure(deviceId) {
4629
- if (!this.cameras.has(deviceId)) return true;
4630
- return this.semaphore.available <= 0;
4689
+ const state = this.cameras.get(deviceId);
4690
+ if (!state) return true;
4691
+ return this.semaphore.available <= 0 || state.inflight >= this.maxInflightPerCamera();
4692
+ }
4693
+ /** The per-camera in-flight cap in force (config, else the shipped hold minus one). */
4694
+ maxInflightPerCamera() {
4695
+ return Math.max(1, this.config.maxInflightPerCamera ?? require_dist.DEFAULT_NATIVE_LEASE_SETTINGS.holdFrames - 1);
4696
+ }
4697
+ /**
4698
+ * Follow a resized native-frame hold. Running inferences are untouched; the
4699
+ * next pick is measured against the new cap.
4700
+ */
4701
+ setMaxInflightPerCamera(cap) {
4702
+ this.config = {
4703
+ ...this.config,
4704
+ maxInflightPerCamera: cap
4705
+ };
4631
4706
  }
4632
4707
  enqueueReservedDetectionFrame(deviceId, frame, handle) {
4633
4708
  const state = this.cameras.get(deviceId);
@@ -4912,6 +4987,7 @@ var PipelineRunner = class {
4912
4987
  async processWithSemaphore(deviceId, entry, frameInput, state, streamType) {
4913
4988
  const pickedAt = Date.now();
4914
4989
  const { frame, handle } = entry;
4990
+ state.inflight += 1;
4915
4991
  const enqueuedAt = frame._enqueuedAt ?? pickedAt;
4916
4992
  const rawRelease = await this.semaphore.acquire();
4917
4993
  let released = false;
@@ -4953,6 +5029,7 @@ var PipelineRunner = class {
4953
5029
  } catch {
4954
5030
  frameReleaseReason = "error";
4955
5031
  } finally {
5032
+ state.inflight -= 1;
4956
5033
  release();
4957
5034
  try {
4958
5035
  if (frameReleaseReason === "success" && handle && isContinuousRetainEnabled()) await this.config.hydrateRetainedFrame?.(handle);
@@ -5052,7 +5129,7 @@ var PipelineRunner = class {
5052
5129
  } catch {}
5053
5130
  }
5054
5131
  pickNextDetectionFrame() {
5055
- for (const [deviceId, state] of this.cameras) if (state.registration.detectionMode === "always-on" && state.detectionQueue.size > 0) return {
5132
+ for (const [deviceId, state] of this.cameras) if (state.registration.detectionMode === "always-on" && state.detectionQueue.size > 0 && state.inflight < this.maxInflightPerCamera()) return {
5056
5133
  deviceId,
5057
5134
  entry: state.detectionQueue.dequeue(),
5058
5135
  state
@@ -5065,7 +5142,7 @@ var PipelineRunner = class {
5065
5142
  if (!deviceId) continue;
5066
5143
  const state = this.cameras.get(deviceId);
5067
5144
  if (!state) continue;
5068
- if (state.phase === "active" && state.detectionQueue.size > 0) {
5145
+ if (state.phase === "active" && state.detectionQueue.size > 0 && state.inflight < this.maxInflightPerCamera()) {
5069
5146
  this.defaultRoundRobinIndex = (idx + 1) % this.defaultRoundRobinKeys.length;
5070
5147
  const entry = state.detectionQueue.dequeue();
5071
5148
  if (!entry) continue;
@@ -5209,10 +5286,6 @@ var PACKAGE_ZONE_UNION_TTL_MS = 6e4;
5209
5286
  var MAX_BOUND_FRAME_CUTTERS = 256;
5210
5287
  /** How often a camera reports its undispatched cuts. */
5211
5288
  var TILE_CUT_DROP_LOG_INTERVAL_MS = 6e4;
5212
- /** The per-frame binding key — the same identity the retention handle carries. */
5213
- function frameCutterKey(handle) {
5214
- return `${handle.shmId}#${handle.slot}#${handle.seq}`;
5215
- }
5216
5289
  var DEFAULT_CONFIG = {
5217
5290
  maxQueueDepth: 30,
5218
5291
  maxConcurrentInferences: 16,
@@ -5565,16 +5638,11 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
5565
5638
  */
5566
5639
  nativeCropRegistry = new NativeCropRegistry();
5567
5640
  /**
5568
- * Per-frame cutter bindings — handle key → the requester that can cut this
5569
- * frame's subject tiles and end its hold.
5570
- *
5571
- * Deliberately NOT `nativeCropRegistry`. That one is a node-wide LRU capped
5572
- * at 256 and shared by every camera to serve LATE cross-process crops; on the
5573
- * live hub it sits pinned at its cap, so an entry's lifetime depends on how
5574
- * busy the OTHER cameras are. Ending a frame's hold is a per-frame lifecycle
5575
- * event and cannot be allowed to depend on that.
5641
+ * Per-frame cutter bindings — the requester that can cut a frame's subject
5642
+ * tiles and end its hold, ended by its result, by a drop, or by the bound.
5643
+ * See `frame-cutter-binding.ts` for why this is not `nativeCropRegistry`.
5576
5644
  */
5577
- frameCutters = /* @__PURE__ */ new Map();
5645
+ frameCutters = new FrameCutterBinding(MAX_BOUND_FRAME_CUTTERS);
5578
5646
  /** Per-camera tally of cuts that could not be dispatched, and why. */
5579
5647
  tileCutDrops = /* @__PURE__ */ new Map();
5580
5648
  tileCutDropLoggedAt = /* @__PURE__ */ new Map();
@@ -5795,12 +5863,16 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
5795
5863
  this.runner = new PipelineRunner({
5796
5864
  maxQueueDepth: this.config.maxQueueDepth,
5797
5865
  maxConcurrentInferences: this.config.maxConcurrentInferences,
5866
+ maxInflightPerCamera: maxInflightPerCamera(this.nativeLease.current()),
5798
5867
  targetLoadPercent: this.config.targetLoadPercent,
5799
5868
  minThrottledFps: this.config.minThrottledFps,
5800
5869
  processFrame: (deviceId, frame, handle) => this.runInference(deviceId, frame, handle),
5801
5870
  analyzeMotion: (deviceId, frame, handle) => this.runMotionAnalysis(deviceId, frame, handle),
5802
5871
  releaseFrameRef: (ref, reason) => require_local_frame_registry.localFrameRegistry.release(ref, reason),
5803
- releaseRetention: (handle, reason) => this.retention?.release(handle, reason),
5872
+ releaseRetention: (handle, reason) => {
5873
+ this.retention?.release(handle, reason);
5874
+ this.frameCutters.drop(handle);
5875
+ },
5804
5876
  hydrateRetainedFrame: (handle) => this.retainedFrames?.ensureContent(handle) ?? Promise.resolve(null),
5805
5877
  onPhaseChanged: (deviceId, phase, meta) => this.handlePhaseChanged(deviceId, phase, meta),
5806
5878
  logger: this.ctx.logger,
@@ -6784,9 +6856,7 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
6784
6856
  */
6785
6857
  dispatchSubjectTiles(result, handle) {
6786
6858
  if (!handle) return "handleless";
6787
- const key = frameCutterKey(handle);
6788
- const cutter = this.frameCutters.get(key);
6789
- this.frameCutters.delete(key);
6859
+ const cutter = this.frameCutters.take(handle);
6790
6860
  if (!cutter) return "unbound";
6791
6861
  const boxes = planTileCuts(result.detections ?? [], {
6792
6862
  width: result.width,
@@ -6810,18 +6880,7 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
6810
6880
  * runner stopped answering" rather than "the runner forgot".
6811
6881
  */
6812
6882
  bindFrameCutter(handle, cutter) {
6813
- const key = frameCutterKey(handle);
6814
- this.frameCutters.delete(key);
6815
- this.frameCutters.set(key, cutter);
6816
- while (this.frameCutters.size > MAX_BOUND_FRAME_CUTTERS) {
6817
- const oldest = this.frameCutters.keys().next().value;
6818
- if (oldest === void 0) break;
6819
- const stale = this.frameCutters.get(oldest);
6820
- this.frameCutters.delete(oldest);
6821
- try {
6822
- stale?.release();
6823
- } catch {}
6824
- }
6883
+ this.frameCutters.bind(handle, cutter);
6825
6884
  }
6826
6885
  /**
6827
6886
  * The native-lease half of {@link getNativeCrop}, extracted so the DETAIL path
@@ -7045,6 +7104,7 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
7045
7104
  async refreshNativeLeaseSettings() {
7046
7105
  await this.nativeLease.refresh(this.ctxIfReady?.api);
7047
7106
  this.liveWorkers?.resizeFootprint(decodeWorkerFootprintMb(this.nativeLease.current()));
7107
+ this.runner?.setMaxInflightPerCamera(maxInflightPerCamera(this.nativeLease.current()));
7048
7108
  await this.nodeLimits?.refresh(this.ctxIfReady?.api);
7049
7109
  this.applyNodeDecodeLimits("lease-refresh");
7050
7110
  }