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
Update 74 file(s)
9 files changed
+44−19
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.256+1.9.257
adom-bridge-fusion-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.9.256",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.256/adom-bridge-fusion-v1.9.256.zip",- "sha256": "b6cf3b2da20fd7baaa0149d4093c29ef70dbeac00d174274c156ffaf0ca65a2a",- "size": 552857,+ "version": "1.9.257",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.257/adom-bridge-fusion-v1.9.257.zip",+ "sha256": "31ecb087aea0df6278efb90d43e35e44de63f4d17c5f19ff67225f3822a111ca",+ "size": 553287, "verbPrefixes": [ "fusion_" ],
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.9.256",+ "version": "1.9.257", "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.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "fusion-dashboard"-version = "1.9.256"+version = "1.9.257" dependencies = [ "serde_json", ]
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.256"+version = "1.9.257" edition = "2021" [dependencies]
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.256"+DASH_VERSION="1.9.257" 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.256",+ "version": "1.9.257", "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+11−8@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.256",+ "version": "1.9.257", "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": {@@ -11,6 +11,10 @@ "uninstall": "./uninstall.sh" }, "tags": [+ "ab",+ "bridge",+ "fusion",+ "desktop-app", "fusion360", "autodesk", "cad",@@ -75,7 +79,10 @@ "build a basic parts library", "add a 3d model to a component", "make a fusion 360 library with 3d",- "set up the fusion bridge"+ "set up the fusion bridge",+ "fusion dashboard",+ "fusion status page",+ "open the fusion launch page" ], "discovery_pitch": "Use the Adom Bridge Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Bridge. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).", "brief": "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.",@@ -104,9 +111,5 @@ "label": "Part volume", "prompt": "How much material does each printed part in this assembly use?" }- ],- "author": {- "name": "John Lauer",- "email": "[email protected]"- }-}+ ]+}
server.py+23−1@@ -14014,17 +14014,39 @@ def _handle_live_feed(fusion_info: dict, args: dict) -> dict: str(shot.get("error") or shot.get("errorCode") or list(shot)[:6]))[:200] _LIVE_FEED["lastErrorAt"] = now+ # WHAT THE USER SEES, NOT JUST THE MAIN BITMAP (John, 2026-08-29: "I never+ # see the banner in the 3D document"). Fusion draws the Adom banner, its+ # Browser and comment panels, and every dialog as OWNED POPUP windows; a+ # main-window capture omits all of them, so the live view showed Fusion being+ # driven with no banner although it was on screen the whole time. Each frame+ # now carries the main window's screen rect and every popup with its rect and+ # image, so a viewer can composite them exactly where they sit.+ _wrect = info.get("rect") or (info.get("mainWindow") or {}).get("rect") or {} if main: _LIVE_FEED["captured"] += 1 _LIVE_FEED["lastCaptureAt"] = now _LIVE_FEED["frames"].append({"tick": tick, "kind": "main", "at": now,- "path": main, "title": title,+ "path": main, "title": title, "rect": _wrect, "popups": len(shot.get("screenshots") or [])}) for k, sp_ in enumerate(shot.get("screenshots") or [], 1): pth = sp_.get("fullPathHost") or sp_.get("fullPath") or sp_.get("path")+ if not pth and sp_.get("image"):+ try:+ import base64 as _b64p, tempfile as _tfp+ _pd = os.path.join(_tfp.gettempdir(), "adom-live-feed")+ os.makedirs(_pd, exist_ok=True)+ _pext = str(sp_.get("format") or "png").lower().replace("jpeg", "jpg")+ pth = os.path.join(_pd, "popup-%d-%d.%s" % (tick, k, _pext)).replace("\\", "/")+ _praw = sp_["image"]+ if isinstance(_praw, str):+ _praw = _b64p.b64decode(_praw.split(",")[-1])+ open(pth, "wb").write(_praw)+ except Exception:+ pth = None if pth: _LIVE_FEED["frames"].append({"tick": tick, "kind": "popup", "at": now, "index": k, "path": pth,+ "rect": sp_.get("rect") or sp_.get("bounds") or {}, "title": str(sp_.get("title") or "dialog")[:50]}) if len(_LIVE_FEED["frames"]) > _LIVE_FEED_MAX: del _LIVE_FEED["frames"][: len(_LIVE_FEED["frames"]) - _LIVE_FEED_MAX]