tools(relay): durable JSONL message log + pm wrapper + 120-char preview

- queue.ts: append every posted message to relay-log.jsonl (full body,
  survives the consume-once drain + restarts). gitignored.
- server.ts: bump the stdout preview from 60 to 120 chars.
- tools/relay/pm: absolute-path bash wrapper (read|pending|send) so relay
  ops work from any cwd without cd or hand-built JSON escaping.
- Fold in Dev-C's Phase 6 ARCHITECTURE.md slice as a coordination artifact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
adlee-was-taken
2026-05-31 22:51:02 -04:00
parent 7c7efa7c43
commit 108965ec84
5 changed files with 136 additions and 2 deletions

49
tools/relay/pm Executable file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
# PM relay helper — absolute-path wrapper around call.py so it can be invoked
# from ANY working directory with no `cd` and no JSON-quoting by hand.
#
# Usage:
# tools/relay/pm read # drain PM inbox
# tools/relay/pm pending # pending counts for all roles
# tools/relay/pm send <to> <kind> <body> # post_message from pm
# e.g. tools/relay/pm send dev-c directive "## DIRECTIVE ... "
#
# Always works regardless of cwd because it resolves call.py by absolute path.
set -euo pipefail
RELAY_DIR="/home/alee/Sources/relicario/tools/relay"
CALL="python3 $RELAY_DIR/call.py"
cmd="${1:-}"
case "$cmd" in
read)
$CALL read_messages '{"for":"pm"}'
;;
pending)
for r in dev-a dev-b dev-c pm; do
printf '%s: ' "$r"
$CALL list_pending "{\"for\":\"$r\"}"
echo
done
;;
send)
to="${2:?usage: pm send <to> <kind> <body>}"
kind="${3:?usage: pm send <to> <kind> <body>}"
body="${4:?usage: pm send <to> <kind> <body>}"
# Build JSON with python to handle escaping of the body safely.
python3 - "$to" "$kind" "$body" <<'PY'
import json, sys, urllib.request
to, kind, body = sys.argv[1], sys.argv[2], sys.argv[3]
payload = {"from": "pm", "to": to, "kind": kind, "body": body}
import subprocess
print(subprocess.run(
["python3", "/home/alee/Sources/relicario/tools/relay/call.py",
"post_message", json.dumps(payload)],
capture_output=True, text=True).stdout, end="")
PY
;;
*)
echo "usage: pm {read|pending|send <to> <kind> <body>}" >&2
exit 2
;;
esac