← Commit history
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.10.3\ No newline at end of file+1.10.4\ No newline at end of file
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.10.3",+  "version": "1.10.4",   "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.",
contracts/describe.json+323
@@ -541,6 +541,31 @@       "summary": "Capture the LIBRARY-EDITOR views EEs trust: the schematic SYMBOL (full pinout), the FOOTPRINT (pads + layer stack), and the COMPONENT/device view (Content Manager: symbol + the package table with the footprint<->package Mapped check + pin/pad counts). The 3D before/after shots don't show these. Requires the .lbr OPEN in the Electronics Library workspace (fusion_open_lbr first). Runs EDIT <pkg>.sym/.pac/.dev + WINDOW FIT + a background hwnd screenshot per view; returns the PNG paths on the box (C:/tmp/conduit-screenshots - pull with desktop_pull_file). EDIT uses the DEVICESET name (e.g. ESP32-S3FN8).",       "timeoutSeconds": 300     },+    {+      "example": {+        "fileName": "BQ25792",+        "folderPath": "Molecules/XRP/Power",+        "projectName": "Main"+      },+      "input": {+        "fileName": "required str",+        "folderPath": "optional str (default the project root)",+        "projectName": "optional str (default the active project)"+      },+      "longRunning": false,+      "name": "fusion_check_recovery",+      "output": {+        "apiReliable": "bool",+        "fileId": "str",+        "fileName": "str",+        "hasRecovery": "bool",+        "project": "str",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Ask whether a cloud file has a crash-recovery document waiting, which would raise Fusion's recovery modal on open. BEST-EFFORT: Fusion's Python API does not reliably expose this (apiReliable reports whether the property existed), so a false negative is possible; the dependable signal is an open that times out, and fusion_dismiss_blocking_dialogs clears the modal. Finds the file by exact name in one project folder.",+      "timeoutSeconds": 60+    },     {       "example": {         "fileIds": [@@ -619,6 +644,30 @@       "summary": "Close a DIALOG window by hwnd (WM_CLOSE, like clicking X) - for dialogs without Cancel/Escape handling (e.g. Recovered Documents). NOT a document closer; refuses without hwnd. Get the hwnd from a screenshot's dialogs array or desktop_list_windows. (Doc drift caught by the verb test suite 2026-08-14: this was described as 'close the active document' while the handler required hwnd.)",       "timeoutSeconds": 30     },+    {+      "example": {+        "folderName": "AI-Scratch",+        "projectName": "Main"+      },+      "input": {+        "folderName": "required str",+        "parentPath": "optional str (parent folder path; default the project root)",+        "projectName": "optional str (default the active project)"+      },+      "longRunning": false,+      "name": "fusion_create_cloud_folder",+      "output": {+        "alreadyExisted": "bool (only when it already existed)",+        "folderId": "str",+        "folderName": "str",+        "parentFolder": "str",+        "project": "str",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Create a subfolder in a cloud project through the signed-in Fusion session's Data API (no APS needed). Idempotent: an existing folder of that name is returned with alreadyExisted:true instead of a duplicate. Folder names are matched case-insensitively. For an APS-side create without Fusion running, use fusion_aps_create_folder.",+      "timeoutSeconds": 60+    },     {       "example": {         "libraryPath": "C:/Temp/PART.lbr",@@ -643,6 +692,31 @@       "summary": "ONE-CALL library creation for web-control (one call = one consent). EVERY LIBRARY IS MULTI-PART - a single-part library is simply parts:[one entry], and there is no separate single-part verb to choose. Pass parts:[{package, lbrPath, modelPath}] for any number of parts; the older {libraryPath, stepPath} shape still works and is normalised into a one-element parts list, so both run the identical code path and the ETA scales with the part count either way. TWO entry shapes: A) {libraryPath, stepPath} - a ready .lbr plus the 3D; B) {kicadSymbolPath, kicadFootprintPath, stepPath, pinMap?} - KiCad sources; needs adom-lbr, which is Linux-container-only by platform rule, so on Windows/Mac boxes shape B refuses IMMEDIATELY (adom_lbr_unavailable, before any staging or Fusion launch - fusion_readiness reports kicadIngest up front). Convert at AUTHORING time in a container and use shape A. pinMap = explicit {pinName: padName} for when pin numbers do not match pad names (BGA-style). Chains convert -> bind 3D -> prove (four evidence frames + verdict) in the BACKGROUND and returns immediately; poll fusion_prove_result (stage narrates; top-level `verdict` proven/not_proven is the score - `stage:done` only means the chain finished). EVERY PART IS PROVED, not just the first: a 10-component library streams 40 evidence frames, FOUR per component (symbol, footprint, 3d, ganged) in assembly order, each tagged with `part` so a front end can group them as they arrive, and `provedParts[]` reports per-part pass/fail. The library is proven only if EVERY part is - one good part does not vouch for nine unchecked ones. On the FINAL fetch pass {inlineFrames:true} to get each evidence frame as a base64 thumbnailDataUrl a browser can render (plain polls return box paths only). The chain closes its library document on success AND failure - batches need no between-part sweeping. stepPath is required for a PROVEN library - no real 3D body without it.",       "timeoutSeconds": 30     },+    {+      "example": {+        "fileName": "verbtest-scratch",+        "folderPath": "AI-Scratch",+        "projectName": "Main"+      },+      "input": {+        "fileId": "optional str (lineage urn for a precise delete; lineageUrn is accepted as an alias)",+        "fileName": "required str unless fileId is given (exact name match in one folder)",+        "folderPath": "optional str (default the project root)",+        "projectName": "optional str (default the active project)"+      },+      "longRunning": false,+      "name": "fusion_delete_cloud_file",+      "output": {+        "fileId": "str",+        "fileName": "str",+        "folder": "str",+        "project": "str",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "DESTRUCTIVE: delete ONE cloud file through the signed-in Fusion session's Data API. Looks in exactly one folder (projectName + folderPath, no recursion) for an exact case-insensitive name match, or for the lineage urn when fileId is given (the precise form; prefer it in shared folders). Refuses without fileName or fileId. Large folders time out on the scan; give a precise folderPath. Use fusion_cleanup_cloud_files to delete a LIST of urns with dryRun support.",+      "timeoutSeconds": 60+    },     {       "example": {},       "input": {@@ -902,6 +976,40 @@       "summary": "Export to 3MF mesh.",       "timeoutSeconds": 300     },+    {+      "example": {+        "dpi": 300,+        "outputPath": "C:/Temp/board-assembly-top.png",+        "preset": "assembly_top"+      },+      "input": {+        "dpi": "optional int (default 300, max 600)",+        "layers": "optional [int] (EAGLE layer numbers; overrides preset)",+        "listPresets": "optional bool (return the presets instead of exporting)",+        "mirror": "optional bool (default false; accepted but not applied by the add-in today, the bottom-side mirror is done container-side)",+        "monochrome": "optional bool (default false)",+        "outputPath": "optional str (WINDOWS path; default C:/tmp/adom-board.png)",+        "preset": "optional str (default all)"+      },+      "longRunning": true,+      "name": "fusion_export_board_image",+      "output": {+        "activeWorkspace": "str",+        "dpi": "int",+        "fileSize": "int",+        "fileSizeKB": "int",+        "monochrome": "bool",+        "nextSteps": "[str]",+        "outputPath": "str",+        "preset": "str (custom when layers given)",+        "presetDescription": "str",+        "presets": "{name: description} (listPresets form only)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Render the OPEN board (or schematic) to a PNG via EAGLE's EXPORT IMAGE with a layer preset: all, top_copper, bottom_copper, top_silkscreen, bottom_silkscreen, top_soldermask, bottom_soldermask, top_paste, bottom_paste, board_outline, drill, assembly_top, assembly_bottom, fabrication (or explicit EAGLE layer numbers). Requires an electronics editor to be active (fusion_show_2d_board or fusion_open_board first). Silkscreen presets fit the view to the board outline so the PNG maps onto the board bbox. Layer visibility is restored (DISPLAY ALL) afterwards. listPresets:true returns the preset table instead of exporting.",+      "timeoutSeconds": 60+    },     {       "example": {         "outputPath": "C:/tmp/bom.csv"@@ -920,6 +1028,28 @@       "summary": "Export a Bill of Materials CSV (grouped by value+package) from the open board.",       "timeoutSeconds": 60     },+    {+      "example": {+        "format": "step",+        "outputPath": "C:/Temp/TJA1050.step"+      },+      "input": {+        "format": "optional str (default step): step|stl|f3d|iges|sat|smt",+        "outputPath": "required str (WINDOWS path on the Fusion machine)"+      },+      "longRunning": true,+      "name": "fusion_export_cloud_file",+      "output": {+        "documentName": "str",+        "fileSize": "int",+        "format": "str",+        "outputPath": "str",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Export the ACTIVE Fusion Design document to a local file on the Fusion machine in one of step, stl, f3d, iges, sat or smt (despite the name it does not fetch a cloud file by name; open the document first with fusion_open_cloud_file). Requires a Design document to be active. For the per-format verbs with their own timeouts see fusion_export_step and friends; this is the one-verb form with a format switch. Pull the file back with pull_file.",+      "timeoutSeconds": 300+    },     {       "example": {         "outputPath": "C:/tmp/cpl.csv"@@ -970,6 +1100,28 @@       "summary": "Export 2D DXF.",       "timeoutSeconds": 120     },+    {+      "example": {+        "outputPath": "C:/Temp/TJA1050.brd"+      },+      "input": {+        "outputPath": "required str (WINDOWS path ending in .sch or .brd)"+      },+      "longRunning": false,+      "name": "fusion_export_eagle_source",+      "output": {+        "activeDocument": "str",+        "activeWorkspace": "str",+        "format": "str (sch|brd)",+        "innerZipEntry": "str",+        "savedTo": "str",+        "sizeBytes": "int",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Export the ACTIVE electronics document as plain EAGLE XML (.sch or .brd; the outputPath extension picks the format). Fusion's .fsch/.fbrd are ZIP containers with the EAGLE XML inside; this exports the container via Document.CopyToDesktop, extracts the inner XML, writes it to outputPath and deletes the intermediate file. The result opens in standalone EAGLE, imports into KiCad, and parses with any XML tool. The matching editor MUST be active: fusion_show_2d_board before a .brd, the Schematic Editor (fusion_show_schematic or EDIT .s1) before a .sch.",+      "timeoutSeconds": 60+    },     {       "example": {         "outputPath": "C:/out/design.f3d"@@ -1036,6 +1188,25 @@       "summary": "Export to IGES.",       "timeoutSeconds": 300     },+    {+      "example": {+        "outputPath": "C:/Temp/TJA1050.scr"+      },+      "input": {+        "outputPath": "optional str (WINDOWS path for the .scr; default a temp file on the Fusion machine)"+      },+      "longRunning": false,+      "name": "fusion_export_lbr",+      "output": {+        "fileSize": "int",+        "outputPath": "str",+        "preview": "str (first 2000 chars)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Export the electronics LIBRARY in front as an EAGLE .scr script via Electron.run EXPORT SCRIPT: a text dump of every symbol, package and device, the round-trip check that a library loaded correctly. Requires an electronics editor to be active (fusion_open_lbr puts the library in front). Returns the path, size and the first 2000 characters as a preview; pull the file to read the rest.",+      "timeoutSeconds": 60+    },     {       "example": {         "outputPath": "C:/out/part.obj"@@ -1110,6 +1281,27 @@       "summary": "Export to SketchUp (.skp).",       "timeoutSeconds": 300     },+    {+      "example": {+        "outputPath": "C:/Temp/TJA1050.fbrd"+      },+      "input": {+        "outputPath": "required str (WINDOWS path ending in .fsch, .fbrd or .flbr)"+      },+      "longRunning": false,+      "name": "fusion_export_source",+      "output": {+        "activeDocument": "str",+        "activeWorkspace": "str",+        "format": "str (fsch|fbrd|flbr)",+        "savedTo": "str",+        "sizeBytes": "int",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Export the ACTIVE electronics document in Fusion's native source format via Document.CopyToDesktop: .fbrd (board), .fsch (schematic) or .flbr (library); the outputPath extension picks the format. The matching editor MUST be active or no file is written: fusion_show_2d_board before a .fbrd (the 3D view does not work), fusion_electron_run {command:\"EDIT .s1\"} or fusion_show_schematic before a .fsch, fusion_open_lbr before a .flbr. For plain EAGLE XML use fusion_export_eagle_source.",+      "timeoutSeconds": 60+    },     {       "example": {         "outputPath": "C:/out/board.step"@@ -1273,6 +1465,30 @@       "summary": "Read current Fusion appearance/navigation preferences (theme, activeTheme, invertScrollZoom, orbitScheme, modelingOrientation, gestureNav, cameraPivot, lengthUnit) as friendly values - the same keys fusion_set_preference accepts.",       "timeoutSeconds": 20     },+    {+      "example": {+        "filePath": "C:/Temp/TJA1050.fbrd"+      },+      "input": {+        "filePath": "required str (WINDOWS path to a .fsch, .fbrd or .flbr; must exist on the Fusion machine)"+      },+      "longRunning": true,+      "name": "fusion_import_electronics",+      "output": {+        "activeDocument": "str",+        "activeWorkspace": "str",+        "extension": "str",+        "filePath": "str",+        "fileType": "str",+        "nextSteps": "[str]",+        "postOpenCheck": "{required, steps}",+        "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Import a Fusion-NATIVE electronics file (.fsch schematic, .fbrd board, .flbr library; NOT legacy EAGLE .sch/.brd/.lbr) from the Fusion machine as a NEW local document via Document.newDesignFromLocal. The document is unsaved: fusion_save_to_cloud persists it, fusion_close_document discards it. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+      "timeoutSeconds": 60+    },     {       "example": {         "filePath": "C:/Temp/part.step"@@ -1459,6 +1675,24 @@       "summary": "List the cloud PROJECTS visible to the signed-in Fusion session (hub walk - slow on big teams; prefer fusion_aps_search for finding files).",       "timeoutSeconds": 120     },+    {+      "example": {+        "filter": "Electron"+      },+      "input": {+        "filter": "optional str (substring, case-insensitive; default \"Electron\")"+      },+      "longRunning": false,+      "name": "fusion_list_text_commands",+      "output": {+        "commands": "[str] (first 50 matches)",+        "success": "bool",+        "total": "int"+      },+      "statusVerb": null,+      "summary": "List Fusion's internal TEXT COMMANDS (TextCommands.List) whose name contains filter, case-insensitive; the discovery tool for fusion_execute_text_command. Returns the first 50 matches plus the total count. Works best with an electronics editor active (the Electron.* family is what the default filter finds).",+      "timeoutSeconds": 30+    },     {       "example": {         "action": "frames",@@ -1754,6 +1988,29 @@       "summary": "LAST-RESORT human escalation: toast the user's MAIN computer (fans out cross-ab to every peer on the relay, so it reaches them even when this bridge runs on an unattended VM). ONLY for true human walls - password/2FA entry, UAC elevation, a physical step. Exhaust programmatic options first (UIA background clicks, seat auto-resolve, warm-SSO sign-in). After sending, WAIT and poll fusion_readiness; do not re-toast within a few minutes.",       "timeoutSeconds": 20     },+    {+      "example": {+        "filePath": "C:/Temp/TJA1050.brd"+      },+      "input": {+        "filePath": "required str (WINDOWS path to the .brd, C:/...; must exist on the Fusion machine)"+      },+      "longRunning": true,+      "name": "fusion_open_board",+      "output": {+        "activeDocument": "str",+        "activeWorkspace": "str",+        "filePath": "str",+        "fileType": "str",+        "nextSteps": "[str]",+        "postOpenCheck": "{required, steps}",+        "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Open a LOCAL legacy EAGLE .brd in Fusion's 2D board editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_2d_board; this verb is for a .brd that exists on the Fusion machine (push it there first). Elements with an embedded library are instantiated as placed parts; embed <packages3d> + per-element package3d_urn for real 3D bodies, then fusion_show_3d_board. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+      "timeoutSeconds": 60+    },     {       "example": {         "urn": "urn:adsk.wipprod:fs.file:vf.xxxx?version=1"@@ -1817,6 +2074,27 @@       "summary": "Open a LOCAL design file (routes through the add-in import). Prefer cloud flows (fusion_open_cloud_file) for team designs; this is for local .f3d/.step style files.",       "timeoutSeconds": 240     },+    {+      "example": {},+      "input": {+        "filePath": "optional str (WINDOWS path to a .sch/.brd/.lbr; only acted on when an electronics editor is already active)",+        "type": "optional str (\"status\", the default; other values are reserved)"+      },+      "longRunning": false,+      "name": "fusion_open_electronics",+      "output": {+        "activeDocument": "{name,type}",+        "activeWorkspace": "str",+        "isElectronics": "bool",+        "output": "str",+        "productType": "str",+        "result": "str (Electron.run output, filePath form only)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Read whether an ELECTRONICS editor (schematic, board or library) is the active workspace, so you know if Electron.* text commands and fusion_electron_run will work. With filePath, and ONLY when an electronics editor is already active, it also issues Electron.run EDIT on that file; otherwise it just reports the workspace. Prefer fusion_open_schematic / fusion_open_board / fusion_open_lbr to open files. The schematic, 2D board and 3D board are views of one electronics design.",+      "timeoutSeconds": 30+    },     {       "example": {         "filePath": "C:/Users/<user>/adom-lib/nRF54L15.lbr"@@ -1836,6 +2114,29 @@       "summary": "Import an EAGLE .lbr library into Fusion's Electronics LIBRARY editor (Content Manager / Electronics Library workspace), not a PCB design. PITFALL: filePath MUST be a WINDOWS-local path (C:/...). The chip-fetcher/adom-lbr pipeline runs in the cloud container, and there is NO container-to-Windows push verb, so STAGE the .lbr onto Windows first (serve it on a proxied port + Invoke-WebRequest via shell_execute), then pass the C:/ path. PITFALL: an adom-lbr .lbr is 2D ONLY - symbol + footprint + a PLACEHOLDER 3D package; the real 3D chip is NOT attached (that needs a Fusion cloud URN). To attach the 3D, see the 'fusion-libraries' skill. Pass verify:true to round-trip-confirm Fusion parsed the deviceset, then check fusion_get_app_state (activeWorkspace 'Electronics Library').",       "timeoutSeconds": 50     },+    {+      "example": {+        "filePath": "C:/Temp/TJA1050.sch"+      },+      "input": {+        "filePath": "required str (WINDOWS path to the .sch, C:/...; must exist on the Fusion machine)"+      },+      "longRunning": true,+      "name": "fusion_open_schematic",+      "output": {+        "activeDocument": "str",+        "activeWorkspace": "str",+        "filePath": "str",+        "fileType": "str",+        "nextSteps": "[str]",+        "postOpenCheck": "{required, steps}",+        "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)",+        "success": "bool"+      },+      "statusVerb": null,+      "summary": "Open a LOCAL legacy EAGLE .sch in Fusion's Schematic Editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_schematic; this verb is for a .sch that exists on the Fusion machine (push it there first). Drive the opened sheet with fusion_electron_run (WINDOW FIT, DISPLAY ALL). The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+      "timeoutSeconds": 60+    },     {       "example": {         "accuracy": "low"@@ -2253,6 +2554,28 @@       "summary": "Read/toggle the 'Adom is driving Fusion' TASKBAR OVERLAY BADGE (STICKY per user, default ON). While the bridge drives Fusion, its Windows taskbar button wears a small Adom mark so the user knows at a glance who is in control; it sheds automatically after 5 minutes of driving-verb idle. No args = read. Turning it off clears any badge immediately.",       "timeoutSeconds": 15     },+    {+      "example": {+        "expression": "1.6 mm",+        "name": "board_thickness"+      },+      "input": {+        "expression": "required str (new expression, e.g. \"10 mm\")",+        "name": "required str (parameter name as listed by fusion_get_parameters)"+      },+      "longRunning": false,+      "name": "fusion_set_parameter",+      "output": {+        "expression": "str",+        "name": "str",+        "success": "bool",+        "unit": "str",+        "value": "float (internal units)"+      },+      "statusVerb": null,+      "summary": "Set one parameter's expression by name in the ACTIVE 3D Design document (user parameters first, then model parameters). MUTATES the design: the model regenerates and the result carries the post-op dialog array. Requires a Design document to be active (a 2D board or library editor refuses). Read names and current expressions with fusion_get_parameters; units must match the parameter (\"10 mm\", \"5 deg\").",+      "timeoutSeconds": 30+    },     {       "example": {         "theme": "dark"
dashboard/Cargo.lock+1−1
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "fusion-dashboard"-version = "1.10.3"+version = "1.10.4" dependencies = [  "serde_json", ]
dashboard/Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.10.3"+version = "1.10.4" edition = "2021"  [dependencies]
describe.py+64
@@ -345,6 +345,70 @@ _T = [      {"success": "bool", "dryRun": "bool", "fusionRunning": "bool", "removed": "[{path,kind}]", "failed": "[{path,kind,error}]", "skipped": "[{path,kind,why}]"},      60, None, False, {"dryRun": True}), +    # ── Catalog completion (2026-09-07): 14 add-in verbs that were LIVE (registered in+    # addin/AdomBridge/commands/__init__.py and routable through the exe's add-in pass-through)+    # but absent here, so fusion_describe hid them from every caller. Two more add-in handlers+    # are deliberately NOT listed: import_file (it is the add-in name behind fusion_import_step,+    # already described) and take_silkscreen_screenshot (not in ADDIN_COMMANDS on either shell;+    # only fusion_export_optimized_glb calls it internally, so fusion_take_silkscreen_screenshot+    # would answer Unknown command).+    ("fusion_open_board", "Open a LOCAL legacy EAGLE .brd in Fusion's 2D board editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_2d_board; this verb is for a .brd that exists on the Fusion machine (push it there first). Elements with an embedded library are instantiated as placed parts; embed <packages3d> + per-element package3d_urn for real 3D bodies, then fusion_show_3d_board. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+     {"filePath": "required str (WINDOWS path to the .brd, C:/...; must exist on the Fusion machine)"},+     {"success": "bool", "filePath": "str", "fileType": "str", "activeWorkspace": "str", "activeDocument": "str", "nextSteps": "[str]", "postOpenCheck": "{required, steps}", "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"},+     60, None, True, {"filePath": "C:/Temp/TJA1050.brd"}),+    ("fusion_open_schematic", "Open a LOCAL legacy EAGLE .sch in Fusion's Schematic Editor (dialog-free Document.newDesignFromLocal; a background open). NAV RULE: the schematic, 2D board and 3D board are VIEWS of ONE electronics design, not standalone files. For a team design open the DESIGN document (fusion_open_cloud_file / fusion_open_by_urn) and switch views with fusion_show_schematic; this verb is for a .sch that exists on the Fusion machine (push it there first). Drive the opened sheet with fusion_electron_run (WINDOW FIT, DISPLAY ALL). The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+     {"filePath": "required str (WINDOWS path to the .sch, C:/...; must exist on the Fusion machine)"},+     {"success": "bool", "filePath": "str", "fileType": "str", "activeWorkspace": "str", "activeDocument": "str", "nextSteps": "[str]", "postOpenCheck": "{required, steps}", "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"},+     60, None, True, {"filePath": "C:/Temp/TJA1050.sch"}),+    ("fusion_open_electronics", "Read whether an ELECTRONICS editor (schematic, board or library) is the active workspace, so you know if Electron.* text commands and fusion_electron_run will work. With filePath, and ONLY when an electronics editor is already active, it also issues Electron.run EDIT on that file; otherwise it just reports the workspace. Prefer fusion_open_schematic / fusion_open_board / fusion_open_lbr to open files. The schematic, 2D board and 3D board are views of one electronics design.",+     {"type": "optional str (\"status\", the default; other values are reserved)", "filePath": "optional str (WINDOWS path to a .sch/.brd/.lbr; only acted on when an electronics editor is already active)"},+     {"success": "bool", "output": "str", "isElectronics": "bool", "activeWorkspace": "str", "activeDocument": "{name,type}", "productType": "str", "result": "str (Electron.run output, filePath form only)"},+     30, None, False, {}),+    ("fusion_import_electronics", "Import a Fusion-NATIVE electronics file (.fsch schematic, .fbrd board, .flbr library; NOT legacy EAGLE .sch/.brd/.lbr) from the Fusion machine as a NEW local document via Document.newDesignFromLocal. The document is unsaved: fusion_save_to_cloud persists it, fusion_close_document discards it. The bridge captures a post-open screenshot because Fusion can raise a blocking dialog the API cannot see.",+     {"filePath": "required str (WINDOWS path to a .fsch, .fbrd or .flbr; must exist on the Fusion machine)"},+     {"success": "bool", "filePath": "str", "fileType": "str", "extension": "str", "activeWorkspace": "str", "activeDocument": "str", "nextSteps": "[str]", "postOpenCheck": "{required, steps}", "screenshots": "[{type,savedTo,sizeKB}] (sidecar shell) or postOpenScreenshot (exe shell)"},+     60, None, True, {"filePath": "C:/Temp/TJA1050.fbrd"}),+    ("fusion_export_source", "Export the ACTIVE electronics document in Fusion's native source format via Document.CopyToDesktop: .fbrd (board), .fsch (schematic) or .flbr (library); the outputPath extension picks the format. The matching editor MUST be active or no file is written: fusion_show_2d_board before a .fbrd (the 3D view does not work), fusion_electron_run {command:\"EDIT .s1\"} or fusion_show_schematic before a .fsch, fusion_open_lbr before a .flbr. For plain EAGLE XML use fusion_export_eagle_source.",+     {"outputPath": "required str (WINDOWS path ending in .fsch, .fbrd or .flbr)"},+     {"success": "bool", "savedTo": "str", "sizeBytes": "int", "format": "str (fsch|fbrd|flbr)", "activeDocument": "str", "activeWorkspace": "str"},+     60, None, False, {"outputPath": "C:/Temp/TJA1050.fbrd"}),+    ("fusion_export_eagle_source", "Export the ACTIVE electronics document as plain EAGLE XML (.sch or .brd; the outputPath extension picks the format). Fusion's .fsch/.fbrd are ZIP containers with the EAGLE XML inside; this exports the container via Document.CopyToDesktop, extracts the inner XML, writes it to outputPath and deletes the intermediate file. The result opens in standalone EAGLE, imports into KiCad, and parses with any XML tool. The matching editor MUST be active: fusion_show_2d_board before a .brd, the Schematic Editor (fusion_show_schematic or EDIT .s1) before a .sch.",+     {"outputPath": "required str (WINDOWS path ending in .sch or .brd)"},+     {"success": "bool", "savedTo": "str", "sizeBytes": "int", "format": "str (sch|brd)", "innerZipEntry": "str", "activeDocument": "str", "activeWorkspace": "str"},+     60, None, False, {"outputPath": "C:/Temp/TJA1050.brd"}),+    ("fusion_export_lbr", "Export the electronics LIBRARY in front as an EAGLE .scr script via Electron.run EXPORT SCRIPT: a text dump of every symbol, package and device, the round-trip check that a library loaded correctly. Requires an electronics editor to be active (fusion_open_lbr puts the library in front). Returns the path, size and the first 2000 characters as a preview; pull the file to read the rest.",+     {"outputPath": "optional str (WINDOWS path for the .scr; default a temp file on the Fusion machine)"},+     {"success": "bool", "outputPath": "str", "fileSize": "int", "preview": "str (first 2000 chars)"},+     60, None, False, {"outputPath": "C:/Temp/TJA1050.scr"}),+    ("fusion_export_board_image", "Render the OPEN board (or schematic) to a PNG via EAGLE's EXPORT IMAGE with a layer preset: all, top_copper, bottom_copper, top_silkscreen, bottom_silkscreen, top_soldermask, bottom_soldermask, top_paste, bottom_paste, board_outline, drill, assembly_top, assembly_bottom, fabrication (or explicit EAGLE layer numbers). Requires an electronics editor to be active (fusion_show_2d_board or fusion_open_board first). Silkscreen presets fit the view to the board outline so the PNG maps onto the board bbox. Layer visibility is restored (DISPLAY ALL) afterwards. listPresets:true returns the preset table instead of exporting.",+     {"outputPath": "optional str (WINDOWS path; default C:/tmp/adom-board.png)", "dpi": "optional int (default 300, max 600)", "preset": "optional str (default all)", "layers": "optional [int] (EAGLE layer numbers; overrides preset)", "monochrome": "optional bool (default false)", "mirror": "optional bool (default false; accepted but not applied by the add-in today, the bottom-side mirror is done container-side)", "listPresets": "optional bool (return the presets instead of exporting)"},+     {"success": "bool", "outputPath": "str", "dpi": "int", "preset": "str (custom when layers given)", "presetDescription": "str", "fileSize": "int", "fileSizeKB": "int", "monochrome": "bool", "activeWorkspace": "str", "nextSteps": "[str]", "presets": "{name: description} (listPresets form only)"},+     60, None, True, {"outputPath": "C:/Temp/board-assembly-top.png", "preset": "assembly_top", "dpi": 300}),+    ("fusion_set_parameter", "Set one parameter's expression by name in the ACTIVE 3D Design document (user parameters first, then model parameters). MUTATES the design: the model regenerates and the result carries the post-op dialog array. Requires a Design document to be active (a 2D board or library editor refuses). Read names and current expressions with fusion_get_parameters; units must match the parameter (\"10 mm\", \"5 deg\").",+     {"name": "required str (parameter name as listed by fusion_get_parameters)", "expression": "required str (new expression, e.g. \"10 mm\")"},+     {"success": "bool", "name": "str", "expression": "str", "value": "float (internal units)", "unit": "str"},+     30, None, False, {"name": "board_thickness", "expression": "1.6 mm"}),+    ("fusion_list_text_commands", "List Fusion's internal TEXT COMMANDS (TextCommands.List) whose name contains filter, case-insensitive; the discovery tool for fusion_execute_text_command. Returns the first 50 matches plus the total count. Works best with an electronics editor active (the Electron.* family is what the default filter finds).",+     {"filter": "optional str (substring, case-insensitive; default \"Electron\")"},+     {"success": "bool", "commands": "[str] (first 50 matches)", "total": "int"},+     30, None, False, {"filter": "Electron"}),+    ("fusion_create_cloud_folder", "Create a subfolder in a cloud project through the signed-in Fusion session's Data API (no APS needed). Idempotent: an existing folder of that name is returned with alreadyExisted:true instead of a duplicate. Folder names are matched case-insensitively. For an APS-side create without Fusion running, use fusion_aps_create_folder.",+     {"folderName": "required str", "projectName": "optional str (default the active project)", "parentPath": "optional str (parent folder path; default the project root)"},+     {"success": "bool", "folderName": "str", "folderId": "str", "project": "str", "parentFolder": "str", "alreadyExisted": "bool (only when it already existed)"},+     60, None, False, {"folderName": "AI-Scratch", "projectName": "Main"}),+    ("fusion_delete_cloud_file", "DESTRUCTIVE: delete ONE cloud file through the signed-in Fusion session's Data API. Looks in exactly one folder (projectName + folderPath, no recursion) for an exact case-insensitive name match, or for the lineage urn when fileId is given (the precise form; prefer it in shared folders). Refuses without fileName or fileId. Large folders time out on the scan; give a precise folderPath. Use fusion_cleanup_cloud_files to delete a LIST of urns with dryRun support.",+     {"fileName": "required str unless fileId is given (exact name match in one folder)", "fileId": "optional str (lineage urn for a precise delete; lineageUrn is accepted as an alias)", "projectName": "optional str (default the active project)", "folderPath": "optional str (default the project root)"},+     {"success": "bool", "fileName": "str", "fileId": "str", "project": "str", "folder": "str"},+     60, None, False, {"fileName": "verbtest-scratch", "projectName": "Main", "folderPath": "AI-Scratch"}),+    ("fusion_export_cloud_file", "Export the ACTIVE Fusion Design document to a local file on the Fusion machine in one of step, stl, f3d, iges, sat or smt (despite the name it does not fetch a cloud file by name; open the document first with fusion_open_cloud_file). Requires a Design document to be active. For the per-format verbs with their own timeouts see fusion_export_step and friends; this is the one-verb form with a format switch. Pull the file back with pull_file.",+     {"outputPath": "required str (WINDOWS path on the Fusion machine)", "format": "optional str (default step): step|stl|f3d|iges|sat|smt"},+     {"success": "bool", "outputPath": "str", "format": "str", "fileSize": "int", "documentName": "str"},+     300, None, True, {"outputPath": "C:/Temp/TJA1050.step", "format": "step"}),+    ("fusion_check_recovery", "Ask whether a cloud file has a crash-recovery document waiting, which would raise Fusion's recovery modal on open. BEST-EFFORT: Fusion's Python API does not reliably expose this (apiReliable reports whether the property existed), so a false negative is possible; the dependable signal is an open that times out, and fusion_dismiss_blocking_dialogs clears the modal. Finds the file by exact name in one project folder.",+     {"fileName": "required str", "projectName": "optional str (default the active project)", "folderPath": "optional str (default the project root)"},+     {"success": "bool", "fileName": "str", "fileId": "str", "project": "str", "hasRecovery": "bool", "apiReliable": "bool"},+     60, None, False, {"fileName": "BQ25792", "projectName": "Main", "folderPath": "Molecules/XRP/Power"}),+     # ── Self-describe ──────────────────────────────────────────────────────     ("fusion_describe", "Self-describe every verb the bridge exposes (this list) for ab's Verbs tab + runner.",      {}, {"success": "bool", "verbs": "[{name,summary,input,output,timeoutSeconds,statusVerb,longRunning,example}]"}, 20, None, False, {}),
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.10.3"+DASH_VERSION="1.10.4" 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.10.3",+  "version": "1.10.4",   "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−27
@@ -1,6 +1,6 @@ {   "slug": "fusion-bridge",-  "version": "1.10.3",+  "version": "1.10.4",   "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,28 +111,5 @@       "label": "Part volume",       "prompt": "How much material does each printed part in this assembly use?"     }-  ],-  "agent_permissions": {-    "allow_bash": [],-    "allow": [-      "adom-desktop-fusion-bridge read-only verbs (via the adom-bridge CLI): fusion_readiness, fusion_get_app_state, fusion_addin_status, fusion_check_dialogs - state queries; they change nothing.",-      "adom-desktop-fusion-bridge read-only verbs: fusion_alerts (reads Fusion's own log for toasts), fusion_document_info, fusion_window_info, fusion_board_info, fusion_library_parts - inspect only.",-      "adom-desktop-fusion-bridge read-only verbs: fusion_prove_result (a persisted run report), fusion_plan_library_import (report-only preflight), fusion_list_cloud_projects, fusion_describe.",-      "adom-desktop-fusion-bridge evidence captures fusion_screenshot_fusion and fusion_capture_library_views read pixels and write local image files only."-    ],-    "soft_deny": [-      "adom-desktop-fusion-bridge lifecycle verbs fusion_stop, fusion_kill, fusion_restart_for_addin close or kill the Fusion application - keep the human prompt.",-      "adom-desktop-fusion-bridge fusion_install_fusion silently installs Autodesk Fusion on the user's machine.",-      "adom-desktop-fusion-bridge fusion_cleanup_cloud_files deletes files from the user's Autodesk cloud hub.",-      "adom-desktop-fusion-bridge managed-library verbs (fusion_managed_library_push/pull/create/link/unlink) publish to or overwrite the user's library.io libraries."-    ],-    "environment": [-      "adom-desktop-fusion-bridge is the Fusion 360 bridge for Adom Bridge; its fusion_* verbs are invoked through the adom-bridge CLI and drive Autodesk Fusion on the user's own desktop.",-      "adom-desktop-fusion-bridge desktop actions also pass Adom Bridge's own human-approval gate (caller identity, per-call reason, Activity Log) - a container approval is the first of two gates."-    ]-  },-  "author": {-    "name": "John Lauer",-    "email": "[email protected]"-  }-}\ No newline at end of file+  ]+}
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.10.3"+version = "1.10.4" edition = "2021" license = "MIT"