cyclecad 2.1.0 → 3.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 (94) hide show
  1. package/BILLING-IMPLEMENTATION-SUMMARY.md +425 -0
  2. package/BILLING-INDEX.md +293 -0
  3. package/BILLING-INTEGRATION-GUIDE.md +414 -0
  4. package/COLLABORATION-INDEX.md +440 -0
  5. package/COLLABORATION-SYSTEM-SUMMARY.md +548 -0
  6. package/DELIVERABLES.txt +296 -445
  7. package/DOCKER-BUILD-MANIFEST.txt +483 -0
  8. package/DOCKER-FILES-REFERENCE.md +440 -0
  9. package/DOCKER-INFRASTRUCTURE.md +475 -0
  10. package/DOCKER-README.md +435 -0
  11. package/Dockerfile +33 -55
  12. package/ENHANCEMENT_COMPLETION_REPORT.md +383 -0
  13. package/ENHANCEMENT_SUMMARY.txt +308 -0
  14. package/FEATURE_INVENTORY.md +235 -0
  15. package/FUSION360_FEATURES_SUMMARY.md +452 -0
  16. package/FUSION360_PARITY_ENHANCEMENTS.md +461 -0
  17. package/FUSION360_PARITY_SUMMARY.md +520 -0
  18. package/FUSION360_QUICK_REFERENCE.md +351 -0
  19. package/MODULE_API_REFERENCE.md +712 -0
  20. package/MODULE_INVENTORY.txt +264 -0
  21. package/PWA-FILES-CREATED.txt +350 -0
  22. package/QUICK-START-TESTING.md +126 -0
  23. package/STEP-IMPORT-QUICKSTART.md +347 -0
  24. package/STEP-IMPORT-SYSTEM-SUMMARY.md +502 -0
  25. package/app/css/mobile.css +1074 -0
  26. package/app/icons/generate-icons.js +203 -0
  27. package/app/index.html +1342 -5031
  28. package/app/js/app.js +1312 -514
  29. package/app/js/billing-ui.js +990 -0
  30. package/app/js/brep-kernel.js +933 -981
  31. package/app/js/collab-client.js +750 -0
  32. package/app/js/mobile-nav.js +623 -0
  33. package/app/js/mobile-toolbar.js +476 -0
  34. package/app/js/modules/animation-module.js +497 -3
  35. package/app/js/modules/billing-module.js +724 -0
  36. package/app/js/modules/cam-module.js +507 -2
  37. package/app/js/modules/collaboration-module.js +513 -0
  38. package/app/js/modules/constraint-module.js +1266 -0
  39. package/app/js/modules/data-module.js +544 -1146
  40. package/app/js/modules/formats-module.js +438 -738
  41. package/app/js/modules/inspection-module.js +393 -0
  42. package/app/js/modules/mesh-module-enhanced.js +880 -0
  43. package/app/js/modules/plugin-module.js +597 -0
  44. package/app/js/modules/rendering-module.js +460 -0
  45. package/app/js/modules/scripting-module.js +593 -475
  46. package/app/js/modules/sketch-module.js +998 -2
  47. package/app/js/modules/step-module-enhanced.js +938 -0
  48. package/app/js/modules/surface-module.js +312 -0
  49. package/app/js/modules/version-module.js +420 -0
  50. package/app/js/offline-manager.js +705 -0
  51. package/app/js/responsive-init.js +360 -0
  52. package/app/js/touch-handler.js +429 -0
  53. package/app/manifest.json +211 -0
  54. package/app/offline.html +508 -0
  55. package/app/sw.js +571 -0
  56. package/app/tests/billing-tests.html +779 -0
  57. package/app/tests/brep-tests.html +980 -0
  58. package/app/tests/collab-tests.html +743 -0
  59. package/app/tests/mobile-tests.html +1299 -0
  60. package/app/tests/pwa-tests.html +1134 -0
  61. package/app/tests/step-tests.html +1042 -0
  62. package/app/tests/test-agent-v3.html +719 -0
  63. package/cycleCAD-Architecture-v2.pptx +0 -0
  64. package/docker-compose.yml +225 -0
  65. package/docs/BILLING-HELP.json +260 -0
  66. package/docs/BILLING-README.md +639 -0
  67. package/docs/BILLING-TUTORIAL.md +736 -0
  68. package/docs/BREP-HELP.json +326 -0
  69. package/docs/BREP-TUTORIAL.md +802 -0
  70. package/docs/COLLABORATION-HELP.json +228 -0
  71. package/docs/COLLABORATION-TUTORIAL.md +818 -0
  72. package/docs/DOCKER-HELP.json +224 -0
  73. package/docs/DOCKER-TUTORIAL.md +974 -0
  74. package/docs/MOBILE-HELP.json +243 -0
  75. package/docs/MOBILE-RESPONSIVE-README.md +378 -0
  76. package/docs/MOBILE-TUTORIAL.md +747 -0
  77. package/docs/PWA-HELP.json +228 -0
  78. package/docs/PWA-README.md +662 -0
  79. package/docs/PWA-TUTORIAL.md +757 -0
  80. package/docs/STEP-HELP.json +481 -0
  81. package/docs/STEP-IMPORT-TUTORIAL.md +824 -0
  82. package/docs/TESTING-GUIDE.md +528 -0
  83. package/docs/TESTING-HELP.json +182 -0
  84. package/fusion-vs-cyclecad.html +1771 -0
  85. package/nginx.conf +237 -0
  86. package/package.json +1 -1
  87. package/server/Dockerfile.converter +51 -0
  88. package/server/Dockerfile.signaling +28 -0
  89. package/server/billing-server.js +487 -0
  90. package/server/converter-enhanced.py +528 -0
  91. package/server/requirements-converter.txt +29 -0
  92. package/server/signaling-server.js +801 -0
  93. package/tests/docker-tests.sh +389 -0
  94. package/~$cycleCAD-Architecture-v2.pptx +0 -0
