@camstack/addon-pipeline 1.2.80 → 1.2.81

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 (29) hide show
  1. package/dist/{addon-utils-C4Cge0S0.js → addon-utils-CQFlZXSn.js} +1 -1
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +1 -1
  4. package/dist/detection-pipeline/index.js +4 -4
  5. package/dist/detection-pipeline/index.mjs +2 -2
  6. package/dist/{dist-ZSiUDGzf.js → dist-B57MztMq.js} +143 -11
  7. package/dist/{dist-Bf1SE1Ew.mjs → dist-DGp0dRiq.mjs} +126 -12
  8. package/dist/{event-loop-stall-monitor-CjWfos2b.mjs → event-loop-stall-monitor-8vYH44kg.mjs} +1 -1
  9. package/dist/{event-loop-stall-monitor-VcDGoua3.js → event-loop-stall-monitor-DPA6Pu_h.js} +1 -1
  10. package/dist/{lazy-sharp-CC4WNiKY.js → lazy-sharp-BMgRSV9x.js} +1 -1
  11. package/dist/motion-wasm/index.js +2 -2
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/pipeline-runner/index.js +26 -4
  14. package/dist/pipeline-runner/index.mjs +25 -3
  15. package/dist/recorder/index.js +2 -2
  16. package/dist/recorder/index.mjs +1 -1
  17. package/dist/session-decode/decode-worker-child.js +2 -2
  18. package/dist/session-decode/decode-worker-child.mjs +1 -1
  19. package/dist/stream-broker/_stub.js +1 -1
  20. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B1oVjQLS.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Cb8ynph1.mjs} +2 -2
  21. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B2scqOH7.mjs +26 -0
  22. package/dist/stream-broker/{hostInit-D_m-NYyr.mjs → hostInit-GJipMxBe.mjs} +2 -2
  23. package/dist/stream-broker/index.js +224 -1
  24. package/dist/stream-broker/index.mjs +224 -1
  25. package/dist/stream-broker/remoteEntry.js +1 -1
  26. package/dist/{worker-protocol-KDfFzKgT.js → worker-protocol-4L4SbSAo.js} +1 -1
  27. package/dist/{worker-protocol-p66oO1xL.mjs → worker-protocol-_e84lGuR.mjs} +1 -1
  28. package/package.json +1 -1
  29. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BjDv7QMq.mjs +0 -26
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-ZSiUDGzf.js");
1
+ const require_dist = require("./dist-B57MztMq.js");
2
2
  require("node:crypto");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
@@ -2,9 +2,9 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-ZSiUDGzf.js");
5
+ const require_dist = require("../dist-B57MztMq.js");
6
6
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
7
- const require_addon_utils = require("../addon-utils-C4Cge0S0.js");
7
+ const require_addon_utils = require("../addon-utils-CQFlZXSn.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_dist.__toESM(node_path);
10
10
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { B as mapAudioLabelToMacro, E as audioAnalyzerCapability, T as audioAnalysisCapability, ft as hydrateSchema, m as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, st as BaseAddon, tt as errMsg } from "../dist-Bf1SE1Ew.mjs";
2
+ import { D as audioAnalyzerCapability, E as audioAnalysisCapability, U as mapAudioLabelToMacro, h as HF_BASE_URL, ht as hydrateSchema, it as errMsg, n as AUDIO_BACKEND_CHOICES, s as DEFAULT_AUDIO_ANALYZER_CONFIG, ut as BaseAddon } from "../dist-DGp0dRiq.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { i as downloadFile } from "../addon-utils-A2S9D7pu.mjs";
5
5
  import * as path$1 from "node:path";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-ZSiUDGzf.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-VcDGoua3.js");
7
- const require_lazy_sharp = require("../lazy-sharp-CC4WNiKY.js");
5
+ const require_dist = require("../dist-B57MztMq.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DPA6Pu_h.js");
7
+ const require_lazy_sharp = require("../lazy-sharp-BMgRSV9x.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
- const require_addon_utils = require("../addon-utils-C4Cge0S0.js");
9
+ const require_addon_utils = require("../addon-utils-CQFlZXSn.js");
10
10
  let sharp = require("sharp");
11
11
  sharp = require_dist.__toESM(sharp);
12
12
  let node_child_process = require("node:child_process");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $ as supportedRuntimes$1, A as defaultDeviceFor$1, At as string, C as YAMNET_TO_MACRO, G as pipelineExecutorCapability, L as enumerateInferenceDevices, Mt as EventCategory, Ot as object, P as detectionPipelineCapability, R as evaluateZoneRules, St as array, X as runtimeDevices$1, _t as parseJsonUnknown, bt as sleep, dt as createEvent, ft as hydrateSchema, gt as nodePin, jt as union, st as BaseAddon, t as APPLE_SA_TO_MACRO, tt as errMsg, u as DEVICE_BACKEND_TO_FORMAT } from "../dist-Bf1SE1Ew.mjs";
3
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep } from "../event-loop-stall-monitor-CjWfos2b.mjs";
2
+ import { $ as runtimeDevices$1, B as enumerateInferenceDevices, Ct as sleep, Ft as EventCategory, J as pipelineExecutorCapability, L as detectionPipelineCapability, M as defaultDeviceFor$1, Nt as string, Pt as union, Tt as array, V as evaluateZoneRules, bt as parseJsonUnknown, d as DEVICE_BACKEND_TO_FORMAT, ht as hydrateSchema, it as errMsg, jt as object, mt as createEvent, nt as supportedRuntimes$1, t as APPLE_SA_TO_MACRO, ut as BaseAddon, w as YAMNET_TO_MACRO, yt as nodePin } from "../dist-DGp0dRiq.mjs";
3
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep } from "../event-loop-stall-monitor-8vYH44kg.mjs";
4
4
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
5
5
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
6
6
  import { a as ensureModel, o as isModelDownloaded, r as deleteModelFromDisk } from "../addon-utils-A2S9D7pu.mjs";
@@ -22806,6 +22806,25 @@ var BatteryStatusSchema = object({
22806
22806
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
22807
22807
  lastUpdated: number(),
22808
22808
  /**
22809
+ * Ms epoch of the last time the device PROVED it was reachable — a
22810
+ * completed firmware round-trip, an observed wake, or an inbound push
22811
+ * (firmware event, email). `0`/absent = never since this slice was born.
22812
+ *
22813
+ * This is the ONLY input that separates "asleep" from "gone", and it is
22814
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
22815
+ * for the radio, because a poll that confirms reachability is the same
22816
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
22817
+ * single derivation every consumer must use; no surface computes its own.
22818
+ *
22819
+ * It is deliberately NOT a clock in the
22820
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
22821
+ * observation itself, and it is the only thing a 30-hour silence is
22822
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
22823
+ * Reolink provider) so a value that means "recently" cannot cost a
22824
+ * SQLite commit per round-trip.
22825
+ */
22826
+ lastContactAt: number().optional(),
22827
+ /**
22809
22828
  * True when the source is a BINARY low-battery indicator (HA
22810
22829
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
22811
22830
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -22814,17 +22833,84 @@ var BatteryStatusSchema = object({
22814
22833
  */
22815
22834
  binary: boolean().optional()
22816
22835
  });
22817
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, method(object({
22818
- deviceId: number(),
22819
- /** Bound on the wait. Sensible range 3000–10000ms. */
22820
- timeoutMs: number().int().min(500).max(3e4).default(8e3)
22821
- }), object({
22822
- awoke: boolean(),
22823
- durationMs: number()
22824
- }), { kind: "mutation" }), object({
22825
- deviceId: number(),
22826
- status: BatteryStatusSchema
22827
- });
22836
+ var batteryCapability = {
22837
+ name: "battery",
22838
+ scope: "device",
22839
+ deviceNative: true,
22840
+ mode: "singleton",
22841
+ deviceTypes: [
22842
+ DeviceType.Camera,
22843
+ DeviceType.Sensor,
22844
+ DeviceType.Button,
22845
+ DeviceType.Switch
22846
+ ],
22847
+ methods: {
22848
+ /**
22849
+ * Explicitly wake the camera from low-power sleep ahead of a
22850
+ * streaming session start. Consumers that initiate a stream
22851
+ * against a sleeping battery cam (HomeKit Secure Video, Alexa
22852
+ * RTCSession, snapshot wrappers) call this with a short timeout
22853
+ * before establishing the media pipeline — the broker's own
22854
+ * passive wake-on-dial works but adds 5–7 seconds to first-frame,
22855
+ * during which the consumer renders a black screen. Pre-waking
22856
+ * compresses that gap.
22857
+ *
22858
+ * Returns `awoke: true` when the firmware acknowledged the wake
22859
+ * before `timeoutMs`. Returns `awoke: false` when it timed out OR
22860
+ * the cap surface is unavailable (no Baichuan / firmware
22861
+ * channel); the caller should still attempt the stream — the
22862
+ * passive broker wake remains as fallback.
22863
+ */
22864
+ wakeForStream: method(object({
22865
+ deviceId: number(),
22866
+ /** Bound on the wait. Sensible range 3000–10000ms. */
22867
+ timeoutMs: number().int().min(500).max(3e4).default(8e3)
22868
+ }), object({
22869
+ awoke: boolean(),
22870
+ durationMs: number()
22871
+ }), { kind: "mutation" }) },
22872
+ events: {
22873
+ /**
22874
+ * Emitted whenever the cached status changes (firmware push OR
22875
+ * poll observes a delta). The DeviceEventPropagator mirrors this
22876
+ * event on the parent chain — subscribing to a camera's source
22877
+ * receives battery events from child accessories automatically.
22878
+ */
22879
+ onStatusChanged: { data: object({
22880
+ deviceId: number(),
22881
+ status: BatteryStatusSchema
22882
+ }) } },
22883
+ status: {
22884
+ schema: BatteryStatusSchema,
22885
+ kind: "push",
22886
+ empty: {
22887
+ percentage: 0,
22888
+ charging: "none",
22889
+ sleeping: false,
22890
+ lastUpdated: 0
22891
+ }
22892
+ },
22893
+ /**
22894
+ * Runtime-state slice — every provider that registers this cap
22895
+ * stores the same shape under `device.runtimeState[battery]`.
22896
+ * Cross-provider uniformity: a Reolink Argus, a Frigate sensor
22897
+ * proxy, an ONVIF battery cam all read/write the same keys.
22898
+ * Consumers (BatteryBadge, snapshot wrapper sleep gate) read once
22899
+ * via `device.runtimeState.getCapState('battery')` regardless of
22900
+ * the underlying driver.
22901
+ */
22902
+ runtimeState: BatteryStatusSchema,
22903
+ /**
22904
+ * Runtime-state durability: **restored** — a sleeping battery camera may not report for hours; the restored percentage is the only thing the UI and the sleep gate have. Zero churn once `lastUpdated` is excluded — 526 writes, 0 value changes, in 25 minutes.
22905
+ *
22906
+ * See `RuntimeStateDurability`. Enforced by
22907
+ * `scripts/check-runtime-state-durability.ts`.
22908
+ */
22909
+ durability: "restored",
22910
+ /** Clock fields: written, but excluded from the compare that decides
22911
+ * whether persisting is worth a SQLite commit. */
22912
+ volatileStateFields: ["lastUpdated"]
22913
+ };
22828
22914
  object({
22829
22915
  on: boolean(),
22830
22916
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -27235,6 +27321,16 @@ var CamStreamDescriptorSchema = object({
27235
27321
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
27236
27322
  metadata: record(string(), unknown()).optional()
27237
27323
  });
27324
+ object({
27325
+ /** The descriptors as last built from a real camera response. Never a guess:
27326
+ * a failed or refused build writes NOTHING, so a restored catalog is always
27327
+ * one the camera itself once produced. */
27328
+ descriptors: array(CamStreamDescriptorSchema),
27329
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
27330
+ * path decide whether the camera's own awake window is worth spending on a
27331
+ * re-read. */
27332
+ lastFetchedAt: number()
27333
+ });
27238
27334
  DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CamStreamDescriptorSchema).readonly());
