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,164 @@
|
|
|
1
|
+
"""In-memory response cache with TTL support for adapter operations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import time
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from threading import RLock
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class CachePolicy:
|
|
14
|
+
"""Cache policy options for adapter responses.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
default_ttl_seconds (int): The default ttl seconds value.
|
|
18
|
+
enabled (bool): The enabled value.
|
|
19
|
+
max_entries (int): The max entries value.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
enabled: bool = True
|
|
23
|
+
default_ttl_seconds: int = 60
|
|
24
|
+
max_entries: int = 512
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class _CacheEntry[T]:
|
|
29
|
+
"""Internal cache entry with expiration metadata.
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
created_at (float): The created at value.
|
|
33
|
+
expires_at (float): The expires at value.
|
|
34
|
+
value (T): The value value.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
value: T
|
|
38
|
+
expires_at: float
|
|
39
|
+
created_at: float
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ResponseCache:
|
|
43
|
+
"""Thread-safe in-memory cache for adapter response objects.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
policy (CachePolicy): The policy value.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
_lock (Any): The lock value.
|
|
50
|
+
_policy (Any): The policy value.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, policy: CachePolicy) -> None:
|
|
54
|
+
"""Initialize this cache.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
policy (CachePolicy): The policy value.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
None: None.
|
|
61
|
+
"""
|
|
62
|
+
self._policy = policy
|
|
63
|
+
self._entries: dict[str, _CacheEntry[object]] = {}
|
|
64
|
+
self._lock = RLock()
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def enabled(self) -> bool:
|
|
68
|
+
"""Return whether caching is enabled.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
bool: True if enabled, otherwise False.
|
|
72
|
+
"""
|
|
73
|
+
return self._policy.enabled
|
|
74
|
+
|
|
75
|
+
def make_key(self, operation: str, payload: object) -> str:
|
|
76
|
+
"""Build a deterministic cache key from an operation payload.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
operation (str): Callable object executed by the helper.
|
|
80
|
+
payload (object): The payload value.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
str: The resulting text value.
|
|
84
|
+
"""
|
|
85
|
+
normalized = self._normalize_payload(payload)
|
|
86
|
+
raw = f"{operation}:{normalized}".encode()
|
|
87
|
+
return hashlib.sha256(raw).hexdigest()
|
|
88
|
+
|
|
89
|
+
def get(self, key: str) -> object | None:
|
|
90
|
+
"""Fetch a cached value when present and unexpired.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
key (str): The key value.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
object | None: The result produced by the operation.
|
|
97
|
+
"""
|
|
98
|
+
if not self._policy.enabled:
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
now = time.time()
|
|
102
|
+
with self._lock:
|
|
103
|
+
entry = self._entries.get(key)
|
|
104
|
+
if entry is None:
|
|
105
|
+
return None
|
|
106
|
+
if entry.expires_at <= now:
|
|
107
|
+
self._entries.pop(key, None)
|
|
108
|
+
return None
|
|
109
|
+
return entry.value
|
|
110
|
+
|
|
111
|
+
def set(self, key: str, value: object, ttl_seconds: int | None = None) -> None:
|
|
112
|
+
"""Store a cache value with expiration.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
key (str): The key value.
|
|
116
|
+
value (object): The value value.
|
|
117
|
+
ttl_seconds (int | None): The ttl seconds value. Defaults to None.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
None: None.
|
|
121
|
+
"""
|
|
122
|
+
if not self._policy.enabled:
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
ttl = (
|
|
126
|
+
ttl_seconds if ttl_seconds is not None else self._policy.default_ttl_seconds
|
|
127
|
+
)
|
|
128
|
+
now = time.time()
|
|
129
|
+
entry = _CacheEntry(value=value, created_at=now, expires_at=now + max(ttl, 1))
|
|
130
|
+
|
|
131
|
+
with self._lock:
|
|
132
|
+
if len(self._entries) >= self._policy.max_entries:
|
|
133
|
+
self._evict_oldest_unlocked()
|
|
134
|
+
self._entries[key] = entry
|
|
135
|
+
|
|
136
|
+
def _evict_oldest_unlocked(self) -> None:
|
|
137
|
+
"""Remove one oldest entry while lock is already held.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
None: None.
|
|
141
|
+
"""
|
|
142
|
+
if not self._entries:
|
|
143
|
+
return
|
|
144
|
+
oldest_key = min(
|
|
145
|
+
self._entries,
|
|
146
|
+
key=lambda cache_key: self._entries[cache_key].created_at,
|
|
147
|
+
)
|
|
148
|
+
self._entries.pop(oldest_key, None)
|
|
149
|
+
|
|
150
|
+
def _normalize_payload(self, payload: object) -> str:
|
|
151
|
+
"""Normalize payload into a stable JSON string.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
payload (object): The payload value.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
str: The resulting text value.
|
|
158
|
+
"""
|
|
159
|
+
try:
|
|
160
|
+
return json.dumps(
|
|
161
|
+
payload, sort_keys=True, default=str, separators=(",", ":")
|
|
162
|
+
)
|
|
163
|
+
except (TypeError, ValueError):
|
|
164
|
+
return json.dumps(str(payload), sort_keys=True)
|