From b27ddbccb85a138955f744fdf7479d5265e2c24b Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Mon, 16 Mar 2026 15:40:09 -0700 Subject: [PATCH] fix(sensors): add inlet/outlet types to SensorStage - Add DataType properties to SensorStage - Fix MicSensor import issues (remove conflicting TYPE_CHECKING) - Add numpy to main dependencies for type hints --- engine/sensors/__init__.py | 17 +++++++++++++++++ engine/sensors/mic.py | 8 +++----- pyproject.toml | 1 + 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/engine/sensors/__init__.py b/engine/sensors/__init__.py index 0e0841f..24dd5ff 100644 --- a/engine/sensors/__init__.py +++ b/engine/sensors/__init__.py @@ -151,6 +151,7 @@ class SensorStage: """Pipeline stage wrapper for sensors. Provides sensor data to the pipeline context. + Sensors don't transform data - they inject sensor values into context. """ def __init__(self, sensor: Sensor, name: str | None = None): @@ -159,6 +160,22 @@ class SensorStage: self.category = "sensor" self.optional = True + @property + def stage_type(self) -> str: + return "sensor" + + @property + def inlet_types(self) -> set: + from engine.pipeline.core import DataType + + return {DataType.ANY} + + @property + def outlet_types(self) -> set: + from engine.pipeline.core import DataType + + return {DataType.ANY} + @property def capabilities(self) -> set[str]: return {f"sensor.{self.name}"} diff --git a/engine/sensors/mic.py b/engine/sensors/mic.py index 71480fa..3d7ee72 100644 --- a/engine/sensors/mic.py +++ b/engine/sensors/mic.py @@ -18,9 +18,9 @@ try: _HAS_AUDIO = True except Exception: - _HAS_AUDIO = False np = None # type: ignore sd = None # type: ignore + _HAS_AUDIO = False from engine.events import MicLevelEvent @@ -58,7 +58,7 @@ class MicSensor(Sensor): def start(self) -> bool: """Start the microphone stream.""" - if not _HAS_AUDIO: + if not _HAS_AUDIO or sd is None: return False try: @@ -84,9 +84,7 @@ class MicSensor(Sensor): pass self._stream = None - def _audio_callback( - self, indata: np.ndarray, frames: int, time_info: Any, status: Any - ) -> None: + def _audio_callback(self, indata, frames, time_info, status) -> None: """Process audio data from sounddevice.""" if not _HAS_AUDIO or np is None: return diff --git a/pyproject.toml b/pyproject.toml index e922913..c7973ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dependencies = [ "feedparser>=6.0.0", "Pillow>=10.0.0", "pyright>=1.1.408", + "numpy>=1.24.0", ] [project.optional-dependencies]