app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
Docs + hints: prefer adom-bridge per ab 2.0.33 (Linux CLI rename; .exe references unchanged)
2 files changed
+9−9
aps.py+1−1@@ -333,7 +333,7 @@ def _signin_setup_chain(opened: bool, abe: dict) -> list: "purpose": "Autodesk APS consent", "profile": "chrome:<their-autodesk-email>", "url": "<authUrl from this response>"}, "note": "EXTENSION-FREE - works with no Adom extension installed. If this verb is "- "unknown, adom-bridge-cli on this box is too old: update it (or have "+ "unknown, the adom-bridge CLI on this box is too old: update it (or have " "the user paste authUrl into the right profile by hand)."}, {"step": "user_approves", "do": "Ask the user to approve in that profile; without the extension we cannot click for them."},
server.py+8−8@@ -280,7 +280,7 @@ def _find_adom_desktop_cli() -> str | None: def _cli_notify_all(title: str, body: str, level: str) -> dict:- """Deliver a toast to EVERY connected desktop via `adom-bridge-cli --target all notify_user`. This is+ """Deliver a toast to EVERY connected desktop via `adom-bridge --target all notify_user`. This is the reliable cross-AD path when the bridge's in-process ad_client is down (headless VM): the CLI joins the relay itself and `--target all` reaches the user's real machine (not just this VM). Best-effort + never raises. Returns {delivered, targets, error}. (John 2026-07-14: the notify MUST@@ -288,7 +288,7 @@ def _cli_notify_all(title: str, body: str, level: str) -> dict: import subprocess as _sp exe = _find_adom_desktop_cli() if not exe:- return {"delivered": False, "error": "adom-bridge-cli not found"}+ return {"delivered": False, "error": "adom-bridge CLI not found"} # STICKY by default: a human-wall alert must NOT vanish in a few seconds (John 2026-07-14 - the # first toasts disappeared before he noticed them). scenario:reminder keeps it on screen until the # user acts; it REQUIRES >=1 button, so include one. durationLong is a belt-and-suspenders ~25s.@@ -324,24 +324,24 @@ def _handle_notify_owner(args: dict) -> dict: # ad_client is the bridge's IN-PROCESS AD API - it is routinely UNAVAILABLE when this bridge # runs on an unattended Hyper-V VM (found live 2026-07-14: the toast silently never reached the # user, and the AI "forgot" to relay it - exactly the failure John demanded we engineer out).- # SELF-DELIVER via adom-bridge-cli, which connects to the relay independently: `--target+ # SELF-DELIVER via the adom-bridge CLI, which connects to the relay independently: `--target # all` fans the toast out to EVERY connected desktop (the VM + the user's real machines), so it # reliably lands on the computer the user is actually AT. No AI relay step to forget. cli = _cli_notify_all(title, body, level) if cli.get("delivered"): return {"success": True, "via": "cli:--target all", "targets": cli.get("targets"), "_hint": ("Toast fanned out to ALL connected desktops (the user's main machine "- "included) via adom-bridge-cli, because the bridge's in-process AD "+ "included) via the adom-bridge CLI, because the bridge's in-process AD " "API was unavailable (this VM). WAIT and poll fusion_readiness; do not " "re-toast within a few minutes. Only notify when the box is ACTUALLY " "ready for the user to act - do not toast for a step you can do yourself.")} # CLI fallback also failed - return the payload so the AI can relay as the true last resort. return { "success": False,- "error": "AD in-process API unavailable AND the adom-bridge-cli fallback failed: "+ "error": "AD in-process API unavailable AND the adom-bridge CLI fallback failed: " + str(cli.get("error"))[:200], "notifyUser": {"title": title, "body": body, "level": level},- "_hint": ("Relay the notifyUser payload yourself: `adom-bridge-cli --target all notify_user "+ "_hint": ("Relay the notifyUser payload yourself: `adom-bridge --target all notify_user " "{title, body, level}` (or `--target <the user's host>`)."), } res = ad_client.notify(title, body, level=level, reach_user=True) or {}@@ -3955,7 +3955,7 @@ def _ad_call(verb: str, args: dict, timeout: int = 60) -> dict: import subprocess as _sp, json as _j exe = _find_adom_desktop_cli() # the -cli exe only; never the GUI exe (#295) if not exe:- return {"_adCallError": "; ".join(why + ["adom-bridge-cli not found"])}+ return {"_adCallError": "; ".join(why + ["adom-bridge CLI not found"])} p = _sp.run([exe, verb, _j.dumps(args)], capture_output=True, text=True, timeout=timeout) out = (p.stdout or "").strip() if out.startswith("{"):@@ -5941,7 +5941,7 @@ def dispatch_command(command: str, args: dict, caller_identity: dict = None) -> return { "success": False, "error": f"Unknown command: {command}",- "_hint": "Run `adom-bridge-cli help` or check cli/src/commands.rs to see the list of available fusion_* commands. This command name may be misspelled or not yet implemented.",+ "_hint": "Run `adom-bridge help` or check cli/src/commands.rs to see the list of available fusion_* commands. This command name may be misspelled or not yet implemented.", }