app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
v1.6.30: install_fusion + start live-detect (fix stale already-installed on fresh VM)
5 files changed
+25−8
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.6.29+1.6.30
CHANGELOG.md+9@@ -3,6 +3,15 @@ All notable changes to the Adom Desktop Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/adom-desktop-fusion-bridge ยท GitHub backup: `adom-inc/adom-desktop-fusion-bridge` +## 1.6.30 - 2026-07-05++- **`fusion_install_fusion` and `fusion_start` now live-detect too** (completing the 1.6.29 fix). Both+ still trusted the stale bridge-start `fusion_info.installed` snapshot: on the fresh VM,+ `fusion_install_fusion` REFUSED with "already installed" though disk was `NO_WEBDEPLOY`, blocking the+ reinstall, and `fusion_start` would launch into the void. Both now call `detect_fusion()` for the+ on-disk truth; `fusion_start` also reassigns from it so a launch immediately after a fresh install+ uses a current `exe_path`. Found + fixed live during the fresh-VM battery.+ ## 1.6.29 - 2026-07-05 - **Fixed `fusion_readiness` trusting a stale install cache.** It read the bridge-START
adom-bridge-fusion-manifest.json+5−5@@ -1,13 +1,13 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.6.29",- "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.29/adom-bridge-fusion-v1.6.29.zip",- "sha256": "24d0f185b6e79e84b184a03cbdaf3d1ab9eb803162c47ff605ccded702bd54aa",- "size": 327829,+ "version": "1.6.30",+ "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.30/adom-bridge-fusion-v1.6.30.zip",+ "sha256": "18af4245248fb8803c767164ba74fce5b8c25c54114e0661f7da44982850578e",+ "size": 328197, "verbPrefixes": [ "fusion_" ], "healthEndpoint": "/status",- "released_at": "2026-07-05T20:41:01Z"+ "released_at": "2026-07-05T20:44:46Z" }
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.6.29",+ "version": "1.6.30", "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", "homepage": "https://wiki.adom.inc/adom/adom-desktop-fusion-bridge", "author": "Adom Inc.",
server.py+9−1@@ -94,6 +94,10 @@ fusion_info = None def _handle_launch(fusion_info: dict, args: dict) -> dict: """Launch Fusion 360 and optionally wait for the AdomBridge add-in."""+ # LIVE detect (not the stale bridge-start fusion_info snapshot) so a launch right+ # after a fresh install is recognized (with a current exe_path) and a launch after a+ # removal fails cleanly. Reassign so the whole handler uses fresh paths.+ fusion_info = detect_fusion() if not fusion_info.get("installed"): return { "success": False,@@ -713,7 +717,11 @@ def _handle_install_fusion(fusion_info: dict, args: dict) -> dict: UAC; the per-user install needs no elevation and lands in %LOCALAPPDATA%, which detect covers). Returns PROMPTLY - the stream takes 10-30 min; poll fusion_readiness until installed:true."""- if fusion_info.get("installed") or detect_fusion().get("installed"):+ # LIVE detect only - never trust the bridge-start fusion_info snapshot, which can be+ # stale-True after Fusion was removed while the bridge kept running (found live on a+ # fresh VM 2026-07-05: this verb refused with "already installed" though disk was+ # NO_WEBDEPLOY, blocking the reinstall). detect_fusion() is the on-disk truth.+ if detect_fusion().get("installed"): return {"success": True, "alreadyInstalled": True, "_hint": "Fusion 360 is already installed - call fusion_start to launch it."} if _installer_running():