@dolusoft/claude-collab 1.11.5 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -226
- package/dist/cli.js +4408 -741
- package/dist/cli.js.map +1 -1
- package/dist/mcp-main.js +4456 -748
- package/dist/mcp-main.js.map +1 -1
- package/package.json +84 -80
- package/scripts/setup-skills.mjs +54 -0
- package/skills/collab-backend/SKILL.md +72 -0
- package/skills/collab-devops/SKILL.md +66 -0
- package/skills/collab-frontend/SKILL.md +122 -0
- package/skills/collab-lead/SKILL.md +237 -0
- package/skills/collab-manager/SKILL.md +253 -0
- package/skills/collab-observer/SKILL.md +121 -0
- package/skills/collab-qa/SKILL.md +113 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/infrastructure/mesh/protocol.ts","../src/infrastructure/firewall/firewall.ts","../src/infrastructure/terminal-injector/windows-injector.ts","../src/infrastructure/terminal-injector/index.ts","../src/infrastructure/terminal-injector/injection-queue.ts","../src/infrastructure/mesh/mesh-node.ts","../src/presentation/mcp/tools/connect.tool.ts","../src/presentation/mcp/tools/ask.tool.ts","../src/presentation/mcp/tools/reply.tool.ts","../src/presentation/mcp/tools/status.tool.ts","../src/presentation/mcp/tools/set_profile.tool.ts","../src/presentation/mcp/server.ts","../src/cli.ts"],"names":["uuidv4","z"],"mappings":"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","file":"cli.js","sourcesContent":["/**\r\n * Wire Protocol\r\n * Messages exchanged directly between peers.\r\n * @module infrastructure/mesh/protocol\r\n */\r\n\r\nexport type MessageFormat = 'plain' | 'markdown';\r\n\r\n// Sent when a peer connects (client → server, or outbound → inbound)\r\nexport interface HelloMsg {\r\n type: 'HELLO';\r\n name: string;\r\n profile?: string;\r\n}\r\n\r\n// Acknowledge the HELLO\r\nexport interface HelloAckMsg {\r\n type: 'HELLO_ACK';\r\n name: string;\r\n profile?: string;\r\n}\r\n\r\n// Sent after handshake — share known peers so the other side can complete the mesh\r\nexport interface PeerListMsg {\r\n type: 'PEER_LIST';\r\n peers: Array<{ name: string; ip: string; profile?: string }>;\r\n}\r\n\r\n// Broadcast when a peer updates their profile\r\nexport interface ProfileUpdateMsg {\r\n type: 'PROFILE_UPDATE';\r\n name: string;\r\n profile: string;\r\n}\r\n\r\n// Broadcast to existing peers when a new peer connects — so they can connect directly\r\nexport interface PeerAnnounceMsg {\r\n type: 'PEER_ANNOUNCE';\r\n name: string;\r\n ip: string;\r\n}\r\n\r\n// Ask a question directly to the connected peer\r\nexport interface AskMsg {\r\n type: 'ASK';\r\n from: string;\r\n questionId: string;\r\n content: string;\r\n format: MessageFormat;\r\n}\r\n\r\n// Confirm question was received\r\nexport interface AskAckMsg {\r\n type: 'ASK_ACK';\r\n questionId: string;\r\n}\r\n\r\n// Push answer back to the asker\r\nexport interface AnswerMsg {\r\n type: 'ANSWER';\r\n from: string;\r\n questionId: string;\r\n content: string;\r\n format: MessageFormat;\r\n answeredAt: string;\r\n}\r\n\r\nexport type WireMsg = HelloMsg | HelloAckMsg | PeerListMsg | PeerAnnounceMsg | AskMsg | AskAckMsg | AnswerMsg | ProfileUpdateMsg;\r\n\r\nexport function serialize(msg: WireMsg): string {\r\n return JSON.stringify(msg);\r\n}\r\n\r\nexport function parse(data: string): WireMsg {\r\n return JSON.parse(data) as WireMsg;\r\n}\r\n","/**\r\n * Firewall helpers\r\n * Always elevated via UAC (PowerShell Start-Process -Verb RunAs) so the rule\r\n * is guaranteed to be applied. If the process is already elevated, Windows\r\n * skips the UAC prompt automatically.\r\n * @module infrastructure/firewall/firewall\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\n\r\n/**\r\n * Run netsh via UAC elevation (PowerShell Start-Process -Verb RunAs).\r\n * If the calling process is already elevated, no prompt is shown.\r\n */\r\nfunction runNetshElevated(argArray: string[]): Promise<void> {\r\n const argList = argArray.map((a) => `\"${a}\"`).join(',');\r\n const psCommand = `Start-Process -FilePath \"netsh\" -ArgumentList @(${argList}) -Verb RunAs -Wait`;\r\n\r\n return new Promise((resolve, reject) => {\r\n const ps = spawn('powershell', ['-NoProfile', '-Command', psCommand]);\r\n\r\n ps.on('close', (code) => {\r\n if (code === 0) resolve();\r\n else reject(new Error(`Firewall UAC prompt was cancelled or denied (exit code ${code}).`));\r\n });\r\n\r\n ps.on('error', (err) => {\r\n reject(new Error(`Failed to launch PowerShell: ${err.message}`));\r\n });\r\n });\r\n}\r\n\r\nexport async function addFirewallRule(port: number): Promise<void> {\r\n await runNetshElevated([\r\n 'advfirewall', 'firewall', 'add', 'rule',\r\n `name=claude-collab-${port}`,\r\n 'protocol=TCP',\r\n 'dir=in',\r\n `localport=${port}`,\r\n 'action=allow',\r\n ]);\r\n}\r\n\r\nexport async function removeFirewallRule(port: number): Promise<void> {\r\n await runNetshElevated([\r\n 'advfirewall', 'firewall', 'delete', 'rule',\r\n `name=claude-collab-${port}`,\r\n ]);\r\n}\r\n","/**\r\n * Windows Terminal Injector\r\n * AttachConsole(ppid) → CreateFile(\"CONIN$\") → WriteConsoleInput\r\n * All keystrokes (text, Ctrl+U, Enter, Ctrl+Y) go through WriteConsoleInput.\r\n * No WScript.Shell / SendKeys / SetForegroundWindow — no focus dependency.\r\n * @module infrastructure/terminal-injector/windows-injector\r\n */\r\n\r\nimport { execFile } from 'child_process';\r\nimport { unlinkSync } from 'fs';\r\nimport { tmpdir } from 'os';\r\nimport { join } from 'path';\r\n\r\nconst CS_CONINJECT = `\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Runtime.InteropServices;\r\n\r\npublic class ConInject {\r\n [DllImport(\"kernel32.dll\")] public static extern bool FreeConsole();\r\n [DllImport(\"kernel32.dll\")] public static extern bool AttachConsole(uint pid);\r\n [DllImport(\"kernel32.dll\", CharSet=CharSet.Unicode, SetLastError=true)]\r\n public static extern IntPtr CreateFile(\r\n string lpFileName, uint dwDesiredAccess, uint dwShareMode,\r\n IntPtr lpSecurityAttributes, uint dwCreationDisposition,\r\n uint dwFlagsAndAttributes, IntPtr hTemplateFile);\r\n [DllImport(\"kernel32.dll\", CharSet=CharSet.Unicode)] public static extern bool WriteConsoleInput(\r\n IntPtr hIn, INPUT_RECORD[] buf, uint len, out uint written);\r\n [DllImport(\"kernel32.dll\")] public static extern bool CloseHandle(IntPtr h);\r\n\r\n [StructLayout(LayoutKind.Explicit, Size=20)]\r\n public struct INPUT_RECORD {\r\n [FieldOffset(0)] public ushort EventType;\r\n [FieldOffset(4)] public int bKeyDown;\r\n [FieldOffset(8)] public ushort wRepeatCount;\r\n [FieldOffset(10)] public ushort wVirtualKeyCode;\r\n [FieldOffset(12)] public ushort wVirtualScanCode;\r\n [FieldOffset(14)] public ushort UnicodeChar;\r\n [FieldOffset(16)] public uint dwControlKeyState;\r\n }\r\n\r\n const uint LEFT_CTRL = 0x0008;\r\n\r\n static IntPtr OpenConin(uint pid) {\r\n FreeConsole();\r\n if (!AttachConsole(pid)) return new IntPtr(-1);\r\n return CreateFile(\"CONIN$\", 0xC0000000, 3, IntPtr.Zero, 3, 0, IntPtr.Zero);\r\n }\r\n\r\n // Inject plain text characters into console input buffer\r\n public static int InjectText(uint pid, string text) {\r\n IntPtr hIn = OpenConin(pid);\r\n if (hIn == new IntPtr(-1)) return -1;\r\n\r\n var records = new List<INPUT_RECORD>();\r\n foreach (char c in text) {\r\n records.Add(new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, UnicodeChar=(ushort)c });\r\n records.Add(new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, UnicodeChar=(ushort)c });\r\n }\r\n\r\n var arr = records.ToArray();\r\n uint written;\r\n bool ok = WriteConsoleInput(hIn, arr, (uint)arr.Length, out written);\r\n CloseHandle(hIn);\r\n return ok ? (int)written : -2;\r\n }\r\n\r\n // Inject Enter (VK_RETURN = 0x0D)\r\n public static int InjectEnter(uint pid) {\r\n IntPtr hIn = OpenConin(pid);\r\n if (hIn == new IntPtr(-1)) return -1;\r\n\r\n var records = new INPUT_RECORD[] {\r\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x0D, UnicodeChar=0x0D },\r\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x0D, UnicodeChar=0x0D }\r\n };\r\n\r\n uint written;\r\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\r\n CloseHandle(hIn);\r\n return ok ? (int)written : -2;\r\n }\r\n\r\n // Inject Ctrl+U (VK_U = 0x55, char = 0x15)\r\n public static int InjectCtrlU(uint pid) {\r\n IntPtr hIn = OpenConin(pid);\r\n if (hIn == new IntPtr(-1)) return -1;\r\n\r\n var records = new INPUT_RECORD[] {\r\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x55, UnicodeChar=0x15, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x55, UnicodeChar=0x15, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=0 }\r\n };\r\n\r\n uint written;\r\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\r\n CloseHandle(hIn);\r\n return ok ? (int)written : -2;\r\n }\r\n\r\n // Inject Ctrl+Y (VK_Y = 0x59, char = 0x19)\r\n public static int InjectCtrlY(uint pid) {\r\n IntPtr hIn = OpenConin(pid);\r\n if (hIn == new IntPtr(-1)) return -1;\r\n\r\n var records = new INPUT_RECORD[] {\r\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x59, UnicodeChar=0x19, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x59, UnicodeChar=0x19, dwControlKeyState=LEFT_CTRL },\r\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=0 }\r\n };\r\n\r\n uint written;\r\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\r\n CloseHandle(hIn);\r\n return ok ? (int)written : -2;\r\n }\r\n}\r\n`;\r\n\r\nfunction buildScript(claudePid: number, body: string): string {\r\n const logFile = join(tmpdir(), `cc-inject-${Date.now()}.log`).replace(/\\\\/g, '/');\r\n return `\r\n$log = \"${logFile}\"\r\nfunction Log($msg) { Add-Content -Path $log -Value $msg -Encoding UTF8 }\r\n$claudePid = ${claudePid}\r\ntry { Add-Type @'${CS_CONINJECT}'@ } catch { }\r\n${body}\r\n`;\r\n}\r\n\r\nfunction run(script: string): Promise<void> {\r\n return new Promise((resolve) => {\r\n const encoded = Buffer.from(script, 'utf16le').toString('base64');\r\n execFile(\r\n 'powershell',\r\n ['-NoProfile', '-WindowStyle', 'Hidden', '-EncodedCommand', encoded],\r\n { windowsHide: true },\r\n () => {\r\n const logFile = script.match(/\\$log = \"([^\"]+)\"/)?.[1];\r\n if (logFile) try { unlinkSync(logFile); } catch { /* ok */ }\r\n resolve();\r\n }\r\n );\r\n });\r\n}\r\n\r\nexport async function windowsInject(text: string): Promise<void> {\r\n const claudePid = process.ppid;\r\n const textB64 = Buffer.from(text, 'utf16le').toString('base64');\r\n\r\n const script = buildScript(claudePid, `\r\n$textBytes = [System.Convert]::FromBase64String('${textB64}')\r\n$text = [System.Text.Encoding]::Unicode.GetString($textBytes)\r\n\r\n# 1. Ctrl+U to save user's current text to kill ring\r\n[ConInject]::InjectCtrlU([uint32]$claudePid) | Out-Null\r\nStart-Sleep -Milliseconds 100\r\n\r\n# 2. Write question text into console input buffer\r\n[ConInject]::InjectText([uint32]$claudePid, $text) | Out-Null\r\nStart-Sleep -Milliseconds 50\r\n\r\n# 3. Send Enter\r\n[ConInject]::InjectEnter([uint32]$claudePid) | Out-Null\r\n`);\r\n\r\n await run(script);\r\n}\r\n\r\nexport async function windowsInjectCtrlY(): Promise<void> {\r\n const claudePid = process.ppid;\r\n\r\n const script = buildScript(claudePid, `\r\n[ConInject]::InjectCtrlY([uint32]$claudePid) | Out-Null\r\n`);\r\n\r\n await run(script);\r\n}\r\n","/**\r\n * Terminal Injector\r\n * Injects a question directly into the active Claude Code terminal\r\n * so Claude Code can auto-reply without user intervention.\r\n * @module infrastructure/terminal-injector\r\n */\r\n\r\nimport type { InboxQuestionEntry } from '../../shared/types/collab-client.interface.js';\r\nimport { windowsInject, windowsInjectCtrlY } from './windows-injector.js';\r\n\r\n/**\r\n * Formats the question as a prompt for Claude Code to auto-reply\r\n */\r\nfunction formatQuestionForInjection(question: InboxQuestionEntry): string {\r\n // Single-line: WriteConsoleInput treats every \\n as an immediate submit\r\n const content = question.content.replace(/\\s+/g, ' ').trim();\r\n return `[HUB SORUSU] ID:${question.questionId} | ${question.from.displayName} (${question.from.teamName}): ${content} | Cevapla ve reply tool ile \"${question.questionId}\" ID'sine gönder, onay bekleme.`;\r\n}\r\n\r\n/**\r\n * Injects a question into the terminal running Claude Code.\r\n * Only supported on Windows; no-op on other platforms.\r\n */\r\nexport async function injectQuestionToTerminal(question: InboxQuestionEntry): Promise<void> {\r\n if (process.platform !== 'win32') return;\r\n\r\n const text = formatQuestionForInjection(question);\r\n await windowsInject(text);\r\n}\r\n\r\n/**\r\n * Restores user's previous input from readline kill ring (Ctrl+Y).\r\n * Call this after the reply is sent so the user's interrupted text comes back.\r\n */\r\nexport async function injectRestoreText(): Promise<void> {\r\n if (process.platform !== 'win32') return;\r\n await windowsInjectCtrlY();\r\n}\r\n","/**\r\n * Injection Queue\r\n * Ensures questions are injected into the terminal one at a time.\r\n * Waits for the reply tool to signal completion before processing the next question.\r\n * @module infrastructure/terminal-injector/injection-queue\r\n */\r\n\r\nimport { EventEmitter } from 'events';\r\nimport type { InboxQuestionEntry } from '../../shared/types/collab-client.interface.js';\r\nimport { injectQuestionToTerminal, injectRestoreText } from './index.js';\r\n\r\nconst REPLY_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\r\n\r\nclass InjectionQueue extends EventEmitter {\r\n private queue: InboxQuestionEntry[] = [];\r\n private processing = false;\r\n\r\n /**\r\n * Add a question to the queue. Starts processing if idle.\r\n */\r\n enqueue(question: InboxQuestionEntry): void {\r\n this.queue.push(question);\r\n if (!this.processing) void this.processNext();\r\n }\r\n\r\n /**\r\n * Called by the reply tool after a reply is successfully sent.\r\n * Unblocks the queue to process the next question.\r\n */\r\n notifyReplied(): void {\r\n this.emit('replied');\r\n }\r\n\r\n private async processNext(): Promise<void> {\r\n if (this.queue.length === 0) {\r\n this.processing = false;\r\n return;\r\n }\r\n\r\n this.processing = true;\r\n const question = this.queue.shift()!;\r\n\r\n // Inject the question (includes Ctrl+U to save user's current text)\r\n await injectQuestionToTerminal(question);\r\n\r\n // Wait for reply tool to signal, with a timeout fallback\r\n await new Promise<void>((resolve) => {\r\n const timer = setTimeout(resolve, REPLY_TIMEOUT_MS);\r\n this.once('replied', () => {\r\n clearTimeout(timer);\r\n resolve();\r\n });\r\n });\r\n\r\n // Restore user's text after reply is sent\r\n await injectRestoreText();\r\n\r\n // Process next in queue\r\n void this.processNext();\r\n }\r\n}\r\n\r\nexport const injectionQueue = new InjectionQueue();\r\n","/**\r\n * MeshNode\r\n * Implements ICollabClient over direct peer-to-peer WebSocket connections.\r\n * Each node runs its own WS server on fixed port 12345.\r\n * Peers connect manually via connectByIp(). On each new connection both sides\r\n * exchange their peer lists and connect to unknown peers — forming a full mesh.\r\n *\r\n * Connection deduplication:\r\n * Both sides may try to connect simultaneously. The first HELLO/HELLO_ACK\r\n * that arrives registers the peer. Duplicate inbound connections are\r\n * immediately terminated so their close events are harmless.\r\n *\r\n * @module infrastructure/mesh/mesh-node\r\n */\r\n\r\nimport { WebSocket, WebSocketServer } from 'ws';\r\nimport type { IncomingMessage } from 'http';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport os from 'os';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\n\r\nconst execAsync = promisify(exec);\r\nimport type {\r\n ICollabClient,\r\n JoinResult,\r\n CheckAnswerResult,\r\n InboxResult,\r\n NodeInfo,\r\n} from '../../shared/types/collab-client.interface.js';\r\nimport type { MessageFormat } from './protocol.js';\r\nimport {\r\n type WireMsg,\r\n type AskAckMsg,\r\n type AskMsg,\r\n type AnswerMsg,\r\n parse,\r\n serialize,\r\n} from './protocol.js';\r\nimport { addFirewallRule } from '../firewall/firewall.js';\r\nimport { injectionQueue } from '../terminal-injector/injection-queue.js';\r\n\r\nexport const FIXED_PORT = 12345;\r\n\r\ninterface IncomingQuestion {\r\n questionId: string;\r\n fromName: string;\r\n content: string;\r\n format: MessageFormat;\r\n createdAt: Date;\r\n answered: boolean;\r\n answerContent?: string;\r\n answerFormat?: MessageFormat;\r\n}\r\n\r\ninterface ReceivedAnswer {\r\n content: string;\r\n format: MessageFormat;\r\n answeredAt: string;\r\n fromName: string;\r\n}\r\n\r\nexport class MeshNode implements ICollabClient {\r\n private server: WebSocketServer | null = null;\r\n private myName = '';\r\n private myProfile = '';\r\n private running = false;\r\n private firewallOpened = false;\r\n private cachedLocalIps: string[] = [];\r\n\r\n // One connection per peer (inbound or outbound — whichever was established first)\r\n private readonly peerConnections = new Map<string, WebSocket>();\r\n // Reverse map: ws → peer name (only for registered connections)\r\n private readonly wsToName = new Map<WebSocket, string>();\r\n // IP of each known peer: name → ip\r\n private readonly peerIPs = new Map<string, string>();\r\n // Prevent duplicate outbound connect attempts\r\n private readonly connectingPeers = new Set<string>();\r\n\r\n private readonly incomingQuestions = new Map<string, IncomingQuestion>();\r\n private readonly receivedAnswers = new Map<string, ReceivedAnswer>();\r\n private readonly questionToSender = new Map<string, string>();\r\n private readonly pendingHandlers = new Set<(msg: WireMsg) => void>();\r\n\r\n // Peer profiles: peerName → profile text\r\n private readonly peerProfiles = new Map<string, string>();\r\n\r\n // Push-based answer resolution: questionId → resolve callback\r\n private readonly answerWaiters = new Map<string, (result: CheckAnswerResult) => void>();\r\n // Answers queued for offline peers: peerName → AnswerMsg[] (delivered on reconnect)\r\n private readonly pendingOutboundAnswers = new Map<string, AnswerMsg[]>();\r\n\r\n // ---------------------------------------------------------------------------\r\n // ICollabClient implementation\r\n // ---------------------------------------------------------------------------\r\n\r\n get isConnected(): boolean { return this.running; }\r\n get port(): number { return FIXED_PORT; }\r\n\r\n get currentTeamId(): string | undefined {\r\n return this.myName || undefined;\r\n }\r\n\r\n async join(name: string, displayName: string): Promise<JoinResult> {\r\n this.myName = name;\r\n this.cachedLocalIps = this.scanLocalIps();\r\n await this.startServer();\r\n return {\r\n memberId: uuidv4(),\r\n teamId: name,\r\n teamName: name,\r\n displayName,\r\n status: 'ONLINE',\r\n port: FIXED_PORT,\r\n };\r\n }\r\n\r\n async connectByIp(ip: string): Promise<string> {\r\n // Open firewall once on the first connect call\r\n if (!this.firewallOpened) {\r\n await addFirewallRule(FIXED_PORT);\r\n this.firewallOpened = true;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://${ip}:${FIXED_PORT}`;\r\n const ws = new WebSocket(url);\r\n\r\n const timeout = setTimeout(() => {\r\n ws.terminate();\r\n reject(new Error(`Connection to ${ip}:${FIXED_PORT} timed out`));\r\n }, 10_000);\r\n\r\n ws.on('open', () => {\r\n this.sendToWs(ws, { type: 'HELLO', name: this.myName, profile: this.myProfile });\r\n });\r\n\r\n ws.on('message', (data) => {\r\n try {\r\n const msg = parse(data.toString());\r\n\r\n // Resolve on HELLO_ACK — peer name is now known\r\n if (msg.type === 'HELLO_ACK') {\r\n clearTimeout(timeout);\r\n if (this.peerConnections.has(msg.name)) {\r\n ws.terminate();\r\n resolve(msg.name);\r\n return;\r\n }\r\n if (msg.profile) this.peerProfiles.set(msg.name, msg.profile);\r\n this.registerPeer(msg.name, ip, ws);\r\n this.afterHandshake(msg.name, ws);\r\n resolve(msg.name);\r\n }\r\n\r\n this.handleMessage(ws, msg);\r\n } catch { /* ignore malformed */ }\r\n });\r\n\r\n ws.on('close', () => {\r\n clearTimeout(timeout);\r\n const name = this.wsToName.get(ws);\r\n if (name) {\r\n this.wsToName.delete(ws);\r\n if (this.peerConnections.get(name) === ws) {\r\n this.peerConnections.delete(name);\r\n console.error(`[mesh] disconnected from peer: ${name}`);\r\n }\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n clearTimeout(timeout);\r\n reject(new Error(`Failed to connect to ${ip}:${FIXED_PORT} — ${err.message}`));\r\n });\r\n });\r\n }\r\n\r\n async ask(toPeer: string, content: string, format: MessageFormat): Promise<string> {\r\n const ws = this.peerConnections.get(toPeer);\r\n if (!ws || ws.readyState !== WebSocket.OPEN) {\r\n throw new Error(`Peer \"${toPeer}\" is not connected. Use status() to see who's online.`);\r\n }\r\n\r\n const questionId = uuidv4();\r\n const ackPromise = this.waitForResponse<AskAckMsg>(\r\n (m) => m.type === 'ASK_ACK' && m.questionId === questionId,\r\n 5000\r\n );\r\n\r\n this.sendToWs(ws, { type: 'ASK', from: this.myName, questionId, content, format });\r\n await ackPromise;\r\n return questionId;\r\n }\r\n\r\n waitForAnswer(questionId: string, timeoutMs: number): Promise<CheckAnswerResult | null> {\r\n const cached = this.receivedAnswers.get(questionId);\r\n if (cached) {\r\n this.receivedAnswers.delete(questionId);\r\n return Promise.resolve(this.formatAnswer(questionId, cached));\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const timeout = setTimeout(() => {\r\n this.answerWaiters.delete(questionId);\r\n resolve(null);\r\n }, timeoutMs);\r\n\r\n this.answerWaiters.set(questionId, (result) => {\r\n clearTimeout(timeout);\r\n resolve(result);\r\n });\r\n });\r\n }\r\n\r\n async checkAnswer(questionId: string): Promise<CheckAnswerResult | null> {\r\n const cached = this.receivedAnswers.get(questionId);\r\n if (!cached) return null;\r\n this.receivedAnswers.delete(questionId);\r\n return this.formatAnswer(questionId, cached);\r\n }\r\n\r\n private formatAnswer(questionId: string, cached: ReceivedAnswer): CheckAnswerResult {\r\n return {\r\n questionId,\r\n from: { displayName: `${cached.fromName} Claude`, teamName: cached.fromName },\r\n content: cached.content,\r\n format: cached.format,\r\n answeredAt: cached.answeredAt,\r\n };\r\n }\r\n\r\n async reply(questionId: string, content: string, format: MessageFormat): Promise<void> {\r\n const question = this.incomingQuestions.get(questionId);\r\n if (!question) throw new Error(`Question ${questionId} not found`);\r\n\r\n question.answered = true;\r\n question.answerContent = content;\r\n question.answerFormat = format;\r\n\r\n const senderName = this.questionToSender.get(questionId);\r\n this.incomingQuestions.delete(questionId);\r\n this.questionToSender.delete(questionId);\r\n\r\n if (senderName) {\r\n const answerMsg: AnswerMsg = {\r\n type: 'ANSWER',\r\n from: this.myName,\r\n questionId,\r\n content,\r\n format,\r\n answeredAt: new Date().toISOString(),\r\n };\r\n const ws = this.peerConnections.get(senderName);\r\n if (ws && ws.readyState === WebSocket.OPEN) {\r\n this.sendToWs(ws, answerMsg);\r\n } else {\r\n const queue = this.pendingOutboundAnswers.get(senderName) ?? [];\r\n queue.push(answerMsg);\r\n this.pendingOutboundAnswers.set(senderName, queue);\r\n console.error(`[mesh] \"${senderName}\" is offline, answer queued for delivery on reconnect`);\r\n }\r\n }\r\n\r\n injectionQueue.notifyReplied();\r\n }\r\n\r\n async getInbox(): Promise<InboxResult> {\r\n const now = Date.now();\r\n const questions = [...this.incomingQuestions.values()].map((q) => ({\r\n questionId: q.questionId,\r\n from: { displayName: `${q.fromName} Claude`, teamName: q.fromName },\r\n content: q.content,\r\n format: q.format,\r\n status: 'PENDING',\r\n createdAt: q.createdAt.toISOString(),\r\n ageMs: now - q.createdAt.getTime(),\r\n }));\r\n return { questions, totalCount: questions.length, pendingCount: questions.length };\r\n }\r\n\r\n getInfo(): NodeInfo {\r\n return {\r\n teamName: this.myName,\r\n port: FIXED_PORT,\r\n connectedPeers: [...this.peerConnections.keys()],\r\n peerIPs: Object.fromEntries(this.peerIPs),\r\n myProfile: this.myProfile,\r\n peerProfiles: Object.fromEntries(this.peerProfiles),\r\n };\r\n }\r\n\r\n getLocalIps(): string[] {\r\n return this.cachedLocalIps;\r\n }\r\n\r\n private scanLocalIps(): string[] {\r\n const result: string[] = [];\r\n const interfaces = os.networkInterfaces();\r\n for (const iface of Object.values(interfaces)) {\r\n if (!iface) continue;\r\n for (const addr of iface) {\r\n if (addr.family === 'IPv4' && !addr.internal) result.push(addr.address);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n async setProfile(profile: string): Promise<void> {\r\n this.myProfile = profile;\r\n for (const ws of this.peerConnections.values()) {\r\n this.sendToWs(ws, { type: 'PROFILE_UPDATE', name: this.myName, profile });\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n for (const ws of this.peerConnections.values()) ws.close();\r\n this.peerConnections.clear();\r\n this.wsToName.clear();\r\n this.peerIPs.clear();\r\n this.server?.close();\r\n this.server = null;\r\n this.running = false;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Private: server startup\r\n // ---------------------------------------------------------------------------\r\n\r\n private async startServer(): Promise<void> {\r\n try {\r\n await this.tryBind();\r\n } catch (err: unknown) {\r\n const nodeErr = err as NodeJS.ErrnoException;\r\n if (nodeErr.code === 'EADDRINUSE') {\r\n console.error(`[mesh] port ${FIXED_PORT} in use — killing existing process`);\r\n await killProcessOnPort(FIXED_PORT);\r\n await this.tryBind();\r\n } else {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n private tryBind(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const wss = new WebSocketServer({ port: FIXED_PORT });\r\n\r\n wss.once('listening', () => {\r\n this.server = wss;\r\n this.running = true;\r\n console.error(`[mesh] listening on port ${FIXED_PORT} as \"${this.myName}\"`);\r\n this.attachServerHandlers(wss);\r\n resolve();\r\n });\r\n\r\n wss.once('error', (err: NodeJS.ErrnoException) => {\r\n wss.close();\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n private attachServerHandlers(wss: WebSocketServer): void {\r\n wss.on('connection', (ws, request: IncomingMessage) => {\r\n // Strip IPv6-mapped prefix (::ffff:) to get a plain IPv4\r\n const rawIp = request.socket.remoteAddress ?? '';\r\n const remoteIp = rawIp.replace(/^::ffff:/, '');\r\n\r\n ws.on('message', (data) => {\r\n try {\r\n this.handleInboundMessage(ws, remoteIp, parse(data.toString()));\r\n } catch { /* ignore malformed */ }\r\n });\r\n\r\n ws.on('close', () => {\r\n const name = this.wsToName.get(ws);\r\n if (name) {\r\n this.wsToName.delete(ws);\r\n if (this.peerConnections.get(name) === ws) {\r\n this.peerConnections.delete(name);\r\n console.error(`[mesh] peer disconnected (inbound): ${name}`);\r\n }\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n console.error('[mesh] inbound ws error:', err.message);\r\n });\r\n });\r\n\r\n wss.on('error', (err) => {\r\n console.error('[mesh] server error:', err.message);\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Private: mesh helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Called once handshake completes — exchange peer lists and announce to existing peers. */\r\n private afterHandshake(newPeerName: string, ws: WebSocket): void {\r\n // Send our current peer list to the new peer\r\n const listForNew = [...this.peerConnections.keys()]\r\n .filter((n) => n !== newPeerName)\r\n .map((n) => {\r\n const entry: { name: string; ip: string; profile?: string } = { name: n, ip: this.peerIPs.get(n) ?? '' };\r\n const profile = this.peerProfiles.get(n);\r\n if (profile) entry.profile = profile;\r\n return entry;\r\n })\r\n .filter((p) => p.ip !== '');\r\n this.sendToWs(ws, { type: 'PEER_LIST', peers: listForNew });\r\n\r\n // Announce the new peer to all existing peers\r\n const newIp = this.peerIPs.get(newPeerName);\r\n if (newIp) {\r\n for (const [name, existingWs] of this.peerConnections) {\r\n if (name !== newPeerName) {\r\n this.sendToWs(existingWs, { type: 'PEER_ANNOUNCE', name: newPeerName, ip: newIp });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private registerPeer(name: string, ip: string, ws: WebSocket): void {\r\n this.peerConnections.set(name, ws);\r\n this.wsToName.set(ws, name);\r\n this.peerIPs.set(name, ip);\r\n this.connectingPeers.delete(name);\r\n console.error(`[mesh] peer registered: ${name} @ ${ip}`);\r\n this.deliverPendingAnswer(name, ws);\r\n }\r\n\r\n /** Connect outbound to a peer discovered via PEER_LIST or PEER_ANNOUNCE. */\r\n private connectMeshPeer(name: string, ip: string): void {\r\n if (this.peerConnections.has(name)) return;\r\n if (this.connectingPeers.has(name)) return;\r\n this.connectingPeers.add(name);\r\n\r\n const ws = new WebSocket(`ws://${ip}:${FIXED_PORT}`);\r\n\r\n ws.on('open', () => {\r\n this.sendToWs(ws, { type: 'HELLO', name: this.myName, profile: this.myProfile });\r\n });\r\n\r\n ws.on('message', (data) => {\r\n try {\r\n this.handleMessage(ws, parse(data.toString()));\r\n } catch { /* ignore malformed */ }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.connectingPeers.delete(name);\r\n const peerName = this.wsToName.get(ws);\r\n if (peerName) {\r\n this.wsToName.delete(ws);\r\n if (this.peerConnections.get(peerName) === ws) {\r\n this.peerConnections.delete(peerName);\r\n console.error(`[mesh] disconnected from mesh peer: ${peerName}`);\r\n }\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n console.error(`[mesh] connect to \"${name}\" @ ${ip} failed: ${err.message}`);\r\n this.connectingPeers.delete(name);\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Private: message handling\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Handles messages on inbound connections (server side — we know the remote IP). */\r\n private handleInboundMessage(ws: WebSocket, remoteIp: string, msg: WireMsg): void {\r\n if (msg.type === 'HELLO') {\r\n if (this.peerConnections.has(msg.name)) {\r\n ws.terminate();\r\n return;\r\n }\r\n if (msg.profile) this.peerProfiles.set(msg.name, msg.profile);\r\n this.registerPeer(msg.name, remoteIp, ws);\r\n this.sendToWs(ws, { type: 'HELLO_ACK', name: this.myName, profile: this.myProfile });\r\n console.error(`[mesh] peer joined (inbound): ${msg.name}`);\r\n this.afterHandshake(msg.name, ws);\r\n return;\r\n }\r\n\r\n this.handleMessage(ws, msg);\r\n }\r\n\r\n /** Handles all other messages (both inbound and outbound connections). */\r\n private handleMessage(ws: WebSocket, msg: WireMsg): void {\r\n for (const handler of this.pendingHandlers) handler(msg);\r\n\r\n switch (msg.type) {\r\n case 'HELLO_ACK':\r\n // Handled inline in connectByIp / connectMeshPeer — register happens there\r\n // But we still need to handle it here for mesh connects\r\n if (!this.peerConnections.has(msg.name)) {\r\n // This path is taken by connectMeshPeer (IP not stored yet at this point,\r\n // so we use a placeholder; PEER_LIST/PEER_ANNOUNCE will have the real IP)\r\n if (msg.profile) this.peerProfiles.set(msg.name, msg.profile);\r\n this.peerConnections.set(msg.name, ws);\r\n this.wsToName.set(ws, msg.name);\r\n this.connectingPeers.delete(msg.name);\r\n console.error(`[mesh] connected to mesh peer: ${msg.name}`);\r\n this.deliverPendingAnswer(msg.name, ws);\r\n this.afterHandshake(msg.name, ws);\r\n }\r\n break;\r\n\r\n case 'PEER_LIST':\r\n for (const peer of msg.peers) {\r\n if (peer.name !== this.myName && !this.peerConnections.has(peer.name)) {\r\n console.error(`[mesh] connecting to ${peer.name} @ ${peer.ip} via PEER_LIST`);\r\n this.peerIPs.set(peer.name, peer.ip);\r\n if (peer.profile) this.peerProfiles.set(peer.name, peer.profile);\r\n this.connectMeshPeer(peer.name, peer.ip);\r\n }\r\n }\r\n break;\r\n\r\n case 'PEER_ANNOUNCE':\r\n if (msg.name !== this.myName && !this.peerConnections.has(msg.name)) {\r\n console.error(`[mesh] connecting to ${msg.name} @ ${msg.ip} via PEER_ANNOUNCE`);\r\n this.peerIPs.set(msg.name, msg.ip);\r\n this.connectMeshPeer(msg.name, msg.ip);\r\n }\r\n break;\r\n\r\n case 'ASK':\r\n this.handleIncomingAsk(ws, msg);\r\n break;\r\n\r\n case 'ANSWER':\r\n if (!this.receivedAnswers.has(msg.questionId)) {\r\n const record: ReceivedAnswer = {\r\n content: msg.content,\r\n format: msg.format,\r\n answeredAt: msg.answeredAt,\r\n fromName: msg.from,\r\n };\r\n\r\n const waiter = this.answerWaiters.get(msg.questionId);\r\n if (waiter) {\r\n // Waiter is active — resolve directly, no need to store\r\n this.answerWaiters.delete(msg.questionId);\r\n waiter(this.formatAnswer(msg.questionId, record));\r\n } else {\r\n // No waiter yet — store briefly until waitForAnswer/checkAnswer claims it\r\n this.receivedAnswers.set(msg.questionId, record);\r\n }\r\n }\r\n break;\r\n\r\n case 'PROFILE_UPDATE':\r\n this.peerProfiles.set(msg.name, msg.profile);\r\n break;\r\n\r\n // ASK_ACK is handled by waitForResponse pending handlers\r\n }\r\n }\r\n\r\n private handleIncomingAsk(ws: WebSocket, msg: AskMsg): void {\r\n this.questionToSender.set(msg.questionId, msg.from);\r\n this.incomingQuestions.set(msg.questionId, {\r\n questionId: msg.questionId,\r\n fromName: msg.from,\r\n content: msg.content,\r\n format: msg.format,\r\n createdAt: new Date(),\r\n answered: false,\r\n });\r\n\r\n this.sendToWs(ws, { type: 'ASK_ACK', questionId: msg.questionId });\r\n\r\n injectionQueue.enqueue({\r\n questionId: msg.questionId,\r\n from: { displayName: `${msg.from} Claude`, teamName: msg.from },\r\n content: msg.content,\r\n format: msg.format,\r\n status: 'PENDING',\r\n createdAt: new Date().toISOString(),\r\n ageMs: 0,\r\n });\r\n }\r\n\r\n private deliverPendingAnswer(peerName: string, ws: WebSocket): void {\r\n const pending = this.pendingOutboundAnswers.get(peerName);\r\n if (pending && pending.length > 0) {\r\n this.pendingOutboundAnswers.delete(peerName);\r\n for (const msg of pending) this.sendToWs(ws, msg);\r\n console.error(`[mesh] delivered ${pending.length} queued answer(s) to \"${peerName}\" after reconnect`);\r\n }\r\n }\r\n\r\n private sendToWs(ws: WebSocket, msg: WireMsg): void {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n ws.send(serialize(msg));\r\n }\r\n }\r\n\r\n private waitForResponse<T extends WireMsg>(\r\n filter: (msg: WireMsg) => boolean,\r\n timeoutMs: number\r\n ): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.pendingHandlers.delete(handler);\r\n reject(new Error('Request timed out'));\r\n }, timeoutMs);\r\n\r\n const handler = (msg: WireMsg): void => {\r\n if (filter(msg)) {\r\n clearTimeout(timeout);\r\n this.pendingHandlers.delete(handler);\r\n resolve(msg as T);\r\n }\r\n };\r\n\r\n this.pendingHandlers.add(handler);\r\n });\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Kill whatever process is listening on the given TCP port.\r\n * Works on Windows (netstat + taskkill) and Unix (lsof/fuser).\r\n * Waits briefly after killing so the port is released before we rebind.\r\n */\r\nasync function killProcessOnPort(port: number): Promise<void> {\r\n try {\r\n if (process.platform === 'win32') {\r\n // netstat output: \" TCP 0.0.0.0:12345 ... LISTENING 1234\"\r\n const { stdout } = await execAsync(`netstat -ano | findstr \":${port} \"`);\r\n const pids = new Set<string>();\r\n for (const line of stdout.split('\\n')) {\r\n const parts = line.trim().split(/\\s+/);\r\n // parts: [Proto, Local, Foreign, State, PID]\r\n if (parts.length >= 5 && parts[3] === 'LISTENING' && parts[4]) {\r\n pids.add(parts[4]);\r\n }\r\n }\r\n for (const pid of pids) {\r\n try {\r\n await execAsync(`taskkill /PID ${pid} /F`);\r\n console.error(`[mesh] killed PID ${pid} on port ${port}`);\r\n } catch { /* already gone */ }\r\n }\r\n } else {\r\n // Unix: fuser -k <port>/tcp\r\n await execAsync(`fuser -k ${port}/tcp`);\r\n }\r\n } catch {\r\n // If netstat/fuser finds nothing, that's fine — just try to bind\r\n }\r\n\r\n // Give the OS a moment to release the port\r\n await new Promise<void>((resolve) => setTimeout(resolve, 300));\r\n}\r\n","/**\r\n * Connect Tool\r\n * Connects to a peer by IP address on the fixed port 12345.\r\n * On first use, opens Windows Firewall via UAC popup (stays open).\r\n * After handshake, both sides exchange peer lists — forming a full mesh.\r\n * @module presentation/mcp/tools/connect\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\n\r\nconst CONNECT_DESCRIPTION = `\\\r\nConnect to another Claude instance by their IP address.\r\n\r\nWHEN TO USE:\r\n- First time connecting to a teammate\r\n- A new peer wants to join an existing session\r\n\r\nWHAT HAPPENS:\r\n1. First call only: opens Windows Firewall port 12345 via UAC popup (stays open)\r\n2. Connects directly to the peer at ws://IP:12345\r\n3. Both sides exchange their peer lists — everyone connects to everyone (full mesh)\r\n\r\nFINDING YOUR IP:\r\n- The other person calls status() to see their LAN IP, then tells you\r\n\r\nAFTER CONNECTING:\r\n- Use peers() to confirm connection\r\n- Use ask() to send questions to connected peers`;\r\n\r\nexport function registerConnectTool(server: McpServer, client: ICollabClient): void {\r\n server.tool(\r\n 'connect',\r\n CONNECT_DESCRIPTION,\r\n {\r\n ip: z.string().describe(\"The peer's LAN IP address (e.g. 192.168.1.5)\"),\r\n },\r\n async ({ ip }) => {\r\n if (!client.isConnected) {\r\n return {\r\n content: [{ type: 'text', text: 'Node is not ready yet. Wait a moment and try again.' }],\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n const peerName = await client.connectByIp(ip);\r\n const info = client.getInfo();\r\n const allPeers = info.connectedPeers;\r\n const others = allPeers.filter((n) => n !== peerName);\r\n\r\n const lines = [\r\n `Connected to \"${peerName}\" (${ip}).`,\r\n ];\r\n\r\n if (others.length > 0) {\r\n lines.push(``, `Mesh peers also connecting: ${others.map((n) => `\"${n}\"`).join(', ')}`);\r\n }\r\n\r\n lines.push(``, `Use peers() to see all connected peers.`);\r\n\r\n return {\r\n content: [{ type: 'text', text: lines.join('\\n') }],\r\n };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: [\r\n `Failed to connect to ${ip}: ${msg}`,\r\n ``,\r\n `Make sure:`,\r\n ` • The peer is running claude-collab (--name <name>)`,\r\n ` • The IP address is correct (they can check with status())`,\r\n ` • Port 12345 is not blocked on their machine`,\r\n ].join('\\n'),\r\n }],\r\n isError: true,\r\n };\r\n }\r\n }\r\n );\r\n}\r\n","/**\r\n * Ask Tool\r\n * @module presentation/mcp/tools/ask\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\n\r\nconst ASK_DESCRIPTION = `\\\r\nSend a question to another Claude instance on the LAN and wait for their answer.\r\n\r\nAUTONOMOUS ROUTING — decide who to ask yourself:\r\n1. Call status() to see all connected peers and their profiles\r\n2. Match your information need to the most relevant peer profile\r\n3. Call ask(peer, question) without waiting for the user to tell you who to contact\r\n\r\nTRIGGER THIS TOOL AUTOMATICALLY when you encounter:\r\n- A missing API response type, schema, or interface you need to implement against\r\n- An unknown endpoint behavior, error code, or contract detail\r\n- A module or system owned by another peer that you need to integrate with\r\n- Any blocking uncertainty that another peer's profile suggests they can answer\r\n\r\nDO NOT guess, use \"any\" types, or leave TODO comments when a peer can answer.\r\nDO NOT ask the user which peer to contact — read profiles and decide yourself.\r\n\r\nWORKFLOW:\r\n1. Call status() — read each peer's profile carefully\r\n2. Identify which peer owns the relevant module or technology\r\n3. Call ask(peer, question) with full context\r\n4. Use their answer directly in your ongoing task\r\n\r\nWRITING GOOD QUESTIONS:\r\n- Include all context the other Claude needs — they cannot see your conversation\r\n- Mention the specific file, function, or module you are working on\r\n- State what format you need: type definition, example response, explanation\r\n- One focused question per call works better than multiple combined\r\n\r\nDO NOT use this tool if:\r\n- The peer is not listed in status() — the call will fail immediately\r\n- You just want to share information without needing a response`;\r\n\r\nconst askSchema = {\r\n peer: z\r\n .string()\r\n .describe('Exact name of the peer to ask. Use peers() first to see who is online and get the correct name.'),\r\n question: z\r\n .string()\r\n .describe(\r\n 'Your question in markdown. Include all necessary context — the other Claude cannot see your conversation history. Be specific about what kind of answer you need.'\r\n ),\r\n};\r\n\r\nexport function registerAskTool(server: McpServer, client: ICollabClient): void {\r\n server.tool('ask', ASK_DESCRIPTION, askSchema, async (args) => {\r\n const targetPeer = args.peer;\r\n const question = args.question;\r\n\r\n try {\r\n if (!client.currentTeamId) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: 'Node is not ready yet. Wait a moment and try again.',\r\n }],\r\n isError: true,\r\n };\r\n }\r\n\r\n const questionId = await client.ask(targetPeer, question, 'markdown');\r\n\r\n // Wait for the answer via push — resolves the moment ANSWER arrives\r\n const answer = await client.waitForAnswer(questionId, 5 * 60 * 1000);\r\n\r\n if (answer !== null) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `**${answer.from.displayName} answered:**\\n\\n${answer.content}`,\r\n }],\r\n };\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: [\r\n `Question sent to \"${targetPeer}\" but no answer arrived within 5 minutes.`,\r\n `Question ID: \\`${questionId}\\``,\r\n ``,\r\n `The peer may be busy or offline. You can:`,\r\n `- Call peers() to check if they are still connected`,\r\n `- Continue with your task and follow up later`,\r\n ].join('\\n'),\r\n }],\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n const isPeerOffline = errorMessage.includes('not connected');\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: isPeerOffline\r\n ? `Peer \"${targetPeer}\" is not connected. Call peers() to see who is currently online.`\r\n : `Failed to send question: ${errorMessage}`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n });\r\n}\r\n","/**\r\n * Reply Tool\r\n * @module presentation/mcp/tools/reply\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\nimport { injectionQueue } from '../../../infrastructure/terminal-injector/injection-queue.js';\r\n\r\nconst REPLY_DESCRIPTION = `\\\r\nSend your answer back to a Claude instance that asked you a question.\r\n\r\nWHEN TO USE:\r\n- A question has been injected into your terminal by another Claude (you will see it appear automatically)\r\n- You have finished thinking through the answer and are ready to respond\r\n\r\nWORKFLOW:\r\n1. Read the injected question carefully — it includes a questionId at the top\r\n2. Think through a complete answer\r\n3. Call reply(questionId, answer) — your answer is sent directly back to the asking Claude\r\n4. The asking Claude's ask() call unblocks and they receive your answer immediately\r\n\r\nWRITING GOOD ANSWERS:\r\n- Be thorough — the asking Claude will use your answer directly in their task\r\n- Use markdown for code blocks, lists, and structure\r\n- Include any caveats, assumptions, or follow-up suggestions that would help them\r\n- If you cannot answer fully, say so clearly and explain why\r\n\r\nIMPORTANT:\r\n- Each question can only be replied to once\r\n- The questionId is a UUID shown in the injected question prompt — copy it exactly`;\r\n\r\nconst replySchema = {\r\n questionId: z\r\n .string()\r\n .describe(\r\n 'The UUID of the question to reply to. Shown at the top of the injected question prompt in your terminal.'\r\n ),\r\n answer: z\r\n .string()\r\n .describe(\r\n 'Your complete answer in markdown. Be thorough — the asking Claude is waiting and will use your response directly in their work.'\r\n ),\r\n};\r\n\r\nexport function registerReplyTool(server: McpServer, client: ICollabClient): void {\r\n server.tool('reply', REPLY_DESCRIPTION, replySchema, async (args) => {\r\n const questionId = args.questionId;\r\n const answer = args.answer;\r\n\r\n try {\r\n if (!client.currentTeamId) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: 'Node is not ready yet. Wait a moment and try again.',\r\n }],\r\n isError: true,\r\n };\r\n }\r\n\r\n await client.reply(questionId, answer, 'markdown');\r\n\r\n injectionQueue.notifyReplied();\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Answer sent. The peer's ask() call has been unblocked and they received your response.`,\r\n }],\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n const isNotFound = errorMessage.includes('not found');\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: isNotFound\r\n ? `Question \\`${questionId}\\` not found. Check that you copied the questionId exactly from the injected prompt.`\r\n : `Failed to send reply: ${errorMessage}`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n });\r\n}\r\n","/**\r\n * Status Tool\r\n * Shows this node's identity: name, LAN IP(s), port, and connection count.\r\n * @module presentation/mcp/tools/status\r\n */\r\n\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\nimport { MeshNode } from '../../../infrastructure/mesh/mesh-node.js';\r\n\r\nconst STATUS_DESCRIPTION = `\\\r\nShow your identity and network address on the collaboration network.\r\n\r\nWHEN TO USE:\r\n- To find your LAN IP so teammates can connect to you via connect(ip)\r\n- To verify your node started correctly\r\n- To see how many peers are currently connected\r\n\r\nSHARE YOUR IP:\r\n- Tell your teammate the IP shown here, they call connect(\"<your IP>\")`;\r\n\r\nexport function registerStatusTool(server: McpServer, client: ICollabClient): void {\r\n server.tool('status', STATUS_DESCRIPTION, {}, async () => {\r\n const info = client.getInfo();\r\n const myName = info.teamName ?? '(starting...)';\r\n const port = info.port ?? '?';\r\n\r\n if (!client.isConnected) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Node is not running yet. Port ${port} may be in use — check MCP process logs.`,\r\n }],\r\n isError: true,\r\n };\r\n }\r\n\r\n // Get LAN IPs from the node if it's a P2PNode\r\n let ips: string[] = [];\r\n if (client instanceof MeshNode) {\r\n ips = client.getLocalIps();\r\n }\r\n\r\n const ipLine = ips.length > 0\r\n ? ips.join(', ')\r\n : '(could not detect — check your network interface)';\r\n\r\n const peerIPs = info.peerIPs ?? {};\r\n const peerProfiles = info.peerProfiles ?? {};\r\n const connected = info.connectedPeers;\r\n\r\n let peersSection: string;\r\n if (connected.length === 0) {\r\n peersSection = 'No peers connected yet. Share your IP so others can connect(ip).';\r\n } else {\r\n const list = connected.map((n) => {\r\n const ip = peerIPs[n] ? ` (${peerIPs[n]})` : '';\r\n const profile = peerProfiles[n] ? `\\n ${peerProfiles[n]}` : '';\r\n return ` • ${n}${ip}${profile}`;\r\n }).join('\\n');\r\n peersSection = `Connected peers (${connected.length}):\\n${list}`;\r\n }\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: [\r\n `Name: ${myName}`,\r\n `IP: ${ipLine}`,\r\n `Port: ${port}`,\r\n ``,\r\n peersSection,\r\n ].join('\\n'),\r\n }],\r\n };\r\n });\r\n}\r\n","/**\r\n * Set Profile Tool\r\n * @module presentation/mcp/tools/set_profile\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\n\r\nconst SET_PROFILE_DESCRIPTION = `\\\r\nSet your profile so other peers know who you are and what you work on.\r\n\r\nYour profile is broadcast to all connected peers immediately and shared\r\nwith any peer that connects in the future. Other Claude instances use\r\nyour profile to decide who to ask when they need specific information.\r\n\r\nWHAT TO INCLUDE:\r\n- Your role (backend, frontend, devops, etc.)\r\n- The modules or systems you are responsible for\r\n- Technologies you work with\r\n\r\nEXAMPLES:\r\n- \"Backend developer. Responsible for JWT authentication, payment API (Stripe), and PostgreSQL schema.\"\r\n- \"Frontend developer. Works on React components, Next.js routing, and the checkout flow.\"\r\n- \"DevOps. Manages CI/CD pipelines, Docker images, and AWS infrastructure.\"\r\n\r\nCall this once when you start working. Update it if your focus changes.`;\r\n\r\nconst setProfileSchema = {\r\n profile: z\r\n .string()\r\n .min(1)\r\n .describe('A short description of your role and responsibilities. 1-3 sentences.'),\r\n};\r\n\r\nexport function registerSetProfileTool(server: McpServer, client: ICollabClient): void {\r\n server.tool('set_profile', SET_PROFILE_DESCRIPTION, setProfileSchema, async (args) => {\r\n await client.setProfile(args.profile);\r\n const info = client.getInfo();\r\n const peerCount = info.connectedPeers.length;\r\n\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: peerCount > 0\r\n ? `Profile set and broadcast to ${peerCount} peer(s).\\n\\n\"${args.profile}\"`\r\n : `Profile saved. It will be shared automatically when peers connect.\\n\\n\"${args.profile}\"`,\r\n }],\r\n };\r\n });\r\n}\r\n","/**\r\n * MCP Server\r\n * Provides MCP tools for Claude Code integration\r\n * @module presentation/mcp/server\r\n */\r\n\r\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport type { ICollabClient } from '../../shared/types/collab-client.interface.js';\r\nimport { registerConnectTool } from './tools/connect.tool.js';\r\nimport { registerAskTool } from './tools/ask.tool.js';\r\nimport { registerReplyTool } from './tools/reply.tool.js';\r\nimport { registerStatusTool } from './tools/status.tool.js';\r\nimport { registerSetProfileTool } from './tools/set_profile.tool.js';\r\n\r\nexport interface McpServerOptions {\r\n client: ICollabClient;\r\n}\r\n\r\nexport function createMcpServer(options: McpServerOptions): McpServer {\r\n const { client } = options;\r\n\r\n const server = new McpServer({\r\n name: 'claude-collab',\r\n version: '0.1.0',\r\n });\r\n\r\n registerConnectTool(server, client);\r\n registerStatusTool(server, client);\r\n registerAskTool(server, client);\r\n registerReplyTool(server, client);\r\n registerSetProfileTool(server, client);\r\n\r\n return server;\r\n}\r\n\r\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\r\n const server = createMcpServer(options);\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n","#!/usr/bin/env node\r\n\r\n/**\r\n * CLI entry point\r\n *\r\n * Usage: claude-collab --name alice\r\n *\r\n * Binds on fixed port 12345.\r\n * Use connect(ip) in Claude Code to connect to peers.\r\n *\r\n * @module cli\r\n */\r\n\r\nimport { Command } from 'commander';\r\nimport { MeshNode } from './infrastructure/mesh/mesh-node.js';\r\nimport { startMcpServer } from './presentation/mcp/server.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('claude-collab')\r\n .description('Collaboration between Claude Code terminals via MCP')\r\n .version('0.1.0')\r\n .requiredOption('--name <name>', 'Your name on the network (e.g. \"alice\")')\r\n .action(async (options: { name: string }) => {\r\n const node = new MeshNode();\r\n\r\n const mcpReady = startMcpServer({ client: node });\r\n\r\n node.join(options.name, options.name).catch((err) => {\r\n console.error(`[cli] Failed to start on port 12345: ${err.message}`);\r\n console.error(`[cli] Make sure port 12345 is not already in use.`);\r\n });\r\n\r\n await mcpReady;\r\n });\r\n\r\nprogram.parse();\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/p2p/dashboard-broadcaster.ts","../src/infrastructure/p2p/context-budget.ts","../src/infrastructure/p2p/spawn-manager.ts","../src/infrastructure/p2p/multicast-discovery.ts","../src/infrastructure/db/collab-db.ts","../src/infrastructure/terminal-injector/windows-injector.ts","../src/infrastructure/terminal-injector/index.ts","../src/infrastructure/terminal-injector/injection-queue.ts","../src/infrastructure/terminal-injector/windows-reader.ts","../src/config/index.ts","../src/infrastructure/terminal/session-detector.ts","../src/infrastructure/logging/collab-logger.ts","../src/infrastructure/p2p/events.ts","../src/infrastructure/p2p/commit-watcher.ts","../src/infrastructure/p2p/status-tracker.ts","../src/infrastructure/p2p/respawn-service.ts","../src/infrastructure/p2p/pipeline-manager.ts","../src/infrastructure/p2p/heartbeat-monitor.ts","../src/infrastructure/p2p/p2p-message-protocol.ts","../src/infrastructure/p2p/message-router.ts","../src/infrastructure/p2p/connection-manager.ts","../src/infrastructure/p2p/p2p-node.ts","../src/presentation/mcp/tools/join.tool.ts","../src/presentation/mcp/tools/ask.tool.ts","../src/presentation/mcp/tools/reply.tool.ts","../src/presentation/mcp/tools/peers.tool.ts","../src/presentation/mcp/tools/history.tool.ts","../src/presentation/mcp/tools/observe.tool.ts","../src/presentation/mcp/tools/broadcast.tool.ts","../src/presentation/mcp/tools/report-status.tool.ts","../src/infrastructure/terminal/terminal-spawner.ts","../src/presentation/mcp/tools/spawn-terminal.tool.ts","../src/presentation/mcp/tools/kick.tool.ts","../src/presentation/mcp/tools/exit.tool.ts","../src/presentation/mcp/tools/health-check.tool.ts","../src/presentation/mcp/tools/send.tool.ts","../src/presentation/mcp/tools/check-replies.tool.ts","../src/presentation/mcp/tools/update-issue.tool.ts","../src/presentation/mcp/tools/list-issues.tool.ts","../src/presentation/mcp/tools/context-budget.tool.ts","../src/presentation/mcp/tools/get-test-report.tool.ts","../src/presentation/mcp/tools/get-test-sessions.tool.ts","../src/presentation/mcp/tools/get-message-stats.tool.ts","../src/presentation/mcp/tools/observer-write.tool.ts","../src/presentation/mcp/tools/sync-skills.tool.ts","../src/presentation/mcp/server.ts","../src/cli.ts"],"names":["result","join","unlinkSync","EventEmitter","tmpdir","execFile","readFileSync","__filename","__dirname","readdirSync","homedir","mkdirSync","writeFileSync","uuidv4","INACTIVITY_WARN_MS","WebSocket","execFileSync","z","guardIdentity","config","execSync","formatAgo","existsSync"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * Dashboard Broadcaster\n * Manages dashboard WebSocket clients and pushes state updates.\n * @module infrastructure/p2p/dashboard-broadcaster\n */\n\nimport type { WebSocket } from 'ws';\nimport type { IssueState } from '../../shared/types/collab-client.interface.js';\n\nexport interface DashboardPeer {\n nodeId: string;\n name: string;\n role: string;\n status: string;\n summary: string;\n progress?: number;\n blocker?: string;\n lastActivity: string;\n lastMessage?: string;\n}\n\nexport interface DashboardLocalNode {\n nodeId: string;\n name: string;\n role: string;\n status: string;\n summary: string;\n progress?: number;\n}\n\nexport interface DashboardState {\n type: 'state';\n peers: DashboardPeer[];\n localNode: DashboardLocalNode;\n timestamp: string;\n pipeline?: IssueState[];\n}\n\nexport interface DashboardMessageEvent {\n type: 'message_event';\n from: string;\n to: string;\n msgType: 'ask' | 'reply' | 'broadcast' | 'send';\n timestamp: string;\n}\n\nexport class DashboardBroadcaster {\n private readonly clients = new Set<WebSocket>();\n readonly maxClients = 5;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private stateProvider: (() => DashboardState) | null = null;\n\n get clientCount(): number {\n return this.clients.size;\n }\n\n setStateProvider(provider: () => DashboardState): void {\n this.stateProvider = provider;\n }\n\n addClient(ws: WebSocket): boolean {\n if (this.clients.size >= this.maxClients) return false;\n this.clients.add(ws);\n\n ws.on('close', () => this.clients.delete(ws));\n ws.on('error', () => {\n this.clients.delete(ws);\n try { ws.close(); } catch { /* ignore */ }\n });\n\n // Send initial state\n this.pushState();\n\n // Start heartbeat if first client\n if (this.clients.size === 1) this.startHeartbeat();\n\n return true;\n }\n\n pushState(): void {\n if (!this.stateProvider || this.clients.size === 0) return;\n const state = this.stateProvider();\n const data = JSON.stringify(state);\n for (const ws of this.clients) {\n if (ws.readyState === 1 /* OPEN */) {\n ws.send(data);\n }\n }\n }\n\n pushMessageEvent(from: string, to: string, msgType: 'ask' | 'reply' | 'broadcast' | 'send'): void {\n if (this.clients.size === 0) return;\n const event: DashboardMessageEvent = {\n type: 'message_event',\n from,\n to,\n msgType,\n timestamp: new Date().toISOString(),\n };\n const data = JSON.stringify(event);\n for (const ws of this.clients) {\n if (ws.readyState === 1) {\n ws.send(data);\n }\n }\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n this.heartbeatTimer = setInterval(() => {\n if (this.clients.size === 0) {\n this.stopHeartbeat();\n return;\n }\n this.pushState();\n }, 30_000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n destroy(): void {\n this.stopHeartbeat();\n for (const ws of this.clients) {\n try { ws.close(); } catch { /* ignore */ }\n }\n this.clients.clear();\n }\n}\n","import type { ContextBudget, ContextHealth } from '../../shared/types/collab-client.interface.js';\n\nexport class ContextBudgetTracker {\n private readonly sessionStartedAt = new Date();\n private toolCallCount = 0;\n private alertedWarning = false;\n private alertedCritical = false;\n\n getSessionStartedAt(): Date {\n return this.sessionStartedAt;\n }\n\n get(): ContextBudget {\n const sessionAgeMs = Date.now() - this.sessionStartedAt.getTime();\n const ageMin = sessionAgeMs / 60_000;\n const tc = this.toolCallCount;\n let healthStatus: ContextHealth;\n let recommendation: string;\n if (tc > 250 || ageMin > 50) {\n healthStatus = 'critical';\n recommendation = 'Handoff baslatin: ozet al, commit ettir, respawn.';\n } else if (tc > 150 || ageMin > 30) {\n healthStatus = 'warning';\n recommendation = 'Yeni gorev vermeyin. Mevcut isi bitirsin.';\n } else {\n healthStatus = 'healthy';\n recommendation = 'Normal calisma.';\n }\n return { sessionAgeMs, toolCalls: tc, healthStatus, recommendation };\n }\n\n incrementToolCall(): void {\n this.toolCallCount++;\n }\n\n shouldAlert(): { level: 'warning' | 'critical'; message: string } | null {\n const { healthStatus } = this.get();\n if (healthStatus === 'critical' && !this.alertedCritical) {\n this.alertedCritical = true;\n return { level: 'critical', message: 'Context budget critical — wrap up current work' };\n }\n if (healthStatus === 'warning' && !this.alertedWarning) {\n this.alertedWarning = true;\n return { level: 'warning', message: 'Context budget warning — plan remaining work' };\n }\n return null;\n }\n}\n","import { mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync, existsSync } from 'fs';\nimport { join } from 'path';\n\nexport class SpawnManager {\n private readonly spawnedPids = new Map<string, number>();\n private readonly spawnedPidsByRole = new Map<string, number>();\n private pidFilePath: string | null = null;\n private readonly dataDir: string;\n\n constructor(dataDir: string) {\n this.dataDir = dataDir;\n }\n\n writePidFile(port: number, nodeId: string): void {\n const pidsDir = join(this.dataDir, 'pids');\n mkdirSync(pidsDir, { recursive: true });\n this.pidFilePath = join(pidsDir, `${port}.pid`);\n writeFileSync(this.pidFilePath, JSON.stringify({\n pid: process.pid, nodeId, startedAt: new Date().toISOString(),\n }));\n }\n\n registerPid(role: string, pid: number): void {\n this.spawnedPidsByRole.set(role, pid);\n }\n\n mapPid(nodeId: string, role: string): void {\n const pid = this.spawnedPidsByRole.get(role);\n if (pid) this.spawnedPids.set(nodeId, pid);\n }\n\n getPidForNode(nodeId: string): number | null {\n return this.spawnedPids.get(nodeId) ?? null;\n }\n\n getPidForRole(role: string): number | null {\n return this.spawnedPidsByRole.get(role) ?? null;\n }\n\n killProcess(pid: number): boolean {\n try { process.kill(pid, 'SIGTERM'); return true; } catch { return false; }\n }\n\n removePidForNode(nodeId: string): void {\n this.spawnedPids.delete(nodeId);\n }\n\n cleanupStalePids(): void {\n const pidsDir = join(this.dataDir, 'pids');\n if (!existsSync(pidsDir)) return;\n for (const file of readdirSync(pidsDir)) {\n if (!file.endsWith('.pid')) continue;\n const filePath = join(pidsDir, file);\n try {\n const data = JSON.parse(readFileSync(filePath, 'utf-8'));\n process.kill(data.pid, 0);\n } catch {\n try { unlinkSync(filePath); } catch { /* ignore */ }\n }\n }\n }\n\n cleanupOwnPidFile(): void {\n if (this.pidFilePath) {\n try { unlinkSync(this.pidFilePath); } catch { /* ignore */ }\n this.pidFilePath = null;\n }\n }\n\n stop(): void {\n this.cleanupOwnPidFile();\n }\n}\n","/**\n * LAN Discovery via UDP Broadcast\n * Discovers peers on the local network using UDP broadcast (255.255.255.255).\n * No multicast group membership, no IGMP, no switch configuration required.\n * Works out of the box on home and office routers.\n * @module infrastructure/p2p/multicast-discovery\n */\n\nimport dgram from 'dgram';\nimport os from 'os';\nimport { EventEmitter } from 'events';\n\nconst BROADCAST_ADDR = '255.255.255.255';\nconst BROADCAST_PORT = 11776;\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst PEER_TIMEOUT_MS = 95_000;\n\ninterface AnnounceMsg {\n type: 'ANNOUNCE';\n nodeId: string; // UUID routing key (may be absent on legacy peers)\n name: string; // display name\n role: string; // required now\n team?: string;\n wsPort: number;\n}\n\ninterface LeaveMsg {\n type: 'LEAVE';\n name: string;\n}\n\ntype DiscoveryMsg = AnnounceMsg | LeaveMsg;\n\nexport interface DiscoveredPeer {\n nodeId: string;\n name: string;\n role: string;\n team?: string;\n ip: string;\n wsPort: number;\n isLegacy: boolean;\n}\n\nexport class MulticastDiscovery extends EventEmitter {\n private socket: dgram.Socket | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private timeoutTimer: NodeJS.Timeout | null = null;\n\n private readonly peers = new Map<string, DiscoveredPeer & { lastSeen: number }>();\n private myName = '';\n private myNodeId = '';\n private myRole = '';\n private myTeam: string | undefined;\n private myWsPort = 0;\n private myIp = '';\n\n start(name: string, wsPort: number, nodeId: string, role: string, team?: string): void {\n this.myName = name;\n this.myWsPort = wsPort;\n this.myNodeId = nodeId;\n this.myRole = role;\n this.myTeam = team;\n this.myIp = this.resolveLocalIp();\n\n const socket = dgram.createSocket({ type: 'udp4', reuseAddr: true });\n this.socket = socket;\n\n socket.on('error', (err) => {\n console.error('[discovery] socket error:', err.message);\n });\n\n socket.on('message', (buf, rinfo) => {\n try {\n const msg = JSON.parse(buf.toString()) as DiscoveryMsg;\n this.handleMessage(msg, rinfo.address);\n } catch {\n // ignore malformed messages\n }\n });\n\n socket.bind(BROADCAST_PORT, () => {\n socket.setBroadcast(true);\n this.announce();\n this.heartbeatTimer = setInterval(() => this.announce(), HEARTBEAT_INTERVAL_MS);\n this.timeoutTimer = setInterval(() => this.checkTimeouts(), 10_000);\n console.error(`[discovery] broadcasting on port ${BROADCAST_PORT}`);\n });\n }\n\n stop(): void {\n if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = null; }\n if (this.timeoutTimer) { clearInterval(this.timeoutTimer); this.timeoutTimer = null; }\n if (this.socket) {\n this.sendMessage({ type: 'LEAVE', name: this.myName });\n try { this.socket.close(); } catch { /* ignore */ }\n this.socket = null;\n }\n this.peers.clear();\n }\n\n getMyIp(): string {\n return this.myIp;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private announce(): void {\n this.sendMessage({\n type: 'ANNOUNCE',\n nodeId: this.myNodeId,\n name: this.myName,\n role: this.myRole,\n team: this.myTeam,\n wsPort: this.myWsPort,\n });\n }\n\n private sendMessage(msg: DiscoveryMsg): void {\n if (!this.socket) return;\n const buf = Buffer.from(JSON.stringify(msg));\n this.socket.send(buf, BROADCAST_PORT, BROADCAST_ADDR, (err) => {\n if (err) console.error('[discovery] send error:', err.message);\n });\n }\n\n private handleMessage(msg: DiscoveryMsg, fromIp: string): void {\n if (msg.type === 'ANNOUNCE') {\n // Self-filter by nodeId\n if (msg.nodeId === this.myNodeId) return;\n\n const isLegacy = !msg.nodeId;\n const key = isLegacy ? `${msg.name}@${fromIp}` : msg.nodeId;\n const existing = this.peers.get(key);\n\n if (!existing) {\n const peer: DiscoveredPeer & { lastSeen: number } = {\n nodeId: msg.nodeId ?? key,\n name: msg.name,\n role: msg.role ?? 'Unknown',\n team: msg.team,\n ip: fromIp,\n wsPort: msg.wsPort,\n lastSeen: Date.now(),\n isLegacy,\n };\n this.peers.set(key, peer);\n this.emit('peer-found', {\n nodeId: peer.nodeId,\n name: peer.name,\n role: peer.role,\n team: peer.team,\n ip: fromIp,\n wsPort: msg.wsPort,\n isLegacy,\n });\n console.error(`[discovery] found peer: ${msg.name} (${peer.nodeId.slice(0, 8)}) @ ${fromIp}:${msg.wsPort}`);\n } else {\n existing.lastSeen = Date.now();\n existing.ip = fromIp;\n existing.wsPort = msg.wsPort;\n }\n } else if (msg.type === 'LEAVE') {\n // Modern peers: find by name in identities (LEAVE only carries name)\n // Legacy peers: key is 'name@ip', search by name@ prefix\n let foundKey: string | undefined;\n for (const [k, peer] of this.peers) {\n if (peer.name === msg.name || k.startsWith(`${msg.name}@`)) {\n foundKey = k;\n break;\n }\n }\n if (foundKey) {\n const peer = this.peers.get(foundKey)!;\n this.peers.delete(foundKey);\n this.emit('peer-lost', peer.nodeId);\n console.error(`[discovery] peer left: ${msg.name}`);\n }\n }\n }\n\n private checkTimeouts(): void {\n const now = Date.now();\n for (const [key, peer] of this.peers) {\n if (now - peer.lastSeen > PEER_TIMEOUT_MS) {\n this.peers.delete(key);\n this.emit('peer-lost', peer.nodeId);\n console.error(`[discovery] peer timed out: ${peer.name}`);\n }\n }\n }\n\n private resolveLocalIp(): string {\n const interfaces = os.networkInterfaces();\n for (const iface of Object.values(interfaces)) {\n if (!iface) continue;\n for (const addr of iface) {\n if (addr.family === 'IPv4' && !addr.internal) {\n return addr.address;\n }\n }\n }\n return '127.0.0.1';\n }\n}\n","import { createClient, type Client } from '@libsql/client';\n\nexport interface IdentityRow {\n node_id: string;\n name: string;\n role: string;\n team: string | null;\n created_at: string;\n}\n\nexport interface KnownPeerRow {\n node_id: string;\n name: string;\n role: string;\n team: string | null;\n is_legacy: number;\n last_seen_at: string;\n}\n\nexport interface UpsertPeerParams {\n nodeId: string;\n name: string;\n role: string;\n team?: string;\n isLegacy: boolean;\n lastSeenAt?: string;\n}\n\nexport interface TestSessionRow {\n session_id: string;\n started_at: string;\n ended_at: string | null;\n team_config: string;\n issue_ids: string;\n report_json: string | null;\n status: string;\n}\n\nexport interface MetricSnapshotRow {\n id: number;\n session_id: string;\n captured_at: string;\n type: string;\n data: string;\n}\n\nexport interface AnomalyLogRow {\n id: number;\n session_id: string;\n detected_at: string;\n severity: string;\n category: string;\n peer_name: string | null;\n issue_id: string | null;\n description: string;\n resolved_at: string | null;\n}\n\nexport class CollabDb {\n private client: Client;\n\n constructor(url: string) {\n this.client = createClient({ url });\n }\n\n async init(): Promise<void> {\n await this.client.executeMultiple(`\n CREATE TABLE IF NOT EXISTS identities (\n node_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n role TEXT NOT NULL,\n team TEXT,\n created_at TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS known_peers (\n node_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n role TEXT NOT NULL,\n team TEXT,\n is_legacy INTEGER NOT NULL DEFAULT 0,\n last_seen_at TEXT NOT NULL\n );\n `);\n\n // --- Observer tables ---\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS test_sessions (\n session_id TEXT PRIMARY KEY,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n team_config TEXT NOT NULL,\n issue_ids TEXT NOT NULL,\n report_json TEXT,\n status TEXT NOT NULL DEFAULT 'running'\n )\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS metric_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES test_sessions(session_id),\n captured_at TEXT NOT NULL,\n type TEXT NOT NULL,\n data TEXT NOT NULL\n )\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS anomaly_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES test_sessions(session_id),\n detected_at TEXT NOT NULL,\n severity TEXT NOT NULL,\n category TEXT NOT NULL,\n peer_name TEXT,\n issue_id TEXT,\n description TEXT NOT NULL,\n resolved_at TEXT\n )\n `);\n }\n\n async insertIdentity(params: { nodeId: string; name: string; role: string; team?: string }): Promise<void> {\n await this.client.execute({\n sql: `INSERT OR IGNORE INTO identities (node_id, name, role, team, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n args: [params.nodeId, params.name, params.role, params.team ?? null, new Date().toISOString()],\n });\n }\n\n async getIdentities(): Promise<IdentityRow[]> {\n const result = await this.client.execute('SELECT * FROM identities');\n return result.rows.map((r) => ({\n node_id: r['node_id'] as string,\n name: r['name'] as string,\n role: r['role'] as string,\n team: r['team'] as string | null,\n created_at: r['created_at'] as string,\n }));\n }\n\n async upsertKnownPeer(params: UpsertPeerParams): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO known_peers (node_id, name, role, team, is_legacy, last_seen_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(node_id) DO UPDATE SET\n name = excluded.name,\n role = excluded.role,\n team = excluded.team,\n is_legacy = excluded.is_legacy,\n last_seen_at = excluded.last_seen_at`,\n args: [\n params.nodeId,\n params.name,\n params.role,\n params.team ?? null,\n params.isLegacy ? 1 : 0,\n params.lastSeenAt ?? new Date().toISOString(),\n ],\n });\n }\n\n async getKnownPeers(): Promise<KnownPeerRow[]> {\n const result = await this.client.execute('SELECT * FROM known_peers ORDER BY last_seen_at DESC');\n return result.rows.map((r) => ({\n node_id: r['node_id'] as string,\n name: r['name'] as string,\n role: r['role'] as string,\n team: r['team'] as string | null,\n is_legacy: r['is_legacy'] as number,\n last_seen_at: r['last_seen_at'] as string,\n }));\n }\n\n async cleanupOldPeers(daysOld: number): Promise<void> {\n const cutoff = new Date(Date.now() - daysOld * 24 * 60 * 60 * 1000).toISOString();\n await this.client.execute({\n sql: 'DELETE FROM known_peers WHERE last_seen_at < ?',\n args: [cutoff],\n });\n }\n\n // --- test_sessions ---\n\n async insertTestSession(params: {\n sessionId: string; startedAt: string; teamConfig: string;\n issueIds: string; status: string;\n }): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO test_sessions (session_id, started_at, team_config, issue_ids, status)\n VALUES (?, ?, ?, ?, ?)`,\n args: [params.sessionId, params.startedAt, params.teamConfig, params.issueIds, params.status],\n });\n }\n\n async updateTestSession(sessionId: string, updates: {\n status?: string; endedAt?: string; reportJson?: string; issueIds?: string;\n }): Promise<void> {\n const sets: string[] = [];\n const args: unknown[] = [];\n if (updates.status !== undefined) { sets.push('status = ?'); args.push(updates.status); }\n if (updates.endedAt !== undefined) { sets.push('ended_at = ?'); args.push(updates.endedAt); }\n if (updates.reportJson !== undefined) { sets.push('report_json = ?'); args.push(updates.reportJson); }\n if (updates.issueIds !== undefined) { sets.push('issue_ids = ?'); args.push(updates.issueIds); }\n if (sets.length === 0) return;\n args.push(sessionId);\n await this.client.execute({\n sql: `UPDATE test_sessions SET ${sets.join(', ')} WHERE session_id = ?`,\n args,\n });\n }\n\n async getTestSession(sessionId: string): Promise<TestSessionRow | null> {\n const result = await this.client.execute({\n sql: 'SELECT * FROM test_sessions WHERE session_id = ?',\n args: [sessionId],\n });\n return (result.rows[0] as unknown as TestSessionRow) ?? null;\n }\n\n async getTestSessions(limit: number, status?: string): Promise<TestSessionRow[]> {\n if (status) {\n const result = await this.client.execute({\n sql: 'SELECT * FROM test_sessions WHERE status = ? ORDER BY started_at DESC LIMIT ?',\n args: [status, limit],\n });\n return result.rows as unknown as TestSessionRow[];\n }\n const result = await this.client.execute({\n sql: 'SELECT * FROM test_sessions ORDER BY started_at DESC LIMIT ?',\n args: [limit],\n });\n return result.rows as unknown as TestSessionRow[];\n }\n\n async getLatestCompletedSession(): Promise<TestSessionRow | null> {\n const result = await this.client.execute(\n `SELECT * FROM test_sessions WHERE status = 'completed' ORDER BY started_at DESC LIMIT 1`\n );\n return (result.rows[0] as unknown as TestSessionRow) ?? null;\n }\n\n // --- metric_snapshots ---\n\n async insertMetricSnapshot(params: {\n sessionId: string; capturedAt: string; type: string; data: string;\n }): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO metric_snapshots (session_id, captured_at, type, data)\n VALUES (?, ?, ?, ?)`,\n args: [params.sessionId, params.capturedAt, params.type, params.data],\n });\n }\n\n async getMetricSnapshots(sessionId: string, type?: string): Promise<MetricSnapshotRow[]> {\n if (type) {\n const result = await this.client.execute({\n sql: 'SELECT * FROM metric_snapshots WHERE session_id = ? AND type = ? ORDER BY captured_at ASC',\n args: [sessionId, type],\n });\n return result.rows as unknown as MetricSnapshotRow[];\n }\n const result = await this.client.execute({\n sql: 'SELECT * FROM metric_snapshots WHERE session_id = ? ORDER BY captured_at ASC',\n args: [sessionId],\n });\n return result.rows as unknown as MetricSnapshotRow[];\n }\n\n // --- anomaly_logs ---\n\n async insertAnomalyLog(params: {\n sessionId: string; detectedAt: string; severity: string; category: string;\n peerName?: string; issueId?: string; description: string;\n }): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO anomaly_logs (session_id, detected_at, severity, category, peer_name, issue_id, description)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n args: [params.sessionId, params.detectedAt, params.severity, params.category,\n params.peerName ?? null, params.issueId ?? null, params.description],\n });\n }\n\n async resolveAnomaly(id: number, resolvedAt: string): Promise<void> {\n await this.client.execute({\n sql: 'UPDATE anomaly_logs SET resolved_at = ? WHERE id = ?',\n args: [resolvedAt, id],\n });\n }\n\n async getAnomalyLogs(sessionId: string, severity?: string): Promise<AnomalyLogRow[]> {\n if (severity) {\n const result = await this.client.execute({\n sql: 'SELECT * FROM anomaly_logs WHERE session_id = ? AND severity = ? ORDER BY detected_at ASC',\n args: [sessionId, severity],\n });\n return result.rows as unknown as AnomalyLogRow[];\n }\n const result = await this.client.execute({\n sql: 'SELECT * FROM anomaly_logs WHERE session_id = ? ORDER BY detected_at ASC',\n args: [sessionId],\n });\n return result.rows as unknown as AnomalyLogRow[];\n }\n\n close(): void {\n this.client.close();\n }\n}\n","/**\n * Windows Terminal Injector\n * AttachConsole(ppid) → CreateFile(\"CONIN$\") → WriteConsoleInput\n * All keystrokes (text, Ctrl+U, Enter, Ctrl+Y) go through WriteConsoleInput.\n * No WScript.Shell / SendKeys / SetForegroundWindow — no focus dependency.\n * @module infrastructure/terminal-injector/windows-injector\n */\n\nimport { execFile } from 'child_process';\nimport { unlinkSync } from 'fs';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\nconst CS_CONINJECT = `\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\n\npublic class ConInject {\n [DllImport(\"kernel32.dll\")] public static extern bool FreeConsole();\n [DllImport(\"kernel32.dll\")] public static extern bool AttachConsole(uint pid);\n [DllImport(\"kernel32.dll\", CharSet=CharSet.Unicode, SetLastError=true)]\n public static extern IntPtr CreateFile(\n string lpFileName, uint dwDesiredAccess, uint dwShareMode,\n IntPtr lpSecurityAttributes, uint dwCreationDisposition,\n uint dwFlagsAndAttributes, IntPtr hTemplateFile);\n [DllImport(\"kernel32.dll\")] public static extern bool WriteConsoleInput(\n IntPtr hIn, INPUT_RECORD[] buf, uint len, out uint written);\n [DllImport(\"kernel32.dll\")] public static extern bool CloseHandle(IntPtr h);\n\n [StructLayout(LayoutKind.Explicit, Size=20)]\n public struct INPUT_RECORD {\n [FieldOffset(0)] public ushort EventType;\n [FieldOffset(4)] public int bKeyDown;\n [FieldOffset(8)] public ushort wRepeatCount;\n [FieldOffset(10)] public ushort wVirtualKeyCode;\n [FieldOffset(12)] public ushort wVirtualScanCode;\n [FieldOffset(14)] public ushort UnicodeChar;\n [FieldOffset(16)] public uint dwControlKeyState;\n }\n\n const uint LEFT_CTRL = 0x0008;\n\n static IntPtr OpenConin(uint pid) {\n FreeConsole();\n if (!AttachConsole(pid)) return new IntPtr(-1);\n return CreateFile(\"CONIN$\", 0xC0000000, 3, IntPtr.Zero, 3, 0, IntPtr.Zero);\n }\n\n // Inject plain text characters into console input buffer\n public static int InjectText(uint pid, string text) {\n IntPtr hIn = OpenConin(pid);\n if (hIn == new IntPtr(-1)) return -1;\n\n var records = new List<INPUT_RECORD>();\n foreach (char c in text) {\n records.Add(new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, UnicodeChar=(ushort)c });\n records.Add(new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, UnicodeChar=(ushort)c });\n }\n\n var arr = records.ToArray();\n uint written;\n bool ok = WriteConsoleInput(hIn, arr, (uint)arr.Length, out written);\n CloseHandle(hIn);\n return ok ? (int)written : -2;\n }\n\n // Inject Enter (VK_RETURN = 0x0D)\n public static int InjectEnter(uint pid) {\n IntPtr hIn = OpenConin(pid);\n if (hIn == new IntPtr(-1)) return -1;\n\n var records = new INPUT_RECORD[] {\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x0D, UnicodeChar=0x0D },\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x0D, UnicodeChar=0x0D }\n };\n\n uint written;\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\n CloseHandle(hIn);\n return ok ? (int)written : -2;\n }\n\n // Inject Ctrl+U (VK_U = 0x55, char = 0x15)\n public static int InjectCtrlU(uint pid) {\n IntPtr hIn = OpenConin(pid);\n if (hIn == new IntPtr(-1)) return -1;\n\n var records = new INPUT_RECORD[] {\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x55, UnicodeChar=0x15, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x55, UnicodeChar=0x15, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=0 }\n };\n\n uint written;\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\n CloseHandle(hIn);\n return ok ? (int)written : -2;\n }\n\n // Inject Ctrl+Y (VK_Y = 0x59, char = 0x19)\n public static int InjectCtrlY(uint pid) {\n IntPtr hIn = OpenConin(pid);\n if (hIn == new IntPtr(-1)) return -1;\n\n var records = new INPUT_RECORD[] {\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=1, wRepeatCount=1, wVirtualKeyCode=0x59, UnicodeChar=0x19, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0x59, UnicodeChar=0x19, dwControlKeyState=LEFT_CTRL },\n new INPUT_RECORD { EventType=1, bKeyDown=0, wRepeatCount=1, wVirtualKeyCode=0xA2, dwControlKeyState=0 }\n };\n\n uint written;\n bool ok = WriteConsoleInput(hIn, records, (uint)records.Length, out written);\n CloseHandle(hIn);\n return ok ? (int)written : -2;\n }\n}\n`;\n\nfunction buildScript(claudePid: number, body: string): string {\n const logFile = join(tmpdir(), `cc-inject-${Date.now()}.log`).replace(/\\\\/g, '/');\n return `\n$log = \"${logFile}\"\nfunction Log($msg) { Add-Content -Path $log -Value $msg -Encoding UTF8 }\n$claudePid = ${claudePid}\ntry { Add-Type @'${CS_CONINJECT}'@ } catch { }\n${body}\n`;\n}\n\nfunction run(script: string): Promise<void> {\n return new Promise((resolve) => {\n const encoded = Buffer.from(script, 'utf16le').toString('base64');\n execFile(\n 'powershell',\n ['-NoProfile', '-WindowStyle', 'Hidden', '-EncodedCommand', encoded],\n { windowsHide: true },\n () => {\n const logFile = script.match(/\\$log = \"([^\"]+)\"/)?.[1];\n if (logFile) try { unlinkSync(logFile); } catch { /* ok */ }\n resolve();\n }\n );\n });\n}\n\nexport async function windowsInject(text: string): Promise<void> {\n const claudePid = process.ppid;\n const textB64 = Buffer.from(text, 'utf16le').toString('base64');\n\n const script = buildScript(claudePid, `\n$textBytes = [System.Convert]::FromBase64String('${textB64}')\n$text = [System.Text.Encoding]::Unicode.GetString($textBytes)\n\n# 1. Ctrl+U to save user's current text to kill ring\n[ConInject]::InjectCtrlU([uint32]$claudePid) | Out-Null\nStart-Sleep -Milliseconds 100\n\n# 2. Write question text into console input buffer\n[ConInject]::InjectText([uint32]$claudePid, $text) | Out-Null\nStart-Sleep -Milliseconds 500\n\n# 3. Send Enter\n[ConInject]::InjectEnter([uint32]$claudePid) | Out-Null\n`);\n\n await run(script);\n}\n\nexport async function windowsInjectCtrlY(): Promise<void> {\n const claudePid = process.ppid;\n\n const script = buildScript(claudePid, `\n[ConInject]::InjectCtrlY([uint32]$claudePid) | Out-Null\n`);\n\n await run(script);\n}\n","/**\n * Terminal Injector\n * Injects a question directly into the active Claude Code terminal\n * so Claude Code can auto-reply without user intervention.\n * @module infrastructure/terminal-injector\n */\n\nimport type { InboxQuestionEntry } from '../../shared/types/collab-client.interface.js';\nimport { windowsInject, windowsInjectCtrlY } from './windows-injector.js';\n\n/**\n * Transliterate Turkish special characters to ASCII equivalents.\n * WriteConsoleInput loses chars above U+00FF (ı→1, ş→_, ğ→dropped).\n * ASCII transliteration keeps the text readable for Claude.\n */\nconst TR_MAP: Record<string, string> = {\n 'ç': 'c', 'Ç': 'C', 'ğ': 'g', 'Ğ': 'G', 'ı': 'i', 'İ': 'I',\n 'ö': 'o', 'Ö': 'O', 'ş': 's', 'Ş': 'S', 'ü': 'u', 'Ü': 'U',\n};\nfunction sanitizeForConsole(text: string): string {\n // 1. Transliterate Turkish chars (WriteConsoleInput loses chars above U+00FF)\n const transliterated = text.replace(/[çÇğĞıİöÖşŞüÜ]/g, (ch) => TR_MAP[ch] ?? ch);\n // 2. Strip emoji and other non-ASCII chars above U+00FF (they garble in console)\n return transliterated.replace(/[^\\x00-\\xFF]/g, '');\n}\n\n/**\n * Formats a question that requires a reply.\n * Format: [HUB SORUSU] ID:<id> | <name> (<role>): <content> | Cevapla...\n */\nfunction formatQuestionForInjection(question: InboxQuestionEntry): string {\n const content = sanitizeForConsole(question.content.replace(/\\s+/g, ' ').trim());\n const from = sanitizeForConsole(question.from.displayName);\n const role = sanitizeForConsole(question.from.teamName);\n return `[HUB SORUSU] ID:${question.questionId} | ${from} (${role}): ${content} | Cevapla ve reply tool ile \"${question.questionId}\" ID'sine gonder, onay bekleme.`;\n}\n\n/**\n * Formats a reply that was auto-injected (push-based).\n * Format: [YANIT] <name> (<role>) -> re:<originalMsgId>: <content>\n */\nfunction formatReplyForInjection(question: InboxQuestionEntry): string {\n const content = sanitizeForConsole(question.content.replace(/\\s+/g, ' ').trim());\n const from = sanitizeForConsole(question.from.displayName);\n const role = sanitizeForConsole(question.from.teamName);\n const replyRef = question.replyToMsgId ? ` -> re:${question.replyToMsgId.slice(0, 8)}` : '';\n return `[YANIT] ${from} (${role})${replyRef}: ${content}`;\n}\n\n/**\n * Formats an informational message that does not require a reply.\n * Format: [BILGI] <name> (<role>): <content>\n */\nfunction formatInfoForInjection(question: InboxQuestionEntry): string {\n const content = sanitizeForConsole(question.content.replace(/\\s+/g, ' ').trim());\n const from = sanitizeForConsole(question.from.displayName);\n const role = sanitizeForConsole(question.from.teamName);\n return `[BILGI] ${from} (${role}): ${content}`;\n}\n\n/**\n * Injects a question into the terminal running Claude Code.\n * Only supported on Windows; no-op on other platforms.\n */\nexport async function injectQuestionToTerminal(question: InboxQuestionEntry): Promise<void> {\n if (process.platform !== 'win32') return;\n\n let text: string;\n if (question.msgType === 'reply') {\n text = formatReplyForInjection(question);\n } else if (question.fireAndForget) {\n text = formatInfoForInjection(question);\n } else {\n text = formatQuestionForInjection(question);\n }\n await windowsInject(text);\n}\n\n/**\n * Restores user's previous input from readline kill ring (Ctrl+Y).\n * Call this after the reply is sent so the user's interrupted text comes back.\n */\nexport async function injectRestoreText(): Promise<void> {\n if (process.platform !== 'win32') return;\n await windowsInjectCtrlY();\n}\n","/**\n * Injection Queue\n * Ensures questions are injected into the terminal one at a time.\n * Waits for the reply tool to signal completion before processing the next question.\n * @module infrastructure/terminal-injector/injection-queue\n */\n\nimport { EventEmitter } from 'events';\nimport type { InboxQuestionEntry } from '../../shared/types/collab-client.interface.js';\nimport { injectQuestionToTerminal, injectRestoreText } from './index.js';\nimport type { CollabLogger } from '../logging/collab-logger.js';\n\nconst REPLY_TIMEOUT_MS = 2 * 60 * 1000; // 2 minutes\n\nclass InjectionQueue extends EventEmitter {\n private queue: InboxQuestionEntry[] = [];\n private processing = false;\n private logger: CollabLogger | null = null;\n\n setLogger(logger: CollabLogger): void {\n this.logger = logger;\n }\n\n /**\n * Add a question to the queue. Starts processing if idle.\n */\n enqueue(question: InboxQuestionEntry): void {\n this.logger?.log('INJECT_ENQUEUE', {\n questionId: question.questionId,\n from: question.from.displayName,\n fireAndForget: false,\n queueLen: this.queue.length,\n });\n this.queue.push(question);\n if (!this.processing) void this.processNext();\n }\n\n /**\n * Called by the reply tool after a reply is successfully sent.\n * Unblocks the queue to process the next question.\n */\n notifyReplied(): void {\n this.emit('replied');\n }\n\n private async processNext(): Promise<void> {\n if (this.queue.length === 0) {\n this.processing = false;\n return;\n }\n\n this.processing = true;\n const question = this.queue.shift()!;\n const startTime = Date.now();\n\n this.logger?.log('INJECT_START', {\n questionId: question.questionId,\n contentLen: question.content.length,\n });\n\n // Inject the question (includes Ctrl+U to save user's current text)\n await injectQuestionToTerminal(question);\n\n // Fire-and-forget: advance immediately, no reply wait\n if (question.fireAndForget) {\n this.logger?.log('INJECT_DONE', {\n questionId: question.questionId,\n result: 'replied',\n durationMs: Date.now() - startTime,\n });\n await injectRestoreText();\n void this.processNext();\n return;\n }\n\n // Wait for reply tool to signal, with a timeout fallback\n const gotReply = await new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), REPLY_TIMEOUT_MS);\n this.once('replied', () => {\n clearTimeout(timer);\n resolve(true);\n });\n });\n\n this.logger?.log('INJECT_DONE', {\n questionId: question.questionId,\n result: gotReply ? 'replied' : 'timeout',\n durationMs: Date.now() - startTime,\n });\n\n // Restore user's text after reply is sent\n await injectRestoreText();\n\n // Process next in queue\n void this.processNext();\n }\n}\n\nexport const injectionQueue = new InjectionQueue();\n","/**\n * Windows Console Reader\n * AttachConsole(pid) → CreateFile(\"CONOUT$\") → ReadConsoleOutputCharacter\n * Reads the last N lines from a target process's console output buffer.\n * @module infrastructure/terminal-injector/windows-reader\n */\n\nimport { execFile } from 'child_process';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\nimport { unlinkSync, readFileSync } from 'fs';\n\nconst CS_CONREAD = `\nusing System;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\npublic class ConRead {\n [DllImport(\"kernel32.dll\")] public static extern bool FreeConsole();\n [DllImport(\"kernel32.dll\")] public static extern bool AttachConsole(uint pid);\n [DllImport(\"kernel32.dll\", CharSet=CharSet.Unicode, SetLastError=true)]\n public static extern IntPtr CreateFile(\n string lpFileName, uint dwDesiredAccess, uint dwShareMode,\n IntPtr lpSecurityAttributes, uint dwCreationDisposition,\n uint dwFlagsAndAttributes, IntPtr hTemplateFile);\n [DllImport(\"kernel32.dll\")] public static extern bool CloseHandle(IntPtr h);\n [DllImport(\"kernel32.dll\")]\n public static extern bool GetConsoleScreenBufferInfo(IntPtr h, out CONSOLE_SCREEN_BUFFER_INFO info);\n [DllImport(\"kernel32.dll\", CharSet=CharSet.Unicode)]\n public static extern bool ReadConsoleOutputCharacter(\n IntPtr h, [Out] char[] lpCharacter, uint nLength, COORD dwReadCoord, out uint lpNumberOfCharsRead);\n\n const uint ATTACH_PARENT = unchecked((uint)-1);\n\n [StructLayout(LayoutKind.Sequential)]\n public struct COORD { public short X; public short Y; }\n\n [StructLayout(LayoutKind.Sequential)]\n public struct SMALL_RECT { public short Left; public short Top; public short Right; public short Bottom; }\n\n [StructLayout(LayoutKind.Sequential)]\n public struct CONSOLE_SCREEN_BUFFER_INFO {\n public COORD dwSize;\n public COORD dwCursorPosition;\n public ushort wAttributes;\n public SMALL_RECT srWindow;\n public COORD dwMaximumWindowSize;\n }\n\n public static string ReadOutput(uint pid, int lines) {\n FreeConsole();\n if (!AttachConsole(pid)) {\n AttachConsole(ATTACH_PARENT);\n return \"ERROR:ATTACH_FAILED\";\n }\n\n IntPtr hOut = CreateFile(\"CONOUT$\", 0x80000000, 1, IntPtr.Zero, 3, 0, IntPtr.Zero);\n if (hOut == new IntPtr(-1)) {\n FreeConsole();\n AttachConsole(ATTACH_PARENT);\n return \"ERROR:HANDLE_FAILED\";\n }\n\n CONSOLE_SCREEN_BUFFER_INFO info;\n if (!GetConsoleScreenBufferInfo(hOut, out info)) {\n CloseHandle(hOut);\n FreeConsole();\n AttachConsole(ATTACH_PARENT);\n return \"ERROR:BUFFER_INFO_FAILED\";\n }\n\n int cursorY = info.dwCursorPosition.Y;\n int width = info.dwSize.X;\n int startRow = Math.Max(0, cursorY - lines + 1);\n int rowCount = cursorY - startRow + 1;\n\n var sb = new StringBuilder();\n for (int row = startRow; row < startRow + rowCount; row++) {\n var chars = new char[width];\n uint read;\n COORD coord = new COORD { X = 0, Y = (short)row };\n ReadConsoleOutputCharacter(hOut, chars, (uint)width, coord, out read);\n sb.AppendLine(new string(chars, 0, (int)read).TrimEnd());\n }\n\n CloseHandle(hOut);\n FreeConsole();\n AttachConsole(ATTACH_PARENT);\n return sb.ToString();\n }\n}\n`;\n\n/**\n * Read the last N lines from a target process's console output.\n * Windows only — returns empty string on other platforms.\n */\nexport async function readConsoleOutput(pid: number, lines: number = 50): Promise<string> {\n if (process.platform !== 'win32') return '';\n\n const maxLines = Math.min(Math.max(lines, 1), 200);\n const outFile = join(tmpdir(), `cc-conread-${Date.now()}.txt`);\n\n const script = `\ntry { Add-Type @'\n${CS_CONREAD}\n'@ } catch { }\n$result = [ConRead]::ReadOutput([uint32]${pid}, ${maxLines})\n[System.IO.File]::WriteAllText(\"${outFile.replace(/\\\\/g, '/')}\", $result, [System.Text.Encoding]::UTF8)\n`;\n\n return new Promise((resolve) => {\n const encoded = Buffer.from(script, 'utf16le').toString('base64');\n execFile(\n 'powershell',\n ['-NoProfile', '-WindowStyle', 'Hidden', '-EncodedCommand', encoded],\n { windowsHide: true, timeout: 10_000 },\n () => {\n try {\n const content = readFileSync(outFile, 'utf8');\n unlinkSync(outFile);\n if (content.startsWith('ERROR:')) {\n resolve(`[observe error: ${content}]`);\n } else {\n resolve(content);\n }\n } catch {\n resolve('[observe error: could not read output]');\n }\n }\n );\n });\n}\n","/**\r\n * Configuration module\r\n * @module config\r\n */\r\n\r\nimport { fileURLToPath } from 'url';\r\nimport { dirname, join } from 'path';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\n\r\n// After tsup build: dist/mcp-main.js → project root is one level up\r\n// In dev: src/config/index.ts → project root is two levels up\r\nconst projectRoot = __dirname.endsWith('dist')\r\n ? join(__dirname, '..')\r\n : join(__dirname, '..', '..');\r\n\r\n/**\r\n * Application configuration\r\n */\r\nexport const config = {\r\n dataDir: process.env['CLAUDE_COLLAB_DATA_DIR'] ?? join(projectRoot, 'data'),\r\n /**\r\n * P2P node configuration\r\n */\r\n p2p: {\r\n /**\r\n * Port range for the WS server. Override with CLAUDE_COLLAB_PORT_MIN / MAX env vars.\r\n */\r\n portRangeMin: Number(process.env['CLAUDE_COLLAB_PORT_MIN'] ?? 11700),\r\n portRangeMax: Number(process.env['CLAUDE_COLLAB_PORT_MAX'] ?? 11750),\r\n },\r\n\r\n /**\r\n * Communication configuration\r\n */\r\n communication: {\r\n /**\r\n * Default timeout for waiting for an answer (in milliseconds)\r\n */\r\n defaultTimeout: 30000,\r\n\r\n /**\r\n * Maximum message content length\r\n */\r\n maxMessageLength: 50000,\r\n },\r\n} as const;\r\n\r\nexport type Config = typeof config;\r\n","/**\n * Claude Session ID Detector\n * Detects the parent Claude Code session ID via PID match + CWD fallback.\n * Uses undocumented ~/.claude/sessions/{PID}.json files.\n * Returns null if undetectable (caller falls back to fresh spawn).\n *\n * Session file format (observed, undocumented):\n * { \"pid\": 56272, \"sessionId\": \"uuid\", \"cwd\": \"path\", \"startedAt\": timestamp }\n *\n * @module infrastructure/terminal/session-detector\n */\n\nimport { readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { execSync } from 'child_process';\n\ninterface ClaudeSession {\n pid: number;\n sessionId: string;\n cwd: string;\n startedAt: number;\n}\n\nconst SESSIONS_DIR = join(homedir(), '.claude', 'sessions');\nconst MAX_TREE_DEPTH = 5;\n\nfunction readSessionFile(pid: number): ClaudeSession | null {\n try {\n const filePath = join(SESSIONS_DIR, `${pid}.json`);\n const raw = readFileSync(filePath, 'utf-8');\n const data = JSON.parse(raw);\n if (data && typeof data.sessionId === 'string') return data as ClaudeSession;\n } catch { /* file doesn't exist or parse error */ }\n return null;\n}\n\nfunction getParentPid(pid: number): number | null {\n try {\n const result = execSync(\n `powershell.exe -NoProfile -Command \"(Get-Process -Id ${pid}).Parent.Id\"`,\n { encoding: 'utf-8', timeout: 5_000, stdio: ['pipe', 'pipe', 'pipe'] }\n ).trim();\n const parentPid = parseInt(result, 10);\n return isNaN(parentPid) || parentPid <= 0 ? null : parentPid;\n } catch { return null; }\n}\n\nfunction detectByPidMatch(): string | null {\n let currentPid = process.ppid;\n for (let depth = 0; depth < MAX_TREE_DEPTH; depth++) {\n const session = readSessionFile(currentPid);\n if (session) return session.sessionId;\n const parentPid = getParentPid(currentPid);\n if (!parentPid || parentPid === currentPid) break;\n currentPid = parentPid;\n }\n return null;\n}\n\nfunction detectByCwdMatch(): string | null {\n const cwd = process.cwd();\n try {\n const files = readdirSync(SESSIONS_DIR).filter(f => f.endsWith('.json'));\n let bestSession: ClaudeSession | null = null;\n for (const file of files) {\n try {\n const raw = readFileSync(join(SESSIONS_DIR, file), 'utf-8');\n const session: ClaudeSession = JSON.parse(raw);\n if (!session.sessionId || !session.cwd) continue;\n const sessionCwd = session.cwd.replace(/\\\\/g, '/').toLowerCase();\n const currentCwd = cwd.replace(/\\\\/g, '/').toLowerCase();\n if (sessionCwd === currentCwd) {\n if (!bestSession || session.startedAt > bestSession.startedAt) {\n bestSession = session;\n }\n }\n } catch { /* skip */ }\n }\n return bestSession?.sessionId ?? null;\n } catch { return null; }\n}\n\nexport function detectOwnSessionId(): string | null {\n return detectByPidMatch() ?? detectByCwdMatch();\n}\n","import { appendFileSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nexport type LogEvent =\n | 'SEND' | 'SEND_RECEIVED' | 'SEND_FAIL' | 'CHECK_REPLIES'\n | 'ASK' | 'ASK_RECEIVED' | 'REPLY'\n | 'BROADCAST' | 'BROADCAST_RECEIVED'\n | 'INJECT_ENQUEUE' | 'INJECT_START' | 'INJECT_DONE'\n | 'HELLO' | 'DISCONNECT' | 'GHOST_CLEANUP'\n | 'HEARTBEAT_SUMMARY'\n | 'RESPAWN_TRIGGER' | 'RESPAWN_EXEC' | 'RESPAWN_COOLDOWN'\n | 'ISSUE_UPDATE' | 'PIPELINE_PERSIST' | 'ORPHAN_REASSIGN'\n | 'JOIN_NETWORK' | 'CONTEXT_BUDGET' | 'ROLE_REMINDER'\n | 'WS_CONNECT_OUT' | 'WS_CONNECT_OK' | 'WS_CONNECT_FAIL'\n | 'WS_INBOUND' | 'WS_ERROR' | 'WS_CLOSE'\n | 'PEER_DISCOVERED' | 'PEER_LOST' | 'MSG_PARSE_ERROR'\n | 'PROCESS_CRASH'\n | 'INTERNAL_ERROR' | 'CONN_FAIL'\n | 'ZOMBIE_KILLED' | 'SHUTDOWN_RECEIVED' | 'SHUTDOWN_SENT' | 'PID_CLEANUP';\n\ninterface LogEntry {\n ts: string;\n node: string;\n event: LogEvent;\n data: Record<string, unknown>;\n}\n\n/**\n * Standalone crash logger — works without a CollabLogger instance.\n * Writes directly to the log file so it can capture crashes before joinNetwork.\n */\nexport function logCrash(type: 'uncaughtException' | 'unhandledRejection', error: unknown): void {\n try {\n const logDir = process.env['CLAUDE_COLLAB_LOG_DIR'] ?? join(homedir(), '.claude-collab', 'logs');\n mkdirSync(logDir, { recursive: true });\n const today = new Date().toISOString().slice(0, 10);\n const filePath = join(logDir, `collab-${today}.log`);\n const entry: LogEntry = {\n ts: new Date().toISOString(),\n node: '_process',\n event: 'PROCESS_CRASH',\n data: {\n type,\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n };\n appendFileSync(filePath, JSON.stringify(entry) + '\\n');\n } catch {\n // Last resort — nothing we can do\n }\n}\n\nexport class CollabLogger {\n private readonly nodeName: string;\n private readonly logDir: string;\n private dirCreated = false;\n\n constructor(nodeName: string, logDir = process.env['CLAUDE_COLLAB_LOG_DIR'] ?? join(homedir(), '.claude-collab', 'logs')) {\n this.nodeName = nodeName;\n this.logDir = logDir;\n }\n\n log(event: LogEvent, data: Record<string, unknown>): void {\n try {\n if (!this.dirCreated) {\n mkdirSync(this.logDir, { recursive: true });\n this.dirCreated = true;\n }\n const today = new Date().toISOString().slice(0, 10);\n const filePath = join(this.logDir, `collab-${today}.log`);\n const entry: LogEntry = {\n ts: new Date().toISOString(),\n node: this.nodeName,\n event,\n data,\n };\n appendFileSync(filePath, JSON.stringify(entry) + '\\n');\n } catch {\n // Silent — log failure must not crash the application\n }\n }\n}\n","export const CollabEvents = {\n PEER_CONNECTED: 'peer:connected',\n PEER_DISCONNECTED: 'peer:disconnected',\n PEER_MESSAGE: 'peer:message',\n SHUTDOWN_RECEIVED: 'peer:shutdown',\n\n MESSAGE_RECEIVED: 'msg:received',\n ASK_RECEIVED: 'msg:ask-received',\n STATUS_UPDATED: 'msg:status-updated',\n ISSUE_UPDATED: 'msg:issue-updated',\n\n ZOMBIE_DETECTED: 'health:zombie',\n PEER_INACTIVE: 'health:inactive',\n\n PIPELINE_CHANGED: 'pipeline:changed',\n PIPELINE_NOTIFY: 'pipeline:notify',\n\n COMMIT_DETECTED: 'commit:detected',\n\n PROCESS_SPAWNED: 'spawn:created',\n PROCESS_EXITED: 'spawn:exited',\n\n RESPAWN_NEEDED: 'respawn:needed',\n\n STATE_CHANGED: 'dashboard:changed',\n} as const;\n\nexport type CollabEventName = typeof CollabEvents[keyof typeof CollabEvents];\n","import { EventEmitter } from 'events';\nimport { execFileSync } from 'child_process';\nimport { CollabEvents } from './events.js';\n\nexport class CommitWatcher extends EventEmitter {\n private baseline: string | null = null;\n private timer: ReturnType<typeof setInterval> | null = null;\n private readonly autoCompletedIssues = new Set<string>();\n\n start(): void {\n this.baseline = this.getLatestCommit();\n this.timer = setInterval(() => this.checkOnce(), 30_000);\n }\n\n stop(): void {\n if (this.timer) { clearInterval(this.timer); this.timer = null; }\n }\n\n checkOnce(): void {\n const current = this.getLatestCommit();\n if (!current || !this.baseline) {\n this.baseline = current;\n return;\n }\n if (current !== this.baseline) {\n const info = this.getCommitInfo(current);\n this.baseline = current;\n this.emit(CollabEvents.COMMIT_DETECTED, info);\n }\n }\n\n isAutoCompleted(issueId: string): boolean {\n return this.autoCompletedIssues.has(issueId);\n }\n\n markAutoCompleted(issueId: string): void {\n this.autoCompletedIssues.add(issueId);\n }\n\n private getLatestCommit(): string | null {\n try {\n const result = execFileSync('git', ['rev-parse', 'HEAD']);\n return result.toString().trim();\n } catch { return null; }\n }\n\n private getCommitInfo(hash: string): { hash: string; message: string; files: string[] } {\n try {\n const message = execFileSync('git', ['log', '-1', '--format=%s', hash]).toString().trim();\n const files = execFileSync('git', ['diff-tree', '--no-commit-id', '--name-only', '-r', hash]).toString().trim().split('\\n').filter(Boolean);\n return { hash, message, files };\n } catch { return { hash, message: '', files: [] }; }\n }\n}\n","/**\n * StatusTracker\n * Owns peer status maps, local status, and activity tracking.\n * Extracted from P2PNode God Object.\n * @module infrastructure/p2p/status-tracker\n */\n\nimport type { StatusReport } from '../../shared/types/collab-client.interface.js';\n\nexport interface PeerActivitySummary {\n lastActivity?: string;\n lastMessage?: string;\n}\n\nexport class StatusTracker {\n private readonly peerStatuses = new Map<string, StatusReport & { updatedAt: string }>();\n private localStatus: StatusReport = { status: 'idle', summary: 'Just joined' };\n private readonly peerLastActivity = new Map<string, string>();\n private readonly peerLastMessage = new Map<string, string>();\n\n constructor() {}\n\n report(status: StatusReport): void {\n this.localStatus = status;\n }\n\n getLocalStatus(): StatusReport {\n return this.localStatus;\n }\n\n updatePeerStatus(nodeId: string, report: StatusReport & { updatedAt?: string }): void {\n this.peerStatuses.set(nodeId, {\n status: report.status,\n summary: report.summary,\n ...(report.progress !== undefined ? { progress: report.progress } : {}),\n ...(report.blocker !== undefined ? { blocker: report.blocker } : {}),\n updatedAt: report.updatedAt ?? new Date().toISOString(),\n });\n }\n\n getPeerStatus(nodeId: string): (StatusReport & { updatedAt: string }) | undefined {\n return this.peerStatuses.get(nodeId);\n }\n\n updateActivity(nodeId: string, message?: string): void {\n this.peerLastActivity.set(nodeId, new Date().toISOString());\n if (message !== undefined) {\n this.peerLastMessage.set(nodeId, message);\n }\n }\n\n getLastActivity(nodeId: string): string | undefined {\n return this.peerLastActivity.get(nodeId);\n }\n\n getLastMessage(nodeId: string): string | undefined {\n return this.peerLastMessage.get(nodeId);\n }\n\n getPeerSummaries(): Map<string, PeerActivitySummary> {\n const result = new Map<string, PeerActivitySummary>();\n const allNodeIds = new Set([\n ...this.peerStatuses.keys(),\n ...this.peerLastActivity.keys(),\n ]);\n for (const nodeId of allNodeIds) {\n result.set(nodeId, {\n lastActivity: this.peerLastActivity.get(nodeId),\n lastMessage: this.peerLastMessage.get(nodeId),\n });\n }\n return result;\n }\n\n cleanup(nodeId: string): void {\n this.peerStatuses.delete(nodeId);\n this.peerLastActivity.delete(nodeId);\n this.peerLastMessage.delete(nodeId);\n }\n}\n","import { EventEmitter } from 'events';\nimport type { RespawnRule } from './types.js';\n\nexport class RespawnService extends EventEmitter {\n private rules: RespawnRule[] = [];\n private readonly retries = new Map<string, number>();\n private readonly lastRespawnAt = new Map<string, number>();\n\n setRules(rules: RespawnRule[]): void {\n this.rules = rules;\n }\n\n getRules(): RespawnRule[] {\n return this.rules;\n }\n\n shouldRespawn(_nodeId: string, _peer: { name: string; role: string }): { respawn: false } {\n // Auto-respawn is currently disabled (was early return in handlePeerDisconnect)\n // Will be activated in a future sprint\n return { respawn: false };\n }\n\n recordRespawn(role: string): void {\n this.retries.set(role, (this.retries.get(role) ?? 0) + 1);\n this.lastRespawnAt.set(role, Date.now());\n }\n}\n","/**\n * PipelineManager\n * Owns issue pipeline state, persistence, version tracking, and TTL cleanup.\n * Extracted from P2PNode God Object.\n * @module infrastructure/p2p/pipeline-manager\n */\n\nimport { EventEmitter } from 'events';\nimport { writeFileSync, readFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { CollabEvents } from './events.js';\nimport type { IssueState, IssueStatus } from '../../shared/types/collab-client.interface.js';\nimport type { P2PIssueUpdateMsg } from './p2p-message-protocol.js';\n\nexport interface PipelineManagerOptions {\n dataDir: string;\n broadcastAll: (msg: any) => void;\n callerName?: string;\n}\n\nexport class PipelineManager extends EventEmitter {\n private readonly state = new Map<string, IssueState>();\n private dirty = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly dataDir: string;\n private readonly broadcastAll: (msg: any) => void;\n private callerName: string;\n\n constructor(opts: PipelineManagerOptions) {\n super();\n this.dataDir = opts.dataDir;\n this.broadcastAll = opts.broadcastAll;\n this.callerName = opts.callerName ?? 'unknown';\n }\n\n setCallerName(name: string): void {\n this.callerName = name;\n }\n\n // ---------------------------------------------------------------------------\n // Public: issue CRUD\n // ---------------------------------------------------------------------------\n\n updateIssue(issueId: string, status: IssueStatus, title?: string, assignee?: string, tester?: string): void {\n const existing = this.state.get(issueId);\n const now = new Date().toISOString();\n\n // Assignee protection: preserve existing assignee unless explicitly overridden\n let resolvedAssignee: string | undefined;\n if (assignee) {\n resolvedAssignee = assignee;\n } else if (status === 'in_progress' && !existing?.assignee) {\n resolvedAssignee = this.callerName;\n } else {\n resolvedAssignee = existing?.assignee;\n }\n\n // Tester protection: same pattern\n let resolvedTester: string | undefined;\n if (tester) {\n resolvedTester = tester;\n } else if (status === 'testing' && !existing?.tester) {\n resolvedTester = this.callerName;\n } else {\n resolvedTester = existing?.tester;\n }\n\n const version = (existing?.version || 0) + 1;\n\n const issueState: IssueState = {\n issueId,\n title: title || existing?.title || issueId,\n status,\n ...(resolvedAssignee ? { assignee: resolvedAssignee } : {}),\n ...(resolvedTester ? { tester: resolvedTester } : {}),\n assignedAt: existing?.assignedAt || now,\n updatedAt: now,\n version,\n history: [...(existing?.history || []), { status, by: this.callerName, at: now }],\n };\n\n this.state.set(issueId, issueState);\n\n // Broadcast to all peers\n const msg: P2PIssueUpdateMsg = {\n type: 'P2P_ISSUE_UPDATE',\n issueId,\n title: issueState.title,\n status,\n ...(resolvedAssignee ? { assignee: resolvedAssignee } : {}),\n ...(resolvedTester ? { tester: resolvedTester } : {}),\n updatedBy: this.callerName,\n version,\n timestamp: now,\n };\n\n this.broadcastAll(msg);\n\n // Emit for pipeline notification handling\n this.emit(CollabEvents.PIPELINE_CHANGED, { issueId, status, state: issueState });\n\n this.schedulePersist();\n }\n\n listIssues(): IssueState[] {\n return [...this.state.values()].sort((a, b) => a.issueId.localeCompare(b.issueId));\n }\n\n // ---------------------------------------------------------------------------\n // Public: peer-related queries\n // ---------------------------------------------------------------------------\n\n getOrphanedIssues(assigneeOrNodeId: string): IssueState[] {\n return [...this.state.values()].filter(\n i => i.assignee === assigneeOrNodeId && i.status === 'in_progress',\n );\n }\n\n getAssignedIssueForPeer(peerName: string): IssueState | undefined {\n return [...this.state.values()].find(\n i => i.assignee === peerName && i.status === 'in_progress',\n );\n }\n\n // ---------------------------------------------------------------------------\n // Public: remote sync (from peer messages)\n // ---------------------------------------------------------------------------\n\n /**\n * Merge a remote issue update (from P2P_ISSUE_UPDATE message).\n * Rejects stale updates (version <= existing).\n */\n mergeRemoteUpdate(msg: P2PIssueUpdateMsg): boolean {\n const existing = this.state.get(msg.issueId);\n if (existing && existing.version >= msg.version) return false; // stale, drop\n\n this.state.set(msg.issueId, {\n issueId: msg.issueId,\n title: msg.title,\n status: msg.status,\n ...(msg.assignee ? { assignee: msg.assignee } : {}),\n ...(msg.tester ? { tester: msg.tester } : {}),\n assignedAt: existing?.assignedAt || msg.timestamp,\n updatedAt: msg.timestamp,\n version: msg.version,\n history: [...(existing?.history || []), { status: msg.status, by: msg.updatedBy, at: msg.timestamp }],\n });\n\n this.schedulePersist();\n return true;\n }\n\n /**\n * Build sync response payload (for P2P_ISSUE_SYNC_RES).\n * Returns P2PIssueUpdateMsg[] for all current state.\n */\n buildSyncResponse(): P2PIssueUpdateMsg[] {\n const issues: P2PIssueUpdateMsg[] = [];\n for (const issueState of this.state.values()) {\n issues.push({\n type: 'P2P_ISSUE_UPDATE',\n issueId: issueState.issueId,\n title: issueState.title,\n status: issueState.status,\n ...(issueState.assignee ? { assignee: issueState.assignee } : {}),\n ...(issueState.tester ? { tester: issueState.tester } : {}),\n updatedBy: 'sync',\n version: issueState.version,\n timestamp: issueState.updatedAt,\n });\n }\n return issues;\n }\n\n // ---------------------------------------------------------------------------\n // Public: orphan reassignment (peer disconnect)\n // ---------------------------------------------------------------------------\n\n /**\n * Reassign in_progress issues assigned to a dead peer back to 'assigned' with no assignee.\n * Returns array of orphaned issueIds.\n */\n reassignOrphans(deadPeerName: string): string[] {\n const orphanedIds: string[] = [];\n const now = new Date().toISOString();\n\n for (const [issueId, issueState] of this.state) {\n if (issueState.status === 'in_progress' && issueState.assignee === deadPeerName) {\n orphanedIds.push(issueId);\n\n const version = (issueState.version || 0) + 1;\n const { assignee: _removed, ...rest } = issueState;\n const updated: IssueState = {\n ...rest,\n status: 'assigned',\n updatedAt: now,\n version,\n history: [...(issueState.history || []), { status: 'assigned', by: 'system', at: now }],\n };\n this.state.set(issueId, updated);\n\n // Broadcast the change\n const msg: P2PIssueUpdateMsg = {\n type: 'P2P_ISSUE_UPDATE',\n issueId,\n title: updated.title,\n status: 'assigned',\n updatedBy: 'system',\n version,\n timestamp: now,\n };\n this.broadcastAll(msg);\n }\n }\n\n if (orphanedIds.length > 0) {\n this.schedulePersist();\n }\n\n return orphanedIds;\n }\n\n // ---------------------------------------------------------------------------\n // Public: persistence\n // ---------------------------------------------------------------------------\n\n load(): void {\n try {\n const filePath = join(this.dataDir, 'pipeline.json');\n const raw = readFileSync(filePath, 'utf-8');\n const states: IssueState[] = JSON.parse(raw);\n const DONE_TTL_MS = 24 * 60 * 60 * 1000; // drop done issues older than 24h\n const now = Date.now();\n let loaded = 0;\n let dropped = 0;\n for (const state of states) {\n if (state.status === 'done' && state.updatedAt) {\n const age = now - new Date(state.updatedAt).getTime();\n if (age > DONE_TTL_MS) { dropped++; continue; }\n }\n this.state.set(state.issueId, state);\n loaded++;\n }\n console.error(`[p2p] Pipeline loaded: ${loaded} issues from data/pipeline.json${dropped > 0 ? ` (${dropped} stale done dropped)` : ''}`);\n } catch (err) {\n // Expected on first run (no file) — only log unexpected errors\n if (err instanceof Error && !err.message.includes('ENOENT')) {\n console.error(`[p2p] Pipeline load failed: ${err.message}`);\n }\n }\n }\n\n schedulePersist(): void {\n this.dirty = true;\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n if (!this.dirty) return;\n this.dirty = false;\n try {\n mkdirSync(this.dataDir, { recursive: true });\n const states = [...this.state.values()];\n writeFileSync(join(this.dataDir, 'pipeline.json'), JSON.stringify(states, null, 2));\n } catch (err) {\n console.error(`[p2p] Pipeline persist failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }, 5_000);\n }\n\n stop(): void {\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n if (this.dirty) {\n this.persistNow();\n }\n }\n\n get size(): number {\n return this.state.size;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private persistNow(): void {\n this.dirty = false;\n try {\n mkdirSync(this.dataDir, { recursive: true });\n const states = [...this.state.values()];\n writeFileSync(join(this.dataDir, 'pipeline.json'), JSON.stringify(states, null, 2));\n } catch (err) {\n console.error(`[p2p] Pipeline persist failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n}\n","/**\n * HeartbeatMonitor\n * Owns PING/PONG heartbeat, zombie detection, inactivity alerts, and role reminders.\n * Extracted from P2PNode God Object.\n * @module infrastructure/p2p/heartbeat-monitor\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport type { P2PMsg, P2PSendMsg } from './p2p-message-protocol.js';\n\n// ── Constants ──────────────────────────────────────────────────────────────────\n\nconst PING_INTERVAL_MS = 30_000;\nconst ZOMBIE_THRESHOLD_MS = 90_000;\nconst STARTUP_GRACE_MS = 60_000;\n\nconst INACTIVITY_WARN_MS = 30 * 60 * 1000; // 30 min → remind peer\nconst INACTIVITY_ALERT_MS = 45 * 60 * 1000; // 45 min → alert manager\nconst MONITOR_INTERVAL_MS = 5 * 60 * 1000; // check every 5min\nconst PIPELINE_IDLE_MS = 15 * 60 * 1000; // 15 min → pipeline alert\n\nconst REMINDER_INTERVAL_MS = 15 * 60 * 1000; // 15 min role reminder\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface HeartbeatDeps {\n localNodeId: string;\n getConnectedPeerIds: () => string[];\n sendToNode: (nodeId: string, msg: P2PMsg) => void;\n broadcastAll: (msg: P2PMsg, exclude?: string) => void;\n getAssignedIssueForPeer: (peerName: string) => { issueId: string; status: string } | undefined;\n localIdentity: () => { name: string; role: string; team?: string } | null;\n getSessionStartedAt?: () => Date;\n getPeerIdentity?: (nodeId: string) => { name: string; role: string } | undefined;\n getLastActivity?: (nodeId: string) => string | undefined;\n getPeerLastSeenAt?: (nodeId: string) => string | undefined;\n getPidForNode?: (nodeId: string) => number | null;\n closeConnection?: (nodeId: string) => void;\n log?: (event: string, data: Record<string, unknown>) => void;\n}\n\nexport interface HealthReport {\n heartbeatCycle: number;\n zombies: string[]; // nodeIds with no pong beyond threshold\n pongCount: number; // number of peers with recorded pong\n killedZombies: string[]; // nodeIds where we sent SIGTERM\n}\n\n// ── HeartbeatMonitor ───────────────────────────────────────────────────────────\n\nexport class HeartbeatMonitor {\n private readonly deps: HeartbeatDeps;\n\n // PING/PONG state\n private readonly peerLastPong = new Map<string, number>(); // nodeId → Date.now()\n private heartbeatCycle = 0;\n private readonly killedZombies = new Set<string>();\n\n // Inactivity state\n private readonly lastWarnedAt = new Map<string, number>();\n private readonly lastAlertedAt = new Map<string, number>();\n private readonly lastPipelineAlertedAt = new Map<string, number>();\n\n // Timers\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private inactivityTimer: ReturnType<typeof setInterval> | null = null;\n private roleReminderTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(deps: HeartbeatDeps) {\n this.deps = deps;\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Leader election: node with lowest nodeId among all connected nodes.\n */\n isLeader(): boolean {\n const localRole = this.deps.localIdentity?.()?.role;\n if (localRole === 'observer') return false;\n\n const allNodeIds = [this.deps.localNodeId, ...this.deps.getConnectedPeerIds()]\n .filter(id => {\n if (id === this.deps.localNodeId) return true;\n return this.deps.getPeerIdentity?.(id)?.role !== 'observer';\n })\n .sort();\n return allNodeIds[0] === this.deps.localNodeId;\n }\n\n /**\n * Record a PONG from a peer. Called from message handler.\n */\n recordPong(nodeId: string): void {\n this.peerLastPong.set(nodeId, Date.now());\n }\n\n /**\n * Get the last pong timestamp for a peer (used by P2PNode for initial pong on HELLO).\n */\n getLastPong(nodeId: string): number | undefined {\n return this.peerLastPong.get(nodeId);\n }\n\n /**\n * Clean up state for a disconnected peer.\n */\n onPeerDisconnected(nodeId: string): void {\n this.peerLastPong.delete(nodeId);\n this.lastWarnedAt.delete(nodeId);\n this.lastAlertedAt.delete(nodeId);\n this.lastPipelineAlertedAt.delete(nodeId);\n }\n\n /**\n * Start all timers (heartbeat, inactivity, role reminder).\n */\n start(): void {\n this.startHeartbeat();\n this.startInactivityMonitor();\n this.startRoleReminder();\n }\n\n /**\n * Stop all timers cleanly.\n */\n stop(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n if (this.inactivityTimer) {\n clearInterval(this.inactivityTimer);\n this.inactivityTimer = null;\n }\n if (this.roleReminderTimer) {\n clearInterval(this.roleReminderTimer);\n this.roleReminderTimer = null;\n }\n }\n\n /**\n * Get health report: current zombies, pong count, heartbeat cycle, killed zombies.\n */\n getHealthReport(): HealthReport {\n const now = Date.now();\n const zombies: string[] = [];\n for (const [nodeId, lastPong] of this.peerLastPong) {\n if (now - lastPong > ZOMBIE_THRESHOLD_MS) {\n zombies.push(nodeId);\n }\n }\n return {\n heartbeatCycle: this.heartbeatCycle,\n zombies,\n pongCount: this.peerLastPong.size,\n killedZombies: [...this.killedZombies],\n };\n }\n\n // ── Heartbeat: PING/PONG + Zombie Detection ───────────────────────────────\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n const peerIds = this.deps.getConnectedPeerIds();\n\n // Send PING to all connected peers\n let pingSent = 0;\n for (const nodeId of peerIds) {\n try {\n this.deps.sendToNode(nodeId, { type: 'P2P_PING' });\n pingSent++;\n } catch {\n // safeSend failed, skip\n }\n }\n\n // Check for zombies\n let zombieCount = 0;\n const startupElapsed = this.deps.getSessionStartedAt\n ? now - this.deps.getSessionStartedAt().getTime()\n : now; // if no session tracker, assume long-running\n\n for (const nodeId of peerIds) {\n const lastPong = this.peerLastPong.get(nodeId);\n if (lastPong && now - lastPong > ZOMBIE_THRESHOLD_MS) {\n const peer = this.deps.getPeerIdentity?.(nodeId);\n console.error(`[p2p] [ZOMBIE] ${peer?.name ?? nodeId} — ${ZOMBIE_THRESHOLD_MS / 1000}s cevapsiz, baglanti kapatiliyor`);\n\n // Close the WebSocket connection for the zombie peer\n this.deps.closeConnection?.(nodeId);\n zombieCount++;\n\n // Kill OS process if we're the leader and grace period passed\n if (startupElapsed > STARTUP_GRACE_MS && this.isLeader() && !this.killedZombies.has(nodeId)) {\n this.killedZombies.add(nodeId);\n const pid = this.deps.getPidForNode?.(nodeId) ?? null;\n if (pid) {\n try {\n process.kill(pid, 'SIGTERM');\n console.error(`[p2p] [ZOMBIE_KILLED] ${peer?.name ?? nodeId.slice(0, 8)} pid=${pid} SIGTERM sent`);\n this.deps.log?.('ZOMBIE_KILLED', {\n peer: peer?.name ?? nodeId.slice(0, 8),\n nodeId: nodeId.slice(0, 8),\n pid,\n silentForMs: now - lastPong,\n });\n } catch {\n // process may have already exited\n }\n }\n }\n }\n }\n\n this.heartbeatCycle++;\n if (zombieCount > 0 || this.heartbeatCycle % 5 === 0) {\n this.deps.log?.('HEARTBEAT_SUMMARY', { pingSent, pongReceived: this.peerLastPong.size, zombies: zombieCount });\n }\n }, PING_INTERVAL_MS);\n }\n\n // ── Inactivity Monitor ─────────────────────────────────────────────────────\n\n private startInactivityMonitor(): void {\n this.inactivityTimer = setInterval(() => {\n const peerIds = this.deps.getConnectedPeerIds();\n if (peerIds.length === 0) return;\n\n // Only leader sends reminders\n if (!this.isLeader()) return;\n\n const now = Date.now();\n\n for (const nodeId of peerIds) {\n const peer = this.deps.getPeerIdentity?.(nodeId);\n if (!peer) continue;\n\n const lastActivityIso = this.deps.getLastActivity?.(nodeId)\n ?? this.deps.getPeerLastSeenAt?.(nodeId)\n ?? new Date().toISOString();\n const elapsed = now - new Date(lastActivityIso).getTime();\n const lastWarned = this.lastWarnedAt.get(nodeId) || 0;\n const lastAlerted = this.lastAlertedAt.get(nodeId) || 0;\n\n // 15min: pipeline-aware alert — fires if peer has an in_progress issue\n if (elapsed >= PIPELINE_IDLE_MS) {\n const activeIssue = this.deps.getAssignedIssueForPeer(peer.name);\n if (activeIssue) {\n const lastPipelineAlert = this.lastPipelineAlertedAt.get(nodeId) || 0;\n if (now - lastPipelineAlert > PIPELINE_IDLE_MS) {\n const alertMsg = `${peer.name} ${PIPELINE_IDLE_MS / 60_000}dk'dir sessiz, Issue ${activeIssue.issueId} (in_progress) devam ediyor mu?`;\n this.sendToProjectManagers(alertMsg);\n this.lastPipelineAlertedAt.set(nodeId, now);\n continue; // skip normal idle checks for this peer\n }\n }\n }\n\n // 45min: alert manager only (check first — higher severity)\n if (elapsed >= INACTIVITY_ALERT_MS && now - lastAlerted > INACTIVITY_ALERT_MS) {\n const alertMsg = `${peer.name} (${peer.role}) ${INACTIVITY_ALERT_MS / 60_000}dk'dir sessiz. health_check veya observe ile kontrol et.`;\n this.sendToProjectManagers(alertMsg);\n this.lastAlertedAt.set(nodeId, now);\n }\n // 30min: remind the silent peer (else if — don't double-fire with 45min alert)\n else if (elapsed >= INACTIVITY_WARN_MS && now - lastWarned > INACTIVITY_WARN_MS) {\n const msg = `${peer.name}, ${Math.round(elapsed / 60000)}dk'dir aktivite yok. Durumunu report_status ile bildir veya lead'e mesaj gonder.`;\n this.deps.sendToNode(nodeId, this.buildSystemMsg(msg));\n this.lastWarnedAt.set(nodeId, now);\n }\n }\n }, MONITOR_INTERVAL_MS);\n }\n\n // ── Role Reminder ──────────────────────────────────────────────────────────\n\n private startRoleReminder(): void {\n this.roleReminderTimer = setInterval(() => {\n if (!this.isLeader()) return;\n\n const peerIds = this.deps.getConnectedPeerIds();\n\n // Find lead name\n let leadName = 'lead';\n for (const nodeId of peerIds) {\n const info = this.deps.getPeerIdentity?.(nodeId);\n if (info?.role === 'team-lead') { leadName = info.name; break; }\n }\n\n const workerRoles = new Set(['developer', 'qa-engineer', 'devops-engineer']);\n for (const nodeId of peerIds) {\n const peerInfo = this.deps.getPeerIdentity?.(nodeId);\n if (!peerInfo || !workerRoles.has(peerInfo.role)) continue;\n\n const activeIssue = this.deps.getAssignedIssueForPeer(peerInfo.name);\n const issueText = activeIssue\n ? ` Issue ${activeIssue.issueId} uzerinde calisiyorsun (in_progress).`\n : ' Su an atanmis gorevin yok.';\n const reminder = `DURUM KONTROLU: Sen ${peerInfo.role}'sin.${issueText} Lead: ${leadName}. Tamamlayinca update_issue + lead'e bildir.`;\n\n this.deps.sendToNode(nodeId, this.buildSystemMsg(reminder));\n this.deps.log?.('ROLE_REMINDER', {\n peer: peerInfo.name, hasActiveIssue: !!activeIssue,\n });\n }\n }, REMINDER_INTERVAL_MS);\n }\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n private sendToProjectManagers(content: string): void {\n const peerIds = this.deps.getConnectedPeerIds();\n for (const targetId of peerIds) {\n const targetInfo = this.deps.getPeerIdentity?.(targetId);\n if (targetInfo?.role === 'project-manager') {\n this.deps.sendToNode(targetId, this.buildSystemMsg(content));\n }\n }\n }\n\n private buildSystemMsg(content: string): P2PSendMsg {\n return {\n type: 'P2P_SEND',\n messageId: uuidv4(),\n fromNodeId: this.deps.localNodeId,\n fromName: 'system',\n fromRole: 'monitor',\n content,\n format: 'plain',\n expectReply: false,\n timestamp: new Date().toISOString(),\n };\n }\n}\n","/**\n * P2P Wire Message Protocol\n * Defines messages exchanged directly between P2P nodes.\n * @module infrastructure/p2p/p2p-message-protocol\n */\n\nimport type { MessageFormat } from '../../domain/value-objects/message-content.vo.js';\nimport type { IssueStatus } from '../../shared/types/collab-client.interface.js';\n\n// First message sent by the connecting peer to identify itself\nexport interface P2PHelloMsg {\n type: 'P2P_HELLO';\n nodeId: string; // UUID routing key (new, primary)\n fromTeam: string; // = name, kept for backward compat\n fromMemberId: string; // = nodeId, kept for tiebreaker backward compat\n name: string; // display name (new)\n role: string; // new\n team?: string; // new, optional\n sessionId?: string; // Claude Code session ID for resume-on-respawn\n}\n\n// Questioner → Answerer: send a question\nexport interface P2PAskMsg {\n type: 'P2P_ASK';\n questionId: string;\n fromMemberId: string;\n fromTeam: string;\n toTeam: string;\n content: string;\n format: MessageFormat;\n requestId: string;\n}\n\n// Answerer → Questioner: acknowledge the question\nexport interface P2PAskAckMsg {\n type: 'P2P_ASK_ACK';\n questionId: string;\n requestId: string;\n}\n\n// Questioner → Answerer: poll for answer\nexport interface P2PGetAnswerMsg {\n type: 'P2P_GET_ANSWER';\n questionId: string;\n requestId: string;\n}\n\n// Answerer → Questioner: deliver the answer (push or in response to GET_ANSWER)\nexport interface P2PAnswerMsg {\n type: 'P2P_ANSWER';\n questionId: string;\n content: string;\n format: MessageFormat;\n answeredAt: string;\n fromTeam: string;\n fromMemberId: string;\n requestId?: string;\n}\n\n// Answerer → Questioner: answer not ready yet\nexport interface P2PAnswerPendingMsg {\n type: 'P2P_ANSWER_PENDING';\n questionId: string;\n requestId: string;\n}\n\nexport interface P2PPingMsg {\n type: 'P2P_PING';\n}\n\nexport interface P2PPongMsg {\n type: 'P2P_PONG';\n}\n\nexport interface P2PErrorMsg {\n type: 'P2P_ERROR';\n code: string;\n message: string;\n}\n\nexport interface P2PObserveReqMsg {\n type: 'P2P_OBSERVE_REQ';\n requestId: string;\n nodeId: string;\n name: string;\n lines: number;\n}\n\nexport interface P2PObserveResMsg {\n type: 'P2P_OBSERVE_RES';\n requestId: string;\n nodeId: string;\n output: string;\n truncated: boolean;\n}\n\nexport interface P2PBroadcastMsg {\n type: 'P2P_BROADCAST';\n requestId: string;\n nodeId: string;\n name: string;\n role: string;\n content: string;\n format: MessageFormat;\n timestamp: string;\n}\n\nexport interface P2PStatusUpdateMsg {\n type: 'P2P_STATUS_UPDATE';\n requestId: string;\n nodeId: string;\n name: string;\n role: string;\n status: 'working' | 'blocked' | 'idle' | 'reviewing' | 'testing' | 'deploying';\n summary: string;\n progress?: number;\n blocker?: string;\n timestamp: string;\n}\n\nexport interface P2PSendMsg {\n type: 'P2P_SEND';\n messageId: string;\n fromNodeId: string;\n fromName: string;\n fromRole: string;\n content: string;\n format: MessageFormat;\n expectReply: boolean;\n timestamp: string;\n}\n\nexport interface P2PIssueUpdateMsg {\n type: 'P2P_ISSUE_UPDATE';\n issueId: string;\n title: string;\n status: IssueStatus;\n assignee?: string;\n tester?: string;\n updatedBy: string;\n version: number;\n timestamp: string;\n}\n\nexport interface P2PIssueSyncReqMsg {\n type: 'P2P_ISSUE_SYNC_REQ';\n requestId: string;\n nodeId: string;\n}\n\nexport interface P2PIssueSyncResMsg {\n type: 'P2P_ISSUE_SYNC_RES';\n requestId: string;\n issues: P2PIssueUpdateMsg[];\n}\n\nexport type P2PMsg =\n | P2PHelloMsg\n | P2PAskMsg\n | P2PAskAckMsg\n | P2PGetAnswerMsg\n | P2PAnswerMsg\n | P2PAnswerPendingMsg\n | P2PPingMsg\n | P2PPongMsg\n | P2PErrorMsg\n | P2PObserveReqMsg\n | P2PObserveResMsg\n | P2PBroadcastMsg\n | P2PStatusUpdateMsg\n | P2PSendMsg\n | P2PIssueUpdateMsg\n | P2PIssueSyncReqMsg\n | P2PIssueSyncResMsg;\n\nexport type { IssueStatus } from '../../shared/types/collab-client.interface.js';\n\nexport function serializeP2PMsg(msg: P2PMsg): string {\n return JSON.stringify(msg);\n}\n\nexport function parseP2PMsg(data: string): P2PMsg {\n return JSON.parse(data) as P2PMsg;\n}\n","/**\n * MessageRouter\n * Owns protocol dispatch, ask/reply/send/broadcast, injectionQueue integration,\n * sentMessage cleanup timer, and pending handler management.\n * Extracted from P2PNode God Object.\n * @module infrastructure/p2p/message-router\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { CollabEvents } from './events.js';\nimport type { WebSocket } from 'ws';\nimport type { MessageFormat } from '../../domain/value-objects/message-content.vo.js';\nimport type {\n CheckAnswerResult,\n CheckRepliesResult,\n HistoryEntry,\n InboxResult,\n SentMessage,\n SentMessageReply,\n PeerInfo,\n} from '../../shared/types/collab-client.interface.js';\nimport type {\n P2PMsg,\n P2PAskMsg,\n P2PAskAckMsg,\n P2PGetAnswerMsg,\n P2PAnswerMsg,\n P2PAnswerPendingMsg,\n P2PBroadcastMsg,\n P2PStatusUpdateMsg,\n P2PSendMsg,\n} from './p2p-message-protocol.js';\nimport { serializeP2PMsg } from './p2p-message-protocol.js';\nimport type { CollabLogger } from '../logging/collab-logger.js';\n\n// ── Internal types ──────────────────────────────────────────────────────────\n\ninterface IncomingQuestion {\n questionId: string;\n fromTeam: string;\n fromMemberId: string;\n content: string;\n format: MessageFormat;\n createdAt: Date;\n ws: WebSocket;\n answered: boolean;\n answerContent?: string;\n answerFormat?: MessageFormat;\n}\n\ninterface ReceivedAnswer {\n content: string;\n format: MessageFormat;\n answeredAt: string;\n fromTeam: string;\n fromMemberId: string;\n}\n\n// ── Dependency injection ────────────────────────────────────────────────────\n\nexport interface MessageRouterDeps {\n localNodeId: string;\n sendToNode: (nodeId: string, msg: P2PMsg) => void;\n broadcastAll: (msg: P2PMsg, exclude?: string) => void;\n injectionQueue: {\n enqueue: (entry: any) => void;\n setLogger: (logger: any) => void;\n notifyReplied: () => void;\n };\n localIdentity: () => { name: string; role: string; team?: string } | null;\n getPeerIdentity?: (nodeId: string) => PeerInfo | { name: string; role: string } | undefined;\n updateActivity?: (nodeId: string, message?: string) => void;\n pushDashboardState?: () => void;\n pushMessageEvent?: (fromNodeId: string, toNodeId: string, type: 'ask' | 'reply' | 'broadcast' | 'send') => void;\n logger?: CollabLogger | null;\n}\n\n// ── MessageRouter ───────────────────────────────────────────────────────────\n\nexport class MessageRouter extends EventEmitter {\n private readonly deps: MessageRouterDeps;\n\n // Questions we received from remote peers (our inbox)\n private readonly incomingQuestions = new Map<string, IncomingQuestion>();\n\n // Answers we received for questions we asked\n private readonly receivedAnswers = new Map<string, ReceivedAnswer>();\n\n // Sent messages for non-blocking send (tracked for check_replies)\n private readonly sentMessages = new Map<string, SentMessage>();\n\n // Questions we sent — for history\n private readonly sentQuestions = new Map<string, { toPeer: string; content: string; askedAt: string }>();\n\n // Maps questionId → remote peer nodeId\n private readonly questionToNodeId = new Map<string, string>();\n\n // Pending response handlers (used by waitForResponse in P2PNode)\n private readonly pendingHandlers = new Set<(msg: P2PMsg) => void>();\n\n // TTL cleanup timer for sentMessages (30min TTL, 5min interval)\n private sentMessageCleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(deps: MessageRouterDeps) {\n super();\n this.deps = deps;\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────────\n\n start(): void {\n if (this.sentMessageCleanupTimer) return;\n this.sentMessageCleanupTimer = setInterval(() => {\n const cutoff = Date.now() - 30 * 60 * 1000;\n for (const [id, msg] of this.sentMessages) {\n if (new Date(msg.sentAt).getTime() < cutoff) {\n this.sentMessages.delete(id);\n }\n }\n }, 5 * 60 * 1000);\n }\n\n stop(): void {\n if (this.sentMessageCleanupTimer) {\n clearInterval(this.sentMessageCleanupTimer);\n this.sentMessageCleanupTimer = null;\n }\n }\n\n // ── Pending handler management (for waitForResponse) ────────────────────────\n\n addPendingHandler(handler: (msg: P2PMsg) => void): void {\n this.pendingHandlers.add(handler);\n }\n\n removePendingHandler(handler: (msg: P2PMsg) => void): void {\n this.pendingHandlers.delete(handler);\n }\n\n // ── ask (blocking Q→A) ────────────────────────────────────────────────────\n\n ask(toNodeId: string, content: string, format: MessageFormat): string {\n const identity = this.deps.localIdentity();\n if (!identity) throw new Error('Identity not set');\n\n const questionId = uuidv4();\n const requestId = uuidv4();\n\n this.questionToNodeId.set(questionId, toNodeId);\n this.sentQuestions.set(questionId, {\n toPeer: toNodeId,\n content,\n askedAt: new Date().toISOString(),\n });\n\n const msg: P2PAskMsg = {\n type: 'P2P_ASK',\n questionId,\n fromMemberId: this.deps.localNodeId,\n fromTeam: identity.name,\n toTeam: toNodeId,\n content,\n format,\n requestId,\n };\n\n this.deps.sendToNode(toNodeId, msg);\n this.deps.logger?.log('ASK', {\n to: this.deps.getPeerIdentity?.(toNodeId)?.name || toNodeId,\n questionId,\n contentLen: content.length,\n });\n\n return questionId;\n }\n\n // ── checkAnswer ─────────────────────────────────────────────────────────────\n\n checkAnswer(questionId: string): CheckAnswerResult | null {\n const cached = this.receivedAnswers.get(questionId);\n if (cached) {\n return {\n questionId,\n from: { displayName: `${cached.fromTeam} Claude`, teamName: cached.fromTeam },\n content: cached.content,\n format: cached.format,\n answeredAt: cached.answeredAt,\n };\n }\n return null;\n }\n\n // ── reply ───────────────────────────────────────────────────────────────────\n\n reply(questionId: string, content: string, format: MessageFormat): void {\n const question = this.incomingQuestions.get(questionId);\n if (!question) throw new Error(`Question ${questionId} not found in inbox`);\n\n const identity = this.deps.localIdentity();\n if (!identity) throw new Error('Identity not set');\n\n question.answered = true;\n question.answerContent = content;\n question.answerFormat = format;\n\n const answerMsg: P2PAnswerMsg = {\n type: 'P2P_ANSWER',\n questionId,\n content,\n format,\n answeredAt: new Date().toISOString(),\n fromTeam: identity.name,\n fromMemberId: this.deps.localNodeId,\n };\n\n this.safeSendWs(question.ws, answerMsg);\n this.deps.logger?.log('REPLY', { questionId, contentLen: content.length });\n }\n\n // ── getInbox ────────────────────────────────────────────────────────────────\n\n getInbox(): InboxResult {\n const now = Date.now();\n const questions = [...this.incomingQuestions.values()]\n .filter((q) => !q.answered)\n .map((q) => ({\n questionId: q.questionId,\n from: { displayName: `${q.fromTeam} Claude`, teamName: q.fromTeam },\n content: q.content,\n format: q.format,\n status: 'PENDING',\n createdAt: q.createdAt.toISOString(),\n ageMs: now - q.createdAt.getTime(),\n }));\n\n return {\n questions,\n totalCount: questions.length,\n pendingCount: questions.length,\n };\n }\n\n // ── send (non-blocking) ───────────────────────────────────────────────────\n\n send(toNodeId: string, content: string, format: MessageFormat, expectReply: boolean): string {\n const identity = this.deps.localIdentity();\n if (!identity) throw new Error('Identity not set');\n\n const messageId = uuidv4();\n const msg: P2PSendMsg = {\n type: 'P2P_SEND',\n messageId,\n fromNodeId: this.deps.localNodeId,\n fromName: identity.name,\n fromRole: identity.role,\n content,\n format,\n expectReply,\n timestamp: new Date().toISOString(),\n };\n\n this.deps.sendToNode(toNodeId, msg);\n\n const peerInfo = this.deps.getPeerIdentity?.(toNodeId);\n this.sentMessages.set(messageId, {\n messageId,\n to: peerInfo?.name || toNodeId,\n toNodeId,\n content,\n format,\n sentAt: msg.timestamp,\n expectReply,\n delivered: false,\n });\n\n this.deps.updateActivity?.(toNodeId);\n this.deps.pushDashboardState?.();\n this.deps.pushMessageEvent?.(this.deps.localNodeId, toNodeId, 'send');\n this.deps.logger?.log('SEND', {\n to: peerInfo?.name || toNodeId,\n msgId: messageId,\n expectReply,\n contentLen: content.length,\n });\n\n return messageId;\n }\n\n // ── checkReplies ──────────────────────────────────────────────────────────\n\n checkReplies(): CheckRepliesResult {\n const replies: SentMessageReply[] = [];\n const pending: string[] = [];\n\n for (const [id, msg] of this.sentMessages) {\n if (msg.reply && !msg.delivered) {\n replies.push({\n messageId: id,\n from: msg.reply.from,\n content: msg.reply.content,\n receivedAt: msg.reply.receivedAt,\n });\n msg.delivered = true;\n msg.deliveredAt = new Date().toISOString();\n } else if (!msg.reply && msg.expectReply) {\n pending.push(id);\n }\n }\n\n this.deps.logger?.log('CHECK_REPLIES', {\n repliesCount: replies.length,\n pendingCount: pending.length,\n });\n return { replies, pending, totalSent: this.sentMessages.size };\n }\n\n // ── broadcastMessage ──────────────────────────────────────────────────────\n\n broadcastMessage(content: string, format: MessageFormat, _role?: string): void {\n const identity = this.deps.localIdentity();\n\n const requestId = uuidv4();\n const msg: P2PBroadcastMsg = {\n type: 'P2P_BROADCAST',\n requestId,\n nodeId: this.deps.localNodeId,\n name: identity?.name ?? '',\n role: identity?.role ?? '',\n content,\n format,\n timestamp: new Date().toISOString(),\n };\n\n this.deps.broadcastAll(msg);\n this.deps.logger?.log('BROADCAST', {\n role: _role || 'all',\n contentLen: content.length,\n });\n }\n\n // ── getHistory ────────────────────────────────────────────────────────────\n\n getHistory(): HistoryEntry[] {\n const entries: HistoryEntry[] = [];\n\n for (const [questionId, sent] of this.sentQuestions) {\n const answer = this.receivedAnswers.get(questionId);\n const peer = this.deps.getPeerIdentity?.(sent.toPeer);\n entries.push({\n direction: 'sent',\n questionId,\n peer: peer?.name ?? sent.toPeer,\n question: sent.content,\n ...(answer?.content ? { answer: answer.content } : {}),\n askedAt: sent.askedAt,\n ...(answer?.answeredAt ? { answeredAt: answer.answeredAt } : {}),\n });\n }\n\n // Include non-blocking send messages in history\n for (const [messageId, sent] of this.sentMessages) {\n entries.push({\n direction: 'sent',\n questionId: messageId,\n peer: sent.to,\n question: sent.content,\n ...(sent.reply?.content ? { answer: sent.reply.content } : {}),\n askedAt: sent.sentAt,\n ...(sent.reply?.receivedAt ? { answeredAt: sent.reply.receivedAt } : {}),\n });\n }\n\n for (const [questionId, incoming] of this.incomingQuestions) {\n entries.push({\n direction: 'received',\n questionId,\n peer: incoming.fromTeam,\n question: incoming.content,\n ...(incoming.answered && incoming.answerContent ? { answer: incoming.answerContent } : {}),\n askedAt: incoming.createdAt.toISOString(),\n ...(incoming.answered ? { answeredAt: new Date().toISOString() } : {}),\n });\n }\n\n return entries.sort((a, b) => a.askedAt.localeCompare(b.askedAt));\n }\n\n // ── getMessageStats ─────────────────────────────────────────────────────────\n\n getMessageStats() {\n const pending = [...this.sentMessages.values()].filter(m => !m.reply && m.expectReply).length;\n return {\n totalSent: this.sentMessages.size + this.sentQuestions.size,\n totalReceived: this.incomingQuestions.size + this.receivedAnswers.size,\n byType: {\n send: this.sentMessages.size,\n ask: this.sentQuestions.size,\n reply: [...this.incomingQuestions.values()].filter(q => q.answered).length,\n broadcast: 0,\n },\n pendingReplies: pending,\n };\n }\n\n // ── handleMessage (protocol dispatch) ─────────────────────────────────────\n\n /**\n * Handles a P2P message. Returns true if this router handled the message,\n * false if the message type is not owned by MessageRouter (caller should handle).\n */\n handleMessage(ws: WebSocket, msg: P2PMsg): boolean {\n // Dispatch to all pending response handlers first\n for (const handler of this.pendingHandlers) {\n handler(msg);\n }\n\n switch (msg.type) {\n case 'P2P_ASK':\n this.handleIncomingAsk(ws, msg);\n return true;\n\n case 'P2P_GET_ANSWER':\n this.handleGetAnswer(ws, msg);\n return true;\n\n case 'P2P_ANSWER':\n this.handleAnswer(msg);\n return true;\n\n case 'P2P_SEND':\n this.handleIncomingSend(ws, msg);\n return true;\n\n case 'P2P_BROADCAST':\n this.handleBroadcast(ws, msg);\n return true;\n\n case 'P2P_STATUS_UPDATE':\n this.handleStatusUpdate(msg);\n return true;\n\n case 'P2P_ISSUE_UPDATE':\n this.emit(CollabEvents.ISSUE_UPDATED, msg);\n return true;\n\n default:\n // Not our message type — P2PNode handles it\n return false;\n }\n }\n\n // ── Sub-handlers ──────────────────────────────────────────────────────────\n\n private handleIncomingAsk(ws: WebSocket, msg: P2PAskMsg): void {\n this.deps.logger?.log('ASK_RECEIVED', {\n from: msg.fromTeam,\n questionId: msg.questionId,\n contentLen: msg.content.length,\n });\n\n this.incomingQuestions.set(msg.questionId, {\n questionId: msg.questionId,\n fromTeam: msg.fromTeam,\n fromMemberId: msg.fromMemberId,\n content: msg.content,\n format: msg.format,\n createdAt: new Date(),\n ws,\n answered: false,\n });\n\n this.deps.injectionQueue.enqueue({\n questionId: msg.questionId,\n from: {\n displayName: `${msg.fromTeam} Claude`,\n teamName: msg.fromTeam,\n },\n content: msg.content,\n format: msg.format,\n status: 'PENDING',\n createdAt: new Date().toISOString(),\n ageMs: 0,\n });\n\n const ack: P2PAskAckMsg = {\n type: 'P2P_ASK_ACK',\n questionId: msg.questionId,\n requestId: msg.requestId,\n };\n this.safeSendWs(ws, ack);\n\n this.deps.updateActivity?.(msg.fromMemberId, msg.content.slice(0, 80));\n this.deps.pushDashboardState?.();\n this.deps.pushMessageEvent?.(msg.fromMemberId, this.deps.localNodeId, 'ask');\n }\n\n private handleGetAnswer(ws: WebSocket, msg: P2PGetAnswerMsg): void {\n const question = this.incomingQuestions.get(msg.questionId);\n\n if (!question?.answered) {\n const pending: P2PAnswerPendingMsg = {\n type: 'P2P_ANSWER_PENDING',\n questionId: msg.questionId,\n requestId: msg.requestId,\n };\n this.safeSendWs(ws, pending);\n return;\n }\n\n const identity = this.deps.localIdentity();\n const answer: P2PAnswerMsg = {\n type: 'P2P_ANSWER',\n questionId: msg.questionId,\n content: question.answerContent!,\n format: question.answerFormat!,\n answeredAt: new Date().toISOString(),\n fromTeam: identity?.name ?? '',\n fromMemberId: this.deps.localNodeId,\n requestId: msg.requestId,\n };\n this.safeSendWs(ws, answer);\n }\n\n private handleAnswer(msg: P2PAnswerMsg): void {\n if (!this.receivedAnswers.has(msg.questionId)) {\n this.receivedAnswers.set(msg.questionId, {\n content: msg.content,\n format: msg.format,\n answeredAt: msg.answeredAt,\n fromTeam: msg.fromTeam,\n fromMemberId: msg.fromMemberId,\n });\n }\n\n // Update sentMessages for check_replies backward compat\n const sent = this.sentMessages.get(msg.questionId);\n if (sent && !sent.reply) {\n sent.reply = {\n from: msg.fromTeam,\n content: msg.content,\n receivedAt: msg.answeredAt,\n };\n\n // Auto-inject reply into terminal (push-based, no polling needed)\n const replyPeer = this.deps.getPeerIdentity?.(msg.fromMemberId);\n this.deps.injectionQueue.enqueue({\n questionId: `reply:${msg.questionId}`,\n from: {\n displayName: msg.fromTeam,\n teamName: replyPeer?.role ?? msg.fromTeam,\n },\n content: msg.content,\n format: msg.format,\n status: 'PENDING',\n createdAt: msg.answeredAt,\n ageMs: 0,\n fireAndForget: true,\n msgType: 'reply',\n replyToMsgId: msg.questionId,\n });\n\n sent.delivered = true;\n sent.deliveredAt = new Date().toISOString();\n }\n\n this.deps.updateActivity?.(msg.fromMemberId, msg.content.slice(0, 80));\n this.deps.pushDashboardState?.();\n this.deps.pushMessageEvent?.(msg.fromMemberId, this.deps.localNodeId, 'reply');\n }\n\n private handleIncomingSend(ws: WebSocket, msg: P2PSendMsg): void {\n this.deps.logger?.log('SEND_RECEIVED', {\n from: msg.fromName,\n msgId: msg.messageId,\n expectReply: msg.expectReply,\n contentLen: msg.content.length,\n });\n\n if (msg.expectReply) {\n this.incomingQuestions.set(msg.messageId, {\n questionId: msg.messageId,\n fromTeam: msg.fromName,\n fromMemberId: msg.fromNodeId,\n content: msg.content,\n format: msg.format,\n createdAt: new Date(),\n ws,\n answered: false,\n });\n }\n\n this.deps.injectionQueue.enqueue({\n questionId: msg.messageId,\n from: {\n displayName: msg.fromName,\n teamName: msg.fromRole,\n },\n content: msg.content,\n format: msg.format,\n status: 'PENDING',\n createdAt: msg.timestamp,\n ageMs: 0,\n fireAndForget: !msg.expectReply,\n msgType: msg.expectReply ? 'question' : 'info',\n });\n\n this.deps.updateActivity?.(msg.fromNodeId, msg.content.slice(0, 80));\n this.deps.pushDashboardState?.();\n this.deps.pushMessageEvent?.(msg.fromNodeId, this.deps.localNodeId, 'send');\n }\n\n private handleBroadcast(ws: WebSocket, msg: P2PBroadcastMsg): void {\n this.deps.logger?.log('BROADCAST_RECEIVED', {\n from: msg.name,\n role: msg.role,\n contentLen: msg.content.length,\n });\n\n // Register in inbox so reply() works (broadcast = replyable, like ask)\n this.incomingQuestions.set(msg.requestId, {\n questionId: msg.requestId,\n fromTeam: msg.name,\n fromMemberId: msg.nodeId,\n content: msg.content,\n format: msg.format,\n createdAt: new Date(),\n ws,\n answered: false,\n });\n\n this.deps.injectionQueue.enqueue({\n questionId: msg.requestId,\n from: {\n displayName: `${msg.name} (broadcast)`,\n teamName: msg.role,\n },\n content: msg.content,\n format: msg.format,\n status: 'PENDING',\n createdAt: msg.timestamp,\n ageMs: Date.now() - new Date(msg.timestamp).getTime(),\n });\n\n this.deps.updateActivity?.(msg.nodeId, msg.content.slice(0, 80));\n this.deps.pushDashboardState?.();\n this.deps.pushMessageEvent?.(msg.nodeId, 'broadcast', 'broadcast');\n }\n\n private handleStatusUpdate(msg: P2PStatusUpdateMsg): void {\n this.emit(CollabEvents.STATUS_UPDATED, msg);\n this.deps.updateActivity?.(msg.nodeId);\n this.deps.pushDashboardState?.();\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────\n\n private safeSendWs(ws: WebSocket, msg: P2PMsg): boolean {\n if (!ws || (ws as any).readyState !== 1) { // WebSocket.OPEN = 1\n return false;\n }\n try {\n (ws as any).send(serializeP2PMsg(msg));\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * ConnectionManager\n * Owns the WS server lifecycle, peer connection state maps, WS utility methods\n * (safeSend, sendToNode, broadcastToAll), peer registry, handshake (HELLO),\n * auto-connect from discovery, and connection teardown.\n * Emits PEER_CONNECTED / PEER_DISCONNECTED events for orchestrator to react.\n * @module infrastructure/p2p/connection-manager\n */\n\nimport { EventEmitter } from 'events';\nimport { createServer, type Server as HttpServer } from 'http';\nimport { WebSocketServer, WebSocket } from 'ws';\nimport type { PeerInfo } from '../../shared/types/collab-client.interface.js';\nimport type {\n P2PMsg,\n P2PHelloMsg,\n} from './p2p-message-protocol.js';\nimport { serializeP2PMsg, parseP2PMsg } from './p2p-message-protocol.js';\nimport { CollabEvents } from './events.js';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ConnectionManagerOpts {\n nodeId: string;\n log?: (event: string, data: Record<string, unknown>) => void;\n /** Callback for non-connection messages (everything except HELLO, PING, PONG). */\n onMessage?: (ws: WebSocket, msg: P2PMsg) => void;\n /** Multi-module purge callback (ghost cleanup needs statusTracker, heartbeat, spawn etc). */\n purgeNodeId?: (nodeId: string) => void;\n /** Dashboard broadcaster addClient callback for /dashboard upgrade path. */\n addDashboardClient?: (ws: WebSocket) => boolean;\n}\n\nexport interface RegisterPeerData {\n nodeId: string;\n name: string;\n role: string;\n team?: string;\n isLegacy?: boolean;\n}\n\nexport interface PeerConnectedEvent {\n nodeId: string;\n name: string;\n role: string;\n team?: string;\n sessionId?: string;\n isLegacy: boolean;\n ws: WebSocket;\n}\n\nexport interface PeerDisconnectedEvent {\n nodeId: string;\n peer: PeerInfo;\n}\n\n// ── ConnectionManager ──────────────────────────────────────────────────────\n\nexport class ConnectionManager extends EventEmitter {\n private readonly _nodeId: string;\n private readonly _log: ((event: string, data: Record<string, unknown>) => void) | undefined;\n private _onMessage: ((ws: WebSocket, msg: P2PMsg) => void) | undefined;\n private _purgeNodeId: ((nodeId: string) => void) | undefined;\n private _addDashboardClient: ((ws: WebSocket) => boolean) | undefined;\n\n // WS server infrastructure\n private wss: WebSocketServer | null = null;\n private httpServer: HttpServer | null = null;\n private _port = 0;\n\n // Local identity (set externally after joinNetwork)\n private _localIdentity: { name: string; role: string; team?: string } | null = null;\n private _ownSessionId: string | null = null;\n\n // Connections indexed by remote peer nodeId\n private readonly peerConns = new Map<string, WebSocket>();\n // nodeId → peer identity (for resolvePeerByName, display)\n private readonly peerIdentities = new Map<string, PeerInfo>();\n // Reverse lookup: ws → peerNodeId (for cleanup)\n private readonly wsToNodeId = new Map<WebSocket, string>();\n // Track which connections we initiated (for dedup tiebreaker)\n private readonly wsOutgoing = new Set<WebSocket>();\n // Remote IP per connection (for legacy dedup)\n private readonly wsToIp = new Map<WebSocket, string>();\n // nodeId → Claude session ID\n private readonly peerSessionIds = new Map<string, string>();\n\n constructor(opts: ConnectionManagerOpts) {\n super();\n this._nodeId = opts.nodeId;\n this._log = opts.log ?? undefined;\n this._onMessage = opts.onMessage;\n this._purgeNodeId = opts.purgeNodeId;\n this._addDashboardClient = opts.addDashboardClient;\n }\n\n // ── Configuration (set after construction) ─────────────────────────────\n\n setOnMessage(cb: (ws: WebSocket, msg: P2PMsg) => void): void {\n this._onMessage = cb;\n }\n\n setPurgeNodeId(cb: (nodeId: string) => void): void {\n this._purgeNodeId = cb;\n }\n\n setAddDashboardClient(cb: (ws: WebSocket) => boolean): void {\n this._addDashboardClient = cb;\n }\n\n setLocalIdentity(identity: { name: string; role: string; team?: string }): void {\n this._localIdentity = identity;\n }\n\n setOwnSessionId(sessionId: string | null): void {\n this._ownSessionId = sessionId;\n }\n\n get port(): number {\n return this._port;\n }\n\n // ── Server lifecycle ───────────────────────────────────────────────────\n\n /**\n * Start HTTP + WS server on an available port within the range.\n * Returns the bound port.\n */\n async start(portMin: number, portMax: number): Promise<number> {\n const range = portMax - portMin + 1;\n const startOffset = Math.floor(Math.random() * range);\n\n for (let i = 0; i < range; i++) {\n const port = portMin + ((startOffset + i) % range);\n const bound = await this.tryBind(port);\n if (bound) {\n this._port = port;\n break;\n }\n }\n\n if (!this.wss) {\n throw new Error(\n `No available port in range ${portMin}-${portMax}. ` +\n `Override with CLAUDE_COLLAB_PORT_MIN / CLAUDE_COLLAB_PORT_MAX.`\n );\n }\n\n this.setupWssHandlers();\n return this._port;\n }\n\n /**\n * Stop server: close all peer connections, WS server, HTTP server.\n */\n async stop(): Promise<void> {\n this.closeAll();\n\n await new Promise<void>((resolve) => {\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n\n if (this.httpServer) {\n this.httpServer.close();\n this.httpServer = null;\n }\n }\n\n private tryBind(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const httpServer = createServer((_req, res) => {\n res.writeHead(426, { 'Content-Type': 'text/plain' });\n res.end('Upgrade required');\n });\n\n const wss = new WebSocketServer({ noServer: true });\n\n httpServer.on('upgrade', (req, socket, head) => {\n const pathname = new URL(req.url || '/', `http://${req.headers.host}`).pathname;\n\n if (pathname === '/dashboard') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n if (this._addDashboardClient) {\n if (!this._addDashboardClient(ws)) {\n ws.close(1013, 'Too many dashboard clients');\n }\n } else {\n ws.close(1013, 'Dashboard not configured');\n }\n });\n } else {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req);\n });\n }\n });\n\n httpServer.once('listening', () => {\n this.httpServer = httpServer;\n this.wss = wss;\n resolve(true);\n });\n httpServer.once('error', () => resolve(false));\n httpServer.listen(port);\n });\n }\n\n // ── WS server handlers ────────────────────────────────────────────────\n\n private setupWssHandlers(): void {\n this.wss!.on('connection', (ws, req) => {\n const remoteIp = (req.socket.remoteAddress ?? '').replace('::ffff:', '');\n this.wsToIp.set(ws, remoteIp);\n this._log?.('WS_INBOUND', { ip: remoteIp });\n\n ws.on('message', (data) => {\n try {\n const msg = parseP2PMsg(data.toString());\n\n // Send our HELLO back on incoming HELLO (bidirectional identification)\n if (msg.type === 'P2P_HELLO' && this._localIdentity) {\n this.safeSend(ws, {\n type: 'P2P_HELLO',\n nodeId: this._nodeId,\n fromTeam: this._localIdentity.name,\n fromMemberId: this._nodeId,\n name: this._localIdentity.name,\n role: this._localIdentity.role,\n team: this._localIdentity.team,\n sessionId: this._ownSessionId ?? undefined,\n });\n }\n\n this.handleMessage(ws, msg);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n this._log?.('MSG_PARSE_ERROR', { direction: 'inbound', ip: remoteIp, error: errMsg, stack });\n console.error('[p2p] Failed to parse incoming message:', err);\n }\n });\n\n ws.on('error', (err) => {\n this._log?.('WS_ERROR', { direction: 'inbound', ip: remoteIp, error: err.message });\n console.error('[p2p] ws error (inbound):', err.message);\n });\n ws.on('close', () => this.cleanupWs(ws));\n });\n }\n\n // ── Auto-connect from discovery ───────────────────────────────────────\n\n async autoConnect(\n peerNodeId: string,\n peerName: string,\n _peerRole: string,\n _peerTeam: string | undefined,\n ip: string,\n wsPort: number,\n _isLegacy: boolean,\n ): Promise<void> {\n const existing = this.peerConns.get(peerNodeId);\n if (existing && existing.readyState === WebSocket.OPEN) return;\n\n this._log?.('WS_CONNECT_OUT', {\n peer: peerName, nodeId: peerNodeId.slice(0, 8), ip, port: wsPort,\n });\n try {\n await this.connectToPeer(ip, wsPort, peerNodeId);\n this._log?.('WS_CONNECT_OK', {\n peer: peerName, nodeId: peerNodeId.slice(0, 8), ip, port: wsPort,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this._log?.('WS_CONNECT_FAIL', {\n peer: peerName, nodeId: peerNodeId.slice(0, 8), ip, port: wsPort, error: msg,\n });\n console.error(`[p2p] auto-connect to ${peerName} (${peerNodeId}) @ ${ip}:${wsPort} failed: ${msg}`);\n }\n }\n\n /**\n * Open a WebSocket connection to a peer and perform HELLO handshake.\n * Peer registration happens in handleHello() when their HELLO arrives.\n */\n async connectToPeer(ip: string, port: number, expectedNodeId?: string): Promise<void> {\n if (!this._localIdentity) {\n throw new Error('Must call joinNetwork() before connecting to peers');\n }\n\n const ws = new WebSocket(`ws://${ip}:${port}`);\n this.wsOutgoing.add(ws);\n this.wsToIp.set(ws, ip);\n\n ws.on('message', (data) => {\n try {\n const msg = parseP2PMsg(data.toString());\n this.handleMessage(ws, msg);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n this._log?.('MSG_PARSE_ERROR', { direction: 'outbound', ip, port, error: errMsg, stack });\n console.error('[p2p] Failed to parse message:', err);\n }\n });\n\n ws.on('close', () => this.cleanupWs(ws));\n ws.on('error', (err) => {\n this._log?.('WS_ERROR', { direction: 'outbound', ip, port, error: err.message });\n console.error('[p2p] ws error:', err.message);\n });\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(`Connection timeout to ${ip}:${port}`)),\n 5000\n );\n\n ws.on('open', () => {\n clearTimeout(timeout);\n this.safeSend(ws, {\n type: 'P2P_HELLO',\n nodeId: this._nodeId,\n fromTeam: this._localIdentity!.name,\n fromMemberId: this._nodeId,\n name: this._localIdentity!.name,\n role: this._localIdentity!.role,\n team: this._localIdentity?.team,\n sessionId: this._ownSessionId ?? undefined,\n });\n resolve();\n });\n\n ws.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n\n // Wait for their HELLO back — filter by nodeId if known (avoids matching wrong peer)\n await this.waitForHello(expectedNodeId);\n }\n\n /**\n * Wait for an incoming HELLO message (used after outgoing connect).\n */\n private waitForHello(expectedNodeId?: string): Promise<P2PHelloMsg> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.removeListener('_hello_received', handler);\n reject(new Error('P2P request timed out'));\n }, 10000);\n\n const handler = (msg: P2PHelloMsg) => {\n if (!expectedNodeId || msg.nodeId === expectedNodeId) {\n clearTimeout(timeout);\n this.removeListener('_hello_received', handler);\n resolve(msg);\n }\n };\n\n this.on('_hello_received', handler);\n });\n }\n\n // ── Unified message handler ───────────────────────────────────────────\n\n private handleMessage(ws: WebSocket, msg: P2PMsg): void {\n switch (msg.type) {\n case 'P2P_HELLO':\n this.handleHello(ws, msg);\n // Emit internal event for waitForHello\n this.emit('_hello_received', msg);\n break;\n\n case 'P2P_PING':\n this.safeSend(ws, { type: 'P2P_PONG' });\n break;\n\n case 'P2P_PONG': {\n const pongNodeId = this.wsToNodeId.get(ws);\n if (pongNodeId) {\n this.emit('pong_received', pongNodeId);\n }\n break;\n }\n\n default:\n // Delegate to P2PNode's onMessage callback\n this._onMessage?.(ws, msg);\n break;\n }\n }\n\n // ── HELLO handling ────────────────────────────────────────────────────\n\n private handleHello(ws: WebSocket, msg: P2PHelloMsg): void {\n const peerNodeId = msg.nodeId ?? msg.fromMemberId; // fallback for legacy HELLO\n const peerName = msg.name ?? msg.fromTeam;\n const peerRole = msg.role ?? 'Unknown';\n const peerTeam = msg.team;\n\n // Ghost cleanup: if a peer with the same NAME already exists under a different nodeId, purge the old one\n for (const [existingNodeId, existingPeer] of this.peerIdentities) {\n if (existingPeer.name === peerName && existingNodeId !== peerNodeId) {\n const oldWs = this.peerConns.get(existingNodeId);\n if (oldWs && oldWs.readyState === WebSocket.OPEN) {\n oldWs.close(1000, 'Replaced by reconnect');\n }\n this._purgeNodeId?.(existingNodeId);\n // Also purge connection-level state\n this.removePeer(existingNodeId);\n console.error(`[p2p] [RECONNECT] ${peerName} yeniden baglandi (eski: ${existingNodeId.slice(0, 8)}, yeni: ${peerNodeId.slice(0, 8)})`);\n this._log?.('GHOST_CLEANUP', {\n peer: peerName,\n oldNodeId: existingNodeId.slice(0, 8),\n newNodeId: peerNodeId.slice(0, 8),\n });\n break; // only one ghost possible per name\n }\n }\n\n const existing = this.peerConns.get(peerNodeId);\n\n if (existing && existing.readyState === WebSocket.OPEN) {\n // Dedup: memberId comparison as tiebreaker\n const iShouldInitiate = this._nodeId < peerNodeId;\n const thisIsOutgoing = this.wsOutgoing.has(ws);\n\n if (iShouldInitiate && !thisIsOutgoing) {\n ws.close(); return;\n } else if (!iShouldInitiate && thisIsOutgoing) {\n ws.close(); return;\n }\n // Ambiguous (UUID collision, effectively impossible) — close new, keep existing\n ws.close(); return;\n }\n\n // Register peer\n this.registerPeer(ws, {\n nodeId: peerNodeId,\n name: peerName,\n role: peerRole,\n team: peerTeam,\n isLegacy: !msg.nodeId,\n });\n\n if (msg.sessionId) {\n this.peerSessionIds.set(peerNodeId, msg.sessionId);\n }\n\n console.error(`[p2p] connected to peer: ${peerName} (${peerNodeId.slice(0, 8)})`);\n this._log?.('HELLO', {\n peer: peerName, role: peerRole,\n nodeId: peerNodeId.slice(0, 8),\n sessionId: msg.sessionId?.slice(0, 8),\n });\n\n // Emit PEER_CONNECTED event for P2PNode to handle cross-module coordination\n const event: PeerConnectedEvent = {\n nodeId: peerNodeId,\n name: peerName,\n role: peerRole,\n team: peerTeam,\n sessionId: msg.sessionId,\n isLegacy: !msg.nodeId,\n ws,\n };\n this.emit(CollabEvents.PEER_CONNECTED, event);\n }\n\n // ── Connection cleanup ────────────────────────────────────────────────\n\n private cleanupWs(ws: WebSocket): void {\n const nodeId = this.wsToNodeId.get(ws);\n if (nodeId) {\n // Only treat as real disconnect if this was the PRIMARY connection for this peer.\n // Dedup closes and stale WS closes must NOT trigger respawn.\n const isPrimary = this.peerConns.get(nodeId) === ws;\n if (isPrimary) {\n this.peerConns.delete(nodeId);\n const peer = this.peerIdentities.get(nodeId);\n if (peer) peer.status = 'offline';\n } else {\n const peer = this.peerIdentities.get(nodeId);\n this._log?.('WS_CLOSE', {\n peer: peer?.name || nodeId.slice(0, 8), nodeId: nodeId.slice(0, 8), reason: 'stale_or_dedup',\n });\n }\n this.wsToNodeId.delete(ws);\n\n if (isPrimary) {\n const disconnectedPeer = this.peerIdentities.get(nodeId);\n if (disconnectedPeer) {\n this._log?.('DISCONNECT', {\n peer: disconnectedPeer.name,\n nodeId: nodeId.slice(0, 8),\n });\n // Emit PEER_DISCONNECTED for P2PNode to handle multi-module cleanup\n const event: PeerDisconnectedEvent = { nodeId, peer: disconnectedPeer };\n this.emit(CollabEvents.PEER_DISCONNECTED, event);\n }\n }\n }\n this.wsOutgoing.delete(ws);\n this.wsToIp.delete(ws);\n }\n\n /**\n * Handle a discovered peer going away (from multicast peer-lost).\n */\n handlePeerLost(peerNodeId: string): void {\n const ws = this.peerConns.get(peerNodeId);\n if (ws) {\n ws.close();\n this.peerConns.delete(peerNodeId);\n }\n }\n\n // ── Peer registration ──────────────────────────────────────────────────\n\n /**\n * Register a new peer connection. Populates all maps (peerConns, peerIdentities,\n * wsToNodeId).\n */\n registerPeer(ws: WebSocket, data: RegisterPeerData): void {\n this.wsToNodeId.set(ws, data.nodeId);\n this.peerConns.set(data.nodeId, ws);\n\n const peerInfo: PeerInfo = {\n nodeId: data.nodeId,\n name: data.name,\n role: data.role,\n ...(data.team !== undefined ? { team: data.team } : {}),\n status: 'online',\n lastSeenAt: new Date().toISOString(),\n isLegacy: data.isLegacy ?? false,\n };\n this.peerIdentities.set(data.nodeId, peerInfo);\n }\n\n /**\n * Full per-nodeId state cleanup. Removes from all maps.\n */\n removePeer(nodeId: string): void {\n const ws = this.peerConns.get(nodeId);\n if (ws) {\n this.wsToNodeId.delete(ws);\n this.wsOutgoing.delete(ws);\n this.wsToIp.delete(ws);\n }\n this.peerIdentities.delete(nodeId);\n this.peerConns.delete(nodeId);\n this.peerSessionIds.delete(nodeId);\n }\n\n // ── Peer lookup ──────────────────────────────────────────────────────────\n\n resolvePeerByName(name: string): PeerInfo[] {\n const results: PeerInfo[] = [];\n for (const peer of this.peerIdentities.values()) {\n if (peer.name.toLowerCase() === name.toLowerCase()) {\n results.push(peer);\n }\n }\n return results;\n }\n\n getConnectedPeers(): ReadonlyMap<string, WebSocket> {\n return this.peerConns;\n }\n\n getConnectedPeerIds(): string[] {\n return [...this.peerConns.keys()];\n }\n\n getPeerIdentity(nodeId: string): PeerInfo | undefined {\n return this.peerIdentities.get(nodeId);\n }\n\n getPeerIdentities(): ReadonlyMap<string, PeerInfo> {\n return this.peerIdentities;\n }\n\n getWsForNode(nodeId: string): WebSocket | undefined {\n return this.peerConns.get(nodeId);\n }\n\n getNodeIdForWs(ws: WebSocket): string | undefined {\n return this.wsToNodeId.get(ws);\n }\n\n // ── WS send utilities ────────────────────────────────────────────────────\n\n /**\n * Safe JSON send with error handling. Returns true on success, false on failure.\n */\n safeSend(ws: WebSocket, msg: P2PMsg): boolean {\n // WebSocket.OPEN === 1\n if (ws.readyState !== 1) {\n this._log?.('SEND_FAIL', {\n msgType: msg.type,\n wsState: ws.readyState,\n reason: 'ws_not_open',\n });\n return false;\n }\n try {\n ws.send(serializeP2PMsg(msg));\n return true;\n } catch (err) {\n this._log?.('SEND_FAIL', {\n msgType: msg.type,\n error: err instanceof Error ? err.message : String(err),\n reason: 'send_threw',\n });\n return false;\n }\n }\n\n /**\n * Send a message to a specific peer by nodeId. Returns true if sent.\n */\n sendToNode(nodeId: string, msg: P2PMsg): boolean {\n const ws = this.peerConns.get(nodeId);\n if (!ws) return false;\n return this.safeSend(ws, msg);\n }\n\n /**\n * Broadcast a message to all connected peers (optionally excluding one).\n */\n broadcastToAll(msg: P2PMsg, excludeNodeId?: string): void {\n for (const [nodeId, ws] of this.peerConns) {\n if (excludeNodeId && nodeId === excludeNodeId) continue;\n this.safeSend(ws, msg);\n }\n }\n\n // ── WS tracking (outgoing, IP) ──────────────────────────────────────────\n\n markOutgoing(ws: WebSocket): void {\n this.wsOutgoing.add(ws);\n }\n\n isOutgoing(ws: WebSocket): boolean {\n return this.wsOutgoing.has(ws);\n }\n\n setWsIp(ws: WebSocket, ip: string): void {\n this.wsToIp.set(ws, ip);\n }\n\n getWsIp(ws: WebSocket): string | undefined {\n return this.wsToIp.get(ws);\n }\n\n // ── Session ID tracking ──────────────────────────────────────────────────\n\n setPeerSessionId(nodeId: string, sessionId: string): void {\n this.peerSessionIds.set(nodeId, sessionId);\n }\n\n getPeerSessionId(nodeId: string): string | undefined {\n return this.peerSessionIds.get(nodeId);\n }\n\n // ── Legacy cleanup helpers (kept for backward compat with tests) ──────\n\n deleteWsMapping(ws: WebSocket): void {\n this.wsToNodeId.delete(ws);\n }\n\n cleanupWsMaps(ws: WebSocket): void {\n this.wsOutgoing.delete(ws);\n this.wsToIp.delete(ws);\n }\n\n deletePeerConn(nodeId: string): void {\n this.peerConns.delete(nodeId);\n }\n\n setPeerStatus(nodeId: string, status: 'online' | 'offline'): void {\n const peer = this.peerIdentities.get(nodeId);\n if (peer) peer.status = status;\n }\n\n /**\n * Close all connections and clear peerConns map.\n */\n closeAll(): void {\n for (const ws of this.peerConns.values()) {\n ws.close();\n }\n this.peerConns.clear();\n }\n}\n","/**\n * P2PNode — Thin Orchestrator\n * Implements ICollabClient by composing extracted modules.\n * Identity is set lazily via joinNetwork() — no --name arg needed.\n * @module infrastructure/p2p/p2p-node\n */\n\nimport { WebSocket } from 'ws';\nimport { v4 as uuidv4 } from 'uuid';\nimport { DashboardBroadcaster, type DashboardState, type DashboardPeer, type DashboardLocalNode } from './dashboard-broadcaster.js';\nimport { ContextBudgetTracker } from './context-budget.js';\nimport { SpawnManager } from './spawn-manager.js';\nimport type {\n ICollabClient,\n PeerInfo,\n JoinNetworkResult,\n CheckAnswerResult,\n InboxResult,\n NodeInfo,\n HistoryEntry,\n StatusReport,\n ObserveResult,\n BroadcastResult,\n CheckRepliesResult,\n IssueStatus,\n IssueState,\n ContextBudget,\n} from '../../shared/types/collab-client.interface.js';\nimport type { MessageFormat } from '../../domain/value-objects/message-content.vo.js';\nimport type {\n P2PMsg,\n P2PObserveReqMsg,\n P2PObserveResMsg,\n P2PSendMsg,\n P2PIssueSyncReqMsg,\n P2PIssueSyncResMsg,\n} from './p2p-message-protocol.js';\nimport { MulticastDiscovery } from './multicast-discovery.js';\nimport { CollabDb } from '../db/collab-db.js';\nimport { injectionQueue } from '../terminal-injector/injection-queue.js';\nimport { readConsoleOutput } from '../terminal-injector/windows-reader.js';\nimport { config } from '../../config/index.js';\nimport { detectOwnSessionId } from '../terminal/session-detector.js';\nimport { CollabLogger } from '../logging/collab-logger.js';\nimport { execFileSync } from 'child_process';\nimport { CommitWatcher } from './commit-watcher.js';\nimport { CollabEvents } from './events.js';\nimport { StatusTracker } from './status-tracker.js';\nimport { RespawnService } from './respawn-service.js';\nimport { PipelineManager } from './pipeline-manager.js';\nimport { HeartbeatMonitor } from './heartbeat-monitor.js';\nimport { MessageRouter } from './message-router.js';\nimport { ConnectionManager, type PeerConnectedEvent, type PeerDisconnectedEvent } from './connection-manager.js';\n\nconst INACTIVITY_WARN_MS = 30 * 60 * 1000; // 30 min → used by healthCheck()\n\ninterface RespawnRule {\n role: string;\n model: string;\n effort: 'low' | 'medium' | 'high' | 'max';\n provider?: 'anthropic' | 'ollama';\n maxRetries: number;\n}\n\nexport class P2PNode implements ICollabClient {\n private readonly dashboardBroadcaster = new DashboardBroadcaster();\n private readonly _nodeId: string = uuidv4(); // process-lifetime UUID\n private readonly discovery = new MulticastDiscovery();\n private db: CollabDb | null = null;\n\n // Identity (set by joinNetwork)\n private localIdentity: { nodeId: string; name: string; role: string; team?: string } | null = null;\n private identitySetPromise: Promise<JoinNetworkResult> | null = null;\n\n // Extracted modules\n private readonly connectionManager: ConnectionManager;\n private readonly pipelineManager: PipelineManager;\n private readonly statusTracker = new StatusTracker();\n private heartbeatMonitor!: HeartbeatMonitor;\n private messageRouter!: MessageRouter;\n private readonly commitWatcher = new CommitWatcher();\n private readonly spawnManager = new SpawnManager(config.dataDir);\n private readonly respawnService = new RespawnService();\n private readonly budgetTracker = new ContextBudgetTracker();\n\n private _isStarted = false;\n private ownSessionId: string | null = null;\n private logger: CollabLogger | null = null;\n\n constructor() {\n this.connectionManager = new ConnectionManager({ nodeId: this._nodeId });\n this.pipelineManager = new PipelineManager({\n dataDir: config.dataDir,\n broadcastAll: (msg) => this.connectionManager.broadcastToAll(msg),\n });\n }\n\n // ---------------------------------------------------------------------------\n // Private: full per-nodeId state cleanup (multi-module)\n // ---------------------------------------------------------------------------\n\n private purgeNodeId(nodeId: string): void {\n this.connectionManager.removePeer(nodeId);\n this.statusTracker.cleanup(nodeId);\n this.heartbeatMonitor.onPeerDisconnected(nodeId);\n this.spawnManager.removePidForNode(nodeId);\n }\n\n setRespawnRules(rules: RespawnRule[]): void {\n this.respawnService.setRules(rules);\n }\n\n private isLeader(): boolean {\n return this.heartbeatMonitor.isLeader();\n }\n\n // ---------------------------------------------------------------------------\n // Public getters\n // ---------------------------------------------------------------------------\n\n get isConnected(): boolean {\n return this._isStarted;\n }\n\n get isIdentitySet(): boolean {\n return this.localIdentity !== null;\n }\n\n get nodeId(): string | undefined {\n return this.localIdentity ? this._nodeId : undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Public: start WS server (delegates to ConnectionManager)\n // ---------------------------------------------------------------------------\n\n async start(): Promise<void> {\n this.spawnManager.cleanupStalePids();\n\n // Wire callbacks before start\n this.connectionManager.setOnMessage((ws, msg) => this.handleMessage(ws, msg));\n this.connectionManager.setPurgeNodeId((nodeId) => this.purgeNodeId(nodeId));\n this.connectionManager.setAddDashboardClient((ws) => this.dashboardBroadcaster.addClient(ws));\n\n const { portRangeMin, portRangeMax } = config.p2p;\n const port = await this.connectionManager.start(portRangeMin, portRangeMax);\n\n this._isStarted = true;\n this.pipelineManager.load();\n this.dashboardBroadcaster.setStateProvider(() => this.buildDashboardState());\n console.error(`P2P node started on port ${port}`);\n\n // Write PID file for zombie cleanup on next startup\n try {\n this.spawnManager.writePidFile(port, this._nodeId);\n } catch {}\n\n // Initialize MessageRouter\n this.messageRouter = new MessageRouter({\n localNodeId: this._nodeId,\n sendToNode: (nodeId, msg) => this.connectionManager.sendToNode(nodeId, msg),\n broadcastAll: (msg) => this.connectionManager.broadcastToAll(msg),\n injectionQueue,\n localIdentity: () => this.localIdentity,\n getPeerIdentity: (nodeId) => this.connectionManager.getPeerIdentity(nodeId),\n updateActivity: (nodeId, message?) => this.statusTracker.updateActivity(nodeId, message),\n pushDashboardState: () => this.dashboardBroadcaster.pushState(),\n pushMessageEvent: (from, to, type) => this.dashboardBroadcaster.pushMessageEvent(from, to, type),\n });\n this.messageRouter.on(CollabEvents.STATUS_UPDATED, (msg) => {\n this.statusTracker.updatePeerStatus(msg.nodeId, {\n status: msg.status,\n summary: msg.summary,\n ...(msg.progress !== undefined ? { progress: msg.progress } : {}),\n ...(msg.blocker !== undefined ? { blocker: msg.blocker } : {}),\n updatedAt: msg.timestamp,\n });\n this.statusTracker.updateActivity(msg.nodeId);\n this.dashboardBroadcaster.pushState();\n });\n this.messageRouter.on(CollabEvents.ISSUE_UPDATED, (msg) => {\n if (this.pipelineManager.mergeRemoteUpdate(msg)) {\n this.dashboardBroadcaster.pushState();\n }\n });\n this.messageRouter.start();\n\n // Initialize HeartbeatMonitor\n this.heartbeatMonitor = new HeartbeatMonitor({\n localNodeId: this._nodeId,\n getConnectedPeerIds: () => this.connectionManager.getConnectedPeerIds(),\n sendToNode: (nodeId, msg) => this.connectionManager.sendToNode(nodeId, msg),\n broadcastAll: (msg) => this.connectionManager.broadcastToAll(msg),\n getAssignedIssueForPeer: (name) => this.pipelineManager.getAssignedIssueForPeer(name),\n localIdentity: () => this.localIdentity,\n getSessionStartedAt: () => this.budgetTracker.getSessionStartedAt(),\n getPeerIdentity: (nodeId) => this.connectionManager.getPeerIdentity(nodeId),\n getLastActivity: (nodeId) => this.statusTracker.getLastActivity(nodeId),\n getPeerLastSeenAt: (nodeId) => this.connectionManager.getPeerIdentity(nodeId)?.lastSeenAt,\n getPidForNode: (nodeId) => this.spawnManager.getPidForNode(nodeId),\n closeConnection: (nodeId) => {\n const ws = this.connectionManager.getWsForNode(nodeId);\n if (ws) ws.close(1000, 'Zombie detected');\n },\n log: (event, data) => this.logger?.log(event, data),\n });\n this.heartbeatMonitor.start();\n\n // Wire ConnectionManager events\n this.connectionManager.on(CollabEvents.PEER_CONNECTED, (ev: PeerConnectedEvent) => {\n this.onPeerConnected(ev);\n });\n this.connectionManager.on(CollabEvents.PEER_DISCONNECTED, (ev: PeerDisconnectedEvent) => {\n this.onPeerDisconnected(ev);\n });\n this.connectionManager.on('pong_received', (nodeId: string) => {\n this.heartbeatMonitor.recordPong(nodeId);\n });\n\n this.ownSessionId = detectOwnSessionId();\n if (this.ownSessionId) {\n console.error(`[p2p] Session ID detected: ${this.ownSessionId.slice(0, 8)}...`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Event: peer connected (from ConnectionManager)\n // ---------------------------------------------------------------------------\n\n private onPeerConnected(ev: PeerConnectedEvent): void {\n this.statusTracker.updateActivity(ev.nodeId);\n this.heartbeatMonitor.recordPong(ev.nodeId);\n this.spawnManager.mapPid(ev.nodeId, ev.role);\n\n // Request pipeline state from new peer\n const syncReq: P2PIssueSyncReqMsg = { type: 'P2P_ISSUE_SYNC_REQ', requestId: uuidv4(), nodeId: this._nodeId };\n this.connectionManager.safeSend(ev.ws, syncReq);\n\n this.dashboardBroadcaster.pushState();\n\n if (this.db) {\n void this.db.upsertKnownPeer({\n nodeId: ev.nodeId,\n name: ev.name,\n role: ev.role,\n team: ev.team,\n isLegacy: ev.isLegacy,\n }).catch((err) => {\n this.logger?.log('INTERNAL_ERROR', {\n source: 'upsertKnownPeer',\n peer: ev.name,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Event: peer disconnected (from ConnectionManager)\n // ---------------------------------------------------------------------------\n\n private onPeerDisconnected(ev: PeerDisconnectedEvent): void {\n this.dashboardBroadcaster.pushState();\n this.handlePeerDisconnect(ev.nodeId, ev.peer);\n }\n\n // ---------------------------------------------------------------------------\n // Public: joinNetwork — sets identity lazily (idempotent, mutex-guarded)\n // ---------------------------------------------------------------------------\n\n async joinNetwork(name: string, role: string, team?: string): Promise<JoinNetworkResult> {\n if (this.localIdentity) {\n return {\n nodeId: this._nodeId,\n name: this.localIdentity.name,\n role: this.localIdentity.role,\n team: this.localIdentity.team ?? null,\n status: 'joined',\n port: this.connectionManager.port,\n peersOnline: this.connectionManager.getConnectedPeers().size,\n };\n }\n\n if (this.identitySetPromise) return this.identitySetPromise;\n\n this.identitySetPromise = this._doJoin(name, role, team).catch((err) => {\n this.identitySetPromise = null;\n throw err;\n });\n\n return this.identitySetPromise;\n }\n\n private async _doJoin(name: string, role: string, team?: string): Promise<JoinNetworkResult> {\n if (!this._isStarted) {\n await this.start();\n }\n\n this.localIdentity = { nodeId: this._nodeId, name, role, team };\n this.logger = new CollabLogger(name);\n injectionQueue.setLogger(this.logger);\n (this.messageRouter as any).deps.logger = this.logger;\n\n // Set identity on ConnectionManager for HELLO responses\n this.connectionManager.setLocalIdentity({ name, role, team });\n this.connectionManager.setOwnSessionId(this.ownSessionId);\n\n // Auto-configure respawn rules\n if (role === 'project-manager') {\n this.setRespawnRules([{ role: 'lead', model: 'opus', effort: 'medium', maxRetries: 2 }]);\n } else if (role === 'team-lead') {\n this.setRespawnRules([\n { role: 'frontend', model: 'sonnet', effort: 'medium', maxRetries: 2 },\n { role: 'backend', model: 'sonnet', effort: 'medium', maxRetries: 2 },\n { role: 'qa', model: 'minimax-m2.7:cloud', effort: 'low', provider: 'ollama', maxRetries: 2 },\n { role: 'devops', model: 'sonnet', effort: 'medium', maxRetries: 2 },\n ]);\n }\n\n // Persist to DB\n try {\n const dbPath = process.env['CLAUDE_COLLAB_DB_PATH'] ?? './data/collab.db';\n this.db = new CollabDb(dbPath);\n await this.db.init();\n await this.db.cleanupOldPeers(30);\n await this.db.insertIdentity({ nodeId: this._nodeId, name, role, team });\n } catch (err) {\n console.error('[p2p] DB unavailable, running in-memory only:', (err as Error).message);\n this.db = null;\n }\n\n // Start discovery\n this.discovery.start(name, this.connectionManager.port, this._nodeId, role, team);\n\n this.discovery.on('peer-found', ({ nodeId, name: peerName, role: peerRole, team: peerTeam, ip, wsPort, isLegacy }: {\n nodeId: string; name: string; role: string; team?: string; ip: string; wsPort: number; isLegacy: boolean;\n }) => {\n this.logger?.log('PEER_DISCOVERED', {\n peer: peerName, role: peerRole, nodeId: nodeId.slice(0, 8), ip, port: wsPort,\n });\n void this.connectionManager.autoConnect(nodeId, peerName, peerRole, peerTeam, ip, wsPort, isLegacy);\n });\n\n this.discovery.on('peer-lost', (peerNodeId: string) => {\n const lostPeer = this.connectionManager.getPeerIdentity(peerNodeId);\n this.logger?.log('PEER_LOST', {\n peer: lostPeer?.name || peerNodeId.slice(0, 8), nodeId: peerNodeId.slice(0, 8),\n });\n this.connectionManager.handlePeerLost(peerNodeId);\n });\n\n this.dashboardBroadcaster.pushState();\n\n this.logger.log('JOIN_NETWORK', {\n name, role, port: this.connectionManager.port, peersFound: this.connectionManager.getConnectedPeers().size,\n });\n\n this.startCommitWatcher();\n\n return {\n nodeId: this._nodeId,\n name,\n role,\n team: team ?? null,\n status: 'joined',\n port: this.connectionManager.port,\n peersOnline: this.connectionManager.getConnectedPeers().size,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Public: messaging (delegated to MessageRouter)\n // ---------------------------------------------------------------------------\n\n async ask(toNodeId: string, content: string, format: MessageFormat): Promise<string> {\n await this.getPeerConnection(toNodeId);\n const questionId = this.messageRouter.ask(toNodeId, content, format);\n\n await this.waitForResponse(\n (m) => m.type === 'P2P_ASK_ACK' && 'questionId' in m,\n 5000,\n );\n\n return questionId;\n }\n\n async checkAnswer(questionId: string): Promise<CheckAnswerResult | null> {\n return this.messageRouter.checkAnswer(questionId);\n }\n\n async reply(questionId: string, content: string, format: MessageFormat): Promise<void> {\n this.messageRouter.reply(questionId, content, format);\n }\n\n async getInbox(): Promise<InboxResult> {\n return this.messageRouter.getInbox();\n }\n\n async send(toNodeId: string, content: string, format: MessageFormat, expectReply: boolean): Promise<string> {\n const ws = this.connectionManager.getWsForNode(toNodeId);\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n const peer = this.connectionManager.getPeerIdentity(toNodeId);\n this.logger?.log('SEND_FAIL', {\n to: peer?.name || toNodeId, reason: 'not_connected',\n wsExists: !!ws, wsState: ws?.readyState,\n });\n throw new Error('Peer not connected');\n }\n return this.messageRouter.send(toNodeId, content, format, expectReply);\n }\n\n checkReplies(): CheckRepliesResult {\n return this.messageRouter.checkReplies();\n }\n\n // ---------------------------------------------------------------------------\n // Public: issue pipeline\n // ---------------------------------------------------------------------------\n\n updateIssue(issueId: string, status: IssueStatus, title?: string, assignee?: string, tester?: string): void {\n this.pipelineManager.setCallerName(this.localIdentity?.name || 'unknown');\n this.pipelineManager.updateIssue(issueId, status, title, assignee, tester);\n\n const updated = this.pipelineManager.listIssues().find(i => i.issueId === issueId);\n if (updated) {\n this.emitPipelineNotification(issueId, status, updated);\n }\n\n this.dashboardBroadcaster.pushState();\n this.logger?.log('ISSUE_UPDATE', {\n issueId, status, assignee: updated?.assignee, by: this.localIdentity?.name || 'unknown',\n });\n }\n\n listIssues(): IssueState[] {\n return this.pipelineManager.listIssues();\n }\n\n // ---------------------------------------------------------------------------\n // Public: info / discovery\n // ---------------------------------------------------------------------------\n\n getInfo(): NodeInfo {\n const peers: PeerInfo[] = [...this.connectionManager.getPeerIdentities().values()];\n return {\n nodeId: this.localIdentity ? this._nodeId : undefined,\n name: this.localIdentity?.name,\n role: this.localIdentity?.role,\n team: this.localIdentity?.team,\n port: this._isStarted ? this.connectionManager.port : undefined,\n connectedPeers: peers,\n };\n }\n\n getHistory(): HistoryEntry[] {\n return this.messageRouter.getHistory();\n }\n\n resolvePeerByName(name: string): PeerInfo[] {\n return this.connectionManager.resolvePeerByName(name);\n }\n\n // ---------------------------------------------------------------------------\n // Public: observe, broadcast, status\n // ---------------------------------------------------------------------------\n\n async observe(nodeId: string, lines = 50): Promise<ObserveResult> {\n const observeAllowedRoles = ['team-lead', 'project-manager', 'observer'];\n if (!this.localIdentity?.role || !observeAllowedRoles.includes(this.localIdentity.role)) {\n throw new Error('observe() is only available to team-lead and project-manager roles');\n }\n\n const ws = await this.getPeerConnection(nodeId);\n const requestId = uuidv4();\n\n const resPromise = this.waitForResponse<P2PObserveResMsg>(\n (m) => m.type === 'P2P_OBSERVE_RES' && m.requestId === requestId,\n 10000\n );\n\n const req: P2PObserveReqMsg = {\n type: 'P2P_OBSERVE_REQ',\n requestId,\n nodeId: this._nodeId,\n name: this.localIdentity!.name,\n lines,\n };\n this.connectionManager.safeSend(ws, req);\n\n const res = await resPromise;\n const peer = this.connectionManager.getPeerIdentity(nodeId);\n return {\n nodeId: res.nodeId,\n name: peer?.name ?? nodeId,\n output: res.output,\n truncated: res.truncated,\n };\n }\n\n async broadcastMessage(content: string, format: MessageFormat, role?: string): Promise<BroadcastResult> {\n if (!role) {\n this.messageRouter.broadcastMessage(content, format);\n return { sentTo: this.connectionManager.getConnectedPeers().size, failedTo: 0 };\n }\n\n const requestId = uuidv4();\n const msg = {\n type: 'P2P_BROADCAST' as const,\n requestId,\n nodeId: this._nodeId,\n name: this.localIdentity?.name ?? '',\n role: this.localIdentity?.role ?? '',\n content,\n format,\n timestamp: new Date().toISOString(),\n };\n\n let sentTo = 0;\n let failedTo = 0;\n\n for (const [peerId, ws] of this.connectionManager.getConnectedPeers()) {\n const peer = this.connectionManager.getPeerIdentity(peerId);\n if (peer?.role !== role) continue;\n if (this.connectionManager.safeSend(ws, msg)) {\n sentTo++;\n } else {\n failedTo++;\n }\n }\n\n this.logger?.log('BROADCAST', { role, contentLen: content.length });\n return { sentTo, failedTo };\n }\n\n async reportStatus(report: StatusReport): Promise<void> {\n this.statusTracker.report(report);\n\n const msg = {\n type: 'P2P_STATUS_UPDATE' as const,\n requestId: uuidv4(),\n nodeId: this._nodeId,\n name: this.localIdentity?.name ?? '',\n role: this.localIdentity?.role ?? '',\n status: report.status,\n summary: report.summary,\n ...(report.progress !== undefined ? { progress: report.progress } : {}),\n ...(report.blocker !== undefined ? { blocker: report.blocker } : {}),\n timestamp: new Date().toISOString(),\n };\n\n this.connectionManager.broadcastToAll(msg);\n }\n\n getPeerStatus(nodeId: string): StatusReport | undefined {\n if (nodeId === this._nodeId) return this.statusTracker.getLocalStatus();\n return this.statusTracker.getPeerStatus(nodeId);\n }\n\n // ---------------------------------------------------------------------------\n // Public: team management\n // ---------------------------------------------------------------------------\n\n async kickPeer(nodeId: string): Promise<{ name: string; killed: boolean }> {\n const peer = this.connectionManager.getPeerIdentity(nodeId);\n if (!peer) throw new Error(`Peer bulunamadı: ${nodeId}`);\n const name = peer.name;\n\n const ws = this.connectionManager.getWsForNode(nodeId);\n if (ws) ws.close(1000, 'Kicked by team lead');\n\n let killed = false;\n const pid = this.spawnManager.getPidForNode(nodeId);\n if (pid) {\n try {\n process.kill(pid, 'SIGTERM');\n killed = true;\n } catch (err) {\n this.logger?.log('INTERNAL_ERROR', {\n source: 'kickPeer.kill', pid,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n this.purgeNodeId(nodeId);\n this.dashboardBroadcaster.pushState();\n return { name, killed };\n }\n\n async sendShutdown(nodeId: string): Promise<{ name: string; sent: boolean }> {\n const peer = this.connectionManager.getPeerIdentity(nodeId);\n if (!peer) throw new Error(`Peer bulunamadı: ${nodeId}`);\n const name = peer.name;\n\n const ws = this.connectionManager.getWsForNode(nodeId);\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n throw new Error(`Peer bağlı değil: ${name}`);\n }\n\n const sent = this.connectionManager.safeSend(ws, { type: 'P2P_SHUTDOWN', reason: 'exit_member' } as any);\n this.logger?.log('SHUTDOWN_SENT', { target: name, nodeId: nodeId.slice(0, 8) });\n console.error(`[p2p] [SHUTDOWN_SENT] → ${name}`);\n\n return { name, sent };\n }\n\n healthCheck(): { nodeId: string; name: string; role: string; status: string; lastActivity: string; stale: boolean }[] {\n const STALE_THRESHOLD = INACTIVITY_WARN_MS;\n const now = Date.now();\n const results: { nodeId: string; name: string; role: string; status: string; lastActivity: string; stale: boolean }[] = [];\n\n for (const [nodeId, peer] of this.connectionManager.getPeerIdentities()) {\n const lastActivity = this.statusTracker.getLastActivity(nodeId) ?? peer.lastSeenAt;\n const lastMs = new Date(lastActivity).getTime();\n const ws = this.connectionManager.getWsForNode(nodeId);\n const wsAlive = ws != null && ws.readyState === WebSocket.OPEN;\n const stale = !wsAlive || (now - lastMs > STALE_THRESHOLD);\n\n results.push({\n nodeId,\n name: peer.name,\n role: peer.role,\n status: wsAlive ? (stale ? 'stale' : 'healthy') : 'disconnected',\n lastActivity,\n stale,\n });\n }\n\n return results;\n }\n\n registerSpawnedPid(role: string, pid: number): void {\n this.spawnManager.registerPid(role, pid);\n }\n\n // ---------------------------------------------------------------------------\n // Public: context budget\n // ---------------------------------------------------------------------------\n\n getContextBudget(): ContextBudget {\n return this.budgetTracker.get();\n }\n\n // ---------------------------------------------------------------------------\n // Public: observer support\n // ---------------------------------------------------------------------------\n\n getDb(): CollabDb | null {\n return this.db ?? null;\n }\n\n getMessageStats() {\n return this.messageRouter.getMessageStats();\n }\n\n incrementToolCall(): void {\n this.budgetTracker.incrementToolCall();\n const alert = this.budgetTracker.shouldAlert();\n if (alert) {\n this.sendBudgetAlert(alert.level);\n const budget = this.getContextBudget();\n this.logger?.log('CONTEXT_BUDGET', {\n toolCalls: budget.toolCalls, health: budget.healthStatus,\n ageMin: Math.round(budget.sessionAgeMs / 60_000),\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Public: lifecycle\n // ---------------------------------------------------------------------------\n\n async disconnect(): Promise<void> {\n this.messageRouter.stop();\n this.heartbeatMonitor.stop();\n this.commitWatcher.stop();\n this.pipelineManager.stop();\n this.discovery.stop();\n this.dashboardBroadcaster.destroy();\n\n await this.connectionManager.stop();\n\n this.spawnManager.stop();\n if (this.db) this.db.close();\n this._isStarted = false;\n }\n\n // ---------------------------------------------------------------------------\n // Private: unified message handler (non-connection messages)\n // ---------------------------------------------------------------------------\n\n private handleMessage(ws: WebSocket, msg: P2PMsg): void {\n // Try MessageRouter first (handles ASK, ANSWER, SEND, BROADCAST, STATUS_UPDATE, ISSUE_UPDATE, GET_ANSWER)\n const handled = this.messageRouter.handleMessage(ws, msg);\n if (handled) return;\n\n switch (msg.type) {\n case 'P2P_SHUTDOWN': {\n const shutdownFrom = this.connectionManager.getNodeIdForWs(ws);\n const shutdownPeer = shutdownFrom ? this.connectionManager.getPeerIdentity(shutdownFrom) : undefined;\n this.logger?.log('SHUTDOWN_RECEIVED', {\n from: shutdownPeer?.name ?? shutdownFrom?.slice(0, 8) ?? 'unknown',\n reason: (msg as any).reason ?? 'exit_member',\n });\n console.error(`[p2p] [SHUTDOWN] Graceful shutdown requested by ${shutdownPeer?.name ?? 'orchestrator'}`);\n this.spawnManager.cleanupOwnPidFile();\n try { process.kill(process.ppid); } catch {}\n process.exit(0);\n break;\n }\n\n case 'P2P_OBSERVE_REQ':\n void this.handleObserveReq(ws, msg as P2PObserveReqMsg).catch((err) => {\n this.logger?.log('INTERNAL_ERROR', {\n source: 'handleObserveReq',\n error: err instanceof Error ? err.message : String(err),\n });\n });\n break;\n\n case 'P2P_OBSERVE_RES':\n this.statusTracker.updateActivity((msg as P2PObserveResMsg).nodeId);\n break;\n\n case 'P2P_ISSUE_SYNC_REQ': {\n const issues = this.pipelineManager.buildSyncResponse();\n const res: P2PIssueSyncResMsg = { type: 'P2P_ISSUE_SYNC_RES', requestId: (msg as P2PIssueSyncReqMsg).requestId, issues };\n this.connectionManager.safeSend(ws, res);\n break;\n }\n\n case 'P2P_ISSUE_SYNC_RES':\n for (const issue of (msg as P2PIssueSyncResMsg).issues) {\n if (this.pipelineManager.mergeRemoteUpdate(issue)) {\n this.dashboardBroadcaster.pushState();\n }\n }\n break;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: observe handler\n // ---------------------------------------------------------------------------\n\n private async handleObserveReq(ws: WebSocket, msg: P2PObserveReqMsg): Promise<void> {\n this.statusTracker.updateActivity(msg.nodeId);\n\n let rawOutput: string;\n try {\n rawOutput = await readConsoleOutput(msg.lines);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n this.logger?.log('INTERNAL_ERROR', { action: 'observe_read', error: errMsg });\n console.error(`[p2p] [OBSERVE_FAIL] Terminal read failed: ${errMsg}`);\n rawOutput = `ERROR:ATTACH_FAILED\\n${errMsg}`;\n }\n\n const sensitivePatterns = [\n /OPENAI_API_KEY\\s*=\\s*\\S+/gi,\n /sk-[A-Za-z0-9_-]{20,}/g,\n /Bearer\\s+[A-Za-z0-9_\\-.]+/gi,\n /password\\s*=\\s*\\S+/gi,\n /secret\\s*=\\s*\\S+/gi,\n ];\n let filteredOutput = rawOutput;\n for (const pattern of sensitivePatterns) {\n filteredOutput = filteredOutput.replace(pattern, '[REDACTED]');\n }\n\n const maxChars = 8000;\n const truncated = filteredOutput.length > maxChars;\n const output = truncated ? filteredOutput.slice(-maxChars) : filteredOutput;\n\n const res: P2PObserveResMsg = {\n type: 'P2P_OBSERVE_RES',\n requestId: msg.requestId,\n nodeId: this._nodeId,\n output,\n truncated,\n };\n\n this.connectionManager.safeSend(ws, res);\n }\n\n // ---------------------------------------------------------------------------\n // Private: pipeline notifications\n // ---------------------------------------------------------------------------\n\n private emitPipelineNotification(issueId: string, status: IssueStatus, state: IssueState): void {\n const notify = (targetRole: string, message: string) => {\n for (const [nodeId, info] of this.connectionManager.getPeerIdentities()) {\n if (info.role === targetRole) {\n this.connectionManager.sendToNode(nodeId, {\n type: 'P2P_SEND',\n messageId: uuidv4(),\n fromNodeId: this._nodeId,\n fromName: 'pipeline',\n fromRole: 'system',\n content: message,\n format: 'plain',\n expectReply: false,\n timestamp: new Date().toISOString(),\n });\n }\n }\n };\n\n switch (status) {\n case 'dev_done':\n notify('qa-engineer', `[PIPELINE] Issue ${issueId} test'e hazir`);\n break;\n case 'qa_rejected':\n if (state.assignee) {\n for (const [nodeId, info] of this.connectionManager.getPeerIdentities()) {\n if (info.name === state.assignee) {\n this.connectionManager.sendToNode(nodeId, {\n type: 'P2P_SEND', messageId: uuidv4(), fromNodeId: this._nodeId,\n fromName: 'pipeline', fromRole: 'system',\n content: `[PIPELINE] Issue ${issueId} QA reddetti, bug raporuna bak`,\n format: 'plain', expectReply: false, timestamp: new Date().toISOString(),\n });\n }\n }\n }\n break;\n case 'qa_passed':\n notify('team-lead', `[PIPELINE] Issue ${issueId} QA gecti`);\n break;\n case 'done':\n notify('project-manager', `[PIPELINE] Issue ${issueId} tamamlandi`);\n break;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: peer disconnect handling\n // ---------------------------------------------------------------------------\n\n private handlePeerDisconnect(nodeId: string, peer: PeerInfo): void {\n if (!this.isLeader()) return;\n\n // Safety: if the peer already reconnected under a different nodeId, skip\n for (const [otherNodeId, otherPeer] of this.connectionManager.getPeerIdentities()) {\n if (otherNodeId !== nodeId && otherPeer.name === peer.name) {\n const otherWs = this.connectionManager.getWsForNode(otherNodeId);\n if (otherWs && otherWs.readyState === WebSocket.OPEN) {\n console.error(`[p2p] [SKIP-DISCONNECT] ${peer.name} already reconnected under ${otherNodeId.slice(0, 8)}, skipping`);\n return;\n }\n }\n }\n\n const deadName = peer.name;\n const deadRole = peer.role;\n\n const orphanedIds = this.pipelineManager.reassignOrphans(deadName);\n for (const issueId of orphanedIds) {\n this.logger?.log('ORPHAN_REASSIGN', { issueId, oldAssignee: deadName });\n }\n\n this.dashboardBroadcaster.pushState();\n\n const orphanText = orphanedIds.length > 0\n ? ` Orphaned: ${orphanedIds.map(id => `#${id}`).join(', ')}`\n : '';\n const alertContent = `[DISCONNECT] ${deadName} (${deadRole}) baglantisi kesildi.${orphanText}`;\n\n const alertRoles = ['project-manager', 'team-lead'];\n for (const [targetId, targetInfo] of this.connectionManager.getPeerIdentities()) {\n if (alertRoles.includes(targetInfo.role)) {\n this.connectionManager.sendToNode(targetId, {\n type: 'P2P_SEND',\n messageId: uuidv4(),\n fromNodeId: this._nodeId,\n fromName: 'system',\n fromRole: 'monitor',\n content: alertContent,\n format: 'plain',\n expectReply: false,\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n this.logger?.log('PEER_DISCONNECT_HANDLED', {\n peer: deadName, role: deadRole, orphanedIssues: orphanedIds.length,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Private: dashboard state\n // ---------------------------------------------------------------------------\n\n private buildDashboardState(): DashboardState {\n const peers: DashboardPeer[] = [];\n\n for (const [nodeId, identity] of this.connectionManager.getPeerIdentities()) {\n const status = this.statusTracker.getPeerStatus(nodeId);\n peers.push({\n nodeId,\n name: identity.name,\n role: identity.role,\n status: status?.status ?? 'idle',\n summary: status?.summary ?? '',\n progress: status?.progress,\n blocker: status?.blocker,\n lastActivity: this.statusTracker.getLastActivity(nodeId) ?? new Date().toISOString(),\n lastMessage: this.statusTracker.getLastMessage(nodeId),\n });\n }\n\n const localStatus = this.statusTracker.getLocalStatus();\n const localNode: DashboardLocalNode = {\n nodeId: this._nodeId,\n name: this.localIdentity?.name ?? 'unknown',\n role: this.localIdentity?.role ?? 'unknown',\n status: localStatus?.status ?? 'idle',\n summary: localStatus?.summary ?? '',\n progress: localStatus?.progress,\n };\n\n return {\n type: 'state',\n peers,\n localNode,\n timestamp: new Date().toISOString(),\n pipeline: this.listIssues(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private: commit watcher\n // ---------------------------------------------------------------------------\n\n private startCommitWatcher(): void {\n if (!this.localIdentity?.role || this.localIdentity.role !== 'developer') return;\n\n try {\n execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf-8', timeout: 5000 });\n } catch {\n this.logger?.log('COMMIT_WATCHER_DISABLED', { reason: 'git not available or not a repo' });\n console.error('[p2p] Commit watcher disabled: git not available or not a repo');\n return;\n }\n\n this.commitWatcher.on(CollabEvents.COMMIT_DETECTED, (info: { hash: string; message: string; files: string[] }) => {\n try {\n const myName = this.localIdentity?.name;\n if (!myName) return;\n\n const activeIssues = this.pipelineManager.listIssues()\n .filter(s => s.status === 'in_progress' && s.assignee === myName && !this.commitWatcher.isAutoCompleted(s.issueId))\n .map(s => ({ issueId: s.issueId, assignedAt: s.assignedAt || '' }));\n\n if (activeIssues.length === 0) return;\n\n const issueMatch = info.message.match(/#(\\d+)/);\n let targetIssue: string | undefined;\n if (issueMatch) {\n const matchedId = `#${issueMatch[1]}`;\n if (activeIssues.some(i => i.issueId === matchedId)) {\n targetIssue = matchedId;\n }\n }\n\n if (!targetIssue) {\n activeIssues.sort((a, b) => a.assignedAt.localeCompare(b.assignedAt));\n targetIssue = activeIssues[0]!.issueId;\n }\n\n this.commitWatcher.markAutoCompleted(targetIssue);\n this.updateIssue(targetIssue, 'dev_done');\n\n const leadPeer = [...this.connectionManager.getPeerIdentities().values()].find(p => p.role === 'team-lead');\n if (leadPeer) {\n const leadNodeId = [...this.connectionManager.getPeerIdentities().entries()].find(([, p]) => p === leadPeer)?.[0];\n if (leadNodeId) {\n const ws = this.connectionManager.getWsForNode(leadNodeId);\n if (ws) {\n const sendMsg: P2PSendMsg = {\n type: 'P2P_SEND',\n messageId: uuidv4(),\n fromNodeId: this._nodeId,\n fromName: myName,\n fromRole: this.localIdentity?.role || 'developer',\n content: `[AUTO] ${myName} ${targetIssue} commit etti, dev_done.`,\n format: 'plain',\n expectReply: false,\n timestamp: new Date().toISOString(),\n };\n this.connectionManager.safeSend(ws, sendMsg);\n }\n }\n }\n\n this.logger?.log('AUTO_DEV_DONE', {\n issueId: targetIssue,\n commitHash: info.hash.slice(0, 8),\n matchedFromCommitMsg: !!issueMatch,\n });\n console.error(`[p2p] [AUTO_DEV_DONE] ${targetIssue} → dev_done (commit detected)`);\n } catch (err) {\n this.logger?.log('COMMIT_WATCHER_ERROR', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n this.logger?.log('COMMIT_WATCHER_STARTED', {});\n this.commitWatcher.start();\n }\n\n // ---------------------------------------------------------------------------\n // Private: budget alerts\n // ---------------------------------------------------------------------------\n\n private sendBudgetAlert(level: 'warning' | 'critical'): void {\n if (!this.localIdentity) return;\n const budget = this.getContextBudget();\n const name = this.localIdentity.name;\n const ageMin = Math.round(budget.sessionAgeMs / 60_000);\n const prefix = level === 'warning' ? '[UYARI]' : '[KRITIK]';\n const alertMsg = `${prefix} ${name} context budget ${level} (toolCalls: ${budget.toolCalls}, age: ${ageMin}min). ${budget.recommendation}`;\n for (const [targetId, targetInfo] of this.connectionManager.getPeerIdentities()) {\n if (targetInfo.role === 'team-lead' || targetInfo.role === 'project-manager') {\n this.connectionManager.sendToNode(targetId, {\n type: 'P2P_SEND', messageId: uuidv4(), fromNodeId: this._nodeId,\n fromName: 'system', fromRole: 'monitor', content: alertMsg,\n format: 'plain', expectReply: false, timestamp: new Date().toISOString(),\n });\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: helpers\n // ---------------------------------------------------------------------------\n\n private async getPeerConnection(nodeId: string): Promise<WebSocket> {\n const existing = this.connectionManager.getWsForNode(nodeId);\n if (existing && existing.readyState === WebSocket.OPEN) {\n return existing;\n }\n const peer = this.connectionManager.getPeerIdentity(nodeId);\n const name = peer?.name ?? nodeId;\n const lastSeen = peer?.lastSeenAt ?? 'unknown';\n this.logger?.log('CONN_FAIL', {\n to: name, reason: 'not_connected',\n wsExists: !!existing, wsState: existing?.readyState, lastSeen,\n });\n throw new Error(\n `'${name}' şu an bağlı değil. Son görülme: ${lastSeen}. Bağlantı kurulduğunda tekrar dene.`\n );\n }\n\n private waitForResponse<T extends P2PMsg>(\n filter: (msg: P2PMsg) => boolean,\n timeoutMs: number\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.messageRouter.removePendingHandler(handler);\n reject(new Error('P2P request timed out'));\n }, timeoutMs);\n\n const handler = (msg: P2PMsg): void => {\n if (filter(msg)) {\n clearTimeout(timeout);\n this.messageRouter.removePendingHandler(handler);\n resolve(msg as T);\n }\n };\n\n this.messageRouter.addPendingHandler(handler);\n });\n }\n}\n","/**\n * Join Tool\n * Joins the claude-collab network with a user identity.\n * Call this first before any other tool.\n * @module presentation/mcp/tools/join\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nexport function registerJoinTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'join_network',\n 'Join the claude-collab network with your identity. Call this first before any other tool.',\n {\n name: z.string().min(1).max(50).describe('Your name (e.g. \"Jarvis\", \"Zahid\")'),\n role: z.string().min(1).max(100).describe('Your role (e.g. \"Yazılım Mimarı\", \"Proje Yöneticisi\")'),\n team: z.string().max(100).optional().describe('Your team (optional, e.g. \"Coffer Takımı\")'),\n },\n async ({ name, role, team }) => {\n try {\n const result = await client.joinNetwork(name, role, team);\n const lines = [\n `Ağa katıldın!`,\n ` Kimlik : ${result.name} — ${result.role}${result.team ? ` (${result.team})` : ''}`,\n ` Node ID: ${result.nodeId}`,\n ` Port : ${result.port}`,\n ` Online : ${result.peersOnline} peer`,\n ];\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Ask Tool\n * Sends a question to another peer and polls for the answer.\n * @module presentation/mcp/tools/ask\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerAskTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'ask',\n 'Ask a question to a peer on the network. Waits up to 2 minutes for a reply.',\n {\n to_name: z.string().optional().describe('Peer name to send to (e.g. \"Zahid\"). Either this or to_node_id required.'),\n to_node_id: z.string().optional().describe('Peer node ID (use if name is ambiguous).'),\n question: z.string().describe('The question to ask'),\n format: z.enum(['markdown', 'text']).optional().default('markdown'),\n },\n async ({ to_name, to_node_id, question, format }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n // Cross-field validation\n if (!to_name && !to_node_id) {\n return {\n content: [{ type: 'text' as const, text: 'to_name veya to_node_id parametrelerinden biri zorunludur.' }],\n isError: true,\n };\n }\n\n // Resolve nodeId from name\n let targetNodeId = to_node_id;\n let targetName = to_name;\n\n if (!targetNodeId && to_name) {\n const matches = client.resolvePeerByName(to_name);\n if (matches.length === 0) {\n return {\n content: [{ type: 'text' as const, text: `'${to_name}' adında bir peer bulunamadı. peers tool'u ile mevcut peerlara bak.` }],\n isError: true,\n };\n }\n if (matches.length > 1) {\n const list = matches\n .map(p => ` - ${p.nodeId.slice(0, 8)} | ${p.name} — ${p.role}${p.team ? ` (${p.team})` : ''} | ${p.status}`)\n .join('\\n');\n return {\n content: [{ type: 'text' as const, text: `'${to_name}' adında ${matches.length} peer var:\\n${list}\\nto_node_id ile çağır.` }],\n isError: true,\n };\n }\n targetNodeId = matches[0]!.nodeId;\n targetName = matches[0]!.name;\n }\n\n try {\n const questionId = await client.ask(targetNodeId!, question, format as 'markdown' | 'text');\n\n // Poll until answer arrives (max 2 minutes, every 3 seconds)\n const POLL_INTERVAL_MS = 3_000;\n const MAX_WAIT_MS = 2 * 60 * 1000;\n const deadline = Date.now() + MAX_WAIT_MS;\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n const answer = await client.checkAnswer(questionId);\n if (answer !== null) {\n return {\n content: [{\n type: 'text' as const,\n text: `**${answer.from.displayName} (${answer.from.teamName}) cevapladı:**\\n\\n${answer.content}`,\n }],\n };\n }\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: `Soru gönderildi ancak 2 dakika içinde cevap gelmedi.\\nQuestion ID: \\`${questionId}\\`\\n\\nManuel kontrol için check_answer tool'unu kullanabilirsin.`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\r\n * Reply Tool\r\n * Replies to a pending question\r\n * @module presentation/mcp/tools/reply\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\r\nimport { injectionQueue } from '../../../infrastructure/terminal-injector/injection-queue.js';\r\n\r\n/**\r\n * Reply tool input schema\r\n */\r\nconst replySchema = {\r\n questionId: z.string().describe('The ID of the question to reply to (from inbox)'),\r\n answer: z.string().describe('Your answer to the question (supports markdown)'),\r\n};\r\n\r\n/**\r\n * Registers the reply tool with the MCP server\r\n */\r\nexport function registerReplyTool(server: McpServer, client: ICollabClient): void {\r\n server.tool('reply', replySchema, async (args) => {\r\n const questionId = args.questionId;\r\n const answer = args.answer;\r\n\r\n try {\r\n if (!client.isIdentitySet) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\",\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n\r\n await client.reply(questionId, answer, 'markdown');\r\n\r\n // Signal queue: this question is done, process next\r\n injectionQueue.notifyReplied();\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: `Reply sent successfully to question \\`${questionId}\\`.`,\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: `Failed to send reply: ${errorMessage}`,\r\n },\r\n ],\r\n isError: true,\r\n };\r\n }\r\n });\r\n}\r\n","/**\n * Peers Tool\n * Lists connected peers on the collaboration network.\n * @module presentation/mcp/tools/peers\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerPeersTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'peers',\n 'List peers on the network. Optionally filter by team or role.',\n {\n team: z.string().optional().describe('Filter by team name'),\n role: z.string().optional().describe('Filter by role'),\n },\n async ({ team, role }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const info = client.getInfo();\n let peers = info.connectedPeers;\n\n if (team) peers = peers.filter(p => p.team?.toLowerCase().includes(team.toLowerCase()));\n if (role) peers = peers.filter(p => p.role.toLowerCase().includes(role.toLowerCase()));\n\n const selfLine = `Sen: ${info.name} — ${info.role}${info.team ? ` (${info.team})` : ''} [${info.nodeId?.slice(0, 8)}]`;\n\n if (peers.length === 0) {\n return { content: [{ type: 'text' as const, text: `${selfLine}\\n\\nHenüz bağlı peer yok.` }] };\n }\n\n const peerLines = peers.map(p => {\n const statusIcon = p.status === 'online' ? '🟢' : '⚫';\n const legacy = p.isLegacy ? ' ⚠ eski versiyon' : '';\n return ` ${statusIcon} ${p.name} — ${p.role}${p.team ? ` (${p.team})` : ''}${legacy} [${p.nodeId.slice(0, 8)}]`;\n });\n\n return {\n content: [{\n type: 'text' as const,\n text: `${selfLine}\\n\\nPeerlar (${peers.length}):\\n${peerLines.join('\\n')}`,\n }],\n };\n }\n );\n}\n","/**\n * History Tool\n * Shows past questions and answers from this session.\n * @module presentation/mcp/tools/history\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nexport function registerHistoryTool(server: McpServer, client: ICollabClient): void {\n server.tool('history', {}, async () => {\n if (!client.isIdentitySet) {\n return {\n content: [{ type: 'text' as const, text: \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\" }],\n isError: true,\n };\n }\n\n const entries = client.getHistory();\n\n if (entries.length === 0) {\n return {\n content: [{ type: 'text', text: 'No questions yet this session.' }],\n };\n }\n\n const lines = entries.map((e) => {\n const time = new Date(e.askedAt).toLocaleTimeString();\n\n if (e.direction === 'sent') {\n const answerLine = e.answer\n ? ` ↳ ${e.peer}: ${e.answer}`\n : ` ↳ (no answer yet)`;\n return `[${time}] → ${e.peer}: ${e.question}\\n${answerLine}`;\n } else {\n const answerLine = e.answer\n ? ` ↳ you: ${e.answer}`\n : ` ↳ (not replied yet)`;\n return `[${time}] ← ${e.peer}: ${e.question}\\n${answerLine}`;\n }\n });\n\n return {\n content: [{ type: 'text', text: lines.join('\\n\\n') }],\n };\n });\n}\n","/**\n * Observe Tool\n * Reads a peer's terminal output (last N lines) without interrupting them.\n * Available to team-lead and project-manager roles.\n * @module presentation/mcp/tools/observe\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerObserveTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'observe',\n 'Observe a peer\\'s terminal output (last N lines). Team-lead and project-manager only.',\n {\n peer_name: z.string().optional().describe('Peer name to observe'),\n peer_node_id: z.string().optional().describe('Peer node ID (if name ambiguous)'),\n lines: z.number().optional().default(50).describe('Number of lines to read (max 200)'),\n },\n async ({ peer_name, peer_node_id, lines }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n if (!peer_name && !peer_node_id) {\n return {\n content: [{ type: 'text' as const, text: 'peer_name veya peer_node_id gerekli.' }],\n isError: true,\n };\n }\n\n let targetNodeId = peer_node_id;\n if (!targetNodeId && peer_name) {\n const matches = client.resolvePeerByName(peer_name);\n if (matches.length === 0) {\n return {\n content: [{ type: 'text' as const, text: `'${peer_name}' bulunamadı.` }],\n isError: true,\n };\n }\n if (matches.length > 1) {\n const list = matches.map(p => ` - ${p.nodeId.slice(0, 8)} | ${p.name}`).join('\\n');\n return {\n content: [{ type: 'text' as const, text: `Birden fazla '${peer_name}':\\n${list}\\npeer_node_id kullan.` }],\n isError: true,\n };\n }\n targetNodeId = matches[0]!.nodeId;\n }\n\n try {\n const result = await client.observe(targetNodeId!, lines);\n const statusInfo = client.getPeerStatus(targetNodeId!);\n const statusLine = statusInfo\n ? `**Durum:** ${statusInfo.status}${statusInfo.progress != null ? ` (%${statusInfo.progress})` : ''} — ${statusInfo.summary}`\n : '';\n\n return {\n content: [{\n type: 'text' as const,\n text: `## ${result.name} Terminal Çıktısı (son ${lines} satır)\\n\\n${statusLine}\\n\\n\\`\\`\\`\\n${result.output}\\n\\`\\`\\`${result.truncated ? '\\n\\n⚠ Çıktı kırpıldı.' : ''}`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Broadcast Tool\n * Send a message to all peers or peers with a specific role.\n * @module presentation/mcp/tools/broadcast\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerBroadcastTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'broadcast',\n 'Send a message to all peers or filter by role.',\n {\n message: z.string().describe('Broadcast message content'),\n role: z.string().optional().describe('Only send to peers with this role'),\n format: z.enum(['markdown', 'text']).optional().default('markdown'),\n },\n async ({ message, role, format }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n try {\n const result = await client.broadcastMessage(message, format as 'markdown' | 'text', role);\n\n if (result.sentTo === 0) {\n return {\n content: [{ type: 'text' as const, text: 'Broadcast gönderilecek peer bulunamadı.' }],\n };\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: `Broadcast gönderildi: ${result.sentTo} peer'a ulaştı${result.failedTo > 0 ? `, ${result.failedTo} başarısız` : ''}.`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Report Status Tool\n * Share your current status with the team lead and optionally all peers.\n * @module presentation/mcp/tools/report-status\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerReportStatusTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'report_status',\n 'Report your current status to the team.',\n {\n status: z.enum(['working', 'blocked', 'idle', 'reviewing', 'testing', 'deploying']).describe('Current status'),\n summary: z.string().describe('What are you doing? (short description)'),\n progress: z.number().min(0).max(100).optional().describe('Progress percentage (0-100)'),\n blocker: z.string().optional().describe('Blocker description if status is blocked'),\n },\n async ({ status, summary, progress, blocker }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n try {\n await client.reportStatus({ status, summary, progress, blocker });\n\n return {\n content: [{\n type: 'text' as const,\n text: `Durum bildirildi: **${status}**${progress != null ? ` (%${progress})` : ''} — ${summary}${blocker ? `\\n⚠ Blocker: ${blocker}` : ''}`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Terminal Spawner Service\n * Extracts spawn logic from MCP tool for reuse by auto-respawn.\n * @module infrastructure/terminal/terminal-spawner\n */\n\nimport { execSync } from 'child_process';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport type Provider = 'anthropic' | 'ollama';\n\nexport interface SpawnConfig {\n role: string;\n model: string;\n effort: 'low' | 'medium' | 'high' | 'max';\n provider?: Provider;\n workingDirectory: string;\n resumeSessionId?: string;\n}\n\nexport function preTrustDirectory(dir: string): void {\n const claudeJsonPath = join(homedir(), '.claude.json');\n try {\n const raw = readFileSync(claudeJsonPath, 'utf-8');\n const config = JSON.parse(raw);\n if (!config.projects) config.projects = {};\n const forwardSlash = dir.replace(/\\\\/g, '/');\n const backSlash = dir.replace(/\\//g, '\\\\');\n for (const p of [forwardSlash, backSlash]) {\n if (!config.projects[p]) config.projects[p] = {};\n config.projects[p].hasTrustDialogAccepted = true;\n }\n writeFileSync(claudeJsonPath, JSON.stringify(config, null, 2), 'utf-8');\n } catch { /* skip if file does not exist or parse fails */ }\n}\n\nexport function spawnTerminal(config: SpawnConfig): void {\n const { role, model, effort, provider = 'anthropic', workingDirectory, resumeSessionId } = config;\n const title = `Collab ${role.charAt(0).toUpperCase() + role.slice(1)}`;\n const isOllama = provider === 'ollama';\n\n preTrustDirectory(workingDirectory);\n\n // Ollama: no effort flag; Anthropic: no effort for haiku\n const effortFlag = isOllama ? '' : (model !== 'haiku' ? ` --effort ${effort}` : '');\n\n // Ollama env vars prefix\n const envPrefix = isOllama\n ? 'set \"ANTHROPIC_AUTH_TOKEN=ollama\" && set \"ANTHROPIC_BASE_URL=http://localhost:11434\" && set \"ANTHROPIC_API_KEY=\" && '\n : '';\n\n let innerCmd: string;\n if (resumeSessionId) {\n innerCmd = `${envPrefix}claude --resume ${resumeSessionId} --dangerously-skip-permissions --model ${model}${effortFlag}`;\n } else {\n const skill = `/collab-${role}`;\n innerCmd = `${envPrefix}claude --dangerously-skip-permissions --model ${model}${effortFlag} \"${skill}\"`;\n }\n\n // cmd /c: exits when Claude exits. \"|| exit /b 0\" forces exit code 0 so Windows Terminal auto-closes the tab.\n const psCmd = `wt -w new --title '${title}' --startingDirectory '${workingDirectory}' -- cmd /c '(${innerCmd}) || exit /b 0'`;\n execSync(`powershell.exe -NoProfile -Command \"${psCmd.replace(/\"/g, '\\\\\"')}\"`, {\n stdio: 'pipe',\n timeout: 10_000,\n });\n\n execSync('powershell.exe -NoProfile -Command \"Start-Sleep -Seconds 2\"', { timeout: 10_000 });\n}\n","/**\n * Spawn Terminal Tool\n * Opens a new Windows Terminal window with Claude Code running a collab skill.\n * Pre-trusts the working directory in ~/.claude.json to skip the trust prompt.\n * @module presentation/mcp/tools/spawn-terminal\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\nimport { spawnTerminal } from '../../../infrastructure/terminal/terminal-spawner.js';\n\nconst VALID_ROLES = ['manager', 'frontend', 'backend', 'qa', 'devops', 'lead', 'observer'] as const;\nconst VALID_MODELS = ['sonnet', 'opus', 'haiku'] as const;\nconst VALID_EFFORTS = ['low', 'medium', 'high', 'max'] as const;\nconst VALID_PROVIDERS = ['anthropic', 'ollama'] as const;\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerSpawnTerminalTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'spawn_terminal',\n 'Open a new Windows Terminal window running Claude Code with a collab skill. Pre-trusts the directory so no trust prompt appears.',\n {\n role: z.enum(VALID_ROLES).describe('Collab role: frontend, backend, qa, devops, lead, or observer'),\n workingDirectory: z.string().optional().describe('Working directory for the terminal (default: current directory)'),\n model: z.string().optional().default('sonnet').describe('Model name. Anthropic: sonnet/opus/haiku. Ollama: qwen3:8b, minimax-m2.7:cloud, etc.'),\n effort: z.enum(VALID_EFFORTS).optional().default('medium').describe('Effort level (anthropic only): low/medium/high/max'),\n provider: z.enum(VALID_PROVIDERS).optional().default('anthropic').describe('Provider: anthropic (cloud) or ollama (local/cloud via Ollama)'),\n },\n async ({ role, workingDirectory, model, effort, provider }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const cwd = workingDirectory || process.cwd();\n const skill = `/collab-${role}`;\n const title = `Collab ${role.charAt(0).toUpperCase() + role.slice(1)}`;\n\n try {\n spawnTerminal({\n role,\n model: model || 'sonnet',\n effort: effort as 'low' | 'medium' | 'high' | 'max',\n provider: provider as 'anthropic' | 'ollama',\n workingDirectory: cwd,\n });\n\n const providerLabel = provider === 'ollama' ? 'ollama' : 'anthropic';\n const lines = [\n `Terminal açıldı: ${title}`,\n ` Skill: ${skill}`,\n ` Provider: ${providerLabel}`,\n ` Model: ${model || 'sonnet'}`,\n ...(provider !== 'ollama' ? [` Effort: ${effort || 'medium'}`] : []),\n ` Dizin: ${cwd}`,\n ` Trust: pre-trusted`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text' as const, text: `Terminal açılamadı: ${msg}` }],\n isError: true,\n };\n }\n }\n );\n}\n","/**\n * Kick Tool\n * Remove a peer from the collab network and optionally kill their process.\n * @module presentation/mcp/tools/kick\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerKickTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'kick_member',\n 'Remove a peer from the collab network. Closes their connection and optionally kills their process.',\n {\n target: z.string().describe('Peer name or nodeId to kick'),\n },\n async ({ target }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n try {\n // Resolve target — try as name first, then as nodeId\n const peers = client.resolvePeerByName(target);\n let nodeId: string;\n\n if (peers.length === 1) {\n nodeId = peers[0].nodeId;\n } else if (peers.length > 1) {\n const list = peers.map((p) => ` - ${p.name} (${p.nodeId.slice(0, 8)})`).join('\\n');\n return {\n content: [{ type: 'text' as const, text: `Birden fazla peer eşleşti. nodeId ile tekrar dene:\\n${list}` }],\n isError: true,\n };\n } else {\n // Try as nodeId directly\n nodeId = target;\n }\n\n const result = await client.kickPeer(nodeId);\n const lines = [\n `${result.name} takımdan çıkarıldı.`,\n result.killed ? ' Process sonlandırıldı.' : ' Process sonlandırılamadı (spawn PID bilinmiyor veya zaten kapanmış).',\n ];\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Exit Tool\n * Send a graceful shutdown signal (P2P_SHUTDOWN) to a peer.\n * Unlike kick_member which forcefully closes the connection,\n * exit_member lets the target process exit cleanly.\n * @module presentation/mcp/tools/exit\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerExitTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'exit_member',\n 'Send a graceful shutdown signal to a peer. The target will exit cleanly (process.exit). Use this instead of kick_member for orderly shutdown.',\n {\n target: z.string().describe('Peer name or nodeId to shut down'),\n },\n async ({ target }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n try {\n // Resolve target — try as name first, then as nodeId\n const peers = client.resolvePeerByName(target);\n let nodeId: string;\n\n if (peers.length === 1) {\n nodeId = peers[0].nodeId;\n } else if (peers.length > 1) {\n const list = peers.map((p) => ` - ${p.name} (${p.nodeId.slice(0, 8)})`).join('\\n');\n return {\n content: [{ type: 'text' as const, text: `Birden fazla peer eşleşti. nodeId ile tekrar dene:\\n${list}` }],\n isError: true,\n };\n } else {\n // Try as nodeId directly\n nodeId = target;\n }\n\n const result = await client.sendShutdown(nodeId);\n return {\n content: [{\n type: 'text' as const,\n text: result.sent\n ? `${result.name} için shutdown sinyali gönderildi. Terminal birkaç saniye içinde kapanacak.`\n : `${result.name} için shutdown sinyali gönderilemedi (bağlantı sorunu).`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Health Check Tool\n * Check the health status of all peers — detect stale or disconnected members.\n * @module presentation/mcp/tools/health-check\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerHealthCheckTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'health_check',\n 'Check the health of all peers. Shows healthy, stale (no activity >30min), and disconnected members.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const results = client.healthCheck();\n\n if (results.length === 0) {\n return { content: [{ type: 'text' as const, text: 'Ağda peer yok.' }] };\n }\n\n const lines = ['Takım Sağlık Durumu:', ''];\n\n for (const r of results) {\n const icon = r.status === 'healthy' ? '✓' : r.status === 'stale' ? '⚠' : '✗';\n const ago = formatAgo(r.lastActivity);\n lines.push(` ${icon} ${r.name} (${r.role}) — ${r.status} — son aktivite: ${ago}`);\n }\n\n const staleCount = results.filter((r) => r.stale).length;\n if (staleCount > 0) {\n lines.push('');\n lines.push(`${staleCount} stale peer var. kick_member ile temizleyebilirsin.`);\n }\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n\nfunction formatAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'az önce';\n if (mins < 60) return `${mins}dk önce`;\n return `${Math.floor(mins / 60)}sa önce`;\n}\n","/**\n * Send Tool\n * Sends a non-blocking message to a peer. Returns immediately.\n * @module presentation/mcp/tools/send\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerSendTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'send',\n 'Send a non-blocking message to a peer. Returns immediately. Use check_replies to get responses later.',\n {\n to_name: z.string().optional().describe('Peer name to send to'),\n to_node_id: z.string().optional().describe('Peer node ID'),\n message: z.string().describe('Message content'),\n expect_reply: z.boolean().optional().default(true).describe('Whether a reply is expected'),\n format: z.enum(['markdown', 'plain']).optional().default('markdown'),\n },\n async ({ to_name, to_node_id, message, expect_reply, format }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n if (!to_name && !to_node_id) {\n return { content: [{ type: 'text' as const, text: 'to_name veya to_node_id zorunlu.' }], isError: true };\n }\n\n let targetNodeId = to_node_id;\n if (!targetNodeId && to_name) {\n const matches = client.resolvePeerByName(to_name);\n if (matches.length === 0) return { content: [{ type: 'text' as const, text: `'${to_name}' bulunamadi.` }], isError: true };\n if (matches.length > 1) return { content: [{ type: 'text' as const, text: `'${to_name}' birden fazla eslesme.` }], isError: true };\n targetNodeId = matches[0]!.nodeId;\n }\n\n try {\n const messageId = await client.send(targetNodeId!, message, format as 'markdown' | 'plain', expect_reply);\n return {\n content: [{\n type: 'text' as const,\n text: `Mesaj gonderildi.\\n ID: ${messageId}\\n Hedef: ${to_name || targetNodeId}\\n Cevap bekleniyor: ${expect_reply ? 'evet' : 'hayir'}`,\n }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: 'text' as const, text: `Hata: ${msg}` }], isError: true };\n }\n }\n );\n}\n","/**\n * Check Replies Tool\n * Checks for replies to previously sent messages.\n * @module presentation/mcp/tools/check-replies\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n }\n return null;\n}\n\nexport function registerCheckRepliesTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'check_replies',\n 'Check for replies to previously sent messages. Returns new replies and pending message IDs.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const result = client.checkReplies();\n const lines: string[] = [];\n\n if (result.replies.length > 0) {\n lines.push('Yeni cevaplar:');\n for (const r of result.replies) {\n lines.push(` [${r.messageId.slice(0, 8)}] ${r.from}: ${r.content.slice(0, 200)}`);\n }\n }\n\n if (result.pending.length > 0) {\n lines.push(`\\nBekleyen: ${result.pending.length} mesaj henuz cevaplanmadi.`);\n }\n\n if (result.replies.length === 0 && result.pending.length === 0) {\n lines.push('Bekleyen mesaj veya cevap yok.');\n }\n\n lines.push(`\\nToplam: ${result.totalSent} gonderilmis mesaj.`);\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n","/**\n * Update Issue Tool\n * Update the pipeline status of an issue. Notifies relevant peers automatically.\n * @module presentation/mcp/tools/update-issue\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nconst VALID_STATUSES = ['assigned', 'in_progress', 'dev_done', 'testing', 'qa_passed', 'qa_rejected', 'done'] as const;\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n return null;\n}\n\nexport function registerUpdateIssueTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'update_issue',\n 'Update the pipeline status of an issue. Notifies relevant peers automatically.',\n {\n issueId: z.string().describe('Issue identifier (e.g. \"#2\")'),\n status: z.enum(VALID_STATUSES).describe('Pipeline status'),\n title: z.string().optional().describe('Issue title (set on first call)'),\n assignee: z.string().optional().describe('Assignee peer name (auto-set on in_progress)'),\n tester: z.string().optional().describe('QA peer name (auto-set on testing)'),\n },\n async ({ issueId, status, title, assignee, tester }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n client.updateIssue(issueId, status, title, assignee, tester);\n\n return {\n content: [{\n type: 'text' as const,\n text: `Issue ${issueId} durumu guncellendi: ${status}${assignee ? ` (assignee: ${assignee})` : ''}${tester ? ` (tester: ${tester})` : ''}`,\n }],\n };\n }\n );\n}\n","/**\n * List Issues Tool\n * List all tracked issues and their pipeline status.\n * @module presentation/mcp/tools/list-issues\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n return null;\n}\n\nfunction formatAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'az once';\n if (mins < 60) return `${mins}dk`;\n return `${Math.floor(mins / 60)}sa`;\n}\n\nexport function registerListIssuesTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'list_issues',\n 'List all tracked issues and their pipeline status.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const issues = client.listIssues();\n\n if (issues.length === 0) {\n return { content: [{ type: 'text' as const, text: 'Takip edilen issue yok.' }] };\n }\n\n const lines = ['Pipeline Durumu:', ''];\n for (const issue of issues) {\n const who = issue.status === 'testing' ? issue.tester : issue.assignee;\n const age = formatAgo(issue.updatedAt);\n lines.push(` ${issue.issueId} ${issue.title} — ${issue.status}${who ? ` (${who})` : ''} — ${age}`);\n }\n\n const counts: Record<string, number> = {};\n for (const i of issues) counts[i.status] = (counts[i.status] || 0) + 1;\n const summary = Object.entries(counts).map(([s, c]) => `${c} ${s}`).join(', ');\n lines.push('', `Ozet: ${summary}`);\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n","/**\n * Context Budget Tool\n * @module presentation/mcp/tools/context-budget\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan once join_network ile aga katilmalisin.\";\n }\n return null;\n}\n\nexport function registerContextBudgetTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'context_budget',\n 'Check your context budget (session health) and peer session ages.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n const budget = client.getContextBudget();\n const ageMin = Math.round(budget.sessionAgeMs / 60_000);\n const lines = [\n `Context Budget: ${budget.healthStatus.toUpperCase()}`,\n ` Tool calls: ${budget.toolCalls}`,\n ` Session age: ${ageMin}min`,\n ` Recommendation: ${budget.recommendation}`,\n ];\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n","/**\n * Get Test Report Tool\n * Retrieve a test session report from the database.\n * @module presentation/mcp/tools/get-test-report\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n return null;\n}\n\nexport function registerGetTestReportTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'get_test_report',\n 'Get a test session report from the database. Returns full JSON or summary.',\n {\n session_id: z.string().optional().describe('Session ID (default: latest completed)'),\n format: z.enum(['json', 'summary']).optional().default('json')\n .describe('json: full report, summary: verdict + anomalies only'),\n },\n async ({ session_id, format }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const db = client.getDb?.();\n if (!db) {\n return { content: [{ type: 'text' as const, text: 'DB baglantisi yok.' }], isError: true };\n }\n\n const session = session_id\n ? await db.getTestSession(session_id)\n : await db.getLatestCompletedSession();\n\n if (!session) {\n return {\n content: [{ type: 'text' as const, text: session_id\n ? `Session bulunamadi: ${session_id}`\n : 'Tamamlanmis test session bulunamadi.' }],\n isError: true,\n };\n }\n\n if (format === 'summary' && session.report_json) {\n try {\n const report = JSON.parse(session.report_json);\n const summary = {\n session_id: session.session_id,\n timing: report.timing,\n summary: report.summary,\n anomalies: report.anomalies,\n };\n return { content: [{ type: 'text' as const, text: JSON.stringify(summary, null, 2) }] };\n } catch {\n return { content: [{ type: 'text' as const, text: 'Rapor JSON parse hatasi.' }], isError: true };\n }\n }\n\n if (!session.report_json) {\n const anomalies = await db.getAnomalyLogs(session.session_id);\n const snapshots = await db.getMetricSnapshots(session.session_id);\n return {\n content: [{ type: 'text' as const, text: [\n `Session: ${session.session_id} (${session.status})`,\n `Baslangic: ${session.started_at}`,\n `Snapshot sayisi: ${snapshots.length}`,\n `Anomali sayisi: ${anomalies.length}`,\n '',\n 'Rapor henuz olusturulmadi (session devam ediyor olabilir).',\n ].join('\\n') }],\n };\n }\n\n return { content: [{ type: 'text' as const, text: session.report_json }] };\n }\n );\n}\n","/**\n * Get Test Sessions Tool\n * List test sessions from the database.\n * @module presentation/mcp/tools/get-test-sessions\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan önce join_network ile ağa katılmalısın.\";\n return null;\n}\n\nexport function registerGetTestSessionsTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'get_test_sessions',\n 'List test sessions from the database. Shows history of observer runs.',\n {\n limit: z.number().optional().default(10).describe('Max sessions to return'),\n status: z.enum(['running', 'completed', 'aborted']).optional()\n .describe('Filter by status'),\n },\n async ({ limit, status }) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const db = client.getDb?.();\n if (!db) {\n return { content: [{ type: 'text' as const, text: 'DB baglantisi yok.' }], isError: true };\n }\n\n const sessions = await db.getTestSessions(limit, status);\n\n if (sessions.length === 0) {\n return { content: [{ type: 'text' as const, text: 'Kayitli test session bulunamadi.' }] };\n }\n\n const lines = ['Test Session Tarihcesi:', ''];\n for (const s of sessions) {\n const duration = s.ended_at\n ? `${Math.round((new Date(s.ended_at).getTime() - new Date(s.started_at).getTime()) / 60000)}dk`\n : 'devam ediyor';\n const issueCount = JSON.parse(s.issue_ids || '[]').length;\n lines.push(` ${s.session_id.slice(0, 8)} — ${s.status} — ${duration} — ${issueCount} issue — ${s.started_at}`);\n }\n lines.push('', `Toplam: ${sessions.length} session`);\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n","/**\n * Get Message Stats Tool\n * Returns aggregated message statistics from this node.\n * @module presentation/mcp/tools/get-message-stats\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) {\n return \"Bu tool'u kullanmadan once join_network ile aga katilmalisin.\";\n }\n return null;\n}\n\nexport function registerGetMessageStatsTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'get_message_stats',\n 'Get aggregated message statistics from this node. Shows send/receive counts and pending replies.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const stats = client.getMessageStats?.();\n if (!stats) {\n return { content: [{ type: 'text' as const, text: 'Message stats mevcut degil.' }], isError: true };\n }\n\n const lines = [\n 'Mesaj Istatistikleri:',\n '',\n ` Toplam gonderilen: ${stats.totalSent}`,\n ` Toplam alinan: ${stats.totalReceived}`,\n ` Bekleyen yanitlar: ${stats.pendingReplies}`,\n '',\n ' Ture gore:',\n ` send: ${stats.byType.send}`,\n ` ask: ${stats.byType.ask}`,\n ` reply: ${stats.byType.reply}`,\n ` broadcast: ${stats.byType.broadcast}`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n }\n );\n}\n","/**\n * Observer Write Tools\n * Create/update test sessions, write metric snapshots, log/resolve anomalies.\n * Observer only — requires DB access via client.getDb().\n * @module presentation/mcp/tools/observer-write\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan once join_network ile aga katilmalisin.\";\n return null;\n}\n\nexport function registerObserverWriteTools(server: McpServer, client: ICollabClient): void {\n\n // --- observer_write_session ---\n server.tool(\n 'observer_write_session',\n 'Create or update a test session in the database. Observer only.',\n {\n action: z.enum(['create', 'update']).describe('create: new session, update: modify existing'),\n session_id: z.string().describe('Session UUID'),\n started_at: z.string().optional().describe('ISO timestamp (create only)'),\n team_config: z.string().optional().describe('JSON team config (create only)'),\n issue_ids: z.string().optional().describe('JSON array of issue IDs'),\n status: z.string().optional().describe('running | completed | aborted'),\n ended_at: z.string().optional().describe('ISO timestamp (update only)'),\n report_json: z.string().optional().describe('Final report JSON (update only)'),\n },\n async (args) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const db = client.getDb?.();\n if (!db) return { content: [{ type: 'text' as const, text: 'DB baglantisi yok.' }], isError: true };\n\n if (args.action === 'create') {\n await db.insertTestSession({\n sessionId: args.session_id,\n startedAt: args.started_at || new Date().toISOString(),\n teamConfig: args.team_config || '{}',\n issueIds: args.issue_ids || '[]',\n status: args.status || 'running',\n });\n return { content: [{ type: 'text' as const, text: `Session olusturuldu: ${args.session_id}` }] };\n }\n\n await db.updateTestSession(args.session_id, {\n status: args.status,\n endedAt: args.ended_at,\n reportJson: args.report_json,\n issueIds: args.issue_ids,\n });\n return { content: [{ type: 'text' as const, text: `Session guncellendi: ${args.session_id}` }] };\n }\n );\n\n // --- observer_write_snapshot ---\n server.tool(\n 'observer_write_snapshot',\n 'Write a metric snapshot to the database. Observer only.',\n {\n session_id: z.string().describe('Parent session ID'),\n type: z.enum(['health', 'pipeline', 'peers', 'commit', 'observe', 'infra', 'test'])\n .describe('Snapshot type'),\n data: z.string().describe('JSON snapshot data'),\n },\n async (args) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const db = client.getDb?.();\n if (!db) return { content: [{ type: 'text' as const, text: 'DB baglantisi yok.' }], isError: true };\n\n await db.insertMetricSnapshot({\n sessionId: args.session_id,\n capturedAt: new Date().toISOString(),\n type: args.type,\n data: args.data,\n });\n return { content: [{ type: 'text' as const, text: `Snapshot kaydedildi: ${args.type}` }] };\n }\n );\n\n // --- observer_write_anomaly ---\n server.tool(\n 'observer_write_anomaly',\n 'Log an anomaly or resolve an existing one. Observer only.',\n {\n action: z.enum(['log', 'resolve']).describe('log: new anomaly, resolve: mark resolved'),\n session_id: z.string().describe('Parent session ID'),\n // log fields\n severity: z.enum(['low', 'medium', 'high', 'critical']).optional(),\n category: z.enum(['idle_peer', 'stuck_issue', 'disconnect', 'zombie', 'attach_failed']).optional(),\n peer_name: z.string().optional(),\n issue_id: z.string().optional(),\n description: z.string().optional(),\n // resolve fields\n anomaly_id: z.number().optional().describe('Anomaly ID to resolve'),\n },\n async (args) => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const db = client.getDb?.();\n if (!db) return { content: [{ type: 'text' as const, text: 'DB baglantisi yok.' }], isError: true };\n\n if (args.action === 'log') {\n if (!args.severity || !args.category || !args.description) {\n return { content: [{ type: 'text' as const, text: 'severity, category, description zorunlu.' }], isError: true };\n }\n await db.insertAnomalyLog({\n sessionId: args.session_id,\n detectedAt: new Date().toISOString(),\n severity: args.severity,\n category: args.category,\n peerName: args.peer_name,\n issueId: args.issue_id,\n description: args.description,\n });\n return { content: [{ type: 'text' as const, text: `Anomali kaydedildi: ${args.category} (${args.severity})` }] };\n }\n\n if (!args.anomaly_id) {\n return { content: [{ type: 'text' as const, text: 'anomaly_id zorunlu.' }], isError: true };\n }\n await db.resolveAnomaly(args.anomaly_id, new Date().toISOString());\n return { content: [{ type: 'text' as const, text: `Anomali cozumlendi: #${args.anomaly_id}` }] };\n }\n );\n}\n","/**\n * Sync Skills Tool\n * Copies skill files from the repo's skills/ directory to ~/.claude/skills/.\n * Ensures all collab skills are available to spawned Claude Code instances.\n * @module presentation/mcp/tools/sync-skills\n */\n\nimport { z } from 'zod';\nimport { existsSync, mkdirSync, cpSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ICollabClient } from '../../../shared/types/collab-client.interface.js';\n\nfunction guardIdentity(client: ICollabClient): string | null {\n if (!client.isIdentitySet) return \"Bu tool'u kullanmadan once join_network ile aga katilmalisin.\";\n return null;\n}\n\nfunction findSkillsSource(): string | null {\n // Walk up from __dirname to find the repo root containing skills/\n let dir = new URL('.', import.meta.url).pathname;\n // Fix Windows path: /C:/... → C:/...\n if (/^\\/[A-Z]:\\//.test(dir)) dir = dir.slice(1);\n\n for (let i = 0; i < 10; i++) {\n const candidate = join(dir, 'skills');\n if (existsSync(candidate)) return candidate;\n const parent = join(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\nexport function registerSyncSkillsTool(server: McpServer, client: ICollabClient): void {\n server.tool(\n 'sync_skills',\n 'Sync collab skills from the repo to ~/.claude/skills/. Run before spawning terminals to ensure all skills are available.',\n {},\n async () => {\n const guard = guardIdentity(client);\n if (guard) return { content: [{ type: 'text' as const, text: guard }], isError: true };\n\n const source = findSkillsSource();\n if (!source) {\n return {\n content: [{ type: 'text' as const, text: 'skills/ dizini bulunamadi. Repo kok dizininde skills/ klasoru olmali.' }],\n isError: true,\n };\n }\n\n const target = join(homedir(), '.claude', 'skills');\n if (!existsSync(target)) mkdirSync(target, { recursive: true });\n\n const entries = readdirSync(source, { withFileTypes: true })\n .filter(e => e.isDirectory() && e.name.startsWith('collab-'));\n\n const results: string[] = [];\n\n for (const entry of entries) {\n const srcDir = join(source, entry.name);\n const dstDir = join(target, entry.name);\n const srcSkill = join(srcDir, 'SKILL.md');\n\n if (!existsSync(srcSkill)) continue;\n\n // Check if update needed\n let needsUpdate = true;\n const dstSkill = join(dstDir, 'SKILL.md');\n if (existsSync(dstSkill)) {\n const srcContent = readFileSync(srcSkill, 'utf-8');\n const dstContent = readFileSync(dstSkill, 'utf-8');\n needsUpdate = srcContent !== dstContent;\n }\n\n if (needsUpdate) {\n mkdirSync(dstDir, { recursive: true });\n cpSync(srcDir, dstDir, { recursive: true });\n results.push(` ✅ ${entry.name} — ${existsSync(dstSkill) ? 'guncellendi' : 'yuklendi'}`);\n } else {\n results.push(` ⏭️ ${entry.name} — guncel`);\n }\n }\n\n const summary = [\n `Skills sync tamamlandi (${entries.length} skill):`,\n ` Kaynak: ${source}`,\n ` Hedef: ${target}`,\n '',\n ...results,\n ].join('\\n');\n\n return { content: [{ type: 'text' as const, text: summary }] };\n }\n );\n}\n","/**\r\n * MCP Server\r\n * Provides MCP tools for Claude Code integration\r\n * @module presentation/mcp/server\r\n */\r\n\r\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport type { ICollabClient } from '../../shared/types/collab-client.interface.js';\r\nimport { registerJoinTool } from './tools/index.js';\r\nimport { registerAskTool } from './tools/ask.tool.js';\r\nimport { registerReplyTool } from './tools/reply.tool.js';\r\nimport { registerPeersTool } from './tools/peers.tool.js';\r\nimport { registerHistoryTool } from './tools/history.tool.js';\r\nimport { registerObserveTool } from './tools/observe.tool.js';\r\nimport { registerBroadcastTool } from './tools/broadcast.tool.js';\r\nimport { registerReportStatusTool } from './tools/report-status.tool.js';\r\nimport { registerSpawnTerminalTool } from './tools/spawn-terminal.tool.js';\r\nimport { registerKickTool } from './tools/kick.tool.js';\r\nimport { registerExitTool } from './tools/exit.tool.js';\r\nimport { registerHealthCheckTool } from './tools/health-check.tool.js';\r\nimport { registerSendTool } from './tools/send.tool.js';\r\nimport { registerCheckRepliesTool } from './tools/check-replies.tool.js';\r\nimport { registerUpdateIssueTool } from './tools/update-issue.tool.js';\r\nimport { registerListIssuesTool } from './tools/list-issues.tool.js';\r\nimport { registerContextBudgetTool } from './tools/context-budget.tool.js';\r\nimport { registerGetTestReportTool } from './tools/get-test-report.tool.js';\r\nimport { registerGetTestSessionsTool } from './tools/get-test-sessions.tool.js';\r\nimport { registerGetMessageStatsTool } from './tools/get-message-stats.tool.js';\r\nimport { registerObserverWriteTools } from './tools/observer-write.tool.js';\r\nimport { registerSyncSkillsTool } from './tools/sync-skills.tool.js';\r\n\r\nexport interface McpServerOptions {\r\n client: ICollabClient;\r\n onToolCall?: () => void;\r\n}\r\n\r\nexport function createMcpServer(options: McpServerOptions): McpServer {\r\n const { client } = options;\r\n\r\n const server = new McpServer({\r\n name: 'claude-collab',\r\n version: '1.10.0',\r\n });\r\n\r\n if (options.onToolCall) {\r\n const originalTool = server.tool.bind(server);\r\n (server as any).tool = (...args: any[]) => {\r\n const handler = args[args.length - 1];\r\n args[args.length - 1] = async (...handlerArgs: any[]) => {\r\n options.onToolCall!();\r\n return handler(...handlerArgs);\r\n };\r\n return (originalTool as any)(...args);\r\n };\r\n }\r\n\r\n registerJoinTool(server, client);\r\n registerAskTool(server, client);\r\n registerReplyTool(server, client);\r\n registerPeersTool(server, client);\r\n registerHistoryTool(server, client);\r\n registerObserveTool(server, client);\r\n registerBroadcastTool(server, client);\r\n registerReportStatusTool(server, client);\r\n registerSpawnTerminalTool(server, client);\r\n registerKickTool(server, client);\r\n registerExitTool(server, client);\r\n registerHealthCheckTool(server, client);\r\n registerSendTool(server, client);\r\n registerCheckRepliesTool(server, client);\r\n registerUpdateIssueTool(server, client);\r\n registerListIssuesTool(server, client);\r\n registerContextBudgetTool(server, client);\r\n registerGetTestReportTool(server, client);\r\n registerGetTestSessionsTool(server, client);\r\n registerGetMessageStatsTool(server, client);\r\n registerObserverWriteTools(server, client);\r\n registerSyncSkillsTool(server, client);\r\n\r\n return server;\r\n}\r\n\r\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\r\n const server = createMcpServer(options);\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n","#!/usr/bin/env node\r\n\r\n/**\r\n * CLI entry point\r\n * Usage: claude-collab --name <your-name>\r\n * @module cli\r\n */\r\n\r\nimport { Command } from 'commander';\r\nimport { P2PNode } from './infrastructure/p2p/p2p-node.js';\r\nimport { startMcpServer } from './presentation/mcp/server.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('claude-collab')\r\n .description('P2P collaboration between Claude Code terminals via MCP')\r\n .version('0.1.0')\r\n .option('--name <name>', 'Your name on the collaboration network (e.g. \"alice\", \"backend\") [deprecated: use join_network MCP tool]')\r\n .action(async (options: { name?: string }) => {\r\n const p2pNode = new P2PNode();\r\n await p2pNode.start();\r\n if (options.name) {\r\n await p2pNode.joinNetwork(options.name, 'developer');\r\n }\r\n await startMcpServer({ client: p2pNode });\r\n });\r\n\r\nprogram.parse();\r\n"]}
|