From 9697ab3a07de9b34b0266904139c73696759e5af Mon Sep 17 00:00:00 2001 From: hamr0 Date: Sat, 20 Jun 2026 23:05:40 +0200 Subject: [PATCH] =?UTF-8?q?release:=20stamp=20v0.9.0=20=E2=80=94=20account?= =?UTF-8?q?-sync=20resilience?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MINOR per the versioning policy: list_accounts gains a new `status` schema field (new runtime behavior). Verb set unchanged (still 12 tools); this changes one tool's output shape + the runtime account-map caching behavior. - mcp/package.json 0.8.1 -> 0.9.0 (npm == container == serverInfo.version) - CHANGELOG [Unreleased] -> [0.9.0] 2026-06-20 [MINOR] - README: note list_accounts now returns connection `status` - diff-review cleanup: wire preflight to the shared accountList() helper so the shape-parse lives in one place (behavior-identical; makes the helper's own comment accurate). Found during the /security + /diff-review pass on the diff. 48/48 unit tests green; /security pass (no Critical/High/Medium; .env untracked + gitignored, no secrets in history). Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 4 ++-- README.md | 2 +- mcp/package.json | 2 +- mcp/server.js | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e36d3e4..b86de65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,9 @@ beeperbox follows [Semantic Versioning 2.0.0](https://semver.org/) with one conc Published tags on GHCR: `:X.Y.Z` (exact, immutable), `:X.Y` (rolling within a minor), `:X` (rolling within a major — always `:0` today), `:latest` (newest release tag, rebuilt weekly to pick up upstream Beeper AppImage drift), `:edge` (every push to `master`, may break). -## [Unreleased] +## [0.9.0] — 2026-06-20 `[MINOR]` -Account-sync resilience + observability — filed by [multis](https://github.com/hamr0/multis) after a WhatsApp account added via noVNC didn't surface, and a plain `docker restart` didn't recover it (it self-corrected only later). MINOR-bound when released: `list_accounts` gains a new `status` schema field (new runtime behavior per the versioning policy). +Account-sync resilience + observability — filed by [multis](https://github.com/hamr0/multis) after a WhatsApp account added via noVNC didn't surface, and a plain `docker restart` didn't recover it (it self-corrected only later). MINOR per the versioning policy: `list_accounts` gains a new `status` schema field (new runtime behavior). No tool was added or removed — the verb set is still the 12 documented tools; this changes one tool's output shape and the runtime's caching behavior. ### Fixed diff --git a/README.md b/README.md index 4d9d48e..4b879c0 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Not a thin proxy over Beeper's raw API — an **opinionated 12-tool verb layer** | Tool | What it does | |---|---| -| `list_accounts` | Which networks are connected (WhatsApp, Telegram, Discord …) — slug + label + display name | +| `list_accounts` | Which networks are connected (WhatsApp, Telegram, Discord …) — slug + label + connection `status` + display name | | `list_inbox` | Most recently active chats, with unread counts and last-activity time | | `list_unread` | The "what needs me right now?" view — only chats with `unread_count > 0` | | `get_chat` | One chat's current metadata by ID | diff --git a/mcp/package.json b/mcp/package.json index c939240..ffa14b8 100644 --- a/mcp/package.json +++ b/mcp/package.json @@ -1,6 +1,6 @@ { "name": "beeperbox", - "version": "0.8.1", + "version": "0.9.0", "description": "Lite mode for beeperbox — the opinionated MCP verb server for Beeper Desktop, run standalone against a Beeper you already have open (no Docker, no Electron). The full headless-Beeper-in-Docker build lives at github.com/hamr0/beeperbox.", "bin": { "beeperbox": "server.js" diff --git a/mcp/server.js b/mcp/server.js index 569f225..734f73f 100644 --- a/mcp/server.js +++ b/mcp/server.js @@ -1228,8 +1228,7 @@ async function preflight() { return; } try { - const accounts = await beeperFetch('/v1/accounts', { timeoutMs: PREFLIGHT_TIMEOUT_MS }); - const list = Array.isArray(accounts) ? accounts : (accounts?.items || []); + const list = accountList(await beeperFetch('/v1/accounts', { timeoutMs: PREFLIGHT_TIMEOUT_MS })); say(`preflight OK: ${BEEPER_API} reachable, token accepted, ${list.length} account(s)`); } catch (e) { say(`preflight FAIL: ${BEEPER_API} unreachable or token rejected — ${e.message}`);