@hybridlabor-api/bdb-hardware-pcb 0.1.0
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.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Main module for OpenSCAD MCP Server with remote CUDA MVS processing.
|
|
3
|
+
|
|
4
|
+
This module adds remote CUDA MVS processing capabilities to the MCP server.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Dict, Any, List, Optional
|
|
10
|
+
|
|
11
|
+
# Import remote processing components
|
|
12
|
+
from src.remote.cuda_mvs_client import CUDAMVSClient
|
|
13
|
+
from src.remote.connection_manager import CUDAMVSConnectionManager
|
|
14
|
+
from src.config import REMOTE_CUDA_MVS
|
|
15
|
+
|
|
16
|
+
# Configure logging
|
|
17
|
+
logging.basicConfig(level=logging.INFO)
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
# Initialize remote processing components if enabled
|
|
21
|
+
remote_connection_manager = None
|
|
22
|
+
remote_jobs = {}
|
|
23
|
+
|
|
24
|
+
def initialize_remote_processing():
|
|
25
|
+
"""
|
|
26
|
+
Initialize remote CUDA MVS processing components.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
CUDAMVSConnectionManager instance if enabled, None otherwise
|
|
30
|
+
"""
|
|
31
|
+
global remote_connection_manager
|
|
32
|
+
|
|
33
|
+
if REMOTE_CUDA_MVS["ENABLED"]:
|
|
34
|
+
logger.info("Initializing remote CUDA MVS connection manager")
|
|
35
|
+
remote_connection_manager = CUDAMVSConnectionManager(
|
|
36
|
+
api_key=REMOTE_CUDA_MVS["API_KEY"],
|
|
37
|
+
discovery_port=REMOTE_CUDA_MVS["DISCOVERY_PORT"],
|
|
38
|
+
use_lan_discovery=REMOTE_CUDA_MVS["USE_LAN_DISCOVERY"],
|
|
39
|
+
server_url=REMOTE_CUDA_MVS["SERVER_URL"] if REMOTE_CUDA_MVS["SERVER_URL"] else None
|
|
40
|
+
)
|
|
41
|
+
return remote_connection_manager
|
|
42
|
+
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def discover_remote_servers():
|
|
46
|
+
"""
|
|
47
|
+
Discover remote CUDA MVS servers on the network.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
List of discovered servers
|
|
51
|
+
"""
|
|
52
|
+
if not remote_connection_manager:
|
|
53
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
54
|
+
return []
|
|
55
|
+
|
|
56
|
+
return remote_connection_manager.discover_servers()
|
|
57
|
+
|
|
58
|
+
def get_server_status(server_id: str):
|
|
59
|
+
"""
|
|
60
|
+
Get the status of a remote CUDA MVS server.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
server_id: ID of the server to get status for
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Server status information
|
|
67
|
+
"""
|
|
68
|
+
if not remote_connection_manager:
|
|
69
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
return remote_connection_manager.get_server_status(server_id)
|
|
73
|
+
|
|
74
|
+
def upload_images_to_server(server_id: str, image_paths: List[str], job_id: Optional[str] = None):
|
|
75
|
+
"""
|
|
76
|
+
Upload images to a remote CUDA MVS server.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
server_id: ID of the server to upload to
|
|
80
|
+
image_paths: List of image paths to upload
|
|
81
|
+
job_id: Optional job ID to use
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Job information
|
|
85
|
+
"""
|
|
86
|
+
if not remote_connection_manager:
|
|
87
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
return remote_connection_manager.upload_images(server_id, image_paths, job_id)
|
|
91
|
+
|
|
92
|
+
def process_images_remotely(server_id: str, job_id: str, params: Dict[str, Any] = None):
|
|
93
|
+
"""
|
|
94
|
+
Process uploaded images on a remote CUDA MVS server.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
server_id: ID of the server to process on
|
|
98
|
+
job_id: Job ID of the uploaded images
|
|
99
|
+
params: Optional processing parameters
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
Job status information
|
|
103
|
+
"""
|
|
104
|
+
if not remote_connection_manager:
|
|
105
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
# Set default parameters if not provided
|
|
109
|
+
if params is None:
|
|
110
|
+
params = {
|
|
111
|
+
"quality": REMOTE_CUDA_MVS["DEFAULT_RECONSTRUCTION_QUALITY"],
|
|
112
|
+
"output_format": REMOTE_CUDA_MVS["DEFAULT_OUTPUT_FORMAT"]
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Start processing
|
|
116
|
+
result = remote_connection_manager.process_job(server_id, job_id, params)
|
|
117
|
+
|
|
118
|
+
# Store job information
|
|
119
|
+
if result and "job_id" in result:
|
|
120
|
+
remote_jobs[result["job_id"]] = {
|
|
121
|
+
"server_id": server_id,
|
|
122
|
+
"job_id": result["job_id"],
|
|
123
|
+
"status": result.get("status", "processing"),
|
|
124
|
+
"params": params
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return result
|
|
128
|
+
|
|
129
|
+
def get_job_status(job_id: str):
|
|
130
|
+
"""
|
|
131
|
+
Get the status of a remote processing job.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
job_id: ID of the job to get status for
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Job status information
|
|
138
|
+
"""
|
|
139
|
+
if not remote_connection_manager:
|
|
140
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
# Check if job exists
|
|
144
|
+
if job_id not in remote_jobs:
|
|
145
|
+
logger.warning(f"Job with ID {job_id} not found")
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
# Get job information
|
|
149
|
+
job_info = remote_jobs[job_id]
|
|
150
|
+
|
|
151
|
+
# Get status from server
|
|
152
|
+
status = remote_connection_manager.get_job_status(job_info["server_id"], job_id)
|
|
153
|
+
|
|
154
|
+
# Update job information
|
|
155
|
+
if status:
|
|
156
|
+
job_info["status"] = status.get("status", job_info["status"])
|
|
157
|
+
job_info["progress"] = status.get("progress", 0)
|
|
158
|
+
job_info["message"] = status.get("message", "")
|
|
159
|
+
|
|
160
|
+
return job_info
|
|
161
|
+
|
|
162
|
+
def download_model(job_id: str, output_dir: Optional[str] = None):
|
|
163
|
+
"""
|
|
164
|
+
Download a processed model from a remote CUDA MVS server.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
job_id: ID of the job to download model for
|
|
168
|
+
output_dir: Optional directory to save the model to
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Model information
|
|
172
|
+
"""
|
|
173
|
+
if not remote_connection_manager:
|
|
174
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
175
|
+
return None
|
|
176
|
+
|
|
177
|
+
# Check if job exists
|
|
178
|
+
if job_id not in remote_jobs:
|
|
179
|
+
logger.warning(f"Job with ID {job_id} not found")
|
|
180
|
+
return None
|
|
181
|
+
|
|
182
|
+
# Get job information
|
|
183
|
+
job_info = remote_jobs[job_id]
|
|
184
|
+
|
|
185
|
+
# Set default output directory if not provided
|
|
186
|
+
if output_dir is None:
|
|
187
|
+
output_dir = os.path.join(REMOTE_CUDA_MVS["OUTPUT_DIR"], job_id)
|
|
188
|
+
|
|
189
|
+
# Create output directory if it doesn't exist
|
|
190
|
+
os.makedirs(output_dir, exist_ok=True)
|
|
191
|
+
|
|
192
|
+
# Download model
|
|
193
|
+
result = remote_connection_manager.download_model(job_info["server_id"], job_id, output_dir)
|
|
194
|
+
|
|
195
|
+
# Update job information
|
|
196
|
+
if result:
|
|
197
|
+
job_info["model_path"] = result.get("model_path")
|
|
198
|
+
job_info["point_cloud_path"] = result.get("point_cloud_path")
|
|
199
|
+
job_info["completed"] = True
|
|
200
|
+
|
|
201
|
+
return result
|
|
202
|
+
|
|
203
|
+
def cancel_job(job_id: str):
|
|
204
|
+
"""
|
|
205
|
+
Cancel a remote processing job.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
job_id: ID of the job to cancel
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
Cancellation result
|
|
212
|
+
"""
|
|
213
|
+
if not remote_connection_manager:
|
|
214
|
+
logger.warning("Remote CUDA MVS processing is not enabled")
|
|
215
|
+
return None
|
|
216
|
+
|
|
217
|
+
# Check if job exists
|
|
218
|
+
if job_id not in remote_jobs:
|
|
219
|
+
logger.warning(f"Job with ID {job_id} not found")
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
# Get job information
|
|
223
|
+
job_info = remote_jobs[job_id]
|
|
224
|
+
|
|
225
|
+
# Cancel job
|
|
226
|
+
result = remote_connection_manager.cancel_job(job_info["server_id"], job_id)
|
|
227
|
+
|
|
228
|
+
# Update job information
|
|
229
|
+
if result and result.get("cancelled", False):
|
|
230
|
+
job_info["status"] = "cancelled"
|
|
231
|
+
job_info["message"] = "Job cancelled by user"
|
|
232
|
+
|
|
233
|
+
return result
|
|
234
|
+
|
|
235
|
+
# MCP tool functions for remote processing
|
|
236
|
+
|
|
237
|
+
def discover_remote_cuda_mvs_servers():
|
|
238
|
+
"""
|
|
239
|
+
MCP tool function to discover remote CUDA MVS servers.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
Dictionary with discovered servers
|
|
243
|
+
"""
|
|
244
|
+
servers = discover_remote_servers()
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
"servers": servers,
|
|
248
|
+
"count": len(servers)
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
def get_remote_server_status(server_id: str):
|
|
252
|
+
"""
|
|
253
|
+
MCP tool function to get the status of a remote CUDA MVS server.
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
server_id: ID of the server to get status for
|
|
257
|
+
|
|
258
|
+
Returns:
|
|
259
|
+
Dictionary with server status
|
|
260
|
+
"""
|
|
261
|
+
status = get_server_status(server_id)
|
|
262
|
+
|
|
263
|
+
if not status:
|
|
264
|
+
raise ValueError(f"Failed to get status for server with ID {server_id}")
|
|
265
|
+
|
|
266
|
+
return status
|
|
267
|
+
|
|
268
|
+
def process_images_with_remote_cuda_mvs(
|
|
269
|
+
server_id: str,
|
|
270
|
+
image_paths: List[str],
|
|
271
|
+
quality: str = REMOTE_CUDA_MVS["DEFAULT_RECONSTRUCTION_QUALITY"],
|
|
272
|
+
output_format: str = REMOTE_CUDA_MVS["DEFAULT_OUTPUT_FORMAT"],
|
|
273
|
+
wait_for_completion: bool = REMOTE_CUDA_MVS["WAIT_FOR_COMPLETION"]
|
|
274
|
+
):
|
|
275
|
+
"""
|
|
276
|
+
MCP tool function to process images with remote CUDA MVS.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
server_id: ID of the server to process on
|
|
280
|
+
image_paths: List of image paths to process
|
|
281
|
+
quality: Reconstruction quality (low, normal, high)
|
|
282
|
+
output_format: Output format (obj, ply)
|
|
283
|
+
wait_for_completion: Whether to wait for job completion
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
Dictionary with job information
|
|
287
|
+
"""
|
|
288
|
+
# Upload images
|
|
289
|
+
upload_result = upload_images_to_server(server_id, image_paths)
|
|
290
|
+
|
|
291
|
+
if not upload_result or "job_id" not in upload_result:
|
|
292
|
+
raise ValueError("Failed to upload images to server")
|
|
293
|
+
|
|
294
|
+
job_id = upload_result["job_id"]
|
|
295
|
+
|
|
296
|
+
# Process images
|
|
297
|
+
process_result = process_images_remotely(
|
|
298
|
+
server_id,
|
|
299
|
+
job_id,
|
|
300
|
+
{
|
|
301
|
+
"quality": quality,
|
|
302
|
+
"output_format": output_format
|
|
303
|
+
}
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if not process_result:
|
|
307
|
+
raise ValueError(f"Failed to process images for job {job_id}")
|
|
308
|
+
|
|
309
|
+
# Wait for completion if requested
|
|
310
|
+
if wait_for_completion:
|
|
311
|
+
import time
|
|
312
|
+
|
|
313
|
+
while True:
|
|
314
|
+
status = get_job_status(job_id)
|
|
315
|
+
|
|
316
|
+
if not status:
|
|
317
|
+
raise ValueError(f"Failed to get status for job {job_id}")
|
|
318
|
+
|
|
319
|
+
if status["status"] in ["completed", "failed", "cancelled"]:
|
|
320
|
+
break
|
|
321
|
+
|
|
322
|
+
time.sleep(REMOTE_CUDA_MVS["POLL_INTERVAL"])
|
|
323
|
+
|
|
324
|
+
if status["status"] == "completed":
|
|
325
|
+
# Download model
|
|
326
|
+
download_result = download_model(job_id)
|
|
327
|
+
|
|
328
|
+
if not download_result:
|
|
329
|
+
raise ValueError(f"Failed to download model for job {job_id}")
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
"job_id": job_id,
|
|
333
|
+
"status": "completed",
|
|
334
|
+
"model_path": download_result.get("model_path"),
|
|
335
|
+
"point_cloud_path": download_result.get("point_cloud_path")
|
|
336
|
+
}
|
|
337
|
+
else:
|
|
338
|
+
return {
|
|
339
|
+
"job_id": job_id,
|
|
340
|
+
"status": status["status"],
|
|
341
|
+
"message": status.get("message", "")
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
# Return job information without waiting
|
|
345
|
+
return {
|
|
346
|
+
"job_id": job_id,
|
|
347
|
+
"status": "processing",
|
|
348
|
+
"server_id": server_id
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
def get_remote_job_status(job_id: str):
|
|
352
|
+
"""
|
|
353
|
+
MCP tool function to get the status of a remote processing job.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
job_id: ID of the job to get status for
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Dictionary with job status
|
|
360
|
+
"""
|
|
361
|
+
status = get_job_status(job_id)
|
|
362
|
+
|
|
363
|
+
if not status:
|
|
364
|
+
raise ValueError(f"Failed to get status for job with ID {job_id}")
|
|
365
|
+
|
|
366
|
+
return status
|
|
367
|
+
|
|
368
|
+
def download_remote_model(job_id: str, output_dir: Optional[str] = None):
|
|
369
|
+
"""
|
|
370
|
+
MCP tool function to download a processed model from a remote CUDA MVS server.
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
job_id: ID of the job to download model for
|
|
374
|
+
output_dir: Optional directory to save the model to
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Dictionary with model information
|
|
378
|
+
"""
|
|
379
|
+
result = download_model(job_id, output_dir)
|
|
380
|
+
|
|
381
|
+
if not result:
|
|
382
|
+
raise ValueError(f"Failed to download model for job with ID {job_id}")
|
|
383
|
+
|
|
384
|
+
return result
|
|
385
|
+
|
|
386
|
+
def cancel_remote_job(job_id: str):
|
|
387
|
+
"""
|
|
388
|
+
MCP tool function to cancel a remote processing job.
|
|
389
|
+
|
|
390
|
+
Args:
|
|
391
|
+
job_id: ID of the job to cancel
|
|
392
|
+
|
|
393
|
+
Returns:
|
|
394
|
+
Dictionary with cancellation result
|
|
395
|
+
"""
|
|
396
|
+
result = cancel_job(job_id)
|
|
397
|
+
|
|
398
|
+
if not result:
|
|
399
|
+
raise ValueError(f"Failed to cancel job with ID {job_id}")
|
|
400
|
+
|
|
401
|
+
return result
|
|
File without changes
|