← Commit history

v1.9.45: mid-session seat takeover sweep (always take over; both dialogs; debounced toast)

John Lauer ·6f25de7d42 ·1mo ago ·parent fcbf72d
5 files changed +55−6
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.42\ No newline at end of file+1.9.45\ No newline at end of file
CHANGELOG.md+11
@@ -3,6 +3,17 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.9.45 - 2026-08-16++- **Seat conflicts: ALWAYS take over the session, even mid-session (John's call).** The proven+  background resolver (UIA-clicks Continue through BOTH Autodesk dialogs - 'Active Sessions+  Exceeded' then the 'Suspend Remote Session' confirm - with owned-popup verification) previously+  ran only at launch and on readiness polls, so a seat dialog popping mid-session sat unhandled.+  It now also runs from the janitor loop every ~20s: cheap no-op when clear, automatic takeover+  when Autodesk flags the session limit. Suspend is the pre-selected option, so the other+  machine's Fusion suspends RESUMABLY (nothing lost) and this machine gets the seat. The user+  gets ONE toast after a real takeover (debounced 120s) so they know the other box was suspended.+ ## 1.9.44 - 2026-08-16 (dashboard only; bridge zip stays 1.9.42)  - **Dashboard house-contract completion (John's callout: no favicon = not done).** Served
adom-bridge-fusion-manifest.json+4−4
@@ -1,10 +1,10 @@ {     "manifest_version": 1,     "name": "fusion360",-    "version": "1.9.42",-    "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.42/adom-bridge-fusion-v1.9.42.zip",-    "sha256": "dba598f8af903ab8884d969d4736ef94c8b42cf7e9492ee49f76d1a53d68d269",-    "size": 390596,+    "version": "1.9.45",+    "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.45/adom-bridge-fusion-v1.9.45.zip",+    "sha256": "1dbdcec7d90f98044b8a9595c3a7c6b5581f0c30bc4ea9a3886d577e958dee69",+    "size": 391583,     "verbPrefixes": [         "fusion_"     ],
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.9.42",+  "version": "1.9.45",   "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/fusion-bridge",   "author": "Adom Inc.",
server.py+38
@@ -4983,11 +4983,49 @@ def _signin_goal_met(kind) -> bool:         return False  +_last_seat_takeover_notice = [0.0]+++def _seat_sweep_tick():+    """ALWAYS take over the Autodesk seat (John, 2026-08-16: "always just take over the+    session"). The launch/readiness paths already auto-resolve the 'Active Sessions+    Exceeded' -> 'Suspend Remote Session' dialog pair, but a MID-SESSION seat conflict+    (Autodesk pops it whenever another machine signs in) sat unhandled until someone+    happened to poll readiness. This tick runs from the janitor loop every ~20s: cheap+    no-op when no dialog (local Win32 window walk), and when one IS up it clicks+    Continue on BOTH dialogs in the background (Suspend pre-selected = this machine+    takes the seat; the other machine's Fusion suspends resumably, nothing is lost).+    Toasts the user AFTER a real takeover so they know the other box got suspended."""+    try:+        if not find_licensing_dialog():+            return+        r = _resolve_seat_dialog(max_clicks=3)+        if r.get("clicks"):+            now = _t2.time()+            if now - _last_seat_takeover_notice[0] > 120:+                _last_seat_takeover_notice[0] = now+                try:+                    ad_client.notify(+                        "Fusion seat taken over on this machine",+                        "Autodesk flagged your account's session limit, so I clicked through the "+                        "'Active Sessions Exceeded' dialogs in the background and took the seat here. "+                        "Fusion on your other machine is SUSPENDED (resumable, nothing lost) - "+                        "using Fusion there will simply grab the seat back the same way.",+                        level="info", reach_user=True)+                except Exception:+                    pass+            print("[Fusion Bridge] seat sweep: took over the session (clicks=%s, verified=%s)"+                  % (r.get("clicks"), r.get("verified")))+    except Exception:+        pass++ def _signin_janitor_loop():     """Poll until each tracked sign-in window can be closed, then close it."""     while True:         try:             _t2.sleep(20)+            _seat_sweep_tick()             # Periodic AUTO-UPDATE sweep. Fusion's update nag only enters the UIA tree while its             # Job Status panel is open, so a single check at readiness time misses most of them.             # Sweeping on a schedule catches the nag whenever Fusion actually shows it, and the