← Commit history
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]"-  }+  ] }\ No newline at end of file
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]}))