solidworks-mcp-python 1.5.0__py3-none-any.whl

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 (115) hide show
  1. solidworks_mcp/__init__.py +57 -0
  2. solidworks_mcp/adapters/__init__.py +40 -0
  3. solidworks_mcp/adapters/base.py +1882 -0
  4. solidworks_mcp/adapters/circuit_breaker.py +2052 -0
  5. solidworks_mcp/adapters/com_executor.py +252 -0
  6. solidworks_mcp/adapters/complexity_analyzer.py +272 -0
  7. solidworks_mcp/adapters/connection_pool.py +1884 -0
  8. solidworks_mcp/adapters/factory.py +366 -0
  9. solidworks_mcp/adapters/intelligent_router.py +218 -0
  10. solidworks_mcp/adapters/mock_adapter.py +4016 -0
  11. solidworks_mcp/adapters/pywin32_adapter.py +2842 -0
  12. solidworks_mcp/adapters/solidworks/__init__.py +17 -0
  13. solidworks_mcp/adapters/solidworks/bitmap.py +180 -0
  14. solidworks_mcp/adapters/solidworks/com_utils.py +56 -0
  15. solidworks_mcp/adapters/solidworks/dimension_layout.py +753 -0
  16. solidworks_mcp/adapters/solidworks/documentation.py +1476 -0
  17. solidworks_mcp/adapters/solidworks/drawing_standard.py +1993 -0
  18. solidworks_mcp/adapters/solidworks/face_selection.py +392 -0
  19. solidworks_mcp/adapters/solidworks/features.py +3362 -0
  20. solidworks_mcp/adapters/solidworks/io.py +3649 -0
  21. solidworks_mcp/adapters/solidworks/rebuild_diagnostics.py +269 -0
  22. solidworks_mcp/adapters/solidworks/rebuild_inspector.py +146 -0
  23. solidworks_mcp/adapters/solidworks/selection.py +308 -0
  24. solidworks_mcp/adapters/solidworks/sketch.py +2545 -0
  25. solidworks_mcp/adapters/sw_feature_errors.py +66 -0
  26. solidworks_mcp/adapters/sw_type_info.py +317 -0
  27. solidworks_mcp/adapters/vba_adapter.py +318 -0
  28. solidworks_mcp/adapters/vba_macro_executor.py +215 -0
  29. solidworks_mcp/agents/__init__.py +68 -0
  30. solidworks_mcp/agents/design_knowledge/assembly_patterns.md +127 -0
  31. solidworks_mcp/agents/design_knowledge/hinges.md +118 -0
  32. solidworks_mcp/agents/design_knowledge/snap_fits.md +93 -0
  33. solidworks_mcp/agents/design_knowledge/solidworks_basics.md +3 -0
  34. solidworks_mcp/agents/design_knowledge/tolerancing.md +128 -0
  35. solidworks_mcp/agents/harness.py +216 -0
  36. solidworks_mcp/agents/history_db.py +1508 -0
  37. solidworks_mcp/agents/retrieval_index.py +164 -0
  38. solidworks_mcp/agents/schemas.py +165 -0
  39. solidworks_mcp/agents/smoke_test.py +285 -0
  40. solidworks_mcp/agents/soc_exporter.py +650 -0
  41. solidworks_mcp/agents/soc_pickup.py +332 -0
  42. solidworks_mcp/agents/soc_rewind.py +221 -0
  43. solidworks_mcp/agents/vector_rag.py +665 -0
  44. solidworks_mcp/cache/__init__.py +5 -0
  45. solidworks_mcp/cache/response_cache.py +164 -0
  46. solidworks_mcp/config.py +729 -0
  47. solidworks_mcp/exceptions.py +37 -0
  48. solidworks_mcp/security/__init__.py +68 -0
  49. solidworks_mcp/security/auth.py +128 -0
  50. solidworks_mcp/security/cors.py +27 -0
  51. solidworks_mcp/security/rate_limiting.py +90 -0
  52. solidworks_mcp/security/runtime.py +155 -0
  53. solidworks_mcp/server.py +777 -0
  54. solidworks_mcp/server_cli_fixed.py +120 -0
  55. solidworks_mcp/setup/__init__.py +1 -0
  56. solidworks_mcp/setup/cli.py +399 -0
  57. solidworks_mcp/setup/clients.py +157 -0
  58. solidworks_mcp/setup/config_file.py +230 -0
  59. solidworks_mcp/setup/handshake.py +202 -0
  60. solidworks_mcp/setup/launcher.py +102 -0
  61. solidworks_mcp/setup/legacy.py +100 -0
  62. solidworks_mcp/setup/registration.py +193 -0
  63. solidworks_mcp/setup/solidworks.py +49 -0
  64. solidworks_mcp/tools/__init__.py +64 -0
  65. solidworks_mcp/tools/analysis.py +723 -0
  66. solidworks_mcp/tools/automation.py +578 -0
  67. solidworks_mcp/tools/docs_discovery.py +1476 -0
  68. solidworks_mcp/tools/drawing.py +1015 -0
  69. solidworks_mcp/tools/drawing_analysis.py +456 -0
  70. solidworks_mcp/tools/drawing_automation.py +627 -0
  71. solidworks_mcp/tools/engineering_data.py +466 -0
  72. solidworks_mcp/tools/error_classifier.py +232 -0
  73. solidworks_mcp/tools/export.py +833 -0
  74. solidworks_mcp/tools/file_facts.py +40 -0
  75. solidworks_mcp/tools/file_management.py +1473 -0
  76. solidworks_mcp/tools/input_compat.py +17 -0
  77. solidworks_mcp/tools/macro_recording.py +464 -0
  78. solidworks_mcp/tools/modeling.py +2360 -0
  79. solidworks_mcp/tools/sketching.py +1422 -0
  80. solidworks_mcp/tools/template_management.py +367 -0
  81. solidworks_mcp/tools/tool_boundary.py +280 -0
  82. solidworks_mcp/tools/vba_generation.py +1145 -0
  83. solidworks_mcp/ui/__init__.py +9 -0
  84. solidworks_mcp/ui/local_llm.py +725 -0
  85. solidworks_mcp/ui/routers/__init__.py +10 -0
  86. solidworks_mcp/ui/routers/checkpoint.py +24 -0
  87. solidworks_mcp/ui/routers/docs.py +47 -0
  88. solidworks_mcp/ui/routers/llm.py +83 -0
  89. solidworks_mcp/ui/routers/local_model.py +69 -0
  90. solidworks_mcp/ui/routers/model.py +75 -0
  91. solidworks_mcp/ui/routers/preview.py +38 -0
  92. solidworks_mcp/ui/routers/session.py +161 -0
  93. solidworks_mcp/ui/routers/viewer.py +154 -0
  94. solidworks_mcp/ui/schemas.py +502 -0
  95. solidworks_mcp/ui/server.py +298 -0
  96. solidworks_mcp/ui/service.py +481 -0
  97. solidworks_mcp/ui/services/__init__.py +136 -0
  98. solidworks_mcp/ui/services/_utils.py +958 -0
  99. solidworks_mcp/ui/services/checkpoint_service.py +1110 -0
  100. solidworks_mcp/ui/services/docs_service.py +282 -0
  101. solidworks_mcp/ui/services/llm_service.py +956 -0
  102. solidworks_mcp/ui/services/model_service.py +459 -0
  103. solidworks_mcp/ui/services/parameter_repair_service.py +314 -0
  104. solidworks_mcp/ui/services/preview_service.py +489 -0
  105. solidworks_mcp/ui/services/session_service.py +1389 -0
  106. solidworks_mcp/utils/__init__.py +9 -0
  107. solidworks_mcp/utils/feature_tree_classifier.py +342 -0
  108. solidworks_mcp/utils/logging.py +76 -0
  109. solidworks_mcp/utils/validation.py +77 -0
  110. solidworks_mcp/version.py +8 -0
  111. solidworks_mcp_python-1.5.0.dist-info/METADATA +410 -0
  112. solidworks_mcp_python-1.5.0.dist-info/RECORD +115 -0
  113. solidworks_mcp_python-1.5.0.dist-info/WHEEL +4 -0
  114. solidworks_mcp_python-1.5.0.dist-info/entry_points.txt +3 -0
  115. solidworks_mcp_python-1.5.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,314 @@
