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 8 file(s)
8 files changed
+55−17
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.115+1.9.116
adom-bridge-fusion-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.9.115",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.130/adom-bridge-fusion-v1.9.115.zip",- "sha256": "8c406665592e48d7d1ddd21ade57c4a5bc9c74d933e52485ed5192c795b0ec8e",- "size": 452185,+ "version": "1.9.116",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.131/adom-bridge-fusion-v1.9.116.zip",+ "sha256": "b15490d4ee74cf370d36aeb175ebe89774557d295cd0aca9372019249f9ddeab",+ "size": 452994, "verbPrefixes": [ "fusion_" ],
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.9.115",+ "version": "1.9.116", "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.130"+version = "1.9.131" 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.130"+DASH_VERSION="1.9.131" 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.130",+ "version": "1.9.131", "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+10−7@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.130",+ "version": "1.9.131", "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",@@ -70,7 +74,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.",@@ -99,9 +106,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+36−1@@ -3474,7 +3474,31 @@ def _orchestrate_make_3d_package(args: dict) -> dict: except Exception: pass if "dm.lineage:" not in item_urn:- return {"success": False, "error": "f3d upload did not return a lineage urn: " + str(up_d)}+ # 409 = the file already EXISTS in the cloud folder (a previous mint uploaded it).+ # The data we need is sitting right there, so reuse the existing ITEM's lineage urn+ # instead of failing (doctrine: never return an error the code could fix). The items+ # in the folder listing carry dm.lineage ids, which is exactly what the wip_urn is+ # built from below - caught live when re-running the CR0603 chain after a+ # successful morning bind.+ _http_status = (up_d or {}).get("httpStatus") if isinstance(up_d, dict) else None+ if _http_status == 409:+ try:+ import aps as _aps409+ status2, listing = _aps409._aps_get(+ "/data/v1/projects/%s/folders/%s/contents" % (project_id, folder_id))+ if status2 == 200 and isinstance(listing, dict):+ for it in (listing.get("data") or []):+ nm = str((it.get("attributes") or {}).get("displayName") or "")+ iid = str(it.get("id") or "")+ if "dm.lineage:" in iid and nm.lower().startswith(str(f3d_name).lower().rsplit(".f3d", 1)[0]):+ item_urn = iid+ print("[Fusion Bridge] upload 409: reusing existing cloud f3d "+ "%r -> %s" % (nm, iid[-40:]))+ break+ except Exception:+ pass+ if "dm.lineage:" not in item_urn:+ return {"success": False, "error": "f3d upload did not return a lineage urn: " + str(up_d)} lid = item_urn.split("dm.lineage:")[-1] wip_urn = f"urn:adsk.wipprod:fs.file:vf.{lid}?version=1" return {@@ -8205,6 +8229,17 @@ def _orchestrate_bind_library_3d(args: dict) -> dict: deviceset = m.group(1) pkg_m = re.search(r'<package name="([^"]+)"', txt) pkg_name = pkg_m.group(1) if pkg_m else deviceset+ # IDEMPOTENT (caught live 2026-08-21): re-binding an already-bound library re-uploaded+ # the f3d and hit a 409 name collision in the cloud folder - failing a chain that had+ # NOTHING left to do. A .lbr whose package3d already carries a urn is bound; verify and+ # return success instead of re-minting.+ _existing = re.search(r'<package3d[^>]*urn="([^"]+)"', txt)+ if _existing and not args.get("force"):+ return {"success": True, "alreadyBound": True, "wip_urn": _existing.group(1),+ "deviceset": deviceset, "libraryPath": lbr_path,+ "_hint": ("This library already carries a package3d urn - nothing to mint. "+ "Pass force:true to re-bind (e.g. after replacing the STEP). "+ "fusion_check_3d_thumbnail verifies the cloud thumbnail rendered.")} mint = _apply_failure_dialogs(_orchestrate_make_3d_package( {"lbrPath": lbr_path, "modelPath": step_path, "fileName": "ADOM-%s-3D" % re.sub(r"[^A-Za-z0-9_-]", "_", deviceset)[:40]}))