diff --git a/node/src/cli.ts b/node/src/cli.ts index 0068a4c..aad3bdc 100644 --- a/node/src/cli.ts +++ b/node/src/cli.ts @@ -260,8 +260,8 @@ program windowMinutes: opts.peerWindowMinutes, maxPeers: opts.maxPeers, watcherCommand: `claude-mailbox watch --block --name ${name}`, + daemonError: daemonError ?? undefined, }); - if (daemonError) lines.push("", daemonError); lines.push(""); process.stdout.write(lines.join("\n")); }); diff --git a/node/src/hook.ts b/node/src/hook.ts index a399ba9..f26c8b0 100644 --- a/node/src/hook.ts +++ b/node/src/hook.ts @@ -123,10 +123,11 @@ export interface SessionAnnounceOptions { windowMinutes: number; maxPeers: number; watcherCommand?: string; + daemonError?: string; } export function buildSessionAnnounceLines(opts: SessionAnnounceOptions): string[] { - const { name, peers, windowMinutes, maxPeers, watcherCommand } = opts; + const { name, peers, windowMinutes, maxPeers, watcherCommand, daemonError } = opts; const lines = [ `Claude-Mailbox: your mailbox name this session is \`${name}\`.`, `The name is auto-derived as -. You can rename it (e.g. to tag your working area) with mcp__mailbox__rename(current_name="${name}", new_name="--"); after that, use the new name everywhere.`, @@ -151,7 +152,11 @@ export function buildSessionAnnounceLines(opts: SessionAnnounceOptions): string[ ` - exit code 2 → daemon unreachable; wait ~5 s, then relaunch.`, ); } - lines.push("", ...formatActivePeerList(peers, name, { windowMinutes, maxPeers })); + if (daemonError) { + lines.push("", daemonError); + } else { + lines.push("", ...formatActivePeerList(peers, name, { windowMinutes, maxPeers })); + } return lines; } diff --git a/node/tests/hook.test.ts b/node/tests/hook.test.ts index 285a087..e036b20 100644 --- a/node/tests/hook.test.ts +++ b/node/tests/hook.test.ts @@ -402,6 +402,20 @@ describe("buildSessionAnnounceLines", () => { expect(out).not.toContain("watch --block"); expect(out).not.toContain("run_in_background"); }); + + it("replaces the peer list with the daemonError hint when daemon is unreachable", () => { + const out = buildSessionAnnounceLines({ + name: "alice-abc12345", + peers: [], + windowMinutes: 60, + maxPeers: 10, + daemonError: "[Claude-Mailbox] Daemon not reachable at http://127.0.0.1:1.", + }).join("\n"); + expect(out).toContain("Daemon not reachable"); + // The misleading "no peers" line must NOT appear when the daemon is down. + expect(out).not.toMatch(/No other mailboxes seen/); + expect(out).not.toMatch(/Active peers/); + }); }); describe("readSettings / writeSettings roundtrip", () => {