1
+ """Parameter validation and repair service for checkpoint tool parameters.
2
+
3
+ Validates checkpoint planned actions against known tool signatures and provides
4
+ repair suggestions or auto-completion strategies for missing parameters.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Any
10
+
11
+ from loguru import logger
12
+
13
+ # Tool parameter schemas: required parameters per tool name
14
+ TOOL_PARAM_SCHEMAS: dict[str, dict[str, Any]] = {
15
+ "create_part": {
16
+ "required": ["part_name"],
17
+ "optional": [],
18
+ "description": "Create a new part document.",
19
+ },
20
+ "create_assembly": {
21
+ "required": ["assembly_name"],
22
+ "optional": [],
23
+ "description": "Create a new assembly document.",
24
+ },
25
+ "open_model": {
26
+ "required": ["model_path"],
27
+ "optional": [],
28
+ "description": "Open an existing SolidWorks model.",
29
+ },
30
+ "create_sketch": {
31
+ "required": ["sketch_plane"],
32
+ "optional": ["sketch_name"],
33
+ "description": "Create a sketch on the specified plane.",
34
+ },
35
+ "exit_sketch": {
36
+ "required": [],
37
+ "optional": [],
38
+ "description": "Exit the current sketch.",
39
+ },
40
+ "save_file": {
41
+ "required": ["file_path"],
42
+ "optional": [],
43
+ "description": "Save the active document.",
44
+ },
45
+ "add_line": {
46
+ "required": ["line_mm"], # or ["line_start_mm", "line_end_mm"]
47
+ "optional": [],
48
+ "description": "Add a line to the current sketch.",
49
+ "aliases": [["line_start_mm", "line_end_mm"]], # Alternative param format
50
+ },
51
+ "add_rectangle": {
52
+ "required": ["rectangle_mm"],
53
+ "optional": [],
54
+ "description": "Add a rectangle to the current sketch.",
55
+ },
56
+ "add_circle": {
57
+ "required": ["circle_center_mm", "circle_radius_mm"],
58
+ "optional": [],
59
+ "description": "Add a circle to the current sketch.",
60
+ },
61
+ "add_arc": {
62
+ "required": ["arc_center_mm", "arc_start_mm", "arc_end_mm"],
63
+ "optional": [],
64
+ "description": "Add an arc to the current sketch.",
65
+ },
66
+ "add_centerline": {
67
+ "required": ["centerline_mm"],
68
+ "optional": [],
69
+ "description": "Add a centerline to the current sketch.",
70
+ },
71
+ "create_extrusion": {
72
+ "required": ["depth"],
73
+ "optional": [
74
+ "sketch_name",
75
+ "thin_feature",
76
+ "thin_thickness",
77
+ "thin_thickness_mm",
78
+ "both_directions",
79
+ "auto_fillet_corners",
80
+ "fillet_corners_radius",
81
+ ],
82
+ "description": "Create an extrusion from the current sketch.",
83
+ "aliases": [["depth_mm"]],
84
+ },
85
+ "create_cut": {
86
+ "required": ["depth"],
87
+ "optional": ["sketch_name", "blind_or_through"],
88
+ "description": "Create a cut (subtractive feature) from the current sketch.",
89
+ "aliases": [["depth_mm"]],
90
+ },
91
+ "create_cut_extrude": {
92
+ "required": ["depth"],
93
+ "optional": [],
94
+ "description": "Create a cut extrusion from the current sketch.",
95
+ "aliases": [["depth_mm"]],
96
+ },
97
+ "export_image": {
98
+ "required": ["file_path", "format_type"],
99
+ "optional": ["width", "height", "view_orientation"],
100
+ "description": "Export the current model as an image.",
101
+ "aliases": [["export_image"]],
102
+ },
103
+ "check_sketch_fully_defined": {
104
+ "required": [],
105
+ "optional": ["sketch_name"],
106
+ "description": "Check if the current or named sketch is fully defined.",
107
+ },
108
+ }
109
+
110
+
111
+ class ParameterRepairResult:
112
+ """Result of parameter validation and repair."""
113
+
114
+ def __init__(
115
+ self,
116
+ is_valid: bool,
117
+ missing_keys: list[str] | None = None,
118
+ suggestions: dict[str, Any] | None = None,
119
+ repaired_plan: dict[str, Any] | None = None,
120
+ message: str = "",
121
+ ):
122
+ self.is_valid = is_valid
123
+ self.missing_keys = missing_keys or []
124
+ self.suggestions = suggestions or {}
125
+ self.repaired_plan = repaired_plan
126
+ self.message = message
127
+
128
+
129
+ def validate_checkpoint_parameters(
130
+ planned: dict[str, Any], tool_name: str
131
+ ) -> ParameterRepairResult:
132
+ """Validate that a planned action has all required parameters for a tool.
133
+
134
+ Args:
135
+ planned: Checkpoint planned-action dict.
136
+ tool_name: Name of the tool being validated.
137
+
138
+ Returns:
139
+ ParameterRepairResult with validation status and repair suggestions.
140
+ """
141
+ if tool_name not in TOOL_PARAM_SCHEMAS:
142
+ logger.warning(f"Unknown tool: {tool_name}")
143
+ return ParameterRepairResult(
144
+ is_valid=True, # Assume unknown tools are valid (may be new tools)
145
+ message=f"Tool {tool_name} not recognized; skipping validation.",
146
+ )
147
+
148
+ schema = TOOL_PARAM_SCHEMAS[tool_name]
149
+ required_keys = schema["required"]
150
+ missing_keys: list[str] = []
151
+
152
+ # Check required keys
153
+ for key in required_keys:
154
+ if key not in planned:
155
+ # Check if this key has aliases (alternative parameter formats)
156
+ has_alias = False
157
+ if "aliases" in schema:
158
+ for alias_group in schema["aliases"]:
159
+ if isinstance(alias_group, list) and all(
160
+ k in planned for k in alias_group
161
+ ):
162
+ has_alias = True
163
+ break
164
+ if not has_alias:
165
+ missing_keys.append(key)
166
+
167
+ if missing_keys:
168
+ return ParameterRepairResult(
169
+ is_valid=False,
170
+ missing_keys=missing_keys,
171
+ suggestions=_generate_repair_suggestions(tool_name, planned),
172
+ message=f"Tool '{tool_name}' is missing required parameter(s): {', '.join(missing_keys)}",
173
+ )
174
+
175
+ return ParameterRepairResult(
176
+ is_valid=True, message=f"Tool '{tool_name}' validation passed."
177
+ )
178
+
179
+
180
+ def _generate_repair_suggestions(
181
+ tool_name: str, planned: dict[str, Any]
182
+ ) -> dict[str, Any]:
183
+ """Generate repair suggestions for incomplete planned actions.
184
+
185
+ Args:
186
+ tool_name: Name of the tool.
187
+ planned: Current planned-action dict.
188
+
189
+ Returns:
190
+ Dict with suggested parameter values or instructions.
191
+ """
192
+ schema = TOOL_PARAM_SCHEMAS.get(tool_name, {})
193
+ required_keys = schema.get("required", [])
194
+ suggestions: dict[str, Any] = {}
195
+
196
+ for key in required_keys:
197
+ if key not in planned:
198
+ # Generate context-aware suggestions
199
+ if key == "sketch_plane":
200
+ suggestions[key] = (
201
+ "Choose one of: 'Front', 'Top', 'Right', or face reference name"
202
+ )
203
+ elif key == "line_mm":
204
+ suggestions[key] = "[x1, y1, x2, y2] in millimeters"
205
+ elif key == "rectangle_mm":
206
+ suggestions[key] = "[x, y, width, height] in millimeters"
207
+ elif key == "circle_center_mm":
208
+ suggestions[key] = "[center_x, center_y] in millimeters"
209
+ elif key == "circle_radius_mm":
210
+ suggestions[key] = "Numeric value in millimeters"
211
+ elif key == "arc_center_mm":
212
+ suggestions[key] = "[center_x, center_y] in millimeters"
213
+ elif key == "arc_start_mm":
214
+ suggestions[key] = "[start_x, start_y] in millimeters"
215
+ elif key == "arc_end_mm":
216
+ suggestions[key] = "[end_x, end_y] in millimeters"
217
+ elif key == "centerline_mm":
218
+ suggestions[key] = "[x1, y1, x2, y2] reference line in millimeters"
219
+ elif key == "depth":
220
+ suggestions[key] = (
221
+ "Numeric value in millimeters (positive for extrude/cut)"
222
+ )
223
+ elif key == "file_path":
224
+ suggestions[key] = "Full path to target file (relative or absolute)"
225
+ elif key == "model_path":
226
+ suggestions[key] = "Full path to SolidWorks part or assembly file"
227
+ elif key == "part_name":
228
+ suggestions[key] = (
229
+ "Valid filename for the new part (alphanumeric, underscore, dash)"
230
+ )
231
+ else:
232
+ suggestions[key] = f"Required for tool '{tool_name}'"
233
+
234
+ return suggestions
235
+
236
+
237
+ def attempt_auto_repair(
238
+ planned: dict[str, Any], tool_name: str, context: dict[str, Any] | None = None
239
+ ) -> ParameterRepairResult:
240
+ """Attempt automatic repair of incomplete parameters based on context.
241
+
242
+ Args:
243
+ planned: Checkpoint planned-action dict.
244
+ tool_name: Name of the tool.
245
+ context: Optional context dict with hints (e.g., previous sketch plane).
246
+
247
+ Returns:
248
+ ParameterRepairResult with repaired plan or failure details.
249
+ """
250
+ validation = validate_checkpoint_parameters(planned, tool_name)
251
+ if validation.is_valid:
252
+ return validation
253
+
254
+ # Try context-aware auto-repair
255
+ context = context or {}
256
+ repaired = dict(planned) # Make a copy
257
+ repaired_any = False
258
+
259
+ # Repair strategy: use context clues from session state
260
+ for missing_key in validation.missing_keys:
261
+ if missing_key == "sketch_plane" and "active_sketch_plane" in context:
262
+ repaired[missing_key] = context["active_sketch_plane"]
263
+ repaired_any = True
264
+ # For geometry parameters, we cannot auto-repair without user input
265
+
266
+ if repaired_any:
267
+ # Re-validate after repair attempt
268
+ second_validation = validate_checkpoint_parameters(repaired, tool_name)
269
+ if second_validation.is_valid:
270
+ return ParameterRepairResult(
271
+ is_valid=True,
272
+ repaired_plan=repaired,
273
+ message=f"Successfully auto-repaired '{tool_name}' using context clues.",
274
+ )
275
+
276
+ # Return original validation (couldn't auto-repair fully)
277
+ return validation
278
+
279
+
280
+ def build_repair_instruction_text(validation: ParameterRepairResult) -> str:
281
+ """Build human-readable repair instruction text.
282
+
283
+ Args:
284
+ validation: ParameterRepairResult with missing keys and suggestions.
285
+
286
+ Returns:
287
+ Formatted instruction text for user display.
288
+ """
289
+ if validation.is_valid:
290
+ return "✓ All parameters valid. No repairs needed."
291
+
292
+ lines = [
293
+ "⚠️ Parameter Validation Failed",
294
+ f" Message: {validation.message}",
295
+ "",
296
+ "Missing Parameters:",
297
+ ]
298
+
299
+ for key in validation.missing_keys:
300
+ suggestion = validation.suggestions.get(key, "Required parameter")
301
+ lines.append(f" • {key}: {suggestion}")
302
+
303
+ lines.extend(
304
+ [
305
+ "",
306
+ "Instructions:",
307
+ " 1. Open the generated checkpoint script",
308
+ " 2. Edit the PLANNED dict to add missing parameters",
309
+ " 3. Save the script",
310
+ " 4. Run execute-next again",
311
+ ]
312
+ )
313
+
314
+ return "\n".join(lines)