27239
27335
  /** One of the camera's stream profiles. */
27240
27336
  var StreamProfileSchema = _enum([
@@ -28119,6 +28215,24 @@ AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, Accessor
28119
28215
  DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
28120
28216
  new Set(Object.values(DeviceType));
28121
28217
  DeviceFeature.BatteryOperated;
28218
+ /**
28219
+ * THE derivation. One crop rectangle, one presence verdict — see D52 for why
28220
+ * this repo insists a derived value has exactly one implementation.
28221
+ *
28222
+ * `undefined` status ⇒ `sleeping`. A device with no slice has made no claim,
28223
+ * and the caller decides separately whether it is even battery-operated
28224
+ * (`DeviceFeature.BatteryOperated`); this function never answers that
28225
+ * question, only what a battery device is doing.
28226
+ */
28227
+ function deriveBatteryPresence(input) {
28228
+ const status = input.status;
28229
+ if (!status) return "sleeping";
28230
+ if (status.sleeping !== true) return "awake";
28231
+ const lastContactAt = status.lastContactAt;
28232
+ if (typeof lastContactAt !== "number" || lastContactAt <= 0) return "sleeping";
28233
+ const budget = input.unreachableAfterMs ?? 216e5;
28234
+ return input.nowMs - lastContactAt > budget ? "unreachable" : "sleeping";
28235
+ }
28122
28236
  Object.freeze({
28123
28237
  "accessories.setChildHidden": {
28124
28238
  capName: "accessories",
@@ -36460,6 +36574,12 @@ Object.defineProperty(exports, "BaseAddon", {
36460
36574
  return BaseAddon;
36461
36575
  }
36462
36576
  });
36577
+ Object.defineProperty(exports, "BatteryStatusSchema", {
36578
+ enumerable: true,
36579
+ get: function() {
36580
+ return BatteryStatusSchema;
36581
+ }
36582
+ });
36463
36583
  Object.defineProperty(exports, "CAM_PROFILE_ORDER", {
36464
36584
  enumerable: true,
36465
36585
  get: function() {
@@ -36652,6 +36772,12 @@ Object.defineProperty(exports, "audioAnalyzerCapability", {
36652
36772
  return audioAnalyzerCapability;
36653
36773
  }
36654
36774
  });
36775
+ Object.defineProperty(exports, "batteryCapability", {
36776
+ enumerable: true,
36777
+ get: function() {
36778
+ return batteryCapability;
36779
+ }
36780
+ });
36655
36781
  Object.defineProperty(exports, "boolean", {
36656
36782
  enumerable: true,
36657
36783
  get: function() {
@@ -36700,6 +36826,12 @@ Object.defineProperty(exports, "defineCustomActions", {
36700
36826
  return defineCustomActions;
36701
36827
  }
36702
36828
  });
36829
+ Object.defineProperty(exports, "deriveBatteryPresence", {
36830
+ enumerable: true,
36831
+ get: function() {
36832
+ return deriveBatteryPresence;
36833
+ }
36834
+ });
36703
36835
  Object.defineProperty(exports, "deriveDetailCropRect", {
36704
36836
  enumerable: true,
36705
36837
  get: function() {
@@ -22783,6 +22783,25 @@ var BatteryStatusSchema = object({
22783
22783
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
22784
22784
  lastUpdated: number(),
22785
22785
  /**
22786
+ * Ms epoch of the last time the device PROVED it was reachable — a
22787
+ * completed firmware round-trip, an observed wake, or an inbound push
22788
+ * (firmware event, email). `0`/absent = never since this slice was born.
22789
+ *
22790
+ * This is the ONLY input that separates "asleep" from "gone", and it is
22791
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
22792
+ * for the radio, because a poll that confirms reachability is the same
22793
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
22794
+ * single derivation every consumer must use; no surface computes its own.
22795
+ *
22796
+ * It is deliberately NOT a clock in the
22797
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
22798
+ * observation itself, and it is the only thing a 30-hour silence is
22799
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
22800
+ * Reolink provider) so a value that means "recently" cannot cost a
22801
+ * SQLite commit per round-trip.
22802
+ */
22803
+ lastContactAt: number().optional(),
22804
+ /**
22786
22805
  * True when the source is a BINARY low-battery indicator (HA
22787
22806
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
22788
22807
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -22791,17 +22810,84 @@ var BatteryStatusSchema = object({
22791
22810
  */
22792
22811
  binary: boolean().optional()
22793
22812
  });
22794
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, method(object({
22795
- deviceId: number(),
22796
- /** Bound on the wait. Sensible range 3000–10000ms. */
22797
- timeoutMs: number().int().min(500).max(3e4).default(8e3)
22798
- }), object({
22799
- awoke: boolean(),
22800
- durationMs: number()
22801
- }), { kind: "mutation" }), object({
22802
- deviceId: number(),
22803
- status: BatteryStatusSchema
22804
- });
22813
+ var batteryCapability = {
22814
+ name: "battery",
22815
+ scope: "device",
22816
+ deviceNative: true,
22817
+ mode: "singleton",
22818
+ deviceTypes: [
22819
+ DeviceType.Camera,
22820
+ DeviceType.Sensor,
22821
+ DeviceType.Button,
22822
+ DeviceType.Switch
22823
+ ],
22824
+ methods: {
22825
+ /**
22826
+ * Explicitly wake the camera from low-power sleep ahead of a
22827
+ * streaming session start. Consumers that initiate a stream
22828
+ * against a sleeping battery cam (HomeKit Secure Video, Alexa
22829
+ * RTCSession, snapshot wrappers) call this with a short timeout
22830
+ * before establishing the media pipeline — the broker's own
22831
+ * passive wake-on-dial works but adds 5–7 seconds to first-frame,
22832
+ * during which the consumer renders a black screen. Pre-waking
22833
+ * compresses that gap.
22834
+ *
22835
+ * Returns `awoke: true` when the firmware acknowledged the wake
22836
+ * before `timeoutMs`. Returns `awoke: false` when it timed out OR
22837
+ * the cap surface is unavailable (no Baichuan / firmware
22838
+ * channel); the caller should still attempt the stream — the
22839
+ * passive broker wake remains as fallback.
22840
+ */
22841
+ wakeForStream: method(object({
22842
+ deviceId: number(),
22843
+ /** Bound on the wait. Sensible range 3000–10000ms. */
22844
+ timeoutMs: number().int().min(500).max(3e4).default(8e3)
22845
+ }), object({
22846
+ awoke: boolean(),
22847
+ durationMs: number()
22848
+ }), { kind: "mutation" }) },
22849
+ events: {
22850
+ /**
22851
+ * Emitted whenever the cached status changes (firmware push OR
22852
+ * poll observes a delta). The DeviceEventPropagator mirrors this
22853
+ * event on the parent chain — subscribing to a camera's source
22854
+ * receives battery events from child accessories automatically.
22855
+ */
22856
+ onStatusChanged: { data: object({
22857
+ deviceId: number(),
22858
+ status: BatteryStatusSchema
22859
+ }) } },
22860
+ status: {
22861
+ schema: BatteryStatusSchema,
22862
+ kind: "push",
22863
+ empty: {
22864
+ percentage: 0,
22865
+ charging: "none",
22866
+ sleeping: false,
22867
+ lastUpdated: 0
22868
+ }
22869
+ },
22870
+ /**
22871
+ * Runtime-state slice — every provider that registers this cap
22872
+ * stores the same shape under `device.runtimeState[battery]`.
22873
+ * Cross-provider uniformity: a Reolink Argus, a Frigate sensor
22874
+ * proxy, an ONVIF battery cam all read/write the same keys.
22875
+ * Consumers (BatteryBadge, snapshot wrapper sleep gate) read once
22876
+ * via `device.runtimeState.getCapState('battery')` regardless of
22877
+ * the underlying driver.
22878
+ */
22879
+ runtimeState: BatteryStatusSchema,
22880
+ /**
22881
+ * Runtime-state durability: **restored** — a sleeping battery camera may not report for hours; the restored percentage is the only thing the UI and the sleep gate have. Zero churn once `lastUpdated` is excluded — 526 writes, 0 value changes, in 25 minutes.
22882
+ *
22883
+ * See `RuntimeStateDurability`. Enforced by
22884
+ * `scripts/check-runtime-state-durability.ts`.
22885
+ */
22886
+ durability: "restored",
22887
+ /** Clock fields: written, but excluded from the compare that decides
22888
+ * whether persisting is worth a SQLite commit. */
22889
+ volatileStateFields: ["lastUpdated"]
22890
+ };
22805
22891
  object({
22806
22892
  on: boolean(),
22807
22893
  /** Ms epoch of the last transition. 0 if never observed. */
@@ -27212,6 +27298,16 @@ var CamStreamDescriptorSchema = object({
27212
27298
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
27213
27299
  metadata: record(string(), unknown()).optional()
27214
27300
  });
27301
+ object({
27302
+ /** The descriptors as last built from a real camera response. Never a guess:
27303
+ * a failed or refused build writes NOTHING, so a restored catalog is always
27304
+ * one the camera itself once produced. */
27305
+ descriptors: array(CamStreamDescriptorSchema),
27306
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
27307
+ * path decide whether the camera's own awake window is worth spending on a
27308
+ * re-read. */
27309
+ lastFetchedAt: number()
27310
+ });
27215
27311
  DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CamStreamDescriptorSchema).readonly());
27216
27312
  /** One of the camera's stream profiles. */
27217
27313
  var StreamProfileSchema = _enum([
@@ -28096,6 +28192,24 @@ AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, Accessor
28096
28192
  DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
28097
28193
  new Set(Object.values(DeviceType));
28098
28194
  DeviceFeature.BatteryOperated;
28195
+ /**
28196
+ * THE derivation. One crop rectangle, one presence verdict — see D52 for why
28197
+ * this repo insists a derived value has exactly one implementation.
28198
+ *
28199
+ * `undefined` status ⇒ `sleeping`. A device with no slice has made no claim,
28200
+ * and the caller decides separately whether it is even battery-operated
28201
+ * (`DeviceFeature.BatteryOperated`); this function never answers that
28202
+ * question, only what a battery device is doing.
28203
+ */
28204
+ function deriveBatteryPresence(input) {
28205
+ const status = input.status;
28206
+ if (!status) return "sleeping";
28207
+ if (status.sleeping !== true) return "awake";
28208
+ const lastContactAt = status.lastContactAt;
28209
+ if (typeof lastContactAt !== "number" || lastContactAt <= 0) return "sleeping";
28210
+ const budget = input.unreachableAfterMs ?? 216e5;
28211
+ return input.nowMs - lastContactAt > budget ? "unreachable" : "sleeping";
28212
+ }
28099
28213
  Object.freeze({
28100
28214
  "accessories.setChildHidden": {
28101
28215
  capName: "accessories",
@@ -36407,4 +36521,4 @@ function enumerateInferenceDevices(hw) {
36407
36521
  return out;
36408
36522
  }
36409
36523
  //#endregion
36410
- export { supportedRuntimes as $, defaultDeviceFor as A, string as At, mapAudioLabelToMacro as B, YAMNET_TO_MACRO as C, boolean as Ct, cameraStreamsCapability as D, number as Dt, audioAnalyzerCapability as E, literal as Et, egressTranscodeSharingKey as F, pipelineExecutorCapability as G, motionDetectionCapability as H, egressTransportFromRequest as I, recordingExportCapability as J, pipelineRunnerCapability as K, enumerateInferenceDevices as L, deriveDetailCropRect as M, EventCategory as Mt, deriveRecordingMode as N, createHwAccelCache as O, object as Ot, detectionPipelineCapability as P, streamBrokerCapability as Q, evaluateZoneRules as R, RingBuffer as S, array as St, audioAnalysisCapability as T, lazy as Tt, pickDetailCropConvention as U, maskUrlCredentials as V, pickNativeLeaseOverride as W, runtimeDevices as X, resolveEgressDecodeHwAccel as Y, storageEvictableCapability as Z, OpsLogEntrySchema as _, parseJsonUnknown as _t, COCO_TO_MACRO as a, invocationFromEncodeProfile as at, RECORDING_EXPORT_MAX_READ_BYTES as b, sleep as bt, DEFAULT_EVENTS_BAND_BUFFER_SEC as c, CAM_PROFILE_ORDER as ct, EVENT_PAD_MS as d, createEvent as dt, webrtcSessionCapability as et, EncodeProfileSchema as f, hydrateSchema as ft, NativeLeaseSettingsSchema as g, nodePin as gt, NativeLeaseAdmissionSchema as h, makeSourceBrokerId as ht, COCO_80_LABELS as i, buildFfmpegArgs as it, defineCustomActions as j, union as jt, customAction as k, record as kt, DEFAULT_NATIVE_LEASE_SETTINGS as l, DeviceFeature as lt, HF_BASE_URL as m, makeProfileBrokerId as mt, AUDIO_BACKEND_CHOICES as n, AUDIO_PRESETS as nt, DEFAULT_AUDIO_ANALYZER_CONFIG as o, isSoftwareDecode as ot, ExportRecordSchema as p, isEvent as pt, recordingCapability as q, AUDIO_MACRO_LABELS as r, Fmp4BoxSplitter as rt, DEFAULT_DETAIL_CROP_CONVENTION as s, BaseAddon as st, APPLE_SA_TO_MACRO as t, errMsg as tt, DEVICE_BACKEND_TO_FORMAT as u, DeviceType as ut, RATE_CONTROL_RELAXED as v, parseProfileBrokerId as vt, addonWidgetsSourceCapability as w, discriminatedUnion as wt, RecordingConfigSchema as x, _enum as xt, RATE_CONTROL_TIGHT as y, selectAssignedProfileSlots as yt, hfModelUrl as z };
36524
+ export { runtimeDevices as $, createHwAccelCache as A, number as At, enumerateInferenceDevices as B, RingBuffer as C, sleep as Ct, audioAnalyzerCapability as D, discriminatedUnion as Dt, audioAnalysisCapability as E, boolean as Et, deriveDetailCropRect as F, EventCategory as Ft, motionDetectionCapability as G, hfModelUrl as H, deriveRecordingMode as I, pipelineExecutorCapability as J, pickDetailCropConvention as K, detectionPipelineCapability as L, defaultDeviceFor as M, record as Mt, defineCustomActions as N, string as Nt, batteryCapability as O, lazy as Ot, deriveBatteryPresence as P, union as Pt, resolveEgressDecodeHwAccel as Q, egressTranscodeSharingKey as R, RecordingConfigSchema as S, selectAssignedProfileSlots as St, addonWidgetsSourceCapability as T, array as Tt, mapAudioLabelToMacro as U, evaluateZoneRules as V, maskUrlCredentials as W, recordingCapability as X, pipelineRunnerCapability as Y, recordingExportCapability as Z, NativeLeaseSettingsSchema as _, makeProfileBrokerId as _t, COCO_80_LABELS as a, AUDIO_PRESETS as at, RATE_CONTROL_TIGHT as b, parseJsonUnknown as bt, DEFAULT_DETAIL_CROP_CONVENTION as c, invocationFromEncodeProfile as ct, DEVICE_BACKEND_TO_FORMAT as d, CAM_PROFILE_ORDER as dt, storageEvictableCapability as et, EVENT_PAD_MS as f, DeviceFeature as ft, NativeLeaseAdmissionSchema as g, isEvent as gt, HF_BASE_URL as h, hydrateSchema as ht, BatteryStatusSchema as i, errMsg as it, customAction as j, object as jt, cameraStreamsCapability as k, literal as kt, DEFAULT_EVENTS_BAND_BUFFER_SEC as l, isSoftwareDecode as lt, ExportRecordSchema as m, createEvent as mt, AUDIO_BACKEND_CHOICES as n, supportedRuntimes as nt, COCO_TO_MACRO as o, Fmp4BoxSplitter as ot, EncodeProfileSchema as p, DeviceType as pt, pickNativeLeaseOverride as q, AUDIO_MACRO_LABELS as r, webrtcSessionCapability as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, buildFfmpegArgs as st, APPLE_SA_TO_MACRO as t, streamBrokerCapability as tt, DEFAULT_NATIVE_LEASE_SETTINGS as u, BaseAddon as ut, OpsLogEntrySchema as v, makeSourceBrokerId as vt, YAMNET_TO_MACRO as w, _enum as wt, RECORDING_EXPORT_MAX_READ_BYTES as x, parseProfileBrokerId as xt, RATE_CONTROL_RELAXED as y, nodePin as yt, egressTransportFromRequest as z };
@@ -1,4 +1,4 @@
1
- import { a as COCO_TO_MACRO, i as COCO_80_LABELS, r as AUDIO_MACRO_LABELS, z as hfModelUrl } from "./dist-Bf1SE1Ew.mjs";
1
+ import { H as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-DGp0dRiq.mjs";
2
2
  import { PerformanceObserver } from "node:perf_hooks";
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-ZSiUDGzf.js");
1
+ const require_dist = require("./dist-B57MztMq.js");
2
2
  let node_perf_hooks = require("node:perf_hooks");
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-ZSiUDGzf.js");
1
+ const require_dist = require("./dist-B57MztMq.js");
2
2
  let node_url = require("node:url");
3
3
  let node_module = require("node:module");
4
4
  let node_path = require("node:path");
@@ -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-ZSiUDGzf.js");
6
- const require_lazy_sharp = require("../lazy-sharp-CC4WNiKY.js");
5
+ const require_dist = require("../dist-B57MztMq.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-BMgRSV9x.js");
7
7
  let node_path = require("node:path");
8
8
  let node_fs = require("node:fs");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { H as motionDetectionCapability, R as evaluateZoneRules, ft as hydrateSchema, st as BaseAddon, ut as DeviceType } from "../dist-Bf1SE1Ew.mjs";
1
+ import { G as motionDetectionCapability, V as evaluateZoneRules, ht as hydrateSchema, pt as DeviceType, ut as BaseAddon } from "../dist-DGp0dRiq.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
3
3
  import { join } from "node:path";
4
4
  import { readFileSync } from "node:fs";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-ZSiUDGzf.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-VcDGoua3.js");
7
- const require_worker_protocol = require("../worker-protocol-KDfFzKgT.js");
5
+ const require_dist = require("../dist-B57MztMq.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DPA6Pu_h.js");
7
+ const require_worker_protocol = require("../worker-protocol-4L4SbSAo.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
- const require_lazy_sharp = require("../lazy-sharp-CC4WNiKY.js");
9
+ const require_lazy_sharp = require("../lazy-sharp-BMgRSV9x.js");
10
10
  const require_remote_restream = require("../remote-restream-BYbAsgUf.js");
11
11
  let sharp = require("sharp");
12
12
  sharp = require_dist.__toESM(sharp);
@@ -4350,6 +4350,12 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
4350
4350
  nodeId = "unknown";
4351
4351
  metricsSnapshotTimer = null;
4352
4352
  unsubMotionEvents = null;
4353
+ /** Devices we have positively observed reporting `battery.sleeping: true`.
4354
+ * Absent = unknown or awake; both mean "do not gate" (D49). Fed only by
4355
+ * `BatteryOnStatusChanged`, so consulting it costs nothing and can never
4356
+ * wake the camera it protects. See `enqueueOccupancyBurst`. */
4357
+ sleepingBatteryDevices = /* @__PURE__ */ new Set();
4358
+ unsubBatteryEvents = null;
4353
4359
  /** Last analyzer-detected state per device — gates the
4354
4360
  * `MotionOnMotionChanged` emit in `runMotionAnalysis` to transitions
4355
4361
  * only (otherwise we'd emit on every analyzer frame). */
@@ -4557,6 +4563,13 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
4557
4563
  if (!attachment.config.motionSources.includes(source)) return;
4558
4564
  this.runner?.reportMotion(deviceId, data.detected, source, data.regions ? [...data.regions] : void 0);
4559
4565
  });
4566
+ if (this.ctx.eventBus) this.unsubBatteryEvents = this.ctx.eventBus.subscribe({ category: require_dist.EventCategory.BatteryOnStatusChanged }, (event) => {
4567
+ const data = event.data;
4568
+ const deviceId = data.deviceId;
4569
+ if (typeof deviceId !== "number") return;
4570
+ if (data.status?.sleeping === true) this.sleepingBatteryDevices.add(deviceId);
4571
+ else this.sleepingBatteryDevices.delete(deviceId);
4572
+ });
4560
4573
  this.metricsSnapshotTimer = setInterval(() => this.emitMetricsSnapshot(), METRICS_SNAPSHOT_INTERVAL_MS);
4561
4574
  return {
4562
4575
  providers: [{
@@ -4590,6 +4603,11 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
4590
4603
  this.unsubMotionEvents();
4591
4604
  this.unsubMotionEvents = null;
4592
4605
  }
4606
+ if (this.unsubBatteryEvents) {
4607
+ this.unsubBatteryEvents();
4608
+ this.unsubBatteryEvents = null;
4609
+ }
4610
+ this.sleepingBatteryDevices.clear();
4593
4611
  this.lastAnalyzerDetected.clear();
4594
4612
  this.packageGovernor.reset();
4595
4613
  this.packageGateSkips.clear();
@@ -6660,6 +6678,10 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
6660
6678
  * parallel decoder dials.
6661
6679
  */
6662
6680
  enqueueOccupancyBurst(deviceId, frames) {
6681
+ if (this.sleepingBatteryDevices.has(deviceId)) {
6682
+ this.ctx.logger.debug("occupancy recheck skipped — battery camera is sleeping", { tags: { deviceId } });
6683
+ return;
6684
+ }
6663
6685
  this.occupancyFrames.set(deviceId, frames);
6664
6686
  if (this.occupancyBurstInFlight.has(deviceId) || this.occupancyQueued.has(deviceId)) return;
6665
6687
  this.occupancyQueued.add(deviceId);
@@ -1,6 +1,6 @@
1
- import { At as string, Ct as boolean, Dt as number, Et as literal, K as pipelineRunnerCapability, M as deriveDetailCropRect, Mt as EventCategory, Ot as object, St as array, Tt as lazy, U as pickDetailCropConvention, W as pickNativeLeaseOverride, dt as createEvent, gt as nodePin, j as defineCustomActions, k as customAction, s as DEFAULT_DETAIL_CROP_CONVENTION, st as BaseAddon, tt as errMsg, u as DEVICE_BACKEND_TO_FORMAT, xt as _enum } from "../dist-Bf1SE1Ew.mjs";
2
- import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-CjWfos2b.mjs";
3
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-p66oO1xL.mjs";
1
+ import { At as number, Et as boolean, F as deriveDetailCropRect, Ft as EventCategory, K as pickDetailCropConvention, N as defineCustomActions, Nt as string, Ot as lazy, Tt as array, Y as pipelineRunnerCapability, c as DEFAULT_DETAIL_CROP_CONVENTION, d as DEVICE_BACKEND_TO_FORMAT, it as errMsg, j as customAction, jt as object, kt as literal, mt as createEvent, q as pickNativeLeaseOverride, ut as BaseAddon, wt as _enum, yt as nodePin } from "../dist-DGp0dRiq.mjs";
2
+ import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-8vYH44kg.mjs";
3
+ import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-_e84lGuR.mjs";
4
4
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
6
6
  import { i as withDetectionIntent, n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-Ci7RXNGb.mjs";
@@ -4343,6 +4343,12 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends BaseAddon {
4343
4343
  nodeId = "unknown";
4344
4344
  metricsSnapshotTimer = null;
4345
4345
  unsubMotionEvents = null;
4346
+ /** Devices we have positively observed reporting `battery.sleeping: true`.
4347
+ * Absent = unknown or awake; both mean "do not gate" (D49). Fed only by
4348
+ * `BatteryOnStatusChanged`, so consulting it costs nothing and can never
4349
+ * wake the camera it protects. See `enqueueOccupancyBurst`. */
4350
+ sleepingBatteryDevices = /* @__PURE__ */ new Set();
4351
+ unsubBatteryEvents = null;
4346
4352
  /** Last analyzer-detected state per device — gates the
4347
4353
  * `MotionOnMotionChanged` emit in `runMotionAnalysis` to transitions
4348
4354
  * only (otherwise we'd emit on every analyzer frame). */
@@ -4550,6 +4556,13 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends BaseAddon {
4550
4556
  if (!attachment.config.motionSources.includes(source)) return;
4551
4557
  this.runner?.reportMotion(deviceId, data.detected, source, data.regions ? [...data.regions] : void 0);
4552
4558
  });
4559
+ if (this.ctx.eventBus) this.unsubBatteryEvents = this.ctx.eventBus.subscribe({ category: EventCategory.BatteryOnStatusChanged }, (event) => {
4560
+ const data = event.data;
4561
+ const deviceId = data.deviceId;
4562
+ if (typeof deviceId !== "number") return;
4563
+ if (data.status?.sleeping === true) this.sleepingBatteryDevices.add(deviceId);
4564
+ else this.sleepingBatteryDevices.delete(deviceId);
4565
+ });
4553
4566
  this.metricsSnapshotTimer = setInterval(() => this.emitMetricsSnapshot(), METRICS_SNAPSHOT_INTERVAL_MS);
4554
4567
  return {
4555
4568
  providers: [{
@@ -4583,6 +4596,11 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends BaseAddon {
4583
4596
  this.unsubMotionEvents();
4584
4597
  this.unsubMotionEvents = null;
4585
4598
  }
4599
+ if (this.unsubBatteryEvents) {
4600
+ this.unsubBatteryEvents();
4601
+ this.unsubBatteryEvents = null;
4602
+ }
4603
+ this.sleepingBatteryDevices.clear();
4586
4604
  this.lastAnalyzerDetected.clear();
4587
4605
  this.packageGovernor.reset();
4588
4606
  this.packageGateSkips.clear();
@@ -6653,6 +6671,10 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends BaseAddon {
6653
6671
  * parallel decoder dials.
6654
6672
  */
6655
6673
  enqueueOccupancyBurst(deviceId, frames) {
6674
+ if (this.sleepingBatteryDevices.has(deviceId)) {
6675
+ this.ctx.logger.debug("occupancy recheck skipped — battery camera is sleeping", { tags: { deviceId } });
6676
+ return;
6677
+ }
6656
6678
  this.occupancyFrames.set(deviceId, frames);
6657
6679
  if (this.occupancyBurstInFlight.has(deviceId) || this.occupancyQueued.has(deviceId)) return;
6658
6680
  this.occupancyQueued.add(deviceId);
@@ -1,6 +1,6 @@
1
- const require_dist = require("../dist-ZSiUDGzf.js");
1
+ const require_dist = require("../dist-B57MztMq.js");
2
2
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
3
- const require_addon_utils = require("../addon-utils-C4Cge0S0.js");
3
+ const require_addon_utils = require("../addon-utils-CQFlZXSn.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_child_process = require("node:child_process");
6
6
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { At as string, Dt as number, J as recordingExportCapability, Mt as EventCategory, N as deriveRecordingMode, Ot as object, St as array, Z as storageEvictableCapability, _ as OpsLogEntrySchema, b as RECORDING_EXPORT_MAX_READ_BYTES, c as DEFAULT_EVENTS_BAND_BUFFER_SEC, d as EVENT_PAD_MS, ft as hydrateSchema, gt as nodePin, kt as record, p as ExportRecordSchema, q as recordingCapability, st as BaseAddon, tt as errMsg, ut as DeviceType, x as RecordingConfigSchema, yt as selectAssignedProfileSlots } from "../dist-Bf1SE1Ew.mjs";
1
+ import { At as number, Ft as EventCategory, I as deriveRecordingMode, Mt as record, Nt as string, S as RecordingConfigSchema, St as selectAssignedProfileSlots, Tt as array, X as recordingCapability, Z as recordingExportCapability, et as storageEvictableCapability, f as EVENT_PAD_MS, ht as hydrateSchema, it as errMsg, jt as object, l as DEFAULT_EVENTS_BAND_BUFFER_SEC, m as ExportRecordSchema, pt as DeviceType, ut as BaseAddon, v as OpsLogEntrySchema, x as RECORDING_EXPORT_MAX_READ_BYTES, yt as nodePin } from "../dist-DGp0dRiq.mjs";
2
2
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
3
3
  import { n as createFileDataPlaneHandler, s as parseRangeHeader, t as contentTypeFor } from "../addon-utils-A2S9D7pu.mjs";
4
4
  import { randomUUID } from "node:crypto";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_worker_protocol = require("../worker-protocol-KDfFzKgT.js");
3
- const require_lazy_sharp = require("../lazy-sharp-CC4WNiKY.js");
2
+ const require_worker_protocol = require("../worker-protocol-4L4SbSAo.js");
3
+ const require_lazy_sharp = require("../lazy-sharp-BMgRSV9x.js");
4
4
  //#region src/session-decode/color-conversion.ts
5
5
  /**
6
6
  * Explicit YUV→RGB colorspace/range resolution for the session-decode worker.