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
diagnose why the bridge could not reach nbrowser_* (report _adCallError)
5 files changed
+32−19
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.6.86+1.6.87
adom-bridge-fusion-manifest.json+5−5@@ -1,13 +1,13 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.6.86",- "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.86/adom-bridge-fusion-v1.6.86.zip",- "sha256": "f6b7a099f574df5624b11c145c45293ced92ac23023b0671dd3a1ff1497c3f90",- "size": 469225,+ "version": "1.6.87",+ "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.87/adom-bridge-fusion-v1.6.87.zip",+ "sha256": "9db224ca217b64d811f7b8d08be7357e35ff0ba2cad989a9ea9fbd29fd4610ed",+ "size": 469400, "verbPrefixes": [ "fusion_" ], "healthEndpoint": "/status",- "released_at": "2026-07-20T11:27:05Z"+ "released_at": "2026-07-20T11:29:10Z" }
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.6.86",+ "version": "1.6.87", "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.",
page.json+2−3@@ -1,6 +1,6 @@ { "slug": "adom-desktop-fusion-bridge",- "version": "1.6.86",+ "version": "1.6.87", "type": "app", "description": "Installs this bridge's skills into your container so your AI knows how to drive the bridge. The bridge runtime itself is loaded by Adom Desktop from the release zip.", "dependencies": {@@ -73,6 +73,5 @@ "set up the fusion bridge" ], "discovery_pitch": "Use the Adom Desktop Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Desktop. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).",- "brief": "Drive Autodesk Fusion 360 from the cloud via Adom Desktop: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.",- "visibility": "public"+ "brief": "Drive Autodesk Fusion 360 from the cloud via Adom Desktop: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling." }
server.py+23−9@@ -3584,18 +3584,29 @@ def _ad_call(verb: str, args: dict, timeout: int = 60) -> dict: Prefers the in-process ad_client; falls back to the adom-desktop CLI (which joins the relay itself) so this still works on an unattended VM where ad_client is down. Never raises - returns {} on failure so callers can degrade to instructing the AI instead."""+ why = [] try: if ad_client.available():- r = ad_client.call(verb, args)+ r = ad_client.call(verb, args, timeout=timeout) if isinstance(r, dict):+ inner = r.get("output")+ if isinstance(inner, str) and inner.strip().startswith("{"):+ import json as _j0+ try:+ return _j0.loads(inner)+ except Exception:+ return r return r- except Exception:- pass+ why.append("ad_client.call returned %r" % type(r).__name__)+ else:+ why.append("ad_client unavailable")+ except Exception as e:+ why.append("ad_client raised %s" % e) try: import subprocess as _sp, json as _j exe = _find_adom_desktop_cli() if not exe:- return {}+ return {"_adCallError": "; ".join(why + ["adom-desktop CLI not found"])} p = _sp.run([exe, verb, _j.dumps(args)], capture_output=True, text=True, timeout=timeout) out = (p.stdout or "").strip() if out.startswith("{"):@@ -3607,9 +3618,10 @@ def _ad_call(verb: str, args: dict, timeout: int = 60) -> dict: except Exception: return d return d- except Exception:- pass- return {}+ why.append("cli stdout not json: %s" % (out[:120] or (p.stderr or "")[:120]))+ except Exception as e:+ why.append("cli raised %s" % e)+ return {"_adCallError": "; ".join(why)} def _orchestrate_demo(args: dict) -> dict:@@ -3695,8 +3707,10 @@ def _orchestrate_demo(args: dict) -> dict: where = (profile_used.split(":", 1)[0].title() if profile_used else "your browser") if profile_used and "@" in profile_used: where += " (%s)" % profile_used.split(":", 1)[1]- steps.append("opened Autodesk sign-in in %s (background)" % (where or "browser") if opened- else "could not auto-open the browser sign-in")+ if opened:+ steps.append("opened Autodesk sign-in in %s (background)" % (where or "browser"))+ else:+ steps.append("could not auto-open the browser sign-in: %s" % (nb.get("_adCallError") or nb_state or "unknown")) if opened: narrate = ("I've opened the Autodesk sign-in for you in %s - it's sitting in the " "background so it won't interrupt what you're doing. Finish it whenever you "