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.
- solidworks_mcp/__init__.py +57 -0
- solidworks_mcp/adapters/__init__.py +40 -0
- solidworks_mcp/adapters/base.py +1882 -0
- solidworks_mcp/adapters/circuit_breaker.py +2052 -0
- solidworks_mcp/adapters/com_executor.py +252 -0
- solidworks_mcp/adapters/complexity_analyzer.py +272 -0
- solidworks_mcp/adapters/connection_pool.py +1884 -0
- solidworks_mcp/adapters/factory.py +366 -0
- solidworks_mcp/adapters/intelligent_router.py +218 -0
- solidworks_mcp/adapters/mock_adapter.py +4016 -0
- solidworks_mcp/adapters/pywin32_adapter.py +2842 -0
- solidworks_mcp/adapters/solidworks/__init__.py +17 -0
- solidworks_mcp/adapters/solidworks/bitmap.py +180 -0
- solidworks_mcp/adapters/solidworks/com_utils.py +56 -0
- solidworks_mcp/adapters/solidworks/dimension_layout.py +753 -0
- solidworks_mcp/adapters/solidworks/documentation.py +1476 -0
- solidworks_mcp/adapters/solidworks/drawing_standard.py +1993 -0
- solidworks_mcp/adapters/solidworks/face_selection.py +392 -0
- solidworks_mcp/adapters/solidworks/features.py +3362 -0
- solidworks_mcp/adapters/solidworks/io.py +3649 -0
- solidworks_mcp/adapters/solidworks/rebuild_diagnostics.py +269 -0
- solidworks_mcp/adapters/solidworks/rebuild_inspector.py +146 -0
- solidworks_mcp/adapters/solidworks/selection.py +308 -0
- solidworks_mcp/adapters/solidworks/sketch.py +2545 -0
- solidworks_mcp/adapters/sw_feature_errors.py +66 -0
- solidworks_mcp/adapters/sw_type_info.py +317 -0
- solidworks_mcp/adapters/vba_adapter.py +318 -0
- solidworks_mcp/adapters/vba_macro_executor.py +215 -0
- solidworks_mcp/agents/__init__.py +68 -0
- solidworks_mcp/agents/design_knowledge/assembly_patterns.md +127 -0
- solidworks_mcp/agents/design_knowledge/hinges.md +118 -0
- solidworks_mcp/agents/design_knowledge/snap_fits.md +93 -0
- solidworks_mcp/agents/design_knowledge/solidworks_basics.md +3 -0
- solidworks_mcp/agents/design_knowledge/tolerancing.md +128 -0
- solidworks_mcp/agents/harness.py +216 -0
- solidworks_mcp/agents/history_db.py +1508 -0
- solidworks_mcp/agents/retrieval_index.py +164 -0
- solidworks_mcp/agents/schemas.py +165 -0
- solidworks_mcp/agents/smoke_test.py +285 -0
- solidworks_mcp/agents/soc_exporter.py +650 -0
- solidworks_mcp/agents/soc_pickup.py +332 -0
- solidworks_mcp/agents/soc_rewind.py +221 -0
- solidworks_mcp/agents/vector_rag.py +665 -0
- solidworks_mcp/cache/__init__.py +5 -0
- solidworks_mcp/cache/response_cache.py +164 -0
- solidworks_mcp/config.py +729 -0
- solidworks_mcp/exceptions.py +37 -0
- solidworks_mcp/security/__init__.py +68 -0
- solidworks_mcp/security/auth.py +128 -0
- solidworks_mcp/security/cors.py +27 -0
- solidworks_mcp/security/rate_limiting.py +90 -0
- solidworks_mcp/security/runtime.py +155 -0
- solidworks_mcp/server.py +777 -0
- solidworks_mcp/server_cli_fixed.py +120 -0
- solidworks_mcp/setup/__init__.py +1 -0
- solidworks_mcp/setup/cli.py +399 -0
- solidworks_mcp/setup/clients.py +157 -0
- solidworks_mcp/setup/config_file.py +230 -0
- solidworks_mcp/setup/handshake.py +202 -0
- solidworks_mcp/setup/launcher.py +102 -0
- solidworks_mcp/setup/legacy.py +100 -0
- solidworks_mcp/setup/registration.py +193 -0
- solidworks_mcp/setup/solidworks.py +49 -0
- solidworks_mcp/tools/__init__.py +64 -0
- solidworks_mcp/tools/analysis.py +723 -0
- solidworks_mcp/tools/automation.py +578 -0
- solidworks_mcp/tools/docs_discovery.py +1476 -0
- solidworks_mcp/tools/drawing.py +1015 -0
- solidworks_mcp/tools/drawing_analysis.py +456 -0
- solidworks_mcp/tools/drawing_automation.py +627 -0
- solidworks_mcp/tools/engineering_data.py +466 -0
- solidworks_mcp/tools/error_classifier.py +232 -0
- solidworks_mcp/tools/export.py +833 -0
- solidworks_mcp/tools/file_facts.py +40 -0
- solidworks_mcp/tools/file_management.py +1473 -0
- solidworks_mcp/tools/input_compat.py +17 -0
- solidworks_mcp/tools/macro_recording.py +464 -0
- solidworks_mcp/tools/modeling.py +2360 -0
- solidworks_mcp/tools/sketching.py +1422 -0
- solidworks_mcp/tools/template_management.py +367 -0
- solidworks_mcp/tools/tool_boundary.py +280 -0
- solidworks_mcp/tools/vba_generation.py +1145 -0
- solidworks_mcp/ui/__init__.py +9 -0
- solidworks_mcp/ui/local_llm.py +725 -0
- solidworks_mcp/ui/routers/__init__.py +10 -0
- solidworks_mcp/ui/routers/checkpoint.py +24 -0
- solidworks_mcp/ui/routers/docs.py +47 -0
- solidworks_mcp/ui/routers/llm.py +83 -0
- solidworks_mcp/ui/routers/local_model.py +69 -0
- solidworks_mcp/ui/routers/model.py +75 -0
- solidworks_mcp/ui/routers/preview.py +38 -0
- solidworks_mcp/ui/routers/session.py +161 -0
- solidworks_mcp/ui/routers/viewer.py +154 -0
- solidworks_mcp/ui/schemas.py +502 -0
- solidworks_mcp/ui/server.py +298 -0
- solidworks_mcp/ui/service.py +481 -0
- solidworks_mcp/ui/services/__init__.py +136 -0
- solidworks_mcp/ui/services/_utils.py +958 -0
- solidworks_mcp/ui/services/checkpoint_service.py +1110 -0
- solidworks_mcp/ui/services/docs_service.py +282 -0
- solidworks_mcp/ui/services/llm_service.py +956 -0
- solidworks_mcp/ui/services/model_service.py +459 -0
- solidworks_mcp/ui/services/parameter_repair_service.py +314 -0
- solidworks_mcp/ui/services/preview_service.py +489 -0
- solidworks_mcp/ui/services/session_service.py +1389 -0
- solidworks_mcp/utils/__init__.py +9 -0
- solidworks_mcp/utils/feature_tree_classifier.py +342 -0
- solidworks_mcp/utils/logging.py +76 -0
- solidworks_mcp/utils/validation.py +77 -0
- solidworks_mcp/version.py +8 -0
- solidworks_mcp_python-1.5.0.dist-info/METADATA +410 -0
- solidworks_mcp_python-1.5.0.dist-info/RECORD +115 -0
- solidworks_mcp_python-1.5.0.dist-info/WHEEL +4 -0
- solidworks_mcp_python-1.5.0.dist-info/entry_points.txt +3 -0
- 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)
|