cyclecad 0.2.3 → 0.4.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/app/index.html CHANGED
@@ -1279,14 +1279,28 @@
1279
1279
 
1280
1280
  <!-- Token Engine — Initialize early so window.cycleCAD.tokens is available -->
1281
1281
  <script src="./js/token-engine.js"></script>
1282
- <!-- New Architecture Modules -->
1283
- <script src="./js/material-library.js"></script>
1282
+ <!-- New Architecture Modules (ES modules need type="module") -->
1283
+ <script type="module" src="./js/material-library.js"></script>
1284
1284
  <script src="./js/dfm-analyzer.js"></script>
1285
- <script src="./js/cam-pipeline.js"></script>
1285
+ <script type="module" src="./js/cam-pipeline.js"></script>
1286
1286
  <script src="./js/connected-fabs.js"></script>
1287
- <script src="./js/ai-copilot.js"></script>
1288
- <script src="./js/collaboration.js"></script>
1289
- <script src="./js/collaboration-ui.js"></script>
1287
+ <script type="module" src="./js/ai-copilot.js"></script>
1288
+ <script type="module" src="./js/collaboration.js"></script>
1289
+ <script type="module" src="./js/collaboration-ui.js"></script>
1290
+ <!-- CadXStudio-killer modules (IIFE, no imports) -->
1291
+ <script src="./js/text-to-cad.js"></script>
1292
+ <script src="./js/cam-operations.js"></script>
1293
+ <script src="./js/gcode-generator.js"></script>
1294
+ <script src="./js/machine-profiles.js"></script>
1295
+ <script src="./js/tool-library.js"></script>
1296
+ <script src="./js/stock-manager.js"></script>
1297
+ <script src="./js/sketch-enhance.js"></script>
1298
+ <script src="./js/section-view.js"></script>
1299
+ <!-- Marketplace V2 + GD&T + MISUMI + VR modules (IIFE, no imports) -->
1300
+ <script src="./js/marketplace-v2.js"></script>
1301
+ <script src="./js/gdt-training.js"></script>
1302
+ <script src="./js/misumi-catalog.js"></script>
1303
+ <script src="./js/cad-vr.js"></script>
1290
1304
  </head>
1291
1305
  <body>
1292
1306
  <div id="app">
@@ -1490,6 +1504,61 @@
1490
1504
  <span class="toolbar-label">Collab</span>
1491
1505
  </button>
1492
1506
  </div>
