dca4e80857
feat: add incremental OOT block path management and auto-discovery
...
Add add_block_path() and get_block_paths() MCP tools for incremental
OOT module loading with BlockPathsModel responses. On startup, auto-scan
/usr/local/share and ~/.local/share for OOT blocks so modules like
gr-lora_sdr are available without manual configuration.
2026-01-30 18:02:27 -07:00
e8b3600e60
feat: add LoRa SDR receiver with Docker runtime infrastructure
...
LoRa receiver flowgraph built programmatically via gr-mcp:
- osmosdr_source → low_pass_filter → lora_rx → message_debug
- XML-RPC server for runtime variable control (samp_rate,
center_freq) with introspection enabled
- Qt frequency sink for spectrum visualization
Docker infrastructure:
- gnuradio-lora: gr-lora_sdr OOT module from EPFL (chirp spread spectrum)
- gnuradio-lora-runtime: combined runtime with Xvfb + gr-lora_sdr
- Compose file, entrypoint, and launch script for LoRa receiver
Also includes:
- lora_scanner.py: multi-SF LoRa scanner example
- lora_infrastructure_test.py: hardware-free pipeline validation
(signal_source → throttle → null_sink + xmlrpc variable control)
- Integration tests for LoRa scanner flowgraph construction
End-to-end pipeline validated: launch_flowgraph → connect_to_container →
list_variables → get/set_variable all working through Docker + XML-RPC.
2026-01-30 13:55:40 -07:00
f3efb36435
feat: add gap analysis tools, OOT block loading, and configurable Docker image
...
Source changes spanning three features:
- Gap analysis: 12 new MCP tools (generate_code, load_flowgraph,
search_blocks, get_block_categories, flowgraph options, embedded
Python blocks, expression evaluation, block bypass, export/import)
- OOT support: load_oot_blocks tool + auto-discovery of paths like
/usr/local/share/gnuradio/grc/blocks for third-party modules
- Docker: configurable image parameter on launch_flowgraph for
running OOT-enabled containers (e.g. gnuradio-lora-runtime)
Resolves merge from feat/oot-block-paths into gap analysis work.
All 274 tests pass (204 unit + 70 integration).
2026-01-30 13:55:21 -07:00
e9ac115728
feat: add OOT (Out-of-Tree) block path loading support
...
Add load_oot_blocks MCP tool to dynamically load GNU Radio OOT modules.
Since GRC's Platform.build_library() clears all blocks on every call,
the implementation combines default block paths with OOT paths before
rebuilding. This allows loading custom blocks from:
- /usr/local/share/gnuradio/grc/blocks (locally-built)
- Custom user-specified directories
Implementation:
- PlatformMiddleware.load_oot_paths(): validates paths, combines with
defaults, rebuilds library
- PlatformProvider.load_oot_blocks(): exposes method to MCP layer
- McpPlatformProvider: registers load_oot_blocks tool
Returns useful diagnostics: added_paths, invalid_paths, and block
counts before/after reload.
2026-01-29 18:35:16 -07:00
fdcbffba1a
tests: add integration tests for runtime middleware
...
Add comprehensive integration tests that don't require Docker:
- test_xmlrpc_subprocess.py: Tests XmlRpcMiddleware against a real
subprocess-based XML-RPC server. Covers connection, variable
discovery, get/set operations, and flowgraph control (18 tests).
- test_mcp_runtime.py: Tests MCP runtime tools via FastMCP Client.
Verifies connect, disconnect, list_variables, get_variable,
set_variable, and flowgraph control work end-to-end (15 tests).
- test_fm_scanner.py: Tests signal probe functionality and FM scanner
parsing. Includes unit tests for helper functions and integration
tests for flowgraph construction with signal probe blocks (18 tests).
All 59 integration tests pass. These tests provide faster feedback
than Docker-based tests while still exercising real XML-RPC
communication and flowgraph construction.
2026-01-29 05:14:29 -07:00
27f651307e
fix: remove stale lru_cache from FlowGraphMiddleware.get_block
...
The lru_cache on get_block() caused three cache coherence bugs:
1. Removed blocks remained accessible — set_block_params would
modify a detached block object that no longer exists in the
flowgraph, so save_flowgraph would serialize stale state.
2. Re-created blocks with the same auto-generated name would
return the cached (removed) block instead of the new one.
3. Renamed blocks (via set_block_params id=...) left phantom
cache entries under the old name.
Fix: always look up blocks from the live flowgraph. Block lookup
is a linear scan of typically <20 blocks — no cache needed.
Raises KeyError instead of StopIteration for missing blocks.
2026-01-28 21:37:04 -07:00
c793208932
runtime: handle GRC servers without XML-RPC introspection
...
GRC's SimpleXMLRPCServer uses register_instance() which doesn't
expose system.listMethods. Wrap the connectivity check in a
try/except so a Fault is treated as "connected" while
ConnectionRefusedError still propagates.
2026-01-28 20:46:11 -07:00
75d19eb6dd
runtime: add dynamic port allocation for Docker containers
...
Prevent silent Docker bind failures by checking port availability
before container creation. Supports auto-allocation (port=0) and
patches compiled flowgraphs when the embedded XML-RPC port differs
from the requested port.
2026-01-28 14:28:59 -07:00
0afb2f5b6e
runtime: Phase 2 ControlPort/Thrift integration
...
Add ControlPort/Thrift support as an alternative transport to XML-RPC:
New middleware:
- ThriftMiddleware wrapping GNURadioControlPortClient
New MCP tools:
- connect_controlport, disconnect_controlport
- get_knobs (with regex filtering), set_knobs (atomic)
- get_knob_properties (units, min/max, description)
- get_performance_counters (throughput, timing, buffers)
- post_message (PMT injection to block ports)
Docker support:
- enable_controlport param in launch_flowgraph
- ENABLE_CONTROLPORT env in entrypoint.sh
- ControlPort config generation in ~/.gnuradio/config.conf
Models: KnobModel, KnobPropertiesModel, PerfCounterModel,
ThriftConnectionInfoModel, plus ContainerModel updates.
2026-01-28 12:05:32 -07:00
bfab802e05
coverage: add cross-process coverage collection for containerized flowgraphs
...
New MCP tools:
- collect_coverage(name) - combine parallel files, return summary
- generate_coverage_report(name, format) - HTML/XML/JSON reports
- combine_coverage(names) - aggregate across test runs
- delete_coverage(name?, older_than_days?) - cleanup
Modified:
- launch_flowgraph() now accepts enable_coverage parameter
- stop() uses 30s timeout for graceful shutdown (coverage needs atexit)
Docker:
- Dockerfile.gnuradio-coverage extends runtime with python3-coverage
- entrypoint-coverage.sh wraps execution with coverage run
- .coveragerc configured for GNU Radio source paths
Tests: 125 unit tests (21 new), 80% coverage
2026-01-27 13:50:17 -07:00
91a442cdf9
tests: add RuntimeProvider coverage (82% → 94%)
...
Unit tests (35):
- Mocked DockerMiddleware and XmlRpcMiddleware
- Full coverage of orchestration logic, preconditions, state tracking
Integration tests (6):
- Real Docker containers with gnuradio-runtime image
- End-to-end: launch → connect → control variables → stop
- Skip gracefully when Docker/image unavailable
Total: 112 tests, 94% coverage
2026-01-27 10:16:47 -07:00
2084c41228
runtime: Phase 1 Docker + XML-RPC control
...
Add RuntimeProvider with 17 MCP tools for controlling running flowgraphs:
- Container lifecycle: launch, list, stop, remove
- Connection: connect by URL or container name
- Variable control: list, get, set via XML-RPC introspection
- Flowgraph execution: start, stop, lock, unlock
- Visual feedback: screenshot capture, container logs
Docker is optional - 10 tools work without it for external flowgraphs.
Includes:
- DockerMiddleware wrapping docker.DockerClient
- XmlRpcMiddleware wrapping xmlrpc.client.ServerProxy
- Dockerfile with Xvfb + ImageMagick + VNC for headless QT
- 29 new unit tests (71 total)
2026-01-27 09:48:44 -07:00
fdc42c9bed
Upgrade to FastMCP 3.0 and Python 3.14
...
- Bump version to 0.2.0
- Require Python 3.14+
- Update to FastMCP 3.0.0b1 with new Client API
- Update tests for FastMCP 3.0 (Pydantic models in .data)
- Pin modern dependency versions
2026-01-26 16:46:05 -07:00
Yoel bassin
664c2adedc
add tests for FastMCP integration and update pre-commit
2026-01-05 20:52:48 +02:00
Yoel Bassin
f5a0629da7
main - fix: Fix using already populated GRC file and connection of hidden ports
2025-04-27 20:51:48 +03:00
Yoel Bassin
6d6e4d0fc2
main - fix: Change BlockModel key to name
2025-04-27 17:16:13 +03:00
Yoel Bassin
ac4105b210
main - feat: Create new BlockTypeModel and allow named ports
2025-04-27 16:58:50 +03:00
Yoel Bassin
42484d6c7d
main - feat: Implement gnuradio element validation and errors
2025-04-27 12:33:29 +03:00
Yoel Bassin
f8174d07a1
main - feat: Implement block params update
2025-04-27 00:18:18 +03:00
Yoel Bassin
5485413efd
main - feat: Implement block connection
2025-04-27 00:02:19 +03:00
Yoel Bassin
73bf514fc1
main - feat: Implement default block naming
2025-04-26 22:05:06 +03:00
Yoel Bassin
185e68f809
main - feat: Add pre-commit and fix all files
2025-04-26 21:52:32 +03:00
Yoel Bassin
37cb51f056
main - fiat: Implement BlockMiddleware and reorganize tests
2025-04-26 21:25:28 +03:00
Yoel Bassin
c5b4be6950
main - feat: Implement flowgraph block removal
2025-04-26 16:40:39 +03:00
Yoel Bassin
a4a3d124bd
main - feat: Implement basic flowgraph
2025-04-26 16:35:43 +03:00
Yoel Bassin
eb0d9fd6be
main - feat: Add real gnuradio data to tests
2025-04-26 16:08:09 +03:00
Yoel Bassin
377dab4ff9
main - feat: Create initial structure
2025-04-26 15:47:56 +03:00