← Commit history
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.337\ No newline at end of file+1.9.338\ No newline at end of file
adom-bridge-fusion-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.9.337",-  "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.337/adom-bridge-fusion-v1.9.337.zip",-  "sha256": "81133169acd9a22d0d70c4ea504b688ec6296a1f4ce7cc7f9adf935af3c5336c",-  "size": 608661,+  "version": "1.9.338",+  "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.338/adom-bridge-fusion-v1.9.338.zip",+  "sha256": "1731fe506d484a856118db506d5d8360a0a7877202b29f2072150233064de287",+  "size": 609005,   "verbPrefixes": [     "fusion_"   ],
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.9.337",+  "version": "1.9.338",   "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.337"+version = "1.9.338" dependencies = [  "serde_json", ]
dashboard/Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.9.337"+version = "1.9.338" 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.337"+DASH_VERSION="1.9.338" 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.337",+  "version": "1.9.338",   "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.337",+  "version": "1.9.338",   "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]"-  }-}\ No newline at end of file+  ]+}
server.py+22−7
@@ -9254,6 +9254,21 @@ def _last_library() -> str: _LAST_LIBRARY = [""]          # the .lbr most recently opened by this bridge  +def _remember_library(path: str):+    """Record the library BOTH in memory and in the persisted pref.++    Setting only _LAST_LIBRARY[0] looks identical in every test that does not restart the+    bridge, and then a respawn (ab auto-updates the bridge whenever a new version is+    published, including MID-RUN) silently forgets it - after which prove_library refuses+    with library_path_required even though the library is open on screen. Seen live+    2026-09-01, resuming a run the publisher's own release had orphaned."""+    _LAST_LIBRARY[0] = path+    try:+        _set_bridge_pref("lastLibraryPath", path)+    except Exception:+        pass++ def _show_prepare_library(args, symbol_xml=None, package_xml=None, name=""):     """Open the target library: explicit path, generated wrapper, or already-open. @@ -9278,11 +9293,7 @@ def _show_prepare_library(args, symbol_xml=None, package_xml=None, name=""):         # check against, so the Create-new guard silently did nothing and the blind EDIT went         # out anyway - which is why John saw the dialog AGAIN after the first fix. Whatever we         # last opened IS the library those calls mean.-        _LAST_LIBRARY[0] = library_path-        try:-            _set_bridge_pref("lastLibraryPath", library_path)   # survives a bridge respawn-        except Exception:-            pass+        _remember_library(library_path)   # survives a bridge respawn     return None, wrapped  @@ -12014,7 +12025,11 @@ def _handle_prove_library(fusion_info: dict, args: dict) -> dict:     lbr = (args.get("libraryPath") or args.get("filePath") or "").replace("\\", "/") or _last_library()     if not lbr:         return {"success": False, "error": "libraryPath required (or open a library first).",-                "errorCode": "library_path_required"}+                "errorCode": "library_path_required",+                "_hint": "If a library IS open on screen, the bridge probably respawned since "+                         "it was opened (ab auto-updates on publish, even mid-run) and forgot "+                         "it. Pass libraryPath explicitly - for a bundle install it is "+                         "C:/Users/<user>/Documents/AdomLibraries/<bundle>/<Library>.lbr."}     names = _library_artifact_names(lbr)     if not names:         return {"success": False, "error": "Could not read or parse that .lbr: %s" % lbr,@@ -12040,7 +12055,7 @@ def _handle_prove_library(fusion_info: dict, args: dict) -> dict:     if not opened.get("success"):         return {"success": False, "error": "open_lbr failed: " + str(opened.get("error")),                 "errorCode": "library_open_failed", "artifacts": artifacts}-    _LAST_LIBRARY[0] = lbr+    _remember_library(lbr)      evidence = []     # SHARED PACKAGE, PROVE ONCE (John, 2026-08-30: "once you have a correctly defined
skills/fusion-cloud-library-import/SKILL.md+15
@@ -118,6 +118,21 @@ cam.isSmoothTransition = False; vp.camera = cam; vp.fit(); vp.refresh() Then `desktop_screenshot_window {hwnd}` on Fusion's main window. Chips land in a row, flat, proportional, pin-1 dimples visible. That is the frame people actually want in a demo. +## Do not publish a bridge release while a run is in flight++ab auto-updates the fusion bridge whenever a new version is published, and the respawn KILLS an+in-flight run's thread. The run is marked honestly - `fusion_prove_result` returns+`errorCode: bridge_restarted_mid_run` with the stage it died at - but the work after that stage+simply never happened. Seen live: a publisher's own release orphaned the prove phase of the run+they were watching. Finish or re-prove first, publish after.++**Recovering an orphaned run:** the BIND survives (urns are in the bound .lbr), so do not+re-install. Re-prove part by part with `fusion_prove_library {libraryPath, name}` - one call per+deviceset, ~2 minutes each, and read the result from `fusion_prove_result {}` after each (the+relay times out at 60s while the prove keeps running; never fire the next part until the+previous one's 4 frames landed, or the runs race each other on one Fusion). The bound library+for a bundle install lives at `C:/Users/<user>/Documents/AdomLibraries/<bundle>/<Library>.lbr`.+ ## Clean up after yourself  The chain leaves scratch `Untitled` documents. `fusion_close_document {name:"Untitled",