1507
+ <!-- CadXStudio-Killer Features -->
1508
+ <div class="toolbar-group">
1509
+ <button class="toolbar-button" id="btn-text2cad" title="Text-to-CAD — Natural Language 3D Modeling" style="background:rgba(168,85,247,0.1);border:1px solid rgba(168,85,247,0.3);">
1510
+ <span class="toolbar-icon">💬</span>
1511
+ <span class="toolbar-label">Text2CAD</span>
1512
+ </button>
1513
+ <button class="toolbar-button" id="btn-camops" title="CAM Operations — Outline, Rough, Pocket, Drill" style="background:rgba(234,179,8,0.1);border:1px solid rgba(234,179,8,0.3);">
1514
+ <span class="toolbar-icon">🔧</span>
1515
+ <span class="toolbar-label">CAM Ops</span>
1516
+ </button>
1517
+ <button class="toolbar-button" id="btn-gcode" title="G-Code Generator — CNC, FDM, Laser" style="background:rgba(16,185,129,0.1);border:1px solid rgba(16,185,129,0.3);">
1518
+ <span class="toolbar-icon">📄</span>
1519
+ <span class="toolbar-label">G-Code</span>
1520
+ </button>
1521
+ <button class="toolbar-button" id="btn-machines" title="Machine Profiles — 15+ CNC/FDM/Laser Presets" style="background:rgba(107,114,128,0.1);border:1px solid rgba(107,114,128,0.3);">
1522
+ <span class="toolbar-icon">🖥</span>
1523
+ <span class="toolbar-label">Machines</span>
1524
+ </button>
1525
+ <button class="toolbar-button" id="btn-tools" title="Tool Library — 30+ End Mills, Drills, V-Bits" style="background:rgba(239,68,68,0.1);border:1px solid rgba(239,68,68,0.3);">
1526
+ <span class="toolbar-icon">🔩</span>
1527
+ <span class="toolbar-label">Tools</span>
1528
+ </button>
1529
+ <button class="toolbar-button" id="btn-stock" title="Stock Manager — Workpiece Definition" style="background:rgba(245,158,11,0.1);border:1px solid rgba(245,158,11,0.3);">
1530
+ <span class="toolbar-icon">📦</span>
1531
+ <span class="toolbar-label">Stock</span>
1532
+ </button>
1533
+ <button class="toolbar-button" id="btn-sketch-enhance" title="Sketch Tools+ — Spline, Polygon, Text, Trim, Offset" style="background:rgba(59,130,246,0.1);border:1px solid rgba(59,130,246,0.3);">
1534
+ <span class="toolbar-icon">✏</span>
1535
+ <span class="toolbar-label">Sketch+</span>
1536
+ </button>
1537
+ <button class="toolbar-button" id="btn-section" title="Section View — Cut Planes (X)" style="background:rgba(220,38,38,0.1);border:1px solid rgba(220,38,38,0.3);">
1538
+ <span class="toolbar-icon">🔪</span>
1539
+ <span class="toolbar-label">Section</span>
1540
+ </button>
1541
+ </div>
1542
+
1543
+ <!-- Marketplace V2 + GD&T + MISUMI + VR -->
1544
+ <div class="toolbar-group">
1545
+ <button class="toolbar-button" id="btn-marketplace-v2" title="Model Marketplace (GrabCAD-style)" style="background:rgba(63,185,80,0.1);border:1px solid rgba(63,185,80,0.3);">
1546
+ <span class="toolbar-icon">🏪</span>
1547
+ <span class="toolbar-label">Market</span>
1548
+ </button>
1549
+ <button class="toolbar-button" id="btn-gdt" title="GD&T Training & Reference" style="background:rgba(210,153,34,0.1);border:1px solid rgba(210,153,34,0.3);">
1550
+ <span class="toolbar-icon">📐</span>
1551
+ <span class="toolbar-label">GD&T</span>
1552
+ </button>
1553
+ <button class="toolbar-button" id="btn-misumi" title="MISUMI Component Catalog" style="background:rgba(239,68,68,0.1);border:1px solid rgba(239,68,68,0.3);">
1554
+ <span class="toolbar-icon">🔩</span>
1555
+ <span class="toolbar-label">MISUMI</span>
1556
+ </button>
1557
+ <button class="toolbar-button" id="btn-vr" title="CAD2VR — View in Virtual Reality" style="background:rgba(168,85,247,0.1);border:1px solid rgba(168,85,247,0.3);">
1558
+ <span class="toolbar-icon">🥽</span>
1559
+ <span class="toolbar-label">VR</span>
1560
+ </button>
1561
+ </div>
1493
1562
 
1494
1563
  <!-- Agent API Panel -->
1495
1564
  <div class="toolbar-group">
@@ -1499,6 +1568,14 @@
1499
1568
  </button>
1500
1569
  </div>
1501
1570
 
1571
+ <!-- Help & Tutorials -->
1572
+ <div class="toolbar-group">
1573
+ <button class="toolbar-button" id="btn-help" title="Help & Tutorials (?)" style="background:rgba(88,166,255,0.1);border:1px solid rgba(88,166,255,0.3);">
1574
+ <span class="toolbar-icon">?</span>
1575
+ <span class="toolbar-label">Help</span>
1576
+ </button>
1577
+ </div>
1578
+
1502
1579
  <!-- Hard Reset -->
1503
1580
  <div class="toolbar-group">
1504
1581
  <button class="toolbar-button" id="btn-hard-reset" title="Clear cache and reload" style="color:#f55;">
@@ -3256,7 +3333,19 @@
3256
3333
  'materials-panel': '🎨 Material Library',
3257
3334
  'cam-panel': '⚙ CAM Pipeline',
3258
3335
  'fabs-panel': '🏗 Connected Fabs',
3259
- 'collab-panel': '👥 Collaboration'
3336
+ 'collab-panel': '👥 Collaboration',
3337
+ 'text2cad-panel': '🤖 Text-to-CAD',
3338
+ 'camops-panel': '🔧 CAM Operations',
3339
+ 'gcode-panel': '📄 G-Code Generator',
3340
+ 'machines-panel': '🖥 Machine Profiles',
3341
+ 'tools-panel': '🔩 Tool Library',
3342
+ 'stock-panel': '📦 Stock Manager',
3343
+ 'sketch-enhance-panel': '✏ Sketch Tools+',
3344
+ 'section-panel': '🔪 Section View',
3345
+ 'marketplace-v2-panel': '🏪 Model Marketplace',
3346
+ 'gdt-panel': '📐 GD&T Training',
3347
+ 'misumi-panel': '🔩 MISUMI Catalog',
3348
+ 'vr-panel': '🥽 CAD2VR'
3260
3349
  };
