app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← Commit history
dashboard/kicad_dashboard.py+23−4@@ -49,7 +49,7 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from urllib.parse import unquote, urlparse -VERSION = "3.3.0"+VERSION = "3.3.1" AI_THREAD = "kicad-dashboard" DEFAULT_PORT = 8931 UI_DIR = Path(__file__).resolve().parent / "ui"@@ -177,15 +177,34 @@ def say_send(phrase): d = res.get("data") if isinstance(res.get("data"), dict) else res # VERIFY BY DELIVERY, never by the thread's name (issue #59: a correctly- # named tab that delivered nothing, and an unnamed tab that delivered).- delivered = d.get("delivered_to") or d.get("delivered_in_conversation")+ # named tab that delivered nothing, and an unnamed tab that delivered -+ # measured live on AdomLapper 2026-08-25, where a successful send came back+ # with "title": null).+ #+ # BUT delivered_to ALONE PRODUCES FALSE FAILURES. The API's own hint calls+ # it "a diff, not a guess" that is "empty ... if verification has not caught+ # up", and that is exactly what my first live send hit: an empty array on a+ # prompt that had in fact been typed and submitted. Accept EITHER the+ # transcript diff or the injector's own confirmation.+ inject = d.get("inject") if isinstance(d.get("inject"), dict) else {}+ delivered = (d.get("delivered_to")+ or inject.get("delivered_in_conversation")+ or d.get("delivered_in_conversation")) if not delivered: hint = d.get("_hints") or d.get("_hint") or res.get("_hints") or "" if isinstance(hint, dict): hint = " ".join(str(v) for v in hint.values())+ # ok:true with no delivery signal YET is "opened but unconfirmed", which+ # is not the same as failed. Say that precisely.+ if d.get("ok") or res.get("ok"):+ return {"ok": False, "unconfirmed": True,+ "why": "the thread opened and the prompt was submitted, but delivery is "+ "not confirmed yet. Check the new AI tab; the phrase was also "+ "copied so you can paste it if it did not land."} return {"ok": False, "why": ("the AI panel opened a thread but did not confirm " "delivery. " + (str(hint)[:200] if hint else "")).strip()}- return {"ok": True, "deliveredTo": str(delivered), "sid": d.get("sid")}+ return {"ok": True, "deliveredTo": str(delivered)[:200],+ "tid": d.get("tid"), "sid": d.get("sid")} def ab(target, verb, args=None, timeout=140):
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "kicad-bridge",- "version": "1.0.79",+ "version": "1.0.80", "type": "app", "description": "Skills for your container so your AI knows how to drive the KiCad bridge. The bridge runtime itself is the release zip; Adom Bridge loads that.", "tags": [
page.json+1−1@@ -4,7 +4,7 @@ "slug": "kicad-bridge", "title": "KiCad - the KiCad Bridge", "brief": "Reference implementation of the KiCad bridge — multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.",- "version": "1.0.79",+ "version": "1.0.80", "tags": [ "kicad", "pcb",