← Commit history

v1.6.27: scope needsSignin detection to Fusion-process window (fix Edge-tab false positive)

John Lauer ·ce4d8ea939 ·3mo ago ·parent 12a26b3
5 files changed +39−19
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.6.26\ No newline at end of file+1.6.27\ No newline at end of file
CHANGELOG.md+11
@@ -3,6 +3,17 @@ 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.27 - 2026-07-05++- **Fixed a false-positive in 1.6.26's new `needsSignin` readiness detection** (caught live before+  release to any consumer). 1.6.26 derived `needsSignin` from `classify_launch_dialogs()`, which+  enumerates ALL top-level windows and so matched a stray Edge **browser tab** titled "Sign in -+  Autodesk" - reporting `needsSignin:true` while Fusion was actually signed in and drivable. Now the+  detection is scoped to the **Fusion-process window** (`get_fusion_window_info` title/`mainEnabled`)+  and is only evaluated when the **add-in isn't responding** (a responding add-in = past sign-in =+  drivable), so a leftover browser tab can never trigger it. Verified on ADOMBASELINE: signed-in+  Fusion now reports `ready:true`.+ ## 1.6.26 - 2026-07-05  - **Adopted AD 1.9.84's direct API (disc #78): the bridge now calls `notify_user` ITSELF, cross-AD.**
adom-bridge-fusion-manifest.json+5−5
@@ -1,13 +1,13 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.6.26",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.26/adom-bridge-fusion-v1.6.26.zip",-  "sha256": "b39d0c27ffda6c5c254e2c9728e40e1422ea4c35ab9034049a386d0ebad7c6b8",-  "size": 323405,+  "version": "1.6.27",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.27/adom-bridge-fusion-v1.6.27.zip",+  "sha256": "73e9591b4d902770827920f1d059a232609945401b2524de6bf8d842137ad4c9",+  "size": 323919,   "verbPrefixes": [     "fusion_"   ],   "healthEndpoint": "/status",-  "released_at": "2026-07-05T12:20:55Z"+  "released_at": "2026-07-05T12:24:43Z" }
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.6.26",+  "version": "1.6.27",   "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+21−12
@@ -767,28 +767,37 @@ def _handle_fusion_readiness(fusion_info: dict, args: dict) -> dict:     running = _is_fusion_running() if installed else False     installing = (not installed) and _installer_running() +    # The add-in only serves once Fusion is PAST sign-in (its HTTP server runs on+    # Fusion's main thread, which the sign-in modal blocks). So a responding add-in+    # is the definitive "signed in + drivable" signal.+    addin_status = _check_addin_status(timeout=1.0) if running else None+    addin_ok = addin_status is not None+     # Fusion can be RUNNING yet not drivable: the first-run Autodesk sign-in modal     # ("Signing in - Autodesk Fusion" / "Welcome to Fusion") blocks the main thread,     # so the add-in never serves and every modeling verb hangs. The old code reported-    # ready:True here ("READY - drive Fusion") purely on installed+running, which was-    # a lie during sign-in. Detect it and downgrade to needsSignin so the caller-    # drives the sign-in instead of firing a verb into a wall.+    # ready:True here purely on installed+running, which was a lie during sign-in.+    # Detect it from the FUSION-PROCESS window title/enabled state - NOT+    # classify_launch_dialogs, which scans ALL top-level windows and false-matches a+    # stray Edge "Sign in - Autodesk" BROWSER tab (caught live 2026-07-05). Only+    # considered when the add-in is NOT responding (a responding add-in => signed in).     needs_signin = False-    if running:+    if running and not addin_ok:         try:-            needs_signin = any(d.get("category") == "signin_required"-                               for d in classify_launch_dialogs())+            finfo = get_fusion_window_info() or {}+            _t = (finfo.get("title") or "").lower()+            needs_signin = ("signing in" in _t or "welcome to fusion" in _t+                            or ("sign in - autodesk" in _t and "fusion" in _t))         except Exception:             needs_signin = False     ready = installed and running and not needs_signin -    # When Fusion is up, also check the add-in isn't STALE (issue #55) so a fresh-    # readiness call surfaces the mismatch instead of a later verb failing silently.+    # When Fusion is up + signed in, also check the add-in isn't STALE (issue #55) so+    # a fresh readiness call surfaces the mismatch instead of a later verb failing+    # silently. Reuse the add-in status already fetched above (no second probe).     stale_info = {}-    if running and not needs_signin:-        addin_status = _check_addin_status(timeout=1.0)-        if addin_status is not None:-            stale_info = _addin_staleness(addin_status.get("version"))+    if addin_ok:+        stale_info = _addin_staleness(addin_status.get("version"))      if needs_signin:         hint = ("Fusion is RUNNING but stuck at the first-run Autodesk SIGN-IN (main UI blocked, "