3261
3350
  header.innerHTML = `<span style="font-weight:600;font-size:13px;">${titles[panelId] || moduleKey}</span><button onclick="document.getElementById('${panelId}').style.display='none'" style="background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:16px;">✕</button>`;
3262
3351
  panel.appendChild(header);
@@ -3283,6 +3372,122 @@
3283
3372
  document.getElementById('btn-cam')?.addEventListener('click', () => toggleModulePanel('cam', 'cam-panel'));
3284
3373
  document.getElementById('btn-fabs')?.addEventListener('click', () => toggleModulePanel('fabs', 'fabs-panel'));
3285
3374
  document.getElementById('btn-collab')?.addEventListener('click', () => toggleModulePanel('collab', 'collab-panel'));
3375
+ document.getElementById('btn-text2cad')?.addEventListener('click', () => toggleModulePanel('textToCAD', 'text2cad-panel'));
3376
+ document.getElementById('btn-camops')?.addEventListener('click', () => toggleModulePanel('camOps', 'camops-panel'));
3377
+ document.getElementById('btn-gcode')?.addEventListener('click', () => toggleModulePanel('gcode', 'gcode-panel'));
3378
+ document.getElementById('btn-machines')?.addEventListener('click', () => toggleModulePanel('machines', 'machines-panel'));
3379
+ document.getElementById('btn-tools')?.addEventListener('click', () => toggleModulePanel('tools', 'tools-panel'));
3380
+ document.getElementById('btn-stock')?.addEventListener('click', () => toggleModulePanel('stock', 'stock-panel'));
3381
+ document.getElementById('btn-sketch-enhance')?.addEventListener('click', () => toggleModulePanel('sketchEnhance', 'sketch-enhance-panel'));
3382
+ document.getElementById('btn-section')?.addEventListener('click', () => toggleModulePanel('sectionView', 'section-panel'));
3383
+ document.getElementById('btn-marketplace-v2')?.addEventListener('click', () => toggleModulePanel('marketplaceV2', 'marketplace-v2-panel'));
3384
+ document.getElementById('btn-gdt')?.addEventListener('click', () => toggleModulePanel('gdtTraining', 'gdt-panel'));
3385
+ document.getElementById('btn-misumi')?.addEventListener('click', () => toggleModulePanel('misumi', 'misumi-panel'));
3386
+ document.getElementById('btn-vr')?.addEventListener('click', () => toggleModulePanel('cadVR', 'vr-panel'));
3387
+
3388
+ // ========== Help & Tutorials Panel ==========
3389
+ document.getElementById('btn-help')?.addEventListener('click', () => {
3390
+ let panel = document.getElementById('help-tutorials-panel');
3391
+ if (panel) { panel.style.display = panel.style.display === 'none' ? 'flex' : 'none'; return; }
3392
+ panel = document.createElement('div');
3393
+ panel.id = 'help-tutorials-panel';
3394
+ panel.style.cssText = 'position:fixed;top:60px;left:50%;transform:translateX(-50%);width:680px;max-height:85vh;overflow-y:auto;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:10px;z-index:600;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,0.6);';
3395
+ panel.innerHTML = `
3396
+ <div style="display:flex;justify-content:space-between;align-items:center;padding:14px 18px;border-bottom:1px solid var(--border-color);background:var(--bg-tertiary);border-radius:10px 10px 0 0;">
3397
+ <span style="font-weight:700;font-size:15px;">? Help & Tutorials</span>
3398
+ <button onclick="document.getElementById('help-tutorials-panel').style.display='none'" style="background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:18px;">x</button>
3399
+ </div>
3400
+ <div style="padding:18px;">
3401
+ <!-- Tutorials Section -->
3402
+ <div style="margin-bottom:20px;">
3403
+ <h3 style="font-size:14px;font-weight:600;margin-bottom:12px;color:var(--accent-blue);">Tutorials</h3>
3404
+ <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;">
3405
+ <a href="./tutorials/basic.html" style="text-decoration:none;display:block;padding:16px;background:linear-gradient(135deg,rgba(63,185,80,0.12),rgba(63,185,80,0.04));border:1px solid rgba(63,185,80,0.3);border-radius:8px;text-align:center;">
3406
+ <div style="font-size:28px;margin-bottom:8px;">&#x1F331;</div>
3407
+ <div style="font-weight:600;color:#3fb950;font-size:13px;">Basic</div>
3408
+ <div style="font-size:11px;color:var(--text-secondary);margin-top:4px;">First 3D part, sketches, extrude, export</div>
3409
+ </a>
3410
+ <a href="./tutorials/intermediate.html" style="text-decoration:none;display:block;padding:16px;background:linear-gradient(135deg,rgba(88,166,255,0.12),rgba(88,166,255,0.04));border:1px solid rgba(88,166,255,0.3);border-radius:8px;text-align:center;">
3411
+ <div style="font-size:28px;margin-bottom:8px;">&#x1F680;</div>
3412
+ <div style="font-weight:600;color:#58a6ff;font-size:13px;">Intermediate</div>
3413
+ <div style="font-size:11px;color:var(--text-secondary);margin-top:4px;">CAM, Text-to-CAD, assemblies, DFM</div>
3414
+ </a>
3415
+ <a href="./tutorials/advanced.html" style="text-decoration:none;display:block;padding:16px;background:linear-gradient(135deg,rgba(210,153,34,0.12),rgba(210,153,34,0.04));border:1px solid rgba(210,153,34,0.3);border-radius:8px;text-align:center;">
3416
+ <div style="font-size:28px;margin-bottom:8px;">&#x26A1;</div>
3417
+ <div style="font-weight:600;color:#d29922;font-size:13px;">Advanced</div>
3418
+ <div style="font-size:11px;color:var(--text-secondary);margin-top:4px;">Agent API, MCP, tokens, Docker, plugins</div>
3419
+ </a>
3420
+ </div>
3421
+ </div>
3422
+
3423
+ <!-- Keyboard Shortcuts -->
3424
+ <div style="margin-bottom:20px;">
3425
+ <h3 style="font-size:14px;font-weight:600;margin-bottom:10px;color:var(--accent-blue);">Keyboard Shortcuts</h3>
3426
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:11px;">
3427
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Undo</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">Ctrl+Z</kbd></div>
3428
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Redo</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">Ctrl+Y</kbd></div>
3429
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Extrude</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">E</kbd></div>
3430
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Revolve</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">R</kbd></div>
3431
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Toggle Grid</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">G</kbd></div>
3432
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Wireframe</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">W</kbd></div>
3433
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Fit All</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">V</kbd></div>
3434
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Delete</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">Del</kbd></div>
3435
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Cancel</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">Esc</kbd></div>
3436
+ <div style="display:flex;justify-content:space-between;padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;"><span>Save</span><kbd style="background:var(--bg-primary);padding:1px 6px;border-radius:3px;font-family:monospace;font-size:10px;border:1px solid var(--border-color);">Ctrl+S</kbd></div>
3437
+ </div>
3438
+ </div>
3439
+
3440
+ <!-- Feature Catalog -->
3441
+ <div style="margin-bottom:16px;">
3442
+ <h3 style="font-size:14px;font-weight:600;margin-bottom:10px;color:var(--accent-blue);">All Features (${Object.keys(window.cycleCAD || {}).length}+ modules)</h3>
3443
+ <div id="help-feature-list" style="max-height:280px;overflow-y:auto;border:1px solid var(--border-color);border-radius:6px;"></div>
3444
+ </div>
3445
+
3446
+ <!-- Links -->
3447
+ <div style="display:flex;gap:10px;flex-wrap:wrap;">
3448
+ <a href="https://github.com/vvlars-cmd/cyclecad" target="_blank" style="text-decoration:none;padding:8px 14px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:12px;">GitHub Repo</a>
3449
+ <a href="https://www.npmjs.com/package/cyclecad" target="_blank" style="text-decoration:none;padding:8px 14px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:12px;">npm Package</a>
3450
+ <a href="../" style="text-decoration:none;padding:8px 14px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:12px;">cyclecad.com</a>
3451
+ </div>
3452
+ </div>
3453
+ `;
3454
+ document.body.appendChild(panel);
3455
+
3456
+ // Populate feature list
3457
+ const features = [
3458
+ { cat: 'Core', items: ['3D Viewport (Three.js r170)', 'Sketch Engine (line, rect, circle, arc, polyline)', 'Constraint Solver (12 types)', 'Feature Tree', 'Parameter Editor', 'Undo/Redo History'] },
3459
+ { cat: 'Operations', items: ['Extrude', 'Revolve', 'Fillet', 'Chamfer', 'Boolean (union/cut/intersect)', 'Shell', 'Rectangular Pattern', 'Circular Pattern'] },
3460
+ { cat: 'Advanced Ops', items: ['Sweep (twist + scale)', 'Loft', 'Sheet Metal (bend/flange/tab/slot/unfold)', 'Spring Generator', 'Thread Generator'] },
3461
+ { cat: 'Sketch+', items: ['Spline', 'Polygon', 'Text', 'Ellipse', 'Slot', 'Trim/Extend/Split', 'Offset/Mirror/Scale'] },
3462
+ { cat: 'AI Tools', items: ['Text-to-CAD (6-step pipeline)', 'AI Copilot', 'AI Chatbot (Gemini + Groq)', 'DFM Analyzer', 'Batch AI Scan'] },
3463
+ { cat: 'CAM', items: ['CAM Operations (8 types)', 'G-Code Generator', 'Machine Profiles (15+)', 'Tool Library (30+ tools)', 'Stock Manager', 'Connected Fabs'] },
3464
+ { cat: 'Analysis', items: ['Section View', 'Material Library', 'Weight Estimator', 'Part Comparison', 'Clearance Checker'] },
3465
+ { cat: 'Import/Export', items: ['STL (ASCII + binary)', 'OBJ', 'glTF 2.0', 'DXF (2D + 3D)', 'cycleCAD JSON', 'Inventor .ipt/.iam', 'STEP (via server)'] },
3466
+ { cat: 'Platform', items: ['Agent API (55 commands)', 'MCP Server', 'REST API', 'CLI Tool', '$CYCLE Token Engine', 'Model Marketplace V2 (GrabCAD-style)', 'Collaboration', 'CAD2VR (WebXR)'] },
3467
+ { cat: 'Reference', items: ['GD&T Training (14 symbols, 50 quiz questions)', 'MISUMI Component Catalog (80+ parts)', 'McMaster-Carr Integration', 'FCF Builder', 'Tolerance Calculator'] },
3468
+ { cat: 'Utilities', items: ['Keyboard Shortcuts (25+)', 'Dark Theme', 'Performance Monitor', 'Grid Floor', 'Wireframe Toggle'] }
3469
+ ];
3470
+ const fl = document.getElementById('help-feature-list');
3471
+ if (fl) {
3472
+ fl.innerHTML = features.map(c => `
3473
+ <div style="border-bottom:1px solid var(--border-color);">
3474
+ <div style="padding:8px 12px;font-weight:600;font-size:12px;color:var(--accent-blue);background:var(--bg-tertiary);cursor:pointer;" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='none'?'block':'none';this.querySelector('span').textContent=this.nextElementSibling.style.display==='none'?'+':'-'">
3475
+ <span style="margin-right:6px;font-family:monospace;">-</span>${c.cat} <span style="color:var(--text-muted);font-weight:400;">(${c.items.length})</span>
3476
+ </div>
3477
+ <div style="padding:4px 12px 8px 28px;">
3478
+ ${c.items.map(i => `<div style="padding:2px 0;font-size:11px;color:var(--text-secondary);">${i}</div>`).join('')}
3479
+ </div>
3480
+ </div>
3481
+ `).join('');
3482
+ }
3483
+ });
3484
+
3485
+ // ? key opens help
3486
+ document.addEventListener('keydown', e => {
3487
+ if (e.key === '?' && !e.ctrlKey && !e.metaKey && document.activeElement.tagName !== 'INPUT' && document.activeElement.tagName !== 'TEXTAREA') {
3488
+ document.getElementById('btn-help')?.click();
3489
+ }
3490
+ });
3286
3491
 
