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

View File

@@ -1,4 +1,13 @@
import { randomUUID } from "node:crypto";
import { appendFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { dirname, join } from "node:path";
// Append-only archive of every posted message. The in-memory queues are
// consume-once (read() drains the inbox) and vanish on restart, so this is
// the only durable, full-body record of relay traffic. One JSON object per
// line; never truncated.
const LOG_PATH = join(dirname(fileURLToPath(import.meta.url)), "relay-log.jsonl");
export type Role = "pm" | "dev-a" | "dev-b" | "dev-c" | "dev-d" | "dev-e" | "dev-f";
export type MessageKind = "status" | "question" | "directive" | "free";
@@ -39,6 +48,11 @@ export class RelayQueue {
ts: new Date().toISOString(),
};
this.queues.get(to)!.push(msg);
try {
appendFileSync(LOG_PATH, JSON.stringify(msg) + "\n");
} catch {
// Logging is best-effort; never let a disk error drop a message.
}
return msg;
}