← Commit history

v1.6.24: classify already_open + signin_required launch dialogs

John Lauer ·76edefc889 ·3mo ago ·parent 0426553
7 files changed +58−18
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.6.23\ No newline at end of file+1.6.24\ 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.24 - 2026-07-04++- **Two more launch dialogs are now classified IN CODE (caught live on the clean-VM drill):**+  "Fusion is already open / Multiple instances are not supported" (category `already_open` -+  auto-dismissed via Cancel; a singleton is never double-launched) and the first-run Autodesk+  "Welcome to Fusion / Signing in" window (category `signin_required` - SURFACED, never auto-closed,+  with a `_hint` to notify + drive Sign In / Open Product without touching credentials). Added an+  explicit `AUTO_DISMISS_CATEGORIES` set so only benign acks get WM_CLOSE'd; decisions + sign-in are+  returned as `needsUserDecision`/`needsSignin`. Fixes a latent bug where sign-in would have been+  auto-closed.+ ## 1.6.23 - 2026-07-04  - **NEW `fusion_install_fusion` - install Fusion for the user with ZERO approval-gated shell.** The
adom-bridge-fusion-manifest.json+5−5
@@ -1,13 +1,13 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.6.23",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.23/adom-bridge-fusion-v1.6.23.zip",-  "sha256": "bc25141b660d02172c07f679f1c8910e7532030092504774585bc9c39ff59275",-  "size": 315255,+  "version": "1.6.24",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge/1.6.24/adom-bridge-fusion-v1.6.24.zip",+  "sha256": "236f015eedcbf82adaea9bd6c7fc99426a0d64da464ef0343b0a92e4964c7052",+  "size": 316269,   "verbPrefixes": [     "fusion_"   ],   "healthEndpoint": "/status",-  "released_at": "2026-07-04T22:40:00Z"+  "released_at": "2026-07-04T23:30:00Z" }\ No newline at end of file
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.6.23",+  "version": "1.6.24",   "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.",
handlers/dialog_classify.py+23−1
@@ -85,6 +85,25 @@ _RULES = [      "Confirmation of a chosen 'suspend the OTHER machine's Fusion'. Only click Continue if the user "      "ALREADY chose suspend; otherwise Go Back and ASK. Never auto-confirm a seat action."), +    # A second Fusion launch while one is already running - the correct action is+    # CANCEL (Fusion is a singleton; a 2nd instance is never wanted by automation).+    (("fusion is already open", "multiple instances are not supported",+      "launch another fusion instance"),+     "already_open",+     "Fusion is ALREADY running - a second launch was attempted. Click CANCEL (never Launch): "+     "Fusion is a singleton and the running instance is the one to drive. This usually means a "+     "prior fusion_stop/kill did not fully clear the old process before relaunch."),++    # First-run Autodesk sign-in (the 'Welcome to Fusion / Sign In' window, and the+    # browser callback 'You're signed in ... Open Product'). NOT auto-dismissable -+    # it needs the user's login; drive the buttons (Sign In / Open Product) via UIA+    # but NEVER auto-fill credentials.+    (("welcome to fusion", "signing in - autodesk", "sign in - autodesk"),+     "signin_required",+     "Autodesk sign-in needed (first run). NOTIFY the user, drive the 'Sign In' button (desktop_ui_"+     "click), fetch any email OTP via adom-google, and after the browser shows \"You're signed in\" "+     "click its 'Open Product' button - but NEVER auto-enter the password/2FA. See fusion-aps-signin."),+     # webdeploy launch failure - an INCOMPLETE/stale production folder (missing     # FusionLauncher.exe.ini). Benign to dismiss; means you launched the wrong hash.     (("error launching streamed application", "missing or incomplete", "please re-install",@@ -98,8 +117,11 @@ _RULES = [ # Categories that require a USER decision — the launch code must NOT auto-dismiss # these; it surfaces them + fires a notify_user + asks. DECISION_CATEGORIES = {"session_conflict_decision", "session_suspend_confirm"}+# Categories the launch code MAY auto-dismiss (a benign ack; WM_CLOSE == Cancel/OK).+# Everything else (decisions, sign-in) is SURFACED, never auto-closed.+AUTO_DISMISS_CATEGORIES = {"launch_error", "already_open"} # Launch/setup categories enumerated across ALL top-level windows (not just Fusion).-_LAUNCH_CATEGORIES = DECISION_CATEGORIES | {"launch_error"}+_LAUNCH_CATEGORIES = DECISION_CATEGORIES | {"launch_error", "already_open", "signin_required"}   def _category_for_title(title: str):
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-desktop-fusion-bridge",-  "version": "1.6.23",+  "version": "1.6.24",   "type": "app",   "description": "Drive Autodesk Fusion 360 from the cloud via Adom Desktop: 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 with browse/recent/versions, cloud download/upload and folder creation, and in-app parametric modeling. Never-charge: APS calls are capped to the free tier.",   "dependencies": {},
server.py+16−9
@@ -33,7 +33,7 @@ from handlers.fusion_ui import (     close_window,     get_fusion_window_info, )-from handlers.dialog_classify import classify_blocking_dialogs, classify_launch_dialogs, close_dialog_bg+from handlers.dialog_classify import classify_blocking_dialogs, classify_launch_dialogs, close_dialog_bg, AUTO_DISMISS_CATEGORIES from install_addin import install as install_addin import aps import describe@@ -141,19 +141,26 @@ def _handle_launch(fusion_info: dict, args: dict) -> dict:     # returned for the AI to notify_user + ASK - never auto-picked.     launch_dialogs = classify_launch_dialogs()     for _dlg in launch_dialogs:-        if not _dlg.get("decision"):-            close_dialog_bg(_dlg.get("hwnd"))  # benign ack (incomplete-webdeploy launch error)-    _decisions = [d for d in launch_dialogs if d.get("decision")]-    if _decisions:+        if _dlg.get("category") in AUTO_DISMISS_CATEGORIES:+            close_dialog_bg(_dlg.get("hwnd"))  # benign ack (WM_CLOSE == Cancel/OK)+    # Surface anything needing the USER: seat DECISIONS + first-run SIGN-IN. Never+    # auto-close these (a WM_CLOSE would kill the sign-in window).+    _needs_user = [d for d in launch_dialogs+                   if d.get("decision") or d.get("category") == "signin_required"]+    if _needs_user:+        _signin = any(d.get("category") == "signin_required" for d in _needs_user)         return {             "success": True,             "needsUserDecision": True,+            "needsSignin": _signin,             "setupDialogs": launch_dialogs,             "resolvedPath": fusion_info.get("exe_path", ""),-            "_hint": ("A licensing/seat DECISION dialog is up during launch (e.g. 'Active Sessions "-                      "Exceeded'). Do NOT auto-pick - the options affect the user's OTHER machine. "-                      "Fire a notify_user, ASK the user which option they want, then click it with "-                      "desktop_ui_click. " + " ".join(d["resolution"] for d in _decisions)),+            "_hint": (("First-run Autodesk SIGN-IN is required: notify_user, then drive the "+                       "'Sign In' button + the browser 'Open Product' via desktop_ui_click; NEVER "+                       "auto-enter password/2FA. " if _signin else "")+                      + ("A licensing/seat DECISION dialog is up - do NOT auto-pick; notify_user + ASK. "+                         if any(d.get("decision") for d in _needs_user) else "")+                      + " ".join(d["resolution"] for d in _needs_user)),         }      _RELAY_BUDGET = 50  # keep total handler time under AD's ~60s relay cap