← Commit history

diagnose why the bridge could not reach nbrowser_* (report _adCallError)

John Lauer ·48a32e858b ·2mo ago ·parent c986f02
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" }\ No newline at end of file
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." }\ No newline at end of file
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 "