← Commit history

v1.6.32: fix updating false-positive (stale webdeploy dirs) - caught on real laptop regression pass

John Lauer ·39e44b4450 ·3mo ago ·parent 667f9f2
5 files changed +37−16
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.6.31\ No newline at end of file+1.6.32\ No newline at end of file
CHANGELOG.md+10
@@ -3,6 +3,16 @@ 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.32 - 2026-07-06++- **Fixed a false positive in 1.6.31's `updating` detection** (caught immediately on a real laptop+  during a regression pass). Fusion NEVER prunes old `webdeploy\production` builds, so a normal+  machine accumulates many stale ones (the laptop had 5, dating back to April, Fusion not even+  running) - and the bare "2+ builds" heuristic fired permanently, falsely telling callers "Fusion+  is auto-updating, restarting every 30-60s" when Fusion was simply closed. `fusion_update_in_progress()`+  now requires ACTIVE streaming: 2+ launcher builds AND at least one build dir modified in the last+  ~20 min. Stale leftovers no longer trigger it; the genuine mid-update flap still does.+ ## 1.6.31 - 2026-07-05  - **`fusion_readiness` now reports a distinct `updating:true` status when Fusion is applying an
adom-bridge-fusion-manifest.json+5−5
@@ -1,13 +1,13 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.6.31",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.31/adom-bridge-fusion-v1.6.31.zip",-  "sha256": "f40e26b5e42760dbec3bad48330606aa69884a67015513ffb546afc97130701b",-  "size": 329710,+  "version": "1.6.32",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.32/adom-bridge-fusion-v1.6.32.zip",+  "sha256": "daaf252426ff17ee0a327ce003cabe704d525b871f0fefe90f1969c7da184086",+  "size": 330230,   "verbPrefixes": [     "fusion_"   ],   "healthEndpoint": "/status",-  "released_at": "2026-07-05T21:35:14Z"+  "released_at": "2026-07-06T10:51:48Z" }
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.6.31",+  "version": "1.6.32",   "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.",
fusion_detect.py+20−9
@@ -111,14 +111,23 @@ def _find_fusion_launcher() -> Path | None:   def fusion_update_in_progress() -> bool:-    """Best-effort: is Fusion mid AUTO-UPDATE? Signalled by TWO+ production build-    dirs (each with a FusionLauncher.exe) coexisting under webdeploy - the current-    build plus the new one Fusion's streamer is materializing. While that applies,+    """Best-effort: is Fusion ACTIVELY applying an auto-update right now? While it is,     Fusion crash-restarts ITSELF every ~30-60s, so verbs intermittently see 'not-    running' (observed live on a fresh VM 2026-07-05: hashes 441fa88... + 6a0c961...).-    Callers surface a distinct non-fatal `updating` status instead of a fatal error so-    a driving AI waits/retries rather than treating the flap as a crash. Never raises."""-    hashes = set()+    running' (observed live on a fresh VM 2026-07-05: hashes 441fa88... + 6a0c961...+    being streamed side by side). Callers surface a distinct non-fatal `updating`+    status instead of a fatal error so a driving AI waits/retries. Never raises.++    IMPORTANT (regression fix 2026-07-06, caught on a real laptop): a bare+    "2+ production dirs" count is NOT an update - Fusion NEVER prunes old webdeploy+    builds, so a normal machine accumulates many stale production dirs (the laptop had+    5, from April-June, Fusion not even running). That made the flag fire permanently+    and falsely. So require ACTIVE streaming: 2+ launcher builds AND at least one build+    dir TOUCHED in the last ~20 min (the streamer is writing into it). Stale leftover+    dirs have old mtimes and no longer trigger it."""+    import time as _t+    now = _t.time()+    RECENT_SECS = 20 * 60+    launcher_mtimes = []     for base in _WEBDEPLOY_BASES:         try:             if not base.exists():@@ -126,12 +135,14 @@ def fusion_update_in_progress() -> bool:             for d in base.iterdir():                 try:                     if d.is_dir() and (d / "FusionLauncher.exe").exists():-                        hashes.add(d.name)+                        launcher_mtimes.append(d.stat().st_mtime)                 except OSError:                     continue         except OSError:             continue-    return len(hashes) > 1+    if len(launcher_mtimes) < 2:+        return False+    return any((now - mt) < RECENT_SECS for mt in launcher_mtimes)   def _find_addins_dir() -> Path | None: