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
1.9.149: #49 preflight mid-write tolerance
6 files changed
+42−20
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.9.148+1.9.149
adom-bridge-fusion-manifest.json+4−4@@ -1,10 +1,10 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.9.148",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.148/adom-bridge-fusion-v1.9.148.zip",- "sha256": "c7be24864786169a633ec869e1f4ee45df2f02ff08c998b3a3cec586558a7cb6",- "size": 480281,+ "version": "1.9.149",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.9.149/adom-bridge-fusion-v1.9.149.zip",+ "sha256": "c4a1afea4fda8299a2cbf402a0f614b50e50e4b07ee600f25abfcafea005f462",+ "size": 480834, "verbPrefixes": [ "fusion_" ],
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.9.148",+ "version": "1.9.149", "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.",
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "fusion-bridge",- "version": "1.9.170",+ "version": "1.9.171", "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.170",+ "version": "1.9.171", "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+25−6@@ -10351,15 +10351,34 @@ def _handle_create_library(fusion_info: dict, args: dict) -> dict: # library to make sure its going to open ok"): a bad .lbr must never cost the caller # a Fusion LAUNCH to discover. Same named checks as fusion_preflight_lbr. if lbr_p and not (sym_p or mod_p):+ # MID-WRITE TOLERANCE (#49 "start-failed / no runId", 2026-08-23): a caller that+ # STAGES the .lbr and calls this in the same breath can race the file's final flush -+ # preflight's own size-sane / xml-parses checks (built to catch a TRUNCATED file)+ # then fire on a file that is merely half-written, the call returns lbr_preflight_failed+ # with NO runId, and the very next attempt (file now complete) succeeds. That is a+ # transient the code can absorb: re-run preflight a few times with a short settle so a+ # still-flushing file gets its beat. A GENUINELY bad .lbr fails every try and still+ # returns fast. Only the truncation-class checks are worth retrying; a structural error+ # (root-not-eagle, no devicesets) will not fix itself, but re-checking it is cheap.+ import time as _pf_t _pf = _preflight_lbr(lbr_p)+ for _pf_try in range(4):+ if _pf["ok"]:+ break+ _pf_t.sleep(0.6)+ _pf = _preflight_lbr(lbr_p) if not _pf["ok"]: return {"success": False, "errorCode": "lbr_preflight_failed",- "preflight": _pf,- "error": "Pre-analysis says Fusion will NOT open this library: " +- "; ".join(_pf["errors"])[:400],- "_hint": "Nothing was launched and no dialog was raised. Fix the named "- "checks (fusion_preflight_lbr re-runs them in isolation), "- "re-stage with a hash compare, then re-call."}+ "preflight": _pf, "runId": None, "preflightRetries": _pf_try,+ "error": "Pre-analysis says Fusion will NOT open this library (re-checked "+ "%d times over ~%.1fs in case it was mid-write): "+ % (_pf_try + 1, _pf_try * 0.6) ++ "; ".join(_pf["errors"])[:360],+ "_hint": "This is NOT 'Fusion failed to start' - there is no runId because "+ "the .lbr did not pass pre-analysis (errorCode lbr_preflight_failed; "+ "see preflight.errors). If your harness stages the file, ensure the "+ "write is FLUSHED/closed before calling. fusion_preflight_lbr re-runs "+ "these checks in isolation."} import uuid as _uuid run_id = _uuid.uuid4().hex[:12]