← Commit history

v1.6.42: seat-resolve retries until verified gone + priority over stale add-in port

John Lauer ·2969fd3194 ·3mo ago ·parent 5630714
5 files changed +46−20
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.6.41\ No newline at end of file+1.6.42\ No newline at end of file
CHANGELOG.md+12
@@ -3,6 +3,18 @@ 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.42 - 2026-07-06++- **Seat-resolve now RETRIES until the dialog is verified gone, and takes priority over a stale add-in+  port** (the bug that made 1.6.40 look solved when it wasn't - John caught it live). Two fixes: (1) the+  first UIA `Continue` Invoke on a mid-render dialog silently NO-OPs, so the launch loop now re-invokes+  every tick until `find_licensing_dialog` no longer sees it, instead of clicking once; (2) the loop+  and `fusion_readiness` no longer trust the add-in probe while the seat dialog is up - a STALE add-in+  server from a prior killed instance keeps port 8774 answering, which made the loop break early and+  readiness report `licensingDialog:false`/`ready:*` while the dialog sat right there on screen. Seat+  dialog now blocks `ready` whenever detected. Verified: full verb battery passes on the laptop+  (modeling, EPG+etch->STEP 234KB, export 234KB, dark mode) once the seat dialog is auto-cleared.+ ## 1.6.41 - 2026-07-06  - **Instant-minimize: disable the minimize ANIMATION during launch** so the focus-guard's minimize is
adom-bridge-fusion-manifest.json+5−5
@@ -1,13 +1,13 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.6.41",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.41/adom-bridge-fusion-v1.6.41.zip",-  "sha256": "7d23f4362e609d733d59a49bc1be69e5515c6df81d6c87b1fd52012121ecdcf6",-  "size": 340280,+  "version": "1.6.42",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.42/adom-bridge-fusion-v1.6.42.zip",+  "sha256": "19b1f290128591fed964570ab8f57be5eefcd2b04287e274672d4ad08a6d5104",+  "size": 340876,   "verbPrefixes": [     "fusion_"   ],   "healthEndpoint": "/status",-  "released_at": "2026-07-06T13:16:31Z"+  "released_at": "2026-07-06T13:47:22Z" }
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.6.41",+  "version": "1.6.42",   "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+27−13
@@ -210,21 +210,30 @@ def _handle_launch(fusion_info: dict, args: dict) -> dict:     _seat_clicks = 0     addin_ok = False     while _t.time() < _deadline:+        # SEAT/LICENSING dialog takes PRIORITY over the add-in probe (fix, caught live+        # 2026-07-06): a STALE add-in port from a prior instance can answer while the+        # CURRENT Fusion sits blocked behind the seat dialog - so we must NOT break on+        # the add-in while the dialog is up. And the first UIA Invoke on a mid-render+        # dialog silently NO-OPs, so keep invoking 'Continue' EVERY tick until+        # find_licensing_dialog no longer sees it (verified gone), not just once.+        try:+            _lic = find_licensing_dialog()+        except Exception:+            _lic = None+        if _lic:+            if _seat_clicks < 10:+                if _resolve_seat_via_uia(_lic):+                    _seat_clicks += 1+            _t.sleep(1.5)+            continue+        # No seat dialog -> is the add-in actually serving? (ground truth for drivable)         if _probe_addin(timeout=1.5):             addin_ok = True             break         try:-            _lic = find_licensing_dialog()+            dismiss_recovery_dialog()         except Exception:-            _lic = None-        if _lic and _seat_clicks < 5:-            if _resolve_seat_via_uia(_lic):-                _seat_clicks += 1-        else:-            try:-                dismiss_recovery_dialog()-            except Exception:-                pass+            pass         _t.sleep(2.5)      if not addin_ok:@@ -834,14 +843,19 @@ def _handle_fusion_readiness(fusion_info: dict, args: dict) -> dict:     ready = installed and running and addin_ok and not needs_signin      # SEAT/LICENSING dialog blocking the launch - detected DETERMINISTICALLY by owning-    # process + dialog size (not the "Fusion360" title). Reported so a caller knows the-    # block is a seat conflict (fusion_start auto-reclaims it), not a generic hang.+    # process + dialog size (not the "Fusion360" title). Checked WHENEVER running, not+    # only when the add-in is silent (fix 2026-07-06): a STALE add-in port from a prior+    # instance answers while the CURRENT Fusion sits blocked behind the seat dialog, so+    # gating on `not addin_ok` false-negatived `licensingDialog` while the dialog sat+    # right there on the user's screen.     licensing = False-    if running and not addin_ok:+    if running:         try:             licensing = find_licensing_dialog() is not None         except Exception:             licensing = False+    if licensing:+        ready = False  # a seat/licensing dialog blocking the UI is never "ready"      # Fusion applying an AUTO-UPDATE (two+ webdeploy builds) crash-restarts itself every     # ~30-60s, so a verb intermittently sees running:false. That is NOT a crash or a