Conversation
- scripts/room-poll.sh: bash poller with 10s interval, tmux nudge - scripts/room-poll-check.py: checks rooms, auto-acks messages from petrus via direct curl (2s response), then nudges Claude Code for full response Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add .gitignore (node_modules, *.jsonl, exec-approvals.json, .env, logs) - Untrack ide-agent-receipts.jsonl (runtime data) - Remove hardcoded API key from tools/geminimb_room_autopost.sh (now env-driven) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document the tested configuration: Claude Opus 4.6 (@claudemm), GPT 5.3 Codex (@AntiGravity), and Gemini 3.1 (@geminiMB) running concurrently with <10s response times via room pollers. Add env var reference table, keepalive CLI docs, and agent setup examples. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ly directed at everyone
Clarify that the 3-agent setup works across machines over the internet — no VPN, shared filesystem, or direct networking needed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
claudemm = Claude Code CLI on Mac mini, antigravity = Codex macOS app on MacBook, geminimb = Antigravity macOS app on MacBook. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New IAK_LISTEN_MODE env var with 4 modes: - all: listen to every message (including bots) - humans: skip bot messages - tagged: only when @mentioned - owner: only from owner (previous behavior) Default changed to "all" per team requirement for autonomous bot-to-bot discussion. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document all integrations: GitHub webhooks (HMAC verification, event normalization), OpenClaw bot fleet (gateway, sessions, exec approvals, hooks, cron), Ant Farm chat rooms, and all other modules (receipts, emit, memory, keepalive, tmux, watch). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. tools/geminimb_room_autopost.sh: remove re-added hardcoded API key, restore env var pattern 2. src/room-poller.mjs: fix undefined BASE_URL in postAck() by using full URL inline (matches fetchRoomMessages pattern) 3. schemas/event.normalized.json: add "antfarm" source, "antfarm.message.created" kind, and "room" field 4. src/watch.mjs: fix byte vs char indexing bug by reading new bytes via Buffer.slice instead of String.slice Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e.jsonl append for Antigravity GUI agents
…DE GUI processing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GeminiMB keeps re-adding the literal key. Added explicit warning comment. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ide-agent-queue for GUI app ingestion
…s and silently ingesting tasks to the GUI queue instead
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nline replacing inactive GUI queue
…ration hanging indefinitely
…r the LLM to respond conversationally
Multiple poller processes were spawning on restart, causing race conditions on the seen-IDs file and duplicate auto-acks. The lock file ensures only one poller runs at a time. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…credential scrubbing
…ewlines with spaces
geminimb: - Fix auth header: was "Authorization: Bearer" but Ant Farm API requires "X-API-Key" (posts were silently failing) - Remove hardcoded REDACTED_GEMINIMB_KEY fallback, require env var - Add PID lock to prevent duplicate pollers antigravity: - Add PID lock to prevent duplicate pollers Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…t json fixes to claudemm poller
Ant Farm API requires X-API-Key header, not Authorization:Bearer. Commit e0d2ab1 incorrectly changed claudemm poller to Bearer auth, and antigravity had the same bug in its fetch calls (lines 70, 415) while using correct X-API-Key for posting (line 323). Now all three pollers consistently use X-API-Key everywhere. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0293562ed9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if not result.stdout.strip(): | ||
| return [] | ||
| data = json.loads(result.stdout, strict=False) | ||
| return data.get("messages", data if isinstance(data, list) else []) |
There was a problem hiding this comment.
Handle list payloads before calling .get
In _fetch_room_messages, the fallback for array responses is unreachable because data.get("messages", ...) is invoked unconditionally; if the API returns a top-level list, this raises AttributeError before the fallback can apply. In this script, that exception is swallowed by main() and converted to NONE, so the poller silently skips new messages for the entire run instead of processing them.
Useful? React with 👍 / 👎.
|
|
||
|
|
||
| def _save_id_set(path: str, values: Iterable[str], keep_last: int = 1000) -> None: | ||
| tail = list(values)[-keep_last:] |
There was a problem hiding this comment.
Preserve recency when trimming seen/acked IDs
_save_id_set trims with list(values)[-keep_last:], but both callers pass set objects, whose iteration order is not recency-based. After the set grows past keep_last, this can evict recently seen IDs and retain arbitrary older ones, which makes duplicate messages eligible for reprocessing/auto-ack after restarts. Use an ordered structure for IDs (or explicit timestamp ordering) before truncation.
Useful? React with 👍 / 👎.
Summary
Test plan
🤖 Generated with Claude Code