@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.
Files changed (192) hide show
  1. package/README.md +116 -0
  2. package/config/mcp/antigravity.json +22 -0
  3. package/config/mcp/claude.json +22 -0
  4. package/config/mcp/codex.toml +25 -0
  5. package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
  6. package/docs/review_documentation.md +121 -0
  7. package/installer.js +358 -0
  8. package/mcp_servers/kicad-mcp-server/.env.example +22 -0
  9. package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
  10. package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
  11. package/mcp_servers/kicad-mcp-server/README.md +316 -0
  12. package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
  13. package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
  14. package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
  15. package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
  16. package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
  17. package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
  18. package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
  19. package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
  20. package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
  21. package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
  22. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
  23. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
  24. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
  25. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
  26. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
  27. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
  28. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
  29. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
  30. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
  31. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
  32. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
  33. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
  34. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
  35. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
  36. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
  37. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
  38. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
  39. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
  40. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
  41. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
  42. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
  43. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
  44. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
  45. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
  46. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
  47. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
  48. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
  49. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
  50. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
  51. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
  52. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
  53. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
  54. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
  55. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
  56. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
  57. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
  58. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
  59. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
  60. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
  61. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
  62. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
  63. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
  64. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
  65. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
  66. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
  67. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
  68. package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
  69. package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
  70. package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
  71. package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
  72. package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
  73. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
  74. package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
  75. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
  76. package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
  77. package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
  78. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
  79. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
  80. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
  81. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
  82. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
  83. package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
  84. package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
  85. package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
  86. package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
  87. package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
  88. package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
  89. package/mcp_servers/openscad-mcp-server/README.md +154 -0
  90. package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
  91. package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
  92. package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
  93. package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
  94. package/mcp_servers/openscad-mcp-server/glama.json +4 -0
  95. package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
  96. package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
  97. package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
  98. package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
  99. package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
  100. package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
  101. package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
  102. package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
  103. package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
  104. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
  105. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
  106. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
  107. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
  108. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
  109. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
  110. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
  111. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
  112. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
  113. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
  114. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
  115. package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
  116. package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
  117. package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
  118. package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
  119. package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
  120. package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
  121. package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
  122. package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
  123. package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
  124. package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
  125. package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
  126. package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
  127. package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
  128. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
  129. package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
  130. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
  131. package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
  132. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
  133. package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
  134. package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
  135. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
  136. package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
  137. package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
  138. package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
  139. package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
  140. package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
  141. package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
  142. package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
  143. package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
  144. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
  145. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
  146. package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
  147. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
  148. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
  149. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
  150. package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
  151. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
  152. package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
  153. package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
  154. package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
  155. package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
  156. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
  157. package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
  158. package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
  159. package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
  160. package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
  161. package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
  162. package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
  163. package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
  164. package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
  165. package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
  166. package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
  167. package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
  168. package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
  169. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
  170. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
  171. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
  172. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
  173. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
  174. package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
  175. package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
  176. package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
  177. package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
  178. package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
  179. package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
  180. package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
  181. package/package.json +44 -0
  182. package/scripts/install_mcps.sh +86 -0
  183. package/scripts/openscad_wrapper.sh +62 -0
  184. package/scripts/run_kicad_mcp.sh +25 -0
  185. package/scripts/run_openscad_mcp.sh +41 -0
  186. package/scripts/test_mcp_connection.py +626 -0
  187. package/scripts/test_mcp_connection.sh +168 -0
  188. package/skills/code-first-hardware-design/SKILL.md +260 -0
  189. package/skills/pcb-constraint-definition/SKILL.md +236 -0
  190. package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
  191. package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
  192. 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