← Commit history

grok-bridge 1.3.2: bot_unavailable webhook error, per-PC binding hints, install next steps

John Lauer ·bf9d480034 ·6d ago ·parent 7d92f9e
9 files changed +37−12
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.3.1+1.3.2
CLAUDE.md+2−2
@@ -32,7 +32,7 @@ will seed/stream the runtime from the release zip via `updateManifestUrl` in `br   `ad_callback`. Never `shell_execute` / `pull_file` / `send_files` from the HTTP path. - `handlers/*.py` — readiness, describe, windows (open/screenshot/list), chat (status/read),   send, app (close/resize/record/login/logout/plugin), webhook, bots.-- `bridge.json` + `BRIDGE_VERSION` — KEEP IN LOCKSTEP (currently 1.3.1).+- `bridge.json` + `BRIDGE_VERSION` — KEEP IN LOCKSTEP (currently 1.3.2). - `adom-bridge-grok-manifest.json` — streaming manifest ab's `updateManifestUrl` points at;   its `url` is the RELEASE download URL of the zip, with matching `sha256`/`size`. - `SKILL.md` (root) — core USER skill, installed as **`grok`** (not `grok-bridge`).@@ -41,7 +41,7 @@ will seed/stream the runtime from the release zip via `updateManifestUrl` in `br - `package.json` — wiki skills pkg. Description is the skills-not-runtime sentence. Runtime   files and `*.zip` do **not** belong in `files[]`. -## Verbs (v1.3.1)+## Verbs (v1.3.2)  Existing: `grok_readiness` `grok_prewarm` `grok_describe` `grok_status` `grok_open` `grok_screenshot` `grok_list_windows` `grok_chat_status` `grok_chat_read` `grok_send` `grok_uninstall`.
adom-bridge-grok-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "grok",-  "version": "1.3.1",-  "url": "https://wiki.adom.inc/download/adom/grok-bridge/1.3.1/adom-bridge-grok-v1.3.1.zip",-  "sha256": "09d480e98a27cec6c3ae6509f7de65de1e910d8165febca6d399e6d33e3df3b5",-  "size": 49640,+  "version": "1.3.2",+  "url": "https://wiki.adom.inc/download/adom/grok-bridge/1.3.2/adom-bridge-grok-v1.3.2.zip",+  "sha256": "7f66e0e27ed34c84de632ac0e626a6d0b945320499beb765cd67da127719a35c",+  "size": 50129,   "verbPrefixes": [     "grok_"   ],
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "grok",   "displayName": "Grok Bot",-  "version": "1.3.1",+  "version": "1.3.2",   "description": "Drive Grok Bot (standalone Electron app, Grok Bot.exe) from Adom Bridge: open/close/resize/screenshot/record the app, read thinking vs idle and the visible transcript of the focused thread, queue messages, bind the Grok Bridge webhook and create bots/channels. No public Grok HTTP API \u2014 the runtime talks back to ab over desktop_* callbacks. Cursor is last-resort fallback only if Grok Bot.exe is missing.",   "homepage": "https://wiki.adom.inc/adom/grok-bridge",   "author": "Adom Inc.",
dev-skills/grok-publish/SKILL.md+1−1
@@ -23,7 +23,7 @@ Wiki: https://wiki.adom.inc/adom/grok-bridge. Changelog / `-m` must be ≥10 cha - Skills library / README / hero: bump **`package.json` version** (pkg). Leave `BRIDGE_VERSION` + `bridge.json` version alone if the Python runtime did not change. - New/changed `grok_*` verbs: bump **all three** (`BRIDGE_VERSION`, `bridge.json`, `package.json`) in lockstep, rebuild the zip, upload release, rewrite manifest, then pkg publish. -Current runtime: **1.3.1**. Skills-only bumps `package.json` only; verb changes bump zip + manifest + package.json together.+Current runtime: **1.3.2**. Skills-only bumps `package.json` only; verb changes bump zip + manifest + package.json together.  ## Skills pkg allowlist 
handlers/install.py+1−1
@@ -250,7 +250,7 @@ def handle_install_status(_args: dict) -> dict:         "resolving": "Asking the update feed for the current installer.",         "downloading": "Downloading. Poll again in ~10 s.",         "installing": "Running the silent per-user installer. Poll again in ~10 s.",-        "done": "Installed. Next: grok_open {} (background), then grok_login so the user signs in with Cursor.",+        "done": "Installed. Next: grok_open {} (background), grok_login (presses Sign in; the account picks its provider on xAI's page), then grok_webhook_ensure so this PC can fire webhooks (bindings are per PC).",         "failed": "Install failed; read error. A signature or sha256 rejection means the download was not Anysphere's: do not retry blindly, report it.",     }     j["success"] = state != "failed"
handlers/webhook.py+21−1
@@ -196,7 +196,9 @@ def webhook_not_bound_error(verb: str) -> dict:         "_hint": (             f"{verb} needs a bound webhook. Call grok_webhook_ensure {{}} to read the "             "Grok Bridge webhook routine pane (UIA Edit names Webhook URL / Webhook key), "-            "or grok_webhook_bind {{url, key}} from that panel."+            "or grok_webhook_bind {url, key} from that panel. The binding is per PC "+            "(%USERPROFILE%\\.adom\\grok-webhook.json): a PC that just got Grok Bot via grok_install "+            "has none even when another PC on the same account is bound. Never print the key."         ),         "_next": "grok_webhook_ensure {}",     }@@ -392,6 +394,24 @@ def handle_webhook_fire(args: dict) -> dict:             resp_text = (e.read() or b"").decode("utf-8", errors="replace")         except Exception:             resp_text = str(e)+        if "bot is unavailable" in resp_text.lower():+            return {+                "success": False,+                "errorCode": "bot_unavailable",+                "event": event,+                "httpStatus": status,+                "urlHost": url_host(url),+                "bodyPreview": resp_text[:500],+                "_hint": (+                    "The webhook is reachable and the key is accepted, but Grok says the bot that owns the "+                    "Grok Bridge webhook routine is unavailable. Usually its cloud computer is not up yet "+                    "(the app shows 'Couldn't load Bots' or 'having trouble connecting'; wait 10 to 20 min), or "+                    "the routine belongs to a bot that was removed, or this PC's binding was copied from another "+                    "PC whose routine changed. Check the sidebar in grok_screenshot, then run grok_webhook_ensure "+                    "on this PC to re-read the routine. Retrying the same fire immediately will not help."+                ),+                "_next": "grok_screenshot {} then grok_webhook_ensure {}",+            }         return {             "success": False,             "errorCode": "webhook_http_error",
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "grok-bridge",-  "version": "1.3.1",+  "version": "1.3.2",   "type": "app",   "description": "Grok Bridge lets Adom talk to Grok Bot. Adom's AI environment is for electrical engineers: any provider (Claude, Codex, Grok, Gemini, …), any desktop power tool, through Adom Bridge. grok_* open/close/resize/screenshot/record the app, read the thread, and create bots/channels via webhook.",   "keywords": [
skills/grok-webhook/SKILL.md+5
@@ -95,3 +95,8 @@ adom-bridge --ai-thread "grok" --target AdomLapper grok_webhook_fire '{ HTTP 200 is only `{runUuid}` — now copied to the verb's top-level `runUuid` (was null when only nested). For a computer shot use `grok_computer_screenshot {}` instead of polling. Optional `grok_run_status {runUuid}` echoes the last fire in this process. Latency ~60–120s. Queue is FIFO.  Smoke: `grok_webhook_fire {"event":"ping"}`. Verify with `grok_webhook_status` (hostname only).++## Errors worth knowing++- `webhook_not_bound`: this PC has no `~/.adom/grok-webhook.json`. Bindings are per PC; a freshly installed PC needs `grok_webhook_ensure`.+- `bot_unavailable` (HTTP 400 "This Bot is unavailable"): the key works but the routine's bot is unavailable, usually because the account's cloud computer is still coming up after a sign-in. Wait, check the sidebar with `grok_screenshot`, then `grok_webhook_ensure`. Retrying at once does not help.