@@ -0,0 +1,712 @@
1
+ # Module API Reference — cycleCAD v2.0
2
+
3
+ Complete API documentation for three enhanced modules: scripting, formats, and data management.
4
+
5
+ ---
6
+
7
+ ## SCRIPTING MODULE API
8
+
9
+ **Import:**
10
+ ```javascript
11
+ import scripting from './modules/scripting-module.js';
12
+ ```
13
+
14
+ ### Initialization
15
+ ```javascript
16
+ scripting.init(viewport, kernel, containerEl);
17
+ ```
18
+
19
+ ### Script Execution
20
+ ```javascript
21
+ // Execute code with cad context
22
+ await scripting.execute(code, context, options);
23
+
24
+ // With parameters
25
+ await scripting.execute(code, {}, {
26
+ params: { width: 100, height: 50 },
27
+ withDebugger: false
28
+ });
29
+ ```
30
+
31
+ ### Script Library
32
+ ```javascript
33
+ // Save script
34
+ scripting.saveScript(name, code, {
35
+ description: 'My script',
36
+ tags: ['box', 'basic'],
37
+ version: '1.0'
38
+ });
39
+
40
+ // Load script
41
+ const script = scripting.loadScript(name);
42
+
43
+ // List scripts
44
+ const scripts = scripting.listScripts(tag);
45
+
46
+ // Delete script
47
+ scripting.deleteScript(name);
48
+ ```
49
+
50
+ ### Macro Recording
51
+ ```javascript
52
+ scripting.startRecording();
53
+ // ... user performs actions ...
54
+ const macro = scripting.stopRecording();
55
+ // macro.code contains auto-generated JavaScript
56
+
57
+ // Record action (called by UI)
58
+ scripting.recordAction('box', { w: 100, h: 50, d: 30 });
59
+ ```
60
+
61
+ ### Batch Operations
62
+ ```javascript
63
+ // Apply script to multiple parts
64
+ const results = await scripting.batchExecute('selectedParts', `
65
+ cad.fillet(5);
66
+ cad.color(0x888888);
67
+ `);
68
+
69
+ // results: [{success: true, object, result}, ...]
70
+ ```
71
+
72
+ ### Debugging API
73
+ ```javascript
74
+ // Set breakpoint at line
75
+ scripting.setBreakpoint('script_name', 42);
76
+
77
+ // Get breakpoints
78
+ const breakpoints = scripting.getBreakpoints('script_name');
79
+
80
+ // Remove breakpoint
81
+ scripting.removeBreakpoint('script_name', 42);
82
+
83
+ // Step through code
84
+ await scripting.stepInto('script_name', 42);
85
+ await scripting.stepOver('script_name', 42);
86
+
87
+ // Debug history
88
+ const history = scripting.getDebugHistory();
89
+ scripting.clearDebugHistory();
90
+ ```
91
+
92
+ ### Script Parameters
93
+ ```javascript
94
+ // Define parameters for script UI dialog
95
+ scripting.setScriptParameters('my_script', {
96
+ width: { type: 'slider', default: 100, min: 10, max: 500 },
97
+ material: { type: 'dropdown', options: ['steel', 'aluminum'], default: 'steel' },
98
+ description: { type: 'text', default: '' }
99
+ });
100
+
101
+ // Create parameter dialog
102
+ const values = await scripting.createParameterDialog(parameters);
103
+ // values: { width: 150, material: 'aluminum', description: '...' }
104
+ ```
105
+
106
+ ### Console API
107
+ ```javascript
108
+ // Get console output
109
+ const output = scripting.getConsoleOutput();
110
+ // output: [{type: 'log', text: '...', time: Date}, ...]
111
+
112
+ // Clear console
113
+ scripting.clearConsole();
114
+ ```
115
+
116
+ ### Examples
117
+ ```javascript
118
+ // Get example scripts
119
+ const examples = scripting.getExampleScripts();
120
+
121
+ // Load example script
122
+ const script = scripting.loadExampleScript('gear_generator');
123
+ ```
124
+
125
+ ### Events
126
+ ```javascript
127
+ scripting.onEvent('script_executed', (data) => {
128
+ console.log('Script ran:', data.code, data.result);
129
+ });
130
+
131
+ scripting.onEvent('script_error', (data) => {
132
+ console.error('Error:', data.error);
133
+ });
134
+
135
+ scripting.onEvent('recording_started', () => {});
136
+ scripting.onEvent('recording_stopped', (data) => {
137
+ console.log('Macro:', data.macro.code);
138
+ });
139
+
140
+ scripting.onEvent('console_output', (data) => {
141
+ console.log(`[${data.type}] ${data.text}`);
142
+ });
143
+ ```
144
+
145
+ ### Error Handling
146
+ ```javascript
147
+ try {
148
+ await scripting.execute(code);
149
+ } catch (error) {
150
+ console.error(error.message);
151
+ }
152
+
153
+ // Get last error
154
+ const lastError = scripting.getLastError();
155
+ if (lastError) {
156
+ console.error(lastError);
157
+ scripting.clearError();
158
+ }
159
+ ```
160
+
161
+ ### CAD Helper Methods
162
+
163
+ #### Shapes
164
+ ```javascript
165
+ cad.createBox(width, height, depth);
166
+ cad.createCylinder(radius, height, segments);
167
+ cad.createSphere(radius, segments);
168
+ cad.createCone(radius, height, segments);
169
+ cad.createTorus(majorRadius, minorRadius, segments);
170
+ cad.createWedge(width, height, depth);
171
+ ```
172
+
173
+ #### Sketching
174
+ ```javascript
175
+ cad.sketch.line(p1, p2);
176
+ cad.sketch.circle(center, radius);
177
+ cad.sketch.arc(center, radius, startAngle, endAngle);
178
+ cad.sketch.rectangle(corner1, corner2);
179
+ cad.sketch.polygon(center, radius, sides);
180
+ cad.sketch.polyline(points);
181
+ cad.sketch.spline(points);
182
+ ```
183
+
184
+ #### Positioning
185
+ ```javascript
186
+ cad.position(x, y, z);
187
+ cad.move(dx, dy, dz);
188
+ cad.rotate(x, y, z);
189
+ cad.rotateAround(axis, angle, point);
190
+ cad.scale(sx, sy, sz);
191
+ ```
192
+
193
+ #### Operations
194
+ ```javascript
195
+ cad.extrude(distance, options);
196
+ cad.revolve(angle, axis);
197
+ cad.sweep(profileId, pathId, options);
198
+ cad.loft(profileIds, options);
199
+ cad.fillet(radius, edges);
200
+ cad.chamfer(distance, edges);
201
+ cad.hole(diameter, depth);
202
+ cad.counterbore(holeRadius, cboreRadius, cboreDist);
203
+ cad.countersink(holeRadius, cskRadius, cskAngle);
204
+ cad.union(otherIds);
205
+ cad.cut(otherIds);
206
+ cad.intersect(otherIds);
207
+ cad.shell(thickness);
208
+ cad.pattern(countX, countY, spacingX, spacingY);
209
+ cad.circularPattern(count, angle);
210
+ cad.mirrorBody(plane);
211
+ ```
212
+
213
+ #### Assembly
214
+ ```javascript
215
+ cad.assembly.mate(body1Id, body2Id, type, options);
216
+ cad.assembly.hideAll();
217
+ cad.assembly.showAll();
218
+ cad.assembly.explode(scale);
219
+ ```
220
+
221
+ #### Inspection
222
+ ```javascript
223
+ cad.measure(a, b);
224
+ cad.getMass(options);
225
+ cad.getVolume();
226
+ cad.getBounds();
227
+ cad.getSurfaceArea();
228
+ ```
229
+
230
+ #### Materials
231
+ ```javascript
232
+ cad.material(name);
233
+ cad.color(hex);
234
+ cad.opacity(value);
235
+ ```
236
+
237
+ #### Selection
238
+ ```javascript
239
+ cad.select(name);
240
+ cad.selectAll();
241
+ cad.selectByTag(tag);
242
+ cad.hide(name);
243
+ cad.show(name);
244
+ cad.isolate(name);
245
+ cad.showAll();
246
+ cad.delete(name);
247
+ ```
248
+
249
+ #### Export
250
+ ```javascript
251
+ cad.exportSTL(filename);
252
+ cad.exportOBJ(filename);
253
+ cad.exportGLTF(filename);
254
+ cad.exportSTEP(filename);
255
+ cad.exportJSON(filename);
256
+ ```
257
+
258
+ #### View
259
+ ```javascript
260
+ cad.view.fitAll();
261
+ cad.view.fitSelection();
262
+ cad.view.setView('front', 'top', 'isometric', etc.);
263
+ cad.view.showGrid();
264
+ cad.view.hideGrid();
265
+ cad.view.setZoom(factor);
266
+ ```
267
+
268
+ ---
269
+
270
+ ## FORMATS MODULE API
271
+
272
+ **Import:**
273
+ ```javascript
274
+ import formats from './modules/formats-module.js';
275
+ ```
276
+
277
+ ### Initialization
278
+ ```javascript
279
+ formats.init(viewport, kernel, containerEl);
280
+ ```
281
+
282
+ ### Format Detection
283
+ ```javascript
284
+ // Auto-detect from file
285
+ const format = await formats.detectFormat(file);
286
+
287
+ // From filename string
288
+ const format = formats.detectFormat('model.step');
289
+ ```
290
+
291
+ ### Import
292
+ ```javascript
293
+ const result = await formats.import_(file, format, options);
294
+ // Result: {success, name, meshCount, meshes, boundingBox, format, filename}
295
+
296
+ // With options
297
+ await formats.import_(file, 'step', {
298
+ scale: 1.0,
299
+ position: [0, 0, 0],
300
+ centerModel: true,
301
+ unitFrom: 'mm',
302
+ unitTo: 'mm',
303
+ mergeGeometry: false,
304
+ fitCamera: true
305
+ });
306
+ ```
307
+
308
+ ### Export
309
+ ```javascript
310
+ const blob = await formats.export_(format, options);
311
+ // Downloads automatically
312
+
313
+ // With options
314
+ await formats.export_('stl', {
315
+ filename: 'part.stl',
316
+ binary: true,
317
+ scale: 1.0,
318
+ resolution: 1.0,
319
+ quality: 85,
320
+ includeNormals: true,
321
+ includeMaterials: true
322
+ });
323
+ ```
324
+
325
+ ### Batch Conversion
326
+ ```javascript
327
+ const results = await formats.batchConvert(files, outputFormat, options);
328
+ // results: {success: count, failed: count, results: [{file, filename, status, error}, ...]}
329
+ ```
330
+
331
+ ### Server Configuration
332
+ ```javascript
333
+ // Set converter service URL
334
+ formats.setConverterUrl('http://localhost:8787');
335
+
336
+ // Get current URL
337
+ const url = formats.getConverterUrl();
338
+ ```
339
+
340
+ ### Supported Formats
341
+ ```javascript
342
+ // Get all supported formats
343
+ const supported = formats.getSupportedFormats();
344
+ // {import: ['step', 'stl', ...], export: ['stl', 'obj', ...]}
345
+
346
+ // Get format info
347
+ const info = formats.getFormatInfo('step');
348
+ // {name, ext, binary, category}
349
+ ```
350
+
351
+ ### Recent Imports
352
+ ```javascript
353
+ // Get recent imports
354
+ const recent = formats.getRecentImports();
355
+ // [{filename, format, timestamp}, ...]
356
+
357
+ // Clear recent list
358
+ formats.clearRecentImports();
359
+ ```
360
+
361
+ ### Error Handling
362
+ ```javascript
363
+ try {
364
+ await formats.import_(file);
365
+ } catch (error) {
366
+ console.error(error.message);
367
+ }
368
+
369
+ const lastError = formats.getLastError();
370
+ ```
371
+
372
+ ---
373
+
374
+ ## DATA MODULE API
375
+
376
+ **Import:**
377
+ ```javascript
378
+ const data = (await import('./modules/data-module.js')).default;
379
+ ```
380
+
381
+ ### Initialization
382
+ ```javascript
383
+ await data.init();
384
+ ```
385
+
386
+ ### Project Management
387
+ ```javascript
388
+ // Create new project
389
+ const proj = await data.newProject({
390
+ name: 'My Design',
391
+ description: '...',
392
+ units: 'mm',
393
+ templateName: 'Mechanical Part'
394
+ });
395
+ // Returns: {id, name, description, created, units}
396
+
397
+ // Load project
398
+ await data.load({ projectId: 'proj-123' });
399
+
400
+ // Save current project
401
+ await data.save();
402
+
403
+ // Delete project
404
+ await data.delete({
405
+ projectId: 'proj-123',
406
+ permanent: false // true for permanent delete
407
+ });
408
+
409
+ // Duplicate project
410
+ const cloned = await data.duplicate({
411
+ projectId: 'proj-123',
412
+ newName: 'My Design v2'
413
+ });
414
+
415
+ // List all projects
416
+ const projects = await data.listProjects({
417
+ limit: 20,
418
+ offset: 0,
419
+ sortBy: 'modified', // 'name', 'created', 'modified', 'size'
420
+ search: 'pump'
421
+ });
422
+ // Returns: [{id, name, description, created, modified, fileCount, sizeBytes, thumbnail, author}]
423
+
424
+ // Get recent projects
425
+ const recent = await data.getRecent({ limit: 20 });
426
+ ```
427
+
428
+ ### File Management
429
+ ```javascript
430
+ // Create folder
431
+ await data.createFolder({
432
+ path: '', // parent folder path
433
+ name: 'parts'
434
+ });
435
+
436
+ // Import file into project
437
+ await data.importFile({
438
+ file: userSelectedFile,
439
+ folder: 'parts/',
440
+ name: 'optional_override',
441
+ tags: ['purchased', 'plastic']
442
+ });
443
+
444
+ // Delete file
445
+ await data.deleteFile({
446
+ fileKey: 'parts/pump-body.ipt'
447
+ });
448
+
449
+ // List files in project
450
+ const files = await data.listFiles({ folder: 'parts/' });
451
+ // Returns: [{key, name, type, size, imported, tags}]
452
+ ```
453
+
454
+ ### Sharing
455
+ ```javascript
456
+ // Generate share link
457
+ const share = await data.shareLink({
458
+ projectId: 'proj-123',
459
+ role: 'viewer', // 'viewer' or 'editor'
460
+ expiresIn: 604800 // 1 week in seconds, null = never
461
+ });
462
+ // Returns: {link, code, role, expiresAt}
463
+ ```
464
+
465
+ ### Export/Import Projects
466
+ ```javascript
467
+ // Export project as JSON
468
+ const blob = await data.exportProject({
469
+ projectId: 'proj-123'
470
+ });
471
+
472
+ // Import exported project
473
+ const imported = await data.importProject({
474
+ file: userSelectedFile,
475
+ asCopy: true // create new project or overwrite
476
+ });
477
+ ```
478
+
479
+ ### Templates
480
+ ```javascript
481
+ // Create template from current project
482
+ await data.createTemplate({
483
+ projectId: 'proj-123',
484
+ name: 'Modular Pump',
485
+ description: 'Reusable pump with customizable bore'
486
+ });
487
+
488
+ // Create project from template
489
+ const proj = await data.fromTemplate({
490
+ templateName: 'Modular Pump',
491
+ newProjectName: 'Pump v2'
492
+ });
493
+
494
+ // List all templates
495
+ const templates = await data.listTemplates();
496
+ // Returns: [{name, description, created}]
497
+ ```
498
+
499
+ ### Trash & Recovery
500
+ ```javascript
501
+ // List deleted projects
502
+ const trash = await data.listTrash({ limit: 50 });
503
+ // Returns: [{id, name, deletedAt, recoveryUntil}]
504
+
505
+ // Restore project from trash
506
+ await data.restoreFromTrash({ projectId: 'proj-123' });
507
+
508
+ // Empty trash (permanent delete)
509
+ await data.emptyTrash({ permanentDelete: true });
510
+ ```
511
+
512
+ ### Backups
513
+ ```javascript
514
+ // Create manual backup
515
+ const backup = await data.createBackup({
516
+ projectId: 'proj-123'
517
+ });
518
+ // Returns: {id, projectId, timestamp, data}
519
+
520
+ // List backups for project
521
+ const backups = await data.listBackups({
522
+ projectId: 'proj-123'
523
+ });
524
+ // Returns: [{id, timestamp, sizeBytes}]
525
+ ```
526
+
527
+ ### Document Properties
528
+ ```javascript
529
+ // Set properties
530
+ await data.setDocumentProperties({
531
+ title: 'Pump Assembly',
532
+ author: 'John Smith',
533
+ description: '...',
534
+ tags: ['mechanical', 'water'],
535
+ version: '2.0'
536
+ });
537
+
538
+ // Get properties
539
+ const props = await data.getDocumentProperties();
540
+ // Returns: {title, description, author, created, modified, revision, tags, version}
541
+ ```
542
+
543
+ ### Units
544
+ ```javascript
545
+ // Set project units
546
+ await data.setUnits('mm');
547
+
548
+ // Convert between units
549
+ const converted = data.convertUnits(100, 'mm', 'inch');
550
+ // Result: 3.937...
551
+ ```
552
+
553
+ ### Search
554
+ ```javascript
555
+ // Full-text search
556
+ const results = await data.searchProjects({
557
+ query: 'pump',
558
+ limit: 20
559
+ });
560
+ // Returns: [{id, name, description, match}]
561
+ ```
562
+
563
+ ### Events
564
+ ```javascript
565
+ // Listen for data events
566
+ window.addEventListener('data:projectCreated', (e) => {
567
+ console.log('Project created:', e.detail);
568
+ });
569
+
570
+ window.addEventListener('data:projectLoaded', (e) => {
571
+ console.log('Project loaded:', e.detail);
572
+ });
573
+
574
+ window.addEventListener('data:projectSaved', (e) => {
575
+ console.log('Project saved:', e.detail.projectId);
576
+ });
577
+
578
+ window.addEventListener('data:crashDetected', (e) => {
579
+ console.log('Crash detected — offer recovery');
580
+ });
581
+
582
+ window.addEventListener('data:notification', (e) => {
583
+ console.log(`[${e.detail.type}] ${e.detail.message}`);
584
+ });
585
+ ```
586
+
587
+ ### State Access
588
+ ```javascript
589
+ // Current project
590
+ if (data.state.currentProject) {
591
+ console.log(data.state.currentProject.name);
592
+ }
593
+
594
+ // Recent files
595
+ console.log(data.state.recentFiles);
596
+
597
+ // Storage usage
598
+ console.log(`Using ${data.state.usageBytes / 1e6}MB of ${data.state.quotaBytes / 1e9}GB`);
599
+
600
+ // Auto-save interval
601
+ console.log(`Auto-save every ${data.state.autoSaveFrequency}ms`);
602
+ ```
603
+
604
+ ---
605
+
606
+ ## HELP ENTRIES
607
+
608
+ All three modules export comprehensive help documentation:
609
+
610
+ ```javascript
611
+ import scripting from './modules/scripting-module.js';
612
+ console.log(scripting.helpEntries);
613
+ // Each entry: {id, title, category, description, content}
614
+
615
+ import formats from './modules/formats-module.js';
616
+ console.log(formats.helpEntries);
617
+
618
+ import data from './modules/data-module.js';
619
+ console.log(data.helpEntries);
620
+ ```
621
+
622
+ ---
623
+
624
+ ## INTEGRATION EXAMPLE
625
+
626
+ ```javascript
627
+ // Complete workflow
628
+ import scripting from './modules/scripting-module.js';
629
+ import formats from './modules/formats-module.js';
630
+ import data from './modules/data-module.js';
631
+
632
+ // Initialize
633
+ scripting.init(viewport, kernel);
634
+ formats.init(viewport, kernel);
635
+ await data.init();
636
+
637
+ // Create project
638
+ const proj = await data.newProject({
639
+ name: 'New Design',
640
+ units: 'mm'
641
+ });
642
+
643
+ // Import CAD file
644
+ const imported = await formats.import_(file, 'step', {
645
+ unitFrom: 'mm',
646
+ centerModel: true
647
+ });
648
+
649
+ // Run script on imported geometry
650
+ await scripting.execute(`
651
+ cad.fillet(2);
652
+ cad.color(0x8899aa);
653
+ `);
654
+
655
+ // Save project
656
+ await data.save();
657
+
658
+ // Export result
659
+ await formats.export_('stl', {
660
+ filename: 'final.stl',
661
+ binary: true
662
+ });
663
+
664
+ // Create share link
665
+ const share = await data.shareLink({
666
+ role: 'viewer',
667
+ expiresIn: 604800
668
+ });
669
+
670
+ console.log('Share:', share.link);
671
+ ```
672
+
673
+ ---
674
+
675
+ ## ERROR HANDLING PATTERNS
676
+
677
+ ```javascript
678
+ // Scripting errors
679
+ try {
680
+ await scripting.execute(code);
681
+ } catch (error) {
682
+ const lastErr = scripting.getLastError();
683
+ console.error(lastErr.message);
684
+ scripting.clearError();
685
+ }
686
+
687
+ // Format errors
688
+ try {
689
+ await formats.import_(file);
690
+ } catch (error) {
691
+ const err = formats.getLastError();
692
+ console.error(`Import failed: ${err.message}`);
693
+ }
694
+
695
+ // Data errors
696
+ try {
697
+ await data.newProject({name: ''});
698
+ } catch (error) {
699
+ console.error(`Project error: ${error.message}`);
700
+ }
701
+
702
+ // Event-based errors
703
+ window.addEventListener('data:notification', (e) => {
704
+ if (e.detail.type === 'error') {
705
+ showUserAlert(e.detail.message);
706
+ }
707
+ });
708
+ ```
709
+
710
+ ---
711
+
712
+ **End of API Reference**