mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
* feat: restore pipe IPC, LAN pipes, monitor tool, and PR-package features Core IPC system (UDS_INBOX): - PipeServer/PipeClient with UDS + TCP dual transport, NDJSON protocol - PipeRegistry: machineId-based role assignment, file locking - Master/slave attach, prompt relay, permission forwarding - Heartbeat lifecycle with parallel isPipeAlive probes - Commands: /pipes, /attach, /detach, /send, /claim-main, /pipe-status LAN Pipes (LAN_PIPES): - UDP multicast beacon (224.0.71.67:7101) for zero-config LAN discovery - PipeServer TCP listener, PipeClient TCP connect mode - Heartbeat auto-attaches LAN peers via TCP - Cross-machine attach allowed regardless of role - /pipes shows [LAN] peers with role + hostname/IP - SendMessageTool supports tcp: scheme with user consent Architecture — extracted hooks from REPL.tsx (~830 lines → ~20 lines): - usePipeIpc: lifecycle (bootstrap, handlers, heartbeat, cleanup) - usePipeRelay: slave→master message relay via module singleton - usePipePermissionForward: permission request/cancel forwarding - usePipeRouter: selected pipe input routing with role+IP labels - Shared ndjsonFramer.ts replaces 3 duplicate NDJSON parsers Key fixes applied during development: - Multicast binds to correct LAN interface (not WSL/Docker) - Beacon ref stored as module singleton (not Zustand state mutation) - Heartbeat preserves LAN peers in discoveredPipes and selectedPipes - Disconnect handler calls removeSlaveClient (fixes listener leak) - cleanupStaleEntries probes without lock, writes briefly under lock - getMachineId uses async execFile (not blocking execSync) - globalThis.__pipeSendToMaster replaced with setPipeRelay singleton - M key only toggles route mode when selector panel is expanded - User prompt displayed in message list on pipe broadcast - Broadcast notifications show [role] + hostname/IP for LAN peers Other restored features: - Monitor tool: /monitor command, MonitorTool, MonitorMcpTask lifecycle - Daemon supervisor and remoteControlServer command - Tools: SnipTool, SleepTool, ListPeersTool, SendUserFileTool, WebBrowserTool, WorkflowTool, and 10+ stub→implementation rewrites - Feature flags: UDS_INBOX, LAN_PIPES, MONITOR_TOOL, FORK_SUBAGENT, KAIROS, COORDINATOR_MODE, WORKFLOW_SCRIPTS, HISTORY_SNIP Tests: 2190 pass / 0 fail (15 new: lanBeacon 7, peerAddress 8) * fix: resolve merge conflicts and fix all tsc/test errors after main merge - Export ToolResultBlockParam from Tool.ts (14 tool files fixed) - Migrate ink imports from ../../ink.js to @anthropic/ink (7 files) - Fix toolUseID → toolUseId typo in monitor.ts and MonitorTool.tsx - Add fallback values for string|undefined type errors (8 locations) - Fix AppState type in assistant.ts, add NewInstallWizard stubs - Fix ParsedRepository.repo → .name in subscribe-pr.ts - Fix AgentId/string type mismatch in BackgroundTasksDialog.tsx - Fix PipeRelayFn return type in pipePermissionRelay.ts - Use PipeMessage type in usePipeRelay.ts - Fix lanBeacon.test.ts mock type assertions - Create missing MouseActionEvent class for ink package - Use ansi: color format instead of bare "green"/"red" - Resolve theme.permission access via getTheme() Result: 0 tsc errors, 2496 tests pass, 0 fail Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 恢复 /poor 的说明 --------- Co-authored-by: unraid <local@unraid.local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
87 lines
2.9 KiB
Markdown
87 lines
2.9 KiB
Markdown
# LAN Pipes — 局域网跨机器通讯
|
||
|
||
## 概述
|
||
|
||
在现有 UDS (Unix Domain Socket) 本地 Pipe 通讯基础上,增加 TCP 传输层和 UDP Multicast 发现机制,使同一局域网内不同机器上的 Claude Code 实例可以互相发现、连接和双向通讯。
|
||
|
||
## Feature Flag
|
||
|
||
`LAN_PIPES` — dev/build 默认启用。也可通过 `FEATURE_LAN_PIPES=1` 环境变量启用。
|
||
|
||
## 架构
|
||
|
||
```
|
||
Machine A (192.168.1.10) Machine B (192.168.1.20)
|
||
┌─────────────────────────┐ ┌─────────────────────────┐
|
||
│ PipeServer │ │ PipeServer │
|
||
│ UDS: cli-abc.sock │ │ UDS: cli-def.sock │
|
||
│ TCP: 0.0.0.0:7100 │◄─TCP────►│ TCP: 0.0.0.0:7102 │
|
||
├─────────────────────────┤ ├─────────────────────────┤
|
||
│ LanBeacon │◄─UDP─────│ LanBeacon │
|
||
│ multicast 224.0.71.67 │ mcast ►│ multicast 224.0.71.67 │
|
||
└─────────────────────────┘ └─────────────────────────┘
|
||
```
|
||
|
||
## 组件
|
||
|
||
### 1. PipeServer TCP 扩展 (`pipeTransport.ts`)
|
||
|
||
- `PipeServer.start()` 接受 `PipeServerOptions`,可选启用 TCP 监听
|
||
- 内部维护两个 `net.Server` — UDS + TCP,共享同一组 clients 和 handlers
|
||
- `PipeServer.tcpAddress` getter 返回 TCP 端口信息
|
||
|
||
### 2. PipeClient TCP 扩展 (`pipeTransport.ts`)
|
||
|
||
- 构造函数新增可选 `TcpEndpoint` 参数
|
||
- `connect()` 根据是否有 TCP endpoint 选择连接模式
|
||
- 对下游调用者完全透明
|
||
|
||
### 3. LAN Beacon (`lanBeacon.ts`)
|
||
|
||
- UDP multicast 组: `224.0.71.67:7101`
|
||
- 每 3 秒广播 announce 包,包含 pipeName、machineId、hostname、ip、tcpPort、role
|
||
- 15 秒无 announce 视为 peer lost
|
||
- TTL=1,仅 link-local,不跨路由器
|
||
|
||
### 4. Registry 扩展 (`pipeRegistry.ts`)
|
||
|
||
- `PipeRegistryEntry` 新增 `tcpPort?` 和 `lanVisible?` 字段
|
||
- `mergeWithLanPeers()` 合并本地 registry 和 LAN beacon 发现的远端 peers
|
||
|
||
### 5. Peer Address (`peerAddress.ts`)
|
||
|
||
- `parseAddress()` 新增 `tcp` scheme: `tcp:192.168.1.20:7100`
|
||
- `parseTcpTarget()` 解析 `host:port` 字符串
|
||
|
||
## 使用方式
|
||
|
||
### 查看 LAN Peers
|
||
|
||
```
|
||
/pipes
|
||
```
|
||
|
||
输出中会显示 `[LAN]` 标记的远端实例。
|
||
|
||
### 连接远端实例
|
||
|
||
```
|
||
/attach <pipe-name>
|
||
```
|
||
|
||
自动检测 LAN peer 并通过 TCP 连接。
|
||
|
||
### 发送消息到 LAN Peer
|
||
|
||
```
|
||
/send tcp:192.168.1.20:7100 <message>
|
||
```
|
||
|
||
或通过 SendMessage tool 使用 `tcp:` scheme。
|
||
|
||
## 安全
|
||
|
||
- TCP 连接需用户显式同意(checkPermissions 返回 `ask`)
|
||
- Multicast TTL=1,仅限链路本地
|
||
- 后续可增加 HMAC-SHA256 challenge 认证
|