← Commit history
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.104+1.9.105
adom-bridge-fusion-manifest.json+4−4
@@ -1,10 +1,10 @@ {     "manifest_version": 1,     "name": "fusion360",-    "version": "1.9.104",-    "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.119/adom-bridge-fusion-v1.9.104.zip",-    "sha256": "83a2a963ef55fe9aea7e0a77d280b82a1ce649793bb3bf0250808073a3ff2670",-    "size": 440526,+    "version": "1.9.105",+    "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.120/adom-bridge-fusion-v1.9.105.zip",+    "sha256": "766da0cbb4887b49a9388d2f7b3ff8a1038d769bb05fb7e972530e0d2a5bf4f6",+    "size": 441042,     "verbPrefixes": [         "fusion_"     ],
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.9.104",+  "version": "1.9.105",   "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.",
dashboard/Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.119"+version = "1.9.120" edition = "2021"  [dependencies]
handlers/dialog_classify.py+9
@@ -101,6 +101,15 @@ _RULES = [     # Autodesk SEAT conflict — a DECISION dialog. The options suspend / shut down     # Fusion on the user's OTHER machine (risking its unsaved work), so NEVER     # auto-pick: notify + ASK the user which option they want.+    # "Session Suspended" - the OTHER side of the seat conflict: another box took the seat+    # and THIS box's session is suspended. The remedy is 'Check again' (regrab), never+    # 'Shut Down' (signs this box out). John, 2026-08-21: "always regrab the session."+    (("session suspended", "suspended this session", "suspended by:"),+     "session_suspended_regrab",+     "This box's Autodesk session was SUSPENDED by another machine taking the seat. The "+     "bridge clicks 'Check again' to regrab it (background UIA). Never click 'Shut Down' - "+     "that signs this box out."),+     (("active sessions exceeded", "more active sessions", "more sessions running than are allowed",       "sessions running than are allowed"),      "session_conflict_decision",
install.sh+1−1
@@ -21,7 +21,7 @@ echo "Installed fusion-bridge skills: $(ls "$PKG_DIR/skills" 2>/dev/null | tr '\ # binary (the three-artifact pattern: bridge zip -> ab, THIS pkg -> container skills + # this download, page media -> wiki). Per the wiki's PKG_VS_RELEASE policy, binaries are # platform-tagged RELEASE assets, never tarball content - the installer fetches them.-DASH_VERSION="1.9.119"+DASH_VERSION="1.9.120" DASH_URL="https://wiki.adom.inc/download/adom/fusion-bridge/${DASH_VERSION}/fusion-dashboard" DEST="" if [ -w /usr/local/bin ]; then DEST=/usr/local/bin
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "fusion-bridge",-  "version": "1.9.119",+  "version": "1.9.120",   "type": "app",   "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.",   "dependencies": {
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "fusion-bridge",-  "version": "1.9.119",+  "version": "1.9.120",   "type": "app",   "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.",   "dependencies": {
server.py+16−2
@@ -180,8 +180,22 @@ def _resolve_seat_via_uia(dlg: dict) -> bool:         hwnd = dlg.get("hwnd")         if not hwnd or not ad_client.available():             return False-        res = ad_client.call("desktop_ui_click", {"hwnd": hwnd, "name": "Continue"}, timeout=4)-        return bool(res and (res.get("success") or res.get("status") == "ok"))+        # TWO variants of the seat dialog, opposite buttons (John, 2026-08-21: "when you see+        # this dialog, always regrab the session"):+        #   "Active Sessions Exceeded"  -> Continue    (take the seat; Suspend is pre-selected)+        #   "Session Suspended"         -> Check again (RESTORE this box's suspended session -+        #                                  the other box took the seat and this one must ask+        #                                  for it back; Shut Down would sign this box out)+        # Try Continue first (the common variant), then Check again. desktop_ui_click on a+        # button that does not exist is a cheap no-op, so probing both costs nothing.+        for btn in ("Continue", "Check again"):+            res = ad_client.call("desktop_ui_click", {"hwnd": hwnd, "name": btn}, timeout=4)+            if res and (res.get("success") or res.get("status") == "ok"):+                if btn == "Check again":+                    print("[Fusion Bridge] seat: clicked 'Check again' to REGRAB the suspended "+                          "session (Session Suspended variant)")+                return True+        return False     except Exception:         return False