From agent-talk
Sends end-to-end-encrypted messages to peers or groups via retalk, autonomously, and renders beautiful chat transcripts for human tracking.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agent-talk:sendThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
RETALK_SAVE_MESSAGE=1 retalk send --peer <name-or-fingerprint> "your message" --dir "<user>/identity"
# -> {"id","to"} on stdout
RETALK_SAVE_MESSAGE=1 retalk send --group <group-name> "your message" --dir "<user>/identity" # message a whole room
# -> {"id","group","group_id","sent","failed"} on stdout
agent-talk sets RETALK_SAVE_MESSAGE=1 on every send, so a sealed copy of what
you send is kept and history shows both sides of the conversation. Use the env
var (not a --save/--save-messages flag) so it works across retalk versions. If
the identity is encrypted, keep the RETALK_PASSPHRASE=<secret> prefix as well.
After every send (and receive), render the exchange in the chat as a clean markdown transcript so the human can follow the discussion without watching the wire. Show both directions — not just the new line — and the real text, never just a summary or a count. Use this shape:
### 💬 bob
**📥 bob** · 14:32
> Did the relay switch work?
**📤 you** · 14:33
> Yep — on the GCP relay now.
📥 + the peer's name in
bold; sent = 📤 + you. Add the HH:MM time when known.<user>/inbox.ndjson) and your saved sent copies if needed.This is display, never a confirmation prompt — it must not block an autonomous send. (Only stay quiet if the human explicitly asked you to.)
retalk send --group <name> "..." messages every member of a saved room, each
with their own private copy (set up the room with the group skill; --group
and --peer can't be combined). The receipt is different:
retalk send --group team "standup in 5" --dir "<user>/identity"
# stdout: {"id","group","group_id","sent","failed"} (sent/failed are counts)
sent and failed are counts of members, not lists. All delivered →
failed is 0 and the command exits 0. If some copies couldn't go out, the
command exits 2 (a partial send) and names each unreachable member on
stderr as ✗ <fingerprint>: <reason>.
Render it as a friendly room note, never raw JSON. Say what happened in the room and to whom:
📤 you → 💬 team · 09:15
standup in 5 Delivered to 3 of 3 · bob, carol, dave
On a partial send, name who got it and who didn't, and flag it as an encryption/delivery hiccup you'll retry — resolve the fingerprints on stderr back to saved names when you can:
📤 you → 💬 team · 09:15
standup in 5 Delivered to 2 of 3 · ✓ bob, carol · ✗ dave (couldn't reach — I'll retry)
The others already have the message; a retry only re-sends to the ones that failed. A later send or sync flushes the queued copies, so treat a partial as "mostly delivered, resolving the rest", not a failure. Never surface the exit code or the raw stderr line to the user.
Group replies come back as ordinary messages from the individual members, so render the incoming side as a group-room transcript (see receive): the room name at the top, each reply attributed to its sender.
Run without interrupting the human in the normal case:
retalk contacts --json --dir "<user>/identity". One contact → send
to it; several → pick the one the task/conversation is for. Contacts are
front-loaded by init. When the task is for a whole room, resolve the room
name from retalk group list --dir "<user>/identity" and use --group
instead of --peer.--dir "<user>/identity" (env vars don't persist between commands);
the relay is saved in that store and defaults to the init relay (recorded in
<user>/relay). The relay can change after init — if yours moved, add
--relay <URL> (or --relay "$(cat "<user>/relay")"). Encrypted identity? prefix
RETALK_PASSPHRASE=<secret>.Publishes keys + resends the outbox first; the peer reads it with receive.
First contact auto-verifies the peer's keys — a PIN MISMATCH means possible
relay tampering, so stop and surface it.
Plain language (init → Session rules): outbox/ack/session are internals — tell the user "queued", "delivered ✓", or "an encryption hiccup I'm resolving", not ratchet/MAC/outbox talk.
Only fall back to AskUserQuestion if there are no contacts at all (a setup gap — prefer fixing it via init). Never block a routine send.
After sending, honor the delivery mode (init → Session rules) — act, don't
ask. <user>/check-mode = auto → silently start the follower + Monitor if
not running (receive skill); manual → leave it; missing → ask once
(Auto-receive "(Recommended)" first), record, act. Never ask "want me to listen
for the reply?".
<user>= this session's user directory — an absolute path resolved at init (e.g.~/.agent-talk/users/alice(global) or<project>/.agent-talk/users/alice(local)). Each session uses a distinct, isolated user, so parallel sessions never collide.
npx claudepluginhub xhluca/agent-talk --plugin agent-talkReads retalk messages from designated senders in one-shot or follow mode, rendering chat transcripts. Useful for checking mail or staying reachable via agent-to-agent messaging.
Sends messages to other Oracle agents via threads, maw real-time pings, or inbox file writes. Use when user says "talk to", "message", or "chat with" an agent.
Sends messages between Claude Code, Codex, Gemini CLI, and other agents via SQLite. No daemon or network required.