solidworks-mcp-server 2.0.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/CHANGELOG.md +35 -0
- package/LICENSE +21 -0
- package/README.md +333 -0
- package/dist/cache/manager.d.ts +50 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +127 -0
- package/dist/cache/manager.js.map +1 -0
- package/dist/db/connection.d.ts +48 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +132 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +402 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chromadb.d.ts +16 -0
- package/dist/knowledge/chromadb.d.ts.map +1 -0
- package/dist/knowledge/chromadb.js +80 -0
- package/dist/knowledge/chromadb.js.map +1 -0
- package/dist/macro/index.d.ts +6 -0
- package/dist/macro/index.d.ts.map +1 -0
- package/dist/macro/index.js +6 -0
- package/dist/macro/index.js.map +1 -0
- package/dist/macro/recorder.d.ts +72 -0
- package/dist/macro/recorder.d.ts.map +1 -0
- package/dist/macro/recorder.js +228 -0
- package/dist/macro/recorder.js.map +1 -0
- package/dist/macro/types.d.ts +77 -0
- package/dist/macro/types.d.ts.map +1 -0
- package/dist/macro/types.js +5 -0
- package/dist/macro/types.js.map +1 -0
- package/dist/resources/base.d.ts +116 -0
- package/dist/resources/base.d.ts.map +1 -0
- package/dist/resources/base.js +161 -0
- package/dist/resources/base.js.map +1 -0
- package/dist/resources/design-table.d.ts +384 -0
- package/dist/resources/design-table.d.ts.map +1 -0
- package/dist/resources/design-table.js +337 -0
- package/dist/resources/design-table.js.map +1 -0
- package/dist/resources/pdm.d.ts +1277 -0
- package/dist/resources/pdm.d.ts.map +1 -0
- package/dist/resources/pdm.js +358 -0
- package/dist/resources/pdm.js.map +1 -0
- package/dist/resources/registry.d.ts +59 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +88 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/solidworks/api.d.ts +24 -0
- package/dist/solidworks/api.d.ts.map +1 -0
- package/dist/solidworks/api.js +226 -0
- package/dist/solidworks/api.js.map +1 -0
- package/dist/solidworks/types.d.ts +55 -0
- package/dist/solidworks/types.d.ts.map +1 -0
- package/dist/solidworks/types.js +2 -0
- package/dist/solidworks/types.js.map +1 -0
- package/dist/state/store.d.ts +101 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +262 -0
- package/dist/state/store.js.map +1 -0
- package/dist/tools/analysis.d.ts +37 -0
- package/dist/tools/analysis.d.ts.map +1 -0
- package/dist/tools/analysis.js +169 -0
- package/dist/tools/analysis.js.map +1 -0
- package/dist/tools/drawing.d.ts +151 -0
- package/dist/tools/drawing.d.ts.map +1 -0
- package/dist/tools/drawing.js +171 -0
- package/dist/tools/drawing.js.map +1 -0
- package/dist/tools/export.d.ts +97 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +128 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/modeling.d.ts +9 -0
- package/dist/tools/modeling.d.ts.map +1 -0
- package/dist/tools/modeling.js +120 -0
- package/dist/tools/modeling.js.map +1 -0
- package/dist/tools/vba.d.ts +123 -0
- package/dist/tools/vba.d.ts.map +1 -0
- package/dist/tools/vba.js +158 -0
- package/dist/tools/vba.js.map +1 -0
- package/dist/utils/config.d.ts +18 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +26 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +84 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// @ts-ignore - winax module doesn't have proper TypeScript definitions
|
|
2
|
+
import winax from 'winax';
|
|
3
|
+
const { createActiveXObject } = winax;
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
export class SolidWorksAPI {
|
|
6
|
+
swApp;
|
|
7
|
+
currentModel;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.swApp = null;
|
|
10
|
+
this.currentModel = null;
|
|
11
|
+
}
|
|
12
|
+
async connect() {
|
|
13
|
+
try {
|
|
14
|
+
// Create or get running instance of SolidWorks
|
|
15
|
+
this.swApp = createActiveXObject('SldWorks.Application');
|
|
16
|
+
this.swApp.Visible = true;
|
|
17
|
+
logger.info('Connected to SolidWorks');
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`Failed to connect to SolidWorks: ${error}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async disconnect() {
|
|
24
|
+
if (this.currentModel) {
|
|
25
|
+
this.currentModel = null;
|
|
26
|
+
}
|
|
27
|
+
if (this.swApp) {
|
|
28
|
+
// Don't close SolidWorks, just disconnect
|
|
29
|
+
this.swApp = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
isConnected() {
|
|
33
|
+
return this.swApp !== null;
|
|
34
|
+
}
|
|
35
|
+
// Model operations
|
|
36
|
+
async openModel(filePath) {
|
|
37
|
+
if (!this.swApp)
|
|
38
|
+
throw new Error('Not connected to SolidWorks');
|
|
39
|
+
const errors = { value: 0 };
|
|
40
|
+
const warnings = { value: 0 };
|
|
41
|
+
// Determine file type from extension
|
|
42
|
+
const ext = filePath.toLowerCase().split('.').pop();
|
|
43
|
+
let docType = 1; // swDocPART
|
|
44
|
+
if (ext === 'sldasm')
|
|
45
|
+
docType = 2; // swDocASSEMBLY
|
|
46
|
+
if (ext === 'slddrw')
|
|
47
|
+
docType = 3; // swDocDRAWING
|
|
48
|
+
this.currentModel = this.swApp.OpenDoc6(filePath, docType, 1, // swOpenDocOptions_Silent
|
|
49
|
+
'', errors, warnings);
|
|
50
|
+
if (!this.currentModel) {
|
|
51
|
+
throw new Error(`Failed to open model: ${filePath}`);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
path: filePath,
|
|
55
|
+
name: this.currentModel.GetTitle(),
|
|
56
|
+
type: ['Part', 'Assembly', 'Drawing'][docType - 1],
|
|
57
|
+
isActive: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async closeModel(save = false) {
|
|
61
|
+
if (!this.currentModel)
|
|
62
|
+
return;
|
|
63
|
+
if (save) {
|
|
64
|
+
this.currentModel.Save3(1, 0, 0); // swSaveAsOptions_Silent
|
|
65
|
+
}
|
|
66
|
+
this.swApp.CloseDoc(this.currentModel.GetTitle());
|
|
67
|
+
this.currentModel = null;
|
|
68
|
+
}
|
|
69
|
+
async createPart() {
|
|
70
|
+
if (!this.swApp)
|
|
71
|
+
throw new Error('Not connected to SolidWorks');
|
|
72
|
+
// Create new part document
|
|
73
|
+
this.currentModel = this.swApp.NewDocument(this.swApp.GetUserPreferenceStringValue(8), // swDefaultTemplatePart
|
|
74
|
+
0, 0, 0);
|
|
75
|
+
return {
|
|
76
|
+
path: '',
|
|
77
|
+
name: this.currentModel.GetTitle(),
|
|
78
|
+
type: 'Part',
|
|
79
|
+
isActive: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Macro support methods
|
|
83
|
+
async createSketch(params) {
|
|
84
|
+
if (!this.currentModel)
|
|
85
|
+
throw new Error('No active model');
|
|
86
|
+
const { plane = 'Front' } = params;
|
|
87
|
+
const planeRef = this.currentModel.FeatureManager.GetPlane(plane);
|
|
88
|
+
if (planeRef) {
|
|
89
|
+
this.currentModel.SketchManager.InsertSketch(true);
|
|
90
|
+
const sketchName = this.currentModel.SketchManager.ActiveSketch.Name;
|
|
91
|
+
return { success: true, sketchId: sketchName };
|
|
92
|
+
}
|
|
93
|
+
return { success: false, error: 'Failed to create sketch' };
|
|
94
|
+
}
|
|
95
|
+
async addLine(params) {
|
|
96
|
+
if (!this.currentModel)
|
|
97
|
+
throw new Error('No active model');
|
|
98
|
+
const { x1 = 0, y1 = 0, z1 = 0, x2 = 100, y2 = 0, z2 = 0 } = params;
|
|
99
|
+
const line = this.currentModel.SketchManager.CreateLine(x1 / 1000, y1 / 1000, z1 / 1000, // Convert mm to m
|
|
100
|
+
x2 / 1000, y2 / 1000, z2 / 1000);
|
|
101
|
+
if (line) {
|
|
102
|
+
return { success: true, lineId: `line_${Date.now()}` };
|
|
103
|
+
}
|
|
104
|
+
return { success: false, error: 'Failed to create line' };
|
|
105
|
+
}
|
|
106
|
+
async extrude(params) {
|
|
107
|
+
if (!this.currentModel)
|
|
108
|
+
throw new Error('No active model');
|
|
109
|
+
const { depth = 25, reverse = false, draft = 0 } = params;
|
|
110
|
+
const feature = await this.createExtrude(depth, draft, reverse);
|
|
111
|
+
if (feature) {
|
|
112
|
+
return { success: true, featureId: feature.name };
|
|
113
|
+
}
|
|
114
|
+
return { success: false, error: 'Failed to create extrusion' };
|
|
115
|
+
}
|
|
116
|
+
// Feature operations
|
|
117
|
+
async createExtrude(depth, draft = 0, reverse = false) {
|
|
118
|
+
if (!this.currentModel)
|
|
119
|
+
throw new Error('No model open');
|
|
120
|
+
const feature = this.currentModel.FeatureManager.FeatureExtrusion3(true, // sd
|
|
121
|
+
reverse, // flip
|
|
122
|
+
false, // dir
|
|
123
|
+
0, // t1
|
|
124
|
+
0, // t2
|
|
125
|
+
depth / 1000, // convert mm to m
|
|
126
|
+
0.01, // d2
|
|
127
|
+
false, // dchk1
|
|
128
|
+
false, // dchk2
|
|
129
|
+
false, // dang
|
|
130
|
+
draft * Math.PI / 180, // convert degrees to radians
|
|
131
|
+
0, // d2ang
|
|
132
|
+
false, // offsetReverse1
|
|
133
|
+
false, // offsetReverse2
|
|
134
|
+
false, // translateSurface1
|
|
135
|
+
false, // translateSurface2
|
|
136
|
+
false, // merge
|
|
137
|
+
true, // useFeatScope
|
|
138
|
+
true // useAutoSelect
|
|
139
|
+
);
|
|
140
|
+
if (!feature) {
|
|
141
|
+
throw new Error('Failed to create extrusion');
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
name: feature.Name,
|
|
145
|
+
type: 'Extrusion',
|
|
146
|
+
suppressed: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Dimension operations
|
|
150
|
+
async getDimension(name) {
|
|
151
|
+
if (!this.currentModel)
|
|
152
|
+
throw new Error('No model open');
|
|
153
|
+
const dimension = this.currentModel.Parameter(name);
|
|
154
|
+
if (!dimension) {
|
|
155
|
+
throw new Error(`Dimension "${name}" not found`);
|
|
156
|
+
}
|
|
157
|
+
return dimension.SystemValue * 1000; // Convert m to mm
|
|
158
|
+
}
|
|
159
|
+
async setDimension(name, value) {
|
|
160
|
+
if (!this.currentModel)
|
|
161
|
+
throw new Error('No model open');
|
|
162
|
+
const dimension = this.currentModel.Parameter(name);
|
|
163
|
+
if (!dimension) {
|
|
164
|
+
throw new Error(`Dimension "${name}" not found`);
|
|
165
|
+
}
|
|
166
|
+
dimension.SystemValue = value / 1000; // Convert mm to m
|
|
167
|
+
this.currentModel.EditRebuild3();
|
|
168
|
+
}
|
|
169
|
+
// Export operations
|
|
170
|
+
async exportFile(filePath, format) {
|
|
171
|
+
if (!this.currentModel)
|
|
172
|
+
throw new Error('No model open');
|
|
173
|
+
const formatMap = {
|
|
174
|
+
'step': 0,
|
|
175
|
+
'iges': 1,
|
|
176
|
+
'stl': 2,
|
|
177
|
+
'pdf': 3,
|
|
178
|
+
'dxf': 4,
|
|
179
|
+
'dwg': 5,
|
|
180
|
+
};
|
|
181
|
+
const exportFormat = formatMap[format.toLowerCase()];
|
|
182
|
+
if (exportFormat === undefined) {
|
|
183
|
+
throw new Error(`Unsupported export format: ${format}`);
|
|
184
|
+
}
|
|
185
|
+
const success = this.currentModel.SaveAs3(filePath, 0, // version
|
|
186
|
+
1 // options
|
|
187
|
+
);
|
|
188
|
+
if (!success) {
|
|
189
|
+
throw new Error(`Failed to export to ${format}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// VBA operations
|
|
193
|
+
async runMacro(macroPath, moduleName, procedureName, args = []) {
|
|
194
|
+
if (!this.swApp)
|
|
195
|
+
throw new Error('Not connected to SolidWorks');
|
|
196
|
+
const result = this.swApp.RunMacro2(macroPath, moduleName, procedureName, 1, // swRunMacroOption
|
|
197
|
+
0 // error
|
|
198
|
+
);
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
// Mass properties
|
|
202
|
+
async getMassProperties() {
|
|
203
|
+
if (!this.currentModel)
|
|
204
|
+
throw new Error('No model open');
|
|
205
|
+
const massProps = this.currentModel.Extension.CreateMassProperty();
|
|
206
|
+
return {
|
|
207
|
+
mass: massProps.Mass,
|
|
208
|
+
volume: massProps.Volume,
|
|
209
|
+
surfaceArea: massProps.SurfaceArea,
|
|
210
|
+
centerOfMass: {
|
|
211
|
+
x: massProps.CenterOfMass[0],
|
|
212
|
+
y: massProps.CenterOfMass[1],
|
|
213
|
+
z: massProps.CenterOfMass[2],
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Helper to get current model
|
|
218
|
+
getCurrentModel() {
|
|
219
|
+
return this.currentModel;
|
|
220
|
+
}
|
|
221
|
+
// Helper to get SolidWorks app
|
|
222
|
+
getApp() {
|
|
223
|
+
return this.swApp;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/solidworks/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface SolidWorksModel {
|
|
2
|
+
path: string;
|
|
3
|
+
name: string;
|
|
4
|
+
type: 'Part' | 'Assembly' | 'Drawing';
|
|
5
|
+
isActive: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SolidWorksFeature {
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
suppressed: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface SolidWorksDrawing {
|
|
13
|
+
name: string;
|
|
14
|
+
sheets: number;
|
|
15
|
+
scale: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SolidWorksDimension {
|
|
18
|
+
name: string;
|
|
19
|
+
value: number;
|
|
20
|
+
units: string;
|
|
21
|
+
}
|
|
22
|
+
export interface SolidWorksConfiguration {
|
|
23
|
+
name: string;
|
|
24
|
+
isActive: boolean;
|
|
25
|
+
parent?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface MassProperties {
|
|
28
|
+
mass: number;
|
|
29
|
+
volume: number;
|
|
30
|
+
surfaceArea: number;
|
|
31
|
+
centerOfMass: {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
z: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface ExportOptions {
|
|
38
|
+
format: 'STEP' | 'IGES' | 'STL' | 'PDF' | 'DXF' | 'DWG';
|
|
39
|
+
version?: string;
|
|
40
|
+
binary?: boolean;
|
|
41
|
+
units?: 'mm' | 'in' | 'm';
|
|
42
|
+
}
|
|
43
|
+
export interface VBAScript {
|
|
44
|
+
name: string;
|
|
45
|
+
description: string;
|
|
46
|
+
code: string;
|
|
47
|
+
parameters?: VBAParameter[];
|
|
48
|
+
}
|
|
49
|
+
export interface VBAParameter {
|
|
50
|
+
name: string;
|
|
51
|
+
type: 'string' | 'number' | 'boolean' | 'array';
|
|
52
|
+
description: string;
|
|
53
|
+
default?: any;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/solidworks/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/solidworks/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Store for SolidWorks MCP Server
|
|
3
|
+
* Manages resource states and provides persistence
|
|
4
|
+
*/
|
|
5
|
+
import { ResourceState, ResourceStatus } from '../resources/base.js';
|
|
6
|
+
export interface StateSnapshot {
|
|
7
|
+
version: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
resources: Map<string, ResourceState>;
|
|
10
|
+
metadata: {
|
|
11
|
+
totalResources: number;
|
|
12
|
+
byType: Record<string, number>;
|
|
13
|
+
byStatus: Record<string, number>;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare class ResourceStateStore {
|
|
17
|
+
private resources;
|
|
18
|
+
private stateFilePath;
|
|
19
|
+
private autoSave;
|
|
20
|
+
private saveInterval;
|
|
21
|
+
constructor(stateFilePath?: string, autoSave?: boolean);
|
|
22
|
+
/**
|
|
23
|
+
* Add or update a resource state
|
|
24
|
+
*/
|
|
25
|
+
setState(resourceId: string, state: ResourceState): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get a resource state by ID
|
|
28
|
+
*/
|
|
29
|
+
getState(resourceId: string): ResourceState | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get all resource states
|
|
32
|
+
*/
|
|
33
|
+
getAllStates(): ResourceState[];
|
|
34
|
+
/**
|
|
35
|
+
* Get states by type
|
|
36
|
+
*/
|
|
37
|
+
getStatesByType(type: string): ResourceState[];
|
|
38
|
+
/**
|
|
39
|
+
* Get states by status
|
|
40
|
+
*/
|
|
41
|
+
getStatesByStatus(status: ResourceStatus): ResourceState[];
|
|
42
|
+
/**
|
|
43
|
+
* Remove a resource state
|
|
44
|
+
*/
|
|
45
|
+
removeState(resourceId: string): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Clear all states
|
|
48
|
+
*/
|
|
49
|
+
clear(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Save state to file
|
|
52
|
+
*/
|
|
53
|
+
save(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Load state from file
|
|
56
|
+
*/
|
|
57
|
+
load(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Create a state snapshot
|
|
60
|
+
*/
|
|
61
|
+
createSnapshot(): StateSnapshot;
|
|
62
|
+
/**
|
|
63
|
+
* Start auto-save interval
|
|
64
|
+
*/
|
|
65
|
+
private startAutoSave;
|
|
66
|
+
/**
|
|
67
|
+
* Stop auto-save interval
|
|
68
|
+
*/
|
|
69
|
+
stopAutoSave(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get statistics about stored states
|
|
72
|
+
*/
|
|
73
|
+
getStatistics(): Record<string, any>;
|
|
74
|
+
/**
|
|
75
|
+
* Get the oldest resource
|
|
76
|
+
*/
|
|
77
|
+
private getOldestResource;
|
|
78
|
+
/**
|
|
79
|
+
* Get the newest resource
|
|
80
|
+
*/
|
|
81
|
+
private getNewestResource;
|
|
82
|
+
/**
|
|
83
|
+
* Query states with filters
|
|
84
|
+
*/
|
|
85
|
+
queryStates(filters: {
|
|
86
|
+
type?: string;
|
|
87
|
+
status?: ResourceStatus;
|
|
88
|
+
tags?: Record<string, string>;
|
|
89
|
+
createdAfter?: string;
|
|
90
|
+
createdBefore?: string;
|
|
91
|
+
}): ResourceState[];
|
|
92
|
+
/**
|
|
93
|
+
* Export states to JSON
|
|
94
|
+
*/
|
|
95
|
+
exportToJSON(filePath: string): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Import states from JSON
|
|
98
|
+
*/
|
|
99
|
+
importFromJSON(filePath: string): Promise<void>;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKrE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,YAAY,CAA+B;gBAEvC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc;IAS5D;;OAEG;IACG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIvD;;OAEG;IACH,YAAY,IAAI,aAAa,EAAE;IAI/B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAI9C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,EAAE;IAI1D;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAavD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACH,cAAc,IAAI,aAAa;IAqB/B;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,aAAa,EAAE;IAiCnB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBtD"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Store for SolidWorks MCP Server
|
|
3
|
+
* Manages resource states and provides persistence
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
export class ResourceStateStore {
|
|
9
|
+
resources = new Map();
|
|
10
|
+
stateFilePath;
|
|
11
|
+
autoSave;
|
|
12
|
+
saveInterval = null;
|
|
13
|
+
constructor(stateFilePath, autoSave = true) {
|
|
14
|
+
this.stateFilePath = stateFilePath || path.join(process.cwd(), '.solidworks-mcp-state.json');
|
|
15
|
+
this.autoSave = autoSave;
|
|
16
|
+
if (this.autoSave) {
|
|
17
|
+
this.startAutoSave();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Add or update a resource state
|
|
22
|
+
*/
|
|
23
|
+
async setState(resourceId, state) {
|
|
24
|
+
this.resources.set(resourceId, state);
|
|
25
|
+
logger.debug(`State updated for resource: ${resourceId}`, { type: state.type, status: state.status });
|
|
26
|
+
if (this.autoSave) {
|
|
27
|
+
await this.save();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get a resource state by ID
|
|
32
|
+
*/
|
|
33
|
+
getState(resourceId) {
|
|
34
|
+
return this.resources.get(resourceId);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get all resource states
|
|
38
|
+
*/
|
|
39
|
+
getAllStates() {
|
|
40
|
+
return Array.from(this.resources.values());
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get states by type
|
|
44
|
+
*/
|
|
45
|
+
getStatesByType(type) {
|
|
46
|
+
return this.getAllStates().filter(state => state.type === type);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get states by status
|
|
50
|
+
*/
|
|
51
|
+
getStatesByStatus(status) {
|
|
52
|
+
return this.getAllStates().filter(state => state.status === status);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Remove a resource state
|
|
56
|
+
*/
|
|
57
|
+
async removeState(resourceId) {
|
|
58
|
+
const deleted = this.resources.delete(resourceId);
|
|
59
|
+
if (deleted) {
|
|
60
|
+
logger.debug(`State removed for resource: ${resourceId}`);
|
|
61
|
+
if (this.autoSave) {
|
|
62
|
+
await this.save();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return deleted;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Clear all states
|
|
69
|
+
*/
|
|
70
|
+
async clear() {
|
|
71
|
+
this.resources.clear();
|
|
72
|
+
logger.info('All resource states cleared');
|
|
73
|
+
if (this.autoSave) {
|
|
74
|
+
await this.save();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Save state to file
|
|
79
|
+
*/
|
|
80
|
+
async save() {
|
|
81
|
+
try {
|
|
82
|
+
const snapshot = this.createSnapshot();
|
|
83
|
+
const json = JSON.stringify(snapshot, null, 2);
|
|
84
|
+
await fs.writeFile(this.stateFilePath, json, 'utf-8');
|
|
85
|
+
logger.debug(`State saved to ${this.stateFilePath}`);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.error('Failed to save state', error);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Load state from file
|
|
94
|
+
*/
|
|
95
|
+
async load() {
|
|
96
|
+
try {
|
|
97
|
+
const data = await fs.readFile(this.stateFilePath, 'utf-8');
|
|
98
|
+
const snapshot = JSON.parse(data);
|
|
99
|
+
this.resources.clear();
|
|
100
|
+
// Convert array back to Map
|
|
101
|
+
if (Array.isArray(snapshot.resources)) {
|
|
102
|
+
for (const state of snapshot.resources) {
|
|
103
|
+
this.resources.set(state.id, state);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (snapshot.resources) {
|
|
107
|
+
// Handle Map serialized as object
|
|
108
|
+
for (const [id, state] of Object.entries(snapshot.resources)) {
|
|
109
|
+
this.resources.set(id, state);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
logger.info(`State loaded from ${this.stateFilePath}`, {
|
|
113
|
+
totalResources: this.resources.size
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error.code === 'ENOENT') {
|
|
118
|
+
logger.debug('No state file found, starting with empty state');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
logger.error('Failed to load state', error);
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a state snapshot
|
|
128
|
+
*/
|
|
129
|
+
createSnapshot() {
|
|
130
|
+
const byType = {};
|
|
131
|
+
const byStatus = {};
|
|
132
|
+
for (const state of this.resources.values()) {
|
|
133
|
+
byType[state.type] = (byType[state.type] || 0) + 1;
|
|
134
|
+
byStatus[state.status] = (byStatus[state.status] || 0) + 1;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
version: '1.0.0',
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
resources: this.resources,
|
|
140
|
+
metadata: {
|
|
141
|
+
totalResources: this.resources.size,
|
|
142
|
+
byType,
|
|
143
|
+
byStatus
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Start auto-save interval
|
|
149
|
+
*/
|
|
150
|
+
startAutoSave() {
|
|
151
|
+
// Save every 30 seconds
|
|
152
|
+
this.saveInterval = setInterval(async () => {
|
|
153
|
+
if (this.resources.size > 0) {
|
|
154
|
+
await this.save();
|
|
155
|
+
}
|
|
156
|
+
}, 30000);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Stop auto-save interval
|
|
160
|
+
*/
|
|
161
|
+
stopAutoSave() {
|
|
162
|
+
if (this.saveInterval) {
|
|
163
|
+
clearInterval(this.saveInterval);
|
|
164
|
+
this.saveInterval = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get statistics about stored states
|
|
169
|
+
*/
|
|
170
|
+
getStatistics() {
|
|
171
|
+
const snapshot = this.createSnapshot();
|
|
172
|
+
return {
|
|
173
|
+
totalResources: snapshot.metadata.totalResources,
|
|
174
|
+
byType: snapshot.metadata.byType,
|
|
175
|
+
byStatus: snapshot.metadata.byStatus,
|
|
176
|
+
oldestResource: this.getOldestResource(),
|
|
177
|
+
newestResource: this.getNewestResource()
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get the oldest resource
|
|
182
|
+
*/
|
|
183
|
+
getOldestResource() {
|
|
184
|
+
let oldest;
|
|
185
|
+
for (const state of this.resources.values()) {
|
|
186
|
+
if (!oldest || state.metadata.createdAt < oldest.metadata.createdAt) {
|
|
187
|
+
oldest = state;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return oldest;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get the newest resource
|
|
194
|
+
*/
|
|
195
|
+
getNewestResource() {
|
|
196
|
+
let newest;
|
|
197
|
+
for (const state of this.resources.values()) {
|
|
198
|
+
if (!newest || state.metadata.createdAt > newest.metadata.createdAt) {
|
|
199
|
+
newest = state;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return newest;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Query states with filters
|
|
206
|
+
*/
|
|
207
|
+
queryStates(filters) {
|
|
208
|
+
let results = this.getAllStates();
|
|
209
|
+
if (filters.type) {
|
|
210
|
+
results = results.filter(s => s.type === filters.type);
|
|
211
|
+
}
|
|
212
|
+
if (filters.status) {
|
|
213
|
+
results = results.filter(s => s.status === filters.status);
|
|
214
|
+
}
|
|
215
|
+
if (filters.tags) {
|
|
216
|
+
results = results.filter(s => {
|
|
217
|
+
for (const [key, value] of Object.entries(filters.tags)) {
|
|
218
|
+
if (s.metadata.tags[key] !== value) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
if (filters.createdAfter) {
|
|
226
|
+
results = results.filter(s => s.metadata.createdAt >= filters.createdAfter);
|
|
227
|
+
}
|
|
228
|
+
if (filters.createdBefore) {
|
|
229
|
+
results = results.filter(s => s.metadata.createdAt <= filters.createdBefore);
|
|
230
|
+
}
|
|
231
|
+
return results;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Export states to JSON
|
|
235
|
+
*/
|
|
236
|
+
async exportToJSON(filePath) {
|
|
237
|
+
const snapshot = this.createSnapshot();
|
|
238
|
+
const json = JSON.stringify(snapshot, null, 2);
|
|
239
|
+
await fs.writeFile(filePath, json, 'utf-8');
|
|
240
|
+
logger.info(`States exported to ${filePath}`);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Import states from JSON
|
|
244
|
+
*/
|
|
245
|
+
async importFromJSON(filePath) {
|
|
246
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
247
|
+
const snapshot = JSON.parse(data);
|
|
248
|
+
// Merge with existing states
|
|
249
|
+
if (Array.isArray(snapshot.resources)) {
|
|
250
|
+
for (const state of snapshot.resources) {
|
|
251
|
+
this.resources.set(state.id, state);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
logger.info(`States imported from ${filePath}`, {
|
|
255
|
+
imported: snapshot.resources.length || 0
|
|
256
|
+
});
|
|
257
|
+
if (this.autoSave) {
|
|
258
|
+
await this.save();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=store.js.map
|