No description
Find a file
bob-boat 4ff8c3f78d Collector milestone 6: packaging — install.sh, systemd unit, docs
systemd/agent-watcher.service: --user unit with on-failure restart,
ProtectSystem=strict, ProtectHome=read-write, NoNewPrivileges=yes,
PrivateTmp=yes. JSON logs to journald. Survives reboot via
'loginctl enable-linger'.

examples/collector.yaml: working starter config for both sources with
inline comments, per-route examples, and the spec §3.1.2 schema for
drop files.

install.sh: idempotent installer following the agent-ping pattern.
Builds the binary, installs it + the unit, drops the example config if
absent, reloads systemd, enables, and (unless --no-start) starts the
service. Adds drop-folder lifecycle artifacts (*.tmp, .dead-letter/)
to workspace .stignore so they don't replicate during processing.
Skips Syncthing-related steps gracefully when ~/Nyx/workspace is not
present.

INSTALL.md: prerequisites, install, configure, verify (drop-file +
webhook end-to-end probes), survive-logout, uninstall, troubleshooting
table.

README.md: rewritten to reflect actual status — v0 working with 43
tests, packaging ready, Layer 2 in progress on Bob's side.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:26:16 -04:00
cmd/agent-watcher Collector milestone 5: end-to-end integration tests 2026-05-06 16:23:34 -04:00
docs/channels Add Channels reference docs snapshot for Layer 2 implementation 2026-05-06 16:04:32 -04:00
examples Collector milestone 6: packaging — install.sh, systemd unit, docs 2026-05-06 16:26:16 -04:00
internal Collector milestone 4: config loader + main wiring (binary builds) 2026-05-06 16:22:03 -04:00
spec Initial: README, spec/agent-watcher.md v1 (signed off by Bob 2026-05-06), .gitignore 2026-05-06 14:36:45 -04:00
systemd Collector milestone 6: packaging — install.sh, systemd unit, docs 2026-05-06 16:26:16 -04:00
.gitignore Initial: README, spec/agent-watcher.md v1 (signed off by Bob 2026-05-06), .gitignore 2026-05-06 14:36:45 -04:00
go.mod Collector milestone 4: config loader + main wiring (binary builds) 2026-05-06 16:22:03 -04:00
go.sum Collector milestone 4: config loader + main wiring (binary builds) 2026-05-06 16:22:03 -04:00
INSTALL.md Collector milestone 6: packaging — install.sh, systemd unit, docs 2026-05-06 16:26:16 -04:00
install.sh Collector milestone 6: packaging — install.sh, systemd unit, docs 2026-05-06 16:26:16 -04:00
README.md Collector milestone 6: packaging — install.sh, systemd unit, docs 2026-05-06 16:26:16 -04:00

agent-watcher

Push-delivery layer for agent-ping. The "secondary nervous system" for Claude Code agents on this network.

agent-ping queues messages in inbox files; agent-watcher notices them (and other external events) and wakes the recipient agent without a human in the loop.

Two layers:

  • Collector (this repo, Go) — small daemon under systemd --user. Always on, brain-blind. Converts external events (HTTP webhooks, drop-folder file arrivals) into ping inbox writes. Runs whether or not any agent is alive.
  • MCP Watcher (Python, in progress) — Claude Code MCP subprocess declared in each agent's mcp.json. Watches the agent's inbox via inotify and surfaces events into the live session via Channels. Provides reply tools (ack, respond, mark_handled).

Filesystem is the queue. OpenBrain is not involved.

Spec

spec/agent-watcher.md. Read that for architecture, decisions, scope.

Channels reference docs (snapshot of Anthropic's official docs, used by Layer 2): docs/channels/.

Status

Layer Lane Status
Spec v1 Signed off by Bob 2026-05-06
Layer 1: Collector Foreman / Go v0 working: 43 tests passing. End-to-end exercised; binary builds. systemd unit + INSTALL.md ready.
Layer 2: MCP Watcher Bob / Python In progress — sandbox CC session being set up on VPS for testing.

Install (Layer 1)

git clone https://git.botbought.ai/foreman/agent-watcher ~/agent-watcher
cd ~/agent-watcher
./install.sh

Then edit ~/.config/agent-watcher/collector.yaml and systemctl --user restart agent-watcher.

See INSTALL.md for verify steps, troubleshooting, and the loginctl enable-linger step required to keep the daemon running across logouts.

Per CLAUDE.md rule #2, Angus runs the install commands — agents do not modify their own configuration.

Quick reference (Layer 1)

Inputs                          Output
─────────                       ──────
HTTP POST → port 18790      ┐
              (routed via   │   <recipient>.inbox  (JSONL, ping-shaped)
               YAML table)  │   identical format to
                            ├─→ what `ping <recipient> <payload>` writes;
File drop in                │   the existing UserPromptSubmit hook and the
~/Nyx/workspace/incoming/   │   future MCP Watcher consume the stream
*.json                      ┘   without distinguishing source.

/health on the same webhook port returns {received, emitted, errors, uptime_sec} for journalctl correlation.