← Commit history

v0.2.29 (insiders): 0.2.29: altium_install - the install lane with its rules in the verb (looks before it asks, verifies the signature, toasts truthfully, does the licensing clicks itself; needsHuman only for a password, UAC or an elevated window)

John Lauer ·e5d2ded834 ·1mo ago ·parent c4d9eb4
4 files changed +17−4
CHANGELOG.md+4
@@ -1,5 +1,9 @@ # Changelog +## 0.2.29 (2026-09-20)+- **New verb `altium_install`: the install lane with its rules IN the verb.** A from-scratch install on a fresh machine went badly because the AI driving it kept forgetting the rules in a 650-line skill: it asked the human to sign in on a page that was already signed in (it never looked), left Release / Assign / Use License / Refresh to the human although they are ordinary clicks, did not toast when it did need him, and launched the installer into an empty room so the UAC prompt timed out. Stages `preflight`, `get_installer`, `launch`, `wait`, `license` (or no stage: `auto` reads the machine). It verifies the installer's Authenticode signature (Valid, CN=Altium LLC) before anything runs, refuses `launch` without `humanIsPresent:true`, toasts the human itself and reports `toast.displayed` truthfully, and does the licensing clicks itself. Every reply carries `_hint`, `_next`, `pitfalls` and `needsHuman`, and `needsHuman` may only ever name a password/2FA, the UAC prompt, or clicks inside an elevated window.+- `detect.installVerb` = `altium_install` and `detect.hostAppOptionalVerbs` declared, so ab forwards the install/readiness verbs when Altium is absent and `bridge_readiness` recommends this installer (two SDK audit misses).+ ## 0.2.28 (2026-09-20) - **One thread per request.** The bridge handled HTTP requests one at a time, inline in its accept loop, so ONE slow verb blocked every verb behind it, `/health` included: `altium_signin`'s ~25 s UIA search, or an agent call waiting on a parked engine. ab dropped its connection at its own budget (an opaque "HTTP error"), the bridge kept working the abandoned request, and the queue only grew: the 30-verb cascades the verb battery produced, twice, from two different first causes. Each request now runs on its own thread. Agent-bound work still serialises at the agent's one-file inbox, which answers a NAMED `agent_busy` with `busyWith` and `busyForSec` instead of a dropped connection. 
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "altium-bridge",-  "version": "0.2.28",+  "version": "0.2.29",   "type": "app",   "description": "Skills for your container so your AI knows how to drive the Altium Designer bridge (altium_* verbs). The bridge runtime itself is the release zip; Adom Bridge loads that.",   "tags": [
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-0.2.28+0.2.29
src/bridge.json+11−2
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "altium",   "displayName": "Altium Designer",-  "version": "0.2.28",+  "version": "0.2.29",   "description": "Drive Altium Designer from Adom: a resident DelphiScript agent (eval + the 1,100-command process launcher), the X2 -R command line, UIA over the VCL shell, dialogs by PID, screenshots of every Altium window, and Altium 365.",   "homepage": "https://wiki.adom.inc/adom/altium-bridge",   "docs": "https://wiki.adom.inc/adom/altium-bridge",@@ -76,6 +76,7 @@     "altium_foreground",     "altium_import_kicad",     "altium_import_part",+    "altium_install",     "altium_install_extension",     "altium_install_library",     "altium_install_library_bundle",@@ -193,6 +194,14 @@       "windows": [         "%ProgramFiles%\\Altium\\AD*\\X2.EXE"       ]-    }+    },+    "installVerb": "altium_install",+    "hostAppOptionalVerbs": [+      "describe",+      "diagnostics",+      "install",+      "readiness",+      "status"+    ]   } }