3287
3492
  </script>
3288
3493
 
@@ -3633,6 +3838,6 @@
3633
3838
  </div>
3634
3839
  </div>
3635
3840
 
3636
- <span id="version-badge" style="position:fixed;bottom:10px;left:50%;transform:translateX(-50%);z-index:70;font-size:0.85rem;color:rgba(255,255,255,0.7);letter-spacing:0.1em;white-space:nowrap;padding:5px 14px;user-select:all;pointer-events:auto;font-family:monospace;font-weight:600;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.15);border-radius:6px;text-shadow:0 1px 3px rgba(0,0,0,0.5);" title="cycleCAD version">cycleCAD v0.2.2</span>
3841
+ <span id="version-badge" style="position:fixed;bottom:42px;left:50%;transform:translateX(-50%);z-index:999;font-size:0.9rem;color:rgba(255,255,255,0.9);letter-spacing:0.1em;white-space:nowrap;padding:6px 16px;user-select:all;pointer-events:auto;font-family:monospace;font-weight:700;background:rgba(0,0,0,0.7);border:1px solid rgba(88,166,255,0.4);border-radius:6px;text-shadow:0 1px 3px rgba(0,0,0,0.5);" title="cycleCAD version">cycleCAD v0.4.0</span>
3637
3842
  </body>
3638
3843
  </html>
@@ -93,7 +93,7 @@ export function initAgentAPI({ viewport, sketch, operations, advancedOps, export
93
93
  /**
94
94
  * Get module references (for debugging)
95
95
  */
96
- export function getModules() {
96
+ function getModules() {
97
97
  return {
98
98
  viewport: _viewport,
99
99
  sketch: _sketch,