← Commit history

v0.1.39: fix idle-watcher boot (unimported taskbar; misattributed failure log)

John Lauer ·360d459d4d ·1mo ago ·parent c845740
7 files changed +16−9
CHANGELOG.md+3
@@ -1,5 +1,8 @@ # Changelog +## 0.1.39 — 2026-09-01+- **0.1.38's idle-watcher never actually started.** The boot-site call used `taskbar` unimported (dispatch imports it lazily inside the handler), so boot logged `name 'taskbar' is not defined` — and logged it as a DIALOG REAPER failure, because the watcher call sat inside the reaper's try-block. Fixed the import, and each boot service now has its own try so a failure names the thing that failed. Verified by the boot log this time, not by assumption.+ ## 0.1.38 — 2026-09-01 - **The taskbar overlay badge auto-clears after 5 minutes without a driving verb.** John, seeing the Adom mark still parked on Altium's taskbar icon: *"do you auto-remove that overlay after 5 minutes of verb inactivity?"* The answer was no — the badge was set on the first driving verb and never cleared until the bridge died, while this module's own header PROMISED "cleared when the bridge goes idle". A permanent overlay stops meaning "an AI is driving right now" and starts meaning nothing. An idle watcher (started at boot beside the dialog reaper) now clears it at 5 idle minutes; the next driving verb re-badges instantly. - For the record, what already worked: every driving verb with a measured estimate ≥3 s runs a REAL taskbar progress bar on Altium's button (percent paced by history, marquee when unmeasured, red flash + clear on failure) and stops it when the verb returns — progress rides the taskbar icon, never toasts, per the house rule.
adom-bridge-altium-manifest.json+4−4
@@ -1,9 +1,9 @@ {   "name": "altium",-  "version": "0.1.38",-  "url": "https://wiki.adom.inc/download/adom/altium-bridge/0.1.38/adom-bridge-altium-v0.1.38.zip",-  "sha256": "9468b0d69a824c6ea725a81b3cb800b1ed0e26b870a83ed13b62ac2f7ff8cb9c",-  "size": 135889,+  "version": "0.1.39",+  "url": "https://wiki.adom.inc/download/adom/altium-bridge/0.1.39/adom-bridge-altium-v0.1.39.zip",+  "sha256": "c7aa621a4a54c3f2e994a15f991f0a7643a88e44a7471a13db2253525f82bd4e",+  "size": 135933,   "verbPrefixes": [     "altium_"   ],
adom-bridge-altium-v0.1.39.zipadded
⋯ 1 unchanged line ⋯
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "altium",   "displayName": "Altium Designer",-  "version": "0.1.38",+  "version": "0.1.39",   "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",
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "altium-bridge",-  "version": "0.1.38",+  "version": "0.1.39",   "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.1.38+0.1.39
src/server.py+6−2
@@ -2947,10 +2947,14 @@ def main():     try:         dialogs.start_reaper()         print("[altium] standing dialog reaper started (known nuisances are pre-empted, never save prompts)")-        taskbar.start_idle_watcher()-        print("[altium] badge idle-watcher started (overlay auto-clears after 5 min without a driving verb)")     except Exception as e:         print(f"[altium] dialog reaper failed to start: {e}")+    try:+        from handlers import taskbar as _taskbar  # dispatch imports it lazily; this scope never had it+        _taskbar.start_idle_watcher()+        print("[altium] badge idle-watcher started (overlay auto-clears after 5 min without a driving verb)")+    except Exception as e:+        print(f"[altium] badge idle-watcher failed to start: {e}")     srv = ThreadingHTTPServer((host, port), Handler)     print(f"[altium] bridge {BRIDGE_VERSION} listening on {host}:{srv.server_address[1]}")     _install()