v0.3.14
Highlights
pip install syncfieldis now enough for Recipe 1. The base install shipsUVCWebcamStreamand the browser viewer, covering the canonical iPhone + Mac webcam quickstart end-to-end with zero extras.- Clean install hints. Importing an adapter whose extra is missing now raises
ImportErrorwith the exactpip install 'syncfield[<extra>]'line, instead of the silent name-vanishes behaviour the oldtry/except ImportError: passpattern produced. SessionOrchestrator.last_episode_dir. Afterstop(), the orchestrator rotatesoutput_dirto a fresh path for the next recording. The newlast_episode_dirproperty points at the directory the just-finished episode wrote into, so callers can locate their files without racing the rotation.
Changes
Packaging (pyproject.toml)
[project.dependencies]now includesav,numpy,fastapi,uvicorn[standard],Pillow. These were previously split across theuvcandviewerextras; both extras are removed (legacysyncfield[uvc,viewer]still resolves with a pip warning).- The
uvc/oakextras gainednumpy>=1.21, which was missing and used to breakUVCWebcamStream/OakCameraStreamon a clean extras-only install.
syncfield.adapters
- Optional adapters (
HostAudioStream,BLEImuGenericStream+ profiles,OgloTactileStream,MetaQuestCameraStream,Go3SStream) are eager-imported and registered with the discovery system when their extra is installed. When the extra is missing, referencing the adapter raisesImportError(propagates throughfrom … import …) with an install hint instead of the name silently disappearing. OakCameraStreamremains truly lazy even whensyncfield[oak]is installed so depthai's process-wideSIGSEGV/SIGABRThandlers are only loaded by sessions that actually use OAK hardware.__dir__()added so missing-extra adapters still surface indir(syncfield.adapters)and IDE tab completion.
SessionOrchestrator
- New
last_episode_dir: Optional[Path]property — snapshotsoutput_dirbefore_prepare_next_episode()rotates it. wait_for_leader_stopped()precondition tightened to check_session_clock is None(since mDNS surface moves to__init__in refactor64dd0fd, the old_browser is Noneguard is a no-op).
Docs & Examples
- Root
README.mdrewritten from the legacy 0.1SyncSession.stamp()/record()API to the currentSessionOrchestrator/StreamSPI. - Quickstart polished: Recipe 1 is now
pip install syncfieldflat; Recipe 2 requires only[ble,camera]. examples/README.mdcollapsed to the single canonical install line with a per-example extras column.
Tests
25 pre-existing unit-test failures fixed; full tests/unit suite (786 tests) passes.