feat: add hostname to hello + local/remote peer locality detection
Some checks failed
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled

Peers report os.hostname() in the hello handshake. list_peers shows
[local] or [remote] tag per peer. MCP instructions teach AI to read
local peers' files directly via filesystem instead of relay.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-08 00:05:46 +01:00
parent 98fda20ab6
commit 2c9c8c7b6c
4 changed files with 16 additions and 1 deletions

View File

@@ -228,6 +228,11 @@ Persistent knowledge that survives across sessions. Use remember(content, tags?)
share_file for persistent references, send_message(file:) for ephemeral attachments.
Tags on shared files make them searchable. Use list_files to find what peers shared.
## Peer project files
read_peer_file and list_peer_files request files from remote peers through the mesh (1MB limit, base64 relay).
**Same-machine shortcut:** If a peer's \`hostname\` matches yours (visible in list_peers), they are a LOCAL peer — read their files directly via the filesystem using their \`cwd\` path. Faster, no size limit, no relay. Use read_peer_file only for REMOTE peers (different hostname).
Each peer in list_peers shows a \`locality\` tag: "local" (same machine, direct filesystem access) or "remote" (different machine, use read_peer_file).
## Vectors
Store and search semantic embeddings. Use vector_store to index content, vector_search to find similar content.
@@ -342,10 +347,12 @@ Your message mode is "${messageMode}".
if (p.model) meta.push(`model:${p.model}`);
const metaStr = meta.length ? ` {${meta.join(", ")}}` : "";
const cwdStr = p.cwd ? ` cwd:${p.cwd}` : "";
const locality = p.hostname && p.hostname === require("os").hostname() ? "local" : "remote";
const localityTag = ` [${locality}]`;
const profileAvatar = p.profile?.avatar ? `${p.profile.avatar} ` : "";
const profileTitle = p.profile?.title ? ` (${p.profile.title})` : "";
const hiddenTag = p.visible === false ? " [hidden]" : "";
return `- ${profileAvatar}**${p.displayName}**${profileTitle} [${p.status}]${hiddenTag}${groupsStr}${metaStr} (${p.pubkey.slice(0, 12)}…)${cwdStr}${summary}`;
return `- ${profileAvatar}**${p.displayName}**${profileTitle} [${p.status}]${localityTag}${hiddenTag}${groupsStr}${metaStr} (${p.pubkey.slice(0, 12)}…)${cwdStr}${summary}`;
});
sections.push(`${header}\n${peerLines.join("\n")}`);
}

View File

@@ -35,6 +35,7 @@ export interface PeerInfo {
sessionId: string;
connectedAt: string;
cwd?: string;
hostname?: string;
peerType?: "ai" | "human" | "connector";
channel?: string;
model?: string;
@@ -194,6 +195,7 @@ export class BrokerClient {
sessionId: `${process.pid}-${Date.now()}`,
pid: process.pid,
cwd: process.cwd(),
hostname: require("os").hostname(),
peerType: "ai" as const,
channel: "claude-code",
model: process.env.CLAUDE_MODEL || undefined,