← Commit history
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.13.66\ No newline at end of file+1.13.67\ No newline at end of file
CHANGELOG.md+4
@@ -3,6 +3,10 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.13.67 (2026-11-03)++The `fusion_open_board` and `fusion_open_schematic` refusal handling from 1.13.66 now runs on the path those verbs really take: in 1.13.66 the modal still hung the call.+ ## 1.13.66 (2026-11-03)  `fusion_open_board` no longer reports success on a board Fusion refuses. A file with a part whose library or package isn't in it, or a net naming a part that isn't, is refused before Fusion sees it (`board_file_has_errors`, naming each problem), so no dialog is drawn. If Fusion refuses a board or schematic for another reason, the bridge closes its dialog and the empty design and answers `file_refused_by_fusion`.
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.13.66",+  "version": "1.13.67",   "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.13.66"+version = "1.13.67" dependencies = [  "serde_json", ]
dashboard/Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.13.66"+version = "1.13.67" 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.13.66"+DASH_VERSION="1.13.67" 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.13.66",+  "version": "1.13.67",   "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+2−2
@@ -1,6 +1,6 @@ {   "slug": "fusion-bridge",-  "version": "1.13.66",+  "version": "1.13.67",   "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": {@@ -152,4 +152,4 @@   "confirmed_user_skills": [     "fusion-design-efficiency"   ]-}\ No newline at end of file+}
rust/Cargo.lock+5−5
@@ -19,7 +19,7 @@ dependencies = [  [[package]] name = "adom-fusion-bridge"-version = "1.13.66"+version = "1.13.67" dependencies = [  "adom-eda-checks",  "base64",@@ -299,7 +299,7 @@ dependencies = [  [[package]] name = "fusion-core"-version = "1.13.66"+version = "1.13.67" dependencies = [  "serde",  "serde_json",@@ -310,7 +310,7 @@ dependencies = [  [[package]] name = "fusion-lbr"-version = "1.13.66"+version = "1.13.67" dependencies = [  "regex",  "roxmltree",@@ -322,14 +322,14 @@ dependencies = [  [[package]] name = "fusion-os-mac"-version = "1.13.66"+version = "1.13.67" dependencies = [  "fusion-core", ]  [[package]] name = "fusion-os-win"-version = "1.13.66"+version = "1.13.67" dependencies = [  "fusion-core",  "windows-sys 0.59.0",
rust/Cargo.toml+1−1
@@ -4,7 +4,7 @@ members = ["core", "lbr", "os-win", "os-mac", "bridge"]  # One version for the whole bridge, in lockstep with BRIDGE_VERSION (tools/release.sh bumps both). [workspace.package]-version = "1.13.66"+version = "1.13.67" edition = "2021" license = "MIT" 
rust/bridge/src/addin.rs+7
@@ -319,6 +319,13 @@ impl<'a> Ctx<'a> { #[deprecated(note = "stage with crate::fusionpath::for_fusion  /// The whole pass-through for one verb. pub fn pass_through(cmd: &str, args: &Value, ctx: &Ctx) -> Value {+    if matches!(cmd, "open_board" | "open_schematic") {+        return crate::orchestrations::open_file_guarded(ctx, cmd, args, &|v: &str, a: Value| pass_through_checked(v, &a, ctx));+    }+    pass_through_checked(cmd, args, ctx)+}++fn pass_through_checked(cmd: &str, args: &Value, ctx: &Ctx) -> Value {     let r = pass_through_inner(cmd, args, ctx);     // Fusion 2706 dropped the Electron.boardInfo text command (live 2026-10-28): the same answer     // is built from the board's own export, so board_info and everything built on it keeps working
rust/bridge/src/orchestrations.rs+10−3
@@ -679,7 +679,9 @@ pub fn board_file_problems(text: &str) -> Vec<String> {     out } -pub fn open_with_screenshot(ctx: &Ctx, cmd: &str, args: &Value, pass: &dyn Fn(&str, Value) -> Value) -> Value {+/// fusion_open_board and fusion_open_schematic: a file Fusion would refuse never reaches it, and one it+/// refuses anyway is answered as that, not as a hung call or a success with an empty design.+pub fn open_file_guarded(ctx: &Ctx, cmd: &str, args: &Value, run: &dyn Fn(&str, Value) -> Value) -> Value {     let file = args["filePath"].as_str().unwrap_or("").to_string();     if cmd == "open_board" {         if let Ok(text) = std::fs::read_to_string(&file) {@@ -711,15 +713,20 @@ pub fn open_with_screenshot(ctx: &Ctx, cmd: &str, args: &Value, pass: &dyn Fn(&s             });         }     }-    let mut r = show_with_document(cmd, args, pass);+    let r = run(cmd, args.clone());     stop.store(true, std::sync::atomic::Ordering::SeqCst);     if let Some(text) = refused.lock().unwrap().clone() {         let stem = std::path::Path::new(&file.replace('\\', "/")).file_stem().map(|s| s.to_string_lossy().to_string()).unwrap_or_default();-        let closed = pass("close_document", json!({"name": stem}));+        let closed = run("close_document", json!({"name": stem}));         return json!({"success": false, "errorCode": "file_refused_by_fusion", "filePath": file, "mutated": false, "emptyDesignClosed": closed["success"].as_bool() == Some(true),             "error": format!("Fusion refused the file: {text}"),             "_hint": "Fusion drew its error dialog and the bridge closed it. Fix the file; for a .brd, fusion_board_seed builds one Fusion can open."});     }+    r+}++pub fn open_with_screenshot(ctx: &Ctx, cmd: &str, args: &Value, pass: &dyn Fn(&str, Value) -> Value) -> Value {+    let mut r = show_with_document(cmd, args, pass);     if r["success"].as_bool() == Some(true) {         let (shots, _) = crate::lifecycle::post_open_screenshot(ctx, 2.0);         if !r["data"].is_object() { r["data"] = json!({}); }